diff --git a/.gitignore b/.gitignore index dc6d9aec8..e8f636ab3 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ **/.classpath **/.settings **/.project +**/out/ /.gradle/ /.nb-gradle/ /.idea/ @@ -21,10 +22,9 @@ .DS_Store /jme3-core/src/main/resources/com/jme3/system/version.properties /jme3-*/build/ -/jme3-bullet-native/bullet.zip /jme3-bullet-native/bullet3.zip -/jme3-bullet-native/bullet-2.82-r2704/ -/jme3-bullet-native/bullet3-2.83.7/ +/jme3-bullet-native/bullet3-2.87/ +/jme3-bullet-native/src/native/cpp/com_jme3_bullet_*.h /jme3-android-native/openal-soft/ /jme3-android-native/OpenALSoft.zip /jme3-android-native/src/native/jme_decode/STBI/ diff --git a/.travis.yml b/.travis.yml index c24f8941b..1425467ff 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,11 +1,10 @@ language: java -sudo: false -dist: precise +sudo: true branches: only: - master - - v3.1 + - v3.2 matrix: include: @@ -14,7 +13,9 @@ matrix: env: UPLOAD=true UPLOAD_NATIVE=true - os: linux jdk: openjdk7 + dist: precise - os: osx + osx_image: xcode9.3 env: UPLOAD_NATIVE=true addons: diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 82ffeb4e8..7234481dd 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -55,5 +55,5 @@ We generally abide by the standard Java Code Conventions. Besides that, just mak ## Documentation -- How to edit the wiki - WIP +- How to edit the [wiki](https://github.com/jMonkeyEngine/wiki). - How to edit JavaDocs - WIP diff --git a/README.md b/README.md index 68d2d6204..b87abb203 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ jMonkeyEngine [![Build Status](https://travis-ci.org/jMonkeyEngine/jmonkeyengine.svg?branch=master)](https://travis-ci.org/jMonkeyEngine/jmonkeyengine) -jMonkeyEngine is a 3D game engine for adventurous Java developers. It’s open-source, cross-platform, and cutting-edge. 3.1.0 is the latest stable version of the jMonkeyEngine 3 SDK, a complete game development suite. We'll release 3.1.x updates until the major 3.2 release arrives. +jMonkeyEngine is a 3D game engine for adventurous Java developers. It’s open-source, cross-platform, and cutting-edge. 3.2.0 is the latest stable version of the jMonkeyEngine 3 SDK, a complete game development suite. We'll release 3.2.x updates until the major 3.3 release arrives. The engine is used by several commercial game studios and computer-science courses. Here's a taste: diff --git a/appveyor.yml b/appveyor.yml index dc36e789e..00c9d5c26 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -3,10 +3,13 @@ version: 1.0.{build}.{branch} branches: only: - master + - v3.2 only_commits: files: - jme3-bullet-native/ + - appveyor.yml + - gradle.properties skip_tags: true @@ -34,13 +37,15 @@ build_script: cache: - C:\Users\appveyor\.gradle\caches - C:\Users\appveyor\.gradle\wrapper -- jme3-bullet-native\bullet3.zip +- jme3-bullet-native\bullet3.zip -> gradle.properties test: off deploy: off on_success: - cmd: >- + if not defined encrypted_f0a0b284e2e8_key appveyor exit + openssl aes-256-cbc -K %encrypted_f0a0b284e2e8_key% -iv %encrypted_f0a0b284e2e8_iv% -in private\key.enc -out c:\users\appveyor\.ssh\id_rsa -d git config --global user.email "appveyor" diff --git a/build.gradle b/build.gradle index e1af45a55..3ccd202a9 100644 --- a/build.gradle +++ b/build.gradle @@ -1,10 +1,11 @@ buildscript { repositories { + google() jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.1.0' - classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.5' + classpath 'com.android.tools.build:gradle:3.1.4' + classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.4' } } @@ -15,7 +16,7 @@ apply from: file('version.gradle') subprojects { if(!project.name.equals('jme3-android-examples')) { apply from: rootProject.file('common.gradle') - if (!['jme3-testdata', 'sdk'].contains(project.name)) { + if (!project.name.equals('jme3-testdata')) { apply from: rootProject.file('bintray.gradle') } } else { @@ -66,9 +67,9 @@ task createZipDistribution(type:Zip,dependsOn:["dist","libDist"], description:"P archiveName "jME" + jmeFullVersion + ".zip" into("/") { from {"./dist"} - } + } into("/sources") { - from {"$buildDir/libDist/sources"} + from {"$buildDir/libDist/sources"} } } @@ -88,14 +89,14 @@ task dist(dependsOn: [':jme3-examples:dist', 'mergedJavadoc']){ task mergedJavadoc(type: Javadoc, description: 'Creates Javadoc from all the projects.') { title = 'jMonkeyEngine3' destinationDir = mkdir("dist/javadoc") - + options.encoding = 'UTF-8' // Allows Javadoc to be generated on Java 8 despite doclint errors. if (JavaVersion.current().isJava8Compatible()) { options.addStringOption('Xdoclint:none', '-quiet') } - + options.overview = file("javadoc-overview.html") // Note: The closures below are executed lazily. source subprojects.collect {project -> @@ -115,10 +116,6 @@ task mergedSource(type: Copy){ } -task wrapper(type: Wrapper, description: 'Creates and deploys the Gradle wrapper to the current directory.') { - gradleVersion = '3.2.1' -} - ext { ndkCommandPath = "" ndkExists = false @@ -137,7 +134,7 @@ task configureAndroidNDK { if (System.env.ANDROID_NDK != null) { ndkBuildPath = System.env.ANDROID_NDK + File.separator + ndkBuildFile } - + if (new File(ndkBuildPath).exists()) { ndkExists = true ndkCommandPath = ndkBuildPath diff --git a/common.gradle b/common.gradle index d15f1c582..c396df30a 100644 --- a/common.gradle +++ b/common.gradle @@ -16,6 +16,9 @@ repositories { maven { url "http://nifty-gui.sourceforge.net/nifty-maven-repo" } + flatDir { + dirs rootProject.file('lib') + } } dependencies { diff --git a/gradle.properties b/gradle.properties index 1cb84fcdd..0588a31a2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,14 +1,14 @@ # Version number used for plugins, only 3 numbers (e.g. 3.1.3) -jmeVersion = 3.2.0 +jmeVersion = 3.3.0 # Version used for application and settings folder, no spaces! -jmeMainVersion = 3.2 +jmeMainVersion = 3.3 # Version addition pre-alpha-svn, Stable, Beta jmeVersionTag = SNAPSHOT # Increment this each time jmeVersionTag changes but jmeVersion stays the same jmeVersionTagID = 0 # specify if JavaDoc should be built -buildJavaDoc = false +buildJavaDoc = true # specify if SDK and Native libraries get built buildNativeProjects = false @@ -16,11 +16,11 @@ buildAndroidExamples = false # Path to android NDK for building native libraries #ndkPath=/Users/normenhansen/Documents/Code-Import/android-ndk-r7 -ndkPath = /opt/android-ndk-r10c +ndkPath = /opt/android-ndk-r16b # Path for downloading native Bullet -bulletUrl = https://github.com/bulletphysics/bullet3/archive/2.86.1.zip -bulletFolder = bullet3-2.86.1 +bulletUrl = https://github.com/bulletphysics/bullet3/archive/2.87.zip +bulletFolder = bullet3-2.87 bulletZipFile = bullet3.zip # POM settings @@ -38,3 +38,4 @@ POM_INCEPTION_YEAR=2009 # Bintray settings to override in $HOME/.gradle/gradle.properties or ENV or commandline bintray_user= bintray_api_key= + diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index ca78035ef..7a3265ee9 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e89f72e3d..76e4690af 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,5 @@ -#Fri Nov 25 13:05:50 EST 2016 -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-3.2.1-bin.zip +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.10-bin.zip diff --git a/gradlew b/gradlew index 27309d923..cccdd3d51 100755 --- a/gradlew +++ b/gradlew @@ -1,4 +1,4 @@ -#!/usr/bin/env bash +#!/usr/bin/env sh ############################################################################## ## @@ -33,11 +33,11 @@ DEFAULT_JVM_OPTS="" # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" -warn ( ) { +warn () { echo "$*" } -die ( ) { +die () { echo echo "$*" echo @@ -154,11 +154,19 @@ if $cygwin ; then esac fi -# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules -function splitJvmOpts() { - JVM_OPTS=("$@") +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " } -eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS -JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" +APP_ARGS=$(save "$@") -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index f6d5974e7..e95643d6a 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -49,7 +49,6 @@ goto fail @rem Get command-line arguments, handling Windows variants if not "%OS%" == "Windows_NT" goto win9xME_args -if "%@eval[2+2]" == "4" goto 4NT_args :win9xME_args @rem Slurp the command line arguments. @@ -60,11 +59,6 @@ set _SKIP=2 if "x%~1" == "x" goto execute set CMD_LINE_ARGS=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -set CMD_LINE_ARGS=%$ :execute @rem Setup the command line diff --git a/jme3-android-examples/src/main/java/org/jmonkeyengine/jme3androidexamples/MainActivity.java b/jme3-android-examples/src/main/java/org/jmonkeyengine/jme3androidexamples/MainActivity.java index 7bde9d9c9..83a378ef8 100644 --- a/jme3-android-examples/src/main/java/org/jmonkeyengine/jme3androidexamples/MainActivity.java +++ b/jme3-android-examples/src/main/java/org/jmonkeyengine/jme3androidexamples/MainActivity.java @@ -214,7 +214,7 @@ public class MainActivity extends AppCompatActivity implements OnItemClickListen /** * User clicked a view on the screen. Check for the OK and Cancel buttons - * and either start the applicaiton or exit. + * and either start the application or exit. * @param view */ public void onClick(View view) { diff --git a/jme3-android/build.gradle b/jme3-android/build.gradle index e49befecd..4caad528e 100644 --- a/jme3-android/build.gradle +++ b/jme3-android/build.gradle @@ -5,5 +5,5 @@ if (!hasProperty('mainClass')) { dependencies { compile project(':jme3-core') compile project(':jme3-plugins') - compile files('../lib/android.jar') + compileOnly 'android:android' } diff --git a/jme3-android/src/main/java/com/jme3/input/android/AndroidSensorJoyInput.java b/jme3-android/src/main/java/com/jme3/input/android/AndroidSensorJoyInput.java index cdd7e6494..4232e6082 100644 --- a/jme3-android/src/main/java/com/jme3/input/android/AndroidSensorJoyInput.java +++ b/jme3-android/src/main/java/com/jme3/input/android/AndroidSensorJoyInput.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -59,7 +59,7 @@ import java.util.logging.Logger; /** * AndroidSensorJoyInput converts the Android Sensor system into Joystick events. * A single joystick is configured and includes data for all configured sensors - * as seperate axes of the joystick. + * as separate axes of the joystick. * * Each axis is named according to the static strings in SensorJoystickAxis. * Refer to the strings defined in SensorJoystickAxis for a list of supported @@ -285,8 +285,8 @@ public class AndroidSensorJoyInput implements SensorEventListener { } /** - * Calculates the device orientation based off the data recieved from the - * Acceleration Sensor and Mangetic Field sensor + * Calculates the device orientation based off the data received from the + * Acceleration Sensor and Magnetic Field sensor * Values are returned relative to the Earth. * * From the Android Doc diff --git a/jme3-android/src/main/java/com/jme3/system/android/OGLESContext.java b/jme3-android/src/main/java/com/jme3/system/android/OGLESContext.java index 508e81065..db185b002 100644 --- a/jme3-android/src/main/java/com/jme3/system/android/OGLESContext.java +++ b/jme3-android/src/main/java/com/jme3/system/android/OGLESContext.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -136,7 +136,7 @@ public class OGLESContext implements JmeContext, GLSurfaceView.Renderer, SoftTex // stops at the setFormat call without a crash. // We look at the user setting for alpha bits and set the surfaceview // PixelFormat to either Opaque, Transparent, or Translucent. - // ConfigChooser will do it's best to honor the alpha requested by the user + // ConfigChooser will do its best to honor the alpha requested by the user // For best rendering performance, use Opaque (alpha bits = 0). int curAlphaBits = settings.getAlphaBits(); logger.log(Level.FINE, "curAlphaBits: {0}", curAlphaBits); diff --git a/jme3-blender/src/main/java/com/jme3/asset/BlenderKey.java b/jme3-blender/src/main/java/com/jme3/asset/BlenderKey.java index 3b72088ab..6dbb205b5 100644 --- a/jme3-blender/src/main/java/com/jme3/asset/BlenderKey.java +++ b/jme3-blender/src/main/java/com/jme3/asset/BlenderKey.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -69,7 +69,7 @@ public class BlenderKey extends ModelKey { */ protected String usedWorld; /** - * User's default material that is set fo objects that have no material definition in blender. The default value is + * User's default material that is set for objects that have no material definition in blender. The default value is * null. If the value is null the importer will use its own default material (gray color - like in blender). */ protected Material defaultMaterial; @@ -476,9 +476,9 @@ public class BlenderKey extends ModelKey { } /** - * This mehtod sets the name of the WORLD data block taht should be used during file loading. By default the name is + * This method sets the name of the WORLD data block that should be used during file loading. By default the name is * not set. If no name is set or the given name does not occur in the file - the first WORLD data block will be used - * during loading (assumin any exists in the file). + * during loading (assuming any exists in the file). * @param usedWorld * the name of the WORLD block used during loading */ @@ -487,7 +487,7 @@ public class BlenderKey extends ModelKey { } /** - * This mehtod returns the name of the WORLD data block taht should be used during file loading. + * This method returns the name of the WORLD data block that should be used during file loading. * @return the name of the WORLD block used during loading */ public String getUsedWorld() { diff --git a/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/constraints/SimulationNode.java b/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/constraints/SimulationNode.java index 711e0a338..279b5311d 100644 --- a/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/constraints/SimulationNode.java +++ b/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/constraints/SimulationNode.java @@ -237,7 +237,7 @@ public class SimulationNode { } } - // ... add virtual tracks if neccessary, for bones that were altered but had no tracks before ... + // ... add virtual tracks if necessary, for bones that were altered but had no tracks before ... for (Long boneOMA : alteredOmas) { BoneContext boneContext = blenderContext.getBoneContext(boneOMA); int boneIndex = skeleton.getBoneIndex(boneContext.getBone()); diff --git a/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/curves/CurvesTemporalMesh.java b/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/curves/CurvesTemporalMesh.java index 51a5aeb63..2ad8d3ff2 100644 --- a/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/curves/CurvesTemporalMesh.java +++ b/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/curves/CurvesTemporalMesh.java @@ -37,7 +37,7 @@ import com.jme3.util.BufferUtils; /** * A temporal mesh for curves and surfaces. It works in similar way as TemporalMesh for meshes. - * It prepares all neccessary lines and faces and allows to apply modifiers just like in regular temporal mesh. + * It prepares all necessary lines and faces and allows to apply modifiers just like in regular temporal mesh. * * @author Marcin Roguski (Kaelthas) */ @@ -210,7 +210,7 @@ public class CurvesTemporalMesh extends TemporalMesh { } /** - * The method computes the value of a point at the certain relational distance from its beggining. + * The method computes the value of a point at the certain relational distance from its beginning. * @param alongRatio * the relative distance along the curve; should be a value between 0 and 1 inclusive; * if the value exceeds the boundaries it is truncated to them @@ -369,7 +369,7 @@ public class CurvesTemporalMesh extends TemporalMesh { } /** - * The method loads the bevel object that sould be applied to curve. It can either be another curve or a generated one + * The method loads the bevel object that should be applied to curve. It can either be another curve or a generated one * based on the bevel generating parameters in blender. * @param curveStructure * the structure with the curve's data (the curve being loaded, NOT the bevel curve) @@ -707,7 +707,7 @@ public class CurvesTemporalMesh extends TemporalMesh { /** * the method applies scale for the given bevel points. The points table is - * being modified so expect ypur result there. + * being modified so expect your result there. * * @param points * the bevel points @@ -726,7 +726,7 @@ public class CurvesTemporalMesh extends TemporalMesh { /** * A helper class that represents a single bezier line. It consists of Edge's and allows to - * get a subline of a lentgh of the line. + * get a subline of a length of the line. * * @author Marcin Roguski (Kaelthas) */ @@ -776,7 +776,7 @@ public class CurvesTemporalMesh extends TemporalMesh { } if (cyclic) { // if the first vertex is repeated at the end the distance will be = 0 so it won't affect the result, and if it is not repeated - // then it is neccessary to add the length between the last and the first vertex + // then it is necessary to add the length between the last and the first vertex length += vertices[vertices.length - 1].distance(vertices[0]); } } @@ -834,7 +834,7 @@ public class CurvesTemporalMesh extends TemporalMesh { } /** - * The method computes the value of a point at the certain relational distance from its beggining. + * The method computes the value of a point at the certain relational distance from its beginning. * @param alongRatio * the relative distance along the curve; should be a value between 0 and 1 inclusive; * if the value exceeds the boundaries it is truncated to them diff --git a/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/file/DnaBlockData.java b/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/file/DnaBlockData.java index 35ffaa5db..9fae86160 100644 --- a/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/file/DnaBlockData.java +++ b/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/file/DnaBlockData.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -85,7 +85,7 @@ public class DnaBlockData { names[i] = inputStream.readString(); } - // reding types + // reading types inputStream.alignPosition(4); identifier = inputStream.readByte() << 24 | inputStream.readByte() << 16 | inputStream.readByte() << 8 | inputStream.readByte(); if (identifier != TYPE_ID) { @@ -181,7 +181,7 @@ public class DnaBlockData { /** * This method converts the given identifier code to string. * @param code - * the code taht is to be converted + * the code that is to be converted * @return the string value of the identifier */ private String toString(int code) { diff --git a/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/file/DynamicArray.java b/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/file/DynamicArray.java index d6d110054..748757ab0 100644 --- a/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/file/DynamicArray.java +++ b/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/file/DynamicArray.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -32,7 +32,7 @@ package com.jme3.scene.plugins.blender.file; /** - * An array that can be dynamically modified/ + * An array that can be dynamically modified * @author Marcin Roguski * @param * the type of stored data in the array @@ -42,7 +42,7 @@ public class DynamicArray implements Cloneable { /** An array object that holds the required data. */ private T[] array; /** - * This table holds the sizes of dimetions of the dynamic table. It's length specifies the table dimension or a + * This table holds the sizes of dimensions of the dynamic table. Its length specifies the table dimension or a * pointer level. For example: if tableSizes.length == 3 then it either specifies a dynamic table of fixed lengths: * dynTable[a][b][c], where a,b,c are stored in the tableSizes table. */ diff --git a/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/file/Structure.java b/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/file/Structure.java index 941c7a8fc..fac6597c5 100644 --- a/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/file/Structure.java +++ b/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/file/Structure.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -169,7 +169,7 @@ public class Structure implements Cloneable { } /** - * This methos should be used on structures that are of a 'ListBase' type. It creates a List of structures that are + * This method should be used on structures that are of a 'ListBase' type. It creates a List of structures that are * held by this structure within the blend file. * @return a list of filled structures * @throws BlenderFileException @@ -232,7 +232,7 @@ public class Structure implements Cloneable { } /** - * This method returns the address of the structure. The strucutre should be filled with data otherwise an exception + * This method returns the address of the structure. The structure should be filled with data otherwise an exception * is thrown. * @return the address of the feature stored in this structure */ diff --git a/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/materials/MaterialContext.java b/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/materials/MaterialContext.java index 1995da0af..b8c5925a9 100644 --- a/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/materials/MaterialContext.java +++ b/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/materials/MaterialContext.java @@ -1,6 +1,7 @@ package com.jme3.scene.plugins.blender.materials; import java.io.IOException; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -106,7 +107,7 @@ public final class MaterialContext implements Savable { boolean transparent = false; if (diffuseColor != null) { transparent = diffuseColor.a < 1.0f; - if (loadedTextures.size() > 0) {// texutre covers the material color + if (loadedTextures.size() > 0) {// texture covers the material color diffuseColor.set(1, 1, 1, 1); } } @@ -163,6 +164,12 @@ public final class MaterialContext implements Savable { material.setColor("Ambient", new ColorRGBA(ambientFactor, ambientFactor, ambientFactor, 1f)); } + + // initializing unused "user-defined UV coords" to all available + Map> unusedUserDefinedUVCoords = Collections.emptyMap(); + if(userDefinedUVCoordinates != null && !userDefinedUVCoordinates.isEmpty()) { + unusedUserDefinedUVCoords = new HashMap<>(userDefinedUVCoordinates); + } // applying textures int textureIndex = 0; @@ -175,16 +182,19 @@ public final class MaterialContext implements Savable { String usedUserUVSet = combinedTexture.flatten(geometry, geometriesOMA, userDefinedUVCoordinates, blenderContext); this.setTexture(material, combinedTexture.getMappingType(), combinedTexture.getResultTexture()); - List uvs = combinedTexture.getResultUVS(); - if(uvs != null && uvs.size() > 0) { - VertexBuffer uvCoordsBuffer = new VertexBuffer(TextureHelper.TEXCOORD_TYPES[textureIndex++]); - uvCoordsBuffer.setupData(Usage.Static, 2, Format.Float, BufferUtils.createFloatBuffer(uvs.toArray(new Vector2f[uvs.size()]))); - geometry.getMesh().setBuffer(uvCoordsBuffer); - }//uvs might be null if the user assigned non existing UV coordinates group name to the mesh (this should be fixed in blender file) - if(usedUserUVSet != null) { - userDefinedUVCoordinates = new HashMap<>(userDefinedUVCoordinates); - userDefinedUVCoordinates.remove(usedUserUVSet); + if(usedUserUVSet == null || unusedUserDefinedUVCoords.containsKey(usedUserUVSet)) { + List uvs = combinedTexture.getResultUVS(); + if(uvs != null && uvs.size() > 0) { + VertexBuffer uvCoordsBuffer = new VertexBuffer(TextureHelper.TEXCOORD_TYPES[textureIndex++]); + uvCoordsBuffer.setupData(Usage.Static, 2, Format.Float, BufferUtils.createFloatBuffer(uvs.toArray(new Vector2f[uvs.size()]))); + geometry.getMesh().setBuffer(uvCoordsBuffer); + }//uvs might be null if the user assigned non existing UV coordinates group name to the mesh (this should be fixed in blender file) + + // Remove used "user-defined UV coords" from the unused collection + if(usedUserUVSet != null) { + unusedUserDefinedUVCoords.remove(usedUserUVSet); + } } } else { LOGGER.log(Level.WARNING, "The texture could not be applied because JME only supports up to {0} different UV's.", TextureHelper.TEXCOORD_TYPES.length); @@ -192,12 +202,12 @@ public final class MaterialContext implements Savable { } } - if (userDefinedUVCoordinates != null && userDefinedUVCoordinates.size() > 0) { + if (unusedUserDefinedUVCoords != null && unusedUserDefinedUVCoords.size() > 0) { LOGGER.fine("Storing unused, user defined UV coordinates sets."); - if (userDefinedUVCoordinates.size() > TextureHelper.TEXCOORD_TYPES.length) { + if (unusedUserDefinedUVCoords.size() > TextureHelper.TEXCOORD_TYPES.length) { LOGGER.log(Level.WARNING, "The blender file has defined more than {0} different UV coordinates for the mesh. JME supports only {0} UV coordinates buffers.", TextureHelper.TEXCOORD_TYPES.length); } - for (Entry> entry : userDefinedUVCoordinates.entrySet()) { + for (Entry> entry : unusedUserDefinedUVCoords.entrySet()) { if (textureIndex < TextureHelper.TEXCOORD_TYPES.length) { List uvs = entry.getValue(); VertexBuffer uvCoordsBuffer = new VertexBuffer(TextureHelper.TEXCOORD_TYPES[textureIndex++]); diff --git a/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/math/Vector3d.java b/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/math/Vector3d.java index f2a3c8075..db9b88304 100644 --- a/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/math/Vector3d.java +++ b/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/math/Vector3d.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -324,7 +324,7 @@ public final class Vector3d implements Savable, Cloneable, Serializable { * the vector to take the cross product of with this. * @param result * the vector to store the cross product result. - * @return result, after recieving the cross product vector. + * @return result, after receiving the cross product vector. */ public Vector3d cross(Vector3d v, Vector3d result) { return this.cross(v.x, v.y, v.z, result); @@ -342,7 +342,7 @@ public final class Vector3d implements Savable, Cloneable, Serializable { * z component of the vector to take the cross product of with this. * @param result * the vector to store the cross product result. - * @return result, after recieving the cross product vector. + * @return result, after receiving the cross product vector. */ public Vector3d cross(double otherX, double otherY, double otherZ, Vector3d result) { if (result == null) { @@ -485,12 +485,12 @@ public final class Vector3d implements Savable, Cloneable, Serializable { } /** - * multLocal multiplies a provided vector to this vector + * multLocal multiplies a provided vector by this vector * internally, and returns a handle to this vector for easy chaining of * calls. If the provided vector is null, null is returned. * * @param vec - * the vector to mult to this vector. + * the vector to multiply by this vector. * @return this */ public Vector3d multLocal(Vector3d vec) { @@ -522,7 +522,7 @@ public final class Vector3d implements Savable, Cloneable, Serializable { } /** - * multLocal multiplies a provided vector to this vector + * multLocal multiplies a provided vector by this vector * internally, and returns a handle to this vector for easy chaining of * calls. If the provided vector is null, null is returned. * @@ -539,7 +539,7 @@ public final class Vector3d implements Savable, Cloneable, Serializable { } /** - * multLocal multiplies a provided vector to this vector + * multLocal multiplies a provided vector by this vector * internally, and returns a handle to this vector for easy chaining of * calls. If the provided vector is null, null is returned. * @@ -657,7 +657,7 @@ public final class Vector3d implements Savable, Cloneable, Serializable { } /** - * subtractLocal subtracts a provided vector to this vector + * subtractLocal subtracts a provided vector from this vector * internally, and returns a handle to this vector for easy chaining of * calls. If the provided vector is null, null is returned. * @@ -825,7 +825,7 @@ public final class Vector3d implements Savable, Cloneable, Serializable { /** * hashCode returns a unique code for this vector object based - * on it's values. If two vectors are logically equivalent, they will return + * on its values. If two vectors are logically equivalent, they will return * the same hash code value. * @return the hash code value of this vector. */ diff --git a/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/meshes/MeshHelper.java b/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/meshes/MeshHelper.java index 49482c87f..4fcab8723 100644 --- a/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/meshes/MeshHelper.java +++ b/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/meshes/MeshHelper.java @@ -291,27 +291,30 @@ public class MeshHelper extends AbstractBlenderHelper { Structure defbase = (Structure) parent.getFieldValue("defbase"); List groupNames = new ArrayList(); List defs = defbase.evaluateListBase(); - for (Structure def : defs) { - groupNames.add(def.getFieldValue("name").toString()); - } + + if(!defs.isEmpty()) { + for (Structure def : defs) { + groupNames.add(def.getFieldValue("name").toString()); + } - Pointer pDvert = (Pointer) meshStructure.getFieldValue("dvert");// dvert = DeformVERTices - if (pDvert.isNotNull()) {// assigning weights and bone indices - List dverts = pDvert.fetchData(); - for (Structure dvert : dverts) { - Map weightsForVertex = new HashMap(); - Pointer pDW = (Pointer) dvert.getFieldValue("dw"); - if (pDW.isNotNull()) { - List dw = pDW.fetchData(); - for (Structure deformWeight : dw) { - int groupIndex = ((Number) deformWeight.getFieldValue("def_nr")).intValue(); - float weight = ((Number) deformWeight.getFieldValue("weight")).floatValue(); - String groupName = groupNames.get(groupIndex); + Pointer pDvert = (Pointer) meshStructure.getFieldValue("dvert");// dvert = DeformVERTices + if (pDvert.isNotNull()) {// assigning weights and bone indices + List dverts = pDvert.fetchData(); + for (Structure dvert : dverts) { + Map weightsForVertex = new HashMap(); + Pointer pDW = (Pointer) dvert.getFieldValue("dw"); + if (pDW.isNotNull()) { + List dw = pDW.fetchData(); + for (Structure deformWeight : dw) { + int groupIndex = ((Number) deformWeight.getFieldValue("def_nr")).intValue(); + float weight = ((Number) deformWeight.getFieldValue("weight")).floatValue(); + String groupName = groupNames.get(groupIndex); - weightsForVertex.put(groupName, weight); + weightsForVertex.put(groupName, weight); + } } + result.add(weightsForVertex); } - result.add(weightsForVertex); } } } diff --git a/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/modifiers/SubdivisionSurfaceModifier.java b/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/modifiers/SubdivisionSurfaceModifier.java index 748f2c7f2..402efc3d3 100644 --- a/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/modifiers/SubdivisionSurfaceModifier.java +++ b/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/modifiers/SubdivisionSurfaceModifier.java @@ -47,7 +47,7 @@ public class SubdivisionSurfaceModifier extends Modifier { private Set verticesOnOriginalEdges = new HashSet(); /** - * Constructor loads all neccessary modifier data. + * Constructor loads all necessary modifier data. * @param modifierStructure * the modifier structure * @param blenderContext @@ -193,7 +193,7 @@ public class SubdivisionSurfaceModifier extends Modifier { // moving the vertex v.addLocal(t); - // applying crease weight if neccessary + // applying crease weight if necessary CreasePoint creasePoint = creasePoints.get(i); if (creasePoint.getTarget() != null && creasePoint.getWeight() != 0) { t = creasePoint.getTarget().subtractLocal(v).multLocal(creasePoint.getWeight()); diff --git a/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/textures/ImageLoader.java b/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/textures/ImageLoader.java index ccb21bdf9..806de78f5 100644 --- a/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/textures/ImageLoader.java +++ b/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/textures/ImageLoader.java @@ -31,12 +31,14 @@ */ package com.jme3.scene.plugins.blender.textures; +import com.jme3.asset.AssetManager; +import com.jme3.asset.TextureKey; import com.jme3.scene.plugins.blender.file.BlenderInputStream; import com.jme3.texture.Image; +import com.jme3.texture.Texture; import com.jme3.texture.plugins.AWTLoader; -import com.jme3.texture.plugins.DDSLoader; -import com.jme3.texture.plugins.TGALoader; -import java.io.InputStream; +import com.jme3.texture.plugins.HDRLoader; +import java.util.logging.Level; import java.util.logging.Logger; /** @@ -47,11 +49,29 @@ import java.util.logging.Logger; */ /* package */class ImageLoader extends AWTLoader { private static final Logger LOGGER = Logger.getLogger(ImageLoader.class.getName()); - - protected DDSLoader ddsLoader = new DDSLoader(); // DirectX image loader + private static final Logger hdrLogger = Logger.getLogger(HDRLoader.class.getName()); // Used to silence HDR Errors + + /** + * List of Blender-Supported Texture Extensions (we have to guess them, so + * the AssetLoader can find them. Not good, but better than nothing. + * Source: https://docs.blender.org/manual/en/dev/data_system/files/media/image_formats.html + */ + private static final String[] extensions = new String[] + { /* Windows Bitmap */".bmp", + /* Iris */ ".sgi", ".rgb", ".bw", + /* PNG */ ".png", + /* JPEG */ ".jpg", ".jpeg", + /* JPEG 2000 */ ".jp2", ".j2c", + /* Targa */".tga", + /* Cineon & DPX */".cin", ".dpx", + /* OpenEXR */ ".exr", + /* Radiance HDR */ ".hdr", + /* TIFF */ ".tif", ".tiff", + /* DDS (Direct X) */ ".dds" }; /** - * This method loads the image from the blender file itself. It tries each loader to load the image. + * This method loads a image which is packed into the blender file. + * It makes use of all the registered AssetLoaders * * @param inputStream * blender input stream @@ -60,76 +80,57 @@ import java.util.logging.Logger; * @param flipY * if the image should be flipped (does not work with DirectX image) * @return loaded image or null if it could not be loaded + * @deprecated This method has only been left in for API compability. + * Use loadTexture instead */ - public Image loadImage(BlenderInputStream inputStream, int startPosition, boolean flipY) { - // loading using AWT loader - inputStream.setPosition(startPosition); - Image result = this.loadImage(inputStream, ImageType.AWT, flipY); - // loading using TGA loader - if (result == null) { - inputStream.setPosition(startPosition); - result = this.loadImage(inputStream, ImageType.TGA, flipY); - } - // loading using DDS loader - if (result == null) { - inputStream.setPosition(startPosition); - result = this.loadImage(inputStream, ImageType.DDS, flipY); + public Image loadImage(AssetManager assetManager, BlenderInputStream inputStream, int startPosition, boolean flipY) { + Texture tex = loadTexture(assetManager, inputStream, startPosition, flipY); + + if (tex == null) { + return null; + } else { + return tex.getImage(); } - - if (result == null) { - LOGGER.warning("Image could not be loaded by none of available loaders!"); - } - - return result; } - + /** - * This method loads an image of a specified type from the given input stream. + * This method loads a texture which is packed into the blender file. + * It makes use of all the registered AssetLoaders * * @param inputStream - * the input stream we read the image from - * @param imageType - * the type of the image {@link ImageType} + * blender input stream + * @param startPosition + * position in the stream where the image data starts * @param flipY * if the image should be flipped (does not work with DirectX image) - * @return loaded image or null if it could not be loaded + * @return loaded texture or null if it could not be loaded */ - public Image loadImage(InputStream inputStream, ImageType imageType, boolean flipY) { - Image result = null; - switch (imageType) { - case AWT: - try { - result = this.load(inputStream, flipY); - } catch (Exception e) { - LOGGER.warning("Unable to load image using AWT loader!"); - } - break; - case DDS: - try { - result = ddsLoader.load(inputStream); - } catch (Exception e) { - LOGGER.warning("Unable to load image using DDS loader!"); - } - break; - case TGA: - try { - result = TGALoader.load(inputStream, flipY); - } catch (Exception e) { - LOGGER.warning("Unable to load image using TGA loader!"); - } - break; - default: - throw new IllegalStateException("Unknown image type: " + imageType); + public Texture loadTexture(AssetManager assetManager, BlenderInputStream inputStream, int startPosition, boolean flipY) { + inputStream.setPosition(startPosition); + TextureKey tKey; + Texture result = null; + + hdrLogger.setLevel(Level.SEVERE); // When we bruteforce try HDR on a non hdr file, it prints unreadable chars + + for (String ext: extensions) { + tKey = new TextureKey("dummy" + ext, flipY); + try { + result = assetManager.loadAssetFromStream(tKey, inputStream); + } catch (Exception e) { + continue; + } + + if (result != null) { + break; // Could locate a possible asset + } + } + + if (result == null) { + LOGGER.warning("Texture could not be loaded by any of the available loaders!\n" + + "Since the file has been packed into the blender file, there is no" + + "way for us to tell you which texture it was."); } + return result; } - - /** - * Image types that can be loaded. AWT: png, jpg, jped or bmp TGA: tga DDS: DirectX image files - * - * @author Marcin Roguski (Kaelthas) - */ - private static enum ImageType { - AWT, TGA, DDS; - } } diff --git a/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/textures/ImageUtils.java b/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/textures/ImageUtils.java index 99ea9b5d2..8ca4f6330 100644 --- a/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/textures/ImageUtils.java +++ b/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/textures/ImageUtils.java @@ -206,7 +206,7 @@ public final class ImageUtils { N.z = 1; N.divideLocal(den); - // setting thge pixel in the result image + // setting the pixel in the result image bumpMap.setRGB(x, y, ImageUtils.vectorToColor(N.x, N.y, N.z)); } } @@ -422,7 +422,7 @@ public final class ImageUtils { * pixel's X coordinate * @param y * pixel's Y coordinate - * @return height reprezented by the given texture in the specified location + * @return height represented by the given texture in the specified location */ private static int getHeight(BufferedImage image, int x, int y) { if (x < 0) { diff --git a/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/textures/TextureHelper.java b/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/textures/TextureHelper.java index 8913f5864..cd146b109 100644 --- a/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/textures/TextureHelper.java +++ b/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/textures/TextureHelper.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -72,6 +72,7 @@ import com.jme3.texture.Texture.WrapMode; import com.jme3.texture.Texture2D; import com.jme3.texture.image.ColorSpace; import com.jme3.util.BufferUtils; +import com.jme3.util.PlaceholderAssets; /** * A class that is used in texture calculations. @@ -251,7 +252,11 @@ public class TextureHelper extends AbstractBlenderHelper { blenderContext.getInputStream().setPosition(dataFileBlock.getBlockPosition()); // Should the texture be flipped? It works for sinbad .. - result = new Texture2D(new ImageLoader().loadImage(blenderContext.getInputStream(), dataFileBlock.getBlockPosition(), true)); + result = new ImageLoader().loadTexture(blenderContext.getAssetManager(), blenderContext.getInputStream(), dataFileBlock.getBlockPosition(), true); + if (result == null) { + result = new Texture2D(PlaceholderAssets.getPlaceholderImage(blenderContext.getAssetManager())); + LOGGER.fine("ImageLoader returned null. It probably failed to load the packed texture, using placeholder asset"); + } } } //} else { @@ -310,7 +315,7 @@ public class TextureHelper extends AbstractBlenderHelper { * @param pos * the relative position (value of range <0, 1> (both inclusive)) * @param size - * the size of the line the pixel lies on (width, heigth or + * the size of the line the pixel lies on (width, height or * depth) * @return the integer index of the pixel on the line of the specified width */ @@ -429,10 +434,10 @@ public class TextureHelper extends AbstractBlenderHelper { } /** - * This method loads the textre from outside the blend file using the + * This method loads the texture from outside the blend file using the * AssetManager that the blend file was loaded with. It returns a texture * with a full assetKey that references the original texture so it later - * doesn't need to ba packed when the model data is serialized. It searches + * doesn't need to be packed when the model data is serialized. It searches * the AssetManager for the full path if the model file is a relative path * and will attempt to truncate the path if it is an absolute file path * until the path can be found in the AssetManager. If the texture can not @@ -614,8 +619,15 @@ public class TextureHelper extends AbstractBlenderHelper { int texflag = ((Number) textureData.mtex.getFieldValue("texflag")).intValue(); boolean negateTexture = (texflag & 0x04) != 0; + boolean colorSet = false; for (int i = 0; i < mappings.length; ++i) { if ((mappings[i] & mapto.intValue()) != 0) { + if(mappings[i] == MaterialContext.MTEX_COL) { + colorSet = true; + } else if(colorSet && mappings[i] == MaterialContext.MTEX_ALPHA) { + continue; + } + CombinedTexture combinedTexture = new CombinedTexture(mappings[i], !skyTexture); int blendType = ((Number) textureData.mtex.getFieldValue("blendtype")).intValue(); float[] color = new float[] { ((Number) textureData.mtex.getFieldValue("r")).floatValue(), ((Number) textureData.mtex.getFieldValue("g")).floatValue(), ((Number) textureData.mtex.getFieldValue("b")).floatValue() }; @@ -646,8 +658,16 @@ public class TextureHelper extends AbstractBlenderHelper { Map> result = new HashMap>(); for (TextureData data : textures) { Number mapto = (Number) data.mtex.getFieldValue("mapto"); + + boolean colorSet = false; for (int i = 0; i < mappings.length; ++i) { if ((mappings[i] & mapto.intValue()) != 0) { + if(mappings[i] == MaterialContext.MTEX_COL) { + colorSet = true; + } else if(colorSet && mappings[i] == MaterialContext.MTEX_ALPHA) { + continue; + } + List datas = result.get(mappings[i]); if (datas == null) { datas = new ArrayList(); @@ -668,4 +688,4 @@ public class TextureHelper extends AbstractBlenderHelper { /** The name of the user's UV coordinates that are used for this texture. */ public String uvCoordinatesName; } -} \ No newline at end of file +} diff --git a/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/textures/blending/TextureBlenderAWT.java b/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/textures/blending/TextureBlenderAWT.java index 1d7bf2146..1c6f2549d 100644 --- a/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/textures/blending/TextureBlenderAWT.java +++ b/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/textures/blending/TextureBlenderAWT.java @@ -163,9 +163,19 @@ public class TextureBlenderAWT extends AbstractTextureBlender { * the blender context */ protected void blendPixel(float[] result, float[] materialColor, float[] pixelColor, BlenderContext blenderContext) { + // We calculate first the importance of the texture (colFactor * texAlphaValue) float blendFactor = this.blendFactor * pixelColor[3]; - float oneMinusFactor = 1.0f - blendFactor, col; + // Then, we get the object material factor ((1 - texture importance) * matAlphaValue) + float oneMinusFactor = (1f - blendFactor) * materialColor[3]; + // Finally, we can get the final blendFactor, which is 1 - the material factor. + blendFactor = 1f - oneMinusFactor; + + // --- Compact method --- + // float blendFactor = this.blendFactor * (1f - ((1f - pixelColor[3]) * materialColor[3])); + // float oneMinusFactor = 1f - blendFactor; + float col; + switch (blendType) { case MTEX_BLEND: result[0] = blendFactor * pixelColor[0] + oneMinusFactor * materialColor[0]; diff --git a/jme3-bullet-native-android/build.gradle b/jme3-bullet-native-android/build.gradle index 499330a9e..1058ef322 100644 --- a/jme3-bullet-native-android/build.gradle +++ b/jme3-bullet-native-android/build.gradle @@ -104,7 +104,8 @@ task copyJmeAndroid(type: Copy) { into outputDir } -task buildBulletNativeLib(type: Exec, dependsOn: [copyJmeAndroid, copyJmeCpp, copyBullet]) { +//dependsOn ':jme3-bullet:generateNativeHeaders' +task buildBulletNativeLib(type: Exec, dependsOn: [copyJmeAndroid, ':jme3-bullet:generateNativeHeaders', copyJmeCpp, copyBullet]) { // args 'TARGET_PLATFORM=android-9' // println "buildBulletNativeLib ndkWorkingPath: " + ndkWorkingPath // println "buildBulletNativeLib rootProject.ndkCommandPath: " + rootProject.ndkCommandPath diff --git a/jme3-bullet-native-android/libs/arm64-v8a/libbulletjme.so b/jme3-bullet-native-android/libs/arm64-v8a/libbulletjme.so index 0aff124f8..e64b52ba1 100755 Binary files a/jme3-bullet-native-android/libs/arm64-v8a/libbulletjme.so and b/jme3-bullet-native-android/libs/arm64-v8a/libbulletjme.so differ diff --git a/jme3-bullet-native-android/libs/armeabi-v7a/libbulletjme.so b/jme3-bullet-native-android/libs/armeabi-v7a/libbulletjme.so index a57b41067..7e2aad17b 100755 Binary files a/jme3-bullet-native-android/libs/armeabi-v7a/libbulletjme.so and b/jme3-bullet-native-android/libs/armeabi-v7a/libbulletjme.so differ diff --git a/jme3-bullet-native-android/libs/armeabi/libbulletjme.so b/jme3-bullet-native-android/libs/armeabi/libbulletjme.so index 0750264f6..f54710e4a 100755 Binary files a/jme3-bullet-native-android/libs/armeabi/libbulletjme.so and b/jme3-bullet-native-android/libs/armeabi/libbulletjme.so differ diff --git a/jme3-bullet-native-android/libs/mips/libbulletjme.so b/jme3-bullet-native-android/libs/mips/libbulletjme.so index 90dd9f57c..adc7fa1aa 100755 Binary files a/jme3-bullet-native-android/libs/mips/libbulletjme.so and b/jme3-bullet-native-android/libs/mips/libbulletjme.so differ diff --git a/jme3-bullet-native-android/libs/mips64/libbulletjme.so b/jme3-bullet-native-android/libs/mips64/libbulletjme.so index d79b0d9b7..094ae8478 100755 Binary files a/jme3-bullet-native-android/libs/mips64/libbulletjme.so and b/jme3-bullet-native-android/libs/mips64/libbulletjme.so differ diff --git a/jme3-bullet-native-android/libs/x86/libbulletjme.so b/jme3-bullet-native-android/libs/x86/libbulletjme.so index 66b1b67ae..1089c838e 100755 Binary files a/jme3-bullet-native-android/libs/x86/libbulletjme.so and b/jme3-bullet-native-android/libs/x86/libbulletjme.so differ diff --git a/jme3-bullet-native-android/libs/x86_64/libbulletjme.so b/jme3-bullet-native-android/libs/x86_64/libbulletjme.so index 59c6a2ef9..2f2622579 100755 Binary files a/jme3-bullet-native-android/libs/x86_64/libbulletjme.so and b/jme3-bullet-native-android/libs/x86_64/libbulletjme.so differ diff --git a/jme3-bullet-native-android/src/native/android/Android.mk b/jme3-bullet-native-android/src/native/android/Android.mk index b46f8ec29..1a1e64b89 100644 --- a/jme3-bullet-native-android/src/native/android/Android.mk +++ b/jme3-bullet-native-android/src/native/android/Android.mk @@ -54,12 +54,23 @@ LOCAL_C_INCLUDES := $(BULLET_PATH)/\ $(BULLET_PATH)/vectormath/sse\ $(BULLET_PATH)/vectormath/neon -LOCAL_CFLAGS := $(LOCAL_C_INCLUDES:%=-I%) +#ARM mode more performant than thumb for old armeabi +ifeq ($(TARGET_ARCH_ABI),$(filter $(TARGET_ARCH_ABI), armeabi)) +LOCAL_ARM_MODE := arm +endif + +#Enable neon for armv7 +ifeq ($(TARGET_ARCH_ABI),$(filter $(TARGET_ARCH_ABI), armeabi-v7a)) +LOCAL_ARM_NEON := true +endif + +LOCAL_CFLAGS := $(LOCAL_C_INCLUDES:%=-I%) LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -ldl -lm -llog FILE_LIST := $(wildcard $(LOCAL_PATH)/*.cpp) FILE_LIST += $(wildcard $(LOCAL_PATH)/**/*.cpp) FILE_LIST += $(wildcard $(LOCAL_PATH)/**/**/*.cpp) +FILE_LIST := $(filter-out $(wildcard $(LOCAL_PATH)/Bullet3OpenCL/**/*.cpp), $(FILE_LIST)) LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%) -include $(BUILD_SHARED_LIBRARY) \ No newline at end of file +include $(BUILD_SHARED_LIBRARY) diff --git a/jme3-bullet-native-android/src/native/android/Application.mk b/jme3-bullet-native-android/src/native/android/Application.mk index 34f65f6e8..44c5c842e 100644 --- a/jme3-bullet-native-android/src/native/android/Application.mk +++ b/jme3-bullet-native-android/src/native/android/Application.mk @@ -1,4 +1,7 @@ APP_OPTIM := release APP_ABI := all -#APP_ABI := armeabi-v7a +APP_STL := stlport_static +# gnustl_static or stlport_static APP_MODULES := bulletjme +APP_CFLAGS += -funroll-loops -Ofast + diff --git a/jme3-bullet-native/build.gradle b/jme3-bullet-native/build.gradle index b94769943..a6c346d0a 100644 --- a/jme3-bullet-native/build.gradle +++ b/jme3-bullet-native/build.gradle @@ -11,6 +11,20 @@ if (!hasProperty('mainClass')) { dependencies { compile project(':jme3-bullet') } +clean { dependsOn 'cleanHeaders', 'cleanUnzipped' } + +// clean up auto-generated C++ headers +task cleanHeaders(type: Delete) { + delete fileTree(dir: 'src/native/cpp', include: 'com_jme3_bullet_*.h') +} +// clean up unzipped files +task cleanUnzipped(type: Delete) { + delete bulletFolder +} +// clean up the downloaded archive +task cleanZipFile(type: Delete) { + delete bulletZipFile +} model { components { @@ -27,13 +41,21 @@ model { source { srcDir 'src/native/cpp' srcDir bulletSrcPath + exclude 'Bullet3Collision/**' + exclude 'Bullet3Dynamics/**' + exclude 'Bullet3Geometry/**' exclude 'Bullet3OpenCL/**' + exclude 'Bullet3Serialize/**' include '**/*.cpp' } exportedHeaders { srcDir 'src/native/cpp' srcDir bulletSrcPath + exclude 'Bullet3Collision/**' + exclude 'Bullet3Dynamics/**' + exclude 'Bullet3Geometry/**' exclude 'Bullet3OpenCL/**' + exclude 'Bullet3Serialize/**' include '**/*.h' } } @@ -77,6 +99,7 @@ model { return } + cppCompiler.define('BT_NO_PROFILE') if (toolChain in VisualCpp) { cppCompiler.args "/I$javaHome\\include" } else{ @@ -115,7 +138,10 @@ model { cppCompiler.define('WIN32') } - tasks.all { dependsOn unzipBulletIfNeeded } + tasks.all { + dependsOn unzipBulletIfNeeded + dependsOn ':jme3-bullet:generateNativeHeaders' + } // Add output to jar file jar.into("native/${os}/${arch}") { @@ -199,7 +225,7 @@ unzipBulletIfNeeded.dependsOn { } } -// Helper class to wrap ant dowload task +// Helper class to wrap ant download task class MyDownload extends DefaultTask { @Input String sourceUrl diff --git a/jme3-bullet-native/libs/native/linux/x86/libbulletjme.so b/jme3-bullet-native/libs/native/linux/x86/libbulletjme.so index 9296f0a93..f984ee579 100755 Binary files a/jme3-bullet-native/libs/native/linux/x86/libbulletjme.so and b/jme3-bullet-native/libs/native/linux/x86/libbulletjme.so differ diff --git a/jme3-bullet-native/libs/native/linux/x86_64/libbulletjme.so b/jme3-bullet-native/libs/native/linux/x86_64/libbulletjme.so index 2d41558d4..b05af5c7f 100755 Binary files a/jme3-bullet-native/libs/native/linux/x86_64/libbulletjme.so and b/jme3-bullet-native/libs/native/linux/x86_64/libbulletjme.so differ diff --git a/jme3-bullet-native/libs/native/osx/x86/libbulletjme.dylib b/jme3-bullet-native/libs/native/osx/x86/libbulletjme.dylib index 3ace9e946..273de5693 100755 Binary files a/jme3-bullet-native/libs/native/osx/x86/libbulletjme.dylib and b/jme3-bullet-native/libs/native/osx/x86/libbulletjme.dylib differ diff --git a/jme3-bullet-native/libs/native/osx/x86_64/libbulletjme.dylib b/jme3-bullet-native/libs/native/osx/x86_64/libbulletjme.dylib index 594501d67..1329f8d78 100755 Binary files a/jme3-bullet-native/libs/native/osx/x86_64/libbulletjme.dylib and b/jme3-bullet-native/libs/native/osx/x86_64/libbulletjme.dylib differ diff --git a/jme3-bullet-native/libs/native/windows/x86/bulletjme.dll b/jme3-bullet-native/libs/native/windows/x86/bulletjme.dll index ab0ef06da..e0f8871e5 100755 Binary files a/jme3-bullet-native/libs/native/windows/x86/bulletjme.dll and b/jme3-bullet-native/libs/native/windows/x86/bulletjme.dll differ diff --git a/jme3-bullet-native/libs/native/windows/x86_64/bulletjme.dll b/jme3-bullet-native/libs/native/windows/x86_64/bulletjme.dll index f73fc45c4..64b9617f4 100755 Binary files a/jme3-bullet-native/libs/native/windows/x86_64/bulletjme.dll and b/jme3-bullet-native/libs/native/windows/x86_64/bulletjme.dll differ diff --git a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_PhysicsSpace.cpp b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_PhysicsSpace.cpp index 3ecf7fd6b..4e143cb4a 100644 --- a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_PhysicsSpace.cpp +++ b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_PhysicsSpace.cpp @@ -46,16 +46,21 @@ extern "C" { * Signature: (FFFFFFI)J */ JNIEXPORT jlong JNICALL Java_com_jme3_bullet_PhysicsSpace_createPhysicsSpace - (JNIEnv * env, jobject object, jfloat minX, jfloat minY, jfloat minZ, jfloat maxX, jfloat maxY, jfloat maxZ, jint broadphase, jboolean threading) { + (JNIEnv * env, jobject object, jfloat minX, jfloat minY, jfloat minZ, + jfloat maxX, jfloat maxY, jfloat maxZ, jint broadphase, + jboolean threading) { jmeClasses::initJavaClasses(env); + jmePhysicsSpace* space = new jmePhysicsSpace(env, object); if (space == NULL) { jclass newExc = env->FindClass("java/lang/NullPointerException"); env->ThrowNew(newExc, "The physics space has not been created."); return 0; } - space->createPhysicsSpace(minX, minY, minZ, maxX, maxY, maxZ, broadphase, threading); - return reinterpret_cast(space); + + space->createPhysicsSpace(minX, minY, minZ, maxX, maxY, maxZ, + broadphase, threading); + return reinterpret_cast (space); } /* @@ -64,8 +69,9 @@ extern "C" { * Signature: (JFIF)V */ JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_stepSimulation - (JNIEnv * env, jobject object, jlong spaceId, jfloat tpf, jint maxSteps, jfloat accuracy) { - jmePhysicsSpace* space = reinterpret_cast(spaceId); + (JNIEnv * env, jobject object, jlong spaceId, jfloat tpf, jint maxSteps, + jfloat accuracy) { + jmePhysicsSpace* space = reinterpret_cast (spaceId); if (space == NULL) { jclass newExc = env->FindClass("java/lang/NullPointerException"); env->ThrowNew(newExc, "The physics space does not exist."); @@ -81,8 +87,8 @@ extern "C" { */ JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_addCollisionObject (JNIEnv * env, jobject object, jlong spaceId, jlong objectId) { - jmePhysicsSpace* space = reinterpret_cast(spaceId); - btCollisionObject* collisionObject = reinterpret_cast(objectId); + jmePhysicsSpace* space = reinterpret_cast (spaceId); + btCollisionObject* collisionObject = reinterpret_cast (objectId); if (space == NULL) { jclass newExc = env->FindClass("java/lang/NullPointerException"); env->ThrowNew(newExc, "The physics space does not exist."); @@ -93,7 +99,7 @@ extern "C" { env->ThrowNew(newExc, "The collision object does not exist."); return; } - jmeUserPointer *userPointer = (jmeUserPointer*)collisionObject->getUserPointer(); + jmeUserPointer *userPointer = (jmeUserPointer*) collisionObject->getUserPointer(); userPointer -> space = space; space->getDynamicsWorld()->addCollisionObject(collisionObject); @@ -106,8 +112,8 @@ extern "C" { */ JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_removeCollisionObject (JNIEnv * env, jobject object, jlong spaceId, jlong objectId) { - jmePhysicsSpace* space = reinterpret_cast(spaceId); - btCollisionObject* collisionObject = reinterpret_cast(objectId); + jmePhysicsSpace* space = reinterpret_cast (spaceId); + btCollisionObject* collisionObject = reinterpret_cast (objectId); if (space == NULL) { jclass newExc = env->FindClass("java/lang/NullPointerException"); env->ThrowNew(newExc, "The physics space does not exist."); @@ -119,7 +125,7 @@ extern "C" { return; } space->getDynamicsWorld()->removeCollisionObject(collisionObject); - jmeUserPointer *userPointer = (jmeUserPointer*)collisionObject->getUserPointer(); + jmeUserPointer *userPointer = (jmeUserPointer*) collisionObject->getUserPointer(); userPointer -> space = NULL; } @@ -130,8 +136,8 @@ extern "C" { */ JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_addRigidBody (JNIEnv * env, jobject object, jlong spaceId, jlong rigidBodyId) { - jmePhysicsSpace* space = reinterpret_cast(spaceId); - btRigidBody* collisionObject = reinterpret_cast(rigidBodyId); + jmePhysicsSpace* space = reinterpret_cast (spaceId); + btRigidBody* collisionObject = reinterpret_cast (rigidBodyId); if (space == NULL) { jclass newExc = env->FindClass("java/lang/NullPointerException"); env->ThrowNew(newExc, "The physics space does not exist."); @@ -142,7 +148,7 @@ extern "C" { env->ThrowNew(newExc, "The collision object does not exist."); return; } - jmeUserPointer *userPointer = (jmeUserPointer*)collisionObject->getUserPointer(); + jmeUserPointer *userPointer = (jmeUserPointer*) collisionObject->getUserPointer(); userPointer -> space = space; space->getDynamicsWorld()->addRigidBody(collisionObject); } @@ -154,8 +160,8 @@ extern "C" { */ JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_removeRigidBody (JNIEnv * env, jobject object, jlong spaceId, jlong rigidBodyId) { - jmePhysicsSpace* space = reinterpret_cast(spaceId); - btRigidBody* collisionObject = reinterpret_cast(rigidBodyId); + jmePhysicsSpace* space = reinterpret_cast (spaceId); + btRigidBody* collisionObject = reinterpret_cast (rigidBodyId); if (space == NULL) { jclass newExc = env->FindClass("java/lang/NullPointerException"); env->ThrowNew(newExc, "The physics space does not exist."); @@ -166,7 +172,7 @@ extern "C" { env->ThrowNew(newExc, "The collision object does not exist."); return; } - jmeUserPointer *userPointer = (jmeUserPointer*)collisionObject->getUserPointer(); + jmeUserPointer *userPointer = (jmeUserPointer*) collisionObject->getUserPointer(); userPointer -> space = NULL; space->getDynamicsWorld()->removeRigidBody(collisionObject); } @@ -178,8 +184,8 @@ extern "C" { */ JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_addCharacterObject (JNIEnv * env, jobject object, jlong spaceId, jlong objectId) { - jmePhysicsSpace* space = reinterpret_cast(spaceId); - btCollisionObject* collisionObject = reinterpret_cast(objectId); + jmePhysicsSpace* space = reinterpret_cast (spaceId); + btCollisionObject* collisionObject = reinterpret_cast (objectId); if (space == NULL) { jclass newExc = env->FindClass("java/lang/NullPointerException"); env->ThrowNew(newExc, "The physics space does not exist."); @@ -190,12 +196,12 @@ extern "C" { env->ThrowNew(newExc, "The collision object does not exist."); return; } - jmeUserPointer *userPointer = (jmeUserPointer*)collisionObject->getUserPointer(); + jmeUserPointer *userPointer = (jmeUserPointer*) collisionObject->getUserPointer(); userPointer -> space = space; space->getDynamicsWorld()->addCollisionObject(collisionObject, btBroadphaseProxy::CharacterFilter, btBroadphaseProxy::StaticFilter | btBroadphaseProxy::DefaultFilter - ); + ); } /* @@ -205,8 +211,8 @@ extern "C" { */ JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_removeCharacterObject (JNIEnv * env, jobject object, jlong spaceId, jlong objectId) { - jmePhysicsSpace* space = reinterpret_cast(spaceId); - btCollisionObject* collisionObject = reinterpret_cast(objectId); + jmePhysicsSpace* space = reinterpret_cast (spaceId); + btCollisionObject* collisionObject = reinterpret_cast (objectId); if (space == NULL) { jclass newExc = env->FindClass("java/lang/NullPointerException"); env->ThrowNew(newExc, "The physics space does not exist."); @@ -217,7 +223,7 @@ extern "C" { env->ThrowNew(newExc, "The collision object does not exist."); return; } - jmeUserPointer *userPointer = (jmeUserPointer*)collisionObject->getUserPointer(); + jmeUserPointer *userPointer = (jmeUserPointer*) collisionObject->getUserPointer(); userPointer -> space = NULL; space->getDynamicsWorld()->removeCollisionObject(collisionObject); } @@ -229,8 +235,8 @@ extern "C" { */ JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_addAction (JNIEnv * env, jobject object, jlong spaceId, jlong objectId) { - jmePhysicsSpace* space = reinterpret_cast(spaceId); - btActionInterface* actionObject = reinterpret_cast(objectId); + jmePhysicsSpace* space = reinterpret_cast (spaceId); + btActionInterface* actionObject = reinterpret_cast (objectId); if (space == NULL) { jclass newExc = env->FindClass("java/lang/NullPointerException"); env->ThrowNew(newExc, "The physics space does not exist."); @@ -251,8 +257,8 @@ extern "C" { */ JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_removeAction (JNIEnv * env, jobject object, jlong spaceId, jlong objectId) { - jmePhysicsSpace* space = reinterpret_cast(spaceId); - btActionInterface* actionObject = reinterpret_cast(objectId); + jmePhysicsSpace* space = reinterpret_cast (spaceId); + btActionInterface* actionObject = reinterpret_cast (objectId); if (space == NULL) { jclass newExc = env->FindClass("java/lang/NullPointerException"); env->ThrowNew(newExc, "The physics space does not exist."); @@ -273,8 +279,8 @@ extern "C" { */ JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_addVehicle (JNIEnv * env, jobject object, jlong spaceId, jlong objectId) { - jmePhysicsSpace* space = reinterpret_cast(spaceId); - btActionInterface* actionObject = reinterpret_cast(objectId); + jmePhysicsSpace* space = reinterpret_cast (spaceId); + btActionInterface* actionObject = reinterpret_cast (objectId); if (space == NULL) { jclass newExc = env->FindClass("java/lang/NullPointerException"); env->ThrowNew(newExc, "The physics space does not exist."); @@ -295,8 +301,8 @@ extern "C" { */ JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_removeVehicle (JNIEnv * env, jobject object, jlong spaceId, jlong objectId) { - jmePhysicsSpace* space = reinterpret_cast(spaceId); - btActionInterface* actionObject = reinterpret_cast(objectId); + jmePhysicsSpace* space = reinterpret_cast (spaceId); + btActionInterface* actionObject = reinterpret_cast (objectId); if (space == NULL) { jclass newExc = env->FindClass("java/lang/NullPointerException"); env->ThrowNew(newExc, "The physics space does not exist."); @@ -317,8 +323,8 @@ extern "C" { */ JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_addConstraint (JNIEnv * env, jobject object, jlong spaceId, jlong objectId) { - jmePhysicsSpace* space = reinterpret_cast(spaceId); - btTypedConstraint* constraint = reinterpret_cast(objectId); + jmePhysicsSpace* space = reinterpret_cast (spaceId); + btTypedConstraint* constraint = reinterpret_cast (objectId); if (space == NULL) { jclass newExc = env->FindClass("java/lang/NullPointerException"); env->ThrowNew(newExc, "The physics space does not exist."); @@ -339,8 +345,8 @@ extern "C" { */ JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_addConstraintC (JNIEnv * env, jobject object, jlong spaceId, jlong objectId, jboolean collision) { - jmePhysicsSpace* space = reinterpret_cast(spaceId); - btTypedConstraint* constraint = reinterpret_cast(objectId); + jmePhysicsSpace* space = reinterpret_cast (spaceId); + btTypedConstraint* constraint = reinterpret_cast (objectId); if (space == NULL) { jclass newExc = env->FindClass("java/lang/NullPointerException"); env->ThrowNew(newExc, "The physics space does not exist."); @@ -361,8 +367,8 @@ extern "C" { */ JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_removeConstraint (JNIEnv * env, jobject object, jlong spaceId, jlong objectId) { - jmePhysicsSpace* space = reinterpret_cast(spaceId); - btTypedConstraint* constraint = reinterpret_cast(objectId); + jmePhysicsSpace* space = reinterpret_cast (spaceId); + btTypedConstraint* constraint = reinterpret_cast (objectId); if (space == NULL) { jclass newExc = env->FindClass("java/lang/NullPointerException"); env->ThrowNew(newExc, "The physics space does not exist."); @@ -383,7 +389,7 @@ extern "C" { */ JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_setGravity (JNIEnv * env, jobject object, jlong spaceId, jobject vector) { - jmePhysicsSpace* space = reinterpret_cast(spaceId); + jmePhysicsSpace* space = reinterpret_cast (spaceId); if (space == NULL) { jclass newExc = env->FindClass("java/lang/NullPointerException"); env->ThrowNew(newExc, "The physics space does not exist."); @@ -391,6 +397,7 @@ extern "C" { } btVector3 gravity = btVector3(); jmeBulletUtil::convert(env, vector, &gravity); + space->getDynamicsWorld()->setGravity(gravity); } @@ -411,13 +418,13 @@ extern "C" { */ JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_finalizeNative (JNIEnv * env, jobject object, jlong spaceId) { - jmePhysicsSpace* space = reinterpret_cast(spaceId); + jmePhysicsSpace* space = reinterpret_cast (spaceId); if (space == NULL) { return; } delete(space); } - + JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_rayTest_1native (JNIEnv * env, jobject object, jobject from, jobject to, jlong spaceId, jobject resultlist, jint flags) { @@ -465,13 +472,12 @@ extern "C" { resultCallback.resultlist = resultlist; resultCallback.m_flags = flags; space->getDynamicsWorld()->rayTest(native_from, native_to, resultCallback); + return; } - - JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_sweepTest_1native - (JNIEnv * env, jobject object, jlong shapeId, jobject from, jobject to, jlong spaceId, jobject resultlist, jfloat allowedCcdPenetration) { + (JNIEnv * env, jobject object, jlong shapeId, jobject from, jobject to, jlong spaceId, jobject resultlist, jfloat allowedCcdPenetration) { jmePhysicsSpace* space = reinterpret_cast (spaceId); if (space == NULL) { @@ -489,7 +495,7 @@ extern "C" { struct AllConvexResultCallback : public btCollisionWorld::ConvexResultCallback { - AllConvexResultCallback(const btTransform& convexFromWorld, const btTransform & convexToWorld) : m_convexFromWorld(convexFromWorld), m_convexToWorld(convexToWorld) { + AllConvexResultCallback(const btTransform& convexFromWorld, const btTransform & convexToWorld) : m_convexFromWorld(convexFromWorld), m_convexToWorld(convexToWorld) { } jobject resultlist; JNIEnv* env; @@ -500,17 +506,16 @@ extern "C" { btVector3 m_hitPointWorld; virtual btScalar addSingleResult(btCollisionWorld::LocalConvexResult& convexResult, bool normalInWorldSpace) { - if (normalInWorldSpace) { - m_hitNormalWorld = convexResult.m_hitNormalLocal; - } - else { - m_hitNormalWorld = convexResult.m_hitCollisionObject->getWorldTransform().getBasis() * convexResult.m_hitNormalLocal; - } - m_hitPointWorld.setInterpolate3(m_convexFromWorld.getBasis() * m_convexFromWorld.getOrigin(), m_convexToWorld.getBasis() * m_convexToWorld.getOrigin(), convexResult.m_hitFraction); + if (normalInWorldSpace) { + m_hitNormalWorld = convexResult.m_hitNormalLocal; + } else { + m_hitNormalWorld = convexResult.m_hitCollisionObject->getWorldTransform().getBasis() * convexResult.m_hitNormalLocal; + } + m_hitPointWorld.setInterpolate3(m_convexFromWorld.getBasis() * m_convexFromWorld.getOrigin(), m_convexToWorld.getBasis() * m_convexToWorld.getOrigin(), convexResult.m_hitFraction); - jmeBulletUtil::addSweepResult(env, resultlist, &m_hitNormalWorld, &m_hitPointWorld, convexResult.m_hitFraction, convexResult.m_hitCollisionObject); + jmeBulletUtil::addSweepResult(env, resultlist, &m_hitNormalWorld, &m_hitPointWorld, convexResult.m_hitFraction, convexResult.m_hitCollisionObject); - return 1.f; + return 1.f; } }; @@ -528,16 +533,16 @@ extern "C" { space->getDynamicsWorld()->convexSweepTest((btConvexShape *) shape, native_from, native_to, resultCallback, native_allowed_ccd_penetration); return; } - + JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_setSolverNumIterations (JNIEnv *env, jobject object, jlong spaceId, jint value) { - jmePhysicsSpace* space = reinterpret_cast(spaceId); + jmePhysicsSpace* space = reinterpret_cast (spaceId); if (space == NULL) { jclass newExc = env->FindClass("java/lang/NullPointerException"); env->ThrowNew(newExc, "The physics space does not exist."); return; } - + space->getDynamicsWorld()->getSolverInfo().m_numIterations = value; } diff --git a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_PhysicsSpace.h b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_PhysicsSpace.h deleted file mode 100644 index b7b932df9..000000000 --- a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_PhysicsSpace.h +++ /dev/null @@ -1,187 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_PhysicsSpace */ - -#ifndef _Included_com_jme3_bullet_PhysicsSpace -#define _Included_com_jme3_bullet_PhysicsSpace -#ifdef __cplusplus -extern "C" { -#endif -#undef com_jme3_bullet_PhysicsSpace_AXIS_X -#define com_jme3_bullet_PhysicsSpace_AXIS_X 0L -#undef com_jme3_bullet_PhysicsSpace_AXIS_Y -#define com_jme3_bullet_PhysicsSpace_AXIS_Y 1L -#undef com_jme3_bullet_PhysicsSpace_AXIS_Z -#define com_jme3_bullet_PhysicsSpace_AXIS_Z 2L -/* - * Class: com_jme3_bullet_PhysicsSpace - * Method: createPhysicsSpace - * Signature: (FFFFFFIZ)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_PhysicsSpace_createPhysicsSpace - (JNIEnv *, jobject, jfloat, jfloat, jfloat, jfloat, jfloat, jfloat, jint, jboolean); - -/* - * Class: com_jme3_bullet_PhysicsSpace - * Method: stepSimulation - * Signature: (JFIF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_stepSimulation - (JNIEnv *, jobject, jlong, jfloat, jint, jfloat); - -/* - * Class: com_jme3_bullet_PhysicsSpace - * Method: addCollisionObject - * Signature: (JJ)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_addCollisionObject - (JNIEnv *, jobject, jlong, jlong); - -/* - * Class: com_jme3_bullet_PhysicsSpace - * Method: removeCollisionObject - * Signature: (JJ)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_removeCollisionObject - (JNIEnv *, jobject, jlong, jlong); - -/* - * Class: com_jme3_bullet_PhysicsSpace - * Method: addRigidBody - * Signature: (JJ)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_addRigidBody - (JNIEnv *, jobject, jlong, jlong); - -/* - * Class: com_jme3_bullet_PhysicsSpace - * Method: removeRigidBody - * Signature: (JJ)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_removeRigidBody - (JNIEnv *, jobject, jlong, jlong); - -/* - * Class: com_jme3_bullet_PhysicsSpace - * Method: addCharacterObject - * Signature: (JJ)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_addCharacterObject - (JNIEnv *, jobject, jlong, jlong); - -/* - * Class: com_jme3_bullet_PhysicsSpace - * Method: removeCharacterObject - * Signature: (JJ)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_removeCharacterObject - (JNIEnv *, jobject, jlong, jlong); - -/* - * Class: com_jme3_bullet_PhysicsSpace - * Method: addAction - * Signature: (JJ)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_addAction - (JNIEnv *, jobject, jlong, jlong); - -/* - * Class: com_jme3_bullet_PhysicsSpace - * Method: removeAction - * Signature: (JJ)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_removeAction - (JNIEnv *, jobject, jlong, jlong); - -/* - * Class: com_jme3_bullet_PhysicsSpace - * Method: addVehicle - * Signature: (JJ)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_addVehicle - (JNIEnv *, jobject, jlong, jlong); - -/* - * Class: com_jme3_bullet_PhysicsSpace - * Method: removeVehicle - * Signature: (JJ)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_removeVehicle - (JNIEnv *, jobject, jlong, jlong); - -/* - * Class: com_jme3_bullet_PhysicsSpace - * Method: addConstraint - * Signature: (JJ)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_addConstraint - (JNIEnv *, jobject, jlong, jlong); - -/* - * Class: com_jme3_bullet_PhysicsSpace - * Method: addConstraintC - * Signature: (JJZ)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_addConstraintC - (JNIEnv *, jobject, jlong, jlong, jboolean); - -/* - * Class: com_jme3_bullet_PhysicsSpace - * Method: removeConstraint - * Signature: (JJ)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_removeConstraint - (JNIEnv *, jobject, jlong, jlong); - -/* - * Class: com_jme3_bullet_PhysicsSpace - * Method: setGravity - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_setGravity - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_PhysicsSpace - * Method: rayTest_native - * Signature: (Lcom/jme3/math/Vector3f;Lcom/jme3/math/Vector3f;JLjava/util/List;I)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_rayTest_1native - (JNIEnv *, jobject, jobject, jobject, jlong, jobject, jint); - -/* - * Class: com_jme3_bullet_PhysicsSpace - * Method: sweepTest_native - * Signature: (JLcom/jme3/math/Transform;Lcom/jme3/math/Transform;JLjava/util/List;F)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_sweepTest_1native - (JNIEnv *, jobject, jlong, jobject, jobject, jlong, jobject, jfloat); - -/* - * Class: com_jme3_bullet_PhysicsSpace - * Method: setSolverNumIterations - * Signature: (JI)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_setSolverNumIterations - (JNIEnv *, jobject, jlong, jint); - -/* - * Class: com_jme3_bullet_PhysicsSpace - * Method: initNativePhysics - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_initNativePhysics - (JNIEnv *, jclass); - -/* - * Class: com_jme3_bullet_PhysicsSpace - * Method: finalizeNative - * Signature: (J)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_finalizeNative - (JNIEnv *, jobject, jlong); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_PhysicsSpace_BroadphaseType.h b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_PhysicsSpace_BroadphaseType.h deleted file mode 100644 index 04eb0f45f..000000000 --- a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_PhysicsSpace_BroadphaseType.h +++ /dev/null @@ -1,13 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_PhysicsSpace_BroadphaseType */ - -#ifndef _Included_com_jme3_bullet_PhysicsSpace_BroadphaseType -#define _Included_com_jme3_bullet_PhysicsSpace_BroadphaseType -#ifdef __cplusplus -extern "C" { -#endif -#ifdef __cplusplus -} -#endif -#endif diff --git a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_collision_PhysicsCollisionEvent.h b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_collision_PhysicsCollisionEvent.h deleted file mode 100644 index 2dd9dcf3b..000000000 --- a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_collision_PhysicsCollisionEvent.h +++ /dev/null @@ -1,173 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_collision_PhysicsCollisionEvent */ - -#ifndef _Included_com_jme3_bullet_collision_PhysicsCollisionEvent -#define _Included_com_jme3_bullet_collision_PhysicsCollisionEvent -#ifdef __cplusplus -extern "C" { -#endif -#undef com_jme3_bullet_collision_PhysicsCollisionEvent_serialVersionUID -#define com_jme3_bullet_collision_PhysicsCollisionEvent_serialVersionUID 5516075349620653480LL -#undef com_jme3_bullet_collision_PhysicsCollisionEvent_TYPE_ADDED -#define com_jme3_bullet_collision_PhysicsCollisionEvent_TYPE_ADDED 0L -#undef com_jme3_bullet_collision_PhysicsCollisionEvent_TYPE_PROCESSED -#define com_jme3_bullet_collision_PhysicsCollisionEvent_TYPE_PROCESSED 1L -#undef com_jme3_bullet_collision_PhysicsCollisionEvent_TYPE_DESTROYED -#define com_jme3_bullet_collision_PhysicsCollisionEvent_TYPE_DESTROYED 2L -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: getAppliedImpulse - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_getAppliedImpulse - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: getAppliedImpulseLateral1 - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_getAppliedImpulseLateral1 - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: getAppliedImpulseLateral2 - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_getAppliedImpulseLateral2 - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: getCombinedFriction - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_getCombinedFriction - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: getCombinedRestitution - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_getCombinedRestitution - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: getDistance1 - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_getDistance1 - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: getIndex0 - * Signature: (J)I - */ -JNIEXPORT jint JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_getIndex0 - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: getIndex1 - * Signature: (J)I - */ -JNIEXPORT jint JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_getIndex1 - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: getLateralFrictionDir1 - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_getLateralFrictionDir1 - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: getLateralFrictionDir2 - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_getLateralFrictionDir2 - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: isLateralFrictionInitialized - * Signature: (J)Z - */ -JNIEXPORT jboolean JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_isLateralFrictionInitialized - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: getLifeTime - * Signature: (J)I - */ -JNIEXPORT jint JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_getLifeTime - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: getLocalPointA - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_getLocalPointA - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: getLocalPointB - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_getLocalPointB - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: getNormalWorldOnB - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_getNormalWorldOnB - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: getPartId0 - * Signature: (J)I - */ -JNIEXPORT jint JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_getPartId0 - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: getPartId1 - * Signature: (J)I - */ -JNIEXPORT jint JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_getPartId1 - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: getPositionWorldOnA - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_getPositionWorldOnA - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionEvent - * Method: getPositionWorldOnB - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionEvent_getPositionWorldOnB - (JNIEnv *, jobject, jlong, jobject); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_collision_PhysicsCollisionObject.cpp b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_collision_PhysicsCollisionObject.cpp index e3852c76a..0c7f0161a 100644 --- a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_collision_PhysicsCollisionObject.cpp +++ b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_collision_PhysicsCollisionObject.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -143,6 +143,42 @@ extern "C" { } } + /* + * Class: com_jme3_bullet_collision_PhysicsCollisionObject + * Method: getCollisionFlags + * Signature: (J)I + */ + JNIEXPORT jint JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionObject_getCollisionFlags + (JNIEnv *env, jobject object, jlong objectId) { + btCollisionObject* collisionObject = reinterpret_cast (objectId); + if (collisionObject == NULL) { + jclass newExc = env->FindClass("java/lang/NullPointerException"); + env->ThrowNew(newExc, "The native object does not exist."); + return 0; + } + + jint result = collisionObject->getCollisionFlags(); + return result; + } + + /* + * Class: com_jme3_bullet_collision_PhysicsCollisionObject + * Method: setCollisionFlags + * Signature: (JI)V + */ + JNIEXPORT void JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionObject_setCollisionFlags + (JNIEnv *env, jobject object, jlong objectId, jint desiredFlags) { + btCollisionObject* collisionObject = reinterpret_cast (objectId); + if (collisionObject == NULL) { + jclass newExc = env->FindClass("java/lang/NullPointerException"); + env->ThrowNew(newExc, "The native object does not exist."); + return; + } + + collisionObject->setCollisionFlags(desiredFlags); + } + + #ifdef __cplusplus } #endif diff --git a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_collision_PhysicsCollisionObject.h b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_collision_PhysicsCollisionObject.h deleted file mode 100644 index db5bf7aaf..000000000 --- a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_collision_PhysicsCollisionObject.h +++ /dev/null @@ -1,87 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_collision_PhysicsCollisionObject */ - -#ifndef _Included_com_jme3_bullet_collision_PhysicsCollisionObject -#define _Included_com_jme3_bullet_collision_PhysicsCollisionObject -#ifdef __cplusplus -extern "C" { -#endif -#undef com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_NONE -#define com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_NONE 0L -#undef com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_01 -#define com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_01 1L -#undef com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_02 -#define com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_02 2L -#undef com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_03 -#define com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_03 4L -#undef com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_04 -#define com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_04 8L -#undef com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_05 -#define com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_05 16L -#undef com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_06 -#define com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_06 32L -#undef com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_07 -#define com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_07 64L -#undef com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_08 -#define com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_08 128L -#undef com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_09 -#define com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_09 256L -#undef com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_10 -#define com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_10 512L -#undef com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_11 -#define com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_11 1024L -#undef com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_12 -#define com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_12 2048L -#undef com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_13 -#define com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_13 4096L -#undef com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_14 -#define com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_14 8192L -#undef com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_15 -#define com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_15 16384L -#undef com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_16 -#define com_jme3_bullet_collision_PhysicsCollisionObject_COLLISION_GROUP_16 32768L -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionObject - * Method: initUserPointer - * Signature: (JII)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionObject_initUserPointer - (JNIEnv *, jobject, jlong, jint, jint); - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionObject - * Method: attachCollisionShape - * Signature: (JJ)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionObject_attachCollisionShape - (JNIEnv *, jobject, jlong, jlong); - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionObject - * Method: setCollisionGroup - * Signature: (JI)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionObject_setCollisionGroup - (JNIEnv *, jobject, jlong, jint); - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionObject - * Method: setCollideWithGroups - * Signature: (JI)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionObject_setCollideWithGroups - (JNIEnv *, jobject, jlong, jint); - -/* - * Class: com_jme3_bullet_collision_PhysicsCollisionObject - * Method: finalizeNative - * Signature: (J)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionObject_finalizeNative - (JNIEnv *, jobject, jlong); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_collision_shapes_BoxCollisionShape.h b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_collision_shapes_BoxCollisionShape.h deleted file mode 100644 index 5602a0dd3..000000000 --- a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_collision_shapes_BoxCollisionShape.h +++ /dev/null @@ -1,21 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_collision_shapes_BoxCollisionShape */ - -#ifndef _Included_com_jme3_bullet_collision_shapes_BoxCollisionShape -#define _Included_com_jme3_bullet_collision_shapes_BoxCollisionShape -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jme3_bullet_collision_shapes_BoxCollisionShape - * Method: createShape - * Signature: (Lcom/jme3/math/Vector3f;)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_collision_shapes_BoxCollisionShape_createShape - (JNIEnv *, jobject, jobject); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_collision_shapes_CapsuleCollisionShape.h b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_collision_shapes_CapsuleCollisionShape.h deleted file mode 100644 index 4d706748d..000000000 --- a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_collision_shapes_CapsuleCollisionShape.h +++ /dev/null @@ -1,21 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_collision_shapes_CapsuleCollisionShape */ - -#ifndef _Included_com_jme3_bullet_collision_shapes_CapsuleCollisionShape -#define _Included_com_jme3_bullet_collision_shapes_CapsuleCollisionShape -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jme3_bullet_collision_shapes_CapsuleCollisionShape - * Method: createShape - * Signature: (IFF)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_collision_shapes_CapsuleCollisionShape_createShape - (JNIEnv *, jobject, jint, jfloat, jfloat); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_collision_shapes_CollisionShape.h b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_collision_shapes_CollisionShape.h deleted file mode 100644 index cd5d70f21..000000000 --- a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_collision_shapes_CollisionShape.h +++ /dev/null @@ -1,45 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_collision_shapes_CollisionShape */ - -#ifndef _Included_com_jme3_bullet_collision_shapes_CollisionShape -#define _Included_com_jme3_bullet_collision_shapes_CollisionShape -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jme3_bullet_collision_shapes_CollisionShape - * Method: getMargin - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_collision_shapes_CollisionShape_getMargin - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_collision_shapes_CollisionShape - * Method: setLocalScaling - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_collision_shapes_CollisionShape_setLocalScaling - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_collision_shapes_CollisionShape - * Method: setMargin - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_collision_shapes_CollisionShape_setMargin - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_collision_shapes_CollisionShape - * Method: finalizeNative - * Signature: (J)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_collision_shapes_CollisionShape_finalizeNative - (JNIEnv *, jobject, jlong); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_collision_shapes_CompoundCollisionShape.h b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_collision_shapes_CompoundCollisionShape.h deleted file mode 100644 index 18783ce1d..000000000 --- a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_collision_shapes_CompoundCollisionShape.h +++ /dev/null @@ -1,37 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_collision_shapes_CompoundCollisionShape */ - -#ifndef _Included_com_jme3_bullet_collision_shapes_CompoundCollisionShape -#define _Included_com_jme3_bullet_collision_shapes_CompoundCollisionShape -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jme3_bullet_collision_shapes_CompoundCollisionShape - * Method: createShape - * Signature: ()J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_collision_shapes_CompoundCollisionShape_createShape - (JNIEnv *, jobject); - -/* - * Class: com_jme3_bullet_collision_shapes_CompoundCollisionShape - * Method: addChildShape - * Signature: (JJLcom/jme3/math/Vector3f;Lcom/jme3/math/Matrix3f;)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_collision_shapes_CompoundCollisionShape_addChildShape - (JNIEnv *, jobject, jlong, jlong, jobject, jobject); - -/* - * Class: com_jme3_bullet_collision_shapes_CompoundCollisionShape - * Method: removeChildShape - * Signature: (JJ)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_collision_shapes_CompoundCollisionShape_removeChildShape - (JNIEnv *, jobject, jlong, jlong); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_collision_shapes_ConeCollisionShape.h b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_collision_shapes_ConeCollisionShape.h deleted file mode 100644 index 711276ebb..000000000 --- a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_collision_shapes_ConeCollisionShape.h +++ /dev/null @@ -1,21 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_collision_shapes_ConeCollisionShape */ - -#ifndef _Included_com_jme3_bullet_collision_shapes_ConeCollisionShape -#define _Included_com_jme3_bullet_collision_shapes_ConeCollisionShape -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jme3_bullet_collision_shapes_ConeCollisionShape - * Method: createShape - * Signature: (IFF)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_collision_shapes_ConeCollisionShape_createShape - (JNIEnv *, jobject, jint, jfloat, jfloat); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_collision_shapes_CylinderCollisionShape.h b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_collision_shapes_CylinderCollisionShape.h deleted file mode 100644 index 48a665ac7..000000000 --- a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_collision_shapes_CylinderCollisionShape.h +++ /dev/null @@ -1,21 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_collision_shapes_CylinderCollisionShape */ - -#ifndef _Included_com_jme3_bullet_collision_shapes_CylinderCollisionShape -#define _Included_com_jme3_bullet_collision_shapes_CylinderCollisionShape -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jme3_bullet_collision_shapes_CylinderCollisionShape - * Method: createShape - * Signature: (ILcom/jme3/math/Vector3f;)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_collision_shapes_CylinderCollisionShape_createShape - (JNIEnv *, jobject, jint, jobject); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_collision_shapes_GImpactCollisionShape.h b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_collision_shapes_GImpactCollisionShape.h deleted file mode 100644 index f08d3ebf8..000000000 --- a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_collision_shapes_GImpactCollisionShape.h +++ /dev/null @@ -1,29 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_collision_shapes_GImpactCollisionShape */ - -#ifndef _Included_com_jme3_bullet_collision_shapes_GImpactCollisionShape -#define _Included_com_jme3_bullet_collision_shapes_GImpactCollisionShape -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jme3_bullet_collision_shapes_GImpactCollisionShape - * Method: createShape - * Signature: (J)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_collision_shapes_GImpactCollisionShape_createShape - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_collision_shapes_GImpactCollisionShape - * Method: finalizeNative - * Signature: (J)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_collision_shapes_GImpactCollisionShape_finalizeNative - (JNIEnv *, jobject, jlong); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_collision_shapes_HeightfieldCollisionShape.h b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_collision_shapes_HeightfieldCollisionShape.h deleted file mode 100644 index a3d1621b8..000000000 --- a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_collision_shapes_HeightfieldCollisionShape.h +++ /dev/null @@ -1,21 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_collision_shapes_HeightfieldCollisionShape */ - -#ifndef _Included_com_jme3_bullet_collision_shapes_HeightfieldCollisionShape -#define _Included_com_jme3_bullet_collision_shapes_HeightfieldCollisionShape -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jme3_bullet_collision_shapes_HeightfieldCollisionShape - * Method: createShape - * Signature: (IILjava/nio/ByteBuffer;FFFIZ)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_collision_shapes_HeightfieldCollisionShape_createShape - (JNIEnv *, jobject, jint, jint, jobject, jfloat, jfloat, jfloat, jint, jboolean); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_collision_shapes_HullCollisionShape.h b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_collision_shapes_HullCollisionShape.h deleted file mode 100644 index 42a267216..000000000 --- a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_collision_shapes_HullCollisionShape.h +++ /dev/null @@ -1,21 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_collision_shapes_HullCollisionShape */ - -#ifndef _Included_com_jme3_bullet_collision_shapes_HullCollisionShape -#define _Included_com_jme3_bullet_collision_shapes_HullCollisionShape -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jme3_bullet_collision_shapes_HullCollisionShape - * Method: createShape - * Signature: (Ljava/nio/ByteBuffer;)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_collision_shapes_HullCollisionShape_createShape - (JNIEnv *, jobject, jobject); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_collision_shapes_MeshCollisionShape.h b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_collision_shapes_MeshCollisionShape.h deleted file mode 100644 index 11b2aa32a..000000000 --- a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_collision_shapes_MeshCollisionShape.h +++ /dev/null @@ -1,45 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_collision_shapes_MeshCollisionShape */ - -#ifndef _Included_com_jme3_bullet_collision_shapes_MeshCollisionShape -#define _Included_com_jme3_bullet_collision_shapes_MeshCollisionShape -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jme3_bullet_collision_shapes_MeshCollisionShape - * Method: setBVH - * Signature: ([BJ)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_collision_shapes_MeshCollisionShape_setBVH - (JNIEnv *, jobject, jbyteArray, jlong); - -/* - * Class: com_jme3_bullet_collision_shapes_MeshCollisionShape - * Method: saveBVH - * Signature: (J)[B - */ -JNIEXPORT jbyteArray JNICALL Java_com_jme3_bullet_collision_shapes_MeshCollisionShape_saveBVH - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_collision_shapes_MeshCollisionShape - * Method: createShape - * Signature: (ZZJ)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_collision_shapes_MeshCollisionShape_createShape - (JNIEnv *, jobject, jboolean, jboolean, jlong); - -/* - * Class: com_jme3_bullet_collision_shapes_MeshCollisionShape - * Method: finalizeNative - * Signature: (JJ)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_collision_shapes_MeshCollisionShape_finalizeNative - (JNIEnv *, jobject, jlong, jlong); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_collision_shapes_PlaneCollisionShape.h b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_collision_shapes_PlaneCollisionShape.h deleted file mode 100644 index 7e7a22bdf..000000000 --- a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_collision_shapes_PlaneCollisionShape.h +++ /dev/null @@ -1,21 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_collision_shapes_PlaneCollisionShape */ - -#ifndef _Included_com_jme3_bullet_collision_shapes_PlaneCollisionShape -#define _Included_com_jme3_bullet_collision_shapes_PlaneCollisionShape -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jme3_bullet_collision_shapes_PlaneCollisionShape - * Method: createShape - * Signature: (Lcom/jme3/math/Vector3f;F)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_collision_shapes_PlaneCollisionShape_createShape - (JNIEnv *, jobject, jobject, jfloat); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_collision_shapes_SimplexCollisionShape.h b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_collision_shapes_SimplexCollisionShape.h deleted file mode 100644 index e50d06226..000000000 --- a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_collision_shapes_SimplexCollisionShape.h +++ /dev/null @@ -1,45 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_collision_shapes_SimplexCollisionShape */ - -#ifndef _Included_com_jme3_bullet_collision_shapes_SimplexCollisionShape -#define _Included_com_jme3_bullet_collision_shapes_SimplexCollisionShape -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jme3_bullet_collision_shapes_SimplexCollisionShape - * Method: createShape - * Signature: (Lcom/jme3/math/Vector3f;)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_collision_shapes_SimplexCollisionShape_createShape__Lcom_jme3_math_Vector3f_2 - (JNIEnv *, jobject, jobject); - -/* - * Class: com_jme3_bullet_collision_shapes_SimplexCollisionShape - * Method: createShape - * Signature: (Lcom/jme3/math/Vector3f;Lcom/jme3/math/Vector3f;)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_collision_shapes_SimplexCollisionShape_createShape__Lcom_jme3_math_Vector3f_2Lcom_jme3_math_Vector3f_2 - (JNIEnv *, jobject, jobject, jobject); - -/* - * Class: com_jme3_bullet_collision_shapes_SimplexCollisionShape - * Method: createShape - * Signature: (Lcom/jme3/math/Vector3f;Lcom/jme3/math/Vector3f;Lcom/jme3/math/Vector3f;)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_collision_shapes_SimplexCollisionShape_createShape__Lcom_jme3_math_Vector3f_2Lcom_jme3_math_Vector3f_2Lcom_jme3_math_Vector3f_2 - (JNIEnv *, jobject, jobject, jobject, jobject); - -/* - * Class: com_jme3_bullet_collision_shapes_SimplexCollisionShape - * Method: createShape - * Signature: (Lcom/jme3/math/Vector3f;Lcom/jme3/math/Vector3f;Lcom/jme3/math/Vector3f;Lcom/jme3/math/Vector3f;)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_collision_shapes_SimplexCollisionShape_createShape__Lcom_jme3_math_Vector3f_2Lcom_jme3_math_Vector3f_2Lcom_jme3_math_Vector3f_2Lcom_jme3_math_Vector3f_2 - (JNIEnv *, jobject, jobject, jobject, jobject, jobject); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_collision_shapes_SphereCollisionShape.h b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_collision_shapes_SphereCollisionShape.h deleted file mode 100644 index ef1b2cbed..000000000 --- a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_collision_shapes_SphereCollisionShape.h +++ /dev/null @@ -1,21 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_collision_shapes_SphereCollisionShape */ - -#ifndef _Included_com_jme3_bullet_collision_shapes_SphereCollisionShape -#define _Included_com_jme3_bullet_collision_shapes_SphereCollisionShape -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jme3_bullet_collision_shapes_SphereCollisionShape - * Method: createShape - * Signature: (F)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_collision_shapes_SphereCollisionShape_createShape - (JNIEnv *, jobject, jfloat); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_joints_ConeJoint.h b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_joints_ConeJoint.h deleted file mode 100644 index 327b47f25..000000000 --- a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_joints_ConeJoint.h +++ /dev/null @@ -1,37 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_joints_ConeJoint */ - -#ifndef _Included_com_jme3_bullet_joints_ConeJoint -#define _Included_com_jme3_bullet_joints_ConeJoint -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jme3_bullet_joints_ConeJoint - * Method: setLimit - * Signature: (JFFF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_ConeJoint_setLimit - (JNIEnv *, jobject, jlong, jfloat, jfloat, jfloat); - -/* - * Class: com_jme3_bullet_joints_ConeJoint - * Method: setAngularOnly - * Signature: (JZ)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_ConeJoint_setAngularOnly - (JNIEnv *, jobject, jlong, jboolean); - -/* - * Class: com_jme3_bullet_joints_ConeJoint - * Method: createJoint - * Signature: (JJLcom/jme3/math/Vector3f;Lcom/jme3/math/Matrix3f;Lcom/jme3/math/Vector3f;Lcom/jme3/math/Matrix3f;)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_joints_ConeJoint_createJoint - (JNIEnv *, jobject, jlong, jlong, jobject, jobject, jobject, jobject); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_joints_HingeJoint.cpp b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_joints_HingeJoint.cpp index 48ba90f37..351be3ffa 100644 --- a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_joints_HingeJoint.cpp +++ b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_joints_HingeJoint.cpp @@ -85,7 +85,7 @@ extern "C" { env->ThrowNew(newExc, "The native object does not exist."); return 0; } - return joint->getMotorTargetVelosity(); + return joint->getMotorTargetVelocity(); } /* diff --git a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_joints_HingeJoint.h b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_joints_HingeJoint.h deleted file mode 100644 index ab6e0034f..000000000 --- a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_joints_HingeJoint.h +++ /dev/null @@ -1,101 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_joints_HingeJoint */ - -#ifndef _Included_com_jme3_bullet_joints_HingeJoint -#define _Included_com_jme3_bullet_joints_HingeJoint -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jme3_bullet_joints_HingeJoint - * Method: enableMotor - * Signature: (JZFF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_HingeJoint_enableMotor - (JNIEnv *, jobject, jlong, jboolean, jfloat, jfloat); - -/* - * Class: com_jme3_bullet_joints_HingeJoint - * Method: getEnableAngularMotor - * Signature: (J)Z - */ -JNIEXPORT jboolean JNICALL Java_com_jme3_bullet_joints_HingeJoint_getEnableAngularMotor - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_HingeJoint - * Method: getMotorTargetVelocity - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_HingeJoint_getMotorTargetVelocity - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_HingeJoint - * Method: getMaxMotorImpulse - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_HingeJoint_getMaxMotorImpulse - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_HingeJoint - * Method: setLimit - * Signature: (JFF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_HingeJoint_setLimit__JFF - (JNIEnv *, jobject, jlong, jfloat, jfloat); - -/* - * Class: com_jme3_bullet_joints_HingeJoint - * Method: setLimit - * Signature: (JFFFFF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_HingeJoint_setLimit__JFFFFF - (JNIEnv *, jobject, jlong, jfloat, jfloat, jfloat, jfloat, jfloat); - -/* - * Class: com_jme3_bullet_joints_HingeJoint - * Method: getUpperLimit - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_HingeJoint_getUpperLimit - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_HingeJoint - * Method: getLowerLimit - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_HingeJoint_getLowerLimit - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_HingeJoint - * Method: setAngularOnly - * Signature: (JZ)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_HingeJoint_setAngularOnly - (JNIEnv *, jobject, jlong, jboolean); - -/* - * Class: com_jme3_bullet_joints_HingeJoint - * Method: getHingeAngle - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_HingeJoint_getHingeAngle - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_HingeJoint - * Method: createJoint - * Signature: (JJLcom/jme3/math/Vector3f;Lcom/jme3/math/Vector3f;Lcom/jme3/math/Vector3f;Lcom/jme3/math/Vector3f;)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_joints_HingeJoint_createJoint - (JNIEnv *, jobject, jlong, jlong, jobject, jobject, jobject, jobject); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_joints_PhysicsJoint.cpp b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_joints_PhysicsJoint.cpp index 129865034..b00425e88 100644 --- a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_joints_PhysicsJoint.cpp +++ b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_joints_PhysicsJoint.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -56,6 +56,22 @@ extern "C" { return joint->getAppliedImpulse(); } + /* + * Class: com_jme3_bullet_joints_PhysicsJoint + * Method: finalizeNative + * Signature: (J)V + */ + JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_PhysicsJoint_finalizeNative + (JNIEnv * env, jobject object, jlong jointId) { + btTypedConstraint* joint = reinterpret_cast (jointId); + if (joint == NULL) { + jclass newExc = env->FindClass("java/lang/NullPointerException"); + env->ThrowNew(newExc, "The native object does not exist."); + return; + } + delete(joint); + } + #ifdef __cplusplus } #endif diff --git a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_joints_PhysicsJoint.h b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_joints_PhysicsJoint.h deleted file mode 100644 index 63e21a7d3..000000000 --- a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_joints_PhysicsJoint.h +++ /dev/null @@ -1,29 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_joints_PhysicsJoint */ - -#ifndef _Included_com_jme3_bullet_joints_PhysicsJoint -#define _Included_com_jme3_bullet_joints_PhysicsJoint -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jme3_bullet_joints_PhysicsJoint - * Method: getAppliedImpulse - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_PhysicsJoint_getAppliedImpulse - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_PhysicsJoint - * Method: finalizeNative - * Signature: (J)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_PhysicsJoint_finalizeNative - (JNIEnv *, jobject, jlong); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_joints_Point2PointJoint.cpp b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_joints_Point2PointJoint.cpp index f6d785583..528451878 100644 --- a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_joints_Point2PointJoint.cpp +++ b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_joints_Point2PointJoint.cpp @@ -111,13 +111,13 @@ extern "C" { */ JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_Point2PointJoint_getImpulseClamp (JNIEnv * env, jobject object, jlong jointId) { - btPoint2PointConstraint* joint = reinterpret_cast(jointId); + btPoint2PointConstraint* joint = reinterpret_cast (jointId); if (joint == NULL) { jclass newExc = env->FindClass("java/lang/NullPointerException"); env->ThrowNew(newExc, "The native object does not exist."); return 0; } - return joint->m_setting.m_damping; + return joint->m_setting.m_impulseClamp; } /* @@ -127,13 +127,13 @@ extern "C" { */ JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_Point2PointJoint_getTau (JNIEnv * env, jobject object, jlong jointId) { - btPoint2PointConstraint* joint = reinterpret_cast(jointId); + btPoint2PointConstraint* joint = reinterpret_cast (jointId); if (joint == NULL) { jclass newExc = env->FindClass("java/lang/NullPointerException"); env->ThrowNew(newExc, "The native object does not exist."); return 0; } - return joint->m_setting.m_damping; + return joint->m_setting.m_tau; } /* diff --git a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_joints_Point2PointJoint.h b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_joints_Point2PointJoint.h deleted file mode 100644 index 5cb8188a8..000000000 --- a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_joints_Point2PointJoint.h +++ /dev/null @@ -1,69 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_joints_Point2PointJoint */ - -#ifndef _Included_com_jme3_bullet_joints_Point2PointJoint -#define _Included_com_jme3_bullet_joints_Point2PointJoint -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jme3_bullet_joints_Point2PointJoint - * Method: setDamping - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_Point2PointJoint_setDamping - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_Point2PointJoint - * Method: setImpulseClamp - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_Point2PointJoint_setImpulseClamp - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_Point2PointJoint - * Method: setTau - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_Point2PointJoint_setTau - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_Point2PointJoint - * Method: getDamping - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_Point2PointJoint_getDamping - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_Point2PointJoint - * Method: getImpulseClamp - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_Point2PointJoint_getImpulseClamp - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_Point2PointJoint - * Method: getTau - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_Point2PointJoint_getTau - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_Point2PointJoint - * Method: createJoint - * Signature: (JJLcom/jme3/math/Vector3f;Lcom/jme3/math/Vector3f;)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_joints_Point2PointJoint_createJoint - (JNIEnv *, jobject, jlong, jlong, jobject, jobject); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_joints_SixDofJoint.h b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_joints_SixDofJoint.h deleted file mode 100644 index 86e610234..000000000 --- a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_joints_SixDofJoint.h +++ /dev/null @@ -1,69 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_joints_SixDofJoint */ - -#ifndef _Included_com_jme3_bullet_joints_SixDofJoint -#define _Included_com_jme3_bullet_joints_SixDofJoint -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jme3_bullet_joints_SixDofJoint - * Method: getRotationalLimitMotor - * Signature: (JI)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_joints_SixDofJoint_getRotationalLimitMotor - (JNIEnv *, jobject, jlong, jint); - -/* - * Class: com_jme3_bullet_joints_SixDofJoint - * Method: getTranslationalLimitMotor - * Signature: (J)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_joints_SixDofJoint_getTranslationalLimitMotor - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SixDofJoint - * Method: setLinearUpperLimit - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SixDofJoint_setLinearUpperLimit - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_joints_SixDofJoint - * Method: setLinearLowerLimit - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SixDofJoint_setLinearLowerLimit - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_joints_SixDofJoint - * Method: setAngularUpperLimit - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SixDofJoint_setAngularUpperLimit - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_joints_SixDofJoint - * Method: setAngularLowerLimit - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SixDofJoint_setAngularLowerLimit - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_joints_SixDofJoint - * Method: createJoint - * Signature: (JJLcom/jme3/math/Vector3f;Lcom/jme3/math/Matrix3f;Lcom/jme3/math/Vector3f;Lcom/jme3/math/Matrix3f;Z)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_joints_SixDofJoint_createJoint - (JNIEnv *, jobject, jlong, jlong, jobject, jobject, jobject, jobject, jboolean); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_joints_SixDofSpringJoint.h b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_joints_SixDofSpringJoint.h deleted file mode 100644 index b4fced0c9..000000000 --- a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_joints_SixDofSpringJoint.h +++ /dev/null @@ -1,61 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_joints_SixDofSpringJoint */ - -#ifndef _Included_com_jme3_bullet_joints_SixDofSpringJoint -#define _Included_com_jme3_bullet_joints_SixDofSpringJoint -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jme3_bullet_joints_SixDofSpringJoint - * Method: enableSpring - * Signature: (JIZ)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SixDofSpringJoint_enableSpring - (JNIEnv *, jobject, jlong, jint, jboolean); - -/* - * Class: com_jme3_bullet_joints_SixDofSpringJoint - * Method: setStiffness - * Signature: (JIF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SixDofSpringJoint_setStiffness - (JNIEnv *, jobject, jlong, jint, jfloat); - -/* - * Class: com_jme3_bullet_joints_SixDofSpringJoint - * Method: setDamping - * Signature: (JIF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SixDofSpringJoint_setDamping - (JNIEnv *, jobject, jlong, jint, jfloat); - -/* - * Class: com_jme3_bullet_joints_SixDofSpringJoint - * Method: setEquilibriumPoint - * Signature: (J)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SixDofSpringJoint_setEquilibriumPoint__J - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SixDofSpringJoint - * Method: setEquilibriumPoint - * Signature: (JI)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SixDofSpringJoint_setEquilibriumPoint__JI - (JNIEnv *, jobject, jlong, jint); - -/* - * Class: com_jme3_bullet_joints_SixDofSpringJoint - * Method: createJoint - * Signature: (JJLcom/jme3/math/Vector3f;Lcom/jme3/math/Matrix3f;Lcom/jme3/math/Vector3f;Lcom/jme3/math/Matrix3f;Z)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_joints_SixDofSpringJoint_createJoint - (JNIEnv *, jobject, jlong, jlong, jobject, jobject, jobject, jobject, jboolean); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_joints_SliderJoint.h b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_joints_SliderJoint.h deleted file mode 100644 index 7afd66a56..000000000 --- a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_joints_SliderJoint.h +++ /dev/null @@ -1,469 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_joints_SliderJoint */ - -#ifndef _Included_com_jme3_bullet_joints_SliderJoint -#define _Included_com_jme3_bullet_joints_SliderJoint -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getLowerLinLimit - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getLowerLinLimit - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setLowerLinLimit - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setLowerLinLimit - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getUpperLinLimit - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getUpperLinLimit - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setUpperLinLimit - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setUpperLinLimit - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getLowerAngLimit - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getLowerAngLimit - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setLowerAngLimit - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setLowerAngLimit - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getUpperAngLimit - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getUpperAngLimit - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setUpperAngLimit - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setUpperAngLimit - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getSoftnessDirLin - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getSoftnessDirLin - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setSoftnessDirLin - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setSoftnessDirLin - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getRestitutionDirLin - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getRestitutionDirLin - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setRestitutionDirLin - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setRestitutionDirLin - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getDampingDirLin - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getDampingDirLin - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setDampingDirLin - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setDampingDirLin - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getSoftnessDirAng - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getSoftnessDirAng - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setSoftnessDirAng - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setSoftnessDirAng - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getRestitutionDirAng - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getRestitutionDirAng - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setRestitutionDirAng - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setRestitutionDirAng - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getDampingDirAng - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getDampingDirAng - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setDampingDirAng - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setDampingDirAng - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getSoftnessLimLin - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getSoftnessLimLin - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setSoftnessLimLin - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setSoftnessLimLin - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getRestitutionLimLin - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getRestitutionLimLin - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setRestitutionLimLin - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setRestitutionLimLin - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getDampingLimLin - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getDampingLimLin - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setDampingLimLin - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setDampingLimLin - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getSoftnessLimAng - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getSoftnessLimAng - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setSoftnessLimAng - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setSoftnessLimAng - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getRestitutionLimAng - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getRestitutionLimAng - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setRestitutionLimAng - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setRestitutionLimAng - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getDampingLimAng - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getDampingLimAng - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setDampingLimAng - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setDampingLimAng - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getSoftnessOrthoLin - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getSoftnessOrthoLin - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setSoftnessOrthoLin - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setSoftnessOrthoLin - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getRestitutionOrthoLin - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getRestitutionOrthoLin - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setRestitutionOrthoLin - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setRestitutionOrthoLin - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getDampingOrthoLin - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getDampingOrthoLin - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setDampingOrthoLin - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setDampingOrthoLin - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getSoftnessOrthoAng - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getSoftnessOrthoAng - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setSoftnessOrthoAng - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setSoftnessOrthoAng - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getRestitutionOrthoAng - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getRestitutionOrthoAng - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setRestitutionOrthoAng - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setRestitutionOrthoAng - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getDampingOrthoAng - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getDampingOrthoAng - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setDampingOrthoAng - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setDampingOrthoAng - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: isPoweredLinMotor - * Signature: (J)Z - */ -JNIEXPORT jboolean JNICALL Java_com_jme3_bullet_joints_SliderJoint_isPoweredLinMotor - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setPoweredLinMotor - * Signature: (JZ)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setPoweredLinMotor - (JNIEnv *, jobject, jlong, jboolean); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getTargetLinMotorVelocity - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getTargetLinMotorVelocity - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setTargetLinMotorVelocity - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setTargetLinMotorVelocity - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getMaxLinMotorForce - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getMaxLinMotorForce - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setMaxLinMotorForce - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setMaxLinMotorForce - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: isPoweredAngMotor - * Signature: (J)Z - */ -JNIEXPORT jboolean JNICALL Java_com_jme3_bullet_joints_SliderJoint_isPoweredAngMotor - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setPoweredAngMotor - * Signature: (JZ)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setPoweredAngMotor - (JNIEnv *, jobject, jlong, jboolean); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getTargetAngMotorVelocity - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getTargetAngMotorVelocity - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setTargetAngMotorVelocity - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setTargetAngMotorVelocity - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: getMaxAngMotorForce - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_SliderJoint_getMaxAngMotorForce - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: setMaxAngMotorForce - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_SliderJoint_setMaxAngMotorForce - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_SliderJoint - * Method: createJoint - * Signature: (JJLcom/jme3/math/Vector3f;Lcom/jme3/math/Matrix3f;Lcom/jme3/math/Vector3f;Lcom/jme3/math/Matrix3f;Z)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_joints_SliderJoint_createJoint - (JNIEnv *, jobject, jlong, jlong, jobject, jobject, jobject, jobject, jboolean); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_joints_motors_RotationalLimitMotor.h b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_joints_motors_RotationalLimitMotor.h deleted file mode 100644 index b14bf1d73..000000000 --- a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_joints_motors_RotationalLimitMotor.h +++ /dev/null @@ -1,173 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_joints_motors_RotationalLimitMotor */ - -#ifndef _Included_com_jme3_bullet_joints_motors_RotationalLimitMotor -#define _Included_com_jme3_bullet_joints_motors_RotationalLimitMotor -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: getLoLimit - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_getLoLimit - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: setLoLimit - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_setLoLimit - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: getHiLimit - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_getHiLimit - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: setHiLimit - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_setHiLimit - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: getTargetVelocity - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_getTargetVelocity - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: setTargetVelocity - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_setTargetVelocity - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: getMaxMotorForce - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_getMaxMotorForce - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: setMaxMotorForce - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_setMaxMotorForce - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: getMaxLimitForce - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_getMaxLimitForce - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: setMaxLimitForce - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_setMaxLimitForce - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: getDamping - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_getDamping - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: setDamping - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_setDamping - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: getLimitSoftness - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_getLimitSoftness - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: setLimitSoftness - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_setLimitSoftness - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: getERP - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_getERP - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: setERP - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_setERP - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: getBounce - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_getBounce - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: setBounce - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_setBounce - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: isEnableMotor - * Signature: (J)Z - */ -JNIEXPORT jboolean JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_isEnableMotor - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_motors_RotationalLimitMotor - * Method: setEnableMotor - * Signature: (JZ)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_RotationalLimitMotor_setEnableMotor - (JNIEnv *, jobject, jlong, jboolean); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_joints_motors_TranslationalLimitMotor.cpp b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_joints_motors_TranslationalLimitMotor.cpp index ecc6c429b..39db519e7 100644 --- a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_joints_motors_TranslationalLimitMotor.cpp +++ b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_joints_motors_TranslationalLimitMotor.cpp @@ -141,9 +141,9 @@ extern "C" { * Method: getLimitSoftness * Signature: (J)F */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_motors_TranslationalLimitMotor_getLetLimitSoftness + JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_motors_TranslationalLimitMotor_getLimitSoftness (JNIEnv *env, jobject object, jlong motorId) { - btTranslationalLimitMotor* motor = reinterpret_cast(motorId); + btTranslationalLimitMotor* motor = reinterpret_cast (motorId); if (motor == NULL) { jclass newExc = env->FindClass("java/lang/NullPointerException"); env->ThrowNew(newExc, "The native object does not exist."); diff --git a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_joints_motors_TranslationalLimitMotor.h b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_joints_motors_TranslationalLimitMotor.h deleted file mode 100644 index 0ea93e2b1..000000000 --- a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_joints_motors_TranslationalLimitMotor.h +++ /dev/null @@ -1,109 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_joints_motors_TranslationalLimitMotor */ - -#ifndef _Included_com_jme3_bullet_joints_motors_TranslationalLimitMotor -#define _Included_com_jme3_bullet_joints_motors_TranslationalLimitMotor -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jme3_bullet_joints_motors_TranslationalLimitMotor - * Method: getLowerLimit - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_TranslationalLimitMotor_getLowerLimit - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_joints_motors_TranslationalLimitMotor - * Method: setLowerLimit - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_TranslationalLimitMotor_setLowerLimit - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_joints_motors_TranslationalLimitMotor - * Method: getUpperLimit - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_TranslationalLimitMotor_getUpperLimit - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_joints_motors_TranslationalLimitMotor - * Method: setUpperLimit - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_TranslationalLimitMotor_setUpperLimit - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_joints_motors_TranslationalLimitMotor - * Method: getAccumulatedImpulse - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_TranslationalLimitMotor_getAccumulatedImpulse - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_joints_motors_TranslationalLimitMotor - * Method: setAccumulatedImpulse - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_TranslationalLimitMotor_setAccumulatedImpulse - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_joints_motors_TranslationalLimitMotor - * Method: getLimitSoftness - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_motors_TranslationalLimitMotor_getLimitSoftness - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_motors_TranslationalLimitMotor - * Method: setLimitSoftness - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_TranslationalLimitMotor_setLimitSoftness - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_motors_TranslationalLimitMotor - * Method: getDamping - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_motors_TranslationalLimitMotor_getDamping - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_motors_TranslationalLimitMotor - * Method: setDamping - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_TranslationalLimitMotor_setDamping - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_joints_motors_TranslationalLimitMotor - * Method: getRestitution - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_joints_motors_TranslationalLimitMotor_getRestitution - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_joints_motors_TranslationalLimitMotor - * Method: setRestitution - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_joints_motors_TranslationalLimitMotor_setRestitution - (JNIEnv *, jobject, jlong, jfloat); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_objects_PhysicsCharacter.h b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_objects_PhysicsCharacter.h deleted file mode 100644 index 53bad55b2..000000000 --- a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_objects_PhysicsCharacter.h +++ /dev/null @@ -1,331 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_objects_PhysicsCharacter */ - -#ifndef _Included_com_jme3_bullet_objects_PhysicsCharacter -#define _Included_com_jme3_bullet_objects_PhysicsCharacter -#ifdef __cplusplus -extern "C" { -#endif -#undef com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_NONE -#define com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_NONE 0L -#undef com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_01 -#define com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_01 1L -#undef com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_02 -#define com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_02 2L -#undef com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_03 -#define com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_03 4L -#undef com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_04 -#define com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_04 8L -#undef com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_05 -#define com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_05 16L -#undef com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_06 -#define com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_06 32L -#undef com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_07 -#define com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_07 64L -#undef com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_08 -#define com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_08 128L -#undef com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_09 -#define com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_09 256L -#undef com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_10 -#define com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_10 512L -#undef com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_11 -#define com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_11 1024L -#undef com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_12 -#define com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_12 2048L -#undef com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_13 -#define com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_13 4096L -#undef com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_14 -#define com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_14 8192L -#undef com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_15 -#define com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_15 16384L -#undef com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_16 -#define com_jme3_bullet_objects_PhysicsCharacter_COLLISION_GROUP_16 32768L -/* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: createGhostObject - * Signature: ()J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_createGhostObject - (JNIEnv *, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: setCharacterFlags - * Signature: (J)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_setCharacterFlags - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: createCharacterObject - * Signature: (JJF)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_createCharacterObject - (JNIEnv *, jobject, jlong, jlong, jfloat); - -/* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: warp - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_warp - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: setWalkDirection - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_setWalkDirection - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: setUp - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_setUp - (JNIEnv *, jobject , jlong , jobject ); - - -/* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: setAngularVelocity - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_setAngularVelocity - (JNIEnv *, jobject , jlong , jobject ) ; - -/* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: getAngularVelocity - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_getAngularVelocity - (JNIEnv *, jobject , jlong , jobject ); - -/* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: setLinearVelocity - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_setLinearVelocity - (JNIEnv *, jobject , jlong , jobject ); - - -/* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: getLinearVelocity - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_getLinearVelocity - (JNIEnv *, jobject , jlong , jobject ); - - - -/* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: setFallSpeed - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_setFallSpeed - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: setJumpSpeed - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_setJumpSpeed - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: setGravity - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_setGravity - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: getGravity - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_getGravity - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: setLinearDamping - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_setLinearDamping - (JNIEnv *, jobject , jlong ,jfloat ); - - -/* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: getLinearDamping - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_getLinearDamping - (JNIEnv *, jobject , jlong ); - - - -/* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: setAngularDamping - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_setAngularDamping - (JNIEnv *, jobject , jlong ,jfloat ); - - -/* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: getAngularDamping - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_getAngularDamping - (JNIEnv *, jobject , jlong ); - - -/* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: setStepHeight - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_setStepHeight - (JNIEnv *, jobject , jlong ,jfloat ); - -/* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: getStepHeight - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_getStepHeight - (JNIEnv *, jobject , jlong ); - - -/* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: setMaxSlope - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_setMaxSlope - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: getMaxSlope - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_getMaxSlope - (JNIEnv *, jobject, jlong); - - -/* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: setMaxPenetrationDepth - * Signature: (JF)V - */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_setMaxPenetrationDepth - (JNIEnv *, jobject , jlong , jfloat ); - - -/* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: getMaxPenetrationDepth - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_getMaxPenetrationDepth - (JNIEnv *, jobject , jlong ); - -/* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: onGround - * Signature: (J)Z - */ -JNIEXPORT jboolean JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_onGround - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: jump - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_jump - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: applyImpulse - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_applyImpulse - (JNIEnv *, jobject , jlong ,jobject ); - -/* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: getPhysicsLocation - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_getPhysicsLocation - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: setCcdSweptSphereRadius - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_setCcdSweptSphereRadius - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: setCcdMotionThreshold - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_setCcdMotionThreshold - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: getCcdSweptSphereRadius - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_getCcdSweptSphereRadius - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: getCcdMotionThreshold - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_getCcdMotionThreshold - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: getCcdSquareMotionThreshold - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_getCcdSquareMotionThreshold - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsCharacter - * Method: finalizeNativeCharacter - * Signature: (J)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_finalizeNativeCharacter - (JNIEnv *, jobject, jlong); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_objects_PhysicsGhostObject.h b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_objects_PhysicsGhostObject.h deleted file mode 100644 index cf98e5970..000000000 --- a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_objects_PhysicsGhostObject.h +++ /dev/null @@ -1,167 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_objects_PhysicsGhostObject */ - -#ifndef _Included_com_jme3_bullet_objects_PhysicsGhostObject -#define _Included_com_jme3_bullet_objects_PhysicsGhostObject -#ifdef __cplusplus -extern "C" { -#endif -#undef com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_NONE -#define com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_NONE 0L -#undef com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_01 -#define com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_01 1L -#undef com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_02 -#define com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_02 2L -#undef com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_03 -#define com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_03 4L -#undef com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_04 -#define com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_04 8L -#undef com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_05 -#define com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_05 16L -#undef com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_06 -#define com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_06 32L -#undef com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_07 -#define com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_07 64L -#undef com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_08 -#define com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_08 128L -#undef com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_09 -#define com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_09 256L -#undef com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_10 -#define com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_10 512L -#undef com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_11 -#define com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_11 1024L -#undef com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_12 -#define com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_12 2048L -#undef com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_13 -#define com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_13 4096L -#undef com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_14 -#define com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_14 8192L -#undef com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_15 -#define com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_15 16384L -#undef com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_16 -#define com_jme3_bullet_objects_PhysicsGhostObject_COLLISION_GROUP_16 32768L -/* - * Class: com_jme3_bullet_objects_PhysicsGhostObject - * Method: createGhostObject - * Signature: ()J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_objects_PhysicsGhostObject_createGhostObject - (JNIEnv *, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsGhostObject - * Method: setGhostFlags - * Signature: (J)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsGhostObject_setGhostFlags - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsGhostObject - * Method: setPhysicsLocation - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsGhostObject_setPhysicsLocation - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsGhostObject - * Method: setPhysicsRotation - * Signature: (JLcom/jme3/math/Matrix3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsGhostObject_setPhysicsRotation__JLcom_jme3_math_Matrix3f_2 - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsGhostObject - * Method: setPhysicsRotation - * Signature: (JLcom/jme3/math/Quaternion;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsGhostObject_setPhysicsRotation__JLcom_jme3_math_Quaternion_2 - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsGhostObject - * Method: getPhysicsLocation - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsGhostObject_getPhysicsLocation - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsGhostObject - * Method: getPhysicsRotation - * Signature: (JLcom/jme3/math/Quaternion;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsGhostObject_getPhysicsRotation - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsGhostObject - * Method: getPhysicsRotationMatrix - * Signature: (JLcom/jme3/math/Matrix3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsGhostObject_getPhysicsRotationMatrix - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsGhostObject - * Method: getOverlappingObjects - * Signature: (J)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsGhostObject_getOverlappingObjects - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsGhostObject - * Method: getOverlappingCount - * Signature: (J)I - */ -JNIEXPORT jint JNICALL Java_com_jme3_bullet_objects_PhysicsGhostObject_getOverlappingCount - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsGhostObject - * Method: setCcdSweptSphereRadius - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsGhostObject_setCcdSweptSphereRadius - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_objects_PhysicsGhostObject - * Method: setCcdMotionThreshold - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsGhostObject_setCcdMotionThreshold - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_objects_PhysicsGhostObject - * Method: getCcdSweptSphereRadius - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsGhostObject_getCcdSweptSphereRadius - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsGhostObject - * Method: getCcdMotionThreshold - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsGhostObject_getCcdMotionThreshold - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsGhostObject - * Method: getCcdSquareMotionThreshold - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsGhostObject_getCcdSquareMotionThreshold - (JNIEnv *, jobject, jlong); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_objects_PhysicsRigidBody.cpp b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_objects_PhysicsRigidBody.cpp index 465c15620..1d726038f 100644 --- a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_objects_PhysicsRigidBody.cpp +++ b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_objects_PhysicsRigidBody.cpp @@ -795,7 +795,7 @@ extern "C" { env->ThrowNew(newExc, "The native object does not exist."); return; } - body->setSleepingThresholds(value, body->getLinearSleepingThreshold()); + body->setSleepingThresholds(value, body->getAngularSleepingThreshold()); } /* @@ -811,7 +811,7 @@ extern "C" { env->ThrowNew(newExc, "The native object does not exist."); return; } - body->setSleepingThresholds(body->getAngularSleepingThreshold(), value); + body->setSleepingThresholds(body->getLinearSleepingThreshold(), value); } /* diff --git a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_objects_PhysicsRigidBody.h b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_objects_PhysicsRigidBody.h deleted file mode 100644 index 4374fa4f2..000000000 --- a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_objects_PhysicsRigidBody.h +++ /dev/null @@ -1,447 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_objects_PhysicsRigidBody */ - -#ifndef _Included_com_jme3_bullet_objects_PhysicsRigidBody -#define _Included_com_jme3_bullet_objects_PhysicsRigidBody -#ifdef __cplusplus -extern "C" { -#endif -#undef com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_NONE -#define com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_NONE 0L -#undef com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_01 -#define com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_01 1L -#undef com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_02 -#define com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_02 2L -#undef com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_03 -#define com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_03 4L -#undef com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_04 -#define com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_04 8L -#undef com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_05 -#define com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_05 16L -#undef com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_06 -#define com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_06 32L -#undef com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_07 -#define com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_07 64L -#undef com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_08 -#define com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_08 128L -#undef com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_09 -#define com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_09 256L -#undef com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_10 -#define com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_10 512L -#undef com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_11 -#define com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_11 1024L -#undef com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_12 -#define com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_12 2048L -#undef com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_13 -#define com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_13 4096L -#undef com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_14 -#define com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_14 8192L -#undef com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_15 -#define com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_15 16384L -#undef com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_16 -#define com_jme3_bullet_objects_PhysicsRigidBody_COLLISION_GROUP_16 32768L -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: createRigidBody - * Signature: (FJJ)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_createRigidBody - (JNIEnv *, jobject, jfloat, jlong, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: isInWorld - * Signature: (J)Z - */ -JNIEXPORT jboolean JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_isInWorld - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setPhysicsLocation - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setPhysicsLocation - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setPhysicsRotation - * Signature: (JLcom/jme3/math/Matrix3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setPhysicsRotation__JLcom_jme3_math_Matrix3f_2 - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setPhysicsRotation - * Signature: (JLcom/jme3/math/Quaternion;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setPhysicsRotation__JLcom_jme3_math_Quaternion_2 - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: getPhysicsLocation - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getPhysicsLocation - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setInverseInertiaLocal - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setInverseInertiaLocal - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: getInverseInertiaLocal - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getInverseInertiaLocal - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: getPhysicsRotation - * Signature: (JLcom/jme3/math/Quaternion;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getPhysicsRotation - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: getPhysicsRotationMatrix - * Signature: (JLcom/jme3/math/Matrix3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getPhysicsRotationMatrix - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setKinematic - * Signature: (JZ)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setKinematic - (JNIEnv *, jobject, jlong, jboolean); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setCcdSweptSphereRadius - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setCcdSweptSphereRadius - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setCcdMotionThreshold - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setCcdMotionThreshold - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: getCcdSweptSphereRadius - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getCcdSweptSphereRadius - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: getCcdMotionThreshold - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getCcdMotionThreshold - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: getCcdSquareMotionThreshold - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getCcdSquareMotionThreshold - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setStatic - * Signature: (JZ)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setStatic - (JNIEnv *, jobject, jlong, jboolean); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: updateMassProps - * Signature: (JJF)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_updateMassProps - (JNIEnv *, jobject, jlong, jlong, jfloat); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: getGravity - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getGravity - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setGravity - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setGravity - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: getFriction - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getFriction - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setFriction - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setFriction - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setDamping - * Signature: (JFF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setDamping - (JNIEnv *, jobject, jlong, jfloat, jfloat); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setAngularDamping - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setAngularDamping - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: getLinearDamping - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getLinearDamping - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: getAngularDamping - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getAngularDamping - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: getRestitution - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getRestitution - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setRestitution - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setRestitution - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: getAngularVelocity - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getAngularVelocity - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setAngularVelocity - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setAngularVelocity - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: getLinearVelocity - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getLinearVelocity - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setLinearVelocity - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setLinearVelocity - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: applyForce - * Signature: (JLcom/jme3/math/Vector3f;Lcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_applyForce - (JNIEnv *, jobject, jlong, jobject, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: applyCentralForce - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_applyCentralForce - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: applyTorque - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_applyTorque - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: applyImpulse - * Signature: (JLcom/jme3/math/Vector3f;Lcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_applyImpulse - (JNIEnv *, jobject, jlong, jobject, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: applyTorqueImpulse - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_applyTorqueImpulse - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: clearForces - * Signature: (J)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_clearForces - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setCollisionShape - * Signature: (JJ)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setCollisionShape - (JNIEnv *, jobject, jlong, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: activate - * Signature: (J)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_activate - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: isActive - * Signature: (J)Z - */ -JNIEXPORT jboolean JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_isActive - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setSleepingThresholds - * Signature: (JFF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setSleepingThresholds - (JNIEnv *, jobject, jlong, jfloat, jfloat); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setLinearSleepingThreshold - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setLinearSleepingThreshold - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setAngularSleepingThreshold - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setAngularSleepingThreshold - (JNIEnv *, jobject, jlong, jfloat); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: getLinearSleepingThreshold - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getLinearSleepingThreshold - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: getAngularSleepingThreshold - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getAngularSleepingThreshold - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: getAngularFactor - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getAngularFactor - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setAngularFactor - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setAngularFactor - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: getLinearFactor - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getLinearFactor - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setLinearFactor - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setLinearFactor - (JNIEnv *, jobject, jlong, jobject); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_objects_PhysicsVehicle.h b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_objects_PhysicsVehicle.h deleted file mode 100644 index 821e384cc..000000000 --- a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_objects_PhysicsVehicle.h +++ /dev/null @@ -1,143 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_objects_PhysicsVehicle */ - -#ifndef _Included_com_jme3_bullet_objects_PhysicsVehicle -#define _Included_com_jme3_bullet_objects_PhysicsVehicle -#ifdef __cplusplus -extern "C" { -#endif -#undef com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_NONE -#define com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_NONE 0L -#undef com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_01 -#define com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_01 1L -#undef com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_02 -#define com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_02 2L -#undef com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_03 -#define com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_03 4L -#undef com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_04 -#define com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_04 8L -#undef com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_05 -#define com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_05 16L -#undef com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_06 -#define com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_06 32L -#undef com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_07 -#define com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_07 64L -#undef com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_08 -#define com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_08 128L -#undef com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_09 -#define com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_09 256L -#undef com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_10 -#define com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_10 512L -#undef com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_11 -#define com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_11 1024L -#undef com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_12 -#define com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_12 2048L -#undef com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_13 -#define com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_13 4096L -#undef com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_14 -#define com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_14 8192L -#undef com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_15 -#define com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_15 16384L -#undef com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_16 -#define com_jme3_bullet_objects_PhysicsVehicle_COLLISION_GROUP_16 32768L -/* - * Class: com_jme3_bullet_objects_PhysicsVehicle - * Method: updateWheelTransform - * Signature: (JIZ)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsVehicle_updateWheelTransform - (JNIEnv *, jobject, jlong, jint, jboolean); - -/* - * Class: com_jme3_bullet_objects_PhysicsVehicle - * Method: createVehicleRaycaster - * Signature: (JJ)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_objects_PhysicsVehicle_createVehicleRaycaster - (JNIEnv *, jobject, jlong, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsVehicle - * Method: createRaycastVehicle - * Signature: (JJ)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_objects_PhysicsVehicle_createRaycastVehicle - (JNIEnv *, jobject, jlong, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsVehicle - * Method: setCoordinateSystem - * Signature: (JIII)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsVehicle_setCoordinateSystem - (JNIEnv *, jobject, jlong, jint, jint, jint); - -/* - * Class: com_jme3_bullet_objects_PhysicsVehicle - * Method: addWheel - * Signature: (JLcom/jme3/math/Vector3f;Lcom/jme3/math/Vector3f;Lcom/jme3/math/Vector3f;FFLcom/jme3/bullet/objects/infos/VehicleTuning;Z)I - */ -JNIEXPORT jint JNICALL Java_com_jme3_bullet_objects_PhysicsVehicle_addWheel - (JNIEnv *, jobject, jlong, jobject, jobject, jobject, jfloat, jfloat, jobject, jboolean); - -/* - * Class: com_jme3_bullet_objects_PhysicsVehicle - * Method: resetSuspension - * Signature: (J)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsVehicle_resetSuspension - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsVehicle - * Method: applyEngineForce - * Signature: (JIF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsVehicle_applyEngineForce - (JNIEnv *, jobject, jlong, jint, jfloat); - -/* - * Class: com_jme3_bullet_objects_PhysicsVehicle - * Method: steer - * Signature: (JIF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsVehicle_steer - (JNIEnv *, jobject, jlong, jint, jfloat); - -/* - * Class: com_jme3_bullet_objects_PhysicsVehicle - * Method: brake - * Signature: (JIF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsVehicle_brake - (JNIEnv *, jobject, jlong, jint, jfloat); - -/* - * Class: com_jme3_bullet_objects_PhysicsVehicle - * Method: getCurrentVehicleSpeedKmHour - * Signature: (J)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsVehicle_getCurrentVehicleSpeedKmHour - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jme3_bullet_objects_PhysicsVehicle - * Method: getForwardVector - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsVehicle_getForwardVector - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_PhysicsVehicle - * Method: finalizeNative - * Signature: (JJ)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsVehicle_finalizeNative - (JNIEnv *, jobject, jlong, jlong); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_objects_VehicleWheel.h b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_objects_VehicleWheel.h deleted file mode 100644 index f4ab208ae..000000000 --- a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_objects_VehicleWheel.h +++ /dev/null @@ -1,69 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_objects_VehicleWheel */ - -#ifndef _Included_com_jme3_bullet_objects_VehicleWheel -#define _Included_com_jme3_bullet_objects_VehicleWheel -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jme3_bullet_objects_VehicleWheel - * Method: getWheelLocation - * Signature: (JILcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_VehicleWheel_getWheelLocation - (JNIEnv *, jobject, jlong, jint, jobject); - -/* - * Class: com_jme3_bullet_objects_VehicleWheel - * Method: getWheelRotation - * Signature: (JILcom/jme3/math/Matrix3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_VehicleWheel_getWheelRotation - (JNIEnv *, jobject, jlong, jint, jobject); - -/* - * Class: com_jme3_bullet_objects_VehicleWheel - * Method: applyInfo - * Signature: (JIFFFFFFFFZF)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_VehicleWheel_applyInfo - (JNIEnv *, jobject, jlong, jint, jfloat, jfloat, jfloat, jfloat, jfloat, jfloat, jfloat, jfloat, jboolean, jfloat); - -/* - * Class: com_jme3_bullet_objects_VehicleWheel - * Method: getCollisionLocation - * Signature: (JILcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_VehicleWheel_getCollisionLocation - (JNIEnv *, jobject, jlong, jint, jobject); - -/* - * Class: com_jme3_bullet_objects_VehicleWheel - * Method: getCollisionNormal - * Signature: (JILcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_VehicleWheel_getCollisionNormal - (JNIEnv *, jobject, jlong, jint, jobject); - -/* - * Class: com_jme3_bullet_objects_VehicleWheel - * Method: getSkidInfo - * Signature: (JI)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_VehicleWheel_getSkidInfo - (JNIEnv *, jobject, jlong, jint); - -/* - * Class: com_jme3_bullet_objects_VehicleWheel - * Method: getDeltaRotation - * Signature: (JI)F - */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_VehicleWheel_getDeltaRotation - (JNIEnv *, jobject, jlong, jint); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_objects_infos_RigidBodyMotionState.h b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_objects_infos_RigidBodyMotionState.h deleted file mode 100644 index 7939038d2..000000000 --- a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_objects_infos_RigidBodyMotionState.h +++ /dev/null @@ -1,61 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_objects_infos_RigidBodyMotionState */ - -#ifndef _Included_com_jme3_bullet_objects_infos_RigidBodyMotionState -#define _Included_com_jme3_bullet_objects_infos_RigidBodyMotionState -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jme3_bullet_objects_infos_RigidBodyMotionState - * Method: createMotionState - * Signature: ()J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_objects_infos_RigidBodyMotionState_createMotionState - (JNIEnv *, jobject); - -/* - * Class: com_jme3_bullet_objects_infos_RigidBodyMotionState - * Method: applyTransform - * Signature: (JLcom/jme3/math/Vector3f;Lcom/jme3/math/Quaternion;)Z - */ -JNIEXPORT jboolean JNICALL Java_com_jme3_bullet_objects_infos_RigidBodyMotionState_applyTransform - (JNIEnv *, jobject, jlong, jobject, jobject); - -/* - * Class: com_jme3_bullet_objects_infos_RigidBodyMotionState - * Method: getWorldLocation - * Signature: (JLcom/jme3/math/Vector3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_infos_RigidBodyMotionState_getWorldLocation - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_infos_RigidBodyMotionState - * Method: getWorldRotation - * Signature: (JLcom/jme3/math/Matrix3f;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_infos_RigidBodyMotionState_getWorldRotation - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_infos_RigidBodyMotionState - * Method: getWorldRotationQuat - * Signature: (JLcom/jme3/math/Quaternion;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_infos_RigidBodyMotionState_getWorldRotationQuat - (JNIEnv *, jobject, jlong, jobject); - -/* - * Class: com_jme3_bullet_objects_infos_RigidBodyMotionState - * Method: finalizeNative - * Signature: (J)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_infos_RigidBodyMotionState_finalizeNative - (JNIEnv *, jobject, jlong); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_util_DebugShapeFactory.h b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_util_DebugShapeFactory.h deleted file mode 100644 index 757696fcc..000000000 --- a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_util_DebugShapeFactory.h +++ /dev/null @@ -1,21 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_util_DebugShapeFactory */ - -#ifndef _Included_com_jme3_bullet_util_DebugShapeFactory -#define _Included_com_jme3_bullet_util_DebugShapeFactory -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jme3_bullet_util_DebugShapeFactory - * Method: getVertices - * Signature: (JLcom/jme3/bullet/util/DebugMeshCallback;)V - */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_util_DebugShapeFactory_getVertices - (JNIEnv *, jclass, jlong, jobject); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_util_NativeMeshUtil.h b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_util_NativeMeshUtil.h deleted file mode 100644 index 0be9f4d5a..000000000 --- a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_util_NativeMeshUtil.h +++ /dev/null @@ -1,21 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jme3_bullet_util_NativeMeshUtil */ - -#ifndef _Included_com_jme3_bullet_util_NativeMeshUtil -#define _Included_com_jme3_bullet_util_NativeMeshUtil -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jme3_bullet_util_NativeMeshUtil - * Method: createTriangleIndexVertexArray - * Signature: (Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;IIII)J - */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_util_NativeMeshUtil_createTriangleIndexVertexArray - (JNIEnv *, jclass, jobject, jobject, jint, jint, jint, jint); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/jme3-bullet/src/common/java/com/jme3/bullet/BulletAppState.java b/jme3-bullet/src/common/java/com/jme3/bullet/BulletAppState.java index ae278c871..9fb5b85f1 100644 --- a/jme3-bullet/src/common/java/com/jme3/bullet/BulletAppState.java +++ b/jme3-bullet/src/common/java/com/jme3/bullet/BulletAppState.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -43,66 +43,136 @@ import java.util.logging.Level; import java.util.logging.Logger; /** - * BulletAppState allows using bullet physics in an Application. + * An app state to manage a single Bullet physics space. + *

+ * This class is shared between JBullet and Native Bullet. * * @author normenhansen */ public class BulletAppState implements AppState, PhysicsTickListener { + /** + * true if-and-only-if the physics simulation is running (started but not + * yet stopped) + */ protected boolean initialized = false; protected Application app; + /** + * manager that manages this state, set during attach + */ protected AppStateManager stateManager; + /** + * executor service for physics tasks, or null if parallel simulation is not + * running + */ protected ScheduledThreadPoolExecutor executor; + /** + * physics space managed by this state, or null if no simulation running + */ protected PhysicsSpace pSpace; + /** + * threading mode to use (not null) + */ protected ThreadingType threadingType = ThreadingType.SEQUENTIAL; + /** + * broadphase collision-detection algorithm for the physics space to use + * (not null) + */ protected BroadphaseType broadphaseType = BroadphaseType.DBVT; + /** + * minimum coordinate values for the physics space when using AXIS_SWEEP + * broadphase algorithms (not null) + */ protected Vector3f worldMin = new Vector3f(-10000f, -10000f, -10000f); + /** + * maximum coordinate values for the physics space when using AXIS_SWEEP + * broadphase algorithms (not null) + */ protected Vector3f worldMax = new Vector3f(10000f, 10000f, 10000f); + /** + * simulation speed multiplier (default=1, paused=0) + */ protected float speed = 1; + /** + * true if-and-only-if this state is enabled + */ protected boolean active = true; + /** + * true if-and-only-if debug visualization is enabled + */ protected boolean debugEnabled = false; + /** + * app state to manage the debug visualization, or null if none + */ protected BulletDebugAppState debugAppState; + /** + * time interval between frames (in seconds) from the most recent update + */ protected float tpf; + /** + * current physics task, or null if none + */ protected Future physicsFuture; /** - * Creates a new BulletAppState running a PhysicsSpace for physics - * simulation, use getStateManager().addState(bulletAppState) to enable - * physics for an Application. + * Instantiate an app state to manage a new PhysicsSpace with DBVT collision + * detection. + *

+ * Use getStateManager().addState(bulletAppState) to start physics. */ public BulletAppState() { } /** - * Creates a new BulletAppState running a PhysicsSpace for physics - * simulation, use getStateManager().addState(bulletAppState) to enable - * physics for an Application. + * Instantiate an app state to manage a new PhysicsSpace. + *

+ * Use getStateManager().addState(bulletAppState) to start physics. * - * @param broadphaseType The type of broadphase collision detection, - * BroadphaseType.DVBT is the default + * @param broadphaseType which broadphase collision-detection algorithm to + * use (not null) */ public BulletAppState(BroadphaseType broadphaseType) { this(new Vector3f(-10000f, -10000f, -10000f), new Vector3f(10000f, 10000f, 10000f), broadphaseType); } /** - * Creates a new BulletAppState running a PhysicsSpace for physics - * simulation, use getStateManager().addState(bulletAppState) to enable - * physics for an Application. An AxisSweep broadphase is used. + * Instantiate an app state to manage a new PhysicsSpace with AXIS_SWEEP_3 + * collision detection. + *

+ * Use getStateManager().addState(bulletAppState) to start physics. * - * @param worldMin The minimum world extent - * @param worldMax The maximum world extent + * @param worldMin the desired minimum coordinate values (not null, + * unaffected, default=-10k,-10k,-10k) + * @param worldMax the desired maximum coordinate values (not null, + * unaffected, default=10k,10k,10k) */ public BulletAppState(Vector3f worldMin, Vector3f worldMax) { this(worldMin, worldMax, BroadphaseType.AXIS_SWEEP_3); } + /** + * Instantiate an app state to manage a new PhysicsSpace. + *

+ * Use getStateManager().addState(bulletAppState) to enable physics. + * + * @param worldMin the desired minimum coordinate values (not null, + * unaffected, default=-10k,-10k,-10k) + * @param worldMax the desired maximum coordinate values (not null, + * unaffected, default=10k,10k,10k) + * @param broadphaseType which broadphase collision-detection algorithm to + * use (not null) + */ public BulletAppState(Vector3f worldMin, Vector3f worldMax, BroadphaseType broadphaseType) { this.worldMin.set(worldMin); this.worldMax.set(worldMax); this.broadphaseType = broadphaseType; } + /** + * Allocate the physics space and start physics for ThreadingType.PARALLEL. + * + * @return true if successful, otherwise false + */ private boolean startPhysicsOnExecutor() { if (executor != null) { executor.shutdown(); @@ -145,28 +215,49 @@ public class BulletAppState implements AppState, PhysicsTickListener { } }; + /** + * Access the PhysicsSpace managed by this state. Normally there is none + * until the state is attached. + * + * @return the pre-existing instance, or null if no simulation running + */ public PhysicsSpace getPhysicsSpace() { return pSpace; } /** - * The physics system is started automatically on attaching, if you want to - * start it before for some reason, you can use this method. + * Allocate a physics space and start physics. + *

+ * Physics starts automatically after the state is attached. To start it + * sooner, invoke this method. */ public void startPhysics() { if (initialized) { return; } - //start physics thread(pool) - if (threadingType == ThreadingType.PARALLEL) { - startPhysicsOnExecutor(); - } else { - pSpace = new PhysicsSpace(worldMin, worldMax, broadphaseType); + + switch (threadingType) { + case PARALLEL: + boolean success = startPhysicsOnExecutor(); + assert success; + assert pSpace != null; + break; + + case SEQUENTIAL: + pSpace = new PhysicsSpace(worldMin, worldMax, broadphaseType); + pSpace.addTickListener(this); + break; + + default: + throw new IllegalStateException(threadingType.toString()); } - pSpace.addTickListener(this); + initialized = true; } + /** + * Stop physics after this state is detached. + */ public void stopPhysics() { if(!initialized){ return; @@ -180,32 +271,72 @@ public class BulletAppState implements AppState, PhysicsTickListener { initialized = false; } + /** + * Initialize this state prior to its 1st update. Should be invoked only by + * a subclass or by the AppStateManager. + * + * @param stateManager the manager for this state (not null) + * @param app the application which owns this state (not null) + */ public void initialize(AppStateManager stateManager, Application app) { this.app = app; this.stateManager = stateManager; startPhysics(); } + /** + * Test whether the physics simulation is running (started but not yet + * stopped). + * + * @return true if running, otherwise false + */ public boolean isInitialized() { return initialized; } + /** + * Enable or disable this state. + * + * @param enabled true → enable, false → disable + */ public void setEnabled(boolean enabled) { this.active = enabled; } + /** + * Test whether this state is enabled. + * + * @return true if enabled, otherwise false + */ public boolean isEnabled() { return active; } + /** + * Alter whether debug visualization is enabled. + * + * @param debugEnabled true → enable, false → disable + */ public void setDebugEnabled(boolean debugEnabled) { this.debugEnabled = debugEnabled; } + + /** + * Test whether debug visualization is enabled. + * + * @return true if enabled, otherwise false + */ public boolean isDebugEnabled() { return debugEnabled; } + /** + * Transition this state from detached to initializing. Should be invoked + * only by a subclass or by the AppStateManager. + * + * @param stateManager (not null) + */ public void stateAttached(AppStateManager stateManager) { if (!initialized) { startPhysics(); @@ -219,9 +350,22 @@ public class BulletAppState implements AppState, PhysicsTickListener { } } + /** + * Transition this state from running to terminating. Should be invoked only + * by a subclass or by the AppStateManager. + * + * @param stateManager (not null) + */ public void stateDetached(AppStateManager stateManager) { } + /** + * Update this state prior to rendering. Should be invoked only by a + * subclass or by the AppStateManager. Invoked once per frame, provided the + * state is attached and enabled. + * + * @param tpf the time interval between frames (in seconds, ≥0) + */ public void update(float tpf) { if (debugEnabled && debugAppState == null && pSpace != null) { debugAppState = new BulletDebugAppState(pSpace); @@ -237,6 +381,13 @@ public class BulletAppState implements AppState, PhysicsTickListener { this.tpf = tpf; } + /** + * Render this state. Should be invoked only by a subclass or by the + * AppStateManager. Invoked once per frame, provided the state is attached + * and enabled. + * + * @param rm the render manager (not null) + */ public void render(RenderManager rm) { if (!active) { return; @@ -249,6 +400,11 @@ public class BulletAppState implements AppState, PhysicsTickListener { } } + /** + * Update this state after all rendering commands are flushed. Should be + * invoked only by a subclass or by the AppStateManager. Invoked once per + * frame, provided the state is attached and enabled. + */ public void postRender() { if (physicsFuture != null) { try { @@ -262,6 +418,12 @@ public class BulletAppState implements AppState, PhysicsTickListener { } } + /** + * Transition this state from terminating to detached. Should be invoked + * only by a subclass or by the AppStateManager. Invoked once for each time + * {@link #initialize(com.jme3.app.state.AppStateManager, com.jme3.app.Application)} + * is invoked. + */ public void cleanup() { if (debugAppState != null) { stateManager.detach(debugAppState); @@ -271,67 +433,106 @@ public class BulletAppState implements AppState, PhysicsTickListener { } /** - * @return the threadingType + * Read which type of threading this app state uses. + * + * @return the threadingType (not null) */ public ThreadingType getThreadingType() { return threadingType; } /** - * Use before attaching state + * Alter which type of threading this app state uses. Not allowed after + * attaching the app state. * - * @param threadingType the threadingType to set + * @param threadingType the desired type (not null, default=SEQUENTIAL) */ public void setThreadingType(ThreadingType threadingType) { this.threadingType = threadingType; } /** - * Use before attaching state + * Alter the broadphase type the physics space will use. Not allowed after + * attaching the app state. + * + * @param broadphaseType an enum value (not null, default=DBVT) */ public void setBroadphaseType(BroadphaseType broadphaseType) { this.broadphaseType = broadphaseType; } /** - * Use before attaching state + * Alter the coordinate range. Not allowed after attaching the app state. + * + * @param worldMin the desired minimum coordinate values when using + * AXIS_SWEEP broadphase algorithms (not null, alias created, + * default=-10k,-10k,-10k) */ public void setWorldMin(Vector3f worldMin) { this.worldMin = worldMin; } /** - * Use before attaching state + * Alter the coordinate range. Not allowed after attaching the app state. + * + * @param worldMax the desired maximum coordinate values when using + * AXIS_SWEEP broadphase algorithms (not null, alias created, + * default=10k,10k,10k) */ public void setWorldMax(Vector3f worldMax) { this.worldMax = worldMax; } + /** + * Read the simulation speed. + * + * @return speed (≥0, default=1) + */ public float getSpeed() { return speed; } + /** + * Alter the simulation speed. + * + * @param speed the desired speed (≥0, default=1) + */ public void setSpeed(float speed) { this.speed = speed; } - + /** + * Callback from Bullet, invoked just before the physics is stepped. A good + * time to clear/apply forces. + * + * @param space the space that is about to be stepped (not null) + * @param f the time per physics step (in seconds, ≥0) + */ public void prePhysicsTick(PhysicsSpace space, float f) { } + /** + * Callback from Bullet, invoked just after the physics is stepped. A good + * time to clear/apply forces. + * + * @param space the space that is about to be stepped (not null) + * @param f the time per physics step (in seconds, ≥0) + */ public void physicsTick(PhysicsSpace space, float f) { } + /** + * Enumerate threading modes. + */ public enum ThreadingType { /** - * Default mode; user update, physics update and rendering happen - * sequentially (single threaded) + * Default mode: user update, physics update, and rendering happen + * sequentially. (single threaded) */ SEQUENTIAL, /** - * Parallel threaded mode; physics update and rendering are executed in - * parallel, update order is kept.
Multiple BulletAppStates will - * execute in parallel in this mode. + * Parallel threaded mode: physics update and rendering are executed in + * parallel, update order is maintained. */ PARALLEL, } diff --git a/jme3-bullet/src/common/java/com/jme3/bullet/PhysicsTickListener.java b/jme3-bullet/src/common/java/com/jme3/bullet/PhysicsTickListener.java index 0a52a5119..7bbd704aa 100644 --- a/jme3-bullet/src/common/java/com/jme3/bullet/PhysicsTickListener.java +++ b/jme3-bullet/src/common/java/com/jme3/bullet/PhysicsTickListener.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -32,22 +32,29 @@ package com.jme3.bullet; /** - * Implement this interface to be called from the physics thread on a physics update. + * Callback interface from the physics thread, used to clear/apply forces. + *

+ * This interface is shared between JBullet and Native Bullet. + * * @author normenhansen */ public interface PhysicsTickListener { /** - * Called before the physics is actually stepped, use to apply forces etc. - * @param space the physics space - * @param tpf the time per frame in seconds + * Callback from Bullet, invoked just before the physics is stepped. A good + * time to clear/apply forces. + * + * @param space the space that is about to be stepped (not null) + * @param tpf the time per physics step (in seconds, ≥0) */ public void prePhysicsTick(PhysicsSpace space, float tpf); /** - * Called after the physics has been stepped, use to check for forces etc. - * @param space the physics space - * @param tpf the time per frame in seconds + * Callback from Bullet, invoked just after the physics has been stepped, + * use to check for forces etc. + * + * @param space the space that was just stepped (not null) + * @param tpf the time per physics step (in seconds, ≥0) */ public void physicsTick(PhysicsSpace space, float tpf); diff --git a/jme3-bullet/src/common/java/com/jme3/bullet/collision/PhysicsCollisionGroupListener.java b/jme3-bullet/src/common/java/com/jme3/bullet/collision/PhysicsCollisionGroupListener.java index e50324116..4a7a0432d 100644 --- a/jme3-bullet/src/common/java/com/jme3/bullet/collision/PhysicsCollisionGroupListener.java +++ b/jme3-bullet/src/common/java/com/jme3/bullet/collision/PhysicsCollisionGroupListener.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -32,18 +32,25 @@ package com.jme3.bullet.collision; /** + * Interface to receive notifications whenever an object in a particular + * collision group is about to collide. + *

+ * This interface is shared between JBullet and Native Bullet. * * @author normenhansen */ public interface PhysicsCollisionGroupListener { /** - * Called when two physics objects of the registered group are about to collide, called from physics thread.
- * This is only called when the collision will happen based on the collisionGroup and collideWithGroups - * settings in the PhysicsCollisionObject. That is the case when one of the partys has the - * collisionGroup of the other in its collideWithGroups set.
- * @param nodeA CollisionObject #1 - * @param nodeB CollisionObject #2 + * Invoked when two physics objects of the registered group are about to + * collide. invoked on the physics thread.
+ * This is only invoked when the collision will happen based on the + * collisionGroup and collideWithGroups settings in the + * PhysicsCollisionObject. That is the case when one of the parties + * has the collisionGroup of the other in its collideWithGroups set. + * + * @param nodeA collision object #1 + * @param nodeB collision object #2 * @return true if the collision should happen, false otherwise */ public boolean collide(PhysicsCollisionObject nodeA, PhysicsCollisionObject nodeB); diff --git a/jme3-bullet/src/common/java/com/jme3/bullet/collision/PhysicsCollisionListener.java b/jme3-bullet/src/common/java/com/jme3/bullet/collision/PhysicsCollisionListener.java index b49e3627f..8bcaf4e22 100644 --- a/jme3-bullet/src/common/java/com/jme3/bullet/collision/PhysicsCollisionListener.java +++ b/jme3-bullet/src/common/java/com/jme3/bullet/collision/PhysicsCollisionListener.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -32,16 +32,24 @@ package com.jme3.bullet.collision; /** - * Interface for Objects that want to be informed about collision events in the physics space + * Interface to receive notifications whenever an object in a particular physics + * space collides. + *

+ * This interface is shared between JBullet and Native Bullet. + * * @author normenhansen */ public interface PhysicsCollisionListener { /** - * Called when a collision happened in the PhysicsSpace, called from render thread. - * - * Do not store the event object as it will be cleared after the method has finished. - * @param event the CollisionEvent + * Invoked when a collision happened in the PhysicsSpace. Invoked on the + * render thread. + *

+ * Do not retain the event object, as it will be reused after the + * collision() method returns. Copy any data you need during the collide() + * method. + * + * @param event the event that occurred (not null, reusable) */ public void collision(PhysicsCollisionEvent event); diff --git a/jme3-bullet/src/common/java/com/jme3/bullet/collision/RagdollCollisionListener.java b/jme3-bullet/src/common/java/com/jme3/bullet/collision/RagdollCollisionListener.java index cb00aeff3..84e50cdae 100644 --- a/jme3-bullet/src/common/java/com/jme3/bullet/collision/RagdollCollisionListener.java +++ b/jme3-bullet/src/common/java/com/jme3/bullet/collision/RagdollCollisionListener.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -34,11 +34,22 @@ package com.jme3.bullet.collision; import com.jme3.animation.Bone; /** + * Interface to receive notifications whenever a KinematicRagdollControl + * collides with another physics object. + *

+ * This interface is shared between JBullet and Native Bullet. * * @author Nehon */ public interface RagdollCollisionListener { + /** + * Invoked when a collision involving a KinematicRagdollControl occurs. + * + * @param bone the ragdoll bone that collided (not null) + * @param object the collision object that collided with the bone (not null) + * @param event other event details (not null) + */ public void collide(Bone bone, PhysicsCollisionObject object, PhysicsCollisionEvent event); } diff --git a/jme3-bullet/src/common/java/com/jme3/bullet/collision/shapes/infos/ChildCollisionShape.java b/jme3-bullet/src/common/java/com/jme3/bullet/collision/shapes/infos/ChildCollisionShape.java index ac7196258..1ca8bc37c 100644 --- a/jme3-bullet/src/common/java/com/jme3/bullet/collision/shapes/infos/ChildCollisionShape.java +++ b/jme3-bullet/src/common/java/com/jme3/bullet/collision/shapes/infos/ChildCollisionShape.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -39,24 +39,56 @@ import com.jme3.math.Vector3f; import java.io.IOException; /** + * An element of a CompoundCollisionShape, consisting of a (non-compound) child + * shape, offset and rotated with respect to its parent. + *

+ * This class is shared between JBullet and Native Bullet. * * @author normenhansen */ public class ChildCollisionShape implements Savable { + /** + * translation relative to parent shape (not null) + */ public Vector3f location; + /** + * rotation relative to parent shape (not null) + */ public Matrix3f rotation; + /** + * base shape (not null, not a compound shape) + */ public CollisionShape shape; + /** + * No-argument constructor needed by SavableClassUtil. Do not invoke + * directly! + */ public ChildCollisionShape() { } + /** + * Instantiate a child shape for use in a compound shape. + * + * @param location translation relative to the parent (not null, alias + * created) + * @param rotation rotation relative to the parent (not null, alias created) + * @param shape the base shape (not null, not a compound shape, alias + * created) + */ public ChildCollisionShape(Vector3f location, Matrix3f rotation, CollisionShape shape) { this.location = location; this.rotation = rotation; this.shape = shape; } + /** + * Serialize this shape, for example when saving to a J3O file. + * + * @param ex exporter (not null) + * @throws IOException from exporter + */ public void write(JmeExporter ex) throws IOException { OutputCapsule capsule = ex.getCapsule(this); capsule.write(location, "location", new Vector3f()); @@ -64,6 +96,12 @@ public class ChildCollisionShape implements Savable { capsule.write(shape, "shape", new BoxCollisionShape(new Vector3f(1, 1, 1))); } + /** + * De-serialize this shape, for example when loading from a J3O file. + * + * @param im importer (not null) + * @throws IOException from importer + */ public void read(JmeImporter im) throws IOException { InputCapsule capsule = im.getCapsule(this); location = (Vector3f) capsule.readSavable("location", new Vector3f()); diff --git a/jme3-bullet/src/common/java/com/jme3/bullet/control/AbstractPhysicsControl.java b/jme3-bullet/src/common/java/com/jme3/bullet/control/AbstractPhysicsControl.java index d4f3658c0..f858d0e00 100644 --- a/jme3-bullet/src/common/java/com/jme3/bullet/control/AbstractPhysicsControl.java +++ b/jme3-bullet/src/common/java/com/jme3/bullet/control/AbstractPhysicsControl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -41,87 +41,119 @@ import com.jme3.math.Vector3f; import com.jme3.renderer.RenderManager; import com.jme3.renderer.ViewPort; import com.jme3.scene.Spatial; +import com.jme3.scene.control.Control; import com.jme3.util.clone.Cloner; import com.jme3.util.clone.JmeCloneable; import java.io.IOException; /** - * AbstractPhysicsControl manages the lifecycle of a physics object that is - * attached to a spatial in the SceneGraph. + * Manage the life cycle of a physics object linked to a spatial in a scene + * graph. + *

+ * This class is shared between JBullet and Native Bullet. * * @author normenhansen */ public abstract class AbstractPhysicsControl implements PhysicsControl, JmeCloneable { + /** + * temporary storage during calculations + */ private final Quaternion tmp_inverseWorldRotation = new Quaternion(); + /** + * spatial to which this control is added, or null if none + */ protected Spatial spatial; + /** + * true→control is enabled, false→control is disabled + */ protected boolean enabled = true; + /** + * true→body is added to the physics space, false→not added + */ protected boolean added = false; + /** + * space to which the physics object is (or would be) added + */ protected PhysicsSpace space = null; + /** + * true → physics coordinates match local transform, false → + * physics coordinates match world transform + */ protected boolean applyLocal = false; /** - * Called when the control is added to a new spatial, create any - * spatial-dependent data here. + * Create spatial-dependent data. Invoked when this control is added to a + * spatial. * - * @param spat The new spatial, guaranteed not to be null + * @param spat the controlled spatial (not null) */ protected abstract void createSpatialData(Spatial spat); /** - * Called when the control is removed from a spatial, remove any - * spatial-dependent data here. + * Destroy spatial-dependent data. Invoked when this control is removed from + * a spatial. * - * @param spat The old spatial, guaranteed not to be null + * @param spat the previously controlled spatial (not null) */ protected abstract void removeSpatialData(Spatial spat); /** - * Called when the physics object is supposed to move to the spatial - * position. + * Translate the physics object to the specified location. * - * @param vec + * @param vec desired location (not null, unaffected) */ protected abstract void setPhysicsLocation(Vector3f vec); /** - * Called when the physics object is supposed to move to the spatial - * rotation. + * Rotate the physics object to the specified orientation. * - * @param quat + * @param quat desired orientation (not null, unaffected) */ protected abstract void setPhysicsRotation(Quaternion quat); /** - * Called when the physics object is supposed to add all objects it needs to - * manage to the physics space. + * Add all managed physics objects to the specified space. * - * @param space + * @param space which physics space to add to (not null) */ protected abstract void addPhysics(PhysicsSpace space); /** - * Called when the physics object is supposed to remove all objects added to - * the physics space. + * Remove all managed physics objects from the specified space. * - * @param space + * @param space which physics space to remove from (not null) */ protected abstract void removePhysics(PhysicsSpace space); + /** + * Test whether physics-space coordinates should match the spatial's local + * coordinates. + * + * @return true if matching local coordinates, false if matching world + * coordinates + */ public boolean isApplyPhysicsLocal() { return applyLocal; } /** - * When set to true, the physics coordinates will be applied to the local - * translation of the Spatial + * Alter whether physics-space coordinates should match the spatial's local + * coordinates. * - * @param applyPhysicsLocal + * @param applyPhysicsLocal true→match local coordinates, + * false→match world coordinates (default=false) */ public void setApplyPhysicsLocal(boolean applyPhysicsLocal) { applyLocal = applyPhysicsLocal; } + /** + * Access whichever spatial translation corresponds to the physics location. + * + * @return the pre-existing location vector (in physics-space coordinates, + * not null) + */ protected Vector3f getSpatialTranslation() { if (applyLocal) { return spatial.getLocalTranslation(); @@ -129,6 +161,12 @@ public abstract class AbstractPhysicsControl implements PhysicsControl, JmeClone return spatial.getWorldTranslation(); } + /** + * Access whichever spatial rotation corresponds to the physics rotation. + * + * @return the pre-existing quaternion (in physics-space coordinates, not + * null) + */ protected Quaternion getSpatialRotation() { if (applyLocal) { return spatial.getLocalRotation(); @@ -137,10 +175,12 @@ public abstract class AbstractPhysicsControl implements PhysicsControl, JmeClone } /** - * Applies a physics transform to the spatial + * Apply a physics transform to the spatial. * - * @param worldLocation - * @param worldRotation + * @param worldLocation location vector (in physics-space coordinates, not + * null, unaffected) + * @param worldRotation orientation (in physics-space coordinates, not null, + * unaffected) */ protected void applyPhysicsTransform(Vector3f worldLocation, Quaternion worldRotation) { if (enabled && spatial != null) { @@ -162,13 +202,35 @@ public abstract class AbstractPhysicsControl implements PhysicsControl, JmeClone } } - - @Override + + @Deprecated + @Override + public Control cloneForSpatial(Spatial spatial) { + throw new UnsupportedOperationException(); + } + + /** + * Callback from {@link com.jme3.util.clone.Cloner} to convert this + * shallow-cloned control into a deep-cloned one, using the specified cloner + * and original to resolve copied fields. + * + * @param cloner the cloner that's cloning this control (not null) + * @param original the control from which this control was shallow-cloned + * (unused) + */ + @Override public void cloneFields( Cloner cloner, Object original ) { this.spatial = cloner.clone(spatial); createSpatialData(this.spatial); } + /** + * Alter which spatial is controlled. Invoked when the control is added to + * or removed from a spatial. Should be invoked only by a subclass or from + * Spatial. Do not invoke directly from user code. + * + * @param spatial the spatial to control (or null) + */ public void setSpatial(Spatial spatial) { if (this.spatial != null && this.spatial != spatial) { removeSpatialData(this.spatial); @@ -184,6 +246,15 @@ public abstract class AbstractPhysicsControl implements PhysicsControl, JmeClone setPhysicsRotation(getSpatialRotation()); } + /** + * Enable or disable this control. + *

+ * When the control is disabled, the physics object is removed from physics + * space. When the control is enabled again, the physics object is moved to + * the spatial's location and then added to the physics space. + * + * @param enabled true→enable the control, false→disable it + */ public void setEnabled(boolean enabled) { this.enabled = enabled; if (space != null) { @@ -201,6 +272,11 @@ public abstract class AbstractPhysicsControl implements PhysicsControl, JmeClone } } + /** + * Test whether this control is enabled. + * + * @return true if enabled, otherwise false + */ public boolean isEnabled() { return enabled; } @@ -211,28 +287,48 @@ public abstract class AbstractPhysicsControl implements PhysicsControl, JmeClone public void render(RenderManager rm, ViewPort vp) { } - public void setPhysicsSpace(PhysicsSpace space) { - if (space == null) { - if (this.space != null) { - removePhysics(this.space); - added = false; - } - } else { - if (this.space == space) { - return; - } else if (this.space != null) { - removePhysics(this.space); - } - addPhysics(space); + /** + * If enabled, add this control's physics object to the specified physics + * space. If not enabled, alter where the object would be added. The object + * is removed from any other space it's in. + * + * @param newSpace where to add, or null to simply remove + */ + @Override + public void setPhysicsSpace(PhysicsSpace newSpace) { + if (space == newSpace) { + return; + } + if (added) { + removePhysics(space); + added = false; + } + if (newSpace != null && isEnabled()) { + addPhysics(newSpace); added = true; } - this.space = space; + /* + * If this control isn't enabled, its physics object will be + * added to the new space when the control becomes enabled. + */ + space = newSpace; } + /** + * Access the physics space to which the object is (or would be) added. + * + * @return the pre-existing space, or null for none + */ public PhysicsSpace getPhysicsSpace() { return space; } + /** + * Serialize this object, for example when saving to a J3O file. + * + * @param ex exporter (not null) + * @throws IOException from exporter + */ @Override public void write(JmeExporter ex) throws IOException { OutputCapsule oc = ex.getCapsule(this); @@ -241,6 +337,13 @@ public abstract class AbstractPhysicsControl implements PhysicsControl, JmeClone oc.write(spatial, "spatial", null); } + /** + * De-serialize this control from the specified importer, for example when + * loading from a J3O file. + * + * @param im importer (not null) + * @throws IOException from importer + */ @Override public void read(JmeImporter im) throws IOException { InputCapsule ic = im.getCapsule(this); diff --git a/jme3-bullet/src/common/java/com/jme3/bullet/control/BetterCharacterControl.java b/jme3-bullet/src/common/java/com/jme3/bullet/control/BetterCharacterControl.java index 30190f1f1..027d00f33 100644 --- a/jme3-bullet/src/common/java/com/jme3/bullet/control/BetterCharacterControl.java +++ b/jme3-bullet/src/common/java/com/jme3/bullet/control/BetterCharacterControl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -48,9 +48,7 @@ import com.jme3.math.Vector3f; import com.jme3.renderer.RenderManager; import com.jme3.renderer.ViewPort; import com.jme3.scene.Spatial; -import com.jme3.scene.control.Control; import com.jme3.util.TempVars; -import com.jme3.util.clone.Cloner; import com.jme3.util.clone.JmeCloneable; import java.io.IOException; import java.util.List; @@ -58,15 +56,18 @@ import java.util.logging.Level; import java.util.logging.Logger; /** - * This is intended to be a replacement for the internal bullet character class. - * A RigidBody with cylinder collision shape is used and its velocity is set - * continuously, a ray test is used to check if the character is on the ground. - * - * The character keeps his own local coordinate system which adapts based on the - * gravity working on the character so the character will always stand upright. - * - * Forces in the local x/z plane are dampened while those in the local y - * direction are applied fully (e.g. jumping, falling). + * This class is intended to replace the CharacterControl class. + *

+ * A rigid body with cylinder collision shape is used and its velocity is set + * continuously. A ray test is used to test whether the character is on the + * ground. + *

+ * The character keeps their own local coordinate system which adapts based on + * the gravity working on the character so they will always stand upright. + *

+ * Motion in the local X-Z plane is damped. + *

+ * This class is shared between JBullet and Native Bullet. * * @author normenhansen */ @@ -76,10 +77,16 @@ public class BetterCharacterControl extends AbstractPhysicsControl implements Ph protected PhysicsRigidBody rigidBody; protected float radius; protected float height; + /** + * mass of this character (>0) + */ protected float mass; + /** + * relative height when ducked (1=full height) + */ protected float duckedFactor = 0.6f; /** - * Local up direction, derived from gravity. + * local up direction, derived from gravity */ protected final Vector3f localUp = new Vector3f(0, 1, 0); /** @@ -96,22 +103,27 @@ public class BetterCharacterControl extends AbstractPhysicsControl implements Ph */ protected final Quaternion localForwardRotation = new Quaternion(Quaternion.DIRECTION_Z); /** - * Is a z-forward vector based on the view direction and the current local - * x/z plane. + * a Z-forward vector based on the view direction and the local X-Z plane. */ protected final Vector3f viewDirection = new Vector3f(0, 0, 1); /** - * Stores final spatial location, corresponds to RigidBody location. + * spatial location, corresponds to RigidBody location. */ protected final Vector3f location = new Vector3f(); /** - * Stores final spatial rotation, is a z-forward rotation based on the view - * direction and the current local x/z plane. See also rotatedViewDirection. + * spatial rotation, a Z-forward rotation based on the view direction and + * local X-Z plane. + * + * @see #rotatedViewDirection */ protected final Quaternion rotation = new Quaternion(Quaternion.DIRECTION_Z); protected final Vector3f rotatedViewDirection = new Vector3f(0, 0, 1); protected final Vector3f walkDirection = new Vector3f(); protected final Vector3f jumpForce; + /** + * X-Z motion damping factor (0→no damping, 1=no external forces, + * default=0.9) + */ protected float physicsDamping = 0.9f; protected final Vector3f scale = new Vector3f(1, 1, 1); protected final Vector3f velocity = new Vector3f(); @@ -121,20 +133,23 @@ public class BetterCharacterControl extends AbstractPhysicsControl implements Ph protected boolean wantToUnDuck = false; /** - * Only used for serialization, do not use this constructor. + * No-argument constructor needed by SavableClassUtil. Do not invoke + * directly! */ public BetterCharacterControl() { jumpForce = new Vector3f(); } /** - * Creates a new character with the given properties. Note that to avoid - * issues the final height when ducking should be larger than 2x radius. The - * jumpForce will be set to an upwards force of 5x mass. + * Instantiate an enabled control with the specified properties. + *

+ * The final height when ducking must be larger than 2x radius. The + * jumpForce will be set to an upward force of 5x mass. * - * @param radius - * @param height - * @param mass + * @param radius the radius of the character's collision shape (>0) + * @param height the height of the character's collision shape + * (>2*radius) + * @param mass the character's mass (≥0) */ public BetterCharacterControl(float radius, float height, float mass) { this.radius = radius; @@ -145,6 +160,13 @@ public class BetterCharacterControl extends AbstractPhysicsControl implements Ph rigidBody.setAngularFactor(0); } + /** + * Update this control. Invoked once per frame during the logical-state + * update, provided the control is added to a scene graph. Do not invoke + * directly from user code. + * + * @param tpf the time interval between frames (in seconds, ≥0) + */ @Override public void update(float tpf) { super.update(tpf); @@ -153,16 +175,24 @@ public class BetterCharacterControl extends AbstractPhysicsControl implements Ph applyPhysicsTransform(location, rotation); } + /** + * Render this control. Invoked once per view port per frame, provided the + * control is added to a scene. Should be invoked only by a subclass or by + * the RenderManager. + * + * @param rm the render manager (not null) + * @param vp the view port to render (not null) + */ @Override public void render(RenderManager rm, ViewPort vp) { super.render(rm, vp); } /** - * Used internally, don't call manually + * Callback from Bullet, invoked just before the physics is stepped. * - * @param space - * @param tpf + * @param space the space that is about to be stepped (not null) + * @param tpf the time per physics step (in seconds, ≥0) */ public void prePhysicsTick(PhysicsSpace space, float tpf) { checkOnGround(); @@ -174,8 +204,8 @@ public class BetterCharacterControl extends AbstractPhysicsControl implements Ph TempVars vars = TempVars.get(); Vector3f currentVelocity = vars.vect2.set(velocity); - - // dampen existing x/z forces + + // Attenuate any existing X-Z motion. float existingLeftVelocity = velocity.dot(localLeft); float existingForwardVelocity = velocity.dot(localForward); Vector3f counter = vars.vect1; @@ -210,20 +240,20 @@ public class BetterCharacterControl extends AbstractPhysicsControl implements Ph } /** - * Used internally, don't call manually + * Callback from Bullet, invoked just after the physics has been stepped. * - * @param space - * @param tpf + * @param space the space that was just stepped (not null) + * @param tpf the time per physics step (in seconds, ≥0) */ public void physicsTick(PhysicsSpace space, float tpf) { rigidBody.getLinearVelocity(velocity); } /** - * Move the character somewhere. Note the character also takes the location - * of any spatial its being attached to in the moment it is attached. + * Move the character somewhere. Note the character also warps to the + * location of the spatial when the control is added. * - * @param vec The new character location. + * @param vec the desired character location (not null) */ public void warp(Vector3f vec) { setPhysicsLocation(vec); @@ -241,32 +271,32 @@ public class BetterCharacterControl extends AbstractPhysicsControl implements Ph } /** - * Set the jump force as a Vector3f. The jump force is local to the - * characters coordinate system, which normally is always z-forward (in - * world coordinates, parent coordinates when set to applyLocalPhysics) + * Alter the jump force. The jump force is local to the character's + * coordinate system, which normally is always z-forward (in world + * coordinates, parent coordinates when set to applyLocalPhysics) * - * @param jumpForce The new jump force + * @param jumpForce the desired jump force (not null, unaffected, + * default=5*mass in +Y direction) */ public void setJumpForce(Vector3f jumpForce) { this.jumpForce.set(jumpForce); } /** - * Gets the current jump force. The default is 5 * character mass in y - * direction. + * Access the jump force. * - * @return + * @return the pre-existing vector (not null) */ public Vector3f getJumpForce() { return jumpForce; } /** - * Check if the character is on the ground. This is determined by a ray test - * in the center of the character and might return false even if the - * character is not falling yet. + * Test whether the character is supported. Uses a ray test from the center + * of the character and might return false even if the character is not + * falling yet. * - * @return + * @return true if on the ground, otherwise false */ public boolean isOnGround() { return onGround; @@ -276,10 +306,10 @@ public class BetterCharacterControl extends AbstractPhysicsControl implements Ph * Toggle character ducking. When ducked the characters capsule collision * shape height will be multiplied by duckedFactor to make the capsule * smaller. When unducking, the character will check with a ray test if it - * can in fact unduck and only do so when its possible. You can check the - * state of the unducking by checking isDucked(). + * can in fact unduck and only do so when its possible. You can test the + * state using isDucked(). * - * @param enabled + * @param enabled true→duck, false→unduck */ public void setDucked(boolean enabled) { if (enabled) { @@ -300,33 +330,33 @@ public class BetterCharacterControl extends AbstractPhysicsControl implements Ph * Check if the character is ducking, either due to user input or due to * unducking being impossible at the moment (obstacle above). * - * @return + * @return true if ducking, otherwise false */ public boolean isDucked() { return ducked; } /** - * Sets the height multiplication factor for ducking. + * Alter the height multiplier for ducking. * - * @param factor The factor by which the height should be multiplied when - * ducking + * @param factor the factor by which the height should be multiplied when + * ducking (≥0, ≤1) */ public void setDuckedFactor(float factor) { duckedFactor = factor; } /** - * Gets the height multiplication factor for ducking. + * Read the height multiplier for ducking. * - * @return + * @return the factor (≥0, ≤1) */ public float getDuckedFactor() { return duckedFactor; } /** - * Sets the walk direction of the character. This parameter is framerate + * Alter the character's the walk direction. This parameter is framerate * independent and the character will move continuously in the direction * given by the vector with the speed given by the vector length in m/s. * @@ -337,20 +367,19 @@ public class BetterCharacterControl extends AbstractPhysicsControl implements Ph } /** - * Gets the current walk direction and speed of the character. The length of - * the vector defines the speed. + * Read the walk velocity. The length of the vector defines the speed. * - * @return + * @return the pre-existing vector (not null) */ public Vector3f getWalkDirection() { return walkDirection; } /** - * Sets the view direction for the character. Note this only defines the - * rotation of the spatial in the local x/z plane of the character. + * Alter the character's view direction. Note this only defines the + * orientation in the local X-Z plane. * - * @param vec + * @param vec a direction vector (not null, unaffected) */ public void setViewDirection(Vector3f vec) { viewDirection.set(vec); @@ -358,10 +387,10 @@ public class BetterCharacterControl extends AbstractPhysicsControl implements Ph } /** - * Gets the current view direction, note this doesn't need to correspond - * with the spatials forward direction. + * Access the view direction. This need not agree with the spatial's forward + * direction. * - * @return + * @return the pre-existing vector (not null) */ public Vector3f getViewDirection() { return viewDirection; @@ -369,15 +398,15 @@ public class BetterCharacterControl extends AbstractPhysicsControl implements Ph /** * Realign the local forward vector to given direction vector, if null is - * supplied Vector3f.UNIT_Z is used. Input vector has to be perpendicular to - * current gravity vector. This normally only needs to be called when the + * supplied Vector3f.UNIT_Z is used. The input vector must be perpendicular + * to gravity vector. This normally only needs to be invoked when the * gravity direction changed continuously and the local forward vector is * off due to drift. E.g. after walking around on a sphere "planet" for a - * while and then going back to a y-up coordinate system the local z-forward - * might not be 100% alinged with Z axis. + * while and then going back to a Y-up coordinate system the local Z-forward + * might not be 100% aligned with the Z axis. * - * @param vec The new forward vector, has to be perpendicular to the current - * gravity vector! + * @param vec the desired forward vector (perpendicular to the gravity + * vector, may be null, default=0,0,1) */ public void resetForward(Vector3f vec) { if (vec == null) { @@ -388,23 +417,21 @@ public class BetterCharacterControl extends AbstractPhysicsControl implements Ph } /** - * Get the current linear velocity along the three axes of the character. - * This is prepresented in world coordinates, parent coordinates when the - * control is set to applyLocalPhysics. + * Access the character's linear velocity in physics-space coordinates. * - * @return The current linear velocity of the character + * @return the pre-existing vector (not null) */ public Vector3f getVelocity() { return velocity; } /** - * Set the gravity for this character. Note that this also realigns the - * local coordinate system of the character so that continuous changes in - * gravity direction are possible while maintaining a sensible control over - * the character. + * Alter the gravity acting on this character. Note that this also realigns + * the local coordinate system of the character so that continuous changes + * in gravity direction are possible while maintaining a sensible control + * over the character. * - * @param gravity + * @param gravity an acceleration vector (not null, unaffected) */ public void setGravity(Vector3f gravity) { rigidBody.setGravity(gravity); @@ -413,46 +440,48 @@ public class BetterCharacterControl extends AbstractPhysicsControl implements Ph } /** - * Get the current gravity of the character. + * Copy the character's gravity vector. * - * @return + * @return a new acceleration vector (not null) */ public Vector3f getGravity() { return rigidBody.getGravity(); } /** - * Get the current gravity of the character. + * Copy the character's gravity vector. * - * @param store The vector to store the result in - * @return + * @param store storage for the result (modified if not null) + * @return an acceleration vector (either the provided storage or a new + * vector, not null) */ public Vector3f getGravity(Vector3f store) { return rigidBody.getGravity(store); } /** - * Sets how much the physics forces in the local x/z plane should be - * dampened. - * @param physicsDamping The dampening value, 0 = no dampening, 1 = no external force, default = 0.9 + * Alter how much motion in the local X-Z plane is damped. + * + * @param physicsDamping the desired damping factor (0→no damping, 1=no + * external forces, default=0.9) */ public void setPhysicsDamping(float physicsDamping) { this.physicsDamping = physicsDamping; } /** - * Gets how much the physics forces in the local x/z plane should be - * dampened. + * Read how much motion in the local X-Z plane is damped. + * + * @return the damping factor (0→no damping, 1=no external forces) */ public float getPhysicsDamping() { return physicsDamping; } /** - * This actually sets a new collision shape to the character to change the - * height of the capsule. + * Alter the height of collision shape. * - * @param percent + * @param percent the desired height, as a percentage of the full height */ protected void setHeightPercent(float percent) { scale.setY(percent); @@ -460,7 +489,7 @@ public class BetterCharacterControl extends AbstractPhysicsControl implements Ph } /** - * This checks if the character is on the ground by doing a ray test. + * Test whether the character is on the ground, by means of a ray test. */ protected void checkOnGround() { TempVars vars = TempVars.get(); @@ -501,12 +530,10 @@ public class BetterCharacterControl extends AbstractPhysicsControl implements Ph } /** - * Gets a new collision shape based on the current scale parameter. The - * created collisionshape is a capsule collision shape that is attached to a - * compound collision shape with an offset to set the object center at the - * bottom of the capsule. + * Create a collision shape based on the scale parameter. The new shape is a + * compound shape containing an offset capsule. * - * @return + * @return a new compound shape (not null) */ protected CollisionShape getShape() { //TODO: cleanup size mess.. @@ -518,18 +545,18 @@ public class BetterCharacterControl extends AbstractPhysicsControl implements Ph } /** - * Gets the scaled height. + * Calculate the character's scaled height. * - * @return + * @return the height */ protected float getFinalHeight() { return height * scale.getY(); } /** - * Gets the scaled radius. + * Calculate the character's scaled radius. * - * @return + * @return the radius */ protected float getFinalRadius() { return radius * scale.getZ(); @@ -538,7 +565,7 @@ public class BetterCharacterControl extends AbstractPhysicsControl implements Ph /** * Updates the local coordinate system from the localForward and localUp * vectors, adapts localForward, sets localForwardRotation quaternion to - * local z-forward rotation. + * local Z-forward rotation. */ protected void updateLocalCoordinateSystem() { //gravity vector has possibly changed, calculate new world forward (UNIT_Z) @@ -549,8 +576,8 @@ public class BetterCharacterControl extends AbstractPhysicsControl implements Ph } /** - * Updates the local x/z-flattened view direction and the corresponding - * rotation quaternion for the spatial. + * Updates the local X-Z view direction and the corresponding rotation + * quaternion for the spatial. */ protected void updateLocalViewDirection() { //update local rotation quaternion to use for view rotation @@ -570,7 +597,6 @@ public class BetterCharacterControl extends AbstractPhysicsControl implements Ph * set to the new direction * @param worldUpVector The up vector to use, the result direction will be * perpendicular to this - * @return */ protected final void calculateNewForward(Quaternion rotation, Vector3f direction, Vector3f worldUpVector) { if (direction == null) { @@ -602,10 +628,9 @@ public class BetterCharacterControl extends AbstractPhysicsControl implements Ph } /** - * This is implemented from AbstractPhysicsControl and called when the - * spatial is attached for example. + * Translate the character to the specified location. * - * @param vec + * @param vec desired location (not null, unaffected) */ @Override protected void setPhysicsLocation(Vector3f vec) { @@ -614,12 +639,12 @@ public class BetterCharacterControl extends AbstractPhysicsControl implements Ph } /** - * This is implemented from AbstractPhysicsControl and called when the - * spatial is attached for example. We don't set the actual physics rotation - * but the view rotation here. It might actually be altered by the - * calculateNewForward method. + * Rotate the physics object to the specified orientation. + *

+ * We don't set the actual physics rotation but the view rotation here. It + * might actually be altered by the calculateNewForward method. * - * @param quat + * @param quat desired orientation (not null, unaffected) */ @Override protected void setPhysicsRotation(Quaternion quat) { @@ -629,10 +654,9 @@ public class BetterCharacterControl extends AbstractPhysicsControl implements Ph } /** - * This is implemented from AbstractPhysicsControl and called when the - * control is supposed to add all objects to the physics space. + * Add all managed physics objects to the specified space. * - * @param space + * @param space which physics space to add to (not null) */ @Override protected void addPhysics(PhysicsSpace space) { @@ -644,10 +668,9 @@ public class BetterCharacterControl extends AbstractPhysicsControl implements Ph } /** - * This is implemented from AbstractPhysicsControl and called when the - * control is supposed to remove all objects from the physics space. + * Remove all managed physics objects from the specified space. * - * @param space + * @param space which physics space to remove from (not null) */ @Override protected void removePhysics(PhysicsSpace space) { @@ -655,23 +678,33 @@ public class BetterCharacterControl extends AbstractPhysicsControl implements Ph space.removeTickListener(this); } + /** + * Create spatial-dependent data. Invoked when this control is added to a + * spatial. + * + * @param spat the controlled spatial (not null, alias created) + */ @Override protected void createSpatialData(Spatial spat) { rigidBody.setUserObject(spatial); } + /** + * Destroy spatial-dependent data. Invoked when this control is removed from + * a spatial. + * + * @param spat the previously controlled spatial (not null) + */ @Override protected void removeSpatialData(Spatial spat) { rigidBody.setUserObject(null); } - @Override - public Control cloneForSpatial(Spatial spatial) { - BetterCharacterControl control = new BetterCharacterControl(radius, height, mass); - control.setJumpForce(jumpForce); - return control; - } - + /** + * Create a shallow clone for the JME cloner. + * + * @return a new control (not null) + */ @Override public Object jmeClone() { BetterCharacterControl control = new BetterCharacterControl(radius, height, mass); @@ -680,6 +713,12 @@ public class BetterCharacterControl extends AbstractPhysicsControl implements Ph return control; } + /** + * Serialize this control, for example when saving to a J3O file. + * + * @param ex exporter (not null) + * @throws IOException from exporter + */ @Override public void write(JmeExporter ex) throws IOException { super.write(ex); @@ -691,6 +730,12 @@ public class BetterCharacterControl extends AbstractPhysicsControl implements Ph oc.write(physicsDamping, "physicsDamping", 0.9f); } + /** + * De-serialize this control, for example when loading from a J3O file. + * + * @param im importer (not null) + * @throws IOException from importer + */ @Override public void read(JmeImporter im) throws IOException { super.read(im); diff --git a/jme3-bullet/src/common/java/com/jme3/bullet/control/CharacterControl.java b/jme3-bullet/src/common/java/com/jme3/bullet/control/CharacterControl.java index d12e5991a..e34b5b3b6 100644 --- a/jme3-bullet/src/common/java/com/jme3/bullet/control/CharacterControl.java +++ b/jme3-bullet/src/common/java/com/jme3/bullet/control/CharacterControl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -89,21 +89,10 @@ public class CharacterControl extends PhysicsCharacter implements PhysicsControl return spatial.getWorldTranslation(); } + @Deprecated @Override public Control cloneForSpatial(Spatial spatial) { - CharacterControl control = new CharacterControl(collisionShape, stepHeight); - control.setCcdMotionThreshold(getCcdMotionThreshold()); - control.setCcdSweptSphereRadius(getCcdSweptSphereRadius()); - control.setCollideWithGroups(getCollideWithGroups()); - control.setCollisionGroup(getCollisionGroup()); - control.setFallSpeed(getFallSpeed()); - control.setGravity(getGravity()); - control.setJumpSpeed(getJumpSpeed()); - control.setMaxSlope(getMaxSlope()); - control.setPhysicsLocation(getPhysicsLocation()); - control.setUpAxis(getUpAxis()); - control.setApplyPhysicsLocal(isApplyPhysicsLocal()); - return control; + throw new UnsupportedOperationException(); } @Override @@ -113,6 +102,7 @@ public class CharacterControl extends PhysicsCharacter implements PhysicsControl control.setCcdSweptSphereRadius(getCcdSweptSphereRadius()); control.setCollideWithGroups(getCollideWithGroups()); control.setCollisionGroup(getCollisionGroup()); + control.setContactResponse(isContactResponse()); control.setFallSpeed(getFallSpeed()); control.setGravity(getGravity()); control.setJumpSpeed(getJumpSpeed()); @@ -201,21 +191,31 @@ public class CharacterControl extends PhysicsCharacter implements PhysicsControl public void render(RenderManager rm, ViewPort vp) { } - public void setPhysicsSpace(PhysicsSpace space) { - if (space == null) { - if (this.space != null) { - this.space.removeCollisionObject(this); - added = false; - } - } else { - if(this.space == space) return; - // if this object isn't enabled, it will be added when it will be enabled. - if (isEnabled()) { - space.addCollisionObject(this); - added = true; - } + /** + * If enabled, add this control's physics object to the specified physics + * space. If not enabled, alter where the object would be added. The object + * is removed from any other space it's currently in. + * + * @param newSpace where to add, or null to simply remove + */ + @Override + public void setPhysicsSpace(PhysicsSpace newSpace) { + if (space == newSpace) { + return; + } + if (added) { + space.removeCollisionObject(this); + added = false; + } + if (newSpace != null && isEnabled()) { + newSpace.addCollisionObject(this); + added = true; } - this.space = space; + /* + * If this control isn't enabled, its physics object will be + * added to the new space when the control becomes enabled. + */ + space = newSpace; } public PhysicsSpace getPhysicsSpace() { diff --git a/jme3-bullet/src/common/java/com/jme3/bullet/control/GhostControl.java b/jme3-bullet/src/common/java/com/jme3/bullet/control/GhostControl.java index 70c636507..7ff51670d 100644 --- a/jme3-bullet/src/common/java/com/jme3/bullet/control/GhostControl.java +++ b/jme3-bullet/src/common/java/com/jme3/bullet/control/GhostControl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -49,38 +49,82 @@ import com.jme3.util.clone.JmeCloneable; import java.io.IOException; /** - * A GhostControl moves with the spatial it is attached to and can be used to check - * overlaps with other physics objects (e.g. aggro radius). + * A physics control to link a PhysicsGhostObject to a spatial. + *

+ * The ghost object moves with the spatial it is attached to and can be used to + * detect overlaps with other physics objects (e.g. aggro radius). + *

+ * This class is shared between JBullet and Native Bullet. + * * @author normenhansen */ public class GhostControl extends PhysicsGhostObject implements PhysicsControl, JmeCloneable { + /** + * spatial to which this control is added, or null if none + */ protected Spatial spatial; + /** + * true→control is enabled, false→control is disabled + */ protected boolean enabled = true; + /** + * true→body is added to the physics space, false→not added + */ protected boolean added = false; + /** + * space to which the ghost object is (or would be) added + */ protected PhysicsSpace space = null; + /** + * true → physics coordinates match local transform, false → + * physics coordinates match world transform + */ protected boolean applyLocal = false; + /** + * No-argument constructor needed by SavableClassUtil. Do not invoke + * directly! + */ public GhostControl() { } + /** + * Instantiate an enabled control with the specified shape. + * + * @param shape (not null) + */ public GhostControl(CollisionShape shape) { super(shape); } + /** + * Test whether physics-space coordinates should match the spatial's local + * coordinates. + * + * @return true if matching local coordinates, false if matching world + * coordinates + */ public boolean isApplyPhysicsLocal() { return applyLocal; } /** - * When set to true, the physics coordinates will be applied to the local - * translation of the Spatial - * @param applyPhysicsLocal + * Alter whether physics-space coordinates should match the spatial's local + * coordinates. + * + * @param applyPhysicsLocal true→match local coordinates, + * false→match world coordinates (default=false) */ public void setApplyPhysicsLocal(boolean applyPhysicsLocal) { applyLocal = applyPhysicsLocal; } + /** + * Access whichever spatial translation corresponds to the physics location. + * + * @return the pre-existing vector (not null) + */ private Vector3f getSpatialTranslation() { if (applyLocal) { return spatial.getLocalTranslation(); @@ -88,6 +132,11 @@ public class GhostControl extends PhysicsGhostObject implements PhysicsControl, return spatial.getWorldTranslation(); } + /** + * Access whichever spatial rotation corresponds to the physics rotation. + * + * @return the pre-existing quaternion (not null) + */ private Quaternion getSpatialRotation() { if (applyLocal) { return spatial.getLocalRotation(); @@ -95,20 +144,24 @@ public class GhostControl extends PhysicsGhostObject implements PhysicsControl, return spatial.getWorldRotation(); } + /** + * Clone this control for a different spatial. No longer used as of JME 3.1. + * + * @param spatial the spatial for the clone to control (or null) + * @return a new control (not null) + */ + @Deprecated @Override public Control cloneForSpatial(Spatial spatial) { - GhostControl control = new GhostControl(collisionShape); - control.setCcdMotionThreshold(getCcdMotionThreshold()); - control.setCcdSweptSphereRadius(getCcdSweptSphereRadius()); - control.setCollideWithGroups(getCollideWithGroups()); - control.setCollisionGroup(getCollisionGroup()); - control.setPhysicsLocation(getPhysicsLocation()); - control.setPhysicsRotation(getPhysicsRotationMatrix()); - control.setApplyPhysicsLocal(isApplyPhysicsLocal()); - return control; + throw new UnsupportedOperationException(); } - @Override + /** + * Create a shallow clone for the JME cloner. + * + * @return a new control (not null) + */ + @Override public Object jmeClone() { GhostControl control = new GhostControl(collisionShape); control.setCcdMotionThreshold(getCcdMotionThreshold()); @@ -122,11 +175,27 @@ public class GhostControl extends PhysicsGhostObject implements PhysicsControl, return control; } + /** + * Callback from {@link com.jme3.util.clone.Cloner} to convert this + * shallow-cloned control into a deep-cloned one, using the specified cloner + * and original to resolve copied fields. + * + * @param cloner the cloner that's cloning this control (not null) + * @param original the control from which this control was shallow-cloned + * (unused) + */ @Override public void cloneFields( Cloner cloner, Object original ) { this.spatial = cloner.clone(spatial); } + /** + * Alter which spatial is controlled. Invoked when the control is added to + * or removed from a spatial. Should be invoked only by a subclass or from + * Spatial. Do not invoke directly from user code. + * + * @param spatial the spatial to control (or null) + */ public void setSpatial(Spatial spatial) { this.spatial = spatial; setUserObject(spatial); @@ -137,6 +206,15 @@ public class GhostControl extends PhysicsGhostObject implements PhysicsControl, setPhysicsRotation(getSpatialRotation()); } + /** + * Enable or disable this control. + *

+ * When the control is disabled, the ghost object is removed from physics + * space. When the control is enabled again, the object is moved to the + * current location of the spatial and then added to the physics space. + * + * @param enabled true→enable the control, false→disable it + */ public void setEnabled(boolean enabled) { this.enabled = enabled; if (space != null) { @@ -154,10 +232,22 @@ public class GhostControl extends PhysicsGhostObject implements PhysicsControl, } } + /** + * Test whether this control is enabled. + * + * @return true if enabled, otherwise false + */ public boolean isEnabled() { return enabled; } + /** + * Update this control. Invoked once per frame during the logical-state + * update, provided the control is added to a scene. Do not invoke directly + * from user code. + * + * @param tpf the time interval between frames (in seconds, ≥0) + */ public void update(float tpf) { if (!enabled) { return; @@ -166,29 +256,60 @@ public class GhostControl extends PhysicsGhostObject implements PhysicsControl, setPhysicsRotation(getSpatialRotation()); } + /** + * Render this control. Invoked once per view port per frame, provided the + * control is added to a scene. Should be invoked only by a subclass or by + * the RenderManager. + * + * @param rm the render manager (not null) + * @param vp the view port to render (not null) + */ public void render(RenderManager rm, ViewPort vp) { } - public void setPhysicsSpace(PhysicsSpace space) { - if (space == null) { - if (this.space != null) { - this.space.removeCollisionObject(this); - added = false; - } - } else { - if (this.space == space) { - return; - } - space.addCollisionObject(this); + /** + * If enabled, add this control's physics object to the specified physics + * space. If not enabled, alter where the object would be added. The object + * is removed from any other space it's currently in. + * + * @param newSpace where to add, or null to simply remove + */ + @Override + public void setPhysicsSpace(PhysicsSpace newSpace) { + if (space == newSpace) { + return; + } + if (added) { + space.removeCollisionObject(this); + added = false; + } + if (newSpace != null && isEnabled()) { + newSpace.addCollisionObject(this); added = true; } - this.space = space; + /* + * If this control isn't enabled, its physics object will be + * added to the new space when the control becomes enabled. + */ + space = newSpace; } + /** + * Access the physics space to which the ghost object is (or would be) + * added. + * + * @return the pre-existing space, or null for none + */ public PhysicsSpace getPhysicsSpace() { return space; } + /** + * Serialize this control, for example when saving to a J3O file. + * + * @param ex exporter (not null) + * @throws IOException from exporter + */ @Override public void write(JmeExporter ex) throws IOException { super.write(ex); @@ -198,6 +319,12 @@ public class GhostControl extends PhysicsGhostObject implements PhysicsControl, oc.write(spatial, "spatial", null); } + /** + * De-serialize this control, for example when loading from a J3O file. + * + * @param im importer (not null) + * @throws IOException from importer + */ @Override public void read(JmeImporter im) throws IOException { super.read(im); diff --git a/jme3-bullet/src/common/java/com/jme3/bullet/control/KinematicRagdollControl.java b/jme3-bullet/src/common/java/com/jme3/bullet/control/KinematicRagdollControl.java index 6c25b6662..8a99ddc22 100644 --- a/jme3-bullet/src/common/java/com/jme3/bullet/control/KinematicRagdollControl.java +++ b/jme3-bullet/src/common/java/com/jme3/bullet/control/KinematicRagdollControl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -31,37 +31,22 @@ */ package com.jme3.bullet.control; -import com.jme3.animation.AnimControl; -import com.jme3.animation.Bone; -import com.jme3.animation.Skeleton; -import com.jme3.animation.SkeletonControl; +import com.jme3.animation.*; import com.jme3.bullet.PhysicsSpace; -import com.jme3.bullet.collision.PhysicsCollisionEvent; -import com.jme3.bullet.collision.PhysicsCollisionListener; -import com.jme3.bullet.collision.PhysicsCollisionObject; -import com.jme3.bullet.collision.RagdollCollisionListener; +import com.jme3.bullet.collision.*; import com.jme3.bullet.collision.shapes.BoxCollisionShape; import com.jme3.bullet.collision.shapes.HullCollisionShape; -import com.jme3.bullet.control.ragdoll.HumanoidRagdollPreset; -import com.jme3.bullet.control.ragdoll.RagdollPreset; -import com.jme3.bullet.control.ragdoll.RagdollUtils; +import com.jme3.bullet.control.ragdoll.*; import com.jme3.bullet.joints.SixDofJoint; import com.jme3.bullet.objects.PhysicsRigidBody; -import com.jme3.export.InputCapsule; -import com.jme3.export.JmeExporter; -import com.jme3.export.JmeImporter; -import com.jme3.export.OutputCapsule; -import com.jme3.export.Savable; -import com.jme3.math.FastMath; -import com.jme3.math.Quaternion; -import com.jme3.math.Vector3f; +import com.jme3.export.*; +import com.jme3.math.*; import com.jme3.renderer.RenderManager; import com.jme3.renderer.ViewPort; +import com.jme3.scene.Mesh; import com.jme3.scene.Node; import com.jme3.scene.Spatial; -import com.jme3.scene.control.Control; import com.jme3.util.TempVars; -import com.jme3.util.clone.Cloner; import com.jme3.util.clone.JmeCloneable; import java.io.IOException; import java.util.*; @@ -73,29 +58,39 @@ import java.util.logging.Logger; * use this control you need a model with an AnimControl and a * SkeletonControl.
This should be the case if you imported an animated * model from Ogre or blender.
Note enabling/disabling the control - * add/removes it from the physic space

This control creates collision - * shapes for each bones of the skeleton when you call - * spatial.addControl(ragdollControl).

  • The shape is HullCollision shape - * based on the vertices associated with each bone and based on a tweakable - * weight threshold (see setWeightThreshold)
  • If you don't want each - * bone to be a collision shape, you can specify what bone to use by using the - * addBoneName method
    By using this method, bone that are not used to create - * a shape, are "merged" to their parent to create the collision shape.
  • - *

There are 2 modes for this control :

  • The - * kinematic modes :
    this is the default behavior, this means that - * the collision shapes of the body are able to interact with physics enabled - * objects. in this mode physic shapes follow the moovements of the animated - * skeleton (for example animated by a key framed animation) this mode is - * enabled by calling setKinematicMode();
  • The ragdoll modes - * :
    To enable this behavior, you need to call setRagdollMode() - * method. In this mode the charater is entirely controled by physics, so it - * will fall under the gravity and move if any force is applied to it.
  • - *

+ * add/removes it from the physics space
+ *

+ * This control creates collision shapes for each bones of the skeleton when you + * invoke spatial.addControl(ragdollControl).

  • The shape is + * HullCollision shape based on the vertices associated with each bone and based + * on a tweakable weight threshold (see setWeightThreshold)
  • If you + * don't want each bone to be a collision shape, you can specify what bone to + * use by using the addBoneName method
    By using this method, bone that are + * not used to create a shape, are "merged" to their parent to create the + * collision shape.
  • + *
+ *

+ * There are 2 modes for this control :

  • The kinematic modes + * :
    this is the default behavior, this means that the collision + * shapes of the body are able to interact with physics enabled objects. in this + * mode physics shapes follow the motion of the animated skeleton (for example + * animated by a key framed animation) this mode is enabled by calling + * setKinematicMode();
  • The ragdoll modes:
    To + * enable this behavior, you need to invoke the setRagdollMode() method. In this + * mode the character is entirely controlled by physics, so it will fall under + * the gravity and move if any force is applied to it.
  • + *
+ *

+ * This class is shared between JBullet and Native Bullet. * - * @author Normen Hansen and Rémy Bouquet (Nehon) + * @author Normen Hansen and Rémy Bouquet (Nehon) */ +@Deprecated public class KinematicRagdollControl extends AbstractPhysicsControl implements PhysicsCollisionListener, JmeCloneable { + /** + * list of registered collision listeners + */ protected static final Logger logger = Logger.getLogger(KinematicRagdollControl.class.getName()); protected List listeners; protected final Set boneList = new TreeSet(); @@ -103,7 +98,13 @@ public class KinematicRagdollControl extends AbstractPhysicsControl implements P protected final Vector3f modelPosition = new Vector3f(); protected final Quaternion modelRotation = new Quaternion(); protected final PhysicsRigidBody baseRigidBody; + /** + * model being controlled + */ protected Spatial targetModel; + /** + * skeleton being controlled + */ protected Skeleton skeleton; protected RagdollPreset preset = new HumanoidRagdollPreset(); protected Vector3f initScale; @@ -112,23 +113,52 @@ public class KinematicRagdollControl extends AbstractPhysicsControl implements P protected boolean blendedControl = false; protected float weightThreshold = -1.0f; protected float blendStart = 0.0f; + /** + * blending interval for animations (in seconds, ≥0) + */ protected float blendTime = 1.0f; protected float eventDispatchImpulseThreshold = 10; protected float rootMass = 15; + /** + * accumulate total mass of ragdoll when control is added to a scene + */ protected float totalMass = 0; private Map ikTargets = new HashMap(); private Map ikChainDepth = new HashMap(); + /** + * rotational speed for inverse kinematics (radians per second, default=7) + */ private float ikRotSpeed = 7f; + /** + * viscous limb-damping ratio (0→no damping, 1→critically damped, + * default=0.6) + */ private float limbDampening = 0.6f; - + /** + * distance threshold for inverse kinematics (default=0.1) + */ private float IKThreshold = 0.1f; + /** + * Enumerate joint-control modes for this control. + */ public static enum Mode { - + /** + * collision shapes follow the movements of bones in the skeleton + */ Kinematic, + /** + * skeleton is controlled by Bullet physics (gravity and collisions) + */ Ragdoll, + /** + * skeleton is controlled by inverse-kinematic targets + */ IK } + /** + * Link a bone to a jointed rigid body. + */ public class PhysicsBoneLink implements Savable { protected PhysicsRigidBody rigidBody; @@ -138,17 +168,37 @@ public class KinematicRagdollControl extends AbstractPhysicsControl implements P protected Quaternion startBlendingRot = new Quaternion(); protected Vector3f startBlendingPos = new Vector3f(); + /** + * Instantiate an uninitialized link. + */ public PhysicsBoneLink() { } + /** + * Access the linked bone. + * + * @return the pre-existing instance or null + */ public Bone getBone() { return bone; } + /** + * Access the linked body. + * + * @return the pre-existing instance or null + */ public PhysicsRigidBody getRigidBody() { return rigidBody; } + /** + * Serialize this bone link, for example when saving to a J3O file. + * + * @param ex exporter (not null) + * @throws IOException from exporter + */ + @Override public void write(JmeExporter ex) throws IOException { OutputCapsule oc = ex.getCapsule(this); oc.write(rigidBody, "rigidBody", null); @@ -159,6 +209,14 @@ public class KinematicRagdollControl extends AbstractPhysicsControl implements P oc.write(startBlendingPos, "startBlendingPos", new Vector3f()); } + /** + * De-serialize this bone link, for example when loading from a J3O + * file. + * + * @param im importer (not null) + * @throws IOException from importer + */ + @Override public void read(JmeImporter im) throws IOException { InputCapsule ic = im.getCapsule(this); rigidBody = (PhysicsRigidBody) ic.readSavable("rigidBody", null); @@ -171,29 +229,54 @@ public class KinematicRagdollControl extends AbstractPhysicsControl implements P } /** - * contruct a KinematicRagdollControl + * Instantiate an enabled control. */ public KinematicRagdollControl() { baseRigidBody = new PhysicsRigidBody(new BoxCollisionShape(Vector3f.UNIT_XYZ.mult(0.1f)), 1); baseRigidBody.setKinematic(mode == Mode.Kinematic); } + /** + * Instantiate an enabled control with the specified weight threshold. + * + * @param weightThreshold (>0, <1) + */ public KinematicRagdollControl(float weightThreshold) { this(); this.weightThreshold = weightThreshold; } + /** + * Instantiate an enabled control with the specified preset and weight + * threshold. + * + * @param preset (not null) + * @param weightThreshold (>0, <1) + */ public KinematicRagdollControl(RagdollPreset preset, float weightThreshold) { this(); this.preset = preset; this.weightThreshold = weightThreshold; } + /** + * Instantiate an enabled control with the specified preset. + * + * @param preset (not null) + */ public KinematicRagdollControl(RagdollPreset preset) { this(); this.preset = preset; } + /** + * Update this control. Invoked once per frame during the logical-state + * update, provided the control is added to a scene. Do not invoke directly + * from user code. + * + * @param tpf the time interval between frames (in seconds, ≥0) + */ + @Override public void update(float tpf) { if (!enabled) { return; @@ -201,13 +284,18 @@ public class KinematicRagdollControl extends AbstractPhysicsControl implements P if(mode == Mode.IK){ ikUpdate(tpf); } else if (mode == mode.Ragdoll && targetModel.getLocalTranslation().equals(modelPosition)) { - //if the ragdoll has the control of the skeleton, we update each bone with its position in physic world space. + //if the ragdoll has the control of the skeleton, we update each bone with its position in physics world space. ragDollUpdate(tpf); } else { kinematicUpdate(tpf); } } + /** + * Update this control in Ragdoll mode, based on Bullet physics. + * + * @param tpf the time interval between frames (in seconds, ≥0) + */ protected void ragDollUpdate(float tpf) { TempVars vars = TempVars.get(); Quaternion tmpRot1 = vars.quat1; @@ -217,15 +305,15 @@ public class KinematicRagdollControl extends AbstractPhysicsControl implements P Vector3f position = vars.vect1; - //retrieving bone position in physic world space + //retrieving bone position in physics world space Vector3f p = link.rigidBody.getMotionState().getWorldLocation(); //transforming this position with inverse transforms of the model targetModel.getWorldTransform().transformInverseVector(p, position); - //retrieving bone rotation in physic world space + //retrieving bone rotation in physics world space Quaternion q = link.rigidBody.getMotionState().getWorldRotationQuat(); - //multiplying this rotation by the initialWorld rotation of the bone, + //multiplying this rotation by the initialWorld rotation of the bone, //then transforming it with the inverse world rotation of the model tmpRot1.set(q).multLocal(link.initalWorldRotation); tmpRot2.set(targetModel.getWorldRotation()).inverseLocal().mult(tmpRot1, tmpRot1); @@ -249,22 +337,21 @@ public class KinematicRagdollControl extends AbstractPhysicsControl implements P link.bone.setUserTransformsInModelSpace(position, tmpRot1); } else { - //if boneList is empty, this means that every bone in the ragdoll has a collision shape, - //so we just update the bone position - if (boneList.isEmpty()) { - link.bone.setUserTransformsInModelSpace(position, tmpRot1); - } else { - //boneList is not empty, this means some bones of the skeleton might not be associated with a collision shape. - //So we update them recusively - RagdollUtils.setTransform(link.bone, position, tmpRot1, false, boneList); - } + //some bones of the skeleton might not be associated with a collision shape. + //So we update them recusively + RagdollUtils.setTransform(link.bone, position, tmpRot1, false, boneList); } } vars.release(); } + /** + * Update this control in Kinematic mode, based on bone animation tracks. + * + * @param tpf the time interval between frames (in seconds, ≥0) + */ protected void kinematicUpdate(float tpf) { - //the ragdoll does not have the controll, so the keyframed animation updates the physic position of the physic bonces + //the ragdoll does not have control, so the keyframed animation updates the physics position of the physics bonces TempVars vars = TempVars.get(); Quaternion tmpRot1 = vars.quat1; Quaternion tmpRot2 = vars.quat2; @@ -273,7 +360,7 @@ public class KinematicRagdollControl extends AbstractPhysicsControl implements P // if(link.usedbyIK){ // continue; // } - //if blended control this means, keyframed animation is updating the skeleton, + //if blended control this means, keyframed animation is updating the skeleton, //but to allow smooth transition, we blend this transformation with the saved position of the ragdoll if (blendedControl) { Vector3f position2 = vars.vect2; @@ -287,17 +374,8 @@ public class KinematicRagdollControl extends AbstractPhysicsControl implements P tmpRot1.set(tmpRot2); position.set(position2); - //updating bones transforms - if (boneList.isEmpty()) { - //we ensure we have the control to update the bone - link.bone.setUserControl(true); - link.bone.setUserTransformsInModelSpace(position, tmpRot1); - //we give control back to the key framed animation. - link.bone.setUserControl(false); - } else { - RagdollUtils.setTransform(link.bone, position, tmpRot1, true, boneList); - } - + //update bone transforms + RagdollUtils.setTransform(link.bone, position, tmpRot1, true, boneList); } //setting skeleton transforms to the ragdoll matchPhysicObjectToBone(link, position, tmpRot1); @@ -313,6 +391,11 @@ public class KinematicRagdollControl extends AbstractPhysicsControl implements P } vars.release(); } + /** + * Update this control in IK mode, based on IK targets. + * + * @param tpf the time interval between frames (in seconds, ≥0) + */ private void ikUpdate(float tpf){ TempVars vars = TempVars.get(); @@ -349,6 +432,19 @@ public class KinematicRagdollControl extends AbstractPhysicsControl implements P vars.release(); } + /** + * Update a bone and its ancestors in IK mode. Note: recursive! + * + * @param link the bone link for the affected bone (may be null) + * @param tpf the time interval between frames (in seconds, ≥0) + * @param vars unused + * @param tmpRot1 temporary storage used in calculations (not null) + * @param tmpRot2 temporary storage used in calculations (not null) + * @param tipBone (not null) + * @param target the location target in model space (not null, unaffected) + * @param depth depth of the recursion (≥0) + * @param maxDepth recursion limit (≥0) + */ public void updateBone(PhysicsBoneLink link, float tpf, TempVars vars, Quaternion tmpRot1, Quaternion[] tmpRot2, Bone tipBone, Vector3f target, int depth, int maxDepth) { if (link == null || link.bone.getParent() == null) { return; @@ -403,13 +499,12 @@ public class KinematicRagdollControl extends AbstractPhysicsControl implements P } /** - * Set the transforms of a rigidBody to match the transforms of a bone. this - * is used to make the ragdoll follow the skeleton motion while in Kinematic - * mode + * Alter the transforms of a rigidBody to match the transforms of a bone. + * This is used to make the ragdoll follow animated motion in Kinematic mode * - * @param link the link containing the bone and the rigidBody - * @param position just a temp vector for position - * @param tmpRot1 just a temp quaternion for rotation + * @param link the bone link connecting the bone and the rigidBody + * @param position temporary storage used in calculations (not null) + * @param tmpRot1 temporary storage used in calculations (not null) */ protected void matchPhysicObjectToBone(PhysicsBoneLink link, Vector3f position, Quaternion tmpRot1) { //computing position from rotation and scale @@ -420,15 +515,15 @@ public class KinematicRagdollControl extends AbstractPhysicsControl implements P targetModel.getWorldRotation().mult(tmpRot1, tmpRot1); tmpRot1.normalizeLocal(); - //updating physic location/rotation of the physic bone + //updating physics location/rotation of the physics bone link.rigidBody.setPhysicsLocation(position); link.rigidBody.setPhysicsRotation(tmpRot1); } /** - * rebuild the ragdoll this is useful if you applied scale on the ragdoll - * after it's been initialized, same as reattaching. + * Rebuild the ragdoll. This is useful if you applied scale on the ragdoll + * after it was initialized. Same as re-attaching. */ public void reBuild() { if (spatial == null) { @@ -438,6 +533,12 @@ public class KinematicRagdollControl extends AbstractPhysicsControl implements P createSpatialData(spatial); } + /** + * Create spatial-dependent data. Invoked when this control is added to a + * scene. + * + * @param model the controlled spatial (not null) + */ @Override protected void createSpatialData(Spatial model) { targetModel = model; @@ -462,8 +563,24 @@ public class KinematicRagdollControl extends AbstractPhysicsControl implements P model.removeControl(sc); model.addControl(sc); + if (boneList.isEmpty()) { + // add all bones to the list + skeleton = sc.getSkeleton(); + for (int boneI = 0; boneI < skeleton.getBoneCount(); boneI++) { + String boneName = skeleton.getBone(boneI).getName(); + boneList.add(boneName); + } + } + // filter out bones without vertices + filterBoneList(sc); + + if (boneList.isEmpty()) { + throw new IllegalArgumentException( + "No suitable bones were found in the model's skeleton."); + } + // put into bind pose and compute bone transforms in model space - // maybe dont reset to ragdoll out of animations? + // maybe don't reset to ragdoll out of animations? scanSpatial(model); @@ -481,6 +598,31 @@ public class KinematicRagdollControl extends AbstractPhysicsControl implements P logger.log(Level.FINE, "Created physics ragdoll for skeleton {0}", skeleton); } + /** + * Remove any bones without vertices from the boneList, so that every hull + * shape will contain at least 1 vertex. + */ + private void filterBoneList(SkeletonControl skeletonControl) { + Mesh[] targets = skeletonControl.getTargets(); + Skeleton skel = skeletonControl.getSkeleton(); + for (int boneI = 0; boneI < skel.getBoneCount(); boneI++) { + String boneName = skel.getBone(boneI).getName(); + if (boneList.contains(boneName)) { + boolean hasVertices = RagdollUtils.hasVertices(boneI, targets, + weightThreshold); + if (!hasVertices) { + boneList.remove(boneName); + } + } + } + } + + /** + * Destroy spatial-dependent data. Invoked when this control is removed from + * a spatial. + * + * @param spat the previously controlled spatial (not null) + */ @Override protected void removeSpatialData(Spatial spat) { if (added) { @@ -490,15 +632,22 @@ public class KinematicRagdollControl extends AbstractPhysicsControl implements P } /** - * Add a bone name to this control Using this method you can specify which - * bones of the skeleton will be used to build the collision shapes. + * Add a bone name to this control. Repeated invocations of this method can + * be used to specify which bones to use when generating collision shapes. + *

+ * Not allowed after attaching the control. * - * @param name + * @param name the name of the bone to add */ public void addBoneName(String name) { boneList.add(name); } + /** + * Generate physics shapes and bone links for the skeleton. + * + * @param model the spatial with the model's SkeletonControl (not null) + */ protected void scanSpatial(Spatial model) { AnimControl animControl = model.getControl(AnimControl.class); Map> pointsMap = null; @@ -517,14 +666,24 @@ public class KinematicRagdollControl extends AbstractPhysicsControl implements P } } + /** + * Generate a physics shape and bone links for the specified bone. Note: + * recursive! + * + * @param model the spatial with the model's SkeletonControl (not null) + * @param bone the bone to be linked (not null) + * @param parent the body linked to the parent bone (not null) + * @param reccount depth of the recursion (≥1) + * @param pointsMap (not null) + */ protected void boneRecursion(Spatial model, Bone bone, PhysicsRigidBody parent, int reccount, Map> pointsMap) { PhysicsRigidBody parentShape = parent; - if (boneList.isEmpty() || boneList.contains(bone.getName())) { + if (boneList.contains(bone.getName())) { PhysicsBoneLink link = new PhysicsBoneLink(); link.bone = bone; - //creating the collision shape + //create the collision shape HullCollisionShape shape = null; if (pointsMap != null) { //build a shape for the bone, using the vertices that are most influenced by this bone @@ -567,16 +726,16 @@ public class KinematicRagdollControl extends AbstractPhysicsControl implements P } /** - * Set the joint limits for the joint between the given bone and its parent. - * This method can't work before attaching the control to a spatial + * Alter the limits of the joint connecting the specified bone to its + * parent. Can only be invoked after adding the control to a spatial. * * @param boneName the name of the bone - * @param maxX the maximum rotation on the x axis (in radians) - * @param minX the minimum rotation on the x axis (in radians) - * @param maxY the maximum rotation on the y axis (in radians) - * @param minY the minimum rotation on the z axis (in radians) - * @param maxZ the maximum rotation on the z axis (in radians) - * @param minZ the minimum rotation on the z axis (in radians) + * @param maxX the maximum rotation on the X axis (in radians) + * @param minX the minimum rotation on the X axis (in radians) + * @param maxY the maximum rotation on the Y axis (in radians) + * @param minY the minimum rotation on the Y axis (in radians) + * @param maxZ the maximum rotation on the Z axis (in radians) + * @param minZ the minimum rotation on the Z axis (in radians) */ public void setJointLimit(String boneName, float maxX, float minX, float maxY, float minY, float maxZ, float minZ) { PhysicsBoneLink link = boneLinks.get(boneName); @@ -588,8 +747,8 @@ public class KinematicRagdollControl extends AbstractPhysicsControl implements P } /** - * Return the joint between the given bone and its parent. This return null - * if it's called before attaching the control to a spatial + * Return the joint between the specified bone and its parent. This return + * null if it's invoked before adding the control to a spatial * * @param boneName the name of the bone * @return the joint between the given bone and its parent @@ -654,9 +813,9 @@ public class KinematicRagdollControl extends AbstractPhysicsControl implements P } /** - * For internal use only callback for collisionevent + * For internal use only: callback for collision event * - * @param event + * @param event (not null) */ public void collision(PhysicsCollisionEvent event) { PhysicsCollisionObject objA = event.getObjectA(); @@ -707,11 +866,11 @@ public class KinematicRagdollControl extends AbstractPhysicsControl implements P /** * Enable or disable the ragdoll behaviour. if ragdollEnabled is true, the - * character motion will only be powerd by physics else, the characted will + * character motion will only be powered by physics else, the character will * be animated by the keyframe animation, but will be able to physically - * interact with its physic environnement + * interact with its physics environment * - * @param ragdollEnabled + * @param mode an enum value (not null) */ protected void setMode(Mode mode) { this.mode = mode; @@ -789,9 +948,9 @@ public class KinematicRagdollControl extends AbstractPhysicsControl implements P } /** - * Set the control into Kinematic mode In theis mode, the collision shapes - * follow the movements of the skeleton, and can interact with physical - * environement + * Put the control into Kinematic mode. In this mode, the collision shapes + * follow the movements of the skeleton while interacting with the physics + * environment. */ public void setKinematicMode() { if (mode != Mode.Kinematic) { @@ -810,8 +969,8 @@ public class KinematicRagdollControl extends AbstractPhysicsControl implements P } /** - * Sets the control into Inverse Kinematics mode. The affected bones are affected by IK. - * physics. + * Sets the control into Inverse Kinematics mode. The affected bones are + * affected by IK. physics. */ public void setIKMode() { if (mode != Mode.IK) { @@ -820,18 +979,18 @@ public class KinematicRagdollControl extends AbstractPhysicsControl implements P } /** - * retruns the mode of this control + * returns the mode of this control * - * @return + * @return an enum value */ public Mode getMode() { return mode; } /** - * add a + * Add a collision listener to this control. * - * @param listener + * @param listener (not null, alias created) */ public void addCollisionListener(RagdollCollisionListener listener) { if (listeners == null) { @@ -840,35 +999,66 @@ public class KinematicRagdollControl extends AbstractPhysicsControl implements P listeners.add(listener); } + /** + * Alter the ragdoll's root mass. + * + * @param rootMass the desired mass (≥0) + */ public void setRootMass(float rootMass) { this.rootMass = rootMass; } + /** + * Read the ragdoll's total mass. + * + * @return mass (≥0) + */ public float getTotalMass() { return totalMass; } + /** + * Read the ragdoll's weight threshold. + * + * @return threshold + */ public float getWeightThreshold() { return weightThreshold; } + /** + * Alter the ragdoll's weight threshold. + * + * @param weightThreshold the desired threshold + */ public void setWeightThreshold(float weightThreshold) { this.weightThreshold = weightThreshold; } + /** + * Read the ragdoll's event-dispatch impulse threshold. + * + * @return threshold + */ public float getEventDispatchImpulseThreshold() { return eventDispatchImpulseThreshold; } + /** + * Alter the ragdoll's event-dispatch impulse threshold. + * + * @param eventDispatchImpulseThreshold desired threshold + */ public void setEventDispatchImpulseThreshold(float eventDispatchImpulseThreshold) { this.eventDispatchImpulseThreshold = eventDispatchImpulseThreshold; } /** - * Set the CcdMotionThreshold of all the bone's rigidBodies of the ragdoll + * Alter the CcdMotionThreshold of all rigid bodies in the ragdoll. * * @see PhysicsRigidBody#setCcdMotionThreshold(float) - * @param value + * @param value the desired threshold value (velocity, >0) or zero to + * disable CCD (default=0) */ public void setCcdMotionThreshold(float value) { for (PhysicsBoneLink link : boneLinks.values()) { @@ -877,10 +1067,11 @@ public class KinematicRagdollControl extends AbstractPhysicsControl implements P } /** - * Set the CcdSweptSphereRadius of all the bone's rigidBodies of the ragdoll + * Alter the CcdSweptSphereRadius of all rigid bodies in the ragdoll. * * @see PhysicsRigidBody#setCcdSweptSphereRadius(float) - * @param value + * @param value the desired radius of the sphere used for continuous + * collision detection (≥0) */ public void setCcdSweptSphereRadius(float value) { for (PhysicsBoneLink link : boneLinks.values()) { @@ -889,7 +1080,7 @@ public class KinematicRagdollControl extends AbstractPhysicsControl implements P } /** - * return the rigidBody associated to the given bone + * Access the rigidBody associated with the named bone. * * @param boneName the name of the bone * @return the associated rigidBody. @@ -903,25 +1094,22 @@ public class KinematicRagdollControl extends AbstractPhysicsControl implements P } /** - * For internal use only specific render for the ragdoll(if debugging) + * Render this control. Invoked once per view port per frame, provided the + * control is added to a scene. Should be invoked only by a subclass or by + * the RenderManager. * - * @param rm - * @param vp + * @param rm the render manager (not null) + * @param vp the view port to render (not null) */ @Override public void render(RenderManager rm, ViewPort vp) { } - @Override - public Control cloneForSpatial(Spatial spatial) { - KinematicRagdollControl control = new KinematicRagdollControl(preset, weightThreshold); - control.setMode(mode); - control.setRootMass(rootMass); - control.setWeightThreshold(weightThreshold); - control.setApplyPhysicsLocal(applyLocal); - return control; - } - + /** + * Create a shallow clone for the JME cloner. + * + * @return a new control (not null) + */ @Override public Object jmeClone() { KinematicRagdollControl control = new KinematicRagdollControl(preset, weightThreshold); @@ -933,6 +1121,14 @@ public class KinematicRagdollControl extends AbstractPhysicsControl implements P return control; } + /** + * Add a target for inverse kinematics. + * + * @param bone which bone the IK applies to (not null) + * @param worldPos the world coordinates of the goal (not null) + * @param chainLength number of bones in the chain + * @return a new instance (not null, already added to ikTargets) + */ public Vector3f setIKTarget(Bone bone, Vector3f worldPos, int chainLength) { Vector3f target = worldPos.subtract(targetModel.getWorldTranslation()); ikTargets.put(bone.getName(), target); @@ -951,6 +1147,11 @@ public class KinematicRagdollControl extends AbstractPhysicsControl implements P return target; } + /** + * Remove the inverse-kinematics target for the specified bone. + * + * @param bone which bone has the target (not null, modified) + */ public void removeIKTarget(Bone bone) { int depth = ikChainDepth.remove(bone.getName()); int i = 0; @@ -964,11 +1165,19 @@ public class KinematicRagdollControl extends AbstractPhysicsControl implements P } } + /** + * Remove all inverse-kinematics targets. + */ public void removeAllIKTargets(){ ikTargets.clear(); ikChainDepth.clear(); applyUserControl(); } + + /** + * Ensure that user control is enabled for any bones used by inverse + * kinematics and disabled for any other bones. + */ public void applyUserControl() { for (Bone bone : skeleton.getRoots()) { RagdollUtils.setUserControl(bone, false); @@ -995,39 +1204,77 @@ public class KinematicRagdollControl extends AbstractPhysicsControl implements P vars.release(); } } + + /** + * Read the rotation speed for inverse kinematics. + * + * @return speed (≥0) + */ public float getIkRotSpeed() { return ikRotSpeed; } + /** + * Alter the rotation speed for inverse kinematics. + * + * @param ikRotSpeed the desired speed (≥0, default=7) + */ public void setIkRotSpeed(float ikRotSpeed) { this.ikRotSpeed = ikRotSpeed; } + /** + * Read the distance threshold for inverse kinematics. + * + * @return distance threshold + */ public float getIKThreshold() { return IKThreshold; } + /** + * Alter the distance threshold for inverse kinematics. + * + * @param IKThreshold the desired distance threshold (default=0.1) + */ public void setIKThreshold(float IKThreshold) { this.IKThreshold = IKThreshold; } - + /** + * Read the limb damping. + * + * @return the viscous damping ratio (0→no damping, 1→critically + * damped) + */ public float getLimbDampening() { return limbDampening; } + /** + * Alter the limb damping. + * + * @param limbDampening the desired viscous damping ratio (0→no + * damping, 1→critically damped, default=0.6) + */ public void setLimbDampening(float limbDampening) { this.limbDampening = limbDampening; } + /** + * Access the named bone. + * + * @param name which bone to access + * @return the pre-existing instance, or null if not found + */ public Bone getBone(String name){ return skeleton.getBone(name); } /** - * serialize this control + * Serialize this control, for example when saving to a J3O file. * - * @param ex - * @throws IOException + * @param ex exporter (not null) + * @throws IOException from exporter */ @Override public void write(JmeExporter ex) throws IOException { @@ -1054,10 +1301,10 @@ public class KinematicRagdollControl extends AbstractPhysicsControl implements P } /** - * de-serialize this control + * De-serialize this control, for example when loading from a J3O file. * - * @param im - * @throws IOException + * @param im importer (not null) + * @throws IOException from importer */ @Override public void read(JmeImporter im) throws IOException { diff --git a/jme3-bullet/src/common/java/com/jme3/bullet/control/PhysicsControl.java b/jme3-bullet/src/common/java/com/jme3/bullet/control/PhysicsControl.java index 693c15590..1c81a7ff7 100644 --- a/jme3-bullet/src/common/java/com/jme3/bullet/control/PhysicsControl.java +++ b/jme3-bullet/src/common/java/com/jme3/bullet/control/PhysicsControl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -35,31 +35,47 @@ import com.jme3.bullet.PhysicsSpace; import com.jme3.scene.control.Control; /** + * An interface for a scene-graph control that links a physics object to a + * Spatial. + *

+ * This interface is shared between JBullet and Native Bullet. * * @author normenhansen */ public interface PhysicsControl extends Control { /** - * Only used internally, do not call. - * @param space + * If enabled, add this control's physics object to the specified physics + * space. In not enabled, alter where the object would be added. The object + * is removed from any other space it's currently in. + * + * @param space where to add, or null to simply remove */ public void setPhysicsSpace(PhysicsSpace space); + /** + * Access the physics space to which the object is (or would be) added. + * + * @return the pre-existing space, or null for none + */ public PhysicsSpace getPhysicsSpace(); /** - * The physics object is removed from the physics space when the control - * is disabled. When the control is enabled again the physics object is - * moved to the current location of the spatial and then added to the physics - * space. This allows disabling/enabling physics to move the spatial freely. - * @param state + * Enable or disable this control. + *

+ * The physics object is removed from its physics space when the control is + * disabled. When the control is enabled again, the physics object is moved + * to the current location of the spatial and then added to the physics + * space. + * + * @param state true→enable the control, false→disable it */ public void setEnabled(boolean state); /** - * Returns the current enabled state of the physics control - * @return current enabled state + * Test whether this control is enabled. + * + * @return true if enabled, otherwise false */ public boolean isEnabled(); } diff --git a/jme3-bullet/src/common/java/com/jme3/bullet/control/RigidBodyControl.java b/jme3-bullet/src/common/java/com/jme3/bullet/control/RigidBodyControl.java index f2002be02..4094ab4db 100644 --- a/jme3-bullet/src/common/java/com/jme3/bullet/control/RigidBodyControl.java +++ b/jme3-bullet/src/common/java/com/jme3/bullet/control/RigidBodyControl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -53,72 +53,94 @@ import com.jme3.scene.shape.Box; import com.jme3.scene.shape.Sphere; import com.jme3.util.clone.Cloner; import com.jme3.util.clone.JmeCloneable; - import java.io.IOException; /** + * A physics control to link a PhysicsRigidBody to a spatial. + *

+ * This class is shared between JBullet and Native Bullet. * * @author normenhansen */ public class RigidBodyControl extends PhysicsRigidBody implements PhysicsControl, JmeCloneable { + /** + * spatial to which this control is added, or null if none + */ protected Spatial spatial; + /** + * true→control is enabled, false→control is disabled + */ protected boolean enabled = true; + /** + * true→body is added to the physics space, false→not added + */ protected boolean added = false; + /** + * space to which the body is (or would be) added + */ protected PhysicsSpace space = null; + /** + * true→body is kinematic, false→body is static or dynamic + */ protected boolean kinematicSpatial = true; + /** + * No-argument constructor needed by SavableClassUtil. Do not invoke + * directly! + */ public RigidBodyControl() { } /** - * When using this constructor, the CollisionShape for the RigidBody is generated - * automatically when the Control is added to a Spatial. - * @param mass When not 0, a HullCollisionShape is generated, otherwise a MeshCollisionShape is used. For geometries with box or sphere meshes the proper box or sphere collision shape is used. + * When using this constructor, the CollisionShape for the RigidBody is + * generated automatically when the control is added to a spatial. + * + * @param mass When not 0, a HullCollisionShape is generated, otherwise a + * MeshCollisionShape is used. For geometries with box or sphere meshes the + * proper box or sphere collision shape is used. */ public RigidBodyControl(float mass) { this.mass = mass; } /** - * Creates a new PhysicsNode with the supplied collision shape and mass 1 - * @param shape + * Instantiate an enabled control with mass=1 and the specified collision + * shape. + * + * @param shape the desired shape (not null, alias created) */ public RigidBodyControl(CollisionShape shape) { super(shape); } + /** + * Instantiate an enabled control with the specified collision shape and + * mass. + * + * @param shape the desired shape (not null, alias created) + * @param mass the desired mass (≥0) + */ public RigidBodyControl(CollisionShape shape, float mass) { super(shape, mass); } + /** + * Clone this control for a different spatial. No longer used as of JME 3.1. + * + * @param spatial the spatial for the clone to control (or null) + * @return a new control (not null) + */ @Override public Control cloneForSpatial(Spatial spatial) { - RigidBodyControl control = new RigidBodyControl(collisionShape, mass); - control.setAngularFactor(getAngularFactor()); - control.setAngularSleepingThreshold(getAngularSleepingThreshold()); - control.setCcdMotionThreshold(getCcdMotionThreshold()); - control.setCcdSweptSphereRadius(getCcdSweptSphereRadius()); - control.setCollideWithGroups(getCollideWithGroups()); - control.setCollisionGroup(getCollisionGroup()); - control.setDamping(getLinearDamping(), getAngularDamping()); - control.setFriction(getFriction()); - control.setGravity(getGravity()); - control.setKinematic(isKinematic()); - control.setKinematicSpatial(isKinematicSpatial()); - control.setLinearSleepingThreshold(getLinearSleepingThreshold()); - control.setPhysicsLocation(getPhysicsLocation(null)); - control.setPhysicsRotation(getPhysicsRotationMatrix(null)); - control.setRestitution(getRestitution()); - - if (mass > 0) { - control.setAngularVelocity(getAngularVelocity()); - control.setLinearVelocity(getLinearVelocity()); - } - control.setApplyPhysicsLocal(isApplyPhysicsLocal()); - return control; + throw new UnsupportedOperationException(); } + /** + * Create a shallow clone for the JME cloner. + * + * @return a new control (not null) + */ @Override public Object jmeClone() { RigidBodyControl control = new RigidBodyControl(collisionShape, mass); @@ -128,6 +150,7 @@ public class RigidBodyControl extends PhysicsRigidBody implements PhysicsControl control.setCcdSweptSphereRadius(getCcdSweptSphereRadius()); control.setCollideWithGroups(getCollideWithGroups()); control.setCollisionGroup(getCollisionGroup()); + control.setContactResponse(isContactResponse()); control.setDamping(getLinearDamping(), getAngularDamping()); control.setFriction(getFriction()); control.setGravity(getGravity()); @@ -149,11 +172,27 @@ public class RigidBodyControl extends PhysicsRigidBody implements PhysicsControl return control; } + /** + * Callback from {@link com.jme3.util.clone.Cloner} to convert this + * shallow-cloned control into a deep-cloned one, using the specified cloner + * and original to resolve copied fields. + * + * @param cloner the cloner that's cloning this control (not null) + * @param original the control from which this control was shallow-cloned + * (unused) + */ @Override public void cloneFields( Cloner cloner, Object original ) { this.spatial = cloner.clone(spatial); } + /** + * Alter which spatial is controlled. Invoked when the control is added to + * or removed from a spatial. Should be invoked only by a subclass or from + * Spatial. Do not invoke directly from user code. + * + * @param spatial the spatial to control (or null) + */ public void setSpatial(Spatial spatial) { this.spatial = spatial; setUserObject(spatial); @@ -168,6 +207,10 @@ public class RigidBodyControl extends PhysicsRigidBody implements PhysicsControl setPhysicsRotation(getSpatialRotation()); } + /** + * Set the collision shape based on the controlled spatial and its + * descendents. + */ protected void createCollisionShape() { if (spatial == null) { return; @@ -190,6 +233,15 @@ public class RigidBodyControl extends PhysicsRigidBody implements PhysicsControl } } + /** + * Enable or disable this control. + *

+ * When the control is disabled, the body is removed from physics space. + * When the control is enabled again, the body is moved to the current + * location of the spatial and then added to the physics space. + * + * @param enabled true→enable the control, false→disable it + */ public void setEnabled(boolean enabled) { this.enabled = enabled; if (space != null) { @@ -207,40 +259,62 @@ public class RigidBodyControl extends PhysicsRigidBody implements PhysicsControl } } + /** + * Test whether this control is enabled. + * + * @return true if enabled, otherwise false + */ public boolean isEnabled() { return enabled; } /** - * Checks if this control is in kinematic spatial mode. - * @return true if the spatial location is applied to this kinematic rigidbody + * Test whether this control is in kinematic mode. + * + * @return true if the spatial location and rotation are applied to the + * rigid body, otherwise false */ public boolean isKinematicSpatial() { return kinematicSpatial; } /** - * Sets this control to kinematic spatial mode so that the spatials transform will - * be applied to the rigidbody in kinematic mode, defaults to true. - * @param kinematicSpatial + * Enable or disable kinematic mode. In kinematic mode, the spatial's + * location and rotation will be applied to the rigid body. + * + * @param kinematicSpatial true→kinematic, false→dynamic or static */ public void setKinematicSpatial(boolean kinematicSpatial) { this.kinematicSpatial = kinematicSpatial; } + /** + * Test whether physics-space coordinates should match the spatial's local + * coordinates. + * + * @return true if matching local coordinates, false if matching world + * coordinates + */ public boolean isApplyPhysicsLocal() { return motionState.isApplyPhysicsLocal(); } /** - * When set to true, the physics coordinates will be applied to the local - * translation of the Spatial instead of the world translation. - * @param applyPhysicsLocal + * Alter whether physics-space coordinates should match the spatial's local + * coordinates. + * + * @param applyPhysicsLocal true→match local coordinates, + * false→match world coordinates (default=false) */ public void setApplyPhysicsLocal(boolean applyPhysicsLocal) { motionState.setApplyPhysicsLocal(applyPhysicsLocal); } + /** + * Access whichever spatial translation corresponds to the physics location. + * + * @return the pre-existing vector (not null) + */ private Vector3f getSpatialTranslation(){ if(motionState.isApplyPhysicsLocal()){ return spatial.getLocalTranslation(); @@ -248,6 +322,11 @@ public class RigidBodyControl extends PhysicsRigidBody implements PhysicsControl return spatial.getWorldTranslation(); } + /** + * Access whichever spatial rotation corresponds to the physics rotation. + * + * @return the pre-existing quaternion (not null) + */ private Quaternion getSpatialRotation(){ if(motionState.isApplyPhysicsLocal()){ return spatial.getLocalRotation(); @@ -255,6 +334,12 @@ public class RigidBodyControl extends PhysicsRigidBody implements PhysicsControl return spatial.getWorldRotation(); } + /** + * Update this control. Invoked once per frame, during the logical-state + * update, provided the control is added to a scene. + * + * @param tpf the time interval between frames (in seconds, ≥0) + */ public void update(float tpf) { if (enabled && spatial != null) { if (isKinematic() && kinematicSpatial) { @@ -266,30 +351,59 @@ public class RigidBodyControl extends PhysicsRigidBody implements PhysicsControl } } + /** + * Render this control. Invoked once per view port per frame, provided the + * control is added to a scene. Should be invoked only by a subclass or by + * the RenderManager. + * + * @param rm the render manager (not null) + * @param vp the view port to render (not null) + */ public void render(RenderManager rm, ViewPort vp) { } - public void setPhysicsSpace(PhysicsSpace space) { - if (space == null) { - if (this.space != null) { - this.space.removeCollisionObject(this); - added = false; - } - } else { - if (this.space == space) return; - // if this object isn't enabled, it will be added when it will be enabled. - if (isEnabled()) { - space.addCollisionObject(this); - added = true; - } + /** + * If enabled, add this control's body to the specified physics space. In + * not enabled, alter where the body would be added. The body is removed + * from any other space it's currently in. + * + * @param newSpace where to add, or null to simply remove + */ + @Override + public void setPhysicsSpace(PhysicsSpace newSpace) { + if (space == newSpace) { + return; + } + if (added) { + space.removeCollisionObject(this); + added = false; } - this.space = space; + if (newSpace != null && isEnabled()) { + newSpace.addCollisionObject(this); + added = true; + } + /* + * If this control isn't enabled, its body will be + * added to the new space when the control becomes enabled. + */ + space = newSpace; } + /** + * Access the physics space to which the body is (or would be) added. + * + * @return the pre-existing space, or null for none + */ public PhysicsSpace getPhysicsSpace() { return space; } + /** + * Serialize this control, for example when saving to a J3O file. + * + * @param ex exporter (not null) + * @throws IOException from exporter + */ @Override public void write(JmeExporter ex) throws IOException { super.write(ex); @@ -300,6 +414,12 @@ public class RigidBodyControl extends PhysicsRigidBody implements PhysicsControl oc.write(spatial, "spatial", null); } + /** + * De-serialize this control, for example when loading from a J3O file. + * + * @param im importer (not null) + * @throws IOException from importer + */ @Override public void read(JmeImporter im) throws IOException { super.read(im); @@ -310,4 +430,4 @@ public class RigidBodyControl extends PhysicsRigidBody implements PhysicsControl motionState.setApplyPhysicsLocal(ic.readBoolean("applyLocalPhysics", false)); setUserObject(spatial); } -} +} \ No newline at end of file diff --git a/jme3-bullet/src/common/java/com/jme3/bullet/control/VehicleControl.java b/jme3-bullet/src/common/java/com/jme3/bullet/control/VehicleControl.java index 5f6af8175..51210c6a7 100644 --- a/jme3-bullet/src/common/java/com/jme3/bullet/control/VehicleControl.java +++ b/jme3-bullet/src/common/java/com/jme3/bullet/control/VehicleControl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -43,7 +43,6 @@ import com.jme3.math.Quaternion; import com.jme3.math.Vector3f; import com.jme3.renderer.RenderManager; import com.jme3.renderer.ViewPort; -import com.jme3.scene.Node; import com.jme3.scene.Spatial; import com.jme3.scene.control.Control; import com.jme3.util.clone.Cloner; @@ -52,39 +51,75 @@ import java.io.IOException; import java.util.Iterator; /** + * A physics control to link a PhysicsVehicle to a spatial. + *

+ * This class is shared between JBullet and Native Bullet. * * @author normenhansen */ public class VehicleControl extends PhysicsVehicle implements PhysicsControl, JmeCloneable { + /** + * spatial to which this control is added, or null if none + */ protected Spatial spatial; + /** + * true→control is enabled, false→control is disabled + */ protected boolean enabled = true; + /** + * space to which the vehicle is (or would be) added + */ protected PhysicsSpace space = null; + /** + * true→vehicle is added to the physics space, false→not added + */ protected boolean added = false; + /** + * No-argument constructor needed by SavableClassUtil. Do not invoke + * directly! + */ public VehicleControl() { } /** - * Creates a new PhysicsNode with the supplied collision shape - * @param shape + * Instantiate an enabled control with mass=1 and the specified collision + * shape. + * + * @param shape the desired shape (not null, alias created) */ public VehicleControl(CollisionShape shape) { super(shape); } + /** + * Instantiate an enabled with the specified collision shape and mass. + * + * @param shape the desired shape (not null, alias created) + * @param mass (>0) + */ public VehicleControl(CollisionShape shape, float mass) { super(shape, mass); } + /** + * Test whether physics-space coordinates should match the spatial's local + * coordinates. + * + * @return true if matching local coordinates, false if matching world + * coordinates + */ public boolean isApplyPhysicsLocal() { return motionState.isApplyPhysicsLocal(); } /** - * When set to true, the physics coordinates will be applied to the local - * translation of the Spatial - * @param applyPhysicsLocal + * Alter whether physics-space coordinates should match the spatial's local + * coordinates. + * + * @param applyPhysicsLocal true→match local coordinates, + * false→match world coordinates (default=false) */ public void setApplyPhysicsLocal(boolean applyPhysicsLocal) { motionState.setApplyPhysicsLocal(applyPhysicsLocal); @@ -108,57 +143,22 @@ public class VehicleControl extends PhysicsVehicle implements PhysicsControl, Jm return spatial.getWorldRotation(); } + /** + * Clone this control for a different spatial. No longer used as of JME 3.1. + * + * @param spatial the spatial for the clone to control (or null) + * @return a new control (not null) + */ @Override public Control cloneForSpatial(Spatial spatial) { - VehicleControl control = new VehicleControl(collisionShape, mass); - control.setAngularFactor(getAngularFactor()); - control.setAngularSleepingThreshold(getAngularSleepingThreshold()); - control.setAngularVelocity(getAngularVelocity()); - control.setCcdMotionThreshold(getCcdMotionThreshold()); - control.setCcdSweptSphereRadius(getCcdSweptSphereRadius()); - control.setCollideWithGroups(getCollideWithGroups()); - control.setCollisionGroup(getCollisionGroup()); - control.setDamping(getLinearDamping(), getAngularDamping()); - control.setFriction(getFriction()); - control.setGravity(getGravity()); - control.setKinematic(isKinematic()); - control.setLinearSleepingThreshold(getLinearSleepingThreshold()); - control.setLinearVelocity(getLinearVelocity()); - control.setPhysicsLocation(getPhysicsLocation()); - control.setPhysicsRotation(getPhysicsRotationMatrix()); - control.setRestitution(getRestitution()); - - control.setFrictionSlip(getFrictionSlip()); - control.setMaxSuspensionTravelCm(getMaxSuspensionTravelCm()); - control.setSuspensionStiffness(getSuspensionStiffness()); - control.setSuspensionCompression(tuning.suspensionCompression); - control.setSuspensionDamping(tuning.suspensionDamping); - control.setMaxSuspensionForce(getMaxSuspensionForce()); - - for (Iterator it = wheels.iterator(); it.hasNext();) { - VehicleWheel wheel = it.next(); - VehicleWheel newWheel = control.addWheel(wheel.getLocation(), wheel.getDirection(), wheel.getAxle(), wheel.getRestLength(), wheel.getRadius(), wheel.isFrontWheel()); - newWheel.setFrictionSlip(wheel.getFrictionSlip()); - newWheel.setMaxSuspensionTravelCm(wheel.getMaxSuspensionTravelCm()); - newWheel.setSuspensionStiffness(wheel.getSuspensionStiffness()); - newWheel.setWheelsDampingCompression(wheel.getWheelsDampingCompression()); - newWheel.setWheelsDampingRelaxation(wheel.getWheelsDampingRelaxation()); - newWheel.setMaxSuspensionForce(wheel.getMaxSuspensionForce()); - - //TODO: bad way finding children! - if (spatial instanceof Node) { - Node node = (Node) spatial; - Spatial wheelSpat = node.getChild(wheel.getWheelSpatial().getName()); - if (wheelSpat != null) { - newWheel.setWheelSpatial(wheelSpat); - } - } - } - control.setApplyPhysicsLocal(isApplyPhysicsLocal()); - return control; + throw new UnsupportedOperationException(); } - @Override + /** + * Create a shallow clone for the JME cloner. + * + * @return a new control (not null) + */ public Object jmeClone() { VehicleControl control = new VehicleControl(collisionShape, mass); control.setAngularFactor(getAngularFactor()); @@ -168,6 +168,7 @@ public class VehicleControl extends PhysicsVehicle implements PhysicsControl, Jm control.setCcdSweptSphereRadius(getCcdSweptSphereRadius()); control.setCollideWithGroups(getCollideWithGroups()); control.setCollisionGroup(getCollisionGroup()); + control.setContactResponse(isContactResponse()); control.setDamping(getLinearDamping(), getAngularDamping()); control.setFriction(getFriction()); control.setGravity(getGravity()); @@ -206,6 +207,15 @@ public class VehicleControl extends PhysicsVehicle implements PhysicsControl, Jm return control; } + /** + * Callback from {@link com.jme3.util.clone.Cloner} to convert this + * shallow-cloned control into a deep-cloned one, using the specified cloner + * and original to resolve copied fields. + * + * @param cloner the cloner that's cloning this control (not null) + * @param original the control from which this control was shallow-cloned + * (unused) + */ @Override public void cloneFields( Cloner cloner, Object original ) { this.spatial = cloner.clone(spatial); @@ -216,6 +226,11 @@ public class VehicleControl extends PhysicsVehicle implements PhysicsControl, Jm } } + /** + * Alter which spatial is controlled. + * + * @param spatial spatial to control (or null) + */ public void setSpatial(Spatial spatial) { this.spatial = spatial; setUserObject(spatial); @@ -226,6 +241,15 @@ public class VehicleControl extends PhysicsVehicle implements PhysicsControl, Jm setPhysicsRotation(getSpatialRotation()); } + /** + * Enable or disable this control. + *

+ * When the control is disabled, the vehicle is removed from physics space. + * When the control is enabled again, the physics object is moved to the + * spatial's location and then added to the physics space. + * + * @param enabled true→enable the control, false→disable it + */ public void setEnabled(boolean enabled) { this.enabled = enabled; if (space != null) { @@ -243,10 +267,21 @@ public class VehicleControl extends PhysicsVehicle implements PhysicsControl, Jm } } + /** + * Test whether this control is enabled. + * + * @return true if enabled, otherwise false + */ public boolean isEnabled() { return enabled; } + /** + * Update this control. Invoked once per frame, during the logical-state + * update, provided the control is added to a scene. + * + * @param tpf the time interval between frames (in seconds, ≥0) + */ public void update(float tpf) { if (enabled && spatial != null) { if (getMotionState().applyTransform(spatial)) { @@ -258,31 +293,59 @@ public class VehicleControl extends PhysicsVehicle implements PhysicsControl, Jm } } + /** + * Render this control. Invoked once per view port per frame, provided the + * control is added to a scene. Should be invoked only by a subclass or by + * the RenderManager. + * + * @param rm the render manager (not null) + * @param vp the view port to render (not null) + */ public void render(RenderManager rm, ViewPort vp) { } - public void setPhysicsSpace(PhysicsSpace space) { - createVehicle(space); - if (space == null) { - if (this.space != null) { - this.space.removeCollisionObject(this); - added = false; - } - } else { - if(this.space == space) return; - // if this object isn't enabled, it will be added when it will be enabled. - if (isEnabled()) { - space.addCollisionObject(this); - added = true; - } + /** + * If enabled, add this control's physics object to the specified physics + * space. In not enabled, alter where the object would be added. The object + * is removed from any other space it's currently in. + * + * @param newSpace where to add, or null to simply remove + */ + @Override + public void setPhysicsSpace(PhysicsSpace newSpace) { + if (space == newSpace) { + return; } - this.space = space; + if (added) { + space.removeCollisionObject(this); + added = false; + } + if (newSpace != null && isEnabled()) { + newSpace.addCollisionObject(this); + added = true; + } + /* + * If this control isn't enabled, its physics object will be + * added to the new space when the control becomes enabled. + */ + space = newSpace; } + /** + * Access the physics space to which the vehicle is (or would be) added. + * + * @return the pre-existing space, or null for none + */ public PhysicsSpace getPhysicsSpace() { return space; } + /** + * Serialize this control, for example when saving to a J3O file. + * + * @param ex exporter (not null) + * @throws IOException from exporter + */ @Override public void write(JmeExporter ex) throws IOException { super.write(ex); @@ -292,6 +355,12 @@ public class VehicleControl extends PhysicsVehicle implements PhysicsControl, Jm oc.write(spatial, "spatial", null); } + /** + * De-serialize this control, for example when loading from a J3O file. + * + * @param im importer (not null) + * @throws IOException from importer + */ @Override public void read(JmeImporter im) throws IOException { super.read(im); @@ -301,4 +370,4 @@ public class VehicleControl extends PhysicsVehicle implements PhysicsControl, Jm motionState.setApplyPhysicsLocal(ic.readBoolean("applyLocalPhysics", false)); setUserObject(spatial); } -} +} \ No newline at end of file diff --git a/jme3-bullet/src/common/java/com/jme3/bullet/control/ragdoll/HumanoidRagdollPreset.java b/jme3-bullet/src/common/java/com/jme3/bullet/control/ragdoll/HumanoidRagdollPreset.java index cd9829e61..68696090e 100644 --- a/jme3-bullet/src/common/java/com/jme3/bullet/control/ragdoll/HumanoidRagdollPreset.java +++ b/jme3-bullet/src/common/java/com/jme3/bullet/control/ragdoll/HumanoidRagdollPreset.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -34,11 +34,17 @@ package com.jme3.bullet.control.ragdoll; import com.jme3.math.FastMath; /** + * Example ragdoll presets for a typical humanoid skeleton. + *

+ * This class is shared between JBullet and Native Bullet. * * @author Nehon */ public class HumanoidRagdollPreset extends RagdollPreset { + /** + * Initialize the map from bone names to joint presets. + */ @Override protected void initBoneMap() { boneMap.put("head", new JointPreset(FastMath.QUARTER_PI, -FastMath.QUARTER_PI, FastMath.QUARTER_PI, -FastMath.QUARTER_PI, FastMath.QUARTER_PI, -FastMath.QUARTER_PI)); @@ -59,6 +65,9 @@ public class HumanoidRagdollPreset extends RagdollPreset { } + /** + * Initialize the lexicon. + */ @Override protected void initLexicon() { LexiconEntry entry = new LexiconEntry(); diff --git a/jme3-bullet/src/common/java/com/jme3/bullet/control/ragdoll/RagdollPreset.java b/jme3-bullet/src/common/java/com/jme3/bullet/control/ragdoll/RagdollPreset.java index ab0b3ef1a..637011c95 100644 --- a/jme3-bullet/src/common/java/com/jme3/bullet/control/ragdoll/RagdollPreset.java +++ b/jme3-bullet/src/common/java/com/jme3/bullet/control/ragdoll/RagdollPreset.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -43,14 +43,35 @@ import java.util.logging.Logger; */ public abstract class RagdollPreset { + /** + * message logger for this class + */ protected static final Logger logger = Logger.getLogger(RagdollPreset.class.getName()); + /** + * map bone names to joint presets + */ protected Map boneMap = new HashMap(); + /** + * lexicon to map bone names to entries + */ protected Map lexicon = new HashMap(); + /** + * Initialize the map from bone names to joint presets. + */ protected abstract void initBoneMap(); + /** + * Initialize the lexicon. + */ protected abstract void initLexicon(); + /** + * Apply the preset for the named bone to the specified joint. + * + * @param boneName name + * @param joint where to apply the preset (not null, modified) + */ public void setupJointForBone(String boneName, SixDofJoint joint) { if (boneMap.isEmpty()) { @@ -87,14 +108,30 @@ public abstract class RagdollPreset { } + /** + * Range of motion for a joint. + */ protected class JointPreset { private float maxX, minX, maxY, minY, maxZ, minZ; + /** + * Instantiate a preset with no motion allowed. + */ public JointPreset() { } public JointPreset(float maxX, float minX, float maxY, float minY, float maxZ, float minZ) { + /** + * Instantiate a preset with the specified range of motion. + * + * @param maxX the maximum rotation on the X axis (in radians) + * @param minX the minimum rotation on the X axis (in radians) + * @param maxY the maximum rotation on the Y axis (in radians) + * @param minY the minimum rotation on the Y axis (in radians) + * @param maxZ the maximum rotation on the Z axis (in radians) + * @param minZ the minimum rotation on the Z axis (in radians) + */ this.maxX = maxX; this.minX = minX; this.maxY = maxY; @@ -103,6 +140,11 @@ public abstract class RagdollPreset { this.minZ = minZ; } + /** + * Apply this preset to the specified joint. + * + * @param joint where to apply (not null, modified) + */ public void setupJoint(SixDofJoint joint) { joint.getRotationalLimitMotor(0).setHiLimit(maxX); joint.getRotationalLimitMotor(0).setLoLimit(minX); @@ -113,13 +155,28 @@ public abstract class RagdollPreset { } } + /** + * One entry in a bone lexicon. + */ protected class LexiconEntry extends HashMap { + /** + * Add a synonym with the specified score. + * + * @param word a substring that might occur in a bone name (not null) + * @param score larger value means more likely to correspond + */ public void addSynonym(String word, int score) { put(word.toLowerCase(), score); } public int getScore(String word) { + /** + * Calculate a total score for the specified bone name. + * + * @param name the name of a bone (not null) + * @return total score: larger value means more likely to correspond + */ int score = 0; String searchWord = word.toLowerCase(); for (String key : this.keySet()) { diff --git a/jme3-bullet/src/common/java/com/jme3/bullet/control/ragdoll/RagdollUtils.java b/jme3-bullet/src/common/java/com/jme3/bullet/control/ragdoll/RagdollUtils.java index bd162c9d2..419c337bc 100644 --- a/jme3-bullet/src/common/java/com/jme3/bullet/control/ragdoll/RagdollUtils.java +++ b/jme3-bullet/src/common/java/com/jme3/bullet/control/ragdoll/RagdollUtils.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -33,14 +33,13 @@ package com.jme3.bullet.control.ragdoll; import com.jme3.animation.Bone; import com.jme3.animation.Skeleton; +import com.jme3.animation.SkeletonControl; import com.jme3.bullet.collision.shapes.HullCollisionShape; import com.jme3.bullet.joints.SixDofJoint; import com.jme3.math.Quaternion; import com.jme3.math.Transform; import com.jme3.math.Vector3f; -import com.jme3.scene.Geometry; import com.jme3.scene.Mesh; -import com.jme3.scene.Node; import com.jme3.scene.Spatial; import com.jme3.scene.VertexBuffer.Type; import java.nio.ByteBuffer; @@ -48,11 +47,31 @@ import java.nio.FloatBuffer; import java.util.*; /** + * Utility methods used by KinematicRagdollControl. + *

+ * This class is shared between JBullet and Native Bullet. * * @author Nehon */ public class RagdollUtils { + /** + * A private constructor to inhibit instantiation of this class. + */ + private RagdollUtils() { + } + + /** + * Alter the limits of the specified 6-DOF joint. + * + * @param joint which joint to alter (not null) + * @param maxX the maximum rotation on the X axis (in radians) + * @param minX the minimum rotation on the X axis (in radians) + * @param maxY the maximum rotation on the Y axis (in radians) + * @param minY the minimum rotation on the Y axis (in radians) + * @param maxZ the maximum rotation on the Z axis (in radians) + * @param minZ the minimum rotation on the Z axis (in radians) + */ public static void setJointLimit(SixDofJoint joint, float maxX, float minX, float maxY, float minY, float maxZ, float minZ) { joint.getRotationalLimitMotor(0).setHiLimit(maxX); @@ -63,22 +82,21 @@ public class RagdollUtils { joint.getRotationalLimitMotor(2).setLoLimit(minZ); } + /** + * Build a map of mesh vertices in a subtree of the scene graph. + * + * @param model the root of the subtree (may be null) + * @return a new map (not null) + */ public static Map> buildPointMap(Spatial model) { + Map> map = new HashMap<>(); - - Map> map = new HashMap>(); - if (model instanceof Geometry) { - Geometry g = (Geometry) model; - buildPointMapForMesh(g.getMesh(), map); - } else if (model instanceof Node) { - Node node = (Node) model; - for (Spatial s : node.getChildren()) { - if (s instanceof Geometry) { - Geometry g = (Geometry) s; - buildPointMapForMesh(g.getMesh(), map); - } - } + SkeletonControl skeletonCtrl = model.getControl(SkeletonControl.class); + Mesh[] targetMeshes = skeletonCtrl.getTargets(); + for (Mesh mesh : targetMeshes) { + buildPointMapForMesh(mesh, map); } + return map; } @@ -122,14 +140,15 @@ public class RagdollUtils { } /** - * Create a hull collision shape from linked vertices to this bone. - * Vertices have to be previoulsly gathered in a map using buildPointMap method - * - * @param pointsMap - * @param boneIndices - * @param initialScale - * @param initialPosition - * @return + * Create a hull collision shape from linked vertices to this bone. Vertices + * must have previously been gathered using buildPointMap(). + * + * @param pointsMap map from bone indices to coordinates (not null, + * unaffected) + * @param boneIndices (not null, unaffected) + * @param initialScale scale factors (not null, unaffected) + * @param initialPosition location (not null, unaffected) + * @return a new shape (not null) */ public static HullCollisionShape makeShapeFromPointMap(Map> pointsMap, List boneIndices, Vector3f initialScale, Vector3f initialPosition) { @@ -151,16 +170,24 @@ public class RagdollUtils { } } + assert !points.isEmpty(); float[] p = new float[points.size()]; for (int i = 0; i < points.size(); i++) { p[i] = points.get(i); } - return new HullCollisionShape(p); } - //retruns the list of bone indices of the given bone and its child(if they are not in the boneList) + /** + * Enumerate the bone indices of the specified bone and all its descendents. + * + * @param bone the input bone (not null) + * @param skeleton the skeleton containing the bone (not null) + * @param boneList a set of bone names (not null, unaffected) + * + * @return a new list (not null) + */ public static List getBoneIndices(Bone bone, Skeleton skeleton, Set boneList) { List list = new LinkedList(); if (boneList.isEmpty()) { @@ -178,50 +205,51 @@ public class RagdollUtils { /** * Create a hull collision shape from linked vertices to this bone. - * - * @param model - * @param boneIndices - * @param initialScale - * @param initialPosition - * @param weightThreshold - * @return + * + * @param model the model on which to base the shape + * @param boneIndices indices of relevant bones (not null, unaffected) + * @param initialScale scale factors + * @param initialPosition location + * @param weightThreshold minimum weight for inclusion + * @return a new shape */ - public static HullCollisionShape makeShapeFromVerticeWeights(Spatial model, List boneIndices, Vector3f initialScale, Vector3f initialPosition, float weightThreshold) { - - ArrayList points = new ArrayList(); - if (model instanceof Geometry) { - Geometry g = (Geometry) model; + public static HullCollisionShape makeShapeFromVerticeWeights(Spatial model, + List boneIndices, Vector3f initialScale, + Vector3f initialPosition, float weightThreshold) { + List points = new ArrayList<>(100); + + SkeletonControl skeletonCtrl = model.getControl(SkeletonControl.class); + Mesh[] targetMeshes = skeletonCtrl.getTargets(); + for (Mesh mesh : targetMeshes) { for (Integer index : boneIndices) { - points.addAll(getPoints(g.getMesh(), index, initialScale, initialPosition, weightThreshold)); - } - } else if (model instanceof Node) { - Node node = (Node) model; - for (Spatial s : node.getChildren()) { - if (s instanceof Geometry) { - Geometry g = (Geometry) s; - for (Integer index : boneIndices) { - points.addAll(getPoints(g.getMesh(), index, initialScale, initialPosition, weightThreshold)); - } - - } + List bonePoints = getPoints(mesh, index, initialScale, + initialPosition, weightThreshold); + points.addAll(bonePoints); } } + + assert !points.isEmpty(); float[] p = new float[points.size()]; for (int i = 0; i < points.size(); i++) { p[i] = points.get(i); } - return new HullCollisionShape(p); } /** - * returns a list of points for the given bone - * @param mesh - * @param boneIndex - * @param offset - * @param link - * @return + * Enumerate vertices that meet the weight threshold for the indexed bone. + * + * @param mesh the mesh to analyze (not null) + * @param boneIndex the index of the bone (≥0) + * @param initialScale a scale applied to vertex positions (not null, + * unaffected) + * @param offset an offset subtracted from vertex positions (not null, + * unaffected) + * @param weightThreshold the minimum bone weight for inclusion in the + * result (≥0, ≤1) + * @return a new list of vertex coordinates (not null, length a multiple of + * 3) */ private static List getPoints(Mesh mesh, int boneIndex, Vector3f initialScale, Vector3f offset, float weightThreshold) { @@ -265,12 +293,16 @@ public class RagdollUtils { } /** - * Updates a bone position and rotation. - * if the child bones are not in the bone list this means, they are not associated with a physic shape. - * So they have to be updated + * Updates a bone position and rotation. if the child bones are not in the + * bone list this means, they are not associated with a physics shape. So + * they have to be updated + * * @param bone the bone * @param pos the position * @param rot the rotation + * @param restoreBoneControl true → user-control flag should be set + * @param boneList the names of all bones without collision shapes (not + * null, unaffected) */ public static void setTransform(Bone bone, Vector3f pos, Quaternion rot, boolean restoreBoneControl, Set boneList) { //we ensure that we have the control @@ -292,10 +324,51 @@ public class RagdollUtils { } } + /** + * Alter the user-control flags of a bone and all its descendents. + * + * @param bone the ancestor bone (not null, modified) + * @param bool true to enable user control, false to disable + */ public static void setUserControl(Bone bone, boolean bool) { bone.setUserControl(bool); for (Bone child : bone.getChildren()) { setUserControl(child, bool); } } + + /** + * Test whether the indexed bone has at least one vertex in the specified + * meshes with a weight greater than the specified threshold. + * + * @param boneIndex the index of the bone (≥0) + * @param targets the meshes to search (not null, no null elements) + * @param weightThreshold the threshold (≥0, ≤1) + * @return true if at least 1 vertex found, otherwise false + */ + public static boolean hasVertices(int boneIndex, Mesh[] targets, + float weightThreshold) { + for (Mesh mesh : targets) { + ByteBuffer boneIndices + = (ByteBuffer) mesh.getBuffer(Type.BoneIndex).getData(); + FloatBuffer boneWeight + = (FloatBuffer) mesh.getBuffer(Type.BoneWeight).getData(); + + boneIndices.rewind(); + boneWeight.rewind(); + + int vertexComponents = mesh.getVertexCount() * 3; + for (int i = 0; i < vertexComponents; i += 3) { + int start = i / 3 * 4; + for (int k = start; k < start + 4; k++) { + if (boneIndices.get(k) == boneIndex + && boneWeight.get(k) >= weightThreshold) { + return true; + } + } + } + } + + return false; + } } diff --git a/jme3-bullet/src/common/java/com/jme3/bullet/debug/AbstractPhysicsDebugControl.java b/jme3-bullet/src/common/java/com/jme3/bullet/debug/AbstractPhysicsDebugControl.java index 75e7bbe45..44293d3b0 100644 --- a/jme3-bullet/src/common/java/com/jme3/bullet/debug/AbstractPhysicsDebugControl.java +++ b/jme3-bullet/src/common/java/com/jme3/bullet/debug/AbstractPhysicsDebugControl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -37,14 +37,27 @@ import com.jme3.scene.Spatial; import com.jme3.scene.control.AbstractControl; /** + * The abstract base class for physics-debug controls (such as + * BulletRigidBodyDebugControl) used to visualize individual collision objects + * and joints. + *

+ * This class is shared between JBullet and Native Bullet. * * @author normenhansen */ public abstract class AbstractPhysicsDebugControl extends AbstractControl { private final Quaternion tmp_inverseWorldRotation = new Quaternion(); + /** + * the app state that this control serves + */ protected final BulletDebugAppState debugAppState; + /** + * Instantiate an enabled control to serve the specified debug app state. + * + * @param debugAppState which app state (not null, alias created) + */ public AbstractPhysicsDebugControl(BulletDebugAppState debugAppState) { this.debugAppState = debugAppState; } @@ -55,10 +68,27 @@ public abstract class AbstractPhysicsDebugControl extends AbstractControl { @Override protected abstract void controlUpdate(float tpf); + /** + * Apply the specified location and orientation to the controlled spatial. + * + * @param worldLocation location vector (in physics-space coordinates, not + * null, unaffected) + * @param worldRotation orientation (in physics-space coordinates, not null, + * unaffected) + */ protected void applyPhysicsTransform(Vector3f worldLocation, Quaternion worldRotation) { applyPhysicsTransform(worldLocation, worldRotation, this.spatial); } + /** + * Apply the specified location and orientation to the specified spatial. + * + * @param worldLocation location vector (in physics-space coordinates, not + * null, unaffected) + * @param worldRotation orientation (in physics-space coordinates, not null, + * unaffected) + * @param spatial where to apply (may be null) + */ protected void applyPhysicsTransform(Vector3f worldLocation, Quaternion worldRotation, Spatial spatial) { if (spatial != null) { Vector3f localLocation = spatial.getLocalTranslation(); diff --git a/jme3-bullet/src/common/java/com/jme3/bullet/debug/BulletCharacterDebugControl.java b/jme3-bullet/src/common/java/com/jme3/bullet/debug/BulletCharacterDebugControl.java index 43c1cfd36..514e79b16 100644 --- a/jme3-bullet/src/common/java/com/jme3/bullet/debug/BulletCharacterDebugControl.java +++ b/jme3-bullet/src/common/java/com/jme3/bullet/debug/BulletCharacterDebugControl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -42,25 +42,61 @@ import com.jme3.scene.Node; import com.jme3.scene.Spatial; /** + * A physics-debug control used to visualize a PhysicsCharacter. + *

+ * This class is shared between JBullet and Native Bullet. * * @author normenhansen */ public class BulletCharacterDebugControl extends AbstractPhysicsDebugControl { + /** + * character to visualize (not null) + */ protected final PhysicsCharacter body; + /** + * temporary storage for physics location + */ protected final Vector3f location = new Vector3f(); protected final Quaternion rotation = new Quaternion(); + /** + * shape for which geom was generated + */ protected CollisionShape myShape; + /** + * geometry to visualize myShape (not null) + */ protected Spatial geom; + /** + * physics scale for which geom was generated + */ + final private Vector3f oldScale = new Vector3f(); + + /** + * Instantiate an enabled control to visualize the specified character. + * + * @param debugAppState which app state (not null, alias created) + * @param body the character to visualize (not null, alias created) + */ public BulletCharacterDebugControl(BulletDebugAppState debugAppState, PhysicsCharacter body) { super(debugAppState); this.body = body; myShape = body.getCollisionShape(); - this.geom = DebugShapeFactory.getDebugShape(body.getCollisionShape()); + oldScale.set(myShape.getScale()); + + this.geom = DebugShapeFactory.getDebugShape(myShape); + this.geom.setName(body.toString()); geom.setMaterial(debugAppState.DEBUG_PINK); } + /** + * Alter which spatial is controlled. Invoked when the control is added to + * or removed from a spatial. Should be invoked only by a subclass or from + * Spatial. Do not invoke directly from user code. + * + * @param spatial the spatial to control (or null) + */ @Override public void setSpatial(Spatial spatial) { if (spatial != null && spatial instanceof Node) { @@ -73,19 +109,43 @@ public class BulletCharacterDebugControl extends AbstractPhysicsDebugControl { super.setSpatial(spatial); } + /** + * Update this control. Invoked once per frame during the logical-state + * update, provided the control is enabled and added to a scene. Should be + * invoked only by a subclass or by AbstractControl. + * + * @param tpf the time interval between frames (in seconds, ≥0) + */ @Override protected void controlUpdate(float tpf) { - if(myShape != body.getCollisionShape()){ - Node node = (Node) this.spatial; + CollisionShape newShape = body.getCollisionShape(); + Vector3f newScale = newShape.getScale(); + if (myShape != newShape || !oldScale.equals(newScale)) { + myShape = newShape; + oldScale.set(newScale); + + Node node = (Node) spatial; node.detachChild(geom); - geom = DebugShapeFactory.getDebugShape(body.getCollisionShape()); - geom.setMaterial(debugAppState.DEBUG_PINK); + + geom = DebugShapeFactory.getDebugShape(myShape); + geom.setName(body.toString()); + node.attachChild(geom); } - applyPhysicsTransform(body.getPhysicsLocation(location), Quaternion.IDENTITY); - geom.setLocalScale(body.getCollisionShape().getScale()); + geom.setMaterial(debugAppState.DEBUG_PINK); + + body.getPhysicsLocation(location); + applyPhysicsTransform(location, Quaternion.IDENTITY); } + /** + * Render this control. Invoked once per frame, provided the + * control is enabled and added to a scene. Should be invoked only by a + * subclass or by AbstractControl. + * + * @param rm the render manager (not null) + * @param vp the view port to render (not null) + */ @Override protected void controlRender(RenderManager rm, ViewPort vp) { } diff --git a/jme3-bullet/src/common/java/com/jme3/bullet/debug/BulletDebugAppState.java b/jme3-bullet/src/common/java/com/jme3/bullet/debug/BulletDebugAppState.java index 4019d2c2b..3e2f6aef1 100644 --- a/jme3-bullet/src/common/java/com/jme3/bullet/debug/BulletDebugAppState.java +++ b/jme3-bullet/src/common/java/com/jme3/bullet/debug/BulletDebugAppState.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -55,31 +55,84 @@ import java.util.logging.Level; import java.util.logging.Logger; /** + * An app state to manage a debug visualization of a physics space. + *

+ * This class is shared between JBullet and Native Bullet. * * @author normenhansen */ public class BulletDebugAppState extends AbstractAppState { + /** + * message logger for this class + */ protected static final Logger logger = Logger.getLogger(BulletDebugAppState.class.getName()); + /** + * limit which objects are visualized, or null to visualize all objects + */ protected DebugAppStateFilter filter; protected Application app; protected AssetManager assetManager; + /** + * physics space to visualize (not null) + */ protected final PhysicsSpace space; + /** + * scene-graph node to parent the geometries + */ protected final Node physicsDebugRootNode = new Node("Physics Debug Root Node"); + /** + * view port in which to render (not null) + */ protected ViewPort viewPort; protected RenderManager rm; + /** + * material for inactive rigid bodies + */ public Material DEBUG_BLUE; public Material DEBUG_RED; + /** + * material for joints + */ public Material DEBUG_GREEN; + /** + * material for ghosts + */ public Material DEBUG_YELLOW; + /** + * material for vehicles and active rigid bodies + */ public Material DEBUG_MAGENTA; + /** + * material for physics characters + */ public Material DEBUG_PINK; + /** + * map rigid bodies to visualizations + */ protected HashMap bodies = new HashMap(); + /** + * map joints to visualizations + */ protected HashMap joints = new HashMap(); + /** + * map ghosts to visualizations + */ protected HashMap ghosts = new HashMap(); + /** + * map physics characters to visualizations + */ protected HashMap characters = new HashMap(); + /** + * map vehicles to visualizations + */ protected HashMap vehicles = new HashMap(); - + /** + * Instantiate an app state to visualize the specified space. This constructor should be invoked only by + * BulletAppState. + * + * @param space physics space to visualize (not null, alias created) + */ public BulletDebugAppState(PhysicsSpace space) { this.space = space; } @@ -88,10 +141,22 @@ public class BulletDebugAppState extends AbstractAppState { return new DebugTools(assetManager); } + /** + * Alter which objects are visualized. + * + * @param filter the desired filter, or or null to visualize all objects + */ public void setFilter(DebugAppStateFilter filter) { this.filter = filter; } + /** + * Initialize this state prior to its 1st update. Should be invoked only by + * a subclass or by the AppStateManager. + * + * @param stateManager the manager for this state (not null) + * @param app the application which owns this state (not null) + */ @Override public void initialize(AppStateManager stateManager, Application app) { super.initialize(stateManager, app); @@ -105,12 +170,25 @@ public class BulletDebugAppState extends AbstractAppState { viewPort.attachScene(physicsDebugRootNode); } + /** + * Transition this state from terminating to detached. Should be invoked + * only by a subclass or by the AppStateManager. Invoked once for each time + * {@link #initialize(com.jme3.app.state.AppStateManager, com.jme3.app.Application)} + * is invoked. + */ @Override public void cleanup() { rm.removeMainView(viewPort); super.cleanup(); } + /** + * Update this state prior to rendering. Should be invoked only by a + * subclass or by the AppStateManager. Invoked once per frame, provided the + * state is attached and enabled. + * + * @param tpf the time interval between frames (in seconds, ≥0) + */ @Override public void update(float tpf) { super.update(tpf); @@ -125,6 +203,13 @@ public class BulletDebugAppState extends AbstractAppState { physicsDebugRootNode.updateGeometricState(); } + /** + * Render this state. Should be invoked only by a subclass or by the + * AppStateManager. Invoked once per frame, provided the state is attached + * and enabled. + * + * @param rm the render manager (not null) + */ @Override public void render(RenderManager rm) { super.render(rm); @@ -133,6 +218,11 @@ public class BulletDebugAppState extends AbstractAppState { } } + /** + * Initialize the materials. + * + * @param app the application which owns this state (not null) + */ private void setupMaterials(Application app) { AssetManager manager = app.getAssetManager(); DEBUG_BLUE = new Material(manager, "Common/MatDefs/Misc/Unshaded.j3md"); @@ -311,14 +401,14 @@ public class BulletDebugAppState extends AbstractAppState { } /** - * Interface that allows filtering out objects from the debug display + * Interface to restrict which physics objects are visualized. */ public static interface DebugAppStateFilter { /** - * Queries an object to be displayed + * Test whether the specified physics object should be displayed. * - * @param obj The object to be displayed + * @param obj the joint or collision object to test (unaffected) * @return return true if the object should be displayed, false if not */ public boolean displayObject(Object obj); diff --git a/jme3-bullet/src/common/java/com/jme3/bullet/debug/BulletGhostObjectDebugControl.java b/jme3-bullet/src/common/java/com/jme3/bullet/debug/BulletGhostObjectDebugControl.java index 62ab7a214..bdb6932d7 100644 --- a/jme3-bullet/src/common/java/com/jme3/bullet/debug/BulletGhostObjectDebugControl.java +++ b/jme3-bullet/src/common/java/com/jme3/bullet/debug/BulletGhostObjectDebugControl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -42,27 +42,62 @@ import com.jme3.scene.Node; import com.jme3.scene.Spatial; /** + * A physics-debug control used to visualize a PhysicsGhostObject. + *

+ * This class is shared between JBullet and Native Bullet. * * @author normenhansen */ public class BulletGhostObjectDebugControl extends AbstractPhysicsDebugControl { + /** + * ghost object to visualize (not null) + */ protected final PhysicsGhostObject body; + /** + * temporary storage for physics location + */ protected final Vector3f location = new Vector3f(); + /** + * temporary storage for physics rotation + */ protected final Quaternion rotation = new Quaternion(); + /** + * shape for which geom was generated (not null) + */ protected CollisionShape myShape; + /** + * geometry to visualize myShape (not null) + */ protected Spatial geom; - + /** + * physics scale for which geom was generated + */ + final private Vector3f oldScale = new Vector3f(); + /** + * Instantiate an enabled control to visualize the specified ghost object. + * + * @param debugAppState which app state (not null, alias created) + * @param body which object to visualize (not null, alias created) + */ public BulletGhostObjectDebugControl(BulletDebugAppState debugAppState, PhysicsGhostObject body) { super(debugAppState); this.body = body; myShape = body.getCollisionShape(); - this.geom = DebugShapeFactory.getDebugShape(body.getCollisionShape()); - this.geom.setName(body.toString()); + oldScale.set(myShape.getScale()); + + this.geom = DebugShapeFactory.getDebugShape(myShape); this.geom.setName(body.toString()); geom.setMaterial(debugAppState.DEBUG_YELLOW); } + /** + * Alter which spatial is controlled. Invoked when the control is added to + * or removed from a spatial. Should be invoked only by a subclass or from + * Spatial. Do not invoke directly from user code. + * + * @param spatial the spatial to control (or null) + */ @Override public void setSpatial(Spatial spatial) { if (spatial != null && spatial instanceof Node) { @@ -75,19 +110,44 @@ public class BulletGhostObjectDebugControl extends AbstractPhysicsDebugControl { super.setSpatial(spatial); } + /** + * Update this control. Invoked once per frame during the logical-state + * update, provided the control is enabled and added to a scene. Should be + * invoked only by a subclass or by AbstractControl. + * + * @param tpf the time interval between frames (in seconds, ≥0) + */ @Override protected void controlUpdate(float tpf) { - if (myShape != body.getCollisionShape()) { - Node node = (Node) this.spatial; + CollisionShape newShape = body.getCollisionShape(); + Vector3f newScale = newShape.getScale(); + if (myShape != newShape || !oldScale.equals(newScale)) { + myShape = newShape; + oldScale.set(newScale); + + Node node = (Node) spatial; node.detachChild(geom); - geom = DebugShapeFactory.getDebugShape(body.getCollisionShape()); - geom.setMaterial(debugAppState.DEBUG_YELLOW); + + geom = DebugShapeFactory.getDebugShape(myShape); + geom.setName(body.toString()); + node.attachChild(geom); } - applyPhysicsTransform(body.getPhysicsLocation(location), body.getPhysicsRotation(rotation)); - geom.setLocalScale(body.getCollisionShape().getScale()); + geom.setMaterial(debugAppState.DEBUG_YELLOW); + + body.getPhysicsLocation(location); + body.getPhysicsRotation(rotation); + applyPhysicsTransform(location, rotation); } + /** + * Render this control. Invoked once per frame, provided the + * control is enabled and added to a scene. Should be invoked only by a + * subclass or by AbstractControl. + * + * @param rm the render manager (not null) + * @param vp the view port to render (not null) + */ @Override protected void controlRender(RenderManager rm, ViewPort vp) { } diff --git a/jme3-bullet/src/common/java/com/jme3/bullet/debug/BulletJointDebugControl.java b/jme3-bullet/src/common/java/com/jme3/bullet/debug/BulletJointDebugControl.java index 571452811..7b11a41d6 100644 --- a/jme3-bullet/src/common/java/com/jme3/bullet/debug/BulletJointDebugControl.java +++ b/jme3-bullet/src/common/java/com/jme3/bullet/debug/BulletJointDebugControl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -43,6 +43,9 @@ import com.jme3.scene.Spatial; import com.jme3.scene.debug.Arrow; /** + * A physics-debug control used to visualize a PhysicsJoint. + *

+ * This class is shared between JBullet and Native Bullet. * * @author normenhansen */ @@ -58,6 +61,12 @@ public class BulletJointDebugControl extends AbstractPhysicsDebugControl { protected final Vector3f offA = new Vector3f(); protected final Vector3f offB = new Vector3f(); + /** + * Instantiate an enabled control to visualize the specified joint. + * + * @param debugAppState which app state (not null, alias created) + * @param body the joint to visualize (not null, alias created) + */ public BulletJointDebugControl(BulletDebugAppState debugAppState, PhysicsJoint body) { super(debugAppState); this.body = body; @@ -71,6 +80,13 @@ public class BulletJointDebugControl extends AbstractPhysicsDebugControl { geomB.setMaterial(debugAppState.DEBUG_GREEN); } + /** + * Alter which spatial is controlled. Invoked when the control is added to + * or removed from a spatial. Should be invoked only by a subclass or from + * Spatial. Do not invoke directly from user code. + * + * @param spatial the spatial to control (or null) + */ @Override public void setSpatial(Spatial spatial) { if (spatial != null && spatial instanceof Node) { @@ -85,6 +101,13 @@ public class BulletJointDebugControl extends AbstractPhysicsDebugControl { super.setSpatial(spatial); } + /** + * Update this control. Invoked once per frame during the logical-state + * update, provided the control is enabled and added to a scene. Should be + * invoked only by a subclass or by AbstractControl. + * + * @param tpf the time interval between frames (in seconds, ≥0) + */ @Override protected void controlUpdate(float tpf) { body.getBodyA().getPhysicsLocation(a.getTranslation()); @@ -100,6 +123,14 @@ public class BulletJointDebugControl extends AbstractPhysicsDebugControl { arrowB.setArrowExtent(body.getPivotB()); } + /** + * Render this control. Invoked once per frame, provided the + * control is enabled and added to a scene. Should be invoked only by a + * subclass or by AbstractControl. + * + * @param rm the render manager (not null) + * @param vp the view port to render (not null) + */ @Override protected void controlRender(RenderManager rm, ViewPort vp) { } diff --git a/jme3-bullet/src/common/java/com/jme3/bullet/debug/BulletRigidBodyDebugControl.java b/jme3-bullet/src/common/java/com/jme3/bullet/debug/BulletRigidBodyDebugControl.java index 3bc10f3e6..727deebc3 100644 --- a/jme3-bullet/src/common/java/com/jme3/bullet/debug/BulletRigidBodyDebugControl.java +++ b/jme3-bullet/src/common/java/com/jme3/bullet/debug/BulletRigidBodyDebugControl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -42,26 +42,63 @@ import com.jme3.scene.Node; import com.jme3.scene.Spatial; /** + * A physics-debug control used to visualize a PhysicsRigidBody. + *

+ * This class is shared between JBullet and Native Bullet. * * @author normenhansen */ public class BulletRigidBodyDebugControl extends AbstractPhysicsDebugControl { + /** + * rigid body to visualize (not null) + */ protected final PhysicsRigidBody body; + /** + * temporary storage for physics location + */ protected final Vector3f location = new Vector3f(); + /** + * temporary storage for physics rotation + */ protected final Quaternion rotation = new Quaternion(); + /** + * shape for which geom was generated (not null) + */ protected CollisionShape myShape; + /** + * geometry to visualize myShape (not null) + */ protected Spatial geom; + /** + * physics scale for which geom was generated + */ + final private Vector3f oldScale = new Vector3f(); + /** + * Instantiate an enabled control to visualize the specified body. + * + * @param debugAppState which app state (not null, alias created) + * @param body which body to visualize (not null, alias created) + */ public BulletRigidBodyDebugControl(BulletDebugAppState debugAppState, PhysicsRigidBody body) { super(debugAppState); this.body = body; myShape = body.getCollisionShape(); - this.geom = DebugShapeFactory.getDebugShape(body.getCollisionShape()); + oldScale.set(myShape.getScale()); + + this.geom = DebugShapeFactory.getDebugShape(myShape); this.geom.setName(body.toString()); geom.setMaterial(debugAppState.DEBUG_BLUE); } + /** + * Alter which spatial is controlled. Invoked when the control is added to + * or removed from a spatial. Should be invoked only by a subclass or from + * Spatial. Do not invoke directly from user code. + * + * @param spatial the spatial to control (or null) + */ @Override public void setSpatial(Spatial spatial) { if (spatial != null && spatial instanceof Node) { @@ -74,12 +111,27 @@ public class BulletRigidBodyDebugControl extends AbstractPhysicsDebugControl { super.setSpatial(spatial); } + /** + * Update this control. Invoked once per frame during the logical-state + * update, provided the control is enabled and added to a scene. Should be + * invoked only by a subclass or by AbstractControl. + * + * @param tpf the time interval between frames (in seconds, ≥0) + */ @Override protected void controlUpdate(float tpf) { - if(myShape != body.getCollisionShape()){ - Node node = (Node) this.spatial; + CollisionShape newShape = body.getCollisionShape(); + Vector3f newScale = newShape.getScale(); + if (myShape != newShape || !oldScale.equals(newScale)) { + myShape = newShape; + oldScale.set(newScale); + + Node node = (Node) spatial; node.detachChild(geom); - geom = DebugShapeFactory.getDebugShape(body.getCollisionShape()); + + geom = DebugShapeFactory.getDebugShape(myShape); + geom.setName(body.toString()); + node.attachChild(geom); } if(body.isActive()){ @@ -87,10 +139,20 @@ public class BulletRigidBodyDebugControl extends AbstractPhysicsDebugControl { }else{ geom.setMaterial(debugAppState.DEBUG_BLUE); } - applyPhysicsTransform(body.getPhysicsLocation(location), body.getPhysicsRotation(rotation)); - geom.setLocalScale(body.getCollisionShape().getScale()); + + body.getPhysicsLocation(location); + body.getPhysicsRotation(rotation); + applyPhysicsTransform(location, rotation); } + /** + * Render this control. Invoked once per frame, provided the + * control is enabled and added to a scene. Should be invoked only by a + * subclass or by AbstractControl. + * + * @param rm the render manager (not null) + * @param vp the view port to render (not null) + */ @Override protected void controlRender(RenderManager rm, ViewPort vp) { } diff --git a/jme3-bullet/src/common/java/com/jme3/bullet/debug/BulletVehicleDebugControl.java b/jme3-bullet/src/common/java/com/jme3/bullet/debug/BulletVehicleDebugControl.java index f7adf1208..c964c420b 100644 --- a/jme3-bullet/src/common/java/com/jme3/bullet/debug/BulletVehicleDebugControl.java +++ b/jme3-bullet/src/common/java/com/jme3/bullet/debug/BulletVehicleDebugControl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -43,6 +43,9 @@ import com.jme3.scene.Spatial; import com.jme3.scene.debug.Arrow; /** + * A physics-debug control used to visualize a PhysicsVehicle. + *

+ * This class is shared between JBullet and Native Bullet. * * @author normenhansen */ @@ -53,6 +56,12 @@ public class BulletVehicleDebugControl extends AbstractPhysicsDebugControl { protected final Vector3f location = new Vector3f(); protected final Quaternion rotation = new Quaternion(); + /** + * Instantiate an enabled control to visualize the specified vehicle. + * + * @param debugAppState which app state (not null, alias created) + * @param body which vehicle to visualize (not null, alias created) + */ public BulletVehicleDebugControl(BulletDebugAppState debugAppState, PhysicsVehicle body) { super(debugAppState); this.body = body; @@ -60,6 +69,13 @@ public class BulletVehicleDebugControl extends AbstractPhysicsDebugControl { createVehicle(); } + /** + * Alter which spatial is controlled. Invoked when the control is added to + * or removed from a spatial. Should be invoked only by a subclass or from + * Spatial. Do not invoke directly from user code. + * + * @param spatial the spatial to control (or null) + */ @Override public void setSpatial(Spatial spatial) { if (spatial != null && spatial instanceof Node) { @@ -104,6 +120,13 @@ public class BulletVehicleDebugControl extends AbstractPhysicsDebugControl { } } + /** + * Update this control. Invoked once per frame during the logical-state + * update, provided the control is enabled and added to a scene. Should be + * invoked only by a subclass or by AbstractControl. + * + * @param tpf the time interval between frames (in seconds, ≥0) + */ @Override protected void controlUpdate(float tpf) { for (int i = 0; i < body.getNumWheels(); i++) { @@ -136,6 +159,14 @@ public class BulletVehicleDebugControl extends AbstractPhysicsDebugControl { applyPhysicsTransform(body.getPhysicsLocation(location), body.getPhysicsRotation(rotation)); } + /** + * Render this control. Invoked once per frame, provided the + * control is enabled and added to a scene. Should be invoked only by a + * subclass or by AbstractControl. + * + * @param rm the render manager (not null) + * @param vp the view port to render (not null) + */ @Override protected void controlRender(RenderManager rm, ViewPort vp) { } diff --git a/jme3-bullet/src/common/java/com/jme3/bullet/debug/DebugTools.java b/jme3-bullet/src/common/java/com/jme3/bullet/debug/DebugTools.java index 2e7246b7a..16bc38ac8 100644 --- a/jme3-bullet/src/common/java/com/jme3/bullet/debug/DebugTools.java +++ b/jme3-bullet/src/common/java/com/jme3/bullet/debug/DebugTools.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -42,43 +42,129 @@ import com.jme3.scene.Node; import com.jme3.scene.debug.Arrow; /** + * Debugging aids. + *

+ * This class is shared between JBullet and Native Bullet. * * @author normenhansen */ public class DebugTools { protected final AssetManager manager; + /** + * unshaded blue material + */ public Material DEBUG_BLUE; + /** + * unshaded red material + */ public Material DEBUG_RED; + /** + * unshaded green material + */ public Material DEBUG_GREEN; + /** + * unshaded yellow material + */ public Material DEBUG_YELLOW; + /** + * unshaded magenta material + */ public Material DEBUG_MAGENTA; + /** + * unshaded pink material + */ public Material DEBUG_PINK; + /** + * node for attaching debug geometries + */ public Node debugNode = new Node("Debug Node"); + /** + * mesh for the blue arrow + */ public Arrow arrowBlue = new Arrow(Vector3f.ZERO); + /** + * geometry for the blue arrow + */ public Geometry arrowBlueGeom = new Geometry("Blue Arrow", arrowBlue); + /** + * mesh for the green arrow + */ public Arrow arrowGreen = new Arrow(Vector3f.ZERO); + /** + * geometry for the green arrow + */ public Geometry arrowGreenGeom = new Geometry("Green Arrow", arrowGreen); + /** + * mesh for the red arrow + */ public Arrow arrowRed = new Arrow(Vector3f.ZERO); + /** + * geometry for the red arrow + */ public Geometry arrowRedGeom = new Geometry("Red Arrow", arrowRed); + /** + * mesh for the magenta arrow + */ public Arrow arrowMagenta = new Arrow(Vector3f.ZERO); + /** + * geometry for the magenta arrow + */ public Geometry arrowMagentaGeom = new Geometry("Magenta Arrow", arrowMagenta); + /** + * mesh for the yellow arrow + */ public Arrow arrowYellow = new Arrow(Vector3f.ZERO); + /** + * geometry for the yellow arrow + */ public Geometry arrowYellowGeom = new Geometry("Yellow Arrow", arrowYellow); + /** + * mesh for the pink arrow + */ public Arrow arrowPink = new Arrow(Vector3f.ZERO); + /** + * geometry for the pink arrow + */ public Geometry arrowPinkGeom = new Geometry("Pink Arrow", arrowPink); + /** + * local copy of {@link com.jme3.math.Vector3f#UNIT_X} + */ protected static final Vector3f UNIT_X_CHECK = new Vector3f(1, 0, 0); + /** + * local copy of {@link com.jme3.math.Vector3f#UNIT_Y} + */ protected static final Vector3f UNIT_Y_CHECK = new Vector3f(0, 1, 0); + /** + * local copy of {@link com.jme3.math.Vector3f#UNIT_Z} + */ protected static final Vector3f UNIT_Z_CHECK = new Vector3f(0, 0, 1); + /** + * local copy of {@link com.jme3.math.Vector3f#UNIT_XYZ} + */ protected static final Vector3f UNIT_XYZ_CHECK = new Vector3f(1, 1, 1); + /** + * local copy of {@link com.jme3.math.Vector3f#ZERO} + */ protected static final Vector3f ZERO_CHECK = new Vector3f(0, 0, 0); + /** + * Instantiate a set of debug tools. + * + * @param manager for loading assets (not null, alias created) + */ public DebugTools(AssetManager manager) { this.manager = manager; setupMaterials(); setupDebugNode(); } + /** + * Render all the debug geometries to the specified view port. + * + * @param rm the render manager (not null) + * @param vp the view port (not null) + */ public void show(RenderManager rm, ViewPort vp) { if (!Vector3f.UNIT_X.equals(UNIT_X_CHECK) || !Vector3f.UNIT_Y.equals(UNIT_Y_CHECK) || !Vector3f.UNIT_Z.equals(UNIT_Z_CHECK) || !Vector3f.UNIT_XYZ.equals(UNIT_XYZ_CHECK) || !Vector3f.ZERO.equals(ZERO_CHECK)) { @@ -94,36 +180,75 @@ public class DebugTools { rm.renderScene(debugNode, vp); } + /** + * Alter the location and extent of the blue arrow. + * + * @param location the coordinates of the tail (not null, unaffected) + * @param extent the offset of the tip from the tail (not null, unaffected) + */ public void setBlueArrow(Vector3f location, Vector3f extent) { arrowBlueGeom.setLocalTranslation(location); arrowBlue.setArrowExtent(extent); } + /** + * Alter the location and extent of the green arrow. + * + * @param location the coordinates of the tail (not null, unaffected) + * @param extent the offset of the tip from the tail (not null, unaffected) + */ public void setGreenArrow(Vector3f location, Vector3f extent) { arrowGreenGeom.setLocalTranslation(location); arrowGreen.setArrowExtent(extent); } + /** + * Alter the location and extent of the red arrow. + * + * @param location the coordinates of the tail (not null, unaffected) + * @param extent the offset of the tip from the tail (not null, unaffected) + */ public void setRedArrow(Vector3f location, Vector3f extent) { arrowRedGeom.setLocalTranslation(location); arrowRed.setArrowExtent(extent); } + /** + * Alter the location and extent of the magenta arrow. + * + * @param location the coordinates of the tail (not null, unaffected) + * @param extent the offset of the tip from the tail (not null, unaffected) + */ public void setMagentaArrow(Vector3f location, Vector3f extent) { arrowMagentaGeom.setLocalTranslation(location); arrowMagenta.setArrowExtent(extent); } + /** + * Alter the location and extent of the yellow arrow. + * + * @param location the coordinates of the tail (not null, unaffected) + * @param extent the offset of the tip from the tail (not null, unaffected) + */ public void setYellowArrow(Vector3f location, Vector3f extent) { arrowYellowGeom.setLocalTranslation(location); arrowYellow.setArrowExtent(extent); } + /** + * Alter the location and extent of the pink arrow. + * + * @param location the coordinates of the tail (not null, unaffected) + * @param extent the offset of the tip from the tail (not null, unaffected) + */ public void setPinkArrow(Vector3f location, Vector3f extent) { arrowPinkGeom.setLocalTranslation(location); arrowPink.setArrowExtent(extent); } + /** + * Attach all the debug geometries to the debug node. + */ protected void setupDebugNode() { arrowBlueGeom.setMaterial(DEBUG_BLUE); arrowGreenGeom.setMaterial(DEBUG_GREEN); @@ -139,6 +264,9 @@ public class DebugTools { debugNode.attachChild(arrowPinkGeom); } + /** + * Initialize all the DebugTools materials. + */ protected void setupMaterials() { DEBUG_BLUE = new Material(manager, "Common/MatDefs/Misc/Unshaded.j3md"); DEBUG_BLUE.getAdditionalRenderState().setWireframe(true); diff --git a/jme3-bullet/src/common/java/com/jme3/bullet/util/CollisionShapeFactory.java b/jme3-bullet/src/common/java/com/jme3/bullet/util/CollisionShapeFactory.java index de28aba02..19e14d49b 100644 --- a/jme3-bullet/src/common/java/com/jme3/bullet/util/CollisionShapeFactory.java +++ b/jme3-bullet/src/common/java/com/jme3/bullet/util/CollisionShapeFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -44,17 +44,21 @@ import java.util.Iterator; import java.util.LinkedList; /** + * A utility class for generating collision shapes from Spatials. + *

+ * This class is shared between JBullet and Native Bullet. * * @author normenhansen, tim8dev */ public class CollisionShapeFactory { /** - * returns the correct transform for a collisionshape in relation - * to the ancestor for which the collisionshape is generated + * Calculate the correct transform for a collision shape relative to the + * ancestor for which the shape was generated. + * * @param spat * @param parent - * @return + * @return a new instance (not null) */ private static Transform getTransform(Spatial spat, Spatial parent) { Transform shapeTransform = new Transform(); @@ -135,30 +139,48 @@ public class CollisionShapeFactory { } /** - * This type of collision shape is mesh-accurate and meant for immovable "world objects". - * Examples include terrain, houses or whole shooter levels.
- * Objects with "mesh" type collision shape will not collide with each other. + * This type of collision shape is mesh-accurate and meant for immovable + * "world objects". Examples include terrain, houses or whole shooter + * levels. + *

+ * Objects with "mesh" type collision shape will not collide with each + * other. + * + * @param rootNode the node on which to base the shape (not null) + * @return a new shape (not null) */ private static CompoundCollisionShape createMeshCompoundShape(Node rootNode) { return createCompoundShape(rootNode, new CompoundCollisionShape(), true); } /** - * This type of collision shape creates a CompoundShape made out of boxes that - * are based on the bounds of the Geometries in the tree. - * @param rootNode - * @return + * This type of collision shape creates a CompoundShape made out of boxes + * that are based on the bounds of the Geometries in the tree. + * + * @param rootNode the node on which to base the shape (not null) + * @return a new shape (not null) */ private static CompoundCollisionShape createBoxCompoundShape(Node rootNode) { return createCompoundShape(rootNode, new CompoundCollisionShape(), false); } /** - * This type of collision shape is mesh-accurate and meant for immovable "world objects". - * Examples include terrain, houses or whole shooter levels.
- * Objects with "mesh" type collision shape will not collide with each other.
- * Creates a HeightfieldCollisionShape if the supplied spatial is a TerrainQuad. - * @return A MeshCollisionShape or a CompoundCollisionShape with MeshCollisionShapes as children if the supplied spatial is a Node. A HeightieldCollisionShape if a TerrainQuad was supplied. + * Create a mesh shape for the given Spatial. + *

+ * This type of collision shape is mesh-accurate and meant for immovable + * "world objects". Examples include terrain, houses or whole shooter + * levels. + *

+ * Objects with "mesh" type collision shape will not collide with each + * other. + *

+ * Creates a HeightfieldCollisionShape if the supplied spatial is a + * TerrainQuad. + * + * @param spatial the spatial on which to base the shape (not null) + * @return A MeshCollisionShape or a CompoundCollisionShape with + * MeshCollisionShapes as children if the supplied spatial is a Node. A + * HeightieldCollisionShape if a TerrainQuad was supplied. */ public static CollisionShape createMeshShape(Spatial spatial) { if (spatial instanceof TerrainQuad) { @@ -177,9 +199,14 @@ public class CollisionShapeFactory { } /** - * This method creates a hull shape for the given Spatial.
- * If you want to have mesh-accurate dynamic shapes (CPU intense!!!) use GImpact shapes, its probably best to do so with a low-poly version of your model. - * @return A HullCollisionShape or a CompoundCollisionShape with HullCollisionShapes as children if the supplied spatial is a Node. + * Create a hull shape for the given Spatial. + *

+ * For mesh-accurate animated meshes (CPU intense!) use GImpact shapes. + * + * @param spatial the spatial on which to base the shape (not null) + * @return a HullCollisionShape (if spatial is a Geometry) or a + * CompoundCollisionShape with HullCollisionShapes as children (if spatial + * is a Node) */ public static CollisionShape createDynamicMeshShape(Spatial spatial) { if (spatial instanceof Geometry) { @@ -192,6 +219,14 @@ public class CollisionShapeFactory { } + /** + * Create a box shape for the given Spatial. + * + * @param spatial the spatial on which to base the shape (not null) + * @return a BoxCollisionShape (if spatial is a Geometry) or a + * CompoundCollisionShape with BoxCollisionShapes as children (if spatial is + * a Node) + */ public static CollisionShape createBoxShape(Spatial spatial) { if (spatial instanceof Geometry) { return createSingleBoxShape((Geometry) spatial, spatial); @@ -203,9 +238,12 @@ public class CollisionShapeFactory { } /** - * This type of collision shape is mesh-accurate and meant for immovable "world objects". - * Examples include terrain, houses or whole shooter levels.
- * Objects with "mesh" type collision shape will not collide with each other. + * This type of collision shape is mesh-accurate and meant for immovable + * "world objects". Examples include terrain, houses or whole shooter + * levels. + *

+ * Objects with "mesh" type collision shape will not collide with each + * other. */ private static MeshCollisionShape createSingleMeshShape(Geometry geom, Spatial parent) { Mesh mesh = geom.getMesh(); @@ -220,9 +258,13 @@ public class CollisionShapeFactory { } /** - * Uses the bounding box of the supplied spatial to create a BoxCollisionShape - * @param spatial - * @return BoxCollisionShape with the size of the spatials BoundingBox + * Use the bounding box of the supplied spatial to create a + * BoxCollisionShape. + * + * @param spatial the spatial on which to base the shape (not null) + * @param parent unused + * @return a new shape with the dimensions of the spatial's bounding box + * (not null) */ private static BoxCollisionShape createSingleBoxShape(Spatial spatial, Spatial parent) { //TODO: using world bound here instead of "local world" bound... @@ -232,7 +274,10 @@ public class CollisionShapeFactory { } /** - * This method creates a hull collision shape for the given mesh.
+ * Create a hull collision shape for the specified geometry. + * + * @param geom the geometry on which to base the shape (not null) + * @param parent */ private static HullCollisionShape createSingleDynamicMeshShape(Geometry geom, Spatial parent) { Mesh mesh = geom.getMesh(); diff --git a/jme3-bullet/src/main/java/com/jme3/bullet/PhysicsSpace.java b/jme3-bullet/src/main/java/com/jme3/bullet/PhysicsSpace.java index 74c44a0b9..ea5f74518 100644 --- a/jme3-bullet/src/main/java/com/jme3/bullet/PhysicsSpace.java +++ b/jme3-bullet/src/main/java/com/jme3/bullet/PhysicsSpace.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -32,7 +32,6 @@ package com.jme3.bullet; import com.jme3.app.AppTask; -import com.jme3.asset.AssetManager; import com.jme3.bullet.collision.*; import com.jme3.bullet.collision.shapes.CollisionShape; import com.jme3.bullet.control.PhysicsControl; @@ -46,6 +45,7 @@ import com.jme3.math.Transform; import com.jme3.math.Vector3f; import com.jme3.scene.Node; import com.jme3.scene.Spatial; +import com.jme3.util.SafeArrayList; import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Collection; @@ -55,6 +55,7 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Comparator; +import java.util.Deque; import java.util.concurrent.Callable; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentLinkedQueue; @@ -63,17 +64,36 @@ import java.util.logging.Level; import java.util.logging.Logger; /** - *

PhysicsSpace - The central jbullet-jme physics space

+ * A jbullet-jme physics space with its own btDynamicsWorld. * * @author normenhansen */ public class PhysicsSpace { + /** + * message logger for this class + */ private static final Logger logger = Logger.getLogger(PhysicsSpace.class.getName()); + /** + * index of the X axis + */ public static final int AXIS_X = 0; + /** + * index of the Y axis + */ public static final int AXIS_Y = 1; + /** + * index of the Z axis + */ public static final int AXIS_Z = 2; + /** + * Bullet identifier of the physics space. The constructor sets this to a + * non-zero value. + */ private long physicsSpaceId = 0; + /** + * first-in/first-out (FIFO) queue of physics tasks for each thread + */ private static ThreadLocal>> pQueueTL = new ThreadLocal>>() { @Override @@ -81,8 +101,17 @@ public class PhysicsSpace { return new ConcurrentLinkedQueue>(); } }; + /** + * first-in/first-out (FIFO) queue of physics tasks + */ private ConcurrentLinkedQueue> pQueue = new ConcurrentLinkedQueue>(); + /** + * physics space for each thread + */ private static ThreadLocal physicsSpaceTL = new ThreadLocal(); + /** + * copy of type of acceleration structure used + */ private BroadphaseType broadphaseType = BroadphaseType.DBVT; // private DiscreteDynamicsWorld dynamicsWorld = null; // private BroadphaseInterface broadphase; @@ -95,15 +124,50 @@ public class PhysicsSpace { private Map physicsBodies = new ConcurrentHashMap(); private Map physicsJoints = new ConcurrentHashMap(); private Map physicsVehicles = new ConcurrentHashMap(); - private ArrayList collisionListeners = new ArrayList(); + /** + * list of registered collision listeners + */ + final private List collisionListeners + = new SafeArrayList<>(PhysicsCollisionListener.class); + /** + * queue of collision events not yet distributed to listeners + */ private ArrayDeque collisionEvents = new ArrayDeque(); + /** + * map from collision groups to registered group listeners + */ private Map collisionGroupListeners = new ConcurrentHashMap(); + /** + * queue of registered tick listeners + */ private ConcurrentLinkedQueue tickListeners = new ConcurrentLinkedQueue(); private PhysicsCollisionEventFactory eventFactory = new PhysicsCollisionEventFactory(); + /** + * copy of minimum coordinate values when using AXIS_SWEEP broadphase + * algorithms + */ private Vector3f worldMin = new Vector3f(-10000f, -10000f, -10000f); + /** + * copy of maximum coordinate values when using AXIS_SWEEP broadphase + * algorithms + */ private Vector3f worldMax = new Vector3f(10000f, 10000f, 10000f); + /** + * physics time step (in seconds, >0) + */ private float accuracy = 1f / 60f; - private int maxSubSteps = 4, rayTestFlags = 1 << 2; + /** + * maximum number of physics steps per frame (≥0, default=4) + */ + private int maxSubSteps = 4; + /** + * flags used in ray tests + */ + private int rayTestFlags = 1 << 2; + /** + * copy of number of iterations used by the contact-and-constraint solver + * (default=10) + */ private int solverNumIterations = 10; static { @@ -112,9 +176,8 @@ public class PhysicsSpace { } /** - * Get the current PhysicsSpace running on this thread
For - * parallel physics, this can also be called from the OpenGL thread to - * receive the PhysicsSpace + * Access the PhysicsSpace running on this thread. For parallel + * physics, this can be invoked from the OpenGL thread. * * @return the PhysicsSpace running on this thread */ @@ -125,24 +188,47 @@ public class PhysicsSpace { /** * Used internally * - * @param space + * @param space which physics space to simulate on this thread */ public static void setLocalThreadPhysicsSpace(PhysicsSpace space) { physicsSpaceTL.set(space); } + /** + * Instantiate a PhysicsSpace. Must be invoked on the designated physics + * thread. + */ public PhysicsSpace() { this(new Vector3f(-10000f, -10000f, -10000f), new Vector3f(10000f, 10000f, 10000f), BroadphaseType.DBVT); } + /** + * Instantiate a PhysicsSpace. Must be invoked on the designated physics + * thread. + */ public PhysicsSpace(BroadphaseType broadphaseType) { this(new Vector3f(-10000f, -10000f, -10000f), new Vector3f(10000f, 10000f, 10000f), broadphaseType); } + /** + * Instantiate a PhysicsSpace. Must be invoked on the designated physics + * thread. + */ public PhysicsSpace(Vector3f worldMin, Vector3f worldMax) { this(worldMin, worldMax, BroadphaseType.AXIS_SWEEP_3); } + /** + * Instantiate a PhysicsSpace. Must be invoked on the designated physics + * thread. + * + * @param worldMin the desired minimum coordinates values (not null, + * unaffected, default=-10k,-10k,-10k) + * @param worldMax the desired minimum coordinates values (not null, + * unaffected, default=10k,10k,10k) + * @param broadphaseType which broadphase collision-detection algorithm to + * use (not null) + */ public PhysicsSpace(Vector3f worldMin, Vector3f worldMax, BroadphaseType broadphaseType) { this.worldMin.set(worldMin); this.worldMax.set(worldMax); @@ -151,7 +237,7 @@ public class PhysicsSpace { } /** - * Has to be called from the (designated) physics thread + * Must be invoked on the designated physics thread. */ public void create() { physicsSpaceId = createPhysicsSpace(worldMin.x, worldMin.y, worldMin.z, worldMax.x, worldMax.y, worldMax.z, broadphaseType.ordinal(), false); @@ -192,26 +278,37 @@ public class PhysicsSpace { private native long createPhysicsSpace(float minX, float minY, float minZ, float maxX, float maxY, float maxZ, int broadphaseType, boolean threading); + /** + * Callback invoked just before the physics is stepped. + *

+ * This method is invoked from native code. + * + * @param timeStep the time per physics step (in seconds, ≥0) + */ private void preTick_native(float f) { - AppTask task = pQueue.poll(); - task = pQueue.poll(); - while (task != null) { - while (task.isCancelled()) { - task = pQueue.poll(); - } - try { + AppTask task; + while((task=pQueue.poll())!=null){ + if(task.isCancelled())continue; + try{ task.invoke(); } catch (Exception ex) { logger.log(Level.SEVERE, null, ex); } - task = pQueue.poll(); } + for (Iterator it = tickListeners.iterator(); it.hasNext();) { PhysicsTickListener physicsTickCallback = it.next(); physicsTickCallback.prePhysicsTick(this, f); } } + /** + * Callback invoked just after the physics is stepped. + *

+ * This method is invoked from native code. + * + * @param timeStep the time per physics step (in seconds, ≥0) + */ private void postTick_native(float f) { for (Iterator it = tickListeners.iterator(); it.hasNext();) { PhysicsTickListener physicsTickCallback = it.next(); @@ -219,6 +316,9 @@ public class PhysicsSpace { } } + /** + * This method is invoked from native code. + */ private void addCollision_native() { } @@ -235,7 +335,7 @@ public class PhysicsSpace { // collides = (bp1.collisionFilterGroup & bp.collisionFilterMask) != 0; // } // if (collides) { -// assert (bp.clientObject instanceof com.bulletphysics.collision.dispatch.CollisionObject && bp.clientObject instanceof com.bulletphysics.collision.dispatch.CollisionObject); +// assert (bp.clientObject instanceof com.bulletphysics.collision.dispatch.CollisionObject && bp1.clientObject instanceof com.bulletphysics.collision.dispatch.CollisionObject); // com.bulletphysics.collision.dispatch.CollisionObject colOb = (com.bulletphysics.collision.dispatch.CollisionObject) bp.clientObject; // com.bulletphysics.collision.dispatch.CollisionObject colOb1 = (com.bulletphysics.collision.dispatch.CollisionObject) bp1.clientObject; // assert (colOb.getUserPointer() != null && colOb1.getUserPointer() != null); @@ -338,6 +438,9 @@ public class PhysicsSpace { collisionEvents.add(eventFactory.getEvent(PhysicsCollisionEvent.TYPE_PROCESSED, node, node1, manifoldPointObjectId)); } + /** + * This method is invoked from native code. + */ private boolean notifyCollisionGroupListeners_native(PhysicsCollisionObject node, PhysicsCollisionObject node1){ PhysicsCollisionGroupListener listener = collisionGroupListeners.get(node.getCollisionGroup()); PhysicsCollisionGroupListener listener1 = collisionGroupListeners.get(node1.getCollisionGroup()); @@ -354,19 +457,21 @@ public class PhysicsSpace { } /** - * updates the physics space + * Update this space. Invoked (by the Bullet app state) once per frame while + * the app state is attached and enabled. * - * @param time the current time value + * @param time time-per-frame multiplied by speed (in seconds, ≥0) */ public void update(float time) { update(time, maxSubSteps); } /** - * updates the physics space, uses maxSteps
+ * Simulate for the specified time interval, using no more than the + * specified number of steps. * - * @param time the current time value - * @param maxSteps + * @param time the time interval (in seconds, ≥0) + * @param maxSteps the maximum number of steps (≥1) */ public void update(float time, int maxSteps) { // if (getDynamicsWorld() == null) { @@ -378,6 +483,9 @@ public class PhysicsSpace { private native void stepSimulation(long space, float time, int maxSteps, float accuracy); + /** + * Distribute each collision event to all listeners. + */ public void distributeEvents() { //add collision callbacks int clistsize = collisionListeners.size(); @@ -391,6 +499,13 @@ public class PhysicsSpace { } } + /** + * Enqueue a callable on the currently executing thread. + * + * @param the task's result type + * @param callable the task to be executed + * @return a new task (not null) + */ public static Future enqueueOnThisThread(Callable callable) { AppTask task = new AppTask(callable); System.out.println("created apptask"); @@ -399,11 +514,11 @@ public class PhysicsSpace { } /** - * calls the callable on the next physics tick (ensuring e.g. force - * applying) + * Invoke the specified callable during the next physics tick. This is + * useful for applying forces. * - * @param - * @param callable + * @param the return type of the callable + * @param callable which callable to invoke * @return Future object */ public Future enqueue(Callable callable) { @@ -413,9 +528,10 @@ public class PhysicsSpace { } /** - * adds an object to the physics space + * Add the specified object to this space. * - * @param obj the PhysicsControl or Spatial with PhysicsControl to add + * @param obj the PhysicsControl, Spatial-with-PhysicsControl, + * PhysicsCollisionObject, or PhysicsJoint to add (not null, modified) */ public void add(Object obj) { if (obj instanceof PhysicsControl) { @@ -436,6 +552,11 @@ public class PhysicsSpace { } } + /** + * Add the specified collision object to this space. + * + * @param obj the PhysicsCollisionObject to add (not null, modified) + */ public void addCollisionObject(PhysicsCollisionObject obj) { if (obj instanceof PhysicsGhostObject) { addGhostObject((PhysicsGhostObject) obj); @@ -449,9 +570,9 @@ public class PhysicsSpace { } /** - * removes an object from the physics space + * Remove the specified object from this space. * - * @param obj the PhysicsControl or Spatial with PhysicsControl to remove + * @param obj the PhysicsCollisionObject to add, or null (modified) */ public void remove(Object obj) { if (obj == null) return; @@ -473,6 +594,11 @@ public class PhysicsSpace { } } + /** + * Remove the specified collision object from this space. + * + * @param obj the PhysicsControl or Spatial with PhysicsControl to remove + */ public void removeCollisionObject(PhysicsCollisionObject obj) { if (obj instanceof PhysicsGhostObject) { removeGhostObject((PhysicsGhostObject) obj); @@ -484,9 +610,11 @@ public class PhysicsSpace { } /** - * adds all physics controls and joints in the given spatial node to the physics space - * (e.g. after loading from disk) - recursive if node - * @param spatial the rootnode containing the physics objects + * Add all collision objects and joints in the specified subtree of the + * scene graph to this space (e.g. after loading from disk). Note: + * recursive! + * + * @param spatial the root of the subtree (not null) */ public void addAll(Spatial spatial) { add(spatial); @@ -514,9 +642,11 @@ public class PhysicsSpace { } /** - * Removes all physics controls and joints in the given spatial from the physics space - * (e.g. before saving to disk) - recursive if node - * @param spatial the rootnode containing the physics objects + * Remove all physics controls and joints in the specified subtree of the + * scene graph from the physics space (e.g. before saving to disk) Note: + * recursive! + * + * @param spatial the root of the subtree (not null) */ public void removeAll(Spatial spatial) { if (spatial.getControl(RigidBodyControl.class) != null) { @@ -615,6 +745,12 @@ public class PhysicsSpace { // dynamicsWorld.removeCollisionObject(node.getObjectId()); } + /** + * NOTE: When a rigid body is added, its gravity gets set to that of the + * physics space. + * + * @param node the body to add (not null, not already in the space) + */ private void addRigidBody(PhysicsRigidBody node) { if (physicsBodies.containsKey(node.getObjectId())) { logger.log(Level.WARNING, "RigidBody {0} already exists in PhysicsSpace, cannot add.", node); @@ -623,7 +759,7 @@ public class PhysicsSpace { physicsBodies.put(node.getObjectId(), node); //Workaround - //It seems that adding a Kinematic RigidBody to the dynamicWorld prevent it from being non kinematic again afterward. + //It seems that adding a Kinematic RigidBody to the dynamicWorld prevents it from being non-kinematic again afterward. //so we add it non kinematic, then set it kinematic again. boolean kinematic = false; if (node.isKinematic()) { @@ -637,9 +773,15 @@ public class PhysicsSpace { logger.log(Level.FINE, "Adding RigidBody {0} to physics space.", node.getObjectId()); if (node instanceof PhysicsVehicle) { - logger.log(Level.FINE, "Adding vehicle constraint {0} to physics space.", Long.toHexString(((PhysicsVehicle) node).getVehicleId())); - physicsVehicles.put(((PhysicsVehicle) node).getVehicleId(), (PhysicsVehicle) node); - addVehicle(physicsSpaceId, ((PhysicsVehicle) node).getVehicleId()); + PhysicsVehicle vehicle = (PhysicsVehicle) node; + vehicle.createVehicle(this); + long vehicleId = vehicle.getVehicleId(); + assert vehicleId != 0L; + logger.log(Level.FINE, + "Adding vehicle constraint {0} to physics space.", + Long.toHexString(vehicleId)); + physicsVehicles.put(vehicleId, vehicle); + addVehicle(physicsSpaceId, vehicleId); } } @@ -680,30 +822,64 @@ public class PhysicsSpace { // dynamicsWorld.removeConstraint(joint.getObjectId()); } + /** + * Copy the list of rigid bodies that have been added to this space and not + * yet removed. + * + * @return a new list (not null) + */ public Collection getRigidBodyList() { return new LinkedList(physicsBodies.values()); } + /** + * Copy the list of ghost objects that have been added to this space and not + * yet removed. + * + * @return a new list (not null) + */ public Collection getGhostObjectList() { return new LinkedList(physicsGhostObjects.values()); } + /** + * Copy the list of physics characters that have been added to this space + * and not yet removed. + * + * @return a new list (not null) + */ public Collection getCharacterList() { return new LinkedList(physicsCharacters.values()); } + /** + * Copy the list of physics joints that have been added to this space and + * not yet removed. + * + * @return a new list (not null) + */ public Collection getJointList() { return new LinkedList(physicsJoints.values()); } + /** + * Copy the list of physics vehicles that have been added to this space and + * not yet removed. + * + * @return a new list (not null) + */ public Collection getVehicleList() { return new LinkedList(physicsVehicles.values()); } /** - * Sets the gravity of the PhysicsSpace, set before adding physics objects! + * Alter the gravitational acceleration acting on newly-added bodies. + *

+ * Whenever a rigid body is added to a space, the body's gravity gets set to + * that of the space. Thus it makes sense to set the space's vector before + * adding any bodies to the space. * - * @param gravity + * @param gravity the desired acceleration vector (not null, unaffected) */ public void setGravity(Vector3f gravity) { this.gravity.set(gravity); @@ -712,8 +888,17 @@ public class PhysicsSpace { private native void setGravity(long spaceId, Vector3f gravity); - //TODO: getGravity + /** + * copy of gravity-acceleration vector (default is 9.81 in the -Y direction, + * corresponding to Earth-normal in MKS units) + */ private final Vector3f gravity = new Vector3f(0,-9.81f,0); + /** + * Copy the gravitational acceleration acting on newly-added bodies. + * + * @param gravity storage for the result (not null, modified) + * @return acceleration (in the vector provided) + */ public Vector3f getGravity(Vector3f gravity) { return gravity.set(this.gravity); } @@ -733,57 +918,89 @@ public class PhysicsSpace { // } // /** - * Adds the specified listener to the physics tick listeners. The listeners - * are called on each physics step, which is not necessarily each frame but - * is determined by the accuracy of the physics space. + * Register the specified tick listener with this space. + *

+ * Tick listeners are notified before and after each physics step. A physics + * step is not necessarily the same as a frame; it is more influenced by the + * accuracy of the physics space. + * + * @see #setAccuracy(float) * - * @param listener + * @param listener the listener to register (not null) */ public void addTickListener(PhysicsTickListener listener) { tickListeners.add(listener); } + /** + * De-register the specified tick listener. + * + * @see #addTickListener(com.jme3.bullet.PhysicsTickListener) + * @param listener the listener to de-register (not null) + */ public void removeTickListener(PhysicsTickListener listener) { tickListeners.remove(listener); } /** - * Adds a CollisionListener that will be informed about collision events + * Register the specified collision listener with this space. + *

+ * Collision listeners are notified when collisions occur in the space. * - * @param listener the CollisionListener to add + * @param listener the listener to register (not null, alias created) */ public void addCollisionListener(PhysicsCollisionListener listener) { collisionListeners.add(listener); } /** - * Removes a CollisionListener from the list + * De-register the specified collision listener. * - * @param listener the CollisionListener to remove + * @see + * #addCollisionListener(com.jme3.bullet.collision.PhysicsCollisionListener) + * @param listener the listener to de-register (not null) */ public void removeCollisionListener(PhysicsCollisionListener listener) { collisionListeners.remove(listener); } /** - * Adds a listener for a specific collision group, such a listener can - * disable collisions when they happen.
There can be only one listener - * per collision group. + * Register the specified collision-group listener with the specified + * collision group of this space. + *

+ * Such a listener can disable collisions when they occur. There can be only + * one listener per collision group per space. * - * @param listener - * @param collisionGroup + * @param listener the listener to register (not null) + * @param collisionGroup which group it should listen for (bit mask with + * exactly one bit set) */ public void addCollisionGroupListener(PhysicsCollisionGroupListener listener, int collisionGroup) { collisionGroupListeners.put(collisionGroup, listener); } + /** + * De-register the specified collision-group listener. + * + * @see + * #addCollisionGroupListener(com.jme3.bullet.collision.PhysicsCollisionGroupListener, + * int) + * @param collisionGroup the group of the listener to de-register (bit mask + * with exactly one bit set) + */ public void removeCollisionGroupListener(int collisionGroup) { collisionGroupListeners.remove(collisionGroup); } /** - * Performs a ray collision test and returns the results as a list of - * PhysicsRayTestResults ordered by it hitFraction (lower to higher) + * Perform a ray-collision test and return the results as a list of + * PhysicsRayTestResults sorted by ascending hitFraction. + * + * @param from the starting location (physics-space coordinates, not null, + * unaffected) + * @param to the ending location (in physics-space coordinates, not null, + * unaffected) + * @return a new list of results (not null) */ public List rayTest(Vector3f from, Vector3f to) { List results = new ArrayList(); @@ -793,8 +1010,14 @@ public class PhysicsSpace { } /** - * Performs a ray collision test and returns the results as a list of - * PhysicsRayTestResults without performing any sort operation + * Perform a ray-collision test and return the results as a list of + * PhysicsRayTestResults in arbitrary order. + * + * @param from the starting location (in physics-space coordinates, not + * null, unaffected) + * @param to the ending location (in physics-space coordinates, not null, + * unaffected) + * @return a new list of results (not null) */ public List rayTestRaw(Vector3f from, Vector3f to) { List results = new ArrayList(); @@ -804,17 +1027,22 @@ public class PhysicsSpace { } /** - * Sets m_flags for raytest, see https://code.google.com/p/bullet/source/browse/trunk/src/BulletCollision/NarrowPhaseCollision/btRaycastCallback.h + * Alters the m_flags used in ray tests. see + * https://code.google.com/p/bullet/source/browse/trunk/src/BulletCollision/NarrowPhaseCollision/btRaycastCallback.h * for possible options. Defaults to using the faster, approximate raytest. + * + * @param flags the desired flags, ORed together (default=0x4) */ public void SetRayTestFlags(int flags) { rayTestFlags = flags; } /** - * Gets m_flags for raytest, see https://code.google.com/p/bullet/source/browse/trunk/src/BulletCollision/NarrowPhaseCollision/btRaycastCallback.h + * Reads m_flags used in ray tests. see + * https://code.google.com/p/bullet/source/browse/trunk/src/BulletCollision/NarrowPhaseCollision/btRaycastCallback.h * for possible options. - * @return rayTestFlags + * + * @return which flags are used */ public int GetRayTestFlags() { return rayTestFlags; @@ -829,8 +1057,15 @@ public class PhysicsSpace { }; /** - * Performs a ray collision test and returns the results as a list of - * PhysicsRayTestResults ordered by it hitFraction (lower to higher) + * Perform a ray-collision test and return the results as a list of + * PhysicsRayTestResults sorted by ascending hitFraction. + * + * @param from coordinates of the starting location (in physics space, not + * null, unaffected) + * @param to coordinates of the ending location (in physics space, not null, + * unaffected) + * @param results the list to hold results (not null, modified) + * @return results */ public List rayTest(Vector3f from, Vector3f to, List results) { results.clear(); @@ -841,8 +1076,15 @@ public class PhysicsSpace { } /** - * Performs a ray collision test and returns the results as a list of - * PhysicsRayTestResults without performing any sort operation + * Perform a ray-collision test and return the results as a list of + * PhysicsRayTestResults in arbitrary order. + * + * @param from coordinates of the starting location (in physics space, not + * null, unaffected) + * @param to coordinates of the ending location (in physics space, not null, + * unaffected) + * @param results the list to hold results (not null, modified) + * @return results */ public List rayTestRaw(Vector3f from, Vector3f to, List results) { results.clear(); @@ -872,11 +1114,18 @@ public class PhysicsSpace { /** - * Performs a sweep collision test and returns the results as a list of - * PhysicsSweepTestResults
You have to use different Transforms for - * start and end (at least distance > 0.4f). SweepTest will not see a - * collision if it starts INSIDE an object and is moving AWAY from its - * center. + * Perform a sweep-collision test and return the results as a new list. + *

+ * The starting and ending locations must be at least 0.4f physics-space + * units apart. + *

+ * A sweep test will miss a collision if it starts inside an object and + * sweeps away from the object's center. + * + * @param shape the shape to sweep (not null) + * @param start the starting physics-space transform (not null) + * @param end the ending physics-space transform (not null) + * @return a new list of results */ public List sweepTest(CollisionShape shape, Transform start, Transform end) { List results = new LinkedList(); @@ -884,17 +1133,41 @@ public class PhysicsSpace { return (List) results; } + /** + * Perform a sweep-collision test and store the results in an existing list. + *

+ * The starting and ending locations must be at least 0.4f physics-space + * units apart. + *

+ * A sweep test will miss a collision if it starts inside an object and + * sweeps away from the object's center. + * + * @param shape the shape to sweep (not null) + * @param start the starting physics-space transform (not null) + * @param end the ending physics-space transform (not null) + * @param results the list to hold results (not null, modified) + * @return results + */ public List sweepTest(CollisionShape shape, Transform start, Transform end, List results) { return sweepTest(shape, start, end, results, 0.0f); } public native void sweepTest_native(long shape, Transform from, Transform to, long physicsSpaceId, List results, float allowedCcdPenetration); /** - * Performs a sweep collision test and returns the results as a list of - * PhysicsSweepTestResults
You have to use different Transforms for - * start and end (at least distance > allowedCcdPenetration). SweepTest will not see a - * collision if it starts INSIDE an object and is moving AWAY from its - * center. + * Perform a sweep-collision test and store the results in an existing list. + *

+ * The starting and ending locations must be at least 0.4f physics-space + * units apart. + *

+ * A sweep test will miss a collision if it starts inside an object and + * sweeps away from the object's center. + * + * @param shape the shape to sweep (not null) + * @param start the starting physics-space transform (not null) + * @param end the ending physics-space transform (not null) + * @param results the list to hold results (not null, modified) + * @param allowedCcdPenetration true→allow, false→disallow + * @return results */ public List sweepTest(CollisionShape shape, Transform start, Transform end, List results, float allowedCcdPenetration ) { results.clear(); @@ -921,7 +1194,7 @@ public class PhysicsSpace { */ /** - * destroys the current PhysicsSpace so that a new one can be created + * Destroy this space so that a new one can be instantiated. */ public void destroy() { physicsBodies.clear(); @@ -940,59 +1213,87 @@ public class PhysicsSpace { return physicsSpaceId; } + /** + * Read the type of acceleration structure used. + * + * @return an enum value (not null) + */ public BroadphaseType getBroadphaseType() { return broadphaseType; } + /** + * Alter the type of acceleration structure used. + * + * @param broadphaseType the desired algorithm (not null) + */ public void setBroadphaseType(BroadphaseType broadphaseType) { this.broadphaseType = broadphaseType; } /** - * Sets the maximum amount of extra steps that will be used to step the - * physics when the fps is below the physics fps. Doing this maintains - * determinism in physics. For example a maximum number of 2 can compensate - * for framerates as low as 30fps when the physics has the default accuracy - * of 60 fps. Note that setting this value too high can make the physics - * drive down its own fps in case its overloaded. + * Alter the maximum number of physics steps per frame. + *

+ * Extra physics steps help maintain determinism when the render fps drops + * below 1/accuracy. For example a value of 2 can compensate for frame rates + * as low as 30fps, assuming the physics has an accuracy of 1/60 sec. + *

+ * Setting this value too high can depress the frame rate. * - * @param steps The maximum number of extra steps, default is 4. + * @param steps the desired maximum number of steps per frame (≥1, + * default=4) */ public void setMaxSubSteps(int steps) { maxSubSteps = steps; } /** - * get the current accuracy of the physics computation + * Read the accuracy (time step) of the physics simulation. * - * @return the current accuracy + * @return the timestep (in seconds, >0) */ public float getAccuracy() { return accuracy; } /** - * sets the accuracy of the physics computation, default=1/60s
+ * Alter the accuracy (time step) of the physics simulation. + *

+ * In general, the smaller the time step, the more accurate (and + * compute-intensive) the simulation will be. Bullet works best with a + * time step of no more than 1/60 second. * - * @param accuracy + * @param accuracy the desired time step (in seconds, >0, default=1/60) */ public void setAccuracy(float accuracy) { this.accuracy = accuracy; } + /** + * Access the minimum coordinate values for this space. + * + * @return the pre-existing vector + */ public Vector3f getWorldMin() { return worldMin; } /** - * only applies for AXIS_SWEEP broadphase + * Alter the minimum coordinate values for this space. (only affects + * AXIS_SWEEP broadphase algorithms) * - * @param worldMin + * @param worldMin the desired minimum coordinate values (not null, + * unaffected) */ public void setWorldMin(Vector3f worldMin) { this.worldMin.set(worldMin); } + /** + * Access the maximum coordinate values for this space. + * + * @return the pre-existing vector (not null) + */ public Vector3f getWorldMax() { return worldMax; } @@ -1007,11 +1308,11 @@ public class PhysicsSpace { } /** - * Set the number of iterations used by the contact solver. - * - * The default is 10. Use 4 for low quality, 20 for high quality. - * - * @param numIterations The number of iterations used by the contact & constraint solver. + * Alter the number of iterations used by the contact-and-constraint solver. + *

+ * Use 4 for low quality, 20 for high quality. + * + * @param numIterations the desired number of iterations (≥1, default=10) */ public void setSolverNumIterations(int numIterations) { this.solverNumIterations = numIterations; @@ -1019,9 +1320,9 @@ public class PhysicsSpace { } /** - * Get the number of iterations used by the contact solver. - * - * @return The number of iterations used by the contact & constraint solver. + * Read the number of iterations used by the contact-and-constraint solver. + * + * @return the number of iterations used */ public int getSolverNumIterations() { return solverNumIterations; @@ -1032,28 +1333,40 @@ public class PhysicsSpace { public static native void initNativePhysics(); /** - * interface with Broadphase types + * Enumerate the available acceleration structures for broadphase collision + * detection. */ public enum BroadphaseType { /** - * basic Broadphase + * btSimpleBroadphase: a brute-force reference implementation for + * debugging purposes */ SIMPLE, /** - * better Broadphase, needs worldBounds , max Object number = 16384 + * btAxisSweep3: uses incremental 3-D sweep and prune, requires world + * bounds, limited to 16_384 objects */ AXIS_SWEEP_3, /** - * better Broadphase, needs worldBounds , max Object number = 65536 + * bt32BitAxisSweep3: uses incremental 3-D sweep and prune, requires + * world bounds, limited to 65_536 objects */ AXIS_SWEEP_3_32, /** - * Broadphase allowing quicker adding/removing of physics objects + * btDbvtBroadphase: uses a fast, dynamic bounding-volume hierarchy + * based on AABB tree to allow quicker addition/removal of physics + * objects */ DBVT; } + /** + * Finalize this physics space just before it is destroyed. Should be + * invoked only by a subclass or by the garbage collector. + * + * @throws Throwable ignored by the garbage collector + */ @Override protected void finalize() throws Throwable { super.finalize(); diff --git a/jme3-bullet/src/main/java/com/jme3/bullet/collision/CollisionFlag.java b/jme3-bullet/src/main/java/com/jme3/bullet/collision/CollisionFlag.java new file mode 100644 index 000000000..6445af53f --- /dev/null +++ b/jme3-bullet/src/main/java/com/jme3/bullet/collision/CollisionFlag.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2018 jMonkeyEngine + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'jMonkeyEngine' nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package com.jme3.bullet.collision; + +/** + * Named collision flags for a {@link PhysicsCollisionObject}. Values must agree + * with those in BulletCollision/CollisionDispatch/btCollisionObject.h + * + * @author Stephen Gold sgold@sonic.net + * @see PhysicsCollisionObject#getCollisionFlags(long) + */ +public class CollisionFlag { + /** + * flag for a static object + */ + final public static int STATIC_OBJECT = 0x1; + /** + * flag for a kinematic object + */ + final public static int KINEMATIC_OBJECT = 0x2; + /** + * flag for an object with no contact response, such as a PhysicsGhostObject + */ + final public static int NO_CONTACT_RESPONSE = 0x4; + /** + * flag to enable a custom material callback for per-triangle + * friction/restitution (not used by JME) + */ + final public static int CUSTOM_MATERIAL_CALLBACK = 0x8; + /** + * flag for a character object, such as a PhysicsCharacter + */ + final public static int CHARACTER_OBJECT = 0x10; + /** + * flag to disable debug visualization (not used by JME) + */ + final public static int DISABLE_VISUALIZE_OBJECT = 0x20; + /** + * flag to disable parallel/SPU processing (not used by JME) + */ + final public static int DISABLE_SPU_COLLISION_PROCESSING = 0x40; + /** + * flag not used by JME + */ + final public static int HAS_CONTACT_STIFFNESS_DAMPING = 0x80; + /** + * flag not used by JME + */ + final public static int HAS_CUSTOM_DEBUG_RENDERING_COLOR = 0x100; + /** + * flag not used by JME + */ + final public static int HAS_FRICTION_ANCHOR = 0x200; + /** + * flag not used by JME + */ + final public static int HAS_COLLISION_SOUND_TRIGGER = 0x400; +} diff --git a/jme3-bullet/src/main/java/com/jme3/bullet/collision/PhysicsCollisionEvent.java b/jme3-bullet/src/main/java/com/jme3/bullet/collision/PhysicsCollisionEvent.java index 0022ebd1c..bb6276002 100644 --- a/jme3-bullet/src/main/java/com/jme3/bullet/collision/PhysicsCollisionEvent.java +++ b/jme3-bullet/src/main/java/com/jme3/bullet/collision/PhysicsCollisionEvent.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -36,21 +36,53 @@ import com.jme3.scene.Spatial; import java.util.EventObject; /** - * A CollisionEvent stores all information about a collision in the PhysicsWorld. - * Do not store this Object, as it will be reused after the collision() method has been called. - * Get/reference all data you need in the collide method. + * Describe a collision in the physics world. + *

+ * Do not retain this object, as it will be reused after the collision() method + * returns. Copy any data you need during the collide() method. + * * @author normenhansen */ public class PhysicsCollisionEvent extends EventObject { + /** + * type value to indicate a new event + */ public static final int TYPE_ADDED = 0; + /** + * type value to indicate an event that has been added to a PhysicsSpace + * queue + */ public static final int TYPE_PROCESSED = 1; + /** + * type value to indicate a cleaned/destroyed event + */ public static final int TYPE_DESTROYED = 2; + /** + * type value that indicates the event's status + */ private int type; + /** + * 1st involved object + */ private PhysicsCollisionObject nodeA; + /** + * 2nd involved object + */ private PhysicsCollisionObject nodeB; + /** + * Bullet identifier of the btManifoldPoint + */ private long manifoldPointObjectId = 0; + /** + * Instantiate a collision event. + * + * @param type event type (0=added/1=processed/2=destroyed) + * @param nodeA 1st involved object (alias created) + * @param nodeB 2nd involved object (alias created) + * @param manifoldPointObjectId Bullet identifier of the btManifoldPoint + */ public PhysicsCollisionEvent(int type, PhysicsCollisionObject nodeA, PhysicsCollisionObject nodeB, long manifoldPointObjectId) { super(nodeA); this.type = type; @@ -58,9 +90,9 @@ public class PhysicsCollisionEvent extends EventObject { this.nodeB = nodeB; this.manifoldPointObjectId = manifoldPointObjectId; } - + /** - * used by event factory, called when event is destroyed + * Destroy this event. */ public void clean() { source = null; @@ -71,7 +103,12 @@ public class PhysicsCollisionEvent extends EventObject { } /** - * used by event factory, called when event reused + * Reuse this event. + * + * @param type event type (added/processed/destroyed) + * @param source 1st involved object (alias created) + * @param nodeB 2nd involved object (alias created) + * @param manifoldPointObjectId Bullet identifier */ public void refactor(int type, PhysicsCollisionObject source, PhysicsCollisionObject nodeB, long manifoldPointObjectId) { this.source = source; @@ -81,12 +118,19 @@ public class PhysicsCollisionEvent extends EventObject { this.manifoldPointObjectId = manifoldPointObjectId; } + /** + * Read the type of event. + * + * @return added/processed/destroyed + */ public int getType() { return type; } /** - * @return A Spatial if the UserObject of the PhysicsCollisionObject is a Spatial + * Access the user object of collision object A, provided it's a Spatial. + * + * @return the pre-existing Spatial, or null if none */ public Spatial getNodeA() { if (nodeA.getUserObject() instanceof Spatial) { @@ -96,7 +140,9 @@ public class PhysicsCollisionEvent extends EventObject { } /** - * @return A Spatial if the UserObject of the PhysicsCollisionObject is a Spatial + * Access the user object of collision object B, provided it's a Spatial. + * + * @return the pre-existing Spatial, or null if none */ public Spatial getNodeB() { if (nodeB.getUserObject() instanceof Spatial) { @@ -105,139 +151,286 @@ public class PhysicsCollisionEvent extends EventObject { return null; } + /** + * Access collision object A. + * + * @return the pre-existing object (not null) + */ public PhysicsCollisionObject getObjectA() { return nodeA; } + /** + * Access collision object B. + * + * @return the pre-existing object (not null) + */ public PhysicsCollisionObject getObjectB() { return nodeB; } + /** + * Read the collision's applied impulse. + * + * @return impulse + */ public float getAppliedImpulse() { return getAppliedImpulse(manifoldPointObjectId); } private native float getAppliedImpulse(long manifoldPointObjectId); + /** + * Read the collision's applied lateral impulse #1. + * + * @return impulse + */ public float getAppliedImpulseLateral1() { return getAppliedImpulseLateral1(manifoldPointObjectId); } private native float getAppliedImpulseLateral1(long manifoldPointObjectId); + /** + * Read the collision's applied lateral impulse #2. + * + * @return impulse + */ public float getAppliedImpulseLateral2() { return getAppliedImpulseLateral2(manifoldPointObjectId); } private native float getAppliedImpulseLateral2(long manifoldPointObjectId); + /** + * Read the collision's combined friction. + * + * @return friction + */ public float getCombinedFriction() { return getCombinedFriction(manifoldPointObjectId); } private native float getCombinedFriction(long manifoldPointObjectId); + /** + * Read the collision's combined restitution. + * + * @return restitution + */ public float getCombinedRestitution() { return getCombinedRestitution(manifoldPointObjectId); } private native float getCombinedRestitution(long manifoldPointObjectId); + /** + * Read the collision's distance #1. + * + * @return distance + */ public float getDistance1() { return getDistance1(manifoldPointObjectId); } private native float getDistance1(long manifoldPointObjectId); + /** + * Read the collision's index 0. + * + * @return index + */ public int getIndex0() { return getIndex0(manifoldPointObjectId); } private native int getIndex0(long manifoldPointObjectId); + /** + * Read the collision's index 1. + * + * @return index + */ public int getIndex1() { return getIndex1(manifoldPointObjectId); } private native int getIndex1(long manifoldPointObjectId); + /** + * Copy the collision's lateral friction direction #1. + * + * @return a new vector (not null) + */ public Vector3f getLateralFrictionDir1() { return getLateralFrictionDir1(new Vector3f()); } + /** + * Copy the collision's lateral friction direction #1. + * + * @param lateralFrictionDir1 storage for the result (not null, modified) + * @return direction vector (not null) + */ public Vector3f getLateralFrictionDir1(Vector3f lateralFrictionDir1) { getLateralFrictionDir1(manifoldPointObjectId, lateralFrictionDir1); return lateralFrictionDir1; } private native void getLateralFrictionDir1(long manifoldPointObjectId, Vector3f lateralFrictionDir1); + /** + * Copy the collision's lateral friction direction #2. + * + * @return a new vector + */ public Vector3f getLateralFrictionDir2() { return getLateralFrictionDir2(new Vector3f()); } + /** + * Copy the collision's lateral friction direction #2. + * + * @param lateralFrictionDir2 storage for the result (not null, modified) + * @return direction vector (not null) + */ public Vector3f getLateralFrictionDir2(Vector3f lateralFrictionDir2) { getLateralFrictionDir2(manifoldPointObjectId, lateralFrictionDir2); return lateralFrictionDir2; } private native void getLateralFrictionDir2(long manifoldPointObjectId, Vector3f lateralFrictionDir2); + /** + * Test whether the collision's lateral friction is initialized. + * + * @return true if initialized, otherwise false + */ public boolean isLateralFrictionInitialized() { return isLateralFrictionInitialized(manifoldPointObjectId); } private native boolean isLateralFrictionInitialized(long manifoldPointObjectId); + /** + * Read the collision's lifetime. + * + * @return lifetime + */ public int getLifeTime() { return getLifeTime(manifoldPointObjectId); } private native int getLifeTime(long manifoldPointObjectId); + /** + * Copy the collision's location in the local coordinates of object A. + * + * @return a new location vector (in local coordinates, not null) + */ public Vector3f getLocalPointA() { return getLocalPointA(new Vector3f()); } + /** + * Copy the collision's location in the local coordinates of object A. + * + * @param localPointA storage for the result (not null, modified) + * @return a location vector (in local coordinates, not null) + */ public Vector3f getLocalPointA(Vector3f localPointA) { getLocalPointA(manifoldPointObjectId, localPointA); return localPointA; } private native void getLocalPointA(long manifoldPointObjectId, Vector3f localPointA); + /** + * Copy the collision's location in the local coordinates of object B. + * + * @return a new location vector (in local coordinates, not null) + */ public Vector3f getLocalPointB() { return getLocalPointB(new Vector3f()); } + /** + * Copy the collision's location in the local coordinates of object B. + * + * @param localPointB storage for the result (not null, modified) + * @return a location vector (in local coordinates, not null) + */ public Vector3f getLocalPointB(Vector3f localPointB) { getLocalPointB(manifoldPointObjectId, localPointB); return localPointB; } private native void getLocalPointB(long manifoldPointObjectId, Vector3f localPointB); + /** + * Copy the collision's normal on object B. + * + * @return a new normal vector (in physics-space coordinates, not null) + */ public Vector3f getNormalWorldOnB() { return getNormalWorldOnB(new Vector3f()); } + /** + * Copy the collision's normal on object B. + * + * @param normalWorldOnB storage for the result (not null, modified) + * @return a normal vector (in physics-space coordinates, not null) + */ public Vector3f getNormalWorldOnB(Vector3f normalWorldOnB) { getNormalWorldOnB(manifoldPointObjectId, normalWorldOnB); return normalWorldOnB; } private native void getNormalWorldOnB(long manifoldPointObjectId, Vector3f normalWorldOnB); + /** + * Read part identifier 0. + * + * @return identifier + */ public int getPartId0() { return getPartId0(manifoldPointObjectId); } private native int getPartId0(long manifoldPointObjectId); + /** + * Read part identifier 1. + * + * @return identifier + */ public int getPartId1() { return getPartId1(manifoldPointObjectId); } private native int getPartId1(long manifoldPointObjectId); + /** + * Copy the collision's location. + * + * @return a new vector (in physics-space coordinates, not null) + */ public Vector3f getPositionWorldOnA() { return getPositionWorldOnA(new Vector3f()); } + /** + * Copy the collision's location. + * + * @param positionWorldOnA storage for the result (not null, modified) + * @return a location vector (in physics-space coordinates, not null) + */ public Vector3f getPositionWorldOnA(Vector3f positionWorldOnA) { getPositionWorldOnA(manifoldPointObjectId, positionWorldOnA); return positionWorldOnA; } private native void getPositionWorldOnA(long manifoldPointObjectId, Vector3f positionWorldOnA); + /** + * Copy the collision's location. + * + * @return a new location vector (in physics-space coordinates, not null) + */ public Vector3f getPositionWorldOnB() { return getPositionWorldOnB(new Vector3f()); } + /** + * Copy the collision's location. + * + * @param positionWorldOnB storage for the result (not null, modified) + * @return a location vector (in physics-space coordinates, not null) + */ public Vector3f getPositionWorldOnB(Vector3f positionWorldOnB) { getPositionWorldOnB(manifoldPointObjectId, positionWorldOnB); return positionWorldOnB; diff --git a/jme3-bullet/src/main/java/com/jme3/bullet/collision/PhysicsCollisionEventFactory.java b/jme3-bullet/src/main/java/com/jme3/bullet/collision/PhysicsCollisionEventFactory.java index 8c328a15f..d8eb11879 100644 --- a/jme3-bullet/src/main/java/com/jme3/bullet/collision/PhysicsCollisionEventFactory.java +++ b/jme3-bullet/src/main/java/com/jme3/bullet/collision/PhysicsCollisionEventFactory.java @@ -41,6 +41,11 @@ public class PhysicsCollisionEventFactory { private ConcurrentLinkedQueue eventBuffer = new ConcurrentLinkedQueue(); + /** + * Obtain an unused event. + * + * @return an event (not null) + */ public PhysicsCollisionEvent getEvent(int type, PhysicsCollisionObject source, PhysicsCollisionObject nodeB, long manifoldPointObjectId) { PhysicsCollisionEvent event = eventBuffer.poll(); if (event == null) { @@ -51,6 +56,11 @@ public class PhysicsCollisionEventFactory { return event; } + /** + * Recycle the specified event. + * + * @param event + */ public void recycle(PhysicsCollisionEvent event) { event.clean(); eventBuffer.add(event); diff --git a/jme3-bullet/src/main/java/com/jme3/bullet/collision/PhysicsCollisionObject.java b/jme3-bullet/src/main/java/com/jme3/bullet/collision/PhysicsCollisionObject.java index c9299f2d0..ea8ced87c 100644 --- a/jme3-bullet/src/main/java/com/jme3/bullet/collision/PhysicsCollisionObject.java +++ b/jme3-bullet/src/main/java/com/jme3/bullet/collision/PhysicsCollisionObject.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -38,67 +38,147 @@ import java.util.logging.Level; import java.util.logging.Logger; /** - * Base class for collision objects (PhysicsRigidBody, PhysicsGhostObject) + * The abstract base class for collision objects based on Bullet's + * btCollisionObject. + *

+ * Collision objects include PhysicsCharacter, PhysicsRigidBody, and + * PhysicsGhostObject. + * * @author normenhansen */ public abstract class PhysicsCollisionObject implements Savable { + /** + * Unique identifier of the btCollisionObject. Constructors are responsible + * for setting this to a non-zero value. The id might change if the object + * gets rebuilt. + */ protected long objectId = 0; + /** + * shape associated with this object (not null) + */ protected CollisionShape collisionShape; + /** + * collideWithGroups bitmask that represents "no groups" + */ public static final int COLLISION_GROUP_NONE = 0x00000000; + /** + * collisionGroup/collideWithGroups bitmask that represents group #1 + */ public static final int COLLISION_GROUP_01 = 0x00000001; + /** + * collisionGroup/collideWithGroups bitmask that represents group #2 + */ public static final int COLLISION_GROUP_02 = 0x00000002; + /** + * collisionGroup/collideWithGroups bitmask that represents group #3 + */ public static final int COLLISION_GROUP_03 = 0x00000004; + /** + * collisionGroup/collideWithGroups bitmask that represents group #4 + */ public static final int COLLISION_GROUP_04 = 0x00000008; + /** + * collisionGroup/collideWithGroups bitmask that represents group #5 + */ public static final int COLLISION_GROUP_05 = 0x00000010; + /** + * collisionGroup/collideWithGroups bitmask that represents group #6 + */ public static final int COLLISION_GROUP_06 = 0x00000020; + /** + * collisionGroup/collideWithGroups bitmask that represents group #7 + */ public static final int COLLISION_GROUP_07 = 0x00000040; + /** + * collisionGroup/collideWithGroups bitmask that represents group #8 + */ public static final int COLLISION_GROUP_08 = 0x00000080; + /** + * collisionGroup/collideWithGroups bitmask that represents group #9 + */ public static final int COLLISION_GROUP_09 = 0x00000100; + /** + * collisionGroup/collideWithGroups bitmask that represents group #10 + */ public static final int COLLISION_GROUP_10 = 0x00000200; + /** + * collisionGroup/collideWithGroups bitmask that represents group #11 + */ public static final int COLLISION_GROUP_11 = 0x00000400; + /** + * collisionGroup/collideWithGroups bitmask that represents group #12 + */ public static final int COLLISION_GROUP_12 = 0x00000800; + /** + * collisionGroup/collideWithGroups bitmask that represents group #13 + */ public static final int COLLISION_GROUP_13 = 0x00001000; + /** + * collisionGroup/collideWithGroups bitmask that represents group #14 + */ public static final int COLLISION_GROUP_14 = 0x00002000; + /** + * collisionGroup/collideWithGroups bitmask that represents group #15 + */ public static final int COLLISION_GROUP_15 = 0x00004000; + /** + * collisionGroup/collideWithGroups bitmask that represents group #16 + */ public static final int COLLISION_GROUP_16 = 0x00008000; + /** + * collision group to which this physics object belongs (default=group #1) + */ protected int collisionGroup = 0x00000001; + /** + * collision groups with which this object can collide (default=only group + * #1) + */ protected int collisionGroupsMask = 0x00000001; private Object userObject; /** - * Sets a CollisionShape to this physics object, note that the object should - * not be in the physics space when adding a new collision shape as it is rebuilt - * on the physics side. - * @param collisionShape the CollisionShape to set + * Apply the specified CollisionShape to this object. Note that the object + * should not be in any physics space while changing shape; the object gets + * rebuilt on the physics side. + * + * @param collisionShape the shape to apply (not null, alias created) */ public void setCollisionShape(CollisionShape collisionShape) { this.collisionShape = collisionShape; } /** - * @return the CollisionShape of this PhysicsNode, to be able to reuse it with - * other physics nodes (increases performance) + * Access the shape of this physics object. + * + * @return the pre-existing instance, which can then be applied to other + * physics objects (increases performance) */ public CollisionShape getCollisionShape() { return collisionShape; } /** - * Returns the collision group for this collision shape - * @return The collision group + * Read the collision group for this physics object. + * + * @return the collision group (bit mask with exactly one bit set) */ public int getCollisionGroup() { return collisionGroup; } /** - * Sets the collision group number for this physics object.
- * The groups are integer bit masks and some pre-made variables are available in CollisionObject. - * All physics objects are by default in COLLISION_GROUP_01.
- * Two object will collide when one of the partys has the - * collisionGroup of the other in its collideWithGroups set. - * @param collisionGroup the collisionGroup to set + * Alter the collision group for this physics object. + *

+ * Groups are represented by integer bit masks with exactly 1 bit set. + * Pre-made variables are available in PhysicsCollisionObject. By default, + * physics objects are in COLLISION_GROUP_01. + *

+ * Two objects can collide only if one of them has the collisionGroup of the + * other in its collideWithGroups set. + * + * @param collisionGroup the collisionGroup to apply (bit mask with exactly + * 1 bit set) */ public void setCollisionGroup(int collisionGroup) { this.collisionGroup = collisionGroup; @@ -108,10 +188,12 @@ public abstract class PhysicsCollisionObject implements Savable { } /** - * Add a group that this object will collide with.
- * Two object will collide when one of the partys has the - * collisionGroup of the other in its collideWithGroups set.
- * @param collisionGroup + * Add collision groups to the set with which this object can collide. + * + * Two objects can collide only if one of them has the collisionGroup of the + * other in its collideWithGroups set. + * + * @param collisionGroup groups to add (bit mask) */ public void addCollideWithGroup(int collisionGroup) { this.collisionGroupsMask = this.collisionGroupsMask | collisionGroup; @@ -121,8 +203,9 @@ public abstract class PhysicsCollisionObject implements Savable { } /** - * Remove a group from the list this object collides with. - * @param collisionGroup + * Remove collision groups from the set with which this object can collide. + * + * @param collisionGroup groups to remove, ORed together (bit mask) */ public void removeCollideWithGroup(int collisionGroup) { this.collisionGroupsMask = this.collisionGroupsMask & ~collisionGroup; @@ -132,8 +215,9 @@ public abstract class PhysicsCollisionObject implements Savable { } /** - * Directly set the bitmask for collision groups that this object collides with. - * @param collisionGroups + * Directly alter the collision groups with which this object can collide. + * + * @param collisionGroups desired groups, ORed together (bit mask) */ public void setCollideWithGroups(int collisionGroups) { this.collisionGroupsMask = collisionGroups; @@ -143,13 +227,18 @@ public abstract class PhysicsCollisionObject implements Savable { } /** - * Gets the bitmask of collision groups that this object collides with. - * @return Collision groups mask + * Read the set of collision groups with which this object can collide. + * + * @return bit mask */ public int getCollideWithGroups() { return collisionGroupsMask; } + /** + * Initialize the user pointer and collision-group information of this + * object. + */ protected void initUserPointer() { Logger.getLogger(this.getClass().getName()).log(Level.FINE, "initUserPointer() objectId = {0}", Long.toHexString(objectId)); initUserPointer(objectId, collisionGroup, collisionGroupsMask); @@ -157,27 +246,62 @@ public abstract class PhysicsCollisionObject implements Savable { native void initUserPointer(long objectId, int group, int groups); /** - * @return the userObject + * Access the user object associated with this collision object. + * + * @return the pre-existing instance, or null if none */ public Object getUserObject() { return userObject; } /** - * @param userObject the userObject to set + * Test whether this object responds to contact with other objects. + * + * @return true if responsive, otherwise false + */ + public boolean isContactResponse() { + int flags = getCollisionFlags(objectId); + boolean result = (flags & CollisionFlag.NO_CONTACT_RESPONSE) == 0x0; + return result; + } + + /** + * Associate a user object (such as a Spatial) with this collision object. + * + * @param userObject the object to associate with this collision object + * (alias created, may be null) */ public void setUserObject(Object userObject) { this.userObject = userObject; } - public long getObjectId(){ + /** + * Read the id of the btCollisionObject. + * + * @return the unique identifier (not zero) + */ + public long getObjectId(){ return objectId; } + /** + * Attach the identified btCollisionShape to the identified + * btCollisionObject. Native method. + * + * @param objectId the unique identifier of the btCollisionObject (not zero) + * @param collisionShapeId the unique identifier of the btCollisionShape + * (not zero) + */ protected native void attachCollisionShape(long objectId, long collisionShapeId); native void setCollisionGroup(long objectId, int collisionGroup); native void setCollideWithGroups(long objectId, int collisionGroups); + /** + * Serialize this object, for example when saving to a J3O file. + * + * @param e exporter (not null) + * @throws IOException from exporter + */ @Override public void write(JmeExporter e) throws IOException { OutputCapsule capsule = e.getCapsule(this); @@ -186,6 +310,12 @@ public abstract class PhysicsCollisionObject implements Savable { capsule.write(collisionShape, "collisionShape", null); } + /** + * De-serialize this object, for example when loading from a J3O file. + * + * @param e importer (not null) + * @throws IOException from importer + */ @Override public void read(JmeImporter e) throws IOException { InputCapsule capsule = e.getCapsule(this); @@ -195,6 +325,30 @@ public abstract class PhysicsCollisionObject implements Savable { collisionShape = shape; } + /** + * Read the collision flags of this object. Subclasses are responsible for + * cloning/reading/writing these flags. + * + * @param objectId the ID of the btCollisionObject (not zero) + * @return the collision flags (bit mask) + */ + native protected int getCollisionFlags(long objectId); + + /** + * Alter the collision flags of this object. Subclasses are responsible for + * cloning/reading/writing these flags. + * + * @param objectId the ID of the btCollisionObject (not zero) + * @param desiredFlags the desired collision flags (bit mask) + */ + native protected void setCollisionFlags(long objectId, int desiredFlags); + + /** + * Finalize this collision object just before it is destroyed. Should be + * invoked only by a subclass or by the garbage collector. + * + * @throws Throwable ignored by the garbage collector + */ @Override protected void finalize() throws Throwable { super.finalize(); @@ -202,5 +356,10 @@ public abstract class PhysicsCollisionObject implements Savable { finalizeNative(objectId); } + /** + * Finalize the identified btCollisionObject. Native method. + * + * @param objectId the unique identifier of the btCollisionObject (not zero) + */ protected native void finalizeNative(long objectId); } diff --git a/jme3-bullet/src/main/java/com/jme3/bullet/collision/PhysicsRayTestResult.java b/jme3-bullet/src/main/java/com/jme3/bullet/collision/PhysicsRayTestResult.java index bbc231fa7..02bf0162e 100644 --- a/jme3-bullet/src/main/java/com/jme3/bullet/collision/PhysicsRayTestResult.java +++ b/jme3-bullet/src/main/java/com/jme3/bullet/collision/PhysicsRayTestResult.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -34,47 +34,67 @@ package com.jme3.bullet.collision; import com.jme3.math.Vector3f; /** - * Contains the results of a PhysicsSpace rayTest - * bulletAppState.getPhysicsSpace().rayTest(new Vector3f(0,1000,0),new Vector3f(0,-1000,0)); - javap -s java.util.List + * Represent the results of a Bullet ray test. + * * @author Empire-Phoenix,normenhansen */ public class PhysicsRayTestResult { + /** + * collision object that was hit + */ private PhysicsCollisionObject collisionObject; + /** + * normal vector at the point of contact + */ private Vector3f hitNormalLocal; + /** + * fraction of the ray's total length (from=0, to=1, ≥0, ≤1) + */ private float hitFraction; + /** + * true→need to transform normal into world space + */ private boolean normalInWorldSpace = true; /** - * allocated by native code only + * A private constructor to inhibit instantiation of this class by Java. + * These results are instantiated exclusively by native code. */ private PhysicsRayTestResult() { } /** - * @return the collisionObject + * Access the collision object that was hit. + * + * @return the pre-existing instance */ public PhysicsCollisionObject getCollisionObject() { return collisionObject; } /** - * @return the hitNormalLocal + * Access the normal vector at the point of contact. + * + * @return a pre-existing unit vector (not null) */ public Vector3f getHitNormalLocal() { return hitNormalLocal; } /** - * @return the hitFraction + * Read the fraction of the ray's total length. + * + * @return fraction (from=0, to=1, ≥0, ≤1) */ public float getHitFraction() { return hitFraction; } /** - * @return the normalInWorldSpace + * Test whether the normal is in world space. + * + * @return true if in world space, otherwise false */ public boolean isNormalInWorldSpace() { return normalInWorldSpace; diff --git a/jme3-bullet/src/main/java/com/jme3/bullet/collision/PhysicsSweepTestResult.java b/jme3-bullet/src/main/java/com/jme3/bullet/collision/PhysicsSweepTestResult.java index 8e61b66a2..9becbb1c7 100644 --- a/jme3-bullet/src/main/java/com/jme3/bullet/collision/PhysicsSweepTestResult.java +++ b/jme3-bullet/src/main/java/com/jme3/bullet/collision/PhysicsSweepTestResult.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -34,16 +34,33 @@ package com.jme3.bullet.collision; import com.jme3.math.Vector3f; /** - * Contains the results of a PhysicsSpace rayTest + * Represent the results of a Bullet sweep test. + * * @author normenhansen */ public class PhysicsSweepTestResult { + /** + * collision object that was hit + */ private PhysicsCollisionObject collisionObject; + /** + * normal vector at the point of contact + */ private Vector3f hitNormalLocal; + /** + * fraction of the way between the transforms (from=0, to=1, ≥0, ≤1) + */ private float hitFraction; + /** + * true→need to transform normal into world space + */ private boolean normalInWorldSpace; + /** + * A private constructor to inhibit instantiation of this class by Java. + * These results are instantiated exclusively by native code. + */ public PhysicsSweepTestResult() { } @@ -55,33 +72,50 @@ public class PhysicsSweepTestResult { } /** - * @return the collisionObject + * Access the collision object that was hit. + * + * @return the pre-existing instance */ public PhysicsCollisionObject getCollisionObject() { return collisionObject; } /** - * @return the hitNormalLocal + * Access the normal vector at the point of contact. + * + * @return the pre-existing vector (not null) */ public Vector3f getHitNormalLocal() { return hitNormalLocal; } /** - * @return the hitFraction + * Read the fraction of fraction of the way between the transforms (from=0, + * to=1, ≥0, ≤1) + * + * @return fraction (from=0, to=1, ≥0, ≤1) */ public float getHitFraction() { return hitFraction; } /** - * @return the normalInWorldSpace + * Test whether the normal is in world space. + * + * @return true if in world space, otherwise false */ public boolean isNormalInWorldSpace() { return normalInWorldSpace; } + /** + * Fill in the fields of this result. + * + * @param collisionObject + * @param hitNormalLocal + * @param hitFraction + * @param normalInWorldSpace + */ public void fill(PhysicsCollisionObject collisionObject, Vector3f hitNormalLocal, float hitFraction, boolean normalInWorldSpace) { this.collisionObject = collisionObject; this.hitNormalLocal = hitNormalLocal; diff --git a/jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/BoxCollisionShape.java b/jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/BoxCollisionShape.java index 000bb2dc7..bec41ff97 100644 --- a/jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/BoxCollisionShape.java +++ b/jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/BoxCollisionShape.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -41,35 +41,63 @@ import java.util.logging.Level; import java.util.logging.Logger; /** - * Basic box collision shape + * A rectangular-solid collision shape based on Bullet's btBoxShape. + * * @author normenhansen */ public class BoxCollisionShape extends CollisionShape { + /** + * copy of half-extents of the box on each local axis (not null, no negative + * component) + */ private Vector3f halfExtents; + /** + * No-argument constructor needed by SavableClassUtil. Do not invoke + * directly! + */ public BoxCollisionShape() { } /** - * creates a collision box from the given halfExtents - * @param halfExtents the halfExtents of the CollisionBox + * Instantiate a box shape with the specified half extents. + * + * @param halfExtents the desired unscaled half extents (not null, no + * negative component, alias created) */ public BoxCollisionShape(Vector3f halfExtents) { this.halfExtents = halfExtents; createShape(); } + /** + * Access the half extents of the box. + * + * @return the pre-existing instance (not null, no negative component) + */ public final Vector3f getHalfExtents() { return halfExtents; } - + + /** + * Serialize this shape, for example when saving to a J3O file. + * + * @param ex exporter (not null) + * @throws IOException from exporter + */ public void write(JmeExporter ex) throws IOException { super.write(ex); OutputCapsule capsule = ex.getCapsule(this); capsule.write(halfExtents, "halfExtents", new Vector3f(1, 1, 1)); } + /** + * De-serialize this shape, for example when loading from a J3O file. + * + * @param im importer (not null) + * @throws IOException from importer + */ public void read(JmeImporter im) throws IOException { super.read(im); InputCapsule capsule = im.getCapsule(this); @@ -78,6 +106,9 @@ public class BoxCollisionShape extends CollisionShape { createShape(); } + /** + * Instantiate the configured shape in Bullet. + */ protected void createShape() { objectId = createShape(halfExtents); Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Created Shape {0}", Long.toHexString(objectId)); diff --git a/jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/CapsuleCollisionShape.java b/jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/CapsuleCollisionShape.java index 00ccdf74e..0a15b343e 100644 --- a/jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/CapsuleCollisionShape.java +++ b/jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/CapsuleCollisionShape.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -41,20 +41,37 @@ import java.util.logging.Level; import java.util.logging.Logger; /** - * Basic capsule collision shape + * A capsule collision shape based on Bullet's btCapsuleShapeX, btCapsuleShape, + * or btCapsuleShapeZ. These shapes have no margin and cannot be scaled. + * * @author normenhansen */ public class CapsuleCollisionShape extends CollisionShape{ - protected float radius,height; - protected int axis; + /** + * copy of height of the cylindrical portion (≥0) + */ + private float height; + /** + * copy of radius (≥0) + */ + private float radius; + /** + * copy of main (height) axis (0→X, 1→Y, 2→Z) + */ + private int axis; + /** + * No-argument constructor needed by SavableClassUtil. Do not invoke + * directly! + */ public CapsuleCollisionShape() { } /** - * creates a new CapsuleCollisionShape with the given radius and height - * @param radius the radius of the capsule - * @param height the height of the capsule + * Instantiate a Y-axis capsule shape with the specified radius and height. + * + * @param radius the desired radius (≥0) + * @param height the desired height (of the cylindrical portion) (≥0) */ public CapsuleCollisionShape(float radius, float height) { this.radius=radius; @@ -64,10 +81,11 @@ public class CapsuleCollisionShape extends CollisionShape{ } /** - * creates a capsule shape around the given axis (0=X,1=Y,2=Z) - * @param radius - * @param height - * @param axis + * Instantiate a capsule shape around the specified main (height) axis. + * + * @param radius the desired radius (≥0) + * @param height the desired height (of the cylindrical portion) (≥0) + * @param axis which local axis: 0→X, 1→Y, 2→Z */ public CapsuleCollisionShape(float radius, float height, int axis) { this.radius=radius; @@ -76,20 +94,39 @@ public class CapsuleCollisionShape extends CollisionShape{ createShape(); } + /** + * Read the radius of the capsule. + * + * @return the radius (≥0) + */ public float getRadius() { return radius; } + /** + * Read the height (of the cylindrical portion) of the capsule. + * + * @return height (≥0) + */ public float getHeight() { return height; } + /** + * Determine the main (height) axis of the capsule. + * + * @return 0 for local X, 1 for local Y, or 2 for local Z + */ public int getAxis() { return axis; } /** - * WARNING - CompoundCollisionShape scaling has no effect. + * Alter the scaling factors of this shape. Scaling is disabled + * for capsule shapes. + * + * @param scale the desired scaling factor for each local axis (not null, no + * negative component, unaffected, default=1,1,1) */ @Override public void setScale(Vector3f scale) { @@ -98,6 +135,12 @@ public class CapsuleCollisionShape extends CollisionShape{ } } + /** + * Serialize this shape, for example when saving to a J3O file. + * + * @param ex exporter (not null) + * @throws IOException from exporter + */ public void write(JmeExporter ex) throws IOException { super.write(ex); OutputCapsule capsule = ex.getCapsule(this); @@ -106,6 +149,12 @@ public class CapsuleCollisionShape extends CollisionShape{ capsule.write(axis, "axis", 1); } + /** + * De-serialize this shape, for example when loading from a J3O file. + * + * @param im importer (not null) + * @throws IOException from importer + */ public void read(JmeImporter im) throws IOException { super.read(im); InputCapsule capsule = im.getCapsule(this); @@ -115,6 +164,9 @@ public class CapsuleCollisionShape extends CollisionShape{ createShape(); } + /** + * Instantiate the configured shape in Bullet. + */ protected void createShape(){ objectId = createShape(axis, radius, height); Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Created Shape {0}", Long.toHexString(objectId)); diff --git a/jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/CollisionShape.java b/jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/CollisionShape.java index c5b390e0e..ea6f11be9 100644 --- a/jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/CollisionShape.java +++ b/jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/CollisionShape.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -38,15 +38,31 @@ import java.util.logging.Level; import java.util.logging.Logger; /** - * This Object holds information about a jbullet CollisionShape to be able to reuse - * CollisionShapes (as suggested in bullet manuals) - * TODO: add static methods to create shapes from nodes (like jbullet-jme constructor) + * The abstract base class for collision shapes based on Bullet's + * btCollisionShape. + *

+ * Collision shapes include BoxCollisionShape and CapsuleCollisionShape. As + * suggested in the Bullet manual, a single collision shape can be shared among + * multiple collision objects. + * * @author normenhansen */ public abstract class CollisionShape implements Savable { + /** + * unique identifier of the btCollisionShape + *

+ * Constructors are responsible for setting this to a non-zero value. After + * that, the id never changes. + */ protected long objectId = 0; + /** + * copy of scaling factors: one for each local axis (default=1,1,1) + */ protected Vector3f scale = new Vector3f(1, 1, 1); + /** + * copy of collision margin (in physics-space units, >0, default=0) + */ protected float margin = 0.0f; public CollisionShape() { @@ -70,7 +86,9 @@ public abstract class CollisionShape implements Savable { // private native void calculateLocalInertia(long objectId, long shapeId, float mass); /** - * used internally + * Read the id of the btCollisionShape. + * + * @return the unique identifier (not zero) */ public long getObjectId() { return objectId; @@ -83,21 +101,52 @@ public abstract class CollisionShape implements Savable { this.objectId = id; } + /** + * Alter the scaling factors of this shape. CAUTION: Not all shapes can be + * scaled. + *

+ * Note that if the shape is shared (between collision objects and/or + * compound shapes) changes can have unintended consequences. + * + * @param scale the desired scaling factor for each local axis (not null, no + * negative component, unaffected, default=1,1,1) + */ public void setScale(Vector3f scale) { this.scale.set(scale); setLocalScaling(objectId, scale); } - + /** + * Access the scaling factors. + * + * @return the pre-existing vector (not null) + */ public Vector3f getScale() { return scale; } + /** + * Read the collision margin for this shape. + * + * @return the margin distance (in physics-space units, ≥0) + */ public float getMargin() { return getMargin(objectId); } private native float getMargin(long objectId); + /** + * Alter the collision margin of this shape. CAUTION: Margin is applied + * differently, depending on the type of shape. Generally the collision + * margin expands the object, creating a gap. Don't set the collision margin + * to zero. + *

+ * Note that if the shape is shared (between collision objects and/or + * compound shapes) changes can have unintended consequences. + * + * @param margin the desired margin distance (in physics-space units, >0, + * default=0) + */ public void setMargin(float margin) { setMargin(objectId, margin); this.margin = margin; @@ -107,18 +156,37 @@ public abstract class CollisionShape implements Savable { private native void setMargin(long objectId, float margin); + /** + * Serialize this shape, for example when saving to a J3O file. + * + * @param ex exporter (not null) + * @throws IOException from exporter + */ public void write(JmeExporter ex) throws IOException { OutputCapsule capsule = ex.getCapsule(this); capsule.write(scale, "scale", new Vector3f(1, 1, 1)); capsule.write(getMargin(), "margin", 0.0f); } + /** + * De-serialize this shape, for example when loading from a J3O file. + * + * @param im importer (not null) + * @throws IOException from importer + */ + @Override public void read(JmeImporter im) throws IOException { InputCapsule capsule = im.getCapsule(this); this.scale = (Vector3f) capsule.readSavable("scale", new Vector3f(1, 1, 1)); this.margin = capsule.readFloat("margin", 0.0f); } + /** + * Finalize this shape just before it is destroyed. Should be invoked only + * by a subclass or by the garbage collector. + * + * @throws Throwable ignored by the garbage collector + */ @Override protected void finalize() throws Throwable { super.finalize(); diff --git a/jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/CompoundCollisionShape.java b/jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/CompoundCollisionShape.java index b2321afdc..254006676 100644 --- a/jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/CompoundCollisionShape.java +++ b/jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/CompoundCollisionShape.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -46,23 +46,33 @@ import java.util.logging.Level; import java.util.logging.Logger; /** - * A CompoundCollisionShape allows combining multiple base shapes - * to generate a more sophisticated shape. + * A collision shape formed by combining convex child shapes, based on Bullet's + * btCompoundShape. + * * @author normenhansen */ public class CompoundCollisionShape extends CollisionShape { + /** + * children of this shape + */ protected ArrayList children = new ArrayList(); + /** + * Instantiate an empty compound shape (with no children). + */ public CompoundCollisionShape() { objectId = createShape();//new CompoundShape(); Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Created Shape {0}", Long.toHexString(objectId)); } /** - * adds a child shape at the given local translation - * @param shape the child shape to add - * @param location the local location of the child shape + * Add a child shape with the specified local translation. + * + * @param shape the child shape to add (not null, not a compound shape, + * alias created) + * @param location the local coordinates of the child shape's center (not + * null, unaffected) */ public void addChildShape(CollisionShape shape, Vector3f location) { // Transform transA = new Transform(Converter.convert(new Matrix3f())); @@ -73,9 +83,14 @@ public class CompoundCollisionShape extends CollisionShape { } /** - * adds a child shape at the given local translation - * @param shape the child shape to add - * @param location the local location of the child shape + * Add a child shape with the specified local translation and orientation. + * + * @param shape the child shape to add (not null, not a compound shape, + * alias created) + * @param location the local coordinates of the child shape's center (not + * null, unaffected) + * @param rotation the local orientation of the child shape (not null, + * unaffected) */ public void addChildShape(CollisionShape shape, Vector3f location, Matrix3f rotation) { if(shape instanceof CompoundCollisionShape){ @@ -101,8 +116,9 @@ public class CompoundCollisionShape extends CollisionShape { } /** - * removes a child shape - * @param shape the child shape to remove + * Remove a child from this shape. + * + * @param shape the child shape to remove (not null) */ public void removeChildShape(CollisionShape shape) { removeChildShape(objectId, shape.getObjectId()); @@ -115,6 +131,11 @@ public class CompoundCollisionShape extends CollisionShape { } } + /** + * Access the list of children. + * + * @return the pre-existing list (not null) + */ public List getChildren() { return children; } @@ -125,12 +146,24 @@ public class CompoundCollisionShape extends CollisionShape { private native long removeChildShape(long objectId, long childId); + /** + * Serialize this shape, for example when saving to a J3O file. + * + * @param ex exporter (not null) + * @throws IOException from exporter + */ public void write(JmeExporter ex) throws IOException { super.write(ex); OutputCapsule capsule = ex.getCapsule(this); capsule.writeSavableArrayList(children, "children", new ArrayList()); } + /** + * De-serialize this shape, for example when loading from a J3O file. + * + * @param im importer (not null) + * @throws IOException from importer + */ public void read(JmeImporter im) throws IOException { super.read(im); InputCapsule capsule = im.getCapsule(this); diff --git a/jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/ConeCollisionShape.java b/jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/ConeCollisionShape.java index 3dd317624..c111fbd9e 100644 --- a/jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/ConeCollisionShape.java +++ b/jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/ConeCollisionShape.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -41,18 +41,40 @@ import java.util.logging.Level; import java.util.logging.Logger; /** + * A conical collision shape based on Bullet's btConeShapeX, btConeShape, or + * btConeShapeZ. * * @author normenhansen */ public class ConeCollisionShape extends CollisionShape { + /** + * copy of radius (≥0) + */ protected float radius; + /** + * copy of height (≥0) + */ protected float height; + /** + * copy of main (height) axis (0→X, 1→Y, 2→Z) + */ protected int axis; + /** + * No-argument constructor needed by SavableClassUtil. Do not invoke + * directly! + */ public ConeCollisionShape() { } + /** + * Instantiate a cone shape around the specified main (height) axis. + * + * @param radius the desired radius (≥0) + * @param height the desired height (≥0) + * @param axis which local axis: 0→X, 1→Y, 2→Z + */ public ConeCollisionShape(float radius, float height, int axis) { this.radius = radius; this.height = height; @@ -60,6 +82,12 @@ public class ConeCollisionShape extends CollisionShape { createShape(); } + /** + * Instantiate a cone shape oriented along the Y axis. + * + * @param radius the desired radius (≥0) + * @param height the desired height (≥0) + */ public ConeCollisionShape(float radius, float height) { this.radius = radius; this.height = height; @@ -67,14 +95,30 @@ public class ConeCollisionShape extends CollisionShape { createShape(); } + /** + * Read the radius of the cone. + * + * @return radius (≥0) + */ public float getRadius() { return radius; } - + + /** + * Read the height of the cone. + * + * @return height (≥0) + */ public float getHeight() { return height; } + /** + * Serialize this shape, for example when saving to a J3O file. + * + * @param ex exporter (not null) + * @throws IOException from exporter + */ public void write(JmeExporter ex) throws IOException { super.write(ex); OutputCapsule capsule = ex.getCapsule(this); @@ -83,6 +127,12 @@ public class ConeCollisionShape extends CollisionShape { capsule.write(axis, "axis", PhysicsSpace.AXIS_Y); } + /** + * De-serialize this shape, for example when loading from a J3O file. + * + * @param im importer (not null) + * @throws IOException from importer + */ public void read(JmeImporter im) throws IOException { super.read(im); InputCapsule capsule = im.getCapsule(this); @@ -92,6 +142,9 @@ public class ConeCollisionShape extends CollisionShape { createShape(); } + /** + * Instantiate the configured shape in Bullet. + */ protected void createShape() { objectId = createShape(axis, radius, height); Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Created Shape {0}", Long.toHexString(objectId)); diff --git a/jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/CylinderCollisionShape.java b/jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/CylinderCollisionShape.java index 4fe48f9b7..2178899f7 100644 --- a/jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/CylinderCollisionShape.java +++ b/jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/CylinderCollisionShape.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -41,20 +41,35 @@ import java.util.logging.Level; import java.util.logging.Logger; /** - * Basic cylinder collision shape + * A cylindrical collision shape based on Bullet's btCylinderShapeX, new + * btCylinderShape, or btCylinderShapeZ. + * * @author normenhansen */ public class CylinderCollisionShape extends CollisionShape { + /** + * copy of half-extents of the cylinder on each local axis (not null, no + * negative component) + */ protected Vector3f halfExtents; + /** + * copy of main (height) axis (0→X, 1→Y, 2→Z) + */ protected int axis; + /** + * No-argument constructor needed by SavableClassUtil. Do not invoke + * directly! + */ public CylinderCollisionShape() { } /** - * creates a cylinder shape from the given halfextents - * @param halfExtents the halfextents to use + * Instantiate a Z-axis cylinder shape with the specified half extents. + * + * @param halfExtents the desired unscaled half extents (not null, no + * negative component, alias created) */ public CylinderCollisionShape(Vector3f halfExtents) { this.halfExtents = halfExtents; @@ -63,9 +78,11 @@ public class CylinderCollisionShape extends CollisionShape { } /** - * Creates a cylinder shape around the given axis from the given halfextents - * @param halfExtents the halfextents to use - * @param axis (0=X,1=Y,2=Z) + * Instantiate a cylinder shape around the specified axis. + * + * @param halfExtents the desired unscaled half extents (not null, no + * negative component, alias created) + * @param axis which local axis: 0→X, 1→Y, 2→Z */ public CylinderCollisionShape(Vector3f halfExtents, int axis) { this.halfExtents = halfExtents; @@ -73,16 +90,30 @@ public class CylinderCollisionShape extends CollisionShape { createShape(); } + /** + * Access the half extents of the cylinder. + * + * @return the pre-existing vector (not null, no negative component) + */ public final Vector3f getHalfExtents() { return halfExtents; } + /** + * Determine the main axis of the cylinder. + * + * @return 0→X, 1→Y, 2→Z + */ public int getAxis() { return axis; } /** - * WARNING - CompoundCollisionShape scaling has no effect. + * Alter the scaling factors of this shape. Scaling is disabled + * for cylinder shapes. + * + * @param scale the desired scaling factor for each local axis (not null, no + * negative component, unaffected, default=1,1,1) */ @Override public void setScale(Vector3f scale) { @@ -91,6 +122,12 @@ public class CylinderCollisionShape extends CollisionShape { } } + /** + * Serialize this shape, for example when saving to a J3O file. + * + * @param ex exporter (not null) + * @throws IOException from exporter + */ public void write(JmeExporter ex) throws IOException { super.write(ex); OutputCapsule capsule = ex.getCapsule(this); @@ -98,6 +135,12 @@ public class CylinderCollisionShape extends CollisionShape { capsule.write(axis, "axis", 1); } + /** + * De-serialize this shape, for example when loading from a J3O file. + * + * @param im importer (not null) + * @throws IOException from importer + */ public void read(JmeImporter im) throws IOException { super.read(im); InputCapsule capsule = im.getCapsule(this); @@ -106,6 +149,9 @@ public class CylinderCollisionShape extends CollisionShape { createShape(); } + /** + * Instantiate the configured shape in Bullet. + */ protected void createShape() { objectId = createShape(axis, halfExtents); Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Created Shape {0}", Long.toHexString(objectId)); diff --git a/jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/GImpactCollisionShape.java b/jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/GImpactCollisionShape.java index 200e6dc3b..0f9cfc425 100644 --- a/jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/GImpactCollisionShape.java +++ b/jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/GImpactCollisionShape.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -47,7 +47,8 @@ import java.util.logging.Level; import java.util.logging.Logger; /** - * Basic mesh collision shape + * A mesh collision shape based on Bullet's btGImpactMeshShape. + * * @author normenhansen */ public class GImpactCollisionShape extends CollisionShape { @@ -55,14 +56,23 @@ public class GImpactCollisionShape extends CollisionShape { // protected Vector3f worldScale; protected int numVertices, numTriangles, vertexStride, triangleIndexStride; protected ByteBuffer triangleIndexBase, vertexBase; + /** + * Unique identifier of the Bullet mesh. The constructor sets this to a + * non-zero value. + */ protected long meshId = 0; // protected IndexedMesh bulletMesh; + /** + * No-argument constructor needed by SavableClassUtil. Do not invoke + * directly! + */ public GImpactCollisionShape() { } /** - * creates a collision shape from the given Mesh + * Instantiate a shape based on the specified JME mesh. + * * @param mesh the Mesh to use */ public GImpactCollisionShape(Mesh mesh) { @@ -105,6 +115,12 @@ public class GImpactCollisionShape extends CollisionShape { // public Mesh createJmeMesh() { // return Converter.convert(bulletMesh); // } + /** + * Serialize this shape, for example when saving to a J3O file. + * + * @param ex exporter (not null) + * @throws IOException from exporter + */ public void write(JmeExporter ex) throws IOException { super.write(ex); OutputCapsule capsule = ex.getCapsule(this); @@ -118,6 +134,12 @@ public class GImpactCollisionShape extends CollisionShape { capsule.write(vertexBase.array(), "vertexBase", new byte[0]); } + /** + * De-serialize this shape, for example when loading from a J3O file. + * + * @param im importer (not null) + * @throws IOException from importer + */ public void read(JmeImporter im) throws IOException { super.read(im); InputCapsule capsule = im.getCapsule(this); @@ -132,6 +154,9 @@ public class GImpactCollisionShape extends CollisionShape { createShape(); } + /** + * Instantiate the configured shape in Bullet. + */ protected void createShape() { // bulletMesh = new IndexedMesh(); // bulletMesh.numVertices = numVertices; @@ -157,6 +182,12 @@ public class GImpactCollisionShape extends CollisionShape { private native long createShape(long meshId); + /** + * Finalize this shape just before it is destroyed. Should be invoked only + * by a subclass or by the garbage collector. + * + * @throws Throwable ignored by the garbage collector + */ @Override protected void finalize() throws Throwable { super.finalize(); diff --git a/jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/HeightfieldCollisionShape.java b/jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/HeightfieldCollisionShape.java index e525d3f1c..f4fcaef6d 100644 --- a/jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/HeightfieldCollisionShape.java +++ b/jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/HeightfieldCollisionShape.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -45,36 +45,72 @@ import java.util.logging.Level; import java.util.logging.Logger; /** - * Uses Bullet Physics Heightfield terrain collision system. This is MUCH faster - * than using a regular mesh. - * There are a couple tricks though: - * -No rotation or translation is supported. - * -The collision bbox must be centered around 0,0,0 with the height above and below the y-axis being - * equal on either side. If not, the whole collision box is shifted vertically and things don't collide - * as they should. - * + * A terrain collision shape based on Bullet's btHeightfieldTerrainShape. + *

+ * This is much more efficient than a regular mesh, but it has a couple + * limitations: + *

    + *
  • No rotation or translation.
  • + *
  • The collision bounding box must be centered on (0,0,0) with the height + * above and below the X-Z plane being equal on either side. If not, the whole + * collision box is shifted vertically and objects won't collide properly.
  • + *
+ * * @author Brent Owens */ public class HeightfieldCollisionShape extends CollisionShape { + /** + * number of rows in the heightfield (>1) + */ protected int heightStickWidth; + /** + * number of columns in the heightfield (>1) + */ protected int heightStickLength; + /** + * array of heightfield samples + */ protected float[] heightfieldData; protected float heightScale; protected float minHeight; protected float maxHeight; + /** + * index of the height axis (0→X, 1→Y, 2→Z) + */ protected int upAxis; protected boolean flipQuadEdges; + /** + * buffer for passing height data to Bullet + *

+ * A Java reference must persist after createShape() completes, or else the + * buffer might get garbage collected. + */ protected ByteBuffer bbuf; // protected FloatBuffer fbuf; + /** + * No-argument constructor needed by SavableClassUtil. Do not invoke + * directly! + */ public HeightfieldCollisionShape() { } + /** + * Instantiate a new shape for the specified height map. + * + * @param heightmap (not null, length≥4, length a perfect square) + */ public HeightfieldCollisionShape(float[] heightmap) { createCollisionHeightfield(heightmap, Vector3f.UNIT_XYZ); } + /** + * Instantiate a new shape for the specified height map and scale vector. + * + * @param heightmap (not null, length≥4, length a perfect square) + * @param scale (not null, no negative component, unaffected, default=1,1,1) + */ public HeightfieldCollisionShape(float[] heightmap, Vector3f scale) { createCollisionHeightfield(heightmap, scale); } @@ -120,6 +156,9 @@ public class HeightfieldCollisionShape extends CollisionShape { createShape(); } + /** + * Instantiate the configured shape in Bullet. + */ protected void createShape() { bbuf = BufferUtils.createByteBuffer(heightfieldData.length * 4); // fbuf = bbuf.asFloatBuffer();//FloatBuffer.wrap(heightfieldData); @@ -138,11 +177,22 @@ public class HeightfieldCollisionShape extends CollisionShape { private native long createShape(int heightStickWidth, int heightStickLength, ByteBuffer heightfieldData, float heightScale, float minHeight, float maxHeight, int upAxis, boolean flipQuadEdges); + /** + * Does nothing. + * + * @return null + */ public Mesh createJmeMesh() { //TODO return Converter.convert(bulletMesh); return null; } + /** + * Serialize this shape, for example when saving to a J3O file. + * + * @param ex exporter (not null) + * @throws IOException from exporter + */ public void write(JmeExporter ex) throws IOException { super.write(ex); OutputCapsule capsule = ex.getCapsule(this); @@ -156,6 +206,12 @@ public class HeightfieldCollisionShape extends CollisionShape { capsule.write(flipQuadEdges, "flipQuadEdges", false); } + /** + * De-serialize this shape, for example when loading from a J3O file. + * + * @param im importer (not null) + * @throws IOException from importer + */ public void read(JmeImporter im) throws IOException { super.read(im); InputCapsule capsule = im.getCapsule(this); diff --git a/jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/HullCollisionShape.java b/jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/HullCollisionShape.java index db40eedac..d20e0e51e 100644 --- a/jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/HullCollisionShape.java +++ b/jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/HullCollisionShape.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -44,24 +44,52 @@ import java.nio.FloatBuffer; import java.util.logging.Level; import java.util.logging.Logger; +/** + * A convex hull collision shape based on Bullet's btConvexHullShape. + */ public class HullCollisionShape extends CollisionShape { private float[] points; // protected FloatBuffer fbuf; + /** + * No-argument constructor needed by SavableClassUtil. Do not invoke + * directly! + */ public HullCollisionShape() { } + /** + * Instantiate a collision shape based on the specified JME mesh. For best + * performance and stability, use the mesh should have no more than 100 + * vertices. + * + * @param mesh a mesh on which to base the shape (not null, at least one + * vertex) + */ public HullCollisionShape(Mesh mesh) { this.points = getPoints(mesh); createShape(); } + /** + * Instantiate a collision shape based on the specified array of + * coordinates. + * + * @param points an array of coordinates on which to base the shape (not + * null, not empty, length a multiple of 3) + */ public HullCollisionShape(float[] points) { this.points = points; createShape(); } + /** + * Serialize this shape, for example when saving to a J3O file. + * + * @param ex exporter (not null) + * @throws IOException from exporter + */ @Override public void write(JmeExporter ex) throws IOException { super.write(ex); @@ -70,6 +98,12 @@ public class HullCollisionShape extends CollisionShape { capsule.write(points, "points", null); } + /** + * De-serialize this shape, for example when loading from a J3O file. + * + * @param im importer (not null) + * @throws IOException from importer + */ @Override public void read(JmeImporter im) throws IOException { super.read(im); @@ -89,6 +123,9 @@ public class HullCollisionShape extends CollisionShape { createShape(); } + /** + * Instantiate the configured shape in Bullet. + */ protected void createShape() { // ObjectArrayList pointList = new ObjectArrayList(); // for (int i = 0; i < points.length; i += 3) { @@ -114,6 +151,12 @@ public class HullCollisionShape extends CollisionShape { private native long createShape(ByteBuffer points); + /** + * Copy the vertex positions from a JME mesh. + * + * @param mesh the mesh to read (not null) + * @return a new array (not null, length a multiple of 3) + */ protected float[] getPoints(Mesh mesh) { FloatBuffer vertices = mesh.getFloatBuffer(Type.Position); vertices.rewind(); diff --git a/jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/MeshCollisionShape.java b/jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/MeshCollisionShape.java index 3c5dbbb49..dead3294c 100644 --- a/jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/MeshCollisionShape.java +++ b/jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/MeshCollisionShape.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -49,7 +49,7 @@ import com.jme3.scene.mesh.IndexBuffer; import com.jme3.util.BufferUtils; /** - * Basic mesh collision shape + * A mesh collision shape based on Bullet's btBvhTriangleMeshShape. * * @author normenhansen */ @@ -64,38 +64,45 @@ public class MeshCollisionShape extends CollisionShape { private static final String NATIVE_BVH = "nativeBvh"; protected int numVertices, numTriangles, vertexStride, triangleIndexStride; protected ByteBuffer triangleIndexBase, vertexBase; + /** + * Unique identifier of the Bullet mesh. The constructor sets this to a + * non-zero value. + */ protected long meshId = 0; protected long nativeBVHBuffer = 0; private boolean memoryOptimized; + /** + * No-argument constructor needed by SavableClassUtil. Do not invoke + * directly! + */ public MeshCollisionShape() { } /** - * Creates a collision shape from the given Mesh. - * Default behavior, more optimized for memory usage. + * Instantiate a collision shape based on the specified JME mesh, optimized + * for memory usage. * - * @param mesh + * @param mesh the mesh on which to base the shape (not null) */ public MeshCollisionShape(Mesh mesh) { this(mesh, true); } /** - * Creates a collision shape from the given Mesh. - * memoryOptimized determines if optimized instead of - * quantized BVH will be used. - * Internally, memoryOptimized BVH is slower to calculate (~4x) - * but also smaller (~0.5x). - * It is preferable to use the memory optimized version and then serialize - * the resulting MeshCollisionshape as this will also save the - * generated BVH. - * An exception can be procedurally / generated collision shapes, where - * the generation time is more of a concern + * Instantiate a collision shape based on the specified JME mesh. + *

+ * memoryOptimized determines if optimized instead of quantized + * BVH will be used. Internally, memoryOptimized BVH is slower + * to calculate (~4x) but also smaller (~0.5x). It is preferable to use the + * memory optimized version and then serialize the resulting + * MeshCollisionshape as this will also save the generated BVH. An exception + * can be procedurally / generated collision shapes, where the generation + * time is more of a concern * - * @param mesh the Mesh to use - * @param memoryOptimized True to generate a memory optimized BVH, - * false to generate quantized BVH. + * @param mesh the mesh on which to base the shape (not null) + * @param memoryOptimized true to generate a memory-optimized BVH, false to + * generate quantized BVH */ public MeshCollisionShape(final Mesh mesh, final boolean memoryOptimized) { this.memoryOptimized = memoryOptimized; @@ -103,16 +110,15 @@ public class MeshCollisionShape extends CollisionShape { } /** - * Advanced constructor, usually you don’t want to use this, but the Mesh - * based one. Passing false values can lead to a crash, use at own risk - * + * An advanced constructor. Passing false values can lead to a crash. + * Usually you don’t want to use this. Use at own risk. + *

* This constructor bypasses all copy logic normally used, this allows for - * faster bullet shape generation when using procedurally generated Meshes. - * + * faster Bullet shape generation when using procedurally generated Meshes. * * @param indices the raw index buffer * @param vertices the raw vertex buffer - * @param memoryOptimized use quantisize BVH, uses less memory, but slower + * @param memoryOptimized use quantized BVH, uses less memory, but slower */ public MeshCollisionShape(ByteBuffer indices, ByteBuffer vertices, boolean memoryOptimized) { this.triangleIndexBase = indices; @@ -153,6 +159,12 @@ public class MeshCollisionShape extends CollisionShape { this.createShape(null); } + /** + * Serialize this shape, for example when saving to a J3O file. + * + * @param ex exporter (not null) + * @throws IOException from exporter + */ @Override public void write(final JmeExporter ex) throws IOException { super.write(ex); @@ -178,6 +190,12 @@ public class MeshCollisionShape extends CollisionShape { } } + /** + * De-serialize this shape, for example when loading from a J3O file. + * + * @param im importer (not null) + * @throws IOException from importer + */ @Override public void read(final JmeImporter im) throws IOException { super.read(im); @@ -195,6 +213,9 @@ public class MeshCollisionShape extends CollisionShape { createShape(nativeBvh); } + /** + * Instantiate the configured shape in Bullet. + */ private void createShape(byte bvh[]) { boolean buildBvh=bvh==null||bvh.length==0; this.meshId = NativeMeshUtil.createTriangleIndexVertexArray(this.triangleIndexBase, this.vertexBase, this.numTriangles, this.numVertices, this.vertexStride, this.triangleIndexStride); @@ -216,6 +237,12 @@ public class MeshCollisionShape extends CollisionShape { private native long createShape(boolean memoryOptimized, boolean buildBvt, long meshId); + /** + * Finalize this shape just before it is destroyed. Should be invoked only + * by a subclass or by the garbage collector. + * + * @throws Throwable ignored by the garbage collector + */ @Override public void finalize() throws Throwable { super.finalize(); diff --git a/jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/PlaneCollisionShape.java b/jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/PlaneCollisionShape.java index caf654899..6b8bb88bb 100644 --- a/jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/PlaneCollisionShape.java +++ b/jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/PlaneCollisionShape.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -42,34 +42,60 @@ import java.util.logging.Level; import java.util.logging.Logger; /** + * A planar collision shape based on Bullet's btStaticPlaneShape. * * @author normenhansen */ public class PlaneCollisionShape extends CollisionShape{ + /** + * description of the plane + */ private Plane plane; + /** + * No-argument constructor needed by SavableClassUtil. Do not invoke + * directly! + */ public PlaneCollisionShape() { } /** - * Creates a plane Collision shape - * @param plane the plane that defines the shape + * Instantiate a plane shape defined by the specified plane. + * + * @param plane the desired plane (not null, alias created) */ public PlaneCollisionShape(Plane plane) { this.plane = plane; createShape(); } + /** + * Access the defining plane. + * + * @return the pre-existing instance (not null) + */ public final Plane getPlane() { return plane; } + /** + * Serialize this shape, for example when saving to a J3O file. + * + * @param ex exporter (not null) + * @throws IOException from exporter + */ public void write(JmeExporter ex) throws IOException { super.write(ex); OutputCapsule capsule = ex.getCapsule(this); capsule.write(plane, "collisionPlane", new Plane()); } + /** + * De-serialize this shape, for example when loading from a J3O file. + * + * @param im importer (not null) + * @throws IOException from importer + */ public void read(JmeImporter im) throws IOException { super.read(im); InputCapsule capsule = im.getCapsule(this); @@ -77,6 +103,9 @@ public class PlaneCollisionShape extends CollisionShape{ createShape(); } + /** + * Instantiate the configured shape in Bullet. + */ protected void createShape() { objectId = createShape(plane.getNormal(), plane.getConstant()); Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Created Shape {0}", Long.toHexString(objectId)); diff --git a/jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/SimplexCollisionShape.java b/jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/SimplexCollisionShape.java index fff1c7058..6a538a1c0 100644 --- a/jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/SimplexCollisionShape.java +++ b/jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/SimplexCollisionShape.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -41,16 +41,33 @@ import java.util.logging.Level; import java.util.logging.Logger; /** - * A simple point, line, triangle or quad collisionShape based on one to four points- + * A simple point, line-segment, triangle, or tetrahedron collision shape based + * on Bullet's btBU_Simplex1to4. + * * @author normenhansen */ public class SimplexCollisionShape extends CollisionShape { + /** + * vertex positions + */ private Vector3f vector1, vector2, vector3, vector4; + /** + * No-argument constructor needed by SavableClassUtil. Do not invoke + * directly! + */ public SimplexCollisionShape() { } + /** + * Instantiate a tetrahedral collision shape based on the specified points. + * + * @param point1 the coordinates of 1st point (not null, alias created) + * @param point2 the coordinates of 2nd point (not null, alias created) + * @param point3 the coordinates of 3rd point (not null, alias created) + * @param point4 the coordinates of 4th point (not null, alias created) + */ public SimplexCollisionShape(Vector3f point1, Vector3f point2, Vector3f point3, Vector3f point4) { vector1 = point1; vector2 = point2; @@ -59,6 +76,13 @@ public class SimplexCollisionShape extends CollisionShape { createShape(); } + /** + * Instantiate a triangular collision shape based on the specified points. + * + * @param point1 the coordinates of 1st point (not null, alias created) + * @param point2 the coordinates of 2nd point (not null, alias created) + * @param point3 the coordinates of 3rd point (not null, alias created) + */ public SimplexCollisionShape(Vector3f point1, Vector3f point2, Vector3f point3) { vector1 = point1; vector2 = point2; @@ -66,17 +90,34 @@ public class SimplexCollisionShape extends CollisionShape { createShape(); } + /** + * Instantiate a line-segment collision shape based on the specified points. + * + * @param point1 the coordinates of 1st point (not null, alias created) + * @param point2 the coordinates of 2nd point (not null, alias created) + */ public SimplexCollisionShape(Vector3f point1, Vector3f point2) { vector1 = point1; vector2 = point2; createShape(); } + /** + * Instantiate a point collision shape based on the specified points. + * + * @param point1 the coordinates of point (not null, alias created) + */ public SimplexCollisionShape(Vector3f point1) { vector1 = point1; createShape(); } + /** + * Serialize this shape, for example when saving to a J3O file. + * + * @param ex exporter (not null) + * @throws IOException from exporter + */ public void write(JmeExporter ex) throws IOException { super.write(ex); OutputCapsule capsule = ex.getCapsule(this); @@ -86,6 +127,12 @@ public class SimplexCollisionShape extends CollisionShape { capsule.write(vector4, "simplexPoint4", null); } + /** + * De-serialize this shape, for example when loading from a J3O file. + * + * @param im importer (not null) + * @throws IOException from importer + */ public void read(JmeImporter im) throws IOException { super.read(im); InputCapsule capsule = im.getCapsule(this); @@ -96,6 +143,9 @@ public class SimplexCollisionShape extends CollisionShape { createShape(); } + /** + * Instantiate the configured shape in Bullet. + */ protected void createShape() { if (vector4 != null) { objectId = createShape(vector1, vector2, vector3, vector4); diff --git a/jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/SphereCollisionShape.java b/jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/SphereCollisionShape.java index 4ba6152c9..dd4228e37 100644 --- a/jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/SphereCollisionShape.java +++ b/jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/SphereCollisionShape.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -41,35 +41,62 @@ import java.util.logging.Level; import java.util.logging.Logger; /** - * Basic sphere collision shape + * A spherical collision shape based on Bullet's btSphereShape. These shapes + * have no margin and cannot be scaled. + * * @author normenhansen */ public class SphereCollisionShape extends CollisionShape { + /** + * copy of radius (≥0) + */ protected float radius; + /** + * No-argument constructor needed by SavableClassUtil. Do not invoke + * directly! + */ public SphereCollisionShape() { } /** - * creates a SphereCollisionShape with the given radius - * @param radius + * Instantiate a sphere shape with the specified radius. + * + * @param radius the desired radius (≥0) */ public SphereCollisionShape(float radius) { this.radius = radius; createShape(); } + /** + * Read the radius of the sphere. + * + * @return the radius (≥0) + */ public float getRadius() { return radius; } + /** + * Serialize this shape, for example when saving to a J3O file. + * + * @param ex exporter (not null) + * @throws IOException from exporter + */ public void write(JmeExporter ex) throws IOException { super.write(ex); OutputCapsule capsule = ex.getCapsule(this); capsule.write(radius, "radius", 0.5f); } + /** + * De-serialize this shape, for example when loading from a J3O file. + * + * @param im importer (not null) + * @throws IOException from importer + */ public void read(JmeImporter im) throws IOException { super.read(im); InputCapsule capsule = im.getCapsule(this); @@ -78,7 +105,11 @@ public class SphereCollisionShape extends CollisionShape { } /** - * WARNING - CompoundCollisionShape scaling has no effect. + * Alter the scaling factors of this shape. Scaling is disabled + * for sphere shapes. + * + * @param scale the desired scaling factor for each local axis (not null, no + * negative component, unaffected, default=1,1,1) */ @Override public void setScale(Vector3f scale) { @@ -87,6 +118,9 @@ public class SphereCollisionShape extends CollisionShape { } } + /** + * Instantiate the configured shape in Bullet. + */ protected void createShape() { objectId = createShape(radius); Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Created Shape {0}", Long.toHexString(objectId)); diff --git a/jme3-bullet/src/main/java/com/jme3/bullet/joints/ConeJoint.java b/jme3-bullet/src/main/java/com/jme3/bullet/joints/ConeJoint.java index 4284e7ad3..d3ec3534a 100644 --- a/jme3-bullet/src/main/java/com/jme3/bullet/joints/ConeJoint.java +++ b/jme3-bullet/src/main/java/com/jme3/bullet/joints/ConeJoint.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -43,10 +43,13 @@ import java.util.logging.Level; import java.util.logging.Logger; /** - * From bullet manual:
- * To create ragdolls, the conve twist constraint is very useful for limbs like the upper arm. - * It is a special point to point constraint that adds cone and twist axis limits. - * The x-axis serves as twist axis. + * A joint based on Bullet's btConeTwistConstraint. + *

+ * From the Bullet manual:
+ * To create ragdolls, the cone twist constraint is very useful for limbs like + * the upper arm. It is a special point to point constraint that adds cone and + * twist axis limits. The x-axis serves as twist axis. + * * @author normenhansen */ public class ConeJoint extends PhysicsJoint { @@ -57,12 +60,25 @@ public class ConeJoint extends PhysicsJoint { protected float twistSpan = 1e30f; protected boolean angularOnly = false; + /** + * No-argument constructor needed by SavableClassUtil. Do not invoke + * directly! + */ public ConeJoint() { } /** - * @param pivotA local translation of the joint connection point in node A - * @param pivotB local translation of the joint connection point in node B + * Instantiate a ConeJoint. To be effective, the joint must be added to a + * physics space. + * + * @param nodeA the 1st body connected by the joint (not null, alias + * created) + * @param nodeB the 2nd body connected by the joint (not null, alias + * created) + * @param pivotA the local offset of the connection point in node A (not + * null, alias created) + * @param pivotB the local offset of the connection point in node B (not + * null, alias created) */ public ConeJoint(PhysicsRigidBody nodeA, PhysicsRigidBody nodeB, Vector3f pivotA, Vector3f pivotB) { super(nodeA, nodeB, pivotA, pivotB); @@ -72,8 +88,21 @@ public class ConeJoint extends PhysicsJoint { } /** + * Instantiate a ConeJoint. To be effective, the joint must be added to a + * physics space. + * + * @param nodeA the 1st body connected by the joint (not null, alias + * created) + * @param nodeB the 2nd body connected by the joint (not null, alias + * created) * @param pivotA local translation of the joint connection point in node A + * (not null, alias created) * @param pivotB local translation of the joint connection point in node B + * (not null, alias created) + * @param rotA the local orientation of the connection to node A (not null, + * alias created) + * @param rotB the local orientation of the connection to node B (not null, + * alias created) */ public ConeJoint(PhysicsRigidBody nodeA, PhysicsRigidBody nodeB, Vector3f pivotA, Vector3f pivotB, Matrix3f rotA, Matrix3f rotB) { super(nodeA, nodeB, pivotA, pivotB); @@ -82,6 +111,13 @@ public class ConeJoint extends PhysicsJoint { createJoint(); } + /** + * Alter the angular limits for this joint. + * + * @param swingSpan1 angle (in radians) + * @param swingSpan2 angle (in radians) + * @param twistSpan angle (in radians) + */ public void setLimit(float swingSpan1, float swingSpan2, float twistSpan) { this.swingSpan1 = swingSpan1; this.swingSpan2 = swingSpan2; @@ -91,6 +127,11 @@ public class ConeJoint extends PhysicsJoint { private native void setLimit(long objectId, float swingSpan1, float swingSpan2, float twistSpan); + /** + * Alter whether this joint is angular only. + * + * @param value the desired setting (default=false) + */ public void setAngularOnly(boolean value) { angularOnly = value; setAngularOnly(objectId, value); @@ -98,6 +139,12 @@ public class ConeJoint extends PhysicsJoint { private native void setAngularOnly(long objectId, boolean value); + /** + * Serialize this joint, for example when saving to a J3O file. + * + * @param ex exporter (not null) + * @throws IOException from exporter + */ @Override public void write(JmeExporter ex) throws IOException { super.write(ex); @@ -111,6 +158,12 @@ public class ConeJoint extends PhysicsJoint { capsule.write(twistSpan, "twistSpan", 1e30f); } + /** + * De-serialize this joint, for example when loading from a J3O file. + * + * @param im importer (not null) + * @throws IOException from importer + */ @Override public void read(JmeImporter im) throws IOException { super.read(im); @@ -125,6 +178,9 @@ public class ConeJoint extends PhysicsJoint { createJoint(); } + /** + * Create the configured joint in Bullet. + */ protected void createJoint() { objectId = createJoint(nodeA.getObjectId(), nodeB.getObjectId(), pivotA, rotA, pivotB, rotB); Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Created Joint {0}", Long.toHexString(objectId)); diff --git a/jme3-bullet/src/main/java/com/jme3/bullet/joints/HingeJoint.java b/jme3-bullet/src/main/java/com/jme3/bullet/joints/HingeJoint.java index 2906d7243..609516287 100644 --- a/jme3-bullet/src/main/java/com/jme3/bullet/joints/HingeJoint.java +++ b/jme3-bullet/src/main/java/com/jme3/bullet/joints/HingeJoint.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -42,29 +42,63 @@ import java.util.logging.Level; import java.util.logging.Logger; /** - * From bullet manual:
- * Hinge constraint, or revolute joint restricts two additional angular degrees of freedom, - * so the body can only rotate around one axis, the hinge axis. - * This can be useful to represent doors or wheels rotating around one axis. - * The user can specify limits and motor for the hinge. + * A joint based on Bullet's btHingeConstraint. + *

+ * From the Bullet manual:
+ * Hinge constraint, or revolute joint restricts two additional angular degrees + * of freedom, so the body can only rotate around one axis, the hinge axis. This + * can be useful to represent doors or wheels rotating around one axis. The user + * can specify limits and motor for the hinge. + * * @author normenhansen */ public class HingeJoint extends PhysicsJoint { protected Vector3f axisA; protected Vector3f axisB; + /** + * copy of the angular-only flag (default=false) + */ protected boolean angularOnly = false; + /** + * copy of the limit's bias factor, how strictly position errors (drift) is + * corrected (default=0.3) + */ protected float biasFactor = 0.3f; + /** + * copy of the limit's relaxation factor, the rate at which velocity errors + * are corrected (default=1) + */ protected float relaxationFactor = 1.0f; + /** + * copy of the limit's softness, the range fraction at which velocity-error + * correction starts operating (default=0.9) + */ protected float limitSoftness = 0.9f; + /** + * No-argument constructor needed by SavableClassUtil. Do not invoke + * directly! + */ public HingeJoint() { } /** - * Creates a new HingeJoint - * @param pivotA local translation of the joint connection point in node A - * @param pivotB local translation of the joint connection point in node B + * Instantiate a HingeJoint. To be effective, the joint must be added to a + * physics space. + * + * @param nodeA the 1st body connected by the joint (not null, alias + * created) + * @param nodeB the 2nd body connected by the joint (not null, alias + * created) + * @param pivotA the local offset of the connection point in node A (not + * null, alias created) + * @param pivotB the local offset of the connection point in node B (not + * null, alias created) + * @param axisA the local axis of the connection to node A (not null, alias + * created) + * @param axisB the local axis of the connection to node B (not null, alias + * created) */ public HingeJoint(PhysicsRigidBody nodeA, PhysicsRigidBody nodeB, Vector3f pivotA, Vector3f pivotB, Vector3f axisA, Vector3f axisB) { super(nodeA, nodeB, pivotA, pivotB); @@ -74,10 +108,11 @@ public class HingeJoint extends PhysicsJoint { } /** - * Enables the motor. - * @param enable if true, motor is enabled. - * @param targetVelocity the target velocity of the rotation. - * @param maxMotorImpulse the max force applied to the hinge to rotate it. + * Enable or disable this joint's motor. + * + * @param enable true to enable, false to disable + * @param targetVelocity the desired target velocity + * @param maxMotorImpulse the desired maximum rotational force */ public void enableMotor(boolean enable, float targetVelocity, float maxMotorImpulse) { enableMotor(objectId, enable, targetVelocity, maxMotorImpulse); @@ -85,18 +120,33 @@ public class HingeJoint extends PhysicsJoint { private native void enableMotor(long objectId, boolean enable, float targetVelocity, float maxMotorImpulse); + /** + * Test whether this joint's motor is enabled. + * + * @return true if enabled, otherwise false + */ public boolean getEnableMotor() { return getEnableAngularMotor(objectId); } private native boolean getEnableAngularMotor(long objectId); + /** + * Read the motor's target velocity. + * + * @return velocity + */ public float getMotorTargetVelocity() { return getMotorTargetVelocity(objectId); } private native float getMotorTargetVelocity(long objectId); + /** + * Read the motor's maximum impulse. + * + * @return impulse + */ public float getMaxMotorImpulse() { return getMaxMotorImpulse(objectId); } @@ -104,9 +154,10 @@ public class HingeJoint extends PhysicsJoint { private native float getMaxMotorImpulse(long objectId); /** - * Sets the limits of this joint. - * @param low the low limit in radians. - * @param high the high limit in radians. + * Alter this joint's limits. + * + * @param low the desired lower limit of the hinge angle (in radians) + * @param high the desired upper limit of the joint angle (in radians) */ public void setLimit(float low, float high) { setLimit(objectId, low, high); @@ -115,13 +166,20 @@ public class HingeJoint extends PhysicsJoint { private native void setLimit(long objectId, float low, float high); /** - * Sets the limits of this joint. - * If you're above the softness, velocities that would shoot through the actual limit are slowed down. The bias be in the range of 0.2 - 0.5. - * @param low the low limit in radians. - * @param high the high limit in radians. - * @param _softness the factor at which the velocity error correction starts operating,i.e a softness of 0.9 means that the vel. corr starts at 90% of the limit range. - * @param _biasFactor the magnitude of the position correction. It tells you how strictly the position error (drift ) is corrected. - * @param _relaxationFactor the rate at which velocity errors are corrected. This can be seen as the strength of the limits. A low value will make the the limits more spongy. + * Alter this joint's limits. If you're above the softness, velocities that + * would shoot through the actual limit are slowed down. The bias should be + * in the range of 0.2 - 0.5. + * + * @param low the desired lower limit of the hinge angle (in radians) + * @param high the desired upper limit of the joint angle (in radians) + * @param _softness the desired range fraction at which velocity-error + * correction starts operating. A softness of 0.9 means that the correction + * starts at 90% of the limit range. (default=0.9) + * @param _biasFactor the desired magnitude of the position correction, how + * strictly position errors (drift) is corrected. (default=0.3) + * @param _relaxationFactor the desired rate at which velocity errors are + * corrected. This can be seen as the strength of the limits. A low value + * will make the limits more spongy. (default=1) */ public void setLimit(float low, float high, float _softness, float _biasFactor, float _relaxationFactor) { biasFactor = _biasFactor; @@ -132,18 +190,34 @@ public class HingeJoint extends PhysicsJoint { private native void setLimit(long objectId, float low, float high, float _softness, float _biasFactor, float _relaxationFactor); + /** + * Read the upper limit of the hinge angle. + * + * @return angle (in radians) + */ public float getUpperLimit() { return getUpperLimit(objectId); } private native float getUpperLimit(long objectId); + /** + * Read the lower limit of the hinge angle. + * + * @return the angle (in radians) + */ public float getLowerLimit() { return getLowerLimit(objectId); } private native float getLowerLimit(long objectId); + /** + * Alter the hinge translation flag. + * + * @param angularOnly true→rotate only, false→rotate and translate + * (default=false) + */ public void setAngularOnly(boolean angularOnly) { this.angularOnly = angularOnly; setAngularOnly(objectId, angularOnly); @@ -151,12 +225,23 @@ public class HingeJoint extends PhysicsJoint { private native void setAngularOnly(long objectId, boolean angularOnly); + /** + * Read the hinge angle. + * + * @return the angle (in radians) + */ public float getHingeAngle() { return getHingeAngle(objectId); } private native float getHingeAngle(long objectId); + /** + * Serialize this joint, for example when saving to a J3O file. + * + * @param ex exporter (not null) + * @throws IOException from exporter + */ public void write(JmeExporter ex) throws IOException { super.write(ex); OutputCapsule capsule = ex.getCapsule(this); @@ -177,6 +262,12 @@ public class HingeJoint extends PhysicsJoint { capsule.write(getMaxMotorImpulse(), "maxMotorImpulse", 0.0f); } + /** + * De-serialize this joint, for example when loading from a J3O file. + * + * @param im importer (not null) + * @throws IOException from importer + */ public void read(JmeImporter im) throws IOException { super.read(im); InputCapsule capsule = im.getCapsule(this); @@ -200,9 +291,13 @@ public class HingeJoint extends PhysicsJoint { setLimit(lowerLimit, upperLimit, limitSoftness, biasFactor, relaxationFactor); } + /** + * Create the configured joint in Bullet. + */ protected void createJoint() { objectId = createJoint(nodeA.getObjectId(), nodeB.getObjectId(), pivotA, axisA, pivotB, axisB); Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Created Joint {0}", Long.toHexString(objectId)); + setAngularOnly(objectId, angularOnly); } private native long createJoint(long objectIdA, long objectIdB, Vector3f pivotA, Vector3f axisA, Vector3f pivotB, Vector3f axisB); diff --git a/jme3-bullet/src/main/java/com/jme3/bullet/joints/PhysicsJoint.java b/jme3-bullet/src/main/java/com/jme3/bullet/joints/PhysicsJoint.java index 256036ff7..f3087dfae 100644 --- a/jme3-bullet/src/main/java/com/jme3/bullet/joints/PhysicsJoint.java +++ b/jme3-bullet/src/main/java/com/jme3/bullet/joints/PhysicsJoint.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -39,24 +39,59 @@ import java.util.logging.Level; import java.util.logging.Logger; /** - *

PhysicsJoint - Basic Phyiscs Joint

+ * The abstract base class for physics joints based on Bullet's + * btTypedConstraint, used to connect 2 dynamic rigid bodies in the same + * physics space. + *

+ * Joints include ConeJoint, HingeJoint, Point2PointJoint, and SixDofJoint. + * * @author normenhansen */ public abstract class PhysicsJoint implements Savable { + /** + * Unique identifier of the Bullet constraint. Constructors are responsible + * for setting this to a non-zero value. After that, the id never changes. + */ protected long objectId = 0; + /** + * one of the connected rigid bodies + */ protected PhysicsRigidBody nodeA; + /** + * the other connected rigid body + */ protected PhysicsRigidBody nodeB; + /** + * local offset of this joint's connection point in node A + */ protected Vector3f pivotA; + /** + * local offset of this joint's connection point in node B + */ protected Vector3f pivotB; protected boolean collisionBetweenLinkedBodys = true; + /** + * No-argument constructor needed by SavableClassUtil. Do not invoke + * directly! + */ public PhysicsJoint() { } /** - * @param pivotA local translation of the joint connection point in node A - * @param pivotB local translation of the joint connection point in node B + * Instantiate a PhysicsJoint. To be effective, the joint must be added to + * the physics space of the two bodies. Also, the bodies must be dynamic and + * distinct. + * + * @param nodeA the 1st body connected by the joint (not null, alias + * created) + * @param nodeB the 2nd body connected by the joint (not null, alias + * created) + * @param pivotA local offset of the joint connection point in node A (not + * null, alias created) + * @param pivotB local offset of the joint connection point in node B (not + * null, alias created) */ public PhysicsJoint(PhysicsRigidBody nodeA, PhysicsRigidBody nodeB, Vector3f pivotA, Vector3f pivotB) { this.nodeA = nodeA; @@ -67,6 +102,11 @@ public abstract class PhysicsJoint implements Savable { nodeB.addJoint(this); } + /** + * Read the magnitude of the applied impulse. + * + * @return impulse + */ public float getAppliedImpulse() { return getAppliedImpulse(objectId); } @@ -74,52 +114,84 @@ public abstract class PhysicsJoint implements Savable { private native float getAppliedImpulse(long objectId); /** - * @return the constraint + * Read the id of the Bullet constraint. + * + * @return the unique identifier (not zero) */ public long getObjectId() { return objectId; } /** - * @return the collisionBetweenLinkedBodys + * Test whether collisions are allowed between the linked bodies. + * + * @return true if collision are allowed, otherwise false */ public boolean isCollisionBetweenLinkedBodys() { return collisionBetweenLinkedBodys; } /** - * toggles collisions between linked bodys
- * joint has to be removed from and added to PhyiscsSpace to apply this. - * @param collisionBetweenLinkedBodys set to false to have no collisions between linked bodys + * Enable or disable collisions between the linked bodies. The joint must be + * removed from and added to PhysicsSpace for this change to be effective. + * + * @param collisionBetweenLinkedBodys true → allow collisions, false → prevent them */ public void setCollisionBetweenLinkedBodys(boolean collisionBetweenLinkedBodys) { this.collisionBetweenLinkedBodys = collisionBetweenLinkedBodys; } + /** + * Access the 1st body specified in during construction. + * + * @return the pre-existing body + */ public PhysicsRigidBody getBodyA() { return nodeA; } + /** + * Access the 2nd body specified in during construction. + * + * @return the pre-existing body + */ public PhysicsRigidBody getBodyB() { return nodeB; } + /** + * Access the local offset of the joint connection point in node A. + * + * @return the pre-existing vector (not null) + */ public Vector3f getPivotA() { return pivotA; } + /** + * Access the local offset of the joint connection point in node A. + * + * @return the pre-existing vector (not null) + */ public Vector3f getPivotB() { return pivotB; } /** - * destroys this joint and removes it from its connected PhysicsRigidBodys joint lists + * Destroy this joint and remove it from the joint lists of its connected + * bodies. */ public void destroy() { getBodyA().removeJoint(this); getBodyB().removeJoint(this); } + /** + * Serialize this joint, for example when saving to a J3O file. + * + * @param ex exporter (not null) + * @throws IOException from exporter + */ public void write(JmeExporter ex) throws IOException { OutputCapsule capsule = ex.getCapsule(this); capsule.write(nodeA, "nodeA", null); @@ -128,6 +200,12 @@ public abstract class PhysicsJoint implements Savable { capsule.write(pivotB, "pivotB", null); } + /** + * De-serialize this joint, for example when loading from a J3O file. + * + * @param im importer (not null) + * @throws IOException from importer + */ public void read(JmeImporter im) throws IOException { InputCapsule capsule = im.getCapsule(this); this.nodeA = ((PhysicsRigidBody) capsule.readSavable("nodeA", new PhysicsRigidBody())); @@ -136,6 +214,12 @@ public abstract class PhysicsJoint implements Savable { this.pivotB = (Vector3f) capsule.readSavable("pivotB", new Vector3f()); } + /** + * Finalize this physics joint just before it is destroyed. Should be + * invoked only by a subclass or by the garbage collector. + * + * @throws Throwable ignored by the garbage collector + */ @Override protected void finalize() throws Throwable { super.finalize(); diff --git a/jme3-bullet/src/main/java/com/jme3/bullet/joints/Point2PointJoint.java b/jme3-bullet/src/main/java/com/jme3/bullet/joints/Point2PointJoint.java index 312293e99..932f41f7b 100644 --- a/jme3-bullet/src/main/java/com/jme3/bullet/joints/Point2PointJoint.java +++ b/jme3-bullet/src/main/java/com/jme3/bullet/joints/Point2PointJoint.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -42,62 +42,116 @@ import java.util.logging.Level; import java.util.logging.Logger; /** - * From bullet manual:
- * Point to point constraint, also known as ball socket joint limits the translation - * so that the local pivot points of 2 rigidbodies match in worldspace. - * A chain of rigidbodies can be connected using this constraint. + * A joint based on Bullet's btPoint2PointConstraint. + *

+ * From the Bullet manual:
+ * Point to point constraint limits the translation so that the local pivot + * points of 2 rigidbodies match in worldspace. A chain of rigidbodies can be + * connected using this constraint. + * * @author normenhansen */ public class Point2PointJoint extends PhysicsJoint { + /** + * No-argument constructor needed by SavableClassUtil. Do not invoke + * directly! + */ public Point2PointJoint() { } /** - * @param pivotA local translation of the joint connection point in node A - * @param pivotB local translation of the joint connection point in node B + * Instantiate a Point2PointJoint. To be effective, the joint must be added + * to a physics space. + * + * @param nodeA the 1st body connected by the joint (not null, alias + * created) + * @param nodeB the 2nd body connected by the joint (not null, alias + * created) + * @param pivotA the local offset of the connection point in node A (not + * null, alias created) + * @param pivotB the local offset of the connection point in node B (not + * null, alias created) */ public Point2PointJoint(PhysicsRigidBody nodeA, PhysicsRigidBody nodeB, Vector3f pivotA, Vector3f pivotB) { super(nodeA, nodeB, pivotA, pivotB); createJoint(); } + /** + * Alter the joint's damping. + * + * @param value the desired viscous damping ratio (0→no damping, + * 1→critically damped, default=1) + */ public void setDamping(float value) { setDamping(objectId, value); } private native void setDamping(long objectId, float value); + /** + * Alter the joint's impulse clamp. + * + * @param value the desired impulse clamp value (default=0) + */ public void setImpulseClamp(float value) { setImpulseClamp(objectId, value); } private native void setImpulseClamp(long objectId, float value); + /** + * Alter the joint's tau value. + * + * @param value the desired tau value (default=0.3) + */ public void setTau(float value) { setTau(objectId, value); } private native void setTau(long objectId, float value); + /** + * Read the joint's damping ratio. + * + * @return the viscous damping ratio (0→no damping, 1→critically + * damped) + */ public float getDamping() { return getDamping(objectId); } private native float getDamping(long objectId); + /** + * Read the joint's impulse clamp. + * + * @return the clamp value + */ public float getImpulseClamp() { return getImpulseClamp(objectId); } private native float getImpulseClamp(long objectId); + /** + * Read the joint's tau value. + * + * @return the tau value + */ public float getTau() { return getTau(objectId); } private native float getTau(long objectId); + /** + * Serialize this joint, for example when saving to a J3O file. + * + * @param ex exporter (not null) + * @throws IOException from exporter + */ @Override public void write(JmeExporter ex) throws IOException { super.write(ex); @@ -107,6 +161,12 @@ public class Point2PointJoint extends PhysicsJoint { cap.write(getImpulseClamp(), "impulseClamp", 0f); } + /** + * De-serialize this joint, for example when loading from a J3O file. + * + * @param im importer (not null) + * @throws IOException from importer + */ @Override public void read(JmeImporter im) throws IOException { super.read(im); @@ -117,6 +177,9 @@ public class Point2PointJoint extends PhysicsJoint { setDamping(cap.readFloat("impulseClamp", 0f)); } + /** + * Create the configured joint in Bullet. + */ protected void createJoint() { objectId = createJoint(nodeA.getObjectId(), nodeB.getObjectId(), pivotA, pivotB); Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Created Joint {0}", Long.toHexString(objectId)); diff --git a/jme3-bullet/src/main/java/com/jme3/bullet/joints/SixDofJoint.java b/jme3-bullet/src/main/java/com/jme3/bullet/joints/SixDofJoint.java index 648398149..660319a18 100644 --- a/jme3-bullet/src/main/java/com/jme3/bullet/joints/SixDofJoint.java +++ b/jme3-bullet/src/main/java/com/jme3/bullet/joints/SixDofJoint.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -47,33 +47,79 @@ import java.util.logging.Level; import java.util.logging.Logger; /** - * From bullet manual:
- * This generic constraint can emulate a variety of standard constraints, - * by configuring each of the 6 degrees of freedom (dof). - * The first 3 dof axis are linear axis, which represent translation of rigidbodies, - * and the latter 3 dof axis represent the angular motion. Each axis can be either locked, - * free or limited. On construction of a new btGeneric6DofConstraint, all axis are locked. - * Afterwards the axis can be reconfigured. Note that several combinations that - * include free and/or limited angular degrees of freedom are undefined. + * A joint based on Bullet's btGeneric6DofConstraint. + *

+ * From the Bullet manual:
+ * This generic constraint can emulate a variety of standard constraints, by + * configuring each of the 6 degrees of freedom (dof). The first 3 dof axis are + * linear axis, which represent translation of rigidbodies, and the latter 3 dof + * axis represent the angular motion. Each axis can be either locked, free or + * limited. On construction of a new btGeneric6DofSpring2Constraint, all axis + * are locked. Afterwards the axis can be reconfigured. Note that several + * combinations that include free and/or limited angular degrees of freedom are + * undefined. + *

+ * For each axis:

    + *
  • Lowerlimit = Upperlimit → axis is locked
  • + *
  • Lowerlimit > Upperlimit → axis is free
  • + *
  • Lowerlimit < Upperlimit → axis it limited in that range
  • + *
+ * * @author normenhansen */ public class SixDofJoint extends PhysicsJoint { Matrix3f rotA, rotB; + /** + * true→limits give the allowable range of movement of frameB in frameA + * space, false→limits give the allowable range of movement of frameA + * in frameB space + */ boolean useLinearReferenceFrameA; LinkedList rotationalMotors = new LinkedList(); TranslationalLimitMotor translationalMotor; + /** + * upper limits for rotation of all 3 axes + */ Vector3f angularUpperLimit = new Vector3f(Vector3f.POSITIVE_INFINITY); + /** + * lower limits for rotation of all 3 axes + */ Vector3f angularLowerLimit = new Vector3f(Vector3f.NEGATIVE_INFINITY); + /** + * upper limit for translation of all 3 axes + */ Vector3f linearUpperLimit = new Vector3f(Vector3f.POSITIVE_INFINITY); + /** + * lower limits for translation of all 3 axes + */ Vector3f linearLowerLimit = new Vector3f(Vector3f.NEGATIVE_INFINITY); + /** + * No-argument constructor needed by SavableClassUtil. Do not invoke + * directly! + */ public SixDofJoint() { } /** - * @param pivotA local translation of the joint connection point in node A - * @param pivotB local translation of the joint connection point in node B + * Instantiate a SixDofJoint. To be effective, the joint must be added to a + * physics space. + * + * @param nodeA the 1st body connected by the joint (not null, alias + * created) + * @param nodeB the 2nd body connected by the joint (not null, alias + * created) + * @param pivotA the local offset of the connection point in node A (not + * null, alias created) + * @param pivotB the local offset of the connection point in node B (not + * null, alias created) + * @param rotA the local orientation of the connection to node A (not null, + * alias created) + * @param rotB the local orientation of the connection to node B (not null, + * alias created) + * @param useLinearReferenceFrameA true→use node A, false→use node + * B */ public SixDofJoint(PhysicsRigidBody nodeA, PhysicsRigidBody nodeB, Vector3f pivotA, Vector3f pivotB, Matrix3f rotA, Matrix3f rotB, boolean useLinearReferenceFrameA) { super(nodeA, nodeB, pivotA, pivotB); @@ -87,8 +133,19 @@ public class SixDofJoint extends PhysicsJoint { } /** - * @param pivotA local translation of the joint connection point in node A - * @param pivotB local translation of the joint connection point in node B + * Instantiate a SixDofJoint. To be effective, the joint must be added to a + * physics space. + * + * @param nodeA the 1st body connected by the joint (not null, alias + * created) + * @param nodeB the 2nd body connected by the joint (not null, alias + * created) + * @param pivotA the local offset of the connection point in node A (not + * null, alias created) + * @param pivotB the local offset of the connection point in node B (not + * null, alias created) + * @param useLinearReferenceFrameA true→use node A, false→use node + * B */ public SixDofJoint(PhysicsRigidBody nodeA, PhysicsRigidBody nodeB, Vector3f pivotA, Vector3f pivotB, boolean useLinearReferenceFrameA) { super(nodeA, nodeB, pivotA, pivotB); @@ -114,24 +171,32 @@ public class SixDofJoint extends PhysicsJoint { private native long getTranslationalLimitMotor(long objectId); /** - * returns the TranslationalLimitMotor of this 6DofJoint which allows - * manipulating the translational axis - * @return the TranslationalLimitMotor + * Access the TranslationalLimitMotor of this joint, the motor which + * influences translation on all 3 axes. + * + * @return the pre-existing instance */ public TranslationalLimitMotor getTranslationalLimitMotor() { return translationalMotor; } /** - * returns one of the three RotationalLimitMotors of this 6DofJoint which - * allow manipulating the rotational axes - * @param index the index of the RotationalLimitMotor - * @return the RotationalLimitMotor at the given index + * Access the indexed RotationalLimitMotor of this joint, the motor which + * influences rotation around one axis. + * + * @param index the axis index of the desired motor: 0→X, 1→Y, + * 2→Z + * @return the pre-existing instance */ public RotationalLimitMotor getRotationalLimitMotor(int index) { return rotationalMotors.get(index); } + /** + * Alter the joint's upper limits for translation of all 3 axes. + * + * @param vector the desired upper limits (not null, unaffected) + */ public void setLinearUpperLimit(Vector3f vector) { linearUpperLimit.set(vector); setLinearUpperLimit(objectId, vector); @@ -139,6 +204,11 @@ public class SixDofJoint extends PhysicsJoint { private native void setLinearUpperLimit(long objctId, Vector3f vector); + /** + * Alter the joint's lower limits for translation of all 3 axes. + * + * @param vector the desired lower limits (not null, unaffected) + */ public void setLinearLowerLimit(Vector3f vector) { linearLowerLimit.set(vector); setLinearLowerLimit(objectId, vector); @@ -146,6 +216,11 @@ public class SixDofJoint extends PhysicsJoint { private native void setLinearLowerLimit(long objctId, Vector3f vector); + /** + * Alter the joint's upper limits for rotation of all 3 axes. + * + * @param vector the desired upper limits (in radians, not null, unaffected) + */ public void setAngularUpperLimit(Vector3f vector) { angularUpperLimit.set(vector); setAngularUpperLimit(objectId, vector); @@ -153,6 +228,11 @@ public class SixDofJoint extends PhysicsJoint { private native void setAngularUpperLimit(long objctId, Vector3f vector); + /** + * Alter the joint's lower limits for rotation of all 3 axes. + * + * @param vector the desired lower limits (in radians, not null, unaffected) + */ public void setAngularLowerLimit(Vector3f vector) { angularLowerLimit.set(vector); setAngularLowerLimit(objectId, vector); @@ -162,6 +242,12 @@ public class SixDofJoint extends PhysicsJoint { native long createJoint(long objectIdA, long objectIdB, Vector3f pivotA, Matrix3f rotA, Vector3f pivotB, Matrix3f rotB, boolean useLinearReferenceFrameA); + /** + * De-serialize this joint, for example when loading from a J3O file. + * + * @param im importer (not null) + * @throws IOException from importer + */ @Override public void read(JmeImporter im) throws IOException { super.read(im); @@ -197,6 +283,12 @@ public class SixDofJoint extends PhysicsJoint { getTranslationalLimitMotor().setUpperLimit((Vector3f) capsule.readSavable("transMotor_UpperLimit", Vector3f.ZERO)); } + /** + * Serialize this joint, for example when saving to a J3O file. + * + * @param ex exporter (not null) + * @throws IOException from exporter + */ @Override public void write(JmeExporter ex) throws IOException { super.write(ex); diff --git a/jme3-bullet/src/main/java/com/jme3/bullet/joints/SixDofSpringJoint.java b/jme3-bullet/src/main/java/com/jme3/bullet/joints/SixDofSpringJoint.java index e52f9836c..a9479d1e7 100644 --- a/jme3-bullet/src/main/java/com/jme3/bullet/joints/SixDofSpringJoint.java +++ b/jme3-bullet/src/main/java/com/jme3/bullet/joints/SixDofSpringJoint.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -36,14 +36,24 @@ import com.jme3.math.Matrix3f; import com.jme3.math.Vector3f; /** - * From bullet manual:
- * This generic constraint can emulate a variety of standard constraints, - * by configuring each of the 6 degrees of freedom (dof). - * The first 3 dof axis are linear axis, which represent translation of rigidbodies, - * and the latter 3 dof axis represent the angular motion. Each axis can be either locked, - * free or limited. On construction of a new btGeneric6DofConstraint, all axis are locked. - * Afterwards the axis can be reconfigured. Note that several combinations that - * include free and/or limited angular degrees of freedom are undefined. + * A 6 degree-of-freedom joint based on Bullet's btGeneric6DofSpringConstraint. + *

+ * From the Bullet manual:
+ * This generic constraint can emulate a variety of standard constraints, by + * configuring each of the 6 degrees of freedom (dof). The first 3 dof axis are + * linear axis, which represent translation of rigidbodies, and the latter 3 dof + * axis represent the angular motion. Each axis can be either locked, free or + * limited. On construction of a new btGeneric6DofSpring2Constraint, all axis + * are locked. Afterwards the axis can be reconfigured. Note that several + * combinations that include free and/or limited angular degrees of freedom are + * undefined. + *

+ * For each axis:

    + *
  • Lowerlimit = Upperlimit → axis is locked
  • + *
  • Lowerlimit > Upperlimit → axis is free
  • + *
  • Lowerlimit < Upperlimit → axis it limited in that range
  • + *
+ * * @author normenhansen */ public class SixDofSpringJoint extends SixDofJoint { @@ -53,35 +63,84 @@ public class SixDofSpringJoint extends SixDofJoint { final float springStiffness[] = new float[6]; final float springDamping[] = new float[6]; // between 0 and 1 (1 == no damping) + /** + * No-argument constructor needed by SavableClassUtil. Do not invoke + * directly! + */ public SixDofSpringJoint() { } /** - * @param pivotA local translation of the joint connection point in node A - * @param pivotB local translation of the joint connection point in node B + * Instantiate a SixDofSpringJoint. To be effective, the joint must be added + * to a physics space. + * + * @param nodeA the 1st body connected by the joint (not null, alias + * created) + * @param nodeB the 2nd body connected by the joint (not null, alias + * created) + * @param pivotA the local offset of the connection point in node A (not + * null, alias created) + * @param pivotB the local offset of the connection point in node B (not + * null, alias created) + * @param rotA the local orientation of the connection to node A (not + * null, alias created) + * @param rotB the local orientation of the connection to node B (not + * null, alias created) + * @param useLinearReferenceFrameA true→use node A, false→use node + * B */ public SixDofSpringJoint(PhysicsRigidBody nodeA, PhysicsRigidBody nodeB, Vector3f pivotA, Vector3f pivotB, Matrix3f rotA, Matrix3f rotB, boolean useLinearReferenceFrameA) { super(nodeA, nodeB, pivotA, pivotB, rotA, rotB, useLinearReferenceFrameA); } + + /** + * Enable or disable the spring for the indexed degree of freedom. + * + * @param index which degree of freedom (≥0, <6) + * @param onOff true → enable, false → disable + */ public void enableSpring(int index, boolean onOff) { enableSpring(objectId, index, onOff); } native void enableSpring(long objctId, int index, boolean onOff); + /** + * Alter the spring stiffness for the indexed degree of freedom. + * + * @param index which degree of freedom (≥0, <6) + * @param stiffness the desired stiffness + */ public void setStiffness(int index, float stiffness) { setStiffness(objectId, index, stiffness); } native void setStiffness(long objctId, int index, float stiffness); + /** + * Alter the damping for the indexed degree of freedom. + * + * @param index which degree of freedom (≥0, <6) + * @param damping the desired viscous damping ratio (0→no damping, + * 1→critically damped, default=1) + */ public void setDamping(int index, float damping) { setDamping(objectId, index, damping); } native void setDamping(long objctId, int index, float damping); + /** + * Alter the equilibrium points for all degrees of freedom, based on the + * current constraint position/orientation. + */ public void setEquilibriumPoint() { // set the current constraint position/orientation as an equilibrium point for all DOF setEquilibriumPoint(objectId); } native void setEquilibriumPoint(long objctId); + /** + * Alter the equilibrium point of the indexed degree of freedom, based on + * the current constraint position/orientation. + * + * @param index which degree of freedom (≥0, <6) + */ public void setEquilibriumPoint(int index){ // set the current constraint position/orientation as an equilibrium point for given DOF setEquilibriumPoint(objectId, index); } diff --git a/jme3-bullet/src/main/java/com/jme3/bullet/joints/SliderJoint.java b/jme3-bullet/src/main/java/com/jme3/bullet/joints/SliderJoint.java index b51c5d849..8299fbd65 100644 --- a/jme3-bullet/src/main/java/com/jme3/bullet/joints/SliderJoint.java +++ b/jme3-bullet/src/main/java/com/jme3/bullet/joints/SliderJoint.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -43,8 +43,12 @@ import java.util.logging.Level; import java.util.logging.Logger; /** - * From bullet manual:
- * The slider constraint allows the body to rotate around one axis and translate along this axis. + * A slider joint based on Bullet's btSliderConstraint. + *

+ * From the Bullet manual:
+ * The slider constraint allows the body to rotate around one axis and translate + * along this axis. + * * @author normenhansen */ public class SliderJoint extends PhysicsJoint { @@ -52,12 +56,29 @@ public class SliderJoint extends PhysicsJoint { protected Matrix3f rotA, rotB; protected boolean useLinearReferenceFrameA; + /** + * No-argument constructor needed by SavableClassUtil. Do not invoke + * directly! + */ public SliderJoint() { } /** - * @param pivotA local translation of the joint connection point in node A - * @param pivotB local translation of the joint connection point in node B + * Instantiate a SliderJoint. To be effective, the joint must be added to a + * physics space. + * + * @param nodeA the 1st body connected by the joint (not null, alias + * created) + * @param nodeB the 2nd body connected by the joint (not null, alias + * created) + * @param pivotA the local offset of the connection point in node A (not + * null, alias created) + * @param pivotB the local offset of the connection point in node B (not + * null, alias created) + * @param rotA the local orientation of the connection to node A (not null, alias created) + * @param rotB the local orientation of the connection to node B (not null, alias created) + * @param useLinearReferenceFrameA true→use node A, false→use node + * B */ public SliderJoint(PhysicsRigidBody nodeA, PhysicsRigidBody nodeB, Vector3f pivotA, Vector3f pivotB, Matrix3f rotA, Matrix3f rotB, boolean useLinearReferenceFrameA) { super(nodeA, nodeB, pivotA, pivotB); @@ -68,8 +89,19 @@ public class SliderJoint extends PhysicsJoint { } /** - * @param pivotA local translation of the joint connection point in node A - * @param pivotB local translation of the joint connection point in node B + * Instantiate a SliderJoint. To be effective, the joint must be added to a + * physics space. + * + * @param nodeA the 1st body connected by the joint (not null, alias + * created) + * @param nodeB the 2nd body connected by the joint (not null, alias + * created) + * @param pivotA the local offset of the connection point in node A (not + * null, alias created) + * @param pivotB the local offset of the connection point in node B (not + * null, alias created) + * @param useLinearReferenceFrameA true→use node A, false→use node + * B */ public SliderJoint(PhysicsRigidBody nodeA, PhysicsRigidBody nodeB, Vector3f pivotA, Vector3f pivotB, boolean useLinearReferenceFrameA) { super(nodeA, nodeB, pivotA, pivotB); @@ -79,342 +111,651 @@ public class SliderJoint extends PhysicsJoint { createJoint(); } + /** + * Read the joint's lower limit for on-axis translation. + * + * @return the lower limit + */ public float getLowerLinLimit() { return getLowerLinLimit(objectId); } private native float getLowerLinLimit(long objectId); + /** + * Alter the joint's lower limit for on-axis translation. + * + * @param lowerLinLimit the desired lower limit (default=-1) + */ public void setLowerLinLimit(float lowerLinLimit) { setLowerLinLimit(objectId, lowerLinLimit); } private native void setLowerLinLimit(long objectId, float value); + /** + * Read the joint's upper limit for on-axis translation. + * + * @return the upper limit + */ public float getUpperLinLimit() { return getUpperLinLimit(objectId); } private native float getUpperLinLimit(long objectId); + /** + * Alter the joint's upper limit for on-axis translation. + * + * @param upperLinLimit the desired upper limit (default=1) + */ public void setUpperLinLimit(float upperLinLimit) { setUpperLinLimit(objectId, upperLinLimit); } private native void setUpperLinLimit(long objectId, float value); + /** + * Read the joint's lower limit for on-axis rotation. + * + * @return the lower limit angle (in radians) + */ public float getLowerAngLimit() { return getLowerAngLimit(objectId); } private native float getLowerAngLimit(long objectId); + /** + * Alter the joint's lower limit for on-axis rotation. + * + * @param lowerAngLimit the desired lower limit angle (in radians, + * default=0) + */ public void setLowerAngLimit(float lowerAngLimit) { setLowerAngLimit(objectId, lowerAngLimit); } private native void setLowerAngLimit(long objectId, float value); + /** + * Read the joint's upper limit for on-axis rotation. + * + * @return the upper limit angle (in radians) + */ public float getUpperAngLimit() { return getUpperAngLimit(objectId); } private native float getUpperAngLimit(long objectId); + /** + * Alter the joint's upper limit for on-axis rotation. + * + * @param upperAngLimit the desired upper limit angle (in radians, + * default=0) + */ public void setUpperAngLimit(float upperAngLimit) { setUpperAngLimit(objectId, upperAngLimit); } private native void setUpperAngLimit(long objectId, float value); + /** + * Read the joint's softness for on-axis translation between the limits. + * + * @return the softness + */ public float getSoftnessDirLin() { return getSoftnessDirLin(objectId); } private native float getSoftnessDirLin(long objectId); + /** + * Alter the joint's softness for on-axis translation between the limits. + * + * @param softnessDirLin the desired softness (default=1) + */ public void setSoftnessDirLin(float softnessDirLin) { setSoftnessDirLin(objectId, softnessDirLin); } private native void setSoftnessDirLin(long objectId, float value); + /** + * Read the joint's restitution for on-axis translation between the limits. + * + * @return the restitution (bounce) factor + */ public float getRestitutionDirLin() { return getRestitutionDirLin(objectId); } private native float getRestitutionDirLin(long objectId); + /** + * Alter the joint's restitution for on-axis translation between the limits. + * + * @param restitutionDirLin the desired restitution (bounce) factor + * (default=0.7) + */ public void setRestitutionDirLin(float restitutionDirLin) { setRestitutionDirLin(objectId, restitutionDirLin); } private native void setRestitutionDirLin(long objectId, float value); + /** + * Read the joint's damping for on-axis translation between the limits. + * + * @return the viscous damping ratio (0→no damping, 1→critically + * damped) + */ public float getDampingDirLin() { return getDampingDirLin(objectId); } private native float getDampingDirLin(long objectId); + /** + * Alter the joint's damping for on-axis translation between the limits. + * + * @param dampingDirLin the desired viscous damping ratio (0→no + * damping, 1→critically damped, default=0) + */ public void setDampingDirLin(float dampingDirLin) { setDampingDirLin(objectId, dampingDirLin); } private native void setDampingDirLin(long objectId, float value); + /** + * Read the joint's softness for on-axis rotation between the limits. + * + * @return the softness + */ public float getSoftnessDirAng() { return getSoftnessDirAng(objectId); } private native float getSoftnessDirAng(long objectId); + /** + * Alter the joint's softness for on-axis rotation between the limits. + * + * @param softnessDirAng the desired softness (default=1) + */ public void setSoftnessDirAng(float softnessDirAng) { setSoftnessDirAng(objectId, softnessDirAng); } private native void setSoftnessDirAng(long objectId, float value); + /** + * Read the joint's restitution for on-axis rotation between the limits. + * + * @return the restitution (bounce) factor + */ public float getRestitutionDirAng() { return getRestitutionDirAng(objectId); } private native float getRestitutionDirAng(long objectId); + /** + * Alter the joint's restitution for on-axis rotation between the limits. + * + * @param restitutionDirAng the desired restitution (bounce) factor + * (default=0.7) + */ public void setRestitutionDirAng(float restitutionDirAng) { setRestitutionDirAng(objectId, restitutionDirAng); } private native void setRestitutionDirAng(long objectId, float value); + /** + * Read the joint's damping for on-axis rotation between the limits. + * + * @return the viscous damping ratio (0→no damping, 1→critically + * damped) + */ public float getDampingDirAng() { return getDampingDirAng(objectId); } private native float getDampingDirAng(long objectId); + /** + * Alter the joint's damping for on-axis rotation between the limits. + * + * @param dampingDirAng the desired viscous damping ratio (0→no + * damping, 1→critically damped, default=0) + */ public void setDampingDirAng(float dampingDirAng) { setDampingDirAng(objectId, dampingDirAng); } private native void setDampingDirAng(long objectId, float value); + /** + * Read the joint's softness for on-axis translation hitting the limits. + * + * @return the softness + */ public float getSoftnessLimLin() { return getSoftnessLimLin(objectId); } private native float getSoftnessLimLin(long objectId); + /** + * Alter the joint's softness for on-axis translation hitting the limits. + * + * @param softnessLimLin the desired softness (default=1) + */ public void setSoftnessLimLin(float softnessLimLin) { setSoftnessLimLin(objectId, softnessLimLin); } private native void setSoftnessLimLin(long objectId, float value); + /** + * Read the joint's restitution for on-axis translation hitting the limits. + * + * @return the restitution (bounce) factor + */ public float getRestitutionLimLin() { return getRestitutionLimLin(objectId); } private native float getRestitutionLimLin(long objectId); + /** + * Alter the joint's restitution for on-axis translation hitting the limits. + * + * @param restitutionLimLin the desired restitution (bounce) factor + * (default=0.7) + */ public void setRestitutionLimLin(float restitutionLimLin) { setRestitutionLimLin(objectId, restitutionLimLin); } private native void setRestitutionLimLin(long objectId, float value); + /** + * Read the joint's damping for on-axis translation hitting the limits. + * + * @return the viscous damping ratio (0→no damping, 1→critically + * damped) + */ public float getDampingLimLin() { return getDampingLimLin(objectId); } private native float getDampingLimLin(long objectId); + /** + * Alter the joint's damping for on-axis translation hitting the limits. + * + * @param dampingLimLin the desired viscous damping ratio (0→no + * damping, 1→critically damped, default=1) + */ public void setDampingLimLin(float dampingLimLin) { setDampingLimLin(objectId, dampingLimLin); } private native void setDampingLimLin(long objectId, float value); + /** + * Read the joint's softness for on-axis rotation hitting the limits. + * + * @return the softness + */ public float getSoftnessLimAng() { return getSoftnessLimAng(objectId); } private native float getSoftnessLimAng(long objectId); + /** + * Alter the joint's softness for on-axis rotation hitting the limits. + * + * @param softnessLimAng the desired softness (default=1) + */ public void setSoftnessLimAng(float softnessLimAng) { setSoftnessLimAng(objectId, softnessLimAng); } private native void setSoftnessLimAng(long objectId, float value); + /** + * Read the joint's restitution for on-axis rotation hitting the limits. + * + * @return the restitution (bounce) factor + */ public float getRestitutionLimAng() { return getRestitutionLimAng(objectId); } private native float getRestitutionLimAng(long objectId); + /** + * Alter the joint's restitution for on-axis rotation hitting the limits. + * + * @param restitutionLimAng the desired restitution (bounce) factor + * (default=0.7) + */ public void setRestitutionLimAng(float restitutionLimAng) { setRestitutionLimAng(objectId, restitutionLimAng); } private native void setRestitutionLimAng(long objectId, float value); + /** + * Read the joint's damping for on-axis rotation hitting the limits. + * + * @return the viscous damping ratio (0→no damping, 1→critically + * damped) + */ public float getDampingLimAng() { return getDampingLimAng(objectId); } private native float getDampingLimAng(long objectId); + /** + * Alter the joint's damping for on-axis rotation hitting the limits. + * + * @param dampingLimAng the desired viscous damping ratio (0→no + * damping, 1→critically damped, default=1) + */ public void setDampingLimAng(float dampingLimAng) { setDampingLimAng(objectId, dampingLimAng); } private native void setDampingLimAng(long objectId, float value); + /** + * Read the joint's softness for off-axis translation. + * + * @return the softness + */ public float getSoftnessOrthoLin() { return getSoftnessOrthoLin(objectId); } private native float getSoftnessOrthoLin(long objectId); + /** + * Alter the joint's softness for off-axis translation. + * + * @param softnessOrthoLin the desired softness (default=1) + */ public void setSoftnessOrthoLin(float softnessOrthoLin) { setSoftnessOrthoLin(objectId, softnessOrthoLin); } private native void setSoftnessOrthoLin(long objectId, float value); + /** + * Read the joint's restitution for off-axis translation. + * + * @return the restitution (bounce) factor + */ public float getRestitutionOrthoLin() { return getRestitutionOrthoLin(objectId); } private native float getRestitutionOrthoLin(long objectId); + /** + * Alter the joint's restitution for off-axis translation. + * + * @param restitutionOrthoLin the desired restitution (bounce) factor + * (default=0.7) + */ public void setRestitutionOrthoLin(float restitutionOrthoLin) { - setDampingOrthoLin(objectId, restitutionOrthoLin); + setRestitutionOrthoLin(objectId, restitutionOrthoLin); } private native void setRestitutionOrthoLin(long objectId, float value); + /** + * Read the joint's damping for off-axis translation. + * + * @return the viscous damping ratio (0→no damping, 1→critically + * damped) + */ public float getDampingOrthoLin() { return getDampingOrthoLin(objectId); } private native float getDampingOrthoLin(long objectId); + /** + * Alter the joint's damping for off-axis translation. + * + * @param dampingOrthoLin the desired viscous damping ratio (0→no + * damping, 1→critically damped, default=1) + */ public void setDampingOrthoLin(float dampingOrthoLin) { setDampingOrthoLin(objectId, dampingOrthoLin); } private native void setDampingOrthoLin(long objectId, float value); + /** + * Read the joint's softness for off-axis rotation. + * + * @return the softness + */ public float getSoftnessOrthoAng() { return getSoftnessOrthoAng(objectId); } private native float getSoftnessOrthoAng(long objectId); + /** + * Alter the joint's softness for off-axis rotation. + * + * @param softnessOrthoAng the desired softness (default=1) + */ public void setSoftnessOrthoAng(float softnessOrthoAng) { setSoftnessOrthoAng(objectId, softnessOrthoAng); } private native void setSoftnessOrthoAng(long objectId, float value); + /** + * Read the joint's restitution for off-axis rotation. + * + * @return the restitution (bounce) factor + */ public float getRestitutionOrthoAng() { return getRestitutionOrthoAng(objectId); } private native float getRestitutionOrthoAng(long objectId); + /** + * Alter the joint's restitution for off-axis rotation. + * + * @param restitutionOrthoAng the desired restitution (bounce) factor + * (default=0.7) + */ public void setRestitutionOrthoAng(float restitutionOrthoAng) { setRestitutionOrthoAng(objectId, restitutionOrthoAng); } private native void setRestitutionOrthoAng(long objectId, float value); + /** + * Read the joint's damping for off-axis rotation. + * + * @return the viscous damping ratio (0→no damping, 1→critically + * damped) + */ public float getDampingOrthoAng() { return getDampingOrthoAng(objectId); } private native float getDampingOrthoAng(long objectId); + /** + * Alter the joint's damping for off-axis rotation. + * + * @param dampingOrthoAng the desired viscous damping ratio (0→no + * damping, 1→critically damped, default=1) + */ public void setDampingOrthoAng(float dampingOrthoAng) { setDampingOrthoAng(objectId, dampingOrthoAng); } private native void setDampingOrthoAng(long objectId, float value); + /** + * Test whether the translation motor is powered. + * + * @return true if powered, otherwise false + */ public boolean isPoweredLinMotor() { return isPoweredLinMotor(objectId); } private native boolean isPoweredLinMotor(long objectId); + /** + * Alter whether the translation motor is powered. + * + * @param poweredLinMotor true to power the motor, false to de-power it + * (default=false) + */ public void setPoweredLinMotor(boolean poweredLinMotor) { setPoweredLinMotor(objectId, poweredLinMotor); } private native void setPoweredLinMotor(long objectId, boolean value); + /** + * Read the velocity target of the translation motor. + * + * @return the velocity target + */ public float getTargetLinMotorVelocity() { return getTargetLinMotorVelocity(objectId); } private native float getTargetLinMotorVelocity(long objectId); + /** + * Alter the velocity target of the translation motor. + * + * @param targetLinMotorVelocity the desired velocity target (default=0) + */ public void setTargetLinMotorVelocity(float targetLinMotorVelocity) { setTargetLinMotorVelocity(objectId, targetLinMotorVelocity); } private native void setTargetLinMotorVelocity(long objectId, float value); + /** + * Read the maximum force of the translation motor. + * + * @return the maximum force + */ public float getMaxLinMotorForce() { return getMaxLinMotorForce(objectId); } private native float getMaxLinMotorForce(long objectId); + /** + * Alter the maximum force of the translation motor. + * + * @param maxLinMotorForce the desired maximum force (default=0) + */ public void setMaxLinMotorForce(float maxLinMotorForce) { setMaxLinMotorForce(objectId, maxLinMotorForce); } private native void setMaxLinMotorForce(long objectId, float value); + /** + * Test whether the rotation motor is powered. + * + * @return true if powered, otherwise false + */ public boolean isPoweredAngMotor() { return isPoweredAngMotor(objectId); } private native boolean isPoweredAngMotor(long objectId); + /** + * Alter whether the rotation motor is powered. + * + * @param poweredAngMotor true to power the motor, false to de-power it + * (default=false) + */ public void setPoweredAngMotor(boolean poweredAngMotor) { setPoweredAngMotor(objectId, poweredAngMotor); } private native void setPoweredAngMotor(long objectId, boolean value); + /** + * Read the velocity target of the rotation motor. + * + * @return the velocity target (in radians per second) + */ public float getTargetAngMotorVelocity() { return getTargetAngMotorVelocity(objectId); } private native float getTargetAngMotorVelocity(long objectId); + /** + * Alter the velocity target of the rotation motor. + * + * @param targetAngMotorVelocity the desired velocity target (in radians per + * second, default=0) + */ public void setTargetAngMotorVelocity(float targetAngMotorVelocity) { setTargetAngMotorVelocity(objectId, targetAngMotorVelocity); } private native void setTargetAngMotorVelocity(long objectId, float value); + /** + * Read the maximum force of the rotation motor. + * + * @return the maximum force + */ public float getMaxAngMotorForce() { return getMaxAngMotorForce(objectId); } private native float getMaxAngMotorForce(long objectId); + /** + * Alter the maximum force of the rotation motor. + * + * @param maxAngMotorForce the desired maximum force (default=0) + */ public void setMaxAngMotorForce(float maxAngMotorForce) { setMaxAngMotorForce(objectId, maxAngMotorForce); } private native void setMaxAngMotorForce(long objectId, float value); + /** + * Serialize this joint, for example when saving to a J3O file. + * + * @param ex exporter (not null) + * @throws IOException from exporter + */ @Override public void write(JmeExporter ex) throws IOException { super.write(ex); @@ -455,6 +796,12 @@ public class SliderJoint extends PhysicsJoint { capsule.write(useLinearReferenceFrameA, "useLinearReferenceFrameA", false); } + /** + * De-serialize this joint, for example when loading from a J3O file. + * + * @param im importer (not null) + * @throws IOException from importer + */ @Override public void read(JmeImporter im) throws IOException { super.read(im); @@ -528,6 +875,9 @@ public class SliderJoint extends PhysicsJoint { setUpperLinLimit(upperLinLimit); } + /** + * Instantiate the configured constraint in Bullet. + */ protected void createJoint() { objectId = createJoint(nodeA.getObjectId(), nodeB.getObjectId(), pivotA, rotA, pivotB, rotB, useLinearReferenceFrameA); Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Created Joint {0}", Long.toHexString(objectId)); diff --git a/jme3-bullet/src/main/java/com/jme3/bullet/joints/motors/RotationalLimitMotor.java b/jme3-bullet/src/main/java/com/jme3/bullet/joints/motors/RotationalLimitMotor.java index 4b4b4aa95..88db32aba 100644 --- a/jme3-bullet/src/main/java/com/jme3/bullet/joints/motors/RotationalLimitMotor.java +++ b/jme3-bullet/src/main/java/com/jme3/bullet/joints/motors/RotationalLimitMotor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -32,135 +32,253 @@ package com.jme3.bullet.joints.motors; /** + * A motor based on Bullet's btRotationalLimitMotor. Motors are used to drive + * joints. * * @author normenhansen */ public class RotationalLimitMotor { + /** + * Unique identifier of the btRotationalLimitMotor. The constructor sets + * this to a non-zero value. + */ private long motorId = 0; + /** + * Instantiate a motor for the identified btRotationalLimitMotor. + * + * @param motor the unique identifier (not zero) + */ public RotationalLimitMotor(long motor) { this.motorId = motor; } + /** + * Read the id of the btRotationalLimitMotor. + * + * @return the identifier of the btRotationalLimitMotor (not zero) + */ public long getMotor() { return motorId; } + /** + * Read this motor's constraint lower limit. + * + * @return the limit value + */ public float getLoLimit() { return getLoLimit(motorId); } private native float getLoLimit(long motorId); + /** + * Alter this motor's constraint lower limit. + * + * @param loLimit the desired limit value + */ public void setLoLimit(float loLimit) { setLoLimit(motorId, loLimit); } private native void setLoLimit(long motorId, float loLimit); + /** + * Read this motor's constraint upper limit. + * + * @return the limit value + */ public float getHiLimit() { return getHiLimit(motorId); } private native float getHiLimit(long motorId); + /** + * Alter this motor's constraint upper limit. + * + * @param hiLimit the desired limit value + */ public void setHiLimit(float hiLimit) { setHiLimit(motorId, hiLimit); } private native void setHiLimit(long motorId, float hiLimit); + /** + * Read this motor's target velocity. + * + * @return the target velocity (in radians per second) + */ public float getTargetVelocity() { return getTargetVelocity(motorId); } private native float getTargetVelocity(long motorId); + /** + * Alter this motor's target velocity. + * + * @param targetVelocity the desired target velocity (in radians per second) + */ public void setTargetVelocity(float targetVelocity) { setTargetVelocity(motorId, targetVelocity); } private native void setTargetVelocity(long motorId, float targetVelocity); + /** + * Read this motor's maximum force. + * + * @return the maximum force + */ public float getMaxMotorForce() { return getMaxMotorForce(motorId); } private native float getMaxMotorForce(long motorId); + /** + * Alter this motor's maximum force. + * + * @param maxMotorForce the desired maximum force on the motor + */ public void setMaxMotorForce(float maxMotorForce) { setMaxMotorForce(motorId, maxMotorForce); } private native void setMaxMotorForce(long motorId, float maxMotorForce); + /** + * Read the limit's maximum force. + * + * @return the maximum force on the limit + */ public float getMaxLimitForce() { return getMaxLimitForce(motorId); } private native float getMaxLimitForce(long motorId); + /** + * Alter the limit's maximum force. + * + * @param maxLimitForce the desired maximum force on the limit + */ public void setMaxLimitForce(float maxLimitForce) { setMaxLimitForce(motorId, maxLimitForce); } private native void setMaxLimitForce(long motorId, float maxLimitForce); + /** + * Read this motor's damping. + * + * @return the viscous damping ratio (0→no damping, 1→critically + * damped) + */ public float getDamping() { return getDamping(motorId); } private native float getDamping(long motorId); + /** + * Alter this motor's damping. + * + * @param damping the desired viscous damping ratio (0→no damping, + * 1→critically damped, default=1) + */ public void setDamping(float damping) { setDamping(motorId, damping); } private native void setDamping(long motorId, float damping); + /** + * Read this motor's limit softness. + * + * @return the limit softness + */ public float getLimitSoftness() { return getLimitSoftness(motorId); } private native float getLimitSoftness(long motorId); + /** + * Alter this motor's limit softness. + * + * @param limitSoftness the desired limit softness + */ public void setLimitSoftness(float limitSoftness) { setLimitSoftness(motorId, limitSoftness); } private native void setLimitSoftness(long motorId, float limitSoftness); + /** + * Read this motor's error tolerance at limits. + * + * @return the error tolerance (>0) + */ public float getERP() { return getERP(motorId); } private native float getERP(long motorId); + /** + * Alter this motor's error tolerance at limits. + * + * @param ERP the desired error tolerance (>0) + */ public void setERP(float ERP) { setERP(motorId, ERP); } private native void setERP(long motorId, float ERP); + /** + * Read this motor's bounce. + * + * @return the bounce (restitution factor) + */ public float getBounce() { return getBounce(motorId); } private native float getBounce(long motorId); + /** + * Alter this motor's bounce. + * + * @param bounce the desired bounce (restitution factor) + */ public void setBounce(float bounce) { setBounce(motorId, bounce); } private native void setBounce(long motorId, float limitSoftness); + /** + * Test whether this motor is enabled. + * + * @return true if enabled, otherwise false + */ public boolean isEnableMotor() { return isEnableMotor(motorId); } private native boolean isEnableMotor(long motorId); + /** + * Enable or disable this motor. + * + * @param enableMotor true→enable, false→disable + */ public void setEnableMotor(boolean enableMotor) { setEnableMotor(motorId, enableMotor); } diff --git a/jme3-bullet/src/main/java/com/jme3/bullet/joints/motors/TranslationalLimitMotor.java b/jme3-bullet/src/main/java/com/jme3/bullet/joints/motors/TranslationalLimitMotor.java index 3b7690697..97993edd3 100644 --- a/jme3-bullet/src/main/java/com/jme3/bullet/joints/motors/TranslationalLimitMotor.java +++ b/jme3-bullet/src/main/java/com/jme3/bullet/joints/motors/TranslationalLimitMotor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -34,21 +34,42 @@ package com.jme3.bullet.joints.motors; import com.jme3.math.Vector3f; /** + * A motor based on Bullet's btTranslationalLimitMotor. Motors are used to drive + * joints. * * @author normenhansen */ public class TranslationalLimitMotor { + /** + * Unique identifier of the btTranslationalLimitMotor. The constructor sets + * this to a non-zero value. After that, the id never changes. + */ private long motorId = 0; + /** + * Instantiate a motor for the identified btTranslationalLimitMotor. + * + * @param motor the unique identifier (not zero) + */ public TranslationalLimitMotor(long motor) { this.motorId = motor; } + /** + * Read the id of the btTranslationalLimitMotor. + * + * @return the unique identifier (not zero) + */ public long getMotor() { return motorId; } + /** + * Copy this motor's constraint lower limits. + * + * @return a new vector (not null) + */ public Vector3f getLowerLimit() { Vector3f vec = new Vector3f(); getLowerLimit(motorId, vec); @@ -57,12 +78,22 @@ public class TranslationalLimitMotor { private native void getLowerLimit(long motorId, Vector3f vector); + /** + * Alter the constraint lower limits. + * + * @param lowerLimit (unaffected, not null) + */ public void setLowerLimit(Vector3f lowerLimit) { setLowerLimit(motorId, lowerLimit); } private native void setLowerLimit(long motorId, Vector3f vector); + /** + * Copy this motor's constraint upper limits. + * + * @return a new vector (not null) + */ public Vector3f getUpperLimit() { Vector3f vec = new Vector3f(); getUpperLimit(motorId, vec); @@ -71,12 +102,22 @@ public class TranslationalLimitMotor { private native void getUpperLimit(long motorId, Vector3f vector); + /** + * Alter the constraint upper limits. + * + * @param upperLimit (unaffected, not null) + */ public void setUpperLimit(Vector3f upperLimit) { setUpperLimit(motorId, upperLimit); } private native void setUpperLimit(long motorId, Vector3f vector); + /** + * Copy the accumulated impulse. + * + * @return a new vector (not null) + */ public Vector3f getAccumulatedImpulse() { Vector3f vec = new Vector3f(); getAccumulatedImpulse(motorId, vec); @@ -85,42 +126,79 @@ public class TranslationalLimitMotor { private native void getAccumulatedImpulse(long motorId, Vector3f vector); + /** + * Alter the accumulated impulse. + * + * @param accumulatedImpulse the desired vector (not null, unaffected) + */ public void setAccumulatedImpulse(Vector3f accumulatedImpulse) { setAccumulatedImpulse(motorId, accumulatedImpulse); } private native void setAccumulatedImpulse(long motorId, Vector3f vector); + /** + * Read this motor's limit softness. + * + * @return the softness + */ public float getLimitSoftness() { return getLimitSoftness(motorId); } private native float getLimitSoftness(long motorId); + /** + * Alter the limit softness. + * + * @param limitSoftness the desired limit softness (default=0.5) + */ public void setLimitSoftness(float limitSoftness) { setLimitSoftness(motorId, limitSoftness); } private native void setLimitSoftness(long motorId, float limitSoftness); + /** + * Read this motor's damping. + * + * @return the viscous damping ratio (0→no damping, 1→critically + * damped) + */ public float getDamping() { return getDamping(motorId); } private native float getDamping(long motorId); + /** + * Alter this motor's damping. + * + * @param damping the desired viscous damping ratio (0→no damping, + * 1→critically damped, default=1) + */ public void setDamping(float damping) { setDamping(motorId, damping); } private native void setDamping(long motorId, float damping); + /** + * Read this motor's restitution. + * + * @return the restitution (bounce) factor + */ public float getRestitution() { return getRestitution(motorId); } private native float getRestitution(long motorId); + /** + * Alter this motor's restitution. + * + * @param restitution the desired restitution (bounce) factor + */ public void setRestitution(float restitution) { setRestitution(motorId, restitution); } diff --git a/jme3-bullet/src/main/java/com/jme3/bullet/objects/PhysicsCharacter.java b/jme3-bullet/src/main/java/com/jme3/bullet/objects/PhysicsCharacter.java index bf55a2909..756c0a8d9 100644 --- a/jme3-bullet/src/main/java/com/jme3/bullet/objects/PhysicsCharacter.java +++ b/jme3-bullet/src/main/java/com/jme3/bullet/objects/PhysicsCharacter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -31,6 +31,7 @@ */ package com.jme3.bullet.objects; +import com.jme3.bullet.collision.CollisionFlag; import com.jme3.bullet.collision.PhysicsCollisionObject; import com.jme3.bullet.collision.shapes.CollisionShape; import com.jme3.export.InputCapsule; @@ -44,11 +45,18 @@ import java.util.logging.Level; import java.util.logging.Logger; /** - * Basic Bullet Character + * A collision object for simplified character simulation, based on Bullet's + * btKinematicCharacterController. + * * @author normenhansen */ public class PhysicsCharacter extends PhysicsCollisionObject { - + /** + * Unique identifier of btKinematicCharacterController (as opposed to its + * collision object, which is a ghost). Constructors are responsible for + * setting this to a non-zero value. The id might change if the character + * gets rebuilt. + */ protected long characterId = 0; protected float stepHeight; protected Vector3f walkDirection = new Vector3f(); @@ -59,12 +67,19 @@ public class PhysicsCharacter extends PhysicsCollisionObject { //TEMP VARIABLES protected final Quaternion tmp_inverseWorldRotation = new Quaternion(); + /** + * No-argument constructor needed by SavableClassUtil. Do not invoke + * directly! + */ public PhysicsCharacter() { } /** - * @param shape The CollisionShape (no Mesh or CompoundCollisionShapes) - * @param stepHeight The quantization size for vertical movement + * Instantiate a character with the specified collision shape and step + * height. + * + * @param shape the desired shape (not null, alias created) + * @param stepHeight the quantization size for vertical movement */ public PhysicsCharacter(CollisionShape shape, float stepHeight) { this.collisionShape = shape; @@ -75,6 +90,9 @@ public class PhysicsCharacter extends PhysicsCollisionObject { buildObject(); } + /** + * Create the configured character in Bullet. + */ protected void buildObject() { if (objectId == 0) { objectId = createGhostObject(); @@ -98,8 +116,9 @@ public class PhysicsCharacter extends PhysicsCollisionObject { private native long createCharacterObject(long objectId, long shapeId, float stepHeight); /** - * Sets the location of this physics character - * @param location + * Directly alter the location of this character's center of mass. + * + * @param location the desired physics location (not null, unaffected) */ public void warp(Vector3f location) { warp(characterId, location); @@ -108,11 +127,11 @@ public class PhysicsCharacter extends PhysicsCollisionObject { private native void warp(long characterId, Vector3f location); /** - * Set the walk direction, works continuously. - * This should probably be called setPositionIncrementPerSimulatorStep. - * This is neither a direction nor a velocity, but the amount to - * increment the position each physics tick. So vector length = accuracy*speed in m/s - * @param vec the walk direction to set + * Alter the walk offset. The offset will continue to be applied until + * altered again. + * + * @param vec the desired position increment for each physics tick (not + * null, unaffected) */ public void setWalkDirection(Vector3f vec) { walkDirection.set(vec); @@ -122,7 +141,9 @@ public class PhysicsCharacter extends PhysicsCollisionObject { private native void setWalkDirection(long characterId, Vector3f vec); /** - * @return the currently set walkDirection + * Access the walk offset. + * + * @return the pre-existing instance */ public Vector3f getWalkDirection() { return walkDirection; @@ -130,6 +151,7 @@ public class PhysicsCharacter extends PhysicsCollisionObject { /** * @deprecated Deprecated in bullet 2.86.1 use setUp(Vector3f) instead + * @param axis which axis: 0→X, 1→Y, 2→Z */ @Deprecated public void setUpAxis(int axis) { @@ -147,6 +169,11 @@ public class PhysicsCharacter extends PhysicsCollisionObject { } } + /** + * Alter this character's "up" direction. + * + * @param axis the desired direction (not null, not zero, unaffected) + */ public void setUp(Vector3f axis) { setUp(characterId, axis); } @@ -154,6 +181,11 @@ public class PhysicsCharacter extends PhysicsCollisionObject { private native void setUp(long characterId, Vector3f axis); + /** + * Alter this character's angular velocity. + * + * @param v the desired angular velocity vector (not null, unaffected) + */ public void setAngularVelocity(Vector3f v){ setAngularVelocity(characterId,v); @@ -161,7 +193,13 @@ public class PhysicsCharacter extends PhysicsCollisionObject { private native void setAngularVelocity(long characterId, Vector3f v); - + /** + * Copy this character's angular velocity. + * + * @param out storage for the result (modified if not null) + * @return the velocity vector (either the provided storage or a new vector, + * not null) + */ public Vector3f getAngularVelocity(Vector3f out){ if(out==null)out=new Vector3f(); getAngularVelocity(characterId,out); @@ -171,13 +209,23 @@ public class PhysicsCharacter extends PhysicsCollisionObject { private native void getAngularVelocity(long characterId, Vector3f out); + /** + * Alter the linear velocity of this character's center of mass. + * + * @param v the desired velocity vector (not null) + */ public void setLinearVelocity(Vector3f v){ setLinearVelocity(characterId,v); } private native void setLinearVelocity(long characterId, Vector3f v); - + /** + * Copy the linear velocity of this character's center of mass. + * + * @param out storage for the result (modified if not null) + * @return a vector (either the provided storage or a new vector, not null) + */ public Vector3f getLinearVelocity(Vector3f out){ if(out==null)out=new Vector3f(); getLinearVelocity(characterId,out); @@ -187,10 +235,20 @@ public class PhysicsCharacter extends PhysicsCollisionObject { private native void getLinearVelocity(long characterId, Vector3f out); + /** + * Read the index of the "up" axis. + * + * @return which axis: 0→X, 1→Y, 2→Z + */ public int getUpAxis() { return upAxis; } + /** + * Alter this character's fall speed. + * + * @param fallSpeed the desired speed (default=55) + */ public void setFallSpeed(float fallSpeed) { this.fallSpeed = fallSpeed; setFallSpeed(characterId, fallSpeed); @@ -198,10 +256,20 @@ public class PhysicsCharacter extends PhysicsCollisionObject { private native void setFallSpeed(long characterId, float fallSpeed); + /** + * Read this character's fall speed. + * + * @return speed + */ public float getFallSpeed() { return fallSpeed; } + /** + * Alter this character's jump speed. + * + * @param jumpSpeed the desired speed (default=10) + */ public void setJumpSpeed(float jumpSpeed) { this.jumpSpeed = jumpSpeed; setJumpSpeed(characterId, jumpSpeed); @@ -209,18 +277,31 @@ public class PhysicsCharacter extends PhysicsCollisionObject { private native void setJumpSpeed(long characterId, float jumpSpeed); + /** + * Read this character's jump speed. + * + * @return speed + */ public float getJumpSpeed() { return jumpSpeed; } /** - * @deprecated Deprecated in bullet 2.86.1. Use setGravity(Vector3f) instead. + * @deprecated Deprecated in bullet 2.86.1. Use setGravity(Vector3f) + * instead. + * @param value the desired upward component of the acceleration (typically + * negative) */ @Deprecated public void setGravity(float value) { setGravity(new Vector3f(0,value,0)); } + /** + * Alter this character's gravitational acceleration. + * + * @param value the desired acceleration vector (not null, unaffected) + */ public void setGravity(Vector3f value) { setGravity(characterId, value); } @@ -228,13 +309,22 @@ public class PhysicsCharacter extends PhysicsCollisionObject { private native void setGravity(long characterId, Vector3f gravity); /** - * @deprecated Deprecated in bullet 2.86.1. Use getGravity(Vector3f) instead. + * @deprecated Deprecated in bullet 2.86.1. Use getGravity(Vector3f) + * instead. + * @return the upward component of the acceleration (typically negative) */ @Deprecated public float getGravity() { return getGravity(null).y; } + /** + * Copy this character's gravitational acceleration. + * + * @param out storage for the result (modified if not null) + * @return the acceleration vector (either the provided storage or a new + * vector, not null) + */ public Vector3f getGravity(Vector3f out) { if(out==null)out=new Vector3f(); getGravity(characterId,out); @@ -244,12 +334,24 @@ public class PhysicsCharacter extends PhysicsCollisionObject { private native void getGravity(long characterId,Vector3f out); + /** + * Read this character's linear damping. + * + * @return the viscous damping ratio (0→no damping, 1→critically + * damped) + */ public float getLinearDamping(){ return getLinearDamping(characterId); } private native float getLinearDamping(long characterId); + /** + * Alter this character's linear damping. + * + * @param v the desired viscous damping ratio (0→no damping, + * 1→critically damped) + */ public void setLinearDamping(float v ){ setLinearDamping(characterId,v ); @@ -258,13 +360,24 @@ public class PhysicsCharacter extends PhysicsCollisionObject { private native void setLinearDamping(long characterId,float v); + /** + * Read this character's angular damping. + * + * @return the viscous damping ratio (0→no damping, 1→critically + * damped) + */ public float getAngularDamping(){ return getAngularDamping(characterId); } private native float getAngularDamping(long characterId); - + /** + * Alter this character's angular damping. + * + * @param v the desired viscous damping ratio (0→no damping, + * 1→critically damped, default=0) + */ public void setAngularDamping(float v ){ setAngularDamping(characterId,v ); } @@ -272,13 +385,22 @@ public class PhysicsCharacter extends PhysicsCollisionObject { private native void setAngularDamping(long characterId,float v); + /** + * Read this character's step height. + * + * @return the height (in physics-space units) + */ public float getStepHeight(){ return getStepHeight(characterId); } private native float getStepHeight(long characterId); - + /** + * Alter this character's step height. + * + * @param v the desired height (in physics-space units) + */ public void setStepHeight(float v ){ setStepHeight(characterId,v ); } @@ -286,13 +408,22 @@ public class PhysicsCharacter extends PhysicsCollisionObject { private native void setStepHeight(long characterId,float v); + /** + * Read this character's maximum penetration depth. + * + * @return the depth (in physics-space units) + */ public float getMaxPenetrationDepth(){ return getMaxPenetrationDepth(characterId); } private native float getMaxPenetrationDepth(long characterId); - + /** + * Alter this character's maximum penetration depth. + * + * @param v the desired depth (in physics-space units) + */ public void setMaxPenetrationDepth(float v ){ setMaxPenetrationDepth(characterId,v ); } @@ -303,18 +434,49 @@ public class PhysicsCharacter extends PhysicsCollisionObject { + /** + * Alter this character's maximum slope angle. + * + * @param slopeRadians the desired angle (in radians) + */ public void setMaxSlope(float slopeRadians) { setMaxSlope(characterId, slopeRadians); } private native void setMaxSlope(long characterId, float slopeRadians); + /** + * Read this character's maximum slope angle. + * + * @return the angle (in radians) + */ public float getMaxSlope() { return getMaxSlope(characterId); } private native float getMaxSlope(long characterId); + /** + * Enable/disable this character's contact response. + * + * @param responsive true to respond to contacts, false to ignore them + * (default=true) + */ + public void setContactResponse(boolean responsive) { + int flags = getCollisionFlags(objectId); + if (responsive) { + flags &= ~CollisionFlag.NO_CONTACT_RESPONSE; + } else { + flags |= CollisionFlag.NO_CONTACT_RESPONSE; + } + setCollisionFlags(objectId, flags); + } + + /** + * Test whether this character is on the ground. + * + * @return true if on the ground, otherwise false + */ public boolean onGround() { return onGround(characterId); } @@ -330,12 +492,24 @@ public class PhysicsCharacter extends PhysicsCollisionObject { } + /** + * Jump in the specified direction. + * + * @param dir desired jump direction (not null, unaffected) + */ public void jump(Vector3f dir) { jump(characterId,dir); } private native void jump(long characterId,Vector3f v); + /** + * Apply the specified CollisionShape to this character. Note that the + * character should not be in any physics space while changing shape; the + * character gets rebuilt on the physics side. + * + * @param collisionShape the shape to apply (not null, alias created) + */ @Override public void setCollisionShape(CollisionShape collisionShape) { // if (!(collisionShape.getObjectId() instanceof ConvexShape)) { @@ -350,15 +524,21 @@ public class PhysicsCharacter extends PhysicsCollisionObject { } /** - * Set the physics location (same as warp()) - * @param location the location of the actual physics object + * Directly alter this character's location. (Same as + * {@link #warp(com.jme3.math.Vector3f)}).) + * + * @param location the desired location (not null, unaffected) */ public void setPhysicsLocation(Vector3f location) { warp(location); } /** - * @return the physicsLocation + * Copy the location of this character's center of mass. + * + * @param trans storage for the result (modified if not null) + * @return the location vector (either the provided storage or a new vector, + * not null) */ public Vector3f getPhysicsLocation(Vector3f trans) { if (trans == null) { @@ -371,36 +551,72 @@ public class PhysicsCharacter extends PhysicsCollisionObject { private native void getPhysicsLocation(long objectId, Vector3f vec); /** - * @return the physicsLocation + * Copy the location of this character's center of mass. + * + * @return a new location vector (not null) */ public Vector3f getPhysicsLocation() { return getPhysicsLocation(null); } + /** + * Alter this character's continuous collision detection (CCD) swept sphere + * radius. + * + * @param radius (≥0, default=0) + */ public void setCcdSweptSphereRadius(float radius) { setCcdSweptSphereRadius(objectId, radius); } private native void setCcdSweptSphereRadius(long objectId, float radius); + /** + * Alter the amount of motion required to activate continuous collision + * detection (CCD). + *

+ * This addresses the issue of fast objects passing through other objects + * with no collision detected. + * + * @param threshold the desired threshold velocity (>0) or zero to + * disable CCD (default=0) + */ public void setCcdMotionThreshold(float threshold) { setCcdMotionThreshold(objectId, threshold); } private native void setCcdMotionThreshold(long objectId, float threshold); + /** + * Read the radius of the sphere used for continuous collision detection + * (CCD). + * + * @return radius (≥0) + */ public float getCcdSweptSphereRadius() { return getCcdSweptSphereRadius(objectId); } private native float getCcdSweptSphereRadius(long objectId); + /** + * Calculate this character's continuous collision detection (CCD) motion + * threshold. + * + * @return the threshold velocity (≥0) + */ public float getCcdMotionThreshold() { return getCcdMotionThreshold(objectId); } private native float getCcdMotionThreshold(long objectId); + /** + * Calculate the square of this character's continuous collision detection + * (CCD) motion threshold. + * + * @return the threshold velocity squared (≥0) + */ public float getCcdSquareMotionThreshold() { return getCcdSquareMotionThreshold(objectId); } @@ -409,14 +625,25 @@ public class PhysicsCharacter extends PhysicsCollisionObject { /** * used internally + * + * @return the Bullet id */ public long getControllerId() { return characterId; } + /** + * Has no effect. + */ public void destroy() { } + /** + * Serialize this character, for example when saving to a J3O file. + * + * @param e exporter (not null) + * @throws IOException from exporter + */ @Override public void write(JmeExporter e) throws IOException { super.write(e); @@ -432,6 +659,13 @@ public class PhysicsCharacter extends PhysicsCollisionObject { capsule.write(getPhysicsLocation(new Vector3f()), "physicsLocation", new Vector3f()); } + /** + * De-serialize this character from the specified importer, for example when + * loading from a J3O file. + * + * @param e importer (not null) + * @throws IOException from importer + */ @Override public void read(JmeImporter e) throws IOException { super.read(e); @@ -448,6 +682,12 @@ public class PhysicsCharacter extends PhysicsCollisionObject { setPhysicsLocation((Vector3f) capsule.readSavable("physicsLocation", new Vector3f())); } + /** + * Finalize this physics character just before it is destroyed. Should be + * invoked only by a subclass or by the garbage collector. + * + * @throws Throwable ignored by the garbage collector + */ @Override protected void finalize() throws Throwable { super.finalize(); diff --git a/jme3-bullet/src/main/java/com/jme3/bullet/objects/PhysicsGhostObject.java b/jme3-bullet/src/main/java/com/jme3/bullet/objects/PhysicsGhostObject.java index 052e280e4..acb3752e6 100644 --- a/jme3-bullet/src/main/java/com/jme3/bullet/objects/PhysicsGhostObject.java +++ b/jme3-bullet/src/main/java/com/jme3/bullet/objects/PhysicsGhostObject.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -48,11 +48,14 @@ import java.util.logging.Level; import java.util.logging.Logger; /** + * A collision object for intangibles, based on Bullet's + * btPairCachingGhostObject. This is useful for creating a character controller, + * collision sensors/triggers, explosions etc. + *

* From Bullet manual:
- * GhostObject can keep track of all objects that are overlapping. - * By default, this overlap is based on the AABB. - * This is useful for creating a character controller, - * collision sensors/triggers, explosions etc.
+ * btGhostObject is a special btCollisionObject, useful for fast localized + * collision queries. + * * @author normenhansen */ public class PhysicsGhostObject extends PhysicsCollisionObject { @@ -61,9 +64,18 @@ public class PhysicsGhostObject extends PhysicsCollisionObject { protected final Quaternion tmp_inverseWorldRotation = new Quaternion(); private List overlappingObjects = new LinkedList(); + /** + * No-argument constructor needed by SavableClassUtil. Do not invoke + * directly! + */ public PhysicsGhostObject() { } + /** + * Instantiate an object with the specified collision shape. + * + * @param shape the desired shape (not null, alias created) + */ public PhysicsGhostObject(CollisionShape shape) { collisionShape = shape; buildObject(); @@ -74,6 +86,9 @@ public class PhysicsGhostObject extends PhysicsCollisionObject { buildObject(); } + /** + * Create the configured object in Bullet. + */ protected void buildObject() { if (objectId == 0) { // gObject = new PairCachingGhostObject(); @@ -93,6 +108,13 @@ public class PhysicsGhostObject extends PhysicsCollisionObject { private native void setGhostFlags(long objectId); + /** + * Apply the specified CollisionShape to this object. Note that the object + * should not be in any physics space while changing shape; the object gets + * rebuilt on the physics side. + * + * @param collisionShape the shape to apply (not null, alias created) + */ @Override public void setCollisionShape(CollisionShape collisionShape) { super.setCollisionShape(collisionShape); @@ -104,8 +126,10 @@ public class PhysicsGhostObject extends PhysicsCollisionObject { } /** - * Sets the physics object location - * @param location the location of the actual physics object + * Directly alter the location of this object's center. + * + * @param location the desired location (in physics-space coordinates, not + * null, unaffected) */ public void setPhysicsLocation(Vector3f location) { setPhysicsLocation(objectId, location); @@ -114,8 +138,10 @@ public class PhysicsGhostObject extends PhysicsCollisionObject { private native void setPhysicsLocation(long objectId, Vector3f location); /** - * Sets the physics object rotation - * @param rotation the rotation of the actual physics object + * Directly alter this object's orientation. + * + * @param rotation the desired orientation (a rotation matrix in + * physics-space coordinates, not null, unaffected) */ public void setPhysicsRotation(Matrix3f rotation) { setPhysicsRotation(objectId, rotation); @@ -124,8 +150,10 @@ public class PhysicsGhostObject extends PhysicsCollisionObject { private native void setPhysicsRotation(long objectId, Matrix3f rotation); /** - * Sets the physics object rotation - * @param rotation the rotation of the actual physics object + * Directly alter this object's orientation. + * + * @param rotation the desired orientation (quaternion, not null, + * unaffected) */ public void setPhysicsRotation(Quaternion rotation) { setPhysicsRotation(objectId, rotation); @@ -134,7 +162,11 @@ public class PhysicsGhostObject extends PhysicsCollisionObject { private native void setPhysicsRotation(long objectId, Quaternion rotation); /** - * @return the physicsLocation + * Copy the location of this object's center. + * + * @param trans storage for the result (modified if not null) + * @return a location vector (in physics-space coordinates, either + * the provided storage or a new vector, not null) */ public Vector3f getPhysicsLocation(Vector3f trans) { if (trans == null) { @@ -147,7 +179,11 @@ public class PhysicsGhostObject extends PhysicsCollisionObject { private native void getPhysicsLocation(long objectId, Vector3f vector); /** - * @return the physicsLocation + * Copy this object's orientation to a quaternion. + * + * @param rot storage for the result (modified if not null) + * @return an orientation (in physics-space coordinates, either the provided + * storage or a new quaternion, not null) */ public Quaternion getPhysicsRotation(Quaternion rot) { if (rot == null) { @@ -160,7 +196,11 @@ public class PhysicsGhostObject extends PhysicsCollisionObject { private native void getPhysicsRotation(long objectId, Quaternion rot); /** - * @return the physicsLocation + * Copy this object's orientation to a matrix. + * + * @param rot storage for the result (modified if not null) + * @return an orientation (in physics-space coordinates, either the provided + * storage or a new matrix, not null) */ public Matrix3f getPhysicsRotationMatrix(Matrix3f rot) { if (rot == null) { @@ -173,7 +213,9 @@ public class PhysicsGhostObject extends PhysicsCollisionObject { private native void getPhysicsRotationMatrix(long objectId, Matrix3f rot); /** - * @return the physicsLocation + * Copy the location of this object's center. + * + * @return a new location vector (not null) */ public Vector3f getPhysicsLocation() { Vector3f vec = new Vector3f(); @@ -182,7 +224,9 @@ public class PhysicsGhostObject extends PhysicsCollisionObject { } /** - * @return the physicsLocation + * Copy this object's orientation to a quaternion. + * + * @return a new quaternion (not null) */ public Quaternion getPhysicsRotation() { Quaternion quat = new Quaternion(); @@ -190,6 +234,11 @@ public class PhysicsGhostObject extends PhysicsCollisionObject { return quat; } + /** + * Copy this object's orientation to a matrix. + * + * @return a new matrix (not null) + */ public Matrix3f getPhysicsRotationMatrix() { Matrix3f mtx = new Matrix3f(); getPhysicsRotationMatrix(objectId, mtx); @@ -203,16 +252,15 @@ public class PhysicsGhostObject extends PhysicsCollisionObject { // return gObject; // } /** - * destroys this PhysicsGhostNode and removes it from memory + * Has no effect. */ public void destroy() { } /** - * Another Object is overlapping with this GhostNode, - * if and if only there CollisionShapes overlaps. - * They could be both regular PhysicsRigidBodys or PhysicsGhostObjects. - * @return All CollisionObjects overlapping with this GhostNode. + * Access a list of overlapping objects. + * + * @return an internal list which may get reused (not null) */ public List getOverlappingObjects() { overlappingObjects.clear(); @@ -225,13 +273,19 @@ public class PhysicsGhostObject extends PhysicsCollisionObject { protected native void getOverlappingObjects(long objectId); + /** + * This method is invoked from native code. + * + * @param co the collision object to add + */ private void addOverlappingObject_native(PhysicsCollisionObject co) { overlappingObjects.add(co); } /** + * Count how many collision objects this object overlaps. * - * @return With how many other CollisionObjects this GhostNode is currently overlapping. + * @return count (≥0) */ public int getOverlappingCount() { return getOverlappingCount(objectId); @@ -240,44 +294,84 @@ public class PhysicsGhostObject extends PhysicsCollisionObject { private native int getOverlappingCount(long objectId); /** + * Access an overlapping collision object by its position in the list. * - * @param index The index of the overlapping Node to retrieve. - * @return The Overlapping CollisionObject at the given index. + * @param index which list position (≥0, <count) + * @return the pre-existing object */ public PhysicsCollisionObject getOverlapping(int index) { return overlappingObjects.get(index); } + /** + * Alter the continuous collision detection (CCD) swept sphere radius for + * this object. + * + * @param radius (≥0) + */ public void setCcdSweptSphereRadius(float radius) { setCcdSweptSphereRadius(objectId, radius); } private native void setCcdSweptSphereRadius(long objectId, float radius); + /** + * Alter the amount of motion required to trigger continuous collision + * detection (CCD). + *

+ * This addresses the issue of fast objects passing through other objects + * with no collision detected. + * + * @param threshold the desired threshold value (squared velocity, >0) or + * zero to disable CCD (default=0) + */ public void setCcdMotionThreshold(float threshold) { setCcdMotionThreshold(objectId, threshold); } private native void setCcdMotionThreshold(long objectId, float threshold); + /** + * Read the radius of the sphere used for continuous collision detection + * (CCD). + * + * @return radius (≥0) + */ public float getCcdSweptSphereRadius() { return getCcdSweptSphereRadius(objectId); } private native float getCcdSweptSphereRadius(long objectId); + /** + * Read the continuous collision detection (CCD) motion threshold for this + * object. + * + * @return threshold value (squared velocity, ≥0) + */ public float getCcdMotionThreshold() { return getCcdMotionThreshold(objectId); } private native float getCcdMotionThreshold(long objectId); + /** + * Read the CCD square motion threshold for this object. + * + * @return threshold value (≥0) + */ public float getCcdSquareMotionThreshold() { return getCcdSquareMotionThreshold(objectId); } private native float getCcdSquareMotionThreshold(long objectId); + /** + * Serialize this object, for example when saving to a J3O file. + * + * @param e exporter (not null) + * @throws IOException from exporter + */ @Override public void write(JmeExporter e) throws IOException { super.write(e); @@ -288,6 +382,13 @@ public class PhysicsGhostObject extends PhysicsCollisionObject { capsule.write(getCcdSweptSphereRadius(), "ccdSweptSphereRadius", 0); } + /** + * De-serialize this object from the specified importer, for example when + * loading from a J3O file. + * + * @param e importer (not null) + * @throws IOException from importer + */ @Override public void read(JmeImporter e) throws IOException { super.read(e); diff --git a/jme3-bullet/src/main/java/com/jme3/bullet/objects/PhysicsRigidBody.java b/jme3-bullet/src/main/java/com/jme3/bullet/objects/PhysicsRigidBody.java index 84c16f831..2cbbf3c42 100644 --- a/jme3-bullet/src/main/java/com/jme3/bullet/objects/PhysicsRigidBody.java +++ b/jme3-bullet/src/main/java/com/jme3/bullet/objects/PhysicsRigidBody.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -32,6 +32,7 @@ package com.jme3.bullet.objects; import com.jme3.bullet.PhysicsSpace; +import com.jme3.bullet.collision.CollisionFlag; import com.jme3.bullet.collision.PhysicsCollisionObject; import com.jme3.bullet.collision.shapes.CollisionShape; import com.jme3.bullet.collision.shapes.MeshCollisionShape; @@ -51,29 +52,55 @@ import java.util.logging.Level; import java.util.logging.Logger; /** - *

PhysicsRigidBody - Basic physics object

+ * A collision object for a rigid body, based on Bullet's btRigidBody. + * * @author normenhansen */ public class PhysicsRigidBody extends PhysicsCollisionObject { - + /** + * motion state + */ protected RigidBodyMotionState motionState = new RigidBodyMotionState(); + /** + * copy of mass (>0) of a dynamic body, or 0 for a static body + * (default=1) + */ protected float mass = 1.0f; + /** + * copy of kinematic flag: true→set kinematic mode (spatial controls + * body), false→dynamic/static mode (body controls spatial) + * (default=false) + */ protected boolean kinematic = false; - protected ArrayList joints = new ArrayList(); + /** + * joint list + */ + protected ArrayList joints = new ArrayList(4); + /** + * No-argument constructor needed by SavableClassUtil. Do not invoke + * directly! + */ public PhysicsRigidBody() { } /** - * Creates a new PhysicsRigidBody with the supplied collision shape - * @param child - * @param shape + * Instantiate a dynamic body with mass=1 and the specified collision shape. + * + * @param shape the desired shape (not null, alias created) */ public PhysicsRigidBody(CollisionShape shape) { collisionShape = shape; rebuildRigidBody(); } + /** + * Instantiate a body with the specified collision shape and mass. + * + * @param shape the desired shape (not null, alias created) + * @param mass if 0, a static body is created; otherwise a dynamic body is + * created (≥0) + */ public PhysicsRigidBody(CollisionShape shape, float mass) { collisionShape = shape; this.mass = mass; @@ -81,7 +108,7 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { } /** - * Builds/rebuilds the phyiscs body when parameters have changed + * Build/rebuild this body after parameters have changed. */ protected void rebuildRigidBody() { boolean removed = false; @@ -105,11 +132,17 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { } } + /** + * For use by subclasses. + */ protected void preRebuild() { } private native long createRigidBody(float mass, long motionStateId, long collisionShapeId); + /** + * For use by subclasses. + */ protected void postRebuild() { if (mass == 0.0f) { setStatic(objectId, true); @@ -120,12 +153,19 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { } /** - * @return the motionState + * Access this body's motion state. + * + * @return the pre-existing instance */ public RigidBodyMotionState getMotionState() { return motionState; } + /** + * Test whether this body is in a physics space. + * + * @return true→in a space, false→not in a space + */ public boolean isInWorld() { return isInWorld(objectId); } @@ -133,8 +173,9 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { private native boolean isInWorld(long objectId); /** - * Sets the physics object location - * @param location the location of the actual physics object + * Directly alter the location of this body's center of mass. + * + * @param location the desired location (not null, unaffected) */ public void setPhysicsLocation(Vector3f location) { setPhysicsLocation(objectId, location); @@ -143,8 +184,10 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { private native void setPhysicsLocation(long objectId, Vector3f location); /** - * Sets the physics object rotation - * @param rotation the rotation of the actual physics object + * Directly alter this body's orientation. + * + * @param rotation the desired orientation (rotation matrix, not null, + * unaffected) */ public void setPhysicsRotation(Matrix3f rotation) { setPhysicsRotation(objectId, rotation); @@ -153,8 +196,10 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { private native void setPhysicsRotation(long objectId, Matrix3f rotation); /** - * Sets the physics object rotation - * @param rotation the rotation of the actual physics object + * Directly alter this body's orientation. + * + * @param rotation the desired orientation (quaternion, in physics-space + * coordinates, not null, unaffected) */ public void setPhysicsRotation(Quaternion rotation) { setPhysicsRotation(objectId, rotation); @@ -163,7 +208,11 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { private native void setPhysicsRotation(long objectId, Quaternion rotation); /** - * @return the physicsLocation + * Copy the location of this body's center of mass. + * + * @param trans storage for the result (modified if not null) + * @return the location (in physics-space coordinates, either the provided + * storage or a new vector, not null) */ public Vector3f getPhysicsLocation(Vector3f trans) { if (trans == null) { @@ -176,7 +225,11 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { private native void getPhysicsLocation(long objectId, Vector3f vector); /** - * @return the physicsLocation + * Copy this body's orientation to a quaternion. + * + * @param rot storage for the result (modified if not null) + * @return the orientation (either the provided storage or a new quaternion, + * not null) */ public Quaternion getPhysicsRotation(Quaternion rot) { if (rot == null) { @@ -185,12 +238,23 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { getPhysicsRotation(objectId, rot); return rot; } - + + /** + * Alter the principal components of the local inertia tensor. + * + * @param gravity (not null, unaffected) + */ public void setInverseInertiaLocal(Vector3f gravity) { setInverseInertiaLocal(objectId, gravity); } private native void setInverseInertiaLocal(long objectId, Vector3f gravity); - + + /** + * Copy the principal components of the local inverse inertia tensor. + * + * @param trans storage for the result (modified if not null) + * @return a vector (either the provided storage or a new vector, not null) + */ public Vector3f getInverseInertiaLocal(Vector3f trans) { if (trans == null) { trans = new Vector3f(); @@ -204,7 +268,11 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { private native void getPhysicsRotation(long objectId, Quaternion rot); /** - * @return the physicsLocation + * Copy this body's orientation to a matrix. + * + * @param rot storage for the result (modified if not null) + * @return the orientation (in physics-space coordinates, either the + * provided storage or a new matrix, not null) */ public Matrix3f getPhysicsRotationMatrix(Matrix3f rot) { if (rot == null) { @@ -217,7 +285,9 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { private native void getPhysicsRotationMatrix(long objectId, Matrix3f rot); /** - * @return the physicsLocation + * Copy the location of this body's center of mass. + * + * @return a new location vector (not null) */ public Vector3f getPhysicsLocation() { Vector3f vec = new Vector3f(); @@ -226,7 +296,9 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { } /** - * @return the physicsLocation + * Copy this body's orientation to a quaternion. + * + * @return a new quaternion (not null) */ public Quaternion getPhysicsRotation() { Quaternion quat = new Quaternion(); @@ -234,6 +306,11 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { return quat; } + /** + * Copy this body's orientation to a matrix. + * + * @return a new matrix (not null) + */ public Matrix3f getPhysicsRotationMatrix() { Matrix3f mtx = new Matrix3f(); getPhysicsRotationMatrix(objectId, mtx); @@ -264,10 +341,14 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { // return Converter.convert(tempTrans.basis, rotation); // } /** - * Sets the node to kinematic mode. in this mode the node is not affected by physics - * but affects other physics objects. Iits kinetic force is calculated by the amount - * of movement it is exposed to and its weight. - * @param kinematic + * Put this body into kinematic mode or take it out of kinematic mode. + *

+ * In kinematic mode, the body is not influenced by physics but can affect + * other physics objects. Its kinetic force is calculated based on its + * movement and weight. + * + * @param kinematic true→set kinematic mode, false→set + * dynamic/static mode (default=false) */ public void setKinematic(boolean kinematic) { this.kinematic = kinematic; @@ -276,10 +357,41 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { private native void setKinematic(long objectId, boolean kinematic); + /** + * Test whether this body is in kinematic mode. + *

+ * In kinematic mode, the body is not influenced by physics but can affect + * other physics objects. Its kinetic force is calculated based on its + * movement and weight. + * + * @return true if in kinematic mode, otherwise false (dynamic/static mode) + */ public boolean isKinematic() { return kinematic; } + /** + * Enable/disable this body's contact response. + * + * @param responsive true to respond to contacts, false to ignore them + * (default=true) + */ + public void setContactResponse(boolean responsive) { + int flags = getCollisionFlags(objectId); + if (responsive) { + flags &= ~CollisionFlag.NO_CONTACT_RESPONSE; + } else { + flags |= CollisionFlag.NO_CONTACT_RESPONSE; + } + setCollisionFlags(objectId, flags); + } + + /** + * Alter the radius of the swept sphere used for continuous collision + * detection (CCD). + * + * @param radius the desired radius (≥0, default=0) + */ public void setCcdSweptSphereRadius(float radius) { setCcdSweptSphereRadius(objectId, radius); } @@ -287,9 +399,14 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { private native void setCcdSweptSphereRadius(long objectId, float radius); /** - * Sets the amount of motion that has to happen in one physics tick to trigger the continuous motion detection
- * This avoids the problem of fast objects moving through other objects, set to zero to disable (default) - * @param threshold + * Alter the amount of motion required to activate continuous collision + * detection (CCD). + *

+ * This addresses the issue of fast objects passing through other objects + * with no collision detected. + * + * @param threshold the desired threshold velocity (>0) or zero to + * disable CCD (default=0) */ public void setCcdMotionThreshold(float threshold) { setCcdMotionThreshold(objectId, threshold); @@ -297,31 +414,56 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { private native void setCcdMotionThreshold(long objectId, float threshold); + /** + * Read the radius of the swept sphere used for continuous collision + * detection (CCD). + * + * @return radius (≥0) + */ public float getCcdSweptSphereRadius() { return getCcdSweptSphereRadius(objectId); } private native float getCcdSweptSphereRadius(long objectId); + /** + * Calculate this body's continuous collision detection (CCD) motion + * threshold. + * + * @return the threshold velocity (≥0) + */ public float getCcdMotionThreshold() { return getCcdMotionThreshold(objectId); } private native float getCcdMotionThreshold(long objectId); + /** + * Calculate the square of this body's continuous collision detection (CCD) + * motion threshold. + * + * @return the threshold velocity squared (≥0) + */ public float getCcdSquareMotionThreshold() { return getCcdSquareMotionThreshold(objectId); } private native float getCcdSquareMotionThreshold(long objectId); + /** + * Read this body's mass. + * + * @return the mass (>0) or zero for a static body + */ public float getMass() { return mass; } /** - * Sets the mass of this PhysicsRigidBody, objects with mass=0 are static. - * @param mass + * Alter this body's mass. Bodies with mass=0 are static. For dynamic + * bodies, it is best to keep the mass around 1. + * + * @param mass the desired mass (>0) or 0 for a static body (default=1) */ public void setMass(float mass) { this.mass = mass; @@ -344,10 +486,23 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { private native long updateMassProps(long objectId, long collisionShapeId, float mass); + /** + * Copy this body's gravitational acceleration. + * + * @return a new acceleration vector (in physics-space coordinates, not + * null) + */ public Vector3f getGravity() { return getGravity(null); } + /** + * Copy this body's gravitational acceleration. + * + * @param gravity storage for the result (modified if not null) + * @return an acceleration vector (in physics-space coordinates, either the + * provided storage or a new vector, not null) + */ public Vector3f getGravity(Vector3f gravity) { if (gravity == null) { gravity = new Vector3f(); @@ -359,16 +514,23 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { private native void getGravity(long objectId, Vector3f gravity); /** - * Set the local gravity of this PhysicsRigidBody
- * Set this after adding the node to the PhysicsSpace, - * the PhysicsSpace assigns its current gravity to the physics node when its added. - * @param gravity the gravity vector to set + * Alter this body's gravitational acceleration. + *

+ * Invoke this after adding the body to a PhysicsSpace. Adding a body to a + * PhysicsSpace alters its gravity. + * + * @param gravity the desired acceleration vector (not null, unaffected) */ public void setGravity(Vector3f gravity) { setGravity(objectId, gravity); } private native void setGravity(long objectId, Vector3f gravity); + /** + * Read this body's friction. + * + * @return friction value + */ public float getFriction() { return getFriction(objectId); } @@ -376,8 +538,9 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { private native float getFriction(long objectId); /** - * Sets the friction of this physics object - * @param friction the friction of this physics object + * Alter this body's friction. + * + * @param friction the desired friction value (default=0.5) */ public void setFriction(float friction) { setFriction(objectId, friction); @@ -385,6 +548,12 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { private native void setFriction(long objectId, float friction); + /** + * Alter this body's damping. + * + * @param linearDamping the desired linear damping value (default=0) + * @param angularDamping the desired angular damping value (default=0) + */ public void setDamping(float linearDamping, float angularDamping) { setDamping(objectId, linearDamping, angularDamping); } @@ -400,27 +569,52 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { // // private native void setRestitution(long objectId, float factor); // + /** + * Alter this body's linear damping. + * + * @param linearDamping the desired linear damping value (default=0) + */ public void setLinearDamping(float linearDamping) { setDamping(objectId, linearDamping, getAngularDamping()); } - + + /** + * Alter this body's angular damping. + * + * @param angularDamping the desired angular damping value (default=0) + */ public void setAngularDamping(float angularDamping) { setAngularDamping(objectId, angularDamping); } private native void setAngularDamping(long objectId, float factor); + /** + * Read this body's linear damping. + * + * @return damping value + */ public float getLinearDamping() { return getLinearDamping(objectId); } private native float getLinearDamping(long objectId); + /** + * Read this body's angular damping. + * + * @return damping value + */ public float getAngularDamping() { return getAngularDamping(objectId); } private native float getAngularDamping(long objectId); + /** + * Read this body's restitution (bounciness). + * + * @return restitution value + */ public float getRestitution() { return getRestitution(objectId); } @@ -428,8 +622,10 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { private native float getRestitution(long objectId); /** - * The "bouncyness" of the PhysicsRigidBody, best performance if restitution=0 - * @param restitution + * Alter this body's restitution (bounciness). For best performance, set + * restitution=0. + * + * @param restitution the desired value (default=0) */ public void setRestitution(float restitution) { setRestitution(objectId, restitution); @@ -438,8 +634,9 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { private native void setRestitution(long objectId, float factor); /** - * Get the current angular velocity of this PhysicsRigidBody - * @return the current linear velocity + * Copy this body's angular velocity. + * + * @return a new velocity vector (in physics-space coordinates, not null) */ public Vector3f getAngularVelocity() { Vector3f vec = new Vector3f(); @@ -450,16 +647,19 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { private native void getAngularVelocity(long objectId, Vector3f vec); /** - * Get the current angular velocity of this PhysicsRigidBody - * @param vec the vector to store the velocity in + * Copy this body's angular velocity. + * + * @param vec storage for the result (in physics-space coordinates, not + * null, modified) */ public void getAngularVelocity(Vector3f vec) { getAngularVelocity(objectId, vec); } /** - * Sets the angular velocity of this PhysicsRigidBody - * @param vec the angular velocity of this PhysicsRigidBody + * Alter this body's angular velocity. + * + * @param vec the desired angular velocity vector (not null, unaffected) */ public void setAngularVelocity(Vector3f vec) { setAngularVelocity(objectId, vec); @@ -469,8 +669,9 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { private native void setAngularVelocity(long objectId, Vector3f vec); /** - * Get the current linear velocity of this PhysicsRigidBody - * @return the current linear velocity + * Copy the linear velocity of this body's center of mass. + * + * @return a new velocity vector (in physics-space coordinates, not null) */ public Vector3f getLinearVelocity() { Vector3f vec = new Vector3f(); @@ -481,16 +682,19 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { private native void getLinearVelocity(long objectId, Vector3f vec); /** - * Get the current linear velocity of this PhysicsRigidBody - * @param vec the vector to store the velocity in + * Copy the linear velocity of this body's center of mass. + * + * @param vec storage for the result (in physics-space coordinates, not + * null, modified) */ public void getLinearVelocity(Vector3f vec) { getLinearVelocity(objectId, vec); } /** - * Sets the linear velocity of this PhysicsRigidBody - * @param vec the linear velocity of this PhysicsRigidBody + * Alter the linear velocity of this body's center of mass. + * + * @param vec the desired velocity vector (not null) */ public void setLinearVelocity(Vector3f vec) { setLinearVelocity(objectId, vec); @@ -500,10 +704,13 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { private native void setLinearVelocity(long objectId, Vector3f vec); /** - * Apply a force to the PhysicsRigidBody, only applies force if the next physics update call - * updates the physics space.
- * To apply an impulse, use applyImpulse, use applyContinuousForce to apply continuous force. - * @param force the force + * Apply a force to the PhysicsRigidBody. Effective only if the next physics + * update steps the physics space. + *

+ * To apply an impulse, use applyImpulse, use applyContinuousForce to apply + * continuous force. + * + * @param force the force (not null, unaffected) * @param location the location of the force */ public void applyForce(Vector3f force, Vector3f location) { @@ -514,11 +721,13 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { private native void applyForce(long objectId, Vector3f force, Vector3f location); /** - * Apply a force to the PhysicsRigidBody, only applies force if the next physics update call - * updates the physics space.
- * To apply an impulse, use applyImpulse. - * - * @param force the force + * Apply a force to the PhysicsRigidBody. Effective only if the next physics + * update steps the physics space. + *

+ * To apply an impulse, use + * {@link #applyImpulse(com.jme3.math.Vector3f, com.jme3.math.Vector3f)}. + * + * @param force the force (not null, unaffected) */ public void applyCentralForce(Vector3f force) { applyCentralForce(objectId, force); @@ -528,11 +737,13 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { private native void applyCentralForce(long objectId, Vector3f force); /** - * Apply a force to the PhysicsRigidBody, only applies force if the next physics update call - * updates the physics space.
- * To apply an impulse, use applyImpulse. - * - * @param torque the torque + * Apply a force to the PhysicsRigidBody. Effective only if the next physics + * update steps the physics space. + *

+ * To apply an impulse, use + * {@link #applyImpulse(com.jme3.math.Vector3f, com.jme3.math.Vector3f)}. + * + * @param torque the torque (not null, unaffected) */ public void applyTorque(Vector3f torque) { applyTorque(objectId, torque); @@ -542,9 +753,10 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { private native void applyTorque(long objectId, Vector3f vec); /** - * Apply an impulse to the PhysicsRigidBody in the next physics update. - * @param impulse applied impulse - * @param rel_pos location relative to object + * Apply an impulse to the body the next physics update. + * + * @param impulse applied impulse (not null, unaffected) + * @param rel_pos location relative to object (not null, unaffected) */ public void applyImpulse(Vector3f impulse, Vector3f rel_pos) { applyImpulse(objectId, impulse, rel_pos); @@ -554,8 +766,9 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { private native void applyImpulse(long objectId, Vector3f impulse, Vector3f rel_pos); /** - * Apply a torque impulse to the PhysicsRigidBody in the next physics update. - * @param vec + * Apply a torque impulse to the body in the next physics update. + * + * @param vec the torque to apply */ public void applyTorqueImpulse(Vector3f vec) { applyTorqueImpulse(objectId, vec); @@ -565,8 +778,7 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { private native void applyTorqueImpulse(long objectId, Vector3f vec); /** - * Clear all forces from the PhysicsRigidBody - * + * Clear all forces acting on this body. */ public void clearForces() { clearForces(objectId); @@ -574,6 +786,14 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { private native void clearForces(long objectId); + /** + * Apply the specified CollisionShape to this body. + *

+ * Note that the body should not be in any physics space while changing + * shape; the body gets rebuilt on the physics side. + * + * @param collisionShape the shape to apply (not null, alias created) + */ public void setCollisionShape(CollisionShape collisionShape) { super.setCollisionShape(collisionShape); if (collisionShape instanceof MeshCollisionShape && mass != 0) { @@ -590,7 +810,7 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { private native void setCollisionShape(long objectId, long collisionShapeId); /** - * reactivates this PhysicsRigidBody when it has been deactivated because it was not moving + * Reactivates this body if it has been deactivated due to lack of motion. */ public void activate() { activate(objectId); @@ -598,6 +818,11 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { private native void activate(long objectId); + /** + * Test whether this body has been deactivated due to lack of motion. + * + * @return true if still active, false if deactivated + */ public boolean isActive() { return isActive(objectId); } @@ -605,10 +830,13 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { private native boolean isActive(long objectId); /** - * sets the sleeping thresholds, these define when the object gets deactivated - * to save ressources. Low values keep the object active when it barely moves - * @param linear the linear sleeping threshold - * @param angular the angular sleeping threshold + * Alter this body's sleeping thresholds. + *

+ * These thresholds determine when the body can be deactivated to save + * resources. Low values keep the body active when it barely moves. + * + * @param linear the desired linear sleeping threshold (≥0, default=0.8) + * @param angular the desired angular sleeping threshold (≥0, default=1) */ public void setSleepingThresholds(float linear, float angular) { setSleepingThresholds(objectId, linear, angular); @@ -616,36 +844,68 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { private native void setSleepingThresholds(long objectId, float linear, float angular); + /** + * Alter this body's linear sleeping threshold. + * + * @param linearSleepingThreshold the desired threshold (≥0, default=0.8) + */ public void setLinearSleepingThreshold(float linearSleepingThreshold) { setLinearSleepingThreshold(objectId, linearSleepingThreshold); } private native void setLinearSleepingThreshold(long objectId, float linearSleepingThreshold); + /** + * Alter this body's angular sleeping threshold. + * + * @param angularSleepingThreshold the desired threshold (≥0, default=1) + */ public void setAngularSleepingThreshold(float angularSleepingThreshold) { setAngularSleepingThreshold(objectId, angularSleepingThreshold); } private native void setAngularSleepingThreshold(long objectId, float angularSleepingThreshold); + /** + * Read this body's linear sleeping threshold. + * + * @return the linear sleeping threshold (≥0) + */ public float getLinearSleepingThreshold() { return getLinearSleepingThreshold(objectId); } private native float getLinearSleepingThreshold(long objectId); + /** + * Read this body's angular sleeping threshold. + * + * @return the angular sleeping threshold (≥0) + */ public float getAngularSleepingThreshold() { return getAngularSleepingThreshold(objectId); } private native float getAngularSleepingThreshold(long objectId); + /** + * Read this body's angular factor for the X axis. + * + * @return the angular factor + */ public float getAngularFactor() { return getAngularFactor(null).getX(); } + /** + * Copy this body's angular factors. + * + * @param store storage for the result (modified if not null) + * @return the angular factor for each axis (either the provided storage or + * new vector, not null) + */ public Vector3f getAngularFactor(Vector3f store) { - // doing like this prevent from breaking the API + // Done this way to prevent breaking the API. if (store == null) { store = new Vector3f(); } @@ -655,16 +915,33 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { private native void getAngularFactor(long objectId, Vector3f vec); + /** + * Alter this body's angular factor. + * + * @param factor the desired angular factor for all axes (not null, + * unaffected, default=1) + */ public void setAngularFactor(float factor) { setAngularFactor(objectId, new Vector3f(factor, factor, factor)); } + /** + * Alter this body's angular factors. + * + * @param factor the desired angular factor for each axis (not null, + * unaffected, default=(1,1,1)) + */ public void setAngularFactor(Vector3f factor) { setAngularFactor(objectId, factor); } private native void setAngularFactor(long objectId, Vector3f factor); + /** + * Copy this body's linear factors. + * + * @return the linear factor for each axis (not null) + */ public Vector3f getLinearFactor() { Vector3f vec = new Vector3f(); getLinearFactor(objectId, vec); @@ -673,6 +950,12 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { private native void getLinearFactor(long objectId, Vector3f vec); + /** + * Alter this body's linear factors. + * + * @param factor the desired linear factor for each axis (not null, + * unaffected, default=(1,1,1)) + */ public void setLinearFactor(Vector3f factor) { setLinearFactor(objectId, factor); } @@ -681,7 +964,9 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { /** - * do not use manually, joints are added automatically + * Do not invoke directly! Joints are added automatically when created. + * + * @param joint the joint to add (not null) */ public void addJoint(PhysicsJoint joint) { if (!joints.contains(joint)) { @@ -690,21 +975,32 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { } /** - * + * Do not invoke directly! Joints are removed automatically when destroyed. + * + * @param joint the joint to remove (not null) */ public void removeJoint(PhysicsJoint joint) { joints.remove(joint); } /** - * Returns a list of connected joints. This list is only filled when - * the PhysicsRigidBody is actually added to the physics space or loaded from disk. - * @return list of active joints connected to this PhysicsRigidBody + * Access the list of joints connected with this body. + *

+ * This list is only filled when the PhysicsRigidBody is added to a physics + * space. + * + * @return the pre-existing list (not null) */ public List getJoints() { return joints; } + /** + * Serialize this body, for example when saving to a J3O file. + * + * @param e exporter (not null) + * @throws IOException from exporter + */ @Override public void write(JmeExporter e) throws IOException { super.write(e); @@ -713,6 +1009,7 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { capsule.write(getMass(), "mass", 1.0f); capsule.write(getGravity(), "gravity", Vector3f.ZERO); + capsule.write(isContactResponse(), "contactResponse", true); capsule.write(getFriction(), "friction", 0.5f); capsule.write(getRestitution(), "restitution", 0); Vector3f angularFactor = getAngularFactor(null); @@ -734,10 +1031,18 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { capsule.write(getPhysicsLocation(new Vector3f()), "physicsLocation", new Vector3f()); capsule.write(getPhysicsRotationMatrix(new Matrix3f()), "physicsRotation", new Matrix3f()); + capsule.write(getLinearVelocity(), "linearVelocity", null); + capsule.write(getAngularVelocity(), "angularVelocity", null); capsule.writeSavableArrayList(joints, "joints", null); } + /** + * De-serialize this body, for example when loading from a J3O file. + * + * @param e importer (not null) + * @throws IOException from importer + */ @Override public void read(JmeImporter e) throws IOException { super.read(e); @@ -747,6 +1052,7 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { this.mass = mass; rebuildRigidBody(); setGravity((Vector3f) capsule.readSavable("gravity", Vector3f.ZERO.clone())); + setContactResponse(capsule.readBoolean("contactResponse", true)); setFriction(capsule.readFloat("friction", 0.5f)); setKinematic(capsule.readBoolean("kinematic", false)); @@ -765,6 +1071,8 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { setPhysicsLocation((Vector3f) capsule.readSavable("physicsLocation", new Vector3f())); setPhysicsRotation((Matrix3f) capsule.readSavable("physicsRotation", new Matrix3f())); + setLinearVelocity((Vector3f) capsule.readSavable("linearVelocity", new Vector3f())); + setAngularVelocity((Vector3f) capsule.readSavable("angularVelocity", new Vector3f())); joints = capsule.readSavableArrayList("joints", null); } diff --git a/jme3-bullet/src/main/java/com/jme3/bullet/objects/PhysicsVehicle.java b/jme3-bullet/src/main/java/com/jme3/bullet/objects/PhysicsVehicle.java index 63d90ef9f..541f68281 100644 --- a/jme3-bullet/src/main/java/com/jme3/bullet/objects/PhysicsVehicle.java +++ b/jme3-bullet/src/main/java/com/jme3/bullet/objects/PhysicsVehicle.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -46,34 +46,68 @@ import java.util.logging.Level; import java.util.logging.Logger; /** - *

PhysicsVehicleNode - Special PhysicsNode that implements vehicle functions

+ * A collision object for simplified vehicle simulation based on Bullet's + * btRaycastVehicle. *

- * From bullet manual:
- * For most vehicle simulations, it is recommended to use the simplified Bullet - * vehicle model as provided in btRaycastVehicle. Instead of simulation each wheel - * and chassis as separate rigid bodies, connected by constraints, it uses a simplified model. - * This simplified model has many benefits, and is widely used in commercial driving games.
- * The entire vehicle is represented as a single rigidbody, the chassis. - * The collision detection of the wheels is approximated by ray casts, - * and the tire friction is a basic anisotropic friction model. - *

+ * From Bullet manual:
+ * For arcade style vehicle simulations, it is recommended to use the simplified + * Bullet vehicle model as provided in btRaycastVehicle. Instead of simulation + * each wheel and chassis as separate rigid bodies, connected by constraints, it + * uses a simplified model. This simplified model has many benefits, and is + * widely used in commercial driving games. + *

+ * The entire vehicle is represented as a single rigidbody, the chassis. The + * collision detection of the wheels is approximated by ray casts, and the tire + * friction is a basic anisotropic friction model. + * * @author normenhansen */ public class PhysicsVehicle extends PhysicsRigidBody { + /** + * Unique identifier of the btRaycastVehicle. The constructor sets this to a + * non-zero value. + */ protected long vehicleId = 0; + /** + * Unique identifier of the ray caster. + */ protected long rayCasterId = 0; + /** + * tuning parameters applied when a wheel is created + */ protected VehicleTuning tuning = new VehicleTuning(); + /** + * list of wheels + */ protected ArrayList wheels = new ArrayList(); + /** + * physics space where this vehicle is added, or null if none + */ protected PhysicsSpace physicsSpace; + /** + * No-argument constructor needed by SavableClassUtil. Do not invoke + * directly! + */ public PhysicsVehicle() { } + /** + * Instantiate a vehicle with the specified collision shape and mass=1. + * + * @param shape the desired shape (not null, alias created) + */ public PhysicsVehicle(CollisionShape shape) { super(shape); } + /** + * Instantiate a vehicle with the specified collision shape and mass. + * + * @param shape the desired shape (not null, alias created) + * @param mass (>0) + */ public PhysicsVehicle(CollisionShape shape, float mass) { super(shape, mass); } @@ -111,7 +145,10 @@ public class PhysicsVehicle extends PhysicsRigidBody { } /** - * Used internally, creates the actual vehicle constraint when vehicle is added to phyicsspace + * Used internally, creates the actual vehicle constraint when vehicle is + * added to physics space. + * + * @param space which physics space */ public void createVehicle(PhysicsSpace space) { physicsSpace = space; @@ -145,14 +182,20 @@ public class PhysicsVehicle extends PhysicsRigidBody { private native int addWheel(long objectId, Vector3f location, Vector3f direction, Vector3f axle, float restLength, float radius, VehicleTuning tuning, boolean frontWheel); /** - * Add a wheel to this vehicle - * @param connectionPoint The starting point of the ray, where the suspension connects to the chassis (chassis space) - * @param direction the direction of the wheel (should be -Y / 0,-1,0 for a normal car) - * @param axle The axis of the wheel, pointing right in vehicle direction (should be -X / -1,0,0 for a normal car) - * @param suspensionRestLength The current length of the suspension (metres) - * @param wheelRadius the wheel radius - * @param isFrontWheel sets if this wheel is a front wheel (steering) - * @return the PhysicsVehicleWheel object to get/set infos on the wheel + * Add a wheel to this vehicle. + * + * @param connectionPoint the location where the suspension connects to the + * chassis (in chassis coordinates, not null, unaffected) + * @param direction the suspension direction (in chassis coordinates, not + * null, unaffected, typically down/0,-1,0) + * @param axle the axis direction (in chassis coordinates, not null, + * unaffected, typically -1,0,0) + * @param suspensionRestLength the rest length of the suspension (in + * physics-space units) + * @param wheelRadius the wheel radius (in physics-space units, >0) + * @param isFrontWheel true→front (steering) wheel, + * false→non-front wheel + * @return a new VehicleWheel for access (not null) */ public VehicleWheel addWheel(Vector3f connectionPoint, Vector3f direction, Vector3f axle, float suspensionRestLength, float wheelRadius, boolean isFrontWheel) { return addWheel(null, connectionPoint, direction, axle, suspensionRestLength, wheelRadius, isFrontWheel); @@ -160,14 +203,20 @@ public class PhysicsVehicle extends PhysicsRigidBody { /** * Add a wheel to this vehicle - * @param spat the wheel Geometry - * @param connectionPoint The starting point of the ray, where the suspension connects to the chassis (chassis space) - * @param direction the direction of the wheel (should be -Y / 0,-1,0 for a normal car) - * @param axle The axis of the wheel, pointing right in vehicle direction (should be -X / -1,0,0 for a normal car) - * @param suspensionRestLength The current length of the suspension (metres) - * @param wheelRadius the wheel radius - * @param isFrontWheel sets if this wheel is a front wheel (steering) - * @return the PhysicsVehicleWheel object to get/set infos on the wheel + * + * @param spat the associated spatial, or null if none + * @param connectionPoint the location where the suspension connects to the + * chassis (in chassis coordinates, not null, unaffected) + * @param direction the suspension direction (in chassis coordinates, not + * null, unaffected, typically down/0,-1,0) + * @param axle the axis direction (in chassis coordinates, not null, + * unaffected, typically -1,0,0) + * @param suspensionRestLength the rest length of the suspension (in + * physics-space units) + * @param wheelRadius the wheel radius (in physics-space units, >0) + * @param isFrontWheel true→front (steering) wheel, + * false→non-front wheel + * @return a new VehicleWheel for access (not null) */ public VehicleWheel addWheel(Spatial spat, Vector3f connectionPoint, Vector3f direction, Vector3f axle, float suspensionRestLength, float wheelRadius, boolean isFrontWheel) { VehicleWheel wheel = null; @@ -190,8 +239,9 @@ public class PhysicsVehicle extends PhysicsRigidBody { } /** - * This rebuilds the vehicle as there is no way in bullet to remove a wheel. - * @param wheel + * Remove a wheel. + * + * @param wheel the index of the wheel to remove (≥0) */ public void removeWheel(int wheel) { wheels.remove(wheel); @@ -200,195 +250,276 @@ public class PhysicsVehicle extends PhysicsRigidBody { } /** - * You can get access to the single wheels via this method. - * @param wheel the wheel index - * @return the WheelInfo of the selected wheel + * Access the indexed wheel of this vehicle. + * + * @param wheel the index of the wheel to access (≥0, <count) + * @return the pre-existing instance */ public VehicleWheel getWheel(int wheel) { return wheels.get(wheel); } + /** + * Read the number of wheels on this vehicle. + * + * @return count (≥0) + */ public int getNumWheels() { return wheels.size(); } /** - * @return the frictionSlip + * Read the initial friction for new wheels. + * + * @return the coefficient of friction between tyre and ground + * (0.8→realistic car, 10000→kart racer) */ public float getFrictionSlip() { return tuning.frictionSlip; } /** - * Use before adding wheels, this is the default used when adding wheels. - * After adding the wheel, use direct wheel access.
- * The coefficient of friction between the tyre and the ground. - * Should be about 0.8 for realistic cars, but can increased for better handling. - * Set large (10000.0) for kart racers - * @param frictionSlip the frictionSlip to set + * Alter the initial friction for new wheels. Effective only before adding + * wheels. After adding a wheel, use {@link #setFrictionSlip(int, float)}. + *

+ * For better handling, increase the friction. + * + * @param frictionSlip the desired coefficient of friction between tyre and + * ground (0.8→realistic car, 10000→kart racer, default=10.5) */ public void setFrictionSlip(float frictionSlip) { tuning.frictionSlip = frictionSlip; } /** - * The coefficient of friction between the tyre and the ground. - * Should be about 0.8 for realistic cars, but can increased for better handling. - * Set large (10000.0) for kart racers - * @param wheel - * @param frictionSlip + * Alter the friction of the indexed wheel. + *

+ * For better handling, increase the friction. + * + * @param wheel the index of the wheel to modify (≥0) + * @param frictionSlip the desired coefficient of friction between tyre and + * ground (0.8→realistic car, 10000→kart racer) */ public void setFrictionSlip(int wheel, float frictionSlip) { wheels.get(wheel).setFrictionSlip(frictionSlip); } /** - * Reduces the rolling torque applied from the wheels that cause the vehicle to roll over. - * This is a bit of a hack, but it's quite effective. 0.0 = no roll, 1.0 = physical behaviour. - * If m_frictionSlip is too high, you'll need to reduce this to stop the vehicle rolling over. - * You should also try lowering the vehicle's centre of mass + * Alter the roll influence of the indexed wheel. + *

+ * The roll-influence factor reduces (or magnifies) any torque contributed + * by the wheel that would tend to cause the vehicle to roll over. This is a + * bit of a hack, but it's quite effective. + *

+ * If the friction between the tyres and the ground is too high, you may + * reduce this factor to prevent the vehicle from rolling over. You should + * also try lowering the vehicle's center of mass. + * + * @param wheel the index of the wheel to modify (≥0) + * @param rollInfluence the desired roll-influence factor (0→no roll + * torque, 1→realistic behavior, default=1) */ public void setRollInfluence(int wheel, float rollInfluence) { wheels.get(wheel).setRollInfluence(rollInfluence); } /** - * @return the maxSuspensionTravelCm + * Read the initial maximum suspension travel distance for new wheels. + * + * @return the maximum distance the suspension can be compressed (in + * centimeters) */ public float getMaxSuspensionTravelCm() { return tuning.maxSuspensionTravelCm; } /** - * Use before adding wheels, this is the default used when adding wheels. - * After adding the wheel, use direct wheel access.
- * The maximum distance the suspension can be compressed (centimetres) - * @param maxSuspensionTravelCm the maxSuspensionTravelCm to set + * Alter the initial maximum suspension travel distance for new wheels. + * Effective only before adding wheels. After adding a wheel, use + * {@link #setMaxSuspensionTravelCm(int, float)}. + * + * @param maxSuspensionTravelCm the desired maximum distance the suspension + * can be compressed (in centimeters, default=500) */ public void setMaxSuspensionTravelCm(float maxSuspensionTravelCm) { tuning.maxSuspensionTravelCm = maxSuspensionTravelCm; } /** - * The maximum distance the suspension can be compressed (centimetres) - * @param wheel - * @param maxSuspensionTravelCm + * Alter the maximum suspension travel distance for the indexed wheel. + * + * @param wheel the index of the wheel to modify (≥0) + * @param maxSuspensionTravelCm the desired maximum distance the suspension + * can be compressed (in centimeters) */ public void setMaxSuspensionTravelCm(int wheel, float maxSuspensionTravelCm) { wheels.get(wheel).setMaxSuspensionTravelCm(maxSuspensionTravelCm); } + /** + * Read the initial maximum suspension force for new wheels. + * + * @return the maximum force per wheel + */ public float getMaxSuspensionForce() { return tuning.maxSuspensionForce; } /** - * This vaue caps the maximum suspension force, raise this above the default 6000 if your suspension cannot - * handle the weight of your vehcile. - * @param maxSuspensionForce + * Alter the initial maximum suspension force for new wheels. Effective only + * before adding wheels. After adding a wheel, use + * {@link #setMaxSuspensionForce(int, float)}. + *

+ * If the suspension cannot handle the vehicle's weight, increase this + * limit. + * + * @param maxSuspensionForce the desired maximum force per wheel + * (default=6000) */ public void setMaxSuspensionForce(float maxSuspensionForce) { tuning.maxSuspensionForce = maxSuspensionForce; } /** - * This vaue caps the maximum suspension force, raise this above the default 6000 if your suspension cannot - * handle the weight of your vehcile. - * @param wheel - * @param maxSuspensionForce + * Alter the maximum suspension force for the specified wheel. + *

+ * If the suspension cannot handle the vehicle's weight, increase this + * limit. + * + * @param wheel the index of the wheel to modify (≥0) + * @param maxSuspensionForce the desired maximum force per wheel + * (default=6000) */ public void setMaxSuspensionForce(int wheel, float maxSuspensionForce) { wheels.get(wheel).setMaxSuspensionForce(maxSuspensionForce); } /** - * @return the suspensionCompression + * Read the initial damping (when the suspension is compressed) for new + * wheels. + * + * @return the damping coefficient */ public float getSuspensionCompression() { return tuning.suspensionCompression; } /** - * Use before adding wheels, this is the default used when adding wheels. - * After adding the wheel, use direct wheel access.
- * The damping coefficient for when the suspension is compressed. - * Set to k * 2.0 * FastMath.sqrt(m_suspensionStiffness) so k is proportional to critical damping.
- * k = 0.0 undamped & bouncy, k = 1.0 critical damping
- * 0.1 to 0.3 are good values - * @param suspensionCompression the suspensionCompression to set + * Alter the initial damping (when the suspension is compressed) for new + * wheels. Effective only before adding wheels. After adding a wheel, use + * {@link #setSuspensionCompression(int, float)}. + *

+ * Set to k * 2 * FastMath.sqrt(m_suspensionStiffness) where k is the + * damping ratio: + *

+ * k = 0.0 undamped and bouncy, k = 1.0 critical damping, k between 0.1 and + * 0.3 are good values + * + * @param suspensionCompression the desired damping coefficient + * (default=0.83) */ public void setSuspensionCompression(float suspensionCompression) { tuning.suspensionCompression = suspensionCompression; } /** - * The damping coefficient for when the suspension is compressed. - * Set to k * 2.0 * FastMath.sqrt(m_suspensionStiffness) so k is proportional to critical damping.
- * k = 0.0 undamped & bouncy, k = 1.0 critical damping
- * 0.1 to 0.3 are good values - * @param wheel - * @param suspensionCompression + * Alter the damping (when the suspension is compressed) for the indexed + * wheel. + *

+ * Set to k * 2 * FastMath.sqrt(m_suspensionStiffness) where k is the + * damping ratio: + *

+ * k = 0.0 undamped and bouncy, k = 1.0 critical damping, k between 0.1 and + * 0.3 are good values + * + * @param wheel the index of the wheel to modify (≥0) + * @param suspensionCompression the desired damping coefficient */ public void setSuspensionCompression(int wheel, float suspensionCompression) { wheels.get(wheel).setWheelsDampingCompression(suspensionCompression); } /** - * @return the suspensionDamping + * Read the initial damping (when the suspension is expanded) for new + * wheels. + * + * @return the damping coefficient */ public float getSuspensionDamping() { return tuning.suspensionDamping; } /** - * Use before adding wheels, this is the default used when adding wheels. - * After adding the wheel, use direct wheel access.
- * The damping coefficient for when the suspension is expanding. - * See the comments for setSuspensionCompression for how to set k. - * @param suspensionDamping the suspensionDamping to set + * Alter the initial damping (when the suspension is expanded) for new + * wheels. Effective only before adding wheels. After adding a wheel, use + * {@link #setSuspensionCompression(int, float)}. + *

+ * Set to k * 2 * FastMath.sqrt(m_suspensionStiffness) where k is the + * damping ratio: + *

+ * k = 0.0 undamped and bouncy, k = 1.0 critical damping, k between 0.1 and + * 0.3 are good values + * + * @param suspensionDamping the desired damping coefficient (default=0.88) */ public void setSuspensionDamping(float suspensionDamping) { tuning.suspensionDamping = suspensionDamping; } /** - * The damping coefficient for when the suspension is expanding. - * See the comments for setSuspensionCompression for how to set k. - * @param wheel - * @param suspensionDamping + * Alter the damping (when the suspension is expanded) for the indexed + * wheel. + *

+ * Set to k * 2 * FastMath.sqrt(m_suspensionStiffness) where k is the + * damping ratio: + *

+ * k = 0.0 undamped and bouncy, k = 1.0 critical damping, k between 0.1 and + * 0.3 are good values + * + * @param wheel the index of the wheel to modify (≥0) + * @param suspensionDamping the desired damping coefficient */ public void setSuspensionDamping(int wheel, float suspensionDamping) { wheels.get(wheel).setWheelsDampingRelaxation(suspensionDamping); } /** - * @return the suspensionStiffness + * Read the initial suspension stiffness for new wheels. + * + * @return the stiffness constant (10→off-road buggy, 50→sports + * car, 200→Formula-1 race car) */ public float getSuspensionStiffness() { return tuning.suspensionStiffness; } /** - * Use before adding wheels, this is the default used when adding wheels. - * After adding the wheel, use direct wheel access.
- * The stiffness constant for the suspension. 10.0 - Offroad buggy, 50.0 - Sports car, 200.0 - F1 Car - * @param suspensionStiffness + * Alter the initial suspension stiffness for new wheels. Effective only + * before adding wheels. After adding a wheel, use + * {@link #setSuspensionStiffness(int, float)}. + * + * @param suspensionStiffness the desired stiffness coefficient + * (10→off-road buggy, 50→sports car, 200→Formula-1 race car, + * default=5.88) */ public void setSuspensionStiffness(float suspensionStiffness) { tuning.suspensionStiffness = suspensionStiffness; } /** - * The stiffness constant for the suspension. 10.0 - Offroad buggy, 50.0 - Sports car, 200.0 - F1 Car - * @param wheel - * @param suspensionStiffness + * Alter the suspension stiffness of the indexed wheel. + * + * @param wheel the index of the wheel to modify (≥0) + * @param suspensionStiffness the desired stiffness coefficient + * (10→off-road buggy, 50→sports car, 200→Formula-1 race car, + * default=5.88) */ public void setSuspensionStiffness(int wheel, float suspensionStiffness) { wheels.get(wheel).setSuspensionStiffness(suspensionStiffness); } /** - * Reset the suspension + * Reset this vehicle's suspension. */ public void resetSuspension() { resetSuspension(vehicleId); @@ -397,8 +528,9 @@ public class PhysicsVehicle extends PhysicsRigidBody { private native void resetSuspension(long vehicleId); /** - * Apply the given engine force to all wheels, works continuously - * @param force the force + * Apply the specified engine force to all wheels. Works continuously. + * + * @param force the desired amount of force */ public void accelerate(float force) { for (int i = 0; i < wheels.size(); i++) { @@ -407,9 +539,10 @@ public class PhysicsVehicle extends PhysicsRigidBody { } /** - * Apply the given engine force, works continuously - * @param wheel the wheel to apply the force on - * @param force the force + * Apply the given engine force to the indexed wheel. Works continuously. + * + * @param wheel the index of the wheel to apply the force to (≥0) + * @param force the desired amount of force */ public void accelerate(int wheel, float force) { applyEngineForce(vehicleId, wheel, force); @@ -419,8 +552,9 @@ public class PhysicsVehicle extends PhysicsRigidBody { private native void applyEngineForce(long vehicleId, int wheel, float force); /** - * Set the given steering value to all front wheels (0 = forward) - * @param value the steering angle of the front wheels (Pi = 360deg) + * Alter the steering angle of all front wheels. + * + * @param value the desired steering angle (in radians, 0=straight) */ public void steer(float value) { for (int i = 0; i < wheels.size(); i++) { @@ -431,9 +565,10 @@ public class PhysicsVehicle extends PhysicsRigidBody { } /** - * Set the given steering value to the given wheel (0 = forward) - * @param wheel the wheel to set the steering on - * @param value the steering angle of the front wheels (Pi = 360deg) + * Alter the steering angle of the indexed wheel. + * + * @param wheel the index of the wheel to steer (≥0) + * @param value the desired steering angle (in radians, 0=straight) */ public void steer(int wheel, float value) { steer(vehicleId, wheel, value); @@ -442,8 +577,9 @@ public class PhysicsVehicle extends PhysicsRigidBody { private native void steer(long vehicleId, int wheel, float value); /** - * Apply the given brake force to all wheels, works continuously - * @param force the force + * Apply the given brake force to all wheels. Works continuously. + * + * @param force the desired amount of force */ public void brake(float force) { for (int i = 0; i < wheels.size(); i++) { @@ -452,9 +588,10 @@ public class PhysicsVehicle extends PhysicsRigidBody { } /** - * Apply the given brake force, works continuously - * @param wheel the wheel to apply the force on - * @param force the force + * Apply the given brake force to the indexed wheel. Works continuously. + * + * @param wheel the index of the wheel to apply the force to (≥0) + * @param force the desired amount of force */ public void brake(int wheel, float force) { brake(vehicleId, wheel, force); @@ -463,8 +600,9 @@ public class PhysicsVehicle extends PhysicsRigidBody { private native void brake(long vehicleId, int wheel, float force); /** - * Get the current speed of the vehicle in km/h - * @return + * Read the vehicle's speed in km/h. + * + * @return speed (in kilometers per hour) */ public float getCurrentVehicleSpeedKmHour() { return getCurrentVehicleSpeedKmHour(vehicleId); @@ -473,9 +611,11 @@ public class PhysicsVehicle extends PhysicsRigidBody { private native float getCurrentVehicleSpeedKmHour(long vehicleId); /** - * Get the current forward vector of the vehicle in world coordinates - * @param vector - * @return + * Copy the vehicle's forward direction. + * + * @param vector storage for the result (modified if not null) + * @return a direction vector (in physics-space coordinates, either the + * provided storage or a new vector, not null) */ public Vector3f getForwardVector(Vector3f vector) { if (vector == null) { @@ -489,11 +629,19 @@ public class PhysicsVehicle extends PhysicsRigidBody { /** * used internally + * + * @return the unique identifier */ public long getVehicleId() { return vehicleId; } + /** + * De-serialize this vehicle, for example when loading from a J3O file. + * + * @param im importer (not null) + * @throws IOException from importer + */ @Override public void read(JmeImporter im) throws IOException { InputCapsule capsule = im.getCapsule(this); @@ -509,6 +657,12 @@ public class PhysicsVehicle extends PhysicsRigidBody { super.read(im); } + /** + * Serialize this vehicle, for example when saving to a J3O file. + * + * @param ex exporter (not null) + * @throws IOException from exporter + */ @Override public void write(JmeExporter ex) throws IOException { OutputCapsule capsule = ex.getCapsule(this); @@ -522,6 +676,12 @@ public class PhysicsVehicle extends PhysicsRigidBody { super.write(ex); } + /** + * Finalize this vehicle just before it is destroyed. Should be invoked only + * by a subclass or by the garbage collector. + * + * @throws Throwable ignored by the garbage collector + */ @Override protected void finalize() throws Throwable { super.finalize(); diff --git a/jme3-bullet/src/main/java/com/jme3/bullet/objects/VehicleWheel.java b/jme3-bullet/src/main/java/com/jme3/bullet/objects/VehicleWheel.java index 1e86cc256..25fa2c103 100644 --- a/jme3-bullet/src/main/java/com/jme3/bullet/objects/VehicleWheel.java +++ b/jme3-bullet/src/main/java/com/jme3/bullet/objects/VehicleWheel.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -40,42 +40,142 @@ import com.jme3.scene.Spatial; import java.io.IOException; /** - * Stores info about one wheel of a PhysicsVehicle + * Information about one wheel of a PhysicsVehicle. + * * @author normenhansen */ public class VehicleWheel implements Savable { + /** + * unique identifier of the btRaycastVehicle + */ protected long wheelId = 0; + /** + * 0-origin index among the vehicle's wheels (≥0) + */ protected int wheelIndex = 0; + /** + * copy of wheel type: true→front (steering) wheel, + * false→non-front wheel + */ protected boolean frontWheel; + /** + * location where the suspension connects to the chassis (in chassis + * coordinates) + */ protected Vector3f location = new Vector3f(); + /** + * suspension direction (in chassis coordinates, typically down/0,-1,0) + */ protected Vector3f direction = new Vector3f(); + /** + * axis direction (in chassis coordinates, typically to the right/-1,0,0) + */ protected Vector3f axle = new Vector3f(); + /** + * copy of suspension stiffness constant (10→off-road buggy, + * 50→sports car, 200→Formula-1 race car, default=20) + */ protected float suspensionStiffness = 20.0f; + /** + * copy of suspension damping when expanded (0→no damping, default=2.3) + */ protected float wheelsDampingRelaxation = 2.3f; + /** + * copy of suspension damping when compressed (0→no damping, + * default=4.4) + */ protected float wheelsDampingCompression = 4.4f; + /** + * copy of coefficient of friction between tyre and ground + * (0.8→realistic car, 10000→kart racer, default=10.5) + */ protected float frictionSlip = 10.5f; + /** + * copy of roll-influence factor (0→no roll torque, 1→realistic + * behavior, default=1) + */ protected float rollInfluence = 1.0f; + /** + * copy of maximum suspension travel distance (in centimeters, default=500) + */ protected float maxSuspensionTravelCm = 500f; + /** + * copy of maximum force exerted by the suspension (default=6000) + */ protected float maxSuspensionForce = 6000f; + /** + * copy of wheel radius (in physics-space units, >0) + */ protected float radius = 0.5f; + /** + * copy of rest length of the suspension (in physics-space units) + */ protected float restLength = 1f; + /** + * wheel location in physics-space coordinates + */ protected Vector3f wheelWorldLocation = new Vector3f(); + /** + * wheel orientation in physics-space coordinates + */ protected Quaternion wheelWorldRotation = new Quaternion(); + /** + * associated spatial, or null if none + */ protected Spatial wheelSpatial; protected Matrix3f tmp_Matrix = new com.jme3.math.Matrix3f(); protected final Quaternion tmp_inverseWorldRotation = new Quaternion(); + /** + * true → physics coordinates match local transform, false → + * physics coordinates match world transform + */ private boolean applyLocal = false; + /** + * No-argument constructor needed by SavableClassUtil. Do not invoke + * directly! + */ public VehicleWheel() { } + /** + * Instantiate a wheel. + * + * @param spat the associated spatial, or null if none + * @param location the location where the suspension connects to the chassis + * (in chassis coordinates, not null, unaffected) + * @param direction the suspension direction (in chassis coordinates, not + * null, unaffected, typically down/0,-1,0) + * @param axle the axis direction (in chassis coordinates, not null, + * unaffected, typically right/-1,0,0) + * @param restLength the rest length of the suspension (in physics-space + * units) + * @param radius the wheel's radius (in physics-space units, ≥0) + * @param frontWheel true→front (steering) wheel, false→non-front + * wheel + */ public VehicleWheel(Spatial spat, Vector3f location, Vector3f direction, Vector3f axle, float restLength, float radius, boolean frontWheel) { this(location, direction, axle, restLength, radius, frontWheel); wheelSpatial = spat; } + /** + * Instantiate a wheel without an associated spatial. + * + * @param location the location where the suspension connects to the chassis + * (in chassis coordinates, not null, unaffected) + * @param direction the suspension direction (in chassis coordinates, not + * null, unaffected, typically down/0,-1,0) + * @param axle the axis direction (in chassis coordinates, not null, + * unaffected, typically right/-1,0,0) + * @param restLength the rest length of the suspension (in physics-space + * units) + * @param radius the wheel's radius (in physics-space units, ≥0) + * @param frontWheel true→front (steering) wheel, false→non-front + * wheel + */ public VehicleWheel(Vector3f location, Vector3f direction, Vector3f axle, float restLength, float radius, boolean frontWheel) { this.location.set(location); @@ -86,6 +186,9 @@ public class VehicleWheel implements Savable { this.radius = radius; } + /** + * Update this wheel's location and orientation in physics space. + */ public void updatePhysicsState() { getWheelLocation(wheelId, wheelIndex, wheelWorldLocation); getWheelRotation(wheelId, wheelIndex, tmp_Matrix); @@ -96,6 +199,10 @@ public class VehicleWheel implements Savable { private native void getWheelRotation(long vehicleId, int wheelId, Matrix3f location); + /** + * Apply this wheel's physics location and orientation to its associated + * spatial, if any. + */ public void applyWheelTransform() { if (wheelSpatial == null) { return; @@ -118,132 +225,232 @@ public class VehicleWheel implements Savable { } } + /** + * Read the id of the btRaycastVehicle. + * + * @return the unique identifier (not zero) + */ public long getWheelId() { return wheelId; } + /** + * Assign this wheel to a vehicle. + * + * @param vehicleId the id of the btRaycastVehicle (not zero) + * @param wheelIndex index among the vehicle's wheels (≥0) + */ public void setVehicleId(long vehicleId, int wheelIndex) { this.wheelId = vehicleId; this.wheelIndex = wheelIndex; applyInfo(); } + /** + * Test whether this wheel is a front wheel. + * + * @return true if front wheel, otherwise false + */ public boolean isFrontWheel() { return frontWheel; } + /** + * Alter whether this wheel is a front (steering) wheel. + * + * @param frontWheel true→front wheel, false→non-front wheel + */ public void setFrontWheel(boolean frontWheel) { this.frontWheel = frontWheel; applyInfo(); } + /** + * Access the location where the suspension connects to the chassis. + * + * @return the pre-existing location vector (in chassis coordinates, not + * null) + */ public Vector3f getLocation() { return location; } + /** + * Access this wheel's suspension direction. + * + * @return the pre-existing direction vector (in chassis coordinates, not + * null) + */ public Vector3f getDirection() { return direction; } + /** + * Access this wheel's axle direction. + * + * @return the pre-existing direction vector (not null) + */ public Vector3f getAxle() { return axle; } + /** + * Read the stiffness constant for this wheel's suspension. + * + * @return the stiffness constant + */ public float getSuspensionStiffness() { return suspensionStiffness; } /** - * the stiffness constant for the suspension. 10.0 - Offroad buggy, 50.0 - Sports car, 200.0 - F1 Car - * @param suspensionStiffness + * Alter the stiffness constant for this wheel's suspension. + * + * @param suspensionStiffness the desired stiffness constant + * (10→off-road buggy, 50→sports car, 200→Formula-1 race car, + * default=20) */ public void setSuspensionStiffness(float suspensionStiffness) { this.suspensionStiffness = suspensionStiffness; applyInfo(); } + /** + * Read this wheel's damping when the suspension is expanded. + * + * @return the damping + */ public float getWheelsDampingRelaxation() { return wheelsDampingRelaxation; } /** - * the damping coefficient for when the suspension is expanding. - * See the comments for setWheelsDampingCompression for how to set k. - * @param wheelsDampingRelaxation + * Alter this wheel's damping when the suspension is expanded. + *

+ * Set to k * 2 * FastMath.sqrt(m_suspensionStiffness) where k is the + * damping ratio: + *

+ * k = 0.0 undamped and bouncy, k = 1.0 critical damping, k between 0.1 and + * 0.3 are good values + * + * @param wheelsDampingRelaxation the desired damping (default=2.3) */ public void setWheelsDampingRelaxation(float wheelsDampingRelaxation) { this.wheelsDampingRelaxation = wheelsDampingRelaxation; applyInfo(); } + /** + * Read this wheel's damping when the suspension is compressed. + * + * @return the damping + */ public float getWheelsDampingCompression() { return wheelsDampingCompression; } /** - * the damping coefficient for when the suspension is compressed. - * Set to k * 2.0 * FastMath.sqrt(m_suspensionStiffness) so k is proportional to critical damping.
- * k = 0.0 undamped & bouncy, k = 1.0 critical damping
- * 0.1 to 0.3 are good values - * @param wheelsDampingCompression + * Alter this wheel's damping when the suspension is compressed. + *

+ * Set to k * 2 * FastMath.sqrt(m_suspensionStiffness) where k is the + * damping ratio: + *

+ * k = 0.0 undamped and bouncy, k = 1.0 critical damping, k between 0.1 and + * 0.3 are good values + * + * @param wheelsDampingCompression the desired damping (default=4.4) */ public void setWheelsDampingCompression(float wheelsDampingCompression) { this.wheelsDampingCompression = wheelsDampingCompression; applyInfo(); } + /** + * Read the friction between this wheel's tyre and the ground. + * + * @return the coefficient of friction + */ public float getFrictionSlip() { return frictionSlip; } /** - * the coefficient of friction between the tyre and the ground. - * Should be about 0.8 for realistic cars, but can increased for better handling. - * Set large (10000.0) for kart racers - * @param frictionSlip + * Alter the friction between this wheel's tyre and the ground. + *

+ * Should be about 0.8 for realistic cars, but can increased for better + * handling. Set large (10000.0) for kart racers. + * + * @param frictionSlip the desired coefficient of friction (default=10.5) */ public void setFrictionSlip(float frictionSlip) { this.frictionSlip = frictionSlip; applyInfo(); } + /** + * Read this wheel's roll influence. + * + * @return the roll-influence factor + */ public float getRollInfluence() { return rollInfluence; } /** - * reduces the rolling torque applied from the wheels that cause the vehicle to roll over. - * This is a bit of a hack, but it's quite effective. 0.0 = no roll, 1.0 = physical behaviour. - * If m_frictionSlip is too high, you'll need to reduce this to stop the vehicle rolling over. - * You should also try lowering the vehicle's centre of mass - * @param rollInfluence the rollInfluence to set + * Alter this wheel's roll influence. + *

+ * The roll-influence factor reduces (or magnifies) the torque contributed + * by this wheel that tends to cause the vehicle to roll over. This is a bit + * of a hack, but it's quite effective. + *

+ * If the friction between the tyres and the ground is too high, you may + * reduce this factor to prevent the vehicle from rolling over. You should + * also try lowering the vehicle's centre of mass. + * + * @param rollInfluence the desired roll-influence factor (0→no roll + * torque, 1→realistic behaviour, default=1) */ public void setRollInfluence(float rollInfluence) { this.rollInfluence = rollInfluence; applyInfo(); } + /** + * Read the travel distance for this wheel's suspension. + * + * @return the maximum travel distance (in centimeters) + */ public float getMaxSuspensionTravelCm() { return maxSuspensionTravelCm; } /** - * the maximum distance the suspension can be compressed (centimetres) - * @param maxSuspensionTravelCm + * Alter the travel distance for this wheel's suspension. + * + * @param maxSuspensionTravelCm the desired maximum travel distance (in + * centimetres, default=500) */ public void setMaxSuspensionTravelCm(float maxSuspensionTravelCm) { this.maxSuspensionTravelCm = maxSuspensionTravelCm; applyInfo(); } + /** + * Read the maximum force exerted by this wheel's suspension. + * + * @return the maximum force + */ public float getMaxSuspensionForce() { return maxSuspensionForce; } /** - * The maximum suspension force, raise this above the default 6000 if your suspension cannot - * handle the weight of your vehcile. - * @param maxSuspensionTravelCm + * Alter the maximum force exerted by this wheel's suspension. + *

+ * Increase this if your suspension cannot handle the weight of your + * vehicle. + * + * @param maxSuspensionForce the desired maximum force (default=6000) */ public void setMaxSuspensionForce(float maxSuspensionForce) { this.maxSuspensionForce = maxSuspensionForce; @@ -269,19 +476,40 @@ public class VehicleWheel implements Savable { boolean frontWheel, float suspensionRestLength); + /** + * Read the radius of this wheel. + * + * @return the radius (in physics-space units, ≥0) + */ public float getRadius() { return radius; } + /** + * Alter the radius of this wheel. + * + * @param radius the desired radius (in physics-space units, ≥0, + * default=0.5) + */ public void setRadius(float radius) { this.radius = radius; applyInfo(); } + /** + * Read the rest length of this wheel. + * + * @return the length + */ public float getRestLength() { return restLength; } + /** + * Alter the rest length of the suspension of this wheel. + * + * @param restLength the desired length (default=1) + */ public void setRestLength(float restLength) { this.restLength = restLength; applyInfo(); @@ -303,7 +531,10 @@ public class VehicleWheel implements Savable { } /** - * returns the location where the wheel collides with the ground (world space) + * Copy the location where the wheel touches the ground. + * + * @param vec storage for the result (not null, modified) + * @return a new location vector (in physics-space coordinates, not null) */ public Vector3f getCollisionLocation(Vector3f vec) { getCollisionLocation(wheelId, wheelIndex, vec); @@ -313,7 +544,9 @@ public class VehicleWheel implements Savable { private native void getCollisionLocation(long wheelId, int wheelIndex, Vector3f vec); /** - * returns the location where the wheel collides with the ground (world space) + * Copy the location where the wheel collides with the ground. + * + * @return a new location vector (in physics-space coordinates) */ public Vector3f getCollisionLocation() { Vector3f vec = new Vector3f(); @@ -322,7 +555,10 @@ public class VehicleWheel implements Savable { } /** - * returns the normal where the wheel collides with the ground (world space) + * Copy the normal where the wheel touches the ground. + * + * @param vec storage for the result (not null, modified) + * @return a unit vector (in physics-space coordinates, not null) */ public Vector3f getCollisionNormal(Vector3f vec) { getCollisionNormal(wheelId, wheelIndex, vec); @@ -332,7 +568,9 @@ public class VehicleWheel implements Savable { private native void getCollisionNormal(long wheelId, int wheelIndex, Vector3f vec); /** - * returns the normal where the wheel collides with the ground (world space) + * Copy the normal where the wheel touches the ground. + * + * @return a new unit vector (in physics-space coordinates, not null) */ public Vector3f getCollisionNormal() { Vector3f vec = new Vector3f(); @@ -341,8 +579,11 @@ public class VehicleWheel implements Savable { } /** - * returns how much the wheel skids on the ground (for skid sounds/smoke etc.)
- * 0.0 = wheels are sliding, 1.0 = wheels have traction. + * Calculate to what extent the wheel is skidding (for skid sounds/smoke + * etc.) + * + * @return the relative amount of traction (0→wheel is sliding, + * 1→wheel has full traction) */ public float getSkidInfo() { return getSkidInfo(wheelId, wheelIndex); @@ -351,8 +592,9 @@ public class VehicleWheel implements Savable { public native float getSkidInfo(long wheelId, int wheelIndex); /** - * returns how many degrees the wheel has turned since the last physics - * step. + * Calculate how much this wheel has turned since the last physics step. + * + * @return the rotation angle (in radians) */ public float getDeltaRotation() { return getDeltaRotation(wheelId, wheelIndex); @@ -360,6 +602,12 @@ public class VehicleWheel implements Savable { public native float getDeltaRotation(long wheelId, int wheelIndex); + /** + * De-serialize this wheel, for example when loading from a J3O file. + * + * @param im importer (not null) + * @throws IOException from importer + */ @Override public void read(JmeImporter im) throws IOException { InputCapsule capsule = im.getCapsule(this); @@ -379,6 +627,12 @@ public class VehicleWheel implements Savable { restLength = capsule.readFloat("restLength", 1f); } + /** + * Serialize this wheel, for example when saving to a J3O file. + * + * @param ex exporter (not null) + * @throws IOException from exporter + */ @Override public void write(JmeExporter ex) throws IOException { OutputCapsule capsule = ex.getCapsule(this); @@ -399,41 +653,59 @@ public class VehicleWheel implements Savable { } /** - * @return the wheelSpatial + * Access the spatial associated with this wheel. + * + * @return the pre-existing instance, or null */ public Spatial getWheelSpatial() { return wheelSpatial; } /** - * @param wheelSpatial the wheelSpatial to set + * Alter which spatial is associated with this wheel. + * + * @param wheelSpatial the desired spatial, or null for none */ public void setWheelSpatial(Spatial wheelSpatial) { this.wheelSpatial = wheelSpatial; } + /** + * Test whether physics coordinates should match the local transform of the + * Spatial. + * + * @return true if matching local transform, false if matching world + * transform + */ public boolean isApplyLocal() { return applyLocal; } + /** + * Alter whether physics coordinates should match the local transform of the + * Spatial. + * + * @param applyLocal true→match local transform, false→match world + * transform (default=false) + */ public void setApplyLocal(boolean applyLocal) { this.applyLocal = applyLocal; } /** - * write the content of the wheelWorldRotation into the store - * - * @param store - */ + * Copy this wheel's physics-space orientation to the specified quaternion. + * + * @param store storage for the result (not null, modified) + */ public void getWheelWorldRotation(final Quaternion store) { store.set(this.wheelWorldRotation); } /** - * write the content of the wheelWorldLocation into the store - * - * @param store - */ + * Copy this wheel's physics-space location to the specified vector. + * + * @param store storage for the result (not null, modified) + */ public void getWheelWorldLocation(final Vector3f store) { store.set(this.wheelWorldLocation); } diff --git a/jme3-bullet/src/main/java/com/jme3/bullet/objects/infos/RigidBodyMotionState.java b/jme3-bullet/src/main/java/com/jme3/bullet/objects/infos/RigidBodyMotionState.java index 3406e7ae5..bee3bf78d 100644 --- a/jme3-bullet/src/main/java/com/jme3/bullet/objects/infos/RigidBodyMotionState.java +++ b/jme3-bullet/src/main/java/com/jme3/bullet/objects/infos/RigidBodyMotionState.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -40,8 +40,8 @@ import java.util.logging.Level; import java.util.logging.Logger; /** - * stores transform info of a PhysicsNode in a threadsafe manner to - * allow multithreaded access from the jme scenegraph and the bullet physicsspace + * The motion state (transform) of a rigid body, with thread-safe access. + * * @author normenhansen */ public class RigidBodyMotionState { @@ -51,9 +51,16 @@ public class RigidBodyMotionState { private Quaternion worldRotationQuat = new Quaternion(); private Quaternion tmp_inverseWorldRotation = new Quaternion(); private PhysicsVehicle vehicle; + /** + * true → physics coordinates match local transform, false → + * physics coordinates match world transform + */ private boolean applyPhysicsLocal = false; // protected LinkedList listeners = new LinkedList(); + /** + * Instantiate a motion state. + */ public RigidBodyMotionState() { this.motionStateId = createMotionState(); Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Created MotionState {0}", Long.toHexString(motionStateId)); @@ -62,8 +69,11 @@ public class RigidBodyMotionState { private native long createMotionState(); /** - * applies the current transform to the given jme Node if the location has been updated on the physics side - * @param spatial + * If the motion state has been updated, apply the new transform to the + * specified spatial. + * + * @param spatial where to apply the physics transform (not null, modified) + * @return true if changed */ public boolean applyTransform(Spatial spatial) { Vector3f localLocation = spatial.getLocalTranslation(); @@ -97,7 +107,10 @@ public class RigidBodyMotionState { private native boolean applyTransform(long stateId, Vector3f location, Quaternion rotation); /** - * @return the worldLocation + * Copy the location from this motion state. + * + * @return the pre-existing location vector (in physics-space coordinates, + * not null) */ public Vector3f getWorldLocation() { getWorldLocation(motionStateId, worldLocation); @@ -107,7 +120,10 @@ public class RigidBodyMotionState { private native void getWorldLocation(long stateId, Vector3f vec); /** - * @return the worldRotation + * Read the rotation of this motion state (as a matrix). + * + * @return the pre-existing rotation matrix (in physics-space coordinates, + * not null) */ public Matrix3f getWorldRotation() { getWorldRotation(motionStateId, worldRotation); @@ -117,7 +133,10 @@ public class RigidBodyMotionState { private native void getWorldRotation(long stateId, Matrix3f vec); /** - * @return the worldRotationQuat + * Read the rotation of this motion state (as a quaternion). + * + * @return the pre-existing instance (in physics-space coordinates, not + * null) */ public Quaternion getWorldRotationQuat() { getWorldRotationQuat(motionStateId, worldRotationQuat); @@ -127,20 +146,39 @@ public class RigidBodyMotionState { private native void getWorldRotationQuat(long stateId, Quaternion vec); /** - * @param vehicle the vehicle to set + * @param vehicle which vehicle will use this motion state */ public void setVehicle(PhysicsVehicle vehicle) { this.vehicle = vehicle; } + /** + * Test whether physics-space coordinates should match the spatial's local + * coordinates. + * + * @return true if matching local coordinates, false if matching world + * coordinates + */ public boolean isApplyPhysicsLocal() { return applyPhysicsLocal; } + /** + * Alter whether physics-space coordinates should match the spatial's local + * coordinates. + * + * @param applyPhysicsLocal true→match local coordinates, + * false→match world coordinates (default=false) + */ public void setApplyPhysicsLocal(boolean applyPhysicsLocal) { this.applyPhysicsLocal = applyPhysicsLocal; } + /** + * Read the unique id of the native object. + * + * @return id (not zero) + */ public long getObjectId(){ return motionStateId; } @@ -152,6 +190,12 @@ public class RigidBodyMotionState { // listeners.remove(listener); // } + /** + * Finalize this motion state just before it is destroyed. Should be invoked + * only by a subclass or by the garbage collector. + * + * @throws Throwable ignored by the garbage collector + */ @Override protected void finalize() throws Throwable { super.finalize(); diff --git a/jme3-bullet/src/main/java/com/jme3/bullet/objects/infos/VehicleTuning.java b/jme3-bullet/src/main/java/com/jme3/bullet/objects/infos/VehicleTuning.java index 47f344bd7..3a6dabbc7 100644 --- a/jme3-bullet/src/main/java/com/jme3/bullet/objects/infos/VehicleTuning.java +++ b/jme3-bullet/src/main/java/com/jme3/bullet/objects/infos/VehicleTuning.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -32,14 +32,35 @@ package com.jme3.bullet.objects.infos; /** - * + * Typical tuning parameters for a PhysicsVehicle. + * * @author normenhansen */ public class VehicleTuning { + /** + * suspension stiffness constant (10→off-road buggy, 50→sports + * car, 200→Formula-1 race car, default=5.88) + */ public float suspensionStiffness = 5.88f; + /** + * suspension damping when compressed (0→no damping, default=0.83) + */ public float suspensionCompression = 0.83f; + /** + * suspension damping when expanded (0→no damping, default=0.88) + */ public float suspensionDamping = 0.88f; + /** + * maximum suspension travel distance (in centimeters, default=500) + */ public float maxSuspensionTravelCm = 500f; + /** + * maximum force exerted by each wheel's suspension (default=6000) + */ public float maxSuspensionForce = 6000f; + /** + * coefficient of friction between tyres and ground (0.8→realistic car, + * 10000→kart racer, default=10.5) + */ public float frictionSlip = 10.5f; } diff --git a/jme3-bullet/src/main/java/com/jme3/bullet/util/DebugMeshCallback.java b/jme3-bullet/src/main/java/com/jme3/bullet/util/DebugMeshCallback.java index fbec02c9c..f0bc3c45f 100644 --- a/jme3-bullet/src/main/java/com/jme3/bullet/util/DebugMeshCallback.java +++ b/jme3-bullet/src/main/java/com/jme3/bullet/util/DebugMeshCallback.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -44,6 +44,17 @@ public class DebugMeshCallback { private ArrayList list = new ArrayList(); + /** + * Add a vertex to the mesh under construction. + *

+ * This method is invoked from native code. + * + * @param x local X coordinate of new vertex + * @param y local Y coordinate of new vertex + * @param z local Z coordinate of new vertex + * @param part ignored + * @param index ignored + */ public void addVector(float x, float y, float z, int part, int index) { list.add(new Vector3f(x, y, z)); } diff --git a/jme3-bullet/src/main/java/com/jme3/bullet/util/DebugShapeFactory.java b/jme3-bullet/src/main/java/com/jme3/bullet/util/DebugShapeFactory.java index c731035ca..d56440911 100644 --- a/jme3-bullet/src/main/java/com/jme3/bullet/util/DebugShapeFactory.java +++ b/jme3-bullet/src/main/java/com/jme3/bullet/util/DebugShapeFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -45,6 +45,7 @@ import java.util.Iterator; import java.util.List; /** + * A utility class to generate debug spatials from Bullet collision shapes. * * @author CJ Hare, normenhansen */ @@ -56,10 +57,13 @@ public class DebugShapeFactory { // private static final Vector3f aabbMin = new Vector3f(-1e30f, -1e30f, -1e30f); /** - * Creates a debug shape from the given collision shape. This is mostly used internally.
- * To attach a debug shape to a physics object, call attachDebugShape(AssetManager manager); on it. - * @param collisionShape - * @return + * Create a debug spatial from the specified collision shape. + *

+ * This is mostly used internally. To attach a debug shape to a physics + * object, call attachDebugShape(AssetManager manager); on it. + * + * @param collisionShape the shape to visualize (may be null, unaffected) + * @return a new tree of geometries, or null */ public static Spatial getDebugShape(CollisionShape collisionShape) { if (collisionShape == null) { @@ -101,6 +105,12 @@ public class DebugShapeFactory { return debugShape; } + /** + * Create a geometry for visualizing the specified shape. + * + * @param shape (not null, unaffected) + * @return a new geometry (not null) + */ private static Geometry createDebugShape(CollisionShape shape) { Geometry geom = new Geometry(); geom.setMesh(DebugShapeFactory.getDebugMesh(shape)); @@ -109,11 +119,18 @@ public class DebugShapeFactory { return geom; } + /** + * Create a mesh for visualizing the specified shape. + * + * @param shape (not null, unaffected) + * @return a new mesh (not null) + */ public static Mesh getDebugMesh(CollisionShape shape) { Mesh mesh = new Mesh(); - mesh = new Mesh(); DebugMeshCallback callback = new DebugMeshCallback(); - getVertices(shape.getObjectId(), callback); + long id = shape.getObjectId(); + getVertices(id, callback); + mesh.setBuffer(Type.Position, 3, callback.getVertices()); mesh.getFloatBuffer(Type.Position).clear(); return mesh; diff --git a/jme3-bullet/src/main/java/com/jme3/bullet/util/NativeMeshUtil.java b/jme3-bullet/src/main/java/com/jme3/bullet/util/NativeMeshUtil.java index fc3ad53d6..caf172c82 100644 --- a/jme3-bullet/src/main/java/com/jme3/bullet/util/NativeMeshUtil.java +++ b/jme3-bullet/src/main/java/com/jme3/bullet/util/NativeMeshUtil.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -39,18 +39,26 @@ import java.nio.ByteBuffer; import java.nio.FloatBuffer; /** + * A utility class for interfacing with Native Bullet. * * @author normenhansen */ public class NativeMeshUtil { + /** + * Pass a mesh to Native Bullet. + * + * @param mesh the JME mesh to pass (not null) + * @return the unique identifier of the resulting btTriangleIndexVertexArray + * (not 0) + */ public static long getTriangleIndexVertexArray(Mesh mesh){ ByteBuffer triangleIndexBase = BufferUtils.createByteBuffer(mesh.getTriangleCount() * 3 * 4); ByteBuffer vertexBase = BufferUtils.createByteBuffer(mesh.getVertexCount() * 3 * 4); int numVertices = mesh.getVertexCount(); - int vertexStride = 12; //3 verts * 4 bytes per. + int vertexStride = 12; //3 verts * 4 bytes each int numTriangles = mesh.getTriangleCount(); - int triangleIndexStride = 12; //3 index entries * 4 bytes each. + int triangleIndexStride = 12; //3 index entries * 4 bytes each IndexBuffer indices = mesh.getIndicesAsList(); FloatBuffer vertices = mesh.getFloatBuffer(Type.Position); @@ -72,6 +80,18 @@ public class NativeMeshUtil { return createTriangleIndexVertexArray(triangleIndexBase, vertexBase, numTriangles, numVertices, vertexStride, triangleIndexStride); } + /** + * Instantiate a btTriangleIndexVertexArray. Native method. + * + * @param triangleIndexBase index buffer (not null) + * @param vertexBase vertex buffer (not null) + * @param numTraingles the number of triangles in the mesh (≥0) + * @param numVertices the number of vertices in the mesh (≥0) + * @param vertextStride (in bytes, >0) + * @param triangleIndexStride (in bytes, >0) + * @return the unique identifier of the resulting btTriangleIndexVertexArray + * (not 0) + */ public static native long createTriangleIndexVertexArray(ByteBuffer triangleIndexBase, ByteBuffer vertexBase, int numTraingles, int numVertices, int vertextStride, int triangleIndexStride); } diff --git a/jme3-core/src/main/java/checkers/quals/DefaultQualifiers.java b/jme3-core/src/main/java/checkers/quals/DefaultQualifiers.java index e483e63e7..42854ee43 100644 --- a/jme3-core/src/main/java/checkers/quals/DefaultQualifiers.java +++ b/jme3-core/src/main/java/checkers/quals/DefaultQualifiers.java @@ -15,7 +15,7 @@ import java.lang.annotation.Target; * annotations of the same name at a single location. * * Example: - * + * *

  *   @DefaultQualifiers({
  *       @DefaultQualifier("NonNull"),
diff --git a/jme3-core/src/main/java/com/jme3/anim/AnimClip.java b/jme3-core/src/main/java/com/jme3/anim/AnimClip.java
new file mode 100644
index 000000000..9b86858a3
--- /dev/null
+++ b/jme3-core/src/main/java/com/jme3/anim/AnimClip.java
@@ -0,0 +1,99 @@
+package com.jme3.anim;
+
+import com.jme3.anim.tween.Tween;
+import com.jme3.export.*;
+import com.jme3.util.SafeArrayList;
+import com.jme3.util.clone.Cloner;
+import com.jme3.util.clone.JmeCloneable;
+
+import java.io.IOException;
+
+/**
+ * Created by Nehon on 20/12/2017.
+ */
+public class AnimClip implements JmeCloneable, Savable {
+
+    private String name;
+    private double length;
+
+    private AnimTrack[] tracks;
+
+    public AnimClip() {
+    }
+
+    public AnimClip(String name) {
+        this.name = name;
+    }
+
+    public void setTracks(AnimTrack[] tracks) {
+        this.tracks = tracks;
+        for (AnimTrack track : tracks) {
+            if (track.getLength() > length) {
+                length = track.getLength();
+            }
+        }
+    }
+
+    public String getName() {
+        return name;
+    }
+
+
+    public double getLength() {
+        return length;
+    }
+
+
+    public AnimTrack[] getTracks() {
+        return tracks;
+    }
+
+    @Override
+    public Object jmeClone() {
+        try {
+            return super.clone();
+        } catch (CloneNotSupportedException e) {
+            throw new RuntimeException("Error cloning", e);
+        }
+    }
+
+    @Override
+    public void cloneFields(Cloner cloner, Object original) {
+        AnimTrack[] newTracks = new AnimTrack[tracks.length];
+        for (int i = 0; i < tracks.length; i++) {
+            newTracks[i] = (cloner.clone(tracks[i]));
+        }
+        this.tracks = newTracks;
+    }
+
+    @Override
+    public String toString() {
+        return "Clip " + name + ", " + length + 's';
+    }
+
+    @Override
+    public void write(JmeExporter ex) throws IOException {
+        OutputCapsule oc = ex.getCapsule(this);
+        oc.write(name, "name", null);
+        oc.write(tracks, "tracks", null);
+
+    }
+
+    @Override
+    public void read(JmeImporter im) throws IOException {
+        InputCapsule ic = im.getCapsule(this);
+        name = ic.readString("name", null);
+        Savable[] arr = ic.readSavableArray("tracks", null);
+        if (arr != null) {
+            tracks = new AnimTrack[arr.length];
+            for (int i = 0; i < arr.length; i++) {
+                AnimTrack t = (AnimTrack) arr[i];
+                tracks[i] = t;
+                if (t.getLength() > length) {
+                    length = t.getLength();
+                }
+            }
+        }
+    }
+
+}
diff --git a/jme3-core/src/main/java/com/jme3/anim/AnimComposer.java b/jme3-core/src/main/java/com/jme3/anim/AnimComposer.java
new file mode 100644
index 000000000..646289367
--- /dev/null
+++ b/jme3-core/src/main/java/com/jme3/anim/AnimComposer.java
@@ -0,0 +1,250 @@
+package com.jme3.anim;
+
+import com.jme3.anim.tween.Tween;
+import com.jme3.anim.tween.Tweens;
+import com.jme3.anim.tween.action.*;
+import com.jme3.export.*;
+import com.jme3.renderer.RenderManager;
+import com.jme3.renderer.ViewPort;
+import com.jme3.scene.control.AbstractControl;
+import com.jme3.util.clone.Cloner;
+import com.jme3.util.clone.JmeCloneable;
+
+import java.io.IOException;
+import java.util.*;
+
+/**
+ * Created by Nehon on 20/12/2017.
+ */
+public class AnimComposer extends AbstractControl {
+
+    public static final String DEFAULT_LAYER = "Default";
+    private Map animClipMap = new HashMap<>();
+
+    private Map actions = new HashMap<>();
+    private float globalSpeed = 1f;
+    private Map layers = new LinkedHashMap<>();
+
+    public AnimComposer() {
+        layers.put(DEFAULT_LAYER, new Layer());
+    }
+
+    /**
+     * Retrieve an animation from the list of animations.
+     *
+     * @param name The name of the animation to retrieve.
+     * @return The animation corresponding to the given name, or null, if no
+     * such named animation exists.
+     */
+    public AnimClip getAnimClip(String name) {
+        return animClipMap.get(name);
+    }
+
+    /**
+     * Adds an animation to be available for playing to this
+     * AnimControl.
+     *
+     * @param anim The animation to add.
+     */
+    public void addAnimClip(AnimClip anim) {
+        animClipMap.put(anim.getName(), anim);
+    }
+
+    /**
+     * Remove an animation so that it is no longer available for playing.
+     *
+     * @param anim The animation to remove.
+     */
+    public void removeAnimClip(AnimClip anim) {
+        if (!animClipMap.containsKey(anim.getName())) {
+            throw new IllegalArgumentException("Given animation does not exist "
+                    + "in this AnimControl");
+        }
+
+        animClipMap.remove(anim.getName());
+    }
+
+    public Action setCurrentAction(String name) {
+        return setCurrentAction(name, DEFAULT_LAYER);
+    }
+
+    public Action setCurrentAction(String actionName, String layerName) {
+        Layer l = layers.get(layerName);
+        if (l == null) {
+            throw new IllegalArgumentException("Unknown layer " + layerName);
+        }
+        Action currentAction = action(actionName);
+        l.time = 0;
+        l.currentAction = currentAction;
+        return currentAction;
+    }
+
+    public Action action(String name) {
+        Action action = actions.get(name);
+        if (action == null) {
+            action = makeAction(name);
+            actions.put(name, action);
+        }
+        return action;
+    }
+
+    public Action makeAction(String name) {
+        Action action;
+        AnimClip clip = animClipMap.get(name);
+        if (clip == null) {
+            throw new IllegalArgumentException("Cannot find clip named " + name);
+        }
+        action = new ClipAction(clip);
+        return action;
+    }
+
+    public void makeLayer(String name, AnimationMask mask){
+        Layer l = new Layer();
+        l.mask = mask;
+        layers.put(name, l);
+    }
+
+
+    public BaseAction actionSequence(String name, Tween... tweens) {
+        BaseAction action = new BaseAction(Tweens.sequence(tweens));
+        actions.put(name, action);
+        return action;
+    }
+
+    public BlendAction actionBlended(String name, BlendSpace blendSpace, String... clips) {
+        BlendableAction[] acts = new BlendableAction[clips.length];
+        for (int i = 0; i < acts.length; i++) {
+            BlendableAction ba = (BlendableAction) makeAction(clips[i]);
+            acts[i] = ba;
+        }
+        BlendAction action = new BlendAction(blendSpace, acts);
+        actions.put(name, action);
+        return action;
+    }
+
+    public void reset() {
+        for (Layer layer : layers.values()) {
+            layer.currentAction = null;
+            layer.time = 0;
+        }
+    }
+
+    public Collection getAnimClips() {
+        return Collections.unmodifiableCollection(animClipMap.values());
+    }
+
+    public Collection getAnimClipsNames() {
+        return Collections.unmodifiableCollection(animClipMap.keySet());
+    }
+
+    @Override
+    protected void controlUpdate(float tpf) {
+        for (Layer layer : layers.values()) {
+            Action currentAction = layer.currentAction;
+            if (currentAction == null) {
+                continue;
+            }
+            layer.advance(tpf);
+
+            currentAction.setMask(layer.mask);
+            boolean running = currentAction.interpolate(layer.time);
+            currentAction.setMask(null);
+
+            if (!running) {
+                layer.time = 0;
+            }
+        }
+    }
+
+    @Override
+    protected void controlRender(RenderManager rm, ViewPort vp) {
+
+    }
+
+    public float getGlobalSpeed() {
+        return globalSpeed;
+    }
+
+    public void setGlobalSpeed(float globalSpeed) {
+        this.globalSpeed = globalSpeed;
+    }
+
+    @Override
+    public Object jmeClone() {
+        try {
+            AnimComposer clone = (AnimComposer) super.clone();
+            return clone;
+        } catch (CloneNotSupportedException ex) {
+            throw new AssertionError();
+        }
+    }
+
+    @Override
+    public void cloneFields(Cloner cloner, Object original) {
+        super.cloneFields(cloner, original);
+        Map clips = new HashMap<>();
+        for (String key : animClipMap.keySet()) {
+            clips.put(key, cloner.clone(animClipMap.get(key)));
+        }
+        Map act = new HashMap<>();
+        for (String key : actions.keySet()) {
+            act.put(key, cloner.clone(actions.get(key)));
+        }
+        actions = act;
+        animClipMap = clips;
+
+        Map newLayers = new LinkedHashMap<>();
+        for (String key : layers.keySet()) {
+            newLayers.put(key, cloner.clone(layers.get(key)));
+        }
+
+        layers = newLayers;
+
+    }
+
+    @Override
+    public void read(JmeImporter im) throws IOException {
+        super.read(im);
+        InputCapsule ic = im.getCapsule(this);
+        animClipMap = (Map) ic.readStringSavableMap("animClipMap", new HashMap());
+    }
+
+    @Override
+    public void write(JmeExporter ex) throws IOException {
+        super.write(ex);
+        OutputCapsule oc = ex.getCapsule(this);
+        oc.writeStringSavableMap(animClipMap, "animClipMap", new HashMap());
+    }
+
+    private class Layer implements JmeCloneable {
+        private Action currentAction;
+        private AnimationMask mask;
+        private float weight;
+        private double time;
+
+        public void advance(float tpf) {
+            time += tpf * currentAction.getSpeed() * globalSpeed;
+            // make sure negative time is in [0, length] range
+            if (time < 0) {
+                double length = currentAction.getLength();
+                time = (time % length + length) % length;
+            }
+
+        }
+
+        @Override
+        public Object jmeClone() {
+            try {
+                Layer clone = (Layer) super.clone();
+                return clone;
+            } catch (CloneNotSupportedException ex) {
+                throw new AssertionError();
+            }
+        }
+
+        @Override
+        public void cloneFields(Cloner cloner, Object original) {
+            currentAction = null;
+        }
+    }
+}
diff --git a/jme3-core/src/main/java/com/jme3/anim/AnimTrack.java b/jme3-core/src/main/java/com/jme3/anim/AnimTrack.java
new file mode 100644
index 000000000..45b54cf7f
--- /dev/null
+++ b/jme3-core/src/main/java/com/jme3/anim/AnimTrack.java
@@ -0,0 +1,12 @@
+package com.jme3.anim;
+
+import com.jme3.export.Savable;
+import com.jme3.util.clone.JmeCloneable;
+
+public interface AnimTrack extends Savable, JmeCloneable {
+
+    public void getDataAtTime(double time, T store);
+    public double getLength();
+
+
+}
diff --git a/jme3-core/src/main/java/com/jme3/anim/AnimationMask.java b/jme3-core/src/main/java/com/jme3/anim/AnimationMask.java
new file mode 100644
index 000000000..2aa8328b6
--- /dev/null
+++ b/jme3-core/src/main/java/com/jme3/anim/AnimationMask.java
@@ -0,0 +1,12 @@
+package com.jme3.anim;
+
+/**
+ * Created by Nehon
+ * An AnimationMask is defining a subset of elements on which an animation will be applied.
+ * Most used implementation is the ArmatureMask that defines a subset of joints in an Armature.
+ */
+public interface AnimationMask {
+
+    boolean contains(Object target);
+
+}
\ No newline at end of file
diff --git a/jme3-core/src/main/java/com/jme3/anim/Armature.java b/jme3-core/src/main/java/com/jme3/anim/Armature.java
new file mode 100644
index 000000000..ad7f5b0ac
--- /dev/null
+++ b/jme3-core/src/main/java/com/jme3/anim/Armature.java
@@ -0,0 +1,300 @@
+package com.jme3.anim;
+
+import com.jme3.anim.util.JointModelTransform;
+import com.jme3.asset.AssetLoadException;
+import com.jme3.export.*;
+import com.jme3.math.Matrix4f;
+import com.jme3.util.clone.Cloner;
+import com.jme3.util.clone.JmeCloneable;
+
+import java.io.IOException;
+import java.util.*;
+
+/**
+ * Created by Nehon on 15/12/2017.
+ */
+public class Armature implements JmeCloneable, Savable {
+
+    private Joint[] rootJoints;
+    private Joint[] jointList;
+
+    /**
+     * Contains the skinning matrices, multiplying it by a vertex effected by a bone
+     * will cause it to go to the animated position.
+     */
+    private transient Matrix4f[] skinningMatrixes;
+    private Class modelTransformClass = SeparateJointModelTransform.class;
+
+    /**
+     * Serialization only
+     */
+    public Armature() {
+    }
+
+    /**
+     * Creates an armature from a joint list.
+     * The root joints are found automatically.
+     * 

+ * Note that using this constructor will cause the joints in the list + * to have their bind pose recomputed based on their local transforms. + * + * @param jointList The list of joints to manage by this Armature + */ + public Armature(Joint[] jointList) { + this.jointList = jointList; + + List rootJointList = new ArrayList<>(); + for (int i = jointList.length - 1; i >= 0; i--) { + Joint joint = jointList[i]; + joint.setId(i); + instanciateJointModelTransform(joint); + if (joint.getParent() == null) { + rootJointList.add(joint); + } + } + rootJoints = rootJointList.toArray(new Joint[rootJointList.size()]); + + createSkinningMatrices(); + + for (int i = rootJoints.length - 1; i >= 0; i--) { + Joint rootJoint = rootJoints[i]; + rootJoint.update(); + } + } + + /** + * Update all joints sin this Amature. + */ + public void update() { + for (Joint rootJoint : rootJoints) { + rootJoint.update(); + } + } + + private void createSkinningMatrices() { + skinningMatrixes = new Matrix4f[jointList.length]; + for (int i = 0; i < skinningMatrixes.length; i++) { + skinningMatrixes[i] = new Matrix4f(); + } + } + + /** + * Sets the JointModelTransform implementation + * Default is {@link MatrixJointModelTransform} + * + * @param modelTransformClass + * @see {@link JointModelTransform},{@link MatrixJointModelTransform},{@link SeparateJointModelTransform}, + */ + public void setModelTransformClass(Class modelTransformClass) { + this.modelTransformClass = modelTransformClass; + if (jointList == null) { + return; + } + for (Joint joint : jointList) { + instanciateJointModelTransform(joint); + } + } + + private void instanciateJointModelTransform(Joint joint) { + try { + joint.setJointModelTransform(modelTransformClass.newInstance()); + } catch (InstantiationException | IllegalAccessException e) { + throw new IllegalArgumentException(e); + } + } + + /** + * returns the array of all root joints of this Armature + * + * @return + */ + public Joint[] getRoots() { + return rootJoints; + } + + public List getJointList() { + return Arrays.asList(jointList); + } + + /** + * return a joint for the given index + * + * @param index + * @return + */ + public Joint getJoint(int index) { + return jointList[index]; + } + + /** + * returns the joint with the given name + * + * @param name + * @return + */ + public Joint getJoint(String name) { + for (int i = 0; i < jointList.length; i++) { + if (jointList[i].getName().equals(name)) { + return jointList[i]; + } + } + return null; + } + + /** + * returns the bone index of the given bone + * + * @param joint + * @return + */ + public int getJointIndex(Joint joint) { + for (int i = 0; i < jointList.length; i++) { + if (jointList[i] == joint) { + return i; + } + } + + return -1; + } + + /** + * returns the joint index of the joint that has the given name + * + * @param name + * @return + */ + public int getJointIndex(String name) { + for (int i = 0; i < jointList.length; i++) { + if (jointList[i].getName().equals(name)) { + return i; + } + } + + return -1; + } + + /** + * Saves the current Armature state as its bind pose. + * Note that the bind pose is supposed to be the one where the armature is aligned with the mesh to deform. + * Saving this pose will affect how skinning works. + */ + public void saveBindPose() { + //make sure all bones are updated + update(); + //Save the current pose as bind pose + for (Joint joint : jointList) { + joint.saveBindPose(); + } + } + + /** + * This methods sets this armature in its bind pose (aligned with the mesh to deform) + * Note that this is only useful for debugging purpose. + */ + public void applyBindPose() { + for (Joint joint : rootJoints) { + joint.applyBindPose(); + } + } + + /** + * Saves the current local transform as the initial transform. + * Initial transform is the one applied to the armature when loaded. + */ + public void saveInitialPose() { + for (Joint joint : jointList) { + joint.saveInitialPose(); + } + } + + /** + * Applies the initial pose to this armature + */ + public void applyInitialPose() { + for (Joint rootJoint : rootJoints) { + rootJoint.applyInitialPose(); + } + } + + /** + * Compute the skinning matrices for each bone of the armature that would be used to transform vertices of associated meshes + * + * @return + */ + public Matrix4f[] computeSkinningMatrices() { + for (int i = 0; i < jointList.length; i++) { + jointList[i].getOffsetTransform(skinningMatrixes[i]); + } + return skinningMatrixes; + } + + /** + * returns the number of joints of this armature + * + * @return + */ + public int getJointCount() { + return jointList.length; + } + + @Override + public Object jmeClone() { + try { + Armature clone = (Armature) super.clone(); + return clone; + } catch (CloneNotSupportedException ex) { + throw new AssertionError(); + } + } + + @Override + public void cloneFields(Cloner cloner, Object original) { + this.rootJoints = cloner.clone(rootJoints); + this.jointList = cloner.clone(jointList); + this.skinningMatrixes = cloner.clone(skinningMatrixes); + for (Joint joint : jointList) { + instanciateJointModelTransform(joint); + } + } + + + @Override + public void read(JmeImporter im) throws IOException { + InputCapsule input = im.getCapsule(this); + + Savable[] jointRootsAsSavable = input.readSavableArray("rootJoints", null); + rootJoints = new Joint[jointRootsAsSavable.length]; + System.arraycopy(jointRootsAsSavable, 0, rootJoints, 0, jointRootsAsSavable.length); + + Savable[] jointListAsSavable = input.readSavableArray("jointList", null); + jointList = new Joint[jointListAsSavable.length]; + System.arraycopy(jointListAsSavable, 0, jointList, 0, jointListAsSavable.length); + + String className = input.readString("modelTransformClass", MatrixJointModelTransform.class.getCanonicalName()); + try { + modelTransformClass = (Class) Class.forName(className); + } catch (ClassNotFoundException e) { + throw new AssetLoadException("Cannnot find class for name " + className); + } + + int i = 0; + for (Joint joint : jointList) { + joint.setId(i++); + instanciateJointModelTransform(joint); + } + createSkinningMatrices(); + + for (Joint rootJoint : rootJoints) { + rootJoint.update(); + } + applyInitialPose(); + } + + @Override + public void write(JmeExporter ex) throws IOException { + OutputCapsule output = ex.getCapsule(this); + output.write(rootJoints, "rootJoints", null); + output.write(jointList, "jointList", null); + output.write(modelTransformClass.getCanonicalName(), "modelTransformClass", MatrixJointModelTransform.class.getCanonicalName()); + } +} diff --git a/jme3-core/src/main/java/com/jme3/anim/ArmatureMask.java b/jme3-core/src/main/java/com/jme3/anim/ArmatureMask.java new file mode 100644 index 000000000..b492eb4ed --- /dev/null +++ b/jme3-core/src/main/java/com/jme3/anim/ArmatureMask.java @@ -0,0 +1,62 @@ +package com.jme3.anim; + +import java.util.BitSet; + +public class ArmatureMask implements AnimationMask { + + private BitSet affectedJoints = new BitSet(); + + @Override + public boolean contains(Object target) { + return affectedJoints.get(((Joint) target).getId()); + } + + public static ArmatureMask createMask(Armature armature, String fromJoint) { + ArmatureMask mask = new ArmatureMask(); + mask.addFromJoint(armature, fromJoint); + return mask; + } + + public static ArmatureMask createMask(Armature armature, String... joints) { + ArmatureMask mask = new ArmatureMask(); + mask.addBones(armature, joints); + for (String joint : joints) { + mask.affectedJoints.set(armature.getJoint(joint).getId()); + } + return mask; + } + + /** + * Add joints to be influenced by this animation mask. + */ + public void addBones(Armature armature, String... jointNames) { + for (String jointName : jointNames) { + Joint joint = findJoint(armature, jointName); + affectedJoints.set(joint.getId()); + } + } + + private Joint findJoint(Armature armature, String jointName) { + Joint joint = armature.getJoint(jointName); + if (joint == null) { + throw new IllegalArgumentException("Cannot find joint " + jointName); + } + return joint; + } + + /** + * Add a joint and all its sub armature joints to be influenced by this animation mask. + */ + public void addFromJoint(Armature armature, String jointName) { + Joint joint = findJoint(armature, jointName); + recurseAddJoint(joint); + } + + private void recurseAddJoint(Joint joint) { + affectedJoints.set(joint.getId()); + for (Joint j : joint.getChildren()) { + recurseAddJoint(j); + } + } + +} diff --git a/jme3-core/src/main/java/com/jme3/anim/Joint.java b/jme3-core/src/main/java/com/jme3/anim/Joint.java new file mode 100644 index 000000000..bf672fa29 --- /dev/null +++ b/jme3-core/src/main/java/com/jme3/anim/Joint.java @@ -0,0 +1,342 @@ +package com.jme3.anim; + +import com.jme3.anim.util.HasLocalTransform; +import com.jme3.anim.util.JointModelTransform; +import com.jme3.export.*; +import com.jme3.material.MatParamOverride; +import com.jme3.math.*; +import com.jme3.scene.*; +import com.jme3.shader.VarType; +import com.jme3.util.SafeArrayList; +import com.jme3.util.clone.Cloner; +import com.jme3.util.clone.JmeCloneable; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +/** + * A Joint is the basic component of an armature designed to perform skeletal animation + * Created by Nehon on 15/12/2017. + */ +public class Joint implements Savable, JmeCloneable, HasLocalTransform { + + private String name; + private int id; + private Joint parent; + private SafeArrayList children = new SafeArrayList<>(Joint.class); + private Geometry targetGeometry; + + /** + * The attachment node. + */ + private Node attachedNode; + + /** + * The transform of the joint in local space. Relative to its parent. + * Or relative to the model's origin for the root joint. + */ + private Transform localTransform = new Transform(); + + /** + * The initial transform of the joint in local space. Relative to its parent. + * Or relative to the model's origin for the root joint. + * this transform is the transform applied when the armature is loaded. + */ + private Transform initialTransform = new Transform(); + + /** + * The transform of the joint in model space. Relative to the origin of the model. + * this is either a MatrixJointModelTransform or a SeparateJointModelTransform + */ + private JointModelTransform jointModelTransform; + + /** + * The matrix used to transform affected vertices position into the joint model space. + * Used for skinning. + */ + private Matrix4f inverseModelBindMatrix = new Matrix4f(); + + + public Joint() { + } + + public Joint(String name) { + this.name = name; + } + + /** + * Updates world transforms for this bone and it's children. + */ + public final void update() { + this.updateModelTransforms(); + + for (Joint child : children.getArray()) { + child.update(); + } + } + + /** + * Updates the model transforms for this bone, and, possibly the attach node + * if not null. + *

+ * The model transform of this bone is computed by combining the parent's + * model transform with this bones' local transform. + */ + public final void updateModelTransforms() { + jointModelTransform.updateModelTransform(localTransform, parent); + updateAttachNode(); + } + + /** + * Update the local transform of the attachments node. + */ + private void updateAttachNode() { + if (attachedNode == null) { + return; + } + Node attachParent = attachedNode.getParent(); + if (attachParent == null || targetGeometry == null + || targetGeometry.getParent() == attachParent + && targetGeometry.getLocalTransform().isIdentity()) { + /* + * The animated meshes are in the same coordinate system as the + * attachments node: no further transforms are needed. + */ + attachedNode.setLocalTransform(getModelTransform()); + + } else { + Spatial loopSpatial = targetGeometry; + Transform combined = getModelTransform().clone(); + /* + * Climb the scene graph applying local transforms until the + * attachments node's parent is reached. + */ + while (loopSpatial != attachParent && loopSpatial != null) { + Transform localTransform = loopSpatial.getLocalTransform(); + combined.combineWithParent(localTransform); + loopSpatial = loopSpatial.getParent(); + } + attachedNode.setLocalTransform(combined); + } + } + + /** + * Stores the skinning transform in the specified Matrix4f. + * The skinning transform applies the animation of the bone to a vertex. + *

+ * This assumes that the world transforms for the entire bone hierarchy + * have already been computed, otherwise this method will return undefined + * results. + * + * @param outTransform + */ + void getOffsetTransform(Matrix4f outTransform) { + jointModelTransform.getOffsetTransform(outTransform, inverseModelBindMatrix); + } + + /** + * Sets the current localTransform as the Bind transform. + */ + protected void saveBindPose() { + //Note that the whole Armature must be updated before calling this method. + getModelTransform().toTransformMatrix(inverseModelBindMatrix); + inverseModelBindMatrix.invertLocal(); + } + + /** + * Sets the current local transforms as the initial transform. + */ + protected void saveInitialPose() { + initialTransform.set(localTransform); + } + + /** + * Sets the local transform with the bind transforms + */ + protected void applyBindPose() { + jointModelTransform.applyBindPose(localTransform, inverseModelBindMatrix, parent); + updateModelTransforms(); + + for (Joint child : children.getArray()) { + child.applyBindPose(); + } + } + + /** + * Sets the local transform with the initial transform + */ + protected void applyInitialPose() { + setLocalTransform(initialTransform); + updateModelTransforms(); + + for (Joint child : children.getArray()) { + child.applyInitialPose(); + } + } + + protected JointModelTransform getJointModelTransform() { + return jointModelTransform; + } + + protected void setJointModelTransform(JointModelTransform jointModelTransform) { + this.jointModelTransform = jointModelTransform; + } + + public Vector3f getLocalTranslation() { + return localTransform.getTranslation(); + } + + public Quaternion getLocalRotation() { + return localTransform.getRotation(); + } + + public Vector3f getLocalScale() { + return localTransform.getScale(); + } + + public void setLocalTranslation(Vector3f translation) { + localTransform.setTranslation(translation); + } + + public void setLocalRotation(Quaternion rotation) { + localTransform.setRotation(rotation); + } + + public void setLocalScale(Vector3f scale) { + localTransform.setScale(scale); + } + + public void addChild(Joint child) { + children.add(child); + child.parent = this; + } + + public void setName(String name) { + this.name = name; + } + + public void setLocalTransform(Transform localTransform) { + this.localTransform.set(localTransform); + } + + public void setInverseModelBindMatrix(Matrix4f inverseModelBindMatrix) { + this.inverseModelBindMatrix = inverseModelBindMatrix; + } + + public String getName() { + return name; + } + + public Joint getParent() { + return parent; + } + + public List getChildren() { + return children; + } + + /** + * Access the attachments node of this joint. If this joint doesn't already + * have an attachments node, create one. Models and effects attached to the + * attachments node will follow this bone's motions. + * + * @param jointIndex this bone's index in its armature (≥0) + * @param targets a list of geometries animated by this bone's skeleton (not + * null, unaffected) + */ + Node getAttachmentsNode(int jointIndex, SafeArrayList targets) { + targetGeometry = null; + /* + * Search for a geometry animated by this particular bone. + */ + for (Geometry geometry : targets) { + Mesh mesh = geometry.getMesh(); + if (mesh != null && mesh.isAnimatedByJoint(jointIndex)) { + targetGeometry = geometry; + break; + } + } + + if (attachedNode == null) { + attachedNode = new Node(name + "_attachnode"); + attachedNode.setUserData("AttachedBone", this); + //We don't want the node to have a numBone set by a parent node so we force it to null + attachedNode.addMatParamOverride(new MatParamOverride(VarType.Int, "NumberOfBones", null)); + } + + return attachedNode; + } + + + public Transform getLocalTransform() { + return localTransform; + } + + public Transform getModelTransform() { + return jointModelTransform.getModelTransform(); + } + + public Matrix4f getInverseModelBindMatrix() { + return inverseModelBindMatrix; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + @Override + public Object jmeClone() { + try { + Joint clone = (Joint) super.clone(); + return clone; + } catch (CloneNotSupportedException ex) { + throw new AssertionError(); + } + } + + @Override + public void cloneFields(Cloner cloner, Object original) { + this.children = cloner.clone(children); + this.parent = cloner.clone(parent); + this.attachedNode = cloner.clone(attachedNode); + this.targetGeometry = cloner.clone(targetGeometry); + this.localTransform = cloner.clone(localTransform); + this.inverseModelBindMatrix = cloner.clone(inverseModelBindMatrix); + } + + + @Override + @SuppressWarnings("unchecked") + public void read(JmeImporter im) throws IOException { + InputCapsule input = im.getCapsule(this); + + name = input.readString("name", null); + attachedNode = (Node) input.readSavable("attachedNode", null); + targetGeometry = (Geometry) input.readSavable("targetGeometry", null); + initialTransform = (Transform) input.readSavable("initialTransform", new Transform()); + inverseModelBindMatrix = (Matrix4f) input.readSavable("inverseModelBindMatrix", inverseModelBindMatrix); + + ArrayList childList = input.readSavableArrayList("children", null); + for (int i = childList.size() - 1; i >= 0; i--) { + this.addChild(childList.get(i)); + } + } + + @Override + public void write(JmeExporter ex) throws IOException { + OutputCapsule output = ex.getCapsule(this); + + output.write(name, "name", null); + output.write(attachedNode, "attachedNode", null); + output.write(targetGeometry, "targetGeometry", null); + output.write(initialTransform, "initialTransform", new Transform()); + output.write(inverseModelBindMatrix, "inverseModelBindMatrix", new Matrix4f()); + output.writeSavableArrayList(new ArrayList(children), "children", null); + } + +} diff --git a/jme3-core/src/main/java/com/jme3/anim/MatrixJointModelTransform.java b/jme3-core/src/main/java/com/jme3/anim/MatrixJointModelTransform.java new file mode 100644 index 000000000..5f1aadad7 --- /dev/null +++ b/jme3-core/src/main/java/com/jme3/anim/MatrixJointModelTransform.java @@ -0,0 +1,47 @@ +package com.jme3.anim; + +import com.jme3.anim.util.JointModelTransform; +import com.jme3.math.Matrix4f; +import com.jme3.math.Transform; + +/** + * This JointModelTransform implementation accumulate joints transforms in a Matrix4f to properly + * support non uniform scaling in an armature hierarchy + */ +public class MatrixJointModelTransform implements JointModelTransform { + + private Matrix4f modelTransformMatrix = new Matrix4f(); + private Transform modelTransform = new Transform(); + + @Override + public void updateModelTransform(Transform localTransform, Joint parent) { + localTransform.toTransformMatrix(modelTransformMatrix); + if (parent != null) { + ((MatrixJointModelTransform) parent.getJointModelTransform()).getModelTransformMatrix().mult(modelTransformMatrix, modelTransformMatrix); + } + + } + + public void getOffsetTransform(Matrix4f outTransform, Matrix4f inverseModelBindMatrix) { + modelTransformMatrix.mult(inverseModelBindMatrix, outTransform); + } + + @Override + public void applyBindPose(Transform localTransform, Matrix4f inverseModelBindMatrix, Joint parent) { + modelTransformMatrix.set(inverseModelBindMatrix).invertLocal(); // model transform = model bind + if (parent != null) { + ((MatrixJointModelTransform) parent.getJointModelTransform()).getModelTransformMatrix().invert().mult(modelTransformMatrix, modelTransformMatrix); + } + localTransform.fromTransformMatrix(modelTransformMatrix); + } + + public Matrix4f getModelTransformMatrix() { + return modelTransformMatrix; + } + + @Override + public Transform getModelTransform() { + modelTransform.fromTransformMatrix(modelTransformMatrix); + return modelTransform; + } +} diff --git a/jme3-core/src/main/java/com/jme3/anim/MorphControl.java b/jme3-core/src/main/java/com/jme3/anim/MorphControl.java new file mode 100644 index 000000000..1aa055555 --- /dev/null +++ b/jme3-core/src/main/java/com/jme3/anim/MorphControl.java @@ -0,0 +1,353 @@ +package com.jme3.anim; + +import com.jme3.export.Savable; +import com.jme3.material.*; +import com.jme3.renderer.*; +import com.jme3.scene.*; +import com.jme3.scene.control.AbstractControl; +import com.jme3.scene.mesh.MorphTarget; +import com.jme3.shader.VarType; +import com.jme3.util.BufferUtils; +import com.jme3.util.SafeArrayList; + +import java.nio.FloatBuffer; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * A control that handle morph animation for Position, Normal and Tangent buffers. + * All stock shaders only support morphing these 3 buffers, but note that MorphTargets can have any type of buffers. + * If you want to use other types of buffers you will need a custom MorphControl and a custom shader. + * + * @author Rémy Bouquet + */ +public class MorphControl extends AbstractControl implements Savable { + + private static final Logger logger = Logger.getLogger(MorphControl.class.getName()); + + private static final int MAX_MORPH_BUFFERS = 14; + private final static float MIN_WEIGHT = 0.005f; + + private SafeArrayList targets = new SafeArrayList<>(Geometry.class); + private TargetLocator targetLocator = new TargetLocator(); + + private boolean approximateTangents = true; + private MatParamOverride nullNumberOfBones = new MatParamOverride(VarType.Int, "NumberOfBones", null); + + private float[] tmpPosArray; + private float[] tmpNormArray; + private float[] tmpTanArray; + + private static final VertexBuffer.Type bufferTypes[] = VertexBuffer.Type.values(); + + @Override + protected void controlUpdate(float tpf) { + if (!enabled) { + return; + } + // gathering geometries in the sub graph. + // This must be done in the update phase as the gathering might add a matparam override + targets.clear(); + this.spatial.depthFirstTraversal(targetLocator); + } + + @Override + protected void controlRender(RenderManager rm, ViewPort vp) { + if (!enabled) { + return; + } + for (Geometry geom : targets) { + Mesh mesh = geom.getMesh(); + if (!geom.isDirtyMorph()) { + continue; + } + + Material m = geom.getMaterial(); + float weights[] = geom.getMorphState(); + MorphTarget morphTargets[] = mesh.getMorphTargets(); + float matWeights[]; + //Number of buffer to handle for each morph target + int targetNumBuffers = getTargetNumBuffers(morphTargets[0]); + + int maxGPUTargets = getMaxGPUTargets(rm, geom, m, targetNumBuffers); + + MatParam param2 = m.getParam("MorphWeights"); + matWeights = (float[]) param2.getValue(); + + int nbGPUTargets = 0; + int lastGpuTargetIndex = 0; + int boundBufferIdx = 0; + float cpuWeightSum = 0; + // binding the morphTargets buffer to the mesh morph buffers + for (int i = 0; i < morphTargets.length; i++) { + // discard weights below the threshold + if (weights[i] < MIN_WEIGHT) { + continue; + } + if (nbGPUTargets >= maxGPUTargets) { + // we already bound all the available gpu slots we need to merge the remaining morph targets. + cpuWeightSum += weights[i]; + continue; + } + lastGpuTargetIndex = i; + // binding the morph target's buffers to the mesh morph buffers. + MorphTarget t = morphTargets[i]; + boundBufferIdx = bindMorphtargetBuffer(mesh, targetNumBuffers, boundBufferIdx, t); + // setting the weight in the mat param array + matWeights[nbGPUTargets] = weights[i]; + nbGPUTargets++; + } + + if (nbGPUTargets < matWeights.length) { + // if we have less simultaneous GPU targets than the length of the weight array, the array is padded with 0 + for (int i = nbGPUTargets; i < matWeights.length; i++) { + matWeights[i] = 0; + } + } else if (cpuWeightSum > 0) { + // we have more simultaneous morph targets than available gpu slots, + // we merge the additional morph targets and bind them to the last gpu slot + MorphTarget mt = geom.getFallbackMorphTarget(); + if (mt == null) { + mt = initCpuMorphTarget(geom); + geom.setFallbackMorphTarget(mt); + } + // adding the last Gpu target weight + cpuWeightSum += matWeights[nbGPUTargets - 1]; + ensureTmpArraysCapacity(geom.getVertexCount() * 3, targetNumBuffers); + + // merging all remaining targets in tmp arrays + for (int i = lastGpuTargetIndex; i < morphTargets.length; i++) { + if (weights[i] < MIN_WEIGHT) { + continue; + } + float weight = weights[i] / cpuWeightSum; + MorphTarget t = geom.getMesh().getMorphTargets()[i]; + mergeMorphTargets(targetNumBuffers, weight, t, i == lastGpuTargetIndex); + } + + // writing the tmp arrays to the float buffer + writeCpuBuffer(targetNumBuffers, mt); + + // binding the merged morph target + bindMorphtargetBuffer(mesh, targetNumBuffers, (nbGPUTargets - 1) * targetNumBuffers, mt); + + // setting the eight of the merged targets + matWeights[nbGPUTargets - 1] = cpuWeightSum; + } + geom.setDirtyMorph(false); + } + } + + private int getMaxGPUTargets(RenderManager rm, Geometry geom, Material mat, int targetNumBuffers) { + if (geom.getNbSimultaneousGPUMorph() > -1) { + return geom.getNbSimultaneousGPUMorph(); + } + + // Evaluate the number of CPU slots remaining for morph buffers. + int nbMaxBuffers = getRemainingBuffers(geom.getMesh(), rm.getRenderer()); + + int realNumTargetsBuffers = geom.getMesh().getMorphTargets().length * targetNumBuffers; + + // compute the max number of targets to send to the GPU + int maxGPUTargets = Math.min(realNumTargetsBuffers, Math.min(nbMaxBuffers, MAX_MORPH_BUFFERS)) / targetNumBuffers; + + MatParam param = mat.getParam("MorphWeights"); + if (param == null) { + // init the mat param if it doesn't exists. + float[] wts = new float[maxGPUTargets]; + mat.setParam("MorphWeights", VarType.FloatArray, wts); + } + + mat.setInt("NumberOfTargetsBuffers", targetNumBuffers); + + // test compile the shader to find the accurate number of remaining attributes slots + boolean compilationOk = false; + // Note that if ever the shader has an unrelated issue we want to break at some point, hence the maxGPUTargets > 0 + while (!compilationOk && maxGPUTargets > 0) { + // setting the maximum number as the real number may change every frame and trigger a shader recompilation since it's bound to a define. + mat.setInt("NumberOfMorphTargets", maxGPUTargets); + try { + // preload the spatial. this will trigger a shader compilation that will fail if the number of attributes is over the limit. + rm.preloadScene(spatial); + compilationOk = true; + } catch (RendererException e) { + logger.log(Level.FINE, geom.getName() + ": failed at " + maxGPUTargets); + // the compilation failed let's decrement the number of targets an try again. + maxGPUTargets--; + } + } + logger.log(Level.FINE, geom.getName() + ": " + maxGPUTargets); + // set the number of GPU morph on the geom to not have to recompute it next frame. + geom.setNbSimultaneousGPUMorph(maxGPUTargets); + return maxGPUTargets; + } + + private int bindMorphtargetBuffer(Mesh mesh, int targetNumBuffers, int boundBufferIdx, MorphTarget t) { + int start = VertexBuffer.Type.MorphTarget0.ordinal(); + if (targetNumBuffers >= 1) { + activateBuffer(mesh, boundBufferIdx, start, t.getBuffer(VertexBuffer.Type.Position)); + boundBufferIdx++; + } + if (targetNumBuffers >= 2) { + activateBuffer(mesh, boundBufferIdx, start, t.getBuffer(VertexBuffer.Type.Normal)); + boundBufferIdx++; + } + if (!approximateTangents && targetNumBuffers == 3) { + activateBuffer(mesh, boundBufferIdx, start, t.getBuffer(VertexBuffer.Type.Tangent)); + boundBufferIdx++; + } + return boundBufferIdx; + } + + private void writeCpuBuffer(int targetNumBuffers, MorphTarget mt) { + if (targetNumBuffers >= 1) { + FloatBuffer dest = mt.getBuffer(VertexBuffer.Type.Position); + dest.rewind(); + dest.put(tmpPosArray, 0, dest.capacity()); + } + if (targetNumBuffers >= 2) { + FloatBuffer dest = mt.getBuffer(VertexBuffer.Type.Normal); + dest.rewind(); + dest.put(tmpNormArray, 0, dest.capacity()); + } + if (!approximateTangents && targetNumBuffers == 3) { + FloatBuffer dest = mt.getBuffer(VertexBuffer.Type.Tangent); + dest.rewind(); + dest.put(tmpTanArray, 0, dest.capacity()); + } + } + + private void mergeMorphTargets(int targetNumBuffers, float weight, MorphTarget t, boolean init) { + if (targetNumBuffers >= 1) { + mergeTargetBuffer(tmpPosArray, weight, t.getBuffer(VertexBuffer.Type.Position), init); + } + if (targetNumBuffers >= 2) { + mergeTargetBuffer(tmpNormArray, weight, t.getBuffer(VertexBuffer.Type.Normal), init); + } + if (!approximateTangents && targetNumBuffers == 3) { + mergeTargetBuffer(tmpTanArray, weight, t.getBuffer(VertexBuffer.Type.Tangent), init); + } + } + + private void ensureTmpArraysCapacity(int capacity, int targetNumBuffers) { + if (targetNumBuffers >= 1) { + tmpPosArray = ensureCapacity(tmpPosArray, capacity); + } + if (targetNumBuffers >= 2) { + tmpNormArray = ensureCapacity(tmpNormArray, capacity); + } + if (!approximateTangents && targetNumBuffers == 3) { + tmpTanArray = ensureCapacity(tmpTanArray, capacity); + } + } + + private void mergeTargetBuffer(float[] array, float weight, FloatBuffer src, boolean init) { + src.rewind(); + for (int j = 0; j < src.capacity(); j++) { + if (init) { + array[j] = 0; + } + array[j] += weight * src.get(); + } + } + + private void activateBuffer(Mesh mesh, int idx, int start, FloatBuffer b) { + VertexBuffer.Type t = bufferTypes[start + idx]; + VertexBuffer vb = mesh.getBuffer(t); + // only set the buffer if it's different + if (vb == null || vb.getData() != b) { + mesh.setBuffer(t, 3, b); + } + } + + private float[] ensureCapacity(float[] tmpArray, int size) { + if (tmpArray == null || tmpArray.length < size) { + return new float[size]; + } + return tmpArray; + } + + private MorphTarget initCpuMorphTarget(Geometry geom) { + MorphTarget res = new MorphTarget(); + MorphTarget mt = geom.getMesh().getMorphTargets()[0]; + FloatBuffer b = mt.getBuffer(VertexBuffer.Type.Position); + if (b != null) { + res.setBuffer(VertexBuffer.Type.Position, BufferUtils.createFloatBuffer(b.capacity())); + } + b = mt.getBuffer(VertexBuffer.Type.Normal); + if (b != null) { + res.setBuffer(VertexBuffer.Type.Normal, BufferUtils.createFloatBuffer(b.capacity())); + } + if (!approximateTangents) { + b = mt.getBuffer(VertexBuffer.Type.Tangent); + if (b != null) { + res.setBuffer(VertexBuffer.Type.Tangent, BufferUtils.createFloatBuffer(b.capacity())); + } + } + return res; + } + + private int getTargetNumBuffers(MorphTarget morphTarget) { + int num = 0; + if (morphTarget.getBuffer(VertexBuffer.Type.Position) != null) num++; + if (morphTarget.getBuffer(VertexBuffer.Type.Normal) != null) num++; + + // if tangents are not needed we don't count the tangent buffer + if (!approximateTangents && morphTarget.getBuffer(VertexBuffer.Type.Tangent) != null) { + num++; + } + return num; + } + + /** + * Computes the number of remaining buffers on this mesh. + * This is supposed to give a hint on how many attributes will be used in the material and computes the remaining available slots for the morph attributes. + * However, the shader can declare attributes that are not used and not bound to a real buffer. + * That's why we attempt to compile the shader later on to avoid any compilation crash. + * This method is here to avoid too much render test iteration. + * + * @param mesh + * @param renderer + * @return + */ + private int getRemainingBuffers(Mesh mesh, Renderer renderer) { + int nbUsedBuffers = 0; + for (VertexBuffer vb : mesh.getBufferList().getArray()) { + boolean isMorphBuffer = vb.getBufferType().ordinal() >= VertexBuffer.Type.MorphTarget0.ordinal() && vb.getBufferType().ordinal() <= VertexBuffer.Type.MorphTarget9.ordinal(); + if (vb.getBufferType() == VertexBuffer.Type.Index || isMorphBuffer) continue; + if (vb.getUsage() != VertexBuffer.Usage.CpuOnly) { + nbUsedBuffers++; + } + } + return renderer.getLimits().get(Limits.VertexAttributes) - nbUsedBuffers; + } + + public void setApproximateTangents(boolean approximateTangents) { + this.approximateTangents = approximateTangents; + } + + public boolean isApproximateTangents() { + return approximateTangents; + } + + private class TargetLocator extends SceneGraphVisitorAdapter { + @Override + public void visit(Geometry geom) { + MatParam p = geom.getMaterial().getMaterialDef().getMaterialParam("MorphWeights"); + if (p == null) { + return; + } + Mesh mesh = geom.getMesh(); + if (mesh != null && mesh.hasMorphTargets()) { + targets.add(geom); + // If the mesh is in a subgraph of a node with a SkinningControl it might have hardware skinning activated through mat param override even if it's not skinned. + // this code makes sure that if the mesh has no hardware skinning buffers hardware skinning won't be activated. + // this is important, because if HW skinning is activated the shader will declare 2 additional useless attributes, + // and we desperately need all the attributes we can find for Morph animation. + if (mesh.getBuffer(VertexBuffer.Type.HWBoneIndex) == null && !geom.getLocalMatParamOverrides().contains(nullNumberOfBones)) { + geom.addMatParamOverride(nullNumberOfBones); + } + } + } + } +} diff --git a/jme3-core/src/main/java/com/jme3/anim/MorphTrack.java b/jme3-core/src/main/java/com/jme3/anim/MorphTrack.java new file mode 100644 index 000000000..cd662c11e --- /dev/null +++ b/jme3-core/src/main/java/com/jme3/anim/MorphTrack.java @@ -0,0 +1,219 @@ +/* + * Copyright (c) 2009-2012 jMonkeyEngine + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'jMonkeyEngine' nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package com.jme3.anim; + +import com.jme3.anim.interpolator.FrameInterpolator; +import com.jme3.animation.*; +import com.jme3.export.*; +import com.jme3.scene.Geometry; +import com.jme3.util.clone.Cloner; +import com.jme3.util.clone.JmeCloneable; + +import java.io.IOException; + +/** + * Contains a list of weights and times for each keyframe. + * + * @author Rémy Bouquet + */ +public class MorphTrack implements AnimTrack { + + private double length; + private Geometry target; + + /** + * Weights and times for track. + */ + private float[] weights; + private FrameInterpolator interpolator = FrameInterpolator.DEFAULT; + private float[] times; + private int nbMorphTargets; + + /** + * Serialization-only. Do not use. + */ + public MorphTrack() { + } + + /** + * Creates a morph track with the given Geometry as a target + * + * @param times a float array with the time of each frame + * @param weights the morphs for each frames + */ + public MorphTrack(Geometry target, float[] times, float[] weights, int nbMorphTargets) { + this.target = target; + this.nbMorphTargets = nbMorphTargets; + this.setKeyframes(times, weights); + } + + /** + * return the array of weights of this track + * + * @return + */ + public float[] getWeights() { + return weights; + } + + /** + * returns the arrays of time for this track + * + * @return + */ + public float[] getTimes() { + return times; + } + + /** + * Sets the keyframes times for this Joint track + * + * @param times the keyframes times + */ + public void setTimes(float[] times) { + if (times.length == 0) { + throw new RuntimeException("TransformTrack with no keyframes!"); + } + this.times = times; + length = times[times.length - 1] - times[0]; + } + + + /** + * Set the weight for this morph track + * + * @param times a float array with the time of each frame + * @param weights the weights of the morphs for each frame + + */ + public void setKeyframes(float[] times, float[] weights) { + setTimes(times); + if (weights != null) { + if (times == null) { + throw new RuntimeException("MorphTrack doesn't have any time for key frames, please call setTimes first"); + } + + this.weights = weights; + + assert times != null && times.length == weights.length; + } + } + + @Override + public double getLength() { + return length; + } + + @Override + public void getDataAtTime(double t, float[] store) { + float time = (float) t; + + int lastFrame = times.length - 1; + if (time < 0 || lastFrame == 0) { + if (weights != null) { + System.arraycopy(weights,0,store,0, nbMorphTargets); + } + return; + } + + int startFrame = 0; + int endFrame = 1; + float blend = 0; + if (time >= times[lastFrame]) { + startFrame = lastFrame; + + time = time - times[startFrame] + times[startFrame - 1]; + blend = (time - times[startFrame - 1]) + / (times[startFrame] - times[startFrame - 1]); + + } else { + // use lastFrame so we never overflow the array + int i; + for (i = 0; i < lastFrame && times[i] < time; i++) { + startFrame = i; + endFrame = i + 1; + } + blend = (time - times[startFrame]) + / (times[endFrame] - times[startFrame]); + } + + interpolator.interpolateWeights(blend, startFrame, weights, nbMorphTargets, store); + } + + public void setFrameInterpolator(FrameInterpolator interpolator) { + this.interpolator = interpolator; + } + + public Geometry getTarget() { + return target; + } + + public void setTarget(Geometry target) { + this.target = target; + } + + @Override + public void write(JmeExporter ex) throws IOException { + OutputCapsule oc = ex.getCapsule(this); + oc.write(weights, "weights", null); + oc.write(times, "times", null); + oc.write(target, "target", null); + oc.write(nbMorphTargets, "nbMorphTargets", 0); + } + + @Override + public void read(JmeImporter im) throws IOException { + InputCapsule ic = im.getCapsule(this); + weights = ic.readFloatArray("weights", null); + times = ic.readFloatArray("times", null); + target = (Geometry) ic.readSavable("target", null); + nbMorphTargets = ic.readInt("nbMorphTargets", 0); + setTimes(times); + } + + @Override + public Object jmeClone() { + try { + MorphTrack clone = (MorphTrack) super.clone(); + return clone; + } catch (CloneNotSupportedException ex) { + throw new AssertionError(); + } + } + + @Override + public void cloneFields(Cloner cloner, Object original) { + this.target = cloner.clone(target); + } + + +} diff --git a/jme3-core/src/main/java/com/jme3/anim/SeparateJointModelTransform.java b/jme3-core/src/main/java/com/jme3/anim/SeparateJointModelTransform.java new file mode 100644 index 000000000..c06b97ba4 --- /dev/null +++ b/jme3-core/src/main/java/com/jme3/anim/SeparateJointModelTransform.java @@ -0,0 +1,43 @@ +package com.jme3.anim; + +import com.jme3.anim.util.JointModelTransform; +import com.jme3.math.Matrix4f; +import com.jme3.math.Transform; + +/** + * This JointModelTransform implementation accumulates model transform in a Transform class + * This does NOT support proper non uniform scale in the armature hierarchy. + * But the effect might be useful in some circumstances. + * Note that this is how the old animation system was working, so you might want to use this + * if your model has non uniform scale and was migrated from old j3o model. + */ +public class SeparateJointModelTransform implements JointModelTransform { + + private Transform modelTransform = new Transform(); + + @Override + public void updateModelTransform(Transform localTransform, Joint parent) { + modelTransform.set(localTransform); + if (parent != null) { + modelTransform.combineWithParent(parent.getModelTransform()); + } + } + + public void getOffsetTransform(Matrix4f outTransform, Matrix4f inverseModelBindMatrix) { + modelTransform.toTransformMatrix(outTransform).mult(inverseModelBindMatrix, outTransform); + } + + @Override + public void applyBindPose(Transform localTransform, Matrix4f inverseModelBindMatrix, Joint parent) { + localTransform.fromTransformMatrix(inverseModelBindMatrix.invert()); + if (parent != null) { + localTransform.combineWithParent(parent.getModelTransform().invert()); + } + } + + @Override + public Transform getModelTransform() { + return modelTransform; + } + +} diff --git a/jme3-core/src/main/java/com/jme3/anim/SkinningControl.java b/jme3-core/src/main/java/com/jme3/anim/SkinningControl.java new file mode 100644 index 000000000..097840e81 --- /dev/null +++ b/jme3-core/src/main/java/com/jme3/anim/SkinningControl.java @@ -0,0 +1,744 @@ +/* + * Copyright (c) 2009-2017 jMonkeyEngine + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'jMonkeyEngine' nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package com.jme3.anim; + +import com.jme3.export.*; +import com.jme3.material.MatParamOverride; +import com.jme3.math.FastMath; +import com.jme3.math.Matrix4f; +import com.jme3.renderer.*; +import com.jme3.scene.*; +import com.jme3.scene.VertexBuffer.Type; +import com.jme3.scene.control.AbstractControl; +import com.jme3.scene.mesh.IndexBuffer; +import com.jme3.shader.VarType; +import com.jme3.util.SafeArrayList; +import com.jme3.util.TempVars; +import com.jme3.util.clone.Cloner; +import com.jme3.util.clone.JmeCloneable; + +import java.io.IOException; +import java.nio.Buffer; +import java.nio.FloatBuffer; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * The Skinning control deforms a model according to an armature, It handles the + * computation of the deformation matrices and performs the transformations on + * the mesh + *

+ * It can perform software skinning or Hardware skinning + * + * @author Rémy Bouquet Based on SkeletonControl by Kirill Vainer + */ +public class SkinningControl extends AbstractControl implements Cloneable, JmeCloneable { + + private static final Logger logger = Logger.getLogger(SkinningControl.class.getName()); + + /** + * The armature of the model. + */ + private Armature armature; + + /** + * List of geometries affected by this control. + */ + private SafeArrayList targets = new SafeArrayList<>(Geometry.class); + + /** + * Used to track when a mesh was updated. Meshes are only updated if they + * are visible in at least one camera. + */ + private boolean wasMeshUpdated = false; + + /** + * User wishes to use hardware skinning if available. + */ + private transient boolean hwSkinningDesired = true; + + /** + * Hardware skinning is currently being used. + */ + private transient boolean hwSkinningEnabled = false; + + /** + * Hardware skinning was tested on this GPU, results + * are stored in {@link #hwSkinningSupported} variable. + */ + private transient boolean hwSkinningTested = false; + + /** + * If hardware skinning was {@link #hwSkinningTested tested}, then + * this variable will be set to true if supported, and false if otherwise. + */ + private transient boolean hwSkinningSupported = false; + + /** + * Bone offset matrices, recreated each frame + */ + private transient Matrix4f[] offsetMatrices; + + + private MatParamOverride numberOfJointsParam; + private MatParamOverride jointMatricesParam; + + /** + * Serialization only. Do not use. + */ + public SkinningControl() { + } + + /** + * Creates a armature control. The list of targets will be acquired + * automatically when the control is attached to a node. + * + * @param armature the armature + */ + public SkinningControl(Armature armature) { + if (armature == null) { + throw new IllegalArgumentException("armature cannot be null"); + } + this.armature = armature; + this.numberOfJointsParam = new MatParamOverride(VarType.Int, "NumberOfBones", null); + this.jointMatricesParam = new MatParamOverride(VarType.Matrix4Array, "BoneMatrices", null); + } + + + private void switchToHardware() { + numberOfJointsParam.setEnabled(true); + jointMatricesParam.setEnabled(true); + + // Next full 10 bones (e.g. 30 on 24 bones) + int numBones = ((armature.getJointCount() / 10) + 1) * 10; + numberOfJointsParam.setValue(numBones); + + for (Geometry geometry : targets) { + Mesh mesh = geometry.getMesh(); + if (mesh != null && mesh.isAnimated()) { + mesh.prepareForAnim(false); + } + } + } + + private void switchToSoftware() { + numberOfJointsParam.setEnabled(false); + jointMatricesParam.setEnabled(false); + + for (Geometry geometry : targets) { + Mesh mesh = geometry.getMesh(); + if (mesh != null && mesh.isAnimated()) { + mesh.prepareForAnim(true); + } + } + } + + private boolean testHardwareSupported(RenderManager rm) { + + //Only 255 bones max supported with hardware skinning + if (armature.getJointCount() > 255) { + return false; + } + + switchToHardware(); + + try { + rm.preloadScene(spatial); + return true; + } catch (RendererException e) { + logger.log(Level.WARNING, "Could not enable HW skinning due to shader compile error:", e); + return false; + } + } + + /** + * Specifies if hardware skinning is preferred. If it is preferred and + * supported by GPU, it shall be enabled, if its not preferred, or not + * supported by GPU, then it shall be disabled. + * + * @param preferred + * @see #isHardwareSkinningUsed() + */ + public void setHardwareSkinningPreferred(boolean preferred) { + hwSkinningDesired = preferred; + } + + /** + * @return True if hardware skinning is preferable to software skinning. + * Set to false by default. + * @see #setHardwareSkinningPreferred(boolean) + */ + public boolean isHardwareSkinningPreferred() { + return hwSkinningDesired; + } + + /** + * @return True is hardware skinning is activated and is currently used, false otherwise. + */ + public boolean isHardwareSkinningUsed() { + return hwSkinningEnabled; + } + + + /** + * If specified the geometry has an animated mesh, add its mesh and material + * to the lists of animation targets. + */ + private void findTargets(Geometry geometry) { + Mesh mesh = geometry.getMesh(); + if (mesh != null && mesh.isAnimated()) { + targets.add(geometry); + } + + } + + private void findTargets(Node node) { + for (Spatial child : node.getChildren()) { + if (child instanceof Geometry) { + findTargets((Geometry) child); + } else if (child instanceof Node) { + findTargets((Node) child); + } + } + } + + @Override + public void setSpatial(Spatial spatial) { + Spatial oldSpatial = this.spatial; + super.setSpatial(spatial); + updateTargetsAndMaterials(spatial); + + if (oldSpatial != null) { + oldSpatial.removeMatParamOverride(numberOfJointsParam); + oldSpatial.removeMatParamOverride(jointMatricesParam); + } + + if (spatial != null) { + spatial.removeMatParamOverride(numberOfJointsParam); + spatial.removeMatParamOverride(jointMatricesParam); + spatial.addMatParamOverride(numberOfJointsParam); + spatial.addMatParamOverride(jointMatricesParam); + } + } + + private void controlRenderSoftware() { + resetToBind(); // reset morph meshes to bind pose + + offsetMatrices = armature.computeSkinningMatrices(); + + for (Geometry geometry : targets) { + Mesh mesh = geometry.getMesh(); + // NOTE: This assumes code higher up has + // already ensured this mesh is animated. + // Otherwise a crash will happen in skin update. + softwareSkinUpdate(mesh, offsetMatrices); + } + } + + private void controlRenderHardware() { + offsetMatrices = armature.computeSkinningMatrices(); + jointMatricesParam.setValue(offsetMatrices); + } + + @Override + protected void controlRender(RenderManager rm, ViewPort vp) { + if (!wasMeshUpdated) { + updateTargetsAndMaterials(spatial); + + // Prevent illegal cases. These should never happen. + assert hwSkinningTested || (!hwSkinningTested && !hwSkinningSupported && !hwSkinningEnabled); + assert !hwSkinningEnabled || (hwSkinningEnabled && hwSkinningTested && hwSkinningSupported); + + if (hwSkinningDesired && !hwSkinningTested) { + hwSkinningTested = true; + hwSkinningSupported = testHardwareSupported(rm); + + if (hwSkinningSupported) { + hwSkinningEnabled = true; + + Logger.getLogger(SkinningControl.class.getName()).log(Level.INFO, "Hardware skinning engaged for {0}", spatial); + } else { + switchToSoftware(); + } + } else if (hwSkinningDesired && hwSkinningSupported && !hwSkinningEnabled) { + switchToHardware(); + hwSkinningEnabled = true; + } else if (!hwSkinningDesired && hwSkinningEnabled) { + switchToSoftware(); + hwSkinningEnabled = false; + } + + if (hwSkinningEnabled) { + controlRenderHardware(); + } else { + controlRenderSoftware(); + } + + wasMeshUpdated = true; + } + } + + @Override + protected void controlUpdate(float tpf) { + wasMeshUpdated = false; + armature.update(); + } + + //only do this for software updates + void resetToBind() { + for (Geometry geometry : targets) { + Mesh mesh = geometry.getMesh(); + if (mesh != null && mesh.isAnimated()) { + Buffer bwBuff = mesh.getBuffer(Type.BoneWeight).getData(); + Buffer biBuff = mesh.getBuffer(Type.BoneIndex).getData(); + if (!biBuff.hasArray() || !bwBuff.hasArray()) { + mesh.prepareForAnim(true); // prepare for software animation + } + VertexBuffer bindPos = mesh.getBuffer(Type.BindPosePosition); + VertexBuffer bindNorm = mesh.getBuffer(Type.BindPoseNormal); + VertexBuffer pos = mesh.getBuffer(Type.Position); + VertexBuffer norm = mesh.getBuffer(Type.Normal); + FloatBuffer pb = (FloatBuffer) pos.getData(); + FloatBuffer nb = (FloatBuffer) norm.getData(); + FloatBuffer bpb = (FloatBuffer) bindPos.getData(); + FloatBuffer bnb = (FloatBuffer) bindNorm.getData(); + pb.clear(); + nb.clear(); + bpb.clear(); + bnb.clear(); + + //reseting bind tangents if there is a bind tangent buffer + VertexBuffer bindTangents = mesh.getBuffer(Type.BindPoseTangent); + if (bindTangents != null) { + VertexBuffer tangents = mesh.getBuffer(Type.Tangent); + FloatBuffer tb = (FloatBuffer) tangents.getData(); + FloatBuffer btb = (FloatBuffer) bindTangents.getData(); + tb.clear(); + btb.clear(); + tb.put(btb).clear(); + } + + + pb.put(bpb).clear(); + nb.put(bnb).clear(); + } + } + } + + @Override + public Object jmeClone() { + return super.jmeClone(); + } + + @Override + public void cloneFields(Cloner cloner, Object original) { + super.cloneFields(cloner, original); + + this.armature = cloner.clone(armature); + + // If the targets were cloned then this will clone them. If the targets + // were shared then this will share them. + this.targets = cloner.clone(targets); + + this.numberOfJointsParam = cloner.clone(numberOfJointsParam); + this.jointMatricesParam = cloner.clone(jointMatricesParam); + } + + /** + * Access the attachments node of the named bone. If the bone doesn't + * already have an attachments node, create one and attach it to the scene + * graph. Models and effects attached to the attachments node will follow + * the bone's motions. + * + * @param jointName the name of the joint + * @return the attachments node of the joint + */ + public Node getAttachmentsNode(String jointName) { + Joint b = armature.getJoint(jointName); + if (b == null) { + throw new IllegalArgumentException("Given bone name does not exist " + + "in the armature."); + } + + updateTargetsAndMaterials(spatial); + int boneIndex = armature.getJointIndex(b); + Node n = b.getAttachmentsNode(boneIndex, targets); + /* + * Select a node to parent the attachments node. + */ + Node parent; + if (spatial instanceof Node) { + parent = (Node) spatial; // the usual case + } else { + parent = spatial.getParent(); + } + parent.attachChild(n); + + return n; + } + + /** + * returns the armature of this control + * + * @return + */ + public Armature getArmature() { + return armature; + } + + /** + * Enumerate the target meshes of this control. + * + * @return a new array + */ + public Mesh[] getTargets() { + Mesh[] result = new Mesh[targets.size()]; + int i = 0; + for (Geometry geometry : targets) { + Mesh mesh = geometry.getMesh(); + result[i] = mesh; + i++; + } + + return result; + } + + /** + * Update the mesh according to the given transformation matrices + * + * @param mesh then mesh + * @param offsetMatrices the transformation matrices to apply + */ + private void softwareSkinUpdate(Mesh mesh, Matrix4f[] offsetMatrices) { + + VertexBuffer tb = mesh.getBuffer(Type.Tangent); + if (tb == null) { + //if there are no tangents use the classic skinning + applySkinning(mesh, offsetMatrices); + } else { + //if there are tangents use the skinning with tangents + applySkinningTangents(mesh, offsetMatrices, tb); + } + + + } + + /** + * Method to apply skinning transforms to a mesh's buffers + * + * @param mesh the mesh + * @param offsetMatrices the offset matices to apply + */ + private void applySkinning(Mesh mesh, Matrix4f[] offsetMatrices) { + int maxWeightsPerVert = mesh.getMaxNumWeights(); + if (maxWeightsPerVert <= 0) { + throw new IllegalStateException("Max weights per vert is incorrectly set!"); + } + int fourMinusMaxWeights = 4 - maxWeightsPerVert; + + // NOTE: This code assumes the vertex buffer is in bind pose + // resetToBind() has been called this frame + VertexBuffer vb = mesh.getBuffer(Type.Position); + FloatBuffer fvb = (FloatBuffer) vb.getData(); + fvb.rewind(); + + VertexBuffer nb = mesh.getBuffer(Type.Normal); + FloatBuffer fnb = (FloatBuffer) nb.getData(); + fnb.rewind(); + + // get boneIndexes and weights for mesh + IndexBuffer ib = IndexBuffer.wrapIndexBuffer(mesh.getBuffer(Type.BoneIndex).getData()); + FloatBuffer wb = (FloatBuffer) mesh.getBuffer(Type.BoneWeight).getData(); + + wb.rewind(); + + float[] weights = wb.array(); + int idxWeights = 0; + + TempVars vars = TempVars.get(); + + float[] posBuf = vars.skinPositions; + float[] normBuf = vars.skinNormals; + + int iterations = (int) FastMath.ceil(fvb.limit() / ((float) posBuf.length)); + int bufLength = posBuf.length; + for (int i = iterations - 1; i >= 0; i--) { + // read next set of positions and normals from native buffer + bufLength = Math.min(posBuf.length, fvb.remaining()); + fvb.get(posBuf, 0, bufLength); + fnb.get(normBuf, 0, bufLength); + int verts = bufLength / 3; + int idxPositions = 0; + + // iterate vertices and apply skinning transform for each effecting bone + for (int vert = verts - 1; vert >= 0; vert--) { + // Skip this vertex if the first weight is zero. + if (weights[idxWeights] == 0) { + idxPositions += 3; + idxWeights += 4; + continue; + } + + float nmx = normBuf[idxPositions]; + float vtx = posBuf[idxPositions++]; + float nmy = normBuf[idxPositions]; + float vty = posBuf[idxPositions++]; + float nmz = normBuf[idxPositions]; + float vtz = posBuf[idxPositions++]; + + float rx = 0, ry = 0, rz = 0, rnx = 0, rny = 0, rnz = 0; + + for (int w = maxWeightsPerVert - 1; w >= 0; w--) { + float weight = weights[idxWeights]; + Matrix4f mat = offsetMatrices[ib.get(idxWeights++)]; + + rx += (mat.m00 * vtx + mat.m01 * vty + mat.m02 * vtz + mat.m03) * weight; + ry += (mat.m10 * vtx + mat.m11 * vty + mat.m12 * vtz + mat.m13) * weight; + rz += (mat.m20 * vtx + mat.m21 * vty + mat.m22 * vtz + mat.m23) * weight; + + rnx += (nmx * mat.m00 + nmy * mat.m01 + nmz * mat.m02) * weight; + rny += (nmx * mat.m10 + nmy * mat.m11 + nmz * mat.m12) * weight; + rnz += (nmx * mat.m20 + nmy * mat.m21 + nmz * mat.m22) * weight; + } + + idxWeights += fourMinusMaxWeights; + + idxPositions -= 3; + normBuf[idxPositions] = rnx; + posBuf[idxPositions++] = rx; + normBuf[idxPositions] = rny; + posBuf[idxPositions++] = ry; + normBuf[idxPositions] = rnz; + posBuf[idxPositions++] = rz; + } + + fvb.position(fvb.position() - bufLength); + fvb.put(posBuf, 0, bufLength); + fnb.position(fnb.position() - bufLength); + fnb.put(normBuf, 0, bufLength); + } + + vars.release(); + + vb.updateData(fvb); + nb.updateData(fnb); + + } + + /** + * Specific method for skinning with tangents to avoid cluttering the + * classic skinning calculation with null checks that would slow down the + * process even if tangents don't have to be computed. Also the iteration + * has additional indexes since tangent has 4 components instead of 3 for + * pos and norm + * + * @param mesh the mesh + * @param offsetMatrices the offsetMatrices to apply + * @param tb the tangent vertexBuffer + */ + private void applySkinningTangents(Mesh mesh, Matrix4f[] offsetMatrices, VertexBuffer tb) { + int maxWeightsPerVert = mesh.getMaxNumWeights(); + + if (maxWeightsPerVert <= 0) { + throw new IllegalStateException("Max weights per vert is incorrectly set!"); + } + + int fourMinusMaxWeights = 4 - maxWeightsPerVert; + + // NOTE: This code assumes the vertex buffer is in bind pose + // resetToBind() has been called this frame + VertexBuffer vb = mesh.getBuffer(Type.Position); + FloatBuffer fvb = (FloatBuffer) vb.getData(); + fvb.rewind(); + + VertexBuffer nb = mesh.getBuffer(Type.Normal); + + FloatBuffer fnb = (FloatBuffer) nb.getData(); + fnb.rewind(); + + + FloatBuffer ftb = (FloatBuffer) tb.getData(); + ftb.rewind(); + + + // get boneIndexes and weights for mesh + IndexBuffer ib = IndexBuffer.wrapIndexBuffer(mesh.getBuffer(Type.BoneIndex).getData()); + FloatBuffer wb = (FloatBuffer) mesh.getBuffer(Type.BoneWeight).getData(); + + wb.rewind(); + + float[] weights = wb.array(); + int idxWeights = 0; + + TempVars vars = TempVars.get(); + + + float[] posBuf = vars.skinPositions; + float[] normBuf = vars.skinNormals; + float[] tanBuf = vars.skinTangents; + + int iterations = (int) FastMath.ceil(fvb.limit() / ((float) posBuf.length)); + int bufLength = 0; + int tanLength = 0; + for (int i = iterations - 1; i >= 0; i--) { + // read next set of positions and normals from native buffer + bufLength = Math.min(posBuf.length, fvb.remaining()); + tanLength = Math.min(tanBuf.length, ftb.remaining()); + fvb.get(posBuf, 0, bufLength); + fnb.get(normBuf, 0, bufLength); + ftb.get(tanBuf, 0, tanLength); + int verts = bufLength / 3; + int idxPositions = 0; + //tangents has their own index because of the 4 components + int idxTangents = 0; + + // iterate vertices and apply skinning transform for each effecting bone + for (int vert = verts - 1; vert >= 0; vert--) { + // Skip this vertex if the first weight is zero. + if (weights[idxWeights] == 0) { + idxTangents += 4; + idxPositions += 3; + idxWeights += 4; + continue; + } + + float nmx = normBuf[idxPositions]; + float vtx = posBuf[idxPositions++]; + float nmy = normBuf[idxPositions]; + float vty = posBuf[idxPositions++]; + float nmz = normBuf[idxPositions]; + float vtz = posBuf[idxPositions++]; + + float tnx = tanBuf[idxTangents++]; + float tny = tanBuf[idxTangents++]; + float tnz = tanBuf[idxTangents++]; + + // skipping the 4th component of the tangent since it doesn't have to be transformed + idxTangents++; + + float rx = 0, ry = 0, rz = 0, rnx = 0, rny = 0, rnz = 0, rtx = 0, rty = 0, rtz = 0; + + for (int w = maxWeightsPerVert - 1; w >= 0; w--) { + float weight = weights[idxWeights]; + Matrix4f mat = offsetMatrices[ib.get(idxWeights++)]; + + rx += (mat.m00 * vtx + mat.m01 * vty + mat.m02 * vtz + mat.m03) * weight; + ry += (mat.m10 * vtx + mat.m11 * vty + mat.m12 * vtz + mat.m13) * weight; + rz += (mat.m20 * vtx + mat.m21 * vty + mat.m22 * vtz + mat.m23) * weight; + + rnx += (nmx * mat.m00 + nmy * mat.m01 + nmz * mat.m02) * weight; + rny += (nmx * mat.m10 + nmy * mat.m11 + nmz * mat.m12) * weight; + rnz += (nmx * mat.m20 + nmy * mat.m21 + nmz * mat.m22) * weight; + + rtx += (tnx * mat.m00 + tny * mat.m01 + tnz * mat.m02) * weight; + rty += (tnx * mat.m10 + tny * mat.m11 + tnz * mat.m12) * weight; + rtz += (tnx * mat.m20 + tny * mat.m21 + tnz * mat.m22) * weight; + } + + idxWeights += fourMinusMaxWeights; + + idxPositions -= 3; + + normBuf[idxPositions] = rnx; + posBuf[idxPositions++] = rx; + normBuf[idxPositions] = rny; + posBuf[idxPositions++] = ry; + normBuf[idxPositions] = rnz; + posBuf[idxPositions++] = rz; + + idxTangents -= 4; + + tanBuf[idxTangents++] = rtx; + tanBuf[idxTangents++] = rty; + tanBuf[idxTangents++] = rtz; + + //once again skipping the 4th component of the tangent + idxTangents++; + } + + fvb.position(fvb.position() - bufLength); + fvb.put(posBuf, 0, bufLength); + fnb.position(fnb.position() - bufLength); + fnb.put(normBuf, 0, bufLength); + ftb.position(ftb.position() - tanLength); + ftb.put(tanBuf, 0, tanLength); + } + + vars.release(); + + vb.updateData(fvb); + nb.updateData(fnb); + tb.updateData(ftb); + } + + @Override + public void write(JmeExporter ex) throws IOException { + super.write(ex); + OutputCapsule oc = ex.getCapsule(this); + oc.write(armature, "armature", null); + + oc.write(numberOfJointsParam, "numberOfBonesParam", null); + oc.write(jointMatricesParam, "boneMatricesParam", null); + } + + @Override + public void read(JmeImporter im) throws IOException { + super.read(im); + InputCapsule in = im.getCapsule(this); + armature = (Armature) in.readSavable("armature", null); + + numberOfJointsParam = (MatParamOverride) in.readSavable("numberOfBonesParam", null); + jointMatricesParam = (MatParamOverride) in.readSavable("boneMatricesParam", null); + + if (numberOfJointsParam == null) { + numberOfJointsParam = new MatParamOverride(VarType.Int, "NumberOfBones", null); + jointMatricesParam = new MatParamOverride(VarType.Matrix4Array, "BoneMatrices", null); + getSpatial().addMatParamOverride(numberOfJointsParam); + getSpatial().addMatParamOverride(jointMatricesParam); + } + } + + /** + * Update the lists of animation targets. + * + * @param spatial the controlled spatial + */ + private void updateTargetsAndMaterials(Spatial spatial) { + targets.clear(); + + if (spatial instanceof Node) { + findTargets((Node) spatial); + } else if (spatial instanceof Geometry) { + findTargets((Geometry) spatial); + } + } +} diff --git a/jme3-core/src/main/java/com/jme3/anim/TransformTrack.java b/jme3-core/src/main/java/com/jme3/anim/TransformTrack.java new file mode 100644 index 000000000..dee2aefb9 --- /dev/null +++ b/jme3-core/src/main/java/com/jme3/anim/TransformTrack.java @@ -0,0 +1,315 @@ +/* + * Copyright (c) 2009-2012 jMonkeyEngine + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'jMonkeyEngine' nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package com.jme3.anim; + +import com.jme3.anim.interpolator.FrameInterpolator; +import com.jme3.anim.tween.Tween; +import com.jme3.anim.util.HasLocalTransform; +import com.jme3.animation.CompactQuaternionArray; +import com.jme3.animation.CompactVector3Array; +import com.jme3.export.*; +import com.jme3.math.*; +import com.jme3.util.clone.Cloner; +import com.jme3.util.clone.JmeCloneable; + +import java.io.IOException; + +/** + * Contains a list of transforms and times for each keyframe. + * + * @author Rémy Bouquet + */ +public class TransformTrack implements AnimTrack { + + private double length; + private HasLocalTransform target; + + /** + * Transforms and times for track. + */ + private CompactVector3Array translations; + private CompactQuaternionArray rotations; + private CompactVector3Array scales; + private FrameInterpolator interpolator = FrameInterpolator.DEFAULT; + private float[] times; + + /** + * Serialization-only. Do not use. + */ + public TransformTrack() { + } + + /** + * Creates a transform track for the given bone index + * + * @param times a float array with the time of each frame + * @param translations the translation of the bone for each frame + * @param rotations the rotation of the bone for each frame + * @param scales the scale of the bone for each frame + */ + public TransformTrack(HasLocalTransform target, float[] times, Vector3f[] translations, Quaternion[] rotations, Vector3f[] scales) { + this.target = target; + this.setKeyframes(times, translations, rotations, scales); + } + + /** + * return the array of rotations of this track + * + * @return + */ + public Quaternion[] getRotations() { + return rotations.toObjectArray(); + } + + /** + * returns the array of scales for this track + * + * @return + */ + public Vector3f[] getScales() { + return scales == null ? null : scales.toObjectArray(); + } + + /** + * returns the arrays of time for this track + * + * @return + */ + public float[] getTimes() { + return times; + } + + /** + * returns the array of translations of this track + * + * @return + */ + public Vector3f[] getTranslations() { + return translations.toObjectArray(); + } + + + /** + * Sets the keyframes times for this Joint track + * + * @param times the keyframes times + */ + public void setTimes(float[] times) { + if (times.length == 0) { + throw new RuntimeException("TransformTrack with no keyframes!"); + } + this.times = times; + length = times[times.length - 1] - times[0]; + } + + /** + * Set the translations for this joint track + * + * @param translations the translation of the bone for each frame + */ + public void setKeyframesTranslation(Vector3f[] translations) { + if (times == null) { + throw new RuntimeException("TransformTrack doesn't have any time for key frames, please call setTimes first"); + } + if (translations.length == 0) { + throw new RuntimeException("TransformTrack with no translation keyframes!"); + } + this.translations = new CompactVector3Array(); + this.translations.add(translations); + this.translations.freeze(); + + assert times != null && times.length == translations.length; + } + + /** + * Set the scales for this joint track + * + * @param scales the scales of the bone for each frame + */ + public void setKeyframesScale(Vector3f[] scales) { + if (times == null) { + throw new RuntimeException("TransformTrack doesn't have any time for key frames, please call setTimes first"); + } + if (scales.length == 0) { + throw new RuntimeException("TransformTrack with no scale keyframes!"); + } + this.scales = new CompactVector3Array(); + this.scales.add(scales); + this.scales.freeze(); + + assert times != null && times.length == scales.length; + } + + /** + * Set the rotations for this joint track + * + * @param rotations the rotations of the bone for each frame + */ + public void setKeyframesRotation(Quaternion[] rotations) { + if (times == null) { + throw new RuntimeException("TransformTrack doesn't have any time for key frames, please call setTimes first"); + } + if (rotations.length == 0) { + throw new RuntimeException("TransformTrack with no rotation keyframes!"); + } + this.rotations = new CompactQuaternionArray(); + this.rotations.add(rotations); + this.rotations.freeze(); + + assert times != null && times.length == rotations.length; + } + + + /** + * Set the translations, rotations and scales for this bone track + * + * @param times a float array with the time of each frame + * @param translations the translation of the bone for each frame + * @param rotations the rotation of the bone for each frame + * @param scales the scale of the bone for each frame + */ + public void setKeyframes(float[] times, Vector3f[] translations, Quaternion[] rotations, Vector3f[] scales) { + setTimes(times); + if (translations != null) { + setKeyframesTranslation(translations); + } + if (rotations != null) { + setKeyframesRotation(rotations); + } + if (scales != null) { + setKeyframesScale(scales); + } + } + + public double getLength() { + return length; + } + + public void getDataAtTime(double t, Transform transform) { + float time = (float) t; + + int lastFrame = times.length - 1; + if (time < 0 || lastFrame == 0) { + if (translations != null) { + translations.get(0, transform.getTranslation()); + } + if (rotations != null) { + rotations.get(0, transform.getRotation()); + } + if (scales != null) { + scales.get(0, transform.getScale()); + } + return; + } + + int startFrame = 0; + int endFrame = 1; + float blend = 0; + if (time >= times[lastFrame]) { + startFrame = lastFrame; + + time = time - times[startFrame] + times[startFrame - 1]; + blend = (time - times[startFrame - 1]) + / (times[startFrame] - times[startFrame - 1]); + + } else { + // use lastFrame so we never overflow the array + int i; + for (i = 0; i < lastFrame && times[i] < time; i++) { + startFrame = i; + endFrame = i + 1; + } + blend = (time - times[startFrame]) + / (times[endFrame] - times[startFrame]); + } + + Transform interpolated = interpolator.interpolate(blend, startFrame, translations, rotations, scales, times); + + if (translations != null) { + transform.setTranslation(interpolated.getTranslation()); + } + if (rotations != null) { + transform.setRotation(interpolated.getRotation()); + } + if (scales != null) { + transform.setScale(interpolated.getScale()); + } + } + + public void setFrameInterpolator(FrameInterpolator interpolator) { + this.interpolator = interpolator; + } + + public HasLocalTransform getTarget() { + return target; + } + + public void setTarget(HasLocalTransform target) { + this.target = target; + } + + @Override + public void write(JmeExporter ex) throws IOException { + OutputCapsule oc = ex.getCapsule(this); + oc.write(translations, "translations", null); + oc.write(rotations, "rotations", null); + oc.write(times, "times", null); + oc.write(scales, "scales", null); + oc.write(target, "target", null); + } + + @Override + public void read(JmeImporter im) throws IOException { + InputCapsule ic = im.getCapsule(this); + translations = (CompactVector3Array) ic.readSavable("translations", null); + rotations = (CompactQuaternionArray) ic.readSavable("rotations", null); + times = ic.readFloatArray("times", null); + scales = (CompactVector3Array) ic.readSavable("scales", null); + target = (HasLocalTransform) ic.readSavable("target", null); + setTimes(times); + } + + @Override + public Object jmeClone() { + try { + TransformTrack clone = (TransformTrack) super.clone(); + return clone; + } catch (CloneNotSupportedException ex) { + throw new AssertionError(); + } + } + + @Override + public void cloneFields(Cloner cloner, Object original) { + this.target = cloner.clone(target); + } +} diff --git a/jme3-core/src/main/java/com/jme3/anim/Weights.java b/jme3-core/src/main/java/com/jme3/anim/Weights.java new file mode 100644 index 000000000..8ac9b5b4d --- /dev/null +++ b/jme3-core/src/main/java/com/jme3/anim/Weights.java @@ -0,0 +1,95 @@ +package com.jme3.anim; + +import java.util.ArrayList; + +public class Weights {//} extends Savable, JmeCloneable{ + + + private final static float MIN_WEIGHT = 0.005f; + + private int[] indices; + private float[] data; + private int size; + + public Weights(float[] array, int start, int length) { + ArrayList list = new ArrayList<>(); + ArrayList idx = new ArrayList<>(); + + for (int i = start; i < length; i++) { + float val = array[i]; + if (val > MIN_WEIGHT) { + list.add(val); + idx.add(i); + } + } + size = list.size(); + data = new float[size]; + indices = new int[size]; + for (int i = 0; i < size; i++) { + data[i] = list.get(i); + indices[i] = idx.get(i); + } + } + + public int getSize() { + return size; + } + + // public Weights(float[] array, int start, int length) { +// LinkedList list = new LinkedList<>(); +// LinkedList idx = new LinkedList<>(); +// for (int i = start; i < length; i++) { +// float val = array[i]; +// if (val > MIN_WEIGHT) { +// int index = insert(list, val); +// if (idx.size() < index) { +// idx.add(i); +// } else { +// idx.add(index, i); +// } +// } +// } +// data = new float[list.size()]; +// for (int i = 0; i < data.length; i++) { +// data[i] = list.get(i); +// } +// +// indices = new int[idx.size()]; +// for (int i = 0; i < indices.length; i++) { +// indices[i] = idx.get(i); +// } +// } +// +// private int insert(LinkedList list, float value) { +// for (int i = 0; i < list.size(); i++) { +// float w = list.get(i); +// if (value > w) { +// list.add(i, value); +// return i; +// } +// } +// +// list.add(value); +// return list.size(); +// } + + @Override + public String toString() { + StringBuilder b = new StringBuilder(); + for (int i = 0; i < indices.length; i++) { + b.append(indices[i]).append(","); + } + b.append("\n"); + for (int i = 0; i < data.length; i++) { + b.append(data[i]).append(","); + } + return b.toString(); + } + + public static void main(String... args) { + // 6 7 4 8 + float values[] = {0, 0, 0, 0, 0.5f, 0.001f, 0.7f, 0.6f, 0.2f, 0, 0, 0}; + Weights w = new Weights(values, 0, values.length); + System.err.println(w); + } +} diff --git a/jme3-core/src/main/java/com/jme3/anim/interpolator/AnimInterpolator.java b/jme3-core/src/main/java/com/jme3/anim/interpolator/AnimInterpolator.java new file mode 100644 index 000000000..a924a9d28 --- /dev/null +++ b/jme3-core/src/main/java/com/jme3/anim/interpolator/AnimInterpolator.java @@ -0,0 +1,13 @@ +package com.jme3.anim.interpolator; + +import static com.jme3.anim.interpolator.FrameInterpolator.TrackDataReader; +import static com.jme3.anim.interpolator.FrameInterpolator.TrackTimeReader; + +/** + * Created by nehon on 15/04/17. + */ +public abstract class AnimInterpolator { + + public abstract T interpolate(float t, int currentIndex, TrackDataReader data, TrackTimeReader times, T store); + +} diff --git a/jme3-core/src/main/java/com/jme3/anim/interpolator/AnimInterpolators.java b/jme3-core/src/main/java/com/jme3/anim/interpolator/AnimInterpolators.java new file mode 100644 index 000000000..5f8b5f304 --- /dev/null +++ b/jme3-core/src/main/java/com/jme3/anim/interpolator/AnimInterpolators.java @@ -0,0 +1,149 @@ +package com.jme3.anim.interpolator; + +import com.jme3.math.*; + +import static com.jme3.anim.interpolator.FrameInterpolator.TrackDataReader; +import static com.jme3.anim.interpolator.FrameInterpolator.TrackTimeReader; + +/** + * Created by nehon on 15/04/17. + */ +public class AnimInterpolators { + + //Rotation interpolators + + public static final AnimInterpolator NLerp = new AnimInterpolator() { + private Quaternion next = new Quaternion(); + + @Override + public Quaternion interpolate(float t, int currentIndex, TrackDataReader data, TrackTimeReader times, Quaternion store) { + data.getEntryClamp(currentIndex, store); + data.getEntryClamp(currentIndex + 1, next); + store.nlerp(next, t); + return store; + } + }; + + public static final AnimInterpolator SLerp = new AnimInterpolator() { + private Quaternion next = new Quaternion(); + + @Override + public Quaternion interpolate(float t, int currentIndex, TrackDataReader data, TrackTimeReader times, Quaternion store) { + data.getEntryClamp(currentIndex, store); + data.getEntryClamp(currentIndex + 1, next); + //MathUtils.slerpNoInvert(store, next, t, store); + MathUtils.slerp(store, next, t, store); + return store; + } + }; + + public static final AnimInterpolator SQuad = new AnimInterpolator() { + private Quaternion a = new Quaternion(); + private Quaternion b = new Quaternion(); + + private Quaternion q0 = new Quaternion(); + private Quaternion q1 = new Quaternion(); + private Quaternion q2 = new Quaternion(); + private Quaternion q3 = new Quaternion(); + + @Override + public Quaternion interpolate(float t, int currentIndex, TrackDataReader data, TrackTimeReader times, Quaternion store) { + data.getEntryModSkip(currentIndex - 1, q0); + data.getEntryModSkip(currentIndex, q1); + data.getEntryModSkip(currentIndex + 1, q2); + data.getEntryModSkip(currentIndex + 2, q3); + MathUtils.squad(q0, q1, q2, q3, a, b, t, store); + return store; + } + }; + + //Position / Scale interpolators + public static final AnimInterpolator LinearVec3f = new AnimInterpolator() { + private Vector3f next = new Vector3f(); + + @Override + public Vector3f interpolate(float t, int currentIndex, TrackDataReader data, TrackTimeReader times, Vector3f store) { + data.getEntryClamp(currentIndex, store); + data.getEntryClamp(currentIndex + 1, next); + store.interpolateLocal(next, t); + return store; + } + }; + /** + * CatmullRom interpolation + */ + public static final CatmullRomInterpolator CatmullRom = new CatmullRomInterpolator(); + + public static class CatmullRomInterpolator extends AnimInterpolator { + private Vector3f p0 = new Vector3f(); + private Vector3f p1 = new Vector3f(); + private Vector3f p2 = new Vector3f(); + private Vector3f p3 = new Vector3f(); + private float tension = 0.7f; + + public CatmullRomInterpolator(float tension) { + this.tension = tension; + } + + public CatmullRomInterpolator() { + } + + @Override + public Vector3f interpolate(float t, int currentIndex, TrackDataReader data, TrackTimeReader times, Vector3f store) { + data.getEntryModSkip(currentIndex - 1, p0); + data.getEntryModSkip(currentIndex, p1); + data.getEntryModSkip(currentIndex + 1, p2); + data.getEntryModSkip(currentIndex + 2, p3); + + FastMath.interpolateCatmullRom(t, tension, p0, p1, p2, p3, store); + return store; + } + } + + //Time Interpolators + + public static class TimeInterpolator extends AnimInterpolator { + private EaseFunction ease; + + public TimeInterpolator(EaseFunction ease) { + this.ease = ease; + } + + @Override + public Float interpolate(float t, int currentIndex, TrackDataReader data, TrackTimeReader times, Float store) { + return ease.apply(t); + } + } + + //in + public static final TimeInterpolator easeInQuad = new TimeInterpolator(Easing.inQuad); + public static final TimeInterpolator easeInCubic = new TimeInterpolator(Easing.inCubic); + public static final TimeInterpolator easeInQuart = new TimeInterpolator(Easing.inQuart); + public static final TimeInterpolator easeInQuint = new TimeInterpolator(Easing.inQuint); + public static final TimeInterpolator easeInBounce = new TimeInterpolator(Easing.inBounce); + public static final TimeInterpolator easeInElastic = new TimeInterpolator(Easing.inElastic); + + //out + public static final TimeInterpolator easeOutQuad = new TimeInterpolator(Easing.outQuad); + public static final TimeInterpolator easeOutCubic = new TimeInterpolator(Easing.outCubic); + public static final TimeInterpolator easeOutQuart = new TimeInterpolator(Easing.outQuart); + public static final TimeInterpolator easeOutQuint = new TimeInterpolator(Easing.outQuint); + public static final TimeInterpolator easeOutBounce = new TimeInterpolator(Easing.outBounce); + public static final TimeInterpolator easeOutElastic = new TimeInterpolator(Easing.outElastic); + + //inout + public static final TimeInterpolator easeInOutQuad = new TimeInterpolator(Easing.inOutQuad); + public static final TimeInterpolator easeInOutCubic = new TimeInterpolator(Easing.inOutCubic); + public static final TimeInterpolator easeInOutQuart = new TimeInterpolator(Easing.inOutQuart); + public static final TimeInterpolator easeInOutQuint = new TimeInterpolator(Easing.inOutQuint); + public static final TimeInterpolator easeInOutBounce = new TimeInterpolator(Easing.inOutBounce); + public static final TimeInterpolator easeInOutElastic = new TimeInterpolator(Easing.inOutElastic); + + //extra + public static final TimeInterpolator smoothStep = new TimeInterpolator(Easing.smoothStep); + public static final TimeInterpolator smootherStep = new TimeInterpolator(Easing.smootherStep); + + public static final TimeInterpolator constant = new TimeInterpolator(Easing.constant); + + +} diff --git a/jme3-core/src/main/java/com/jme3/anim/interpolator/FrameInterpolator.java b/jme3-core/src/main/java/com/jme3/anim/interpolator/FrameInterpolator.java new file mode 100644 index 000000000..9577107a8 --- /dev/null +++ b/jme3-core/src/main/java/com/jme3/anim/interpolator/FrameInterpolator.java @@ -0,0 +1,136 @@ +package com.jme3.anim.interpolator; + +import com.jme3.animation.*; +import com.jme3.math.*; + +/** + * Created by nehon on 15/04/17. + */ +public class FrameInterpolator { + + public static final FrameInterpolator DEFAULT = new FrameInterpolator(); + + private AnimInterpolator timeInterpolator; + private AnimInterpolator translationInterpolator = AnimInterpolators.LinearVec3f; + private AnimInterpolator rotationInterpolator = AnimInterpolators.NLerp; + private AnimInterpolator scaleInterpolator = AnimInterpolators.LinearVec3f; + + private TrackDataReader translationReader = new TrackDataReader<>(); + private TrackDataReader rotationReader = new TrackDataReader<>(); + private TrackDataReader scaleReader = new TrackDataReader<>(); + private TrackTimeReader timesReader = new TrackTimeReader(); + + + private Transform transforms = new Transform(); + + public Transform interpolate(float t, int currentIndex, CompactVector3Array translations, CompactQuaternionArray rotations, CompactVector3Array scales, float[] times){ + timesReader.setData(times); + if( timeInterpolator != null){ + t = timeInterpolator.interpolate(t,currentIndex, null, timesReader, null ); + } + if(translations != null) { + translationReader.setData(translations); + translationInterpolator.interpolate(t, currentIndex, translationReader, timesReader, transforms.getTranslation()); + } + if(rotations != null) { + rotationReader.setData(rotations); + rotationInterpolator.interpolate(t, currentIndex, rotationReader, timesReader, transforms.getRotation()); + } + if(scales != null){ + scaleReader.setData(scales); + scaleInterpolator.interpolate(t, currentIndex, scaleReader, timesReader, transforms.getScale()); + } + return transforms; + } + + public void interpolateWeights(float t, int currentIndex, float[] weights, int nbMorphTargets, float[] store) { + int start = currentIndex * nbMorphTargets; + for (int i = 0; i < nbMorphTargets; i++) { + int current = start + i; + int next = current + nbMorphTargets; + if (next >= weights.length) { + next = current; + } + + float val = FastMath.interpolateLinear(t, weights[current], weights[next]); + store[i] = val; + } + } + + public void setTimeInterpolator(AnimInterpolator timeInterpolator) { + this.timeInterpolator = timeInterpolator; + } + + public void setTranslationInterpolator(AnimInterpolator translationInterpolator) { + this.translationInterpolator = translationInterpolator; + } + + public void setRotationInterpolator(AnimInterpolator rotationInterpolator) { + this.rotationInterpolator = rotationInterpolator; + } + + public void setScaleInterpolator(AnimInterpolator scaleInterpolator) { + this.scaleInterpolator = scaleInterpolator; + } + + + public static class TrackTimeReader { + private float[] data; + + protected void setData(float[] data) { + this.data = data; + } + + public float getEntry(int index) { + return data[mod(index, data.length)]; + } + + public int getLength() { + return data.length; + } + } + + public static class TrackDataReader { + + private CompactArray data; + + protected void setData(CompactArray data) { + this.data = data; + } + + public T getEntryMod(int index, T store) { + return data.get(mod(index, data.getTotalObjectSize()), store); + } + + public T getEntryClamp(int index, T store) { + index = (int) FastMath.clamp(index, 0, data.getTotalObjectSize() - 1); + return data.get(index, store); + } + + public T getEntryModSkip(int index, T store) { + int total = data.getTotalObjectSize(); + if (index == -1) { + index--; + } else if (index >= total) { + index++; + } + + index = mod(index, total); + + + return data.get(index, store); + } + } + + /** + * Euclidean modulo (cycle on 0,n instead of -n,0; 0,n) + * + * @param val + * @param n + * @return + */ + private static int mod(int val, int n) { + return ((val % n) + n) % n; + } + +} diff --git a/jme3-core/src/main/java/com/jme3/anim/tween/AbstractTween.java b/jme3-core/src/main/java/com/jme3/anim/tween/AbstractTween.java new file mode 100644 index 000000000..272ec8dae --- /dev/null +++ b/jme3-core/src/main/java/com/jme3/anim/tween/AbstractTween.java @@ -0,0 +1,97 @@ +/* + * $Id$ + * + * Copyright (c) 2015, Simsilica, LLC + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package com.jme3.anim.tween; + + +import com.jme3.export.*; + +import java.io.IOException; + +/** + * Base implementation of the Tween interface that provides + * default implementations of the getLength() and interopolate() + * methods that provide common tween clamping and bounds checking. + * Subclasses need only override the doInterpolate() method and + * the rest is handled for them. + * + * @author Paul Speed + */ +public abstract class AbstractTween implements Tween { + + private double length; + + protected AbstractTween(double length) { + this.length = length; + } + + @Override + public double getLength() { + return length; + } + + public void setLength(double length) { + this.length = length; + } + + /** + * Default implementation clamps the time value, converts + * it to 0 to 1.0 based on getLength(), and calls doInterpolate(). + */ + @Override + public boolean interpolate(double t) { + if (t < 0) { + return true; + } + + // Scale t to be between 0 and 1 for our length + if (length == 0) { + t = 1; + } else { + t = t / length; + } + + boolean done = false; + if (t >= 1.0) { + t = 1.0; + done = true; + } + doInterpolate(t); + return !done; + } + + protected abstract void doInterpolate(double t); +} diff --git a/jme3-core/src/main/java/com/jme3/anim/tween/ContainsTweens.java b/jme3-core/src/main/java/com/jme3/anim/tween/ContainsTweens.java new file mode 100644 index 000000000..b7fe69bfc --- /dev/null +++ b/jme3-core/src/main/java/com/jme3/anim/tween/ContainsTweens.java @@ -0,0 +1,6 @@ +package com.jme3.anim.tween; + +public interface ContainsTweens { + + public Tween[] getTweens(); +} diff --git a/jme3-core/src/main/java/com/jme3/anim/tween/Tween.java b/jme3-core/src/main/java/com/jme3/anim/tween/Tween.java new file mode 100644 index 000000000..9ed4752c8 --- /dev/null +++ b/jme3-core/src/main/java/com/jme3/anim/tween/Tween.java @@ -0,0 +1,71 @@ +/* + * $Id$ + * + * Copyright (c) 2015, Simsilica, LLC + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package com.jme3.anim.tween; + + +import com.jme3.export.Savable; + +/** + * Represents some action that interpolates across input between 0 + * and some length value. (For example, movement, rotation, fading.) + * It's also possible to have zero length 'instant' tweens. + * + * @author Paul Speed + */ +public interface Tween extends Cloneable { + + /** + * Returns the length of the tween. If 't' represents time in + * seconds then this is the notional time in seconds that the tween + * will run. Note: all of the caveats are because tweens may be + * externally scaled in such a way that 't' no longer represents + * actual time. + */ + public double getLength(); + + /** + * Sets the implementation specific interpolation to the + * specified 'tween' value as a value in the range from 0 to + * getLength(). If the value is greater or equal to getLength() + * then it is internally clamped and the method returns false. + * If 't' is still in the tween's range then this method returns + * true. + */ + public boolean interpolate(double t); + +} + diff --git a/jme3-core/src/main/java/com/jme3/anim/tween/Tweens.java b/jme3-core/src/main/java/com/jme3/anim/tween/Tweens.java new file mode 100644 index 000000000..54ff3986b --- /dev/null +++ b/jme3-core/src/main/java/com/jme3/anim/tween/Tweens.java @@ -0,0 +1,619 @@ +/* + * $Id$ + * + * Copyright (c) 2015, Simsilica, LLC + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package com.jme3.anim.tween; + +import com.jme3.anim.util.Primitives; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.Objects; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * Static utility methods for creating common generic Tween objects. + * + * @author Paul Speed + */ +public class Tweens { + + static Logger log = Logger.getLogger(Tweens.class.getName()); + + private static final CurveFunction SMOOTH = new SmoothStep(); + private static final CurveFunction SINE = new Sine(); + + /** + * Creates a tween that will interpolate over an entire sequence + * of tweens in order. + */ + public static Tween sequence(Tween... delegates) { + return new Sequence(delegates); + } + + /** + * Creates a tween that will interpolate over an entire list + * of tweens in parallel, ie: all tweens will be run at the same + * time. + */ + public static Tween parallel(Tween... delegates) { + return new Parallel(delegates); + } + + /** + * Creates a tween that will perform a no-op until the length + * has expired. + */ + public static Tween delay(double length) { + return new Delay(length); + } + + /** + * Creates a tween that scales the specified delegate tween or tweens + * to the desired length. If more than one tween is specified then they + * are wrapped in a sequence using the sequence() method. + */ + public static Tween stretch(double desiredLength, Tween... delegates) { + if (delegates.length == 1) { + return new Stretch(delegates[0], desiredLength); + } + return new Stretch(sequence(delegates), desiredLength); + } + + /** + * Creates a tween that uses a sine function to smooth step the time value + * for the specified delegate tween or tweens. These 'curved' wrappers + * can be used to smooth the interpolation of another tween. + */ + public static Tween sineStep(Tween... delegates) { + if (delegates.length == 1) { + return new Curve(delegates[0], SINE); + } + return new Curve(sequence(delegates), SINE); + } + + /** + * Creates a tween that uses a hermite function to smooth step the time value + * for the specified delegate tween or tweens. This is similar to GLSL's + * smoothstep(). These 'curved' wrappers can be used to smooth the interpolation + * of another tween. + */ + public static Tween smoothStep(Tween... delegates) { + if (delegates.length == 1) { + return new Curve(delegates[0], SMOOTH); + } + return new Curve(sequence(delegates), SMOOTH); + } + + /** + * Creates a Tween that will call the specified method and optional arguments + * whenever supplied a time value greater than or equal to 0. This creates + * an "instant" tween of length 0. + */ + public static Tween callMethod(Object target, String method, Object... args) { + return new CallMethod(target, method, args); + } + + /** + * Creates a Tween that will call the specified method and optional arguments, + * including the time value scaled between 0 and 1. The method must take + * a float or double value as its first or last argument, in addition to whatever + * optional arguments are specified. + *

+ *

For example:

+ *
Tweens.callTweenMethod(1, myObject, "foo", "bar")
+ *

Would work for any of the following method signatures:

+ *
+     *    void foo( float t, String arg )
+     *    void foo( double t, String arg )
+     *    void foo( String arg, float t )
+     *    void foo( String arg, double t )
+     *  
+ */ + public static Tween callTweenMethod(double length, Object target, String method, Object... args) { + return new CallTweenMethod(length, target, method, args); + } + + private static interface CurveFunction { + public double curve(double input); + } + + /** + * Curve function for Hermite interpolation ala GLSL smoothstep(). + */ + private static class SmoothStep implements CurveFunction { + + @Override + public double curve(double t) { + if (t < 0) { + return 0; + } else if (t > 1) { + return 1; + } + return t * t * (3 - 2 * t); + } + } + + private static class Sine implements CurveFunction { + + @Override + public double curve(double t) { + if (t < 0) { + return 0; + } else if (t > 1) { + return 1; + } + // Sine starting at -90 will go from -1 to 1 through 0 + double result = Math.sin(t * Math.PI - Math.PI * 0.5); + return (result + 1) * 0.5; + } + } + + private static class Curve implements Tween { + private final Tween delegate; + private final CurveFunction func; + private final double length; + + public Curve(Tween delegate, CurveFunction func) { + this.delegate = delegate; + this.func = func; + this.length = delegate.getLength(); + } + + @Override + public double getLength() { + return length; + } + + @Override + public boolean interpolate(double t) { + // Sanity check the inputs + if (t < 0) { + return true; + } + + if (length == 0) { + // Caller did something strange but we'll allow it + return delegate.interpolate(t); + } + + t = func.curve(t / length); + return delegate.interpolate(t * length); + } + + @Override + public String toString() { + return getClass().getSimpleName() + "[delegate=" + delegate + ", func=" + func + "]"; + } + } + + private static class Sequence implements Tween, ContainsTweens { + private final Tween[] delegates; + private int current = 0; + private double baseTime; + private double length; + + public Sequence(Tween... delegates) { + this.delegates = delegates; + for (Tween t : delegates) { + length += t.getLength(); + } + } + + @Override + public double getLength() { + return length; + } + + @Override + public boolean interpolate(double t) { + + // Sanity check the inputs + if (t < 0) { + return true; + } + + if (t < baseTime) { + // We've rolled back before the current sequence step + // which means we need to reset and start forward + // again. We have no idea how to 'roll back' and + // this is the only way to maintain consistency. + // The only 'normal' case where this happens is when looping + // in which case a full rollback is appropriate. + current = 0; + baseTime = 0; + } + + if (current >= delegates.length) { + return false; + } + + // Skip any that are done + while (!delegates[current].interpolate(t - baseTime)) { + // Time to go to the next one + baseTime += delegates[current].getLength(); + current++; + if (current >= delegates.length) { + return false; + } + } + + return true; + } + + @Override + public String toString() { + return getClass().getSimpleName() + "[delegates=" + Arrays.asList(delegates) + "]"; + } + + @Override + public Tween[] getTweens() { + return delegates; + } + } + + private static class Parallel implements Tween, ContainsTweens { + private final Tween[] delegates; + private final boolean[] done; + private double length; + private double lastTime; + + public Parallel(Tween... delegates) { + this.delegates = delegates; + done = new boolean[delegates.length]; + + for (Tween t : delegates) { + if (t.getLength() > length) { + length = t.getLength(); + } + } + } + + @Override + public double getLength() { + return length; + } + + protected void reset() { + for (int i = 0; i < done.length; i++) { + done[i] = false; + } + } + + @Override + public boolean interpolate(double t) { + // Sanity check the inputs + if (t < 0) { + return true; + } + + if (t < lastTime) { + // We've rolled back before the last time we were given. + // This means we may have 'done'ed a few tasks that now + // need to be run again. Better to just reset and start + // over. As mentioned in the Sequence task, the only 'normal' + // use-case for time rolling backwards is when looping. And + // in that case, we want to start from the beginning anyway. + reset(); + } + lastTime = t; + + int runningCount = delegates.length; + for (int i = 0; i < delegates.length; i++) { + if (!done[i]) { + done[i] = !delegates[i].interpolate(t); + } + if (done[i]) { + runningCount--; + } + } + return runningCount > 0; + } + + @Override + public String toString() { + return getClass().getSimpleName() + "[delegates=" + Arrays.asList(delegates) + "]"; + } + + @Override + public Tween[] getTweens() { + return delegates; + } + } + + private static class Delay extends AbstractTween { + + public Delay(double length) { + super(length); + } + + @Override + protected void doInterpolate(double t) { + } + } + + private static class Stretch implements Tween, ContainsTweens { + + private final Tween[] delegate = new Tween[1]; + private final double length; + private final double scale; + + public Stretch(Tween delegate, double length) { + this.delegate[0] = delegate; + + this.length = length; + + // Caller desires delegate to be 'length' instead of + // it's actual length so we will calculate a time scale + // If the desired length is longer than delegate's then + // we need to feed time in slower, ie: scale < 1 + if (length != 0) { + this.scale = delegate.getLength() / length; + } else { + this.scale = 0; + } + } + + @Override + public double getLength() { + return length; + } + + @Override + public Tween[] getTweens() { + return delegate; + } + + @Override + public boolean interpolate(double t) { + if (t < 0) { + return true; + } + if (length > 0) { + t *= scale; + } else { + t = length; + } + return delegate[0].interpolate(t); + } + + @Override + public String toString() { + return getClass().getSimpleName() + "[delegate=" + delegate[0] + ", length=" + length + "]"; + } + } + + private static class CallMethod extends AbstractTween { + + private Object target; + private Method method; + private Object[] args; + + public CallMethod(Object target, String methodName, Object... args) { + super(0); + if (target == null) { + throw new IllegalArgumentException("Target cannot be null."); + } + this.target = target; + this.args = args; + + // Lookup the method + if (args == null) { + this.method = findMethod(target.getClass(), methodName); + } else { + this.method = findMethod(target.getClass(), methodName, args); + } + if (this.method == null) { + throw new IllegalArgumentException("Method not found for:" + methodName + " on type:" + target.getClass()); + } + this.method.setAccessible(true); + } + + private static Method findMethod(Class type, String name, Object... args) { + for (Method m : type.getDeclaredMethods()) { + if (!Objects.equals(m.getName(), name)) { + continue; + } + Class[] paramTypes = m.getParameterTypes(); + if (paramTypes.length != args.length) { + continue; + } + int matches = 0; + for (int i = 0; i < args.length; i++) { + if (paramTypes[i].isInstance(args[i]) + || Primitives.wrap(paramTypes[i]).isInstance(args[i])) { + matches++; + } + } + if (matches == args.length) { + return m; + } + } + if (type.getSuperclass() != null) { + return findMethod(type.getSuperclass(), name, args); + } + return null; + } + + @Override + protected void doInterpolate(double t) { + try { + method.invoke(target, args); + } catch (IllegalAccessException e) { + throw new RuntimeException("Error running method:" + method + " for object:" + target, e); + } catch (InvocationTargetException e) { + throw new RuntimeException("Error running method:" + method + " for object:" + target, e); + } + } + + @Override + public String toString() { + return getClass().getSimpleName() + "[method=" + method + ", parms=" + Arrays.asList(args) + "]"; + } + } + + private static class CallTweenMethod extends AbstractTween { + + private Object target; + private Method method; + private Object[] args; + private int tIndex = -1; + private boolean isFloat = false; + + public CallTweenMethod(double length, Object target, String methodName, Object... args) { + super(length); + if (target == null) { + throw new IllegalArgumentException("Target cannot be null."); + } + this.target = target; + + // Lookup the method + this.method = findMethod(target.getClass(), methodName, args); + if (this.method == null) { + throw new IllegalArgumentException("Method not found for:" + methodName + " on type:" + target.getClass()); + } + this.method.setAccessible(true); + + // So now setup the real args list + this.args = new Object[args.length + 1]; + if (tIndex == 0) { + for (int i = 0; i < args.length; i++) { + this.args[i + 1] = args[i]; + } + } else { + for (int i = 0; i < args.length; i++) { + this.args[i] = args[i]; + } + } + } + + private static boolean isFloatType(Class type) { + return type == Float.TYPE || type == Float.class; + } + + private static boolean isDoubleType(Class type) { + return type == Double.TYPE || type == Double.class; + } + + private Method findMethod(Class type, String name, Object... args) { + for (Method m : type.getDeclaredMethods()) { + if (!Objects.equals(m.getName(), name)) { + continue; + } + Class[] paramTypes = m.getParameterTypes(); + if (paramTypes.length != args.length + 1) { + if (log.isLoggable(Level.FINE)) { + log.log(Level.FINE, "Param lengths of [" + m + "] differ. method arg count:" + paramTypes.length + " lookging for:" + (args.length + 1)); + } + continue; + } + + // We accept the 't' parameter as either first or last + // so we'll see which one matches. + if (isFloatType(paramTypes[0]) || isDoubleType(paramTypes[0])) { + // Try it as the first parameter + int matches = 0; + + for (int i = 1; i < paramTypes.length; i++) { + if (paramTypes[i].isInstance(args[i - 1])) { + matches++; + } + } + if (matches == args.length) { + // Then this is our method and this is how we are configured + tIndex = 0; + isFloat = isFloatType(paramTypes[0]); + } else { + if (log.isLoggable(Level.FINE)) { + log.log(Level.FINE, m + " Leading float check failed because of type mismatches, for:" + m); + } + } + } + if (tIndex >= 0) { + return m; + } + + // Else try it at the end + int last = paramTypes.length - 1; + if (isFloatType(paramTypes[last]) || isDoubleType(paramTypes[last])) { + int matches = 0; + + for (int i = 0; i < last; i++) { + if (paramTypes[i].isInstance(args[i])) { + matches++; + } + } + if (matches == args.length) { + // Then this is our method and this is how we are configured + tIndex = last; + isFloat = isFloatType(paramTypes[last]); + return m; + } else { + if (log.isLoggable(Level.FINE)) { + log.log(Level.FINE, "Trailing float check failed because of type mismatches, for:" + m); + } + } + } + } + if (type.getSuperclass() != null) { + return findMethod(type.getSuperclass(), name, args); + } + return null; + } + + @Override + protected void doInterpolate(double t) { + try { + if (isFloat) { + args[tIndex] = (float) t; + } else { + args[tIndex] = t; + } + method.invoke(target, args); + } catch (IllegalAccessException e) { + throw new RuntimeException("Error running method:" + method + " for object:" + target, e); + } catch (InvocationTargetException e) { + throw new RuntimeException("Error running method:" + method + " for object:" + target, e); + } + } + + @Override + public String toString() { + return getClass().getSimpleName() + "[method=" + method + ", parms=" + Arrays.asList(args) + "]"; + } + } +} diff --git a/jme3-core/src/main/java/com/jme3/anim/tween/action/Action.java b/jme3-core/src/main/java/com/jme3/anim/tween/action/Action.java new file mode 100644 index 000000000..e4038caff --- /dev/null +++ b/jme3-core/src/main/java/com/jme3/anim/tween/action/Action.java @@ -0,0 +1,70 @@ +package com.jme3.anim.tween.action; + +import com.jme3.anim.AnimationMask; +import com.jme3.anim.tween.Tween; + +public abstract class Action implements Tween { + + protected Action[] actions; + private double length; + private double speed = 1; + private AnimationMask mask; + private boolean forward = true; + + protected Action(Tween... tweens) { + this.actions = new Action[tweens.length]; + for (int i = 0; i < tweens.length; i++) { + Tween tween = tweens[i]; + if (tween instanceof Action) { + this.actions[i] = (Action) tween; + } else { + this.actions[i] = new BaseAction(tween); + } + } + } + + @Override + public double getLength() { + return length; + } + + protected void setLength(double length) { + this.length = length; + } + + public double getSpeed() { + return speed; + } + + public void setSpeed(double speed) { + this.speed = speed; + if( speed < 0){ + setForward(false); + } else { + setForward(true); + } + } + + public AnimationMask getMask() { + return mask; + } + + public void setMask(AnimationMask mask) { + this.mask = mask; + } + + protected boolean isForward() { + return forward; + } + + protected void setForward(boolean forward) { + if(this.forward == forward){ + return; + } + this.forward = forward; + for (Action action : actions) { + action.setForward(forward); + } + + } +} diff --git a/jme3-core/src/main/java/com/jme3/anim/tween/action/BaseAction.java b/jme3-core/src/main/java/com/jme3/anim/tween/action/BaseAction.java new file mode 100644 index 000000000..d2e891343 --- /dev/null +++ b/jme3-core/src/main/java/com/jme3/anim/tween/action/BaseAction.java @@ -0,0 +1,38 @@ +package com.jme3.anim.tween.action; + +import com.jme3.anim.tween.ContainsTweens; +import com.jme3.anim.tween.Tween; +import com.jme3.util.SafeArrayList; + +import java.util.Collections; +import java.util.List; + +public class BaseAction extends Action { + + private Tween tween; + + public BaseAction(Tween tween) { + this.tween = tween; + setLength(tween.getLength()); + List subActions = new SafeArrayList<>(Action.class); + gatherActions(tween, subActions); + actions = new Action[subActions.size()]; + subActions.toArray(actions); + } + + private void gatherActions(Tween tween, List subActions) { + if (tween instanceof Action) { + subActions.add((Action) tween); + } else if (tween instanceof ContainsTweens) { + Tween[] tweens = ((ContainsTweens) tween).getTweens(); + for (Tween t : tweens) { + gatherActions(t, subActions); + } + } + } + + @Override + public boolean interpolate(double t) { + return tween.interpolate(t); + } +} diff --git a/jme3-core/src/main/java/com/jme3/anim/tween/action/BlendAction.java b/jme3-core/src/main/java/com/jme3/anim/tween/action/BlendAction.java new file mode 100644 index 000000000..9c5848e4d --- /dev/null +++ b/jme3-core/src/main/java/com/jme3/anim/tween/action/BlendAction.java @@ -0,0 +1,129 @@ +package com.jme3.anim.tween.action; + +import com.jme3.anim.util.HasLocalTransform; +import com.jme3.math.Transform; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +public class BlendAction extends BlendableAction { + + private int firstActiveIndex; + private int secondActiveIndex; + private BlendSpace blendSpace; + private float blendWeight; + private double[] timeFactor; + private Map targetMap = new HashMap<>(); + + public BlendAction(BlendSpace blendSpace, BlendableAction... actions) { + super(actions); + timeFactor = new double[actions.length]; + this.blendSpace = blendSpace; + blendSpace.setBlendAction(this); + + for (BlendableAction action : actions) { + if (action.getLength() > getLength()) { + setLength(action.getLength()); + } + Collection targets = action.getTargets(); + for (HasLocalTransform target : targets) { + Transform t = targetMap.get(target); + if (t == null) { + t = new Transform(); + targetMap.put(target, t); + } + } + } + + //Blending effect maybe unexpected when blended animation don't have the same length + //Stretching any action that doesn't have the same length. + for (int i = 0; i < this.actions.length; i++) { + this.timeFactor[i] = 1; + if (this.actions[i].getLength() != getLength()) { + double actionLength = this.actions[i].getLength(); + if (actionLength > 0 && getLength() > 0) { + this.timeFactor[i] = this.actions[i].getLength() / getLength(); + } + } + } + } + + public void doInterpolate(double t) { + blendWeight = blendSpace.getWeight(); + BlendableAction firstActiveAction = (BlendableAction) actions[firstActiveIndex]; + BlendableAction secondActiveAction = (BlendableAction) actions[secondActiveIndex]; + firstActiveAction.setCollectTransformDelegate(this); + secondActiveAction.setCollectTransformDelegate(this); + + //only interpolate the first action if the weight if below 1. + if (blendWeight < 1f) { + firstActiveAction.setWeight(1f); + firstActiveAction.interpolate(t * timeFactor[firstActiveIndex]); + if (blendWeight == 0) { + for (HasLocalTransform target : targetMap.keySet()) { + collect(target, targetMap.get(target)); + } + } + } + + //Second action should be interpolated + secondActiveAction.setWeight(blendWeight); + secondActiveAction.interpolate(t * timeFactor[secondActiveIndex]); + + firstActiveAction.setCollectTransformDelegate(null); + secondActiveAction.setCollectTransformDelegate(null); + + } + + protected Action[] getActions() { + return actions; + } + + public BlendSpace getBlendSpace() { + return blendSpace; + } + + protected void setFirstActiveIndex(int index) { + this.firstActiveIndex = index; + } + + protected void setSecondActiveIndex(int index) { + this.secondActiveIndex = index; + } + + @Override + public Collection getTargets() { + return targetMap.keySet(); + } + + @Override + public void collectTransform(HasLocalTransform target, Transform t, float weight, BlendableAction source) { + + Transform tr = targetMap.get(target); + if (weight == 1) { + tr.set(t); + } else if (weight > 0) { + tr.interpolateTransforms(tr, t, weight); + } + + if (source == actions[secondActiveIndex]) { + collect(target, tr); + } + } + + private void collect(HasLocalTransform target, Transform tr) { + if (collectTransformDelegate != null) { + collectTransformDelegate.collectTransform(target, tr, this.getWeight(), this); + } else { + if (getTransitionWeight() == 1) { + target.setLocalTransform(tr); + } else { + Transform trans = target.getLocalTransform(); + trans.interpolateTransforms(trans, tr, getTransitionWeight()); + target.setLocalTransform(trans); + } + } + } + +} diff --git a/jme3-core/src/main/java/com/jme3/anim/tween/action/BlendSpace.java b/jme3-core/src/main/java/com/jme3/anim/tween/action/BlendSpace.java new file mode 100644 index 000000000..a88be7529 --- /dev/null +++ b/jme3-core/src/main/java/com/jme3/anim/tween/action/BlendSpace.java @@ -0,0 +1,10 @@ +package com.jme3.anim.tween.action; + +public interface BlendSpace { + + public void setBlendAction(BlendAction action); + + public float getWeight(); + + public void setValue(float value); +} diff --git a/jme3-core/src/main/java/com/jme3/anim/tween/action/BlendableAction.java b/jme3-core/src/main/java/com/jme3/anim/tween/action/BlendableAction.java new file mode 100644 index 000000000..0ba79d841 --- /dev/null +++ b/jme3-core/src/main/java/com/jme3/anim/tween/action/BlendableAction.java @@ -0,0 +1,97 @@ +package com.jme3.anim.tween.action; + +import com.jme3.anim.tween.AbstractTween; +import com.jme3.anim.tween.Tween; +import com.jme3.anim.util.HasLocalTransform; +import com.jme3.math.FastMath; +import com.jme3.math.Transform; + +import java.util.Collection; + +public abstract class BlendableAction extends Action { + + protected BlendableAction collectTransformDelegate; + private float transitionWeight = 1.0f; + private double transitionLength = 0.4f; + private float weight = 1f; + private TransitionTween transition = new TransitionTween(transitionLength); + + public BlendableAction(Tween... tweens) { + super(tweens); + } + + public void setCollectTransformDelegate(BlendableAction delegate) { + this.collectTransformDelegate = delegate; + } + + @Override + public boolean interpolate(double t) { + // Sanity check the inputs + if (t < 0) { + return true; + } + + if (collectTransformDelegate == null) { + if (transition.getLength() > getLength()) { + transition.setLength(getLength()); + } + if(isForward()) { + transition.interpolate(t); + } else { + float v = Math.max((float)(getLength() - t), 0f); + transition.interpolate(v); + } + } else { + transitionWeight = 1f; + } + + if (weight == 0) { + //weight is 0 let's not interpolate + return t < getLength(); + } + + doInterpolate(t); + + return t < getLength(); + } + + public float getWeight() { + return weight; + } + + public void setWeight(float weight) { + this.weight = weight; + } + + protected abstract void doInterpolate(double t); + + public abstract Collection getTargets(); + + public abstract void collectTransform(HasLocalTransform target, Transform t, float weight, BlendableAction source); + + public double getTransitionLength() { + return transitionLength; + } + + public void setTransitionLength(double transitionLength) { + this.transitionLength = transitionLength; + } + + protected float getTransitionWeight() { + return transitionWeight; + } + + private class TransitionTween extends AbstractTween { + + + public TransitionTween(double length) { + super(length); + } + + @Override + protected void doInterpolate(double t) { + transitionWeight = (float) t; + } + } + +} diff --git a/jme3-core/src/main/java/com/jme3/anim/tween/action/ClipAction.java b/jme3-core/src/main/java/com/jme3/anim/tween/action/ClipAction.java new file mode 100644 index 000000000..9f0d49f20 --- /dev/null +++ b/jme3-core/src/main/java/com/jme3/anim/tween/action/ClipAction.java @@ -0,0 +1,94 @@ +package com.jme3.anim.tween.action; + +import com.jme3.anim.*; +import com.jme3.anim.tween.AbstractTween; +import com.jme3.anim.util.HasLocalTransform; +import com.jme3.math.Transform; +import com.jme3.scene.Geometry; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +public class ClipAction extends BlendableAction { + + private AnimClip clip; + private Transform transform = new Transform(); + + public ClipAction(AnimClip clip) { + this.clip = clip; + setLength(clip.getLength()); + } + + @Override + public void doInterpolate(double t) { + AnimTrack[] tracks = clip.getTracks(); + for (AnimTrack track : tracks) { + if (track instanceof TransformTrack) { + TransformTrack tt = (TransformTrack) track; + if(getMask() != null && !getMask().contains(tt.getTarget())){ + continue; + } + interpolateTransformTrack(t, tt); + } else if (track instanceof MorphTrack) { + interpolateMorphTrack(t, (MorphTrack) track); + } + } + } + + private void interpolateTransformTrack(double t, TransformTrack track) { + HasLocalTransform target = track.getTarget(); + transform.set(target.getLocalTransform()); + track.getDataAtTime(t, transform); + + if (collectTransformDelegate != null) { + collectTransformDelegate.collectTransform(target, transform, getWeight(), this); + } else { + this.collectTransform(target, transform, getTransitionWeight(), this); + } + } + private void interpolateMorphTrack(double t, MorphTrack track) { + Geometry target = track.getTarget(); + float[] weights = target.getMorphState(); + track.getDataAtTime(t, weights); + target.setMorphState(weights); + +// if (collectTransformDelegate != null) { +// collectTransformDelegate.collectTransform(target, transform, getWeight(), this); +// } else { +// this.collectTransform(target, transform, getTransitionWeight(), this); +// } + } + + public void reset() { + + } + + public String toString() { + return clip.toString(); + } + + @Override + public Collection getTargets() { + List targets = new ArrayList<>(clip.getTracks().length); + for (AnimTrack track : clip.getTracks()) { + if (track instanceof TransformTrack) { + targets.add(((TransformTrack) track).getTarget()); + } + } + return targets; + } + + @Override + public void collectTransform(HasLocalTransform target, Transform t, float weight, BlendableAction source) { + if (weight == 1f) { + target.setLocalTransform(t); + } else { + Transform tr = target.getLocalTransform(); + tr.interpolateTransforms(tr, t, weight); + target.setLocalTransform(tr); + } + } + + +} diff --git a/jme3-core/src/main/java/com/jme3/anim/tween/action/LinearBlendSpace.java b/jme3-core/src/main/java/com/jme3/anim/tween/action/LinearBlendSpace.java new file mode 100644 index 000000000..31d2931fe --- /dev/null +++ b/jme3-core/src/main/java/com/jme3/anim/tween/action/LinearBlendSpace.java @@ -0,0 +1,49 @@ +package com.jme3.anim.tween.action; + +public class LinearBlendSpace implements BlendSpace { + + private BlendAction action; + private float value; + private float maxValue; + private float minValue; + private float step; + + public LinearBlendSpace(float minValue, float maxValue) { + this.maxValue = maxValue; + this.minValue = minValue; + } + + @Override + public void setBlendAction(BlendAction action) { + this.action = action; + Action[] actions = action.getActions(); + step = (maxValue - minValue) / (float) (actions.length - 1); + } + + @Override + public float getWeight() { + Action[] actions = action.getActions(); + float lowStep = minValue, highStep = minValue; + int lowIndex = 0, highIndex = 0; + for (int i = 0; i < actions.length && highStep < value; i++) { + lowStep = highStep; + lowIndex = i; + highStep += step; + } + highIndex = lowIndex + 1; + + action.setFirstActiveIndex(lowIndex); + action.setSecondActiveIndex(highIndex); + + if (highStep == lowStep) { + return 0; + } + + return (value - lowStep) / (highStep - lowStep); + } + + @Override + public void setValue(float value) { + this.value = value; + } +} diff --git a/jme3-core/src/main/java/com/jme3/anim/util/AnimMigrationUtils.java b/jme3-core/src/main/java/com/jme3/anim/util/AnimMigrationUtils.java new file mode 100644 index 000000000..d50bf90b8 --- /dev/null +++ b/jme3-core/src/main/java/com/jme3/anim/util/AnimMigrationUtils.java @@ -0,0 +1,200 @@ +package com.jme3.anim.util; + +import com.jme3.anim.*; +import com.jme3.animation.*; +import com.jme3.math.Quaternion; +import com.jme3.math.Vector3f; +import com.jme3.scene.*; + +import java.util.*; + +public class AnimMigrationUtils { + + private static AnimControlVisitor animControlVisitor = new AnimControlVisitor(); + private static SkeletonControlVisitor skeletonControlVisitor = new SkeletonControlVisitor(); + + + public static Spatial migrate(Spatial source) { + Map skeletonArmatureMap = new HashMap<>(); + animControlVisitor.setMappings(skeletonArmatureMap); + source.depthFirstTraversal(animControlVisitor); + skeletonControlVisitor.setMappings(skeletonArmatureMap); + source.depthFirstTraversal(skeletonControlVisitor); + return source; + } + + private static class AnimControlVisitor implements SceneGraphVisitor { + + Map skeletonArmatureMap; + + @Override + public void visit(Spatial spatial) { + AnimControl control = spatial.getControl(AnimControl.class); + if (control != null) { + AnimComposer composer = new AnimComposer(); + Skeleton skeleton = control.getSkeleton(); + if (skeleton == null) { + //only bone anim for now + return; + } + + Joint[] joints = new Joint[skeleton.getBoneCount()]; + for (int i = 0; i < skeleton.getBoneCount(); i++) { + Bone b = skeleton.getBone(i); + Joint j = joints[i]; + if (j == null) { + j = fromBone(b); + joints[i] = j; + } + for (Bone bone : b.getChildren()) { + int index = skeleton.getBoneIndex(bone); + Joint joint = joints[index]; + if (joint == null) { + joint = fromBone(bone); + } + j.addChild(joint); + joints[index] = joint; + } + } + + Armature armature = new Armature(joints); + armature.saveBindPose(); + skeletonArmatureMap.put(skeleton, armature); + + List tracks = new ArrayList<>(); + + for (String animName : control.getAnimationNames()) { + tracks.clear(); + Animation anim = control.getAnim(animName); + AnimClip clip = new AnimClip(animName); + Joint[] staticJoints = new Joint[joints.length]; + + System.arraycopy(joints, 0, staticJoints, 0, joints.length); + for (Track track : anim.getTracks()) { + if (track instanceof BoneTrack) { + BoneTrack boneTrack = (BoneTrack) track; + int index = boneTrack.getTargetBoneIndex(); + Bone bone = skeleton.getBone(index); + Joint joint = joints[index]; + TransformTrack jointTrack = fromBoneTrack(boneTrack, bone, joint); + tracks.add(jointTrack); + //this joint is animated let's remove it from the static joints + staticJoints[index] = null; + } + //TODO spatial tracks , Effect tracks, Audio tracks + } + + for (int i = 0; i < staticJoints.length; i++) { + padJointTracks(tracks, staticJoints[i]); + } + + clip.setTracks(tracks.toArray(new TransformTrack[tracks.size()])); + + composer.addAnimClip(clip); + } + spatial.removeControl(control); + spatial.addControl(composer); + } + } + + public void setMappings(Map skeletonArmatureMap) { + this.skeletonArmatureMap = skeletonArmatureMap; + } + } + + public static void padJointTracks(List tracks, Joint staticJoint) { + Joint j = staticJoint; + if (j != null) { + // joint has no track , we create one with the default pose + float[] times = new float[]{0}; + Vector3f[] translations = new Vector3f[]{j.getLocalTranslation()}; + Quaternion[] rotations = new Quaternion[]{j.getLocalRotation()}; + Vector3f[] scales = new Vector3f[]{j.getLocalScale()}; + TransformTrack track = new TransformTrack(j, times, translations, rotations, scales); + tracks.add(track); + } + } + + private static class SkeletonControlVisitor implements SceneGraphVisitor { + + Map skeletonArmatureMap; + + @Override + public void visit(Spatial spatial) { + SkeletonControl control = spatial.getControl(SkeletonControl.class); + if (control != null) { + Armature armature = skeletonArmatureMap.get(control.getSkeleton()); + SkinningControl skinningControl = new SkinningControl(armature); + Map> attachedSpatials = new HashMap<>(); + for (int i = 0; i < control.getSkeleton().getBoneCount(); i++) { + Bone b = control.getSkeleton().getBone(i); + Node n = control.getAttachmentsNode(b.getName()); + n.removeFromParent(); + if (!n.getChildren().isEmpty()) { + attachedSpatials.put(b.getName(), n.getChildren()); + } + } + spatial.removeControl(control); + spatial.addControl(skinningControl); + for (String name : attachedSpatials.keySet()) { + List spatials = attachedSpatials.get(name); + for (Spatial child : spatials) { + skinningControl.getAttachmentsNode(name).attachChild(child); + } + } + + } + } + + public void setMappings(Map skeletonArmatureMap) { + this.skeletonArmatureMap = skeletonArmatureMap; + } + } + + public static TransformTrack fromBoneTrack(BoneTrack boneTrack, Bone bone, Joint joint) { + float[] times = new float[boneTrack.getTimes().length]; + int length = times.length; + System.arraycopy(boneTrack.getTimes(), 0, times, 0, length); + //translation + Vector3f[] translations = new Vector3f[length]; + if (boneTrack.getTranslations() != null) { + for (int i = 0; i < boneTrack.getTranslations().length; i++) { + Vector3f oldTrans = boneTrack.getTranslations()[i]; + Vector3f newTrans = new Vector3f(); + newTrans.set(bone.getBindPosition()).addLocal(oldTrans); + translations[i] = newTrans; + } + } + //rotation + Quaternion[] rotations = new Quaternion[length]; + if (boneTrack.getRotations() != null) { + for (int i = 0; i < boneTrack.getRotations().length; i++) { + Quaternion oldRot = boneTrack.getRotations()[i]; + Quaternion newRot = new Quaternion(); + newRot.set(bone.getBindRotation()).multLocal(oldRot); + rotations[i] = newRot; + } + } + //scale + Vector3f[] scales = new Vector3f[length]; + if (boneTrack.getScales() != null) { + for (int i = 0; i < boneTrack.getScales().length; i++) { + Vector3f oldScale = boneTrack.getScales()[i]; + Vector3f newScale = new Vector3f(); + newScale.set(bone.getBindScale()).multLocal(oldScale); + scales[i] = newScale; + } + } + TransformTrack t = new TransformTrack(joint, times, translations, rotations, scales); + return t; + } + + private static Joint fromBone(Bone b) { + Joint j = new Joint(b.getName()); + j.setLocalTranslation(b.getBindPosition()); + j.setLocalRotation(b.getBindRotation()); + j.setLocalScale(b.getBindScale()); + return j; + } + +} diff --git a/jme3-core/src/main/java/com/jme3/anim/util/HasLocalTransform.java b/jme3-core/src/main/java/com/jme3/anim/util/HasLocalTransform.java new file mode 100644 index 000000000..28f560dfc --- /dev/null +++ b/jme3-core/src/main/java/com/jme3/anim/util/HasLocalTransform.java @@ -0,0 +1,10 @@ +package com.jme3.anim.util; + +import com.jme3.export.Savable; +import com.jme3.math.Transform; + +public interface HasLocalTransform extends Savable { + public void setLocalTransform(Transform transform); + + public Transform getLocalTransform(); +} diff --git a/jme3-core/src/main/java/com/jme3/anim/util/JointModelTransform.java b/jme3-core/src/main/java/com/jme3/anim/util/JointModelTransform.java new file mode 100644 index 000000000..c73c03316 --- /dev/null +++ b/jme3-core/src/main/java/com/jme3/anim/util/JointModelTransform.java @@ -0,0 +1,20 @@ +package com.jme3.anim.util; + +import com.jme3.anim.Joint; +import com.jme3.math.Matrix4f; +import com.jme3.math.Transform; + +/** + * Implementations of this interface holds accumulated model transform of a Joint. + * Implementation might choose different accumulation strategy. + */ +public interface JointModelTransform { + + void updateModelTransform(Transform localTransform, Joint parent); + + void getOffsetTransform(Matrix4f outTransform, Matrix4f inverseModelBindMatrix); + + void applyBindPose(Transform localTransform, Matrix4f inverseModelBindMatrix, Joint parent); + + Transform getModelTransform(); +} diff --git a/jme3-core/src/main/java/com/jme3/anim/util/Primitives.java b/jme3-core/src/main/java/com/jme3/anim/util/Primitives.java new file mode 100644 index 000000000..f61a996f8 --- /dev/null +++ b/jme3-core/src/main/java/com/jme3/anim/util/Primitives.java @@ -0,0 +1,56 @@ +package com.jme3.anim.util; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + + +/** + * This is a guava method used in {@link com.jme3.anim.tween.Tweens} class. + * Maybe we should just add guava as a dependency in the engine... + * //TODO do something about this. + */ +public class Primitives { + + /** + * A map from primitive types to their corresponding wrapper types. + */ + private static final Map, Class> PRIMITIVE_TO_WRAPPER_TYPE; + + static { + Map, Class> primToWrap = new HashMap<>(16); + + primToWrap.put(boolean.class, Boolean.class); + primToWrap.put(byte.class, Byte.class); + primToWrap.put(char.class, Character.class); + primToWrap.put(double.class, Double.class); + primToWrap.put(float.class, Float.class); + primToWrap.put(int.class, Integer.class); + primToWrap.put(long.class, Long.class); + primToWrap.put(short.class, Short.class); + primToWrap.put(void.class, Void.class); + + PRIMITIVE_TO_WRAPPER_TYPE = Collections.unmodifiableMap(primToWrap); + } + + /** + * Returns the corresponding wrapper type of {@code type} if it is a primitive type; otherwise + * returns {@code type} itself. Idempotent. + *

+ *

+     *     wrap(int.class) == Integer.class
+     *     wrap(Integer.class) == Integer.class
+     *     wrap(String.class) == String.class
+     * 
+ */ + public static Class wrap(Class type) { + if (type == null) { + throw new IllegalArgumentException("type is null"); + } + + // cast is safe: long.class and Long.class are both of type Class + @SuppressWarnings("unchecked") + Class wrapped = (Class) PRIMITIVE_TO_WRAPPER_TYPE.get(type); + return (wrapped == null) ? type : wrapped; + } +} diff --git a/jme3-core/src/main/java/com/jme3/anim/util/Weighted.java b/jme3-core/src/main/java/com/jme3/anim/util/Weighted.java new file mode 100644 index 000000000..8fb6d3255 --- /dev/null +++ b/jme3-core/src/main/java/com/jme3/anim/util/Weighted.java @@ -0,0 +1,11 @@ +package com.jme3.anim.util; + +import com.jme3.anim.tween.action.Action; +import com.jme3.math.Transform; + +public interface Weighted { + + // public void setWeight(float weight); + + public void setParentAction(Action action); +} diff --git a/jme3-core/src/main/java/com/jme3/animation/AnimChannel.java b/jme3-core/src/main/java/com/jme3/animation/AnimChannel.java index 44b836115..04c8c2f49 100644 --- a/jme3-core/src/main/java/com/jme3/animation/AnimChannel.java +++ b/jme3-core/src/main/java/com/jme3/animation/AnimChannel.java @@ -1,365 +1,371 @@ -/* - * Copyright (c) 2009-2012 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package com.jme3.animation; - -import com.jme3.math.FastMath; -import com.jme3.util.TempVars; -import java.util.BitSet; - -/** - * AnimChannel provides controls, such as play, pause, - * fast forward, etc, for an animation. The animation - * channel may influence the entire model or specific bones of the model's - * skeleton. A single model may have multiple animation channels influencing - * various parts of its body. For example, a character model may have an - * animation channel for its feet, and another for its torso, and - * the animations for each channel are controlled independently. - * - * @author Kirill Vainer - */ -public final class AnimChannel { - - private static final float DEFAULT_BLEND_TIME = 0.15f; - - private AnimControl control; - - private BitSet affectedBones; - - private Animation animation; - private Animation blendFrom; - private float time; - private float speed; - private float timeBlendFrom; - private float blendTime; - private float speedBlendFrom; - private boolean notified=false; - - private LoopMode loopMode, loopModeBlendFrom; - - private float blendAmount = 1f; - private float blendRate = 0; - - AnimChannel(AnimControl control){ - this.control = control; - } - - /** - * Returns the parent control of this AnimChannel. - * - * @return the parent control of this AnimChannel. - * @see AnimControl - */ - public AnimControl getControl() { - return control; - } - - /** - * @return The name of the currently playing animation, or null if - * none is assigned. - * - * @see AnimChannel#setAnim(java.lang.String) - */ - public String getAnimationName() { - return animation != null ? animation.getName() : null; - } - - /** - * @return The loop mode currently set for the animation. The loop mode - * determines what will happen to the animation once it finishes - * playing. - * - * For more information, see the LoopMode enum class. - * @see LoopMode - * @see AnimChannel#setLoopMode(com.jme3.animation.LoopMode) - */ - public LoopMode getLoopMode() { - return loopMode; - } - - /** - * @param loopMode Set the loop mode for the channel. The loop mode - * determines what will happen to the animation once it finishes - * playing. - * - * For more information, see the LoopMode enum class. - * @see LoopMode - */ - public void setLoopMode(LoopMode loopMode) { - this.loopMode = loopMode; - } - - /** - * @return The speed that is assigned to the animation channel. The speed - * is a scale value starting from 0.0, at 1.0 the animation will play - * at its default speed. - * - * @see AnimChannel#setSpeed(float) - */ - public float getSpeed() { - return speed; - } - - /** - * @param speed Set the speed of the animation channel. The speed - * is a scale value starting from 0.0, at 1.0 the animation will play - * at its default speed. - */ - public void setSpeed(float speed) { - this.speed = speed; - if(blendTime>0){ - this.speedBlendFrom = speed; - blendTime = Math.min(blendTime, animation.getLength() / speed); - blendRate = 1/ blendTime; - } - } - - /** - * @return The time of the currently playing animation. The time - * starts at 0 and continues on until getAnimMaxTime(). - * - * @see AnimChannel#setTime(float) - */ - public float getTime() { - return time; - } - - /** - * @param time Set the time of the currently playing animation, the time - * is clamped from 0 to {@link #getAnimMaxTime()}. - */ - public void setTime(float time) { - this.time = FastMath.clamp(time, 0, getAnimMaxTime()); - } - - /** - * @return The length of the currently playing animation, or zero - * if no animation is playing. - * - * @see AnimChannel#getTime() - */ - public float getAnimMaxTime(){ - return animation != null ? animation.getLength() : 0f; - } - - /** - * Set the current animation that is played by this AnimChannel. - *

- * This resets the time to zero, and optionally blends the animation - * over blendTime seconds with the currently playing animation. - * Notice that this method will reset the control's speed to 1.0. - * - * @param name The name of the animation to play - * @param blendTime The blend time over which to blend the new animation - * with the old one. If zero, then no blending will occur and the new - * animation will be applied instantly. - */ - public void setAnim(String name, float blendTime){ - if (name == null) - throw new IllegalArgumentException("name cannot be null"); - - if (blendTime < 0f) - throw new IllegalArgumentException("blendTime cannot be less than zero"); - - Animation anim = control.animationMap.get(name); - if (anim == null) - throw new IllegalArgumentException("Cannot find animation named: '"+name+"'"); - - control.notifyAnimChange(this, name); - - if (animation != null && blendTime > 0f){ - this.blendTime = blendTime; - // activate blending - blendTime = Math.min(blendTime, anim.getLength() / speed); - blendFrom = animation; - timeBlendFrom = time; - speedBlendFrom = speed; - loopModeBlendFrom = loopMode; - blendAmount = 0f; - blendRate = 1f / blendTime; - }else{ - blendFrom = null; - } - - animation = anim; - time = 0; - speed = 1f; - loopMode = LoopMode.Loop; - notified = false; - } - - /** - * Set the current animation that is played by this AnimChannel. - *

- * See {@link #setAnim(java.lang.String, float)}. - * The blendTime argument by default is 150 milliseconds. - * - * @param name The name of the animation to play - */ - public void setAnim(String name){ - setAnim(name, DEFAULT_BLEND_TIME); - } - - /** - * Add all the bones of the model's skeleton to be - * influenced by this animation channel. - */ - public void addAllBones() { - affectedBones = null; - } - - /** - * Add a single bone to be influenced by this animation channel. - */ - public void addBone(String name) { - addBone(control.getSkeleton().getBone(name)); - } - - /** - * Add a single bone to be influenced by this animation channel. - */ - public void addBone(Bone bone) { - int boneIndex = control.getSkeleton().getBoneIndex(bone); - if(affectedBones == null) { - affectedBones = new BitSet(control.getSkeleton().getBoneCount()); - } - affectedBones.set(boneIndex); - } - - /** - * Add bones to be influenced by this animation channel starting from the - * given bone name and going toward the root bone. - */ - public void addToRootBone(String name) { - addToRootBone(control.getSkeleton().getBone(name)); - } - - /** - * Add bones to be influenced by this animation channel starting from the - * given bone and going toward the root bone. - */ - public void addToRootBone(Bone bone) { - addBone(bone); - while (bone.getParent() != null) { - bone = bone.getParent(); - addBone(bone); - } - } - - /** - * Add bones to be influenced by this animation channel, starting - * from the given named bone and going toward its children. - */ - public void addFromRootBone(String name) { - addFromRootBone(control.getSkeleton().getBone(name)); - } - - /** - * Add bones to be influenced by this animation channel, starting - * from the given bone and going toward its children. - */ - public void addFromRootBone(Bone bone) { - addBone(bone); - if (bone.getChildren() == null) - return; - for (Bone childBone : bone.getChildren()) { - addBone(childBone); - addFromRootBone(childBone); - } - } - - BitSet getAffectedBones(){ - return affectedBones; - } - - public void reset(boolean rewind){ - if(rewind){ - setTime(0); - if(control.getSkeleton()!=null){ - control.getSkeleton().resetAndUpdate(); - }else{ - TempVars vars = TempVars.get(); - update(0, vars); - vars.release(); - } - } - animation = null; - notified = false; - } - - void update(float tpf, TempVars vars) { - if (animation == null) - return; - - if (blendFrom != null && blendAmount != 1.0f){ - // The blendFrom anim is set, the actual animation - // playing will be set -// blendFrom.setTime(timeBlendFrom, 1f, control, this, vars); - blendFrom.setTime(timeBlendFrom, 1f - blendAmount, control, this, vars); - - timeBlendFrom += tpf * speedBlendFrom; - timeBlendFrom = AnimationUtils.clampWrapTime(timeBlendFrom, - blendFrom.getLength(), - loopModeBlendFrom); - if (timeBlendFrom < 0){ - timeBlendFrom = -timeBlendFrom; - speedBlendFrom = -speedBlendFrom; - } - - blendAmount += tpf * blendRate; - if (blendAmount > 1f){ - blendAmount = 1f; - blendFrom = null; - } - } - - animation.setTime(time, blendAmount, control, this, vars); - time += tpf * speed; - if (animation.getLength() > 0){ - if (!notified && (time >= animation.getLength() || time < 0)) { - if (loopMode == LoopMode.DontLoop) { - // Note that this flag has to be set before calling the notify - // since the notify may start a new animation and then unset - // the flag. - notified = true; - } - control.notifyAnimCycleDone(this, animation.getName()); - } - } - time = AnimationUtils.clampWrapTime(time, animation.getLength(), loopMode); - if (time < 0){ - // Negative time indicates that speed should be inverted - // (for cycle loop mode only) - time = -time; - speed = -speed; - } - } -} +/* + * Copyright (c) 2009-2012 jMonkeyEngine + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'jMonkeyEngine' nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package com.jme3.animation; + +import com.jme3.math.FastMath; +import com.jme3.util.TempVars; + +import java.util.BitSet; + +/** + * AnimChannel provides controls, such as play, pause, + * fast forward, etc, for an animation. The animation + * channel may influence the entire model or specific bones of the model's + * skeleton. A single model may have multiple animation channels influencing + * various parts of its body. For example, a character model may have an + * animation channel for its feet, and another for its torso, and + * the animations for each channel are controlled independently. + * + * @author Kirill Vainer + */ +@Deprecated +public final class AnimChannel { + + private static final float DEFAULT_BLEND_TIME = 0.15f; + + private AnimControl control; + + private BitSet affectedBones; + + private Animation animation; + private Animation blendFrom; + private float time; + private float speed; + private float timeBlendFrom; + private float blendTime; + private float speedBlendFrom; + private boolean notified=false; + + private LoopMode loopMode, loopModeBlendFrom; + + private float blendAmount = 1f; + private float blendRate = 0; + + public AnimChannel(){ + + } + + public AnimChannel(AnimControl control){ + this.control = control; + } + + /** + * Returns the parent control of this AnimChannel. + * + * @return the parent control of this AnimChannel. + * @see AnimControl + */ + public AnimControl getControl() { + return control; + } + + /** + * @return The name of the currently playing animation, or null if + * none is assigned. + * + * @see AnimChannel#setAnim(java.lang.String) + */ + public String getAnimationName() { + return animation != null ? animation.getName() : null; + } + + /** + * @return The loop mode currently set for the animation. The loop mode + * determines what will happen to the animation once it finishes + * playing. + * + * For more information, see the LoopMode enum class. + * @see LoopMode + * @see AnimChannel#setLoopMode(com.jme3.animation.LoopMode) + */ + public LoopMode getLoopMode() { + return loopMode; + } + + /** + * @param loopMode Set the loop mode for the channel. The loop mode + * determines what will happen to the animation once it finishes + * playing. + * + * For more information, see the LoopMode enum class. + * @see LoopMode + */ + public void setLoopMode(LoopMode loopMode) { + this.loopMode = loopMode; + } + + /** + * @return The speed that is assigned to the animation channel. The speed + * is a scale value starting from 0.0, at 1.0 the animation will play + * at its default speed. + * + * @see AnimChannel#setSpeed(float) + */ + public float getSpeed() { + return speed; + } + + /** + * @param speed Set the speed of the animation channel. The speed + * is a scale value starting from 0.0, at 1.0 the animation will play + * at its default speed. + */ + public void setSpeed(float speed) { + this.speed = speed; + if(blendTime>0){ + this.speedBlendFrom = speed; + blendTime = Math.min(blendTime, animation.getLength() / speed); + blendRate = 1/ blendTime; + } + } + + /** + * @return The time of the currently playing animation. The time + * starts at 0 and continues on until getAnimMaxTime(). + * + * @see AnimChannel#setTime(float) + */ + public float getTime() { + return time; + } + + /** + * @param time Set the time of the currently playing animation, the time + * is clamped from 0 to {@link #getAnimMaxTime()}. + */ + public void setTime(float time) { + this.time = FastMath.clamp(time, 0, getAnimMaxTime()); + } + + /** + * @return The length of the currently playing animation, or zero + * if no animation is playing. + * + * @see AnimChannel#getTime() + */ + public float getAnimMaxTime(){ + return animation != null ? animation.getLength() : 0f; + } + + /** + * Set the current animation that is played by this AnimChannel. + *

+ * This resets the time to zero, and optionally blends the animation + * over blendTime seconds with the currently playing animation. + * Notice that this method will reset the control's speed to 1.0. + * + * @param name The name of the animation to play + * @param blendTime The blend time over which to blend the new animation + * with the old one. If zero, then no blending will occur and the new + * animation will be applied instantly. + */ + public void setAnim(String name, float blendTime){ + if (name == null) + throw new IllegalArgumentException("name cannot be null"); + + if (blendTime < 0f) + throw new IllegalArgumentException("blendTime cannot be less than zero"); + + Animation anim = control.animationMap.get(name); + if (anim == null) + throw new IllegalArgumentException("Cannot find animation named: '"+name+"'"); + + control.notifyAnimChange(this, name); + + if (animation != null && blendTime > 0f){ + this.blendTime = blendTime; + // activate blending + blendTime = Math.min(blendTime, anim.getLength() / speed); + blendFrom = animation; + timeBlendFrom = time; + speedBlendFrom = speed; + loopModeBlendFrom = loopMode; + blendAmount = 0f; + blendRate = 1f / blendTime; + }else{ + blendFrom = null; + } + + animation = anim; + time = 0; + speed = 1f; + loopMode = LoopMode.Loop; + notified = false; + } + + /** + * Set the current animation that is played by this AnimChannel. + *

+ * See {@link #setAnim(java.lang.String, float)}. + * The blendTime argument by default is 150 milliseconds. + * + * @param name The name of the animation to play + */ + public void setAnim(String name){ + setAnim(name, DEFAULT_BLEND_TIME); + } + + /** + * Add all the bones of the model's skeleton to be + * influenced by this animation channel. + */ + public void addAllBones() { + affectedBones = null; + } + + /** + * Add a single bone to be influenced by this animation channel. + */ + public void addBone(String name) { + addBone(control.getSkeleton().getBone(name)); + } + + /** + * Add a single bone to be influenced by this animation channel. + */ + public void addBone(Bone bone) { + int boneIndex = control.getSkeleton().getBoneIndex(bone); + if(affectedBones == null) { + affectedBones = new BitSet(control.getSkeleton().getBoneCount()); + } + affectedBones.set(boneIndex); + } + + /** + * Add bones to be influenced by this animation channel starting from the + * given bone name and going toward the root bone. + */ + public void addToRootBone(String name) { + addToRootBone(control.getSkeleton().getBone(name)); + } + + /** + * Add bones to be influenced by this animation channel starting from the + * given bone and going toward the root bone. + */ + public void addToRootBone(Bone bone) { + addBone(bone); + while (bone.getParent() != null) { + bone = bone.getParent(); + addBone(bone); + } + } + + /** + * Add bones to be influenced by this animation channel, starting + * from the given named bone and going toward its children. + */ + public void addFromRootBone(String name) { + addFromRootBone(control.getSkeleton().getBone(name)); + } + + /** + * Add bones to be influenced by this animation channel, starting + * from the given bone and going toward its children. + */ + public void addFromRootBone(Bone bone) { + addBone(bone); + if (bone.getChildren() == null) + return; + for (Bone childBone : bone.getChildren()) { + addBone(childBone); + addFromRootBone(childBone); + } + } + + BitSet getAffectedBones(){ + return affectedBones; + } + + public void reset(boolean rewind){ + if(rewind){ + setTime(0); + if(control.getSkeleton()!=null){ + control.getSkeleton().resetAndUpdate(); + }else{ + TempVars vars = TempVars.get(); + update(0, vars); + vars.release(); + } + } + animation = null; + notified = false; + } + + void update(float tpf, TempVars vars) { + if (animation == null) + return; + + if (blendFrom != null && blendAmount != 1.0f){ + // The blendFrom anim is set, the actual animation + // playing will be set +// blendFrom.setTime(timeBlendFrom, 1f, control, this, vars); + blendFrom.setTime(timeBlendFrom, 1f - blendAmount, control, this, vars); + + timeBlendFrom += tpf * speedBlendFrom; + timeBlendFrom = AnimationUtils.clampWrapTime(timeBlendFrom, + blendFrom.getLength(), + loopModeBlendFrom); + if (timeBlendFrom < 0){ + timeBlendFrom = -timeBlendFrom; + speedBlendFrom = -speedBlendFrom; + } + + blendAmount += tpf * blendRate; + if (blendAmount > 1f){ + blendAmount = 1f; + blendFrom = null; + } + } + + animation.setTime(time, blendAmount, control, this, vars); + time += tpf * speed; + if (animation.getLength() > 0){ + if (!notified && (time >= animation.getLength() || time < 0)) { + if (loopMode == LoopMode.DontLoop) { + // Note that this flag has to be set before calling the notify + // since the notify may start a new animation and then unset + // the flag. + notified = true; + } + control.notifyAnimCycleDone(this, animation.getName()); + } + } + time = AnimationUtils.clampWrapTime(time, animation.getLength(), loopMode); + if (time < 0){ + // Negative time indicates that speed should be inverted + // (for cycle loop mode only) + time = -time; + speed = -speed; + } + } +} diff --git a/jme3-core/src/main/java/com/jme3/animation/AnimControl.java b/jme3-core/src/main/java/com/jme3/animation/AnimControl.java index 36dbb6be5..7386e1084 100644 --- a/jme3-core/src/main/java/com/jme3/animation/AnimControl.java +++ b/jme3-core/src/main/java/com/jme3/animation/AnimControl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -34,19 +34,16 @@ package com.jme3.animation; import com.jme3.export.*; import com.jme3.renderer.RenderManager; import com.jme3.renderer.ViewPort; -import com.jme3.scene.Mesh; import com.jme3.scene.Spatial; import com.jme3.scene.control.AbstractControl; -import com.jme3.scene.control.Control; +import com.jme3.util.TempVars; import com.jme3.util.clone.Cloner; import com.jme3.util.clone.JmeCloneable; -import com.jme3.util.TempVars; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Map; -import java.util.Map.Entry; /** * AnimControl is a Spatial control that allows manipulation @@ -67,7 +64,9 @@ import java.util.Map.Entry; * 1) Morph/Pose animation * * @author Kirill Vainer + * @deprecated use {@link com.jme3.anim.AnimComposer} */ +@Deprecated public final class AnimControl extends AbstractControl implements Cloneable, JmeCloneable { /** @@ -108,32 +107,6 @@ public final class AnimControl extends AbstractControl implements Cloneable, Jme public AnimControl() { } - /** - * Internal use only. - */ - @Override - public Control cloneForSpatial(Spatial spatial) { - try { - AnimControl clone = (AnimControl) super.clone(); - clone.spatial = spatial; - clone.channels = new ArrayList(); - clone.listeners = new ArrayList(); - - if (skeleton != null) { - clone.skeleton = new Skeleton(skeleton); - } - - // animationMap is cloned, but only ClonableTracks will be cloned as they need a reference to a cloned spatial - for (Entry animEntry : animationMap.entrySet()) { - clone.animationMap.put(animEntry.getKey(), animEntry.getValue().cloneForSpatial(spatial)); - } - - return clone; - } catch (CloneNotSupportedException ex) { - throw new AssertionError(); - } - } - @Override public Object jmeClone() { AnimControl clone = (AnimControl) super.jmeClone(); diff --git a/jme3-core/src/main/java/com/jme3/animation/AnimEventListener.java b/jme3-core/src/main/java/com/jme3/animation/AnimEventListener.java index d9b48459a..c20f150da 100644 --- a/jme3-core/src/main/java/com/jme3/animation/AnimEventListener.java +++ b/jme3-core/src/main/java/com/jme3/animation/AnimEventListener.java @@ -37,6 +37,7 @@ package com.jme3.animation; * * @author Kirill Vainer */ +@Deprecated public interface AnimEventListener { /** diff --git a/jme3-core/src/main/java/com/jme3/animation/Animation.java b/jme3-core/src/main/java/com/jme3/animation/Animation.java index 92a5a38fc..834595238 100644 --- a/jme3-core/src/main/java/com/jme3/animation/Animation.java +++ b/jme3-core/src/main/java/com/jme3/animation/Animation.java @@ -37,13 +37,16 @@ import com.jme3.util.SafeArrayList; import com.jme3.util.TempVars; import com.jme3.util.clone.Cloner; import com.jme3.util.clone.JmeCloneable; + import java.io.IOException; /** * The animation class updates the animation target with the tracks of a given type. * * @author Kirill Vainer, Marcin Roguski (Kaelthas) + * @deprecated use {@link com.jme3.anim.AnimClip} */ +@Deprecated public class Animation implements Savable, Cloneable, JmeCloneable { /** diff --git a/jme3-core/src/main/java/com/jme3/animation/AnimationUtils.java b/jme3-core/src/main/java/com/jme3/animation/AnimationUtils.java index 9272fe5e3..2254638e7 100644 --- a/jme3-core/src/main/java/com/jme3/animation/AnimationUtils.java +++ b/jme3-core/src/main/java/com/jme3/animation/AnimationUtils.java @@ -31,17 +31,15 @@ */ package com.jme3.animation; -import static com.jme3.animation.LoopMode.Cycle; -import static com.jme3.animation.LoopMode.DontLoop; -import static com.jme3.animation.LoopMode.Loop; - /** * * @author Nehon */ public class AnimationUtils { - + public AnimationUtils(){ + + } /** * Clamps the time according to duration and loopMode * @param time @@ -50,7 +48,7 @@ public class AnimationUtils { * @return */ public static float clampWrapTime(float time, float duration, LoopMode loopMode){ - if (time == 0) { + if (time == 0 || duration == 0) { return 0; // prevent division by 0 errors } switch (loopMode) { diff --git a/jme3-core/src/main/java/com/jme3/animation/AudioTrack.java b/jme3-core/src/main/java/com/jme3/animation/AudioTrack.java index f4c53e4f1..300287c1e 100644 --- a/jme3-core/src/main/java/com/jme3/animation/AudioTrack.java +++ b/jme3-core/src/main/java/com/jme3/animation/AudioTrack.java @@ -32,15 +32,12 @@ package com.jme3.animation; import com.jme3.audio.AudioNode; -import com.jme3.export.InputCapsule; -import com.jme3.export.JmeExporter; -import com.jme3.export.JmeImporter; -import com.jme3.export.OutputCapsule; +import com.jme3.export.*; import com.jme3.scene.Node; import com.jme3.scene.Spatial; import com.jme3.util.TempVars; import com.jme3.util.clone.Cloner; -import com.jme3.util.clone.JmeCloneable; + import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; @@ -62,6 +59,7 @@ import java.util.logging.Logger; * * @author Nehon */ +@Deprecated public class AudioTrack implements ClonableTrack { private static final Logger logger = Logger.getLogger(AudioTrack.class.getName()); diff --git a/jme3-core/src/main/java/com/jme3/animation/Bone.java b/jme3-core/src/main/java/com/jme3/animation/Bone.java index 15ac6cc6f..edc1b8894 100644 --- a/jme3-core/src/main/java/com/jme3/animation/Bone.java +++ b/jme3-core/src/main/java/com/jme3/animation/Bone.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2017 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -32,15 +32,15 @@ package com.jme3.animation; import com.jme3.export.*; +import com.jme3.material.MatParamOverride; import com.jme3.math.*; -import com.jme3.scene.Geometry; -import com.jme3.scene.Mesh; -import com.jme3.scene.Node; -import com.jme3.scene.Spatial; +import com.jme3.scene.*; +import com.jme3.shader.VarType; import com.jme3.util.SafeArrayList; import com.jme3.util.TempVars; -import com.jme3.util.clone.JmeCloneable; import com.jme3.util.clone.Cloner; +import com.jme3.util.clone.JmeCloneable; + import java.io.IOException; import java.util.ArrayList; @@ -67,7 +67,9 @@ import java.util.ArrayList; * * @author Kirill Vainer * @author Rémy Bouquet + * @deprecated use {@link com.jme3.anim.Joint} */ +@Deprecated public final class Bone implements Savable, JmeCloneable { // Version #2: Changed naming of transforms as they were misleading @@ -533,11 +535,21 @@ public final class Bone implements Savable, JmeCloneable { attachNode.setLocalRotation(modelRot); attachNode.setLocalScale(modelScale); + } else if (targetGeometry.isIgnoreTransform()) { + /* + * The animated meshes ignore transforms: match the world transform + * of the attachments node to the bone's transform. + */ + attachNode.setLocalTranslation(modelPos); + attachNode.setLocalRotation(modelRot); + attachNode.setLocalScale(modelScale); + attachNode.getLocalTransform().combineWithParent(attachNode.getParent().getWorldTransform().invert()); + } else { Spatial loopSpatial = targetGeometry; Transform combined = new Transform(modelPos, modelRot, modelScale); /* - * Climb the scene graph applying local transforms until the + * Climb the scene graph applying local transforms until the * attachments node's parent is reached. */ while (loopSpatial != attachParent && loopSpatial != null) { @@ -550,7 +562,7 @@ public final class Bone implements Savable, JmeCloneable { } /** - * Updates world transforms for this bone and it's children. + * Updates world transforms for this bone and its children. */ public final void update() { this.updateModelTransforms(); @@ -590,7 +602,7 @@ public final class Bone implements Savable, JmeCloneable { } /** - * Reset the bone and it's children to bind pose. + * Reset the bone and its children to bind pose. */ final void reset() { if (!userControl) { @@ -677,7 +689,7 @@ public final class Bone implements Savable, JmeCloneable { modelPos.set(translation); modelRot.set(rotation); - //if there is an attached Node we need to set it's local transforms too. + //if there is an attached Node we need to set its local transforms too. if(attachNode != null){ attachNode.setLocalTranslation(translation); attachNode.setLocalRotation(rotation); @@ -723,6 +735,8 @@ public final class Bone implements Savable, JmeCloneable { if (attachNode == null) { attachNode = new Node(name + "_attachnode"); attachNode.setUserData("AttachedBone", this); + //We don't want the node to have a numBone set by a parent node so we force it to null + attachNode.addMatParamOverride(new MatParamOverride(VarType.Int, "NumberOfBones", null)); } return attachNode; diff --git a/jme3-core/src/main/java/com/jme3/animation/BoneTrack.java b/jme3-core/src/main/java/com/jme3/animation/BoneTrack.java index 1dd27ba24..a39108c5a 100644 --- a/jme3-core/src/main/java/com/jme3/animation/BoneTrack.java +++ b/jme3-core/src/main/java/com/jme3/animation/BoneTrack.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -35,6 +35,8 @@ import com.jme3.export.*; import com.jme3.math.Quaternion; import com.jme3.math.Vector3f; import com.jme3.util.TempVars; +import com.jme3.util.clone.Cloner; +import com.jme3.util.clone.JmeCloneable; import java.io.IOException; import java.util.BitSet; @@ -42,11 +44,13 @@ import java.util.BitSet; * Contains a list of transforms and times for each keyframe. * * @author Kirill Vainer + * @deprecated use {@link com.jme3.anim.JointTrack} */ -public final class BoneTrack implements Track { +@Deprecated +public final class BoneTrack implements JmeCloneable, Track { /** - * Bone index in the skeleton which this track effects. + * Bone index in the skeleton which this track affects. */ private int targetBoneIndex; @@ -138,16 +142,23 @@ public final class BoneTrack implements Track { /** * Set the translations and rotations for this bone track - * @param times a float array with the time of each frame - * @param translations the translation of the bone for each frame - * @param rotations the rotation of the bone for each frame + * + * @param times the time of each frame, measured from the start of the track + * (not null, length>0) + * @param translations the translation of the bone for each frame (not null, + * same length as times) + * @param rotations the rotation of the bone for each frame (not null, same + * length as times) */ public void setKeyframes(float[] times, Vector3f[] translations, Quaternion[] rotations) { if (times.length == 0) { throw new RuntimeException("BoneTrack with no keyframes!"); } - assert times.length == translations.length && times.length == rotations.length; + assert translations != null; + assert times.length == translations.length; + assert rotations != null; + assert times.length == rotations.length; this.times = times; this.translations = new CompactVector3Array(); @@ -160,15 +171,19 @@ public final class BoneTrack implements Track { /** * Set the translations, rotations and scales for this bone track - * @param times a float array with the time of each frame - * @param translations the translation of the bone for each frame - * @param rotations the rotation of the bone for each frame - * @param scales the scale of the bone for each frame + * + * @param times the time of each frame, measured from the start of the track + * (not null, length>0) + * @param translations the translation of the bone for each frame (not null, + * same length as times) + * @param rotations the rotation of the bone for each frame (not null, same + * length as times) + * @param scales the scale of the bone for each frame (ignored if null) */ public void setKeyframes(float[] times, Vector3f[] translations, Quaternion[] rotations, Vector3f[] scales) { this.setKeyframes(times, translations, rotations); - assert times.length == scales.length; if (scales != null) { + assert times.length == scales.length; this.scales = new CompactVector3Array(); this.scales.add(scales); this.scales.freeze(); @@ -261,33 +276,48 @@ public final class BoneTrack implements Track { public float[] getKeyFrameTimes() { return times; } - + /** - * This method creates a clone of the current object. - * @return a clone of the current object + * Create a deep clone of this track. + * + * @return a new track */ @Override public BoneTrack clone() { - int tablesLength = times.length; - - float[] times = this.times.clone(); - Vector3f[] sourceTranslations = this.getTranslations(); - Quaternion[] sourceRotations = this.getRotations(); - Vector3f[] sourceScales = this.getScales(); + return Cloner.deepClone(this); + } - Vector3f[] translations = new Vector3f[tablesLength]; - Quaternion[] rotations = new Quaternion[tablesLength]; - Vector3f[] scales = new Vector3f[tablesLength]; - for (int i = 0; i < tablesLength; ++i) { - translations[i] = sourceTranslations[i].clone(); - rotations[i] = sourceRotations[i].clone(); - scales[i] = sourceScales != null ? sourceScales[i].clone() : new Vector3f(1.0f, 1.0f, 1.0f); + /** + * Create a shallow clone for the JME cloner. + * + * @return a new track + */ + @Override + public BoneTrack jmeClone() { + try { + return (BoneTrack) super.clone(); + } catch (CloneNotSupportedException exception) { + throw new RuntimeException("Can't clone track", exception); } - - // Need to use the constructor here because of the final fields used in this class - return new BoneTrack(targetBoneIndex, times, translations, rotations, scales); } - + + /** + * Callback from {@link com.jme3.util.clone.Cloner} to convert this + * shallow-cloned track into a deep-cloned one, using the specified cloner + * to resolve copied fields. + * + * @param cloner the cloner currently cloning this control (not null) + * @param original the track from which this track was shallow-cloned + * (unused) + */ + @Override + public void cloneFields(Cloner cloner, Object original) { + translations = cloner.clone(translations); + rotations = cloner.clone(rotations); + scales = cloner.clone(scales); + times = cloner.clone(times); + } + @Override public void write(JmeExporter ex) throws IOException { OutputCapsule oc = ex.getCapsule(this); diff --git a/jme3-core/src/main/java/com/jme3/animation/ClonableTrack.java b/jme3-core/src/main/java/com/jme3/animation/ClonableTrack.java index 6dd94c806..b777203a5 100644 --- a/jme3-core/src/main/java/com/jme3/animation/ClonableTrack.java +++ b/jme3-core/src/main/java/com/jme3/animation/ClonableTrack.java @@ -44,6 +44,7 @@ import com.jme3.util.clone.JmeCloneable; * * @author Nehon */ +@Deprecated public interface ClonableTrack extends Track, JmeCloneable { /** diff --git a/jme3-core/src/main/java/com/jme3/animation/CompactArray.java b/jme3-core/src/main/java/com/jme3/animation/CompactArray.java index 03983a10a..b64e0785c 100644 --- a/jme3-core/src/main/java/com/jme3/animation/CompactArray.java +++ b/jme3-core/src/main/java/com/jme3/animation/CompactArray.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -31,6 +31,8 @@ */ package com.jme3.animation; +import com.jme3.util.clone.Cloner; +import com.jme3.util.clone.JmeCloneable; import java.lang.reflect.Array; import java.util.HashMap; import java.util.Map; @@ -40,9 +42,9 @@ import java.util.Map; * @author Lim, YongHoon * @param */ -public abstract class CompactArray { +public abstract class CompactArray implements JmeCloneable { - private Map indexPool = new HashMap(); + protected Map indexPool = new HashMap(); protected int[] index; protected float[] array; private boolean invalid; @@ -68,6 +70,7 @@ public abstract class CompactArray { * They are serialized automatically when get() method is called. * @param objArray */ + @SuppressWarnings("unchecked") public void add(T... objArray) { if (objArray == null || objArray.length == 0) { return; @@ -111,6 +114,10 @@ public abstract class CompactArray { indexPool.clear(); } + protected void setInvalid(boolean invalid) { + this.invalid = invalid; + } + /** * @param index * @param value @@ -186,10 +193,11 @@ public abstract class CompactArray { } /** - * retrun an array of indices for the given objects + * Return an array of indices for the given objects * @param objArray * @return */ + @SuppressWarnings("unchecked") public final int[] getIndex(T... objArray) { int[] index = new int[objArray.length]; for (int i = 0; i < index.length; i++) { @@ -228,6 +236,7 @@ public abstract class CompactArray { * decompress and return object array * @return decompress and return object array */ + @SuppressWarnings("unchecked") public final T[] toObjectArray() { try { T[] compactArr = (T[]) Array.newInstance(getElementClass(), getSerializedSize() / getTupleSize()); @@ -247,6 +256,47 @@ public abstract class CompactArray { } } + /** + * Create a deep clone of this array. + * + * @return a new array + * @throws java.lang.CloneNotSupportedException + */ + @Override + public Object clone() throws CloneNotSupportedException { + return Cloner.deepClone(this); + } + + /** + * Create a shallow clone for the JME cloner. + * + * @return a new array + */ + @Override + public Object jmeClone() { + try { + return super.clone(); + } catch (CloneNotSupportedException exception) { + throw new RuntimeException("Can't clone array", exception); + } + } + + /** + * Callback from {@link com.jme3.util.clone.Cloner} to convert this + * shallow-cloned array into a deep-cloned one, using the specified cloner + * to resolve copied fields. + * + * @param cloner the cloner currently cloning this control (not null) + * @param original the array from which this array was shallow-cloned + * (unused) + */ + @Override + public void cloneFields(Cloner cloner, Object original) { + indexPool = cloner.clone(indexPool); + index = cloner.clone(index); + array = cloner.clone(array); + } + /** * serialize object * @param compactIndex compacted object index diff --git a/jme3-core/src/main/java/com/jme3/animation/CompactFloatArray.java b/jme3-core/src/main/java/com/jme3/animation/CompactFloatArray.java new file mode 100644 index 000000000..a879ef1cb --- /dev/null +++ b/jme3-core/src/main/java/com/jme3/animation/CompactFloatArray.java @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2009-2012 jMonkeyEngine + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'jMonkeyEngine' nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package com.jme3.animation; + +import com.jme3.export.*; +import com.jme3.math.Vector3f; + +import java.io.IOException; + +/** + * Serialize and compress Float by indexing similar values + * @author Lim, YongHoon + */ +public class CompactFloatArray extends CompactArray implements Savable { + + /** + * Creates a compact vector array + */ + public CompactFloatArray() { + } + + /** + * creates a compact vector array + * @param dataArray the data array + * @param index the indices + */ + public CompactFloatArray(float[] dataArray, int[] index) { + super(dataArray, index); + } + + @Override + protected final int getTupleSize() { + return 1; + } + + @Override + protected final Class getElementClass() { + return Float.class; + } + + @Override + public void write(JmeExporter ex) throws IOException { + serialize(); + OutputCapsule out = ex.getCapsule(this); + out.write(array, "array", null); + out.write(index, "index", null); + } + + @Override + public void read(JmeImporter im) throws IOException { + InputCapsule in = im.getCapsule(this); + array = in.readFloatArray("array", null); + index = in.readIntArray("index", null); + } + + public void fill(int startIndex, float[] store ){ + for (int i = 0; i < store.length; i++) { + store[i] = get(startIndex + i, null); + } + } + + @Override + protected void serialize(int i, Float data) { + array[i] = data; + } + + @Override + protected Float deserialize(int i, Float store) { + return array[i]; + } +} \ No newline at end of file diff --git a/jme3-core/src/main/java/com/jme3/animation/EffectTrack.java b/jme3-core/src/main/java/com/jme3/animation/EffectTrack.java index c801e1989..a05b481c4 100644 --- a/jme3-core/src/main/java/com/jme3/animation/EffectTrack.java +++ b/jme3-core/src/main/java/com/jme3/animation/EffectTrack.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -32,28 +32,23 @@ package com.jme3.animation; import com.jme3.effect.ParticleEmitter; -import com.jme3.export.InputCapsule; -import com.jme3.export.JmeExporter; -import com.jme3.export.JmeImporter; -import com.jme3.export.OutputCapsule; +import com.jme3.export.*; import com.jme3.renderer.RenderManager; import com.jme3.renderer.ViewPort; import com.jme3.scene.Node; import com.jme3.scene.Spatial; import com.jme3.scene.Spatial.CullHint; import com.jme3.scene.control.AbstractControl; -import com.jme3.scene.control.Control; import com.jme3.util.TempVars; import com.jme3.util.clone.Cloner; -import com.jme3.util.clone.JmeCloneable; import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; /** * EffectTrack is a track to add to an existing animation, to emit particles - * during animations for example : exhausts, dust raised by foot steps, shock - * waves, lightnings etc... + * during animations for example: exhaust, dust raised by footsteps, shock + * waves, lightning, etc... * * usage is *

@@ -62,13 +57,14 @@ import java.util.logging.Logger;
  * control.getAnim("TheAnim").addTrack(track);
  * 
* - * if the emitter has emits 0 particles per seconds emmitAllPArticles will be - * called on it at time 0 + startOffset. if it he it has more it will start - * emit normally at time 0 + startOffset. + * if the emitter emits 0 particles per second, emitAllPArticles will be + * called on it at time 0 + startOffset. if it has more it will start + * emitting normally at time 0 + startOffset. * * * @author Nehon */ +@Deprecated public class EffectTrack implements ClonableTrack { private static final Logger logger = Logger.getLogger(EffectTrack.class.getName()); @@ -132,28 +128,17 @@ public class EffectTrack implements ClonableTrack { @Override protected void controlRender(RenderManager rm, ViewPort vp) { } - - @Override - public Control cloneForSpatial(Spatial spatial) { - - KillParticleControl c = new KillParticleControl(); - //this control should be removed as it shouldn't have been persisted in the first place - //In the quest to find the less hackish solution to achieve this, - //making it remove itself from the spatial in the first update loop when loaded was the less bad. - c.remove = true; - c.setSpatial(spatial); - return c; - - } - }; + } //Anim listener that stops the Emmitter when the animation is finished or changed. private class OnEndListener implements AnimEventListener { + @Override public void onAnimCycleDone(AnimControl control, AnimChannel channel, String animName) { stop(); } + @Override public void onAnimChange(AnimControl control, AnimChannel channel, String animName) { } } @@ -203,6 +188,7 @@ public class EffectTrack implements ClonableTrack { * @see Track#setTime(float, float, com.jme3.animation.AnimControl, * com.jme3.animation.AnimChannel, com.jme3.util.TempVars) */ + @Override public void setTime(float time, float weight, AnimControl control, AnimChannel channel, TempVars vars) { if (time >= length) { @@ -213,7 +199,7 @@ public class EffectTrack implements ClonableTrack { control.addListener(new OnEndListener()); initialized = true; } - //checking fo time to trigger the effect + //checking for time to trigger the effect if (!emitted && time >= startOffset) { emitted = true; emitter.setCullHint(CullHint.Dynamic); @@ -248,6 +234,7 @@ public class EffectTrack implements ClonableTrack { * * @return length of the track */ + @Override public float getLength() { return length; } @@ -340,6 +327,7 @@ public class EffectTrack implements ClonableTrack { return null; } + @Override public void cleanUp() { TrackInfo t = (TrackInfo) emitter.getUserData("TrackInfo"); t.getTracks().remove(this); @@ -428,9 +416,10 @@ public class EffectTrack implements ClonableTrack { * @param ex exporter * @throws IOException exception */ + @Override public void write(JmeExporter ex) throws IOException { OutputCapsule out = ex.getCapsule(this); - //reseting the particle emission rate on the emitter before saving. + //reset the particle emission rate on the emitter before saving. emitter.setParticlesPerSec(particlesPerSeconds); out.write(emitter, "emitter", null); out.write(particlesPerSeconds, "particlesPerSeconds", 0); @@ -446,10 +435,11 @@ public class EffectTrack implements ClonableTrack { * @param im importer * @throws IOException Exception */ + @Override public void read(JmeImporter im) throws IOException { InputCapsule in = im.getCapsule(this); this.particlesPerSeconds = in.readFloat("particlesPerSeconds", 0); - //reading the emitter even if the track will then reference its cloned counter part if it's loaded with the assetManager. + //reading the emitter even if the track will then reference its cloned counterpart if it's loaded with the assetManager. //This also avoid null pointer exception if the model is not loaded via the AssetManager. emitter = (ParticleEmitter) in.readSavable("emitter", null); emitter.setParticlesPerSec(0); diff --git a/jme3-core/src/main/java/com/jme3/animation/LoopMode.java b/jme3-core/src/main/java/com/jme3/animation/LoopMode.java index ca7b1eb1c..16ca1deb0 100644 --- a/jme3-core/src/main/java/com/jme3/animation/LoopMode.java +++ b/jme3-core/src/main/java/com/jme3/animation/LoopMode.java @@ -35,6 +35,7 @@ package com.jme3.animation; * LoopMode determines how animations repeat, or if they * do not repeat. */ +@Deprecated public enum LoopMode { /** * The animation will play repeatedly, when it reaches the end diff --git a/jme3-core/src/main/java/com/jme3/animation/Pose.java b/jme3-core/src/main/java/com/jme3/animation/Pose.java index fc06d0d07..f5d0e305a 100644 --- a/jme3-core/src/main/java/com/jme3/animation/Pose.java +++ b/jme3-core/src/main/java/com/jme3/animation/Pose.java @@ -34,12 +34,14 @@ package com.jme3.animation; import com.jme3.export.*; import com.jme3.math.Vector3f; import com.jme3.util.BufferUtils; + import java.io.IOException; import java.nio.FloatBuffer; /** * A pose is a list of offsets that say where a mesh vertices should be for this pose. */ +@Deprecated public final class Pose implements Savable, Cloneable { private String name; diff --git a/jme3-core/src/main/java/com/jme3/animation/Skeleton.java b/jme3-core/src/main/java/com/jme3/animation/Skeleton.java index 904d7a298..651bf06a3 100644 --- a/jme3-core/src/main/java/com/jme3/animation/Skeleton.java +++ b/jme3-core/src/main/java/com/jme3/animation/Skeleton.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -31,11 +31,13 @@ */ package com.jme3.animation; +import com.jme3.anim.Armature; import com.jme3.export.*; import com.jme3.math.Matrix4f; import com.jme3.util.TempVars; -import com.jme3.util.clone.JmeCloneable; import com.jme3.util.clone.Cloner; +import com.jme3.util.clone.JmeCloneable; + import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -46,14 +48,16 @@ import java.util.List; * animated matrixes. * * @author Kirill Vainer + * @deprecated use {@link Armature} */ +@Deprecated public final class Skeleton implements Savable, JmeCloneable { private Bone[] rootBones; private Bone[] boneList; /** - * Contains the skinning matrices, multiplying it by a vertex effected by a bone + * Contains the skinning matrices, multiplying it by a vertex affected by a bone * will cause it to go to the animated position. */ private transient Matrix4f[] skinningMatrixes; @@ -169,7 +173,7 @@ public final class Skeleton implements Savable, JmeCloneable { } /** - * Saves the current skeleton state as it's binding pose. + * Saves the current skeleton state as its binding pose. */ public void setBindingPose() { for (int i = rootBones.length - 1; i >= 0; i--) { @@ -304,6 +308,7 @@ public final class Skeleton implements Savable, JmeCloneable { createSkinningMatrices(); for (Bone rootBone : rootBones) { + rootBone.reset(); rootBone.update(); rootBone.setBindingPose(); } diff --git a/jme3-core/src/main/java/com/jme3/animation/SkeletonControl.java b/jme3-core/src/main/java/com/jme3/animation/SkeletonControl.java index 4cefd721c..06f6927ab 100644 --- a/jme3-core/src/main/java/com/jme3/animation/SkeletonControl.java +++ b/jme3-core/src/main/java/com/jme3/animation/SkeletonControl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2017 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -31,25 +31,23 @@ */ package com.jme3.animation; +import com.jme3.anim.SkinningControl; import com.jme3.export.*; import com.jme3.material.MatParamOverride; import com.jme3.math.FastMath; import com.jme3.math.Matrix4f; -import com.jme3.renderer.RenderManager; -import com.jme3.renderer.RendererException; -import com.jme3.renderer.ViewPort; +import com.jme3.renderer.*; import com.jme3.scene.*; import com.jme3.scene.VertexBuffer.Type; import com.jme3.scene.control.AbstractControl; -import com.jme3.scene.control.Control; import com.jme3.scene.mesh.IndexBuffer; import com.jme3.shader.VarType; -import com.jme3.util.*; +import com.jme3.util.SafeArrayList; +import com.jme3.util.TempVars; import com.jme3.util.clone.Cloner; import com.jme3.util.clone.JmeCloneable; import java.io.IOException; import java.nio.Buffer; -import java.nio.ByteBuffer; import java.nio.FloatBuffer; import java.util.logging.Level; import java.util.logging.Logger; @@ -60,7 +58,9 @@ import java.util.logging.Logger; * the mesh * * @author Rémy Bouquet Based on AnimControl by Kirill Vainer + * @deprecated use {@link SkinningControl} */ +@Deprecated public class SkeletonControl extends AbstractControl implements Cloneable, JmeCloneable { /** @@ -145,6 +145,12 @@ public class SkeletonControl extends AbstractControl implements Cloneable, JmeCl } private boolean testHardwareSupported(RenderManager rm) { + + //Only 255 bones max supported with hardware skinning + if (skeleton.getBoneCount() > 255) { + return false; + } + switchToHardware(); try { @@ -158,7 +164,7 @@ public class SkeletonControl extends AbstractControl implements Cloneable, JmeCl /** * Specifies if hardware skinning is preferred. If it is preferred and - * supported by GPU, it shall be enabled, if its not preferred, or not + * supported by GPU, it shall be enabled, if it's not preferred, or not * supported by GPU, then it shall be disabled. * * @param preferred @@ -326,7 +332,7 @@ public class SkeletonControl extends AbstractControl implements Cloneable, JmeCl bpb.clear(); bnb.clear(); - //reseting bind tangents if there is a bind tangent buffer + //reset bind tangents if there is a bind tangent buffer VertexBuffer bindTangents = mesh.getBuffer(Type.BindPoseTangent); if (bindTangents != null) { VertexBuffer tangents = mesh.getBuffer(Type.Tangent); @@ -344,47 +350,6 @@ public class SkeletonControl extends AbstractControl implements Cloneable, JmeCl } } - @Override - public Control cloneForSpatial(Spatial spatial) { - Node clonedNode = (Node) spatial; - SkeletonControl clone = new SkeletonControl(); - - AnimControl ctrl = spatial.getControl(AnimControl.class); - if (ctrl != null) { - // AnimControl is responsible for cloning the skeleton, not - // SkeletonControl. - clone.skeleton = ctrl.getSkeleton(); - } else { - // If there's no AnimControl, create the clone ourselves. - clone.skeleton = new Skeleton(skeleton); - } - clone.hwSkinningDesired = this.hwSkinningDesired; - clone.hwSkinningEnabled = this.hwSkinningEnabled; - clone.hwSkinningSupported = this.hwSkinningSupported; - clone.hwSkinningTested = this.hwSkinningTested; - - clone.setSpatial(clonedNode); - - // Fix attachments for the cloned node - for (int i = 0; i < clonedNode.getQuantity(); i++) { - // go through attachment nodes, apply them to correct bone - Spatial child = clonedNode.getChild(i); - if (child instanceof Node) { - Node clonedAttachNode = (Node) child; - Bone originalBone = (Bone) clonedAttachNode.getUserData("AttachedBone"); - - if (originalBone != null) { - Bone clonedBone = clone.skeleton.getBone(originalBone.getName()); - - clonedAttachNode.setUserData("AttachedBone", clonedBone); - clonedBone.setAttachmentsNode(clonedAttachNode); - } - } - } - - return clone; - } - @Override public Object jmeClone() { return super.jmeClone(); diff --git a/jme3-core/src/main/java/com/jme3/animation/SpatialTrack.java b/jme3-core/src/main/java/com/jme3/animation/SpatialTrack.java index c770838f0..fc992d2b0 100644 --- a/jme3-core/src/main/java/com/jme3/animation/SpatialTrack.java +++ b/jme3-core/src/main/java/com/jme3/animation/SpatialTrack.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -31,27 +31,23 @@ */ package com.jme3.animation; -import com.jme3.export.InputCapsule; -import com.jme3.export.JmeExporter; -import com.jme3.export.JmeImporter; -import com.jme3.export.OutputCapsule; +import com.jme3.export.*; import com.jme3.math.Quaternion; import com.jme3.math.Vector3f; import com.jme3.scene.Spatial; import com.jme3.util.TempVars; import com.jme3.util.clone.Cloner; import com.jme3.util.clone.JmeCloneable; - import java.io.IOException; -import java.util.Arrays; /** * This class represents the track for spatial animation. * * @author Marcin Roguski (Kaelthas) */ -public class SpatialTrack implements Track, JmeCloneable { - +@Deprecated +public class SpatialTrack implements JmeCloneable, Track { + /** * Translations of the track. */ @@ -250,9 +246,16 @@ public class SpatialTrack implements Track, JmeCloneable { return times == null ? 0 : times[times.length - 1] - times[0]; } + /** + * Create a clone with the same track spatial. + * + * @return a new track + */ @Override - public Track clone() { - return (Track) jmeClone(); + public SpatialTrack clone() { + Cloner cloner = new Cloner(); + cloner.setClonedValue(trackSpatial, trackSpatial); + return cloner.clone(this); } @Override @@ -268,24 +271,38 @@ public class SpatialTrack implements Track, JmeCloneable { return trackSpatial; } + /** + * Create a shallow clone for the JME cloner. + * + * @return a new track + */ @Override - public Object jmeClone() { - int tablesLength = times.length; - - float[] timesCopy = this.times.clone(); - Vector3f[] translationsCopy = this.getTranslations() == null ? null : Arrays.copyOf(this.getTranslations(), tablesLength); - Quaternion[] rotationsCopy = this.getRotations() == null ? null : Arrays.copyOf(this.getRotations(), tablesLength); - Vector3f[] scalesCopy = this.getScales() == null ? null : Arrays.copyOf(this.getScales(), tablesLength); - - //need to use the constructor here because of the final fields used in this class - return new SpatialTrack(timesCopy, translationsCopy, rotationsCopy, scalesCopy); + public SpatialTrack jmeClone() { + try { + return (SpatialTrack) super.clone(); + } catch (CloneNotSupportedException exception) { + throw new RuntimeException("Can't clone track", exception); + } } + /** + * Callback from {@link com.jme3.util.clone.Cloner} to convert this + * shallow-cloned track into a deep-cloned one, using the specified cloner + * to resolve copied fields. + * + * @param cloner the cloner currently cloning this control (not null) + * @param original the track from which this track was shallow-cloned + * (unused) + */ @Override public void cloneFields(Cloner cloner, Object original) { - this.trackSpatial = cloner.clone(((SpatialTrack) original).trackSpatial); + translations = cloner.clone(translations); + rotations = cloner.clone(rotations); + scales = cloner.clone(scales); + trackSpatial = cloner.clone(trackSpatial); + times = cloner.clone(times); } - + @Override public void write(JmeExporter ex) throws IOException { OutputCapsule oc = ex.getCapsule(this); diff --git a/jme3-core/src/main/java/com/jme3/animation/Track.java b/jme3-core/src/main/java/com/jme3/animation/Track.java index 4eafed06a..7777e8894 100644 --- a/jme3-core/src/main/java/com/jme3/animation/Track.java +++ b/jme3-core/src/main/java/com/jme3/animation/Track.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -34,6 +34,7 @@ package com.jme3.animation; import com.jme3.export.Savable; import com.jme3.util.TempVars; +@Deprecated public interface Track extends Savable, Cloneable { /** @@ -44,9 +45,9 @@ public interface Track extends Savable, Cloneable { * given parameters. * * @param time The time in the animation - * @param weight The weight from 0 to 1 on how much to apply the track - * @param control The control which the track should effect - * @param channel The channel which the track should effect + * @param weight The weight from 0 to 1 on how much to apply the track + * @param control The control which the track should affect + * @param channel The channel which the track should affect */ public void setTime(float time, float weight, AnimControl control, AnimChannel channel, TempVars vars); diff --git a/jme3-core/src/main/java/com/jme3/animation/TrackInfo.java b/jme3-core/src/main/java/com/jme3/animation/TrackInfo.java index 7ee927cd3..93fd6a88e 100644 --- a/jme3-core/src/main/java/com/jme3/animation/TrackInfo.java +++ b/jme3-core/src/main/java/com/jme3/animation/TrackInfo.java @@ -31,13 +31,10 @@ */ package com.jme3.animation; -import com.jme3.export.InputCapsule; -import com.jme3.export.JmeExporter; -import com.jme3.export.JmeImporter; -import com.jme3.export.OutputCapsule; -import com.jme3.export.Savable; +import com.jme3.export.*; import com.jme3.util.clone.Cloner; import com.jme3.util.clone.JmeCloneable; + import java.io.IOException; import java.util.ArrayList; @@ -50,6 +47,7 @@ import java.util.ArrayList; * * @author Nehon */ +@Deprecated public class TrackInfo implements Savable, JmeCloneable { ArrayList tracks = new ArrayList(); diff --git a/jme3-core/src/main/java/com/jme3/app/DetailedProfilerState.java b/jme3-core/src/main/java/com/jme3/app/DetailedProfilerState.java index fa1de0cb3..c4d6e74da 100644 --- a/jme3-core/src/main/java/com/jme3/app/DetailedProfilerState.java +++ b/jme3-core/src/main/java/com/jme3/app/DetailedProfilerState.java @@ -59,6 +59,8 @@ public class DetailedProfilerState extends BaseAppState { private ColorRGBA dimmedOrange = ColorRGBA.Orange.mult(0.7f); private ColorRGBA dimmedRed = ColorRGBA.Red.mult(0.7f); + private ProfilerInputListener inputListener = new ProfilerInputListener(); + public DetailedProfilerState() { } @@ -119,23 +121,17 @@ public class DetailedProfilerState extends BaseAppState { if (inputManager != null) { inputManager.addMapping(TOGGLE_KEY, new KeyTrigger(KeyInput.KEY_F6)); inputManager.addMapping(CLICK_KEY, new MouseButtonTrigger(MouseInput.BUTTON_LEFT)); - inputManager.addListener(new ActionListener() { - @Override - public void onAction(String name, boolean isPressed, float tpf) { - if (name.equals(TOGGLE_KEY) && isPressed) { - setEnabled(!isEnabled()); - } - if (isEnabled() && name.equals(CLICK_KEY) && isPressed) { - handleClick(inputManager.getCursorPosition()); - } - } - }, TOGGLE_KEY, CLICK_KEY); + inputManager.addListener(inputListener, TOGGLE_KEY, CLICK_KEY); } } @Override protected void cleanup(Application app) { - + ui.detachAllChildren(); + InputManager manager = getApplication().getInputManager(); + manager.deleteMapping(TOGGLE_KEY); + manager.deleteMapping(CLICK_KEY); + manager.removeListener(inputListener); } @Override @@ -441,8 +437,18 @@ public class DetailedProfilerState extends BaseAppState { public String toString() { return label.getText() + " - " + df.format(getMsFromNs(cpuValue)) + "ms / " + df.format(getMsFromNs(gpuValue)) + "ms"; } + } - + private class ProfilerInputListener implements ActionListener { + @Override + public void onAction(String name, boolean isPressed, float tpf) { + if (name.equals(TOGGLE_KEY) && isPressed) { + setEnabled(!isEnabled()); + } + if (isEnabled() && name.equals(CLICK_KEY) && isPressed) { + handleClick(getApplication().getInputManager().getCursorPosition()); + } + } } } diff --git a/jme3-core/src/main/java/com/jme3/app/StatsView.java b/jme3-core/src/main/java/com/jme3/app/StatsView.java index 8b88833c2..4e9411f18 100644 --- a/jme3-core/src/main/java/com/jme3/app/StatsView.java +++ b/jme3-core/src/main/java/com/jme3/app/StatsView.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -117,11 +117,12 @@ public class StatsView extends Node implements Control, JmeCloneable { //statistics.clearFrame(); } + @Deprecated @Override public Control cloneForSpatial(Spatial spatial) { - return (Control) spatial; + throw new UnsupportedOperationException(); } - + @Override public StatsView jmeClone() { throw new UnsupportedOperationException("Not yet implemented."); diff --git a/jme3-core/src/main/java/com/jme3/app/state/AppStateManager.java b/jme3-core/src/main/java/com/jme3/app/state/AppStateManager.java index 177fcb22f..df7eeb4b2 100644 --- a/jme3-core/src/main/java/com/jme3/app/state/AppStateManager.java +++ b/jme3-core/src/main/java/com/jme3/app/state/AppStateManager.java @@ -210,6 +210,18 @@ public class AppStateManager { * @return First attached state that is an instance of stateClass */ public T getState(Class stateClass){ + return getState(stateClass, false); + } + + /** + * Returns the first state that is an instance of subclass of the specified class. + * @param + * @param stateClass + * @param failOnMiss + * @return First attached state that is an instance of stateClass. If failOnMiss is true + * then an IllegalArgumentException is thrown if the state is not attached. + */ + public T getState(Class stateClass, boolean failOnMiss){ synchronized (states){ AppState[] array = getStates(); for (AppState state : array) { @@ -229,6 +241,10 @@ public class AppStateManager { } } } + + if(failOnMiss) { + throw new IllegalArgumentException("State not found for:" + stateClass); + } return null; } diff --git a/jme3-core/src/main/java/com/jme3/app/state/BaseAppState.java b/jme3-core/src/main/java/com/jme3/app/state/BaseAppState.java index a8a80f19e..cee045355 100644 --- a/jme3-core/src/main/java/com/jme3/app/state/BaseAppState.java +++ b/jme3-core/src/main/java/com/jme3/app/state/BaseAppState.java @@ -142,7 +142,11 @@ public abstract class BaseAppState implements AppState { } public final T getState( Class type ) { - return getStateManager().getState(type); + return getState( type, false ); + } + + public final T getState( Class type, boolean failOnMiss ) { + return getStateManager().getState( type, failOnMiss ); } @Override diff --git a/jme3-core/src/main/java/com/jme3/app/state/ScreenshotAppState.java b/jme3-core/src/main/java/com/jme3/app/state/ScreenshotAppState.java index ea4d5cd73..6fa35c2d7 100644 --- a/jme3-core/src/main/java/com/jme3/app/state/ScreenshotAppState.java +++ b/jme3-core/src/main/java/com/jme3/app/state/ScreenshotAppState.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -80,10 +80,10 @@ public class ScreenshotAppState extends AbstractAppState implements ActionListen /** * This constructor allows you to specify the output file path of the screenshot. - * Include the seperator at the end of the path. - * Use an emptry string to use the application folder. Use NULL to use the system + * Include the separator at the end of the path. + * Use an empty string to use the application folder. Use NULL to use the system * default storage folder. - * @param filePath The screenshot file path to use. Include the seperator at the end of the path. + * @param filePath The screenshot file path to use. Include the separator at the end of the path. */ public ScreenshotAppState(String filePath) { this.filePath = filePath; @@ -91,11 +91,11 @@ public class ScreenshotAppState extends AbstractAppState implements ActionListen /** * This constructor allows you to specify the output file path of the screenshot. - * Include the seperator at the end of the path. - * Use an emptry string to use the application folder. Use NULL to use the system + * Include the separator at the end of the path. + * Use an empty string to use the application folder. Use NULL to use the system * default storage folder. - * @param filePath The screenshot file path to use. Include the seperator at the end of the path. - * @param fileName The name of the file to save the screeshot as. + * @param filePath The screenshot file path to use. Include the separator at the end of the path. + * @param fileName The name of the file to save the screenshot as. */ public ScreenshotAppState(String filePath, String fileName) { this.filePath = filePath; @@ -105,10 +105,10 @@ public class ScreenshotAppState extends AbstractAppState implements ActionListen /** * This constructor allows you to specify the output file path of the screenshot and * a base index for the shot index. - * Include the seperator at the end of the path. - * Use an emptry string to use the application folder. Use NULL to use the system + * Include the separator at the end of the path. + * Use an empty string to use the application folder. Use NULL to use the system * default storage folder. - * @param filePath The screenshot file path to use. Include the seperator at the end of the path. + * @param filePath The screenshot file path to use. Include the separator at the end of the path. * @param shotIndex The base index for screen shots. The first screen shot will have * shotIndex + 1 appended, the next shotIndex + 2, and so on. */ @@ -120,11 +120,11 @@ public class ScreenshotAppState extends AbstractAppState implements ActionListen /** * This constructor allows you to specify the output file path of the screenshot and * a base index for the shot index. - * Include the seperator at the end of the path. - * Use an emptry string to use the application folder. Use NULL to use the system + * Include the separator at the end of the path. + * Use an empty string to use the application folder. Use NULL to use the system * default storage folder. - * @param filePath The screenshot file path to use. Include the seperator at the end of the path. - * @param fileName The name of the file to save the screeshot as. + * @param filePath The screenshot file path to use. Include the separator at the end of the path. + * @param fileName The name of the file to save the screenshot as. * @param shotIndex The base index for screen shots. The first screen shot will have * shotIndex + 1 appended, the next shotIndex + 2, and so on. */ @@ -136,10 +136,10 @@ public class ScreenshotAppState extends AbstractAppState implements ActionListen /** * Set the file path to store the screenshot. - * Include the seperator at the end of the path. - * Use an emptry string to use the application folder. Use NULL to use the system + * Include the separator at the end of the path. + * Use an empty string to use the application folder. Use NULL to use the system * default storage folder. - * @param filePath File path to use to store the screenshot. Include the seperator at the end of the path. + * @param filePath File path to use to store the screenshot. Include the separator at the end of the path. */ public void setFilePath(String filePath) { this.filePath = filePath; diff --git a/jme3-core/src/main/java/com/jme3/asset/AssetManager.java b/jme3-core/src/main/java/com/jme3/asset/AssetManager.java index 4cd284340..0f6836e6d 100644 --- a/jme3-core/src/main/java/com/jme3/asset/AssetManager.java +++ b/jme3-core/src/main/java/com/jme3/asset/AssetManager.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -217,7 +217,7 @@ public interface AssetManager { * Load an asset from a key, the asset will be located * by one of the {@link AssetLocator} implementations provided in the * {@link AssetManager#registerLocator(java.lang.String, java.lang.Class) } - * call. If located successfully, it will be loaded via the the appropriate + * call. If located successfully, it will be loaded via the appropriate * {@link AssetLoader} implementation based on the file's extension, as * specified in the call * {@link AssetManager#registerLoader(java.lang.Class, java.lang.String[]) }. diff --git a/jme3-core/src/main/java/com/jme3/asset/cache/WeakRefCloneAssetCache.java b/jme3-core/src/main/java/com/jme3/asset/cache/WeakRefCloneAssetCache.java index ab3581013..c7446dfc3 100644 --- a/jme3-core/src/main/java/com/jme3/asset/cache/WeakRefCloneAssetCache.java +++ b/jme3-core/src/main/java/com/jme3/asset/cache/WeakRefCloneAssetCache.java @@ -112,11 +112,10 @@ public class WeakRefCloneAssetCache implements AssetCache { // might not even have this asset anymore, it is OK. if (smartCache.remove(key) != null){ removedAssets ++; - //System.out.println("WeakRefAssetCache: The asset " + ref.assetKey + " was purged from the cache"); } } if (removedAssets >= 1) { - logger.log(Level.FINE, "WeakRefAssetCache: {0} assets were purged from the cache.", removedAssets); + logger.log(Level.FINE, "WeakRefCloneAssetCache: {0} assets were purged from the cache.", removedAssets); } } diff --git a/jme3-core/src/main/java/com/jme3/audio/AudioNode.java b/jme3-core/src/main/java/com/jme3/audio/AudioNode.java index d1c7b8ef8..862348b63 100644 --- a/jme3-core/src/main/java/com/jme3/audio/AudioNode.java +++ b/jme3-core/src/main/java/com/jme3/audio/AudioNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012, 2016 jMonkeyEngine + * Copyright (c) 2009-2012, 2016, 2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -221,7 +221,7 @@ public class AudioNode extends Node implements AudioSource { /** * Start playing an instance of this audio. This method can be used * to play the same AudioNode multiple times. Note - * that changes to the parameters of this AudioNode will not effect the + * that changes to the parameters of this AudioNode will not affect the * instances already playing. */ public void playInstance(){ @@ -278,8 +278,8 @@ public class AudioNode extends Node implements AudioSource { * the dry filter will only influence the "dry" portion of the audio, * e.g. not the reverberated parts of the AudioNode playing. * - * See the relevent documentation for the {@link Filter} to determine - * the effect. + * See the relevant documentation for the {@link Filter} to determine the + * effect. * * @param dryFilter The filter to set, or null to disable dry filter. */ @@ -692,7 +692,7 @@ public class AudioNode extends Node implements AudioSource { /** * Set the audio node as positional. - * The position, velocity, and distance parameters effect positional + * The position, velocity, and distance parameters affect positional * audio nodes. Set to false if the audio node should play in "headspace". * * @param positional True if the audio node should be positional, otherwise @@ -722,25 +722,14 @@ public class AudioNode extends Node implements AudioSource { @Override public void updateGeometricState() { super.updateGeometricState(); - - if (channel < 0) { - return; - } - + if (channel < 0 || this.getParent() == null) return; Vector3f currentWorldTranslation = worldTransform.getTranslation(); - - if (Float.isNaN(previousWorldTranslation.x) - || !previousWorldTranslation.equals(currentWorldTranslation)) { - + if (!previousWorldTranslation.equals(currentWorldTranslation)) { getRenderer().updateSourceParam(this, AudioParam.Position); - - if (velocityFromTranslation) { - velocity.set(currentWorldTranslation).subtractLocal(previousWorldTranslation); - velocity.multLocal(1f / lastTpf); - + if (velocityFromTranslation && !Float.isNaN(previousWorldTranslation.x)) { + velocity.set(currentWorldTranslation).subtractLocal(previousWorldTranslation).multLocal(1f / lastTpf); getRenderer().updateSourceParam(this, AudioParam.Velocity); } - previousWorldTranslation.set(currentWorldTranslation); } } @@ -748,10 +737,6 @@ public class AudioNode extends Node implements AudioSource { @Override public AudioNode clone(){ AudioNode clone = (AudioNode) super.clone(); - - clone.direction = direction.clone(); - clone.velocity = velocity.clone(); - return clone; } @@ -760,10 +745,11 @@ public class AudioNode extends Node implements AudioSource { */ @Override public void cloneFields( Cloner cloner, Object original ) { - super.cloneFields(cloner, original); + super.cloneFields(cloner, original); - this.direction = cloner.clone(direction); - this.velocity = cloner.clone(velocity); + this.direction=cloner.clone(direction); + this.velocity=velocityFromTranslation?new Vector3f():cloner.clone(velocity); + this.previousWorldTranslation=Vector3f.NAN.clone(); // Change in behavior: the filters were not cloned before meaning // that two cloned audio nodes would share the same filter instance. diff --git a/jme3-core/src/main/java/com/jme3/audio/openal/AL.java b/jme3-core/src/main/java/com/jme3/audio/openal/AL.java index ac8d12eca..380550254 100644 --- a/jme3-core/src/main/java/com/jme3/audio/openal/AL.java +++ b/jme3-core/src/main/java/com/jme3/audio/openal/AL.java @@ -12,37 +12,37 @@ public interface AL { /** * Boolean False. */ - static final int AL_FALSE = 0; + public static final int AL_FALSE = 0; /** * Boolean True. */ - static final int AL_TRUE = 1; + public static final int AL_TRUE = 1; /* "no distance model" or "no buffer" */ - static final int AL_NONE = 0; + public static final int AL_NONE = 0; /** * Indicate Source has relative coordinates. */ - static final int AL_SOURCE_RELATIVE = 0x202; + public static final int AL_SOURCE_RELATIVE = 0x202; /** * Directional source, inner cone angle, in degrees. Range: [0-360] Default: * 360 */ - static final int AL_CONE_INNER_ANGLE = 0x1001; + public static final int AL_CONE_INNER_ANGLE = 0x1001; /** * Directional source, outer cone angle, in degrees. Range: [0-360] Default: * 360 */ - static final int AL_CONE_OUTER_ANGLE = 0x1002; + public static final int AL_CONE_OUTER_ANGLE = 0x1002; /** * Specify the pitch to be applied at source. Range: [0.5-2.0] Default: 1.0 */ - static final int AL_PITCH = 0x1003; + public static final int AL_PITCH = 0x1003; /** * Specify the current location in three dimensional space. OpenAL, like @@ -52,84 +52,84 @@ public interface AL { * coordinate system, flip the sign on the Z coordinate. Listener position * is always in the world coordinate system. */ - static final int AL_POSITION = 0x1004; + public static final int AL_POSITION = 0x1004; /** * Specify the current direction. */ - static final int AL_DIRECTION = 0x1005; + public static final int AL_DIRECTION = 0x1005; /** * Specify the current velocity in three dimensional space. */ - static final int AL_VELOCITY = 0x1006; + public static final int AL_VELOCITY = 0x1006; /** * Indicate whether source is looping. Type: ALboolean? Range: [AL_TRUE, * AL_FALSE] Default: FALSE. */ - static final int AL_LOOPING = 0x1007; + public static final int AL_LOOPING = 0x1007; /** * Indicate the buffer to provide sound samples. Type: ALuint. Range: any * valid Buffer id. */ - static final int AL_BUFFER = 0x1009; + public static final int AL_BUFFER = 0x1009; /** * Indicate the gain (volume amplification) applied. Type: ALfloat. Range: * ]0.0- ] A value of 1.0 means un-attenuated/unchanged. Each division by 2 - * equals an attenuation of -6dB. Each multiplicaton with 2 equals an + * equals an attenuation of -6dB. Each multiplication by 2 equals an * amplification of +6dB. A value of 0.0 is meaningless with respect to a * logarithmic scale; it is interpreted as zero volume - the channel is * effectively disabled. */ - static final int AL_GAIN = 0x100A; + public static final int AL_GAIN = 0x100A; /* * Indicate minimum source attenuation * Type: ALfloat * Range: [0.0 - 1.0] * - * Logarthmic + * Logarithmic */ - static final int AL_MIN_GAIN = 0x100D; + public static final int AL_MIN_GAIN = 0x100D; /** * Indicate maximum source attenuation Type: ALfloat Range: [0.0 - 1.0] * - * Logarthmic + * Logarithmic */ - static final int AL_MAX_GAIN = 0x100E; + public static final int AL_MAX_GAIN = 0x100E; /** * Indicate listener orientation. * * at/up */ - static final int AL_ORIENTATION = 0x100F; + public static final int AL_ORIENTATION = 0x100F; /** * Source state information. */ - static final int AL_SOURCE_STATE = 0x1010; - static final int AL_INITIAL = 0x1011; - static final int AL_PLAYING = 0x1012; - static final int AL_PAUSED = 0x1013; - static final int AL_STOPPED = 0x1014; + public static final int AL_SOURCE_STATE = 0x1010; + public static final int AL_INITIAL = 0x1011; + public static final int AL_PLAYING = 0x1012; + public static final int AL_PAUSED = 0x1013; + public static final int AL_STOPPED = 0x1014; /** * Buffer Queue params */ - static final int AL_BUFFERS_QUEUED = 0x1015; - static final int AL_BUFFERS_PROCESSED = 0x1016; + public static final int AL_BUFFERS_QUEUED = 0x1015; + public static final int AL_BUFFERS_PROCESSED = 0x1016; /** * Source buffer position information */ - static final int AL_SEC_OFFSET = 0x1024; - static final int AL_SAMPLE_OFFSET = 0x1025; - static final int AL_BYTE_OFFSET = 0x1026; + public static final int AL_SEC_OFFSET = 0x1024; + public static final int AL_SAMPLE_OFFSET = 0x1025; + public static final int AL_BYTE_OFFSET = 0x1026; /* * Source type (Static, Streaming or undetermined) @@ -137,38 +137,38 @@ public interface AL { * Source is Streaming if one or more Buffers have been attached using alSourceQueueBuffers * Source is undetermined when it has the NULL buffer attached */ - static final int AL_SOURCE_TYPE = 0x1027; - static final int AL_STATIC = 0x1028; - static final int AL_STREAMING = 0x1029; - static final int AL_UNDETERMINED = 0x1030; + public static final int AL_SOURCE_TYPE = 0x1027; + public static final int AL_STATIC = 0x1028; + public static final int AL_STREAMING = 0x1029; + public static final int AL_UNDETERMINED = 0x1030; /** * Sound samples: format specifier. */ - static final int AL_FORMAT_MONO8 = 0x1100; - static final int AL_FORMAT_MONO16 = 0x1101; - static final int AL_FORMAT_STEREO8 = 0x1102; - static final int AL_FORMAT_STEREO16 = 0x1103; + public static final int AL_FORMAT_MONO8 = 0x1100; + public static final int AL_FORMAT_MONO16 = 0x1101; + public static final int AL_FORMAT_STEREO8 = 0x1102; + public static final int AL_FORMAT_STEREO16 = 0x1103; /** * source specific reference distance Type: ALfloat Range: 0.0 - +inf * * At 0.0, no distance attenuation occurs. Default is 1.0. */ - static final int AL_REFERENCE_DISTANCE = 0x1020; + public static final int AL_REFERENCE_DISTANCE = 0x1020; /** * source specific rolloff factor Type: ALfloat Range: 0.0 - +inf * */ - static final int AL_ROLLOFF_FACTOR = 0x1021; + public static final int AL_ROLLOFF_FACTOR = 0x1021; /** * Directional source, outer cone gain. * * Default: 0.0 Range: [0.0 - 1.0] Logarithmic */ - static final int AL_CONE_OUTER_GAIN = 0x1022; + public static final int AL_CONE_OUTER_GAIN = 0x1022; /** * Indicate distance above which sources are not attenuated using the @@ -176,64 +176,64 @@ public interface AL { * * Default: +inf Type: ALfloat Range: 0.0 - +inf */ - static final int AL_MAX_DISTANCE = 0x1023; + public static final int AL_MAX_DISTANCE = 0x1023; /** * Sound samples: frequency, in units of Hertz [Hz]. This is the number of * samples per second. Half of the sample frequency marks the maximum * significant frequency component. */ - static final int AL_FREQUENCY = 0x2001; - static final int AL_BITS = 0x2002; - static final int AL_CHANNELS = 0x2003; - static final int AL_SIZE = 0x2004; + public static final int AL_FREQUENCY = 0x2001; + public static final int AL_BITS = 0x2002; + public static final int AL_CHANNELS = 0x2003; + public static final int AL_SIZE = 0x2004; /** * Buffer state. * * Not supported for public use (yet). */ - static final int AL_UNUSED = 0x2010; - static final int AL_PENDING = 0x2011; - static final int AL_PROCESSED = 0x2012; + public static final int AL_UNUSED = 0x2010; + public static final int AL_PENDING = 0x2011; + public static final int AL_PROCESSED = 0x2012; /** * Errors: No Error. */ - static final int AL_NO_ERROR = 0; + public static final int AL_NO_ERROR = 0; /** - * Invalid Name paramater passed to AL call. + * Invalid Name parameter passed to AL call. */ - static final int AL_INVALID_NAME = 0xA001; + public static final int AL_INVALID_NAME = 0xA001; /** * Invalid parameter passed to AL call. */ - static final int AL_INVALID_ENUM = 0xA002; + public static final int AL_INVALID_ENUM = 0xA002; /** * Invalid enum parameter value. */ - static final int AL_INVALID_VALUE = 0xA003; + public static final int AL_INVALID_VALUE = 0xA003; /** * Illegal call. */ - static final int AL_INVALID_OPERATION = 0xA004; + public static final int AL_INVALID_OPERATION = 0xA004; /** * No mojo. */ - static final int AL_OUT_OF_MEMORY = 0xA005; + public static final int AL_OUT_OF_MEMORY = 0xA005; /** * Context strings: Vendor Name. */ - static final int AL_VENDOR = 0xB001; - static final int AL_VERSION = 0xB002; - static final int AL_RENDERER = 0xB003; - static final int AL_EXTENSIONS = 0xB004; + public static final int AL_VENDOR = 0xB001; + public static final int AL_VERSION = 0xB002; + public static final int AL_RENDERER = 0xB003; + public static final int AL_EXTENSIONS = 0xB004; /** * Global tweakage. @@ -241,56 +241,241 @@ public interface AL { /** * Doppler scale. Default 1.0 */ - static final int AL_DOPPLER_FACTOR = 0xC000; + public static final int AL_DOPPLER_FACTOR = 0xC000; /** * Tweaks speed of propagation. */ - static final int AL_DOPPLER_VELOCITY = 0xC001; + public static final int AL_DOPPLER_VELOCITY = 0xC001; /** * Speed of Sound in units per second */ - static final int AL_SPEED_OF_SOUND = 0xC003; + public static final int AL_SPEED_OF_SOUND = 0xC003; /** * Distance models * * used in conjunction with DistanceModel * - * implicit: NONE, which disances distance attenuation. - */ - static final int AL_DISTANCE_MODEL = 0xD000; - static final int AL_INVERSE_DISTANCE = 0xD001; - static final int AL_INVERSE_DISTANCE_CLAMPED = 0xD002; - static final int AL_LINEAR_DISTANCE = 0xD003; - static final int AL_LINEAR_DISTANCE_CLAMPED = 0xD004; - static final int AL_EXPONENT_DISTANCE = 0xD005; - static final int AL_EXPONENT_DISTANCE_CLAMPED = 0xD006; -// -///* Listener parameter value ranges and defaults. */ -//#define AL_MIN_METERS_PER_UNIT FLT_MIN -//#define AL_MAX_METERS_PER_UNIT FLT_MAX -//#define AL_DEFAULT_METERS_PER_UNIT (1.0f) + * implicit: NONE, which disables distance attenuation. + */ + public static final int AL_DISTANCE_MODEL = 0xD000; + public static final int AL_INVERSE_DISTANCE = 0xD001; + public static final int AL_INVERSE_DISTANCE_CLAMPED = 0xD002; + public static final int AL_LINEAR_DISTANCE = 0xD003; + public static final int AL_LINEAR_DISTANCE_CLAMPED = 0xD004; + public static final int AL_EXPONENT_DISTANCE = 0xD005; + public static final int AL_EXPONENT_DISTANCE_CLAMPED = 0xD006; + + // + ///* Listener parameter value ranges and defaults. */ + //#define AL_MIN_METERS_PER_UNIT FLT_MIN + //#define AL_MAX_METERS_PER_UNIT FLT_MAX + //#define AL_DEFAULT_METERS_PER_UNIT (1.0f) public String alGetString(int parameter); + + /** + * Requests a number of source names. + * + * @return the number of source names. + */ public int alGenSources(); + + /** + * Obtains error information. + *

+ *

Each detectable error is assigned a numeric code. When an error is detected by AL, a flag is set and the error code is recorded. Further errors, if they + * occur, do not affect this recorded code. When alGetError is called, the code is returned and the flag is cleared, so that a further error will again + * record its code. If a call to alGetError returns AL_NO_ERROR then there has been no detectable error since the last call to alGetError (or since the AL + * was initialized).

+ *

+ *

Error codes can be mapped to strings. The alGetString function returns a pointer to a constant (literal) string that is identical to the identifier used + * for the enumeration value, as defined in the specification.

+ */ public int alGetError(); + + /** + * Requests the deletion of a number of sources. + * + * @param numSources the number of sources. + * @param sources the sources to delete. + */ public void alDeleteSources(int numSources, IntBuffer sources); + + /** + * Requests a number of buffer names. + * + * @param numBuffers the number of buffers. + * @param buffers the buffer that will receive the buffer names. + */ public void alGenBuffers(int numBuffers, IntBuffer buffers); + + /** + * Requests the deletion of a number of buffers. + * + * @param numBuffers the number of buffers. + * @param buffers the buffers to delete. + */ public void alDeleteBuffers(int numBuffers, IntBuffer buffers); + + /** + * Sets the source state to AL_STOPPED. + *

+ *

alSourceStop applied to an AL_INITIAL source is a legal NOP. alSourceStop applied to a AL_PLAYING source will change its state to AL_STOPPED. The source + * is exempt from processing, its current state is preserved. alSourceStop applied to a AL_PAUSED source will change its state to AL_STOPPED, with the same + * consequences as on a AL_PLAYING source. alSourceStop applied to a AL_STOPPED source is a legal NOP.

+ * + * @param source the source to stop. + */ public void alSourceStop(int source); + + /** + * Integer version of {@link #alSourcef Sourcef}. + * + * @param source the source to modify. + * @param param the parameter to modify. + * @param value the parameter value. + */ public void alSourcei(int source, int param, int value); + + /** + * Sets the sample data of the specified buffer. + *

+ *

The data specified is copied to an internal software, or if possible, hardware buffer. The implementation is free to apply decompression, conversion, + * resampling, and filtering as needed.

+ *

+ *

8-bit data is expressed as an unsigned value over the range 0 to 255, 128 being an audio output level of zero.

+ *

+ *

16-bit data is expressed as a signed value over the range -32768 to 32767, 0 being an audio output level of zero. Byte order for 16-bit values is + * determined by the native format of the CPU.

+ *

+ *

Stereo data is expressed in an interleaved format, left channel sample followed by the right channel sample.

+ *

+ *

Buffers containing audio data with more than one channel will be played without 3D spatialization features – these formats are normally used for + * background music.

+ * + * @param buffer the buffer to modify. + * @param format the data format. One of:
{@link #AL_FORMAT_MONO8 FORMAT_MONO8}{@link #AL_FORMAT_MONO16 FORMAT_MONO16}{@link #AL_FORMAT_STEREO8 FORMAT_STEREO8}{@link #AL_FORMAT_STEREO16 FORMAT_STEREO16}
+ * @param data the sample data. + * @param frequency the data frequency. + */ public void alBufferData(int buffer, int format, ByteBuffer data, int size, int frequency); + + /** + * Sets the source state to AL_PLAYING. + *

+ *

alSourcePlay applied to an AL_INITIAL source will promote the source to AL_PLAYING, thus the data found in the buffer will be fed into the processing, + * starting at the beginning. alSourcePlay applied to a AL_PLAYING source will restart the source from the beginning. It will not affect the configuration, + * and will leave the source in AL_PLAYING state, but reset the sampling offset to the beginning. alSourcePlay applied to a AL_PAUSED source will resume + * processing using the source state as preserved at the alSourcePause operation. alSourcePlay applied to a AL_STOPPED source will propagate it to + * AL_INITIAL then to AL_PLAYING immediately.

+ * + * @param source the source to play. + */ public void alSourcePlay(int source); + + /** + * Sets the source state to AL_PAUSED. + *

+ *

alSourcePause applied to an AL_INITIAL source is a legal NOP. alSourcePause applied to a AL_PLAYING source will change its state to AL_PAUSED. The + * source is exempt from processing, its current state is preserved. alSourcePause applied to a AL_PAUSED source is a legal NOP. alSourcePause applied to a + * AL_STOPPED source is a legal NOP.

+ * + * @param source the source to pause. + */ public void alSourcePause(int source); + + /** + * Sets the float value of a source parameter. + * + * @param source the source to modify. + * @param param the parameter to modify. One of:
{@link #AL_CONE_INNER_ANGLE CONE_INNER_ANGLE}{@link #AL_CONE_OUTER_ANGLE CONE_OUTER_ANGLE}{@link #AL_PITCH PITCH}{@link #AL_DIRECTION DIRECTION}{@link #AL_LOOPING LOOPING}{@link #AL_BUFFER BUFFER}{@link #AL_SOURCE_STATE SOURCE_STATE}
{@link #AL_CONE_OUTER_GAIN CONE_OUTER_GAIN}{@link #AL_SOURCE_TYPE SOURCE_TYPE}{@link #AL_POSITION POSITION}{@link #AL_VELOCITY VELOCITY}{@link #AL_GAIN GAIN}{@link #AL_REFERENCE_DISTANCE REFERENCE_DISTANCE}{@link #AL_ROLLOFF_FACTOR ROLLOFF_FACTOR}
{@link #AL_MAX_DISTANCE MAX_DISTANCE}
+ * @param value the parameter value. + */ public void alSourcef(int source, int param, float value); + + /** + * Sets the 3 dimensional values of a source parameter. + * + * @param source the source to modify. + * @param param the parameter to modify. One of:
{@link #AL_CONE_INNER_ANGLE CONE_INNER_ANGLE}{@link #AL_CONE_OUTER_ANGLE CONE_OUTER_ANGLE}{@link #AL_PITCH PITCH}{@link #AL_DIRECTION DIRECTION}{@link #AL_LOOPING LOOPING}{@link #AL_BUFFER BUFFER}{@link #AL_SOURCE_STATE SOURCE_STATE}
{@link #AL_CONE_OUTER_GAIN CONE_OUTER_GAIN}{@link #AL_SOURCE_TYPE SOURCE_TYPE}{@link #AL_POSITION POSITION}{@link #AL_VELOCITY VELOCITY}{@link #AL_GAIN GAIN}{@link #AL_REFERENCE_DISTANCE REFERENCE_DISTANCE}{@link #AL_ROLLOFF_FACTOR ROLLOFF_FACTOR}
{@link #AL_MAX_DISTANCE MAX_DISTANCE}
+ * @param value1 the first parameter value. + * @param value2 the second parameter value. + * @param value3 the third parameter value. + */ public void alSource3f(int source, int param, float value1, float value2, float value3); + + /** + * Returns the integer value of the specified source parameter. + * + * @param source the source to query. + * @param param the parameter to query. One of:
{@link #AL_CONE_INNER_ANGLE CONE_INNER_ANGLE}{@link #AL_CONE_OUTER_ANGLE CONE_OUTER_ANGLE}{@link #AL_PITCH PITCH}{@link #AL_DIRECTION DIRECTION}{@link #AL_LOOPING LOOPING}{@link #AL_BUFFER BUFFER}{@link #AL_SOURCE_STATE SOURCE_STATE}
{@link #AL_CONE_OUTER_GAIN CONE_OUTER_GAIN}{@link #AL_SOURCE_TYPE SOURCE_TYPE}{@link #AL_POSITION POSITION}{@link #AL_VELOCITY VELOCITY}{@link #AL_GAIN GAIN}{@link #AL_REFERENCE_DISTANCE REFERENCE_DISTANCE}{@link #AL_ROLLOFF_FACTOR ROLLOFF_FACTOR}
{@link #AL_MAX_DISTANCE MAX_DISTANCE}
+ */ public int alGetSourcei(int source, int param); + + /** + * Removes a number of buffer entries that have finished processing, in the order of apperance, from the queue of the specified source. + *

+ *

Once a queue entry for a buffer has been appended to a queue and is pending processing, it should not be changed. Removal of a given queue entry is not + * possible unless either the source is stopped (in which case then entire queue is considered processed), or if the queue entry has already been processed + * (AL_PLAYING or AL_PAUSED source). A playing source will enter the AL_STOPPED state if it completes playback of the last buffer in its queue (the same + * behavior as when a single buffer has been attached to a source and has finished playback).

+ * + * @param source the target source + * @param numBuffers the names count. + * @param buffers the buffer names + */ public void alSourceUnqueueBuffers(int source, int numBuffers, IntBuffer buffers); + + /** + * Queues up one or multiple buffer names to the specified source. + *

+ *

The buffers will be queued in the sequence in which they appear in the array. This command is legal on a source in any playback state (to allow for + * streaming, queuing has to be possible on a AL_PLAYING source). All buffers in a queue must have the same format and attributes, with the exception of + * the {@code NULL} buffer (i.e., 0) which can always be queued.

+ * + * @param source the target source. + * @param numBuffers the names count. + * @param buffers the buffer names. + */ public void alSourceQueueBuffers(int source, int numBuffers, IntBuffer buffers); + + /** + * Pointer version of {@link #alListenerf Listenerf}. + * + * @param param the parameter to modify. + * @param data the parameter values. + */ public void alListener(int param, FloatBuffer data); + + /** + * Sets the float value of a listener parameter. + * + * @param param the parameter to modify. One of:
{@link #AL_ORIENTATION ORIENTATION}{@link #AL_POSITION POSITION}{@link #AL_VELOCITY VELOCITY}{@link #AL_GAIN GAIN}
+ * @param value the parameter value. + */ public void alListenerf(int param, float value); + + /** + * Sets the 3 dimensional float values of a listener parameter. + * + * @param param the parameter to modify. One of:
{@link #AL_ORIENTATION ORIENTATION}{@link #AL_POSITION POSITION}{@link #AL_VELOCITY VELOCITY}{@link #AL_GAIN GAIN}
+ * @param value1 the first value. + * @param value2 the second value. + * @param value3 the third value. + */ public void alListener3f(int param, float value1, float value2, float value3); + + /** + * Sets the 3 dimensional integer values of a source parameter. + * + * @param source the source to modify. + * @param param the parameter to modify. + * @param value1 the first value. + * @param value2 the second value. + * @param value3 the third value. + */ public void alSource3i(int source, int param, int value1, int value2, int value3); } diff --git a/jme3-core/src/main/java/com/jme3/audio/openal/ALC.java b/jme3-core/src/main/java/com/jme3/audio/openal/ALC.java index ef9996de9..0d3c6301f 100644 --- a/jme3-core/src/main/java/com/jme3/audio/openal/ALC.java +++ b/jme3-core/src/main/java/com/jme3/audio/openal/ALC.java @@ -7,67 +7,120 @@ public interface ALC { /** * No error */ - static final int ALC_NO_ERROR = 0; + public static final int ALC_NO_ERROR = 0; /** * No device */ - static final int ALC_INVALID_DEVICE = 0xA001; + public static final int ALC_INVALID_DEVICE = 0xA001; /** * invalid context ID */ - static final int ALC_INVALID_CONTEXT = 0xA002; + public static final int ALC_INVALID_CONTEXT = 0xA002; /** * bad enum */ - static final int ALC_INVALID_ENUM = 0xA003; + public static final int ALC_INVALID_ENUM = 0xA003; /** * bad value */ - static final int ALC_INVALID_VALUE = 0xA004; + public static final int ALC_INVALID_VALUE = 0xA004; /** * Out of memory. */ - static final int ALC_OUT_OF_MEMORY = 0xA005; + public static final int ALC_OUT_OF_MEMORY = 0xA005; /** * The Specifier string for default device */ - static final int ALC_DEFAULT_DEVICE_SPECIFIER = 0x1004; - static final int ALC_DEVICE_SPECIFIER = 0x1005; - static final int ALC_EXTENSIONS = 0x1006; + public static final int ALC_DEFAULT_DEVICE_SPECIFIER = 0x1004; + public static final int ALC_DEVICE_SPECIFIER = 0x1005; + public static final int ALC_EXTENSIONS = 0x1006; - static final int ALC_MAJOR_VERSION = 0x1000; - static final int ALC_MINOR_VERSION = 0x1001; + public static final int ALC_MAJOR_VERSION = 0x1000; + public static final int ALC_MINOR_VERSION = 0x1001; - static final int ALC_ATTRIBUTES_SIZE = 0x1002; - static final int ALC_ALL_ATTRIBUTES = 0x1003; + public static final int ALC_ATTRIBUTES_SIZE = 0x1002; + public static final int ALC_ALL_ATTRIBUTES = 0x1003; /** * Capture extension */ - static final int ALC_CAPTURE_DEVICE_SPECIFIER = 0x310; - static final int ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER = 0x311; - static final int ALC_CAPTURE_SAMPLES = 0x312; + public static final int ALC_CAPTURE_DEVICE_SPECIFIER = 0x310; + public static final int ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER = 0x311; + public static final int ALC_CAPTURE_SAMPLES = 0x312; /** * ALC_ENUMERATE_ALL_EXT enums */ - static final int ALC_DEFAULT_ALL_DEVICES_SPECIFIER = 0x1012; - static final int ALC_ALL_DEVICES_SPECIFIER = 0x1013; + public static final int ALC_DEFAULT_ALL_DEVICES_SPECIFIER = 0x1012; + public static final int ALC_ALL_DEVICES_SPECIFIER = 0x1013; //public static ALCCapabilities createCapabilities(long device); - + + /** + * Creates an AL context. + */ public void createALC(); + + /** + * Destroys an AL context. + */ public void destroyALC(); + + /** + * Checks of creating an AL context. + * + * @return true if an AL context is created. + */ public boolean isCreated(); + + /** + * Obtains string value(s) from ALC. + * + * @param parameter the information to query. One of:
{@link #ALC_DEFAULT_DEVICE_SPECIFIER DEFAULT_DEVICE_SPECIFIER}{@link #ALC_DEVICE_SPECIFIER DEVICE_SPECIFIER}{@link #ALC_EXTENSIONS EXTENSIONS}
{@link #ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER CAPTURE_DEFAULT_DEVICE_SPECIFIER}{@link #ALC_CAPTURE_DEVICE_SPECIFIER CAPTURE_DEVICE_SPECIFIER}
+ */ public String alcGetString(int parameter); + + /** + * Verifies that a given extension is available for the current context and the device it is associated with. + *

+ *

Invalid and unsupported string tokens return ALC_FALSE. A {@code NULL} deviceHandle is acceptable. {@code extName} is not case sensitive – the implementation + * will convert the name to all upper-case internally (and will express extension names in upper-case).

+ * + * @param extension the extension name. + */ public boolean alcIsExtensionPresent(String extension); + + /** + * Obtains integer value(s) from ALC. + * + * @param param the information to query. One of:
{@link #ALC_MAJOR_VERSION MAJOR_VERSION}{@link #ALC_MINOR_VERSION MINOR_VERSION}{@link #ALC_ATTRIBUTES_SIZE ATTRIBUTES_SIZE}{@link #ALC_ALL_ATTRIBUTES ALL_ATTRIBUTES}{@link #ALC_CAPTURE_SAMPLES CAPTURE_SAMPLES}
+ * @param buffer the destination buffer. + * @param size the buffer size. + */ public void alcGetInteger(int param, IntBuffer buffer, int size); + + /** + * Pauses a playback device. + *

+ *

When paused, no contexts associated with the device will be processed or updated. Playing sources will not produce sound, have their offsets + * incremented, or process any more buffers, until the device is resumed. Pausing a device that is already paused is a legal no-op.

+ */ public void alcDevicePauseSOFT(); + + /** + * Resumes playback of a paused device. + *

+ *

This will restart processing on the device -- sources will resume playing sound as normal. Resuming playback on a device that is not paused is a legal + * no-op.

+ *

+ *

These functions are not reference counted. alcDeviceResumeSOFT only needs to be called once to resume playback, regardless of how many times + * {@link #alcDevicePauseSOFT DevicePauseSOFT} was called.

+ */ public void alcDeviceResumeSOFT(); } diff --git a/jme3-core/src/main/java/com/jme3/audio/openal/EFX.java b/jme3-core/src/main/java/com/jme3/audio/openal/EFX.java index 89f0a6e0c..4ae546263 100644 --- a/jme3-core/src/main/java/com/jme3/audio/openal/EFX.java +++ b/jme3-core/src/main/java/com/jme3/audio/openal/EFX.java @@ -4,676 +4,754 @@ import java.nio.IntBuffer; public interface EFX { - static final String ALC_EXT_EFX_NAME = "ALC_EXT_EFX"; - - static final int ALC_EFX_MAJOR_VERSION = 0x20001; - static final int ALC_EFX_MINOR_VERSION = 0x20002; - static final int ALC_MAX_AUXILIARY_SENDS = 0x20003; - -///* Listener properties. */ -//#define AL_METERS_PER_UNIT 0x20004 -// -///* Source properties. */ - static final int AL_DIRECT_FILTER = 0x20005; - static final int AL_AUXILIARY_SEND_FILTER = 0x20006; -//#define AL_AIR_ABSORPTION_FACTOR 0x20007 -//#define AL_ROOM_ROLLOFF_FACTOR 0x20008 -//#define AL_CONE_OUTER_GAINHF 0x20009 - static final int AL_DIRECT_FILTER_GAINHF_AUTO = 0x2000A; -//#define AL_AUXILIARY_SEND_FILTER_GAIN_AUTO 0x2000B -//#define AL_AUXILIARY_SEND_FILTER_GAINHF_AUTO 0x2000C -// -// -///* Effect properties. */ -// -///* Reverb effect parameters */ - static final int AL_REVERB_DENSITY = 0x0001; - static final int AL_REVERB_DIFFUSION = 0x0002; - static final int AL_REVERB_GAIN = 0x0003; - static final int AL_REVERB_GAINHF = 0x0004; - static final int AL_REVERB_DECAY_TIME = 0x0005; - static final int AL_REVERB_DECAY_HFRATIO = 0x0006; - static final int AL_REVERB_REFLECTIONS_GAIN = 0x0007; - static final int AL_REVERB_REFLECTIONS_DELAY = 0x0008; - static final int AL_REVERB_LATE_REVERB_GAIN = 0x0009; - static final int AL_REVERB_LATE_REVERB_DELAY = 0x000A; - static final int AL_REVERB_AIR_ABSORPTION_GAINHF = 0x000B; - static final int AL_REVERB_ROOM_ROLLOFF_FACTOR = 0x000C; - static final int AL_REVERB_DECAY_HFLIMIT = 0x000D; - -///* EAX Reverb effect parameters */ -//#define AL_EAXREVERB_DENSITY 0x0001 -//#define AL_EAXREVERB_DIFFUSION 0x0002 -//#define AL_EAXREVERB_GAIN 0x0003 -//#define AL_EAXREVERB_GAINHF 0x0004 -//#define AL_EAXREVERB_GAINLF 0x0005 -//#define AL_EAXREVERB_DECAY_TIME 0x0006 -//#define AL_EAXREVERB_DECAY_HFRATIO 0x0007 -//#define AL_EAXREVERB_DECAY_LFRATIO 0x0008 -//#define AL_EAXREVERB_REFLECTIONS_GAIN 0x0009 -//#define AL_EAXREVERB_REFLECTIONS_DELAY 0x000A -//#define AL_EAXREVERB_REFLECTIONS_PAN 0x000B -//#define AL_EAXREVERB_LATE_REVERB_GAIN 0x000C -//#define AL_EAXREVERB_LATE_REVERB_DELAY 0x000D -//#define AL_EAXREVERB_LATE_REVERB_PAN 0x000E -//#define AL_EAXREVERB_ECHO_TIME 0x000F -//#define AL_EAXREVERB_ECHO_DEPTH 0x0010 -//#define AL_EAXREVERB_MODULATION_TIME 0x0011 -//#define AL_EAXREVERB_MODULATION_DEPTH 0x0012 -//#define AL_EAXREVERB_AIR_ABSORPTION_GAINHF 0x0013 -//#define AL_EAXREVERB_HFREFERENCE 0x0014 -//#define AL_EAXREVERB_LFREFERENCE 0x0015 -//#define AL_EAXREVERB_ROOM_ROLLOFF_FACTOR 0x0016 -//#define AL_EAXREVERB_DECAY_HFLIMIT 0x0017 -// -///* Chorus effect parameters */ -//#define AL_CHORUS_WAVEFORM 0x0001 -//#define AL_CHORUS_PHASE 0x0002 -//#define AL_CHORUS_RATE 0x0003 -//#define AL_CHORUS_DEPTH 0x0004 -//#define AL_CHORUS_FEEDBACK 0x0005 -//#define AL_CHORUS_DELAY 0x0006 -// -///* Distortion effect parameters */ -//#define AL_DISTORTION_EDGE 0x0001 -//#define AL_DISTORTION_GAIN 0x0002 -//#define AL_DISTORTION_LOWPASS_CUTOFF 0x0003 -//#define AL_DISTORTION_EQCENTER 0x0004 -//#define AL_DISTORTION_EQBANDWIDTH 0x0005 -// -///* Echo effect parameters */ -//#define AL_ECHO_DELAY 0x0001 -//#define AL_ECHO_LRDELAY 0x0002 -//#define AL_ECHO_DAMPING 0x0003 -//#define AL_ECHO_FEEDBACK 0x0004 -//#define AL_ECHO_SPREAD 0x0005 -// -///* Flanger effect parameters */ -//#define AL_FLANGER_WAVEFORM 0x0001 -//#define AL_FLANGER_PHASE 0x0002 -//#define AL_FLANGER_RATE 0x0003 -//#define AL_FLANGER_DEPTH 0x0004 -//#define AL_FLANGER_FEEDBACK 0x0005 -//#define AL_FLANGER_DELAY 0x0006 -// -///* Frequency shifter effect parameters */ -//#define AL_FREQUENCY_SHIFTER_FREQUENCY 0x0001 -//#define AL_FREQUENCY_SHIFTER_LEFT_DIRECTION 0x0002 -//#define AL_FREQUENCY_SHIFTER_RIGHT_DIRECTION 0x0003 -// -///* Vocal morpher effect parameters */ -//#define AL_VOCAL_MORPHER_PHONEMEA 0x0001 -//#define AL_VOCAL_MORPHER_PHONEMEA_COARSE_TUNING 0x0002 -//#define AL_VOCAL_MORPHER_PHONEMEB 0x0003 -//#define AL_VOCAL_MORPHER_PHONEMEB_COARSE_TUNING 0x0004 -//#define AL_VOCAL_MORPHER_WAVEFORM 0x0005 -//#define AL_VOCAL_MORPHER_RATE 0x0006 -// -///* Pitchshifter effect parameters */ -//#define AL_PITCH_SHIFTER_COARSE_TUNE 0x0001 -//#define AL_PITCH_SHIFTER_FINE_TUNE 0x0002 -// -///* Ringmodulator effect parameters */ -//#define AL_RING_MODULATOR_FREQUENCY 0x0001 -//#define AL_RING_MODULATOR_HIGHPASS_CUTOFF 0x0002 -//#define AL_RING_MODULATOR_WAVEFORM 0x0003 -// -///* Autowah effect parameters */ -//#define AL_AUTOWAH_ATTACK_TIME 0x0001 -//#define AL_AUTOWAH_RELEASE_TIME 0x0002 -//#define AL_AUTOWAH_RESONANCE 0x0003 -//#define AL_AUTOWAH_PEAK_GAIN 0x0004 -// -///* Compressor effect parameters */ -//#define AL_COMPRESSOR_ONOFF 0x0001 -// -///* Equalizer effect parameters */ -//#define AL_EQUALIZER_LOW_GAIN 0x0001 -//#define AL_EQUALIZER_LOW_CUTOFF 0x0002 -//#define AL_EQUALIZER_MID1_GAIN 0x0003 -//#define AL_EQUALIZER_MID1_CENTER 0x0004 -//#define AL_EQUALIZER_MID1_WIDTH 0x0005 -//#define AL_EQUALIZER_MID2_GAIN 0x0006 -//#define AL_EQUALIZER_MID2_CENTER 0x0007 -//#define AL_EQUALIZER_MID2_WIDTH 0x0008 -//#define AL_EQUALIZER_HIGH_GAIN 0x0009 -//#define AL_EQUALIZER_HIGH_CUTOFF 0x000A -// -///* Effect type */ -//#define AL_EFFECT_FIRST_PARAMETER 0x0000 -//#define AL_EFFECT_LAST_PARAMETER 0x8000 - static final int AL_EFFECT_TYPE = 0x8001; -// -///* Effect types, used with the AL_EFFECT_TYPE property */ -//#define AL_EFFECT_NULL 0x0000 - static final int AL_EFFECT_REVERB = 0x0001; -//#define AL_EFFECT_CHORUS 0x0002 -//#define AL_EFFECT_DISTORTION 0x0003 -//#define AL_EFFECT_ECHO 0x0004 -//#define AL_EFFECT_FLANGER 0x0005 -//#define AL_EFFECT_FREQUENCY_SHIFTER 0x0006 -//#define AL_EFFECT_VOCAL_MORPHER 0x0007 -//#define AL_EFFECT_PITCH_SHIFTER 0x0008 -//#define AL_EFFECT_RING_MODULATOR 0x0009 -//#define AL_EFFECT_AUTOWAH 0x000A -//#define AL_EFFECT_COMPRESSOR 0x000B -//#define AL_EFFECT_EQUALIZER 0x000C -//#define AL_EFFECT_EAXREVERB 0x8000 -// -///* Auxiliary Effect Slot properties. */ - static final int AL_EFFECTSLOT_EFFECT = 0x0001; -//#define AL_EFFECTSLOT_GAIN 0x0002 -//#define AL_EFFECTSLOT_AUXILIARY_SEND_AUTO 0x0003 -// -///* NULL Auxiliary Slot ID to disable a source send. */ -//#define AL_EFFECTSLOT_NULL 0x0000 -// -// -///* Filter properties. */ -// -///* Lowpass filter parameters */ - static final int AL_LOWPASS_GAIN = 0x0001; - static final int AL_LOWPASS_GAINHF = 0x0002; -// -///* Highpass filter parameters */ -//#define AL_HIGHPASS_GAIN 0x0001 -//#define AL_HIGHPASS_GAINLF 0x0002 -// -///* Bandpass filter parameters */ -//#define AL_BANDPASS_GAIN 0x0001 -//#define AL_BANDPASS_GAINLF 0x0002 -//#define AL_BANDPASS_GAINHF 0x0003 -// -///* Filter type */ -//#define AL_FILTER_FIRST_PARAMETER 0x0000 -//#define AL_FILTER_LAST_PARAMETER 0x8000 - static final int AL_FILTER_TYPE = 0x8001; -// -///* Filter types, used with the AL_FILTER_TYPE property */ - static final int AL_FILTER_NULL = 0x0000; - static final int AL_FILTER_LOWPASS = 0x0001; - static final int AL_FILTER_HIGHPASS = 0x0002; -//#define AL_FILTER_BANDPASS 0x0003 -// -///* Filter ranges and defaults. */ -// -///* Lowpass filter */ -//#define AL_LOWPASS_MIN_GAIN (0.0f) -//#define AL_LOWPASS_MAX_GAIN (1.0f) -//#define AL_LOWPASS_DEFAULT_GAIN (1.0f) -// -//#define AL_LOWPASS_MIN_GAINHF (0.0f) -//#define AL_LOWPASS_MAX_GAINHF (1.0f) -//#define AL_LOWPASS_DEFAULT_GAINHF (1.0f) -// -///* Highpass filter */ -//#define AL_HIGHPASS_MIN_GAIN (0.0f) -//#define AL_HIGHPASS_MAX_GAIN (1.0f) -//#define AL_HIGHPASS_DEFAULT_GAIN (1.0f) -// -//#define AL_HIGHPASS_MIN_GAINLF (0.0f) -//#define AL_HIGHPASS_MAX_GAINLF (1.0f) -//#define AL_HIGHPASS_DEFAULT_GAINLF (1.0f) -// -///* Bandpass filter */ -//#define AL_BANDPASS_MIN_GAIN (0.0f) -//#define AL_BANDPASS_MAX_GAIN (1.0f) -//#define AL_BANDPASS_DEFAULT_GAIN (1.0f) -// -//#define AL_BANDPASS_MIN_GAINHF (0.0f) -//#define AL_BANDPASS_MAX_GAINHF (1.0f) -//#define AL_BANDPASS_DEFAULT_GAINHF (1.0f) -// -//#define AL_BANDPASS_MIN_GAINLF (0.0f) -//#define AL_BANDPASS_MAX_GAINLF (1.0f) -//#define AL_BANDPASS_DEFAULT_GAINLF (1.0f) -// -// -///* Effect parameter ranges and defaults. */ -// -///* Standard reverb effect */ -//#define AL_REVERB_MIN_DENSITY (0.0f) -//#define AL_REVERB_MAX_DENSITY (1.0f) -//#define AL_REVERB_DEFAULT_DENSITY (1.0f) -// -//#define AL_REVERB_MIN_DIFFUSION (0.0f) -//#define AL_REVERB_MAX_DIFFUSION (1.0f) -//#define AL_REVERB_DEFAULT_DIFFUSION (1.0f) -// -//#define AL_REVERB_MIN_GAIN (0.0f) -//#define AL_REVERB_MAX_GAIN (1.0f) -//#define AL_REVERB_DEFAULT_GAIN (0.32f) -// -//#define AL_REVERB_MIN_GAINHF (0.0f) -//#define AL_REVERB_MAX_GAINHF (1.0f) -//#define AL_REVERB_DEFAULT_GAINHF (0.89f) -// -//#define AL_REVERB_MIN_DECAY_TIME (0.1f) -//#define AL_REVERB_MAX_DECAY_TIME (20.0f) -//#define AL_REVERB_DEFAULT_DECAY_TIME (1.49f) -// -//#define AL_REVERB_MIN_DECAY_HFRATIO (0.1f) -//#define AL_REVERB_MAX_DECAY_HFRATIO (2.0f) -//#define AL_REVERB_DEFAULT_DECAY_HFRATIO (0.83f) -// -//#define AL_REVERB_MIN_REFLECTIONS_GAIN (0.0f) -//#define AL_REVERB_MAX_REFLECTIONS_GAIN (3.16f) -//#define AL_REVERB_DEFAULT_REFLECTIONS_GAIN (0.05f) -// -//#define AL_REVERB_MIN_REFLECTIONS_DELAY (0.0f) -//#define AL_REVERB_MAX_REFLECTIONS_DELAY (0.3f) -//#define AL_REVERB_DEFAULT_REFLECTIONS_DELAY (0.007f) -// -//#define AL_REVERB_MIN_LATE_REVERB_GAIN (0.0f) -//#define AL_REVERB_MAX_LATE_REVERB_GAIN (10.0f) -//#define AL_REVERB_DEFAULT_LATE_REVERB_GAIN (1.26f) -// -//#define AL_REVERB_MIN_LATE_REVERB_DELAY (0.0f) -//#define AL_REVERB_MAX_LATE_REVERB_DELAY (0.1f) -//#define AL_REVERB_DEFAULT_LATE_REVERB_DELAY (0.011f) -// -//#define AL_REVERB_MIN_AIR_ABSORPTION_GAINHF (0.892f) -//#define AL_REVERB_MAX_AIR_ABSORPTION_GAINHF (1.0f) -//#define AL_REVERB_DEFAULT_AIR_ABSORPTION_GAINHF (0.994f) -// -//#define AL_REVERB_MIN_ROOM_ROLLOFF_FACTOR (0.0f) -//#define AL_REVERB_MAX_ROOM_ROLLOFF_FACTOR (10.0f) -//#define AL_REVERB_DEFAULT_ROOM_ROLLOFF_FACTOR (0.0f) -// -//#define AL_REVERB_MIN_DECAY_HFLIMIT AL_FALSE -//#define AL_REVERB_MAX_DECAY_HFLIMIT AL_TRUE -//#define AL_REVERB_DEFAULT_DECAY_HFLIMIT AL_TRUE -// -///* EAX reverb effect */ -//#define AL_EAXREVERB_MIN_DENSITY (0.0f) -//#define AL_EAXREVERB_MAX_DENSITY (1.0f) -//#define AL_EAXREVERB_DEFAULT_DENSITY (1.0f) -// -//#define AL_EAXREVERB_MIN_DIFFUSION (0.0f) -//#define AL_EAXREVERB_MAX_DIFFUSION (1.0f) -//#define AL_EAXREVERB_DEFAULT_DIFFUSION (1.0f) -// -//#define AL_EAXREVERB_MIN_GAIN (0.0f) -//#define AL_EAXREVERB_MAX_GAIN (1.0f) -//#define AL_EAXREVERB_DEFAULT_GAIN (0.32f) -// -//#define AL_EAXREVERB_MIN_GAINHF (0.0f) -//#define AL_EAXREVERB_MAX_GAINHF (1.0f) -//#define AL_EAXREVERB_DEFAULT_GAINHF (0.89f) -// -//#define AL_EAXREVERB_MIN_GAINLF (0.0f) -//#define AL_EAXREVERB_MAX_GAINLF (1.0f) -//#define AL_EAXREVERB_DEFAULT_GAINLF (1.0f) -// -//#define AL_EAXREVERB_MIN_DECAY_TIME (0.1f) -//#define AL_EAXREVERB_MAX_DECAY_TIME (20.0f) -//#define AL_EAXREVERB_DEFAULT_DECAY_TIME (1.49f) -// -//#define AL_EAXREVERB_MIN_DECAY_HFRATIO (0.1f) -//#define AL_EAXREVERB_MAX_DECAY_HFRATIO (2.0f) -//#define AL_EAXREVERB_DEFAULT_DECAY_HFRATIO (0.83f) -// -//#define AL_EAXREVERB_MIN_DECAY_LFRATIO (0.1f) -//#define AL_EAXREVERB_MAX_DECAY_LFRATIO (2.0f) -//#define AL_EAXREVERB_DEFAULT_DECAY_LFRATIO (1.0f) -// -//#define AL_EAXREVERB_MIN_REFLECTIONS_GAIN (0.0f) -//#define AL_EAXREVERB_MAX_REFLECTIONS_GAIN (3.16f) -//#define AL_EAXREVERB_DEFAULT_REFLECTIONS_GAIN (0.05f) -// -//#define AL_EAXREVERB_MIN_REFLECTIONS_DELAY (0.0f) -//#define AL_EAXREVERB_MAX_REFLECTIONS_DELAY (0.3f) -//#define AL_EAXREVERB_DEFAULT_REFLECTIONS_DELAY (0.007f) -// -//#define AL_EAXREVERB_DEFAULT_REFLECTIONS_PAN_XYZ (0.0f) -// -//#define AL_EAXREVERB_MIN_LATE_REVERB_GAIN (0.0f) -//#define AL_EAXREVERB_MAX_LATE_REVERB_GAIN (10.0f) -//#define AL_EAXREVERB_DEFAULT_LATE_REVERB_GAIN (1.26f) -// -//#define AL_EAXREVERB_MIN_LATE_REVERB_DELAY (0.0f) -//#define AL_EAXREVERB_MAX_LATE_REVERB_DELAY (0.1f) -//#define AL_EAXREVERB_DEFAULT_LATE_REVERB_DELAY (0.011f) -// -//#define AL_EAXREVERB_DEFAULT_LATE_REVERB_PAN_XYZ (0.0f) -// -//#define AL_EAXREVERB_MIN_ECHO_TIME (0.075f) -//#define AL_EAXREVERB_MAX_ECHO_TIME (0.25f) -//#define AL_EAXREVERB_DEFAULT_ECHO_TIME (0.25f) -// -//#define AL_EAXREVERB_MIN_ECHO_DEPTH (0.0f) -//#define AL_EAXREVERB_MAX_ECHO_DEPTH (1.0f) -//#define AL_EAXREVERB_DEFAULT_ECHO_DEPTH (0.0f) -// -//#define AL_EAXREVERB_MIN_MODULATION_TIME (0.04f) -//#define AL_EAXREVERB_MAX_MODULATION_TIME (4.0f) -//#define AL_EAXREVERB_DEFAULT_MODULATION_TIME (0.25f) -// -//#define AL_EAXREVERB_MIN_MODULATION_DEPTH (0.0f) -//#define AL_EAXREVERB_MAX_MODULATION_DEPTH (1.0f) -//#define AL_EAXREVERB_DEFAULT_MODULATION_DEPTH (0.0f) -// -//#define AL_EAXREVERB_MIN_AIR_ABSORPTION_GAINHF (0.892f) -//#define AL_EAXREVERB_MAX_AIR_ABSORPTION_GAINHF (1.0f) -//#define AL_EAXREVERB_DEFAULT_AIR_ABSORPTION_GAINHF (0.994f) -// -//#define AL_EAXREVERB_MIN_HFREFERENCE (1000.0f) -//#define AL_EAXREVERB_MAX_HFREFERENCE (20000.0f) -//#define AL_EAXREVERB_DEFAULT_HFREFERENCE (5000.0f) -// -//#define AL_EAXREVERB_MIN_LFREFERENCE (20.0f) -//#define AL_EAXREVERB_MAX_LFREFERENCE (1000.0f) -//#define AL_EAXREVERB_DEFAULT_LFREFERENCE (250.0f) -// -//#define AL_EAXREVERB_MIN_ROOM_ROLLOFF_FACTOR (0.0f) -//#define AL_EAXREVERB_MAX_ROOM_ROLLOFF_FACTOR (10.0f) -//#define AL_EAXREVERB_DEFAULT_ROOM_ROLLOFF_FACTOR (0.0f) -// -//#define AL_EAXREVERB_MIN_DECAY_HFLIMIT AL_FALSE -//#define AL_EAXREVERB_MAX_DECAY_HFLIMIT AL_TRUE -//#define AL_EAXREVERB_DEFAULT_DECAY_HFLIMIT AL_TRUE -// -///* Chorus effect */ -//#define AL_CHORUS_WAVEFORM_SINUSOID (0) -//#define AL_CHORUS_WAVEFORM_TRIANGLE (1) -// -//#define AL_CHORUS_MIN_WAVEFORM (0) -//#define AL_CHORUS_MAX_WAVEFORM (1) -//#define AL_CHORUS_DEFAULT_WAVEFORM (1) -// -//#define AL_CHORUS_MIN_PHASE (-180) -//#define AL_CHORUS_MAX_PHASE (180) -//#define AL_CHORUS_DEFAULT_PHASE (90) -// -//#define AL_CHORUS_MIN_RATE (0.0f) -//#define AL_CHORUS_MAX_RATE (10.0f) -//#define AL_CHORUS_DEFAULT_RATE (1.1f) -// -//#define AL_CHORUS_MIN_DEPTH (0.0f) -//#define AL_CHORUS_MAX_DEPTH (1.0f) -//#define AL_CHORUS_DEFAULT_DEPTH (0.1f) -// -//#define AL_CHORUS_MIN_FEEDBACK (-1.0f) -//#define AL_CHORUS_MAX_FEEDBACK (1.0f) -//#define AL_CHORUS_DEFAULT_FEEDBACK (0.25f) -// -//#define AL_CHORUS_MIN_DELAY (0.0f) -//#define AL_CHORUS_MAX_DELAY (0.016f) -//#define AL_CHORUS_DEFAULT_DELAY (0.016f) -// -///* Distortion effect */ -//#define AL_DISTORTION_MIN_EDGE (0.0f) -//#define AL_DISTORTION_MAX_EDGE (1.0f) -//#define AL_DISTORTION_DEFAULT_EDGE (0.2f) -// -//#define AL_DISTORTION_MIN_GAIN (0.01f) -//#define AL_DISTORTION_MAX_GAIN (1.0f) -//#define AL_DISTORTION_DEFAULT_GAIN (0.05f) -// -//#define AL_DISTORTION_MIN_LOWPASS_CUTOFF (80.0f) -//#define AL_DISTORTION_MAX_LOWPASS_CUTOFF (24000.0f) -//#define AL_DISTORTION_DEFAULT_LOWPASS_CUTOFF (8000.0f) -// -//#define AL_DISTORTION_MIN_EQCENTER (80.0f) -//#define AL_DISTORTION_MAX_EQCENTER (24000.0f) -//#define AL_DISTORTION_DEFAULT_EQCENTER (3600.0f) -// -//#define AL_DISTORTION_MIN_EQBANDWIDTH (80.0f) -//#define AL_DISTORTION_MAX_EQBANDWIDTH (24000.0f) -//#define AL_DISTORTION_DEFAULT_EQBANDWIDTH (3600.0f) -// -///* Echo effect */ -//#define AL_ECHO_MIN_DELAY (0.0f) -//#define AL_ECHO_MAX_DELAY (0.207f) -//#define AL_ECHO_DEFAULT_DELAY (0.1f) -// -//#define AL_ECHO_MIN_LRDELAY (0.0f) -//#define AL_ECHO_MAX_LRDELAY (0.404f) -//#define AL_ECHO_DEFAULT_LRDELAY (0.1f) -// -//#define AL_ECHO_MIN_DAMPING (0.0f) -//#define AL_ECHO_MAX_DAMPING (0.99f) -//#define AL_ECHO_DEFAULT_DAMPING (0.5f) -// -//#define AL_ECHO_MIN_FEEDBACK (0.0f) -//#define AL_ECHO_MAX_FEEDBACK (1.0f) -//#define AL_ECHO_DEFAULT_FEEDBACK (0.5f) -// -//#define AL_ECHO_MIN_SPREAD (-1.0f) -//#define AL_ECHO_MAX_SPREAD (1.0f) -//#define AL_ECHO_DEFAULT_SPREAD (-1.0f) -// -///* Flanger effect */ -//#define AL_FLANGER_WAVEFORM_SINUSOID (0) -//#define AL_FLANGER_WAVEFORM_TRIANGLE (1) -// -//#define AL_FLANGER_MIN_WAVEFORM (0) -//#define AL_FLANGER_MAX_WAVEFORM (1) -//#define AL_FLANGER_DEFAULT_WAVEFORM (1) -// -//#define AL_FLANGER_MIN_PHASE (-180) -//#define AL_FLANGER_MAX_PHASE (180) -//#define AL_FLANGER_DEFAULT_PHASE (0) -// -//#define AL_FLANGER_MIN_RATE (0.0f) -//#define AL_FLANGER_MAX_RATE (10.0f) -//#define AL_FLANGER_DEFAULT_RATE (0.27f) -// -//#define AL_FLANGER_MIN_DEPTH (0.0f) -//#define AL_FLANGER_MAX_DEPTH (1.0f) -//#define AL_FLANGER_DEFAULT_DEPTH (1.0f) -// -//#define AL_FLANGER_MIN_FEEDBACK (-1.0f) -//#define AL_FLANGER_MAX_FEEDBACK (1.0f) -//#define AL_FLANGER_DEFAULT_FEEDBACK (-0.5f) -// -//#define AL_FLANGER_MIN_DELAY (0.0f) -//#define AL_FLANGER_MAX_DELAY (0.004f) -//#define AL_FLANGER_DEFAULT_DELAY (0.002f) -// -///* Frequency shifter effect */ -//#define AL_FREQUENCY_SHIFTER_MIN_FREQUENCY (0.0f) -//#define AL_FREQUENCY_SHIFTER_MAX_FREQUENCY (24000.0f) -//#define AL_FREQUENCY_SHIFTER_DEFAULT_FREQUENCY (0.0f) -// -//#define AL_FREQUENCY_SHIFTER_MIN_LEFT_DIRECTION (0) -//#define AL_FREQUENCY_SHIFTER_MAX_LEFT_DIRECTION (2) -//#define AL_FREQUENCY_SHIFTER_DEFAULT_LEFT_DIRECTION (0) -// -//#define AL_FREQUENCY_SHIFTER_DIRECTION_DOWN (0) -//#define AL_FREQUENCY_SHIFTER_DIRECTION_UP (1) -//#define AL_FREQUENCY_SHIFTER_DIRECTION_OFF (2) -// -//#define AL_FREQUENCY_SHIFTER_MIN_RIGHT_DIRECTION (0) -//#define AL_FREQUENCY_SHIFTER_MAX_RIGHT_DIRECTION (2) -//#define AL_FREQUENCY_SHIFTER_DEFAULT_RIGHT_DIRECTION (0) -// -///* Vocal morpher effect */ -//#define AL_VOCAL_MORPHER_MIN_PHONEMEA (0) -//#define AL_VOCAL_MORPHER_MAX_PHONEMEA (29) -//#define AL_VOCAL_MORPHER_DEFAULT_PHONEMEA (0) -// -//#define AL_VOCAL_MORPHER_MIN_PHONEMEA_COARSE_TUNING (-24) -//#define AL_VOCAL_MORPHER_MAX_PHONEMEA_COARSE_TUNING (24) -//#define AL_VOCAL_MORPHER_DEFAULT_PHONEMEA_COARSE_TUNING (0) -// -//#define AL_VOCAL_MORPHER_MIN_PHONEMEB (0) -//#define AL_VOCAL_MORPHER_MAX_PHONEMEB (29) -//#define AL_VOCAL_MORPHER_DEFAULT_PHONEMEB (10) -// -//#define AL_VOCAL_MORPHER_MIN_PHONEMEB_COARSE_TUNING (-24) -//#define AL_VOCAL_MORPHER_MAX_PHONEMEB_COARSE_TUNING (24) -//#define AL_VOCAL_MORPHER_DEFAULT_PHONEMEB_COARSE_TUNING (0) -// -//#define AL_VOCAL_MORPHER_PHONEME_A (0) -//#define AL_VOCAL_MORPHER_PHONEME_E (1) -//#define AL_VOCAL_MORPHER_PHONEME_I (2) -//#define AL_VOCAL_MORPHER_PHONEME_O (3) -//#define AL_VOCAL_MORPHER_PHONEME_U (4) -//#define AL_VOCAL_MORPHER_PHONEME_AA (5) -//#define AL_VOCAL_MORPHER_PHONEME_AE (6) -//#define AL_VOCAL_MORPHER_PHONEME_AH (7) -//#define AL_VOCAL_MORPHER_PHONEME_AO (8) -//#define AL_VOCAL_MORPHER_PHONEME_EH (9) -//#define AL_VOCAL_MORPHER_PHONEME_ER (10) -//#define AL_VOCAL_MORPHER_PHONEME_IH (11) -//#define AL_VOCAL_MORPHER_PHONEME_IY (12) -//#define AL_VOCAL_MORPHER_PHONEME_UH (13) -//#define AL_VOCAL_MORPHER_PHONEME_UW (14) -//#define AL_VOCAL_MORPHER_PHONEME_B (15) -//#define AL_VOCAL_MORPHER_PHONEME_D (16) -//#define AL_VOCAL_MORPHER_PHONEME_F (17) -//#define AL_VOCAL_MORPHER_PHONEME_G (18) -//#define AL_VOCAL_MORPHER_PHONEME_J (19) -//#define AL_VOCAL_MORPHER_PHONEME_K (20) -//#define AL_VOCAL_MORPHER_PHONEME_L (21) -//#define AL_VOCAL_MORPHER_PHONEME_M (22) -//#define AL_VOCAL_MORPHER_PHONEME_N (23) -//#define AL_VOCAL_MORPHER_PHONEME_P (24) -//#define AL_VOCAL_MORPHER_PHONEME_R (25) -//#define AL_VOCAL_MORPHER_PHONEME_S (26) -//#define AL_VOCAL_MORPHER_PHONEME_T (27) -//#define AL_VOCAL_MORPHER_PHONEME_V (28) -//#define AL_VOCAL_MORPHER_PHONEME_Z (29) -// -//#define AL_VOCAL_MORPHER_WAVEFORM_SINUSOID (0) -//#define AL_VOCAL_MORPHER_WAVEFORM_TRIANGLE (1) -//#define AL_VOCAL_MORPHER_WAVEFORM_SAWTOOTH (2) -// -//#define AL_VOCAL_MORPHER_MIN_WAVEFORM (0) -//#define AL_VOCAL_MORPHER_MAX_WAVEFORM (2) -//#define AL_VOCAL_MORPHER_DEFAULT_WAVEFORM (0) -// -//#define AL_VOCAL_MORPHER_MIN_RATE (0.0f) -//#define AL_VOCAL_MORPHER_MAX_RATE (10.0f) -//#define AL_VOCAL_MORPHER_DEFAULT_RATE (1.41f) -// -///* Pitch shifter effect */ -//#define AL_PITCH_SHIFTER_MIN_COARSE_TUNE (-12) -//#define AL_PITCH_SHIFTER_MAX_COARSE_TUNE (12) -//#define AL_PITCH_SHIFTER_DEFAULT_COARSE_TUNE (12) -// -//#define AL_PITCH_SHIFTER_MIN_FINE_TUNE (-50) -//#define AL_PITCH_SHIFTER_MAX_FINE_TUNE (50) -//#define AL_PITCH_SHIFTER_DEFAULT_FINE_TUNE (0) -// -///* Ring modulator effect */ -//#define AL_RING_MODULATOR_MIN_FREQUENCY (0.0f) -//#define AL_RING_MODULATOR_MAX_FREQUENCY (8000.0f) -//#define AL_RING_MODULATOR_DEFAULT_FREQUENCY (440.0f) -// -//#define AL_RING_MODULATOR_MIN_HIGHPASS_CUTOFF (0.0f) -//#define AL_RING_MODULATOR_MAX_HIGHPASS_CUTOFF (24000.0f) -//#define AL_RING_MODULATOR_DEFAULT_HIGHPASS_CUTOFF (800.0f) -// -//#define AL_RING_MODULATOR_SINUSOID (0) -//#define AL_RING_MODULATOR_SAWTOOTH (1) -//#define AL_RING_MODULATOR_SQUARE (2) -// -//#define AL_RING_MODULATOR_MIN_WAVEFORM (0) -//#define AL_RING_MODULATOR_MAX_WAVEFORM (2) -//#define AL_RING_MODULATOR_DEFAULT_WAVEFORM (0) -// -///* Autowah effect */ -//#define AL_AUTOWAH_MIN_ATTACK_TIME (0.0001f) -//#define AL_AUTOWAH_MAX_ATTACK_TIME (1.0f) -//#define AL_AUTOWAH_DEFAULT_ATTACK_TIME (0.06f) -// -//#define AL_AUTOWAH_MIN_RELEASE_TIME (0.0001f) -//#define AL_AUTOWAH_MAX_RELEASE_TIME (1.0f) -//#define AL_AUTOWAH_DEFAULT_RELEASE_TIME (0.06f) -// -//#define AL_AUTOWAH_MIN_RESONANCE (2.0f) -//#define AL_AUTOWAH_MAX_RESONANCE (1000.0f) -//#define AL_AUTOWAH_DEFAULT_RESONANCE (1000.0f) -// -//#define AL_AUTOWAH_MIN_PEAK_GAIN (0.00003f) -//#define AL_AUTOWAH_MAX_PEAK_GAIN (31621.0f) -//#define AL_AUTOWAH_DEFAULT_PEAK_GAIN (11.22f) -// -///* Compressor effect */ -//#define AL_COMPRESSOR_MIN_ONOFF (0) -//#define AL_COMPRESSOR_MAX_ONOFF (1) -//#define AL_COMPRESSOR_DEFAULT_ONOFF (1) -// -///* Equalizer effect */ -//#define AL_EQUALIZER_MIN_LOW_GAIN (0.126f) -//#define AL_EQUALIZER_MAX_LOW_GAIN (7.943f) -//#define AL_EQUALIZER_DEFAULT_LOW_GAIN (1.0f) -// -//#define AL_EQUALIZER_MIN_LOW_CUTOFF (50.0f) -//#define AL_EQUALIZER_MAX_LOW_CUTOFF (800.0f) -//#define AL_EQUALIZER_DEFAULT_LOW_CUTOFF (200.0f) -// -//#define AL_EQUALIZER_MIN_MID1_GAIN (0.126f) -//#define AL_EQUALIZER_MAX_MID1_GAIN (7.943f) -//#define AL_EQUALIZER_DEFAULT_MID1_GAIN (1.0f) -// -//#define AL_EQUALIZER_MIN_MID1_CENTER (200.0f) -//#define AL_EQUALIZER_MAX_MID1_CENTER (3000.0f) -//#define AL_EQUALIZER_DEFAULT_MID1_CENTER (500.0f) -// -//#define AL_EQUALIZER_MIN_MID1_WIDTH (0.01f) -//#define AL_EQUALIZER_MAX_MID1_WIDTH (1.0f) -//#define AL_EQUALIZER_DEFAULT_MID1_WIDTH (1.0f) -// -//#define AL_EQUALIZER_MIN_MID2_GAIN (0.126f) -//#define AL_EQUALIZER_MAX_MID2_GAIN (7.943f) -//#define AL_EQUALIZER_DEFAULT_MID2_GAIN (1.0f) -// -//#define AL_EQUALIZER_MIN_MID2_CENTER (1000.0f) -//#define AL_EQUALIZER_MAX_MID2_CENTER (8000.0f) -//#define AL_EQUALIZER_DEFAULT_MID2_CENTER (3000.0f) -// -//#define AL_EQUALIZER_MIN_MID2_WIDTH (0.01f) -//#define AL_EQUALIZER_MAX_MID2_WIDTH (1.0f) -//#define AL_EQUALIZER_DEFAULT_MID2_WIDTH (1.0f) -// -//#define AL_EQUALIZER_MIN_HIGH_GAIN (0.126f) -//#define AL_EQUALIZER_MAX_HIGH_GAIN (7.943f) -//#define AL_EQUALIZER_DEFAULT_HIGH_GAIN (1.0f) -// -//#define AL_EQUALIZER_MIN_HIGH_CUTOFF (4000.0f) -//#define AL_EQUALIZER_MAX_HIGH_CUTOFF (16000.0f) -//#define AL_EQUALIZER_DEFAULT_HIGH_CUTOFF (6000.0f) -// -// -///* Source parameter value ranges and defaults. */ -//#define AL_MIN_AIR_ABSORPTION_FACTOR (0.0f) -//#define AL_MAX_AIR_ABSORPTION_FACTOR (10.0f) -//#define AL_DEFAULT_AIR_ABSORPTION_FACTOR (0.0f) -// -//#define AL_MIN_ROOM_ROLLOFF_FACTOR (0.0f) -//#define AL_MAX_ROOM_ROLLOFF_FACTOR (10.0f) -//#define AL_DEFAULT_ROOM_ROLLOFF_FACTOR (0.0f) -// -//#define AL_MIN_CONE_OUTER_GAINHF (0.0f) -//#define AL_MAX_CONE_OUTER_GAINHF (1.0f) -//#define AL_DEFAULT_CONE_OUTER_GAINHF (1.0f) -// -//#define AL_MIN_DIRECT_FILTER_GAINHF_AUTO AL_FALSE -//#define AL_MAX_DIRECT_FILTER_GAINHF_AUTO AL_TRUE -//#define AL_DEFAULT_DIRECT_FILTER_GAINHF_AUTO AL_TRUE -// -//#define AL_MIN_AUXILIARY_SEND_FILTER_GAIN_AUTO AL_FALSE -//#define AL_MAX_AUXILIARY_SEND_FILTER_GAIN_AUTO AL_TRUE -//#define AL_DEFAULT_AUXILIARY_SEND_FILTER_GAIN_AUTO AL_TRUE -// -//#define AL_MIN_AUXILIARY_SEND_FILTER_GAINHF_AUTO AL_FALSE -//#define AL_MAX_AUXILIARY_SEND_FILTER_GAINHF_AUTO AL_TRUE -//#define AL_DEFAULT_AUXILIARY_SEND_FILTER_GAINHF_AUTO AL_TRUE -// + public static final String ALC_EXT_EFX_NAME = "ALC_EXT_EFX"; + public static final int ALC_EFX_MAJOR_VERSION = 0x20001; + public static final int ALC_EFX_MINOR_VERSION = 0x20002; + public static final int ALC_MAX_AUXILIARY_SENDS = 0x20003; + + /* Listener properties. */ + //#define AL_METERS_PER_UNIT 0x20004 + + /* Source properties. */ + public static final int AL_DIRECT_FILTER = 0x20005; + public static final int AL_AUXILIARY_SEND_FILTER = 0x20006; + //#define AL_AIR_ABSORPTION_FACTOR 0x20007 + //#define AL_ROOM_ROLLOFF_FACTOR 0x20008 + //#define AL_CONE_OUTER_GAINHF 0x20009 + + public static final int AL_DIRECT_FILTER_GAINHF_AUTO = 0x2000A; + //#define AL_AUXILIARY_SEND_FILTER_GAIN_AUTO 0x2000B + //#define AL_AUXILIARY_SEND_FILTER_GAINHF_AUTO 0x2000C + + /* Effect properties. */ + + /* Reverb effect parameters */ + public static final int AL_REVERB_DENSITY = 0x0001; + public static final int AL_REVERB_DIFFUSION = 0x0002; + public static final int AL_REVERB_GAIN = 0x0003; + public static final int AL_REVERB_GAINHF = 0x0004; + public static final int AL_REVERB_DECAY_TIME = 0x0005; + public static final int AL_REVERB_DECAY_HFRATIO = 0x0006; + public static final int AL_REVERB_REFLECTIONS_GAIN = 0x0007; + public static final int AL_REVERB_REFLECTIONS_DELAY = 0x0008; + public static final int AL_REVERB_LATE_REVERB_GAIN = 0x0009; + public static final int AL_REVERB_LATE_REVERB_DELAY = 0x000A; + public static final int AL_REVERB_AIR_ABSORPTION_GAINHF = 0x000B; + public static final int AL_REVERB_ROOM_ROLLOFF_FACTOR = 0x000C; + public static final int AL_REVERB_DECAY_HFLIMIT = 0x000D; + + /* EAX Reverb effect parameters */ + //#define AL_EAXREVERB_DENSITY 0x0001 + //#define AL_EAXREVERB_DIFFUSION 0x0002 + //#define AL_EAXREVERB_GAIN 0x0003 + //#define AL_EAXREVERB_GAINHF 0x0004 + //#define AL_EAXREVERB_GAINLF 0x0005 + //#define AL_EAXREVERB_DECAY_TIME 0x0006 + //#define AL_EAXREVERB_DECAY_HFRATIO 0x0007 + //#define AL_EAXREVERB_DECAY_LFRATIO 0x0008 + //#define AL_EAXREVERB_REFLECTIONS_GAIN 0x0009 + //#define AL_EAXREVERB_REFLECTIONS_DELAY 0x000A + //#define AL_EAXREVERB_REFLECTIONS_PAN 0x000B + //#define AL_EAXREVERB_LATE_REVERB_GAIN 0x000C + //#define AL_EAXREVERB_LATE_REVERB_DELAY 0x000D + //#define AL_EAXREVERB_LATE_REVERB_PAN 0x000E + //#define AL_EAXREVERB_ECHO_TIME 0x000F + //#define AL_EAXREVERB_ECHO_DEPTH 0x0010 + //#define AL_EAXREVERB_MODULATION_TIME 0x0011 + //#define AL_EAXREVERB_MODULATION_DEPTH 0x0012 + //#define AL_EAXREVERB_AIR_ABSORPTION_GAINHF 0x0013 + //#define AL_EAXREVERB_HFREFERENCE 0x0014 + //#define AL_EAXREVERB_LFREFERENCE 0x0015 + //#define AL_EAXREVERB_ROOM_ROLLOFF_FACTOR 0x0016 + //#define AL_EAXREVERB_DECAY_HFLIMIT 0x0017 + // + ///* Chorus effect parameters */ + //#define AL_CHORUS_WAVEFORM 0x0001 + //#define AL_CHORUS_PHASE 0x0002 + //#define AL_CHORUS_RATE 0x0003 + //#define AL_CHORUS_DEPTH 0x0004 + //#define AL_CHORUS_FEEDBACK 0x0005 + //#define AL_CHORUS_DELAY 0x0006 + // + ///* Distortion effect parameters */ + //#define AL_DISTORTION_EDGE 0x0001 + //#define AL_DISTORTION_GAIN 0x0002 + //#define AL_DISTORTION_LOWPASS_CUTOFF 0x0003 + //#define AL_DISTORTION_EQCENTER 0x0004 + //#define AL_DISTORTION_EQBANDWIDTH 0x0005 + // + ///* Echo effect parameters */ + //#define AL_ECHO_DELAY 0x0001 + //#define AL_ECHO_LRDELAY 0x0002 + //#define AL_ECHO_DAMPING 0x0003 + //#define AL_ECHO_FEEDBACK 0x0004 + //#define AL_ECHO_SPREAD 0x0005 + // + ///* Flanger effect parameters */ + //#define AL_FLANGER_WAVEFORM 0x0001 + //#define AL_FLANGER_PHASE 0x0002 + //#define AL_FLANGER_RATE 0x0003 + //#define AL_FLANGER_DEPTH 0x0004 + //#define AL_FLANGER_FEEDBACK 0x0005 + //#define AL_FLANGER_DELAY 0x0006 + // + ///* Frequency shifter effect parameters */ + //#define AL_FREQUENCY_SHIFTER_FREQUENCY 0x0001 + //#define AL_FREQUENCY_SHIFTER_LEFT_DIRECTION 0x0002 + //#define AL_FREQUENCY_SHIFTER_RIGHT_DIRECTION 0x0003 + // + ///* Vocal morpher effect parameters */ + //#define AL_VOCAL_MORPHER_PHONEMEA 0x0001 + //#define AL_VOCAL_MORPHER_PHONEMEA_COARSE_TUNING 0x0002 + //#define AL_VOCAL_MORPHER_PHONEMEB 0x0003 + //#define AL_VOCAL_MORPHER_PHONEMEB_COARSE_TUNING 0x0004 + //#define AL_VOCAL_MORPHER_WAVEFORM 0x0005 + //#define AL_VOCAL_MORPHER_RATE 0x0006 + // + ///* Pitchshifter effect parameters */ + //#define AL_PITCH_SHIFTER_COARSE_TUNE 0x0001 + //#define AL_PITCH_SHIFTER_FINE_TUNE 0x0002 + // + ///* Ringmodulator effect parameters */ + //#define AL_RING_MODULATOR_FREQUENCY 0x0001 + //#define AL_RING_MODULATOR_HIGHPASS_CUTOFF 0x0002 + //#define AL_RING_MODULATOR_WAVEFORM 0x0003 + // + ///* Autowah effect parameters */ + //#define AL_AUTOWAH_ATTACK_TIME 0x0001 + //#define AL_AUTOWAH_RELEASE_TIME 0x0002 + //#define AL_AUTOWAH_RESONANCE 0x0003 + //#define AL_AUTOWAH_PEAK_GAIN 0x0004 + // + ///* Compressor effect parameters */ + //#define AL_COMPRESSOR_ONOFF 0x0001 + // + ///* Equalizer effect parameters */ + //#define AL_EQUALIZER_LOW_GAIN 0x0001 + //#define AL_EQUALIZER_LOW_CUTOFF 0x0002 + //#define AL_EQUALIZER_MID1_GAIN 0x0003 + //#define AL_EQUALIZER_MID1_CENTER 0x0004 + //#define AL_EQUALIZER_MID1_WIDTH 0x0005 + //#define AL_EQUALIZER_MID2_GAIN 0x0006 + //#define AL_EQUALIZER_MID2_CENTER 0x0007 + //#define AL_EQUALIZER_MID2_WIDTH 0x0008 + //#define AL_EQUALIZER_HIGH_GAIN 0x0009 + //#define AL_EQUALIZER_HIGH_CUTOFF 0x000A + + /* Effect type */ + //#define AL_EFFECT_FIRST_PARAMETER 0x0000 + //#define AL_EFFECT_LAST_PARAMETER 0x8000 + public static final int AL_EFFECT_TYPE = 0x8001; + + /* Effect types, used with the AL_EFFECT_TYPE property */ + //#define AL_EFFECT_NULL 0x0000 + public static final int AL_EFFECT_REVERB = 0x0001; + //#define AL_EFFECT_CHORUS 0x0002 + //#define AL_EFFECT_DISTORTION 0x0003 + //#define AL_EFFECT_ECHO 0x0004 + //#define AL_EFFECT_FLANGER 0x0005 + //#define AL_EFFECT_FREQUENCY_SHIFTER 0x0006 + //#define AL_EFFECT_VOCAL_MORPHER 0x0007 + //#define AL_EFFECT_PITCH_SHIFTER 0x0008 + //#define AL_EFFECT_RING_MODULATOR 0x0009 + //#define AL_EFFECT_AUTOWAH 0x000A + //#define AL_EFFECT_COMPRESSOR 0x000B + //#define AL_EFFECT_EQUALIZER 0x000C + //#define AL_EFFECT_EAXREVERB 0x8000 + + /* Auxiliary Effect Slot properties. */ + public static final int AL_EFFECTSLOT_EFFECT = 0x0001; + //#define AL_EFFECTSLOT_GAIN 0x0002 + //#define AL_EFFECTSLOT_AUXILIARY_SEND_AUTO 0x0003 + + ///* NULL Auxiliary Slot ID to disable a source send. */ + //#define AL_EFFECTSLOT_NULL 0x0000 + + ///* Filter properties. */ + + /* Lowpass filter parameters */ + public static final int AL_LOWPASS_GAIN = 0x0001; + public static final int AL_LOWPASS_GAINHF = 0x0002; + + ///* Highpass filter parameters */ + //#define AL_HIGHPASS_GAIN 0x0001 + //#define AL_HIGHPASS_GAINLF 0x0002 + + ///* Bandpass filter parameters */ + //#define AL_BANDPASS_GAIN 0x0001 + //#define AL_BANDPASS_GAINLF 0x0002 + //#define AL_BANDPASS_GAINHF 0x0003 + + /* Filter type */ + //#define AL_FILTER_FIRST_PARAMETER 0x0000 + //#define AL_FILTER_LAST_PARAMETER 0x8000 + public static final int AL_FILTER_TYPE = 0x8001; + + /* Filter types, used with the AL_FILTER_TYPE property */ + public static final int AL_FILTER_NULL = 0x0000; + public static final int AL_FILTER_LOWPASS = 0x0001; + public static final int AL_FILTER_HIGHPASS = 0x0002; + //#define AL_FILTER_BANDPASS 0x0003 + + ///* Filter ranges and defaults. */ + // + ///* Lowpass filter */ + //#define AL_LOWPASS_MIN_GAIN (0.0f) + //#define AL_LOWPASS_MAX_GAIN (1.0f) + //#define AL_LOWPASS_DEFAULT_GAIN (1.0f) + // + //#define AL_LOWPASS_MIN_GAINHF (0.0f) + //#define AL_LOWPASS_MAX_GAINHF (1.0f) + //#define AL_LOWPASS_DEFAULT_GAINHF (1.0f) + // + ///* Highpass filter */ + //#define AL_HIGHPASS_MIN_GAIN (0.0f) + //#define AL_HIGHPASS_MAX_GAIN (1.0f) + //#define AL_HIGHPASS_DEFAULT_GAIN (1.0f) + // + //#define AL_HIGHPASS_MIN_GAINLF (0.0f) + //#define AL_HIGHPASS_MAX_GAINLF (1.0f) + //#define AL_HIGHPASS_DEFAULT_GAINLF (1.0f) + // + ///* Bandpass filter */ + //#define AL_BANDPASS_MIN_GAIN (0.0f) + //#define AL_BANDPASS_MAX_GAIN (1.0f) + //#define AL_BANDPASS_DEFAULT_GAIN (1.0f) + // + //#define AL_BANDPASS_MIN_GAINHF (0.0f) + //#define AL_BANDPASS_MAX_GAINHF (1.0f) + //#define AL_BANDPASS_DEFAULT_GAINHF (1.0f) + // + //#define AL_BANDPASS_MIN_GAINLF (0.0f) + //#define AL_BANDPASS_MAX_GAINLF (1.0f) + //#define AL_BANDPASS_DEFAULT_GAINLF (1.0f) + // + // + ///* Effect parameter ranges and defaults. */ + // + ///* Standard reverb effect */ + //#define AL_REVERB_MIN_DENSITY (0.0f) + //#define AL_REVERB_MAX_DENSITY (1.0f) + //#define AL_REVERB_DEFAULT_DENSITY (1.0f) + // + //#define AL_REVERB_MIN_DIFFUSION (0.0f) + //#define AL_REVERB_MAX_DIFFUSION (1.0f) + //#define AL_REVERB_DEFAULT_DIFFUSION (1.0f) + // + //#define AL_REVERB_MIN_GAIN (0.0f) + //#define AL_REVERB_MAX_GAIN (1.0f) + //#define AL_REVERB_DEFAULT_GAIN (0.32f) + // + //#define AL_REVERB_MIN_GAINHF (0.0f) + //#define AL_REVERB_MAX_GAINHF (1.0f) + //#define AL_REVERB_DEFAULT_GAINHF (0.89f) + // + //#define AL_REVERB_MIN_DECAY_TIME (0.1f) + //#define AL_REVERB_MAX_DECAY_TIME (20.0f) + //#define AL_REVERB_DEFAULT_DECAY_TIME (1.49f) + // + //#define AL_REVERB_MIN_DECAY_HFRATIO (0.1f) + //#define AL_REVERB_MAX_DECAY_HFRATIO (2.0f) + //#define AL_REVERB_DEFAULT_DECAY_HFRATIO (0.83f) + // + //#define AL_REVERB_MIN_REFLECTIONS_GAIN (0.0f) + //#define AL_REVERB_MAX_REFLECTIONS_GAIN (3.16f) + //#define AL_REVERB_DEFAULT_REFLECTIONS_GAIN (0.05f) + // + //#define AL_REVERB_MIN_REFLECTIONS_DELAY (0.0f) + //#define AL_REVERB_MAX_REFLECTIONS_DELAY (0.3f) + //#define AL_REVERB_DEFAULT_REFLECTIONS_DELAY (0.007f) + // + //#define AL_REVERB_MIN_LATE_REVERB_GAIN (0.0f) + //#define AL_REVERB_MAX_LATE_REVERB_GAIN (10.0f) + //#define AL_REVERB_DEFAULT_LATE_REVERB_GAIN (1.26f) + // + //#define AL_REVERB_MIN_LATE_REVERB_DELAY (0.0f) + //#define AL_REVERB_MAX_LATE_REVERB_DELAY (0.1f) + //#define AL_REVERB_DEFAULT_LATE_REVERB_DELAY (0.011f) + // + //#define AL_REVERB_MIN_AIR_ABSORPTION_GAINHF (0.892f) + //#define AL_REVERB_MAX_AIR_ABSORPTION_GAINHF (1.0f) + //#define AL_REVERB_DEFAULT_AIR_ABSORPTION_GAINHF (0.994f) + // + //#define AL_REVERB_MIN_ROOM_ROLLOFF_FACTOR (0.0f) + //#define AL_REVERB_MAX_ROOM_ROLLOFF_FACTOR (10.0f) + //#define AL_REVERB_DEFAULT_ROOM_ROLLOFF_FACTOR (0.0f) + // + //#define AL_REVERB_MIN_DECAY_HFLIMIT AL_FALSE + //#define AL_REVERB_MAX_DECAY_HFLIMIT AL_TRUE + //#define AL_REVERB_DEFAULT_DECAY_HFLIMIT AL_TRUE + // + ///* EAX reverb effect */ + //#define AL_EAXREVERB_MIN_DENSITY (0.0f) + //#define AL_EAXREVERB_MAX_DENSITY (1.0f) + //#define AL_EAXREVERB_DEFAULT_DENSITY (1.0f) + // + //#define AL_EAXREVERB_MIN_DIFFUSION (0.0f) + //#define AL_EAXREVERB_MAX_DIFFUSION (1.0f) + //#define AL_EAXREVERB_DEFAULT_DIFFUSION (1.0f) + // + //#define AL_EAXREVERB_MIN_GAIN (0.0f) + //#define AL_EAXREVERB_MAX_GAIN (1.0f) + //#define AL_EAXREVERB_DEFAULT_GAIN (0.32f) + // + //#define AL_EAXREVERB_MIN_GAINHF (0.0f) + //#define AL_EAXREVERB_MAX_GAINHF (1.0f) + //#define AL_EAXREVERB_DEFAULT_GAINHF (0.89f) + // + //#define AL_EAXREVERB_MIN_GAINLF (0.0f) + //#define AL_EAXREVERB_MAX_GAINLF (1.0f) + //#define AL_EAXREVERB_DEFAULT_GAINLF (1.0f) + // + //#define AL_EAXREVERB_MIN_DECAY_TIME (0.1f) + //#define AL_EAXREVERB_MAX_DECAY_TIME (20.0f) + //#define AL_EAXREVERB_DEFAULT_DECAY_TIME (1.49f) + // + //#define AL_EAXREVERB_MIN_DECAY_HFRATIO (0.1f) + //#define AL_EAXREVERB_MAX_DECAY_HFRATIO (2.0f) + //#define AL_EAXREVERB_DEFAULT_DECAY_HFRATIO (0.83f) + // + //#define AL_EAXREVERB_MIN_DECAY_LFRATIO (0.1f) + //#define AL_EAXREVERB_MAX_DECAY_LFRATIO (2.0f) + //#define AL_EAXREVERB_DEFAULT_DECAY_LFRATIO (1.0f) + // + //#define AL_EAXREVERB_MIN_REFLECTIONS_GAIN (0.0f) + //#define AL_EAXREVERB_MAX_REFLECTIONS_GAIN (3.16f) + //#define AL_EAXREVERB_DEFAULT_REFLECTIONS_GAIN (0.05f) + // + //#define AL_EAXREVERB_MIN_REFLECTIONS_DELAY (0.0f) + //#define AL_EAXREVERB_MAX_REFLECTIONS_DELAY (0.3f) + //#define AL_EAXREVERB_DEFAULT_REFLECTIONS_DELAY (0.007f) + // + //#define AL_EAXREVERB_DEFAULT_REFLECTIONS_PAN_XYZ (0.0f) + // + //#define AL_EAXREVERB_MIN_LATE_REVERB_GAIN (0.0f) + //#define AL_EAXREVERB_MAX_LATE_REVERB_GAIN (10.0f) + //#define AL_EAXREVERB_DEFAULT_LATE_REVERB_GAIN (1.26f) + // + //#define AL_EAXREVERB_MIN_LATE_REVERB_DELAY (0.0f) + //#define AL_EAXREVERB_MAX_LATE_REVERB_DELAY (0.1f) + //#define AL_EAXREVERB_DEFAULT_LATE_REVERB_DELAY (0.011f) + // + //#define AL_EAXREVERB_DEFAULT_LATE_REVERB_PAN_XYZ (0.0f) + // + //#define AL_EAXREVERB_MIN_ECHO_TIME (0.075f) + //#define AL_EAXREVERB_MAX_ECHO_TIME (0.25f) + //#define AL_EAXREVERB_DEFAULT_ECHO_TIME (0.25f) + // + //#define AL_EAXREVERB_MIN_ECHO_DEPTH (0.0f) + //#define AL_EAXREVERB_MAX_ECHO_DEPTH (1.0f) + //#define AL_EAXREVERB_DEFAULT_ECHO_DEPTH (0.0f) + // + //#define AL_EAXREVERB_MIN_MODULATION_TIME (0.04f) + //#define AL_EAXREVERB_MAX_MODULATION_TIME (4.0f) + //#define AL_EAXREVERB_DEFAULT_MODULATION_TIME (0.25f) + // + //#define AL_EAXREVERB_MIN_MODULATION_DEPTH (0.0f) + //#define AL_EAXREVERB_MAX_MODULATION_DEPTH (1.0f) + //#define AL_EAXREVERB_DEFAULT_MODULATION_DEPTH (0.0f) + // + //#define AL_EAXREVERB_MIN_AIR_ABSORPTION_GAINHF (0.892f) + //#define AL_EAXREVERB_MAX_AIR_ABSORPTION_GAINHF (1.0f) + //#define AL_EAXREVERB_DEFAULT_AIR_ABSORPTION_GAINHF (0.994f) + // + //#define AL_EAXREVERB_MIN_HFREFERENCE (1000.0f) + //#define AL_EAXREVERB_MAX_HFREFERENCE (20000.0f) + //#define AL_EAXREVERB_DEFAULT_HFREFERENCE (5000.0f) + // + //#define AL_EAXREVERB_MIN_LFREFERENCE (20.0f) + //#define AL_EAXREVERB_MAX_LFREFERENCE (1000.0f) + //#define AL_EAXREVERB_DEFAULT_LFREFERENCE (250.0f) + // + //#define AL_EAXREVERB_MIN_ROOM_ROLLOFF_FACTOR (0.0f) + //#define AL_EAXREVERB_MAX_ROOM_ROLLOFF_FACTOR (10.0f) + //#define AL_EAXREVERB_DEFAULT_ROOM_ROLLOFF_FACTOR (0.0f) + // + //#define AL_EAXREVERB_MIN_DECAY_HFLIMIT AL_FALSE + //#define AL_EAXREVERB_MAX_DECAY_HFLIMIT AL_TRUE + //#define AL_EAXREVERB_DEFAULT_DECAY_HFLIMIT AL_TRUE + // + ///* Chorus effect */ + //#define AL_CHORUS_WAVEFORM_SINUSOID (0) + //#define AL_CHORUS_WAVEFORM_TRIANGLE (1) + // + //#define AL_CHORUS_MIN_WAVEFORM (0) + //#define AL_CHORUS_MAX_WAVEFORM (1) + //#define AL_CHORUS_DEFAULT_WAVEFORM (1) + // + //#define AL_CHORUS_MIN_PHASE (-180) + //#define AL_CHORUS_MAX_PHASE (180) + //#define AL_CHORUS_DEFAULT_PHASE (90) + // + //#define AL_CHORUS_MIN_RATE (0.0f) + //#define AL_CHORUS_MAX_RATE (10.0f) + //#define AL_CHORUS_DEFAULT_RATE (1.1f) + // + //#define AL_CHORUS_MIN_DEPTH (0.0f) + //#define AL_CHORUS_MAX_DEPTH (1.0f) + //#define AL_CHORUS_DEFAULT_DEPTH (0.1f) + // + //#define AL_CHORUS_MIN_FEEDBACK (-1.0f) + //#define AL_CHORUS_MAX_FEEDBACK (1.0f) + //#define AL_CHORUS_DEFAULT_FEEDBACK (0.25f) + // + //#define AL_CHORUS_MIN_DELAY (0.0f) + //#define AL_CHORUS_MAX_DELAY (0.016f) + //#define AL_CHORUS_DEFAULT_DELAY (0.016f) + // + ///* Distortion effect */ + //#define AL_DISTORTION_MIN_EDGE (0.0f) + //#define AL_DISTORTION_MAX_EDGE (1.0f) + //#define AL_DISTORTION_DEFAULT_EDGE (0.2f) + // + //#define AL_DISTORTION_MIN_GAIN (0.01f) + //#define AL_DISTORTION_MAX_GAIN (1.0f) + //#define AL_DISTORTION_DEFAULT_GAIN (0.05f) + // + //#define AL_DISTORTION_MIN_LOWPASS_CUTOFF (80.0f) + //#define AL_DISTORTION_MAX_LOWPASS_CUTOFF (24000.0f) + //#define AL_DISTORTION_DEFAULT_LOWPASS_CUTOFF (8000.0f) + // + //#define AL_DISTORTION_MIN_EQCENTER (80.0f) + //#define AL_DISTORTION_MAX_EQCENTER (24000.0f) + //#define AL_DISTORTION_DEFAULT_EQCENTER (3600.0f) + // + //#define AL_DISTORTION_MIN_EQBANDWIDTH (80.0f) + //#define AL_DISTORTION_MAX_EQBANDWIDTH (24000.0f) + //#define AL_DISTORTION_DEFAULT_EQBANDWIDTH (3600.0f) + // + ///* Echo effect */ + //#define AL_ECHO_MIN_DELAY (0.0f) + //#define AL_ECHO_MAX_DELAY (0.207f) + //#define AL_ECHO_DEFAULT_DELAY (0.1f) + // + //#define AL_ECHO_MIN_LRDELAY (0.0f) + //#define AL_ECHO_MAX_LRDELAY (0.404f) + //#define AL_ECHO_DEFAULT_LRDELAY (0.1f) + // + //#define AL_ECHO_MIN_DAMPING (0.0f) + //#define AL_ECHO_MAX_DAMPING (0.99f) + //#define AL_ECHO_DEFAULT_DAMPING (0.5f) + // + //#define AL_ECHO_MIN_FEEDBACK (0.0f) + //#define AL_ECHO_MAX_FEEDBACK (1.0f) + //#define AL_ECHO_DEFAULT_FEEDBACK (0.5f) + // + //#define AL_ECHO_MIN_SPREAD (-1.0f) + //#define AL_ECHO_MAX_SPREAD (1.0f) + //#define AL_ECHO_DEFAULT_SPREAD (-1.0f) + // + ///* Flanger effect */ + //#define AL_FLANGER_WAVEFORM_SINUSOID (0) + //#define AL_FLANGER_WAVEFORM_TRIANGLE (1) + // + //#define AL_FLANGER_MIN_WAVEFORM (0) + //#define AL_FLANGER_MAX_WAVEFORM (1) + //#define AL_FLANGER_DEFAULT_WAVEFORM (1) + // + //#define AL_FLANGER_MIN_PHASE (-180) + //#define AL_FLANGER_MAX_PHASE (180) + //#define AL_FLANGER_DEFAULT_PHASE (0) + // + //#define AL_FLANGER_MIN_RATE (0.0f) + //#define AL_FLANGER_MAX_RATE (10.0f) + //#define AL_FLANGER_DEFAULT_RATE (0.27f) + // + //#define AL_FLANGER_MIN_DEPTH (0.0f) + //#define AL_FLANGER_MAX_DEPTH (1.0f) + //#define AL_FLANGER_DEFAULT_DEPTH (1.0f) + // + //#define AL_FLANGER_MIN_FEEDBACK (-1.0f) + //#define AL_FLANGER_MAX_FEEDBACK (1.0f) + //#define AL_FLANGER_DEFAULT_FEEDBACK (-0.5f) + // + //#define AL_FLANGER_MIN_DELAY (0.0f) + //#define AL_FLANGER_MAX_DELAY (0.004f) + //#define AL_FLANGER_DEFAULT_DELAY (0.002f) + // + ///* Frequency shifter effect */ + //#define AL_FREQUENCY_SHIFTER_MIN_FREQUENCY (0.0f) + //#define AL_FREQUENCY_SHIFTER_MAX_FREQUENCY (24000.0f) + //#define AL_FREQUENCY_SHIFTER_DEFAULT_FREQUENCY (0.0f) + // + //#define AL_FREQUENCY_SHIFTER_MIN_LEFT_DIRECTION (0) + //#define AL_FREQUENCY_SHIFTER_MAX_LEFT_DIRECTION (2) + //#define AL_FREQUENCY_SHIFTER_DEFAULT_LEFT_DIRECTION (0) + // + //#define AL_FREQUENCY_SHIFTER_DIRECTION_DOWN (0) + //#define AL_FREQUENCY_SHIFTER_DIRECTION_UP (1) + //#define AL_FREQUENCY_SHIFTER_DIRECTION_OFF (2) + // + //#define AL_FREQUENCY_SHIFTER_MIN_RIGHT_DIRECTION (0) + //#define AL_FREQUENCY_SHIFTER_MAX_RIGHT_DIRECTION (2) + //#define AL_FREQUENCY_SHIFTER_DEFAULT_RIGHT_DIRECTION (0) + // + ///* Vocal morpher effect */ + //#define AL_VOCAL_MORPHER_MIN_PHONEMEA (0) + //#define AL_VOCAL_MORPHER_MAX_PHONEMEA (29) + //#define AL_VOCAL_MORPHER_DEFAULT_PHONEMEA (0) + // + //#define AL_VOCAL_MORPHER_MIN_PHONEMEA_COARSE_TUNING (-24) + //#define AL_VOCAL_MORPHER_MAX_PHONEMEA_COARSE_TUNING (24) + //#define AL_VOCAL_MORPHER_DEFAULT_PHONEMEA_COARSE_TUNING (0) + // + //#define AL_VOCAL_MORPHER_MIN_PHONEMEB (0) + //#define AL_VOCAL_MORPHER_MAX_PHONEMEB (29) + //#define AL_VOCAL_MORPHER_DEFAULT_PHONEMEB (10) + // + //#define AL_VOCAL_MORPHER_MIN_PHONEMEB_COARSE_TUNING (-24) + //#define AL_VOCAL_MORPHER_MAX_PHONEMEB_COARSE_TUNING (24) + //#define AL_VOCAL_MORPHER_DEFAULT_PHONEMEB_COARSE_TUNING (0) + // + //#define AL_VOCAL_MORPHER_PHONEME_A (0) + //#define AL_VOCAL_MORPHER_PHONEME_E (1) + //#define AL_VOCAL_MORPHER_PHONEME_I (2) + //#define AL_VOCAL_MORPHER_PHONEME_O (3) + //#define AL_VOCAL_MORPHER_PHONEME_U (4) + //#define AL_VOCAL_MORPHER_PHONEME_AA (5) + //#define AL_VOCAL_MORPHER_PHONEME_AE (6) + //#define AL_VOCAL_MORPHER_PHONEME_AH (7) + //#define AL_VOCAL_MORPHER_PHONEME_AO (8) + //#define AL_VOCAL_MORPHER_PHONEME_EH (9) + //#define AL_VOCAL_MORPHER_PHONEME_ER (10) + //#define AL_VOCAL_MORPHER_PHONEME_IH (11) + //#define AL_VOCAL_MORPHER_PHONEME_IY (12) + //#define AL_VOCAL_MORPHER_PHONEME_UH (13) + //#define AL_VOCAL_MORPHER_PHONEME_UW (14) + //#define AL_VOCAL_MORPHER_PHONEME_B (15) + //#define AL_VOCAL_MORPHER_PHONEME_D (16) + //#define AL_VOCAL_MORPHER_PHONEME_F (17) + //#define AL_VOCAL_MORPHER_PHONEME_G (18) + //#define AL_VOCAL_MORPHER_PHONEME_J (19) + //#define AL_VOCAL_MORPHER_PHONEME_K (20) + //#define AL_VOCAL_MORPHER_PHONEME_L (21) + //#define AL_VOCAL_MORPHER_PHONEME_M (22) + //#define AL_VOCAL_MORPHER_PHONEME_N (23) + //#define AL_VOCAL_MORPHER_PHONEME_P (24) + //#define AL_VOCAL_MORPHER_PHONEME_R (25) + //#define AL_VOCAL_MORPHER_PHONEME_S (26) + //#define AL_VOCAL_MORPHER_PHONEME_T (27) + //#define AL_VOCAL_MORPHER_PHONEME_V (28) + //#define AL_VOCAL_MORPHER_PHONEME_Z (29) + // + //#define AL_VOCAL_MORPHER_WAVEFORM_SINUSOID (0) + //#define AL_VOCAL_MORPHER_WAVEFORM_TRIANGLE (1) + //#define AL_VOCAL_MORPHER_WAVEFORM_SAWTOOTH (2) + // + //#define AL_VOCAL_MORPHER_MIN_WAVEFORM (0) + //#define AL_VOCAL_MORPHER_MAX_WAVEFORM (2) + //#define AL_VOCAL_MORPHER_DEFAULT_WAVEFORM (0) + // + //#define AL_VOCAL_MORPHER_MIN_RATE (0.0f) + //#define AL_VOCAL_MORPHER_MAX_RATE (10.0f) + //#define AL_VOCAL_MORPHER_DEFAULT_RATE (1.41f) + // + ///* Pitch shifter effect */ + //#define AL_PITCH_SHIFTER_MIN_COARSE_TUNE (-12) + //#define AL_PITCH_SHIFTER_MAX_COARSE_TUNE (12) + //#define AL_PITCH_SHIFTER_DEFAULT_COARSE_TUNE (12) + // + //#define AL_PITCH_SHIFTER_MIN_FINE_TUNE (-50) + //#define AL_PITCH_SHIFTER_MAX_FINE_TUNE (50) + //#define AL_PITCH_SHIFTER_DEFAULT_FINE_TUNE (0) + // + ///* Ring modulator effect */ + //#define AL_RING_MODULATOR_MIN_FREQUENCY (0.0f) + //#define AL_RING_MODULATOR_MAX_FREQUENCY (8000.0f) + //#define AL_RING_MODULATOR_DEFAULT_FREQUENCY (440.0f) + // + //#define AL_RING_MODULATOR_MIN_HIGHPASS_CUTOFF (0.0f) + //#define AL_RING_MODULATOR_MAX_HIGHPASS_CUTOFF (24000.0f) + //#define AL_RING_MODULATOR_DEFAULT_HIGHPASS_CUTOFF (800.0f) + // + //#define AL_RING_MODULATOR_SINUSOID (0) + //#define AL_RING_MODULATOR_SAWTOOTH (1) + //#define AL_RING_MODULATOR_SQUARE (2) + // + //#define AL_RING_MODULATOR_MIN_WAVEFORM (0) + //#define AL_RING_MODULATOR_MAX_WAVEFORM (2) + //#define AL_RING_MODULATOR_DEFAULT_WAVEFORM (0) + // + ///* Autowah effect */ + //#define AL_AUTOWAH_MIN_ATTACK_TIME (0.0001f) + //#define AL_AUTOWAH_MAX_ATTACK_TIME (1.0f) + //#define AL_AUTOWAH_DEFAULT_ATTACK_TIME (0.06f) + // + //#define AL_AUTOWAH_MIN_RELEASE_TIME (0.0001f) + //#define AL_AUTOWAH_MAX_RELEASE_TIME (1.0f) + //#define AL_AUTOWAH_DEFAULT_RELEASE_TIME (0.06f) + // + //#define AL_AUTOWAH_MIN_RESONANCE (2.0f) + //#define AL_AUTOWAH_MAX_RESONANCE (1000.0f) + //#define AL_AUTOWAH_DEFAULT_RESONANCE (1000.0f) + // + //#define AL_AUTOWAH_MIN_PEAK_GAIN (0.00003f) + //#define AL_AUTOWAH_MAX_PEAK_GAIN (31621.0f) + //#define AL_AUTOWAH_DEFAULT_PEAK_GAIN (11.22f) + // + ///* Compressor effect */ + //#define AL_COMPRESSOR_MIN_ONOFF (0) + //#define AL_COMPRESSOR_MAX_ONOFF (1) + //#define AL_COMPRESSOR_DEFAULT_ONOFF (1) + // + ///* Equalizer effect */ + //#define AL_EQUALIZER_MIN_LOW_GAIN (0.126f) + //#define AL_EQUALIZER_MAX_LOW_GAIN (7.943f) + //#define AL_EQUALIZER_DEFAULT_LOW_GAIN (1.0f) + // + //#define AL_EQUALIZER_MIN_LOW_CUTOFF (50.0f) + //#define AL_EQUALIZER_MAX_LOW_CUTOFF (800.0f) + //#define AL_EQUALIZER_DEFAULT_LOW_CUTOFF (200.0f) + // + //#define AL_EQUALIZER_MIN_MID1_GAIN (0.126f) + //#define AL_EQUALIZER_MAX_MID1_GAIN (7.943f) + //#define AL_EQUALIZER_DEFAULT_MID1_GAIN (1.0f) + // + //#define AL_EQUALIZER_MIN_MID1_CENTER (200.0f) + //#define AL_EQUALIZER_MAX_MID1_CENTER (3000.0f) + //#define AL_EQUALIZER_DEFAULT_MID1_CENTER (500.0f) + // + //#define AL_EQUALIZER_MIN_MID1_WIDTH (0.01f) + //#define AL_EQUALIZER_MAX_MID1_WIDTH (1.0f) + //#define AL_EQUALIZER_DEFAULT_MID1_WIDTH (1.0f) + // + //#define AL_EQUALIZER_MIN_MID2_GAIN (0.126f) + //#define AL_EQUALIZER_MAX_MID2_GAIN (7.943f) + //#define AL_EQUALIZER_DEFAULT_MID2_GAIN (1.0f) + // + //#define AL_EQUALIZER_MIN_MID2_CENTER (1000.0f) + //#define AL_EQUALIZER_MAX_MID2_CENTER (8000.0f) + //#define AL_EQUALIZER_DEFAULT_MID2_CENTER (3000.0f) + // + //#define AL_EQUALIZER_MIN_MID2_WIDTH (0.01f) + //#define AL_EQUALIZER_MAX_MID2_WIDTH (1.0f) + //#define AL_EQUALIZER_DEFAULT_MID2_WIDTH (1.0f) + // + //#define AL_EQUALIZER_MIN_HIGH_GAIN (0.126f) + //#define AL_EQUALIZER_MAX_HIGH_GAIN (7.943f) + //#define AL_EQUALIZER_DEFAULT_HIGH_GAIN (1.0f) + // + //#define AL_EQUALIZER_MIN_HIGH_CUTOFF (4000.0f) + //#define AL_EQUALIZER_MAX_HIGH_CUTOFF (16000.0f) + //#define AL_EQUALIZER_DEFAULT_HIGH_CUTOFF (6000.0f) + // + // + ///* Source parameter value ranges and defaults. */ + //#define AL_MIN_AIR_ABSORPTION_FACTOR (0.0f) + //#define AL_MAX_AIR_ABSORPTION_FACTOR (10.0f) + //#define AL_DEFAULT_AIR_ABSORPTION_FACTOR (0.0f) + // + //#define AL_MIN_ROOM_ROLLOFF_FACTOR (0.0f) + //#define AL_MAX_ROOM_ROLLOFF_FACTOR (10.0f) + //#define AL_DEFAULT_ROOM_ROLLOFF_FACTOR (0.0f) + // + //#define AL_MIN_CONE_OUTER_GAINHF (0.0f) + //#define AL_MAX_CONE_OUTER_GAINHF (1.0f) + //#define AL_DEFAULT_CONE_OUTER_GAINHF (1.0f) + // + //#define AL_MIN_DIRECT_FILTER_GAINHF_AUTO AL_FALSE + //#define AL_MAX_DIRECT_FILTER_GAINHF_AUTO AL_TRUE + //#define AL_DEFAULT_DIRECT_FILTER_GAINHF_AUTO AL_TRUE + // + //#define AL_MIN_AUXILIARY_SEND_FILTER_GAIN_AUTO AL_FALSE + //#define AL_MAX_AUXILIARY_SEND_FILTER_GAIN_AUTO AL_TRUE + //#define AL_DEFAULT_AUXILIARY_SEND_FILTER_GAIN_AUTO AL_TRUE + // + //#define AL_MIN_AUXILIARY_SEND_FILTER_GAINHF_AUTO AL_FALSE + //#define AL_MAX_AUXILIARY_SEND_FILTER_GAINHF_AUTO AL_TRUE + //#define AL_DEFAULT_AUXILIARY_SEND_FILTER_GAINHF_AUTO AL_TRUE + + /** + * Requests a number of effect slots. + * + * @param numSlots the slots count. + * @param buffers the buffer that will receive the effect slots. + */ public void alGenAuxiliaryEffectSlots(int numSlots, IntBuffer buffers); + + /** + * Requests a number of effects. + * + * @param numEffects the effects count. + * @param buffers the buffer that will receive the effects. + */ public void alGenEffects(int numEffects, IntBuffer buffers); + + /** + * Sets the integer value of an effect parameter. + * + * @param effect the effect to modify. + * @param param the parameter to modify. + * @param value the parameter value. + */ public void alEffecti(int effect, int param, int value); + + /** + * Sets the integer value of an effect slot parameter. + * + * @param effectSlot the effect slot to modify. + * @param param the parameter to modify. + * @param value the parameter value. + */ public void alAuxiliaryEffectSloti(int effectSlot, int param, int value); + + /** + * Deletes a number of effects. + * + * @param numEffects the effects count. + * @param buffers the effect to delete. + */ public void alDeleteEffects(int numEffects, IntBuffer buffers); + + /** + * Deletes a number of effect slots. + * + * @param numEffectSlots the effect slots count. + * @param buffers the effect slots to delete. + */ public void alDeleteAuxiliaryEffectSlots(int numEffectSlots, IntBuffer buffers); + + /** + * Requests a number of filters. + * + * @param numFilters the filters count. + * @param buffers the buffer that will receive the filters. + */ public void alGenFilters(int numFilters, IntBuffer buffers); + + /** + * Sets the integer value of a filter parameter. + * + * @param filter the filter to modify. + * @param param the parameter to modify. + * @param value the parameter value. + */ public void alFilteri(int filter, int param, int value); + + /** + * Sets the float value of a filter parameter. + * + * @param filter the filter to modify. + * @param param the parameter to modify. + * @param value the parameter value. + */ public void alFilterf(int filter, int param, float value); + + /** + * Deletes a number of filters. + * + * @param numFilters the filters count. + * @param buffers the filter to delete. + */ public void alDeleteFilters(int numFilters, IntBuffer buffers); + + /** + * Sets the float value of an effect parameter. + * + * @param effect the effect to modify. + * @param param the parameter to modify. + * @param value the parameter value. + */ public void alEffectf(int effect, int param, float value); - } diff --git a/jme3-core/src/main/java/com/jme3/bounding/Intersection.java b/jme3-core/src/main/java/com/jme3/bounding/Intersection.java index c627e23e5..37beede01 100644 --- a/jme3-core/src/main/java/com/jme3/bounding/Intersection.java +++ b/jme3-core/src/main/java/com/jme3/bounding/Intersection.java @@ -34,6 +34,7 @@ package com.jme3.bounding; import com.jme3.math.FastMath; import com.jme3.math.Plane; import com.jme3.math.Vector3f; +import com.jme3.renderer.Camera; import com.jme3.util.TempVars; import static java.lang.Math.max; import static java.lang.Math.min; @@ -107,6 +108,15 @@ public final class Intersection { } } + public static boolean intersect(Camera camera, Vector3f center,float radius){ + for (int i = 5; i >= 0; i--) { + if (camera.getWorldPlane(i).pseudoDistance(center) <= -radius) { + return false; + } + } + return true; + } + // private boolean axisTest(float a, float b, float fa, float fb, Vector3f v0, Vector3f v1, ) // private boolean axisTestX01(float a, float b, float fa, float fb, // Vector3f center, Vector3f ext, diff --git a/jme3-core/src/main/java/com/jme3/cinematic/Cinematic.java b/jme3-core/src/main/java/com/jme3/cinematic/Cinematic.java index 6e1432f4a..c14ac9dbd 100644 --- a/jme3-core/src/main/java/com/jme3/cinematic/Cinematic.java +++ b/jme3-core/src/main/java/com/jme3/cinematic/Cinematic.java @@ -1,720 +1,715 @@ -/* - * Copyright (c) 2009-2012 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package com.jme3.cinematic; - -import com.jme3.animation.LoopMode; -import com.jme3.app.Application; -import com.jme3.app.state.AppState; -import com.jme3.app.state.AppStateManager; -import com.jme3.cinematic.events.AbstractCinematicEvent; -import com.jme3.cinematic.events.CinematicEvent; -import com.jme3.export.*; -import com.jme3.renderer.Camera; -import com.jme3.renderer.RenderManager; -import com.jme3.scene.CameraNode; -import com.jme3.scene.Node; -import com.jme3.scene.control.CameraControl; -import com.jme3.scene.control.CameraControl.ControlDirection; -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * An appstate for composing and playing cut scenes in a game. The cinematic - * schedules CinematicEvents over a timeline. Once the Cinematic created it has - * to be attached to the stateManager. - * - * You can add various CinematicEvents to a Cinematic, see package - * com.jme3.cinematic.events - * - * Two main methods can be used to add an event : - * - * @see Cinematic#addCinematicEvent(float, - * com.jme3.cinematic.events.CinematicEvent) , that adds an event at the given - * time form the cinematic start. - * - * @see - * Cinematic#enqueueCinematicEvent(com.jme3.cinematic.events.CinematicEvent) - * that enqueue events one after the other according to their initialDuration - * - * a cinematic has convenient methods to handle the playback : - * @see Cinematic#play() - * @see Cinematic#pause() - * @see Cinematic#stop() - * - * A cinematic is itself a CinematicEvent, meaning you can embed several - * Cinematics Embed cinematics must not be added to the stateManager though. - * - * Cinematic has a way to handle several point of view by creating CameraNode - * over a cam and activating them on schedule. - * @see Cinematic#bindCamera(java.lang.String, com.jme3.renderer.Camera) - * @see Cinematic#activateCamera(float, java.lang.String) - * @see Cinematic#setActiveCamera(java.lang.String) - * - * @author Nehon - */ -public class Cinematic extends AbstractCinematicEvent implements AppState { - - private static final Logger logger = Logger.getLogger(Application.class.getName()); - private Node scene; - protected TimeLine timeLine = new TimeLine(); - private int lastFetchedKeyFrame = -1; - private List cinematicEvents = new ArrayList(); - private Map cameras = new HashMap(); - private CameraNode currentCam; - private boolean initialized = false; - private Map> eventsData; - private float nextEnqueue = 0; - - /** - * Used for serialization creates a cinematic, don't use this constructor - * directly - */ - public Cinematic() { - } - - /** - * creates a cinematic - * - * @param scene the scene in which the cinematic should take place - */ - public Cinematic(Node scene) { - this.scene = scene; - } - - /** - * creates a cinematic - * - * @param scene the scene in which the cinematic should take place - * @param initialDuration the duration of the cinematic (without considering - * the speed) - */ - public Cinematic(Node scene, float initialDuration) { - super(initialDuration); - this.scene = scene; - } - - /** - * creates a cinematic - * - * @param scene the scene in which the cinematic should take place - * @param loopMode tells if this cinematic should be looped or not - */ - public Cinematic(Node scene, LoopMode loopMode) { - super(loopMode); - this.scene = scene; - } - - /** - * creates a cinematic - * - * @param scene the scene in which the cinematic should take place - * @param initialDuration the duration of the cinematic (without considering - * the speed) - * @param loopMode tells if this cinematic should be looped or not - */ - public Cinematic(Node scene, float initialDuration, LoopMode loopMode) { - super(initialDuration, loopMode); - this.scene = scene; - } - - /** - * called internally - */ - @Override - public void onPlay() { - if (isInitialized()) { - if (playState == PlayState.Paused) { - for (int i = 0; i < cinematicEvents.size(); i++) { - CinematicEvent ce = cinematicEvents.get(i); - if (ce.getPlayState() == PlayState.Paused) { - ce.play(); - } - } - } - } - } - - /** - * called internally - */ - @Override - public void onStop() { - time = 0; - lastFetchedKeyFrame = -1; - for (int i = 0; i < cinematicEvents.size(); i++) { - CinematicEvent ce = cinematicEvents.get(i); - ce.setTime(0); - ce.forceStop(); - } - setEnableCurrentCam(false); - } - - /** - * called internally - */ - @Override - public void onPause() { - for (int i = 0; i < cinematicEvents.size(); i++) { - CinematicEvent ce = cinematicEvents.get(i); - if (ce.getPlayState() == PlayState.Playing) { - ce.pause(); - } - } - } - - /** - * used internally for serialization - * - * @param ex - * @throws IOException - */ - @Override - public void write(JmeExporter ex) throws IOException { - super.write(ex); - OutputCapsule oc = ex.getCapsule(this); - - oc.writeSavableArrayList((ArrayList) cinematicEvents, "cinematicEvents", null); - oc.writeStringSavableMap(cameras, "cameras", null); - oc.write(timeLine, "timeLine", null); - - } - - /** - * used internally for serialization - * - * @param im - * @throws IOException - */ - @Override - public void read(JmeImporter im) throws IOException { - super.read(im); - InputCapsule ic = im.getCapsule(this); - - cinematicEvents = ic.readSavableArrayList("cinematicEvents", null); - cameras = (Map) ic.readStringSavableMap("cameras", null); - timeLine = (TimeLine) ic.readSavable("timeLine", null); - } - - /** - * sets the speed of the cinematic. Note that it will set the speed of all - * events in the cinematic. 1 is normal speed. use 0.5f to make the - * cinematic twice slower, use 2 to make it twice faster - * - * @param speed the speed - */ - @Override - public void setSpeed(float speed) { - super.setSpeed(speed); - for (int i = 0; i < cinematicEvents.size(); i++) { - CinematicEvent ce = cinematicEvents.get(i); - ce.setSpeed(speed); - } - - - } - - /** - * used internally - * - * @param stateManager the state manager - * @param app the application - */ - public void initialize(AppStateManager stateManager, Application app) { - initEvent(app, this); - for (CinematicEvent cinematicEvent : cinematicEvents) { - cinematicEvent.initEvent(app, this); - } - - initialized = true; - } - - /** - * used internally - * - * @return - */ - public boolean isInitialized() { - return initialized; - } - - /** - * passing true has the same effect as play() you should use play(), - * pause(), stop() to handle the cinematic playing state. - * - * @param enabled true or false - */ - public void setEnabled(boolean enabled) { - if (enabled) { - play(); - } - } - - /** - * return true if the cinematic appstate is enabled (the cinematic is - * playing) - * - * @return true if enabled - */ - public boolean isEnabled() { - return playState == PlayState.Playing; - } - - /** - * called internally - * - * @param stateManager the state manager - */ - public void stateAttached(AppStateManager stateManager) { - } - - /** - * called internally - * - * @param stateManager the state manager - */ - public void stateDetached(AppStateManager stateManager) { - stop(); - } - - /** - * called internally don't call it directly. - * - * @param tpf - */ - public void update(float tpf) { - if (isInitialized()) { - internalUpdate(tpf); - } - } - - /** - * used internally, don't call this directly. - * - * @param tpf - */ - @Override - public void onUpdate(float tpf) { - int keyFrameIndex = timeLine.getKeyFrameIndexFromTime(time); - - //iterate to make sure every key frame is triggered - for (int i = lastFetchedKeyFrame + 1; i <= keyFrameIndex; i++) { - KeyFrame keyFrame = timeLine.get(i); - if (keyFrame != null) { - keyFrame.trigger(); - } - } - - - for (int i = 0; i < cinematicEvents.size(); i++) { - CinematicEvent ce = cinematicEvents.get(i); - ce.internalUpdate(tpf); - } - - - lastFetchedKeyFrame = keyFrameIndex; - } - - /** - * This is used internally but can be called to shuffle through the - * cinematic. - * - * @param time the time to shuffle to. - */ - @Override - public void setTime(float time) { - - //stopping all events - onStop(); - super.setTime(time); - - int keyFrameIndex = timeLine.getKeyFrameIndexFromTime(time); - //triggering all the event from start to "time" - //then computing timeOffset for each event - for (int i = 0; i <= keyFrameIndex; i++) { - KeyFrame keyFrame = timeLine.get(i); - if (keyFrame != null) { - for (CinematicEvent ce : keyFrame.getCinematicEvents()) { - float t = this.time - timeLine.getKeyFrameTime(keyFrame); - if (t >= 0 && (t <= ce.getInitialDuration() || ce.getLoopMode() != LoopMode.DontLoop)) { - ce.play(); - } - ce.setTime(t); - } - } - } - lastFetchedKeyFrame = keyFrameIndex; - if (playState != PlayState.Playing) { - pause(); - } - } - - /** - * Adds a cinematic event to this cinematic at the given timestamp. This - * operation returns a keyFrame - * - * @param timeStamp the time when the event will start after the beginning of - * the cinematic - * @param cinematicEvent the cinematic event - * @return the keyFrame for that event. - */ - public KeyFrame addCinematicEvent(float timeStamp, CinematicEvent cinematicEvent) { - KeyFrame keyFrame = timeLine.getKeyFrameAtTime(timeStamp); - if (keyFrame == null) { - keyFrame = new KeyFrame(); - timeLine.addKeyFrameAtTime(timeStamp, keyFrame); - } - keyFrame.cinematicEvents.add(cinematicEvent); - cinematicEvents.add(cinematicEvent); - if (isInitialized()) { - cinematicEvent.initEvent(null, this); - } - return keyFrame; - } - - /** - * enqueue a cinematic event to a cinematic. This is a handy method when you - * want to chain event of a given duration without knowing their initial - * duration - * - * @param cinematicEvent the cinematic event to enqueue - * @return the timestamp the event was scheduled. - */ - public float enqueueCinematicEvent(CinematicEvent cinematicEvent) { - float scheduleTime = nextEnqueue; - addCinematicEvent(scheduleTime, cinematicEvent); - nextEnqueue += cinematicEvent.getInitialDuration(); - return scheduleTime; - } - - /** - * removes the first occurrence found of the given cinematicEvent. - * - * @param cinematicEvent the cinematicEvent to remove - * @return true if the element has been removed - */ - public boolean removeCinematicEvent(CinematicEvent cinematicEvent) { - cinematicEvent.dispose(); - cinematicEvents.remove(cinematicEvent); - for (KeyFrame keyFrame : timeLine.values()) { - if (keyFrame.cinematicEvents.remove(cinematicEvent)) { - return true; - } - } - return false; - } - - /** - * removes the first occurrence found of the given cinematicEvent for the - * given time stamp. - * - * @param timeStamp the timestamp when the cinematicEvent has been added - * @param cinematicEvent the cinematicEvent to remove - * @return true if the element has been removed - */ - public boolean removeCinematicEvent(float timeStamp, CinematicEvent cinematicEvent) { - cinematicEvent.dispose(); - KeyFrame keyFrame = timeLine.getKeyFrameAtTime(timeStamp); - return removeCinematicEvent(keyFrame, cinematicEvent); - } - - /** - * removes the first occurrence found of the given cinematicEvent for the - * given keyFrame - * - * @param keyFrame the keyFrame returned by the addCinematicEvent method. - * @param cinematicEvent the cinematicEvent to remove - * @return true if the element has been removed - */ - public boolean removeCinematicEvent(KeyFrame keyFrame, CinematicEvent cinematicEvent) { - cinematicEvent.dispose(); - boolean ret = keyFrame.cinematicEvents.remove(cinematicEvent); - cinematicEvents.remove(cinematicEvent); - if (keyFrame.isEmpty()) { - timeLine.removeKeyFrame(keyFrame.getIndex()); - } - return ret; - } - - /** - * called internally - * - * @see AppState#render(com.jme3.renderer.RenderManager) - */ - public void render(RenderManager rm) { - } - - /** - * called internally - * - * @see AppState#postRender() - */ - public void postRender() { - } - - /** - * called internally - * - * @see AppState#cleanup() - */ - public void cleanup() { - } - - /** - * fits the duration of the cinematic to the duration of all its child - * cinematic events - */ - public void fitDuration() { - KeyFrame kf = timeLine.getKeyFrameAtIndex(timeLine.getLastKeyFrameIndex()); - float d = 0; - for (int i = 0; i < kf.getCinematicEvents().size(); i++) { - CinematicEvent ce = kf.getCinematicEvents().get(i); - float dur = timeLine.getKeyFrameTime(kf) + ce.getDuration() * ce.getSpeed(); - if (d < dur) { - d = dur; - } - } - - initialDuration = d; - } - - /** - * Binds a camera to this cinematic, tagged by a unique name. This methods - * creates and returns a CameraNode for the cam and attach it to the scene. - * The control direction is set to SpatialToCamera. This camera Node can - * then be used in other events to handle the camera movements during the - * playback - * - * @param cameraName the unique tag the camera should have - * @param cam the scene camera. - * @return the created CameraNode. - */ - public CameraNode bindCamera(String cameraName, Camera cam) { - if (cameras.containsKey(cameraName)) { - throw new IllegalArgumentException("Camera " + cameraName + " is already binded to this cinematic"); - } - CameraNode node = new CameraNode(cameraName, cam); - node.setControlDir(ControlDirection.SpatialToCamera); - node.getControl(CameraControl.class).setEnabled(false); - cameras.put(cameraName, node); - scene.attachChild(node); - return node; - } - - /** - * returns a cameraNode given its name - * - * @param cameraName the camera name (as registered in - * Cinematic#bindCamera()) - * @return the cameraNode for this name - */ - public CameraNode getCamera(String cameraName) { - return cameras.get(cameraName); - } - - /** - * enable/disable the camera control of the cameraNode of the current cam - * - * @param enabled - */ - private void setEnableCurrentCam(boolean enabled) { - if (currentCam != null) { - currentCam.getControl(CameraControl.class).setEnabled(enabled); - } - } - - /** - * Sets the active camera instantly (use activateCamera if you want to - * schedule that event) - * - * @param cameraName the camera name (as registered in - * Cinematic#bindCamera()) - */ - public void setActiveCamera(String cameraName) { - setEnableCurrentCam(false); - currentCam = cameras.get(cameraName); - if (currentCam == null) { - logger.log(Level.WARNING, "{0} is not a camera bond to the cinematic, cannot activate", cameraName); - } - setEnableCurrentCam(true); - } - - /** - * schedule an event that will activate the camera at the given time - * - * @param timeStamp the time to activate the cam - * @param cameraName the camera name (as registered in - * Cinematic#bindCamera()) - */ - public void activateCamera(final float timeStamp, final String cameraName) { - addCinematicEvent(timeStamp, new AbstractCinematicEvent() { - @Override - public void play() { - super.play(); - stop(); - } - - @Override - public void onPlay() { - setActiveCamera(cameraName); - } - - @Override - public void onUpdate(float tpf) { - } - - @Override - public void onStop() { - } - - @Override - public void onPause() { - } - - @Override - public void forceStop() { - } - - @Override - public void setTime(float time) { - play(); - } - }); - } - - /** - * returns the complete eventdata map - * - * @return the eventdata map - */ - private Map> getEventsData() { - if (eventsData == null) { - eventsData = new HashMap>(); - } - return eventsData; - } - - /** - * used internally put an eventdata in the cinematic - * - * @param type the type of data - * @param key the key - * @param object the data - */ - public void putEventData(String type, Object key, Object object) { - Map> data = getEventsData(); - Map row = data.get(type); - if (row == null) { - row = new HashMap(); - } - row.put(key, object); - data.put(type, row); - } - - /** - * used internally return and event data - * - * @param type the type of data - * @param key the key - * @return - */ - public Object getEventData(String type, Object key) { - if (eventsData != null) { - Map row = eventsData.get(type); - if (row != null) { - return row.get(key); - } - } - return null; - } - - /** - * Used internally remove an eventData - * - * @param type the type of data - * @param key the key of the data - */ - public void removeEventData(String type, Object key) { - if (eventsData != null) { - Map row = eventsData.get(type); - if (row != null) { - row.remove(key); - } - } - } - - /** - * sets the scene to use for this cinematic it is expected that the scene is - * added before adding events to the cinematic - * - * @param scene the scene where the cinematic should take place. - */ - public void setScene(Node scene) { - this.scene = scene; - } - - /** - * return the scene where the cinematic occur - * - * @return the scene - */ - public Node getScene() { - return scene; - } - - /** - * clear the cinematic of its events. - */ - public void clear() { - dispose(); - cinematicEvents.clear(); - timeLine.clear(); - if (eventsData != null) { - eventsData.clear(); - } - } - - /** - * used internally to cleanup the cinematic. Called when the clear() method - * is called - */ - @Override - public void dispose() { - for (CinematicEvent event : cinematicEvents) { - event.dispose(); - } - } -} +/* + * Copyright (c) 2009-2012 jMonkeyEngine + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'jMonkeyEngine' nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package com.jme3.cinematic; + +import com.jme3.animation.LoopMode; +import com.jme3.app.Application; +import com.jme3.app.state.AppState; +import com.jme3.app.state.AppStateManager; +import com.jme3.cinematic.events.AbstractCinematicEvent; +import com.jme3.cinematic.events.CameraEvent; +import com.jme3.cinematic.events.CinematicEvent; +import com.jme3.export.*; +import com.jme3.renderer.Camera; +import com.jme3.renderer.RenderManager; +import com.jme3.renderer.ViewPort; +import com.jme3.scene.CameraNode; +import com.jme3.scene.Node; +import com.jme3.scene.Spatial; +import com.jme3.scene.control.CameraControl; +import com.jme3.scene.control.CameraControl.ControlDirection; +import com.jme3.scene.control.Control; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * An appstate for composing and playing cut scenes in a game. The cinematic + * schedules CinematicEvents over a timeline. Once the Cinematic created it has + * to be attached to the stateManager. + * + * You can add various CinematicEvents to a Cinematic, see package + * com.jme3.cinematic.events + * + * Two main methods can be used to add an event : + * + * @see Cinematic#addCinematicEvent(float, + * com.jme3.cinematic.events.CinematicEvent) , that adds an event at the given + * time form the cinematic start. + * + * @see + * Cinematic#enqueueCinematicEvent(com.jme3.cinematic.events.CinematicEvent) + * that enqueue events one after the other according to their initialDuration + * + * a cinematic has convenient methods to handle the playback : + * @see Cinematic#play() + * @see Cinematic#pause() + * @see Cinematic#stop() + * + * A cinematic is itself a CinematicEvent, meaning you can embed several + * Cinematics Embed cinematics must not be added to the stateManager though. + * + * Cinematic has a way to handle several point of view by creating CameraNode + * over a cam and activating them on schedule. + * @see Cinematic#bindCamera(java.lang.String, com.jme3.renderer.Camera) + * @see Cinematic#activateCamera(float, java.lang.String) + * @see Cinematic#setActiveCamera(java.lang.String) + * + * @author Nehon + */ +public class Cinematic extends AbstractCinematicEvent implements AppState { + + private static final Logger logger = Logger.getLogger(Cinematic.class.getName()); + private Node scene; + protected TimeLine timeLine = new TimeLine(); + private int lastFetchedKeyFrame = -1; + private List cinematicEvents = new ArrayList<>(); + private Map cameras = new HashMap<>(); + private CameraNode currentCam; + private boolean initialized = false; + private Map> eventsData; + private float nextEnqueue = 0; + + /** + * Used for serialization creates a cinematic, don't use this constructor + * directly + */ + public Cinematic() { + super(); + } + + public Cinematic(float initialDuration) { + super(initialDuration); + } + + public Cinematic(LoopMode loopMode) { + super(loopMode); + } + + public Cinematic(float initialDuration, LoopMode loopMode) { + super(initialDuration, loopMode); + } + + /** + * creates a cinematic + * + * @param scene the scene in which the cinematic should take place + */ + public Cinematic(Node scene) { + this.scene = scene; + } + + /** + * creates a cinematic + * + * @param scene the scene in which the cinematic should take place + * @param initialDuration the duration of the cinematic (without considering + * the speed) + */ + public Cinematic(Node scene, float initialDuration) { + super(initialDuration); + this.scene = scene; + } + + /** + * creates a cinematic + * + * @param scene the scene in which the cinematic should take place + * @param loopMode tells if this cinematic should be looped or not + */ + public Cinematic(Node scene, LoopMode loopMode) { + super(loopMode); + this.scene = scene; + } + + /** + * creates a cinematic + * + * @param scene the scene in which the cinematic should take place + * @param initialDuration the duration of the cinematic (without considering + * the speed) + * @param loopMode tells if this cinematic should be looped or not + */ + public Cinematic(Node scene, float initialDuration, LoopMode loopMode) { + super(initialDuration, loopMode); + this.scene = scene; + } + + /** + * called internally + */ + @Override + public void onPlay() { + if (isInitialized()) { + if (playState == PlayState.Paused) { + for (int i = 0; i < cinematicEvents.size(); i++) { + CinematicEvent ce = cinematicEvents.get(i); + if (ce.getPlayState() == PlayState.Paused) { + ce.play(); + } + } + } + } + } + + /** + * called internally + */ + @Override + public void onStop() { + time = 0; + lastFetchedKeyFrame = -1; + for (int i = 0; i < cinematicEvents.size(); i++) { + CinematicEvent ce = cinematicEvents.get(i); + ce.setTime(0); + ce.forceStop(); + } + setEnableCurrentCam(false); + } + + /** + * called internally + */ + @Override + public void onPause() { + for (int i = 0; i < cinematicEvents.size(); i++) { + CinematicEvent ce = cinematicEvents.get(i); + if (ce.getPlayState() == PlayState.Playing) { + ce.pause(); + } + } + } + + /** + * used internally for serialization + * + * @param ex + * @throws IOException + */ + @Override + public void write(JmeExporter ex) throws IOException { + super.write(ex); + OutputCapsule oc = ex.getCapsule(this); + oc.write(cinematicEvents.toArray(new CinematicEvent[cinematicEvents.size()]), "cinematicEvents", null); + oc.writeStringSavableMap(cameras, "cameras", null); + oc.write(timeLine, "timeLine", null); + + } + + /** + * used internally for serialization + * + * @param im + * @throws IOException + */ + @Override + public void read(JmeImporter im) throws IOException { + super.read(im); + InputCapsule ic = im.getCapsule(this); + + Savable[] events = ic.readSavableArray("cinematicEvents", null); + for (Savable c : events) { +// addCinematicEvent(((CinematicEvent) c).getTime(), (CinematicEvent) c) + cinematicEvents.add((CinematicEvent) c); + } + cameras = (Map) ic.readStringSavableMap("cameras", null); + timeLine = (TimeLine) ic.readSavable("timeLine", null); + } + + /** + * sets the speed of the cinematic. Note that it will set the speed of all + * events in the cinematic. 1 is normal speed. use 0.5f to make the + * cinematic twice slower, use 2 to make it twice faster + * + * @param speed the speed + */ + @Override + public void setSpeed(float speed) { + super.setSpeed(speed); + for (int i = 0; i < cinematicEvents.size(); i++) { + CinematicEvent ce = cinematicEvents.get(i); + ce.setSpeed(speed); + } + + } + + /** + * used internally + * + * @param stateManager the state manager + * @param app the application + */ + public void initialize(AppStateManager stateManager, Application app) { + initEvent(app, this); + for (CinematicEvent cinematicEvent : cinematicEvents) { + cinematicEvent.initEvent(app, this); + } + if(!cameras.isEmpty()){ + for(CameraNode n : cameras.values()){ + n.setCamera(app.getCamera()); + } + } + initialized = true; + } + + /** + * used internally + * + * @return + */ + public boolean isInitialized() { + return initialized; + } + + /** + * passing true has the same effect as play() you should use play(), + * pause(), stop() to handle the cinematic playing state. + * + * @param enabled true or false + */ + public void setEnabled(boolean enabled) { + if (enabled) { + play(); + } + } + + /** + * return true if the cinematic appstate is enabled (the cinematic is + * playing) + * + * @return true if enabled + */ + public boolean isEnabled() { + return playState == PlayState.Playing; + } + + /** + * called internally + * + * @param stateManager the state manager + */ + public void stateAttached(AppStateManager stateManager) { + } + + /** + * called internally + * + * @param stateManager the state manager + */ + public void stateDetached(AppStateManager stateManager) { + stop(); + } + + /** + * called internally don't call it directly. + * + * @param tpf + */ + @Override + public void update(float tpf) { + if (isInitialized() && playState == PlayState.Playing) { + internalUpdate(tpf); + } + } + + /** + * used internally, don't call this directly. + * + * @param tpf + */ + @Override + public void onUpdate(float tpf) { + int keyFrameIndex = timeLine.getKeyFrameIndexFromTime(time); + + //iterate to make sure every key frame is triggered + for (int i = lastFetchedKeyFrame + 1; i <= keyFrameIndex; i++) { + KeyFrame keyFrame = timeLine.get(i); + if (keyFrame != null) { + keyFrame.trigger(); + } + } + + for (int i = 0; i < cinematicEvents.size(); i++) { + CinematicEvent ce = cinematicEvents.get(i); + ce.internalUpdate(tpf); + } + + lastFetchedKeyFrame = keyFrameIndex; + } + + /** + * This is used internally but can be called to shuffle through the + * cinematic. + * + * @param time the time to shuffle to. + */ + @Override + public void setTime(float time) { + + //stopping all events + onStop(); + super.setTime(time); + + int keyFrameIndex = timeLine.getKeyFrameIndexFromTime(time); + //triggering all the event from start to "time" + //then computing timeOffset for each event + for (int i = 0; i <= keyFrameIndex; i++) { + KeyFrame keyFrame = timeLine.get(i); + if (keyFrame != null) { + for (CinematicEvent ce : keyFrame.getCinematicEvents()) { + float t = this.time - timeLine.getKeyFrameTime(keyFrame); + if (t >= 0 && (t <= ce.getInitialDuration() || ce.getLoopMode() != LoopMode.DontLoop)) { + ce.play(); + } + ce.setTime(t); + } + } + } + lastFetchedKeyFrame = keyFrameIndex; + if (playState != PlayState.Playing) { + pause(); + } + } + + /** + * Adds a cinematic event to this cinematic at the given timestamp. This + * operation returns a keyFrame + * + * @param timeStamp the time when the event will start after the beginning + * of the cinematic + * @param cinematicEvent the cinematic event + * @return the keyFrame for that event. + */ + public KeyFrame addCinematicEvent(float timeStamp, CinematicEvent cinematicEvent) { + KeyFrame keyFrame = timeLine.getKeyFrameAtTime(timeStamp); + if (keyFrame == null) { + keyFrame = new KeyFrame(); + timeLine.addKeyFrameAtTime(timeStamp, keyFrame); + } + keyFrame.cinematicEvents.add(cinematicEvent); + cinematicEvents.add(cinematicEvent); + if (isInitialized()) { + cinematicEvent.initEvent(null, this); + } + return keyFrame; + } + + /** + * enqueue a cinematic event to a cinematic. This is a handy method when you + * want to chain event of a given duration without knowing their initial + * duration + * + * @param cinematicEvent the cinematic event to enqueue + * @return the timestamp the event was scheduled. + */ + public float enqueueCinematicEvent(CinematicEvent cinematicEvent) { + float scheduleTime = nextEnqueue; + addCinematicEvent(scheduleTime, cinematicEvent); + nextEnqueue += cinematicEvent.getInitialDuration(); + return scheduleTime; + } + + /** + * removes the first occurrence found of the given cinematicEvent. + * + * @param cinematicEvent the cinematicEvent to remove + * @return true if the element has been removed + */ + public boolean removeCinematicEvent(CinematicEvent cinematicEvent) { + cinematicEvent.dispose(); + cinematicEvents.remove(cinematicEvent); + for (KeyFrame keyFrame : timeLine.values()) { + if (keyFrame.cinematicEvents.remove(cinematicEvent)) { + return true; + } + } + return false; + } + + /** + * removes the first occurrence found of the given cinematicEvent for the + * given time stamp. + * + * @param timeStamp the timestamp when the cinematicEvent has been added + * @param cinematicEvent the cinematicEvent to remove + * @return true if the element has been removed + */ + public boolean removeCinematicEvent(float timeStamp, CinematicEvent cinematicEvent) { + cinematicEvent.dispose(); + KeyFrame keyFrame = timeLine.getKeyFrameAtTime(timeStamp); + return removeCinematicEvent(keyFrame, cinematicEvent); + } + + /** + * removes the first occurrence found of the given cinematicEvent for the + * given keyFrame + * + * @param keyFrame the keyFrame returned by the addCinematicEvent method. + * @param cinematicEvent the cinematicEvent to remove + * @return true if the element has been removed + */ + public boolean removeCinematicEvent(KeyFrame keyFrame, CinematicEvent cinematicEvent) { + cinematicEvent.dispose(); + boolean ret = keyFrame.cinematicEvents.remove(cinematicEvent); + cinematicEvents.remove(cinematicEvent); + if (keyFrame.isEmpty()) { + timeLine.removeKeyFrame(keyFrame.getIndex()); + } + return ret; + } + + /** + * called internally + * + * @see AppState#render(com.jme3.renderer.RenderManager) + */ + public void render(RenderManager rm) { + } + + /** + * called internally + * + * @see AppState#postRender() + */ + public void postRender() { + } + + /** + * called internally + * + * @see AppState#cleanup() + */ + public void cleanup() { + } + + /** + * fits the duration of the cinematic to the duration of all its child + * cinematic events + */ + public void fitDuration() { + KeyFrame kf = timeLine.getKeyFrameAtIndex(timeLine.getLastKeyFrameIndex()); + float d = 0; + for (int i = 0; i < kf.getCinematicEvents().size(); i++) { + CinematicEvent ce = kf.getCinematicEvents().get(i); + float dur = timeLine.getKeyFrameTime(kf) + ce.getDuration() * ce.getSpeed(); + if (d < dur) { + d = dur; + } + } + + initialDuration = d; + } + + /** + * Binds a camera to this cinematic, tagged by a unique name. This methods + * creates and returns a CameraNode for the cam and attach it to the scene. + * The control direction is set to SpatialToCamera. This camera Node can + * then be used in other events to handle the camera movements during the + * playback + * + * @param cameraName the unique tag the camera should have + * @param cam the scene camera. + * @return the created CameraNode. + */ + public CameraNode bindCamera(String cameraName, Camera cam) { + if (cameras.containsKey(cameraName)) { + throw new IllegalArgumentException("Camera " + cameraName + " is already binded to this cinematic"); + } + CameraNode node = new CameraNode(cameraName, cam); + node.setControlDir(ControlDirection.SpatialToCamera); + node.getControl(CameraControl.class).setEnabled(false); + cameras.put(cameraName, node); + scene.attachChild(node); + return node; + } + + /** + * returns a cameraNode given its name + * + * @param cameraName the camera name (as registered in + * Cinematic#bindCamera()) + * @return the cameraNode for this name + */ + public CameraNode getCamera(String cameraName) { + return cameras.get(cameraName); + } + + /** + * enable/disable the camera control of the cameraNode of the current cam + * + * @param enabled + */ + private void setEnableCurrentCam(boolean enabled) { + if (currentCam != null) { + currentCam.getControl(CameraControl.class).setEnabled(enabled); + } + } + + /** + * Sets the active camera instantly (use activateCamera if you want to + * schedule that event) + * + * @param cameraName the camera name (as registered in + * Cinematic#bindCamera()) + */ + public void setActiveCamera(String cameraName) { + setEnableCurrentCam(false); + currentCam = cameras.get(cameraName); + if (currentCam == null) { + logger.log(Level.WARNING, "{0} is not a camera bond to the cinematic, cannot activate", cameraName); + } + setEnableCurrentCam(true); + } + + /** + * schedule an event that will activate the camera at the given time + * + * @param timeStamp the time to activate the cam + * @param cameraName the camera name (as registered in + * Cinematic#bindCamera()) + */ + public void activateCamera(final float timeStamp, final String cameraName) { + addCinematicEvent(timeStamp, new CameraEvent(this, cameraName)); + } + + /** + * returns the complete eventdata map + * + * @return the eventdata map + */ + private Map> getEventsData() { + if (eventsData == null) { + eventsData = new HashMap>(); + } + return eventsData; + } + + /** + * used internally put an eventdata in the cinematic + * + * @param type the type of data + * @param key the key + * @param object the data + */ + public void putEventData(String type, Object key, Object object) { + Map> data = getEventsData(); + Map row = data.get(type); + if (row == null) { + row = new HashMap(); + } + row.put(key, object); + data.put(type, row); + } + + /** + * used internally return and event data + * + * @param type the type of data + * @param key the key + * @return + */ + public Object getEventData(String type, Object key) { + if (eventsData != null) { + Map row = eventsData.get(type); + if (row != null) { + return row.get(key); + } + } + return null; + } + + /** + * Used internally remove an eventData + * + * @param type the type of data + * @param key the key of the data + */ + public void removeEventData(String type, Object key) { + if (eventsData != null) { + Map row = eventsData.get(type); + if (row != null) { + row.remove(key); + } + } + } + + /** + * sets the scene to use for this cinematic it is expected that the scene is + * added before adding events to the cinematic + * + * @param scene the scene where the cinematic should take place. + */ + public void setScene(Node scene) { + this.scene = scene; + if(!cameras.isEmpty()){ + for(CameraNode n : cameras.values()){ + this.scene.attachChild(n); + } + } + } + + /** + * return the scene where the cinematic occur + * + * @return the scene + */ + public Node getScene() { + return scene; + } + + /** + * clear the cinematic of its events. + */ + public void clear() { + dispose(); + cinematicEvents.clear(); + timeLine.clear(); + if (eventsData != null) { + eventsData.clear(); + } + } + + /** + * used internally to cleanup the cinematic. Called when the clear() method + * is called + */ + @Override + public void dispose() { + for (CinematicEvent event : cinematicEvents) { + event.dispose(); + } + } +} diff --git a/jme3-core/src/main/java/com/jme3/cinematic/KeyFrame.java b/jme3-core/src/main/java/com/jme3/cinematic/KeyFrame.java index a794e3cd0..458a482a9 100644 --- a/jme3-core/src/main/java/com/jme3/cinematic/KeyFrame.java +++ b/jme3-core/src/main/java/com/jme3/cinematic/KeyFrame.java @@ -1,89 +1,93 @@ -/* - * Copyright (c) 2009-2012 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package com.jme3.cinematic; - -import com.jme3.cinematic.events.CinematicEvent; -import com.jme3.export.*; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -/** - * - * @author Nehon - */ -public class KeyFrame implements Savable { - - List cinematicEvents = new ArrayList(); - private int index; - - public List getCinematicEvents() { - return cinematicEvents; - } - - public void setCinematicEvents(List cinematicEvents) { - this.cinematicEvents = cinematicEvents; - } - - public List trigger() { - for (CinematicEvent event : cinematicEvents) { - event.play(); - } - return cinematicEvents; - } - - public boolean isEmpty(){ - return cinematicEvents.isEmpty(); - } - - public void write(JmeExporter ex) throws IOException { - OutputCapsule oc = ex.getCapsule(this); - oc.writeSavableArrayList((ArrayList) cinematicEvents, "cinematicEvents", null); - oc.write(index, "index", 0); - } - - public void read(JmeImporter im) throws IOException { - InputCapsule ic = im.getCapsule(this); - cinematicEvents = ic.readSavableArrayList("cinematicEvents", null); - index=ic.readInt("index", 0); - } - - public int getIndex() { - return index; - } - - public void setIndex(int index) { - this.index = index; - } - - -} +/* + * Copyright (c) 2009-2012 jMonkeyEngine + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'jMonkeyEngine' nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package com.jme3.cinematic; + +import com.jme3.cinematic.events.CinematicEvent; +import com.jme3.export.*; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +/** + * + * @author Nehon + */ +public class KeyFrame implements Savable { + + public KeyFrame(){ + + } + + List cinematicEvents = new ArrayList<>(); + private int index; + + public List getCinematicEvents() { + return cinematicEvents; + } + + public void setCinematicEvents(List cinematicEvents) { + this.cinematicEvents = cinematicEvents; + } + + public List trigger() { + for (CinematicEvent event : cinematicEvents) { + event.play(); + } + return cinematicEvents; + } + + public boolean isEmpty(){ + return cinematicEvents.isEmpty(); + } + + public void write(JmeExporter ex) throws IOException { + OutputCapsule oc = ex.getCapsule(this); + oc.writeSavableArrayList((ArrayList) cinematicEvents, "cinematicEvents", null); + oc.write(index, "index", 0); + } + + public void read(JmeImporter im) throws IOException { + InputCapsule ic = im.getCapsule(this); + cinematicEvents = ic.readSavableArrayList("cinematicEvents", null); + index=ic.readInt("index", 0); + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + +} diff --git a/jme3-core/src/main/java/com/jme3/cinematic/MotionPath.java b/jme3-core/src/main/java/com/jme3/cinematic/MotionPath.java index 881b07684..4e3a0df89 100644 --- a/jme3-core/src/main/java/com/jme3/cinematic/MotionPath.java +++ b/jme3-core/src/main/java/com/jme3/cinematic/MotionPath.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -202,7 +202,7 @@ public class MotionPath implements Savable { } /** - * Addsa waypoint to the path + * Add a waypoint to the path * @param wayPoint a position in world space */ public void addWayPoint(Vector3f wayPoint) { @@ -210,7 +210,7 @@ public class MotionPath implements Savable { } /** - * retruns the length of the path in world units + * Return the length of the path in world units * @return the length */ public float getLength() { diff --git a/jme3-core/src/main/java/com/jme3/cinematic/MotionPathListener.java b/jme3-core/src/main/java/com/jme3/cinematic/MotionPathListener.java index f441aae5e..abda537e7 100644 --- a/jme3-core/src/main/java/com/jme3/cinematic/MotionPathListener.java +++ b/jme3-core/src/main/java/com/jme3/cinematic/MotionPathListener.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -34,7 +34,7 @@ package com.jme3.cinematic; import com.jme3.cinematic.events.MotionEvent; /** - * Trigger the events happening on an motion path + * Trigger the events happening on a motion path * @author Nehon */ public interface MotionPathListener { diff --git a/jme3-core/src/main/java/com/jme3/cinematic/events/AnimationEvent.java b/jme3-core/src/main/java/com/jme3/cinematic/events/AnimationEvent.java index c77da581d..9616ebca5 100644 --- a/jme3-core/src/main/java/com/jme3/cinematic/events/AnimationEvent.java +++ b/jme3-core/src/main/java/com/jme3/cinematic/events/AnimationEvent.java @@ -31,21 +31,16 @@ */ package com.jme3.cinematic.events; -import com.jme3.animation.AnimChannel; -import com.jme3.animation.AnimControl; -import com.jme3.animation.LoopMode; +import com.jme3.animation.*; import com.jme3.app.Application; import com.jme3.cinematic.Cinematic; import com.jme3.cinematic.PlayState; -import com.jme3.export.InputCapsule; -import com.jme3.export.JmeExporter; -import com.jme3.export.JmeImporter; -import com.jme3.export.OutputCapsule; +import com.jme3.export.*; +import com.jme3.scene.Node; import com.jme3.scene.Spatial; + import java.io.IOException; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; +import java.util.*; import java.util.logging.Logger; /** @@ -57,6 +52,7 @@ import java.util.logging.Logger; * * @author Nehon */ +@Deprecated public class AnimationEvent extends AbstractCinematicEvent { // Version #2: directly keeping track on the model instead of trying to retrieve @@ -80,8 +76,9 @@ public class AnimationEvent extends AbstractCinematicEvent { * constructors */ public AnimationEvent() { + super(); } - + /** * creates an animation event * @@ -90,6 +87,7 @@ public class AnimationEvent extends AbstractCinematicEvent { */ public AnimationEvent(Spatial model, String animationName) { this.model = model; + this.modelName = model.getName(); this.animationName = animationName; initialDuration = model.getControl(AnimControl.class).getAnimationLength(animationName); } @@ -104,6 +102,7 @@ public class AnimationEvent extends AbstractCinematicEvent { public AnimationEvent(Spatial model, String animationName, float initialDuration) { super(initialDuration); this.model = model; + this.modelName = model.getName(); this.animationName = animationName; } @@ -119,6 +118,7 @@ public class AnimationEvent extends AbstractCinematicEvent { super(loopMode); initialDuration = model.getControl(AnimControl.class).getAnimationLength(animationName); this.model = model; + this.modelName = model.getName(); this.animationName = animationName; } @@ -134,6 +134,7 @@ public class AnimationEvent extends AbstractCinematicEvent { public AnimationEvent(Spatial model, String animationName, float initialDuration, LoopMode loopMode) { super(initialDuration, loopMode); this.model = model; + this.modelName = model.getName(); this.animationName = animationName; } @@ -149,6 +150,7 @@ public class AnimationEvent extends AbstractCinematicEvent { public AnimationEvent(Spatial model, String animationName, float initialDuration, float blendTime) { super(initialDuration); this.model = model; + this.modelName = model.getName(); this.animationName = animationName; this.blendTime = blendTime; } @@ -167,6 +169,7 @@ public class AnimationEvent extends AbstractCinematicEvent { super(loopMode); initialDuration = model.getControl(AnimControl.class).getAnimationLength(animationName); this.model = model; + this.modelName = model.getName(); this.animationName = animationName; this.blendTime = blendTime; } @@ -185,6 +188,7 @@ public class AnimationEvent extends AbstractCinematicEvent { public AnimationEvent(Spatial model, String animationName, float initialDuration, LoopMode loopMode, float blendTime) { super(initialDuration, loopMode); this.model = model; + this.modelName = model.getName(); this.animationName = animationName; this.blendTime = blendTime; } @@ -203,6 +207,7 @@ public class AnimationEvent extends AbstractCinematicEvent { super(loopMode); initialDuration = model.getControl(AnimControl.class).getAnimationLength(animationName); this.model = model; + this.modelName = model.getName(); this.animationName = animationName; this.channelIndex = channelIndex; } @@ -217,6 +222,7 @@ public class AnimationEvent extends AbstractCinematicEvent { */ public AnimationEvent(Spatial model, String animationName, int channelIndex) { this.model = model; + this.modelName = model.getName(); this.animationName = animationName; initialDuration = model.getControl(AnimControl.class).getAnimationLength(animationName); this.channelIndex = channelIndex; @@ -233,6 +239,7 @@ public class AnimationEvent extends AbstractCinematicEvent { */ public AnimationEvent(Spatial model, String animationName, LoopMode loopMode, int channelIndex, float blendTime) { this.model = model; + this.modelName = model.getName(); this.animationName = animationName; this.loopMode = loopMode; initialDuration = model.getControl(AnimControl.class).getAnimationLength(animationName); @@ -252,6 +259,7 @@ public class AnimationEvent extends AbstractCinematicEvent { public AnimationEvent(Spatial model, String animationName, float initialDuration, int channelIndex) { super(initialDuration); this.model = model; + this.modelName = model.getName(); this.animationName = animationName; this.channelIndex = channelIndex; } @@ -270,6 +278,7 @@ public class AnimationEvent extends AbstractCinematicEvent { public AnimationEvent(Spatial model, String animationName, float initialDuration, LoopMode loopMode, int channelIndex) { super(initialDuration, loopMode); this.model = model; + this.modelName = model.getName(); this.animationName = animationName; this.channelIndex = channelIndex; } @@ -299,6 +308,18 @@ public class AnimationEvent extends AbstractCinematicEvent { model = cinematic.getScene().getChild(modelName); } if (model != null) { + if(cinematic.getScene() != null){ + Spatial sceneModel = cinematic.getScene().getChild(model.getName()); + if(sceneModel != null){ + Node parent = sceneModel.getParent(); + parent.detachChild(sceneModel); + sceneModel = model; + parent.attachChild(sceneModel); + } else { + cinematic.getScene().attachChild(model); + } + } + channel = model.getControl(AnimControl.class).createChannel(); map.put(channelIndex, channel); } else { @@ -401,6 +422,7 @@ public class AnimationEvent extends AbstractCinematicEvent { OutputCapsule oc = ex.getCapsule(this); oc.write(model, "model", null); + oc.write(modelName, "modelName", null); oc.write(animationName, "animationName", ""); oc.write(blendTime, "blendTime", 0f); oc.write(channelIndex, "channelIndex", 0); @@ -411,9 +433,9 @@ public class AnimationEvent extends AbstractCinematicEvent { public void read(JmeImporter im) throws IOException { super.read(im); InputCapsule ic = im.getCapsule(this); - if (im.getFormatVersion() == 0) { +// if (im.getFormatVersion() == 0) { modelName = ic.readString("modelName", ""); - } +// } //FIXME always the same issue, because of the clonning of assets, this won't work //we have to somehow store userdata in the spatial and then recurse the //scene sub scenegraph to find the correct instance of the model diff --git a/jme3-core/src/main/java/com/jme3/cinematic/events/CameraEvent.java b/jme3-core/src/main/java/com/jme3/cinematic/events/CameraEvent.java new file mode 100644 index 000000000..80d677e3c --- /dev/null +++ b/jme3-core/src/main/java/com/jme3/cinematic/events/CameraEvent.java @@ -0,0 +1,146 @@ +/* + * Copyright (c) 2009-2017 jMonkeyEngine + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'jMonkeyEngine' nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package com.jme3.cinematic.events; + +import com.jme3.app.Application; +import com.jme3.cinematic.Cinematic; +import com.jme3.cinematic.TimeLine; +import com.jme3.export.InputCapsule; +import com.jme3.export.JmeExporter; +import com.jme3.export.JmeImporter; +import com.jme3.export.OutputCapsule; +import com.jme3.export.Savable; +import com.jme3.scene.CameraNode; +import java.io.IOException; +import java.util.Map; + +/** + * + * @author Rickard + */ +public class CameraEvent extends AbstractCinematicEvent{ + + private String cameraName; + private Cinematic cinematic; + + public String getCameraName() { + return cameraName; + } + + public void setCameraName(String cameraName) { + this.cameraName = cameraName; + } + + public CameraEvent(){ + + } + + public CameraEvent(Cinematic parentEvent, String cameraName){ + this.cinematic = parentEvent; + this.cameraName = cameraName; + } + + @Override + public void initEvent(Application app, Cinematic cinematic) { + super.initEvent(app, cinematic); + this.cinematic = cinematic; + } + + @Override + public void play() { + super.play(); + stop(); + } + + @Override + public void onPlay() { + cinematic.setActiveCamera(cameraName); + } + + @Override + public void onUpdate(float tpf) { + } + + @Override + public void onStop() { + } + + @Override + public void onPause() { + } + + @Override + public void forceStop() { + } + + @Override + public void setTime(float time) { + play(); + } + + public Cinematic getCinematic() { + return cinematic; + } + + public void setCinematic(Cinematic cinematic) { + this.cinematic = cinematic; + } + + + + /** + * used internally for serialization + * + * @param ex + * @throws IOException + */ + @Override + public void write(JmeExporter ex) throws IOException { + super.write(ex); + OutputCapsule oc = ex.getCapsule(this); + oc.write(cameraName, "cameraName", null); + + } + + /** + * used internally for serialization + * + * @param im + * @throws IOException + */ + @Override + public void read(JmeImporter im) throws IOException { + super.read(im); + InputCapsule ic = im.getCapsule(this); + cameraName = ic.readString("cameraName", null); + } +} diff --git a/jme3-core/src/main/java/com/jme3/cinematic/events/MotionEvent.java b/jme3-core/src/main/java/com/jme3/cinematic/events/MotionEvent.java index b94bd25d7..60cb5c09e 100644 --- a/jme3-core/src/main/java/com/jme3/cinematic/events/MotionEvent.java +++ b/jme3-core/src/main/java/com/jme3/cinematic/events/MotionEvent.java @@ -1,491 +1,478 @@ -/* - * Copyright (c) 2009-2016 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package com.jme3.cinematic.events; - -import com.jme3.animation.AnimationUtils; -import com.jme3.animation.LoopMode; -import com.jme3.app.Application; -import com.jme3.cinematic.Cinematic; -import com.jme3.cinematic.MotionPath; -import com.jme3.cinematic.PlayState; -import com.jme3.export.InputCapsule; -import com.jme3.export.JmeExporter; -import com.jme3.export.JmeImporter; -import com.jme3.export.OutputCapsule; -import com.jme3.math.Quaternion; -import com.jme3.math.Vector3f; -import com.jme3.renderer.RenderManager; -import com.jme3.renderer.ViewPort; -import com.jme3.scene.Spatial; -import com.jme3.scene.control.Control; -import com.jme3.util.clone.Cloner; -import com.jme3.util.clone.JmeCloneable; -import java.io.IOException; - -/** - * A MotionEvent is a control over the spatial that manages the position and direction of the spatial while following a motion Path. - * - * You must first create a MotionPath and then create a MotionEvent to associate a spatial and the path. - * - * @author Nehon - */ -public class MotionEvent extends AbstractCinematicEvent implements Control, JmeCloneable { - - protected Spatial spatial; - protected int currentWayPoint; - protected float currentValue; - protected Vector3f direction = new Vector3f(); - protected Vector3f lookAt = null; - protected Vector3f upVector = Vector3f.UNIT_Y; - protected Quaternion rotation = null; - protected Direction directionType = Direction.None; - protected MotionPath path; - private boolean isControl = true; - private int travelDirection = 1; - /** - * the distance traveled by the spatial on the path - */ - protected float traveledDistance = 0; - - /** - * Enum for the different type of target direction behavior. - */ - public enum Direction { - - /** - * The target stays in the starting direction. - */ - None, - /** - * The target rotates with the direction of the path. - */ - Path, - /** - * The target rotates with the direction of the path but with the addition of a rotation. - * You need to use the setRotation method when using this Direction. - */ - PathAndRotation, - /** - * The target rotates with the given rotation. - */ - Rotation, - /** - * The target looks at a point. - * You need to use the setLookAt method when using this direction. - */ - LookAt - } - - /** - * Create MotionEvent, - * when using this constructor don't forget to assign spatial and path. - */ - public MotionEvent() { - super(); - } - - /** - * Creates a MotionPath for the given spatial on the given motion path. - * @param spatial - * @param path - */ - public MotionEvent(Spatial spatial, MotionPath path) { - super(); - spatial.addControl(this); - this.path = path; - } - - /** - * Creates a MotionPath for the given spatial on the given motion path. - * @param spatial - * @param path - */ - public MotionEvent(Spatial spatial, MotionPath path, float initialDuration) { - super(initialDuration); - spatial.addControl(this); - this.path = path; - } - - /** - * Creates a MotionPath for the given spatial on the given motion path. - * @param spatial - * @param path - */ - public MotionEvent(Spatial spatial, MotionPath path, LoopMode loopMode) { - super(); - spatial.addControl(this); - this.path = path; - this.loopMode = loopMode; - } - - /** - * Creates a MotionPath for the given spatial on the given motion path. - * @param spatial - * @param path - */ - public MotionEvent(Spatial spatial, MotionPath path, float initialDuration, LoopMode loopMode) { - super(initialDuration); - spatial.addControl(this); - this.path = path; - this.loopMode = loopMode; - } - - public void update(float tpf) { - if (isControl) { - internalUpdate(tpf); - } - } - - @Override - public void internalUpdate(float tpf) { - if (playState == PlayState.Playing) { - time = time + (tpf * speed); - if (loopMode == LoopMode.Loop && time < 0) { - time = initialDuration; - } - if ((time >= initialDuration || time < 0) && loopMode == LoopMode.DontLoop) { - if (time >= initialDuration) { - path.triggerWayPointReach(path.getNbWayPoints() - 1, this); - } - stop(); - } else { - time = AnimationUtils.clampWrapTime(time, initialDuration, loopMode); - if(time<0){ - speed = - speed; - time = - time; - } - onUpdate(tpf); - } - } - } - - @Override - public void initEvent(Application app, Cinematic cinematic) { - super.initEvent(app, cinematic); - isControl = false; - } - - @Override - public void setTime(float time) { - super.setTime(time); - onUpdate(0); - } - - public void onUpdate(float tpf) { - traveledDistance = path.interpolatePath(time, this, tpf); - computeTargetDirection(); - } - - @Override - public void write(JmeExporter ex) throws IOException { - super.write(ex); - OutputCapsule oc = ex.getCapsule(this); - oc.write(lookAt, "lookAt", null); - oc.write(upVector, "upVector", Vector3f.UNIT_Y); - oc.write(rotation, "rotation", null); - oc.write(directionType, "directionType", Direction.None); - oc.write(path, "path", null); - oc.write(spatial, "spatial", null); - } - - @Override - public void read(JmeImporter im) throws IOException { - super.read(im); - InputCapsule in = im.getCapsule(this); - lookAt = (Vector3f) in.readSavable("lookAt", null); - upVector = (Vector3f) in.readSavable("upVector", Vector3f.UNIT_Y); - rotation = (Quaternion) in.readSavable("rotation", null); - directionType = in.readEnum("directionType", Direction.class, Direction.None); - path = (MotionPath) in.readSavable("path", null); - spatial = (Spatial) in.readSavable("spatial", null); - } - - /** - * This method is meant to be called by the motion path only. - * @return - */ - public boolean needsDirection() { - return directionType == Direction.Path || directionType == Direction.PathAndRotation; - } - - private void computeTargetDirection() { - switch (directionType) { - case Path: - Quaternion q = new Quaternion(); - q.lookAt(direction, upVector); - spatial.setLocalRotation(q); - break; - case LookAt: - if (lookAt != null) { - spatial.lookAt(lookAt, upVector); - } - break; - case PathAndRotation: - if (rotation != null) { - Quaternion q2 = new Quaternion(); - q2.lookAt(direction, upVector); - q2.multLocal(rotation); - spatial.setLocalRotation(q2); - } - break; - case Rotation: - if (rotation != null) { - spatial.setLocalRotation(rotation); - } - break; - case None: - break; - default: - break; - } - } - - /** - * Clone this control for the given spatial. - * @param spatial - * @return - */ - @Override - public Control cloneForSpatial(Spatial spatial) { - MotionEvent control = new MotionEvent(); - control.setPath(path); - control.playState = playState; - control.currentWayPoint = currentWayPoint; - control.currentValue = currentValue; - control.direction = direction.clone(); - control.lookAt = lookAt; - control.upVector = upVector.clone(); - control.rotation = rotation; - control.initialDuration = initialDuration; - control.speed = speed; - control.loopMode = loopMode; - control.directionType = directionType; - - return control; - } - - @Override - public Object jmeClone() { - MotionEvent control = new MotionEvent(); - control.path = path; - control.playState = playState; - control.currentWayPoint = currentWayPoint; - control.currentValue = currentValue; - control.direction = direction.clone(); - control.lookAt = lookAt; - control.upVector = upVector.clone(); - control.rotation = rotation; - control.initialDuration = initialDuration; - control.speed = speed; - control.loopMode = loopMode; - control.directionType = directionType; - control.spatial = spatial; - - return control; - } - - @Override - public void cloneFields( Cloner cloner, Object original ) { - this.spatial = cloner.clone(spatial); - } - - @Override - public void onPlay() { - traveledDistance = 0; - } - - @Override - public void onStop() { - currentWayPoint = 0; - } - - @Override - public void onPause() { - } - - /** - * This method is meant to be called by the motion path only. - * @return - */ - public float getCurrentValue() { - return currentValue; - } - - /** - * This method is meant to be called by the motion path only. - * - */ - public void setCurrentValue(float currentValue) { - this.currentValue = currentValue; - } - - /** - * This method is meant to be called by the motion path only. - * @return - */ - public int getCurrentWayPoint() { - return currentWayPoint; - } - - /** - * This method is meant to be called by the motion path only. - * - */ - public void setCurrentWayPoint(int currentWayPoint) { - this.currentWayPoint = currentWayPoint; - } - - /** - * Returns the direction the spatial is moving. - * @return - */ - public Vector3f getDirection() { - return direction; - } - - /** - * Sets the direction of the spatial, using the Y axis as the up vector. - * Use MotionEvent#setDirection((Vector3f direction,Vector3f upVector) if - * you want a custum up vector. - * This method is used by the motion path. - * @param direction - */ - public void setDirection(Vector3f direction) { - setDirection(direction, Vector3f.UNIT_Y); - } - - /** - * Sets the direction of the spatial with the given up vector. - * This method is used by the motion path. - * @param direction - * @param upVector the up vector to consider for this direction. - */ - public void setDirection(Vector3f direction,Vector3f upVector) { - this.direction.set(direction); - this.upVector.set(upVector); - } - - /** - * Returns the direction type of the target. - * @return the direction type. - */ - public Direction getDirectionType() { - return directionType; - } - - /** - * Sets the direction type of the target. - * On each update the direction given to the target can have different behavior. - * See the Direction Enum for explanations. - * @param directionType the direction type. - */ - public void setDirectionType(Direction directionType) { - this.directionType = directionType; - } - - /** - * Set the lookAt for the target. - * This can be used only if direction Type is Direction.LookAt. - * @param lookAt the position to look at. - * @param upVector the up vector. - */ - public void setLookAt(Vector3f lookAt, Vector3f upVector) { - this.lookAt = lookAt; - this.upVector = upVector; - } - - /** - * Returns the rotation of the target. - * @return the rotation quaternion. - */ - public Quaternion getRotation() { - return rotation; - } - - /** - * Sets the rotation of the target. - * This can be used only if direction Type is Direction.PathAndRotation or Direction.Rotation. - * With PathAndRotation the target will face the direction of the path multiplied by the given Quaternion. - * With Rotation the rotation of the target will be set with the given Quaternion. - * @param rotation the rotation quaternion. - */ - public void setRotation(Quaternion rotation) { - this.rotation = rotation; - } - - /** - * Return the motion path this control follows. - * @return - */ - public MotionPath getPath() { - return path; - } - - /** - * Sets the motion path to follow. - * @param path - */ - public void setPath(MotionPath path) { - this.path = path; - } - - public void setEnabled(boolean enabled) { - if (enabled) { - play(); - } else { - pause(); - } - } - - public boolean isEnabled() { - return playState != PlayState.Stopped; - } - - public void render(RenderManager rm, ViewPort vp) { - } - - public void setSpatial(Spatial spatial) { - this.spatial = spatial; - } - - public Spatial getSpatial() { - return spatial; - } - - /** - * Return the distance traveled by the spatial on the path. - * @return - */ - public float getTraveledDistance() { - return traveledDistance; - } -} +/* + * Copyright (c) 2009-2018 jMonkeyEngine + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'jMonkeyEngine' nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package com.jme3.cinematic.events; + +import com.jme3.animation.AnimationUtils; +import com.jme3.animation.LoopMode; +import com.jme3.app.Application; +import com.jme3.cinematic.Cinematic; +import com.jme3.cinematic.MotionPath; +import com.jme3.cinematic.PlayState; +import com.jme3.export.InputCapsule; +import com.jme3.export.JmeExporter; +import com.jme3.export.JmeImporter; +import com.jme3.export.OutputCapsule; +import com.jme3.math.Quaternion; +import com.jme3.math.Vector3f; +import com.jme3.renderer.RenderManager; +import com.jme3.renderer.ViewPort; +import com.jme3.scene.Spatial; +import com.jme3.scene.control.Control; +import com.jme3.util.clone.Cloner; +import com.jme3.util.clone.JmeCloneable; +import java.io.IOException; + +/** + * A MotionEvent is a control over the spatial that manages the position and direction of the spatial while following a motion Path. + * + * You must first create a MotionPath and then create a MotionEvent to associate a spatial and the path. + * + * @author Nehon + */ +public class MotionEvent extends AbstractCinematicEvent implements Control, JmeCloneable { + + protected Spatial spatial; + protected int currentWayPoint; + protected float currentValue; + protected Vector3f direction = new Vector3f(); + protected Vector3f lookAt = null; + protected Vector3f upVector = Vector3f.UNIT_Y; + protected Quaternion rotation = null; + protected Direction directionType = Direction.None; + protected MotionPath path; + private boolean isControl = true; + private int travelDirection = 1; + /** + * the distance traveled by the spatial on the path + */ + protected float traveledDistance = 0; + + /** + * Enum for the different type of target direction behavior. + */ + public enum Direction { + + /** + * The target stays in the starting direction. + */ + None, + /** + * The target rotates with the direction of the path. + */ + Path, + /** + * The target rotates with the direction of the path but with the addition of a rotation. + * You need to use the setRotation method when using this Direction. + */ + PathAndRotation, + /** + * The target rotates with the given rotation. + */ + Rotation, + /** + * The target looks at a point. + * You need to use the setLookAt method when using this direction. + */ + LookAt + } + + /** + * Create MotionEvent, + * when using this constructor don't forget to assign spatial and path. + */ + public MotionEvent() { + super(); + } + + /** + * Creates a MotionPath for the given spatial on the given motion path. + * @param spatial + * @param path + */ + public MotionEvent(Spatial spatial, MotionPath path) { + super(); + spatial.addControl(this); + this.path = path; + } + + /** + * Creates a MotionPath for the given spatial on the given motion path. + * @param spatial + * @param path + */ + public MotionEvent(Spatial spatial, MotionPath path, float initialDuration) { + super(initialDuration); + spatial.addControl(this); + this.path = path; + } + + /** + * Creates a MotionPath for the given spatial on the given motion path. + * @param spatial + * @param path + */ + public MotionEvent(Spatial spatial, MotionPath path, LoopMode loopMode) { + super(); + spatial.addControl(this); + this.path = path; + this.loopMode = loopMode; + } + + /** + * Creates a MotionPath for the given spatial on the given motion path. + * @param spatial + * @param path + */ + public MotionEvent(Spatial spatial, MotionPath path, float initialDuration, LoopMode loopMode) { + super(initialDuration); + spatial.addControl(this); + this.path = path; + this.loopMode = loopMode; + } + + public void update(float tpf) { + if (isControl) { + internalUpdate(tpf); + } + } + + @Override + public void internalUpdate(float tpf) { + if (playState == PlayState.Playing) { + time = time + (tpf * speed); + if (loopMode == LoopMode.Loop && time < 0) { + time = initialDuration; + } + if ((time >= initialDuration || time < 0) && loopMode == LoopMode.DontLoop) { + if (time >= initialDuration) { + path.triggerWayPointReach(path.getNbWayPoints() - 1, this); + } + stop(); + } else { + time = AnimationUtils.clampWrapTime(time, initialDuration, loopMode); + if(time<0){ + speed = - speed; + time = - time; + } + onUpdate(tpf); + } + } + } + + @Override + public void initEvent(Application app, Cinematic cinematic) { + super.initEvent(app, cinematic); + isControl = false; + } + + @Override + public void setTime(float time) { + super.setTime(time); + onUpdate(0); + } + + public void onUpdate(float tpf) { + traveledDistance = path.interpolatePath(time, this, tpf); + computeTargetDirection(); + } + + @Override + public void write(JmeExporter ex) throws IOException { + super.write(ex); + OutputCapsule oc = ex.getCapsule(this); + oc.write(lookAt, "lookAt", null); + oc.write(upVector, "upVector", Vector3f.UNIT_Y); + oc.write(rotation, "rotation", null); + oc.write(directionType, "directionType", Direction.None); + oc.write(path, "path", null); + oc.write(spatial, "spatial", null); + } + + @Override + public void read(JmeImporter im) throws IOException { + super.read(im); + InputCapsule in = im.getCapsule(this); + lookAt = (Vector3f) in.readSavable("lookAt", null); + upVector = (Vector3f) in.readSavable("upVector", Vector3f.UNIT_Y); + rotation = (Quaternion) in.readSavable("rotation", null); + directionType = in.readEnum("directionType", Direction.class, Direction.None); + path = (MotionPath) in.readSavable("path", null); + spatial = (Spatial) in.readSavable("spatial", null); + } + + /** + * This method is meant to be called by the motion path only. + * @return + */ + public boolean needsDirection() { + return directionType == Direction.Path || directionType == Direction.PathAndRotation; + } + + private void computeTargetDirection() { + switch (directionType) { + case Path: + Quaternion q = new Quaternion(); + q.lookAt(direction, upVector); + spatial.setLocalRotation(q); + break; + case LookAt: + if (lookAt != null) { + spatial.lookAt(lookAt, upVector); + } + break; + case PathAndRotation: + if (rotation != null) { + Quaternion q2 = new Quaternion(); + q2.lookAt(direction, upVector); + q2.multLocal(rotation); + spatial.setLocalRotation(q2); + } + break; + case Rotation: + if (rotation != null) { + spatial.setLocalRotation(rotation); + } + break; + case None: + break; + default: + break; + } + } + + /** + * Clone this control for the given spatial. + * @param spatial + * @return + */ + @Deprecated + @Override + public Control cloneForSpatial(Spatial spatial) { + throw new UnsupportedOperationException(); + } + + @Override + public Object jmeClone() { + MotionEvent control = new MotionEvent(); + control.path = path; + control.playState = playState; + control.currentWayPoint = currentWayPoint; + control.currentValue = currentValue; + control.direction = direction.clone(); + control.lookAt = lookAt; + control.upVector = upVector.clone(); + control.rotation = rotation; + control.initialDuration = initialDuration; + control.speed = speed; + control.loopMode = loopMode; + control.directionType = directionType; + control.spatial = spatial; + + return control; + } + + @Override + public void cloneFields( Cloner cloner, Object original ) { + this.spatial = cloner.clone(spatial); + } + + @Override + public void onPlay() { + traveledDistance = 0; + } + + @Override + public void onStop() { + currentWayPoint = 0; + } + + @Override + public void onPause() { + } + + /** + * This method is meant to be called by the motion path only. + * @return + */ + public float getCurrentValue() { + return currentValue; + } + + /** + * This method is meant to be called by the motion path only. + * + */ + public void setCurrentValue(float currentValue) { + this.currentValue = currentValue; + } + + /** + * This method is meant to be called by the motion path only. + * @return + */ + public int getCurrentWayPoint() { + return currentWayPoint; + } + + /** + * This method is meant to be called by the motion path only. + * + */ + public void setCurrentWayPoint(int currentWayPoint) { + this.currentWayPoint = currentWayPoint; + } + + /** + * Returns the direction the spatial is moving. + * @return + */ + public Vector3f getDirection() { + return direction; + } + + /** + * Sets the direction of the spatial, using the Y axis as the up vector. + * Use MotionEvent#setDirection((Vector3f direction,Vector3f upVector) if + * you want a custum up vector. + * This method is used by the motion path. + * @param direction + */ + public void setDirection(Vector3f direction) { + setDirection(direction, Vector3f.UNIT_Y); + } + + /** + * Sets the direction of the spatial with the given up vector. + * This method is used by the motion path. + * @param direction + * @param upVector the up vector to consider for this direction. + */ + public void setDirection(Vector3f direction,Vector3f upVector) { + this.direction.set(direction); + this.upVector.set(upVector); + } + + /** + * Returns the direction type of the target. + * @return the direction type. + */ + public Direction getDirectionType() { + return directionType; + } + + /** + * Sets the direction type of the target. + * On each update the direction given to the target can have different behavior. + * See the Direction Enum for explanations. + * @param directionType the direction type. + */ + public void setDirectionType(Direction directionType) { + this.directionType = directionType; + } + + /** + * Set the lookAt for the target. + * This can be used only if direction Type is Direction.LookAt. + * @param lookAt the position to look at. + * @param upVector the up vector. + */ + public void setLookAt(Vector3f lookAt, Vector3f upVector) { + this.lookAt = lookAt; + this.upVector = upVector; + } + + /** + * Returns the rotation of the target. + * @return the rotation quaternion. + */ + public Quaternion getRotation() { + return rotation; + } + + /** + * Sets the rotation of the target. + * This can be used only if direction Type is Direction.PathAndRotation or Direction.Rotation. + * With PathAndRotation the target will face the direction of the path multiplied by the given Quaternion. + * With Rotation the rotation of the target will be set with the given Quaternion. + * @param rotation the rotation quaternion. + */ + public void setRotation(Quaternion rotation) { + this.rotation = rotation; + } + + /** + * Return the motion path this control follows. + * @return + */ + public MotionPath getPath() { + return path; + } + + /** + * Sets the motion path to follow. + * @param path + */ + public void setPath(MotionPath path) { + this.path = path; + } + + public void setEnabled(boolean enabled) { + if (enabled) { + play(); + } else { + pause(); + } + } + + public boolean isEnabled() { + return playState != PlayState.Stopped; + } + + public void render(RenderManager rm, ViewPort vp) { + } + + public void setSpatial(Spatial spatial) { + this.spatial = spatial; + } + + public Spatial getSpatial() { + return spatial; + } + + /** + * Return the distance traveled by the spatial on the path. + * @return + */ + public float getTraveledDistance() { + return traveledDistance; + } +} diff --git a/jme3-core/src/main/java/com/jme3/cinematic/events/SoundEvent.java b/jme3-core/src/main/java/com/jme3/cinematic/events/SoundEvent.java index 02c3ae754..6de7e21f6 100644 --- a/jme3-core/src/main/java/com/jme3/cinematic/events/SoundEvent.java +++ b/jme3-core/src/main/java/com/jme3/cinematic/events/SoundEvent.java @@ -1,229 +1,230 @@ -/* - * Copyright (c) 2009-2012 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package com.jme3.cinematic.events; - -import com.jme3.animation.LoopMode; -import com.jme3.app.Application; -import com.jme3.audio.AudioNode; -import com.jme3.audio.AudioSource; -import com.jme3.cinematic.Cinematic; -import com.jme3.export.InputCapsule; -import com.jme3.export.JmeExporter; -import com.jme3.export.JmeImporter; -import com.jme3.export.OutputCapsule; -import java.io.IOException; - -/** - * A sound track to be played in a cinematic. - * @author Nehon - */ -public class SoundEvent extends AbstractCinematicEvent { - - protected String path; - protected AudioNode audioNode; - protected boolean stream = false; - - /** - * creates a sound track from the given resource path - * @param path the path to an audio file (ie : "Sounds/mySound.wav") - */ - public SoundEvent(String path) { - this.path = path; - } - - /** - * creates a sound track from the given resource path - * @param path the path to an audio file (ie : "Sounds/mySound.wav") - * @param stream true to make the audio data streamed - */ - public SoundEvent(String path, boolean stream) { - this(path); - this.stream = stream; - } - - /** - * creates a sound track from the given resource path - * @param path the path to an audio file (ie : "Sounds/mySound.wav") - * @param stream true to make the audio data streamed - * @param initialDuration the initial duration of the event - */ - public SoundEvent(String path, boolean stream, float initialDuration) { - super(initialDuration); - this.path = path; - this.stream = stream; - } - - /** - * creates a sound track from the given resource path - * @param path the path to an audio file (ie : "Sounds/mySound.wav") - * @param stream true to make the audio data streamed - * @param loopMode the loopMode - * @see LoopMode - */ - public SoundEvent(String path, boolean stream, LoopMode loopMode) { - super(loopMode); - this.path = path; - this.stream = stream; - } - - /** - * creates a sound track from the given resource path - * @param path the path to an audio file (ie : "Sounds/mySound.wav") - * @param stream true to make the audio data streamed - * @param initialDuration the initial duration of the event - * @param loopMode the loopMode - * @see LoopMode - */ - public SoundEvent(String path, boolean stream, float initialDuration, LoopMode loopMode) { - super(initialDuration, loopMode); - this.path = path; - this.stream = stream; - } - - /** - * creates a sound track from the given resource path - * @param path the path to an audio file (ie : "Sounds/mySound.wav") - * @param initialDuration the initial duration of the event - */ - public SoundEvent(String path, float initialDuration) { - super(initialDuration); - this.path = path; - } - - /** - * creates a sound track from the given resource path - * @param path the path to an audio file (ie : "Sounds/mySound.wav") - * @param loopMode the loopMode - * @see LoopMode - */ - public SoundEvent(String path, LoopMode loopMode) { - super(loopMode); - this.path = path; - } - - /** - * creates a sound track from the given resource path - * @param path the path to an audio file (ie : "Sounds/mySound.wav") - * @param initialDuration the initial duration of the event - * @param loopMode the loopMode - * @see LoopMode - */ - public SoundEvent(String path, float initialDuration, LoopMode loopMode) { - super(initialDuration, loopMode); - this.path = path; - } - - /** - * creates a sound event - * used for serialization - */ - public SoundEvent() { - } - - @Override - public void initEvent(Application app, Cinematic cinematic) { - super.initEvent(app, cinematic); - audioNode = new AudioNode(app.getAssetManager(), path, stream); - audioNode.setPositional(false); - setLoopMode(loopMode); - } - - @Override - public void setTime(float time) { - super.setTime(time); - //can occur on rewind - if (time < 0f) { - stop(); - }else{ - audioNode.setTimeOffset(time); - } - } - - @Override - public void onPlay() { - audioNode.play(); - } - - @Override - public void onStop() { - audioNode.stop(); - - } - - @Override - public void onPause() { - audioNode.pause(); - } - - @Override - public void onUpdate(float tpf) { - if (audioNode.getStatus() == AudioSource.Status.Stopped) { - stop(); - } - } - - /** - * Returns the underlying audio node of this sound track - * @return - */ - public AudioNode getAudioNode() { - return audioNode; - } - - @Override - public void setLoopMode(LoopMode loopMode) { - super.setLoopMode(loopMode); - - if (loopMode != LoopMode.DontLoop) { - audioNode.setLooping(true); - } else { - audioNode.setLooping(false); - } - } - - @Override - public void write(JmeExporter ex) throws IOException { - super.write(ex); - OutputCapsule oc = ex.getCapsule(this); - oc.write(path, "path", ""); - oc.write(stream, "stream", false); - } - - @Override - public void read(JmeImporter im) throws IOException { - super.read(im); - InputCapsule ic = im.getCapsule(this); - path = ic.readString("path", ""); - stream = ic.readBoolean("stream", false); - - } -} +/* + * Copyright (c) 2009-2012 jMonkeyEngine + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'jMonkeyEngine' nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package com.jme3.cinematic.events; + +import com.jme3.animation.LoopMode; +import com.jme3.app.Application; +import com.jme3.audio.AudioNode; +import com.jme3.audio.AudioSource; +import com.jme3.cinematic.Cinematic; +import com.jme3.export.InputCapsule; +import com.jme3.export.JmeExporter; +import com.jme3.export.JmeImporter; +import com.jme3.export.OutputCapsule; +import java.io.IOException; + +/** + * A sound track to be played in a cinematic. + * @author Nehon + */ +public class SoundEvent extends AbstractCinematicEvent { + + protected String path; + protected AudioNode audioNode; + protected boolean stream = false; + + /** + * creates a sound track from the given resource path + * @param path the path to an audio file (ie : "Sounds/mySound.wav") + */ + public SoundEvent(String path) { + this.path = path; + } + + /** + * creates a sound track from the given resource path + * @param path the path to an audio file (ie : "Sounds/mySound.wav") + * @param stream true to make the audio data streamed + */ + public SoundEvent(String path, boolean stream) { + this(path); + this.stream = stream; + } + + /** + * creates a sound track from the given resource path + * @param path the path to an audio file (ie : "Sounds/mySound.wav") + * @param stream true to make the audio data streamed + * @param initialDuration the initial duration of the event + */ + public SoundEvent(String path, boolean stream, float initialDuration) { + super(initialDuration); + this.path = path; + this.stream = stream; + } + + /** + * creates a sound track from the given resource path + * @param path the path to an audio file (ie : "Sounds/mySound.wav") + * @param stream true to make the audio data streamed + * @param loopMode the loopMode + * @see LoopMode + */ + public SoundEvent(String path, boolean stream, LoopMode loopMode) { + super(loopMode); + this.path = path; + this.stream = stream; + } + + /** + * creates a sound track from the given resource path + * @param path the path to an audio file (ie : "Sounds/mySound.wav") + * @param stream true to make the audio data streamed + * @param initialDuration the initial duration of the event + * @param loopMode the loopMode + * @see LoopMode + */ + public SoundEvent(String path, boolean stream, float initialDuration, LoopMode loopMode) { + super(initialDuration, loopMode); + this.path = path; + this.stream = stream; + } + + /** + * creates a sound track from the given resource path + * @param path the path to an audio file (ie : "Sounds/mySound.wav") + * @param initialDuration the initial duration of the event + */ + public SoundEvent(String path, float initialDuration) { + super(initialDuration); + this.path = path; + } + + /** + * creates a sound track from the given resource path + * @param path the path to an audio file (ie : "Sounds/mySound.wav") + * @param loopMode the loopMode + * @see LoopMode + */ + public SoundEvent(String path, LoopMode loopMode) { + super(loopMode); + this.path = path; + } + + /** + * creates a sound track from the given resource path + * @param path the path to an audio file (ie : "Sounds/mySound.wav") + * @param initialDuration the initial duration of the event + * @param loopMode the loopMode + * @see LoopMode + */ + public SoundEvent(String path, float initialDuration, LoopMode loopMode) { + super(initialDuration, loopMode); + this.path = path; + } + + /** + * creates a sound event + * used for serialization + */ + public SoundEvent() { + super(); + } + + @Override + public void initEvent(Application app, Cinematic cinematic) { + super.initEvent(app, cinematic); + audioNode = new AudioNode(app.getAssetManager(), path, stream); + audioNode.setPositional(false); + setLoopMode(loopMode); + } + + @Override + public void setTime(float time) { + super.setTime(time); + //can occur on rewind + if (time < 0f) { + stop(); + }else{ + audioNode.setTimeOffset(time); + } + } + + @Override + public void onPlay() { + audioNode.play(); + } + + @Override + public void onStop() { + audioNode.stop(); + + } + + @Override + public void onPause() { + audioNode.pause(); + } + + @Override + public void onUpdate(float tpf) { + if (audioNode.getStatus() == AudioSource.Status.Stopped) { + stop(); + } + } + + /** + * Returns the underlying audio node of this sound track + * @return + */ + public AudioNode getAudioNode() { + return audioNode; + } + + @Override + public void setLoopMode(LoopMode loopMode) { + super.setLoopMode(loopMode); + + if (loopMode != LoopMode.DontLoop) { + audioNode.setLooping(true); + } else { + audioNode.setLooping(false); + } + } + + @Override + public void write(JmeExporter ex) throws IOException { + super.write(ex); + OutputCapsule oc = ex.getCapsule(this); + oc.write(path, "path", ""); + oc.write(stream, "stream", false); + } + + @Override + public void read(JmeImporter im) throws IOException { + super.read(im); + InputCapsule ic = im.getCapsule(this); + path = ic.readString("path", ""); + stream = ic.readBoolean("stream", false); + + } +} diff --git a/jme3-core/src/main/java/com/jme3/collision/SweepSphere.java b/jme3-core/src/main/java/com/jme3/collision/SweepSphere.java index de26c8e99..75470dcb5 100644 --- a/jme3-core/src/main/java/com/jme3/collision/SweepSphere.java +++ b/jme3-core/src/main/java/com/jme3/collision/SweepSphere.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -217,7 +217,7 @@ class SweepSphere implements Collidable { float signedDistanceToPlane = triPlane.pseudoDistance(sCenter); if (normalDotVelocity == 0.0f){ - // we are travelling exactly parrallel to the plane + // we are travelling exactly parallel to the plane if (FastMath.abs(signedDistanceToPlane) >= 1.0f){ // no collision possible return null; diff --git a/jme3-core/src/main/java/com/jme3/effect/ParticleEmitter.java b/jme3-core/src/main/java/com/jme3/effect/ParticleEmitter.java index 83d28b2bd..ba0c0282d 100644 --- a/jme3-core/src/main/java/com/jme3/effect/ParticleEmitter.java +++ b/jme3-core/src/main/java/com/jme3/effect/ParticleEmitter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -121,10 +121,10 @@ public class ParticleEmitter extends Geometry { this.parentEmitter = parentEmitter; } + @Deprecated @Override public Control cloneForSpatial(Spatial spatial) { - return this; // WARNING: Sets wrong control on spatial. Will be - // fixed automatically by ParticleEmitter.clone() method. + throw new UnsupportedOperationException(); } @Override @@ -384,7 +384,7 @@ public class ParticleEmitter extends Geometry { * Set to true if particles should spawn in world space. * *

If set to true and the particle emitter is moved in the scene, - * then particles that have already spawned won't be effected by this + * then particles that have already spawned won't be affected by this * motion. If set to false, the particles will emit in local space * and when the emitter is moved, so are all the particles that * were emitted previously. @@ -846,7 +846,7 @@ public class ParticleEmitter extends Geometry { * @param initialVelocity Set the initial velocity a particle is spawned with, * the initial velocity given in the parameter will be varied according * to the velocity variation set in {@link ParticleEmitter#setVelocityVariation(float) }. - * A particle will move toward its velocity unless it is effected by the + * The particle will move with this velocity unless it is affected by * gravity. * * @deprecated diff --git a/jme3-core/src/main/java/com/jme3/effect/ParticlePointMesh.java b/jme3-core/src/main/java/com/jme3/effect/ParticlePointMesh.java index 3f56e483b..b9c0f43d8 100644 --- a/jme3-core/src/main/java/com/jme3/effect/ParticlePointMesh.java +++ b/jme3-core/src/main/java/com/jme3/effect/ParticlePointMesh.java @@ -144,7 +144,7 @@ public class ParticlePointMesh extends ParticleMesh { colors.putInt(p.color.asIntABGR()); int imgX = p.imageIndex % imagesX; - int imgY = (p.imageIndex - imgX) / imagesY; + int imgY = p.imageIndex/imagesX; float startX = ((float) imgX) / imagesX; float startY = ((float) imgY) / imagesY; diff --git a/jme3-core/src/main/java/com/jme3/effect/ParticleTriMesh.java b/jme3-core/src/main/java/com/jme3/effect/ParticleTriMesh.java index 8002197b0..16b9071d6 100644 --- a/jme3-core/src/main/java/com/jme3/effect/ParticleTriMesh.java +++ b/jme3-core/src/main/java/com/jme3/effect/ParticleTriMesh.java @@ -251,7 +251,7 @@ public class ParticleTriMesh extends ParticleMesh { if (uniqueTexCoords){ int imgX = p.imageIndex % imagesX; - int imgY = (p.imageIndex - imgX) / imagesY; + int imgY = p.imageIndex / imagesX; float startX = ((float) imgX) / imagesX; float startY = ((float) imgY) / imagesY; diff --git a/jme3-core/src/main/java/com/jme3/effect/influencers/ParticleInfluencer.java b/jme3-core/src/main/java/com/jme3/effect/influencers/ParticleInfluencer.java index 4f322df74..797e9c723 100644 --- a/jme3-core/src/main/java/com/jme3/effect/influencers/ParticleInfluencer.java +++ b/jme3-core/src/main/java/com/jme3/effect/influencers/ParticleInfluencer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -64,7 +64,7 @@ public interface ParticleInfluencer extends Savable, Cloneable, JmeCloneable { * Set the initial velocity a particle is spawned with, * the initial velocity given in the parameter will be varied according * to the velocity variation set in {@link ParticleEmitter#setVelocityVariation(float) }. - * A particle will move toward its velocity unless it is effected by the + * The particle will move with this velocity unless it is affected by * gravity. */ void setInitialVelocity(Vector3f initialVelocity); diff --git a/jme3-core/src/main/java/com/jme3/effect/shapes/EmitterMeshConvexHullShape.java b/jme3-core/src/main/java/com/jme3/effect/shapes/EmitterMeshConvexHullShape.java index c4557a3b9..a18c7e1a8 100644 --- a/jme3-core/src/main/java/com/jme3/effect/shapes/EmitterMeshConvexHullShape.java +++ b/jme3-core/src/main/java/com/jme3/effect/shapes/EmitterMeshConvexHullShape.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -37,7 +37,7 @@ import com.jme3.scene.Mesh; import java.util.List; /** - * This emiter shape emits the particles from the given shape's interior constrained by its convex hull + * This emitter shape emits the particles from the given shape's interior constrained by its convex hull * (a geometry that tightly wraps the mesh). So in case of multiple meshes some vertices may appear * in a space between them. * @author Marcin Roguski (Kaelthas) diff --git a/jme3-core/src/main/java/com/jme3/effect/shapes/EmitterMeshFaceShape.java b/jme3-core/src/main/java/com/jme3/effect/shapes/EmitterMeshFaceShape.java index f2cd9ecc7..77bc2852f 100644 --- a/jme3-core/src/main/java/com/jme3/effect/shapes/EmitterMeshFaceShape.java +++ b/jme3-core/src/main/java/com/jme3/effect/shapes/EmitterMeshFaceShape.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -40,7 +40,7 @@ import java.util.ArrayList; import java.util.List; /** - * This emiter shape emits the particles from the given shape's faces. + * This emitter shape emits the particles from the given shape's faces. * @author Marcin Roguski (Kaelthas) */ public class EmitterMeshFaceShape extends EmitterMeshVertexShape { diff --git a/jme3-core/src/main/java/com/jme3/effect/shapes/EmitterMeshVertexShape.java b/jme3-core/src/main/java/com/jme3/effect/shapes/EmitterMeshVertexShape.java index b996e63cb..e6e35d9cf 100644 --- a/jme3-core/src/main/java/com/jme3/effect/shapes/EmitterMeshVertexShape.java +++ b/jme3-core/src/main/java/com/jme3/effect/shapes/EmitterMeshVertexShape.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -50,7 +50,7 @@ import java.util.Map; import java.util.Map.Entry; /** - * This emiter shape emits the particles from the given shape's vertices + * This emitter shape emits the particles from the given shape's vertices * @author Marcin Roguski (Kaelthas) */ public class EmitterMeshVertexShape implements EmitterShape { @@ -74,7 +74,7 @@ public class EmitterMeshVertexShape implements EmitterShape { } /** - * This method sets the meshes that will form the emiter's shape. + * This method sets the meshes that will form the emitter's shape. * @param meshes * a list of meshes that will form the emitter's shape */ diff --git a/jme3-core/src/main/java/com/jme3/effect/shapes/EmitterSphereShape.java b/jme3-core/src/main/java/com/jme3/effect/shapes/EmitterSphereShape.java index 99d76205d..a74eeaf39 100644 --- a/jme3-core/src/main/java/com/jme3/effect/shapes/EmitterSphereShape.java +++ b/jme3-core/src/main/java/com/jme3/effect/shapes/EmitterSphereShape.java @@ -96,10 +96,12 @@ public class EmitterSphereShape implements EmitterShape { @Override public void getRandomPoint(Vector3f store) { do { - store.x = (FastMath.nextRandomFloat() * 2f - 1f) * radius; - store.y = (FastMath.nextRandomFloat() * 2f - 1f) * radius; - store.z = (FastMath.nextRandomFloat() * 2f - 1f) * radius; - } while (store.distance(center) > radius); + store.x = (FastMath.nextRandomFloat() * 2f - 1f); + store.y = (FastMath.nextRandomFloat() * 2f - 1f); + store.z = (FastMath.nextRandomFloat() * 2f - 1f); + } while (store.lengthSquared() > 1); + store.multLocal(radius); + store.addLocal(center); } @Override diff --git a/jme3-core/src/main/java/com/jme3/environment/EnvironmentCamera.java b/jme3-core/src/main/java/com/jme3/environment/EnvironmentCamera.java index aff4dd0b9..a8fa7de37 100644 --- a/jme3-core/src/main/java/com/jme3/environment/EnvironmentCamera.java +++ b/jme3-core/src/main/java/com/jme3/environment/EnvironmentCamera.java @@ -38,14 +38,9 @@ import com.jme3.environment.util.EnvMapUtils; import com.jme3.light.LightProbe; import com.jme3.math.ColorRGBA; import com.jme3.math.Vector3f; -import com.jme3.renderer.Camera; -import com.jme3.renderer.RenderManager; -import com.jme3.renderer.ViewPort; +import com.jme3.renderer.*; import com.jme3.scene.Spatial; -import com.jme3.texture.FrameBuffer; -import com.jme3.texture.Image; -import com.jme3.texture.Texture2D; -import com.jme3.texture.TextureCubeMap; +import com.jme3.texture.*; import com.jme3.texture.image.ColorSpace; import com.jme3.util.BufferUtils; import com.jme3.util.MipMapGenerator; @@ -119,7 +114,7 @@ public class EnvironmentCamera extends BaseAppState { private final List jobs = new ArrayList(); /** - * Creates an EnvironmentCamera with a size of 128 + * Creates an EnvironmentCamera with a size of 256 */ public EnvironmentCamera() { } @@ -322,7 +317,7 @@ public class EnvironmentCamera extends BaseAppState { final Camera offCamera = new Camera(mapSize, mapSize); offCamera.setLocation(worldPos); offCamera.setAxes(axisX, axisY, axisZ); - offCamera.setFrustumPerspective(90f, 1f, 1, 1000); + offCamera.setFrustumPerspective(90f, 1f, 0.1f, 1000); offCamera.setLocation(position); return offCamera; } diff --git a/jme3-core/src/main/java/com/jme3/environment/LightProbeFactory.java b/jme3-core/src/main/java/com/jme3/environment/LightProbeFactory.java index b76629a83..859472fe1 100644 --- a/jme3-core/src/main/java/com/jme3/environment/LightProbeFactory.java +++ b/jme3-core/src/main/java/com/jme3/environment/LightProbeFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2015 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -32,6 +32,7 @@ package com.jme3.environment; import com.jme3.app.Application; +import com.jme3.asset.AssetManager; import com.jme3.environment.generation.*; import com.jme3.environment.util.EnvMapUtils; import com.jme3.light.LightProbe; @@ -47,7 +48,7 @@ import java.util.concurrent.ScheduledThreadPoolExecutor; * Since the process can be long, you can provide a JobProgressListener that * will be notified of the ongoing generation process when calling the makeProbe method. * - * The process is the folowing : + * The process is as follows: * 1. Create an EnvironmentCamera * 2. give it a position in the scene * 3. call {@link LightProbeFactory#makeProbe(com.jme3.environment.EnvironmentCamera, com.jme3.scene.Node)} @@ -61,7 +62,7 @@ import java.util.concurrent.ScheduledThreadPoolExecutor; * This class is entirely thread safe and can be called from any thread. * * Note that in case you are using a {@link JobProgressListener} all the its - * method will be called inside and app.enqueu callable. + * method will be called inside and app.enqueue callable. * This means that it's completely safe to modify the scenegraph within the * Listener method, but also means that the even will be delayed until next update loop. * @@ -73,7 +74,7 @@ public class LightProbeFactory { /** * Creates a LightProbe with the giver EnvironmentCamera in the given scene. * - * Note that this is an assynchronous process that will run on multiple threads. + * Note that this is an asynchronous process that will run on multiple threads. * The process is thread safe. * The created lightProbe will only be marked as ready when the rendering process is done. * @@ -94,7 +95,7 @@ public class LightProbeFactory { /** * Creates a LightProbe with the giver EnvironmentCamera in the given scene. * - * Note that this is an assynchronous process that will run on multiple threads. + * Note that this is an asynchronous process that will run on multiple threads. * The process is thread safe. * The created lightProbe will only be marked as ready when the rendering process is done. * @@ -108,7 +109,7 @@ public class LightProbeFactory { * @param envCam the EnvironmentCamera * @param scene the Scene * @param genType Fast or HighQuality. Fast may be ok for many types of environment, but you may need high quality when an environment map has very high lighting values. - * @param listener the listener of the genration progress. + * @param listener the listener of the generation progress. * @return the created LightProbe */ public static LightProbe makeProbe(final EnvironmentCamera envCam, Spatial scene, final EnvMapUtils.GenerationType genType, final JobProgressListener listener) { @@ -132,7 +133,7 @@ public class LightProbeFactory { /** * Updates a LightProbe with the given EnvironmentCamera in the given scene. *

- * Note that this is an assynchronous process that will run on multiple threads. + * Note that this is an asynchronous process that will run on multiple threads. * The process is thread safe. * The created lightProbe will only be marked as ready when the rendering process is done. *

@@ -143,7 +144,7 @@ public class LightProbeFactory { * @param envCam the EnvironmentCamera * @param scene the Scene * @param genType Fast or HighQuality. Fast may be ok for many types of environment, but you may need high quality when an environment map has very high lighting values. - * @param listener the listener of the genration progress. + * @param listener the listener of the generation progress. * @return the created LightProbe * @see LightProbe * @see EnvironmentCamera @@ -178,10 +179,10 @@ public class LightProbeFactory { /** * Internally called to generate the maps. * This method will spawn 7 thread (one for the Irradiance spherical harmonics generator, and one for each face of the prefiltered env map). - * Those threads will be executed in a ScheduledThreadPoolExecutor that will be shutdown when the genration is done. + * Those threads will be executed in a ScheduledThreadPoolExecutor that will be shutdown when the generation is done. * * @param envMap the raw env map rendered by the env camera - * @param probe the LigthProbe to generate maps for + * @param probe the LightProbe to generate maps for * @param app the Application * @param listener a progress listener. (can be null if no progress reporting is needed) */ @@ -204,6 +205,26 @@ public class LightProbeFactory { } } + /** + * For debuging porpose only + * Will return a Node meant to be added to a GUI presenting the 2 cube maps in a cross pattern with all the mip maps. + * + * @param manager the asset manager + * @return a debug node + */ + public static Node getDebugGui(AssetManager manager, LightProbe probe) { + if (!probe.isReady()) { + throw new UnsupportedOperationException("This EnvProbe is not ready yet, try to test isReady()"); + } + + Node debugNode = new Node("debug gui probe"); + Node debugPfemCm = EnvMapUtils.getCubeMapCrossDebugViewWithMipMaps(probe.getPrefilteredEnvMap(), manager); + debugNode.attachChild(debugPfemCm); + debugPfemCm.setLocalTranslation(520, 0, 0); + + return debugNode; + } + /** * An inner class to keep the state of a generation process */ @@ -237,7 +258,7 @@ public class LightProbeFactory { } /** - * An inner JobProgressListener to controll the genration process and properly clean up when it's done + * An inner JobProgressListener to control the generation process and properly clean up when it's done */ private static class JobListener extends JobProgressAdapter { diff --git a/jme3-core/src/main/java/com/jme3/environment/generation/IrradianceSphericalHarmonicsGenerator.java b/jme3-core/src/main/java/com/jme3/environment/generation/IrradianceSphericalHarmonicsGenerator.java index ee2572886..d098fa61d 100644 --- a/jme3-core/src/main/java/com/jme3/environment/generation/IrradianceSphericalHarmonicsGenerator.java +++ b/jme3-core/src/main/java/com/jme3/environment/generation/IrradianceSphericalHarmonicsGenerator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2015 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -73,7 +73,7 @@ public class IrradianceSphericalHarmonicsGenerator extends RunnableWithProgress } /** - * Fills all the genration parameters + * Fills all the generation parameters * * @param sourceMap the source cube map * {@link EnvMapUtils.FixSeamsMethod} diff --git a/jme3-core/src/main/java/com/jme3/environment/generation/PrefilteredEnvMapFaceGenerator.java b/jme3-core/src/main/java/com/jme3/environment/generation/PrefilteredEnvMapFaceGenerator.java index 8fe9cc8aa..fbfa73669 100644 --- a/jme3-core/src/main/java/com/jme3/environment/generation/PrefilteredEnvMapFaceGenerator.java +++ b/jme3-core/src/main/java/com/jme3/environment/generation/PrefilteredEnvMapFaceGenerator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2015 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -45,8 +45,8 @@ import static com.jme3.math.FastMath.abs; import static com.jme3.math.FastMath.sqrt; /** - * Generates one face of the prefiltered environnement map for PBR. This job can - * be lauched from a separate thread. + * Generates one face of the prefiltered environment map for PBR. This job can + * be launched from a separate thread. *

* TODO there is a lot of duplicate code here with the EnvMapUtils. * @@ -91,7 +91,7 @@ public class PrefilteredEnvMapFaceGenerator extends RunnableWithProgress { /** - * Fills all the genration parameters + * Fills all the generation parameters * * @param sourceMap the source cube map * @param targetMapSize the size of the generated map (width or height in diff --git a/jme3-core/src/main/java/com/jme3/environment/generation/RunnableWithProgress.java b/jme3-core/src/main/java/com/jme3/environment/generation/RunnableWithProgress.java index 09b495e67..33fc922c6 100644 --- a/jme3-core/src/main/java/com/jme3/environment/generation/RunnableWithProgress.java +++ b/jme3-core/src/main/java/com/jme3/environment/generation/RunnableWithProgress.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2015 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -61,7 +61,7 @@ public abstract class RunnableWithProgress implements Runnable { } /** - * return the curent progress of the process. + * return the current progress of the process. * * @return */ diff --git a/jme3-core/src/main/java/com/jme3/environment/util/LightsDebugState.java b/jme3-core/src/main/java/com/jme3/environment/util/LightsDebugState.java index 17ccc99f3..a9d2a9e46 100644 --- a/jme3-core/src/main/java/com/jme3/environment/util/LightsDebugState.java +++ b/jme3-core/src/main/java/com/jme3/environment/util/LightsDebugState.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2015 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -34,9 +34,8 @@ package com.jme3.environment.util; import com.jme3.app.Application; import com.jme3.app.state.BaseAppState; import com.jme3.bounding.BoundingSphere; +import com.jme3.light.*; import com.jme3.material.Material; -import com.jme3.light.LightProbe; -import com.jme3.light.Light; import com.jme3.renderer.RenderManager; import com.jme3.scene.Geometry; import com.jme3.scene.Node; @@ -68,7 +67,7 @@ public class LightsDebugState extends BaseAppState { @Override protected void initialize(Application app) { debugNode = new Node("Environment debug Node"); - Sphere s = new Sphere(16, 16, 1); + Sphere s = new Sphere(16, 16, 0.15f); debugGeom = new Geometry("debugEnvProbe", s); debugMaterial = new Material(app.getAssetManager(), "Common/MatDefs/Misc/reflect.j3md"); debugGeom.setMaterial(debugMaterial); @@ -80,6 +79,16 @@ public class LightsDebugState extends BaseAppState { @Override public void update(float tpf) { + if(!isEnabled()){ + return; + } + updateLights(scene); + debugNode.updateLogicalState(tpf); + debugNode.updateGeometricState(); + cleanProbes(); + } + + public void updateLights(Spatial scene) { for (Light light : scene.getWorldLightList()) { switch (light.getType()) { @@ -101,20 +110,22 @@ public class LightsDebugState extends BaseAppState { m.setTexture("CubeMap", probe.getPrefilteredEnvMap()); } n.setLocalTranslation(probe.getPosition()); - n.getChild(1).setLocalScale(((BoundingSphere) probe.getBounds()).getRadius()); + n.getChild(1).setLocalScale(probe.getArea().getRadius()); break; default: break; } } - debugNode.updateLogicalState(tpf); - debugNode.updateGeometricState(); - cleanProbes(); - + if( scene instanceof Node){ + Node n = (Node)scene; + for (Spatial spatial : n.getChildren()) { + updateLights(spatial); + } + } } /** - * Set the scenes for wich to render light gizmos. + * Set the scenes for which to render light gizmos. * @param scene */ public void setScene(Spatial scene) { @@ -138,6 +149,9 @@ public class LightsDebugState extends BaseAppState { @Override public void render(RenderManager rm) { + if(!isEnabled()){ + return; + } rm.renderScene(debugNode, getApplication().getViewPort()); } diff --git a/jme3-core/src/main/java/com/jme3/input/ChaseCamera.java b/jme3-core/src/main/java/com/jme3/input/ChaseCamera.java index 3f8576ddf..c185393f2 100644 --- a/jme3-core/src/main/java/com/jme3/input/ChaseCamera.java +++ b/jme3-core/src/main/java/com/jme3/input/ChaseCamera.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -34,7 +34,6 @@ package com.jme3.input; import com.jme3.export.InputCapsule; import com.jme3.export.JmeExporter; import com.jme3.export.JmeImporter; -import com.jme3.export.OutputCapsule; import com.jme3.input.controls.*; import com.jme3.math.FastMath; import com.jme3.math.Vector3f; @@ -420,7 +419,7 @@ public class ChaseCamera implements ActionListener, AnalogListener, Control, Jme //the user is rotating the cam by dragging the mouse if (canRotate) { - //reseting the trailing lerp factor + //reset the trailing lerp factor trailingLerpFactor = 0; //stop trailing user has the control trailing = false; @@ -582,18 +581,17 @@ public class ChaseCamera implements ActionListener, AnalogListener, Control, Jme /** * clone this camera for a spatial + * * @param spatial * @return */ + @Deprecated @Override public Control cloneForSpatial(Spatial spatial) { - ChaseCamera cc = new ChaseCamera(cam, spatial, inputManager); - cc.setMaxDistance(getMaxDistance()); - cc.setMinDistance(getMinDistance()); - return cc; + throw new UnsupportedOperationException(); } - @Override + @Override public Object jmeClone() { ChaseCamera cc = new ChaseCamera(cam, inputManager); cc.target = target; diff --git a/jme3-core/src/main/java/com/jme3/input/FlyByCamera.java b/jme3-core/src/main/java/com/jme3/input/FlyByCamera.java index 30d7a3b78..f7ffa78f1 100644 --- a/jme3-core/src/main/java/com/jme3/input/FlyByCamera.java +++ b/jme3-core/src/main/java/com/jme3/input/FlyByCamera.java @@ -412,7 +412,7 @@ public class FlyByCamera implements AnalogListener, ActionListener { * @param value translation amount */ protected void riseCamera(float value){ - Vector3f vel = new Vector3f(0, value * moveSpeed, 0); + Vector3f vel = initialUpVec.mult(value * moveSpeed); Vector3f pos = cam.getLocation().clone(); if (motionAllowed != null) diff --git a/jme3-core/src/main/java/com/jme3/input/InputManager.java b/jme3-core/src/main/java/com/jme3/input/InputManager.java index b21d225bb..63d90078f 100644 --- a/jme3-core/src/main/java/com/jme3/input/InputManager.java +++ b/jme3-core/src/main/java/com/jme3/input/InputManager.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -423,15 +423,22 @@ public class InputManager implements RawInputListener { /** * Callback from RawInputListener. Do not use. + * + * @param evt event to add to the input queue (not null) */ @Override public void onMouseMotionEvent(MouseMotionEvent evt) { - if (!eventsPermitted) { - throw new UnsupportedOperationException("MouseInput has raised an event at an illegal time."); - } - + /* + * If events aren't allowed, the event may be a "first mouse event" + * triggered by the constructor setting the mouse listener. + * In that case, use the event to initialize the cursor position, + * but don't queue it for further processing. + * This is part of the fix for issue #792. + */ cursorPos.set(evt.getX(), evt.getY()); - inputQueue.add(evt); + if (eventsPermitted) { + inputQueue.add(evt); + } } private void onMouseButtonEventQueued(MouseButtonEvent evt) { @@ -867,7 +874,7 @@ public class InputManager implements RawInputListener { // larynx, 2011.06.10 - flag event as reusable because // the android input uses a non-allocating ringbuffer which // needs to know when the event is not anymore in inputQueue - // and therefor can be reused. + // and therefore can be reused. event.setConsumed(); } diff --git a/jme3-core/src/main/java/com/jme3/input/Joystick.java b/jme3-core/src/main/java/com/jme3/input/Joystick.java index ced1d962a..8c55c906e 100644 --- a/jme3-core/src/main/java/com/jme3/input/Joystick.java +++ b/jme3-core/src/main/java/com/jme3/input/Joystick.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -123,7 +123,7 @@ public interface Joystick { /** * Returns the POV Y axis for this joystick. This is a convenience axis - * providing an y-axis subview of the HAT axis. + * providing a y-axis subview of the HAT axis. * * @see JoystickAxis#assignAxis(java.lang.String, java.lang.String) */ diff --git a/jme3-core/src/main/java/com/jme3/input/KeyInput.java b/jme3-core/src/main/java/com/jme3/input/KeyInput.java index 9ad78ed7b..8a0f72245 100644 --- a/jme3-core/src/main/java/com/jme3/input/KeyInput.java +++ b/jme3-core/src/main/java/com/jme3/input/KeyInput.java @@ -445,6 +445,16 @@ public interface KeyInput extends Input { * (J3100). */ public static final int KEY_UNLABELED = 0x97; + /** + * PrtScr key. + * Note: for use on keyboards with a PrtScr key that is + * separate from the SysRq key. Most keyboards combine + * SysRq and PrtScr so if the intent is to actually + * capture the user's desire to capture the screen + * then SysRq is the most likely scan code. + * Use PrtScr to catch the rest (laptops, mini-keyboards, etc.) + */ + public static final int KEY_PRTSCR = 0x9A; /** * Enter key (num pad). */ diff --git a/jme3-core/src/main/java/com/jme3/light/DefaultLightFilter.java b/jme3-core/src/main/java/com/jme3/light/DefaultLightFilter.java index 84cdc17fc..df735095e 100644 --- a/jme3-core/src/main/java/com/jme3/light/DefaultLightFilter.java +++ b/jme3-core/src/main/java/com/jme3/light/DefaultLightFilter.java @@ -43,10 +43,10 @@ public final class DefaultLightFilter implements LightFilter { private Camera camera; private final HashSet processedLights = new HashSet(); - private final LightProbeBlendingStrategy probeBlendStrat; + private LightProbeBlendingStrategy probeBlendStrat; public DefaultLightFilter() { - probeBlendStrat = new BasicProbeBlendingStrategy(); + probeBlendStrat = new WeightedProbeBlendingStrategy(); } public DefaultLightFilter(LightProbeBlendingStrategy probeBlendStrat) { @@ -113,5 +113,9 @@ public final class DefaultLightFilter implements LightFilter { vars.release(); } } - + + public void setLightProbeBlendingStrategy(LightProbeBlendingStrategy strategy){ + probeBlendStrat = strategy; + } + } diff --git a/jme3-core/src/main/java/com/jme3/light/DirectionalLight.java b/jme3-core/src/main/java/com/jme3/light/DirectionalLight.java index 6613b8428..d5b28fe55 100644 --- a/jme3-core/src/main/java/com/jme3/light/DirectionalLight.java +++ b/jme3-core/src/main/java/com/jme3/light/DirectionalLight.java @@ -132,6 +132,11 @@ public class DirectionalLight extends Light { return Type.Directional; } + @Override + public String toString() { + return getClass().getSimpleName() + "[name=" + name + ", direction=" + direction + ", color=" + color + ", enabled=" + enabled + "]"; + } + @Override public void write(JmeExporter ex) throws IOException { super.write(ex); diff --git a/jme3-core/src/main/java/com/jme3/light/LightProbe.java b/jme3-core/src/main/java/com/jme3/light/LightProbe.java index 2b962fc97..d6d716877 100644 --- a/jme3-core/src/main/java/com/jme3/light/LightProbe.java +++ b/jme3-core/src/main/java/com/jme3/light/LightProbe.java @@ -31,24 +31,16 @@ */ package com.jme3.light; -import com.jme3.asset.AssetManager; -import com.jme3.bounding.BoundingBox; -import com.jme3.bounding.BoundingSphere; -import com.jme3.bounding.BoundingVolume; +import com.jme3.bounding.*; import com.jme3.environment.EnvironmentCamera; import com.jme3.environment.LightProbeFactory; -import com.jme3.environment.util.EnvMapUtils; -import com.jme3.export.InputCapsule; -import com.jme3.export.JmeExporter; -import com.jme3.export.JmeImporter; -import com.jme3.export.OutputCapsule; -import com.jme3.export.Savable; -import com.jme3.math.Vector3f; +import com.jme3.export.*; +import com.jme3.math.*; import com.jme3.renderer.Camera; -import com.jme3.scene.Node; import com.jme3.scene.Spatial; import com.jme3.texture.TextureCubeMap; import com.jme3.util.TempVars; + import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; @@ -56,7 +48,7 @@ import java.util.logging.Logger; /** * A LightProbe is not exactly a light. It holds environment map information used for Image Based Lighting. * This is used for indirect lighting in the Physically Based Rendering pipeline. - * + * * A light probe has a position in world space. This is the position from where the Environment Map are rendered. * There are two environment data structure held by the LightProbe : * - The irradiance spherical harmonics factors (used for indirect diffuse lighting in the PBR pipeline). @@ -64,10 +56,10 @@ import java.util.logging.Logger; * Note that when instantiating the LightProbe, both of those structures are null. * To compute them see {@link LightProbeFactory#makeProbe(com.jme3.environment.EnvironmentCamera, com.jme3.scene.Node)} * and {@link EnvironmentCamera}. - * - * The light probe has an area of effect that is a bounding volume centered on its position. (for now only Bounding spheres are supported). - * - * A LightProbe will only be taken into account when it's marked as ready. + * + * The light probe has an area of effect centered on its position. It can have a Spherical area or an Oriented Box area + * + * A LightProbe will only be taken into account when it's marked as ready and enabled. * A light probe is ready when it has valid environment map data set. * Note that you should never call setReady yourself. * @@ -78,20 +70,25 @@ import java.util.logging.Logger; public class LightProbe extends Light implements Savable { private static final Logger logger = Logger.getLogger(LightProbe.class.getName()); + public static final Matrix4f FALLBACK_MATRIX = new Matrix4f(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1); private Vector3f[] shCoeffs; private TextureCubeMap prefilteredEnvMap; - private BoundingVolume bounds = new BoundingSphere(1.0f, Vector3f.ZERO); + private ProbeArea area = new SphereProbeArea(Vector3f.ZERO, 1.0f); private boolean ready = false; private Vector3f position = new Vector3f(); - private Node debugNode; private int nbMipMaps; + public enum AreaType{ + Spherical, + OrientedBox + } + /** - * Empty constructor used for serialization. + * Empty constructor used for serialization. * You should never call it, use {@link LightProbeFactory#makeProbe(com.jme3.environment.EnvironmentCamera, com.jme3.scene.Node)} instead */ - public LightProbe() { + public LightProbe() { } /** @@ -104,13 +101,59 @@ public class LightProbe extends Light implements Savable { } /** - * Sets the prefiltered environment map - * @param prefileteredEnvMap the prefiltered environment map + * Sets the prefiltered environment map + * @param prefileteredEnvMap the prefiltered environment map */ public void setPrefilteredMap(TextureCubeMap prefileteredEnvMap) { this.prefilteredEnvMap = prefileteredEnvMap; } + /** + * Returns the data to send to the shader. + * This is a column major matrix that is not a classic transform matrix, it's laid out in a particular way + // 3x3 rot mat| + // 0 1 2 | 3 + // 0 | ax bx cx | px | ) + // 1 | ay by cy | py | probe position + // 2 | az bz cz | pz | ) + // --|----------| + // 3 | sx sy sz sp | -> 1/probe radius + nbMipMaps + // --scale-- + *

+ * (ax, ay, az) is the pitch rotation axis + * (bx, by, bz) is the yaw rotation axis + * (cx, cy, cz) is the roll rotation axis + * Like in a standard 3x3 rotation matrix. + * It's also the valid rotation matrix of the probe in world space. + * Note that for the Spherical Probe area this part is a 3x3 identity matrix. + *

+ * (px, py, pz) is the position of the center of the probe in world space + * Like in a valid 4x4 transform matrix. + *

+ * (sx, sy, sy) is the extent of the probe ( the scale ) + * In a standard transform matrix the scale is applied to the rotation matrix part. + * In the shader we need the rotation and the scale to be separated, doing this avoid to extract + * the scale from a classic transform matrix in the shader + *

+ * (sp) is a special entry, it contains the packed number of mip maps of the probe and the inverse radius for the probe. + * since the inverse radius in lower than 1, it's packed in the decimal part of the float. + * The number of mip maps is packed in the integer part of the float. + * (ie: for 6 mip maps and a radius of 3, sp= 6.3333333) + *

+ * The radius is obvious for a SphereProbeArea, + * but in the case of a OrientedBoxProbeArea it's the max of the extent vector's components. + */ + public Matrix4f getUniformMatrix(){ + + Matrix4f mat = area.getUniformMatrix(); + + // setting the (sp) entry of the matrix + mat.m33 = nbMipMaps + 1f / area.getRadius(); + + return mat; + } + + @Override public void write(JmeExporter ex) throws IOException { super.write(ex); @@ -118,7 +161,7 @@ public class LightProbe extends Light implements Savable { oc.write(shCoeffs, "shCoeffs", null); oc.write(prefilteredEnvMap, "prefilteredEnvMap", null); oc.write(position, "position", null); - oc.write(bounds, "bounds", new BoundingSphere(1.0f, Vector3f.ZERO)); + oc.write(area, "area", new SphereProbeArea(Vector3f.ZERO, 1.0f)); oc.write(ready, "ready", false); oc.write(nbMipMaps, "nbMipMaps", 0); } @@ -127,10 +170,16 @@ public class LightProbe extends Light implements Savable { public void read(JmeImporter im) throws IOException { super.read(im); InputCapsule ic = im.getCapsule(this); - + prefilteredEnvMap = (TextureCubeMap) ic.readSavable("prefilteredEnvMap", null); position = (Vector3f) ic.readSavable("position", null); - bounds = (BoundingVolume) ic.readSavable("bounds", new BoundingSphere(1.0f, Vector3f.ZERO)); + area = (ProbeArea)ic.readSavable("area", null); + if(area == null) { + // retro compat + BoundingSphere bounds = (BoundingSphere) ic.readSavable("bounds", new BoundingSphere(1.0f, Vector3f.ZERO)); + area = new SphereProbeArea(bounds.getCenter(), bounds.getRadius()); + } + area.setCenter(position); nbMipMaps = ic.readInt("nbMipMaps", 0); ready = ic.readBoolean("ready", false); @@ -146,25 +195,49 @@ public class LightProbe extends Light implements Savable { } } + /** * returns the bounding volume of this LightProbe * @return a bounding volume. + * @deprecated use {@link LightProbe#getArea()} */ + @Deprecated public BoundingVolume getBounds() { - return bounds; + return new BoundingSphere(((SphereProbeArea)area).getRadius(), ((SphereProbeArea)area).getCenter()); } - + /** * Sets the bounds of this LightProbe - * Note that for now only BoundingSphere is supported and this method will + * Note that for now only BoundingSphere is supported and this method will * throw an UnsupportedOperationException with any other BoundingVolume type * @param bounds the bounds of the LightProbe + * @deprecated */ + @Deprecated public void setBounds(BoundingVolume bounds) { - if( bounds.getType()!= BoundingVolume.Type.Sphere){ - throw new UnsupportedOperationException("For not only BoundingSphere are suported for LightProbe"); + } + + public ProbeArea getArea() { + return area; + } + + public void setAreaType(AreaType type){ + switch (type){ + case Spherical: + area = new SphereProbeArea(Vector3f.ZERO, 1.0f); + break; + case OrientedBox: + area = new OrientedBoxProbeArea(new Transform()); + area.setCenter(position); + break; + } + } + + public AreaType getAreaType(){ + if(area instanceof SphereProbeArea){ + return AreaType.Spherical; } - this.bounds = bounds; + return AreaType.OrientedBox; } /** @@ -186,27 +259,6 @@ public class LightProbe extends Light implements Savable { this.ready = ready; } - /** - * For debuging porpose only - * Will return a Node meant to be added to a GUI presenting the 2 cube maps in a cross pattern with all the mip maps. - * - * @param manager the asset manager - * @return a debug node - */ - public Node getDebugGui(AssetManager manager) { - if (!ready) { - throw new UnsupportedOperationException("This EnvProbe is not ready yet, try to test isReady()"); - } - if (debugNode == null) { - debugNode = new Node("debug gui probe"); - Node debugPfemCm = EnvMapUtils.getCubeMapCrossDebugViewWithMipMaps(getPrefilteredEnvMap(), manager); - debugNode.attachChild(debugPfemCm); - debugPfemCm.setLocalTranslation(520, 0, 0); - } - - return debugNode; - } - public Vector3f[] getShCoeffs() { return shCoeffs; } @@ -229,7 +281,7 @@ public class LightProbe extends Light implements Savable { */ public void setPosition(Vector3f position) { this.position.set(position); - getBounds().setCenter(position); + area.setCenter(position); } public int getNbMipMaps() { @@ -242,12 +294,17 @@ public class LightProbe extends Light implements Savable { @Override public boolean intersectsBox(BoundingBox box, TempVars vars) { - return getBounds().intersectsBoundingBox(box); + return area.intersectsBox(box, vars); } @Override public boolean intersectsFrustum(Camera camera, TempVars vars) { - return camera.contains(bounds) != Camera.FrustumIntersect.Outside; + return area.intersectsFrustum(camera, vars); + } + + @Override + public boolean intersectsSphere(BoundingSphere sphere, TempVars vars) { + return area.intersectsSphere(sphere, vars); } @Override @@ -267,14 +324,8 @@ public class LightProbe extends Light implements Savable { @Override public String toString() { - return "Light Probe : " + name + " at " + position + " / " + bounds; + return "Light Probe : " + name + " at " + position + " / " + area; } - @Override - public boolean intersectsSphere(BoundingSphere sphere, TempVars vars) { - return getBounds().intersectsSphere(sphere); - } - - } diff --git a/jme3-core/src/main/java/com/jme3/light/LightProbeBlendingProcessor.java b/jme3-core/src/main/java/com/jme3/light/LightProbeBlendingProcessor.java deleted file mode 100644 index 572fd5c18..000000000 --- a/jme3-core/src/main/java/com/jme3/light/LightProbeBlendingProcessor.java +++ /dev/null @@ -1,214 +0,0 @@ - /* - * Copyright (c) 2009-2015 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package com.jme3.light; - -import com.jme3.bounding.BoundingSphere; -import com.jme3.post.SceneProcessor; -import com.jme3.profile.AppProfiler; -import com.jme3.renderer.RenderManager; -import com.jme3.renderer.ViewPort; -import com.jme3.renderer.queue.RenderQueue; -import com.jme3.scene.Spatial; -import com.jme3.texture.FrameBuffer; -import com.jme3.util.TempVars; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -/** - * this processor allows to blend several light probes maps together according to a Point of Interest. - * This is all based on this article by Sebastien lagarde - * https://seblagarde.wordpress.com/2012/09/29/image-based-lighting-approaches-and-parallax-corrected-cubemap/ - * @author Nehon - */ -public class LightProbeBlendingProcessor implements SceneProcessor { - - private ViewPort viewPort; - private LightFilter prevFilter; - private RenderManager renderManager; - private LightProbe probe = new LightProbe(); - private Spatial poi; - private AppProfiler prof; - - public LightProbeBlendingProcessor(Spatial poi) { - this.poi = poi; - } - - @Override - public void initialize(RenderManager rm, ViewPort vp) { - viewPort = vp; - renderManager = rm; - prevFilter = rm.getLightFilter(); - rm.setLightFilter(new PoiLightProbeLightFilter(this)); - } - - @Override - public void reshape(ViewPort vp, int w, int h) { - - } - - @Override - public boolean isInitialized() { - return viewPort != null; - } - - @Override - public void preFrame(float tpf) { - - } - - /** 1. For POI take a spatial in the constructor and make all calculation against its world pos - * - Alternatively compute an arbitrary POI by casting rays from the camera - * (one in the center and one for each corner and take the median point) - * 2. Take the 4 most weighted probes for default. Maybe allow the user to change this - * 3. For the inner influence radius take half of the radius for a start we'll see then how to change this. - * - */ - @Override - public void postQueue(RenderQueue rq) { - List blendFactors = new ArrayList(); - float sumBlendFactors = computeBlendFactors(blendFactors); - - //Sort blend factors according to their weight - Collections.sort(blendFactors); - - //normalize blend factors; - float normalizer = 1f / sumBlendFactors; - for (BlendFactor blendFactor : blendFactors) { - blendFactor.ndf *= normalizer; - // System.err.println(blendFactor); - } - - - //for now just pick the first probe. - if(!blendFactors.isEmpty()){ - probe = blendFactors.get(0).lightProbe; - }else{ - probe = null; - } - } - - private float computeBlendFactors(List blendFactors) { - float sumBlendFactors = 0; - for (Spatial scene : viewPort.getScenes()) { - for (Light light : scene.getWorldLightList()) { - if(light.getType() == Light.Type.Probe){ - LightProbe p = (LightProbe)light; - TempVars vars = TempVars.get(); - boolean intersect = p.intersectsFrustum(viewPort.getCamera(), vars); - vars.release(); - //check if the probe is inside the camera frustum - if(intersect){ - - //is the poi inside the bounds of this probe - if(poi.getWorldBound().intersects(p.getBounds())){ - - //computing the distance as we need it to check if th epoi in in the inner radius and later to compute the weight - float outerRadius = ((BoundingSphere)p.getBounds()).getRadius(); - float innerRadius = outerRadius * 0.5f; - float distance = p.getBounds().getCenter().distance(poi.getWorldTranslation()); - - // if the poi in inside the inner range of this probe, then this probe is the only one that matters. - if( distance < innerRadius ){ - blendFactors.clear(); - blendFactors.add(new BlendFactor(p, 1.0f)); - return 1.0f; - } - //else we need to compute the weight of this probe and collect it for blending - float ndf = (distance - innerRadius) / (outerRadius - innerRadius); - sumBlendFactors += ndf; - blendFactors.add(new BlendFactor(p, ndf)); - } - } - } - } - } - return sumBlendFactors; - } - - @Override - public void postFrame(FrameBuffer out) { - - } - - @Override - public void cleanup() { - viewPort = null; - renderManager.setLightFilter(prevFilter); - } - - public void populateProbe(LightList lightList){ - if(probe != null && probe.isReady()){ - lightList.add(probe); - } - } - - public Spatial getPoi() { - return poi; - } - - public void setPoi(Spatial poi) { - this.poi = poi; - } - - @Override - public void setProfiler(AppProfiler profiler) { - this.prof = profiler; - } - - private class BlendFactor implements Comparable{ - - LightProbe lightProbe; - float ndf; - - public BlendFactor(LightProbe lightProbe, float ndf) { - this.lightProbe = lightProbe; - this.ndf = ndf; - } - - @Override - public String toString() { - return "BlendFactor{" + "lightProbe=" + lightProbe + ", ndf=" + ndf + '}'; - } - - @Override - public int compareTo(BlendFactor o) { - if(o.ndf > ndf){ - return -1; - }else if(o.ndf < ndf){ - return 1; - } - return 0; - } - - } -} diff --git a/jme3-core/src/main/java/com/jme3/light/LightProbeBlendingStrategy.java b/jme3-core/src/main/java/com/jme3/light/LightProbeBlendingStrategy.java index a3a6ac516..824c94bb1 100644 --- a/jme3-core/src/main/java/com/jme3/light/LightProbeBlendingStrategy.java +++ b/jme3-core/src/main/java/com/jme3/light/LightProbeBlendingStrategy.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2015 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -48,7 +48,7 @@ public interface LightProbeBlendingStrategy { public void registerProbe(LightProbe probe); /** * Populates the resulting light probes into the given light list. - * @param g the geometry for wich the light list is computed + * @param g the geometry for which the light list is computed * @param lightList the result light list */ public void populateProbes(Geometry g, LightList lightList); diff --git a/jme3-core/src/main/java/com/jme3/light/OrientedBoxProbeArea.java b/jme3-core/src/main/java/com/jme3/light/OrientedBoxProbeArea.java new file mode 100644 index 000000000..6b1e1b594 --- /dev/null +++ b/jme3-core/src/main/java/com/jme3/light/OrientedBoxProbeArea.java @@ -0,0 +1,254 @@ +package com.jme3.light; + +import com.jme3.bounding.BoundingBox; +import com.jme3.bounding.BoundingSphere; +import com.jme3.export.*; +import com.jme3.math.*; +import com.jme3.renderer.Camera; +import com.jme3.util.TempVars; + +import java.io.IOException; + +public class OrientedBoxProbeArea implements ProbeArea { + private Transform transform = new Transform(); + + /** + * @see LightProbe#getUniformMatrix() + * for this Area type, the matrix is updated when the probe is transformed, + * and its data is used for bound checks in the light culling process. + */ + private Matrix4f uniformMatrix = new Matrix4f(); + + public OrientedBoxProbeArea() { + } + + public OrientedBoxProbeArea(Transform transform) { + this.transform.set(transform); + updateMatrix(); + } + + @Override + public boolean intersectsBox(BoundingBox box, TempVars vars) { + + Vector3f axis1 = getScaledAxis(0, vars.vect1); + Vector3f axis2 = getScaledAxis(1, vars.vect2); + Vector3f axis3 = getScaledAxis(2, vars.vect3); + + Vector3f tn = vars.vect4; + Plane p = vars.plane; + Vector3f c = box.getCenter(); + + p.setNormal(0, 0, -1); + p.setConstant(-(c.z + box.getZExtent())); + if (!insidePlane(p, axis1, axis2, axis3, tn)) return false; + + p.setNormal(0, 0, 1); + p.setConstant(c.z - box.getZExtent()); + if (!insidePlane(p, axis1, axis2, axis3, tn)) return false; + + + p.setNormal(0, -1, 0); + p.setConstant(-(c.y + box.getYExtent())); + if (!insidePlane(p, axis1, axis2, axis3, tn)) return false; + + p.setNormal(0, 1, 0); + p.setConstant(c.y - box.getYExtent()); + if (!insidePlane(p, axis1, axis2, axis3, tn)) return false; + + p.setNormal(-1, 0, 0); + p.setConstant(-(c.x + box.getXExtent())); + if (!insidePlane(p, axis1, axis2, axis3, tn)) return false; + + p.setNormal(1, 0, 0); + p.setConstant(c.x - box.getXExtent()); + if (!insidePlane(p, axis1, axis2, axis3, tn)) return false; + + return true; + + } + + @Override + public float getRadius() { + return Math.max(Math.max(transform.getScale().x, transform.getScale().y), transform.getScale().z); + } + + @Override + public void setRadius(float radius) { + transform.setScale(radius, radius, radius); + } + + @Override + public boolean intersectsSphere(BoundingSphere sphere, TempVars vars) { + + Vector3f closestPoint = getClosestPoint(vars, sphere.getCenter()); + // check if the point intersects with the sphere bound + if (sphere.intersects(closestPoint)) { + return true; + } + return false; + } + + @Override + public boolean intersectsFrustum(Camera camera, TempVars vars) { + + // extract the scaled axis + // this allows a small optimization. + Vector3f axis1 = getScaledAxis(0, vars.vect1); + Vector3f axis2 = getScaledAxis(1, vars.vect2); + Vector3f axis3 = getScaledAxis(2, vars.vect3); + + Vector3f tn = vars.vect4; + + for (int i = 5; i >= 0; i--) { + Plane p = camera.getWorldPlane(i); + if (!insidePlane(p, axis1, axis2, axis3, tn)) return false; + } + return true; + } + + private Vector3f getScaledAxis(int index, Vector3f store) { + Matrix4f u = uniformMatrix; + float x = 0, y = 0, z = 0, s = 1; + switch (index) { + case 0: + x = u.m00; + y = u.m10; + z = u.m20; + s = u.m30; + break; + case 1: + x = u.m01; + y = u.m11; + z = u.m21; + s = u.m31; + break; + case 2: + x = u.m02; + y = u.m12; + z = u.m22; + s = u.m32; + } + return store.set(x, y, z).multLocal(s); + } + + private boolean insidePlane(Plane p, Vector3f axis1, Vector3f axis2, Vector3f axis3, Vector3f tn) { + // transform the plane normal in the box local space. + tn.set(axis1.dot(p.getNormal()), axis2.dot(p.getNormal()), axis3.dot(p.getNormal())); + + // distance check + float radius = FastMath.abs(tn.x) + + FastMath.abs(tn.y) + + FastMath.abs(tn.z); + + float distance = p.pseudoDistance(transform.getTranslation()); + + if (distance < -radius) { + return false; + } + return true; + } + + private Vector3f getClosestPoint(TempVars vars, Vector3f point) { + // non normalized direction + Vector3f dir = vars.vect2.set(point).subtractLocal(transform.getTranslation()); + // initialize the closest point with box center + Vector3f closestPoint = vars.vect3.set(transform.getTranslation()); + + //store extent in an array + float[] r = vars.fWdU; + r[0] = transform.getScale().x; + r[1] = transform.getScale().y; + r[2] = transform.getScale().z; + + // computing closest point to sphere center + for (int i = 0; i < 3; i++) { + // extract the axis from the 3x3 matrix + Vector3f axis = getScaledAxis(i, vars.vect1); + // nomalize (here we just divide by the extent + axis.divideLocal(r[i]); + // distance to the closest point on this axis. + float d = FastMath.clamp(dir.dot(axis), -r[i], r[i]); + closestPoint.addLocal(vars.vect4.set(axis).multLocal(d)); + } + return closestPoint; + } + + private void updateMatrix() { + TempVars vars = TempVars.get(); + Matrix3f r = vars.tempMat3; + Matrix4f u = uniformMatrix; + transform.getRotation().toRotationMatrix(r); + + u.m00 = r.get(0,0); + u.m10 = r.get(1,0); + u.m20 = r.get(2,0); + u.m01 = r.get(0,1); + u.m11 = r.get(1,1); + u.m21 = r.get(2,1); + u.m02 = r.get(0,2); + u.m12 = r.get(1,2); + u.m22 = r.get(2,2); + + //scale + u.m30 = transform.getScale().x; + u.m31 = transform.getScale().y; + u.m32 = transform.getScale().z; + + //position + u.m03 = transform.getTranslation().x; + u.m13 = transform.getTranslation().y; + u.m23 = transform.getTranslation().z; + + vars.release(); + } + + public Matrix4f getUniformMatrix() { + return uniformMatrix; + } + + public Vector3f getExtent() { + return transform.getScale(); + } + + public void setExtent(Vector3f extent) { + transform.setScale(extent); + updateMatrix(); + } + + public Vector3f getCenter() { + return transform.getTranslation(); + } + + public void setCenter(Vector3f center) { + transform.setTranslation(center); + updateMatrix(); + } + + public Quaternion getRotation() { + return transform.getRotation(); + } + + public void setRotation(Quaternion rotation) { + transform.setRotation(rotation); + updateMatrix(); + } + + @Override + protected OrientedBoxProbeArea clone() throws CloneNotSupportedException { + return new OrientedBoxProbeArea(transform); + } + + @Override + public void write(JmeExporter e) throws IOException { + OutputCapsule oc = e.getCapsule(this); + oc.write(transform, "transform", new Transform()); + } + + @Override + public void read(JmeImporter i) throws IOException { + InputCapsule ic = i.getCapsule(this); + transform = (Transform) ic.readSavable("transform", new Transform()); + updateMatrix(); + } + +} diff --git a/jme3-core/src/main/java/com/jme3/light/PoiLightProbeLightFilter.java b/jme3-core/src/main/java/com/jme3/light/PoiLightProbeLightFilter.java deleted file mode 100644 index b991036ae..000000000 --- a/jme3-core/src/main/java/com/jme3/light/PoiLightProbeLightFilter.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (c) 2009-2015 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package com.jme3.light; - -import com.jme3.bounding.BoundingBox; -import com.jme3.bounding.BoundingSphere; -import com.jme3.bounding.BoundingVolume; -import com.jme3.renderer.Camera; -import com.jme3.scene.Geometry; -import com.jme3.util.TempVars; -import java.util.HashSet; - -public final class PoiLightProbeLightFilter implements LightFilter { - - private Camera camera; - private final HashSet processedLights = new HashSet(); - private final LightProbeBlendingProcessor processor; - - public PoiLightProbeLightFilter(LightProbeBlendingProcessor processor) { - this.processor = processor; - } - - @Override - public void setCamera(Camera camera) { - this.camera = camera; - for (Light light : processedLights) { - light.frustumCheckNeeded = true; - } - } - - @Override - public void filterLights(Geometry geometry, LightList filteredLightList) { - TempVars vars = TempVars.get(); - try { - LightList worldLights = geometry.getWorldLightList(); - - for (int i = 0; i < worldLights.size(); i++) { - Light light = worldLights.get(i); - - if (light.getType() == Light.Type.Probe) { - continue; - } - - if (light.frustumCheckNeeded) { - processedLights.add(light); - light.frustumCheckNeeded = false; - light.intersectsFrustum = light.intersectsFrustum(camera, vars); - } - - if (!light.intersectsFrustum) { - continue; - } - - BoundingVolume bv = geometry.getWorldBound(); - - if (bv instanceof BoundingBox) { - if (!light.intersectsBox((BoundingBox) bv, vars)) { - continue; - } - } else if (bv instanceof BoundingSphere) { - if (!Float.isInfinite(((BoundingSphere) bv).getRadius())) { - if (!light.intersectsSphere((BoundingSphere) bv, vars)) { - continue; - } - } - } - - filteredLightList.add(light); - } - - processor.populateProbe(filteredLightList); - - } finally { - vars.release(); - } - } - -} diff --git a/jme3-core/src/main/java/com/jme3/light/PointLight.java b/jme3-core/src/main/java/com/jme3/light/PointLight.java index 2e8a57882..dddf06287 100644 --- a/jme3-core/src/main/java/com/jme3/light/PointLight.java +++ b/jme3-core/src/main/java/com/jme3/light/PointLight.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012, 2015-2016 jMonkeyEngine + * Copyright (c) 2009-2012, 2015-2016, 2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -54,7 +54,7 @@ import java.io.IOException; *

* In addition to a position, point lights also have a radius which * can be used to attenuate the influence of the light depending on the - * distance between the light and the effected object. + * distance between the light and the affected object. * */ public class PointLight extends Light { @@ -155,7 +155,7 @@ public class PointLight extends Light { * Setting a non-zero radius indicates the light should use attenuation. * If a pixel's distance to this light's position * is greater than the light's radius, then the pixel will not be - * effected by this light, if the distance is less than the radius, then + * affected by this light, if the distance is less than the radius, then * the magnitude of the influence is equal to distance / radius. * * @param radius the radius of the light influence. @@ -212,12 +212,7 @@ public class PointLight extends Light { if (this.radius == 0) { return true; } else { - for (int i = 5; i >= 0; i--) { - if (camera.getWorldPlane(i).pseudoDistance(position) <= -radius) { - return false; - } - } - return true; + return Intersection.intersect(camera, position, radius); } } diff --git a/jme3-core/src/main/java/com/jme3/light/ProbeArea.java b/jme3-core/src/main/java/com/jme3/light/ProbeArea.java new file mode 100644 index 000000000..28ca0c4e7 --- /dev/null +++ b/jme3-core/src/main/java/com/jme3/light/ProbeArea.java @@ -0,0 +1,35 @@ +package com.jme3.light; + +import com.jme3.bounding.BoundingBox; +import com.jme3.bounding.BoundingSphere; +import com.jme3.export.Savable; +import com.jme3.math.Matrix4f; +import com.jme3.math.Vector3f; +import com.jme3.renderer.Camera; +import com.jme3.util.TempVars; + +public interface ProbeArea extends Savable, Cloneable{ + + public void setCenter(Vector3f center); + + public float getRadius(); + + public void setRadius(float radius); + + public Matrix4f getUniformMatrix(); + + /** + * @see Light#intersectsBox(BoundingBox, TempVars) + */ + public boolean intersectsBox(BoundingBox box, TempVars vars); + + /** + * @see Light#intersectsSphere(BoundingSphere, TempVars) + */ + public boolean intersectsSphere(BoundingSphere sphere, TempVars vars); + + /** + * @see Light#intersectsFrustum(Camera, TempVars) + */ + public abstract boolean intersectsFrustum(Camera camera, TempVars vars); +} diff --git a/jme3-core/src/main/java/com/jme3/light/SphereProbeArea.java b/jme3-core/src/main/java/com/jme3/light/SphereProbeArea.java new file mode 100644 index 000000000..9c2d3fbe8 --- /dev/null +++ b/jme3-core/src/main/java/com/jme3/light/SphereProbeArea.java @@ -0,0 +1,103 @@ +package com.jme3.light; + +import com.jme3.bounding.*; +import com.jme3.export.*; +import com.jme3.math.Matrix4f; +import com.jme3.math.Vector3f; +import com.jme3.renderer.Camera; +import com.jme3.util.TempVars; + +import java.io.IOException; +import java.util.logging.Level; + +public class SphereProbeArea implements ProbeArea { + + private Vector3f center = new Vector3f(); + private float radius = 1; + private Matrix4f uniformMatrix = new Matrix4f(); + + public SphereProbeArea() { + } + + public SphereProbeArea(Vector3f center, float radius) { + this.center.set(center); + this.radius = radius; + updateMatrix(); + } + + public Vector3f getCenter() { + return center; + } + + public void setCenter(Vector3f center) { + this.center.set(center); + updateMatrix(); + } + + public float getRadius() { + return radius; + } + + @Override + public void setRadius(float radius) { + this.radius = radius; + updateMatrix(); + } + + @Override + public Matrix4f getUniformMatrix() { + return uniformMatrix; + } + + private void updateMatrix(){ + //position + uniformMatrix.m03 = center.x; + uniformMatrix.m13 = center.y; + uniformMatrix.m23 = center.z; + + } + + @Override + public boolean intersectsBox(BoundingBox box, TempVars vars) { + return Intersection.intersect(box, center, radius); + } + + @Override + public boolean intersectsSphere(BoundingSphere sphere, TempVars vars) { + return Intersection.intersect(sphere, center, radius); + } + + @Override + public boolean intersectsFrustum(Camera camera, TempVars vars) { + return Intersection.intersect(camera, center, radius); + } + + @Override + public String toString() { + return "SphereProbeArea{" + + "center=" + center + + ", radius=" + radius + + '}'; + } + + @Override + protected SphereProbeArea clone() throws CloneNotSupportedException { + return new SphereProbeArea(center, radius); + } + + @Override + public void write(JmeExporter e) throws IOException { + OutputCapsule oc = e.getCapsule(this); + oc.write(center, "center", new Vector3f()); + oc.write(radius, "radius", 1); + } + + @Override + public void read(JmeImporter i) throws IOException { + InputCapsule ic = i.getCapsule(this); + center = (Vector3f) ic.readSavable("center", new Vector3f()); + radius = ic.readFloat("radius", 1); + updateMatrix(); + } + +} diff --git a/jme3-core/src/main/java/com/jme3/light/SpotLight.java b/jme3-core/src/main/java/com/jme3/light/SpotLight.java index 70115bbc5..2025ce414 100644 --- a/jme3-core/src/main/java/com/jme3/light/SpotLight.java +++ b/jme3-core/src/main/java/com/jme3/light/SpotLight.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012, 2015-2016 jMonkeyEngine + * Copyright (c) 2009-2012, 2015-2016, 2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -337,7 +337,7 @@ public class SpotLight extends Light { * Setting a non-zero range indicates the light should use attenuation. * If a pixel's distance to this light's position * is greater than the light's range, then the pixel will not be - * effected by this light, if the distance is less than the range, then + * affected by this light, if the distance is less than the range, then * the magnitude of the influence is equal to distance / range. * * @param spotRange the range of the light influence. diff --git a/jme3-core/src/main/java/com/jme3/light/WeightedProbeBlendingStrategy.java b/jme3-core/src/main/java/com/jme3/light/WeightedProbeBlendingStrategy.java new file mode 100644 index 000000000..7e7f2f92f --- /dev/null +++ b/jme3-core/src/main/java/com/jme3/light/WeightedProbeBlendingStrategy.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2009-2015 jMonkeyEngine + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'jMonkeyEngine' nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package com.jme3.light; + +import com.jme3.scene.Geometry; + +import java.util.ArrayList; +import java.util.List; + +/** + * This strategy returns the 3 closest probe from the rendered object. + *

+ * Image based lighting will be blended between those probes in the shader according to their distance and range. + * + * @author Nehon + */ +public class WeightedProbeBlendingStrategy implements LightProbeBlendingStrategy { + + private final static int MAX_PROBES = 3; + List lightProbes = new ArrayList(); + + @Override + public void registerProbe(LightProbe probe) { + lightProbes.add(probe); + } + + @Override + public void populateProbes(Geometry g, LightList lightList) { + if (!lightProbes.isEmpty()) { + //The 3 first probes are the closest to the geometry since the + //light list is sorted according to the distance to the geom. + int addedProbes = 0; + for (LightProbe p : lightProbes) { + if (p.isReady() && p.isEnabled()) { + lightList.add(p); + addedProbes ++; + } + if (addedProbes == MAX_PROBES) { + break; + } + } + + //clearing the list for next pass. + lightProbes.clear(); + } + } + +} diff --git a/jme3-core/src/main/java/com/jme3/material/MatParamOverride.java b/jme3-core/src/main/java/com/jme3/material/MatParamOverride.java index 8a7355b87..1b4aad480 100644 --- a/jme3-core/src/main/java/com/jme3/material/MatParamOverride.java +++ b/jme3-core/src/main/java/com/jme3/material/MatParamOverride.java @@ -140,6 +140,9 @@ public final class MatParamOverride extends MatParam { super.write(ex); OutputCapsule oc = ex.getCapsule(this); oc.write(enabled, "enabled", true); + if (value == null) { + oc.write(true, "isNull", false); + } } @Override @@ -147,5 +150,9 @@ public final class MatParamOverride extends MatParam { super.read(im); InputCapsule ic = im.getCapsule(this); enabled = ic.readBoolean("enabled", true); + boolean isNull = ic.readBoolean("isNull", false); + if (isNull) { + setValue(null); + } } } diff --git a/jme3-core/src/main/java/com/jme3/material/Material.java b/jme3-core/src/main/java/com/jme3/material/Material.java index a14bc357d..ddd75ace7 100644 --- a/jme3-core/src/main/java/com/jme3/material/Material.java +++ b/jme3-core/src/main/java/com/jme3/material/Material.java @@ -46,10 +46,7 @@ import com.jme3.renderer.RenderManager; import com.jme3.renderer.Renderer; import com.jme3.renderer.queue.RenderQueue.Bucket; import com.jme3.scene.Geometry; -import com.jme3.shader.Shader; -import com.jme3.shader.Uniform; -import com.jme3.shader.UniformBindingManager; -import com.jme3.shader.VarType; +import com.jme3.shader.*; import com.jme3.texture.Image; import com.jme3.texture.Texture; import com.jme3.texture.image.ColorSpace; @@ -412,6 +409,17 @@ public class Material implements CloneableSmartAsset, Cloneable, Savable { return paramValues.get(name); } + /** + * Returns the current parameter's value. + * + * @param name the parameter name to look up. + * @return current value or null if the parameter wasn't set. + */ + public T getParamValue(final String name) { + final MatParam param = paramValues.get(name); + return param == null ? null : (T) param.getValue(); + } + /** * Returns the texture parameter set on this material with the given name, * returns null if the parameter is not set. @@ -660,6 +668,28 @@ public class Material implements CloneableSmartAsset, Cloneable, Savable { setParam(name, VarType.Vector4, value); } + /** + * Pass an uniform buffer object to the material shader. + * + * @param name the name of the buffer object defined in the material definition (j3md). + * @param value the buffer object. + */ + public void setUniformBufferObject(final String name, final BufferObject value) { + value.setBufferType(BufferObject.BufferType.UniformBufferObject); + setParam(name, VarType.BufferObject, value); + } + + /** + * Pass a shader storage buffer object to the material shader. + * + * @param name the name of the buffer object defined in the material definition (j3md). + * @param value the buffer object. + */ + public void setShaderStorageBufferObject(final String name, final BufferObject value) { + value.setBufferType(BufferObject.BufferType.ShaderStorageBufferObject); + setParam(name, VarType.BufferObject, value); + } + /** * Pass a Vector2f to the material shader. * @@ -794,20 +824,29 @@ public class Material implements CloneableSmartAsset, Cloneable, Savable { } for (int i = 0; i < paramValues.size(); i++) { + MatParam param = paramValues.getValue(i); VarType type = param.getVarType(); - Uniform uniform = shader.getUniform(param.getPrefixedName()); - if (uniform.isSetByCurrentMaterial()) { - continue; - } + if (isBO(type)) { + + final ShaderBufferBlock bufferBlock = shader.getBufferBlock(param.getPrefixedName()); + bufferBlock.setBufferObject((BufferObject) param.getValue()); - if (type.isTextureType()) { - renderer.setTexture(unit, (Texture) param.getValue()); - uniform.setValue(VarType.Int, unit); - unit++; } else { - uniform.setValue(type, param.getValue()); + + Uniform uniform = shader.getUniform(param.getPrefixedName()); + if (uniform.isSetByCurrentMaterial()) { + continue; + } + + if (type.isTextureType()) { + renderer.setTexture(unit, (Texture) param.getValue()); + uniform.setValue(VarType.Int, unit); + unit++; + } else { + uniform.setValue(type, param.getValue()); + } } } @@ -815,6 +854,16 @@ public class Material implements CloneableSmartAsset, Cloneable, Savable { return unit; } + /** + * Returns true if the type is Buffer Object's type. + * + * @param type the material parameter type. + * @return true if the type is Buffer Object's type. + */ + private boolean isBO(final VarType type) { + return type == VarType.BufferObject; + } + private void updateRenderState(RenderManager renderManager, Renderer renderer, TechniqueDef techniqueDef) { if (renderManager.getForcedRenderState() != null) { renderer.applyRenderState(renderManager.getForcedRenderState()); @@ -836,7 +885,7 @@ public class Material implements CloneableSmartAsset, Cloneable, Savable { * * @param renderManager The render manager to preload for */ - public void preload(RenderManager renderManager) { + public void preload(RenderManager renderManager, Geometry geometry) { if (technique == null) { selectTechnique(TechniqueDef.DEFAULT_TECHNIQUE_NAME, renderManager); } @@ -847,9 +896,11 @@ public class Material implements CloneableSmartAsset, Cloneable, Savable { if (techniqueDef.isNoRender()) { return; } + // Get world overrides + SafeArrayList overrides = geometry.getWorldMatParamOverrides(); - Shader shader = technique.makeCurrent(renderManager, null, null, null, rendererCaps); - updateShaderMaterialParameters(renderer, shader, null, null); + Shader shader = technique.makeCurrent(renderManager, overrides, null, null, rendererCaps); + updateShaderMaterialParameters(renderer, shader, overrides, null); renderManager.getRenderer().setShader(shader); } diff --git a/jme3-core/src/main/java/com/jme3/material/Materials.java b/jme3-core/src/main/java/com/jme3/material/Materials.java new file mode 100644 index 000000000..00959d15e --- /dev/null +++ b/jme3-core/src/main/java/com/jme3/material/Materials.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2009-2018 jMonkeyEngine + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'jMonkeyEngine' nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package com.jme3.material; + +/** + * This class is to provide some constants materials. + * + * @author oualid + */ +public class Materials { + + public static final String UNSHADED = "Common/MatDefs/Misc/Unshaded.j3md"; + public static final String LIGHTING = "Common/MatDefs/Light/Lighting.j3md"; + public static final String PBR = "Common/MatDefs/Light/PBRLighting.j3md"; + +} \ No newline at end of file diff --git a/jme3-core/src/main/java/com/jme3/material/RenderState.java b/jme3-core/src/main/java/com/jme3/material/RenderState.java index f6236efd0..d2a557c65 100644 --- a/jme3-core/src/main/java/com/jme3/material/RenderState.java +++ b/jme3-core/src/main/java/com/jme3/material/RenderState.java @@ -331,9 +331,17 @@ public class RenderState implements Cloneable, Savable { */ Exclusion, /** - * Allows for custom blending by using glBlendFuncSeparate. + * Uses the blend equations and blend factors defined by the render state. *

- * + * These attributes can be set by using the following methods: + *

    + *
  • {@link RenderState#setBlendEquation(BlendEquation)}
    + *
  • {@link RenderState#setBlendEquationAlpha(BlendEquationAlpha)}
    + *
  • {@link RenderState#setCustomBlendFactors(BlendFunc, BlendFunc, BlendFunc, BlendFunc)}
    + *
+ *

+ * Result.RGB = BlendEquation( sfactorRGB * Source.RGB , dfactorRGB * Destination.RGB )
+ * Result.A = BlendEquationAlpha( sfactorAlpha * Source.A , dfactorAlpha * Destination.A ) */ Custom } @@ -425,8 +433,6 @@ public class RenderState implements Cloneable, Savable { ADDITIONAL.applyDepthWrite = false; ADDITIONAL.applyDepthTest = false; ADDITIONAL.applyColorWrite = false; - ADDITIONAL.applyBlendEquation = false; - ADDITIONAL.applyBlendEquationAlpha = false; ADDITIONAL.applyBlendMode = false; ADDITIONAL.applyPolyOffset = false; } @@ -441,9 +447,7 @@ public class RenderState implements Cloneable, Savable { boolean colorWrite = true; boolean applyColorWrite = true; BlendEquation blendEquation = BlendEquation.Add; - boolean applyBlendEquation = true; BlendEquationAlpha blendEquationAlpha = BlendEquationAlpha.InheritColor; - boolean applyBlendEquationAlpha = true; BlendMode blendMode = BlendMode.Off; boolean applyBlendMode = true; float offsetFactor = 0; @@ -466,10 +470,10 @@ public class RenderState implements Cloneable, Savable { TestFunction frontStencilFunction = TestFunction.Always; TestFunction backStencilFunction = TestFunction.Always; int cachedHashCode = -1; - BlendFunc sfactorRGB=BlendFunc.One; - BlendFunc dfactorRGB=BlendFunc.Zero; - BlendFunc sfactorAlpha=BlendFunc.One; - BlendFunc dfactorAlpha=BlendFunc.Zero; + BlendFunc sfactorRGB = BlendFunc.One; + BlendFunc dfactorRGB = BlendFunc.One; + BlendFunc sfactorAlpha = BlendFunc.One; + BlendFunc dfactorAlpha = BlendFunc.One; public void write(JmeExporter ex) throws IOException { OutputCapsule oc = ex.getCapsule(this); @@ -507,8 +511,6 @@ public class RenderState implements Cloneable, Savable { oc.write(applyDepthWrite, "applyDepthWrite", true); oc.write(applyDepthTest, "applyDepthTest", true); oc.write(applyColorWrite, "applyColorWrite", true); - oc.write(applyBlendEquation, "applyBlendEquation", true); - oc.write(applyBlendEquationAlpha, "applyBlendEquationAlpha", true); oc.write(applyBlendMode, "applyBlendMode", true); oc.write(applyPolyOffset, "applyPolyOffset", true); oc.write(applyDepthFunc, "applyDepthFunc", true); @@ -541,9 +543,9 @@ public class RenderState implements Cloneable, Savable { depthFunc = ic.readEnum("depthFunc", TestFunction.class, TestFunction.LessOrEqual); lineWidth = ic.readFloat("lineWidth", 1); sfactorRGB = ic.readEnum("sfactorRGB", BlendFunc.class, BlendFunc.One); - dfactorAlpha = ic.readEnum("dfactorRGB", BlendFunc.class, BlendFunc.Zero); + dfactorAlpha = ic.readEnum("dfactorRGB", BlendFunc.class, BlendFunc.One); sfactorRGB = ic.readEnum("sfactorAlpha", BlendFunc.class, BlendFunc.One); - dfactorAlpha = ic.readEnum("dfactorAlpha", BlendFunc.class, BlendFunc.Zero); + dfactorAlpha = ic.readEnum("dfactorAlpha", BlendFunc.class, BlendFunc.One); applyWireFrame = ic.readBoolean("applyWireFrame", true); @@ -551,14 +553,11 @@ public class RenderState implements Cloneable, Savable { applyDepthWrite = ic.readBoolean("applyDepthWrite", true); applyDepthTest = ic.readBoolean("applyDepthTest", true); applyColorWrite = ic.readBoolean("applyColorWrite", true); - applyBlendEquation = ic.readBoolean("applyBlendEquation", true); - applyBlendEquationAlpha = ic.readBoolean("applyBlendEquationAlpha", true); applyBlendMode = ic.readBoolean("applyBlendMode", true); applyPolyOffset = ic.readBoolean("applyPolyOffset", true); applyDepthFunc = ic.readBoolean("applyDepthFunc", true); applyLineWidth = ic.readBoolean("applyLineWidth", true); - } /** @@ -615,19 +614,32 @@ public class RenderState implements Cloneable, Savable { return false; } - if (blendEquation != rs.blendEquation) { + if (blendMode != rs.blendMode) { return false; } - if (blendEquationAlpha != rs.blendEquationAlpha) { - return false; - } + if (blendMode == BlendMode.Custom) { + if (blendEquation != rs.blendEquation) { + return false; + } + if (blendEquationAlpha != rs.blendEquationAlpha) { + return false; + } - if (blendMode != rs.blendMode) { - return false; + if (sfactorRGB != rs.sfactorRGB) { + return false; + } + if (dfactorRGB != rs.dfactorRGB) { + return false; + } + if (sfactorAlpha != rs.sfactorAlpha) { + return false; + } + if (dfactorAlpha != rs.dfactorAlpha) { + return false; + } } - if (offsetEnabled != rs.offsetEnabled) { return false; } @@ -675,14 +687,6 @@ public class RenderState implements Cloneable, Savable { if(lineWidth != rs.lineWidth){ return false; } - - if (blendMode.equals(BlendMode.Custom)) { - return sfactorRGB==rs.getCustomSfactorRGB() - && dfactorRGB==rs.getCustomDfactorRGB() - && sfactorAlpha==rs.getCustomSfactorAlpha() - && dfactorAlpha==rs.getCustomDfactorAlpha(); - - } return true; } @@ -768,80 +772,68 @@ public class RenderState implements Cloneable, Savable { } /** - * Set the blending equation. + * Set the blending equation for the color component (RGB). *

- * When blending is enabled, (blendMode is not - * {@link BlendMode#Off}) the input pixel will be blended with the pixel - * already in the color buffer. The blending equation is determined by the - * {@link BlendEquation}. For example, the mode {@link BlendMode#Additive} - * and {@link BlendEquation#Add} will add the input pixel's color to the - * color already in the color buffer: + * The blending equation determines, how the RGB values of the input pixel + * will be blended with the RGB values of the pixel already in the color buffer.
+ * For example, {@link BlendEquation#Add} will add the input pixel's color + * to the color already in the color buffer: *
* Result = Source Color + Destination Color - *
- * However, the mode {@link BlendMode#Additive} - * and {@link BlendEquation#Subtract} will subtract the input pixel's color to the - * color already in the color buffer: - *
- * Result = Source Color - Destination Color + *

+ * Note: This gets only used in {@link BlendMode#Custom} mode. + * All other blend modes will ignore this setting. * - * @param blendEquation The blend equation to use. + * @param blendEquation The {@link BlendEquation} to use. */ public void setBlendEquation(BlendEquation blendEquation) { - applyBlendEquation = true; this.blendEquation = blendEquation; cachedHashCode = -1; } - + /** * Set the blending equation for the alpha component. *

- * When blending is enabled, (blendMode is not - * {@link BlendMode#Off}) the input pixel will be blended with the pixel - * already in the color buffer. The blending equation is determined by the - * {@link BlendEquation} and can be overrode for the alpha component using - * the {@link BlendEquationAlpha} . For example, the mode - * {@link BlendMode#Additive} and {@link BlendEquationAlpha#Add} will add - * the input pixel's alpha to the alpha component already in the color - * buffer: + * The alpha blending equation determines, how the alpha values of the input pixel + * will be blended with the alpha values of the pixel already in the color buffer.
+ * For example, {@link BlendEquationAlpha#Add} will add the input pixel's color + * to the color already in the color buffer: *
- * Result = Source Alpha + Destination Alpha - *
- * However, the mode {@link BlendMode#Additive} and - * {@link BlendEquationAlpha#Subtract} will subtract the input pixel's alpha - * to the alpha component already in the color buffer: - *
- * Result = Source Alpha - Destination Alpha + * Result = Source Color + Destination Color + *

+ * Note: This gets only used in {@link BlendMode#Custom} mode. + * All other blend modes will ignore this setting. * - * @param blendEquationAlpha The blend equation to use for the alpha - * component. + * @param blendEquationAlpha The {@link BlendEquationAlpha} to use. */ public void setBlendEquationAlpha(BlendEquationAlpha blendEquationAlpha) { - applyBlendEquationAlpha = true; this.blendEquationAlpha = blendEquationAlpha; cachedHashCode = -1; } - /** - * Sets the custom blend factors for BlendMode.Custom as - * defined by the appropriate BlendFunc. - * + * Sets the blend factors used for the source and destination color. + *

+ * These factors will be multiplied with the color values of the input pixel + * and the pixel already in the color buffer, before both colors gets combined by the {@link BlendEquation}. + *

+ * Note: This gets only used in {@link BlendMode#Custom} mode. + * All other blend modes will ignore this setting. + * * @param sfactorRGB The source blend factor for RGB components. * @param dfactorRGB The destination blend factor for RGB components. * @param sfactorAlpha The source blend factor for the alpha component. * @param dfactorAlpha The destination blend factor for the alpha component. */ - public void setCustomBlendFactors(BlendFunc sfactorRGB, BlendFunc dfactorRGB, BlendFunc sfactorAlpha, BlendFunc dfactorAlpha) - { + public void setCustomBlendFactors(BlendFunc sfactorRGB, BlendFunc dfactorRGB, BlendFunc sfactorAlpha, BlendFunc dfactorAlpha) { this.sfactorRGB = sfactorRGB; this.dfactorRGB = dfactorRGB; this.sfactorAlpha = sfactorAlpha; this.dfactorAlpha = dfactorAlpha; cachedHashCode = -1; } - - + + /** * Enable depth testing. * @@ -1374,14 +1366,6 @@ public class RenderState implements Cloneable, Savable { return applyBlendMode; } - public boolean isApplyBlendEquation() { - return applyBlendEquation; - } - - public boolean isApplyBlendEquationAlpha() { - return applyBlendEquationAlpha; - } - public boolean isApplyColorWrite() { return applyColorWrite; } @@ -1511,27 +1495,26 @@ public class RenderState implements Cloneable, Savable { } else { state.colorWrite = colorWrite; } - if (additionalState.applyBlendEquation) { - state.blendEquation = additionalState.blendEquation; - } else { - state.blendEquation = blendEquation; - } - if (additionalState.applyBlendEquationAlpha) { - state.blendEquationAlpha = additionalState.blendEquationAlpha; - } else { - state.blendEquationAlpha = blendEquationAlpha; - } if (additionalState.applyBlendMode) { state.blendMode = additionalState.blendMode; - if (additionalState.getBlendMode().equals(BlendMode.Custom)) { - state.setCustomBlendFactors( - additionalState.getCustomSfactorRGB(), - additionalState.getCustomDfactorRGB(), - additionalState.getCustomSfactorAlpha(), - additionalState.getCustomDfactorAlpha()); + if (additionalState.blendMode == BlendMode.Custom) { + state.blendEquation = additionalState.blendEquation; + state.blendEquationAlpha = additionalState.blendEquationAlpha; + state.sfactorRGB = additionalState.sfactorRGB; + state.dfactorRGB = additionalState.dfactorRGB; + state.sfactorAlpha = additionalState.sfactorAlpha; + state.dfactorAlpha = additionalState.dfactorAlpha; } } else { state.blendMode = blendMode; + if (blendMode == BlendMode.Custom) { + state.blendEquation = blendEquation; + state.blendEquationAlpha = blendEquationAlpha; + state.sfactorRGB = sfactorRGB; + state.dfactorRGB = dfactorRGB; + state.sfactorAlpha = sfactorAlpha; + state.dfactorAlpha = dfactorAlpha; + } } if (additionalState.applyPolyOffset) { @@ -1608,8 +1591,6 @@ public class RenderState implements Cloneable, Savable { applyDepthWrite = true; applyDepthTest = true; applyColorWrite = true; - applyBlendEquation = true; - applyBlendEquationAlpha = true; applyBlendMode = true; applyPolyOffset = true; applyDepthFunc = true; @@ -1636,8 +1617,6 @@ public class RenderState implements Cloneable, Savable { + "\ncolorWrite=" + colorWrite + "\napplyColorWrite=" + applyColorWrite + "\nblendEquation=" + blendEquation - + "\napplyBlendEquation=" + applyBlendEquation - + "\napplyBlendEquationAlpha=" + applyBlendEquationAlpha + "\nblendMode=" + blendMode + "\napplyBlendMode=" + applyBlendMode + "\noffsetEnabled=" + offsetEnabled diff --git a/jme3-core/src/main/java/com/jme3/material/ShaderGenerationInfo.java b/jme3-core/src/main/java/com/jme3/material/ShaderGenerationInfo.java index dda02c67c..3a42ee328 100644 --- a/jme3-core/src/main/java/com/jme3/material/ShaderGenerationInfo.java +++ b/jme3-core/src/main/java/com/jme3/material/ShaderGenerationInfo.java @@ -206,7 +206,9 @@ public class ShaderGenerationInfo implements Savable, Cloneable { clone.vertexUniforms.add(uniform.clone()); } - clone.vertexGlobal = vertexGlobal.clone(); + if (vertexGlobal != null) { + clone.vertexGlobal = vertexGlobal.clone(); + } for (ShaderNodeVariable varying : varyings) { clone.varyings.add(varying.clone()); diff --git a/jme3-core/src/main/java/com/jme3/material/TechniqueDef.java b/jme3-core/src/main/java/com/jme3/material/TechniqueDef.java index 882d2b63a..1b0111522 100644 --- a/jme3-core/src/main/java/com/jme3/material/TechniqueDef.java +++ b/jme3-core/src/main/java/com/jme3/material/TechniqueDef.java @@ -188,6 +188,7 @@ public class TechniqueDef implements Savable, Cloneable { defineTypes = new ArrayList(); paramToDefineId = new HashMap(); definesToShaderMap = new HashMap(); + worldBinds = new ArrayList<>(); } /** @@ -513,10 +514,8 @@ public class TechniqueDef implements Savable, Cloneable { } } - if (getWorldBindings() != null) { - for (UniformBinding binding : getWorldBindings()) { - shader.addUniformBinding(binding); - } + for (final UniformBinding binding : getWorldBindings()) { + shader.addUniformBinding(binding); } return shader; @@ -625,14 +624,10 @@ public class TechniqueDef implements Savable, Cloneable { * to the list of world parameters, false otherwise. */ public boolean addWorldParam(String name) { - if (worldBinds == null){ - worldBinds = new ArrayList(); - } - try { - worldBinds.add( UniformBinding.valueOf(name) ); + worldBinds.add(UniformBinding.valueOf(name)); return true; - } catch (IllegalArgumentException ex){ + } catch (IllegalArgumentException ex) { return false; } } @@ -821,10 +816,8 @@ public class TechniqueDef implements Savable, Cloneable { e.printStackTrace(); } - if (worldBinds != null) { - clone.worldBinds = new ArrayList<>(worldBinds.size()); - clone.worldBinds.addAll(worldBinds); - } + clone.worldBinds = new ArrayList<>(worldBinds.size()); + clone.worldBinds.addAll(worldBinds); return clone; } diff --git a/jme3-core/src/main/java/com/jme3/material/logic/MultiPassLightingLogic.java b/jme3-core/src/main/java/com/jme3/material/logic/MultiPassLightingLogic.java index 61e9f26cb..d239681bc 100644 --- a/jme3-core/src/main/java/com/jme3/material/logic/MultiPassLightingLogic.java +++ b/jme3-core/src/main/java/com/jme3/material/logic/MultiPassLightingLogic.java @@ -86,7 +86,7 @@ public final class MultiPassLightingLogic extends DefaultTechniqueDefLogic { for (int i = 0; i < lights.size(); i++) { Light l = lights.get(i); - if (l instanceof AmbientLight) { + if (l.getType() == Light.Type.Ambient || l.getType() == Light.Type.Probe) { continue; } @@ -156,8 +156,6 @@ public final class MultiPassLightingLogic extends DefaultTechniqueDefLogic { lightDir.setValue(VarType.Vector4, tmpLightDirection); - break; - case Probe: break; default: throw new UnsupportedOperationException("Unknown type of light: " + l.getType()); diff --git a/jme3-core/src/main/java/com/jme3/material/logic/SinglePassAndImageBasedLightingLogic.java b/jme3-core/src/main/java/com/jme3/material/logic/SinglePassAndImageBasedLightingLogic.java index 6f6254581..f80c8274a 100644 --- a/jme3-core/src/main/java/com/jme3/material/logic/SinglePassAndImageBasedLightingLogic.java +++ b/jme3-core/src/main/java/com/jme3/material/logic/SinglePassAndImageBasedLightingLogic.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2015 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -42,17 +42,17 @@ import com.jme3.scene.Geometry; import com.jme3.shader.*; import com.jme3.util.TempVars; -import java.util.EnumSet; +import java.util.*; public final class SinglePassAndImageBasedLightingLogic extends DefaultTechniqueDefLogic { private static final String DEFINE_SINGLE_PASS_LIGHTING = "SINGLE_PASS_LIGHTING"; private static final String DEFINE_NB_LIGHTS = "NB_LIGHTS"; - private static final String DEFINE_INDIRECT_LIGHTING = "INDIRECT_LIGHTING"; + private static final String DEFINE_NB_PROBES = "NB_PROBES"; private static final RenderState ADDITIVE_LIGHT = new RenderState(); private final ColorRGBA ambientLightColor = new ColorRGBA(0, 0, 0, 1); - private LightProbe lightProbe = null; + private List lightProbes = new ArrayList<>(3); static { ADDITIVE_LIGHT.setBlendMode(BlendMode.AlphaAdditive); @@ -61,13 +61,13 @@ public final class SinglePassAndImageBasedLightingLogic extends DefaultTechnique private final int singlePassLightingDefineId; private final int nbLightsDefineId; - private final int indirectLightingDefineId; + private final int nbProbesDefineId; public SinglePassAndImageBasedLightingLogic(TechniqueDef techniqueDef) { super(techniqueDef); singlePassLightingDefineId = techniqueDef.addShaderUnmappedDefine(DEFINE_SINGLE_PASS_LIGHTING, VarType.Boolean); nbLightsDefineId = techniqueDef.addShaderUnmappedDefine(DEFINE_NB_LIGHTS, VarType.Int); - indirectLightingDefineId = techniqueDef.addShaderUnmappedDefine(DEFINE_INDIRECT_LIGHTING, VarType.Boolean); + nbProbesDefineId = techniqueDef.addShaderUnmappedDefine(DEFINE_NB_PROBES, VarType.Int); } @Override @@ -81,12 +81,9 @@ public final class SinglePassAndImageBasedLightingLogic extends DefaultTechnique //Though the second pass should not render IBL as it is taken care of on first pass like ambient light in phong lighting. //We cannot change the define between passes and the old technique, and for some reason the code fails on mac (renders nothing). if(lights != null) { - lightProbe = extractIndirectLights(lights, false); - if (lightProbe == null) { - defines.set(indirectLightingDefineId, false); - } else { - defines.set(indirectLightingDefineId, true); - } + lightProbes.clear(); + extractIndirectLights(lights, false); + defines.set(nbProbesDefineId, lightProbes.size()); } return super.makeCurrent(assetManager, renderManager, rendererCaps, lights, defines); @@ -113,35 +110,44 @@ public final class SinglePassAndImageBasedLightingLogic extends DefaultTechnique Uniform lightData = shader.getUniform("g_LightData"); lightData.setVector4Length(numLights * 3);//8 lights * max 3 Uniform ambientColor = shader.getUniform("g_AmbientLightColor"); + + // Matrix4f Uniform lightProbeData = shader.getUniform("g_LightProbeData"); - lightProbeData.setVector4Length(1); + Uniform lightProbeData2 = shader.getUniform("g_LightProbeData2"); + Uniform lightProbeData3 = shader.getUniform("g_LightProbeData3"); - //TODO These 2 uniforms should be packed in an array, to ba able to have several probes and blend between them. Uniform shCoeffs = shader.getUniform("g_ShCoeffs"); Uniform lightProbePemMap = shader.getUniform("g_PrefEnvMap"); + Uniform shCoeffs2 = shader.getUniform("g_ShCoeffs2"); + Uniform lightProbePemMap2 = shader.getUniform("g_PrefEnvMap2"); + Uniform shCoeffs3 = shader.getUniform("g_ShCoeffs3"); + Uniform lightProbePemMap3 = shader.getUniform("g_PrefEnvMap3"); - lightProbe = null; + lightProbes.clear(); if (startIndex != 0) { // apply additive blending for 2nd and future passes rm.getRenderer().applyRenderState(ADDITIVE_LIGHT); ambientColor.setValue(VarType.Vector4, ColorRGBA.Black); }else{ - lightProbe = extractIndirectLights(lightList,true); + extractIndirectLights(lightList,true); ambientColor.setValue(VarType.Vector4, ambientLightColor); } //If there is a lightProbe in the list we force its render on the first pass - if(lightProbe != null){ - BoundingSphere s = (BoundingSphere)lightProbe.getBounds(); - lightProbeData.setVector4InArray(lightProbe.getPosition().x, lightProbe.getPosition().y, lightProbe.getPosition().z, 1f / s.getRadius() + lightProbe.getNbMipMaps(), 0); - shCoeffs.setValue(VarType.Vector3Array, lightProbe.getShCoeffs()); - //assigning new texture indexes - int pemUnit = lastTexUnit++; - rm.getRenderer().setTexture(pemUnit, lightProbe.getPrefilteredEnvMap()); - lightProbePemMap.setValue(VarType.Int, pemUnit); + if (!lightProbes.isEmpty()) { + LightProbe lightProbe = lightProbes.get(0); + lastTexUnit = setProbeData(rm, lastTexUnit, lightProbeData, shCoeffs, lightProbePemMap, lightProbe); + if (lightProbes.size() > 1) { + lightProbe = lightProbes.get(1); + lastTexUnit = setProbeData(rm, lastTexUnit, lightProbeData2, shCoeffs2, lightProbePemMap2, lightProbe); + } + if (lightProbes.size() > 2) { + lightProbe = lightProbes.get(2); + setProbeData(rm, lastTexUnit, lightProbeData3, shCoeffs3, lightProbePemMap3, lightProbe); + } } else { //Disable IBL for this pass - lightProbeData.setVector4InArray(0,0,0,-1, 0); + lightProbeData.setValue(VarType.Matrix4, LightProbe.FALLBACK_MATRIX); } int lightDataIndex = 0; @@ -222,6 +228,18 @@ public final class SinglePassAndImageBasedLightingLogic extends DefaultTechnique return curIndex; } + private int setProbeData(RenderManager rm, int lastTexUnit, Uniform lightProbeData, Uniform shCoeffs, Uniform lightProbePemMap, LightProbe lightProbe) { + + lightProbeData.setValue(VarType.Matrix4, lightProbe.getUniformMatrix()); + //setVector4InArray(lightProbe.getPosition().x, lightProbe.getPosition().y, lightProbe.getPosition().z, 1f / area.getRadius() + lightProbe.getNbMipMaps(), 0); + shCoeffs.setValue(VarType.Vector3Array, lightProbe.getShCoeffs()); + //assigning new texture indexes + int pemUnit = lastTexUnit++; + rm.getRenderer().setTexture(pemUnit, lightProbe.getPrefilteredEnvMap()); + lightProbePemMap.setValue(VarType.Int, pemUnit); + return lastTexUnit; + } + @Override public void render(RenderManager renderManager, Shader shader, Geometry geometry, LightList lights, int lastTexUnit) { int nbRenderedLights = 0; @@ -241,9 +259,8 @@ public final class SinglePassAndImageBasedLightingLogic extends DefaultTechnique return; } - protected LightProbe extractIndirectLights(LightList lightList, boolean removeLights) { + protected void extractIndirectLights(LightList lightList, boolean removeLights) { ambientLightColor.set(0, 0, 0, 1); - LightProbe probe = null; for (int j = 0; j < lightList.size(); j++) { Light l = lightList.get(j); if (l instanceof AmbientLight) { @@ -254,7 +271,7 @@ public final class SinglePassAndImageBasedLightingLogic extends DefaultTechnique } } if (l instanceof LightProbe) { - probe = (LightProbe)l; + lightProbes.add((LightProbe) l); if(removeLights){ lightList.remove(l); j--; @@ -262,6 +279,5 @@ public final class SinglePassAndImageBasedLightingLogic extends DefaultTechnique } } ambientLightColor.a = 1.0f; - return probe; } } diff --git a/jme3-core/src/main/java/com/jme3/material/logic/SinglePassLightingLogic.java b/jme3-core/src/main/java/com/jme3/material/logic/SinglePassLightingLogic.java index 015d6b1da..67261742e 100644 --- a/jme3-core/src/main/java/com/jme3/material/logic/SinglePassLightingLogic.java +++ b/jme3-core/src/main/java/com/jme3/material/logic/SinglePassLightingLogic.java @@ -106,7 +106,6 @@ public final class SinglePassLightingLogic extends DefaultTechniqueDefLogic { lightData.setVector4Length(numLights * 3);//8 lights * max 3 Uniform ambientColor = shader.getUniform("g_AmbientLightColor"); - if (startIndex != 0) { // apply additive blending for 2nd and future passes rm.getRenderer().applyRenderState(ADDITIVE_LIGHT); @@ -123,7 +122,7 @@ public final class SinglePassLightingLogic extends DefaultTechniqueDefLogic { for (curIndex = startIndex; curIndex < endIndex && curIndex < lightList.size(); curIndex++) { Light l = lightList.get(curIndex); - if (l.getType() == Light.Type.Ambient) { + if (l.getType() == Light.Type.Ambient || l.getType() == Light.Type.Probe) { endIndex++; continue; } @@ -185,8 +184,6 @@ public final class SinglePassLightingLogic extends DefaultTechniqueDefLogic { lightData.setVector4InArray(tmpVec.getX(), tmpVec.getY(), tmpVec.getZ(), spotAngleCos, lightDataIndex); lightDataIndex++; break; - case Probe: - break; default: throw new UnsupportedOperationException("Unknown type of light: " + l.getType()); } diff --git a/jme3-core/src/main/java/com/jme3/math/ColorRGBA.java b/jme3-core/src/main/java/com/jme3/math/ColorRGBA.java index 89df1bb2b..f403bbaa6 100644 --- a/jme3-core/src/main/java/com/jme3/math/ColorRGBA.java +++ b/jme3-core/src/main/java/com/jme3/math/ColorRGBA.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine All rights reserved. + * Copyright (c) 2009-2018 jMonkeyEngine All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -558,11 +558,24 @@ public final class ColorRGBA implements Savable, Cloneable, java.io.Serializable a = ((byte) (color) & 0xFF) / 255f; return this; } + /** + * Sets the RGBA values of this ColorRGBA with the given combined ABGR value + * Bits 24-31 are alpha, bits 16-23 are blue, bits 8-15 are green, bits 0-7 are red. + * @param color The integer ABGR value used to set this object. + * @return this + */ + public ColorRGBA fromIntABGR(int color) { + a = ((byte) (color >> 24) & 0xFF) / 255f; + b = ((byte) (color >> 16) & 0xFF) / 255f; + g = ((byte) (color >> 8) & 0xFF) / 255f; + r = ((byte) (color) & 0xFF) / 255f; + return this; + } /** * Transform this ColorRGBA to a Vector3f using * x = r, y = g, z = b. The Alpha value is not used. - * This method is useful to use for shaders assignment. + * This method is useful for shader assignments. * @return A Vector3f containing the RGB value of this ColorRGBA. */ public Vector3f toVector3f() { @@ -572,7 +585,7 @@ public final class ColorRGBA implements Savable, Cloneable, java.io.Serializable /** * Transform this ColorRGBA to a Vector4f using * x = r, y = g, z = b, w = a. - * This method is useful to use for shaders assignment. + * This method is useful for shader assignments. * @return A Vector4f containing the RGBA value of this ColorRGBA. */ public Vector4f toVector4f() { @@ -587,8 +600,8 @@ public final class ColorRGBA implements Savable, Cloneable, java.io.Serializable * Note that the values will be gamma corrected to be stored in linear space * GAMMA value is 2.2 * - * Note that no correction will be performed on the alpha channel as it's - * conventionnally doesn't represent a color itself + * Note that no correction will be performed on the alpha channel as it + * conventionally doesn't represent a color itself * * @param r the red value in sRGB color space * @param g the green value in sRGB color space diff --git a/jme3-core/src/main/java/com/jme3/math/EaseFunction.java b/jme3-core/src/main/java/com/jme3/math/EaseFunction.java new file mode 100644 index 000000000..c2f5383f2 --- /dev/null +++ b/jme3-core/src/main/java/com/jme3/math/EaseFunction.java @@ -0,0 +1,13 @@ +package com.jme3.math; + +/** + * Created by Nehon on 26/03/2017. + */ +public interface EaseFunction { + + /** + * @param value a value from 0 to 1. Passing a value out of this range will have unexpected behavior. + * @return + */ + float apply(float value); +} diff --git a/jme3-core/src/main/java/com/jme3/math/Easing.java b/jme3-core/src/main/java/com/jme3/math/Easing.java new file mode 100644 index 000000000..e9969c91a --- /dev/null +++ b/jme3-core/src/main/java/com/jme3/math/Easing.java @@ -0,0 +1,163 @@ +package com.jme3.math; + +/** + * Expose several Easing function from Robert Penner + * Created by Nehon on 26/03/2017. + */ +public class Easing { + + + public static EaseFunction constant = new EaseFunction() { + @Override + public float apply(float value) { + return 0; + } + }; + /** + * In + */ + public static EaseFunction linear = new EaseFunction() { + @Override + public float apply(float value) { + return value; + } + }; + + public static EaseFunction inQuad = new EaseFunction() { + @Override + public float apply(float value) { + return value * value; + } + }; + + public static EaseFunction inCubic = new EaseFunction() { + @Override + public float apply(float value) { + return value * value * value; + } + }; + + public static EaseFunction inQuart = new EaseFunction() { + @Override + public float apply(float value) { + return value * value * value * value; + } + }; + + public static EaseFunction inQuint = new EaseFunction() { + @Override + public float apply(float value) { + return value * value * value * value * value; + } + }; + + + /** + * Out Elastic and bounce + */ + public static EaseFunction outElastic = new EaseFunction() { + @Override + public float apply(float value) { + return FastMath.pow(2f, -10f * value) * FastMath.sin((value - 0.3f / 4f) * (2f * FastMath.PI) / 0.3f) + 1f; + } + }; + + public static EaseFunction outBounce = new EaseFunction() { + @Override + public float apply(float value) { + if (value < (1f / 2.75f)) { + return (7.5625f * value * value); + } else if (value < (2f / 2.75f)) { + return (7.5625f * (value -= (1.5f / 2.75f)) * value + 0.75f); + } else if (value < (2.5 / 2.75)) { + return (7.5625f * (value -= (2.25f / 2.75f)) * value + 0.9375f); + } else { + return (7.5625f * (value -= (2.625f / 2.75f)) * value + 0.984375f); + } + } + }; + + /** + * In Elastic and bounce + */ + public static EaseFunction inElastic = new Invert(outElastic); + public static EaseFunction inBounce = new Invert(outBounce); + + /** + * Out + */ + public static EaseFunction outQuad = new Invert(inQuad); + public static EaseFunction outCubic = new Invert(inCubic); + public static EaseFunction outQuart = new Invert(inQuart); + public static EaseFunction outQuint = new Invert(inQuint); + + /** + * inOut + */ + public static EaseFunction inOutQuad = new InOut(inQuad, outQuad); + public static EaseFunction inOutCubic = new InOut(inCubic, outCubic); + public static EaseFunction inOutQuart = new InOut(inQuart, outQuart); + public static EaseFunction inOutQuint = new InOut(inQuint, outQuint); + public static EaseFunction inOutElastic = new InOut(inElastic, outElastic); + public static EaseFunction inOutBounce = new InOut(inBounce, outBounce); + + + /** + * Extra functions + */ + + public static EaseFunction smoothStep = new EaseFunction() { + @Override + public float apply(float t) { + return t * t * (3f - 2f * t); + } + }; + + public static EaseFunction smootherStep = new EaseFunction() { + @Override + public float apply(float t) { + return t * t * t * (t * (t * 6f - 15f) + 10f); + } + }; + + /** + * An Ease function composed of 2 sb function for custom in and out easing + */ + public static class InOut implements EaseFunction { + + private EaseFunction in; + private EaseFunction out; + + public InOut(EaseFunction in, EaseFunction out) { + this.in = in; + this.out = out; + } + + @Override + public float apply(float value) { + if (value < 0.5) { + value = value * 2; + return inQuad.apply(value) / 2; + } else { + value = (value - 0.5f) * 2; + return outQuad.apply(value) / 2 + 0.5f; + } + } + } + + private static class Invert implements EaseFunction { + + private EaseFunction func; + + public Invert(EaseFunction func) { + this.func = func; + } + + @Override + public float apply(float value) { + return 1f - func.apply(1f - value); + } + } + + +} diff --git a/jme3-core/src/main/java/com/jme3/math/FastMath.java b/jme3-core/src/main/java/com/jme3/math/FastMath.java index c1c3fa8a9..1bbf37fca 100644 --- a/jme3-core/src/main/java/com/jme3/math/FastMath.java +++ b/jme3-core/src/main/java/com/jme3/math/FastMath.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -860,7 +860,7 @@ final public class FastMath { } /** - * Takes an value and expresses it in terms of min to max. + * Takes a value and expresses it in terms of min to max. * * @param val - * the angle to normalize (in radians) diff --git a/jme3-core/src/main/java/com/jme3/math/MathUtils.java b/jme3-core/src/main/java/com/jme3/math/MathUtils.java new file mode 100644 index 000000000..8c22700b1 --- /dev/null +++ b/jme3-core/src/main/java/com/jme3/math/MathUtils.java @@ -0,0 +1,247 @@ +package com.jme3.math; + +import com.jme3.renderer.Camera; +import com.jme3.util.TempVars; + +/** + * Created by Nehon on 23/04/2017. + */ +public class MathUtils { + + public static Quaternion log(Quaternion q, Quaternion store) { + float a = FastMath.acos(q.w); + float sina = FastMath.sin(a); + + store.w = 0; + if (sina > 0) { + store.x = a * q.x / sina; + store.y = a * q.y / sina; + store.z = a * q.z / sina; + } else { + store.x = 0; + store.y = 0; + store.z = 0; + } + return store; + } + + public static Quaternion exp(Quaternion q, Quaternion store) { + + float len = FastMath.sqrt(q.x * q.x + q.y * q.y + q.z * q.z); + float sinLen = FastMath.sin(len); + float cosLen = FastMath.cos(len); + + store.w = cosLen; + if (len > 0) { + store.x = sinLen * q.x / len; + store.y = sinLen * q.y / len; + store.z = sinLen * q.z / len; + } else { + store.x = 0; + store.y = 0; + store.z = 0; + } + return store; + } + + //! This version of slerp, used by squad, does not check for theta > 90. + public static Quaternion slerpNoInvert(Quaternion q1, Quaternion q2, float t, Quaternion store) { + float dot = q1.dot(q2); + + if (dot > -0.95f && dot < 0.95f) { + float angle = FastMath.acos(dot); + float sin1 = FastMath.sin(angle * (1 - t)); + float sin2 = FastMath.sin(angle * t); + float sin3 = FastMath.sin(angle); + store.x = (q1.x * sin1 + q2.x * sin2) / sin3; + store.y = (q1.y * sin1 + q2.y * sin2) / sin3; + store.z = (q1.z * sin1 + q2.z * sin2) / sin3; + store.w = (q1.w * sin1 + q2.w * sin2) / sin3; + System.err.println("real slerp"); + } else { + // if the angle is small, use linear interpolation + store.set(q1).nlerp(q2, t); + System.err.println("nlerp"); + } + return store; + } + + public static Quaternion slerp(Quaternion q1, Quaternion q2, float t, Quaternion store) { + + float dot = (q1.x * q2.x) + (q1.y * q2.y) + (q1.z * q2.z) + + (q1.w * q2.w); + + if (dot < 0.0f) { + // Negate the second quaternion and the result of the dot product + q2.x = -q2.x; + q2.y = -q2.y; + q2.z = -q2.z; + q2.w = -q2.w; + dot = -dot; + } + + // Set the first and second scale for the interpolation + float scale0 = 1 - t; + float scale1 = t; + + // Check if the angle between the 2 quaternions was big enough to + // warrant such calculations + if (dot < 0.9f) {// Get the angle between the 2 quaternions, + // and then store the sin() of that angle + float theta = FastMath.acos(dot); + float invSinTheta = 1f / FastMath.sin(theta); + + // Calculate the scale for q1 and q2, according to the angle and + // it's sine value + scale0 = FastMath.sin((1 - t) * theta) * invSinTheta; + scale1 = FastMath.sin((t * theta)) * invSinTheta; + + // Calculate the x, y, z and w values for the quaternion by using a + // special + // form of linear interpolation for quaternions. + store.x = (scale0 * q1.x) + (scale1 * q2.x); + store.y = (scale0 * q1.y) + (scale1 * q2.y); + store.z = (scale0 * q1.z) + (scale1 * q2.z); + store.w = (scale0 * q1.w) + (scale1 * q2.w); + } else { + store.x = (scale0 * q1.x) + (scale1 * q2.x); + store.y = (scale0 * q1.y) + (scale1 * q2.y); + store.z = (scale0 * q1.z) + (scale1 * q2.z); + store.w = (scale0 * q1.w) + (scale1 * q2.w); + store.normalizeLocal(); + } + // Return the interpolated quaternion + return store; + } + +// //! Given 3 quaternions, qn-1,qn and qn+1, calculate a control point to be used in spline interpolation +// private static Quaternion spline(Quaternion qnm1, Quaternion qn, Quaternion qnp1, Quaternion store, Quaternion tmp) { +// store.set(-qn.x, -qn.y, -qn.z, qn.w); +// //store.set(qn).inverseLocal(); +// tmp.set(store); +// +// log(store.multLocal(qnm1), store); +// log(tmp.multLocal(qnp1), tmp); +// store.addLocal(tmp).multLocal(1f / -4f); +// exp(store, tmp); +// store.set(tmp).multLocal(qn); +// +// return store.normalizeLocal(); +// //return qn * (((qni * qnm1).log() + (qni * qnp1).log()) / -4).exp(); +// } + + //! Given 3 quaternions, qn-1,qn and qn+1, calculate a control point to be used in spline interpolation + private static Quaternion spline(Quaternion qnm1, Quaternion qn, Quaternion qnp1, Quaternion store, Quaternion tmp) { + Quaternion invQn = new Quaternion(-qn.x, -qn.y, -qn.z, qn.w); + + + log(invQn.mult(qnp1), tmp); + log(invQn.mult(qnm1), store); + store.addLocal(tmp).multLocal(-1f / 4f); + exp(store, tmp); + store.set(qn).multLocal(tmp); + + return store.normalizeLocal(); + //return qn * (((qni * qnm1).log() + (qni * qnp1).log()) / -4).exp(); + } + + + //! spherical cubic interpolation + public static Quaternion squad(Quaternion q0, Quaternion q1, Quaternion q2, Quaternion q3, Quaternion a, Quaternion b, float t, Quaternion store) { + + spline(q0, q1, q2, a, store); + spline(q1, q2, q3, b, store); + + slerp(a, b, t, store); + slerp(q1, q2, t, a); + return slerp(a, store, 2 * t * (1 - t), b); + //slerpNoInvert(a, b, t, store); + //slerpNoInvert(q1, q2, t, a); + //return slerpNoInvert(a, store, 2 * t * (1 - t), b); + +// quaternion c = slerpNoInvert(q1, q2, t), +// d = slerpNoInvert(a, b, t); +// return slerpNoInvert(c, d, 2 * t * (1 - t)); + } + + + /** + * Returns the shortest distance between a Ray and a segment. + * The segment is defined by a start position and an end position in world space + * The distance returned will be in world space (world units). + * If the camera parameter is not null the distance will be returned in screen space (pixels) + * + * @param ray The ray + * @param segStart The start position of the segment in world space + * @param segEnd The end position of the segment in world space + * @param camera The renderer camera if the distance is required in screen space. Null if the distance is required in world space + * @return the shortest distance between the ray and the segment or -1 if no solution is found. + */ + public static float raySegmentShortestDistance(Ray ray, Vector3f segStart, Vector3f segEnd, Camera camera) { + // Algorithm is ported from the C algorithm of + // Paul Bourke at http://local.wasp.uwa.edu.au/~pbourke/geometry/lineline3d/ + TempVars vars = TempVars.get(); + Vector3f resultSegmentPoint1 = vars.vect1; + Vector3f resultSegmentPoint2 = vars.vect2; + + Vector3f p1 = segStart; + Vector3f p2 = segEnd; + Vector3f p3 = ray.origin; + Vector3f p4 = vars.vect3.set(ray.getDirection()).multLocal(Math.min(ray.getLimit(), 1000)).addLocal(ray.getOrigin()); + Vector3f p13 = vars.vect4.set(p1).subtractLocal(p3); + Vector3f p43 = vars.vect5.set(p4).subtractLocal(p3); + + if (p43.lengthSquared() < 0.0001) { + vars.release(); + return -1; + } + Vector3f p21 = vars.vect6.set(p2).subtractLocal(p1); + if (p21.lengthSquared() < 0.0001) { + vars.release(); + return -1; + } + + double d1343 = p13.x * (double) p43.x + (double) p13.y * p43.y + (double) p13.z * p43.z; + double d4321 = p43.x * (double) p21.x + (double) p43.y * p21.y + (double) p43.z * p21.z; + double d1321 = p13.x * (double) p21.x + (double) p13.y * p21.y + (double) p13.z * p21.z; + double d4343 = p43.x * (double) p43.x + (double) p43.y * p43.y + (double) p43.z * p43.z; + double d2121 = p21.x * (double) p21.x + (double) p21.y * p21.y + (double) p21.z * p21.z; + + double denom = d2121 * d4343 - d4321 * d4321; + if (Math.abs(denom) < 0.0001) { + vars.release(); + return -1; + } + double numer = d1343 * d4321 - d1321 * d4343; + + double mua = numer / denom; + double mub = (d1343 + d4321 * (mua)) / d4343; + + resultSegmentPoint1.x = (float) (p1.x + mua * p21.x); + resultSegmentPoint1.y = (float) (p1.y + mua * p21.y); + resultSegmentPoint1.z = (float) (p1.z + mua * p21.z); + resultSegmentPoint2.x = (float) (p3.x + mub * p43.x); + resultSegmentPoint2.y = (float) (p3.y + mub * p43.y); + resultSegmentPoint2.z = (float) (p3.z + mub * p43.z); + + //check if result 1 is in the segment section. + float startToPoint = vars.vect3.set(resultSegmentPoint1).subtractLocal(segStart).lengthSquared(); + float endToPoint = vars.vect3.set(resultSegmentPoint1).subtractLocal(segEnd).lengthSquared(); + float segLength = vars.vect3.set(segEnd).subtractLocal(segStart).lengthSquared(); + if (startToPoint > segLength || endToPoint > segLength) { + vars.release(); + return -1; + } + + if (camera != null) { + //camera is not null let's convert the points in screen space + camera.getScreenCoordinates(resultSegmentPoint1, resultSegmentPoint1); + camera.getScreenCoordinates(resultSegmentPoint2, resultSegmentPoint2); + } + + float length = resultSegmentPoint1.subtractLocal(resultSegmentPoint2).length(); + vars.release(); + return length; + } + +} diff --git a/jme3-core/src/main/java/com/jme3/math/Matrix4f.java b/jme3-core/src/main/java/com/jme3/math/Matrix4f.java index 159e39932..6b260ee31 100644 --- a/jme3-core/src/main/java/com/jme3/math/Matrix4f.java +++ b/jme3-core/src/main/java/com/jme3/math/Matrix4f.java @@ -34,6 +34,7 @@ package com.jme3.math; import com.jme3.export.*; import com.jme3.util.BufferUtils; import com.jme3.util.TempVars; + import java.io.IOException; import java.nio.FloatBuffer; import java.util.logging.Logger; @@ -1023,96 +1024,95 @@ public final class Matrix4f implements Savable, Cloneable, java.io.Serializable store = new Matrix4f(); } - float temp00, temp01, temp02, temp03; - float temp10, temp11, temp12, temp13; - float temp20, temp21, temp22, temp23; - float temp30, temp31, temp32, temp33; + TempVars v = TempVars.get(); + float[] m = v.matrixWrite; - temp00 = m00 * in2.m00 + m[0] = m00 * in2.m00 + m01 * in2.m10 + m02 * in2.m20 + m03 * in2.m30; - temp01 = m00 * in2.m01 + m[1] = m00 * in2.m01 + m01 * in2.m11 + m02 * in2.m21 + m03 * in2.m31; - temp02 = m00 * in2.m02 + m[2] = m00 * in2.m02 + m01 * in2.m12 + m02 * in2.m22 + m03 * in2.m32; - temp03 = m00 * in2.m03 + m[3] = m00 * in2.m03 + m01 * in2.m13 + m02 * in2.m23 + m03 * in2.m33; - temp10 = m10 * in2.m00 + m[4] = m10 * in2.m00 + m11 * in2.m10 + m12 * in2.m20 + m13 * in2.m30; - temp11 = m10 * in2.m01 + m[5] = m10 * in2.m01 + m11 * in2.m11 + m12 * in2.m21 + m13 * in2.m31; - temp12 = m10 * in2.m02 + m[6] = m10 * in2.m02 + m11 * in2.m12 + m12 * in2.m22 + m13 * in2.m32; - temp13 = m10 * in2.m03 + m[7] = m10 * in2.m03 + m11 * in2.m13 + m12 * in2.m23 + m13 * in2.m33; - temp20 = m20 * in2.m00 + m[8] = m20 * in2.m00 + m21 * in2.m10 + m22 * in2.m20 + m23 * in2.m30; - temp21 = m20 * in2.m01 + m[9] = m20 * in2.m01 + m21 * in2.m11 + m22 * in2.m21 + m23 * in2.m31; - temp22 = m20 * in2.m02 + m[10] = m20 * in2.m02 + m21 * in2.m12 + m22 * in2.m22 + m23 * in2.m32; - temp23 = m20 * in2.m03 + m[11] = m20 * in2.m03 + m21 * in2.m13 + m22 * in2.m23 + m23 * in2.m33; - temp30 = m30 * in2.m00 + m[12] = m30 * in2.m00 + m31 * in2.m10 + m32 * in2.m20 + m33 * in2.m30; - temp31 = m30 * in2.m01 + m[13] = m30 * in2.m01 + m31 * in2.m11 + m32 * in2.m21 + m33 * in2.m31; - temp32 = m30 * in2.m02 + m[14] = m30 * in2.m02 + m31 * in2.m12 + m32 * in2.m22 + m33 * in2.m32; - temp33 = m30 * in2.m03 + m[15] = m30 * in2.m03 + m31 * in2.m13 + m32 * in2.m23 + m33 * in2.m33; - store.m00 = temp00; - store.m01 = temp01; - store.m02 = temp02; - store.m03 = temp03; - store.m10 = temp10; - store.m11 = temp11; - store.m12 = temp12; - store.m13 = temp13; - store.m20 = temp20; - store.m21 = temp21; - store.m22 = temp22; - store.m23 = temp23; - store.m30 = temp30; - store.m31 = temp31; - store.m32 = temp32; - store.m33 = temp33; + store.m00 = m[0]; + store.m01 = m[1]; + store.m02 = m[2]; + store.m03 = m[3]; + store.m10 = m[4]; + store.m11 = m[5]; + store.m12 = m[6]; + store.m13 = m[7]; + store.m20 = m[8]; + store.m21 = m[9]; + store.m22 = m[10]; + store.m23 = m[11]; + store.m30 = m[12]; + store.m31 = m[13]; + store.m32 = m[14]; + store.m33 = m[15]; + v.release(); return store; } @@ -1709,8 +1709,8 @@ public final class Matrix4f implements Savable, Cloneable, java.io.Serializable return new Vector3f(m03, m13, m23); } - public void toTranslationVector(Vector3f vector) { - vector.set(m03, m13, m23); + public Vector3f toTranslationVector(Vector3f vector) { + return vector.set(m03, m13, m23); } public Quaternion toRotationQuat() { @@ -1719,8 +1719,9 @@ public final class Matrix4f implements Savable, Cloneable, java.io.Serializable return quat; } - public void toRotationQuat(Quaternion q) { - q.fromRotationMatrix(toRotationMatrix()); + public Quaternion toRotationQuat(Quaternion q) { + return q.fromRotationMatrix(m00, m01, m02, m10, + m11, m12, m20, m21, m22); } public Matrix3f toRotationMatrix() { @@ -1753,15 +1754,16 @@ public final class Matrix4f implements Savable, Cloneable, java.io.Serializable /** * Retreives the scale vector from the matrix and stores it into a given * vector. - * - * @param the - * vector where the scale will be stored + * + * @param store the vector where the scale will be stored + * @return the store vector */ - public void toScaleVector(Vector3f vector) { + public Vector3f toScaleVector(Vector3f store) { float scaleX = (float) Math.sqrt(m00 * m00 + m10 * m10 + m20 * m20); float scaleY = (float) Math.sqrt(m01 * m01 + m11 * m11 + m21 * m21); float scaleZ = (float) Math.sqrt(m02 * m02 + m12 * m12 + m22 * m22); - vector.set(scaleX, scaleY, scaleZ); + store.set(scaleX, scaleY, scaleZ); + return store; } /** @@ -1775,25 +1777,30 @@ public final class Matrix4f implements Savable, Cloneable, java.io.Serializable * the Z scale */ public void setScale(float x, float y, float z) { - TempVars vars = TempVars.get(); - vars.vect1.set(m00, m10, m20); - vars.vect1.normalizeLocal().multLocal(x); - m00 = vars.vect1.x; - m10 = vars.vect1.y; - m20 = vars.vect1.z; - - vars.vect1.set(m01, m11, m21); - vars.vect1.normalizeLocal().multLocal(y); - m01 = vars.vect1.x; - m11 = vars.vect1.y; - m21 = vars.vect1.z; - - vars.vect1.set(m02, m12, m22); - vars.vect1.normalizeLocal().multLocal(z); - m02 = vars.vect1.x; - m12 = vars.vect1.y; - m22 = vars.vect1.z; - vars.release(); + + float length = m00 * m00 + m10 * m10 + m20 * m20; + if (length != 0f) { + length = length == 1 ? x : (x / FastMath.sqrt(length)); + m00 *= length; + m10 *= length; + m20 *= length; + } + + length = m01 * m01 + m11 * m11 + m21 * m21; + if (length != 0f) { + length = length == 1 ? y : (y / FastMath.sqrt(length)); + m01 *= length; + m11 *= length; + m21 *= length; + } + + length = m02 * m02 + m12 * m12 + m22 * m22; + if (length != 0f) { + length = length == 1 ? z : (z / FastMath.sqrt(length)); + m02 *= length; + m12 *= length; + m22 *= length; + } } /** diff --git a/jme3-core/src/main/java/com/jme3/math/Plane.java b/jme3-core/src/main/java/com/jme3/math/Plane.java index e8d1b328e..81dd3a5cb 100644 --- a/jme3-core/src/main/java/com/jme3/math/Plane.java +++ b/jme3-core/src/main/java/com/jme3/math/Plane.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -43,6 +43,7 @@ import java.util.logging.Logger; * * @author Mark Powell * @author Joshua Slack + * @author Ian McClean */ public class Plane implements Savable, Cloneable, java.io.Serializable { @@ -92,6 +93,16 @@ public class Plane implements Savable, Cloneable, java.io.Serializable { this.constant = constant; } + /** + * Constructor instantiates a new Plane object. + * + * @param normal The normal of the plane. + * @param displacement A vector representing a point on the plane. + */ + public Plane(Vector3f normal, Vector3f displacement) { + this(normal, displacement.dot(normal)); + } + /** * setNormal sets the normal of the plane. * diff --git a/jme3-core/src/main/java/com/jme3/math/Quaternion.java b/jme3-core/src/main/java/com/jme3/math/Quaternion.java index 1ee1305d2..0625b8edd 100644 --- a/jme3-core/src/main/java/com/jme3/math/Quaternion.java +++ b/jme3-core/src/main/java/com/jme3/math/Quaternion.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -33,10 +33,8 @@ package com.jme3.math; import com.jme3.export.*; import com.jme3.util.TempVars; -import java.io.Externalizable; -import java.io.IOException; -import java.io.ObjectInput; -import java.io.ObjectOutput; + +import java.io.*; import java.util.logging.Logger; /** @@ -217,7 +215,7 @@ public final class Quaternion implements Savable, Cloneable, java.io.Serializabl /** * fromAngles builds a quaternion from the Euler rotation - * angles (y,r,p). + * angles (x,y,z) aka (pitch, yaw, roll). * * @param angles * the Euler angles of rotation (in radians). @@ -233,7 +231,7 @@ public final class Quaternion implements Savable, Cloneable, java.io.Serializabl /** * fromAngles builds a Quaternion from the Euler rotation - * angles (x,y,z) aka (pitch, yaw, rall)). Note that we are applying in order: (y, z, x) aka (yaw, roll, pitch) but + * angles (x,y,z) aka (pitch, yaw, roll)). Note that we are applying in order: (y, z, x) aka (yaw, roll, pitch) but * we've ordered them in x, y, and z for convenience. * @see http://www.euclideanspace.com/maths/geometry/rotations/conversions/eulerToQuaternion/index.htm * @@ -276,8 +274,8 @@ public final class Quaternion implements Savable, Cloneable, java.io.Serializabl } /** - * toAngles returns this quaternion converted to Euler - * rotation angles (yaw,roll,pitch).
+ * toAngles returns this quaternion converted to Euler rotation + * angles (x,y,z) aka (pitch, yaw, roll).
* Note that the result is not always 100% accurate due to the implications of euler angles. * @see http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToEuler/index.htm * @@ -309,9 +307,9 @@ public final class Quaternion implements Savable, Cloneable, java.io.Serializabl angles[2] = -FastMath.HALF_PI; angles[0] = 0; } else { - angles[1] = FastMath.atan2(2 * y * w - 2 * x * z, sqx - sqy - sqz + sqw); // roll or heading - angles[2] = FastMath.asin(2 * test / unit); // pitch or attitude - angles[0] = FastMath.atan2(2 * x * w - 2 * y * z, -sqx + sqy - sqz + sqw); // yaw or bank + angles[1] = FastMath.atan2(2 * y * w - 2 * x * z, sqx - sqy - sqz + sqw); // yaw or heading + angles[2] = FastMath.asin(2 * test / unit); // roll or bank + angles[0] = FastMath.atan2(2 * x * w - 2 * y * z, -sqx + sqy - sqz + sqw); // pitch or attitude } return angles; } @@ -452,11 +450,56 @@ public final class Quaternion implements Savable, Cloneable, java.io.Serializabl return result; } + /** + * toTransformMatrix converts this quaternion to a transform + * matrix. The result is stored in result. + * Note this method won't preserve the scale of the given matrix. + * + * @param store The Matrix3f to store the result in. + * @return the transform matrix with the rotation representation of this quaternion. + */ + public Matrix4f toTransformMatrix(Matrix4f store) { + + float norm = norm(); + // we explicitly test norm against one here, saving a division + // at the cost of a test and branch. Is it worth it? + float s = (norm == 1f) ? 2f : (norm > 0f) ? 2f / norm : 0; + + // compute xs/ys/zs first to save 6 multiplications, since xs/ys/zs + // will be used 2-4 times each. + float xs = x * s; + float ys = y * s; + float zs = z * s; + float xx = x * xs; + float xy = x * ys; + float xz = x * zs; + float xw = w * xs; + float yy = y * ys; + float yz = y * zs; + float yw = w * ys; + float zz = z * zs; + float zw = w * zs; + + // using s=2/norm (instead of 1/norm) saves 9 multiplications by 2 here + store.m00 = 1 - (yy + zz); + store.m01 = (xy - zw); + store.m02 = (xz + yw); + store.m10 = (xy + zw); + store.m11 = 1 - (xx + zz); + store.m12 = (yz - xw); + store.m20 = (xz - yw); + store.m21 = (yz + xw); + store.m22 = 1 - (xx + yy); + + return store; + } + /** * toRotationMatrix converts this quaternion to a rotational * matrix. The result is stored in result. 4th row and 4th column values are * untouched. Note: the result is created from a normalized version of this quat. - * + * Note that this method will preserve the scale of the given matrix + * * @param result * The Matrix4f to store the result in. * @return the rotation matrix representation of this quaternion. @@ -464,7 +507,7 @@ public final class Quaternion implements Savable, Cloneable, java.io.Serializabl public Matrix4f toRotationMatrix(Matrix4f result) { TempVars tempv = TempVars.get(); Vector3f originalScale = tempv.vect1; - + result.toScaleVector(originalScale); result.setScale(1, 1, 1); float norm = norm(); @@ -499,9 +542,9 @@ public final class Quaternion implements Savable, Cloneable, java.io.Serializabl result.m22 = 1 - (xx + yy); result.setScale(originalScale); - + tempv.release(); - + return result; } @@ -689,7 +732,7 @@ public final class Quaternion implements Savable, Cloneable, java.io.Serializabl float invSinTheta = 1f / FastMath.sin(theta); // Calculate the scale for q1 and q2, according to the angle and - // it's sine value + // its sine scale0 = FastMath.sin((1 - t) * theta) * invSinTheta; scale1 = FastMath.sin((t * theta)) * invSinTheta; } @@ -713,7 +756,7 @@ public final class Quaternion implements Savable, Cloneable, java.io.Serializabl * @param q2 * Final interpolation value * @param changeAmnt - * The amount diffrence + * The amount difference */ public void slerp(Quaternion q2, float changeAmnt) { if (this.x == q2.x && this.y == q2.y && this.z == q2.z @@ -746,7 +789,7 @@ public final class Quaternion implements Savable, Cloneable, java.io.Serializabl float invSinTheta = 1f / FastMath.sin(theta); // Calculate the scale for q1 and q2, according to the angle and - // it's sine value + // its sine scale0 = FastMath.sin((1 - changeAmnt) * theta) * invSinTheta; scale1 = FastMath.sin((changeAmnt * theta)) * invSinTheta; } @@ -1161,7 +1204,7 @@ public final class Quaternion implements Savable, Cloneable, java.io.Serializabl /** * inverse calculates the inverse of this quaternion and * returns this quaternion after it is calculated. If this quaternion does - * not have an inverse (if it's normal is 0 or less), nothing happens + * not have an inverse (if its normal is 0 or less), nothing happens * * @return the inverse of this quaternion */ @@ -1343,7 +1386,7 @@ public final class Quaternion implements Savable, Cloneable, java.io.Serializabl * @param store * A Quaternion to store our result in. If null, a new one is * created. - * @return The store quaternion (or a new Quaterion, if store is null) that + * @return The store quaternion (or a new Quaternion, if store is null) that * describes a rotation that would point you in the exact opposite * direction of this Quaternion. */ diff --git a/jme3-core/src/main/java/com/jme3/math/Ray.java b/jme3-core/src/main/java/com/jme3/math/Ray.java index 20da7e5d8..8b2ab216b 100644 --- a/jme3-core/src/main/java/com/jme3/math/Ray.java +++ b/jme3-core/src/main/java/com/jme3/math/Ray.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -53,7 +53,7 @@ public final class Ray implements Savable, Cloneable, Collidable, java.io.Serial static final long serialVersionUID = 1; /** - * The ray's begining point. + * The ray's beginning point. */ public Vector3f origin = new Vector3f(); @@ -191,9 +191,9 @@ public final class Ray implements Savable, Cloneable, Collidable, java.io.Serial * @param v2 * third point of the triangle. * @param store - * storage vector - if null, no intersection is calc'd + * storage vector - if null, no intersection is calculated * @param doPlanar - * true if we are calcing planar results. + * true if we are calculating planar results. * @param quad * @return true if ray intersects triangle */ diff --git a/jme3-core/src/main/java/com/jme3/math/Transform.java b/jme3-core/src/main/java/com/jme3/math/Transform.java index 5d8899892..d9ac33ef0 100644 --- a/jme3-core/src/main/java/com/jme3/math/Transform.java +++ b/jme3-core/src/main/java/com/jme3/math/Transform.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2017 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -32,6 +32,8 @@ package com.jme3.math; import com.jme3.export.*; +import com.jme3.util.TempVars; + import java.io.IOException; /** @@ -174,19 +176,20 @@ public final class Transform implements Savable, Cloneable, java.io.Serializable } /** - * Sets this matrix to the interpolation between the first matrix and the second by delta amount. - * @param t1 The begining transform. + * Sets this transform to the interpolation between the first transform and the second by delta amount. + * @param t1 The beginning transform. * @param t2 The ending transform. * @param delta An amount between 0 and 1 representing how far to interpolate from t1 to t2. */ public void interpolateTransforms(Transform t1, Transform t2, float delta) { - this.rot.slerp(t1.rot,t2.rot,delta); + t1.rot.nlerp(t2.rot, delta); + this.rot.set(t1.rot); this.translation.interpolateLocal(t1.translation,t2.translation,delta); this.scale.interpolateLocal(t1.scale,t2.scale,delta); } /** - * Changes the values of this matrix according to it's parent. Very similar to the concept of Node/Spatial transforms. + * Changes the values of this matrix according to its parent. Very similar to the concept of Node/Spatial transforms. * @param parent The parent matrix. * @return This matrix, after combining. */ @@ -245,7 +248,7 @@ public final class Transform implements Savable, Cloneable, java.io.Serializable store = new Vector3f(); // The author of this code should look above and take the inverse of that - // But for some reason, they didnt .. + // But for some reason, they didn't .. // in.subtract(translation, store).divideLocal(scale); // rot.inverse().mult(store, store); @@ -257,17 +260,25 @@ public final class Transform implements Savable, Cloneable, java.io.Serializable } public Matrix4f toTransformMatrix() { - Matrix4f trans = new Matrix4f(); - trans.setTranslation(translation); - trans.setRotationQuaternion(rot); - trans.setScale(scale); - return trans; + return toTransformMatrix(null); + } + + public Matrix4f toTransformMatrix(Matrix4f store) { + if (store == null) { + store = new Matrix4f(); + } + store.setTranslation(translation); + rot.toTransformMatrix(store); + store.setScale(scale); + return store; } public void fromTransformMatrix(Matrix4f mat) { - translation.set(mat.toTranslationVector()); - rot.set(mat.toRotationQuat()); - scale.set(mat.toScaleVector()); + TempVars vars = TempVars.get(); + translation.set(mat.toTranslationVector(vars.vect1)); + rot.set(mat.toRotationQuat(vars.quat1)); + scale.set(mat.toScaleVector(vars.vect2)); + vars.release(); } public Transform invert() { diff --git a/jme3-core/src/main/java/com/jme3/math/Triangle.java b/jme3-core/src/main/java/com/jme3/math/Triangle.java index 527d6e7b4..590268213 100644 --- a/jme3-core/src/main/java/com/jme3/math/Triangle.java +++ b/jme3-core/src/main/java/com/jme3/math/Triangle.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -56,6 +56,9 @@ public class Triangle extends AbstractTriangle implements Savable, Cloneable, ja private float projection; private int index; + /** + * Instantiate a zero-size Triangle at the origin. + */ public Triangle() { } @@ -75,11 +78,11 @@ public class Triangle extends AbstractTriangle implements Savable, Cloneable, ja } /** - * * get retrieves a point on the triangle denoted by the index * supplied. - * @param i the index of the point. - * @return the point. + * + * @param i the index of the point (0, 1, or 2) + * @return a pre-existing location vector */ public Vector3f get(int i) { switch (i) { @@ -94,26 +97,47 @@ public class Triangle extends AbstractTriangle implements Savable, Cloneable, ja } } + /** + * Access the location of the 1st point (A). + * + * @return the pre-existing vector (not null) + */ + @Override public Vector3f get1() { return pointa; } + /** + * Access the location of the 2nd point (B). + * + * @return the pre-existing vector (not null) + */ + @Override public Vector3f get2() { return pointb; } + /** + * Access the location of the 3rd point (C). + * + * @return the pre-existing vector (not null) + */ + @Override public Vector3f get3() { return pointc; } /** + * set sets one of the triangle's points to that specified as a + * parameter. * - * set sets one of the triangle's points to that specified as - * a parameter. - * @param i the index to place the point. - * @param point the point to set. + * @param i the index to place the point (0, 1, or 2) + * @param point the desired location of the point (not null, unaffected) */ public void set(int i, Vector3f point) { + center = null; + normal = null; + switch (i) { case 0: pointa.set(point); @@ -128,12 +152,17 @@ public class Triangle extends AbstractTriangle implements Savable, Cloneable, ja } /** + * set alters the location of one of the triangle's points. * - * set sets one of the triangle's points to that specified as - * a parameter. - * @param i the index to place the point. + * @param i the index to place the point (0, 1, or 2) + * @param x the desired X-component of the point's location + * @param y the desired Y-component of the point's location + * @param z the desired Z-component of the point's location */ public void set(int i, float x, float y, float z) { + center = null; + normal = null; + switch (i) { case 0: pointa.set(x, y, z); @@ -147,19 +176,54 @@ public class Triangle extends AbstractTriangle implements Savable, Cloneable, ja } } + /** + * set1 alters the location of the triangle's 1st point. + * + * @param v the desired location (not null, unaffected) + */ public void set1(Vector3f v) { + center = null; + normal = null; + pointa.set(v); } + /** + * set2 alters the location of the triangle's 2nd point. + * + * @param v the desired location (not null, unaffected) + */ public void set2(Vector3f v) { + center = null; + normal = null; + pointb.set(v); } + /** + * set3 alters the location of the triangle's 3rd point. + * + * @param v the desired location (not null, unaffected) + */ public void set3(Vector3f v) { + center = null; + normal = null; + pointc.set(v); } + /** + * set alters the locations of all 3 points. + * + * @param v1 the desired location of the 1st point (not null, unaffected) + * @param v2 the desired location of the 2nd point (not null, unaffected) + * @param v3 the desired location of the 3rd point (not null, unaffected) + */ + @Override public void set(Vector3f v1, Vector3f v2, Vector3f v3) { + center = null; + normal = null; + pointa.set(v1); pointb.set(v2); pointc.set(v3); @@ -275,12 +339,14 @@ public class Triangle extends AbstractTriangle implements Savable, Cloneable, ja return store.normalizeLocal(); } + @Override public void write(JmeExporter e) throws IOException { e.getCapsule(this).write(pointa, "pointa", Vector3f.ZERO); e.getCapsule(this).write(pointb, "pointb", Vector3f.ZERO); e.getCapsule(this).write(pointc, "pointc", Vector3f.ZERO); } + @Override public void read(JmeImporter e) throws IOException { pointa = (Vector3f) e.getCapsule(this).readSavable("pointa", Vector3f.ZERO.clone()); pointb = (Vector3f) e.getCapsule(this).readSavable("pointb", Vector3f.ZERO.clone()); diff --git a/jme3-core/src/main/java/com/jme3/math/Vector2f.java b/jme3-core/src/main/java/com/jme3/math/Vector2f.java index c1c2bcba4..1ad2ac0c6 100644 --- a/jme3-core/src/main/java/com/jme3/math/Vector2f.java +++ b/jme3-core/src/main/java/com/jme3/math/Vector2f.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -248,11 +248,11 @@ public final class Vector2f implements Savable, Cloneable, java.io.Serializable * finalVec this=(1-changeAmnt)*beginVec + changeAmnt * finalVec * * @param beginVec - * The begining vector (delta=0) + * The beginning vector (delta=0) * @param finalVec * The final vector to interpolate towards (delta=1) * @param changeAmnt - * An amount between 0.0 - 1.0 representing a precentage change + * An amount between 0.0 - 1.0 representing a percentage change * from beginVec towards finalVec */ public Vector2f interpolateLocal(Vector2f beginVec, Vector2f finalVec, @@ -363,7 +363,7 @@ public final class Vector2f implements Savable, Cloneable, java.io.Serializable } /** - * multLocal multiplies a provided vector to this vector + * multLocal multiplies a provided vector by this vector * internally, and returns a handle to this vector for easy chaining of * calls. If the provided vector is null, null is returned. * @@ -579,7 +579,7 @@ public final class Vector2f implements Savable, Cloneable, java.io.Serializable /** * angleBetween returns (in radians) the angle required to - * rotate a ray represented by this vector to lie colinear to a ray + * rotate a ray represented by this vector to be colinear with a ray * described by the given vector. It is assumed that both this vector and * the given vector are unit vectors (iow, normalized). * @@ -631,7 +631,7 @@ public final class Vector2f implements Savable, Cloneable, java.io.Serializable /** * hashCode returns a unique code for this vector object - * based on it's values. If two vectors are logically equivalent, they will + * based on its values. If two vectors are logically equivalent, they will * return the same hash code value. * * @return the hash code value of this vector. diff --git a/jme3-core/src/main/java/com/jme3/math/Vector3f.java b/jme3-core/src/main/java/com/jme3/math/Vector3f.java index 37c92c10f..d5fdac06c 100644 --- a/jme3-core/src/main/java/com/jme3/math/Vector3f.java +++ b/jme3-core/src/main/java/com/jme3/math/Vector3f.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2017 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -321,7 +321,7 @@ public final class Vector3f implements Savable, Cloneable, java.io.Serializable * the vector to take the cross product of with this. * @param result * the vector to store the cross product result. - * @return result, after recieving the cross product vector. + * @return result, after receiving the cross product vector. */ public Vector3f cross(Vector3f v,Vector3f result) { return cross(v.x, v.y, v.z, result); @@ -339,7 +339,7 @@ public final class Vector3f implements Savable, Cloneable, java.io.Serializable * z component of the vector to take the cross product of with this. * @param result * the vector to store the cross product result. - * @return result, after recieving the cross product vector. + * @return result, after receiving the cross product vector. */ public Vector3f cross(float otherX, float otherY, float otherZ, Vector3f result) { if (result == null) result = new Vector3f(); @@ -851,7 +851,7 @@ public final class Vector3f implements Savable, Cloneable, java.io.Serializable * Sets this vector to the interpolation by changeAmnt from this to the finalVec * this=(1-changeAmnt)*this + changeAmnt * finalVec * @param finalVec The final vector to interpolate towards - * @param changeAmnt An amount between 0.0 - 1.0 representing a precentage + * @param changeAmnt An amount between 0.0 - 1.0 representing a percentage * change from this towards finalVec */ public Vector3f interpolateLocal(Vector3f finalVec, float changeAmnt) { @@ -864,9 +864,9 @@ public final class Vector3f implements Savable, Cloneable, java.io.Serializable /** * Sets this vector to the interpolation by changeAmnt from beginVec to finalVec * this=(1-changeAmnt)*beginVec + changeAmnt * finalVec - * @param beginVec the beging vector (changeAmnt=0) + * @param beginVec the beginning vector (changeAmnt=0) * @param finalVec The final vector to interpolate towards - * @param changeAmnt An amount between 0.0 - 1.0 representing a precentage + * @param changeAmnt An amount between 0.0 - 1.0 representing a percentage * change from beginVec towards finalVec */ public Vector3f interpolateLocal(Vector3f beginVec,Vector3f finalVec, float changeAmnt) { @@ -972,7 +972,7 @@ public final class Vector3f implements Savable, Cloneable, java.io.Serializable /** * hashCode returns a unique code for this vector object based - * on it's values. If two vectors are logically equivalent, they will return + * on its values. If two vectors are logically equivalent, they will return * the same hash code value. * @return the hash code value of this vector. */ diff --git a/jme3-core/src/main/java/com/jme3/math/Vector4f.java b/jme3-core/src/main/java/com/jme3/math/Vector4f.java index a5b394d3d..2993c4f0c 100644 --- a/jme3-core/src/main/java/com/jme3/math/Vector4f.java +++ b/jme3-core/src/main/java/com/jme3/math/Vector4f.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2017 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -780,7 +780,7 @@ public final class Vector4f implements Savable, Cloneable, java.io.Serializable * Sets this vector to the interpolation by changeAmnt from this to the finalVec * this=(1-changeAmnt)*this + changeAmnt * finalVec * @param finalVec The final vector to interpolate towards - * @param changeAmnt An amount between 0.0 - 1.0 representing a precentage + * @param changeAmnt An amount between 0.0 - 1.0 representing a percentage * change from this towards finalVec */ public Vector4f interpolateLocal(Vector4f finalVec, float changeAmnt) { @@ -794,9 +794,9 @@ public final class Vector4f implements Savable, Cloneable, java.io.Serializable /** * Sets this vector to the interpolation by changeAmnt from beginVec to finalVec * this=(1-changeAmnt)*beginVec + changeAmnt * finalVec - * @param beginVec the beging vector (changeAmnt=0) + * @param beginVec the beginning vector (changeAmnt=0) * @param finalVec The final vector to interpolate towards - * @param changeAmnt An amount between 0.0 - 1.0 representing a precentage + * @param changeAmnt An amount between 0.0 - 1.0 representing a percentage * change from beginVec towards finalVec */ public Vector4f interpolateLocal(Vector4f beginVec,Vector4f finalVec, float changeAmnt) { @@ -877,7 +877,7 @@ public final class Vector4f implements Savable, Cloneable, java.io.Serializable /** * hashCode returns a unique code for this vector object based - * on it's values. If two vectors are logically equivalent, they will return + * on its values. If two vectors are logically equivalent, they will return * the same hash code value. * @return the hash code value of this vector. */ diff --git a/jme3-core/src/main/java/com/jme3/opencl/Context.java b/jme3-core/src/main/java/com/jme3/opencl/Context.java index 52d5eba24..b53906a3c 100644 --- a/jme3-core/src/main/java/com/jme3/opencl/Context.java +++ b/jme3-core/src/main/java/com/jme3/opencl/Context.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2016 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -434,7 +434,7 @@ public abstract class Context extends AbstractOpenCLObject { * this method and {@code Program#build(..)} must be the same. * * The binaries are used to build a program cache across multiple launches - * of the application. The programs build mach faster from binaries than + * of the application. The programs build much faster from binaries than * from sources. * * @param binaries the binaries diff --git a/jme3-core/src/main/java/com/jme3/opencl/Device.java b/jme3-core/src/main/java/com/jme3/opencl/Device.java index d34854c0c..3529a2570 100644 --- a/jme3-core/src/main/java/com/jme3/opencl/Device.java +++ b/jme3-core/src/main/java/com/jme3/opencl/Device.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2016 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -35,7 +35,7 @@ import java.util.Collection; /** * Represents a hardware device actually running the OpenCL kernels. - * A {@link Context} can be accociated with multiple {@code Devices} + * A {@link Context} can be associated with multiple {@code Devices} * that all belong to the same {@link Platform}. * For execution, a single device must be chosen and passed to a command * queue ({@link Context#createQueue(com.jme3.opencl.Device) }). @@ -47,7 +47,7 @@ import java.util.Collection; public interface Device { /** - * @return the platform accociated with this device + * @return the platform associated with this device */ Platform getPlatform(); @@ -108,7 +108,7 @@ public interface Device { */ boolean hasOpenGLInterop(); /** - * Explicetly tests for the availability of the specified extension + * Explictly tests for the availability of the specified extension * @param extension the name of the extension * @return {@code true} iff this extension is supported */ @@ -138,7 +138,7 @@ public interface Device { * size specified as an unsigned integer value * in bits. Currently supported values are 32 * or 64 bits. - * @return the size of an adress + * @return the size of an address */ int getAddressBits(); /** diff --git a/jme3-core/src/main/java/com/jme3/opencl/Kernel.java b/jme3-core/src/main/java/com/jme3/opencl/Kernel.java index 1105a2504..245657c63 100644 --- a/jme3-core/src/main/java/com/jme3/opencl/Kernel.java +++ b/jme3-core/src/main/java/com/jme3/opencl/Kernel.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2016 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -55,7 +55,7 @@ import java.util.Arrays; * Again, the threads inside the work group can be organized in a 1D, 2D or 3D * grid, but this is also just a logical view (specifying how the threads are * indexed). - * The work group is imporatant for another concept: shared memory + * The work group is important for another concept: shared memory * Unlike the normal global or constant memory (passing a {@link Buffer} object * as argument), shared memory can't be set from outside. Shared memory is * allocated by the kernel and is only valid within the kernel. It is used @@ -202,7 +202,7 @@ public abstract class Kernel extends AbstractOpenCLObject { * Use this if you do not rely on specific work group layouts, i.e. * because shared memory is not used. * {@link #Run1(com.jme3.opencl.CommandQueue, com.jme3.opencl.Kernel.WorkSize, java.lang.Object...) } - * implicetly calls this mehtod. + * implicitly calls this method. */ public void setWorkGroupSizeToNull() { workGroupSize.set(1, 0, 0, 0); @@ -494,7 +494,7 @@ public abstract class Kernel extends AbstractOpenCLObject { * Therefore, an instance of this class must be set as an argument AFTER * the work group size has been specified. This is * ensured by {@link #Run2(com.jme3.opencl.CommandQueue, com.jme3.opencl.Kernel.WorkSize, com.jme3.opencl.Kernel.WorkSize, java.lang.Object...) }. - * This argument can't be used when no work group size was defined explicetly + * This argument can't be used when no work group size was defined explicitly * (e.g. by {@link #setWorkGroupSizeToNull()} or {@link #Run1(com.jme3.opencl.CommandQueue, com.jme3.opencl.Kernel.WorkSize, java.lang.Object...) }. */ public static final class LocalMemPerElement { diff --git a/jme3-core/src/main/java/com/jme3/opencl/OpenCLObjectManager.java b/jme3-core/src/main/java/com/jme3/opencl/OpenCLObjectManager.java index e664c90c2..feed31dec 100644 --- a/jme3-core/src/main/java/com/jme3/opencl/OpenCLObjectManager.java +++ b/jme3-core/src/main/java/com/jme3/opencl/OpenCLObjectManager.java @@ -43,8 +43,8 @@ import java.util.logging.Logger; */ public class OpenCLObjectManager { private static final Logger LOG = Logger.getLogger(OpenCLObjectManager.class.getName()); - private static final Level LOG_LEVEL1 = Level.FINER; - private static final Level LOG_LEVEL2 = Level.FINE; + private static final Level LOG_LEVEL1 = Level.FINEST; + private static final Level LOG_LEVEL2 = Level.FINER; private static final OpenCLObjectManager INSTANCE = new OpenCLObjectManager(); private OpenCLObjectManager() {} diff --git a/jme3-core/src/main/java/com/jme3/opencl/package-info.java b/jme3-core/src/main/java/com/jme3/opencl/package-info.java index c96a026d1..36ad65eb4 100644 --- a/jme3-core/src/main/java/com/jme3/opencl/package-info.java +++ b/jme3-core/src/main/java/com/jme3/opencl/package-info.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2016 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -98,7 +98,7 @@ * need for intermediate events. (These intermediate events would be released * immediately). Therefore, the no-event alternatives increase the performance * because no additional event object has to be allocated and less system calls - * are neccessary. + * are necessary. * *

* Interoperability between OpenCL and jME3:
@@ -141,7 +141,7 @@ * {@link com.jme3.opencl.Program}, {@link com.jme3.opencl.Kernel} and * {@link com.jme3.opencl.Event}) * may throw the following exceptions in each method without being mentioned - * explicetly in the documentation: + * explicitly in the documentation: *

    *
  • {@code NullPointerException}: one of the arguments is {@code null} and * {@code null} is not allowed
  • diff --git a/jme3-core/src/main/java/com/jme3/post/FilterPostProcessor.java b/jme3-core/src/main/java/com/jme3/post/FilterPostProcessor.java index 8abda3da4..e69408157 100644 --- a/jme3-core/src/main/java/com/jme3/post/FilterPostProcessor.java +++ b/jme3-core/src/main/java/com/jme3/post/FilterPostProcessor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -410,7 +410,7 @@ public class FilterPostProcessor implements SceneProcessor, Savable { public void cleanup() { if (viewPort != null) { - //reseting the viewport camera viewport to its initial value + //reset the viewport camera viewport to its initial value viewPort.getCamera().resize(originalWidth, originalHeight, true); viewPort.getCamera().setViewPort(left, right, bottom, top); viewPort.setOutputFrameBuffer(outputBuffer); diff --git a/jme3-core/src/main/java/com/jme3/renderer/Camera.java b/jme3-core/src/main/java/com/jme3/renderer/Camera.java index a684d360d..79dd24059 100644 --- a/jme3-core/src/main/java/com/jme3/renderer/Camera.java +++ b/jme3-core/src/main/java/com/jme3/renderer/Camera.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -1221,7 +1221,7 @@ public class Camera implements Savable, Cloneable { projectionMatrix.fromFrustum(frustumNear, frustumFar, frustumLeft, frustumRight, frustumTop, frustumBottom, parallelProjection); // projectionMatrix.transposeLocal(); - // The frame is effected by the frustum values + // The frame is affected by the frustum values // update it as well onFrameChange(); } diff --git a/jme3-core/src/main/java/com/jme3/renderer/Caps.java b/jme3-core/src/main/java/com/jme3/renderer/Caps.java index 91a54c1e6..0369517e2 100644 --- a/jme3-core/src/main/java/com/jme3/renderer/Caps.java +++ b/jme3-core/src/main/java/com/jme3/renderer/Caps.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -224,7 +224,7 @@ public enum Caps { */ GeometryShader, /** - * Supports Tesselation shader + * Supports Tessellation shader */ TesselationShader, /** @@ -394,7 +394,15 @@ public enum Caps { /** * GPU can provide and accept binary shaders. */ - BinaryShader; + BinaryShader, + /** + * Supporting working with UniformBufferObject. + */ + UniformBufferObject, + /** + * Supporting working with ShaderStorageBufferObjects. + */ + ShaderStorageBufferObject; /** * Returns true if given the renderer capabilities, the texture diff --git a/jme3-core/src/main/java/com/jme3/renderer/Limits.java b/jme3-core/src/main/java/com/jme3/renderer/Limits.java index a7e737092..cd1bfec35 100644 --- a/jme3-core/src/main/java/com/jme3/renderer/Limits.java +++ b/jme3-core/src/main/java/com/jme3/renderer/Limits.java @@ -62,4 +62,20 @@ public enum Limits { ColorTextureSamples, DepthTextureSamples, TextureAnisotropy, + + // UBO + UniformBufferObjectMaxVertexBlocks, + UniformBufferObjectMaxFragmentBlocks, + UniformBufferObjectMaxGeometryBlocks, + UniformBufferObjectMaxBlockSize, + + // SSBO + ShaderStorageBufferObjectMaxBlockSize, + ShaderStorageBufferObjectMaxVertexBlocks, + ShaderStorageBufferObjectMaxFragmentBlocks, + ShaderStorageBufferObjectMaxGeometryBlocks, + ShaderStorageBufferObjectMaxTessControlBlocks, + ShaderStorageBufferObjectMaxTessEvaluationBlocks, + ShaderStorageBufferObjectMaxComputeBlocks, + ShaderStorageBufferObjectMaxCombineBlocks, } diff --git a/jme3-core/src/main/java/com/jme3/renderer/RenderContext.java b/jme3-core/src/main/java/com/jme3/renderer/RenderContext.java index 49f25240a..4599fdbb3 100644 --- a/jme3-core/src/main/java/com/jme3/renderer/RenderContext.java +++ b/jme3-core/src/main/java/com/jme3/renderer/RenderContext.java @@ -32,6 +32,7 @@ package com.jme3.renderer; import com.jme3.material.RenderState; +import com.jme3.material.RenderState.BlendFunc; import com.jme3.math.ColorRGBA; import com.jme3.scene.Mesh; import com.jme3.scene.VertexBuffer; @@ -110,6 +111,30 @@ public class RenderContext { */ public RenderState.BlendEquationAlpha blendEquationAlpha = RenderState.BlendEquationAlpha.InheritColor; + /** + * @see RenderState#setCustomBlendFactors(com.jme3.material.RenderState.BlendFunc, com.jme3.material.RenderState.BlendFunc, + * com.jme3.material.RenderState.BlendFunc, com.jme3.material.RenderState.BlendFunc) + */ + public RenderState.BlendFunc sfactorRGB = RenderState.BlendFunc.One; + + /** + * @see RenderState#setCustomBlendFactors(com.jme3.material.RenderState.BlendFunc, com.jme3.material.RenderState.BlendFunc, + * com.jme3.material.RenderState.BlendFunc, com.jme3.material.RenderState.BlendFunc) + */ + public RenderState.BlendFunc dfactorRGB = RenderState.BlendFunc.One; + + /** + * @see RenderState#setCustomBlendFactors(com.jme3.material.RenderState.BlendFunc, com.jme3.material.RenderState.BlendFunc, + * com.jme3.material.RenderState.BlendFunc, com.jme3.material.RenderState.BlendFunc) + */ + public RenderState.BlendFunc sfactorAlpha = RenderState.BlendFunc.One; + + /** + * @see RenderState#setCustomBlendFactors(com.jme3.material.RenderState.BlendFunc, com.jme3.material.RenderState.BlendFunc, + * com.jme3.material.RenderState.BlendFunc, com.jme3.material.RenderState.BlendFunc) + */ + public RenderState.BlendFunc dfactorAlpha = RenderState.BlendFunc.One; + /** * @see RenderState#setWireframe(boolean) */ @@ -266,6 +291,10 @@ public class RenderContext { blendMode = RenderState.BlendMode.Off; blendEquation = RenderState.BlendEquation.Add; blendEquationAlpha = RenderState.BlendEquationAlpha.InheritColor; + sfactorRGB = BlendFunc.One; + dfactorRGB = BlendFunc.One; + sfactorAlpha = BlendFunc.One; + dfactorAlpha = BlendFunc.One; wireframe = false; boundShaderProgram = 0; boundShader = null; diff --git a/jme3-core/src/main/java/com/jme3/renderer/RenderManager.java b/jme3-core/src/main/java/com/jme3/renderer/RenderManager.java index 950f1a4a6..cc86b5ad4 100644 --- a/jme3-core/src/main/java/com/jme3/renderer/RenderManager.java +++ b/jme3-core/src/main/java/com/jme3/renderer/RenderManager.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -660,7 +660,7 @@ public class RenderManager { throw new IllegalStateException("No material is set for Geometry: " + gm.getName()); } - gm.getMaterial().preload(this); + gm.getMaterial().preload(this, gm); Mesh mesh = gm.getMesh(); if (mesh != null && mesh.getVertexCount() != 0 @@ -726,7 +726,7 @@ public class RenderManager { // Saving cam state for culling int camState = vp.getCamera().getPlaneState(); for (int i = 0; i < children.size(); i++) { - // Restoring cam state before proceeding children recusively + // Restoring cam state before proceeding children recursively vp.getCamera().setPlaneState(camState); renderSubScene(children.get(i), vp); } diff --git a/jme3-core/src/main/java/com/jme3/renderer/Renderer.java b/jme3-core/src/main/java/com/jme3/renderer/Renderer.java index 9a4e5bcc2..201729da8 100644 --- a/jme3-core/src/main/java/com/jme3/renderer/Renderer.java +++ b/jme3-core/src/main/java/com/jme3/renderer/Renderer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -35,6 +35,7 @@ import com.jme3.material.RenderState; import com.jme3.math.ColorRGBA; import com.jme3.scene.Mesh; import com.jme3.scene.VertexBuffer; +import com.jme3.shader.BufferObject; import com.jme3.shader.Shader; import com.jme3.shader.Shader.ShaderSource; import com.jme3.system.AppSettings; @@ -267,12 +268,26 @@ public interface Renderer { */ public void updateBufferData(VertexBuffer vb); + /** + * Uploads data of the buffer object on the GPU. + * + * @param bo the buffer object to upload. + */ + public void updateBufferData(BufferObject bo); + /** * Deletes a vertex buffer from the GPU. * @param vb The vertex buffer to delete */ public void deleteBuffer(VertexBuffer vb); + /** + * Deletes the buffer object from the GPU. + * + * @param bo the buffer object to delete. + */ + public void deleteBuffer(BufferObject bo); + /** * Renders count meshes, with the geometry data supplied and * per-instance data supplied. @@ -425,7 +440,7 @@ public interface Renderer { * Check if the profiling results are available * * @param taskId the id of the task provided by startProfiling - * @return true if the resulst of the task with the given task id are available. + * @return true if the results of the task with the given task id are available. */ public boolean isTaskResultAvailable(int taskId); diff --git a/jme3-core/src/main/java/com/jme3/renderer/Statistics.java b/jme3-core/src/main/java/com/jme3/renderer/Statistics.java index 6e6d07e84..892093269 100644 --- a/jme3-core/src/main/java/com/jme3/renderer/Statistics.java +++ b/jme3-core/src/main/java/com/jme3/renderer/Statistics.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -151,7 +151,7 @@ public class Statistics { if( !enabled ) return; - // Reduces unneccessary hashmap lookups if + // Reduces unnecessary hashmap lookups if // we already considered this shader. if (lastShader != shader.getId()) { lastShader = shader.getId(); diff --git a/jme3-core/src/main/java/com/jme3/renderer/opengl/GL.java b/jme3-core/src/main/java/com/jme3/renderer/opengl/GL.java index 19bdfffff..b2a57736f 100644 --- a/jme3-core/src/main/java/com/jme3/renderer/opengl/GL.java +++ b/jme3-core/src/main/java/com/jme3/renderer/opengl/GL.java @@ -38,9 +38,9 @@ import java.nio.ShortBuffer; /** * Baseline GL methods that must be available on all platforms. - * + *

    * This is the subset of vanilla desktop OpenGL 2 and OpenGL ES 2. - * + * * @author Kirill Vainer */ public interface GL { @@ -66,6 +66,7 @@ public interface GL { public static final int GL_DST_ALPHA = 0x0304; public static final int GL_DST_COLOR = 0x306; public static final int GL_DYNAMIC_DRAW = 0x88E8; + public static final int GL_DYNAMIC_COPY = 0x88EA; public static final int GL_ELEMENT_ARRAY_BUFFER = 0x8893; public static final int GL_EQUAL = 0x202; public static final int GL_EXTENSIONS = 0x1F03; @@ -194,95 +195,1108 @@ public interface GL { public static final int GL_VERTEX_SHADER = 0x8B31; public static final int GL_ZERO = 0x0; - public void resetStats(); - - public void glActiveTexture(int texture); - public void glAttachShader(int program, int shader); + public void resetStats(); + + /** + *

    Reference Page

    + *

    + * Selects which texture unit subsequent texture state calls will affect. The number of texture units an implementation supports is implementation + * dependent. + * + * @param texture which texture unit to make active. One of:
    {@link #GL_TEXTURE0 TEXTURE0}GL_TEXTURE[1-31]
    + */ + public void glActiveTexture(int texture); + + /** + *

    Reference Page

    + *

    + * Attaches a shader object to a program object. + *

    + *

    In order to create a complete shader program, there must be a way to specify the list of things that will be linked together. Program objects provide + * this mechanism. Shaders that are to be linked together in a program object must first be attached to that program object. glAttachShader attaches the + * shader object specified by shader to the program object specified by program. This indicates that shader will be included in link operations that will + * be performed on program.

    + *

    + *

    All operations that can be performed on a shader object are valid whether or not the shader object is attached to a program object. It is permissible to + * attach a shader object to a program object before source code has been loaded into the shader object or before the shader object has been compiled. It + * is permissible to attach multiple shader objects of the same type because each may contain a portion of the complete shader. It is also permissible to + * attach a shader object to more than one program object. If a shader object is deleted while it is attached to a program object, it will be flagged for + * deletion, and deletion will not occur until glDetachShader is called to detach it from all program objects to which it is attached.

    + * + * @param program the program object to which a shader object will be attached. + * @param shader the shader object that is to be attached. + */ + public void glAttachShader(int program, int shader); + + /** + *

    Reference Page

    + *

    + * Creates a query object and makes it active. + * + * @param target the target type of query object established. + * @param query the name of a query object. + */ public void glBeginQuery(int target, int query); - public void glBindBuffer(int target, int buffer); - public void glBindTexture(int target, int texture); - public void glBlendEquationSeparate(int colorMode, int alphaMode); - public void glBlendFunc(int sfactor, int dfactor); - public void glBlendFuncSeparate(int sfactorRGB, int dfactorRGB, int sfactorAlpha, int dfactorAlpha); - public void glBufferData(int target, long data_size, int usage); - public void glBufferData(int target, FloatBuffer data, int usage); - public void glBufferData(int target, ShortBuffer data, int usage); - public void glBufferData(int target, ByteBuffer data, int usage); - public void glBufferSubData(int target, long offset, FloatBuffer data); - public void glBufferSubData(int target, long offset, ShortBuffer data); - public void glBufferSubData(int target, long offset, ByteBuffer data); - public void glClear(int mask); - public void glClearColor(float red, float green, float blue, float alpha); - public void glColorMask(boolean red, boolean green, boolean blue, boolean alpha); - public void glCompileShader(int shader); - public void glCompressedTexImage2D(int target, int level, int internalformat, int width, int height, int border, ByteBuffer data); - public void glCompressedTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, ByteBuffer data); - public int glCreateProgram(); - public int glCreateShader(int shaderType); - public void glCullFace(int mode); - public void glDeleteBuffers(IntBuffer buffers); - public void glDeleteProgram(int program); - public void glDeleteShader(int shader); - public void glDeleteTextures(IntBuffer textures); - public void glDepthFunc(int func); - public void glDepthMask(boolean flag); - public void glDepthRange(double nearVal, double farVal); - public void glDetachShader(int program, int shader); - public void glDisable(int cap); - public void glDisableVertexAttribArray(int index); - public void glDrawArrays(int mode, int first, int count); - - public void glDrawRangeElements(int mode, int start, int end, int count, int type, long indices); /// GL2+ - public void glEnable(int cap); - public void glEnableVertexAttribArray(int index); + + /** + *

    Reference Page

    + *

    + * Binds a named buffer object. + * + * @param target the target to which the buffer object is bound. + * @param buffer the name of a buffer object. + */ + public void glBindBuffer(int target, int buffer); + + /** + *

    Reference Page

    + *

    + * Binds the a texture to a texture target. + *

    + *

    While a texture object is bound, GL operations on the target to which it is bound affect the bound object, and queries of the target to which it is + * bound return state from the bound object. If texture mapping of the dimensionality of the target to which a texture object is bound is enabled, the + * state of the bound texture object directs the texturing operation.

    + * + * @param target the texture target. + * @param texture the texture object to bind. + */ + public void glBindTexture(int target, int texture); + + /** + *

    Reference Page

    + *

    + * Sets the RGB blend equation and the alpha blend equation separately. + * + * @param colorMode the RGB blend equation, how the red, green, and blue components of the source and destination colors are combined. + * @param alphaMode the alpha blend equation, how the alpha component of the source and destination colors are combined + */ + public void glBlendEquationSeparate(int colorMode, int alphaMode); + + /** + *

    Reference Page

    + *

    + * Specifies the weighting factors used by the blend equation, for both RGB and alpha functions and for all draw buffers. + * + * @param sfactor the source weighting factor. + * @param dfactor the destination weighting factor. + */ + public void glBlendFunc(int sfactor, int dfactor); + + /** + *

    Reference Page

    + *

    + * Specifies pixel arithmetic for RGB and alpha components separately. + * + * @param sfactorRGB how the red, green, and blue blending factors are computed. The initial value is GL_ONE. + * @param dfactorRGB how the red, green, and blue destination blending factors are computed. The initial value is GL_ZERO. + * @param sfactorAlpha how the alpha source blending factor is computed. The initial value is GL_ONE. + * @param dfactorAlpha how the alpha destination blending factor is computed. The initial value is GL_ZERO. + */ + public void glBlendFuncSeparate(int sfactorRGB, int dfactorRGB, int sfactorAlpha, int dfactorAlpha); + + /** + *

    Reference Page

    + *

    + * Creates and initializes a buffer object's data store. + *

    + *

    {@code usage} is a hint to the GL implementation as to how a buffer object's data store will be accessed. This enables the GL implementation to make + * more intelligent decisions that may significantly impact buffer object performance. It does not, however, constrain the actual usage of the data store. + * {@code usage} can be broken down into two parts: first, the frequency of access (modification and usage), and second, the nature of that access. The + * frequency of access may be one of these:

    + *

    + *

      + *
    • STREAM - The data store contents will be modified once and used at most a few times.
    • + *
    • STATIC - The data store contents will be modified once and used many times.
    • + *
    • DYNAMIC - The data store contents will be modified repeatedly and used many times.
    • + *
    + *

    + *

    The nature of access may be one of these:

    + *

    + *

      + *
    • DRAW - The data store contents are modified by the application, and used as the source for GL drawing and image specification commands.
    • + *
    • READ - The data store contents are modified by reading data from the GL, and used to return that data when queried by the application.
    • + *
    • COPY - The data store contents are modified by reading data from the GL, and used as the source for GL drawing and image specification commands.
    • + *
    + * + * @param target the target buffer object. + * @param dataSize the size in bytes of the buffer object's new data store + * @param usage the expected usage pattern of the data store. + */ + public void glBufferData(int target, long dataSize, int usage); + + /** + *

    Reference Page

    + *

    + * Creates and initializes a buffer object's data store. + *

    + *

    {@code usage} is a hint to the GL implementation as to how a buffer object's data store will be accessed. This enables the GL implementation to make + * more intelligent decisions that may significantly impact buffer object performance. It does not, however, constrain the actual usage of the data store. + * {@code usage} can be broken down into two parts: first, the frequency of access (modification and usage), and second, the nature of that access. The + * frequency of access may be one of these:

    + *

    + *

      + *
    • STREAM - The data store contents will be modified once and used at most a few times.
    • + *
    • STATIC - The data store contents will be modified once and used many times.
    • + *
    • DYNAMIC - The data store contents will be modified repeatedly and used many times.
    • + *
    + *

    + *

    The nature of access may be one of these:

    + *

    + *

      + *
    • DRAW - The data store contents are modified by the application, and used as the source for GL drawing and image specification commands.
    • + *
    • READ - The data store contents are modified by reading data from the GL, and used to return that data when queried by the application.
    • + *
    • COPY - The data store contents are modified by reading data from the GL, and used as the source for GL drawing and image specification commands.
    • + *
    + * + * @param target the target buffer object. + * @param data a pointer to data that will be copied into the data store for initialization, or {@code NULL} if no data is to be copied. + * @param usage the expected usage pattern of the data store. + */ + public void glBufferData(int target, FloatBuffer data, int usage); + + /** + *

    Reference Page

    + *

    + * Creates and initializes a buffer object's data store. + *

    + *

    {@code usage} is a hint to the GL implementation as to how a buffer object's data store will be accessed. This enables the GL implementation to make + * more intelligent decisions that may significantly impact buffer object performance. It does not, however, constrain the actual usage of the data store. + * {@code usage} can be broken down into two parts: first, the frequency of access (modification and usage), and second, the nature of that access. The + * frequency of access may be one of these:

    + *

    + *

      + *
    • STREAM - The data store contents will be modified once and used at most a few times.
    • + *
    • STATIC - The data store contents will be modified once and used many times.
    • + *
    • DYNAMIC - The data store contents will be modified repeatedly and used many times.
    • + *
    + *

    + *

    The nature of access may be one of these:

    + *

    + *

      + *
    • DRAW - The data store contents are modified by the application, and used as the source for GL drawing and image specification commands.
    • + *
    • READ - The data store contents are modified by reading data from the GL, and used to return that data when queried by the application.
    • + *
    • COPY - The data store contents are modified by reading data from the GL, and used as the source for GL drawing and image specification commands.
    • + *
    + * + * @param target the target buffer object. + * @param data a pointer to data that will be copied into the data store for initialization, or {@code NULL} if no data is to be copied + * @param usage the expected usage pattern of the data store. + */ + public void glBufferData(int target, ShortBuffer data, int usage); + + /** + *

    Reference Page

    + *

    + * Creates and initializes a buffer object's data store. + *

    + *

    {@code usage} is a hint to the GL implementation as to how a buffer object's data store will be accessed. This enables the GL implementation to make + * more intelligent decisions that may significantly impact buffer object performance. It does not, however, constrain the actual usage of the data store. + * {@code usage} can be broken down into two parts: first, the frequency of access (modification and usage), and second, the nature of that access. The + * frequency of access may be one of these:

    + *

    + *

      + *
    • STREAM - The data store contents will be modified once and used at most a few times.
    • + *
    • STATIC - The data store contents will be modified once and used many times.
    • + *
    • DYNAMIC - The data store contents will be modified repeatedly and used many times.
    • + *
    + *

    + *

    The nature of access may be one of these:

    + *

    + *

      + *
    • DRAW - The data store contents are modified by the application, and used as the source for GL drawing and image specification commands.
    • + *
    • READ - The data store contents are modified by reading data from the GL, and used to return that data when queried by the application.
    • + *
    • COPY - The data store contents are modified by reading data from the GL, and used as the source for GL drawing and image specification commands.
    • + *
    + * + * @param target the target buffer object. + * @param data a pointer to data that will be copied into the data store for initialization, or {@code NULL} if no data is to be copied. + * @param usage the expected usage pattern of the data store. + */ + public void glBufferData(int target, ByteBuffer data, int usage); + + /** + *

    Reference Page

    + *

    + * Updates a subset of a buffer object's data store. + * + * @param target the target buffer object. + * @param offset the offset into the buffer object's data store where data replacement will begin, measured in bytes. + * @param data a pointer to the new data that will be copied into the data store. + */ + public void glBufferSubData(int target, long offset, FloatBuffer data); + + /** + *

    Reference Page

    + *

    + * Updates a subset of a buffer object's data store. + * + * @param target the target buffer object. + * @param offset the offset into the buffer object's data store where data replacement will begin, measured in bytes. + * @param data a pointer to the new data that will be copied into the data store. + */ + public void glBufferSubData(int target, long offset, ShortBuffer data); + + /** + *

    Reference Page

    + *

    + * Updates a subset of a buffer object's data store. + * + * @param target the target buffer object. + * @param offset the offset into the buffer object's data store where data replacement will begin, measured in bytes. + * @param data a pointer to the new data that will be copied into the data store. + */ + public void glBufferSubData(int target, long offset, ByteBuffer data); + + /** + *

    Reference Page

    + *

    + * Sets portions of every pixel in a particular buffer to the same value. The value to which each buffer is cleared depends on the setting of the clear + * value for that buffer. + * + * @param mask Zero or the bitwise OR of one or more values indicating which buffers are to be cleared. + */ + public void glClear(int mask); + + /** + *

    Reference Page

    + * + * Sets the clear value for fixed-point and floating-point color buffers in RGBA mode. The specified components are stored as floating-point values. + * + * @param red the value to which to clear the R channel of the color buffer. + * @param green the value to which to clear the G channel of the color buffer. + * @param blue the value to which to clear the B channel of the color buffer. + * @param alpha the value to which to clear the A channel of the color buffer. + */ + public void glClearColor(float red, float green, float blue, float alpha); + + /** + *

    Reference Page

    + * + * Masks the writing of R, G, B and A values to all draw buffers. In the initial state, all color values are enabled for writing for all draw buffers. + * + * @param red whether R values are written or not. + * @param green whether G values are written or not. + * @param blue whether B values are written or not. + * @param alpha whether A values are written or not. + */ + public void glColorMask(boolean red, boolean green, boolean blue, boolean alpha); + + /** + *

    Reference Page

    + *

    + * Compiles a shader object. + * + * @param shader the shader object to be compiled. + */ + public void glCompileShader(int shader); + + /** + *

    Reference Page

    + *

    + * Specifies a two-dimensional texture image in a compressed format. + * + * @param target the target texture. + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param internalFormat the format of the compressed image data. + * @param width the width of the texture image + * @param height the height of the texture image + * @param border must be 0 + * @param data a pointer to the compressed image data + */ + public void glCompressedTexImage2D(int target, int level, int internalFormat, int width, int height, int border, + ByteBuffer data); + + /** + *

    Reference Page

    + *

    + * Respecifies only a rectangular subregion of an existing 2D texel array, with incoming data stored in a specific compressed image format. + * + * @param target the target texture. + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param xoffset a texel offset in the x direction within the texture array. + * @param yoffset a texel offset in the y direction within the texture array. + * @param width the width of the texture subimage. + * @param height the height of the texture subimage. + * @param format the format of the compressed image data stored at address {@code data}. + * @param data a pointer to the compressed image data. + */ + public void glCompressedTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, + ByteBuffer data); + + /** + *

    Reference Page

    + *

    + * Creates a program object. + */ + public int glCreateProgram(); + + /** + *

    Reference Page

    + *

    + * Creates a shader object. + * + * @param shaderType the type of shader to be created. One of:
    {@link #GL_VERTEX_SHADER VERTEX_SHADER}{@link #GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL3#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link GL4#GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link GL4#GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + */ + public int glCreateShader(int shaderType); + + /** + *

    Reference Page

    + *

    + * Specifies which polygon faces are culled if {@link #GL_CULL_FACE CULL_FACE} is enabled. Front-facing polygons are rasterized if either culling is disabled or the + * CullFace mode is {@link #GL_BACK BACK} while back-facing polygons are rasterized only if either culling is disabled or the CullFace mode is + * {@link #GL_FRONT FRONT}. The initial setting of the CullFace mode is {@link #GL_BACK BACK}. Initially, culling is disabled. + * + * @param mode the CullFace mode. One of:
    {@link #GL_FRONT FRONT}{@link #GL_BACK BACK}{@link #GL_FRONT_AND_BACK FRONT_AND_BACK}
    + */ + public void glCullFace(int mode); + + /** + *

    Reference Page

    + *

    + * Deletes named buffer objects. + * + * @param buffers an array of buffer objects to be deleted. + */ + public void glDeleteBuffers(IntBuffer buffers); + + /** + *

    Reference Page

    + *

    + * Deletes a program object. + * + * @param program the program object to be deleted. + */ + public void glDeleteProgram(int program); + + /** + *

    Reference Page

    + *

    + * Deletes a shader object. + * + * @param shader the shader object to be deleted. + */ + public void glDeleteShader(int shader); + + /** + *

    Reference Page

    + *

    + * Deletes texture objects. After a texture object is deleted, it has no contents or dimensionality, and its name is again unused. If a texture that is + * currently bound to any of the target bindings of {@link #glBindTexture BindTexture} is deleted, it is as though {@link #glBindTexture BindTexture} had been executed with the + * same target and texture zero. Additionally, special care must be taken when deleting a texture if any of the images of the texture are attached to a + * framebuffer object. + *

    + *

    Unused names in textures that have been marked as used for the purposes of {@link #glGenTextures GenTextures} are marked as unused again. Unused names in textures are + * silently ignored, as is the name zero.

    + * + * @param textures contains {@code n} names of texture objects to be deleted. + */ + public void glDeleteTextures(IntBuffer textures); + + /** + *

    Reference Page

    + *

    + * Specifies the comparison that takes place during the depth buffer test (when {@link #GL_DEPTH_TEST DEPTH_TEST} is enabled). + * + * @param func the depth test comparison. One of:
    {@link #GL_NEVER NEVER}{@link #GL_ALWAYS ALWAYS}{@link #GL_LESS LESS}{@link #GL_LEQUAL LEQUAL}{@link #GL_EQUAL EQUAL}{@link #GL_GREATER GREATER}{@link #GL_GEQUAL GEQUAL}{@link #GL_NOTEQUAL NOTEQUAL}
    + */ + public void glDepthFunc(int func); + + /** + *

    Reference Page

    + *

    + * Masks the writing of depth values to the depth buffer. In the initial state, the depth buffer is enabled for writing. + * + * @param flag whether depth values are written or not. + */ + public void glDepthMask(boolean flag); + + /** + *

    Reference Page

    + *

    + * Sets the depth range for all viewports to the same values. + * + * @param nearVal the near depth range. + * @param farVal the far depth range. + */ + public void glDepthRange(double nearVal, double farVal); + + /** + *

    Reference Page

    + *

    + * Detaches a shader object from a program object to which it is attached. + * + * @param program the program object from which to detach the shader object. + * @param shader the shader object to be detached. + */ + public void glDetachShader(int program, int shader); + + /** + *

    Reference Page

    + *

    + * Disables the specified OpenGL state. + * + * @param cap the OpenGL state to disable. + */ + public void glDisable(int cap); + + /** + *

    Reference Page

    + *

    + * Disables a generic vertex attribute array. + * + * @param index the index of the generic vertex attribute to be disabled. + */ + public void glDisableVertexAttribArray(int index); + + /** + *

    Reference Page

    + *

    + * Constructs a sequence of geometric primitives by successively transferring elements for {@code count} vertices. Elements {@code first} through + * first + count – 1 of each enabled non-instanced array are transferred to the GL. + *

    + *

    If an array corresponding to an attribute required by a vertex shader is not enabled, then the corresponding element is taken from the current attribute + * state. If an array is enabled, the corresponding current vertex attribute value is unaffected by the execution of this function.

    + * + * @param mode the kind of primitives being constructed. + * @param first the first vertex to transfer to the GL. + * @param count the number of vertices after {@code first} to transfer to the GL. + */ + public void glDrawArrays(int mode, int first, int count); + + /** + *

    Reference Page

    + *

    + *

    Implementations denote recommended maximum amounts of vertex and index data, which may be queried by calling glGet with argument + * {@link GL2#GL_MAX_ELEMENTS_VERTICES MAX_ELEMENTS_VERTICES} and {@link GL2#GL_MAX_ELEMENTS_INDICES MAX_ELEMENTS_INDICES}. If end - start + 1 is greater than the value of GL_MAX_ELEMENTS_VERTICES, or if + * count is greater than the value of GL_MAX_ELEMENTS_INDICES, then the call may operate at reduced performance. There is no requirement that all vertices + * in the range start end be referenced. However, the implementation may partially process unused vertices, reducing performance from what could be + * achieved with an optimal index set.

    + *

    + *

    When glDrawRangeElements is called, it uses count sequential elements from an enabled array, starting at start to construct a sequence of geometric + * primitives. mode specifies what kind of primitives are constructed, and how the array elements construct these primitives. If more than one array is + * enabled, each is used.

    + *

    + *

    Vertex attributes that are modified by glDrawRangeElements have an unspecified value after glDrawRangeElements returns. Attributes that aren't modified + * maintain their previous values.

    + *

    + *

    Errors
    + *

    + *

    It is an error for indices to lie outside the range start end, but implementations may not check for this situation. Such indices cause + * implementation-dependent behavior.

    + *

    + *

      + *
    • GL_INVALID_ENUM is generated if mode is not an accepted value.
    • + *
    • GL_INVALID_VALUE is generated if count is negative.
    • + *
    • GL_INVALID_VALUE is generated if end < start.
    • + *
    • GL_INVALID_OPERATION is generated if a geometry shader is active and mode is incompatible with the input primitive type of the geometry shader in the + * currently installed program object.
    • + *
    • GL_INVALID_OPERATION is generated if a non-zero buffer object name is bound to an enabled array or the element array and the buffer object's data + * store is currently mapped.
    • + *
    + * + * @param mode the kind of primitives to render. + * @param start the minimum array index contained in {@code indices}. + * @param end the maximum array index contained in {@code indices}. + * @param count the number of elements to be rendered. + * @param type the type of the values in {@code indices}. + * @param indices a pointer to the location where the indices are stored. + */ + public void glDrawRangeElements(int mode, int start, int end, int count, int type, long indices); /// GL2+ + + /** + *

    Reference Page

    + *

    + * Enables the specified OpenGL state. + * + * @param cap the OpenGL state to enable. + */ + public void glEnable(int cap); + + /** + *

    Reference Page

    + *

    + * Enables a generic vertex attribute array. + * + * @param index the index of the generic vertex attribute to be enabled. + */ + public void glEnableVertexAttribArray(int index); + + /** + *

    Reference Page

    + *

    + * Marks the end of the sequence of commands to be tracked for the active query specified by {@code target}. + * + * @param target the query object target. + */ public void glEndQuery(int target); - public void glGenBuffers(IntBuffer buffers); - public void glGenTextures(IntBuffer textures); + + /** + *

    Reference Page

    + *

    + * Generates buffer object names. + * + * @param buffers a buffer in which the generated buffer object names are stored. + */ + public void glGenBuffers(IntBuffer buffers); + + /** + *

    Reference Page

    + *

    + * Returns n previously unused texture names in textures. These names are marked as used, for the purposes of GenTextures only, but they acquire texture + * state and a dimensionality only when they are first bound, just as if they were unused. + * + * @param textures a scalar or buffer in which to place the returned texture names. + */ + public void glGenTextures(IntBuffer textures); + + /** + *

    Reference Page

    + *

    + * Generates query object names. + * + * @param ids a buffer in which the generated query object names are stored. + */ public void glGenQueries(int number, IntBuffer ids); - public int glGetAttribLocation(int program, String name); - public void glGetBoolean(int pname, ByteBuffer params); - public void glGetBufferSubData(int target, long offset, ByteBuffer data); - public int glGetError(); - public void glGetInteger(int pname, IntBuffer params); - public void glGetProgram(int program, int pname, IntBuffer params); - public String glGetProgramInfoLog(int program, int maxSize); + + /** + *

    Reference Page

    + *

    + * Returns the location of an attribute variable. + * + * @param program the program object to be queried. + * @param name a null terminated string containing the name of the attribute variable whose location is to be queried. + */ + public int glGetAttribLocation(int program, String name); + + /** + *

    Reference Page

    + *

    + * Returns the current boolean value of the specified state variable. + *

    + *

    LWJGL note: The state that corresponds to the state variable may be a single value or an array of values. In the case of an array of values, + * LWJGL will not validate if {@code params} has enough space to store that array. Doing so would introduce significant overhead, as the + * OpenGL state variables are too many. It is the user's responsibility to avoid JVM crashes by ensuring enough space for the returned values.

    + * + * @param pname the state variable. + * @param params a scalar or buffer in which to place the returned data. + */ + public void glGetBoolean(int pname, ByteBuffer params); + + /** + *

    Reference Page

    + *

    + * Returns a subset of a buffer object's data store. + * + * @param target the target buffer object. + * @param offset the offset into the buffer object's data store from which data will be returned, measured in bytes. + * @param data a pointer to the location where buffer object data is returned. + */ + public void glGetBufferSubData(int target, long offset, ByteBuffer data); + + /** + *

    Reference Page

    + *

    + * Returns error information. Each detectable error is assigned a numeric code. When an error is detected, a flag is set and the code is recorded. Further + * errors, if they occur, do not affect this recorded code. When {@code GetError} is called, the code is returned and the flag is cleared, so that a + * further error will again record its code. If a call to {@code GetError} returns {@link #GL_NO_ERROR NO_ERROR}, then there has been no detectable error since + * the last call to {@code GetError} (or since the GL was initialized). + */ + public int glGetError(); + + /** + *

    Reference Page

    + *

    + * Returns the current integer value of the specified state variable. + *

    + *

    LWJGL note: The state that corresponds to the state variable may be a single value or an array of values. In the case of an array of values, + * LWJGL will not validate if {@code params} has enough space to store that array. Doing so would introduce significant overhead, as the + * OpenGL state variables are too many. It is the user's responsibility to avoid JVM crashes by ensuring enough space for the returned values.

    + * + * @param pname the state variable. + * @param params a scalar or buffer in which to place the returned data. + */ + public void glGetInteger(int pname, IntBuffer params); + + /** + *

    Reference Page

    + *

    + * Returns a parameter from a program object. + * + * @param program the program object to be queried. + * @param pname the object parameter. + * @param params the requested object parameter. + */ + public void glGetProgram(int program, int pname, IntBuffer params); + + /** + *

    Reference Page

    + *

    + * Returns the information log for a program object. + * + * @param program the program object whose information log is to be queried. + * @param maxSize the size of the character buffer for storing the returned information log. + */ + public String glGetProgramInfoLog(int program, int maxSize); + + /** + * Unsigned version. + * + * @param query the name of a query object + * @param pname the symbolic name of a query object parameter + */ public long glGetQueryObjectui64(int query, int pname); + + /** + *

    Reference Page

    + *

    + * Returns the integer value of a query object parameter. + * + * @param query the name of a query object + * @param pname the symbolic name of a query object parameter. One of:
    {@link #GL_QUERY_RESULT QUERY_RESULT}{@link #GL_QUERY_RESULT_AVAILABLE QUERY_RESULT_AVAILABLE}
    + */ public int glGetQueryObjectiv(int query, int pname); + + /** + *

    Reference Page

    + *

    + * Returns a parameter from a shader object. + * + * @param shader the shader object to be queried. + * @param pname the object parameter. + * @param params the requested object parameter. + */ public void glGetShader(int shader, int pname, IntBuffer params); - public String glGetShaderInfoLog(int shader, int maxSize); - public String glGetString(int name); - public int glGetUniformLocation(int program, String name); - public boolean glIsEnabled(int cap); - public void glLineWidth(float width); - public void glLinkProgram(int program); - public void glPixelStorei(int pname, int param); - public void glPolygonOffset(float factor, float units); - public void glReadPixels(int x, int y, int width, int height, int format, int type, ByteBuffer data); - public void glReadPixels(int x, int y, int width, int height, int format, int type, long offset); - public void glScissor(int x, int y, int width, int height); - public void glShaderSource(int shader, String[] string, IntBuffer length); - public void glStencilFuncSeparate(int face, int func, int ref, int mask); - public void glStencilOpSeparate(int face, int sfail, int dpfail, int dppass); - public void glTexImage2D(int target, int level, int internalFormat, int width, int height, int border, int format, int type, ByteBuffer data); - public void glTexParameterf(int target, int pname, float param); - public void glTexParameteri(int target, int pname, int param); - public void glTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, ByteBuffer data); - public void glUniform1(int location, FloatBuffer value); - public void glUniform1(int location, IntBuffer value); - public void glUniform1f(int location, float v0); - public void glUniform1i(int location, int v0); - public void glUniform2(int location, IntBuffer value); - public void glUniform2(int location, FloatBuffer value); - public void glUniform2f(int location, float v0, float v1); - public void glUniform3(int location, IntBuffer value); - public void glUniform3(int location, FloatBuffer value); - public void glUniform3f(int location, float v0, float v1, float v2); - public void glUniform4(int location, FloatBuffer value); - public void glUniform4(int location, IntBuffer value); - public void glUniform4f(int location, float v0, float v1, float v2, float v3); - public void glUniformMatrix3(int location, boolean transpose, FloatBuffer value); - public void glUniformMatrix4(int location, boolean transpose, FloatBuffer value); - public void glUseProgram(int program); - public void glVertexAttribPointer(int index, int size, int type, boolean normalized, int stride, long pointer); - public void glViewport(int x, int y, int width, int height); -} + + /** + *

    Reference Page

    + *

    + * Returns the information log for a shader object. + * + * @param shader the shader object whose information log is to be queried. + * @param maxSize the size of the character buffer for storing the returned information log. + */ + public String glGetShaderInfoLog(int shader, int maxSize); + + /** + *

    Reference Page

    + *

    + * Return strings describing properties of the current GL context. + * + * @param name the property to query. One of:
    {@link #GL_RENDERER RENDERER}{@link #GL_VENDOR VENDOR}{@link #GL_EXTENSIONS EXTENSIONS}{@link #GL_VERSION VERSION}{@link GL2#GL_SHADING_LANGUAGE_VERSION SHADING_LANGUAGE_VERSION}
    + */ + public String glGetString(int name); + + /** + *

    Reference Page

    + *

    + * Returns the location of a uniform variable. + * + * @param program the program object to be queried. + * @param name a null terminated string containing the name of the uniform variable whose location is to be queried. + */ + public int glGetUniformLocation(int program, String name); + + /** + *

    Reference Page

    + *

    + * Determines if {@code cap} is currently enabled (as with {@link #glEnable Enable}) or disabled. + * + * @param cap the enable state to query. + */ + public boolean glIsEnabled(int cap); + + /** + *

    Reference Page

    + * + * Sets the width of rasterized line segments. The default width is 1.0. + * + * @param width the line width. + */ + public void glLineWidth(float width); + + /** + *

    Reference Page

    + * + * Links a program object. + * + * @param program the program object to be linked. + */ + public void glLinkProgram(int program); + + /** + *

    Reference Page

    + *

    + * Sets the integer value of a pixel store parameter. + * + * @param pname the pixel store parameter to set. + * @param param the parameter value + */ + public void glPixelStorei(int pname, int param); + + /** + *

    Reference Page

    + *

    + * The depth values of all fragments generated by the rasterization of a polygon may be offset by a single value that is computed for that polygon. This + * function determines that value. + *

    + *

    {@code factor} scales the maximum depth slope of the polygon, and {@code units} scales an implementation-dependent constant that relates to the usable + * resolution of the depth buffer. The resulting values are summed to produce the polygon offset value.

    + * + * @param factor the maximum depth slope factor. + * @param units the constant scale. + */ + public void glPolygonOffset(float factor, float units); + + /** + *

    Reference Page

    + *

    + * ReadPixels obtains values from the selected read buffer from each pixel with lower left hand corner at {@code (x + i, y + j)} for {@code 0 <= i < width} + * and {@code 0 <= j < height}; this pixel is said to be the ith pixel in the jth row. If any of these pixels lies outside of the + * window allocated to the current GL context, or outside of the image attached to the currently bound read framebuffer object, then the values obtained + * for those pixels are undefined. When {@link GLFbo#GL_READ_FRAMEBUFFER_BINDING_EXT READ_FRAMEBUFFER_BINDING} is zero, values are also undefined for individual pixels that are not owned by + * the current context. Otherwise, {@code ReadPixels} obtains values from the selected buffer, regardless of how those values were placed there. + * + * @param x the left pixel coordinate + * @param y the lower pixel coordinate + * @param width the number of pixels to read in the x-dimension + * @param height the number of pixels to read in the y-dimension + * @param format the pixel format. + * @param type the pixel type. + * @param data a buffer in which to place the returned pixel data. + */ + public void glReadPixels(int x, int y, int width, int height, int format, int type, ByteBuffer data); + + + /** + *

    Reference Page

    + *

    + * ReadPixels obtains values from the selected read buffer from each pixel with lower left hand corner at {@code (x + i, y + j)} for {@code 0 <= i < width} + * and {@code 0 <= j < height}; this pixel is said to be the ith pixel in the jth row. If any of these pixels lies outside of the + * window allocated to the current GL context, or outside of the image attached to the currently bound read framebuffer object, then the values obtained + * for those pixels are undefined. When {@link GLFbo#GL_READ_FRAMEBUFFER_BINDING_EXT READ_FRAMEBUFFER_BINDING} is zero, values are also undefined for individual pixels that are not owned by + * the current context. Otherwise, {@code ReadPixels} obtains values from the selected buffer, regardless of how those values were placed there. + * + * @param x the left pixel coordinate + * @param y the lower pixel coordinate + * @param width the number of pixels to read in the x-dimension + * @param height the number of pixels to read in the y-dimension + * @param format the pixel format. + * @param type the pixel type. + * @param offset a buffer in which to place the returned pixel data/ + */ + public void glReadPixels(int x, int y, int width, int height, int format, int type, long offset); + + /** + *

    Reference Page

    + *

    + * Defines the scissor rectangle for all viewports. The scissor test is enabled or disabled for all viewports using {@link #glEnable Enable} or {@link #glDisable Disable} + * with the symbolic constant {@link #GL_SCISSOR_TEST SCISSOR_TEST}. When disabled, it is as if the scissor test always passes. When enabled, if + * left <= xw < left + width and bottom <= yw < bottom + height for the scissor rectangle, then the scissor + * test passes. Otherwise, the test fails and the fragment is discarded. + * + * @param x the left scissor rectangle coordinate. + * @param y the bottom scissor rectangle coordinate. + * @param width the scissor rectangle width. + * @param height the scissor rectangle height. + */ + public void glScissor(int x, int y, int width, int height); + + /** + *

    Reference Page

    + *

    + * Sets the source code in {@code shader} to the source code in the array of strings specified by {@code strings}. Any source code previously stored in the + * shader object is completely replaced. The number of strings in the array is specified by {@code count}. If {@code length} is {@code NULL}, each string is + * assumed to be null terminated. If {@code length} is a value other than {@code NULL}, it points to an array containing a string length for each of the + * corresponding elements of {@code strings}. Each element in the length array may contain the length of the corresponding string (the null character is not + * counted as part of the string length) or a value less than 0 to indicate that the string is null terminated. The source code strings are not scanned or + * parsed at this time; they are simply copied into the specified shader object. + * + * @param shader the shader object whose source code is to be replaced, + * @param strings an array of pointers to strings containing the source code to be loaded into the shader + */ + public void glShaderSource(int shader, String[] strings, IntBuffer length); + + /** + *

    Reference Page

    + *

    + * Sets front and/or back function and reference value for stencil testing. + * + * @param face whether front and/or back stencil state is updated. One of:
    {@link GL#GL_FRONT FRONT}{@link GL#GL_BACK BACK}{@link GL#GL_FRONT_AND_BACK FRONT_AND_BACK}
    + * @param func the test function. The initial value is GL_ALWAYS. One of:
    {@link GL#GL_NEVER NEVER}{@link GL#GL_LESS LESS}{@link GL#GL_LEQUAL LEQUAL}{@link GL#GL_GREATER GREATER}{@link GL#GL_GEQUAL GEQUAL}{@link GL#GL_EQUAL EQUAL}{@link GL#GL_NOTEQUAL NOTEQUAL}{@link GL#GL_ALWAYS ALWAYS}
    + * @param ref the reference value for the stencil test. {@code ref} is clamped to the range [0, 2n – 1], where {@code n} is the number of bitplanes in the stencil + * buffer. The initial value is 0. + * @param mask a mask that is ANDed with both the reference value and the stored stencil value when the test is done. The initial value is all 1's. + */ + public void glStencilFuncSeparate(int face, int func, int ref, int mask); + + /** + *

    Reference Page

    + *

    + * Sets front and/or back stencil test actions. + * + * @param face whether front and/or back stencil state is updated. One of:
    {@link GL#GL_FRONT FRONT}{@link GL#GL_BACK BACK}{@link GL#GL_FRONT_AND_BACK FRONT_AND_BACK}
    + * @param sfail the action to take when the stencil test fails. The initial value is GL_KEEP. One of:
    {@link GL#GL_KEEP KEEP}{@link GL#GL_ZERO ZERO}{@link GL#GL_REPLACE REPLACE}{@link GL#GL_INCR INCR}{@link GL#GL_INCR_WRAP INCR_WRAP}{@link GL#GL_DECR DECR}{@link GL#GL_DECR_WRAP DECR_WRAP}{@link GL#GL_INVERT INVERT}
    + * @param dpfail the stencil action when the stencil test passes, but the depth test fails. The initial value is GL_KEEP. + * @param dppass the stencil action when both the stencil test and the depth test pass, or when the stencil test passes and either there is no depth buffer or depth + * testing is not enabled. The initial value is GL_KEEP. + */ + public void glStencilOpSeparate(int face, int sfail, int dpfail, int dppass); + + /** + *

    Reference Page

    + *

    + * Specifies a two-dimensional texture image. + * + * @param target the texture target. + * @param level the level-of-detail number. + * @param internalFormat the texture internal format. + * @param width the texture width. + * @param height the texture height. + * @param border the texture border width. + * @param format the texel data format. + * @param type the texel data type. + * @param data the texel data. + */ + public void glTexImage2D(int target, int level, int internalFormat, int width, int height, int border, int format, + int type, ByteBuffer data); + + /** + *

    Reference Page

    + *

    + * Float version of {@link #glTexParameteri TexParameteri}. + * + * @param target the texture target. + * @param pname the parameter to set. + * @param param the parameter value. + */ + public void glTexParameterf(int target, int pname, float param); + + /** + *

    Reference Page

    + *

    + * Sets the integer value of a texture parameter, which controls how the texel array is treated when specified or changed, and when applied to a fragment. + * + * @param target the texture target. + * @param pname the parameter to set. + * @param param the parameter value. + */ + public void glTexParameteri(int target, int pname, int param); + + /** + *

    Reference Page

    + *

    + * Respecifies a rectangular subregion of an existing texel array. No change is made to the internalformat, width, height, depth, or border parameters of + * the specified texel array, nor is any change made to texel values outside the specified subregion. + * + * @param target the texture target. + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param yoffset the bottom coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param format the pixel data format. + * @param type the pixel data type. + * @param data the pixel data. + */ + public void glTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, + ByteBuffer data); + + /** + *

    Reference Page

    + *

    + * Specifies the value of a single float uniform variable or a float uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified. + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable. + */ + public void glUniform1(int location, FloatBuffer value); + + /** + *

    Reference Page

    + *

    + * Specifies the value of a single int uniform variable or a int uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified. + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable. + */ + public void glUniform1(int location, IntBuffer value); + + /** + *

    Reference Page

    + *

    + * Specifies the value of a float uniform variable for the current program object. + * + * @param location the location of the uniform variable to be modified. + * @param v0 the uniform value. + */ + public void glUniform1f(int location, float v0); + + /** + *

    Reference Page

    + *

    + * Specifies the value of an int uniform variable for the current program object. + * + * @param location the location of the uniform variable to be modified. + * @param v0 the uniform value. + */ + public void glUniform1i(int location, int v0); + + /** + *

    Reference Page

    + *

    + * Specifies the value of a single ivec2 uniform variable or an ivec2 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified. + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable. + */ + public void glUniform2(int location, IntBuffer value); + + /** + *

    Reference Page

    + *

    + * Specifies the value of a single vec2 uniform variable or a vec2 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified. + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable. + */ + public void glUniform2(int location, FloatBuffer value); + + /** + *

    Reference Page

    + *

    + * Specifies the value of a vec2 uniform variable for the current program object. + * + * @param location the location of the uniform variable to be modified. + * @param v0 the uniform x value. + * @param v1 the uniform y value. + */ + public void glUniform2f(int location, float v0, float v1); + + /** + *

    Reference Page

    + *

    + * Specifies the value of a single ivec3 uniform variable or an ivec3 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified. + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable. + */ + public void glUniform3(int location, IntBuffer value); + + /** + *

    Reference Page

    + *

    + * Specifies the value of a single vec3 uniform variable or a vec3 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified. + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable. + */ + public void glUniform3(int location, FloatBuffer value); + + /** + *

    Reference Page

    + *

    + * Specifies the value of a vec3 uniform variable for the current program object. + * + * @param location the location of the uniform variable to be modified. + * @param v0 the uniform x value. + * @param v1 the uniform y value. + * @param v2 the uniform z value. + */ + public void glUniform3f(int location, float v0, float v1, float v2); + + /** + *

    Reference Page

    + *

    + * Specifies the value of a single vec4 uniform variable or a vec4 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified. + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable. + */ + public void glUniform4(int location, FloatBuffer value); + + /** + *

    Reference Page

    + *

    + * Specifies the value of a single ivec4 uniform variable or an ivec4 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified. + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable. + */ + public void glUniform4(int location, IntBuffer value); + + /** + *

    Reference Page

    + *

    + * Specifies the value of a vec4 uniform variable for the current program object. + * + * @param location the location of the uniform variable to be modified. + * @param v0 the uniform x value. + * @param v1 the uniform y value. + * @param v2 the uniform z value. + * @param v3 the uniform w value. + */ + public void glUniform4f(int location, float v0, float v1, float v2, float v3); + + /** + *

    Reference Page

    + *

    + * Specifies the value of a single mat3 uniform variable or a mat3 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified. + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable. + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable. + */ + public void glUniformMatrix3(int location, boolean transpose, FloatBuffer value); + + /** + *

    Reference Page

    + *

    + * Specifies the value of a single mat4 uniform variable or a mat4 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified. + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable. + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable. + */ + public void glUniformMatrix4(int location, boolean transpose, FloatBuffer value); + + /** + *

    Reference Page

    + *

    + * Installs a program object as part of current rendering state. + * + * @param program the program object whose executables are to be used as part of current rendering state. + */ + public void glUseProgram(int program); + + /** + *

    Reference Page

    + *

    + * Specifies the location and organization of a vertex attribute array. + * + * @param index the index of the generic vertex attribute to be modified + * @param size the number of values per vertex that are stored in the array. + * @param type the data type of each component in the array. The initial value is GL_FLOAT. + * @param normalized whether fixed-point data values should be normalized or converted directly as fixed-point values when they are accessed + * @param stride the byte offset between consecutive generic vertex attributes. If stride is 0, the generic vertex attributes are understood to be tightly packed in + * the array. The initial value is 0. + * @param pointer the vertex attribute data or the offset of the first component of the first generic vertex attribute in the array in the data store of the buffer + * currently bound to the {@link GL#GL_ARRAY_BUFFER ARRAY_BUFFER} target. The initial value is 0. + */ + public void glVertexAttribPointer(int index, int size, int type, boolean normalized, int stride, long pointer); + + /** + *

    Reference Page

    + *

    + * Specifies the viewport transformation parameters for all viewports. + *

    + *

    In the initial state, {@code width} and {@code height} for each viewport are set to the width and height, respectively, of the window into which the GL is to do + * its rendering. If the default framebuffer is bound but no default framebuffer is associated with the GL context, then {@code width} and {@code height} are + * initially set to zero.

    + * + * @param x the left viewport coordinate. + * @param y the bottom viewport coordinate. + * @param width the viewport width. + * @param height the viewport height. + */ + public void glViewport(int x, int y, int width, int height); +} \ No newline at end of file diff --git a/jme3-core/src/main/java/com/jme3/renderer/opengl/GL2.java b/jme3-core/src/main/java/com/jme3/renderer/opengl/GL2.java index 8f7bb2f84..fbd6e088d 100644 --- a/jme3-core/src/main/java/com/jme3/renderer/opengl/GL2.java +++ b/jme3-core/src/main/java/com/jme3/renderer/opengl/GL2.java @@ -35,11 +35,11 @@ import java.nio.ByteBuffer; /** * GL functions only available on vanilla desktop OpenGL 2. - * + * * @author Kirill Vainer */ public interface GL2 extends GL { - + public static final int GL_ALPHA8 = 0x803C; public static final int GL_ALPHA_TEST = 0xBC0; public static final int GL_BGR = 0x80E0; @@ -50,10 +50,11 @@ public interface GL2 extends GL { public static final int GL_DEPTH_TEXTURE_MODE = 0x884B; public static final int GL_DOUBLEBUFFER = 0xC32; public static final int GL_DRAW_BUFFER = 0xC01; + public static final int GL_POINT = 0x1B00; + public static final int GL_LINE = 0x1B01; public static final int GL_FILL = 0x1B02; public static final int GL_GENERATE_MIPMAP = 0x8191; public static final int GL_INTENSITY = 0x8049; - public static final int GL_LINE = 0x1B01; public static final int GL_LUMINANCE8 = 0x8040; public static final int GL_LUMINANCE8_ALPHA8 = 0x8045; public static final int GL_MAX_ELEMENTS_INDICES = 0x80E9; @@ -73,14 +74,133 @@ public interface GL2 extends GL { public static final int GL_TEXTURE_WRAP_R = 0x8072; public static final int GL_VERTEX_PROGRAM_POINT_SIZE = 0x8642; public static final int GL_UNSIGNED_INT_8_8_8_8 = 0x8035; - + + /** + *

    Reference Page - This function is deprecated and unavailable in the Core profile

    + * + * The alpha test discards a fragment conditionally based on the outcome of a comparison between the incoming fragment’s alpha value and a constant value. + * The comparison is enabled or disabled with the generic {@link #glEnable Enable} and {@link #glDisable Disable} commands using the symbolic constant {@link #GL_ALPHA_TEST ALPHA_TEST}. + * When disabled, it is as if the comparison always passes. The test is controlled with this method. + * + * @param func a symbolic constant indicating the alpha test function. One of:
    {@link #GL_NEVER NEVER}{@link #GL_ALWAYS ALWAYS}{@link #GL_LESS LESS}{@link #GL_LEQUAL LEQUAL}{@link #GL_EQUAL EQUAL}{@link #GL_GEQUAL GEQUAL}{@link #GL_GREATER GREATER}{@link #GL_NOTEQUAL NOTEQUAL}
    + * @param ref a reference value clamped to the range [0, 1]. When performing the alpha test, the GL will convert the reference value to the same representation as the fragment's alpha value (floating-point or fixed-point). + */ public void glAlphaFunc(int func, float ref); + + /** + *

    Reference Page

    + *

    + * Controls the rasterization of points if no vertex, tessellation control, tessellation evaluation, or geometry shader is active. The default point size is 1.0. + * + * @param size the request size of a point. + */ public void glPointSize(float size); + + /** + *

    Reference Page

    + * + * Controls the interpretation of polygons for rasterization. + * + *

    {@link #GL_FILL FILL} is the default mode of polygon rasterization. Note that these modes affect only the final rasterization of polygons: in particular, a + * polygon's vertices are lit, and the polygon is clipped and possibly culled before these modes are applied. Polygon antialiasing applies only to the + * {@link #GL_FILL FILL} state of PolygonMode. For {@link #GL_POINT POINT} or {@link #GL_LINE LINE}, point antialiasing or line segment antialiasing, respectively, apply.

    + * + * @param face the face for which to set the rasterizing method. One of:
    {@link #GL_FRONT FRONT}{@link #GL_BACK BACK}{@link #GL_FRONT_AND_BACK FRONT_AND_BACK}
    + * @param mode the rasterization mode. One of:
    {@link #GL_POINT POINT}{@link #GL_LINE LINE}{@link #GL_FILL FILL}
    + */ public void glPolygonMode(int face, int mode); + + /** + *

    Reference Page

    + *

    + * Defines the color buffer to which fragment color zero is written. + * + * @param mode the color buffer to draw to. + */ public void glDrawBuffer(int mode); + + /** + *

    Reference Page

    + *

    + * Defines the color buffer from which values are obtained. + * + * @param mode the color buffer to read from. + */ public void glReadBuffer(int mode); - public void glCompressedTexImage3D(int target, int level, int internalformat, int width, int height, int depth, int border, ByteBuffer data); - public void glCompressedTexSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, ByteBuffer data); - public void glTexImage3D(int target, int level, int internalFormat, int width, int height, int depth, int border, int format, int type, ByteBuffer data); - public void glTexSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, ByteBuffer data); + + /** + *

    Reference Page

    + *

    + * Specifies a three-dimensional texture image in a compressed format. + * + * @param target the target texture. + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param internalFormat the format of the compressed image data. + * @param width the width of the texture image + * @param height the height of the texture image + * @param depth the depth of the texture image + * @param border must be 0 + * @param data a pointer to the compressed image data + */ + public void glCompressedTexImage3D(int target, int level, int internalFormat, int width, int height, int depth, + int border, ByteBuffer data); + + /** + *

    Reference Page

    + *

    + * Respecifies only a cubic subregion of an existing 3D texel array, with incoming data stored in a specific compressed image format. + * + * @param target the target texture. + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param xoffset a texel offset in the x direction within the texture array. + * @param yoffset a texel offset in the y direction within the texture array. + * @param zoffset a texel offset in the z direction within the texture array. + * @param width the width of the texture subimage. + * @param height the height of the texture subimage. + * @param depth the depth of the texture subimage. + * @param format the format of the compressed image data stored at address {@code data}. + * @param data a pointer to the compressed image data. + */ + public void glCompressedTexSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int width, + int height, int depth, int format, ByteBuffer data); + + /** + *

    Reference Page

    + *

    + * Specifies a three-dimensional texture image. + * + * @param target the texture target. + * @param level the level-of-detail number. + * @param internalFormat the texture internal format. + * @param width the texture width. + * @param height the texture height. + * @param depth the texture depth. + * @param border the texture border width. + * @param format the texel data format. + * @param type the texel data type. + * @param data the texel data. + */ + public void glTexImage3D(int target, int level, int internalFormat, int width, int height, int depth, int border, + int format, int type, ByteBuffer data); + + /** + *

    Reference Page

    + *

    + * Respecifies a cubic subregion of an existing 3D texel array. No change is made to the internalformat, width, height, depth, or border parameters of + * the specified texel array, nor is any change made to texel values outside the specified subregion. + * + * @param target the texture target. + * @param level the level-of-detail-number. + * @param xoffset the x coordinate of the texel subregion. + * @param yoffset the y coordinate of the texel subregion. + * @param zoffset the z coordinate of the texel subregion. + * @param width the subregion width. + * @param height the subregion height. + * @param depth the subregion depth. + * @param format the pixel data format. + * @param type the pixel data type. + * @param data the pixel data. + */ + public void glTexSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, + int depth, int format, int type, ByteBuffer data); } diff --git a/jme3-core/src/main/java/com/jme3/renderer/opengl/GL3.java b/jme3-core/src/main/java/com/jme3/renderer/opengl/GL3.java index b3e112545..dcf1d91eb 100644 --- a/jme3-core/src/main/java/com/jme3/renderer/opengl/GL3.java +++ b/jme3-core/src/main/java/com/jme3/renderer/opengl/GL3.java @@ -65,7 +65,7 @@ public interface GL3 extends GL2 { public static final int GL_RG16I = 33337; public static final int GL_RG16UI = 33338; public static final int GL_RG32I = 33339; - public static final int GL_RG32UI = 33340; + public static final int GL_RG32UI = 33340; public static final int GL_RGBA32UI = 36208; public static final int GL_RGB32UI = 36209; public static final int GL_RGBA16UI = 36214; @@ -82,10 +82,133 @@ public interface GL3 extends GL2 { public static final int GL_RG_INTEGER = 33320; public static final int GL_RGB_INTEGER = 36248; public static final int GL_RGBA_INTEGER = 36249; - - public void glBindFragDataLocation(int param1, int param2, String param3); /// GL3+ - public void glBindVertexArray(int param1); /// GL3+ + + public static final int GL_UNIFORM_OFFSET = 0x8A3B; + + /** + * Accepted by the {@code target} parameters of BindBuffer, BufferData, BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, and GetBufferPointerv. + */ + public static final int GL_UNIFORM_BUFFER = 0x8A11; + + /** + * Accepted by the {@code pname} parameter of GetActiveUniformBlockiv. + */ + public static final int GL_UNIFORM_BLOCK_BINDING = 0x8A3F; + public static final int GL_UNIFORM_BLOCK_DATA_SIZE = 0x8A40; + public static final int GL_UNIFORM_BLOCK_NAME_LENGTH = 0x8A41; + public static final int GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS = 0x8A42; + public static final int GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES = 0x8A43; + public static final int GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER = 0x8A44; + public static final int GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER = 0x8A45; + public static final int GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER = 0x8A46; + + /** + * Accepted by the <pname> parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + public static final int GL_MAX_VERTEX_UNIFORM_BLOCKS = 0x8A2B; + public static final int GL_MAX_GEOMETRY_UNIFORM_BLOCKS = 0x8A2C; + public static final int GL_MAX_FRAGMENT_UNIFORM_BLOCKS = 0x8A2D; + public static final int GL_MAX_COMBINED_UNIFORM_BLOCKS = 0x8A2E; + public static final int GL_MAX_UNIFORM_BUFFER_BINDINGS = 0x8A2F; + public static final int GL_MAX_UNIFORM_BLOCK_SIZE = 0x8A30; + public static final int GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS = 0x8A31; + public static final int GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS = 0x8A32; + public static final int GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS = 0x8A33; + public static final int GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT = 0x8A34; + + /** + * Accepted by the {@code target} parameters of BindBuffer, BufferData, BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, GetBufferPointerv, + * BindBufferRange, BindBufferOffset and BindBufferBase. + */ + public static final int GL_TRANSFORM_FEEDBACK_BUFFER = 0x8C8E; + + /** + *

    Reference Page

    + *

    + * Binds a user-defined varying out variable to a fragment shader color number. + * + * @param program the name of the program containing varying out variable whose binding to modify. + * @param colorNumber the color number to bind the user-defined varying out variable to. + * @param name the name of the user-defined varying out variable whose binding to modify. + */ + public void glBindFragDataLocation(int program, int colorNumber, String name); /// GL3+ + + /** + *

    Reference Page

    + *

    + * Binds a vertex array object + * + * @param array the name of the vertex array to bind. + */ + public void glBindVertexArray(int array); /// GL3+ + + /** + * Deletes vertex array objects. + * + * @param arrays an array containing the n names of the objects to be deleted. + */ public void glDeleteVertexArrays(IntBuffer arrays); /// GL3+ - public void glGenVertexArrays(IntBuffer param1); /// GL3+ - public String glGetString(int param1, int param2); /// GL3+ + + /** + *

    Reference Page

    + * + * Generates vertex array object names. + * + * @param arrays a buffer in which the generated vertex array object names are stored. + */ + public void glGenVertexArrays(IntBuffer arrays); /// GL3+ + + /** + *

    Reference Page

    + *

    + * Queries indexed string state. + * + * @param name the indexed state to query. One of:
    {@link GL#GL_EXTENSIONS EXTENSIONS}{@link GL2#GL_SHADING_LANGUAGE_VERSION SHADING_LANGUAGE_VERSION}
    + * @param index the index of the particular element being queried. + */ + public String glGetString(int name, int index); /// GL3+ + + + /** + *

    Reference Page

    + * + * Retrieves the index of a named uniform block. + * + * @param program the name of a program containing the uniform block. + * @param uniformBlockName an array of characters to containing the name of the uniform block whose index to retrieve. + * @return the block index. + */ + public int glGetUniformBlockIndex(int program, String uniformBlockName); + + /** + *

    Reference Page

    + * + * Binds a buffer object to an indexed buffer target. + * + * @param target the target of the bind operation. One of:
    {@link #GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link #GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL4#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL4#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}
    + * @param index the index of the binding point within the array specified by {@code target} + * @param buffer a buffer object to bind to the specified binding point + */ + public void glBindBufferBase(int target, int index, int buffer); + + /** + * Binding points for active uniform blocks are assigned using glUniformBlockBinding. Each of a program's active + * uniform blocks has a corresponding uniform buffer binding point. program is the name of a program object for + * which the command glLinkProgram has been issued in the past. + *

    + * If successful, glUniformBlockBinding specifies that program will use the data store of the buffer object bound + * to the binding point uniformBlockBinding to extract the values of the uniforms in the uniform block identified + * by uniformBlockIndex. + *

    + * When a program object is linked or re-linked, the uniform buffer object binding point assigned to each of its + * active uniform blocks is reset to zero. + * + * @param program The name of a program object containing the active uniform block whose binding to + * assign. + * @param uniformBlockIndex The index of the active uniform block within program whose binding to assign. + * @param uniformBlockBinding Specifies the binding point to which to bind the uniform block with index + * uniformBlockIndex within program. + */ + public void glUniformBlockBinding(int program, int uniformBlockIndex, int uniformBlockBinding); } diff --git a/jme3-core/src/main/java/com/jme3/renderer/opengl/GL4.java b/jme3-core/src/main/java/com/jme3/renderer/opengl/GL4.java index 058bc00ec..821959aee 100644 --- a/jme3-core/src/main/java/com/jme3/renderer/opengl/GL4.java +++ b/jme3-core/src/main/java/com/jme3/renderer/opengl/GL4.java @@ -31,16 +31,73 @@ */ package com.jme3.renderer.opengl; -import java.nio.IntBuffer; - /** * GL functions only available on vanilla desktop OpenGL 4.0. * * @author Kirill Vainer */ public interface GL4 extends GL3 { - public static final int GL_TESS_CONTROL_SHADER=0x8E88; - public static final int GL_TESS_EVALUATION_SHADER=0x8E87; - public static final int GL_PATCHES=0xE; + + public static final int GL_TESS_CONTROL_SHADER = 0x8E88; + public static final int GL_TESS_EVALUATION_SHADER = 0x8E87; + public static final int GL_PATCHES = 0xE; + + /** + * Accepted by the {@code target} parameter of BindBufferBase and BindBufferRange. + */ + public static final int GL_ATOMIC_COUNTER_BUFFER = 0x92C0; + + /** + * Accepted by the {@code target} parameters of BindBuffer, BufferData, BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, and GetBufferPointerv. + */ + public static final int GL_SHADER_STORAGE_BUFFER = 0x90D2; + public static final int GL_SHADER_STORAGE_BLOCK = 0x92E6; + + /** + * Accepted by the <pname> parameter of GetIntegerv, GetBooleanv, + * GetInteger64v, GetFloatv, and GetDoublev: + */ + public static final int GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS = 0x90D6; + public static final int GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS = 0x90D7; + public static final int GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS = 0x90D8; + public static final int GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS = 0x90D9; + public static final int GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS = 0x90DA; + public static final int GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS = 0x90DB; + public static final int GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS = 0x90DC; + public static final int GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS = 0x90DD; + public static final int GL_MAX_SHADER_STORAGE_BLOCK_SIZE = 0x90DE; + public static final int GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT = 0x90DF; + + /** + *

    Reference Page

    + *

    + * Specifies the integer value of the specified parameter for patch primitives. + * + * @param count the new value for the parameter given by {@code pname} + */ public void glPatchParameter(int count); + + /** + * Returns the unsigned integer index assigned to a resource named name in the interface type programInterface of + * program object program. + * + * @param program the name of a program object whose resources to query. + * @param programInterface a token identifying the interface within program containing the resource named name. + * @param name the name of the resource to query the index of. + * @return the index of a named resource within a program. + */ + public int glGetProgramResourceIndex(int program, int programInterface, String name); + + /** + * Cchanges the active shader storage block with an assigned index of storageBlockIndex in program object program. + * storageBlockIndex must be an active shader storage block index in program. storageBlockBinding must be less + * than the value of {@code #GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS}. If successful, glShaderStorageBlockBinding specifies + * that program will use the data store of the buffer object bound to the binding point storageBlockBinding to + * read and write the values of the buffer variables in the shader storage block identified by storageBlockIndex. + * + * @param program the name of a program object whose resources to query. + * @param storageBlockIndex The index storage block within the program. + * @param storageBlockBinding The index storage block binding to associate with the specified storage block. + */ + public void glShaderStorageBlockBinding(int program, int storageBlockIndex, int storageBlockBinding); } diff --git a/jme3-core/src/main/java/com/jme3/renderer/opengl/GLDebugDesktop.java b/jme3-core/src/main/java/com/jme3/renderer/opengl/GLDebugDesktop.java index a945a1d85..3dfd2a8ca 100644 --- a/jme3-core/src/main/java/com/jme3/renderer/opengl/GLDebugDesktop.java +++ b/jme3-core/src/main/java/com/jme3/renderer/opengl/GLDebugDesktop.java @@ -83,6 +83,19 @@ public class GLDebugDesktop extends GLDebugES implements GL2, GL3, GL4 { return result; } + @Override + public int glGetUniformBlockIndex(final int program, final String uniformBlockName) { + final int result = gl3.glGetUniformBlockIndex(program, uniformBlockName); + checkError(); + return result; + } + + @Override + public void glBindBufferBase(final int target, final int index, final int buffer) { + gl3.glBindBufferBase(target, index, buffer); + checkError(); + } + @Override public void glDeleteVertexArrays(IntBuffer arrays) { gl3.glDeleteVertexArrays(arrays); @@ -95,8 +108,27 @@ public class GLDebugDesktop extends GLDebugES implements GL2, GL3, GL4 { checkError(); } + @Override + public int glGetProgramResourceIndex(int program, int programInterface, String name) { + final int result = gl4.glGetProgramResourceIndex(program, programInterface, name); + checkError(); + return result; + } + + @Override + public void glShaderStorageBlockBinding(int program, int storageBlockIndex, int storageBlockBinding) { + gl4.glShaderStorageBlockBinding(program, storageBlockIndex, storageBlockBinding); + checkError(); + } + public void glBlendEquationSeparate(int colorMode, int alphaMode) { gl.glBlendEquationSeparate(colorMode, alphaMode); checkError(); } + + @Override + public void glUniformBlockBinding(final int program, final int uniformBlockIndex, final int uniformBlockBinding) { + gl3.glUniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding); + checkError(); + } } diff --git a/jme3-core/src/main/java/com/jme3/renderer/opengl/GLExt.java b/jme3-core/src/main/java/com/jme3/renderer/opengl/GLExt.java index c6d420cc7..642ac0c71 100644 --- a/jme3-core/src/main/java/com/jme3/renderer/opengl/GLExt.java +++ b/jme3-core/src/main/java/com/jme3/renderer/opengl/GLExt.java @@ -36,81 +36,200 @@ import java.nio.IntBuffer; /** * GL functions provided by extensions. - * + *

    * Always must check against a renderer capability prior to using those. - * + * * @author Kirill Vainer */ public interface GLExt { - public static final int GL_ALREADY_SIGNALED = 0x911A; - public static final int GL_COMPRESSED_RGB8_ETC2 = 0x9274; - public static final int GL_COMPRESSED_RGBA_S3TC_DXT1_EXT = 0x83F1; - public static final int GL_COMPRESSED_RGBA_S3TC_DXT3_EXT = 0x83F2; - public static final int GL_COMPRESSED_RGBA_S3TC_DXT5_EXT = 0x83F3; - public static final int GL_COMPRESSED_RGB_S3TC_DXT1_EXT = 0x83F0; - public static final int GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT = 0x8C4D; - public static final int GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT = 0x8C4E; - public static final int GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT = 0x8C4F; - public static final int GL_COMPRESSED_SRGB_S3TC_DXT1_EXT = 0x8C4C; - public static final int GL_CONDITION_SATISFIED = 0x911C; - public static final int GL_DEPTH_COMPONENT32F = 0x8CAC; - public static final int GL_DEPTH24_STENCIL8_EXT = 0x88F0; - public static final int GL_DEPTH_STENCIL_EXT = 0x84F9; - public static final int GL_ETC1_RGB8_OES = 0x8D64; - public static final int GL_FRAMEBUFFER_SRGB_CAPABLE_EXT = 0x8DBA; - public static final int GL_FRAMEBUFFER_SRGB_EXT = 0x8DB9; - public static final int GL_HALF_FLOAT_ARB = 0x140B; - public static final int GL_HALF_FLOAT_OES = 0x8D61; - public static final int GL_LUMINANCE16F_ARB = 0x881E; - public static final int GL_LUMINANCE32F_ARB = 0x8818; - public static final int GL_LUMINANCE_ALPHA16F_ARB = 0x881F; - public static final int GL_MAX_COLOR_TEXTURE_SAMPLES = 0x910E; - public static final int GL_MAX_DEPTH_TEXTURE_SAMPLES = 0x910F; - public static final int GL_MAX_DRAW_BUFFERS_ARB = 0x8824; - public static final int GL_MAX_SAMPLES_EXT = 0x8D57; - public static final int GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT = 0x84FF; - public static final int GL_MULTISAMPLE_ARB = 0x809D; - public static final int GL_NUM_PROGRAM_BINARY_FORMATS = 0x87FE; - public static final int GL_PIXEL_PACK_BUFFER_ARB = 0x88EB; - public static final int GL_PIXEL_UNPACK_BUFFER_ARB = 0x88EC; - public static final int GL_R11F_G11F_B10F_EXT = 0x8C3A; - public static final int GL_RGBA8 = 0x8058; - public static final int GL_RGB16F_ARB = 0x881B; - public static final int GL_RGB32F_ARB = 0x8815; - public static final int GL_RGB9_E5_EXT = 0x8C3D; - public static final int GL_RGBA16F_ARB = 0x881A; - public static final int GL_RGBA32F_ARB = 0x8814; - public static final int GL_SAMPLES_ARB = 0x80A9; - public static final int GL_SAMPLE_ALPHA_TO_COVERAGE_ARB = 0x809E; - public static final int GL_SAMPLE_BUFFERS_ARB = 0x80A8; - public static final int GL_SAMPLE_POSITION = 0x8E50; - public static final int GL_SLUMINANCE8_ALPHA8_EXT = 0x8C45; - public static final int GL_SLUMINANCE8_EXT = 0x8C47; - public static final int GL_SRGB8_ALPHA8_EXT = 0x8C43; - public static final int GL_SRGB8_EXT = 0x8C41; - public static final int GL_SYNC_FLUSH_COMMANDS_BIT = 0x1; - public static final int GL_SYNC_GPU_COMMANDS_COMPLETE = 0x9117; - public static final int GL_TEXTURE_2D_ARRAY_EXT = 0x8C1A; - public static final int GL_TEXTURE_2D_MULTISAMPLE = 0x9100; - public static final int GL_TEXTURE_2D_MULTISAMPLE_ARRAY = 0x9102; - public static final int GL_TEXTURE_CUBE_MAP_SEAMLESS = 0x884F; - public static final int GL_TEXTURE_MAX_ANISOTROPY_EXT = 0x84FE; - public static final int GL_TIMEOUT_EXPIRED = 0x911B; - public static final int GL_UNSIGNED_INT_10F_11F_11F_REV_EXT = 0x8C3B; - public static final int GL_UNSIGNED_INT_24_8_EXT = 0x84FA; - public static final int GL_UNSIGNED_INT_5_9_9_9_REV_EXT = 0x8C3E; - public static final int GL_WAIT_FAILED = 0x911D; + public static final int GL_ALREADY_SIGNALED = 0x911A; + public static final int GL_COMPRESSED_RGB8_ETC2 = 0x9274; + public static final int GL_COMPRESSED_RGBA_S3TC_DXT1_EXT = 0x83F1; + public static final int GL_COMPRESSED_RGBA_S3TC_DXT3_EXT = 0x83F2; + public static final int GL_COMPRESSED_RGBA_S3TC_DXT5_EXT = 0x83F3; + public static final int GL_COMPRESSED_RGB_S3TC_DXT1_EXT = 0x83F0; + public static final int GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT = 0x8C4D; + public static final int GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT = 0x8C4E; + public static final int GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT = 0x8C4F; + public static final int GL_COMPRESSED_SRGB_S3TC_DXT1_EXT = 0x8C4C; + public static final int GL_CONDITION_SATISFIED = 0x911C; + public static final int GL_DEPTH_COMPONENT32F = 0x8CAC; + public static final int GL_DEPTH24_STENCIL8_EXT = 0x88F0; + public static final int GL_DEPTH_STENCIL_EXT = 0x84F9; + public static final int GL_ETC1_RGB8_OES = 0x8D64; + public static final int GL_FRAMEBUFFER_SRGB_CAPABLE_EXT = 0x8DBA; + public static final int GL_FRAMEBUFFER_SRGB_EXT = 0x8DB9; + public static final int GL_HALF_FLOAT_ARB = 0x140B; + public static final int GL_HALF_FLOAT_OES = 0x8D61; + public static final int GL_LUMINANCE16F_ARB = 0x881E; + public static final int GL_LUMINANCE32F_ARB = 0x8818; + public static final int GL_LUMINANCE_ALPHA16F_ARB = 0x881F; + public static final int GL_MAX_COLOR_TEXTURE_SAMPLES = 0x910E; + public static final int GL_MAX_DEPTH_TEXTURE_SAMPLES = 0x910F; + public static final int GL_MAX_DRAW_BUFFERS_ARB = 0x8824; + public static final int GL_MAX_SAMPLES_EXT = 0x8D57; + public static final int GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT = 0x84FF; + public static final int GL_MULTISAMPLE_ARB = 0x809D; + public static final int GL_NUM_PROGRAM_BINARY_FORMATS = 0x87FE; + public static final int GL_PIXEL_PACK_BUFFER_ARB = 0x88EB; + public static final int GL_PIXEL_UNPACK_BUFFER_ARB = 0x88EC; + public static final int GL_R11F_G11F_B10F_EXT = 0x8C3A; + public static final int GL_RGBA8 = 0x8058; + public static final int GL_RGB16F_ARB = 0x881B; + public static final int GL_RGB32F_ARB = 0x8815; + public static final int GL_RGB9_E5_EXT = 0x8C3D; + public static final int GL_RGBA16F_ARB = 0x881A; + public static final int GL_RGBA32F_ARB = 0x8814; + public static final int GL_SAMPLES_ARB = 0x80A9; + public static final int GL_SAMPLE_ALPHA_TO_COVERAGE_ARB = 0x809E; + public static final int GL_SAMPLE_BUFFERS_ARB = 0x80A8; + public static final int GL_SAMPLE_POSITION = 0x8E50; + public static final int GL_SLUMINANCE8_ALPHA8_EXT = 0x8C45; + public static final int GL_SLUMINANCE8_EXT = 0x8C47; + public static final int GL_SRGB8_ALPHA8_EXT = 0x8C43; + public static final int GL_SRGB8_EXT = 0x8C41; + public static final int GL_SYNC_FLUSH_COMMANDS_BIT = 0x1; + public static final int GL_SYNC_GPU_COMMANDS_COMPLETE = 0x9117; + public static final int GL_TEXTURE_2D_ARRAY_EXT = 0x8C1A; + public static final int GL_TEXTURE_2D_MULTISAMPLE = 0x9100; + public static final int GL_TEXTURE_2D_MULTISAMPLE_ARRAY = 0x9102; + public static final int GL_TEXTURE_CUBE_MAP_SEAMLESS = 0x884F; + public static final int GL_TEXTURE_MAX_ANISOTROPY_EXT = 0x84FE; + public static final int GL_TIMEOUT_EXPIRED = 0x911B; + public static final int GL_UNSIGNED_INT_10F_11F_11F_REV_EXT = 0x8C3B; + public static final int GL_UNSIGNED_INT_24_8_EXT = 0x84FA; + public static final int GL_UNSIGNED_INT_5_9_9_9_REV_EXT = 0x8C3E; + public static final int GL_WAIT_FAILED = 0x911D; + + /** + *

    Reference Page

    + *

    + * Creates and initializes a buffer object's data store. + *

    + *

    {@code usage} is a hint to the GL implementation as to how a buffer object's data store will be accessed. This enables the GL implementation to make + * more intelligent decisions that may significantly impact buffer object performance. It does not, however, constrain the actual usage of the data store. + * {@code usage} can be broken down into two parts: first, the frequency of access (modification and usage), and second, the nature of that access. The + * frequency of access may be one of these:

    + *

    + *

      + *
    • STREAM - The data store contents will be modified once and used at most a few times.
    • + *
    • STATIC - The data store contents will be modified once and used many times.
    • + *
    • DYNAMIC - The data store contents will be modified repeatedly and used many times.
    • + *
    + *

    + *

    The nature of access may be one of these:

    + *

    + *

      + *
    • DRAW - The data store contents are modified by the application, and used as the source for GL drawing and image specification commands.
    • + *
    • READ - The data store contents are modified by reading data from the GL, and used to return that data when queried by the application.
    • + *
    • COPY - The data store contents are modified by reading data from the GL, and used as the source for GL drawing and image specification commands.
    • + *
    + * + * @param target the target buffer object. + * @param data a pointer to data that will be copied into the data store for initialization, or {@code NULL} if no data is to be copied. + * @param usage the expected usage pattern of the data store. + */ + public void glBufferData(int target, IntBuffer data, int usage); + + /** + *

    Reference Page

    + *

    + * Updates a subset of a buffer object's data store. + * + * @param target the target buffer object. + * @param offset the offset into the buffer object's data store where data replacement will begin, measured in bytes. + * @param data a pointer to the new data that will be copied into the data store. + */ + public void glBufferSubData(int target, long offset, IntBuffer data); + + /** + * Causes the client to block and wait for a sync object to become signaled. If {@code sync} is signaled when {@code glClientWaitSync} is called, + * {@code glClientWaitSync} returns immediately, otherwise it will block and wait for up to timeout nanoseconds for {@code sync} to become signaled. + * + * @param sync the sync object whose status to wait on. + * @param flags a bitfield controlling the command flushing behavior. + * @param timeout the timeout, specified in nanoseconds, for which the implementation should wait for {@code sync} to become signaled. + * @return the status is one of ALREADY_SIGNALED, TIMEOUT_EXPIRED, CONDITION_SATISFIED or WAIT_FAILED. + */ + public int glClientWaitSync(Object sync, int flags, long timeout); + + /** + * Deletes a sync object. + * + * @param sync the sync object to be deleted. + */ + public void glDeleteSync(Object sync); + + /** + * Draw multiple instances of a range of elements. + * + * @param mode the kind of primitives to render. + * @param first the starting index in the enabled arrays. + * @param count the number of indices to be rendered. + * @param primCount the number of instances of the specified range of indices to be rendered. + */ + public void glDrawArraysInstancedARB(int mode, int first, int count, int primCount); + + /** + *

    Reference Page

    + *

    + * Specifies a list of color buffers to be drawn into. + * + * @param bufs an array of symbolic constants specifying the buffers into which fragment colors or data values will be written. + */ + public void glDrawBuffers(IntBuffer bufs); + + /** + * Draws multiple instances of a set of elements. + * + * @param mode the kind of primitives to render. + * @param indicesCount the number of elements to be rendered. + * @param type the type of the values in {@code indices}. + * @param indicesBufferOffset a pointer to the location where the indices are stored. + * @param primCount the number of instances of the specified range of indices to be rendered. + */ + public void glDrawElementsInstancedARB(int mode, int indicesCount, int type, long indicesBufferOffset, int primCount); + + /** + * Creates a new sync object and inserts it into the GL command stream. + * + * @param condition the condition that must be met to set the sync object's state to signaled. + * @param flags a bitwise combination of flags controlling the behavior of the sync object. No flags are presently defined for this operation and {@code flags} must be zero. + */ + public Object glFenceSync(int condition, int flags); + + /** + * Retrieves the location of a sample. + * + * @param pname the sample parameter name. + * @param index the index of the sample whose position to query. + * @param val an array to receive the position of the sample. + */ + public void glGetMultisample(int pname, int index, FloatBuffer val); + + /** + * Establishes the data storage, format, dimensions, and number of samples of a 2D multisample texture's image. + * + * @param target the target of the operation. + * @param samples the number of samples in the multisample texture's image + * @param internalFormat the internal format to be used to store the multisample texture's image. {@code internalformat} must specify a color-renderable, depth-renderable, + * or stencil-renderable format. + * @param width the width of the multisample texture's image, in texels + * @param height the height of the multisample texture's image, in texels + * @param fixedSampleLocations whether the image will use identical sample locations and the same number of samples for all texels in the image, and the sample locations will not + * depend on the internal format or size of the image + */ + public void glTexImage2DMultisample(int target, int samples, int internalFormat, int width, int height, + boolean fixedSampleLocations); - public void glBufferData(int target, IntBuffer data, int usage); - public void glBufferSubData(int target, long offset, IntBuffer data); - public int glClientWaitSync(Object sync, int flags, long timeout); - public void glDeleteSync(Object sync); - public void glDrawArraysInstancedARB(int mode, int first, int count, int primcount); - public void glDrawBuffers(IntBuffer bufs); - public void glDrawElementsInstancedARB(int mode, int indices_count, int type, long indices_buffer_offset, int primcount); - public Object glFenceSync(int condition, int flags); - public void glGetMultisample(int pname, int index, FloatBuffer val); - public void glTexImage2DMultisample(int target, int samples, int internalformat, int width, int height, boolean fixedsamplelocations); - public void glVertexAttribDivisorARB(int index, int divisor); + /** + * Modifies the rate at which generic vertex attributes advance when rendering multiple instances of primitives in a single draw call. If {@code divisor} + * is zero, the attribute at slot {@code index} advances once per vertex. If {@code divisor} is non-zero, the attribute advances once per {@code divisor} + * instances of the set(s) of vertices being rendered. An attribute is referred to as {@code instanced} if its {@code divisor} value is non-zero. + * + * @param index the attribute index. + * @param divisor the divisor value. + */ + public void glVertexAttribDivisorARB(int index, int divisor); } diff --git a/jme3-core/src/main/java/com/jme3/renderer/opengl/GLFbo.java b/jme3-core/src/main/java/com/jme3/renderer/opengl/GLFbo.java index 97a579203..e049f7dfc 100644 --- a/jme3-core/src/main/java/com/jme3/renderer/opengl/GLFbo.java +++ b/jme3-core/src/main/java/com/jme3/renderer/opengl/GLFbo.java @@ -34,15 +34,15 @@ package com.jme3.renderer.opengl; import java.nio.IntBuffer; /** - * Framebuffer object functions. - * - * Available by default in OpenGL ES 2, but on desktop GL 2 + * Framebuffer object functions. + *

    + * Available by default in OpenGL ES 2, but on desktop GL 2 * an extension is required. - * + * * @author Kirill Vainer */ public interface GLFbo { - + public static final int GL_COLOR_ATTACHMENT0_EXT = 0x8CE0; public static final int GL_COLOR_ATTACHMENT1_EXT = 0x8CE1; public static final int GL_COLOR_ATTACHMENT2_EXT = 0x8CE2; @@ -80,19 +80,33 @@ public interface GLFbo { public static final int GL_READ_FRAMEBUFFER_BINDING_EXT = 0x8CAA; public static final int GL_READ_FRAMEBUFFER_EXT = 0x8CA8; public static final int GL_RENDERBUFFER_EXT = 0x8D41; - - public void glBindFramebufferEXT(int param1, int param2); - public void glBindRenderbufferEXT(int param1, int param2); - public void glBlitFramebufferEXT(int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1, int mask, int filter); - public int glCheckFramebufferStatusEXT(int param1); - public void glDeleteFramebuffersEXT(IntBuffer param1); - public void glDeleteRenderbuffersEXT(IntBuffer param1); - public void glFramebufferRenderbufferEXT(int param1, int param2, int param3, int param4); - public void glFramebufferTexture2DEXT(int param1, int param2, int param3, int param4, int param5); + + public void glBindFramebufferEXT(int target, int frameBuffer); + + public void glBindRenderbufferEXT(int target, int renderBuffer); + + public void glBlitFramebufferEXT(int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, + int dstY1, int mask, int filter); + + public int glCheckFramebufferStatusEXT(int target); + + public void glDeleteFramebuffersEXT(IntBuffer frameBuffers); + + public void glDeleteRenderbuffersEXT(IntBuffer renderBuffers); + + public void glFramebufferRenderbufferEXT(int target, int attachment, int renderBufferTarget, int renderBuffer); + + public void glFramebufferTexture2DEXT(int target, int attachment, int texTarget, int texture, int level); + public void glFramebufferTextureLayerEXT(int target, int attachment, int texture, int level, int layer); - public void glGenFramebuffersEXT(IntBuffer param1); - public void glGenRenderbuffersEXT(IntBuffer param1); - public void glGenerateMipmapEXT(int param1); - public void glRenderbufferStorageEXT(int param1, int param2, int param3, int param4); - public void glRenderbufferStorageMultisampleEXT(int target, int samples, int internalformat, int width, int height); + + public void glGenFramebuffersEXT(IntBuffer frameBuffers); + + public void glGenRenderbuffersEXT(IntBuffer renderBuffers); + + public void glGenerateMipmapEXT(int target); + + public void glRenderbufferStorageEXT(int target, int internalFormat, int width, int height); + + public void glRenderbufferStorageMultisampleEXT(int target, int samples, int internalFormat, int width, int height); } diff --git a/jme3-core/src/main/java/com/jme3/renderer/opengl/GLImageFormats.java b/jme3-core/src/main/java/com/jme3/renderer/opengl/GLImageFormats.java index 21070227b..ca8546a67 100644 --- a/jme3-core/src/main/java/com/jme3/renderer/opengl/GLImageFormats.java +++ b/jme3-core/src/main/java/com/jme3/renderer/opengl/GLImageFormats.java @@ -196,6 +196,10 @@ public final class GLImageFormats { format(formatToGL, Format.Luminance32F, GLExt.GL_LUMINANCE32F_ARB, GL.GL_LUMINANCE, GL.GL_FLOAT); format(formatToGL, Format.Luminance16FAlpha16F, GLExt.GL_LUMINANCE_ALPHA16F_ARB, GL.GL_LUMINANCE_ALPHA, halfFloatFormat); } + format(formatToGL, Format.R16F, GL3.GL_R16F, GL3.GL_RED, halfFloatFormat); + format(formatToGL, Format.R32F, GL3.GL_R32F, GL3.GL_RED, GL.GL_FLOAT); + format(formatToGL, Format.RG16F, GL3.GL_RG16F, GL3.GL_RG, halfFloatFormat); + format(formatToGL, Format.RG32F, GL3.GL_RG32F, GL3.GL_RG, GL.GL_FLOAT); format(formatToGL, Format.RGB16F, GLExt.GL_RGB16F_ARB, GL.GL_RGB, halfFloatFormat); format(formatToGL, Format.RGB32F, GLExt.GL_RGB32F_ARB, GL.GL_RGB, GL.GL_FLOAT); format(formatToGL, Format.RGBA16F, GLExt.GL_RGBA16F_ARB, GL.GL_RGBA, halfFloatFormat); @@ -220,7 +224,7 @@ public final class GLImageFormats { // NOTE: OpenGL ES 2.0 does not support DEPTH_COMPONENT as internal format -- fallback to 16-bit depth. if (caps.contains(Caps.OpenGLES20)) { - format(formatToGL, Format.Depth, GL.GL_DEPTH_COMPONENT16, GL.GL_DEPTH_COMPONENT, GL.GL_UNSIGNED_BYTE); + format(formatToGL, Format.Depth, GL.GL_DEPTH_COMPONENT16, GL.GL_DEPTH_COMPONENT, GL.GL_UNSIGNED_SHORT); } else { format(formatToGL, Format.Depth, GL.GL_DEPTH_COMPONENT, GL.GL_DEPTH_COMPONENT, GL.GL_UNSIGNED_BYTE); } diff --git a/jme3-core/src/main/java/com/jme3/renderer/opengl/GLRenderer.java b/jme3-core/src/main/java/com/jme3/renderer/opengl/GLRenderer.java index e90affb3d..372233dd6 100644 --- a/jme3-core/src/main/java/com/jme3/renderer/opengl/GLRenderer.java +++ b/jme3-core/src/main/java/com/jme3/renderer/opengl/GLRenderer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2014 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -33,6 +33,7 @@ package com.jme3.renderer.opengl; import com.jme3.material.RenderState; import com.jme3.material.RenderState.BlendFunc; +import com.jme3.material.RenderState.BlendMode; import com.jme3.material.RenderState.StencilOperation; import com.jme3.material.RenderState.TestFunction; import com.jme3.math.*; @@ -44,11 +45,9 @@ import com.jme3.scene.VertexBuffer; import com.jme3.scene.VertexBuffer.Format; import com.jme3.scene.VertexBuffer.Type; import com.jme3.scene.VertexBuffer.Usage; -import com.jme3.shader.Attribute; -import com.jme3.shader.Shader; +import com.jme3.shader.*; import com.jme3.shader.Shader.ShaderSource; import com.jme3.shader.Shader.ShaderType; -import com.jme3.shader.Uniform; import com.jme3.texture.FrameBuffer; import com.jme3.texture.FrameBuffer.RenderBuffer; import com.jme3.texture.Image; @@ -60,17 +59,17 @@ import com.jme3.util.BufferUtils; import com.jme3.util.ListMap; import com.jme3.util.MipMapGenerator; import com.jme3.util.NativeObjectManager; -import java.nio.*; -import java.util.Arrays; -import java.util.EnumMap; -import java.util.EnumSet; -import java.util.HashSet; -import java.util.List; +import jme3tools.shader.ShaderDebug; + +import java.nio.ByteBuffer; +import java.nio.FloatBuffer; +import java.nio.IntBuffer; +import java.nio.ShortBuffer; +import java.util.*; import java.util.logging.Level; import java.util.logging.Logger; import java.util.regex.Matcher; import java.util.regex.Pattern; -import jme3tools.shader.ShaderDebug; public final class GLRenderer implements Renderer { @@ -222,7 +221,7 @@ public final class GLRenderer implements Renderer { if (glslVer < 400) { break; } - // so that future OpenGL revisions wont break jme3 + // so that future OpenGL revisions won't break jme3 // fall through intentional case 450: caps.add(Caps.GLSL450); @@ -450,7 +449,7 @@ public final class GLRenderer implements Renderer { logger.log(Level.FINER, "Samples: {0}", samples); boolean enabled = gl.glIsEnabled(GLExt.GL_MULTISAMPLE_ARB); if (samples > 0 && available && !enabled) { - // Doesn't seem to be neccessary .. OGL spec says its always + // Doesn't seem to be necessary .. OGL spec says it's always // set by default? gl.glEnable(GLExt.GL_MULTISAMPLE_ARB); } @@ -479,6 +478,26 @@ public final class GLRenderer implements Renderer { } } + if (hasExtension("GL_ARB_shader_storage_buffer_object")) { + caps.add(Caps.ShaderStorageBufferObject); + limits.put(Limits.ShaderStorageBufferObjectMaxBlockSize, getInteger(GL4.GL_MAX_SHADER_STORAGE_BLOCK_SIZE)); + limits.put(Limits.ShaderStorageBufferObjectMaxComputeBlocks, getInteger(GL4.GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS)); + limits.put(Limits.ShaderStorageBufferObjectMaxGeometryBlocks, getInteger(GL4.GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS)); + limits.put(Limits.ShaderStorageBufferObjectMaxFragmentBlocks, getInteger(GL4.GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS)); + limits.put(Limits.ShaderStorageBufferObjectMaxVertexBlocks, getInteger(GL4.GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS)); + limits.put(Limits.ShaderStorageBufferObjectMaxTessControlBlocks, getInteger(GL4.GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS)); + limits.put(Limits.ShaderStorageBufferObjectMaxTessEvaluationBlocks, getInteger(GL4.GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS)); + limits.put(Limits.ShaderStorageBufferObjectMaxCombineBlocks, getInteger(GL4.GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS)); + } + + if (hasExtension("GL_ARB_uniform_buffer_object")) { + caps.add(Caps.UniformBufferObject); + limits.put(Limits.UniformBufferObjectMaxBlockSize, getInteger(GL3.GL_MAX_UNIFORM_BLOCK_SIZE)); + limits.put(Limits.UniformBufferObjectMaxGeometryBlocks, getInteger(GL3.GL_MAX_GEOMETRY_UNIFORM_BLOCKS)); + limits.put(Limits.UniformBufferObjectMaxFragmentBlocks, getInteger(GL3.GL_MAX_FRAGMENT_UNIFORM_BLOCKS)); + limits.put(Limits.UniformBufferObjectMaxVertexBlocks, getInteger(GL3.GL_MAX_VERTEX_UNIFORM_BLOCKS)); + } + // Print context information logger.log(Level.INFO, "OpenGL Renderer Information\n" + " * Vendor: {0}\n" + @@ -743,68 +762,57 @@ public final class GLRenderer implements Renderer { context.cullMode = state.getFaceCullMode(); } - if (state.getBlendMode() != context.blendMode) { - if (state.getBlendMode() == RenderState.BlendMode.Off) { - gl.glDisable(GL.GL_BLEND); - } else { - if (context.blendMode == RenderState.BlendMode.Off) { - gl.glEnable(GL.GL_BLEND); - } - switch (state.getBlendMode()) { - case Off: - break; - case Additive: - gl.glBlendFunc(GL.GL_ONE, GL.GL_ONE); - break; - case AlphaAdditive: - gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE); - break; - case Alpha: - gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA); - break; - case PremultAlpha: - gl.glBlendFunc(GL.GL_ONE, GL.GL_ONE_MINUS_SRC_ALPHA); - break; - case Modulate: - gl.glBlendFunc(GL.GL_DST_COLOR, GL.GL_ZERO); - break; - case ModulateX2: - gl.glBlendFunc(GL.GL_DST_COLOR, GL.GL_SRC_COLOR); - break; - case Color: - case Screen: - gl.glBlendFunc(GL.GL_ONE, GL.GL_ONE_MINUS_SRC_COLOR); - break; - case Exclusion: - gl.glBlendFunc(GL.GL_ONE_MINUS_DST_COLOR, GL.GL_ONE_MINUS_SRC_COLOR); - break; - case Custom: - gl.glBlendFuncSeparate( - convertBlendFunc(state.getCustomSfactorRGB()), - convertBlendFunc(state.getCustomDfactorRGB()), - convertBlendFunc(state.getCustomSfactorAlpha()), - convertBlendFunc(state.getCustomDfactorAlpha())); - break; - default: - throw new UnsupportedOperationException("Unrecognized blend mode: " - + state.getBlendMode()); - } - - if (state.getBlendEquation() != context.blendEquation || state.getBlendEquationAlpha() != context.blendEquationAlpha) { - int colorMode = convertBlendEquation(state.getBlendEquation()); - int alphaMode; - if (state.getBlendEquationAlpha() == RenderState.BlendEquationAlpha.InheritColor) { - alphaMode = colorMode; - } else { - alphaMode = convertBlendEquationAlpha(state.getBlendEquationAlpha()); - } - gl.glBlendEquationSeparate(colorMode, alphaMode); - context.blendEquation = state.getBlendEquation(); - context.blendEquationAlpha = state.getBlendEquationAlpha(); - } + // Always update the blend equations and factors when using custom blend mode. + if (state.getBlendMode() == BlendMode.Custom) { + changeBlendMode(BlendMode.Custom); + + blendFuncSeparate( + state.getCustomSfactorRGB(), + state.getCustomDfactorRGB(), + state.getCustomSfactorAlpha(), + state.getCustomDfactorAlpha()); + blendEquationSeparate(state.getBlendEquation(), state.getBlendEquationAlpha()); + + // Update the blend equations and factors only on a mode change for all the other (common) blend modes. + } else if (state.getBlendMode() != context.blendMode) { + changeBlendMode(state.getBlendMode()); + + switch (state.getBlendMode()) { + case Off: + break; + case Additive: + blendFunc(RenderState.BlendFunc.One, RenderState.BlendFunc.One); + break; + case AlphaAdditive: + blendFunc(RenderState.BlendFunc.Src_Alpha, RenderState.BlendFunc.One); + break; + case Alpha: + blendFunc(RenderState.BlendFunc.Src_Alpha, RenderState.BlendFunc.One_Minus_Src_Alpha); + break; + case PremultAlpha: + blendFunc(RenderState.BlendFunc.One, RenderState.BlendFunc.One_Minus_Src_Alpha); + break; + case Modulate: + blendFunc(RenderState.BlendFunc.Dst_Color, RenderState.BlendFunc.Zero); + break; + case ModulateX2: + blendFunc(RenderState.BlendFunc.Dst_Color, RenderState.BlendFunc.Src_Color); + break; + case Color: + case Screen: + blendFunc(RenderState.BlendFunc.One, RenderState.BlendFunc.One_Minus_Src_Color); + break; + case Exclusion: + blendFunc(RenderState.BlendFunc.One_Minus_Dst_Color, RenderState.BlendFunc.One_Minus_Src_Color); + break; + default: + throw new UnsupportedOperationException("Unrecognized blend mode: " + + state.getBlendMode()); } - context.blendMode = state.getBlendMode(); + // All of the common modes requires the ADD equation. + // (This might change in the future?) + blendEquationSeparate(RenderState.BlendEquation.Add, RenderState.BlendEquationAlpha.InheritColor); } if (context.stencilTest != state.isStencilTest() @@ -852,6 +860,65 @@ public final class GLRenderer implements Renderer { } } + private void changeBlendMode(RenderState.BlendMode blendMode) { + if (blendMode != context.blendMode) { + if (blendMode == RenderState.BlendMode.Off) { + gl.glDisable(GL.GL_BLEND); + } else if (context.blendMode == RenderState.BlendMode.Off) { + gl.glEnable(GL.GL_BLEND); + } + + context.blendMode = blendMode; + } + } + + private void blendEquationSeparate(RenderState.BlendEquation blendEquation, RenderState.BlendEquationAlpha blendEquationAlpha) { + if (blendEquation != context.blendEquation || blendEquationAlpha != context.blendEquationAlpha) { + int glBlendEquation = convertBlendEquation(blendEquation); + int glBlendEquationAlpha = blendEquationAlpha == RenderState.BlendEquationAlpha.InheritColor + ? glBlendEquation + : convertBlendEquationAlpha(blendEquationAlpha); + gl.glBlendEquationSeparate(glBlendEquation, glBlendEquationAlpha); + context.blendEquation = blendEquation; + context.blendEquationAlpha = blendEquationAlpha; + } + } + + private void blendFunc(RenderState.BlendFunc sfactor, RenderState.BlendFunc dfactor) { + if (sfactor != context.sfactorRGB + || dfactor != context.dfactorRGB + || sfactor != context.sfactorAlpha + || dfactor != context.dfactorAlpha) { + + gl.glBlendFunc( + convertBlendFunc(sfactor), + convertBlendFunc(dfactor)); + context.sfactorRGB = sfactor; + context.dfactorRGB = dfactor; + context.sfactorAlpha = sfactor; + context.dfactorAlpha = dfactor; + } + } + + private void blendFuncSeparate(RenderState.BlendFunc sfactorRGB, RenderState.BlendFunc dfactorRGB, + RenderState.BlendFunc sfactorAlpha, RenderState.BlendFunc dfactorAlpha) { + if (sfactorRGB != context.sfactorRGB + || dfactorRGB != context.dfactorRGB + || sfactorAlpha != context.sfactorAlpha + || dfactorAlpha != context.dfactorAlpha) { + + gl.glBlendFuncSeparate( + convertBlendFunc(sfactorRGB), + convertBlendFunc(dfactorRGB), + convertBlendFunc(sfactorAlpha), + convertBlendFunc(dfactorAlpha)); + context.sfactorRGB = sfactorRGB; + context.dfactorRGB = dfactorRGB; + context.sfactorAlpha = sfactorAlpha; + context.dfactorAlpha = dfactorAlpha; + } + } + private int convertBlendEquation(RenderState.BlendEquation blendEquation) { switch (blendEquation) { case Add: @@ -870,7 +937,7 @@ public final class GLRenderer implements Renderer { } private int convertBlendEquationAlpha(RenderState.BlendEquationAlpha blendEquationAlpha) { - //Note: InheritColor mode should already be handled, that is why it does not belong the the switch case. + //Note: InheritColor mode should already be handled, that is why it does not belong the switch case. switch (blendEquationAlpha) { case Add: return GL2.GL_FUNC_ADD; @@ -1001,12 +1068,25 @@ public final class GLRenderer implements Renderer { } } + @Override public void postFrame() { objManager.deleteUnused(this); OpenCLObjectManager.getInstance().deleteUnusedObjects(); gl.resetStats(); } + protected void bindProgram(Shader shader) { + int shaderId = shader.getId(); + if (context.boundShaderProgram != shaderId) { + gl.glUseProgram(shaderId); + statistics.onShaderUse(shader, true); + context.boundShader = shader; + context.boundShaderProgram = shaderId; + } else { + statistics.onShaderUse(shader, false); + } + } + /*********************************************************************\ |* Shaders *| \*********************************************************************/ @@ -1021,18 +1101,6 @@ public final class GLRenderer implements Renderer { } } - protected void bindProgram(Shader shader) { - int shaderId = shader.getId(); - if (context.boundShaderProgram != shaderId) { - gl.glUseProgram(shaderId); - statistics.onShaderUse(shader, true); - context.boundShader = shader; - context.boundShaderProgram = shaderId; - } else { - statistics.onShaderUse(shader, false); - } - } - protected void updateUniform(Shader shader, Uniform uniform) { int shaderId = shader.getId(); @@ -1138,6 +1206,58 @@ public final class GLRenderer implements Renderer { } } + /** + * Updates the buffer block for the shader. + * + * @param shader the shader. + * @param bufferBlock the storage block. + */ + protected void updateShaderBufferBlock(final Shader shader, final ShaderBufferBlock bufferBlock) { + + assert bufferBlock.getName() != null; + assert shader.getId() > 0; + + final BufferObject bufferObject = bufferBlock.getBufferObject(); + if (bufferObject.getUniqueId() == -1 || bufferObject.isUpdateNeeded()) { + updateBufferData(bufferObject); + } + + if (!bufferBlock.isUpdateNeeded()) { + return; + } + + bindProgram(shader); + + final int shaderId = shader.getId(); + final BufferObject.BufferType bufferType = bufferObject.getBufferType(); + + bindBuffer(bufferBlock, bufferObject, shaderId, bufferType); + + bufferBlock.clearUpdateNeeded(); + } + + private void bindBuffer(final ShaderBufferBlock bufferBlock, final BufferObject bufferObject, final int shaderId, + final BufferObject.BufferType bufferType) { + + switch (bufferType) { + case UniformBufferObject: { + final int blockIndex = gl3.glGetUniformBlockIndex(shaderId, bufferBlock.getName()); + gl3.glBindBufferBase(GL3.GL_UNIFORM_BUFFER, bufferObject.getBinding(), bufferObject.getId()); + gl3.glUniformBlockBinding(GL3.GL_UNIFORM_BUFFER, blockIndex, bufferObject.getBinding()); + break; + } + case ShaderStorageBufferObject: { + final int blockIndex = gl4.glGetProgramResourceIndex(shaderId, GL4.GL_SHADER_STORAGE_BLOCK, bufferBlock.getName()); + gl4.glShaderStorageBlockBinding(shaderId, blockIndex, bufferObject.getBinding()); + gl4.glBindBufferBase(GL4.GL_SHADER_STORAGE_BUFFER, bufferObject.getBinding(), bufferObject.getId()); + break; + } + default: { + throw new IllegalArgumentException("Doesn't support binding of " + bufferType); + } + } + } + protected void updateShaderUniforms(Shader shader) { ListMap uniforms = shader.getUniformMap(); for (int i = 0; i < uniforms.size(); i++) { @@ -1148,6 +1268,18 @@ public final class GLRenderer implements Renderer { } } + /** + * Updates all shader's buffer blocks. + * + * @param shader the shader. + */ + protected void updateShaderBufferBlocks(final Shader shader) { + final ListMap bufferBlocks = shader.getBufferBlockMap(); + for (int i = 0; i < bufferBlocks.size(); i++) { + updateShaderBufferBlock(shader, bufferBlocks.getValue(i)); + } + } + protected void resetUniformLocations(Shader shader) { ListMap uniforms = shader.getUniformMap(); for (int i = 0; i < uniforms.size(); i++) { @@ -1195,6 +1327,7 @@ public final class GLRenderer implements Renderer { + "Only GLSL 1.00 shaders are supported."); } + boolean insertPrecision = false; // Upload shader source. // Merge the defines and source code. stringBuf.setLength(0); @@ -1214,7 +1347,7 @@ public final class GLRenderer implements Renderer { if (source.getType() == ShaderType.Fragment) { // GLES2 requires precision qualifier. - stringBuf.append("precision mediump float;\n"); + insertPrecision = true; } } else { // version 100 does not exist in desktop GLSL. @@ -1233,6 +1366,14 @@ public final class GLRenderer implements Renderer { stringBuf.append(source.getDefines()); stringBuf.append(source.getSource()); + if(insertPrecision){ + // precision token is not a preprocessor dirrective therefore it must be placed after #extension tokens to avoid + // Error P0001: Extension directive must occur before any non-preprocessor tokens + int idx = stringBuf.lastIndexOf("#extension"); + idx = stringBuf.indexOf("\n", idx); + stringBuf.insert(idx + 1, "precision mediump float;\n"); + } + intBuf1.clear(); intBuf1.put(0, stringBuf.length()); gl.glShaderSource(id, new String[]{ stringBuf.toString() }, intBuf1); @@ -1366,6 +1507,7 @@ public final class GLRenderer implements Renderer { assert shader.getId() > 0; updateShaderUniforms(shader); + updateShaderBufferBlocks(shader); bindProgram(shader); } } @@ -2454,6 +2596,58 @@ public final class GLRenderer implements Renderer { vb.clearUpdateNeeded(); } + @Override + public void updateBufferData(final BufferObject bo) { + + int maxSize = Integer.MAX_VALUE; + + final BufferObject.BufferType bufferType = bo.getBufferType(); + + if (!caps.contains(bufferType.getRequiredCaps())) { + throw new IllegalArgumentException("The current video hardware doesn't support " + bufferType); + } + + final ByteBuffer data = bo.computeData(maxSize); + if (data == null) { + throw new IllegalArgumentException("Can't upload BO without data."); + } + + int bufferId = bo.getId(); + if (bufferId == -1) { + + // create buffer + intBuf1.clear(); + gl.glGenBuffers(intBuf1); + bufferId = intBuf1.get(0); + + bo.setId(bufferId); + + objManager.registerObject(bo); + } + + data.rewind(); + + switch (bufferType) { + case UniformBufferObject: { + gl3.glBindBuffer(GL3.GL_UNIFORM_BUFFER, bufferId); + gl3.glBufferData(GL4.GL_UNIFORM_BUFFER, data, GL3.GL_DYNAMIC_DRAW); + gl3.glBindBuffer(GL4.GL_UNIFORM_BUFFER, 0); + break; + } + case ShaderStorageBufferObject: { + gl4.glBindBuffer(GL4.GL_SHADER_STORAGE_BUFFER, bufferId); + gl4.glBufferData(GL4.GL_SHADER_STORAGE_BUFFER, data, GL4.GL_DYNAMIC_COPY); + gl4.glBindBuffer(GL4.GL_SHADER_STORAGE_BUFFER, 0); + break; + } + default: { + throw new IllegalArgumentException("Doesn't support binding of " + bufferType); + } + } + + bo.clearUpdateNeeded(); + } + public void deleteBuffer(VertexBuffer vb) { int bufId = vb.getId(); if (bufId != -1) { @@ -2467,6 +2661,23 @@ public final class GLRenderer implements Renderer { } } + @Override + public void deleteBuffer(final BufferObject bo) { + + int bufferId = bo.getId(); + if (bufferId == -1) { + return; + } + + intBuf1.clear(); + intBuf1.put(bufferId); + intBuf1.flip(); + + gl.glDeleteBuffers(intBuf1); + + bo.resetObject(); + } + public void clearVertexAttribs() { IDList attribList = context.attribIndexList; for (int i = 0; i < attribList.oldLen; i++) { diff --git a/jme3-core/src/main/java/com/jme3/renderer/opengl/TextureUtil.java b/jme3-core/src/main/java/com/jme3/renderer/opengl/TextureUtil.java index 305da6d83..114ac09d1 100644 --- a/jme3-core/src/main/java/com/jme3/renderer/opengl/TextureUtil.java +++ b/jme3-core/src/main/java/com/jme3/renderer/opengl/TextureUtil.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2014 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -266,7 +266,7 @@ final class TextureUtil { int[] mipSizes = image.getMipMapSizes(); int pos = 0; - // TODO: Remove unneccessary allocation + // TODO: Remove unnecessary allocation if (mipSizes == null) { if (data != null) { mipSizes = new int[]{data.capacity()}; diff --git a/jme3-core/src/main/java/com/jme3/renderer/queue/RenderQueue.java b/jme3-core/src/main/java/com/jme3/renderer/queue/RenderQueue.java index 9a0ed3632..5fd2aade9 100644 --- a/jme3-core/src/main/java/com/jme3/renderer/queue/RenderQueue.java +++ b/jme3-core/src/main/java/com/jme3/renderer/queue/RenderQueue.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -101,7 +101,7 @@ public class RenderQueue { /** * A special mode used for rendering transparent objects that - * should not be effected by {@link SceneProcessor}. + * should not be affected by {@link SceneProcessor}. * Generally this would contain translucent objects, and * also objects that do not write to the depth buffer such as * particle emitters. @@ -165,7 +165,7 @@ public class RenderQueue { * *

    The most significant comparator is the one for the transparent * bucket since there is no correct way to sort the transparent bucket - * that will handle all geometry all the time. In certain cases, the + * that will handle all geometries all the time. In certain cases, the * application may know the best way to sort and now has the option of * configuring a specific implementation.

    * diff --git a/jme3-core/src/main/java/com/jme3/scene/CameraNode.java b/jme3-core/src/main/java/com/jme3/scene/CameraNode.java index 44fed8208..220686f56 100644 --- a/jme3-core/src/main/java/com/jme3/scene/CameraNode.java +++ b/jme3-core/src/main/java/com/jme3/scene/CameraNode.java @@ -1,122 +1,123 @@ -/* - * Copyright (c) 2009-2012 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package com.jme3.scene; - -import com.jme3.export.JmeExporter; -import com.jme3.export.JmeImporter; -import com.jme3.renderer.Camera; -import com.jme3.scene.control.CameraControl; -import com.jme3.scene.control.CameraControl.ControlDirection; -import com.jme3.util.clone.Cloner; -import java.io.IOException; - -/** - * CameraNode simply uses {@link CameraControl} to implement - * linking of camera and node data. - * - * @author Tim8Dev - */ -public class CameraNode extends Node { - - private CameraControl camControl; - - /** - * Serialization only. Do not use. - */ - public CameraNode() { - } - - public CameraNode(String name, Camera camera) { - this(name, new CameraControl(camera)); - } - - public CameraNode(String name, CameraControl control) { - super(name); - addControl(control); - camControl = control; - } - - public void setEnabled(boolean enabled) { - camControl.setEnabled(enabled); - } - - public boolean isEnabled() { - return camControl.isEnabled(); - } - - public void setControlDir(ControlDirection controlDir) { - camControl.setControlDir(controlDir); - } - - public void setCamera(Camera camera) { - camControl.setCamera(camera); - } - - public ControlDirection getControlDir() { - return camControl.getControlDir(); - } - - public Camera getCamera() { - return camControl.getCamera(); - } - -// @Override -// public void lookAt(Vector3f position, Vector3f upVector) { -// this.lookAt(position, upVector); -// camControl.getCamera().lookAt(position, upVector); -// } - - /** - * Called internally by com.jme3.util.clone.Cloner. Do not call directly. - */ - @Override - public void cloneFields( Cloner cloner, Object original ) { - super.cloneFields(cloner, original); - - // A change in behavior... I think previously CameraNode was probably - // not really cloneable... or at least its camControl would be pointing - // to the wrong control. -pspeed - this.camControl = cloner.clone(camControl); - } - - @Override - public void read(JmeImporter im) throws IOException { - super.read(im); - camControl = (CameraControl)im.getCapsule(this).readSavable("camControl", null); - } - - @Override - public void write(JmeExporter ex) throws IOException { - super.write(ex); - ex.getCapsule(this).write(camControl, "camControl", null); - } -} +/* + * Copyright (c) 2009-2012 jMonkeyEngine + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'jMonkeyEngine' nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package com.jme3.scene; + +import com.jme3.export.JmeExporter; +import com.jme3.export.JmeImporter; +import com.jme3.renderer.Camera; +import com.jme3.scene.control.CameraControl; +import com.jme3.scene.control.CameraControl.ControlDirection; +import com.jme3.util.clone.Cloner; +import java.io.IOException; + +/** + * CameraNode simply uses {@link CameraControl} to implement + * linking of camera and node data. + * + * @author Tim8Dev + */ +public class CameraNode extends Node { + + private CameraControl camControl; + + /** + * Serialization only. Do not use. + */ + public CameraNode() { + super(); + } + + public CameraNode(String name, Camera camera) { + this(name, new CameraControl(camera)); + } + + public CameraNode(String name, CameraControl control) { + super(name); + addControl(control); + camControl = control; + } + + public void setEnabled(boolean enabled) { + camControl.setEnabled(enabled); + } + + public boolean isEnabled() { + return camControl.isEnabled(); + } + + public void setControlDir(ControlDirection controlDir) { + camControl.setControlDir(controlDir); + } + + public void setCamera(Camera camera) { + camControl.setCamera(camera); + } + + public ControlDirection getControlDir() { + return camControl.getControlDir(); + } + + public Camera getCamera() { + return camControl.getCamera(); + } + +// @Override +// public void lookAt(Vector3f position, Vector3f upVector) { +// this.lookAt(position, upVector); +// camControl.getCamera().lookAt(position, upVector); +// } + + /** + * Called internally by com.jme3.util.clone.Cloner. Do not call directly. + */ + @Override + public void cloneFields( Cloner cloner, Object original ) { + super.cloneFields(cloner, original); + + // A change in behavior... I think previously CameraNode was probably + // not really cloneable... or at least its camControl would be pointing + // to the wrong control. -pspeed + this.camControl = cloner.clone(camControl); + } + + @Override + public void read(JmeImporter im) throws IOException { + super.read(im); + camControl = (CameraControl)im.getCapsule(this).readSavable("camControl", null); + } + + @Override + public void write(JmeExporter ex) throws IOException { + super.write(ex); + ex.getCapsule(this).write(camControl, "camControl", null); + } +} diff --git a/jme3-core/src/main/java/com/jme3/scene/Geometry.java b/jme3-core/src/main/java/com/jme3/scene/Geometry.java index 6ba209bc3..437036222 100644 --- a/jme3-core/src/main/java/com/jme3/scene/Geometry.java +++ b/jme3-core/src/main/java/com/jme3/scene/Geometry.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -43,9 +43,10 @@ import com.jme3.material.Material; import com.jme3.math.Matrix4f; import com.jme3.renderer.Camera; import com.jme3.scene.VertexBuffer.Type; +import com.jme3.scene.mesh.MorphTarget; +import com.jme3.util.TempVars; import com.jme3.util.clone.Cloner; import com.jme3.util.clone.IdentityCloneFunction; -import com.jme3.util.TempVars; import java.io.IOException; import java.util.Queue; import java.util.logging.Level; @@ -86,6 +87,16 @@ public class Geometry extends Spatial { */ protected int startIndex = -1; + /** + * Morph state variable for morph animation + */ + private float[] morphState; + private boolean dirtyMorph = true; + // a Morph target that will be used to merge all targets that + // can't be handled on the cpu on each frame. + private MorphTarget fallbackMorphTarget; + private int nbSimultaneousGPUMorph = -1; + /** * Serialization only. Do not use. */ @@ -137,20 +148,6 @@ public class Geometry extends Spatial { return super.checkCulling(cam); } - /** - * Update the world transform of this Geometry and clear the - * TRANSFORM refresh flag. - */ - @Override - void checkDoTransformUpdate() { - if (ignoreTransform) { - worldTransform.loadIdentity(); - refreshFlags &= ~RF_TRANSFORM; - } else { - super.checkDoTransformUpdate(); - } - } - /** * @return If ignoreTransform mode is set. * @@ -165,7 +162,6 @@ public class Geometry extends Spatial { */ public void setIgnoreTransform(boolean ignoreTransform) { this.ignoreTransform = ignoreTransform; - setTransformRefresh(); } /** @@ -263,7 +259,7 @@ public class Geometry extends Spatial { @Override public void setMaterial(Material material) { this.material = material; - + nbSimultaneousGPUMorph = -1; if (isGrouped()) { groupNode.onMaterialChange(this); } @@ -413,6 +409,9 @@ public class Geometry extends Spatial { // Compute the cached world matrix cachedWorldMat.loadIdentity(); + if (ignoreTransform) { + return; + } cachedWorldMat.setRotationQuaternion(worldTransform.getRotation()); cachedWorldMat.setTranslation(worldTransform.getTranslation()); @@ -518,36 +517,6 @@ public class Geometry extends Spatial { return (Geometry)super.clone(cloneMaterial); } - /** - * The old clone() method that did not use the new Cloner utility. - */ - @Override - public Geometry oldClone(boolean cloneMaterial) { - Geometry geomClone = (Geometry) super.clone(cloneMaterial); - - // This geometry is managed, - // but the cloned one is not attached to anything, hence not managed. - if (geomClone.isGrouped()) { - geomClone.groupNode = null; - geomClone.startIndex = -1; - } - - geomClone.cachedWorldMat = cachedWorldMat.clone(); - if (material != null) { - if (cloneMaterial) { - geomClone.material = material.clone(); - } else { - geomClone.material = material; - } - } - - if (mesh != null && mesh.getBuffer(Type.BindPosePosition) != null) { - geomClone.mesh = mesh.cloneForAnim(); - } - - return geomClone; - } - /** * This version of clone is a shallow clone, in other words, the * same mesh is referenced as the original geometry. @@ -583,7 +552,7 @@ public class Geometry extends Spatial { super.cloneFields(cloner, original); // If this is a grouped node and if our group node is - // also cloned then we'll grab it's reference. + // also cloned then we'll grab its reference. if( groupNode != null ) { if( cloner.isCloned(groupNode) ) { // Then resolve the reference @@ -618,6 +587,80 @@ public class Geometry extends Spatial { this.material = cloner.clone(material); } + public void setMorphState(float[] state) { + if (mesh == null || mesh.getMorphTargets().length == 0){ + return; + } + + int nbMorphTargets = mesh.getMorphTargets().length; + + if (morphState == null) { + morphState = new float[nbMorphTargets]; + } + System.arraycopy(state, 0, morphState, 0, morphState.length); + this.dirtyMorph = true; + } + + /** + * returns true if the morph state has changed on the last frame. + * @return + */ + public boolean isDirtyMorph() { + return dirtyMorph; + } + + /** + * Seting this to true will stop this geometry morph buffer to be updated, + * unless the morph state changes + * @param dirtyMorph + */ + public void setDirtyMorph(boolean dirtyMorph) { + this.dirtyMorph = dirtyMorph; + } + + /** + * returns the morph state of this Geometry. + * Used internally by the MorphControl. + * @return + */ + public float[] getMorphState() { + if (morphState == null) { + morphState = new float[mesh.getMorphTargets().length]; + } + return morphState; + } + + /** + * Return the number of morph targets that can be handled on the GPU simultaneously for this geometry. + * Note that it depends on the material set on this geometry. + * This number is computed and set by the MorphControl, so it might be available only after the first frame. + * Else it's set to -1. + * @return the number of simultaneous morph targets handled on the GPU + */ + public int getNbSimultaneousGPUMorph() { + return nbSimultaneousGPUMorph; + } + + /** + * Sets the number of morph targets that can be handled on the GPU simultaneously for this geometry. + * Note that it depends on the material set on this geometry. + * This number is computed and set by the MorphControl, so it might be available only after the first frame. + * Else it's set to -1. + * WARNING: setting this manually might crash the shader compilation if set too high. Do it at your own risk. + * @param nbSimultaneousGPUMorph the number of simultaneous morph targets to be handled on the GPU. + */ + public void setNbSimultaneousGPUMorph(int nbSimultaneousGPUMorph) { + this.nbSimultaneousGPUMorph = nbSimultaneousGPUMorph; + } + + public MorphTarget getFallbackMorphTarget() { + return fallbackMorphTarget; + } + + public void setFallbackMorphTarget(MorphTarget fallbackMorphTarget) { + this.fallbackMorphTarget = fallbackMorphTarget; + } + @Override public void write(JmeExporter ex) throws IOException { super.write(ex); diff --git a/jme3-core/src/main/java/com/jme3/scene/Mesh.java b/jme3-core/src/main/java/com/jme3/scene/Mesh.java index 7921624f7..8dececf26 100644 --- a/jme3-core/src/main/java/com/jme3/scene/Mesh.java +++ b/jme3-core/src/main/java/com/jme3/scene/Mesh.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2017 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -39,24 +39,18 @@ import com.jme3.collision.bih.BIHTree; import com.jme3.export.*; import com.jme3.material.Material; import com.jme3.material.RenderState; -import com.jme3.math.Matrix4f; -import com.jme3.math.Triangle; -import com.jme3.math.Vector2f; -import com.jme3.math.Vector3f; -import com.jme3.scene.VertexBuffer.Format; -import com.jme3.scene.VertexBuffer.Type; -import com.jme3.scene.VertexBuffer.Usage; +import com.jme3.math.*; +import com.jme3.scene.VertexBuffer.*; import com.jme3.scene.mesh.*; -import com.jme3.util.BufferUtils; -import com.jme3.util.IntMap; +import com.jme3.util.*; import com.jme3.util.IntMap.Entry; -import com.jme3.util.SafeArrayList; import com.jme3.util.clone.Cloner; import com.jme3.util.clone.JmeCloneable; import java.io.IOException; import java.nio.*; import java.util.ArrayList; +import java.util.Arrays; /** * Mesh is used to store rendering data. @@ -139,8 +133,8 @@ public class Mesh implements Savable, Cloneable, JmeCloneable { */ Hybrid(false), /** - * Used for Tesselation only. Requires to set the number of vertices - * for each patch (default is 3 for triangle tesselation) + * Used for Tessellation only. Requires to set the number of vertices + * for each patch (default is 3 for triangle tessellation) */ Patch(true); private boolean listMode = false; @@ -171,8 +165,8 @@ public class Mesh implements Savable, Cloneable, JmeCloneable { private CollisionData collisionTree = null; - private SafeArrayList buffersList = new SafeArrayList(VertexBuffer.class); - private IntMap buffers = new IntMap(); + private SafeArrayList buffersList = new SafeArrayList<>(VertexBuffer.class); + private IntMap buffers = new IntMap<>(); private VertexBuffer[] lodLevels; private float pointSize = 1; private float lineWidth = 1; @@ -182,7 +176,7 @@ public class Mesh implements Savable, Cloneable, JmeCloneable { private int vertCount = -1; private int elementCount = -1; private int instanceCount = -1; - private int patchVertexCount=3; //only used for tesselation + private int patchVertexCount=3; //only used for tessellation private int maxNumWeights = -1; // only if using skeletal animation private int[] elementLengths; @@ -190,6 +184,8 @@ public class Mesh implements Savable, Cloneable, JmeCloneable { private Mode mode = Mode.Triangles; + private SafeArrayList morphTargets; + /** * Creates a new mesh with no {@link VertexBuffer vertex buffers}. */ @@ -210,7 +206,7 @@ public class Mesh implements Savable, Cloneable, JmeCloneable { clone.meshBound = meshBound.clone(); clone.collisionTree = collisionTree != null ? collisionTree : null; clone.buffers = buffers.clone(); - clone.buffersList = new SafeArrayList(VertexBuffer.class,buffersList); + clone.buffersList = new SafeArrayList<>(VertexBuffer.class, buffersList); clone.vertexArrayID = -1; if (elementLengths != null) { clone.elementLengths = elementLengths.clone(); @@ -240,8 +236,8 @@ public class Mesh implements Savable, Cloneable, JmeCloneable { //clone.collisionTree = collisionTree != null ? collisionTree : null; clone.collisionTree = null; // it will get re-generated in any case - clone.buffers = new IntMap(); - clone.buffersList = new SafeArrayList(VertexBuffer.class); + clone.buffers = new IntMap<>(); + clone.buffersList = new SafeArrayList<>(VertexBuffer.class); for (VertexBuffer vb : buffersList.getArray()){ VertexBuffer bufClone = vb.clone(); clone.buffers.put(vb.getBufferType().ordinal(), bufClone); @@ -353,7 +349,7 @@ public class Mesh implements Savable, Cloneable, JmeCloneable { VertexBuffer pos = getBuffer(Type.Position); if (pos == null || getBuffer(Type.BoneIndex) == null) { // ignore, this mesh doesn't have positional data - // or it doesn't have bone-vertex assignments, so its not animated + // or it doesn't have bone-vertex assignments, so it's not animated return; } @@ -704,7 +700,7 @@ public class Mesh implements Savable, Cloneable, JmeCloneable { */ @Deprecated public void setInterleaved(){ - ArrayList vbs = new ArrayList(); + ArrayList vbs = new ArrayList<>(); vbs.addAll(buffersList); // ArrayList vbs = new ArrayList(buffers.values()); @@ -827,8 +823,9 @@ public class Mesh implements Savable, Cloneable, JmeCloneable { * {@link #setInterleaved() interleaved} format. */ public void updateCounts(){ - if (getBuffer(Type.InterleavedData) != null) + if (getBuffer(Type.InterleavedData) != null) { throw new IllegalStateException("Should update counts before interleave"); + } VertexBuffer pb = getBuffer(Type.Position); VertexBuffer ib = getBuffer(Type.Index); @@ -851,11 +848,13 @@ public class Mesh implements Savable, Cloneable, JmeCloneable { */ public int getTriangleCount(int lod){ if (lodLevels != null){ - if (lod < 0) + if (lod < 0) { throw new IllegalArgumentException("LOD level cannot be < 0"); + } - if (lod >= lodLevels.length) - throw new IllegalArgumentException("LOD level "+lod+" does not exist!"); + if (lod >= lodLevels.length) { + throw new IllegalArgumentException("LOD level " + lod + " does not exist!"); + } return computeNumElements(lodLevels[lod].getData().limit()); }else if (lod == 0){ @@ -975,8 +974,9 @@ public class Mesh implements Savable, Cloneable, JmeCloneable { * Sets the mesh's VAO ID. Internal use only. */ public void setId(int id){ - if (vertexArrayID != -1) + if (vertexArrayID != -1) { throw new IllegalStateException("ID has already been set."); + } vertexArrayID = id; } @@ -1044,8 +1044,9 @@ public class Mesh implements Savable, Cloneable, JmeCloneable { * @throws IllegalArgumentException If the buffer type is already set */ public void setBuffer(VertexBuffer vb){ - if (buffers.containsKey(vb.getBufferType().ordinal())) - throw new IllegalArgumentException("Buffer type already set: "+vb.getBufferType()); + if (buffers.containsKey(vb.getBufferType().ordinal())) { + throw new IllegalArgumentException("Buffer type already set: " + vb.getBufferType()); + } buffers.put(vb.getBufferType().ordinal(), vb); buffersList.add(vb); @@ -1158,8 +1159,9 @@ public class Mesh implements Savable, Cloneable, JmeCloneable { */ public FloatBuffer getFloatBuffer(Type type) { VertexBuffer vb = getBuffer(type); - if (vb == null) + if (vb == null) { return null; + } return (FloatBuffer) vb.getData(); } @@ -1173,8 +1175,9 @@ public class Mesh implements Savable, Cloneable, JmeCloneable { */ public ShortBuffer getShortBuffer(Type type) { VertexBuffer vb = getBuffer(type); - if (vb == null) + if (vb == null) { return null; + } return (ShortBuffer) vb.getData(); } @@ -1186,8 +1189,9 @@ public class Mesh implements Savable, Cloneable, JmeCloneable { * @return A virtual or wrapped index buffer to read the data as a list */ public IndexBuffer getIndicesAsList(){ - if (mode == Mode.Hybrid) + if (mode == Mode.Hybrid) { throw new UnsupportedOperationException("Hybrid mode not supported"); + } IndexBuffer ib = getIndexBuffer(); if (ib != null){ @@ -1216,8 +1220,9 @@ public class Mesh implements Savable, Cloneable, JmeCloneable { */ public IndexBuffer getIndexBuffer() { VertexBuffer vb = getBuffer(Type.Index); - if (vb == null) + if (vb == null) { return null; + } return IndexBuffer.wrapIndexBuffer(vb.getData()); } @@ -1240,8 +1245,8 @@ public class Mesh implements Savable, Cloneable, JmeCloneable { IndexBuffer indexBuf = getIndexBuffer(); int numIndices = indexBuf.size(); - IntMap oldIndicesToNewIndices = new IntMap(numIndices); - ArrayList newIndicesToOldIndices = new ArrayList(); + IntMap oldIndicesToNewIndices = new IntMap<>(numIndices); + ArrayList newIndicesToOldIndices = new ArrayList<>(); int newIndex = 0; for (int i = 0; i < numIndices; i++) { @@ -1352,14 +1357,17 @@ public class Mesh implements Savable, Cloneable, JmeCloneable { */ public void scaleTextureCoordinates(Vector2f scaleFactor){ VertexBuffer tc = getBuffer(Type.TexCoord); - if (tc == null) + if (tc == null) { throw new IllegalStateException("The mesh has no texture coordinates"); + } - if (tc.getFormat() != VertexBuffer.Format.Float) + if (tc.getFormat() != VertexBuffer.Format.Float) { throw new UnsupportedOperationException("Only float texture coord format is supported"); + } - if (tc.getNumComponents() != 2) + if (tc.getNumComponents() != 2) { throw new UnsupportedOperationException("Only 2D texture coords are supported"); + } FloatBuffer fb = (FloatBuffer) tc.getData(); fb.clear(); @@ -1446,13 +1454,23 @@ public class Mesh implements Savable, Cloneable, JmeCloneable { getBuffer(Type.HWBoneIndex) != null; } + /** + * @deprecated use isAnimatedByJoint + * @param boneIndex + * @return + */ + @Deprecated + public boolean isAnimatedByBone(int boneIndex) { + return isAnimatedByJoint(boneIndex); + } + /** * Test whether the specified bone animates this mesh. * - * @param boneIndex the bone's index in its skeleton + * @param jointIndex the bone's index in its skeleton * @return true if the specified bone animates this mesh, otherwise false */ - public boolean isAnimatedByBone(int boneIndex) { + public boolean isAnimatedByJoint(int jointIndex) { VertexBuffer biBuf = getBuffer(VertexBuffer.Type.BoneIndex); VertexBuffer wBuf = getBuffer(VertexBuffer.Type.BoneWeight); if (biBuf == null || wBuf == null) { @@ -1472,7 +1490,7 @@ public class Mesh implements Savable, Cloneable, JmeCloneable { /* * Test each vertex to determine whether the bone affects it. */ - int biByte = boneIndex; + int biByte = jointIndex; for (int vIndex = 0; vIndex < numVertices; vIndex++) { for (int wIndex = 0; wIndex < 4; wIndex++) { int bIndex = boneIndexBuffer.get(); @@ -1494,23 +1512,33 @@ public class Mesh implements Savable, Cloneable, JmeCloneable { } /** - * Gets the amout of vertices used for each patch; + * Gets the amount of vertices used for each patch; * @return */ public int getPatchVertexCount() { return patchVertexCount; } + + public void addMorphTarget(MorphTarget target) { + if (morphTargets == null) { + morphTargets = new SafeArrayList<>(MorphTarget.class); + } + morphTargets.add(target); + } + + public MorphTarget[] getMorphTargets() { + return morphTargets.getArray(); + } + + public boolean hasMorphTargets() { + return morphTargets != null && !morphTargets.isEmpty(); + } + + @Override public void write(JmeExporter ex) throws IOException { OutputCapsule out = ex.getCapsule(this); -// HashMap map = new HashMap(); -// for (Entry buf : buffers){ -// if (buf.getValue() != null) -// map.put(buf.getKey()+"a", buf.getValue()); -// } -// out.writeStringSavableMap(map, "buffers", null); - out.write(meshBound, "modelBound", null); out.write(vertCount, "vertCount", -1); out.write(elementCount, "elementCount", -1); @@ -1545,8 +1573,12 @@ public class Mesh implements Savable, Cloneable, JmeCloneable { } out.write(lodLevels, "lodLevels", null); + if (morphTargets != null) { + out.writeSavableArrayList(new ArrayList(morphTargets), "morphTargets", null); + } } + @Override public void read(JmeImporter im) throws IOException { InputCapsule in = im.getCapsule(this); meshBound = (BoundingVolume) in.readSavable("modelBound", null); @@ -1583,6 +1615,11 @@ public class Mesh implements Savable, Cloneable, JmeCloneable { lodLevels = new VertexBuffer[lodLevelsSavable.length]; System.arraycopy( lodLevelsSavable, 0, lodLevels, 0, lodLevels.length); } + + ArrayList l = in.readSavableArrayList("morphTargets", null); + if (l != null) { + morphTargets = new SafeArrayList(MorphTarget.class, l); + } } } diff --git a/jme3-core/src/main/java/com/jme3/scene/Node.java b/jme3-core/src/main/java/com/jme3/scene/Node.java index 7806addd0..fcd6f770c 100644 --- a/jme3-core/src/main/java/com/jme3/scene/Node.java +++ b/jme3-core/src/main/java/com/jme3/scene/Node.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -31,15 +31,14 @@ */ package com.jme3.scene; +import com.jme3.bounding.BoundingBox; import com.jme3.bounding.BoundingVolume; import com.jme3.collision.Collidable; import com.jme3.collision.CollisionResults; import com.jme3.export.JmeExporter; import com.jme3.export.JmeImporter; -import com.jme3.export.Savable; import com.jme3.material.Material; import com.jme3.util.SafeArrayList; -import com.jme3.util.TempVars; import com.jme3.util.clone.Cloner; import java.io.IOException; import java.util.ArrayList; @@ -154,7 +153,7 @@ public class Node extends Spatial { @Override protected void updateWorldBound(){ super.updateWorldBound(); - // for a node, the world bound is a combination of all it's children + // for a node, the world bound is a combination of all its children // bounds BoundingVolume resultBound = null; for (Spatial child : children.getArray()) { @@ -170,6 +169,9 @@ public class Node extends Spatial { } } } + if (resultBound == null) { + resultBound = new BoundingBox(getWorldTranslation(), 0f, 0f, 0f); + } this.worldBound = resultBound; } @@ -433,7 +435,7 @@ public class Node extends Spatial { setBoundRefresh(); // our world transform no longer influences the child. - // XXX: Not neccessary? Since child will have transform updated + // XXX: Not necessary? Since child will have transform updated // when attached anyway. child.setTransformRefresh(); // lights are also inherited from parent diff --git a/jme3-core/src/main/java/com/jme3/scene/Spatial.java b/jme3-core/src/main/java/com/jme3/scene/Spatial.java index 8a7e2afe9..c44db734b 100644 --- a/jme3-core/src/main/java/com/jme3/scene/Spatial.java +++ b/jme3-core/src/main/java/com/jme3/scene/Spatial.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2013 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -31,6 +31,7 @@ */ package com.jme3.scene; +import com.jme3.anim.util.HasLocalTransform; import com.jme3.asset.AssetKey; import com.jme3.asset.CloneableSmartAsset; import com.jme3.bounding.BoundingVolume; @@ -48,18 +49,18 @@ import com.jme3.renderer.queue.RenderQueue; import com.jme3.renderer.queue.RenderQueue.Bucket; import com.jme3.renderer.queue.RenderQueue.ShadowMode; import com.jme3.scene.control.Control; +import com.jme3.util.SafeArrayList; +import com.jme3.util.TempVars; import com.jme3.util.clone.Cloner; import com.jme3.util.clone.IdentityCloneFunction; import com.jme3.util.clone.JmeCloneable; -import com.jme3.util.SafeArrayList; -import com.jme3.util.TempVars; import java.io.IOException; import java.util.*; import java.util.logging.Logger; /** * Spatial defines the base class for scene graph nodes. It - * maintains a link to a parent, it's local transforms and the world's + * maintains a link to a parent, its local transforms and the world's * transforms. All other scene graph elements, such as {@link Node} and * {@link Geometry} are subclasses of Spatial. * @@ -67,7 +68,7 @@ import java.util.logging.Logger; * @author Joshua Slack * @version $Revision: 4075 $, $Data$ */ -public abstract class Spatial implements Savable, Cloneable, Collidable, CloneableSmartAsset, JmeCloneable { +public abstract class Spatial implements Savable, Cloneable, Collidable, CloneableSmartAsset, JmeCloneable, HasLocalTransform { private static final Logger logger = Logger.getLogger(Spatial.class.getName()); @@ -567,8 +568,8 @@ public abstract class Spatial implements Savable, Cloneable, Collidable, Cloneab * Should be overridden by Node and Geometry. */ protected void updateWorldBound() { - // the world bound of a leaf is the same as it's model bound - // for a node, the world bound is a combination of all it's children + // the world bound of a leaf is the same as its model bound + // for a node, the world bound is a combination of all its children // bounds // -> handled by subclass refreshFlags &= ~RF_BOUND; @@ -966,7 +967,7 @@ public abstract class Spatial implements Savable, Cloneable, Collidable, Cloneab } /** - * removeFromParent removes this Spatial from it's parent. + * removeFromParent removes this Spatial from its parent. * * @return true if it has a parent and performed the remove. */ @@ -1367,66 +1368,11 @@ public abstract class Spatial implements Savable, Cloneable, Collidable, Cloneab } /** - * The old clone() method that did not use the new Cloner utility. + * The old clone() method that did not use the new Cloner utility. */ + @Deprecated public Spatial oldClone(boolean cloneMaterial) { - try { - Spatial clone = (Spatial) super.clone(); - if (worldBound != null) { - clone.worldBound = worldBound.clone(); - } - clone.worldLights = worldLights.clone(); - clone.localLights = localLights.clone(); - - // Set the new owner of the light lists - clone.localLights.setOwner(clone); - clone.worldLights.setOwner(clone); - - clone.worldOverrides = new SafeArrayList<>(MatParamOverride.class); - clone.localOverrides = new SafeArrayList<>(MatParamOverride.class); - - for (MatParamOverride override : localOverrides) { - clone.localOverrides.add((MatParamOverride) override.clone()); - } - - // No need to force cloned to update. - // This node already has the refresh flags - // set below so it will have to update anyway. - clone.worldTransform = worldTransform.clone(); - clone.localTransform = localTransform.clone(); - - if (clone instanceof Node) { - Node node = (Node) this; - Node nodeClone = (Node) clone; - nodeClone.children = new SafeArrayList(Spatial.class); - for (Spatial child : node.children) { - Spatial childClone = child.clone(cloneMaterial); - childClone.parent = nodeClone; - nodeClone.children.add(childClone); - } - } - - clone.parent = null; - clone.setBoundRefresh(); - clone.setTransformRefresh(); - clone.setLightListRefresh(); - clone.setMatParamOverrideRefresh(); - - clone.controls = new SafeArrayList(Control.class); - for (int i = 0; i < controls.size(); i++) { - Control newControl = controls.get(i).cloneForSpatial(clone); - newControl.setSpatial(clone); - clone.controls.add(newControl); - } - - if (userData != null) { - clone.userData = (HashMap) userData.clone(); - } - - return clone; - } catch (CloneNotSupportedException ex) { - throw new AssertionError(); - } + throw new UnsupportedOperationException(); } /** @@ -1436,9 +1382,6 @@ public abstract class Spatial implements Savable, Cloneable, Collidable, Cloneab * Note that meshes of geometries are not cloned explicitly, they * are shared if static, or specially cloned if animated. * - * All controls will be cloned using the Control.cloneForSpatial method - * on the clone. - * * @see Mesh#cloneForAnim() */ @Override @@ -1850,4 +1793,4 @@ public abstract class Spatial implements Savable, Cloneable, Collidable, Cloneab } protected abstract void breadthFirstTraversal(SceneGraphVisitor visitor, Queue queue); -} \ No newline at end of file +} diff --git a/jme3-core/src/main/java/com/jme3/scene/VertexBuffer.java b/jme3-core/src/main/java/com/jme3/scene/VertexBuffer.java index 70d40a64c..bb5d70afb 100644 --- a/jme3-core/src/main/java/com/jme3/scene/VertexBuffer.java +++ b/jme3-core/src/main/java/com/jme3/scene/VertexBuffer.java @@ -212,7 +212,42 @@ public class VertexBuffer extends NativeObject implements Savable, Cloneable { * Format should be {@link Format#Float} and number of components * should be 16. */ - InstanceData + InstanceData, + + /** + * Morph animations targets. + * Supports up tp 14 morph target buffers at the same time + * Limited due to the limited number of attributes you can bind to a vertex shader usually 16 + *

    + * MorphTarget buffers are either POSITION, NORMAL or TANGENT buffers. + * So we can support up to + * 14 simultaneous POSITION targets + * 7 simultaneous POSITION and NORMAL targets + * 4 simultaneous POSTION, NORMAL and TANGENT targets. + *

    + * Note that the MorphControl will find how many buffers can be supported for each mesh/material combination. + * Note that all buffers have 3 components (Vector3f) even the Tangent buffer that + * does not contain the w (handedness) component that will not be interpolated for morph animation. + *

    + * Note that those buffers contain the difference between the base buffer (POSITION, NORMAL or TANGENT) and the target value + * So that you can interpolate with a MADD operation in the vertex shader + * position = weight * diffPosition + basePosition; + */ + MorphTarget0, + MorphTarget1, + MorphTarget2, + MorphTarget3, + MorphTarget4, + MorphTarget5, + MorphTarget6, + MorphTarget7, + MorphTarget8, + MorphTarget9, + MorphTarget10, + MorphTarget11, + MorphTarget12, + MorphTarget13, + } /** @@ -241,7 +276,7 @@ public class VertexBuffer extends NativeObject implements Savable, Cloneable { * Mesh data is not sent to GPU at all. It is only * used by the CPU. */ - CpuOnly; + CpuOnly } /** @@ -606,9 +641,13 @@ public class VertexBuffer extends NativeObject implements Savable, Cloneable { * @return The total number of data elements in the data buffer. */ public int getNumElements(){ + if( data == null ) { + return 0; + } int elements = data.limit() / components; - if (format == Format.Half) + if (format == Format.Half) { elements /= 2; + } return elements; } @@ -639,14 +678,17 @@ public class VertexBuffer extends NativeObject implements Savable, Cloneable { * argument. */ public void setupData(Usage usage, int components, Format format, Buffer data){ - if (id != -1) + if (id != -1) { throw new UnsupportedOperationException("Data has already been sent. Cannot setupData again."); + } - if (usage == null || format == null || data == null) + if (usage == null || format == null || data == null) { throw new IllegalArgumentException("None of the arguments can be null"); - - if (data.isReadOnly()) - throw new IllegalArgumentException( "VertexBuffer data cannot be read-only." ); + } + + if (data.isReadOnly()) { + throw new IllegalArgumentException("VertexBuffer data cannot be read-only."); + } if (bufType != Type.InstanceData) { if (components < 1 || components > 4) { @@ -717,11 +759,13 @@ public class VertexBuffer extends NativeObject implements Savable, Cloneable { * Converts single floating-point data to {@link Format#Half half} floating-point data. */ public void convertToHalf(){ - if (id != -1) + if (id != -1) { throw new UnsupportedOperationException("Data has already been sent."); + } - if (format != Format.Float) + if (format != Format.Float) { throw new IllegalStateException("Format must be float!"); + } int numElements = data.limit() / components; format = Format.Half; @@ -910,8 +954,9 @@ public class VertexBuffer extends NativeObject implements Savable, Cloneable { * match. */ public void copyElements(int inIndex, VertexBuffer outVb, int outIndex, int len){ - if (outVb.format != format || outVb.components != components) + if (outVb.format != format || outVb.components != components) { throw new IllegalArgumentException("Buffer format mismatch. Cannot copy"); + } int inPos = inIndex * components; int outPos = outIndex * components; @@ -978,8 +1023,9 @@ public class VertexBuffer extends NativeObject implements Savable, Cloneable { * of elements with the given number of components in each element. */ public static Buffer createBuffer(Format format, int components, int numElements){ - if (components < 1 || components > 4) + if (components < 1 || components > 4) { throw new IllegalArgumentException("Num components must be between 1 and 4"); + } int total = numElements * components; diff --git a/jme3-core/src/main/java/com/jme3/scene/control/AbstractControl.java b/jme3-core/src/main/java/com/jme3/scene/control/AbstractControl.java index 05da60f0f..4afbb437b 100644 --- a/jme3-core/src/main/java/com/jme3/scene/control/AbstractControl.java +++ b/jme3-core/src/main/java/com/jme3/scene/control/AbstractControl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -84,27 +84,10 @@ public abstract class AbstractControl implements Control, JmeCloneable { */ protected abstract void controlRender(RenderManager rm, ViewPort vp); - /** - * Default implementation of cloneForSpatial() that - * simply clones the control and sets the spatial. - *

    -     *  AbstractControl c = clone();
    -     *  c.spatial = null;
    -     *  c.setSpatial(spatial);
    -     *  
    - * - * Controls that wish to be persisted must be Cloneable. - */ + @Deprecated @Override public Control cloneForSpatial(Spatial spatial) { - try { - AbstractControl c = (AbstractControl)clone(); - c.spatial = null; // to keep setSpatial() from throwing an exception - c.setSpatial(spatial); - return c; - } catch(CloneNotSupportedException e) { - throw new RuntimeException( "Can't clone control for spatial", e ); - } + throw new UnsupportedOperationException(); } @Override diff --git a/jme3-core/src/main/java/com/jme3/scene/control/Control.java b/jme3-core/src/main/java/com/jme3/scene/control/Control.java index 63d7b43c8..d3d0e221f 100644 --- a/jme3-core/src/main/java/com/jme3/scene/control/Control.java +++ b/jme3-core/src/main/java/com/jme3/scene/control/Control.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -47,11 +47,15 @@ import com.jme3.scene.Spatial; public interface Control extends Savable { /** - * Creates a clone of the Control, the given Spatial is the cloned - * version of the spatial to which this control is attached to. + * Creates a clone of the Control, the given Spatial is the cloned version + * of the spatial to which this control is attached to. + * * @param spatial * @return A clone of this control for the spatial + * @deprecated Use + * {@link com.jme3.util.clone.JmeCloneable#cloneFields(com.jme3.util.clone.Cloner, java.lang.Object)} */ + @Deprecated public Control cloneForSpatial(Spatial spatial); /** diff --git a/jme3-core/src/main/java/com/jme3/scene/control/LightControl.java b/jme3-core/src/main/java/com/jme3/scene/control/LightControl.java index 36d29c542..1cdfdaf07 100644 --- a/jme3-core/src/main/java/com/jme3/scene/control/LightControl.java +++ b/jme3-core/src/main/java/com/jme3/scene/control/LightControl.java @@ -42,8 +42,9 @@ import com.jme3.light.SpotLight; import com.jme3.math.Vector3f; import com.jme3.renderer.RenderManager; import com.jme3.renderer.ViewPort; -import com.jme3.scene.Spatial; import com.jme3.util.TempVars; +import com.jme3.util.clone.Cloner; + import java.io.IOException; /** @@ -54,7 +55,10 @@ import java.io.IOException; */ public class LightControl extends AbstractControl { - public static enum ControlDirection { + private static final String CONTROL_DIR_NAME = "controlDir"; + private static final String LIGHT_NAME = "light"; + + public enum ControlDirection { /** * Means, that the Light's transform is "copied" @@ -67,6 +71,7 @@ public class LightControl extends AbstractControl { */ SpatialToLight; } + private Light light; private ControlDirection controlDir = ControlDirection.SpatialToLight; @@ -113,7 +118,7 @@ public class LightControl extends AbstractControl { if (spatial != null && light != null) { switch (controlDir) { case SpatialToLight: - spatialTolight(light); + spatialToLight(light); break; case LightToSpatial: lightToSpatial(light); @@ -122,22 +127,29 @@ public class LightControl extends AbstractControl { } } - private void spatialTolight(Light light) { + private void spatialToLight(Light light) { + + final Vector3f worldTranslation = spatial.getWorldTranslation(); + if (light instanceof PointLight) { - ((PointLight) light).setPosition(spatial.getWorldTranslation()); + ((PointLight) light).setPosition(worldTranslation); + return; } - TempVars vars = TempVars.get(); + + final TempVars vars = TempVars.get(); + final Vector3f vec = vars.vect1; if (light instanceof DirectionalLight) { - ((DirectionalLight) light).setDirection(vars.vect1.set(spatial.getWorldTranslation()).multLocal(-1.0f)); + ((DirectionalLight) light).setDirection(vec.set(worldTranslation).multLocal(-1.0f)); } if (light instanceof SpotLight) { - ((SpotLight) light).setPosition(spatial.getWorldTranslation()); - ((SpotLight) light).setDirection(spatial.getWorldRotation().multLocal(vars.vect1.set(Vector3f.UNIT_Y).multLocal(-1))); + final SpotLight spotLight = (SpotLight) light; + spotLight.setPosition(worldTranslation); + spotLight.setDirection(spatial.getWorldRotation().multLocal(vec.set(Vector3f.UNIT_Y).multLocal(-1))); } - vars.release(); + vars.release(); } private void lightToSpatial(Light light) { @@ -158,8 +170,6 @@ public class LightControl extends AbstractControl { } vars.release(); //TODO add code for Spot light here when it's done - - } @Override @@ -167,23 +177,18 @@ public class LightControl extends AbstractControl { // nothing to do } - // default implementation from AbstractControl is equivalent - //@Override - //public Control cloneForSpatial(Spatial newSpatial) { - // LightControl control = new LightControl(light, controlDir); - // control.setSpatial(newSpatial); - // control.setEnabled(isEnabled()); - // return control; - //} - private static final String CONTROL_DIR_NAME = "controlDir"; - private static final String LIGHT_NAME = "light"; - + @Override + public void cloneFields(final Cloner cloner, final Object original) { + super.cloneFields(cloner, original); + light = cloner.clone(light); + } + @Override public void read(JmeImporter im) throws IOException { super.read(im); InputCapsule ic = im.getCapsule(this); controlDir = ic.readEnum(CONTROL_DIR_NAME, ControlDirection.class, ControlDirection.SpatialToLight); - light = (Light)ic.readSavable(LIGHT_NAME, null); + light = (Light) ic.readSavable(LIGHT_NAME, null); } @Override diff --git a/jme3-core/src/main/java/com/jme3/scene/control/LodControl.java b/jme3-core/src/main/java/com/jme3/scene/control/LodControl.java index eac48db4e..fd74de5d1 100644 --- a/jme3-core/src/main/java/com/jme3/scene/control/LodControl.java +++ b/jme3-core/src/main/java/com/jme3/scene/control/LodControl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -43,7 +43,6 @@ import com.jme3.renderer.ViewPort; import com.jme3.scene.Geometry; import com.jme3.scene.Mesh; import com.jme3.scene.Spatial; -import com.jme3.util.clone.Cloner; import com.jme3.util.clone.JmeCloneable; import java.io.IOException; @@ -141,15 +140,6 @@ public class LodControl extends AbstractControl implements Cloneable, JmeCloneab } } - @Override - public Control cloneForSpatial(Spatial spatial) { - LodControl clone = (LodControl) super.cloneForSpatial(spatial); - clone.lastDistance = 0; - clone.lastLevel = 0; - clone.numTris = numTris != null ? numTris.clone() : null; - return clone; - } - @Override public Object jmeClone() { LodControl clone = (LodControl)super.jmeClone(); diff --git a/jme3-core/src/main/java/com/jme3/scene/control/UpdateControl.java b/jme3-core/src/main/java/com/jme3/scene/control/UpdateControl.java index 9c101c73e..8e276c32f 100644 --- a/jme3-core/src/main/java/com/jme3/scene/control/UpdateControl.java +++ b/jme3-core/src/main/java/com/jme3/scene/control/UpdateControl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -34,9 +34,6 @@ package com.jme3.scene.control; import com.jme3.app.AppTask; import com.jme3.renderer.RenderManager; import com.jme3.renderer.ViewPort; -import com.jme3.scene.Spatial; -import com.jme3.util.clone.Cloner; -import com.jme3.util.clone.JmeCloneable; import java.util.concurrent.Callable; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.Future; @@ -87,15 +84,6 @@ public class UpdateControl extends AbstractControl { } - @Override - public Control cloneForSpatial(Spatial newSpatial) { - UpdateControl control = new UpdateControl(); - control.setSpatial(newSpatial); - control.setEnabled(isEnabled()); - control.taskQueue.addAll(taskQueue); - return control; - } - @Override public Object jmeClone() { UpdateControl clone = (UpdateControl)super.jmeClone(); diff --git a/jme3-core/src/main/java/com/jme3/scene/debug/Arrow.java b/jme3-core/src/main/java/com/jme3/scene/debug/Arrow.java index 0b1855bc9..5f6425823 100644 --- a/jme3-core/src/main/java/com/jme3/scene/debug/Arrow.java +++ b/jme3-core/src/main/java/com/jme3/scene/debug/Arrow.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -56,7 +56,7 @@ public class Arrow extends Mesh { 0.05f, 0, 0.9f, // tip right -0.05f, 0, 0.9f, // tip left 0, 0.05f, 0.9f, // tip top - 0, -0.05f, 0.9f, // tip buttom + 0, -0.05f, 0.9f, // tip bottom }; /** diff --git a/jme3-core/src/main/java/com/jme3/scene/debug/Grid.java b/jme3-core/src/main/java/com/jme3/scene/debug/Grid.java index 563981804..f9e5e119e 100644 --- a/jme3-core/src/main/java/com/jme3/scene/debug/Grid.java +++ b/jme3-core/src/main/java/com/jme3/scene/debug/Grid.java @@ -32,9 +32,9 @@ package com.jme3.scene.debug; import com.jme3.scene.Mesh; -import com.jme3.scene.Mesh.Mode; import com.jme3.scene.VertexBuffer.Type; import com.jme3.util.BufferUtils; + import java.nio.FloatBuffer; import java.nio.ShortBuffer; @@ -45,6 +45,9 @@ import java.nio.ShortBuffer; */ public class Grid extends Mesh { + public Grid() { + } + /** * Creates a grid debug shape. * @param xLines diff --git a/jme3-core/src/main/java/com/jme3/scene/debug/WireFrustum.java b/jme3-core/src/main/java/com/jme3/scene/debug/WireFrustum.java index 4f5364753..7fabbc503 100644 --- a/jme3-core/src/main/java/com/jme3/scene/debug/WireFrustum.java +++ b/jme3-core/src/main/java/com/jme3/scene/debug/WireFrustum.java @@ -42,29 +42,39 @@ import java.nio.FloatBuffer; public class WireFrustum extends Mesh { public WireFrustum(Vector3f[] points){ + initGeom(this, points); + } + + public static Mesh makeFrustum(Vector3f[] points){ + Mesh m = new Mesh(); + initGeom(m, points); + return m; + } + + private static void initGeom(Mesh m, Vector3f[] points) { if (points != null) - setBuffer(Type.Position, 3, BufferUtils.createFloatBuffer(points)); + m.setBuffer(Type.Position, 3, BufferUtils.createFloatBuffer(points)); - setBuffer(Type.Index, 2, + m.setBuffer(Type.Index, 2, new short[]{ - 0, 1, - 1, 2, - 2, 3, - 3, 0, + 0, 1, + 1, 2, + 2, 3, + 3, 0, - 4, 5, - 5, 6, - 6, 7, - 7, 4, + 4, 5, + 5, 6, + 6, 7, + 7, 4, - 0, 4, - 1, 5, - 2, 6, - 3, 7, + 0, 4, + 1, 5, + 2, 6, + 3, 7, } ); - getBuffer(Type.Index).setUsage(Usage.Static); - setMode(Mode.Lines); + m.getBuffer(Type.Index).setUsage(Usage.Static); + m.setMode(Mode.Lines); } public void update(Vector3f[] points){ diff --git a/jme3-core/src/main/java/com/jme3/scene/debug/custom/ArmatureDebugAppState.java b/jme3-core/src/main/java/com/jme3/scene/debug/custom/ArmatureDebugAppState.java new file mode 100644 index 000000000..a3618b444 --- /dev/null +++ b/jme3-core/src/main/java/com/jme3/scene/debug/custom/ArmatureDebugAppState.java @@ -0,0 +1,208 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package com.jme3.scene.debug.custom; + +import com.jme3.anim.*; +import com.jme3.app.Application; +import com.jme3.app.state.BaseAppState; +import com.jme3.collision.CollisionResults; +import com.jme3.input.KeyInput; +import com.jme3.input.MouseInput; +import com.jme3.input.controls.*; +import com.jme3.light.DirectionalLight; +import com.jme3.math.*; +import com.jme3.renderer.ViewPort; +import com.jme3.scene.*; + +import java.util.*; + +/** + * @author Nehon + */ +public class ArmatureDebugAppState extends BaseAppState { + + public static final float CLICK_MAX_DELAY = 0.2f; + private Node debugNode = new Node("debugNode"); + private Map armatures = new HashMap<>(); + private Map selectedBones = new HashMap<>(); + private Application app; + private boolean displayAllJoints = false; + private float clickDelay = -1; + Vector3f tmp = new Vector3f(); + Vector3f tmp2 = new Vector3f(); + ViewPort vp; + + @Override + protected void initialize(Application app) { + vp = app.getRenderManager().createMainView("debug", app.getCamera()); + vp.attachScene(debugNode); + vp.setClearDepth(true); + this.app = app; + for (ArmatureDebugger armatureDebugger : armatures.values()) { + armatureDebugger.initialize(app.getAssetManager(), app.getCamera()); + } + app.getInputManager().addListener(actionListener, "shoot", "toggleJoints"); + app.getInputManager().addMapping("shoot", new MouseButtonTrigger(MouseInput.BUTTON_LEFT), new MouseButtonTrigger(MouseInput.BUTTON_RIGHT)); + app.getInputManager().addMapping("toggleJoints", new KeyTrigger(KeyInput.KEY_F10)); + + debugNode.addLight(new DirectionalLight(new Vector3f(-1f, -1f, -1f).normalizeLocal())); + + debugNode.addLight(new DirectionalLight(new Vector3f(1f, 1f, 1f).normalizeLocal(), new ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f))); + vp.setEnabled(false); + } + + @Override + protected void cleanup(Application app) { + + } + + @Override + protected void onEnable() { + vp.setEnabled(true); + } + + @Override + protected void onDisable() { + vp.setEnabled(false); + } + + @Override + public void update(float tpf) { + if (clickDelay > -1) { + clickDelay += tpf; + } + debugNode.updateLogicalState(tpf); + debugNode.updateGeometricState(); + + } + + public ArmatureDebugger addArmatureFrom(SkinningControl skinningControl) { + Armature armature = skinningControl.getArmature(); + Spatial forSpatial = skinningControl.getSpatial(); + return addArmatureFrom(armature, forSpatial); + } + + public ArmatureDebugger addArmatureFrom(Armature armature, Spatial forSpatial) { + + ArmatureDebugger ad = armatures.get(armature); + if(ad != null){ + return ad; + } + + JointInfoVisitor visitor = new JointInfoVisitor(armature); + forSpatial.depthFirstTraversal(visitor); + + ad = new ArmatureDebugger(forSpatial.getName() + "_Armature", armature, visitor.deformingJoints); + ad.setLocalTransform(forSpatial.getWorldTransform()); + if (forSpatial instanceof Node) { + List geoms = new ArrayList<>(); + findGeoms((Node) forSpatial, geoms); + if (geoms.size() == 1) { + ad.setLocalTransform(geoms.get(0).getWorldTransform()); + } + } + armatures.put(armature, ad); + debugNode.attachChild(ad); + if (isInitialized()) { + ad.initialize(app.getAssetManager(), app.getCamera()); + } + return ad; + } + + private void findGeoms(Node node, List geoms) { + for (Spatial spatial : node.getChildren()) { + if (spatial instanceof Geometry) { + geoms.add((Geometry) spatial); + } else if (spatial instanceof Node) { + findGeoms((Node) spatial, geoms); + } + } + } + + private ActionListener actionListener = new ActionListener() { + public void onAction(String name, boolean isPressed, float tpf) { + if (name.equals("shoot") && isPressed) { + clickDelay = 0; + } + if (name.equals("shoot") && !isPressed && clickDelay < CLICK_MAX_DELAY) { + Vector2f click2d = app.getInputManager().getCursorPosition(); + CollisionResults results = new CollisionResults(); + + Vector3f click3d = app.getCamera().getWorldCoordinates(new Vector2f(click2d.x, click2d.y), 0f, tmp); + Vector3f dir = app.getCamera().getWorldCoordinates(new Vector2f(click2d.x, click2d.y), 1f, tmp2).subtractLocal(click3d); + Ray ray = new Ray(click3d, dir); + debugNode.collideWith(ray, results); + + if (results.size() == 0) { + for (ArmatureDebugger ad : armatures.values()) { + ad.select(null); + } + return; + } + + // The closest result is the target that the player picked: + Geometry target = results.getClosestCollision().getGeometry(); + for (ArmatureDebugger ad : armatures.values()) { + Joint selectedjoint = ad.select(target); + if (selectedjoint != null) { + selectedBones.put(ad.getArmature(), selectedjoint); + System.err.println("-----------------------"); + System.err.println("Selected Joint : " + selectedjoint.getName() + " in armature " + ad.getName()); + System.err.println("Root Bone : " + (selectedjoint.getParent() == null)); + System.err.println("-----------------------"); + System.err.println("Local translation: " + selectedjoint.getLocalTranslation()); + System.err.println("Local rotation: " + selectedjoint.getLocalRotation()); + System.err.println("Local scale: " + selectedjoint.getLocalScale()); + System.err.println("---"); + System.err.println("Model translation: " + selectedjoint.getModelTransform().getTranslation()); + System.err.println("Model rotation: " + selectedjoint.getModelTransform().getRotation()); + System.err.println("Model scale: " + selectedjoint.getModelTransform().getScale()); + System.err.println("---"); + System.err.println("Bind inverse Transform: "); + System.err.println(selectedjoint.getInverseModelBindMatrix()); + return; + } + } + } + if (name.equals("toggleJoints") && isPressed) { + displayAllJoints = !displayAllJoints; + for (ArmatureDebugger ad : armatures.values()) { + ad.displayNonDeformingJoint(displayAllJoints); + } + } + } + }; + +// public Map getSelectedBones() { +// return selectedBones; +// } + + public Node getDebugNode() { + return debugNode; + } + + public void setDebugNode(Node debugNode) { + this.debugNode = debugNode; + } + + private class JointInfoVisitor extends SceneGraphVisitorAdapter { + + List deformingJoints = new ArrayList<>(); + Armature armature; + + public JointInfoVisitor(Armature armature) { + this.armature = armature; + } + + @Override + public void visit(Geometry g) { + for (Joint joint : armature.getJointList()) { + if (g.getMesh().isAnimatedByJoint(armature.getJointIndex(joint))) { + deformingJoints.add(joint); + } + } + } + } +} diff --git a/jme3-core/src/main/java/com/jme3/scene/debug/custom/ArmatureDebugger.java b/jme3-core/src/main/java/com/jme3/scene/debug/custom/ArmatureDebugger.java new file mode 100644 index 000000000..31c292186 --- /dev/null +++ b/jme3-core/src/main/java/com/jme3/scene/debug/custom/ArmatureDebugger.java @@ -0,0 +1,188 @@ +package com.jme3.scene.debug.custom; + +/* + * Copyright (c) 2009-2012 jMonkeyEngine + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'jMonkeyEngine' nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +import com.jme3.anim.Armature; +import com.jme3.anim.Joint; +import com.jme3.asset.AssetManager; +import com.jme3.collision.Collidable; +import com.jme3.collision.CollisionResults; +import com.jme3.material.Material; +import com.jme3.material.RenderState; +import com.jme3.math.Vector2f; +import com.jme3.renderer.Camera; +import com.jme3.renderer.queue.RenderQueue; +import com.jme3.scene.Geometry; +import com.jme3.scene.Node; +import com.jme3.texture.Texture; + +import java.util.List; + +/** + * The class that creates a mesh to display how bones behave. If it is supplied + * with the bones' lengths it will show exactly how the bones look like on the + * scene. If not then only connections between each bone heads will be shown. + */ +public class ArmatureDebugger extends Node { + + /** + * The lines of the bones or the wires between their heads. + */ + private ArmatureNode armatureNode; + + private Armature armature; + + private Node joints; + private Node outlines; + private Node wires; + /** + * The dotted lines between a bone's tail and the had of its children. Not + * available if the length data was not provided. + */ + private ArmatureInterJointsWire interJointWires; + + public ArmatureDebugger() { + } + + /** + * Creates a debugger with no length data. The wires will be a connection + * between the bones' heads only. The points will show the bones' heads only + * and no dotted line of inter bones connection will be visible. + * + * @param name the name of the debugger's node + * @param armature the armature that will be shown + */ + public ArmatureDebugger(String name, Armature armature, List deformingJoints) { + super(name); + this.armature = armature; + armature.update(); + + joints = new Node("joints"); + outlines = new Node("outlines"); + wires = new Node("bones"); + this.attachChild(joints); + this.attachChild(outlines); + this.attachChild(wires); + Node ndJoints = new Node("non deforming Joints"); + Node ndOutlines = new Node("non deforming Joints outlines"); + Node ndWires = new Node("non deforming Joints wires"); + joints.attachChild(ndJoints); + outlines.attachChild(ndOutlines); + wires.attachChild(ndWires); + Node outlineDashed = new Node("Outlines Dashed"); + Node wiresDashed = new Node("Wires Dashed"); + wiresDashed.attachChild(new Node("dashed non defrom")); + outlineDashed.attachChild(new Node("dashed non defrom")); + outlines.attachChild(outlineDashed); + wires.attachChild(wiresDashed); + + armatureNode = new ArmatureNode(armature, joints, wires, outlines, deformingJoints); + + this.attachChild(armatureNode); + + displayNonDeformingJoint(false); + } + + public void displayNonDeformingJoint(boolean display) { + joints.getChild(0).setCullHint(display ? CullHint.Dynamic : CullHint.Always); + outlines.getChild(0).setCullHint(display ? CullHint.Dynamic : CullHint.Always); + wires.getChild(0).setCullHint(display ? CullHint.Dynamic : CullHint.Always); + ((Node) outlines.getChild(1)).getChild(0).setCullHint(display ? CullHint.Dynamic : CullHint.Always); + ((Node) wires.getChild(1)).getChild(0).setCullHint(display ? CullHint.Dynamic : CullHint.Always); + } + + public void initialize(AssetManager assetManager, Camera camera) { + + armatureNode.setCamera(camera); + + Material matJoints = new Material(assetManager, "Common/MatDefs/Misc/Billboard.j3md"); + Texture t = assetManager.loadTexture("Common/Textures/dot.png"); + matJoints.setTexture("Texture", t); + matJoints.getAdditionalRenderState().setDepthTest(false); + matJoints.getAdditionalRenderState().setBlendMode(RenderState.BlendMode.Alpha); + joints.setQueueBucket(RenderQueue.Bucket.Translucent); + joints.setMaterial(matJoints); + + Material matWires = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); + matWires.setBoolean("VertexColor", true); + matWires.getAdditionalRenderState().setLineWidth(3); + wires.setMaterial(matWires); + + Material matOutline = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); + matOutline.setBoolean("VertexColor", true); + matOutline.getAdditionalRenderState().setLineWidth(5); + outlines.setMaterial(matOutline); + + Material matOutline2 = new Material(assetManager, "Common/MatDefs/Misc/DashedLine.j3md"); + matOutline2.getAdditionalRenderState().setLineWidth(1); + outlines.getChild(1).setMaterial(matOutline2); + + Material matWires2 = new Material(assetManager, "Common/MatDefs/Misc/DashedLine.j3md"); + matWires2.getAdditionalRenderState().setLineWidth(1); + wires.getChild(1).setMaterial(matWires2); + + } + + public Armature getArmature() { + return armature; + } + + @Override + public void updateLogicalState(float tpf) { + super.updateLogicalState(tpf); + armatureNode.updateGeometry(); + } + + @Override + public int collideWith(Collidable other, CollisionResults results) { + return armatureNode.collideWith(other, results); + } + + protected Joint select(Geometry g) { + return armatureNode.select(g); + } + + /** + * @return the armature wires + */ + public ArmatureNode getBoneShapes() { + return armatureNode; + } + + /** + * @return the dotted line between bones (can be null) + */ + public ArmatureInterJointsWire getInterJointWires() { + return interJointWires; + } +} \ No newline at end of file diff --git a/jme3-core/src/main/java/com/jme3/scene/debug/custom/ArmatureInterJointsWire.java b/jme3-core/src/main/java/com/jme3/scene/debug/custom/ArmatureInterJointsWire.java new file mode 100644 index 000000000..b1c62a55b --- /dev/null +++ b/jme3-core/src/main/java/com/jme3/scene/debug/custom/ArmatureInterJointsWire.java @@ -0,0 +1,124 @@ +package com.jme3.scene.debug.custom; + +/* + * Copyright (c) 2009-2012 jMonkeyEngine + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'jMonkeyEngine' nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + +import com.jme3.math.Vector3f; +import com.jme3.scene.Mesh; +import com.jme3.scene.VertexBuffer; +import com.jme3.scene.VertexBuffer.Type; + +import java.nio.FloatBuffer; + +/** + * A class that displays a dotted line between a bone tail and its childrens' heads. + * + * @author Marcin Roguski (Kaelthas) + */ +public class ArmatureInterJointsWire extends Mesh { + private Vector3f tmp = new Vector3f(); + + + public ArmatureInterJointsWire(Vector3f start, Vector3f[] ends) { + setMode(Mode.Lines); + updateGeometry(start, ends); + } + + protected void updateGeometry(Vector3f start, Vector3f[] ends) { + float[] pos = new float[ends.length * 3 + 3]; + pos[0] = start.x; + pos[1] = start.y; + pos[2] = start.z; + int index; + for (int i = 0; i < ends.length; i++) { + index = i * 3 + 3; + pos[index] = ends[i].x; + pos[index + 1] = ends[i].y; + pos[index + 2] = ends[i].z; + } + setBuffer(Type.Position, 3, pos); + + float[] texCoord = new float[ends.length * 2 + 2]; + texCoord[0] = 0; + texCoord[1] = 0; + for (int i = 0; i < ends.length * 2; i++) { + texCoord[i + 2] = tmp.set(start).subtractLocal(ends[i / 2]).length(); + } + setBuffer(Type.TexCoord, 2, texCoord); + + float[] normal = new float[ends.length * 3 + 3]; + for (int i = 0; i < ends.length * 3 + 3; i += 3) { + normal[i] = start.x; + normal[i + 1] = start.y; + normal[i + 2] = start.z; + } + setBuffer(Type.Normal, 3, normal); + + short[] id = new short[ends.length * 2]; + index = 1; + for (int i = 0; i < ends.length * 2; i += 2) { + id[i] = 0; + id[i + 1] = (short) (index); + index++; + } + setBuffer(Type.Index, 2, id); + updateBound(); + } + + /** + * Update the start and end points of the line. + */ + public void updatePoints(Vector3f start, Vector3f[] ends) { + VertexBuffer posBuf = getBuffer(Type.Position); + FloatBuffer fb = (FloatBuffer) posBuf.getData(); + fb.rewind(); + fb.put(start.x).put(start.y).put(start.z); + for (int i = 0; i < ends.length; i++) { + fb.put(ends[i].x); + fb.put(ends[i].y); + fb.put(ends[i].z); + } + posBuf.updateData(fb); + + VertexBuffer normBuf = getBuffer(Type.Normal); + fb = (FloatBuffer) normBuf.getData(); + fb.rewind(); + for (int i = 0; i < ends.length * 3 + 3; i += 3) { + fb.put(start.x); + fb.put(start.y); + fb.put(start.z); + } + normBuf.updateData(fb); + } + +} diff --git a/jme3-core/src/main/java/com/jme3/scene/debug/custom/ArmatureNode.java b/jme3-core/src/main/java/com/jme3/scene/debug/custom/ArmatureNode.java new file mode 100644 index 000000000..038936049 --- /dev/null +++ b/jme3-core/src/main/java/com/jme3/scene/debug/custom/ArmatureNode.java @@ -0,0 +1,332 @@ +package com.jme3.scene.debug.custom; + +/* + * Copyright (c) 2009-2012 jMonkeyEngine + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'jMonkeyEngine' nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +import com.jme3.anim.Armature; +import com.jme3.anim.Joint; +import com.jme3.collision.*; +import com.jme3.math.*; +import com.jme3.renderer.Camera; +import com.jme3.renderer.queue.RenderQueue; +import com.jme3.scene.*; +import com.jme3.scene.shape.Line; + +import java.nio.FloatBuffer; +import java.util.*; + +/** + * The class that displays either wires between the bones' heads if no length + * data is supplied and full bones' shapes otherwise. + */ +public class ArmatureNode extends Node { + + public static final float PIXEL_BOX = 10f; + /** + * The armature to be displayed. + */ + private Armature armature; + /** + * The map between the bone index and its length. + */ + private Map jointToGeoms = new HashMap<>(); + private Map geomToJoint = new HashMap<>(); + private Joint selectedJoint = null; + private Vector3f tmp = new Vector3f(); + private Vector2f tmpv2 = new Vector2f(); + private final static ColorRGBA selectedColor = ColorRGBA.Orange; + private final static ColorRGBA selectedColorJ = ColorRGBA.Yellow; + private final static ColorRGBA outlineColor = ColorRGBA.LightGray; + private final static ColorRGBA baseColor = new ColorRGBA(0.05f, 0.05f, 0.05f, 1f); + + private Camera camera; + + + /** + * Creates a wire with bone lengths data. If the data is supplied then the + * wires will show each full bone (from head to tail). + * + * @param armature the armature that will be shown + */ + public ArmatureNode(Armature armature, Node joints, Node wires, Node outlines, List deformingJoints) { + this.armature = armature; + + Geometry origin = new Geometry("Armature Origin", new JointShape()); + setColor(origin, ColorRGBA.Green); + attach(joints, true, origin); + + for (Joint joint : armature.getRoots()) { + createSkeletonGeoms(joint, joints, wires, outlines, deformingJoints); + } + this.updateModelBound(); + + } + + protected final void createSkeletonGeoms(Joint joint, Node joints, Node wires, Node outlines, List deformingJoints) { + Vector3f start = joint.getModelTransform().getTranslation().clone(); + + Vector3f[] ends = null; + if (!joint.getChildren().isEmpty()) { + ends = new Vector3f[joint.getChildren().size()]; + } + + for (int i = 0; i < joint.getChildren().size(); i++) { + ends[i] = joint.getChildren().get(i).getModelTransform().getTranslation().clone(); + } + + boolean deforms = deformingJoints.contains(joint); + + Geometry jGeom = new Geometry(joint.getName() + "Joint", new JointShape()); + jGeom.setLocalTranslation(start); + attach(joints, deforms, jGeom); + Geometry bGeom = null; + Geometry bGeomO = null; + if (ends == null) { + geomToJoint.put(jGeom, joint); + } else { + Mesh m = null; + Mesh mO = null; + Node wireAttach = wires; + Node outlinesAttach = outlines; + if (ends.length == 1) { + m = new Line(start, ends[0]); + mO = new Line(start, ends[0]); + } else { + m = new ArmatureInterJointsWire(start, ends); + mO = new ArmatureInterJointsWire(start, ends); + wireAttach = (Node) wires.getChild(1); + outlinesAttach = null; + } + bGeom = new Geometry(joint.getName() + "Bone", m); + setColor(bGeom, outlinesAttach == null ? outlineColor : baseColor); + geomToJoint.put(bGeom, joint); + bGeom.setUserData("start", getWorldTransform().transformVector(start, start)); + for (int i = 0; i < ends.length; i++) { + getWorldTransform().transformVector(ends[i], ends[i]); + } + bGeom.setUserData("end", ends); + bGeom.setQueueBucket(RenderQueue.Bucket.Transparent); + attach(wireAttach, deforms, bGeom); + if (outlinesAttach != null) { + bGeomO = new Geometry(joint.getName() + "BoneOutline", mO); + setColor(bGeomO, outlineColor); + attach(outlinesAttach, deforms, bGeomO); + } + } + jointToGeoms.put(joint, new Geometry[]{jGeom, bGeom, bGeomO}); + + for (Joint child : joint.getChildren()) { + createSkeletonGeoms(child, joints, wires, outlines, deformingJoints); + } + } + + public void setCamera(Camera camera) { + this.camera = camera; + } + + private void attach(Node parent, boolean deforms, Geometry geom) { + if (deforms) { + parent.attachChild(geom); + } else { + ((Node) parent.getChild(0)).attachChild(geom); + } + } + + protected Joint select(Geometry g) { + if (g == null) { + resetSelection(); + return null; + } + Joint j = geomToJoint.get(g); + if (j != null) { + if (selectedJoint == j) { + return null; + } + resetSelection(); + selectedJoint = j; + Geometry[] geomArray = jointToGeoms.get(selectedJoint); + setColor(geomArray[0], selectedColorJ); + + if (geomArray[1] != null) { + setColor(geomArray[1], selectedColor); + } + + if (geomArray[2] != null) { + setColor(geomArray[2], baseColor); + } + return j; + } + return null; + } + + private void resetSelection() { + if (selectedJoint == null) { + return; + } + Geometry[] geoms = jointToGeoms.get(selectedJoint); + setColor(geoms[0], ColorRGBA.White); + if (geoms[1] != null) { + setColor(geoms[1], geoms[2] == null ? outlineColor : baseColor); + } + if (geoms[2] != null) { + setColor(geoms[2], outlineColor); + } + selectedJoint = null; + } + + protected Joint getSelectedJoint() { + return selectedJoint; + } + + + protected final void updateSkeletonGeoms(Joint joint) { + Geometry[] geoms = jointToGeoms.get(joint); + if (geoms != null) { + Geometry jGeom = geoms[0]; + jGeom.setLocalTranslation(joint.getModelTransform().getTranslation()); + Geometry bGeom = geoms[1]; + if (bGeom != null) { + Vector3f start = bGeom.getUserData("start"); + Vector3f[] ends = bGeom.getUserData("end"); + start.set(joint.getModelTransform().getTranslation()); + if (ends != null) { + for (int i = 0; i < joint.getChildren().size(); i++) { + ends[i].set(joint.getChildren().get(i).getModelTransform().getTranslation()); + } + updateBoneMesh(bGeom, start, ends); + Geometry bGeomO = geoms[2]; + if (bGeomO != null) { + updateBoneMesh(bGeomO, start, ends); + } + bGeom.setUserData("start", getWorldTransform().transformVector(start, start)); + for (int i = 0; i < ends.length; i++) { + getWorldTransform().transformVector(ends[i], ends[i]); + } + bGeom.setUserData("end", ends); + + } + } + } + + for (Joint child : joint.getChildren()) { + updateSkeletonGeoms(child); + } + } + + public int pick(Vector2f cursor, CollisionResults results) { + + for (Geometry g : geomToJoint.keySet()) { + if (g.getMesh() instanceof JointShape) { + camera.getScreenCoordinates(g.getWorldTranslation(), tmp); + if (cursor.x <= tmp.x + PIXEL_BOX && cursor.x >= tmp.x - PIXEL_BOX + && cursor.y <= tmp.y + PIXEL_BOX && cursor.y >= tmp.y - PIXEL_BOX) { + CollisionResult res = new CollisionResult(); + res.setGeometry(g); + results.addCollision(res); + } + } + } + return 0; + } + + @Override + public int collideWith(Collidable other, CollisionResults results) { + if (!(other instanceof Ray)) { + return 0; + } + + // first try a 2D pick; + camera.getScreenCoordinates(((Ray)other).getOrigin(),tmp); + tmpv2.x = tmp.x; + tmpv2.y = tmp.y; + int nbHit = pick(tmpv2, results); + if (nbHit > 0) { + return nbHit; + } + + for (Geometry g : geomToJoint.keySet()) { + if (g.getMesh() instanceof JointShape) { + continue; + } + Vector3f start = g.getUserData("start"); + Vector3f[] ends = g.getUserData("end"); + for (int i = 0; i < ends.length; i++) { + float len = MathUtils.raySegmentShortestDistance((Ray) other, start, ends[i], camera); + if (len > 0 && len < PIXEL_BOX) { + CollisionResult res = new CollisionResult(); + res.setGeometry(g); + results.addCollision(res); + nbHit++; + } + } + } + return nbHit; + } + + private void updateBoneMesh(Geometry geom, Vector3f start, Vector3f[] ends) { + if (geom.getMesh() instanceof ArmatureInterJointsWire) { + ((ArmatureInterJointsWire) geom.getMesh()).updatePoints(start, ends); + } else if (geom.getMesh() instanceof Line) { + ((Line) geom.getMesh()).updatePoints(start, ends[0]); + } + geom.updateModelBound(); + } + + private void setColor(Geometry g, ColorRGBA color) { + float[] colors = new float[g.getMesh().getVertexCount() * 4]; + for (int i = 0; i < g.getMesh().getVertexCount() * 4; i += 4) { + colors[i] = color.r; + colors[i + 1] = color.g; + colors[i + 2] = color.b; + colors[i + 3] = color.a; + } + VertexBuffer colorBuff = g.getMesh().getBuffer(VertexBuffer.Type.Color); + if (colorBuff == null) { + g.getMesh().setBuffer(VertexBuffer.Type.Color, 4, colors); + } else { + FloatBuffer cBuff = (FloatBuffer) colorBuff.getData(); + cBuff.rewind(); + cBuff.put(colors); + colorBuff.updateData(cBuff); + } + } + + /** + * The method updates the geometry according to the positions of the bones. + */ + public void updateGeometry() { + armature.update(); + for (Joint joint : armature.getRoots()) { + updateSkeletonGeoms(joint); + } + } +} diff --git a/jme3-core/src/main/java/com/jme3/scene/debug/custom/BoneShape.java b/jme3-core/src/main/java/com/jme3/scene/debug/custom/BoneShape.java deleted file mode 100644 index 7a0a0300a..000000000 --- a/jme3-core/src/main/java/com/jme3/scene/debug/custom/BoneShape.java +++ /dev/null @@ -1,417 +0,0 @@ -/* - * Copyright (c) 2009-2012 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -// $Id: Cylinder.java 4131 2009-03-19 20:15:28Z blaine.dev $ -package com.jme3.scene.debug.custom; - -import com.jme3.export.InputCapsule; -import com.jme3.export.JmeExporter; -import com.jme3.export.JmeImporter; -import com.jme3.export.OutputCapsule; -import com.jme3.math.FastMath; -import com.jme3.math.Vector3f; -import com.jme3.scene.Mesh; -import com.jme3.scene.VertexBuffer.Type; -import com.jme3.scene.mesh.IndexBuffer; -import com.jme3.util.BufferUtils; - -import static com.jme3.util.BufferUtils.*; - -import java.io.IOException; -import java.nio.FloatBuffer; - -/** - * A simple cylinder, defined by it's height and radius. - * (Ported to jME3) - * - * @author Mark Powell - * @version $Revision: 4131 $, $Date: 2009-03-19 16:15:28 -0400 (Thu, 19 Mar 2009) $ - */ -public class BoneShape extends Mesh { - - private int axisSamples; - - private int radialSamples; - - private float radius; - private float radius2; - - private float height; - private boolean closed; - private boolean inverted; - - /** - * Default constructor for serialization only. Do not use. - */ - public BoneShape() { - } - - /** - * Creates a new Cylinder. By default its center is the origin. Usually, a - * higher sample number creates a better looking cylinder, but at the cost - * of more vertex information. - * - * @param axisSamples Number of triangle samples along the axis. - * @param radialSamples Number of triangle samples along the radial. - * @param radius The radius of the cylinder. - * @param height The cylinder's height. - */ - public BoneShape(int axisSamples, int radialSamples, - float radius, float height) { - this(axisSamples, radialSamples, radius, height, false); - } - - /** - * Creates a new Cylinder. By default its center is the origin. Usually, a - * higher sample number creates a better looking cylinder, but at the cost - * of more vertex information.
    - * If the cylinder is closed the texture is split into axisSamples parts: - * top most and bottom most part is used for top and bottom of the cylinder, - * rest of the texture for the cylinder wall. The middle of the top is - * mapped to texture coordinates (0.5, 1), bottom to (0.5, 0). Thus you need - * a suited distorted texture. - * - * @param axisSamples Number of triangle samples along the axis. - * @param radialSamples Number of triangle samples along the radial. - * @param radius The radius of the cylinder. - * @param height The cylinder's height. - * @param closed true to create a cylinder with top and bottom surface - */ - public BoneShape(int axisSamples, int radialSamples, - float radius, float height, boolean closed) { - this(axisSamples, radialSamples, radius, height, closed, false); - } - - /** - * Creates a new Cylinder. By default its center is the origin. Usually, a - * higher sample number creates a better looking cylinder, but at the cost - * of more vertex information.
    - * If the cylinder is closed the texture is split into axisSamples parts: - * top most and bottom most part is used for top and bottom of the cylinder, - * rest of the texture for the cylinder wall. The middle of the top is - * mapped to texture coordinates (0.5, 1), bottom to (0.5, 0). Thus you need - * a suited distorted texture. - * - * @param axisSamples Number of triangle samples along the axis. - * @param radialSamples Number of triangle samples along the radial. - * @param radius The radius of the cylinder. - * @param height The cylinder's height. - * @param closed true to create a cylinder with top and bottom surface - * @param inverted true to create a cylinder that is meant to be viewed from the - * interior. - */ - public BoneShape(int axisSamples, int radialSamples, - float radius, float height, boolean closed, boolean inverted) { - this(axisSamples, radialSamples, radius, radius, height, closed, inverted); - } - - public BoneShape(int axisSamples, int radialSamples, - float radius, float radius2, float height, boolean closed, boolean inverted) { - super(); - updateGeometry(axisSamples, radialSamples, radius, radius2, height, closed, inverted); - } - - /** - * @return the number of samples along the cylinder axis - */ - public int getAxisSamples() { - return axisSamples; - } - - /** - * @return Returns the height. - */ - public float getHeight() { - return height; - } - - /** - * @return number of samples around cylinder - */ - public int getRadialSamples() { - return radialSamples; - } - - /** - * @return Returns the radius. - */ - public float getRadius() { - return radius; - } - - public float getRadius2() { - return radius2; - } - - /** - * @return true if end caps are used. - */ - public boolean isClosed() { - return closed; - } - - /** - * @return true if normals and uvs are created for interior use - */ - public boolean isInverted() { - return inverted; - } - - /** - * Rebuilds the cylinder based on a new set of parameters. - * - * @param axisSamples the number of samples along the axis. - * @param radialSamples the number of samples around the radial. - * @param radius the radius of the bottom of the cylinder. - * @param radius2 the radius of the top of the cylinder. - * @param height the cylinder's height. - * @param closed should the cylinder have top and bottom surfaces. - * @param inverted is the cylinder is meant to be viewed from the inside. - */ - public void updateGeometry(int axisSamples, int radialSamples, - float radius, float radius2, float height, boolean closed, boolean inverted) { - this.axisSamples = axisSamples + (closed ? 2 : 0); - this.radialSamples = radialSamples; - this.radius = radius; - this.radius2 = radius2; - this.height = height; - this.closed = closed; - this.inverted = inverted; - -// VertexBuffer pvb = getBuffer(Type.Position); -// VertexBuffer nvb = getBuffer(Type.Normal); -// VertexBuffer tvb = getBuffer(Type.TexCoord); - - // Vertices - int vertCount = axisSamples * (radialSamples + 1) + (closed ? 2 : 0); - - setBuffer(Type.Position, 3, createVector3Buffer(getFloatBuffer(Type.Position), vertCount)); - - // Normals - setBuffer(Type.Normal, 3, createVector3Buffer(getFloatBuffer(Type.Normal), vertCount)); - - // Texture co-ordinates - setBuffer(Type.TexCoord, 2, createVector2Buffer(vertCount)); - - int triCount = ((closed ? 2 : 0) + 2 * (axisSamples - 1)) * radialSamples; - - setBuffer(Type.Index, 3, createShortBuffer(getShortBuffer(Type.Index), 3 * triCount)); - - //Color - setBuffer(Type.Color, 4, createFloatBuffer(vertCount * 4)); - - // generate geometry - float inverseRadial = 1.0f / radialSamples; - float inverseAxisLess = 1.0f / (closed ? axisSamples - 3 : axisSamples - 1); - float inverseAxisLessTexture = 1.0f / (axisSamples - 1); - float halfHeight = 0.5f * height; - - // Generate points on the unit circle to be used in computing the mesh - // points on a cylinder slice. - float[] sin = new float[radialSamples + 1]; - float[] cos = new float[radialSamples + 1]; - - for (int radialCount = 0; radialCount < radialSamples; radialCount++) { - float angle = FastMath.TWO_PI * inverseRadial * radialCount; - cos[radialCount] = FastMath.cos(angle); - sin[radialCount] = FastMath.sin(angle); - } - sin[radialSamples] = sin[0]; - cos[radialSamples] = cos[0]; - - // calculate normals - Vector3f[] vNormals = null; - Vector3f vNormal = Vector3f.UNIT_Z; - - if ((height != 0.0f) && (radius != radius2)) { - vNormals = new Vector3f[radialSamples]; - Vector3f vHeight = Vector3f.UNIT_Z.mult(height); - Vector3f vRadial = new Vector3f(); - - for (int radialCount = 0; radialCount < radialSamples; radialCount++) { - vRadial.set(cos[radialCount], sin[radialCount], 0.0f); - Vector3f vRadius = vRadial.mult(radius); - Vector3f vRadius2 = vRadial.mult(radius2); - Vector3f vMantle = vHeight.subtract(vRadius2.subtract(vRadius)); - Vector3f vTangent = vRadial.cross(Vector3f.UNIT_Z); - vNormals[radialCount] = vMantle.cross(vTangent).normalize(); - } - } - - FloatBuffer nb = getFloatBuffer(Type.Normal); - FloatBuffer pb = getFloatBuffer(Type.Position); - FloatBuffer tb = getFloatBuffer(Type.TexCoord); - FloatBuffer cb = getFloatBuffer(Type.Color); - - cb.rewind(); - for (int i = 0; i < vertCount; i++) { - cb.put(0.05f).put(0.05f).put(0.05f).put(1f); - } - - // generate the cylinder itself - Vector3f tempNormal = new Vector3f(); - for (int axisCount = 0, i = 0; axisCount < axisSamples; axisCount++, i++) { - float axisFraction; - float axisFractionTexture; - int topBottom = 0; - if (!closed) { - axisFraction = axisCount * inverseAxisLess; // in [0,1] - axisFractionTexture = axisFraction; - } else { - if (axisCount == 0) { - topBottom = -1; // bottom - axisFraction = 0; - axisFractionTexture = inverseAxisLessTexture; - } else if (axisCount == axisSamples - 1) { - topBottom = 1; // top - axisFraction = 1; - axisFractionTexture = 1 - inverseAxisLessTexture; - } else { - axisFraction = (axisCount - 1) * inverseAxisLess; - axisFractionTexture = axisCount * inverseAxisLessTexture; - } - } - - // compute center of slice - float z = height * axisFraction; - Vector3f sliceCenter = new Vector3f(0, 0, z); - - // compute slice vertices with duplication at end point - int save = i; - for (int radialCount = 0; radialCount < radialSamples; radialCount++, i++) { - float radialFraction = radialCount * inverseRadial; // in [0,1) - tempNormal.set(cos[radialCount], sin[radialCount], 0.0f); - - if (vNormals != null) { - vNormal = vNormals[radialCount]; - } else if (radius == radius2) { - vNormal = tempNormal; - } - - if (topBottom == 0) { - if (!inverted) - nb.put(vNormal.x).put(vNormal.y).put(vNormal.z); - else - nb.put(-vNormal.x).put(-vNormal.y).put(-vNormal.z); - } else { - nb.put(0).put(0).put(topBottom * (inverted ? -1 : 1)); - } - - tempNormal.multLocal((radius - radius2) * axisFraction + radius2) - .addLocal(sliceCenter); - pb.put(tempNormal.x).put(tempNormal.y).put(tempNormal.z); - - tb.put((inverted ? 1 - radialFraction : radialFraction)) - .put(axisFractionTexture); - } - - BufferUtils.copyInternalVector3(pb, save, i); - BufferUtils.copyInternalVector3(nb, save, i); - - tb.put((inverted ? 0.0f : 1.0f)) - .put(axisFractionTexture); - } - - if (closed) { - pb.put(0).put(0).put(-halfHeight); // bottom center - nb.put(0).put(0).put(-1 * (inverted ? -1 : 1)); - tb.put(0.5f).put(0); - pb.put(0).put(0).put(halfHeight); // top center - nb.put(0).put(0).put(1 * (inverted ? -1 : 1)); - tb.put(0.5f).put(1); - } - - IndexBuffer ib = getIndexBuffer(); - int index = 0; - // Connectivity - for (int axisCount = 0, axisStart = 0; axisCount < axisSamples - 1; axisCount++) { - int i0 = axisStart; - int i1 = i0 + 1; - axisStart += radialSamples + 1; - int i2 = axisStart; - int i3 = i2 + 1; - for (int i = 0; i < radialSamples; i++) { - if (closed && axisCount == 0) { - if (!inverted) { - ib.put(index++, i0++); - ib.put(index++, vertCount - 2); - ib.put(index++, i1++); - } else { - ib.put(index++, i0++); - ib.put(index++, i1++); - ib.put(index++, vertCount - 2); - } - } else if (closed && axisCount == axisSamples - 2) { - ib.put(index++, i2++); - ib.put(index++, inverted ? vertCount - 1 : i3++); - ib.put(index++, inverted ? i3++ : vertCount - 1); - } else { - ib.put(index++, i0++); - ib.put(index++, inverted ? i2 : i1); - ib.put(index++, inverted ? i1 : i2); - ib.put(index++, i1++); - ib.put(index++, inverted ? i2++ : i3++); - ib.put(index++, inverted ? i3++ : i2++); - } - } - } - - updateBound(); - } - - @Override - public void read(JmeImporter e) throws IOException { - super.read(e); - InputCapsule capsule = e.getCapsule(this); - axisSamples = capsule.readInt("axisSamples", 0); - radialSamples = capsule.readInt("radialSamples", 0); - radius = capsule.readFloat("radius", 0); - radius2 = capsule.readFloat("radius2", 0); - height = capsule.readFloat("height", 0); - closed = capsule.readBoolean("closed", false); - inverted = capsule.readBoolean("inverted", false); - } - - @Override - public void write(JmeExporter e) throws IOException { - super.write(e); - OutputCapsule capsule = e.getCapsule(this); - capsule.write(axisSamples, "axisSamples", 0); - capsule.write(radialSamples, "radialSamples", 0); - capsule.write(radius, "radius", 0); - capsule.write(radius2, "radius2", 0); - capsule.write(height, "height", 0); - capsule.write(closed, "closed", false); - capsule.write(inverted, "inverted", false); - } - - -} diff --git a/jme3-core/src/main/java/com/jme3/scene/debug/custom/JointShape.java b/jme3-core/src/main/java/com/jme3/scene/debug/custom/JointShape.java new file mode 100644 index 000000000..b854095b9 --- /dev/null +++ b/jme3-core/src/main/java/com/jme3/scene/debug/custom/JointShape.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2009-2010 jMonkeyEngine + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'jMonkeyEngine' nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package com.jme3.scene.debug.custom; + +import com.jme3.scene.Mesh; +import com.jme3.scene.VertexBuffer.Type; + + +public class JointShape extends Mesh { + + + /** + * Serialization only. Do not use. + */ + public JointShape() { + float width = 1; + float height = 1; + setBuffer(Type.Position, 3, new float[]{-width * 0.5f, -width * 0.5f, 0, + width * 0.5f, -width * 0.5f, 0, + width * 0.5f, height * 0.5f, 0, + -width * 0.5f, height * 0.5f, 0 + }); + + + setBuffer(Type.TexCoord, 2, new float[]{0, 0, + 1, 0, + 1, 1, + 0, 1}); + + setBuffer(Type.Normal, 3, new float[]{0, 0, 1, + 0, 0, 1, + 0, 0, 1, + 0, 0, 1}); + + setBuffer(Type.Color, 4, new float[]{1, 1, 1, 1, + 1, 1, 1, 1, + 1, 1, 1, 1, + 1, 1, 1, 1}); + + setBuffer(Type.Index, 3, new short[]{0, 1, 2, + 0, 2, 3}); + + + updateBound(); + setStatic(); + } + + +} diff --git a/jme3-core/src/main/java/com/jme3/scene/debug/custom/SkeletonBone.java b/jme3-core/src/main/java/com/jme3/scene/debug/custom/SkeletonBone.java deleted file mode 100644 index b4f21ec54..000000000 --- a/jme3-core/src/main/java/com/jme3/scene/debug/custom/SkeletonBone.java +++ /dev/null @@ -1,238 +0,0 @@ -package com.jme3.scene.debug.custom; - -/* - * Copyright (c) 2009-2012 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -import java.util.Map; - -import com.jme3.animation.Bone; -import com.jme3.animation.Skeleton; -import com.jme3.bounding.*; -import com.jme3.math.FastMath; -import com.jme3.math.Quaternion; -import com.jme3.math.Vector3f; -import com.jme3.scene.Geometry; -import com.jme3.scene.Mesh; -import com.jme3.scene.Node; -import com.jme3.scene.VertexBuffer; -import com.jme3.scene.shape.Sphere; - -import static com.jme3.util.BufferUtils.createFloatBuffer; - -import java.nio.FloatBuffer; -import java.util.HashMap; - -/** - * The class that displays either wires between the bones' heads if no length - * data is supplied and full bones' shapes otherwise. - */ -public class SkeletonBone extends Node { - - /** - * The skeleton to be displayed. - */ - private Skeleton skeleton; - /** - * The map between the bone index and its length. - */ - private Map boneNodes = new HashMap(); - private Map nodeBones = new HashMap(); - private Node selectedNode = null; - private boolean guessBonesOrientation = false; - - /** - * Creates a wire with bone lengths data. If the data is supplied then the - * wires will show each full bone (from head to tail). - * - * @param skeleton the skeleton that will be shown - * @param boneLengths a map between the bone's index and the bone's length - */ - public SkeletonBone(Skeleton skeleton, Map boneLengths, boolean guessBonesOrientation) { - this.skeleton = skeleton; - this.skeleton.reset(); - this.skeleton.updateWorldVectors(); - this.guessBonesOrientation = guessBonesOrientation; - - BoneShape boneShape = new BoneShape(5, 12, 0.02f, 0.07f, 1f, false, false); - Sphere jointShape = new Sphere(10, 10, 0.1f); - jointShape.setBuffer(VertexBuffer.Type.Color, 4, createFloatBuffer(jointShape.getVertexCount() * 4)); - FloatBuffer cb = jointShape.getFloatBuffer(VertexBuffer.Type.Color); - - cb.rewind(); - for (int i = 0; i < jointShape.getVertexCount(); i++) { - cb.put(0.05f).put(0.05f).put(0.05f).put(1f); - } - - for (Bone bone : skeleton.getRoots()) { - createSkeletonGeoms(bone, boneShape, jointShape, boneLengths, skeleton, this, guessBonesOrientation); - } - this.updateModelBound(); - - - Sphere originShape = new Sphere(10, 10, 0.02f); - originShape.setBuffer(VertexBuffer.Type.Color, 4, createFloatBuffer(originShape.getVertexCount() * 4)); - cb = originShape.getFloatBuffer(VertexBuffer.Type.Color); - cb.rewind(); - for (int i = 0; i < jointShape.getVertexCount(); i++) { - cb.put(0.4f).put(0.4f).put(0.05f).put(1f); - } - - Geometry origin = new Geometry("origin", originShape); - BoundingVolume bv = this.getWorldBound(); - float scale = 1; - if (bv.getType() == BoundingVolume.Type.AABB) { - BoundingBox bb = (BoundingBox) bv; - scale = (bb.getXExtent() + bb.getYExtent() + bb.getZExtent()) / 3f; - } else if (bv.getType() == BoundingVolume.Type.Sphere) { - BoundingSphere bs = (BoundingSphere) bv; - scale = bs.getRadius(); - } - origin.scale(scale); - attachChild(origin); - - - - } - - protected final void createSkeletonGeoms(Bone bone, Mesh boneShape, Mesh jointShape, Map boneLengths, Skeleton skeleton, Node parent, boolean guessBonesOrientation) { - - if (guessBonesOrientation && bone.getName().equalsIgnoreCase("Site")) { - //BVH skeleton have a useless end point bone named Site - return; - } - Node n = new Node(bone.getName() + "Node"); - Geometry bGeom = new Geometry(bone.getName(), boneShape); - Geometry jGeom = new Geometry(bone.getName() + "Joint", jointShape); - n.setLocalTranslation(bone.getLocalPosition()); - n.setLocalRotation(bone.getLocalRotation()); - - float boneLength = boneLengths.get(skeleton.getBoneIndex(bone)); - n.setLocalScale(bone.getLocalScale()); - - bGeom.setLocalRotation(new Quaternion().fromAngleAxis(-FastMath.HALF_PI, Vector3f.UNIT_X).normalizeLocal()); - - if (guessBonesOrientation) { - //One child only, the bone direction is from the parent joint to the child joint. - if (bone.getChildren().size() == 1) { - Vector3f v = bone.getChildren().get(0).getLocalPosition(); - Quaternion q = new Quaternion(); - q.lookAt(v, Vector3f.UNIT_Z); - bGeom.setLocalRotation(q); - boneLength = v.length(); - } - //no child, the bone has the same direction as the parent bone. - if (bone.getChildren().isEmpty()) { - if (parent.getChildren().size() > 0) { - bGeom.setLocalRotation(parent.getChild(0).getLocalRotation()); - } else { - //no parent, let's use the bind orientation of the bone - bGeom.setLocalRotation(bone.getBindRotation()); - } - } - } - bGeom.setLocalScale(boneLength); - jGeom.setLocalScale(boneLength); - - n.attachChild(bGeom); - n.attachChild(jGeom); - - //tip - if (bone.getChildren().size() != 1) { - Geometry gt = jGeom.clone(); - gt.scale(0.8f); - Vector3f v = new Vector3f(0, boneLength, 0); - if (guessBonesOrientation) { - if (bone.getChildren().isEmpty()) { - if (parent.getChildren().size() > 0) { - gt.setLocalTranslation(bGeom.getLocalRotation().mult(parent.getChild(0).getLocalRotation()).mult(v, v)); - } else { - gt.setLocalTranslation(bGeom.getLocalRotation().mult(bone.getBindRotation()).mult(v, v)); - } - } - } else { - gt.setLocalTranslation(v); - } - - n.attachChild(gt); - } - - - boneNodes.put(bone, n); - nodeBones.put(n, bone); - parent.attachChild(n); - for (Bone childBone : bone.getChildren()) { - createSkeletonGeoms(childBone, boneShape, jointShape, boneLengths, skeleton, n, guessBonesOrientation); - } - } - - protected Bone select(Geometry g) { - Node parentNode = g.getParent(); - - if (parent != null) { - Bone b = nodeBones.get(parentNode); - if (b != null) { - selectedNode = parentNode; - } - return b; - } - return null; - } - - protected Node getSelectedNode() { - return selectedNode; - } - - - protected final void updateSkeletonGeoms(Bone bone) { - if (guessBonesOrientation && bone.getName().equalsIgnoreCase("Site")) { - return; - } - Node n = boneNodes.get(bone); - n.setLocalTranslation(bone.getLocalPosition()); - n.setLocalRotation(bone.getLocalRotation()); - n.setLocalScale(bone.getLocalScale()); - - for (Bone childBone : bone.getChildren()) { - updateSkeletonGeoms(childBone); - } - } - - /** - * The method updates the geometry according to the positions of the bones. - */ - public void updateGeometry() { - - for (Bone bone : skeleton.getRoots()) { - updateSkeletonGeoms(bone); - } - } -} diff --git a/jme3-core/src/main/java/com/jme3/scene/debug/custom/SkeletonDebugAppState.java b/jme3-core/src/main/java/com/jme3/scene/debug/custom/SkeletonDebugAppState.java deleted file mode 100644 index 43778f5ce..000000000 --- a/jme3-core/src/main/java/com/jme3/scene/debug/custom/SkeletonDebugAppState.java +++ /dev/null @@ -1,156 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package com.jme3.scene.debug.custom; - -import com.jme3.animation.Bone; -import com.jme3.animation.Skeleton; -import com.jme3.animation.SkeletonControl; -import com.jme3.app.Application; -import com.jme3.app.state.AbstractAppState; -import com.jme3.app.state.AppStateManager; -import com.jme3.collision.CollisionResults; -import com.jme3.input.MouseInput; -import com.jme3.input.controls.ActionListener; -import com.jme3.input.controls.MouseButtonTrigger; -import com.jme3.math.Ray; -import com.jme3.math.Vector2f; -import com.jme3.math.Vector3f; -import com.jme3.renderer.ViewPort; -import com.jme3.scene.Geometry; -import com.jme3.scene.Node; -import com.jme3.scene.Spatial; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @author Nehon - */ -public class SkeletonDebugAppState extends AbstractAppState { - - private Node debugNode = new Node("debugNode"); - private Map skeletons = new HashMap(); - private Map selectedBones = new HashMap(); - private Application app; - - @Override - public void initialize(AppStateManager stateManager, Application app) { - ViewPort vp = app.getRenderManager().createMainView("debug", app.getCamera()); - vp.attachScene(debugNode); - vp.setClearDepth(true); - this.app = app; - for (SkeletonDebugger skeletonDebugger : skeletons.values()) { - skeletonDebugger.initialize(app.getAssetManager()); - } - app.getInputManager().addListener(actionListener, "shoot"); - app.getInputManager().addMapping("shoot", new MouseButtonTrigger(MouseInput.BUTTON_LEFT), new MouseButtonTrigger(MouseInput.BUTTON_RIGHT)); - super.initialize(stateManager, app); - } - - @Override - public void update(float tpf) { - debugNode.updateLogicalState(tpf); - debugNode.updateGeometricState(); - } - - public SkeletonDebugger addSkeleton(SkeletonControl skeletonControl, boolean guessBonesOrientation) { - Skeleton skeleton = skeletonControl.getSkeleton(); - Spatial forSpatial = skeletonControl.getSpatial(); - return addSkeleton(skeleton, forSpatial, guessBonesOrientation); - } - - public SkeletonDebugger addSkeleton(Skeleton skeleton, Spatial forSpatial, boolean guessBonesOrientation) { - - SkeletonDebugger sd = new SkeletonDebugger(forSpatial.getName() + "_Skeleton", skeleton, guessBonesOrientation); - sd.setLocalTransform(forSpatial.getWorldTransform()); - if (forSpatial instanceof Node) { - List geoms = new ArrayList<>(); - findGeoms((Node) forSpatial, geoms); - if (geoms.size() == 1) { - sd.setLocalTransform(geoms.get(0).getWorldTransform()); - } - } - skeletons.put(skeleton, sd); - debugNode.attachChild(sd); - if (isInitialized()) { - sd.initialize(app.getAssetManager()); - } - return sd; - } - - private void findGeoms(Node node, List geoms) { - for (Spatial spatial : node.getChildren()) { - if (spatial instanceof Geometry) { - geoms.add((Geometry) spatial); - } else if (spatial instanceof Node) { - findGeoms((Node) spatial, geoms); - } - } - } - - /** - * Pick a Target Using the Mouse Pointer.
    1. Map "pick target" action - * to a MouseButtonTrigger.
    2. flyCam.setEnabled(false); - *
    3. inputManager.setCursorVisible(true);
    4. Implement action in - * AnalogListener (TODO).
    - */ - private ActionListener actionListener = new ActionListener() { - public void onAction(String name, boolean isPressed, float tpf) { - if (name.equals("shoot") && isPressed) { - CollisionResults results = new CollisionResults(); - Vector2f click2d = app.getInputManager().getCursorPosition(); - Vector3f click3d = app.getCamera().getWorldCoordinates(new Vector2f(click2d.x, click2d.y), 0f).clone(); - Vector3f dir = app.getCamera().getWorldCoordinates(new Vector2f(click2d.x, click2d.y), 1f).subtractLocal(click3d); - Ray ray = new Ray(click3d, dir); - - debugNode.collideWith(ray, results); - - if (results.size() > 0) { - // The closest result is the target that the player picked: - Geometry target = results.getClosestCollision().getGeometry(); - for (SkeletonDebugger skeleton : skeletons.values()) { - Bone selectedBone = skeleton.select(target); - if (selectedBone != null) { - selectedBones.put(skeleton.getSkeleton(), selectedBone); - System.err.println("-----------------------"); - System.err.println("Selected Bone : " + selectedBone.getName() + " in skeleton " + skeleton.getName()); - System.err.println("Root Bone : " + (selectedBone.getParent() == null)); - System.err.println("-----------------------"); - System.err.println("Bind translation: " + selectedBone.getBindPosition()); - System.err.println("Bind rotation: " + selectedBone.getBindRotation()); - System.err.println("Bind scale: " + selectedBone.getBindScale()); - System.err.println("---"); - System.err.println("Local translation: " + selectedBone.getLocalPosition()); - System.err.println("Local rotation: " + selectedBone.getLocalRotation()); - System.err.println("Local scale: " + selectedBone.getLocalScale()); - System.err.println("---"); - System.err.println("Model translation: " + selectedBone.getModelSpacePosition()); - System.err.println("Model rotation: " + selectedBone.getModelSpaceRotation()); - System.err.println("Model scale: " + selectedBone.getModelSpaceScale()); - System.err.println("---"); - System.err.println("Bind inverse Transform: "); - System.err.println(selectedBone.getBindInverseTransform()); - return; - } - } - } - } - } - }; - - public Map getSelectedBones() { - return selectedBones; - } - - public Node getDebugNode() { - return debugNode; - } - - public void setDebugNode(Node debugNode) { - this.debugNode = debugNode; - } -} diff --git a/jme3-core/src/main/java/com/jme3/scene/debug/custom/SkeletonDebugger.java b/jme3-core/src/main/java/com/jme3/scene/debug/custom/SkeletonDebugger.java deleted file mode 100644 index 1336b9d1b..000000000 --- a/jme3-core/src/main/java/com/jme3/scene/debug/custom/SkeletonDebugger.java +++ /dev/null @@ -1,218 +0,0 @@ -package com.jme3.scene.debug.custom; - -/* - * Copyright (c) 2009-2012 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -import com.jme3.animation.Bone; - -import java.util.Map; - -import com.jme3.animation.Skeleton; -import com.jme3.asset.AssetManager; -import com.jme3.material.Material; -import com.jme3.math.ColorRGBA; -import com.jme3.scene.BatchNode; -import com.jme3.scene.Geometry; -import com.jme3.scene.Node; -import com.jme3.scene.Spatial; -import com.jme3.scene.VertexBuffer; - -import java.nio.FloatBuffer; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -/** - * The class that creates a mesh to display how bones behave. If it is supplied - * with the bones' lengths it will show exactly how the bones look like on the - * scene. If not then only connections between each bone heads will be shown. - */ -public class SkeletonDebugger extends BatchNode { - - /** - * The lines of the bones or the wires between their heads. - */ - private SkeletonBone bones; - - private Skeleton skeleton; - /** - * The dotted lines between a bone's tail and the had of its children. Not - * available if the length data was not provided. - */ - private SkeletonInterBoneWire interBoneWires; - private List selectedBones = new ArrayList(); - - public SkeletonDebugger() { - } - - /** - * Creates a debugger with no length data. The wires will be a connection - * between the bones' heads only. The points will show the bones' heads only - * and no dotted line of inter bones connection will be visible. - * - * @param name the name of the debugger's node - * @param skeleton the skeleton that will be shown - */ - public SkeletonDebugger(String name, Skeleton skeleton, boolean guessBonesOrientation) { - super(name); - this.skeleton = skeleton; - skeleton.reset(); - skeleton.updateWorldVectors(); - Map boneLengths = new HashMap(); - - for (Bone bone : skeleton.getRoots()) { - computeLength(bone, boneLengths, skeleton); - } - - bones = new SkeletonBone(skeleton, boneLengths, guessBonesOrientation); - - this.attachChild(bones); - - interBoneWires = new SkeletonInterBoneWire(skeleton, boneLengths, guessBonesOrientation); - Geometry g = new Geometry(name + "_interwires", interBoneWires); - g.setBatchHint(BatchHint.Never); - this.attachChild(g); - } - - protected void initialize(AssetManager assetManager) { - Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); - mat.setColor("Color", new ColorRGBA(0.05f, 0.05f, 0.05f, 1.0f));//new ColorRGBA(0.1f, 0.1f, 0.1f, 1.0f) - setMaterial(mat); - Material mat2 = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); - mat2.setBoolean("VertexColor", true); - bones.setMaterial(mat2); - batch(); - - } - - @Override - public final void setMaterial(Material material) { - if (batches.isEmpty()) { - for (int i = 0; i < children.size(); i++) { - children.get(i).setMaterial(material); - } - } else { - super.setMaterial(material); - } - } - - public Skeleton getSkeleton() { - return skeleton; - } - - - private void computeLength(Bone b, Map boneLengths, Skeleton skeleton) { - if (b.getChildren().isEmpty()) { - if (b.getParent() != null) { - boneLengths.put(skeleton.getBoneIndex(b), boneLengths.get(skeleton.getBoneIndex(b.getParent())) * 0.75f); - } else { - boneLengths.put(skeleton.getBoneIndex(b), 0.1f); - } - } else { - float length = Float.MAX_VALUE; - for (Bone bone : b.getChildren()) { - float len = b.getModelSpacePosition().subtract(bone.getModelSpacePosition()).length(); - if (len < length) { - length = len; - } - } - boneLengths.put(skeleton.getBoneIndex(b), length); - for (Bone bone : b.getChildren()) { - computeLength(bone, boneLengths, skeleton); - } - } - } - - @Override - public void updateLogicalState(float tpf) { - super.updateLogicalState(tpf); - bones.updateGeometry(); - if (interBoneWires != null) { - interBoneWires.updateGeometry(); - } - } - - ColorRGBA selectedColor = ColorRGBA.Orange; - ColorRGBA baseColor = new ColorRGBA(0.05f, 0.05f, 0.05f, 1f); - - protected Bone select(Geometry g) { - Node oldNode = bones.getSelectedNode(); - Bone b = bones.select(g); - if (b == null) { - return null; - } - if (oldNode != null) { - markSelected(oldNode, false); - } - markSelected(bones.getSelectedNode(), true); - return b; - } - - /** - * @return the skeleton wires - */ - public SkeletonBone getBoneShapes() { - return bones; - } - - /** - * @return the dotted line between bones (can be null) - */ - public SkeletonInterBoneWire getInterBoneWires() { - return interBoneWires; - } - - protected void markSelected(Node n, boolean selected) { - ColorRGBA c = baseColor; - if (selected) { - c = selectedColor; - } - for (Spatial spatial : n.getChildren()) { - if (spatial instanceof Geometry) { - Geometry geom = (Geometry) spatial; - - Geometry batch = (Geometry) getChild(getName() + "-batch0"); - VertexBuffer vb = batch.getMesh().getBuffer(VertexBuffer.Type.Color); - FloatBuffer color = (FloatBuffer) vb.getData(); - // System.err.println(getName() + "." + geom.getName() + " index " + getGeometryStartIndex(geom) * 4 + "/" + color.limit()); - - color.position(getGeometryStartIndex(geom) * 4); - - for (int i = 0; i < geom.getVertexCount(); i++) { - color.put(c.r).put(c.g).put(c.b).put(c.a); - } - color.rewind(); - vb.updateData(color); - } - } - } -} \ No newline at end of file diff --git a/jme3-core/src/main/java/com/jme3/scene/debug/custom/SkeletonInterBoneWire.java b/jme3-core/src/main/java/com/jme3/scene/debug/custom/SkeletonInterBoneWire.java deleted file mode 100644 index 504c81fe2..000000000 --- a/jme3-core/src/main/java/com/jme3/scene/debug/custom/SkeletonInterBoneWire.java +++ /dev/null @@ -1,141 +0,0 @@ -package com.jme3.scene.debug.custom; - -/* - * Copyright (c) 2009-2012 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - - -import java.nio.FloatBuffer; -import java.util.Map; - -import com.jme3.animation.Bone; -import com.jme3.animation.Skeleton; -import com.jme3.math.Vector3f; -import com.jme3.scene.Mesh; -import com.jme3.scene.VertexBuffer; -import com.jme3.scene.VertexBuffer.Format; -import com.jme3.scene.VertexBuffer.Type; -import com.jme3.scene.VertexBuffer.Usage; -import com.jme3.util.BufferUtils; - -/** - * A class that displays a dotted line between a bone tail and its childrens' heads. - * - * @author Marcin Roguski (Kaelthas) - */ -public class SkeletonInterBoneWire extends Mesh { - private static final int POINT_AMOUNT = 10; - /** - * The amount of connections between bones. - */ - private int connectionsAmount; - /** - * The skeleton that will be showed. - */ - private Skeleton skeleton; - /** - * The map between the bone index and its length. - */ - private Map boneLengths; - - private boolean guessBonesOrientation = false; - - /** - * Creates buffers for points. Each line has POINT_AMOUNT of points. - * - * @param skeleton the skeleton that will be showed - * @param boneLengths the lengths of the bones - */ - public SkeletonInterBoneWire(Skeleton skeleton, Map boneLengths, boolean guessBonesOrientation) { - this.skeleton = skeleton; - - for (Bone bone : skeleton.getRoots()) { - this.countConnections(bone); - } - - this.setMode(Mode.Points); - this.setPointSize(2); - this.boneLengths = boneLengths; - - VertexBuffer pb = new VertexBuffer(Type.Position); - FloatBuffer fpb = BufferUtils.createFloatBuffer(POINT_AMOUNT * connectionsAmount * 3); - pb.setupData(Usage.Stream, 3, Format.Float, fpb); - this.setBuffer(pb); - - this.guessBonesOrientation = guessBonesOrientation; - this.updateCounts(); - } - - /** - * The method updates the geometry according to the poitions of the bones. - */ - public void updateGeometry() { - VertexBuffer vb = this.getBuffer(Type.Position); - FloatBuffer posBuf = this.getFloatBuffer(Type.Position); - posBuf.clear(); - for (int i = 0; i < skeleton.getBoneCount(); ++i) { - Bone bone = skeleton.getBone(i); - Vector3f parentTail = bone.getModelSpacePosition().add(bone.getModelSpaceRotation().mult(Vector3f.UNIT_Y.mult(boneLengths.get(i)))); - - if (guessBonesOrientation) { - parentTail = bone.getModelSpacePosition(); - } - - for (Bone child : bone.getChildren()) { - Vector3f childHead = child.getModelSpacePosition(); - Vector3f v = childHead.subtract(parentTail); - float pointDelta = v.length() / POINT_AMOUNT; - v.normalizeLocal().multLocal(pointDelta); - Vector3f pointPosition = parentTail.clone(); - for (int j = 0; j < POINT_AMOUNT; ++j) { - posBuf.put(pointPosition.getX()).put(pointPosition.getY()).put(pointPosition.getZ()); - pointPosition.addLocal(v); - } - } - } - posBuf.flip(); - vb.updateData(posBuf); - - this.updateBound(); - } - - /** - * Th method couns the connections between bones. - * - * @param bone the bone where counting starts - */ - private void countConnections(Bone bone) { - for (Bone child : bone.getChildren()) { - ++connectionsAmount; - this.countConnections(child); - } - } -} diff --git a/jme3-core/src/main/java/com/jme3/scene/instancing/InstancedNode.java b/jme3-core/src/main/java/com/jme3/scene/instancing/InstancedNode.java index 42f8a7615..2ddaa4cc1 100644 --- a/jme3-core/src/main/java/com/jme3/scene/instancing/InstancedNode.java +++ b/jme3-core/src/main/java/com/jme3/scene/instancing/InstancedNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 jMonkeyEngine + * Copyright (c) 2014-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -31,19 +31,15 @@ */ package com.jme3.scene.instancing; +import com.jme3.export.JmeExporter; +import com.jme3.export.JmeImporter; +import com.jme3.material.MatParam; import com.jme3.material.Material; import com.jme3.renderer.RenderManager; import com.jme3.renderer.ViewPort; -import com.jme3.scene.Geometry; -import com.jme3.scene.GeometryGroupNode; -import com.jme3.scene.Mesh; -import com.jme3.scene.Node; -import com.jme3.scene.Spatial; -import com.jme3.scene.UserData; +import com.jme3.renderer.queue.RenderQueue; +import com.jme3.scene.*; import com.jme3.scene.control.Control; -import com.jme3.export.JmeExporter; -import com.jme3.export.JmeImporter; -import com.jme3.material.MatParam; import com.jme3.util.clone.Cloner; import com.jme3.util.clone.JmeCloneable; import java.io.IOException; @@ -135,11 +131,10 @@ public class InstancedNode extends GeometryGroupNode { this.node = node; } + @Deprecated @Override public Control cloneForSpatial(Spatial spatial) { - return this; - // WARNING: Sets wrong control on spatial. Will be - // fixed automatically by InstancedNode.clone() method. + throw new UnsupportedOperationException(); } @Override @@ -217,6 +212,7 @@ public class InstancedNode extends GeometryGroupNode { ig.setMesh(lookUp.mesh); ig.setUserData(UserData.JME_PHYSICSIGNORE, true); ig.setCullHint(CullHint.Never); + ig.setShadowMode(RenderQueue.ShadowMode.Inherit); instancesMap.put(lookUp.clone(), ig); attachChild(ig); } diff --git a/jme3-core/src/main/java/com/jme3/scene/mesh/MorphTarget.java b/jme3-core/src/main/java/com/jme3/scene/mesh/MorphTarget.java new file mode 100644 index 000000000..083d04fb7 --- /dev/null +++ b/jme3-core/src/main/java/com/jme3/scene/mesh/MorphTarget.java @@ -0,0 +1,51 @@ +package com.jme3.scene.mesh; + +import com.jme3.export.*; +import com.jme3.scene.VertexBuffer; + +import java.io.IOException; +import java.nio.Buffer; +import java.nio.FloatBuffer; +import java.util.EnumMap; +import java.util.Map; + +public class MorphTarget implements Savable { + private EnumMap buffers = new EnumMap<>(VertexBuffer.Type.class); + + public void setBuffer(VertexBuffer.Type type, FloatBuffer buffer) { + buffers.put(type, buffer); + } + + public FloatBuffer getBuffer(VertexBuffer.Type type) { + return buffers.get(type); + } + + public EnumMap getBuffers() { + return buffers; + } + + public int getNumBuffers() { + return buffers.size(); + } + + @Override + public void write(JmeExporter ex) throws IOException { + OutputCapsule oc = ex.getCapsule(this); + for (Map.Entry entry : buffers.entrySet()) { + Buffer roData = entry.getValue().asReadOnlyBuffer(); + oc.write((FloatBuffer) roData, entry.getKey().name(),null); + } + } + + @Override + public void read(JmeImporter im) throws IOException { + InputCapsule ic = im.getCapsule(this); + for (VertexBuffer.Type type : VertexBuffer.Type.values()) { + FloatBuffer b = ic.readFloatBuffer(type.name(), null); + if(b!= null){ + setBuffer(type, b); + } + } + + } +} diff --git a/jme3-core/src/main/java/com/jme3/scene/shape/AbstractBox.java b/jme3-core/src/main/java/com/jme3/scene/shape/AbstractBox.java index ab5db2462..1571823a7 100644 --- a/jme3-core/src/main/java/com/jme3/scene/shape/AbstractBox.java +++ b/jme3-core/src/main/java/com/jme3/scene/shape/AbstractBox.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -31,12 +31,10 @@ */ package com.jme3.scene.shape; -import com.jme3.export.InputCapsule; -import com.jme3.export.JmeExporter; -import com.jme3.export.JmeImporter; -import com.jme3.export.OutputCapsule; +import com.jme3.export.*; import com.jme3.math.Vector3f; import com.jme3.scene.Mesh; + import java.io.IOException; /** @@ -88,27 +86,27 @@ public abstract class AbstractBox extends Mesh { /** * Convert the indices into the list of vertices that define the box's geometry. */ - protected abstract void duUpdateGeometryIndices(); + protected abstract void doUpdateGeometryIndices(); /** * Update the normals of each of the box's planes. */ - protected abstract void duUpdateGeometryNormals(); + protected abstract void doUpdateGeometryNormals(); /** * Update the points that define the texture of the box. *

    - * It's a one-to-one ratio, where each plane of the box has it's own copy + * It's a one-to-one ratio, where each plane of the box has its own copy * of the texture. That is, the texture is repeated one time for each face. */ - protected abstract void duUpdateGeometryTextures(); + protected abstract void doUpdateGeometryTextures(); /** * Update the position of the vertices that define the box. *

    * These eight points are determined from the minimum and maximum point. */ - protected abstract void duUpdateGeometryVertices(); + protected abstract void doUpdateGeometryVertices(); /** * Get the center point of this box. @@ -145,10 +143,10 @@ public abstract class AbstractBox extends Mesh { * need to call this method afterwards in order to update the box. */ public final void updateGeometry() { - duUpdateGeometryVertices(); - duUpdateGeometryNormals(); - duUpdateGeometryTextures(); - duUpdateGeometryIndices(); + doUpdateGeometryVertices(); + doUpdateGeometryNormals(); + doUpdateGeometryTextures(); + doUpdateGeometryIndices(); setStatic(); } diff --git a/jme3-core/src/main/java/com/jme3/scene/shape/Box.java b/jme3-core/src/main/java/com/jme3/scene/shape/Box.java index 05f85427c..15b25d24b 100644 --- a/jme3-core/src/main/java/com/jme3/scene/shape/Box.java +++ b/jme3-core/src/main/java/com/jme3/scene/shape/Box.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -35,6 +35,7 @@ package com.jme3.scene.shape; import com.jme3.math.Vector3f; import com.jme3.scene.VertexBuffer.Type; import com.jme3.util.BufferUtils; + import java.nio.FloatBuffer; /** @@ -113,7 +114,7 @@ public class Box extends AbstractBox { * Constructor instantiates a new Box object. *

    * The minimum and maximum point are provided, these two points define the - * shape and size of the box but not it's orientation or position. You should + * shape and size of the box but not its orientation or position. You should * use the {@link com.jme3.scene.Spatial#setLocalTranslation(com.jme3.math.Vector3f) } * and {@link com.jme3.scene.Spatial#setLocalRotation(com.jme3.math.Quaternion) } * methods to define those properties. @@ -136,7 +137,7 @@ public class Box extends AbstractBox { /** * Creates a clone of this box. *

    - * The cloned box will have '_clone' appended to it's name, but all other + * The cloned box will have '_clone' appended to its name, but all other * properties will be the same as this box. */ @Override @@ -144,25 +145,25 @@ public class Box extends AbstractBox { return new Box(center.clone(), xExtent, yExtent, zExtent); } - protected void duUpdateGeometryIndices() { + protected void doUpdateGeometryIndices() { if (getBuffer(Type.Index) == null){ setBuffer(Type.Index, 3, BufferUtils.createShortBuffer(GEOMETRY_INDICES_DATA)); } } - protected void duUpdateGeometryNormals() { + protected void doUpdateGeometryNormals() { if (getBuffer(Type.Normal) == null){ setBuffer(Type.Normal, 3, BufferUtils.createFloatBuffer(GEOMETRY_NORMALS_DATA)); } } - protected void duUpdateGeometryTextures() { + protected void doUpdateGeometryTextures() { if (getBuffer(Type.TexCoord) == null){ setBuffer(Type.TexCoord, 2, BufferUtils.createFloatBuffer(GEOMETRY_TEXTURE_DATA)); } } - protected void duUpdateGeometryVertices() { + protected void doUpdateGeometryVertices() { FloatBuffer fpb = BufferUtils.createVector3Buffer(24); Vector3f[] v = computeVertices(); fpb.put(new float[] { diff --git a/jme3-core/src/main/java/com/jme3/scene/shape/Cylinder.java b/jme3-core/src/main/java/com/jme3/scene/shape/Cylinder.java index 97dd70f30..a3dbadbf9 100644 --- a/jme3-core/src/main/java/com/jme3/scene/shape/Cylinder.java +++ b/jme3-core/src/main/java/com/jme3/scene/shape/Cylinder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -44,7 +44,7 @@ import com.jme3.util.BufferUtils; import java.io.IOException; /** - * A simple cylinder, defined by it's height and radius. + * A simple cylinder, defined by its height and radius. * (Ported to jME3) * * @author Mark Powell diff --git a/jme3-core/src/main/java/com/jme3/scene/shape/Sphere.java b/jme3-core/src/main/java/com/jme3/scene/shape/Sphere.java index 44aa41723..e02e7221b 100644 --- a/jme3-core/src/main/java/com/jme3/scene/shape/Sphere.java +++ b/jme3-core/src/main/java/com/jme3/scene/shape/Sphere.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -47,7 +47,7 @@ import java.nio.FloatBuffer; import java.nio.ShortBuffer; /** - * Sphere represents a 3D object with all points equidistance + * Sphere represents a 3D object with all points equidistant * from a center point. * * @author Joshua Slack @@ -62,7 +62,7 @@ public class Sphere extends Mesh { */ Original, /** - * Wrap texure radially, but spherically project along z-axis + * Wrap texture radially, but spherically project along z-axis */ Projected, /** diff --git a/jme3-core/src/main/java/com/jme3/scene/shape/StripBox.java b/jme3-core/src/main/java/com/jme3/scene/shape/StripBox.java index 312650caa..5ac256e93 100644 --- a/jme3-core/src/main/java/com/jme3/scene/shape/StripBox.java +++ b/jme3-core/src/main/java/com/jme3/scene/shape/StripBox.java @@ -35,6 +35,7 @@ package com.jme3.scene.shape; import com.jme3.math.Vector3f; import com.jme3.scene.VertexBuffer.Type; import com.jme3.util.BufferUtils; + import java.nio.FloatBuffer; /** @@ -138,13 +139,13 @@ public class StripBox extends AbstractBox { return new StripBox(center.clone(), xExtent, yExtent, zExtent); } - protected void duUpdateGeometryIndices() { + protected void doUpdateGeometryIndices() { if (getBuffer(Type.Index) == null){ setBuffer(Type.Index, 3, BufferUtils.createShortBuffer(GEOMETRY_INDICES_DATA)); } } - protected void duUpdateGeometryNormals() { + protected void doUpdateGeometryNormals() { if (getBuffer(Type.Normal) == null){ float[] normals = new float[8 * 3]; @@ -163,13 +164,13 @@ public class StripBox extends AbstractBox { } } - protected void duUpdateGeometryTextures() { + protected void doUpdateGeometryTextures() { if (getBuffer(Type.TexCoord) == null){ setBuffer(Type.TexCoord, 2, BufferUtils.createFloatBuffer(GEOMETRY_TEXTURE_DATA)); } } - protected void duUpdateGeometryVertices() { + protected void doUpdateGeometryVertices() { FloatBuffer fpb = BufferUtils.createVector3Buffer(8 * 3); Vector3f[] v = computeVertices(); fpb.put(new float[] { diff --git a/jme3-core/src/main/java/com/jme3/shader/BufferObject.java b/jme3-core/src/main/java/com/jme3/shader/BufferObject.java new file mode 100644 index 000000000..886f4a1ab --- /dev/null +++ b/jme3-core/src/main/java/com/jme3/shader/BufferObject.java @@ -0,0 +1,828 @@ +package com.jme3.shader; + +import com.jme3.math.*; +import com.jme3.renderer.Caps; +import com.jme3.renderer.Renderer; +import com.jme3.util.BufferUtils; +import com.jme3.util.NativeObject; +import com.jme3.util.SafeArrayList; + +import java.nio.ByteBuffer; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * The base implementation of BO. + * + * @author JavaSaBr + */ +public class BufferObject extends NativeObject { + + private static final Map, VarType> CLASS_TO_VAR_TYPE = new HashMap<>(); + + static { + CLASS_TO_VAR_TYPE.put(Float.class, VarType.Float); + CLASS_TO_VAR_TYPE.put(Integer.class, VarType.Int); + CLASS_TO_VAR_TYPE.put(Boolean.class, VarType.Boolean); + CLASS_TO_VAR_TYPE.put(Vector2f.class, VarType.Vector2); + CLASS_TO_VAR_TYPE.put(Vector3f.class, VarType.Vector3); + CLASS_TO_VAR_TYPE.put(ColorRGBA.class, VarType.Vector4); + CLASS_TO_VAR_TYPE.put(Quaternion.class, VarType.Vector4); + CLASS_TO_VAR_TYPE.put(Vector4f.class, VarType.Vector4); + + CLASS_TO_VAR_TYPE.put(Vector2f[].class, VarType.Vector2Array); + CLASS_TO_VAR_TYPE.put(Vector3f[].class, VarType.Vector3Array); + CLASS_TO_VAR_TYPE.put(Vector4f[].class, VarType.Vector4Array); + CLASS_TO_VAR_TYPE.put(ColorRGBA[].class, VarType.Vector4Array); + CLASS_TO_VAR_TYPE.put(Quaternion[].class, VarType.Vector4Array); + + CLASS_TO_VAR_TYPE.put(Matrix3f.class, VarType.Matrix3); + CLASS_TO_VAR_TYPE.put(Matrix4f.class, VarType.Matrix4); + CLASS_TO_VAR_TYPE.put(Matrix3f[].class, VarType.Matrix3Array); + CLASS_TO_VAR_TYPE.put(Matrix4f[].class, VarType.Matrix4Array); + } + + protected static VarType getVarTypeByValue(final Object value) { + + final VarType varType = CLASS_TO_VAR_TYPE.get(value.getClass()); + if (varType != null) { + return varType; + } else if (value instanceof Collection && ((Collection) value).isEmpty()) { + throw new IllegalArgumentException("Can't calculate a var type for the empty collection value[" + value + "]."); + } else if (value instanceof List) { + return getVarTypeByValue(((List) value).get(0)); + } else if (value instanceof Collection) { + return getVarTypeByValue(((Collection) value).iterator().next()); + } + + throw new IllegalArgumentException("Can't calculate a var type for the value " + value); + } + + public enum Layout { + std140, + /** unsupported yet */ + @Deprecated + std430, + } + + public enum BufferType { + ShaderStorageBufferObject(Caps.ShaderStorageBufferObject), + UniformBufferObject(Caps.UniformBufferObject), + ; + + private final Caps requiredCaps; + + BufferType(final Caps requiredCaps) { + this.requiredCaps = requiredCaps; + } + + /** + * Get the required caps. + * + * @return the required caps. + */ + public Caps getRequiredCaps() { + return requiredCaps; + } + } + + /** + * The fields of this BO. + */ + private final Map fields; + + /** + * The field's array. + */ + private final SafeArrayList fieldArray; + + /** + * The buffer's data layout. + */ + private final Layout layout; + + /** + * The binding number. + */ + private final int binding; + + /** + * The buffer's type. + */ + private BufferType bufferType; + + /** + * The previous data buffer. + */ + private ByteBuffer previousData; + + public BufferObject(final int binding, final Layout layout, final BufferType bufferType) { + this.handleRef = new Object(); + this.bufferType = bufferType; + this.binding = binding; + this.layout = layout; + this.fields = new HashMap<>(); + this.fieldArray = new SafeArrayList<>(BufferObjectField.class); + } + + public BufferObject(final int binding, final Layout layout) { + this(binding, layout, BufferType.UniformBufferObject); + } + + public BufferObject(final int binding, final BufferType bufferType) { + this(binding, Layout.std140, bufferType); + } + + public BufferObject(final BufferType bufferType) { + this(1, Layout.std140, bufferType); + } + + public BufferObject(final Layout layout) { + this(1, layout, BufferType.UniformBufferObject); + } + + public BufferObject(final int binding) { + this(binding, Layout.std140, BufferType.UniformBufferObject); + } + + public BufferObject() { + this(1, Layout.std140, BufferType.UniformBufferObject); + } + + private BufferObject(final Void unused, final int id) { + super(id); + this.fieldArray = null; + this.fields = null; + this.layout = null; + this.binding = 0; + } + + /** + * Declares a filed in this BO. + * + * @param name the field's name. + * @param varType the field's type. + */ + public void declareField(final String name, final VarType varType) { + + if (fields.containsKey(name)) { + throw new IllegalArgumentException("The field " + name + " is already declared."); + } + + final BufferObjectField field = new BufferObjectField(name, varType); + + fields.put(name, field); + fieldArray.add(field); + } + + /** + * Gets the buffer's type. + * + * @return the buffer's type. + */ + public BufferType getBufferType() { + return bufferType; + } + + /** + * Sets the buffer's type. + * + * @param bufferType the buffer's type. + */ + public void setBufferType(final BufferType bufferType) { + + if (getId() != -1) { + throw new IllegalStateException("Can't change buffer's type when this buffer is already initialized."); + } + + this.bufferType = bufferType; + } + + /** + * Sets the value to the filed by the field's name. + * + * @param name the field's name. + * @param value the value. + */ + public void setFieldValue(final String name, final Object value) { + + BufferObjectField field = fields.get(name); + + if (field == null) { + declareField(name, getVarTypeByValue(value)); + field = fields.get(name); + } + + field.setValue(value); + setUpdateNeeded(); + } + + /** + * Gets the current value of the field by the name. + * + * @param name the field name. + * @param the value's type. + * @return the current value. + */ + public T getFieldValue(final String name) { + + final BufferObjectField field = fields.get(name); + if (field == null) { + throw new IllegalArgumentException("Unknown a field with the name " + name); + } + + return (T) field.getValue(); + } + + /** + * Get the binding number. + * + * @return the binding number. + */ + public int getBinding() { + return binding; + } + + @Override + public void resetObject() { + this.id = -1; + setUpdateNeeded(); + } + + /** + * Computes the current binary data of this BO. + * + * @param maxSize the max data size. + * @return the current binary data of this BO. + */ + public ByteBuffer computeData(final int maxSize) { + + int estimateSize = 0; + + for (final BufferObjectField field : fieldArray) { + estimateSize += estimateSize(field); + } + + if(maxSize < estimateSize) { + throw new IllegalStateException("The estimated size(" + estimateSize + ") of this BO is bigger than " + + "maximum available size " + maxSize); + } + + if (previousData != null) { + if (previousData.capacity() < estimateSize) { + BufferUtils.destroyDirectBuffer(previousData); + previousData = null; + } else { + previousData.clear(); + } + } + + final ByteBuffer data = previousData == null ? BufferUtils.createByteBuffer(estimateSize) : previousData; + + for (final BufferObjectField field : fieldArray) { + writeField(field, data); + } + + data.flip(); + + this.previousData = data; + + return data; + } + + /** + * Estimates size of the field. + * + * @param field the field. + * @return the estimated size. + */ + protected int estimateSize(final BufferObjectField field) { + + switch (field.getType()) { + case Float: + case Int: { + if (layout == Layout.std140) { + return 16; + } + return 4; + } + case Boolean: { + if (layout == Layout.std140) { + return 16; + } + return 1; + } + case Vector2: { + return 4 * 2; + } + case Vector3: { + final int multiplier = layout == Layout.std140 ? 4 : 3; + return 4 * multiplier; + } + case Vector4: + return 16; + case IntArray: { + return estimate((int[]) field.getValue()); + } + case FloatArray: { + return estimate((float[]) field.getValue()); + } + case Vector2Array: { + return estimateArray(field.getValue(), 8); + } + case Vector3Array: { + final int multiplier = layout == Layout.std140 ? 16 : 12; + return estimateArray(field.getValue(), multiplier); + } + case Vector4Array: { + return estimateArray(field.getValue(), 16); + } + case Matrix3: { + final int multiplier = layout == Layout.std140 ? 16 : 12; + return 3 * 3 * multiplier; + } + case Matrix4: { + return 4 * 4 * 4; + } + case Matrix3Array: { + int multiplier = layout == Layout.std140 ? 16 : 12; + multiplier = 3 * 3 * multiplier; + return estimateArray(field.getValue(), multiplier); + } + case Matrix4Array: { + final int multiplier = 4 * 4 * 16; + return estimateArray(field.getValue(), multiplier); + } + default: { + throw new IllegalArgumentException("The type of BO field " + field.getType() + " doesn't support."); + } + } + } + + /** + * Estimates bytes count to present the value on GPU. + * + * @param value the value. + * @param multiplier the multiplier. + * @return the estimated bytes cunt. + */ + protected int estimateArray(final Object value, final int multiplier) { + + if (value instanceof Object[]) { + return ((Object[]) value).length * multiplier; + } else if (value instanceof Collection) { + return ((Collection) value).size() * multiplier; + } + + throw new IllegalArgumentException("Unexpected value " + value); + } + + /** + * Estimates bytes count to present the values on GPU. + * + * @param values the values. + * @return the estimated bytes cunt. + */ + protected int estimate(final float[] values) { + return values.length * 4; + } + + /** + * Estimates bytes count to present the values on GPU. + * + * @param values the values. + * @return the estimated bytes cunt. + */ + protected int estimate(final int[] values) { + return values.length * 4; + } + + /** + * Writes the field to the data buffer. + * + * @param field the field. + * @param data the data buffer. + */ + protected void writeField(final BufferObjectField field, final ByteBuffer data) { + + final Object value = field.getValue(); + + switch (field.getType()) { + case Int: { + data.putInt(((Number) value).intValue()); + if (layout == Layout.std140) { + data.putInt(0); + data.putLong(0); + } + break; + } + case Float: { + data.putFloat(((Number) value).floatValue()); + if (layout == Layout.std140) { + data.putInt(0); + data.putLong(0); + } + break; + } + case Boolean: + data.put((byte) (((Boolean) value) ? 1 : 0)); + if (layout == Layout.std140) { + data.putInt(0); + data.putLong(0); + data.putShort((short) 0); + data.put((byte) 0); + } + break; + case Vector2: + write(data, (Vector2f) value); + break; + case Vector3: + write(data, (Vector3f) value); + break; + case Vector4: + writeVec4(data, value); + break; + case IntArray: { + write(data, (int[]) value); + break; + } + case FloatArray: { + write(data, (float[]) value); + break; + } + case Vector2Array: { + writeVec2Array(data, value); + break; + } + case Vector3Array: { + writeVec3Array(data, value); + break; + } + case Vector4Array: { + writeVec4Array(data, value); + break; + } + case Matrix3: { + write(data, (Matrix3f) value); + break; + } + case Matrix4: { + write(data, (Matrix4f) value); + break; + } + case Matrix3Array: { + writeMat3Array(data, value); + break; + } + case Matrix4Array: { + writeMat4Array(data, value); + break; + } + default: { + throw new IllegalArgumentException("The type of BO field " + field.getType() + " doesn't support."); + } + } + } + + /** + * Writes the value to the data buffer. + * + * @param data the data buffer. + * @param value the value. + */ + protected void writeMat3Array(final ByteBuffer data, final Object value) { + + if (value instanceof Matrix3f[]) { + + final Matrix3f[] values = (Matrix3f[]) value; + for (final Matrix3f mat : values) { + write(data, mat); + } + + } else if(value instanceof SafeArrayList) { + + final SafeArrayList values = (SafeArrayList) value; + for (final Matrix3f mat : values.getArray()) { + write(data, mat); + } + + } else if(value instanceof Collection) { + + final Collection values = (Collection) value; + for (final Matrix3f mat : values) { + write(data, mat); + } + } + } + + /** + * Writes the value to the data buffer. + * + * @param data the data buffer. + * @param value the value. + */ + protected void writeMat4Array(final ByteBuffer data, final Object value) { + + if (value instanceof Matrix4f[]) { + + final Matrix4f[] values = (Matrix4f[]) value; + for (final Matrix4f mat : values) { + write(data, mat); + } + + } else if(value instanceof SafeArrayList) { + + final SafeArrayList values = (SafeArrayList) value; + for (final Matrix4f mat : values.getArray()) { + write(data, mat); + } + + } else if(value instanceof Collection) { + + final Collection values = (Collection) value; + for (final Matrix4f mat : values) { + write(data, mat); + } + } + } + + + /** + * Writes the value to the data buffer. + * + * @param data the data buffer. + * @param value the value. + */ + protected void writeVec4Array(final ByteBuffer data, final Object value) { + + if (value instanceof Object[]) { + + final Object[] values = (Object[]) value; + for (final Object vec : values) { + writeVec4(data, vec); + } + + } else if(value instanceof SafeArrayList) { + + final SafeArrayList values = (SafeArrayList) value; + for (final Object vec : values.getArray()) { + writeVec4(data, vec); + } + + } else if(value instanceof Collection) { + + final Collection values = (Collection) value; + for (final Object vec : values) { + writeVec4(data, vec); + } + } + } + + /** + * Writes the value to the data buffer. + * + * @param data the data buffer. + * @param value the value. + */ + protected void writeVec3Array(final ByteBuffer data, final Object value) { + + if (value instanceof Vector3f[]) { + + final Vector3f[] values = (Vector3f[]) value; + for (final Vector3f vec : values) { + write(data, vec); + } + + } else if(value instanceof SafeArrayList) { + + final SafeArrayList values = (SafeArrayList) value; + for (final Vector3f vec : values.getArray()) { + write(data, vec); + } + + } else if(value instanceof Collection) { + + final Collection values = (Collection) value; + for (final Vector3f vec : values) { + write(data, vec); + } + } + } + + /** + * Writes the value to the data buffer. + * + * @param data the data buffer. + * @param value the value. + */ + protected void writeVec2Array(final ByteBuffer data, final Object value) { + + if (value instanceof Vector2f[]) { + + final Vector2f[] values = (Vector2f[]) value; + for (final Vector2f vec : values) { + write(data, vec); + } + + } else if(value instanceof SafeArrayList) { + + final SafeArrayList values = (SafeArrayList) value; + for (final Vector2f vec : values.getArray()) { + write(data, vec); + } + + } else if(value instanceof Collection) { + + final Collection values = (Collection) value; + for (final Vector2f vec : values) { + write(data, vec); + } + } + } + + /** + * Writes the value to the data buffer. + * + * @param data the data buffer. + * @param value the value. + */ + protected void write(final ByteBuffer data, final float[] value) { + for (float val : value) { + data.putFloat(val); + } + } + + /** + * Writes the value to the data buffer. + * + * @param data the data buffer. + * @param value the value. + */ + protected void write(final ByteBuffer data, final int[] value) { + for (int val : value) { + data.putInt(val); + } + } + + /** + * Writes the value to the data buffer. + * + * @param data the data buffer. + * @param value the value. + */ + protected void writeVec4(final ByteBuffer data, final Object value) { + + if (value == null) { + data.putLong(0).putLong(0); + } else if (value instanceof Vector4f) { + + final Vector4f vec4 = (Vector4f) value; + data.putFloat(vec4.getX()) + .putFloat(vec4.getY()) + .putFloat(vec4.getZ()) + .putFloat(vec4.getW()); + + } else if(value instanceof Quaternion) { + + final Quaternion vec4 = (Quaternion) value; + data.putFloat(vec4.getX()) + .putFloat(vec4.getY()) + .putFloat(vec4.getZ()) + .putFloat(vec4.getW()); + + } else if(value instanceof ColorRGBA) { + + final ColorRGBA vec4 = (ColorRGBA) value; + data.putFloat(vec4.getRed()) + .putFloat(vec4.getGreen()) + .putFloat(vec4.getBlue()) + .putFloat(vec4.getAlpha()); + } + } + + /** + * Writes the value to the data buffer. + * + * @param data the data buffer. + * @param value the value. + */ + protected void write(final ByteBuffer data, final Vector3f value) { + + if (value == null) { + data.putLong(0).putInt(0); + } else { + data.putFloat(value.getX()) + .putFloat(value.getY()) + .putFloat(value.getZ()); + } + + if (layout == Layout.std140) { + data.putInt(0); + } + } + + /** + * Writes the value to the data buffer. + * + * @param data the data buffer. + * @param x the x value. + * @param y the y value. + * @param z the z value. + */ + protected void write(final ByteBuffer data, final float x, final float y, final float z) { + + data.putFloat(x) + .putFloat(y) + .putFloat(z); + + if (layout == Layout.std140) { + data.putInt(0); + } + } + + /** + * Writes the value to the data buffer. + * + * @param data the data buffer. + * @param x the x value. + * @param y the y value. + * @param z the z value. + * @param w the w value. + */ + protected void write(final ByteBuffer data, final float x, final float y, final float z, final float w) { + data.putFloat(x) + .putFloat(y) + .putFloat(z) + .putFloat(w); + } + + /** + * Writes the value to the data buffer. + * + * @param data the data buffer. + * @param value the value. + */ + protected void write(final ByteBuffer data, final Vector2f value) { + if (value == null) { + data.putLong(0); + } else { + data.putFloat(value.getX()).putFloat(value.getY()); + } + } + + /** + * Writes the value to the data buffer. + * + * @param data the data buffer. + * @param value the value. + */ + protected void write(final ByteBuffer data, final Matrix3f value) { + write(data, value.get(0, 0), value.get(1, 0), value.get(2, 0)); + write(data, value.get(0, 1), value.get(1, 1), value.get(2, 1)); + write(data, value.get(0, 2), value.get(1, 2), value.get(2, 2)); + } + + /** + * Writes the value to the data buffer. + * + * @param data the data buffer. + * @param value the value. + */ + protected void write(final ByteBuffer data, final Matrix4f value) { + write(data, value.get(0, 0), value.get(1, 0), value.get(2, 0), value.get(3, 0)); + write(data, value.get(0, 1), value.get(1, 1), value.get(2, 1), value.get(3, 1)); + write(data, value.get(0, 2), value.get(1, 2), value.get(2, 2), value.get(3, 2)); + write(data, value.get(0, 3), value.get(1, 3), value.get(2, 3), value.get(3, 3)); + } + + @Override + public void deleteObject(final Object rendererObject) { + + if (!(rendererObject instanceof Renderer)) { + throw new IllegalArgumentException("This bo can't be deleted from " + rendererObject); + } + + ((Renderer) rendererObject).deleteBuffer(this); + } + + @Override + public NativeObject createDestructableClone() { + return new BufferObject(null, getId()); + } + + @Override + protected void deleteNativeBuffers() { + super.deleteNativeBuffers(); + if (previousData != null) { + BufferUtils.destroyDirectBuffer(previousData); + previousData = null; + } + } + + @Override + public long getUniqueId() { + return ((long) OBJTYPE_BO << 32) | ((long) id); + } +} diff --git a/jme3-core/src/main/java/com/jme3/shader/BufferObjectField.java b/jme3-core/src/main/java/com/jme3/shader/BufferObjectField.java new file mode 100644 index 000000000..798b418fc --- /dev/null +++ b/jme3-core/src/main/java/com/jme3/shader/BufferObjectField.java @@ -0,0 +1,77 @@ +package com.jme3.shader; + +import static java.util.Objects.requireNonNull; + +/** + * The class to describe a filed in BO. + * + * @author JavaSaBr + */ +public class BufferObjectField { + + + /** + * The field name. + */ + private final String name; + + /** + * The field type. + */ + private final VarType type; + + /** + * The field value. + */ + private Object value; + + public BufferObjectField(final String name, final VarType type) { + this.name = name; + this.type = type; + } + + /** + * Get the field name. + * + * @return the field name. + */ + public String getName() { + return name; + } + + /** + * Gets the field type. + * + * @return the field type. + */ + public VarType getType() { + return type; + } + + /** + * Gets the field value. + * + * @return the field value. + */ + public Object getValue() { + return value; + } + + /** + * Sets the field value. + * + * @param value the field value. + */ + public void setValue(final Object value) { + this.value = requireNonNull(value, "The field's value can't be null."); + } + + @Override + public String toString() { + return "BufferObjectField{" + + "name='" + name + '\'' + + ", type=" + type + + ", value=" + value + + '}'; + } +} diff --git a/jme3-core/src/main/java/com/jme3/shader/Glsl100ShaderGenerator.java b/jme3-core/src/main/java/com/jme3/shader/Glsl100ShaderGenerator.java index 602f47f82..1300bf361 100644 --- a/jme3-core/src/main/java/com/jme3/shader/Glsl100ShaderGenerator.java +++ b/jme3-core/src/main/java/com/jme3/shader/Glsl100ShaderGenerator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -35,6 +35,7 @@ import com.jme3.asset.AssetManager; import com.jme3.material.ShaderGenerationInfo; import com.jme3.material.plugins.ConditionParser; import com.jme3.shader.Shader.ShaderType; + import java.util.ArrayList; import java.util.List; @@ -50,7 +51,8 @@ public class Glsl100ShaderGenerator extends ShaderGenerator { * the indentation characters 1à tabulation characters */ private final static String INDENTCHAR = "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"; - private ShaderNodeVariable inPosTmp; + + protected ShaderNodeVariable inPosTmp; /** * creates a Glsl100ShaderGenerator @@ -81,8 +83,8 @@ public class Glsl100ShaderGenerator extends ShaderGenerator { /** * {@inheritDoc} * - * attributes are all declared, inPositon is declared even if it's not in - * the list and it's condition is nulled. + * attributes are all declared, inPosition is declared even if it's not in + * the list and its condition is nulled. */ @Override protected void generateAttributes(StringBuilder source, ShaderGenerationInfo info) { @@ -99,7 +101,7 @@ public class Glsl100ShaderGenerator extends ShaderGenerator { declareAttribute(source, var); } - if (!inPosition) { + if (!inPosition) { inPosTmp = new ShaderNodeVariable("vec3", "inPosition"); declareAttribute(source, inPosTmp); } @@ -110,7 +112,7 @@ public class Glsl100ShaderGenerator extends ShaderGenerator { protected void generateVaryings(StringBuilder source, ShaderGenerationInfo info, ShaderType type) { source.append("\n"); for (ShaderNodeVariable var : info.getVaryings()) { - declareVarying(source, var, type == ShaderType.Vertex ? false : true); + declareVarying(source, var, type != ShaderType.Vertex); } } @@ -141,7 +143,7 @@ public class Glsl100ShaderGenerator extends ShaderGenerator { @Override protected void generateStartOfMainSection(StringBuilder source, ShaderGenerationInfo info, ShaderType type) { source.append("\n"); - source.append("void main(){\n"); + source.append("void main() {\n"); indent(); appendIndent(source); if (type == ShaderType.Vertex) { @@ -226,6 +228,7 @@ public class Glsl100ShaderGenerator extends ShaderGenerator { * * 4. mapping outputs to global output if needed
    * + * *
    * All of this is embed in a #if conditional statement if needed */ @@ -237,27 +240,58 @@ public class Glsl100ShaderGenerator extends ShaderGenerator { comment(source, shaderNode, "Begin"); startCondition(shaderNode.getCondition(), source); - List declaredInputs = new ArrayList(); + final List declaredInputs = new ArrayList<>(); + + // Decalring variables with default values first + final ShaderNodeDefinition definition = shaderNode.getDefinition(); + + for (final ShaderNodeVariable var : definition.getInputs()) { + + if (var.getType().startsWith("sampler")) { + continue; + } + + final String fullName = shaderNode.getName() + "_" + var.getName(); + + final ShaderNodeVariable variable = new ShaderNodeVariable(var.getType(), shaderNode.getName(), + var.getName(), var.getMultiplicity()); + + if (!isVarying(info, variable)) { + declareVariable(source, variable, var.getDefaultValue(), true, null); + } + + nodeSource = replaceVariableName(nodeSource, variable); + declaredInputs.add(fullName); + } + for (VariableMapping mapping : shaderNode.getInputMapping()) { + final ShaderNodeVariable rightVariable = mapping.getRightVariable(); + final ShaderNodeVariable leftVariable = mapping.getLeftVariable(); + + String newName = shaderNode.getName() + "_" + leftVariable.getName(); + boolean isDeclared = declaredInputs.contains(newName); //Variables fed with a sampler matparam or world param are replaced by the matparam itself //It avoids issue with samplers that have to be uniforms. - if (isWorldOrMaterialParam(mapping.getRightVariable()) && mapping.getRightVariable().getType().startsWith("sampler")) { - nodeSource = replace(nodeSource, mapping.getLeftVariable(), mapping.getRightVariable().getPrefix() + mapping.getRightVariable().getName()); + if (rightVariable != null && isWorldOrMaterialParam(rightVariable) && rightVariable.getType().startsWith("sampler")) { + nodeSource = replace(nodeSource, leftVariable, rightVariable.getPrefix() + rightVariable.getName()); } else { - if (mapping.getLeftVariable().getType().startsWith("sampler")) { + + if (leftVariable.getType().startsWith("sampler")) { throw new IllegalArgumentException("a Sampler must be a uniform"); } - map(mapping, source); - String newName = shaderNode.getName() + "_" + mapping.getLeftVariable().getName(); - if (!declaredInputs.contains(newName)) { - nodeSource = replace(nodeSource, mapping.getLeftVariable(), newName); - declaredInputs.add(newName); - } + map(mapping, source, !isDeclared); + } + + if (!isDeclared) { + nodeSource = replace(nodeSource, leftVariable, newName); + declaredInputs.add(newName); } } - - for (ShaderNodeVariable var : shaderNode.getDefinition().getOutputs()) { + + + + for (ShaderNodeVariable var : definition.getOutputs()) { ShaderNodeVariable v = new ShaderNodeVariable(var.getType(), shaderNode.getName(), var.getName(), var.getMultiplicity()); if (!declaredInputs.contains(shaderNode.getName() + "_" + var.getName())) { if (!isVarying(info, v)) { @@ -270,7 +304,7 @@ public class Glsl100ShaderGenerator extends ShaderGenerator { source.append(nodeSource); for (VariableMapping mapping : shaderNode.getOutputMapping()) { - map(mapping, source); + map(mapping, source, true); } endCondition(shaderNode.getCondition(), source); comment(source, shaderNode, "End"); @@ -299,7 +333,7 @@ public class Glsl100ShaderGenerator extends ShaderGenerator { * declares a variable, embed in a conditional block if needed. the namespace is appended with "_" * @param source the StringBuilder to use * @param var the variable to declare - * @param value the initialization value to assign the the variable + * @param value the initialization value to assign the variable */ protected void declareVariable(StringBuilder source, ShaderNodeVariable var, String value) { declareVariable(source, var, value, true, null); @@ -320,7 +354,7 @@ public class Glsl100ShaderGenerator extends ShaderGenerator { * declares a variable, embed in a conditional block if needed. * @param source the StringBuilder to use * @param var the variable to declare - * @param value the initialization value to assign the the variable + * @param value the initialization value to assign the variable * @param appendNameSpace true to append the nameSpace + "_" * @param modifier the modifier of the variable (attribute, varying, in , out,...) */ @@ -383,56 +417,71 @@ public class Glsl100ShaderGenerator extends ShaderGenerator { } /** - * Appends a mapping to the source, embed in a conditional block if needed, + * Appends a mapping to the source, embed in a conditional block if needed, * with variables nameSpaces and swizzle. + * * @param mapping the VariableMapping to append - * @param source the StringBuilder to use + * @param source the StringBuilder to use */ - protected void map(VariableMapping mapping, StringBuilder source) { + protected void map(VariableMapping mapping, StringBuilder source, boolean declare) { + + final ShaderNodeVariable leftVariable = mapping.getLeftVariable(); + final ShaderNodeVariable rightVariable = mapping.getRightVariable(); + final String rightExpression = mapping.getRightExpression(); + startCondition(mapping.getCondition(), source); appendIndent(source); - if (!mapping.getLeftVariable().isShaderOutput()) { - source.append(mapping.getLeftVariable().getType()); + if (!leftVariable.isShaderOutput() && declare) { + source.append(leftVariable.getType()); source.append(" "); } - source.append(mapping.getLeftVariable().getNameSpace()); + source.append(leftVariable.getNameSpace()); source.append("_"); - source.append(mapping.getLeftVariable().getName()); - if (mapping.getLeftVariable().getMultiplicity() != null){ + source.append(leftVariable.getName()); + if (leftVariable.getMultiplicity() != null){ source.append("["); - source.append(mapping.getLeftVariable().getMultiplicity()); + source.append(leftVariable.getMultiplicity()); source.append("]"); } - - //left swizzle, the variable can't be declared and assigned on the same line. + + // left swizzle, the variable can't be declared and assigned on the same line. if (mapping.getLeftSwizzling().length() > 0) { //initialize the declared variable to 0.0 source.append(" = "); - source.append(mapping.getLeftVariable().getType()); + source.append(leftVariable.getType()); source.append("(0.0);\n"); appendIndent(source); - //assign the value on a new line - source.append(mapping.getLeftVariable().getNameSpace()); + // assign the value on a new line + source.append(leftVariable.getNameSpace()); source.append("_"); - source.append(mapping.getLeftVariable().getName()); + source.append(leftVariable.getName()); source.append("."); source.append(mapping.getLeftSwizzling()); } source.append(" = "); - String namePrefix = getAppendableNameSpace(mapping.getRightVariable()); - source.append(namePrefix); - source.append(mapping.getRightVariable().getPrefix()); - source.append(mapping.getRightVariable().getName()); - if (mapping.getRightSwizzling().length() > 0) { - source.append("."); - source.append(mapping.getRightSwizzling()); + + if (rightVariable != null) { + + String namePrefix = getAppendableNameSpace(rightVariable); + source.append(namePrefix); + source.append(rightVariable.getPrefix()); + source.append(rightVariable.getName()); + + if (mapping.getRightSwizzling().length() > 0) { + source.append("."); + source.append(mapping.getRightSwizzling()); + } + + } else { + source.append(rightExpression); } + source.append(";\n"); endCondition(mapping.getCondition(), source); } /** - * replaces a variable name in a shaderNode source code by prefixing it + * replaces a variable name in a shaderNode source code by prefixing it * with its nameSpace and "_" if needed. * @param nodeSource the source to modify * @param var the variable to replace @@ -497,7 +546,7 @@ public class Glsl100ShaderGenerator extends ShaderGenerator { * appropriate defined based on the mapping condition of this variable. * Complex condition syntax are handled. * - * @param nodeSource the sahderNode source code + * @param nodeSource the shaderNode source code * @param shaderNode the ShaderNode being processed * @return the modified shaderNode source. */ @@ -574,9 +623,9 @@ public class Glsl100ShaderGenerator extends ShaderGenerator { /** * Declares a varying * @param source the StringBuilder to use - * @param var the variable to declare as an varying + * @param var the variable to declare as a varying * @param input a boolean set to true if the this varying is an input. - * this in not used in this implementation but can be used in overridings + * this in not used in this implementation but can be used in overriding * implementation */ protected void declareVarying(StringBuilder source, ShaderNodeVariable var, boolean input) { @@ -603,7 +652,7 @@ public class Glsl100ShaderGenerator extends ShaderGenerator { * makes sure inPosition attribute is of type vec3 or vec4 * @param var the inPosition attribute */ - private void fixInPositionType(ShaderNodeVariable var) { + protected void fixInPositionType(ShaderNodeVariable var) { if(!var.getType().equals("vec3") || !var.getType().equals("vec4")){ var.setType("vec3"); } diff --git a/jme3-core/src/main/java/com/jme3/shader/Shader.java b/jme3-core/src/main/java/com/jme3/shader/Shader.java index d6fc495f2..05264f8db 100644 --- a/jme3-core/src/main/java/com/jme3/shader/Shader.java +++ b/jme3-core/src/main/java/com/jme3/shader/Shader.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -51,6 +51,11 @@ public final class Shader extends NativeObject { * Maps uniform name to the uniform variable. */ private final ListMap uniforms; + + /** + * Maps storage block name to the buffer block variables. + */ + private final ListMap bufferBlocks; /** * Uniforms bound to {@link UniformBinding}s. @@ -65,7 +70,7 @@ public final class Shader extends NativeObject { private final IntMap attribs; /** - * Type of shader. The shader will control the pipeline of it's type. + * Type of shader. The shader will control the pipeline of its type. */ public static enum ShaderType { @@ -83,12 +88,12 @@ public final class Shader extends NativeObject { */ Geometry("geom"), /** - * Controls tesselation factor (e.g how often a input patch should be + * Controls tessellation factor (e.g how often a input patch should be * subdivided) */ TessellationControl("tsctrl"), /** - * Controls tesselation transform (e.g similar to the vertex shader, but + * Controls tessellation transform (e.g similar to the vertex shader, but * required to mix inputs manual) */ TessellationEvaluation("tseval"); @@ -106,7 +111,7 @@ public final class Shader extends NativeObject { /** * Shader source describes a shader object in OpenGL. Each shader source - * is assigned a certain pipeline which it controls (described by it's type). + * is assigned a certain pipeline which it controls (described by its type). */ public static class ShaderSource extends NativeObject { @@ -127,7 +132,7 @@ public final class Shader extends NativeObject { protected ShaderSource(ShaderSource ss){ super(ss.id); // No data needs to be copied. - // (This is a destructable clone) + // (This is a destructible clone) } public ShaderSource(){ @@ -220,14 +225,15 @@ public final class Shader extends NativeObject { */ public Shader(){ super(); - shaderSourceList = new ArrayList(); - uniforms = new ListMap(); - attribs = new IntMap(); - boundUniforms = new ArrayList(); + shaderSourceList = new ArrayList<>(); + uniforms = new ListMap<>(); + bufferBlocks = new ListMap<>(); + attribs = new IntMap<>(); + boundUniforms = new ArrayList<>(); } /** - * Do not use this constructor. Used for destructable clones only. + * Do not use this constructor. Used for destructible clones only. */ protected Shader(Shader s){ super(s.id); @@ -240,6 +246,7 @@ public final class Shader extends NativeObject { } uniforms = null; + bufferBlocks = null; boundUniforms = null; attribs = null; } @@ -288,10 +295,40 @@ public final class Shader extends NativeObject { return uniform; } + /** + * Gets or creates a buffer block by the name. + * + * @param name the buffer block's name. + * @return the buffer block. + */ + public ShaderBufferBlock getBufferBlock(final String name) { + + assert name.startsWith("m_"); + + ShaderBufferBlock block = bufferBlocks.get(name); + + if (block == null) { + block = new ShaderBufferBlock(); + block.name = name; + bufferBlocks.put(name, block); + } + + return block; + } + public void removeUniform(String name){ uniforms.remove(name); } + /** + * Removes a buffer block by the name. + * + * @param name the buffer block's name. + */ + public void removeBufferBlock(final String name){ + bufferBlocks.remove(name); + } + public Attribute getAttribute(VertexBuffer.Type attribType){ int ordinal = attribType.ordinal(); Attribute attrib = attribs.get(ordinal); @@ -306,7 +343,16 @@ public final class Shader extends NativeObject { public ListMap getUniformMap(){ return uniforms; } - + + /** + * Get the buffer blocks map. + * + * @return the buffer blocks map. + */ + public ListMap getBufferBlockMap() { + return bufferBlocks; + } + public ArrayList getBoundUniforms() { return boundUniforms; } @@ -320,6 +366,7 @@ public final class Shader extends NativeObject { return getClass().getSimpleName() + "[numSources=" + shaderSourceList.size() + ", numUniforms=" + uniforms.size() + + ", numBufferBlocks=" + bufferBlocks.size() + ", shaderSources=" + getSources() + "]"; } @@ -343,7 +390,7 @@ public final class Shader extends NativeObject { * Resets all uniforms that do not have the "set-by-current-material" flag * to their default value (usually all zeroes or false). * When a uniform is modified, that flag is set, to remove the flag, - * use {@link #clearUniformsSetByCurrent() }. + * use {@link #clearUniformsSetByCurrentFlag() }. */ public void resetUniformsNotSetByCurrent() { int size = uniforms.size(); @@ -361,11 +408,16 @@ public final class Shader extends NativeObject { */ public void resetLocations() { if (uniforms != null) { - // NOTE: Shader sources will be reset seperately from the shader itself. + // NOTE: Shader sources will be reset separately from the shader itself. for (Uniform uniform : uniforms.values()) { uniform.reset(); // fixes issue with re-initialization } } + if (bufferBlocks != null) { + for (ShaderBufferBlock shaderBufferBlock : bufferBlocks.values()) { + shaderBufferBlock.reset(); + } + } if (attribs != null) { for (Entry entry : attribs) { entry.getValue().location = ShaderVariable.LOC_UNKNOWN; diff --git a/jme3-core/src/main/java/com/jme3/shader/ShaderBufferBlock.java b/jme3-core/src/main/java/com/jme3/shader/ShaderBufferBlock.java new file mode 100644 index 000000000..27b44d18b --- /dev/null +++ b/jme3-core/src/main/java/com/jme3/shader/ShaderBufferBlock.java @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2009-2018 jMonkeyEngine + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'jMonkeyEngine' nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package com.jme3.shader; + +/** + * Implementation of shader's buffer block. + * + * @author JavaSaBr + */ +public class ShaderBufferBlock extends ShaderVariable { + + /** + * Current used buffer object. + */ + protected BufferObject bufferObject; + + /** + * Set the new buffer object. + * + * @param bufferObject the new buffer object. + */ + public void setBufferObject(final BufferObject bufferObject) { + + if (bufferObject == null) { + throw new IllegalArgumentException("for storage block " + name + ": storageData cannot be null"); + } + + this.bufferObject = bufferObject; + + updateNeeded = true; + } + + /** + * Return true if need to update this storage block. + * + * @return true if need to update this storage block. + */ + public boolean isUpdateNeeded(){ + return updateNeeded; + } + + /** + * Clear the flag {@link #isUpdateNeeded()}. + */ + public void clearUpdateNeeded(){ + updateNeeded = false; + } + + /** + * Reset this storage block. + */ + public void reset(){ + updateNeeded = true; + } + + /** + * Get the current storage data. + * + * @return the current storage data. + */ + public BufferObject getBufferObject() { + return bufferObject; + } +} diff --git a/jme3-core/src/main/java/com/jme3/shader/ShaderGenerator.java b/jme3-core/src/main/java/com/jme3/shader/ShaderGenerator.java index 8783b195d..a86340ab9 100644 --- a/jme3-core/src/main/java/com/jme3/shader/ShaderGenerator.java +++ b/jme3-core/src/main/java/com/jme3/shader/ShaderGenerator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -50,6 +50,11 @@ import java.util.regex.Pattern; */ public abstract class ShaderGenerator { + public static final String NAME_SPACE_GLOBAL = "Global"; + public static final String NAME_SPACE_VERTEX_ATTRIBUTE = "Attr"; + public static final String NAME_SPACE_MAT_PARAM = "MatParam"; + public static final String NAME_SPACE_WORLD_PARAM = "WorldParam"; + /** * the asset manager */ @@ -220,7 +225,7 @@ public abstract class ShaderGenerator { * @see ShaderGenerator#generateNodeMainSection * * @param loadedSource the actual source code loaded for this node. - * @param shaderPath path the the shader file + * @param shaderPath path to the shader file * @param sourceDeclaration the Shader declaration part string builder. * @param source the Shader main part StringBuilder. * @param shaderNode the shader node. @@ -283,7 +288,7 @@ public abstract class ShaderGenerator { /** * Appends the given shaderNode declarative part to the shader declarative - * part. If needed the sahder type can be determined by fetching the + * part. If needed the shader type can be determined by fetching the * shaderNode's definition type. * * @see ShaderNode#getDefinition() diff --git a/jme3-core/src/main/java/com/jme3/shader/ShaderNode.java b/jme3-core/src/main/java/com/jme3/shader/ShaderNode.java index 4f5779363..5ef500ffd 100644 --- a/jme3-core/src/main/java/com/jme3/shader/ShaderNode.java +++ b/jme3-core/src/main/java/com/jme3/shader/ShaderNode.java @@ -31,11 +31,8 @@ */ package com.jme3.shader; -import com.jme3.export.InputCapsule; -import com.jme3.export.JmeExporter; -import com.jme3.export.JmeImporter; -import com.jme3.export.OutputCapsule; -import com.jme3.export.Savable; +import com.jme3.export.*; + import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -59,15 +56,16 @@ public class ShaderNode implements Savable, Cloneable { private String name; private ShaderNodeDefinition definition; private String condition; - private List inputMapping = new ArrayList(); - private List outputMapping = new ArrayList(); + + private List inputMapping = new ArrayList<>(); + private List outputMapping = new ArrayList<>(); /** - * creates a ShaderNode + * Creates a shader node. * - * @param name the name - * @param definition the ShaderNodeDefinition - * @param condition the condition to activate this node + * @param name the name. + * @param definition the shader node definition. + * @param condition the condition to activate this node. */ public ShaderNode(String name, ShaderNodeDefinition definition, String condition) { this.name = name; @@ -76,12 +74,13 @@ public class ShaderNode implements Savable, Cloneable { } /** - * creates a ShaderNode + * Creates a shader node. */ public ShaderNode() { } /** + * Gets the name of the node. * * @return the name of the node */ @@ -90,82 +89,83 @@ public class ShaderNode implements Savable, Cloneable { } /** - * sets the name of th node + * Sets the name of the node. * - * @param name the name + * @param name the name of the node. */ public void setName(String name) { this.name = name; } /** - * returns the definition + * Returns the shader node definition. * - * @return the ShaderNodeDefinition + * @return the shader node definition. */ public ShaderNodeDefinition getDefinition() { return definition; } /** - * sets the definition + * Sets the shader node definition. * - * @param definition the ShaderNodeDefinition + * @param definition the shader node definition. */ public void setDefinition(ShaderNodeDefinition definition) { this.definition = definition; } /** + * Gets the condition. * - * @return the condition + * @return the condition. */ public String getCondition() { return condition; } /** - * sets the condition + * Sets the condition. * - * @param condition the condition + * @param condition the condition. */ public void setCondition(String condition) { this.condition = condition; } /** - * return a list of VariableMapping representing the input mappings of this - * node + * Returns a list of variable mapping representing the input mappings of this + * node. * - * @return the input mappings + * @return the input mappings. */ public List getInputMapping() { return inputMapping; } /** - * sets the input mappings + * Sets the input mappings. * - * @param inputMapping the input mappings + * @param inputMapping the input mappings. */ public void setInputMapping(List inputMapping) { this.inputMapping = inputMapping; } /** - * return a list of VariableMapping representing the output mappings of this - * node + * Returns a list of variable mapping representing the output mappings of this + * node. * - * @return the output mappings + * @return the output mappings. */ public List getOutputMapping() { return outputMapping; } /** - * sets the output mappings + * Sets the output mappings. * - * @param outputMapping the output mappings + * @param outputMapping the output mappings. */ public void setOutputMapping(List outputMapping) { this.outputMapping = outputMapping; @@ -179,7 +179,7 @@ public class ShaderNode implements Savable, Cloneable { */ @Override public void write(JmeExporter ex) throws IOException { - OutputCapsule oc = (OutputCapsule) ex.getCapsule(this); + OutputCapsule oc = ex.getCapsule(this); oc.write(name, "name", ""); oc.write(definition, "definition", null); oc.write(condition, "condition", null); @@ -188,14 +188,14 @@ public class ShaderNode implements Savable, Cloneable { } /** - * jme serialization + * jme serialization * * @param im the importer * @throws IOException */ @Override public void read(JmeImporter im) throws IOException { - InputCapsule ic = (InputCapsule) im.getCapsule(this); + InputCapsule ic = im.getCapsule(this); name = ic.readString("name", ""); definition = (ShaderNodeDefinition) ic.readSavable("definition", null); condition = ic.readString("condition", null); @@ -210,24 +210,48 @@ public class ShaderNode implements Savable, Cloneable { */ @Override public String toString() { - return "\nShaderNode{" + "\nname=" + name + ", \ndefinition=" + definition.getName() + ", \ncondition=" + condition + ", \ninputMapping=" + inputMapping + ", \noutputMapping=" + outputMapping + '}'; + + final StringBuilder builder = new StringBuilder("ShaderNode:"); + builder.append("\n\tname=").append(name) + .append("\n\tdefinition=").append(definition.getName()) + .append("\n\tcondition=").append(condition); + + if (!inputMapping.isEmpty()) { + builder.append("\n\tinputMapping:\n"); + for (final VariableMapping mapping : inputMapping) { + builder.append("\t\t").append(mapping).append('\n'); + } + } + + if (!outputMapping.isEmpty()) { + builder.append("\n\toutputMapping:\n"); + for (final VariableMapping mapping : outputMapping) { + builder.append("\t\t").append(mapping).append('\n'); + } + } + + if (builder.charAt(builder.length() - 1) == '\n') { + builder.delete(builder.length() - 1, builder.length()); + } + + return builder.toString(); } @Override public ShaderNode clone() throws CloneNotSupportedException { ShaderNode clone = (ShaderNode) super.clone(); - //No need to clone the definition. + // No need to clone the definition. clone.definition = definition; clone.inputMapping = new ArrayList<>(); for (VariableMapping variableMapping : inputMapping) { - clone.inputMapping.add((VariableMapping) variableMapping.clone()); + clone.inputMapping.add(variableMapping.clone()); } clone.outputMapping = new ArrayList<>(); for (VariableMapping variableMapping : outputMapping) { - clone.outputMapping.add((VariableMapping) variableMapping.clone()); + clone.outputMapping.add(variableMapping.clone()); } return clone; diff --git a/jme3-core/src/main/java/com/jme3/shader/ShaderNodeDefinition.java b/jme3-core/src/main/java/com/jme3/shader/ShaderNodeDefinition.java index 88adae648..ba5fc0161 100644 --- a/jme3-core/src/main/java/com/jme3/shader/ShaderNodeDefinition.java +++ b/jme3-core/src/main/java/com/jme3/shader/ShaderNodeDefinition.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -169,7 +169,7 @@ public class ShaderNodeDefinition implements Savable { } /** - * retrun the path of this definition + * return the path of this definition * @return */ public String getPath() { diff --git a/jme3-core/src/main/java/com/jme3/shader/ShaderNodeVariable.java b/jme3-core/src/main/java/com/jme3/shader/ShaderNodeVariable.java index a1363ead1..5038efb70 100644 --- a/jme3-core/src/main/java/com/jme3/shader/ShaderNodeVariable.java +++ b/jme3-core/src/main/java/com/jme3/shader/ShaderNodeVariable.java @@ -50,8 +50,10 @@ public class ShaderNodeVariable implements Savable, Cloneable { private String type; private String nameSpace; private String condition; - private boolean shaderOutput = false; private String multiplicity; + private String defaultValue; + + private boolean shaderOutput = false; /** * creates a ShaderNodeVariable @@ -180,6 +182,24 @@ public class ShaderNodeVariable implements Savable, Cloneable { this.nameSpace = nameSpace; } + /** + * Gets the default value of this variable. + * + * @return the default value of this variable. + */ + public String getDefaultValue() { + return defaultValue; + } + + /** + * Sets the default value of this variable. + * + * @param defaultValue the default value of this variable. + */ + public void setDefaultValue(final String defaultValue) { + this.defaultValue = defaultValue; + } + @Override public int hashCode() { int hash = 7; @@ -230,7 +250,7 @@ public class ShaderNodeVariable implements Savable, Cloneable { */ @Override public void write(JmeExporter ex) throws IOException { - OutputCapsule oc = (OutputCapsule) ex.getCapsule(this); + OutputCapsule oc = ex.getCapsule(this); oc.write(name, "name", ""); oc.write(type, "type", ""); oc.write(prefix, "prefix", ""); @@ -238,7 +258,7 @@ public class ShaderNodeVariable implements Savable, Cloneable { oc.write(condition, "condition", null); oc.write(shaderOutput, "shaderOutput", false); oc.write(multiplicity, "multiplicity", null); - + oc.write(defaultValue, "defaultValue", null); } /** @@ -249,14 +269,15 @@ public class ShaderNodeVariable implements Savable, Cloneable { */ @Override public void read(JmeImporter im) throws IOException { - InputCapsule ic = (InputCapsule) im.getCapsule(this); + InputCapsule ic = im.getCapsule(this); name = ic.readString("name", ""); type = ic.readString("type", ""); prefix = ic.readString("pefix", ""); nameSpace = ic.readString("nameSpace", ""); - condition = ic.readString("condition", null); + condition = ic.readString("condition", null); shaderOutput = ic.readBoolean("shaderOutput", false); multiplicity = ic.readString("multiplicity", null); + defaultValue = ic.readString("defaultValue", null); } /** @@ -278,7 +299,7 @@ public class ShaderNodeVariable implements Savable, Cloneable { @Override public String toString() { - return "\n" + type + ' ' + (nameSpace != null ? (nameSpace + '.') : "") + name; + return type + ' ' + (nameSpace != null ? (nameSpace + '.') : "") + name; } /** diff --git a/jme3-core/src/main/java/com/jme3/shader/Uniform.java b/jme3-core/src/main/java/com/jme3/shader/Uniform.java index c377b8ebf..0340c8a13 100644 --- a/jme3-core/src/main/java/com/jme3/shader/Uniform.java +++ b/jme3-core/src/main/java/com/jme3/shader/Uniform.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2017 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -33,9 +33,9 @@ package com.jme3.shader; import com.jme3.math.*; import com.jme3.util.BufferUtils; -import java.nio.Buffer; -import java.nio.FloatBuffer; -import java.nio.IntBuffer; +import com.jme3.util.TempVars; + +import java.nio.*; public class Uniform extends ShaderVariable { @@ -348,22 +348,37 @@ public class Uniform extends ShaderVariable { if (value.equals(this.value)) { return; } - if (value instanceof ColorRGBA) { - if (this.value == null) { - this.value = new ColorRGBA(); + + TempVars vars = TempVars.get(); + Vector4f vec4 = vars.vect4f1; + //handle the null case + if (this.value == null) { + try { + this.value = value.getClass().newInstance(); + } catch (InstantiationException | IllegalAccessException e) { + throw new IllegalArgumentException("Cannot instanciate param of class " + value.getClass().getCanonicalName()); } - ((ColorRGBA) this.value).set((ColorRGBA) value); + } + //feed the pivot vec 4 with the correct value + if (value instanceof ColorRGBA) { + ColorRGBA c = (ColorRGBA) value; + vec4.set(c.r, c.g, c.b, c.a); } else if (value instanceof Vector4f) { - if (this.value == null) { - this.value = new Vector4f(); - } - ((Vector4f) this.value).set((Vector4f) value); + vec4.set((Vector4f) value); } else { - if (this.value == null) { - this.value = new Quaternion(); - } - ((Quaternion) this.value).set((Quaternion) value); + Quaternion q = (Quaternion) value; + vec4.set(q.getX(), q.getY(), q.getZ(), q.getW()); + } + + //feed this.value with the collected values. + if (this.value instanceof ColorRGBA) { + ((ColorRGBA) this.value).set(vec4.x, vec4.y, vec4.z, vec4.w); + } else if (value instanceof Vector4f) { + ((Vector4f) this.value).set(vec4); + } else { + ((Quaternion) this.value).set(vec4.x, vec4.y, vec4.z, vec4.w); } + vars.release(); break; // Only use check if equals optimization for primitive values case Int: diff --git a/jme3-core/src/main/java/com/jme3/shader/UniformBinding.java b/jme3-core/src/main/java/com/jme3/shader/UniformBinding.java index 46b689cd9..1235dde7f 100644 --- a/jme3-core/src/main/java/com/jme3/shader/UniformBinding.java +++ b/jme3-core/src/main/java/com/jme3/shader/UniformBinding.java @@ -195,7 +195,14 @@ public enum UniformBinding { * The light color when rendering in multi pass mode * Type: vec4 */ - LightColor("vec4"); + LightColor("vec4"), + + /** + * The normal matrix in world space for World space lighting. The inverse transpose of the world matrix. + * Converts normals from model space to world space. + * Type: mat3 + */ + WorldNormalMatrix("mat3"); String glslType; diff --git a/jme3-core/src/main/java/com/jme3/shader/UniformBindingManager.java b/jme3-core/src/main/java/com/jme3/shader/UniformBindingManager.java index f9ead8979..340fc162c 100644 --- a/jme3-core/src/main/java/com/jme3/shader/UniformBindingManager.java +++ b/jme3-core/src/main/java/com/jme3/shader/UniformBindingManager.java @@ -36,6 +36,7 @@ import com.jme3.math.*; import com.jme3.renderer.Camera; import com.jme3.renderer.RenderManager; import com.jme3.system.Timer; + import java.util.ArrayList; /** @@ -66,6 +67,7 @@ public class UniformBindingManager { private Matrix4f worldViewMatrix = new Matrix4f(); private Matrix4f worldViewProjMatrix = new Matrix4f(); private Matrix3f normalMatrix = new Matrix3f(); + private Matrix3f worldNormalMatrix = new Matrix3f(); private Matrix4f worldMatrixInv = new Matrix4f(); private Matrix3f worldMatrixInvTrsp = new Matrix3f(); private Matrix4f viewMatrixInv = new Matrix4f(); @@ -114,6 +116,13 @@ public class UniformBindingManager { normalMatrix.transposeLocal(); u.setValue(VarType.Matrix3, normalMatrix); break; + case WorldNormalMatrix: + tempMatrix.set(worldMatrix); + tempMatrix.toRotationMatrix(worldNormalMatrix); + worldNormalMatrix.invertLocal(); + worldNormalMatrix.transposeLocal(); + u.setValue(VarType.Matrix3, worldNormalMatrix); + break; case WorldViewProjectionMatrix: worldViewProjMatrix.set(viewProjMatrix); worldViewProjMatrix.multLocal(worldMatrix); diff --git a/jme3-core/src/main/java/com/jme3/shader/VarType.java b/jme3-core/src/main/java/com/jme3/shader/VarType.java index 7300294d4..2319e7903 100644 --- a/jme3-core/src/main/java/com/jme3/shader/VarType.java +++ b/jme3-core/src/main/java/com/jme3/shader/VarType.java @@ -57,7 +57,8 @@ public enum VarType { Texture3D(false,true,"sampler3D"), TextureArray(false,true,"sampler2DArray|sampler2DArrayShadow"), TextureCubeMap(false,true,"samplerCube"), - Int("int"); + Int("int"), + BufferObject(false, false, "custom"); private boolean usesMultiData = false; private boolean textureType = false; diff --git a/jme3-core/src/main/java/com/jme3/shader/VariableMapping.java b/jme3-core/src/main/java/com/jme3/shader/VariableMapping.java index 4a88c5d9f..a9a1e2366 100644 --- a/jme3-core/src/main/java/com/jme3/shader/VariableMapping.java +++ b/jme3-core/src/main/java/com/jme3/shader/VariableMapping.java @@ -31,15 +31,13 @@ */ package com.jme3.shader; -import com.jme3.export.InputCapsule; -import com.jme3.export.JmeExporter; -import com.jme3.export.JmeImporter; -import com.jme3.export.OutputCapsule; -import com.jme3.export.Savable; +import com.jme3.export.*; + import java.io.IOException; +import java.util.Objects; /** - * represents a mapping between 2 ShaderNodeVariables + * Represents a mapping between 2 shader node variables or a left shader node variable and a value expression. * * @author Nehon */ @@ -47,68 +45,91 @@ public class VariableMapping implements Savable, Cloneable { private ShaderNodeVariable leftVariable; private ShaderNodeVariable rightVariable; + private String rightExpression; private String condition; private String leftSwizzling = ""; private String rightSwizzling = ""; /** - * creates a VariableMapping + * Creates a VariableMapping. */ public VariableMapping() { } /** - * creates a VariableMapping + * Creates a VariableMapping. * - * @param leftVariable the left hand side variable of the expression - * @param leftSwizzling the swizzling of the left variable - * @param rightVariable the right hand side variable of the expression + * @param leftVariable the left hand side variable of the expression + * @param leftSwizzling the swizzling of the left variable + * @param rightVariable the right hand side variable of the expression * @param rightSwizzling the swizzling of the right variable - * @param condition the condition for this mapping + * @param condition the condition for this mapping */ - public VariableMapping(ShaderNodeVariable leftVariable, String leftSwizzling, ShaderNodeVariable rightVariable, String rightSwizzling, String condition) { + public VariableMapping(ShaderNodeVariable leftVariable, String leftSwizzling, ShaderNodeVariable rightVariable, + String rightSwizzling, String condition) { this.leftVariable = leftVariable; this.rightVariable = rightVariable; this.condition = condition; - this.leftSwizzling = leftSwizzling; - this.rightSwizzling = rightSwizzling; + this.leftSwizzling = Objects.requireNonNull(leftSwizzling); + this.rightSwizzling = Objects.requireNonNull(rightSwizzling); } /** + * Gets the left variable. * - * @return the left variable + * @return the left variable. */ public ShaderNodeVariable getLeftVariable() { return leftVariable; } /** - * sets the left variable + * Sets the left variable. * - * @param leftVariable the left variable + * @param leftVariable the left variable. */ public void setLeftVariable(ShaderNodeVariable leftVariable) { this.leftVariable = leftVariable; } /** + * Gets the right variable. * - * @return the right variable + * @return the right variable or null. */ public ShaderNodeVariable getRightVariable() { return rightVariable; } /** - * sets the right variable + * Sets the right variable. * - * @param rightVariable the right variable + * @param rightVariable the right variable. */ public void setRightVariable(ShaderNodeVariable rightVariable) { this.rightVariable = rightVariable; } /** + * Gets the right expression. + * + * @return the right expression or null. + */ + public String getRightExpression() { + return rightExpression; + } + + /** + * Sets the right expression. + * + * @param rightExpression the right expression. + */ + public void setRightExpression(final String rightExpression) { + this.rightExpression = rightExpression; + } + + /** + * Gets the condition. * * @return the condition */ @@ -117,46 +138,48 @@ public class VariableMapping implements Savable, Cloneable { } /** - * sets the condition + * Sets the condition. * - * @param condition the condition + * @param condition the condition or null. */ public void setCondition(String condition) { this.condition = condition; } /** + * Gets the left swizzle. * - * @return the left swizzle + * @return the left swizzle or empty string. */ public String getLeftSwizzling() { return leftSwizzling; } /** - * sets the left swizzle + * Sets the left swizzle. * - * @param leftSwizzling the left swizzle + * @param leftSwizzling the left swizzle. */ public void setLeftSwizzling(String leftSwizzling) { - this.leftSwizzling = leftSwizzling; + this.leftSwizzling = Objects.requireNonNull(leftSwizzling); } /** + * Gets the right swizzle. * - * @return the right swizzle + * @return the right swizzle or empty string. */ public String getRightSwizzling() { return rightSwizzling; } /** - * sets the right swizzle + * Sets the right swizzle. * - * @param rightSwizzling the right swizzle + * @param rightSwizzling the right swizzle. */ public void setRightSwizzling(String rightSwizzling) { - this.rightSwizzling = rightSwizzling; + this.rightSwizzling = Objects.requireNonNull(rightSwizzling); } /** @@ -167,9 +190,10 @@ public class VariableMapping implements Savable, Cloneable { */ @Override public void write(JmeExporter ex) throws IOException { - OutputCapsule oc = (OutputCapsule) ex.getCapsule(this); + OutputCapsule oc = ex.getCapsule(this); oc.write(leftVariable, "leftVariable", null); oc.write(rightVariable, "rightVariable", null); + oc.write(rightExpression, "rightExpression", null); oc.write(condition, "condition", ""); oc.write(leftSwizzling, "leftSwizzling", ""); oc.write(rightSwizzling, "rightSwizzling", ""); @@ -183,9 +207,10 @@ public class VariableMapping implements Savable, Cloneable { */ @Override public void read(JmeImporter im) throws IOException { - InputCapsule ic = (InputCapsule) im.getCapsule(this); + InputCapsule ic = im.getCapsule(this); leftVariable = (ShaderNodeVariable) ic.readSavable("leftVariable", null); rightVariable = (ShaderNodeVariable) ic.readSavable("rightVariable", null); + rightExpression = ic.readString("rightExpression", null); condition = ic.readString("condition", ""); leftSwizzling = ic.readString("leftSwizzling", ""); rightSwizzling = ic.readString("rightSwizzling", ""); @@ -193,16 +218,45 @@ public class VariableMapping implements Savable, Cloneable { @Override public String toString() { - return "\n{" + leftVariable.toString() + (leftSwizzling.length() > 0 ? ("." + leftSwizzling) : "") + " = " + rightVariable.getType() + " " + rightVariable.getNameSpace() + "." + rightVariable.getName() + (rightSwizzling.length() > 0 ? ("." + rightSwizzling) : "") + " : " + condition + "}"; + + final StringBuilder builder = new StringBuilder(leftVariable.toString()); + + if (!leftSwizzling.isEmpty()) { + builder.append('.').append(leftSwizzling); + } + + builder.append(" = "); + + if (rightVariable != null) { + + builder.append(rightVariable.getType()) + .append(' ') + .append(rightVariable.getNameSpace()) + .append('.') + .append(rightVariable.getName()); + + if (!rightSwizzling.isEmpty()) { + builder.append('.').append(rightSwizzling); + } + + } else if (rightExpression != null) { + builder.append(rightExpression); + } + + if (condition != null && !condition.isEmpty()) { + builder.append(" : ").append(condition); + } + + return builder.toString(); } @Override protected VariableMapping clone() throws CloneNotSupportedException { VariableMapping clone = (VariableMapping) super.clone(); - clone.leftVariable = leftVariable.clone(); - clone.rightVariable = rightVariable.clone(); - + if (rightVariable != null) { + clone.rightVariable = rightVariable.clone(); + } return clone; } } diff --git a/jme3-core/src/main/java/com/jme3/shadow/AbstractShadowFilter.java b/jme3-core/src/main/java/com/jme3/shadow/AbstractShadowFilter.java index aa80fa0c6..7146e0d22 100644 --- a/jme3-core/src/main/java/com/jme3/shadow/AbstractShadowFilter.java +++ b/jme3-core/src/main/java/com/jme3/shadow/AbstractShadowFilter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -62,6 +62,12 @@ public abstract class AbstractShadowFilter ext protected T shadowRenderer; protected ViewPort viewPort; + /** + * used for serialization + */ + protected AbstractShadowFilter(){ + } + /** * Abstract class constructor * @@ -172,7 +178,7 @@ public abstract class AbstractShadowFilter ext } /** - * returns the shdaow intensity + * returns the shadow intensity * * @see #setShadowIntensity(float shadowIntensity) * @return shadowIntensity @@ -296,7 +302,7 @@ public abstract class AbstractShadowFilter ext /** - * returns the the edge filtering mode + * returns the edge filtering mode * * @see EdgeFilteringMode * @return @@ -305,6 +311,24 @@ public abstract class AbstractShadowFilter ext return shadowRenderer.getEdgeFilteringMode(); } + /** + * Read the number of shadow maps rendered by this filter. + * + * @return count + */ + public int getNumShadowMaps() { + return shadowRenderer.getNumShadowMaps(); + } + + /** + * Read the size of each shadow map rendered by this filter. + * + * @return a map's height (which is also its width, in pixels) + */ + public int getShadowMapSize() { + return shadowRenderer.getShadowMapSize(); + } + @Override public AbstractShadowFilter jmeClone() { try { diff --git a/jme3-core/src/main/java/com/jme3/shadow/AbstractShadowRenderer.java b/jme3-core/src/main/java/com/jme3/shadow/AbstractShadowRenderer.java index ff967f584..602b7c89d 100644 --- a/jme3-core/src/main/java/com/jme3/shadow/AbstractShadowRenderer.java +++ b/jme3-core/src/main/java/com/jme3/shadow/AbstractShadowRenderer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -482,7 +482,7 @@ public abstract class AbstractShadowRenderer implements SceneProcessor, Savable, getReceivers(lightReceivers); if (lightReceivers.size() != 0) { - //setting params to recieving geometry list + //setting params to receiving geometry list setMatParams(lightReceivers); Camera cam = viewPort.getCamera(); @@ -725,6 +725,24 @@ public abstract class AbstractShadowRenderer implements SceneProcessor, Savable, return (int) (edgesThickness * 10); } + /** + * Read the number of shadow maps rendered by this renderer. + * + * @return count + */ + public int getNumShadowMaps() { + return nbShadowMaps; + } + + /** + * Read the size of each shadow map rendered by this renderer. + * + * @return a map's height (which is also its width, in pixels) + */ + public int getShadowMapSize() { + return (int) shadowMapSize; + } + /** * Sets the shadow edges thickness. default is 10, setting it to lower values * can help to reduce the jagged effect of the shadow edges @@ -734,7 +752,7 @@ public abstract class AbstractShadowRenderer implements SceneProcessor, Savable, public void setEdgesThickness(int edgesThickness) { this.edgesThickness = Math.max(1, Math.min(edgesThickness, 10)); this.edgesThickness *= 0.1f; - postshadowMat.setFloat("PCFEdge", edgesThickness); + postshadowMat.setFloat("PCFEdge", this.edgesThickness); } /** diff --git a/jme3-core/src/main/java/com/jme3/shadow/DirectionalLightShadowFilter.java b/jme3-core/src/main/java/com/jme3/shadow/DirectionalLightShadowFilter.java index 844755cb7..2d745b3fe 100644 --- a/jme3-core/src/main/java/com/jme3/shadow/DirectionalLightShadowFilter.java +++ b/jme3-core/src/main/java/com/jme3/shadow/DirectionalLightShadowFilter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -42,10 +42,10 @@ import java.io.IOException; /** * * This Filter does basically the same as a DirectionalLightShadowRenderer - * except it renders the post shadow pass as a fulscreen quad pass instead of a + * except it renders the post shadow pass as a fullscreen quad pass instead of a * geometry pass. It's mostly faster than PssmShadowRenderer as long as you have - * more than a about ten shadow recieving objects. The expense is the draw back - * that the shadow Recieve mode set on spatial is ignored. So basically all and + * more than a about ten shadow receiving objects. The expense is the draw back + * that the shadow Receive mode set on spatial is ignored. So basically all and * only objects that render depth in the scene receive shadows. See this post * for more details * http://jmonkeyengine.org/groups/general-2/forum/topic/silly-question-about-shadow-rendering/#post-191599 @@ -56,6 +56,16 @@ import java.io.IOException; */ public class DirectionalLightShadowFilter extends AbstractShadowFilter { + /** + * Used for serialzation. + * Use DirectionalLightShadowFilter#DirectionalLightShadowFilter + * (AssetManager assetManager, int shadowMapSize, int nbSplits) + * instead. + */ + public DirectionalLightShadowFilter() { + super(); + } + /** * Creates a DirectionalLightShadowFilter Shadow Filter More info on the * technique at It splits the view frustum in several parts and compute * a shadow map for each one.
    splits are distributed so that the closer they * are from the camera, the smaller they are to maximize the resolution used of - * the shadow map.
    This result in a better quality shadow than standard + * the shadow map.
    This results in a better quality shadow than standard * shadow mapping.
    for more informations on this read this
    http://http.developer.nvidia.com/GPUGems3/gpugems3_ch10.html
    + * href="https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch10.html">https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch10.html
    *

    * @author Rémy Bouquet aka Nehon */ @@ -73,7 +73,7 @@ public class DirectionalLightShadowRenderer extends AbstractShadowRenderer { private boolean stabilize = true; /** - * Used for serialzation use + * Used for serialization use * DirectionalLightShadowRenderer#DirectionalLightShadowRenderer(AssetManager * assetManager, int shadowMapSize, int nbSplits) */ @@ -83,7 +83,7 @@ public class DirectionalLightShadowRenderer extends AbstractShadowRenderer { /** * Create a DirectionalLightShadowRenderer More info on the technique at http://http.developer.nvidia.com/GPUGems3/gpugems3_ch10.html + * href="https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch10.html">https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch10.html * * @param assetManager the application asset manager * @param shadowMapSize the size of the rendered shadowmaps (512,1024,2048, @@ -185,7 +185,7 @@ public class DirectionalLightShadowRenderer extends AbstractShadowRenderer { // update frustum points based on current camera and split ShadowUtil.updateFrustumPoints(viewPort.getCamera(), splitsArray[shadowMapIndex], splitsArray[shadowMapIndex + 1], 1.0f, points); - //Updating shadow cam with curent split frustra + //Updating shadow cam with current split frusta if (lightReceivers.size()==0) { for (Spatial scene : viewPort.getScenes()) { ShadowUtil.getGeometriesInCamFrustum(scene, viewPort.getCamera(), RenderQueue.ShadowMode.Receive, lightReceivers); @@ -234,7 +234,7 @@ public class DirectionalLightShadowRenderer extends AbstractShadowRenderer { } /** - * returns the labda parameter see #setLambda(float lambda) + * returns the lambda parameter see #setLambda(float lambda) * * @return lambda */ @@ -244,10 +244,10 @@ public class DirectionalLightShadowRenderer extends AbstractShadowRenderer { /* * Adjust the repartition of the different shadow maps in the shadow extend - * usualy goes from 0.0 to 1.0 + * usually goes from 0.0 to 1.0 * a low value give a more linear repartition resulting in a constant quality in the shadow over the extends, but near shadows could look very jagged * a high value give a more logarithmic repartition resulting in a high quality for near shadows, but the quality quickly decrease over the extend. - * the default value is set to 0.65f (theoric optimal value). + * the default value is set to 0.65f (theoretic optimal value). * @param lambda the lambda value. */ public void setLambda(float lambda) { @@ -262,8 +262,8 @@ public class DirectionalLightShadowRenderer extends AbstractShadowRenderer { } /** - * Enables the stabilization of the shadows's edges. (default is true) - * This prevents shadows' edges to flicker when the camera moves + * Enables the stabilization of the shadow's edges. (default is true) + * This prevents shadow edges from flickering when the camera moves. * However it can lead to some shadow quality loss in some particular scenes. * @param stabilize */ @@ -283,7 +283,7 @@ public class DirectionalLightShadowRenderer extends AbstractShadowRenderer { super.read(im); InputCapsule ic = im.getCapsule(this); lambda = ic.readFloat("lambda", 0.65f); - zFarOverride = ic.readInt("zFarOverride", 0); + zFarOverride = ic.readFloat("zFarOverride", 0); light = (DirectionalLight) ic.readSavable("light", null); fadeInfo = (Vector2f) ic.readSavable("fadeInfo", null); fadeLength = ic.readFloat("fadeLength", 0f); diff --git a/jme3-core/src/main/java/com/jme3/shadow/PointLightShadowFilter.java b/jme3-core/src/main/java/com/jme3/shadow/PointLightShadowFilter.java index 82730860a..1e26772dd 100644 --- a/jme3-core/src/main/java/com/jme3/shadow/PointLightShadowFilter.java +++ b/jme3-core/src/main/java/com/jme3/shadow/PointLightShadowFilter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -42,10 +42,10 @@ import java.io.IOException; /** * * This Filter does basically the same as a PointLightShadowRenderer except it - * renders the post shadow pass as a fulscreen quad pass instead of a geometry + * renders the post shadow pass as a fullscreen quad pass instead of a geometry * pass. It's mostly faster than PointLightShadowRenderer as long as you have - * more than a about ten shadow recieving objects. The expense is the draw back - * that the shadow Recieve mode set on spatial is ignored. So basically all and + * more than a about ten shadow receiving objects. The expense is the draw back + * that the shadow Receive mode set on spatial is ignored. So basically all and * only objects that render depth in the scene receive shadows. See this post * for more details * http://jmonkeyengine.org/groups/general-2/forum/topic/silly-question-about-shadow-rendering/#post-191599 @@ -56,6 +56,16 @@ import java.io.IOException; */ public class PointLightShadowFilter extends AbstractShadowFilter { + /** + * Used for serialization. + * Use PointLightShadowFilter#PointLightShadowFilter(AssetManager + * assetManager, int shadowMapSize) + * instead. + */ + public PointLightShadowFilter() { + super(); + } + /** * Creates a PointLightShadowFilter * diff --git a/jme3-core/src/main/java/com/jme3/shadow/PointLightShadowRenderer.java b/jme3-core/src/main/java/com/jme3/shadow/PointLightShadowRenderer.java index 407f72367..a16c4353b 100644 --- a/jme3-core/src/main/java/com/jme3/shadow/PointLightShadowRenderer.java +++ b/jme3-core/src/main/java/com/jme3/shadow/PointLightShadowRenderer.java @@ -63,9 +63,10 @@ public class PointLightShadowRenderer extends AbstractShadowRenderer { private Geometry[] frustums = null; /** - * Used for serialization use - * PointLightShadowRenderer"PointLightShadowRenderer(AssetManager + * Used for serialization. + * Use PointLightShadowRenderer#PointLightShadowRenderer(AssetManager * assetManager, int shadowMapSize) + * instead. */ public PointLightShadowRenderer() { super(); diff --git a/jme3-core/src/main/java/com/jme3/shadow/PssmShadowFilter.java b/jme3-core/src/main/java/com/jme3/shadow/PssmShadowFilter.java index eecd9a28a..f403f22c6 100644 --- a/jme3-core/src/main/java/com/jme3/shadow/PssmShadowFilter.java +++ b/jme3-core/src/main/java/com/jme3/shadow/PssmShadowFilter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -52,9 +52,9 @@ import java.io.IOException; /** * * This Filter does basically the same as a PssmShadowRenderer except it renders - * the post shadow pass as a fulscreen quad pass instead of a geometry pass. - * It's mostly faster than PssmShadowRenderer as long as you have more than a about ten shadow recieving objects. - * The expense is the draw back that the shadow Recieve mode set on spatial is ignored. + * the post shadow pass as a fullscreen quad pass instead of a geometry pass. + * It's mostly faster than PssmShadowRenderer as long as you have more than a about ten shadow receiving objects. + * The expense is the draw back that the shadow Receive mode set on spatial is ignored. * So basically all and only objects that render depth in the scene receive shadows. * See this post for more details http://jmonkeyengine.org/groups/general-2/forum/topic/silly-question-about-shadow-rendering/#post-191599 * @@ -69,6 +69,16 @@ public class PssmShadowFilter extends Filter { private PssmShadowRenderer pssmRenderer; private ViewPort viewPort; + /** + * Used for serialization. + * Use PssmShadowFilter#PssmShadowFilter(AssetManager + * assetManager, int size, int nbSplits) + * instead. + */ + public PssmShadowFilter() { + super(); + } + /** * Creates a PSSM Shadow Filter * More info on the technique at http://http.developer.nvidia.com/GPUGems3/gpugems3_ch10.html @@ -150,10 +160,10 @@ public class PssmShadowFilter extends Filter { /** * Adjust the repartition of the different shadow maps in the shadow extend - * usualy goes from 0.0 to 1.0 + * usually goes from 0.0 to 1.0 * a low value give a more linear repartition resulting in a constant quality in the shadow over the extends, but near shadows could look very jagged * a high value give a more logarithmic repartition resulting in a high quality for near shadows, but the quality quickly decrease over the extend. - * the default value is set to 0.65f (theoric optimal value). + * the default value is set to 0.65f (theoretic optimal value). * @param lambda the lambda value. */ public void setLambda(float lambda) { @@ -224,8 +234,8 @@ public class PssmShadowFilter extends Filter { } /** - * Set this to false if you want to use several PssmRederers to have multiple shadows cast by multiple light sources. - * Make sure the last PssmRenderer in the stack DO flush the queues, but not the others + * Set this to false if you want to use several PssmRenderers to have multiple shadows cast by multiple light sources. + * Make sure the last PssmRenderer in the stack DOES flush the queues, but not the others * @param flushQueues */ public void setFlushQueues(boolean flushQueues) { diff --git a/jme3-core/src/main/java/com/jme3/shadow/PssmShadowRenderer.java b/jme3-core/src/main/java/com/jme3/shadow/PssmShadowRenderer.java index 4b854ec37..2361be28a 100644 --- a/jme3-core/src/main/java/com/jme3/shadow/PssmShadowRenderer.java +++ b/jme3-core/src/main/java/com/jme3/shadow/PssmShadowRenderer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -63,11 +63,11 @@ import java.util.ArrayList; import java.util.List; /** - * PssmShadow renderer use Parrallel Split Shadow Mapping technique (pssm)
    + * PssmShadow renderer use Parallel Split Shadow Mapping technique (pssm)
    * It splits the view frustum in several parts and compute a shadow map for each * one.
    splits are distributed so that the closer they are from the camera, * the smaller they are to maximize the resolution used of the shadow map.
    - * This result in a better quality shadow than standard shadow mapping.
    for + * This results in a better quality shadow than standard shadow mapping.
    for * more informations on this read this http://http.developer.nvidia.com/GPUGems3/gpugems3_ch10.html
    *

    @@ -324,7 +324,7 @@ public class PssmShadowRenderer implements SceneProcessor { applyHWShadows = true; } - //debug function that create a displayable frustrum + //debug function that create a displayable frustum private Geometry createFrustum(Vector3f[] pts, int i) { WireFrustum frustum = new WireFrustum(pts); Geometry frustumMdl = new Geometry("f", frustum); @@ -430,7 +430,7 @@ public class PssmShadowRenderer implements SceneProcessor { // update frustum points based on current camera and split ShadowUtil.updateFrustumPoints(viewCam, splitsArray[i], splitsArray[i + 1], 1.0f, points); - //Updating shadow cam with curent split frustra + //Updating shadow cam with current split frusta ShadowUtil.updateShadowCamera(viewPort, lightReceivers, shadowCam, points, splitOccluders, shadowMapSize); //saving light view projection matrix for this split @@ -484,7 +484,7 @@ public class PssmShadowRenderer implements SceneProcessor { } /** - * For debugging purpose Allow to "snapshot" the current frustrum to the + * For debugging purpose Allow to "snapshot" the current frustum to the * scene */ public void displayDebug() { @@ -497,7 +497,7 @@ public class PssmShadowRenderer implements SceneProcessor { displayShadowMap(renderManager.getRenderer()); } if (!noOccluders) { - //setting params to recieving geometry list + //setting params to receiving geometry list setMatParams(); Camera cam = viewPort.getCamera(); @@ -604,10 +604,10 @@ public class PssmShadowRenderer implements SceneProcessor { /* * Adjust the repartition of the different shadow maps in the shadow extend - * usualy goes from 0.0 to 1.0 + * usually goes from 0.0 to 1.0 * a low value give a more linear repartition resulting in a constant quality in the shadow over the extends, but near shadows could look very jagged * a high value give a more logarithmic repartition resulting in a high quality for near shadows, but the quality quickly decrease over the extend. - * the default value is set to 0.65f (theoric optimal value). + * the default value is set to 0.65f (theoretic optimal value). * @param lambda the lambda value. */ public void setLambda(float lambda) { @@ -695,9 +695,9 @@ public class PssmShadowRenderer implements SceneProcessor { } /** - * Set this to false if you want to use several PssmRederers to have + * Set this to false if you want to use several PssmRenderers to have * multiple shadows cast by multiple light sources. Make sure the last - * PssmRenderer in the stack DO flush the queues, but not the others + * PssmRenderer in the stack DOES flush the queues, but not the others * * @param flushQueues */ diff --git a/jme3-core/src/main/java/com/jme3/shadow/ShadowUtil.java b/jme3-core/src/main/java/com/jme3/shadow/ShadowUtil.java index 51942cdac..653d04488 100644 --- a/jme3-core/src/main/java/com/jme3/shadow/ShadowUtil.java +++ b/jme3-core/src/main/java/com/jme3/shadow/ShadowUtil.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -387,7 +387,7 @@ public class ShadowUtil { BoundingBox occBB = (BoundingBox) occBox; //Kirill 01/10/2011 // Extend the occluder further into the frustum - // This fixes shadow dissapearing issues when + // This fixes shadow disappearing issues when // the caster itself is not in the view camera // but its shadow is in the camera // The number is in world units @@ -430,7 +430,7 @@ public class ShadowUtil { BoundingBox occBB = (BoundingBox) occBox; //Kirill 01/10/2011 // Extend the occluder further into the frustum - // This fixes shadow dissapearing issues when + // This fixes shadow disappearing issues when // the caster itself is not in the view camera // but its shadow is in the camera // The number is in world units @@ -593,9 +593,9 @@ public class ShadowUtil { /** * Populates the outputGeometryList with the geometry of the - * inputGeomtryList that are in the frustum of the given camera + * inputGeometryList that are in the frustum of the given camera * - * @param inputGeometryList The list containing all geometry to check + * @param inputGeometryList The list containing all geometries to check * against the camera frustum * @param camera the camera to check geometries against * @param outputGeometryList the list of all geometries that are in the @@ -684,10 +684,10 @@ public class ShadowUtil { /** * Populates the outputGeometryList with the geometry of the - * inputGeomtryList that are in the radius of a light. + * inputGeometryList that are in the radius of a light. * The array of camera must be an array of 6 cameras initialized so they represent the light viewspace of a pointlight * - * @param inputGeometryList The list containing all geometry to check + * @param inputGeometryList The list containing all geometries to check * against the camera frustum * @param cameras the camera array to check geometries against * @param outputGeometryList the list of all geometries that are in the diff --git a/jme3-core/src/main/java/com/jme3/shadow/SpotLightShadowFilter.java b/jme3-core/src/main/java/com/jme3/shadow/SpotLightShadowFilter.java index 11126467d..85f235d8b 100644 --- a/jme3-core/src/main/java/com/jme3/shadow/SpotLightShadowFilter.java +++ b/jme3-core/src/main/java/com/jme3/shadow/SpotLightShadowFilter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -42,10 +42,10 @@ import java.io.IOException; /** * * This Filter does basically the same as a SpotLightShadowRenderer except it - * renders the post shadow pass as a fulscreen quad pass instead of a geometry + * renders the post shadow pass as a fullscreen quad pass instead of a geometry * pass. It's mostly faster than PssmShadowRenderer as long as you have more - * than a about ten shadow recieving objects. The expense is the draw back that - * the shadow Recieve mode set on spatial is ignored. So basically all and only + * than a about ten shadow receiving objects. The expense is the draw back that + * the shadow Receive mode set on spatial is ignored. So basically all and only * objects that render depth in the scene receive shadows. See this post for * more details * http://jmonkeyengine.org/groups/general-2/forum/topic/silly-question-about-shadow-rendering/#post-191599 @@ -56,6 +56,16 @@ import java.io.IOException; */ public class SpotLightShadowFilter extends AbstractShadowFilter { + /** + * Used for serialization. + * Use SpotLightShadowFilter#SpotLightShadowFilter(AssetManager assetManager, + * int shadowMapSize) + * instead. + */ + public SpotLightShadowFilter() { + super(); + } + /** * Creates a SpotLight Shadow Filter * diff --git a/jme3-core/src/main/java/com/jme3/shadow/SpotLightShadowRenderer.java b/jme3-core/src/main/java/com/jme3/shadow/SpotLightShadowRenderer.java index e1d7db05e..32eef5630 100644 --- a/jme3-core/src/main/java/com/jme3/shadow/SpotLightShadowRenderer.java +++ b/jme3-core/src/main/java/com/jme3/shadow/SpotLightShadowRenderer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -52,11 +52,11 @@ import com.jme3.util.clone.Cloner; import java.io.IOException; /** - * SpotLightShadowRenderer renderer use Parrallel Split Shadow Mapping technique + * SpotLightShadowRenderer renderer use Parallel Split Shadow Mapping technique * (pssm)
    It splits the view frustum in several parts and compute a shadow * map for each one.
    splits are distributed so that the closer they are from * the camera, the smaller they are to maximize the resolution used of the - * shadow map.
    This result in a better quality shadow than standard shadow + * shadow map.
    This results in a better quality shadow than standard shadow * mapping.
    for more informations on this read this http://http.developer.nvidia.com/GPUGems3/gpugems3_ch10.html
    *

    diff --git a/jme3-core/src/main/java/com/jme3/system/Annotations.java b/jme3-core/src/main/java/com/jme3/system/Annotations.java index 46b5ef478..8d93ea793 100644 --- a/jme3-core/src/main/java/com/jme3/system/Annotations.java +++ b/jme3-core/src/main/java/com/jme3/system/Annotations.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -43,7 +43,7 @@ public class Annotations { /** * Annotation used for math primitive fields, method parameters or method return values. - * Specifies that the primitve is read only and should not be changed. + * Specifies that the primitive is read only and should not be changed. */ @Documented @Retention(RetentionPolicy.RUNTIME) diff --git a/jme3-core/src/main/java/com/jme3/system/AppSettings.java b/jme3-core/src/main/java/com/jme3/system/AppSettings.java index e21050d16..1e058f329 100644 --- a/jme3-core/src/main/java/com/jme3/system/AppSettings.java +++ b/jme3-core/src/main/java/com/jme3/system/AppSettings.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -71,7 +71,7 @@ public final class AppSettings extends HashMap { public static final String LWJGL_OPENGL2 = "LWJGL-OpenGL2"; /** - * Use LWJGL as the display system and force using the core OpenGL3.3 renderer. + * Use LWJGL as the display system and force using the core OpenGL3.2 renderer. *

    * If the underlying system does not support OpenGL3.2, then the context * initialization will throw an exception. Note that currently jMonkeyEngine @@ -379,7 +379,7 @@ public final class AppSettings extends HashMap { } } else { // Use old method for compatibility with older preferences - // TODO: Remove when no longer neccessary + // TODO: Remove when no longer necessary Object defaultValue = defaults.get(key); if (defaultValue instanceof Integer) { put(key, prefs.getInt(key, (Integer) defaultValue)); @@ -1084,7 +1084,7 @@ public final class AppSettings extends HashMap { } /** - * Determine if the the display context will swap buffers every frame. + * Determine if the display context will swap buffers every frame. * * @return True if buffer swapping is enabled, false otherwise. * diff --git a/jme3-core/src/main/java/com/jme3/system/JmeSystem.java b/jme3-core/src/main/java/com/jme3/system/JmeSystem.java index 51c2173fd..4d57de017 100644 --- a/jme3-core/src/main/java/com/jme3/system/JmeSystem.java +++ b/jme3-core/src/main/java/com/jme3/system/JmeSystem.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -122,7 +122,7 @@ public class JmeSystem { * Compresses a raw image into a stream. * * The encoding is performed via system libraries. On desktop, the encoding - * is performed via ImageIO, whereas on Android, is is done via the + * is performed via ImageIO, whereas on Android, is done via the * Bitmap class. * * @param outStream The stream where to write the image data. diff --git a/jme3-core/src/main/java/com/jme3/system/NullRenderer.java b/jme3-core/src/main/java/com/jme3/system/NullRenderer.java index 1eb2b1533..3c289ecc3 100644 --- a/jme3-core/src/main/java/com/jme3/system/NullRenderer.java +++ b/jme3-core/src/main/java/com/jme3/system/NullRenderer.java @@ -31,9 +31,6 @@ */ package com.jme3.system; -import java.nio.ByteBuffer; -import java.util.EnumSet; - import com.jme3.light.LightList; import com.jme3.material.RenderState; import com.jme3.math.ColorRGBA; @@ -44,12 +41,16 @@ import com.jme3.renderer.Renderer; import com.jme3.renderer.Statistics; import com.jme3.scene.Mesh; import com.jme3.scene.VertexBuffer; +import com.jme3.shader.BufferObject; import com.jme3.shader.Shader; import com.jme3.shader.Shader.ShaderSource; import com.jme3.texture.FrameBuffer; import com.jme3.texture.Image; import com.jme3.texture.Texture; + +import java.nio.ByteBuffer; import java.util.EnumMap; +import java.util.EnumSet; public class NullRenderer implements Renderer { @@ -148,9 +149,17 @@ public class NullRenderer implements Renderer { public void updateBufferData(VertexBuffer vb) { } + @Override + public void updateBufferData(BufferObject bo) { + } public void deleteBuffer(VertexBuffer vb) { } + @Override + public void deleteBuffer(BufferObject bo) { + + } + public void renderMesh(Mesh mesh, int lod, int count, VertexBuffer[] instanceData) { } diff --git a/jme3-core/src/main/java/com/jme3/texture/Image.java b/jme3-core/src/main/java/com/jme3/texture/Image.java index 39c7725c0..fde8d4ecb 100644 --- a/jme3-core/src/main/java/com/jme3/texture/Image.java +++ b/jme3-core/src/main/java/com/jme3/texture/Image.java @@ -258,6 +258,7 @@ public class Image extends NativeObject implements Savable /*, Cloneable*/ { * half-precision floating point red, green, and blue. * * Requires {@link Caps#FloatTexture}. + * May be supported for renderbuffers, but the OpenGL specification does not require it. */ RGB16F(48,true), @@ -272,6 +273,7 @@ public class Image extends NativeObject implements Savable /*, Cloneable*/ { * single-precision floating point red, green, and blue. * * Requires {@link Caps#FloatTexture}. + * May be supported for renderbuffers, but the OpenGL specification does not require it. */ RGB32F(96,true), @@ -300,31 +302,190 @@ public class Image extends NativeObject implements Savable /*, Cloneable*/ { * Requires {@link Caps#TextureCompressionETC1}. */ ETC1(4, false, true, false), - - R8I(8), - R8UI(8), - R16I(16), - R16UI(16), - R32I(32), - R32UI(32), - RG8I(16), - RG8UI(16), - RG16I(32), - RG16UI(32), - RG32I(64), - RG32UI(64), - RGB8I(24), - RGB8UI(24), - RGB16I(48), - RGB16UI(48), - RGB32I(96), - RGB32UI(96), + + /** + * 8 bit signed int red. + * + * Requires {@link Caps#IntegerTexture}. + */ + R8I(8), + /** + * 8 bit unsigned int red. + * + * Requires {@link Caps#IntegerTexture}. + */ + R8UI(8), + /** + * 16 bit signed int red. + * + * Requires {@link Caps#IntegerTexture}. + */ + R16I(16), + /** + * 16 bit unsigned int red. + * + * Requires {@link Caps#IntegerTexture}. + */ + R16UI(16), + /** + * 32 bit signed int red. + * + * Requires {@link Caps#IntegerTexture}. + */ + R32I(32), + /** + * 32 bit unsigned int red. + * + * Requires {@link Caps#IntegerTexture}. + */ + R32UI(32), + + + /** + * 8 bit signed int red and green. + * + * Requires {@link Caps#IntegerTexture}. + */ + RG8I(16), + /** + * 8 bit unsigned int red and green. + * + * Requires {@link Caps#IntegerTexture}. + */ + RG8UI(16), + /** + * 16 bit signed int red and green. + * + * Requires {@link Caps#IntegerTexture}. + */ + RG16I(32), + /** + * 16 bit unsigned int red and green. + * + * Requires {@link Caps#IntegerTexture}. + */ + RG16UI(32), + /** + * 32 bit signed int red and green. + * + * Requires {@link Caps#IntegerTexture}. + */ + RG32I(64), + /** + * 32 bit unsigned int red and green. + * + * Requires {@link Caps#IntegerTexture}. + */ + RG32UI(64), + + /** + * 8 bit signed int red, green and blue. + * + * Requires {@link Caps#IntegerTexture} to be supported for textures. + * May be supported for renderbuffers, but the OpenGL specification does not require it. + */ + RGB8I(24), + /** + * 8 bit unsigned int red, green and blue. + * + * Requires {@link Caps#IntegerTexture} to be supported for textures. + * May be supported for renderbuffers, but the OpenGL specification does not require it. + */ + RGB8UI(24), + /** + * 16 bit signed int red, green and blue. + * + * Requires {@link Caps#IntegerTexture} to be supported for textures. + * May be supported for renderbuffers, but the OpenGL specification does not require it. + */ + RGB16I(48), + /** + * 16 bit unsigned int red, green and blue. + * + * Requires {@link Caps#IntegerTexture} to be supported for textures. + * May be supported for renderbuffers, but the OpenGL specification does not require it. + */ + RGB16UI(48), + /** + * 32 bit signed int red, green and blue. + * + * Requires {@link Caps#IntegerTexture} to be supported for textures. + * May be supported for renderbuffers, but the OpenGL specification does not require it. + */ + RGB32I(96), + /** + * 32 bit unsigned int red, green and blue. + * + * Requires {@link Caps#IntegerTexture} to be supported for textures. + * May be supported for renderbuffers, but the OpenGL specification does not require it. + */ + RGB32UI(96), + + + /** + * 8 bit signed int red, green, blue and alpha. + * + * Requires {@link Caps#IntegerTexture}. + */ RGBA8I(32), - RGBA8UI(32), - RGBA16I(64), - RGBA16UI(64), - RGBA32I(128), - RGBA32UI(128) + /** + * 8 bit unsigned int red, green, blue and alpha. + * + * Requires {@link Caps#IntegerTexture}. + */ + RGBA8UI(32), + /** + * 16 bit signed int red, green, blue and alpha. + * + * Requires {@link Caps#IntegerTexture}. + */ + RGBA16I(64), + /** + * 16 bit unsigned int red, green, blue and alpha. + * + * Requires {@link Caps#IntegerTexture}. + */ + RGBA16UI(64), + /** + * 32 bit signed int red, green, blue and alpha. + * + * Requires {@link Caps#IntegerTexture}. + */ + RGBA32I(128), + /** + * 32 bit unsigned int red, green, blue and alpha. + * + * Requires {@link Caps#IntegerTexture}. + */ + RGBA32UI(128), + + /** + * half-precision floating point red. + * + * Requires {@link Caps#FloatTexture}. + */ + R16F(16,true), + + /** + * single-precision floating point red. + * + * Requires {@link Caps#FloatTexture}. + */ + R32F(32,true), + + /** + * half-precision floating point red and green. + * + * Requires {@link Caps#FloatTexture}. + */ + RG16F(32,true), + + /** + * single-precision floating point red and green. + * + * Requires {@link Caps#FloatTexture}. + */ + RG32F(64,true), ; private int bpp; @@ -574,14 +735,14 @@ public class Image extends NativeObject implements Savable /*, Cloneable*/ { } /** - * @see {@link #Image(com.jme3.texture.Image.Format, int, int, int, java.util.ArrayList, int[], boolean)} + * @see {@link #Image(com.jme3.texture.Image.Format, int, int, int, java.util.ArrayList, int[], com.jme3.texture.image.ColorSpace)} * @param format * @param width * @param height * @param depth * @param data * @param mipMapSizes - * @deprecated use {@link #Image(com.jme3.texture.Image.Format, int, int, int, java.util.ArrayList, int[], boolean)} + * @deprecated use {@link #Image(com.jme3.texture.Image.Format, int, int, int, java.util.ArrayList, int[], com.jme3.texture.image.ColorSpace)} */ @Deprecated public Image(Format format, int width, int height, int depth, ArrayList data, @@ -630,13 +791,13 @@ public class Image extends NativeObject implements Savable /*, Cloneable*/ { } /** - * @see {@link #Image(com.jme3.texture.Image.Format, int, int, java.nio.ByteBuffer, int[], boolean)} + * @see {@link #Image(com.jme3.texture.Image.Format, int, int, java.nio.ByteBuffer, int[], com.jme3.texture.image.ColorSpace)} * @param format * @param width * @param height * @param data * @param mipMapSizes - * @deprecated use {@link #Image(com.jme3.texture.Image.Format, int, int, java.nio.ByteBuffer, int[], boolean)} + * @deprecated use {@link #Image(com.jme3.texture.Image.Format, int, int, java.nio.ByteBuffer, int[], com.jme3.texture.image.ColorSpace)} */ @Deprecated public Image(Format format, int width, int height, ByteBuffer data, @@ -664,13 +825,13 @@ public class Image extends NativeObject implements Savable /*, Cloneable*/ { } /** - * @see {@link #Image(com.jme3.texture.Image.Format, int, int, int, java.util.ArrayList, boolean)} + * @see {@link #Image(com.jme3.texture.Image.Format, int, int, int, java.util.ArrayList, com.jme3.texture.image.ColorSpace)} * @param format * @param width * @param height * @param depth * @param data - * @deprecated use {@link #Image(com.jme3.texture.Image.Format, int, int, int, java.util.ArrayList, boolean)} + * @deprecated use {@link #Image(com.jme3.texture.Image.Format, int, int, int, java.util.ArrayList, com.jme3.texture.image.ColorSpace)} */ @Deprecated public Image(Format format, int width, int height, int depth, ArrayList data) { @@ -698,12 +859,12 @@ public class Image extends NativeObject implements Savable /*, Cloneable*/ { /** - * @see {@link #Image(com.jme3.texture.Image.Format, int, int, java.nio.ByteBuffer, boolean)} + * @see {@link #Image(com.jme3.texture.Image.Format, int, int, java.nio.ByteBuffer, com.jme3.texture.image.ColorSpace)} * @param format * @param width * @param height * @param data - * @deprecated use {@link #Image(com.jme3.texture.Image.Format, int, int, java.nio.ByteBuffer, boolean)} + * @deprecated use {@link #Image(com.jme3.texture.Image.Format, int, int, java.nio.ByteBuffer, com.jme3.texture.image.ColorSpace)} */ @Deprecated public Image(Format format, int width, int height, ByteBuffer data) { diff --git a/jme3-core/src/main/java/com/jme3/texture/Texture.java b/jme3-core/src/main/java/com/jme3/texture/Texture.java index 6be00700b..253423d00 100644 --- a/jme3-core/src/main/java/com/jme3/texture/Texture.java +++ b/jme3-core/src/main/java/com/jme3/texture/Texture.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -525,7 +525,7 @@ public abstract class Texture implements CloneableSmartAsset, Savable, Cloneable final Texture other = (Texture) obj; // NOTE: Since images are generally considered unique assets in jME3, - // using the image's equals() implementation is not neccessary here + // using the image's equals() implementation is not necessary here // (would be too slow) if (this.image != other.image) { return false; @@ -549,7 +549,7 @@ public abstract class Texture implements CloneableSmartAsset, Savable, Cloneable public int hashCode() { int hash = 5; // NOTE: Since images are generally considered unique assets in jME3, - // using the image's hashCode() implementation is not neccessary here + // using the image's hashCode() implementation is not necessary here // (would be too slow) hash = 67 * hash + (this.image != null ? System.identityHashCode(this.image) : 0); hash = 67 * hash + (this.minificationFilter != null ? this.minificationFilter.hashCode() : 0); diff --git a/jme3-core/src/main/java/com/jme3/texture/image/LastTextureState.java b/jme3-core/src/main/java/com/jme3/texture/image/LastTextureState.java index 4df767b0b..b39580210 100644 --- a/jme3-core/src/main/java/com/jme3/texture/image/LastTextureState.java +++ b/jme3-core/src/main/java/com/jme3/texture/image/LastTextureState.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2015 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -61,7 +61,7 @@ public final class LastTextureState { anisoFilter = 1; // The default in OpenGL is OFF, so we avoid setting this per texture - // if its not used. + // if it's not used. shadowCompareMode = Texture.ShadowCompareMode.Off; } } diff --git a/jme3-core/src/main/java/com/jme3/util/BufferUtils.java b/jme3-core/src/main/java/com/jme3/util/BufferUtils.java index 628b2451d..d4546b7e3 100644 --- a/jme3-core/src/main/java/com/jme3/util/BufferUtils.java +++ b/jme3-core/src/main/java/com/jme3/util/BufferUtils.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -291,7 +291,7 @@ public final class BufferUtils { * @param buf * the buffer to insert into * @param index - * the postion to place the data; in terms of colors not floats + * the position to place the data; in terms of colors not floats */ public static void setInBuffer(ColorRGBA color, FloatBuffer buf, int index) { buf.position(index * 4); @@ -349,7 +349,7 @@ public final class BufferUtils { * @param buf * the buffer to insert into * @param index - * the postion to place the data; in terms of vectors not floats + * the position to place the data; in terms of vectors not floats */ public static void setInBuffer(Vector3f vector, FloatBuffer buf, int index) { if (buf == null) { @@ -1027,7 +1027,7 @@ public final class BufferUtils { /** * Creates a new ByteBuffer with the same contents as the given ByteBuffer. - * The new ByteBuffer is seperate from the old one and changes are not + * The new ByteBuffer is separate from the old one and changes are not * reflected across. If you want to reflect changes, consider using * Buffer.duplicate(). * diff --git a/jme3-core/src/main/java/com/jme3/util/ListSort.java b/jme3-core/src/main/java/com/jme3/util/ListSort.java index b88235f37..cede1ff8a 100644 --- a/jme3-core/src/main/java/com/jme3/util/ListSort.java +++ b/jme3-core/src/main/java/com/jme3/util/ListSort.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -46,7 +46,7 @@ import java.util.Comparator; * difference that the temporary necessary memory space are allocated as the * geometry list grows and reused all along the application execution. * - * Usage : ListSort has to be instanciated and kept with the geometry list ( or + * Usage : ListSort has to be instantiated and kept with the geometry list ( or * w/e it may have to sort) Then the allocate method has to be called to * allocate necessary tmp space needed for the sort. This should be called once * for optimal performance, but can be called several times if the length of the @@ -91,7 +91,7 @@ public class ListSort { * class + array was a convoluted pain. */ /** - * array of start indices in the original array for runs : run i sarting + * array of start indices in the original array for runs : run i starting * index is at runIndices[i] */ private int[] runsIndices = null; @@ -108,12 +108,12 @@ public class ListSort { /** * MIN_GALLOP set to 7 constant as described in listsort.txt. this magic * number indicates how many wins should trigger the switch from binary - * search to gallopping mode + * search to galloping mode */ private static final int MIN_GALLOP = 7; /** * This variable allows to adjust when switching to galloping mode. lowered - * when the data are "naturally" structured highered when data are random. + * when the data are "naturally" structured, raised when data are random. */ private int minGallop = MIN_GALLOP; @@ -342,7 +342,7 @@ public class ListSort { */ int nbElems = start - left; /* - * grabbed from java7 TimSort, the swich is an optimization to + * grabbed from java7 TimSort, the switch is an optimization to * arraycopy in case there are 1 or 2 elements only to copy */ switch (nbElems) { diff --git a/jme3-core/src/main/java/com/jme3/util/LittleEndien.java b/jme3-core/src/main/java/com/jme3/util/LittleEndien.java index 6b15a7d45..abff3acca 100644 --- a/jme3-core/src/main/java/com/jme3/util/LittleEndien.java +++ b/jme3-core/src/main/java/com/jme3/util/LittleEndien.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -34,7 +34,7 @@ package com.jme3.util; import java.io.*; /** - * LittleEndien is a class to read littleendien stored data + * LittleEndien is a class to read little-endian stored data * via a InputStream. All functions work as defined in DataInput, but * assume they come from a LittleEndien input stream. Currently used to read .ms3d and .3ds files. * @author Jack Lindamood diff --git a/jme3-core/src/main/java/com/jme3/util/MaterialDebugAppState.java b/jme3-core/src/main/java/com/jme3/util/MaterialDebugAppState.java index 01464f67b..b0f3565e4 100644 --- a/jme3-core/src/main/java/com/jme3/util/MaterialDebugAppState.java +++ b/jme3-core/src/main/java/com/jme3/util/MaterialDebugAppState.java @@ -200,7 +200,8 @@ public class MaterialDebugAppState extends AbstractAppState { assetManager.clearCache(); //creating a dummy mat with the mat def of the mat to reload - Material dummy = new Material(mat.getMaterialDef()); + // Force the reloading of the asset, otherwise the new shader code will not be applied. + Material dummy = new Material(assetManager, mat.getMaterialDef().getAssetName()); for (MatParam matParam : mat.getParams()) { dummy.setParam(matParam.getName(), matParam.getVarType(), matParam.getValue()); diff --git a/jme3-core/src/main/java/com/jme3/util/NativeObject.java b/jme3-core/src/main/java/com/jme3/util/NativeObject.java index 508e6623d..426e4c9e0 100644 --- a/jme3-core/src/main/java/com/jme3/util/NativeObject.java +++ b/jme3-core/src/main/java/com/jme3/util/NativeObject.java @@ -52,7 +52,8 @@ public abstract class NativeObject implements Cloneable { OBJTYPE_SHADERSOURCE = 5, OBJTYPE_AUDIOBUFFER = 6, OBJTYPE_AUDIOSTREAM = 7, - OBJTYPE_FILTER = 8; + OBJTYPE_FILTER = 8, + OBJTYPE_BO = 9; /** * The object manager to which this NativeObject is registered to. diff --git a/jme3-core/src/main/java/com/jme3/util/NativeObjectManager.java b/jme3-core/src/main/java/com/jme3/util/NativeObjectManager.java index 9df5853ca..cea15e9ed 100644 --- a/jme3-core/src/main/java/com/jme3/util/NativeObjectManager.java +++ b/jme3-core/src/main/java/com/jme3/util/NativeObjectManager.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -158,7 +158,7 @@ public class NativeObjectManager { } if (deleteBufs && UNSAFE && realObj != null) { // Only the real object has native buffers. - // The destructable clone has nothing and cannot be used in this case. + // The destructible clone has nothing and cannot be used in this case. realObj.deleteNativeBuffersInternal(); } } diff --git a/jme3-core/src/main/java/com/jme3/util/PrimitiveAllocator.java b/jme3-core/src/main/java/com/jme3/util/PrimitiveAllocator.java index d49c02105..9762dc158 100644 --- a/jme3-core/src/main/java/com/jme3/util/PrimitiveAllocator.java +++ b/jme3-core/src/main/java/com/jme3/util/PrimitiveAllocator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -35,7 +35,7 @@ import java.nio.Buffer; import java.nio.ByteBuffer; /** - * This class contains a primitve allocator with no special logic, should work + * This class contains a primitive allocator with no special logic, should work * on any jvm */ public final class PrimitiveAllocator implements BufferAllocator { @@ -43,7 +43,7 @@ public final class PrimitiveAllocator implements BufferAllocator { @Override public void destroyDirectBuffer(Buffer toBeDestroyed) { // no exception by intent, as this way naivly written java7/8 - // applications wont crash on 9 assuming they can dispose buffers + // applications won't crash on 9 assuming they can dispose buffers System.err.println("Warning destroyBuffer not supported"); } diff --git a/jme3-core/src/main/java/com/jme3/util/ReflectionAllocator.java b/jme3-core/src/main/java/com/jme3/util/ReflectionAllocator.java index 6ddc5fb87..a55d7c918 100644 --- a/jme3-core/src/main/java/com/jme3/util/ReflectionAllocator.java +++ b/jme3-core/src/main/java/com/jme3/util/ReflectionAllocator.java @@ -149,10 +149,14 @@ public final class ReflectionAllocator implements BufferAllocator { // first Object viewedBuffer = localViewedBufferMethod.invoke(toBeDestroyed); if (viewedBuffer != null) { - destroyDirectBuffer((Buffer) viewedBuffer); - } else { - Logger.getLogger(BufferUtils.class.getName()).log(Level.SEVERE, - "Buffer cannot be destroyed: {0}", toBeDestroyed); + if (viewedBuffer instanceof Buffer) { + destroyDirectBuffer((Buffer) viewedBuffer); + } + // Else nothing to do, we may be on android which has an + // internal system for freeing direct buffers + } else { + Logger.getLogger(BufferUtils.class.getName()).log(Level.SEVERE, + "Buffer cannot be destroyed: {0}", toBeDestroyed); } } } diff --git a/jme3-core/src/main/java/com/jme3/util/SafeArrayList.java b/jme3-core/src/main/java/com/jme3/util/SafeArrayList.java index 30593cd4b..0085b20d3 100644 --- a/jme3-core/src/main/java/com/jme3/util/SafeArrayList.java +++ b/jme3-core/src/main/java/com/jme3/util/SafeArrayList.java @@ -92,9 +92,15 @@ public class SafeArrayList implements List, Cloneable { this.elementType = elementType; } - public SafeArrayList(Class elementType, Collection c) { + public SafeArrayList(final Class elementType, final int capacity) { this.elementType = elementType; - addAll(c); + this.buffer = new ArrayList<>(capacity); + } + + public SafeArrayList(final Class elementType, final Collection collection) { + this.elementType = elementType; + this.buffer = new ArrayList<>(collection); + this.size = buffer.size(); } public SafeArrayList clone() { @@ -150,12 +156,12 @@ public class SafeArrayList implements List, Cloneable { return buffer; if( backingArray == null ) { - buffer = new ArrayList(); + buffer = new ArrayList<>(); } else { // Only keep the array or the buffer but never both at // the same time. 1) it saves space, 2) it keeps the rest // of the code safer. - buffer = new ArrayList( Arrays.asList(backingArray) ); + buffer = new ArrayList<>( Arrays.asList(backingArray) ); backingArray = null; } return buffer; @@ -243,10 +249,19 @@ public class SafeArrayList implements List, Cloneable { } public boolean equals(Object o) { - if( o == this ) + + if (o == this) { return true; - if( !(o instanceof List) ) //covers null too + } else if (o instanceof SafeArrayList) { + + final Object[] targetArray = ((SafeArrayList) o).getArray(); + final E[] array = getArray(); + + return Arrays.equals(targetArray, array); + } else if (!(o instanceof List)) {//covers null too return false; + } + List other = (List)o; Iterator i1 = iterator(); Iterator i2 = other.iterator(); diff --git a/jme3-core/src/main/java/com/jme3/util/SkyFactory.java b/jme3-core/src/main/java/com/jme3/util/SkyFactory.java index 730ee3b11..2d435d50f 100644 --- a/jme3-core/src/main/java/com/jme3/util/SkyFactory.java +++ b/jme3-core/src/main/java/com/jme3/util/SkyFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -85,7 +85,7 @@ public class SkyFactory { * Create a sky with radius=10 using the given cubemap or spheremap texture. * * For the sky to be visible, its radius must fall between the near and far - * planes of the camera's frustrum. + * planes of the camera's frustum. * * @param assetManager from which to load materials * @param texture to use @@ -115,7 +115,7 @@ public class SkyFactory { * Create a sky with radius=10 using the given cubemap or spheremap texture. * * For the sky to be visible, its radius must fall between the near and far - * planes of the camera's frustrum. + * planes of the camera's frustum. * * @param assetManager from which to load materials * @param texture to use @@ -149,7 +149,7 @@ public class SkyFactory { * * @param sphereRadius the sky sphere's radius: for the sky to be visible, * its radius must fall between the near and far planes of the camera's - * frustrum + * frustum * @return a new spatial representing the sky, ready to be attached to the * scene graph * @deprecated use {@link SkyFactory#createSky(com.jme3.asset.AssetManager, com.jme3.texture.Texture, com.jme3.math.Vector3f, com.jme3.util.SkyFactory.EnvMapType, int)} @@ -171,7 +171,7 @@ public class SkyFactory { * @param envMapType see {@link EnvMapType} * @param sphereRadius the sky sphere's radius: for the sky to be visible, * its radius must fall between the near and far planes of the camera's - * frustrum + * frustum * @return a new spatial representing the sky, ready to be attached to the * scene graph */ @@ -191,7 +191,7 @@ public class SkyFactory { skyMat.setVector3("NormalScale", normalScale); switch (envMapType){ case CubeMap : - // make sure its a cubemap + // make sure it's a cubemap if (!(texture instanceof TextureCubeMap)) { Image img = texture.getImage(); texture = new TextureCubeMap(); @@ -342,7 +342,7 @@ public class SkyFactory { * Create a cube-mapped sky with radius=10 using six textures. * * For the sky to be visible, its radius must fall between the near and far - * planes of the camera's frustrum. + * planes of the camera's frustum. * * @param assetManager from which to load materials * @param west texture for the western face of the cube @@ -379,7 +379,7 @@ public class SkyFactory { * transformation to the normal. * @param sphereRadius the sky sphere's radius: for the sky to be visible, * its radius must fall between the near and far planes of the camera's - * frustrum + * frustum * @return a new spatial representing the sky, ready to be attached to the * scene graph */ diff --git a/jme3-core/src/main/java/com/jme3/util/TangentBinormalGenerator.java b/jme3-core/src/main/java/com/jme3/util/TangentBinormalGenerator.java index ac6b05a8c..a1ee64060 100644 --- a/jme3-core/src/main/java/com/jme3/util/TangentBinormalGenerator.java +++ b/jme3-core/src/main/java/com/jme3/util/TangentBinormalGenerator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -266,7 +266,7 @@ public class TangentBinormalGenerator { return vertices; } - //Don't remove splitmirorred boolean,It's not used right now, but i intend to + //Don't remove splitmirorred boolean,It's not used right now, but I intend to //make this method also split vertice with rotated tangent space and I'll //add another splitRotated boolean private static List splitVertices(Mesh mesh, List vertexData, boolean splitMirorred) { diff --git a/jme3-core/src/main/java/com/jme3/util/clone/Cloner.java b/jme3-core/src/main/java/com/jme3/util/clone/Cloner.java index 3cc2b5576..1e10f33cf 100644 --- a/jme3-core/src/main/java/com/jme3/util/clone/Cloner.java +++ b/jme3-core/src/main/java/com/jme3/util/clone/Cloner.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016 jMonkeyEngine + * Copyright (c) 2016-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -61,7 +61,7 @@ import java.util.concurrent.ConcurrentHashMap; * This two step process has a few benefits. First, it means that objects * can easily have a regular shallow clone implementation just like any * normal Java objects. Second, the deep cloning of fields happens after - * creation wich means that the clone is available to future field cloning + * creation which means that the clone is available to future field cloning * to resolve circular references.

    * *

    Similar to Java serialization, the handling of specific object @@ -71,7 +71,7 @@ import java.util.concurrent.ConcurrentHashMap; * (For example, adding the IdentityCloneFunction for Mesh.class would cause * all mesh instances to be shared with the original object graph.)

    * - *

    By default, the Cloner registers serveral default clone functions + *

    By default, the Cloner registers several default clone functions * as follows:

    *
      *
    • java.util.ArrayList: ListCloneFunction @@ -187,7 +187,7 @@ public class Cloner { *
    • Else an IllegalArgumentException is thrown. *
    * - *

    The abililty to selectively use clone functions is useful when + *

    The ability to selectively use clone functions is useful when * being called from a clone function.

    * * Note: objects returned by this method may not have yet had their cloneField() diff --git a/jme3-core/src/main/java/com/jme3/util/clone/JmeCloneable.java b/jme3-core/src/main/java/com/jme3/util/clone/JmeCloneable.java index 13a9e0e71..28234d7bc 100644 --- a/jme3-core/src/main/java/com/jme3/util/clone/JmeCloneable.java +++ b/jme3-core/src/main/java/com/jme3/util/clone/JmeCloneable.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016 jMonkeyEngine + * Copyright (c) 2016-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -88,7 +88,7 @@ public interface JmeCloneable extends Cloneable { * * @param cloner The cloner that is performing the cloning operation. The * cloneFields method can call back into the cloner to make - * clones if its subordinate fields. + * clones of its subordinate fields. * @param original The original object from which this object was cloned. * This is provided for the very rare case that this object needs * to refer to its original for some reason. In general, all of diff --git a/jme3-core/src/main/java/com/jme3/util/mikktspace/MikktspaceTangentGenerator.java b/jme3-core/src/main/java/com/jme3/util/mikktspace/MikktspaceTangentGenerator.java index 15dc1277d..dbaedb098 100644 --- a/jme3-core/src/main/java/com/jme3/util/mikktspace/MikktspaceTangentGenerator.java +++ b/jme3-core/src/main/java/com/jme3/util/mikktspace/MikktspaceTangentGenerator.java @@ -950,7 +950,7 @@ public class MikktspaceTangentGenerator { } if ((pMyTriInfo.flag & GROUP_WITH_ANY) != 0) { // first to group with a group-with-anything triangle - // determines it's orientation. + // determines its orientation. // This is the only existing order dependency in the code!! if (pMyTriInfo.assignedGroup[0] == null && pMyTriInfo.assignedGroup[1] == null diff --git a/jme3-core/src/main/resources/Common/MatDefs/Light/Lighting.j3md b/jme3-core/src/main/resources/Common/MatDefs/Light/Lighting.j3md index bc699e6b1..2a8847324 100644 --- a/jme3-core/src/main/resources/Common/MatDefs/Light/Lighting.j3md +++ b/jme3-core/src/main/resources/Common/MatDefs/Light/Lighting.j3md @@ -110,6 +110,11 @@ MaterialDef Phong Lighting { // For hardware skinning Int NumberOfBones Matrix4Array BoneMatrices + + // For Morph animation + FloatArray MorphWeights + Int NumberOfMorphTargets + Int NumberOfTargetsBuffers //For instancing Boolean UseInstancing @@ -152,6 +157,8 @@ MaterialDef Phong Lighting { SPHERE_MAP : EnvMapAsSphereMap NUM_BONES : NumberOfBones INSTANCING : UseInstancing + NUM_MORPH_TARGETS: NumberOfMorphTargets + NUM_TARGETS_BUFFERS: NumberOfTargetsBuffers } } @@ -191,6 +198,8 @@ MaterialDef Phong Lighting { SPHERE_MAP : EnvMapAsSphereMap NUM_BONES : NumberOfBones INSTANCING : UseInstancing + NUM_MORPH_TARGETS: NumberOfMorphTargets + NUM_TARGETS_BUFFERS: NumberOfTargetsBuffers } } @@ -210,6 +219,8 @@ MaterialDef Phong Lighting { DISCARD_ALPHA : AlphaDiscardThreshold NUM_BONES : NumberOfBones INSTANCING : UseInstancing + NUM_MORPH_TARGETS: NumberOfMorphTargets + NUM_TARGETS_BUFFERS: NumberOfTargetsBuffers } ForcedRenderState { @@ -247,6 +258,8 @@ MaterialDef Phong Lighting { NUM_BONES : NumberOfBones INSTANCING : UseInstancing BACKFACE_SHADOWS: BackfaceShadows + NUM_MORPH_TARGETS: NumberOfMorphTargets + NUM_TARGETS_BUFFERS: NumberOfTargetsBuffers } ForcedRenderState { @@ -274,6 +287,8 @@ MaterialDef Phong Lighting { DIFFUSEMAP_ALPHA : DiffuseMap NUM_BONES : NumberOfBones INSTANCING : UseInstancing + NUM_MORPH_TARGETS: NumberOfMorphTargets + NUM_TARGETS_BUFFERS: NumberOfTargetsBuffers } } @@ -296,6 +311,8 @@ MaterialDef Phong Lighting { NUM_BONES : NumberOfBones INSTANCING : UseInstancing + NUM_MORPH_TARGETS: NumberOfMorphTargets + NUM_TARGETS_BUFFERS: NumberOfTargetsBuffers } } diff --git a/jme3-core/src/main/resources/Common/MatDefs/Light/Lighting.vert b/jme3-core/src/main/resources/Common/MatDefs/Light/Lighting.vert index 395bc1bca..6c74a7557 100644 --- a/jme3-core/src/main/resources/Common/MatDefs/Light/Lighting.vert +++ b/jme3-core/src/main/resources/Common/MatDefs/Light/Lighting.vert @@ -2,6 +2,8 @@ #import "Common/ShaderLib/Instancing.glsllib" #import "Common/ShaderLib/Skinning.glsllib" #import "Common/ShaderLib/Lighting.glsllib" +#import "Common/ShaderLib/MorphAnim.glsllib" + #ifdef VERTEX_LIGHTING #import "Common/ShaderLib/BlinnPhongLighting.glsllib" #endif @@ -90,6 +92,14 @@ void main(){ vec3 modelSpaceTan = inTangent.xyz; #endif + #ifdef NUM_MORPH_TARGETS + #if defined(NORMALMAP) && !defined(VERTEX_LIGHTING) + Morph_Compute(modelSpacePos, modelSpaceNorm, modelSpaceTan); + #else + Morph_Compute(modelSpacePos, modelSpaceNorm); + #endif + #endif + #ifdef NUM_BONES #ifndef VERTEX_LIGHTING Skinning_Compute(modelSpacePos, modelSpaceNorm, modelSpaceTan); diff --git a/jme3-core/src/main/resources/Common/MatDefs/Light/PBRLighting.frag b/jme3-core/src/main/resources/Common/MatDefs/Light/PBRLighting.frag index 118ebbe19..716d3ff7a 100644 --- a/jme3-core/src/main/resources/Common/MatDefs/Light/PBRLighting.frag +++ b/jme3-core/src/main/resources/Common/MatDefs/Light/PBRLighting.frag @@ -3,7 +3,6 @@ #import "Common/ShaderLib/Parallax.glsllib" #import "Common/ShaderLib/Lighting.glsllib" - varying vec2 texCoord; #ifdef SEPARATE_TEXCOORD varying vec2 texCoord2; @@ -12,7 +11,6 @@ varying vec2 texCoord; varying vec4 Color; uniform vec4 g_LightData[NB_LIGHTS]; - uniform vec3 g_CameraPosition; uniform float m_Roughness; @@ -21,11 +19,20 @@ uniform float m_Metallic; varying vec3 wPosition; -#ifdef INDIRECT_LIGHTING -// uniform sampler2D m_IntegrateBRDF; +#if NB_PROBES >= 1 uniform samplerCube g_PrefEnvMap; uniform vec3 g_ShCoeffs[9]; - uniform vec4 g_LightProbeData; + uniform mat4 g_LightProbeData; +#endif +#if NB_PROBES >= 2 + uniform samplerCube g_PrefEnvMap2; + uniform vec3 g_ShCoeffs2[9]; + uniform mat4 g_LightProbeData2; +#endif +#if NB_PROBES == 3 + uniform samplerCube g_PrefEnvMap3; + uniform vec3 g_ShCoeffs3[9]; + uniform mat4 g_LightProbeData3; #endif #ifdef BASECOLORMAP @@ -167,7 +174,6 @@ void main(){ vec3 normal = norm; #endif - float specular = 0.5; #ifdef SPECGLOSSPIPELINE #ifdef USE_PACKED_SG @@ -181,7 +187,7 @@ void main(){ vec4 specularColor = vec4(1.0); #endif #ifdef GLOSSINESSMAP - float glossiness = texture2D(m_GlossinesMap, newTexCoord).r * m_Glossiness; + float glossiness = texture2D(m_GlossinessMap, newTexCoord).r * m_Glossiness; #else float glossiness = m_Glossiness; #endif @@ -189,12 +195,18 @@ void main(){ #endif vec4 diffuseColor = albedo;// * (1.0 - max(max(specularColor.r, specularColor.g), specularColor.b)); Roughness = 1.0 - glossiness; - #else + vec3 fZero = specularColor.xyz; + #else + float specular = 0.5; float nonMetalSpec = 0.08 * specular; vec4 specularColor = (nonMetalSpec - nonMetalSpec * Metallic) + albedo * Metallic; vec4 diffuseColor = albedo - albedo * Metallic; + vec3 fZero = vec3(specular); #endif + gl_FragColor.rgb = vec3(0.0); + vec3 ao = vec3(1.0); + #ifdef LIGHTMAP vec3 lightMapColor; #ifdef SEPARATE_TEXCOORD @@ -204,12 +216,14 @@ void main(){ #endif #ifdef AO_MAP lightMapColor.gb = lightMapColor.rr; + ao = lightMapColor; + #else + gl_FragColor.rgb += diffuseColor.rgb * lightMapColor; #endif specularColor.rgb *= lightMapColor; - albedo.rgb *= lightMapColor; #endif - gl_FragColor.rgb = vec3(0.0); + float ndotv = max( dot( normal, viewDir ),0.0); for( int i = 0;i < NB_LIGHTS; i+=3){ vec4 lightColor = g_LightData[i]; @@ -234,8 +248,8 @@ void main(){ vec3 directDiffuse; vec3 directSpecular; - PBR_ComputeDirectLight(normal, lightDir.xyz, viewDir, - lightColor.rgb,specular, Roughness, ndotv, + float hdotv = PBR_ComputeDirectLight(normal, lightDir.xyz, viewDir, + lightColor.rgb, fZero, Roughness, ndotv, directDiffuse, directSpecular); vec3 directLighting = diffuseColor.rgb *directDiffuse + directSpecular; @@ -243,32 +257,47 @@ void main(){ gl_FragColor.rgb += directLighting * fallOff; } - #ifdef INDIRECT_LIGHTING - vec3 rv = reflect(-viewDir.xyz, normal.xyz); - //prallax fix for spherical bounds from https://seblagarde.wordpress.com/2012/09/29/image-based-lighting-approaches-and-parallax-corrected-cubemap/ - // g_LightProbeData.w is 1/probe radius + nbMipMaps, g_LightProbeData.xyz is the position of the lightProbe. - float invRadius = fract( g_LightProbeData.w); - float nbMipMaps = g_LightProbeData.w - invRadius; - rv = invRadius * (wPosition - g_LightProbeData.xyz) +rv; - - //horizon fade from http://marmosetco.tumblr.com/post/81245981087 - float horiz = dot(rv, norm); - float horizFadePower = 1.0 - Roughness; - horiz = clamp( 1.0 + horizFadePower * horiz, 0.0, 1.0 ); - horiz *= horiz; - - vec3 indirectDiffuse = vec3(0.0); - vec3 indirectSpecular = vec3(0.0); - indirectDiffuse = sphericalHarmonics(normal.xyz, g_ShCoeffs) * diffuseColor.rgb; - vec3 dominantR = getSpecularDominantDir( normal, rv.xyz, Roughness*Roughness ); - indirectSpecular = ApproximateSpecularIBLPolynomial(g_PrefEnvMap, specularColor.rgb, Roughness, ndotv, dominantR, nbMipMaps); - indirectSpecular *= vec3(horiz); - - vec3 indirectLighting = indirectDiffuse + indirectSpecular; - - gl_FragColor.rgb = gl_FragColor.rgb + indirectLighting * step( 0.0, g_LightProbeData.w); + #if NB_PROBES >= 1 + vec3 color1 = vec3(0.0); + vec3 color2 = vec3(0.0); + vec3 color3 = vec3(0.0); + float weight1 = 1.0; + float weight2 = 0.0; + float weight3 = 0.0; + + float ndf = renderProbe(viewDir, wPosition, normal, norm, Roughness, diffuseColor, specularColor, ndotv, ao, g_LightProbeData, g_ShCoeffs, g_PrefEnvMap, color1); + #if NB_PROBES >= 2 + float ndf2 = renderProbe(viewDir, wPosition, normal, norm, Roughness, diffuseColor, specularColor, ndotv, ao, g_LightProbeData2, g_ShCoeffs2, g_PrefEnvMap2, color2); + #endif + #if NB_PROBES == 3 + float ndf3 = renderProbe(viewDir, wPosition, normal, norm, Roughness, diffuseColor, specularColor, ndotv, ao, g_LightProbeData3, g_ShCoeffs3, g_PrefEnvMap3, color3); + #endif + + #if NB_PROBES >= 2 + float invNdf = max(1.0 - ndf,0.0); + float invNdf2 = max(1.0 - ndf2,0.0); + float sumNdf = ndf + ndf2; + float sumInvNdf = invNdf + invNdf2; + #if NB_PROBES == 3 + float invNdf3 = max(1.0 - ndf3,0.0); + sumNdf += ndf3; + sumInvNdf += invNdf3; + weight3 = ((1.0 - (ndf3 / sumNdf)) / (NB_PROBES - 1)) * (invNdf3 / sumInvNdf); + #endif + + weight1 = ((1.0 - (ndf / sumNdf)) / (NB_PROBES - 1)) * (invNdf / sumInvNdf); + weight2 = ((1.0 - (ndf2 / sumNdf)) / (NB_PROBES - 1)) * (invNdf2 / sumInvNdf); + + float weightSum = weight1 + weight2 + weight3; + + weight1 /= weightSum; + weight2 /= weightSum; + weight3 /= weightSum; + #endif + gl_FragColor.rgb += color1 * clamp(weight1,0.0,1.0) + color2 * clamp(weight2,0.0,1.0) + color3 * clamp(weight3,0.0,1.0); + #endif - + #if defined(EMISSIVE) || defined (EMISSIVEMAP) #ifdef EMISSIVEMAP vec4 emissive = texture2D(m_EmissiveMap, newTexCoord); diff --git a/jme3-core/src/main/resources/Common/MatDefs/Light/PBRLighting.j3md b/jme3-core/src/main/resources/Common/MatDefs/Light/PBRLighting.j3md index 61edf8e0d..e300bffdc 100644 --- a/jme3-core/src/main/resources/Common/MatDefs/Light/PBRLighting.j3md +++ b/jme3-core/src/main/resources/Common/MatDefs/Light/PBRLighting.j3md @@ -28,6 +28,9 @@ MaterialDef PBR Lighting { Texture2D RoughnessMap -LINEAR //Metallic and Roughness are packed respectively in the b and g channel of a single map + // r: unspecified + // g: Roughness + // b: Metallic Texture2D MetallicRoughnessMap -LINEAR // Texture of the emissive parts of the material @@ -47,17 +50,6 @@ MaterialDef PBR Lighting { Color Specular : 1.0 1.0 1.0 1.0 Float Glossiness : 1.0 - Vector4 ProbeData - - // Prefiltered Env Map for indirect specular lighting - TextureCubeMap PrefEnvMap -LINEAR - - // Irradiance map for indirect diffuse lighting - TextureCubeMap IrradianceMap -LINEAR - - //integrate BRDF map for indirect Lighting - Texture2D IntegrateBRDF -LINEAR - // Parallax/height map Texture2D ParallaxMap -LINEAR @@ -70,6 +62,9 @@ MaterialDef PBR Lighting { //Set to true to activate Steep Parallax mapping Boolean SteepParallax + //Horizon fade + Boolean HorizonFade + // Set to Use Lightmap Texture2D LightMap @@ -110,6 +105,11 @@ MaterialDef PBR Lighting { // For hardware skinning Int NumberOfBones Matrix4Array BoneMatrices + + // For Morph animation + FloatArray MorphWeights + Int NumberOfMorphTargets + Int NumberOfTargetsBuffers //For instancing Boolean UseInstancing @@ -130,6 +130,7 @@ MaterialDef PBR Lighting { WorldViewProjectionMatrix CameraPosition WorldMatrix + WorldNormalMatrix ViewProjectionMatrix ViewMatrix } @@ -157,6 +158,9 @@ MaterialDef PBR Lighting { NORMAL_TYPE: NormalType VERTEX_COLOR : UseVertexColor AO_MAP: LightMapAsAOMap + NUM_MORPH_TARGETS: NumberOfMorphTargets + NUM_TARGETS_BUFFERS: NumberOfTargetsBuffers + HORIZON_FADE: HorizonFade } } @@ -177,6 +181,8 @@ MaterialDef PBR Lighting { DISCARD_ALPHA : AlphaDiscardThreshold NUM_BONES : NumberOfBones INSTANCING : UseInstancing + NUM_MORPH_TARGETS: NumberOfMorphTargets + NUM_TARGETS_BUFFERS: NumberOfTargetsBuffers } ForcedRenderState { @@ -214,6 +220,8 @@ MaterialDef PBR Lighting { NUM_BONES : NumberOfBones INSTANCING : UseInstancing BACKFACE_SHADOWS: BackfaceShadows + NUM_MORPH_TARGETS: NumberOfMorphTargets + NUM_TARGETS_BUFFERS: NumberOfTargetsBuffers } ForcedRenderState { @@ -246,6 +254,8 @@ MaterialDef PBR Lighting { NUM_BONES : NumberOfBones INSTANCING : UseInstancing BACKFACE_SHADOWS: BackfaceShadows + NUM_MORPH_TARGETS: NumberOfMorphTargets + NUM_TARGETS_BUFFERS: NumberOfTargetsBuffers } ForcedRenderState { @@ -271,6 +281,8 @@ MaterialDef PBR Lighting { Defines { NUM_BONES : NumberOfBones INSTANCING : UseInstancing + NUM_MORPH_TARGETS: NumberOfMorphTargets + NUM_TARGETS_BUFFERS: NumberOfTargetsBuffers } } @@ -290,6 +302,8 @@ MaterialDef PBR Lighting { NEED_TEXCOORD1 NUM_BONES : NumberOfBones INSTANCING : UseInstancing + NUM_MORPH_TARGETS: NumberOfMorphTargets + NUM_TARGETS_BUFFERS: NumberOfTargetsBuffers } } diff --git a/jme3-core/src/main/resources/Common/MatDefs/Light/PBRLighting.vert b/jme3-core/src/main/resources/Common/MatDefs/Light/PBRLighting.vert index 77782456b..b910a8d4b 100644 --- a/jme3-core/src/main/resources/Common/MatDefs/Light/PBRLighting.vert +++ b/jme3-core/src/main/resources/Common/MatDefs/Light/PBRLighting.vert @@ -1,10 +1,9 @@ #import "Common/ShaderLib/GLSLCompat.glsllib" #import "Common/ShaderLib/Instancing.glsllib" #import "Common/ShaderLib/Skinning.glsllib" - +#import "Common/ShaderLib/MorphAnim.glsllib" uniform vec4 m_BaseColor; - uniform vec4 g_AmbientLightColor; varying vec2 texCoord; @@ -38,11 +37,19 @@ void main(){ vec3 modelSpaceTan = inTangent.xyz; #endif + #ifdef NUM_MORPH_TARGETS + #if defined(NORMALMAP) && !defined(VERTEX_LIGHTING) + Morph_Compute(modelSpacePos, modelSpaceNorm, modelSpaceTan); + #else + Morph_Compute(modelSpacePos, modelSpaceNorm); + #endif + #endif + #ifdef NUM_BONES #if defined(NORMALMAP) && !defined(VERTEX_LIGHTING) - Skinning_Compute(modelSpacePos, modelSpaceNorm, modelSpaceTan); + Skinning_Compute(modelSpacePos, modelSpaceNorm, modelSpaceTan); #else - Skinning_Compute(modelSpacePos, modelSpaceNorm); + Skinning_Compute(modelSpacePos, modelSpaceNorm); #endif #endif @@ -64,4 +71,4 @@ void main(){ #ifdef VERTEX_COLOR Color *= inColor; #endif -} \ No newline at end of file +} diff --git a/jme3-core/src/main/resources/Common/MatDefs/Light/SPLighting.vert b/jme3-core/src/main/resources/Common/MatDefs/Light/SPLighting.vert index 49cc5b96e..f9fbe40cf 100644 --- a/jme3-core/src/main/resources/Common/MatDefs/Light/SPLighting.vert +++ b/jme3-core/src/main/resources/Common/MatDefs/Light/SPLighting.vert @@ -2,6 +2,8 @@ #import "Common/ShaderLib/Instancing.glsllib" #import "Common/ShaderLib/Skinning.glsllib" #import "Common/ShaderLib/Lighting.glsllib" +#import "Common/ShaderLib/MorphAnim.glsllib" + #ifdef VERTEX_LIGHTING #import "Common/ShaderLib/BlinnPhongLighting.glsllib" #endif @@ -84,6 +86,14 @@ void main(){ vec3 modelSpaceTan = inTangent.xyz; #endif + #ifdef NUM_MORPH_TARGETS + #if defined(NORMALMAP) && !defined(VERTEX_LIGHTING) + Morph_Compute(modelSpacePos, modelSpaceNorm, modelSpaceTan); + #else + Morph_Compute(modelSpacePos, modelSpaceNorm); + #endif + #endif + #ifdef NUM_BONES #if defined(NORMALMAP) && !defined(VERTEX_LIGHTING) Skinning_Compute(modelSpacePos, modelSpaceNorm, modelSpaceTan); diff --git a/jme3-core/src/main/resources/Common/MatDefs/Misc/Billboard.j3md b/jme3-core/src/main/resources/Common/MatDefs/Misc/Billboard.j3md new file mode 100644 index 000000000..f97b3c736 --- /dev/null +++ b/jme3-core/src/main/resources/Common/MatDefs/Misc/Billboard.j3md @@ -0,0 +1,78 @@ +MaterialDef Billboard { + MaterialParameters { + Float SpriteHeight : 10 + Texture2D Texture + } + + Technique { + WorldParameters { + WorldViewMatrix + ProjectionMatrix + WorldMatrix + CameraDirection + ViewPort + CameraPosition + } + + VertexShaderNodes { + ShaderNode TexCoord { + Definition: AttributeToVarying: Common/MatDefs/ShaderNodes/Basic/AttributeToVarying.j3sn + InputMappings { + vec2Variable = Attr.inTexCoord + vec4Variable = Attr.inColor + } + OutputMappings { + } + } + ShaderNode FixedScale { + Definition: FixedScale: Common/MatDefs/ShaderNodes/Common/FixedScale.j3sn + InputMappings { + projectionMatrix = WorldParam.ProjectionMatrix + worldMatrix = WorldParam.WorldMatrix + cameraDir = WorldParam.CameraDirection + viewport = WorldParam.ViewPort + modelPosition = Attr.inPosition + cameraPos = WorldParam.CameraPosition + spriteHeight = MatParam.SpriteHeight + } + OutputMappings { + } + } + ShaderNode Billboard { + Definition: Billboard: Common/MatDefs/ShaderNodes/Common/Billboard.j3sn + InputMappings { + worldViewMatrix = WorldParam.WorldViewMatrix + projectionMatrix = WorldParam.ProjectionMatrix + modelPosition = Attr.inPosition + scale = FixedScale.scale + } + OutputMappings { + Global.position = projPosition + } + } + } + + FragmentShaderNodes { + ShaderNode TextureFetch { + Definition: TextureFetch: Common/MatDefs/ShaderNodes/Basic/TextureFetch.j3sn + InputMappings { + textureMap = MatParam.Texture + texCoord = TexCoord.vec2Variable + } + OutputMappings { + } + } + ShaderNode ColorMult { + Definition: ColorMult: Common/MatDefs/ShaderNodes/Basic/ColorMult.j3sn + InputMappings { + color1 = TextureFetch.outColor + color2 = TexCoord.vec4Variable + } + OutputMappings { + Global.color = outColor + } + } + } + + } +} diff --git a/jme3-core/src/main/resources/Common/MatDefs/Misc/DashedLine.j3md b/jme3-core/src/main/resources/Common/MatDefs/Misc/DashedLine.j3md new file mode 100644 index 000000000..097b44c71 --- /dev/null +++ b/jme3-core/src/main/resources/Common/MatDefs/Misc/DashedLine.j3md @@ -0,0 +1,59 @@ +MaterialDef DashedLine { + MaterialParameters { + } + + Technique { + WorldParameters { + WorldViewProjectionMatrix + Resolution + } + + VertexShaderNodes { + ShaderNode TransformPosition { + Definition: TransformPosition: Common/MatDefs/ShaderNodes/Basic/TransformPosition.j3sn + InputMappings { + transformsMatrix = WorldParam.WorldViewProjectionMatrix + inputPosition = Attr.inNormal + } + OutputMappings { + } + } + ShaderNode PerspectiveDivide { + Definition: PerspectiveDivide: Common/MatDefs/ShaderNodes/Misc/PerspectiveDivide.j3sn + InputMappings { + inVec = TransformPosition.outPosition + } + OutputMappings { + } + } + ShaderNode CommonVert { + Definition: CommonVert: Common/MatDefs/ShaderNodes/Common/CommonVert.j3sn + InputMappings { + worldViewProjectionMatrix = WorldParam.WorldViewProjectionMatrix + modelPosition = Attr.inPosition + vertColor = Attr.inColor + texCoord1 = Attr.inTexCoord + } + OutputMappings { + Global.position = projPosition + } + } + } + + FragmentShaderNodes { + ShaderNode Dashed { + Definition: Dashed: Common/MatDefs/ShaderNodes/Misc/Dashed.j3sn + InputMappings { + texCoord = CommonVert.texCoord1 + inColor = CommonVert.vertColor + resolution = WorldParam.Resolution + startPos = PerspectiveDivide.outVec + } + OutputMappings { + Global.color = outColor + } + } + } + + } +} diff --git a/jme3-core/src/main/resources/Common/MatDefs/Misc/Unshaded.j3md b/jme3-core/src/main/resources/Common/MatDefs/Misc/Unshaded.j3md index 826a44e45..f765d2044 100644 --- a/jme3-core/src/main/resources/Common/MatDefs/Misc/Unshaded.j3md +++ b/jme3-core/src/main/resources/Common/MatDefs/Misc/Unshaded.j3md @@ -20,6 +20,11 @@ MaterialDef Unshaded { Int NumberOfBones Matrix4Array BoneMatrices + // For Morph animation + FloatArray MorphWeights + Int NumberOfMorphTargets + Int NumberOfTargetsBuffers + // Alpha threshold for fragment discarding Float AlphaDiscardThreshold (AlphaTestFallOff) @@ -76,26 +81,30 @@ MaterialDef Unshaded { HAS_COLOR : Color NUM_BONES : NumberOfBones DISCARD_ALPHA : AlphaDiscardThreshold + NUM_MORPH_TARGETS: NumberOfMorphTargets + NUM_TARGETS_BUFFERS: NumberOfTargetsBuffers } } Technique PreNormalPass { - VertexShader GLSL100 GLSL150 : Common/MatDefs/SSAO/normal.vert - FragmentShader GLSL100 GLSL150 : Common/MatDefs/SSAO/normal.frag - - WorldParameters { - WorldViewProjectionMatrix - WorldViewMatrix - NormalMatrix - ViewProjectionMatrix - ViewMatrix - } - - Defines { - NUM_BONES : NumberOfBones - INSTANCING : UseInstancing - } + VertexShader GLSL100 GLSL150 : Common/MatDefs/SSAO/normal.vert + FragmentShader GLSL100 GLSL150 : Common/MatDefs/SSAO/normal.frag + + WorldParameters { + WorldViewProjectionMatrix + WorldViewMatrix + NormalMatrix + ViewProjectionMatrix + ViewMatrix + } + + Defines { + NUM_BONES : NumberOfBones + INSTANCING : UseInstancing + NUM_MORPH_TARGETS: NumberOfMorphTargets + NUM_TARGETS_BUFFERS: NumberOfTargetsBuffers + } } Technique PreShadow { @@ -115,6 +124,8 @@ MaterialDef Unshaded { DISCARD_ALPHA : AlphaDiscardThreshold NUM_BONES : NumberOfBones INSTANCING : UseInstancing + NUM_MORPH_TARGETS: NumberOfMorphTargets + NUM_TARGETS_BUFFERS: NumberOfTargetsBuffers } ForcedRenderState { @@ -150,8 +161,10 @@ MaterialDef Unshaded { PSSM : Splits POINTLIGHT : LightViewProjectionMatrix5 NUM_BONES : NumberOfBones - INSTANCING : UseInstancing + INSTANCING : UseInstancing BACKFACE_SHADOWS: BackfaceShadows + NUM_MORPH_TARGETS: NumberOfMorphTargets + NUM_TARGETS_BUFFERS: NumberOfTargetsBuffers } ForcedRenderState { @@ -177,8 +190,10 @@ MaterialDef Unshaded { HAS_GLOWMAP : GlowMap HAS_GLOWCOLOR : GlowColor NUM_BONES : NumberOfBones - INSTANCING : UseInstancing + INSTANCING : UseInstancing HAS_POINTSIZE : PointSize + NUM_MORPH_TARGETS: NumberOfMorphTargets + NUM_TARGETS_BUFFERS: NumberOfTargetsBuffers } } } \ No newline at end of file diff --git a/jme3-core/src/main/resources/Common/MatDefs/Misc/Unshaded.vert b/jme3-core/src/main/resources/Common/MatDefs/Misc/Unshaded.vert index 6cf9d9484..2c694d45d 100644 --- a/jme3-core/src/main/resources/Common/MatDefs/Misc/Unshaded.vert +++ b/jme3-core/src/main/resources/Common/MatDefs/Misc/Unshaded.vert @@ -1,6 +1,7 @@ #import "Common/ShaderLib/GLSLCompat.glsllib" #import "Common/ShaderLib/Skinning.glsllib" #import "Common/ShaderLib/Instancing.glsllib" +#import "Common/ShaderLib/MorphAnim.glsllib" attribute vec3 inPosition; @@ -38,6 +39,11 @@ void main(){ #endif vec4 modelSpacePos = vec4(inPosition, 1.0); + + #ifdef NUM_MORPH_TARGETS + Morph_Compute(modelSpacePos); + #endif + #ifdef NUM_BONES Skinning_Compute(modelSpacePos); #endif diff --git a/jme3-core/src/main/resources/Common/MatDefs/Misc/UnshadedNodes.j3md b/jme3-core/src/main/resources/Common/MatDefs/Misc/UnshadedNodes.j3md index b35c17a9d..1fdab8264 100644 --- a/jme3-core/src/main/resources/Common/MatDefs/Misc/UnshadedNodes.j3md +++ b/jme3-core/src/main/resources/Common/MatDefs/Misc/UnshadedNodes.j3md @@ -18,26 +18,26 @@ MaterialDef UnshadedNodes { ShaderNode GpuSkinning { Definition : BasicGPUSkinning : Common/MatDefs/ShaderNodes/HardwareSkinning/HardwareSkinning.j3sn Condition : NumberOfBones - InputMapping { + InputMappings { modelPosition = Global.position boneMatrices = MatParam.BoneMatrices boneWeight = Attr.inHWBoneWeight boneIndex = Attr.inHWBoneIndex } - OutputMapping { + OutputMappings { Global.position = modModelPosition } } ShaderNode UnshadedVert { Definition : CommonVert : Common/MatDefs/ShaderNodes/Common/CommonVert.j3sn - InputMapping { + InputMappings { worldViewProjectionMatrix = WorldParam.WorldViewProjectionMatrix modelPosition = Global.position.xyz texCoord1 = Attr.inTexCoord : ColorMap || (LightMap && !SeparateTexCoord) texCoord2 = Attr.inTexCoord2 : SeparateTexCoord vertColor = Attr.inColor : VertexColor } - OutputMapping { + OutputMappings { Global.position = projPosition } } @@ -89,7 +89,7 @@ MaterialDef UnshadedNodes { ShaderNode AlphaDiscardThreshold { Definition : AlphaDiscard : Common/MatDefs/ShaderNodes/Basic/AlphaDiscard.j3sn Condition : AlphaDiscardThreshold - InputMapping { + InputMappings { alpha = Global.outColor.a threshold = MatParam.AlphaDiscardThreshold } diff --git a/jme3-core/src/main/resources/Common/MatDefs/Misc/fakeLighting.j3md b/jme3-core/src/main/resources/Common/MatDefs/Misc/fakeLighting.j3md new file mode 100644 index 000000000..58797c112 --- /dev/null +++ b/jme3-core/src/main/resources/Common/MatDefs/Misc/fakeLighting.j3md @@ -0,0 +1,49 @@ +MaterialDef FakeLighting { + MaterialParameters { + Vector4 Color + } + + Technique { + WorldParameters { + WorldViewProjectionMatrix + NormalMatrix + } + + VertexShaderNodes { + ShaderNode Mat3Vec3Mult { + Definition: Mat3Vec3Mult: Common/MatDefs/ShaderNodes/Basic/Mat3Vec3Mult.j3sn + InputMappings { + matrix3 = WorldParam.NormalMatrix + vector3 = Attr.inNormal + } + OutputMappings { + } + } + ShaderNode CommonVert { + Definition: CommonVert: Common/MatDefs/ShaderNodes/Common/CommonVert.j3sn + InputMappings { + worldViewProjectionMatrix = WorldParam.WorldViewProjectionMatrix + modelPosition = Attr.inPosition + } + OutputMappings { + Global.position = projPosition + } + } + } + + + FragmentShaderNodes { + ShaderNode FakeLighting { + Definition: FakeLighting: Common/MatDefs/ShaderNodes/Misc/fakeLighting.j3sn + InputMappings { + inColor = MatParam.Color + normal = Mat3Vec3Mult.outVector3.xyz + } + OutputMappings { + Global.color = outColor + } + } + } + + } +} diff --git a/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Basic/ColorMix.j3sn b/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Basic/ColorMix.j3sn index 414615b6a..bfa07d93d 100644 --- a/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Basic/ColorMix.j3sn +++ b/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Basic/ColorMix.j3sn @@ -10,9 +10,9 @@ ShaderNodeDefinitions{ @output outColor the mixed color } Input { - vec4 color1 - vec4 color2 - float factor + vec4 color1 vec4(1.0) + vec4 color2 vec4(1.0) + float factor 0.5 } Output { vec4 outColor diff --git a/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Basic/ColorMult.j3sn b/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Basic/ColorMult.j3sn index 4d1f44328..657976e8a 100644 --- a/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Basic/ColorMult.j3sn +++ b/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Basic/ColorMult.j3sn @@ -9,8 +9,8 @@ ShaderNodeDefinitions{ @output outColor the resulting color } Input { - vec4 color1 - vec4 color2 + vec4 color1 vec4(1.0) + vec4 color2 vec4(1.0) } Output { vec4 outColor diff --git a/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Basic/Mat3Vec3Mult.j3sn b/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Basic/Mat3Vec3Mult.j3sn new file mode 100644 index 000000000..019edb839 --- /dev/null +++ b/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Basic/Mat3Vec3Mult.j3sn @@ -0,0 +1,31 @@ +ShaderNodeDefinitions{ + ShaderNodeDefinition Mat3Vec3Mult { + //Vertex/Fragment + Type: Vertex + + //Shader GLSL: + Shader GLSL100: Common/MatDefs/ShaderNodes/Basic/Mat3Vec3Mult100.frag + + Documentation{ + //type documentation here. This is optional but recommended + + //@input + @input mat3 matrix3 the mat3 + @input vec3 vector3 the vec3 + + //@output + @output vec3 outVector3 the output vector + } + Input { + //all the node inputs + // + mat3 matrix3 + vec3 vector3 + } + Output { + //all the node outputs + // + vec3 outVector3 + } + } +} \ No newline at end of file diff --git a/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Basic/Mat3Vec3Mult100.frag b/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Basic/Mat3Vec3Mult100.frag new file mode 100644 index 000000000..f1a29fd2c --- /dev/null +++ b/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Basic/Mat3Vec3Mult100.frag @@ -0,0 +1,3 @@ +void main(){ + outVector3 = matrix3 * vector3; +} diff --git a/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Common/Billboard.j3sn b/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Common/Billboard.j3sn new file mode 100644 index 000000000..a9421de4c --- /dev/null +++ b/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Common/Billboard.j3sn @@ -0,0 +1,35 @@ +ShaderNodeDefinitions{ + ShaderNodeDefinition Billboard { + //Vertex/Fragment + Type: Vertex + + //Shader GLSL: + Shader GLSL100: Common/MatDefs/ShaderNodes/Common/Billboard100.frag + + Documentation{ + //type documentation here. This is optional but recommended + + //@input + @input mat4 worldViewMatrix The worldView matrix + @input mat4 projectionMatrix The projection matrix + @input vec3 modelPosition the vertex position + @input float scale the scale of the billboard (defautl 1) + + //@output + @output vec4 projPosition The position in projection space + } + Input { + //all the node inputs + // + mat4 worldViewMatrix + mat4 projectionMatrix + vec3 modelPosition + float scale 1 + } + Output { + //all the node outputs + // + vec4 projPosition + } + } +} \ No newline at end of file diff --git a/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Common/Billboard100.frag b/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Common/Billboard100.frag new file mode 100644 index 000000000..d85880760 --- /dev/null +++ b/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Common/Billboard100.frag @@ -0,0 +1,19 @@ +void main(){ + // First colunm. + worldViewMatrix[0][0] = scale; + worldViewMatrix[0][1] = 0.0; + worldViewMatrix[0][2] = 0.0; + + // Second colunm. + worldViewMatrix[1][0] = 0.0; + worldViewMatrix[1][1] = scale; + worldViewMatrix[1][2] = 0.0; + + // Thrid colunm. + worldViewMatrix[2][0] = 0.0; + worldViewMatrix[2][1] = 0.0; + worldViewMatrix[2][2] = scale; + + vec4 position = worldViewMatrix * vec4(modelPosition,1.0); + projPosition = projectionMatrix * position; +} diff --git a/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Common/FixedScale.j3sn b/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Common/FixedScale.j3sn new file mode 100644 index 000000000..48a920474 --- /dev/null +++ b/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Common/FixedScale.j3sn @@ -0,0 +1,41 @@ +ShaderNodeDefinitions{ + ShaderNodeDefinition FixedScale { + //Vertex/Fragment + Type: Vertex + + //Shader GLSL: + Shader GLSL100: Common/MatDefs/ShaderNodes/Common/FixedScale100.frag + + Documentation{ + //type documentation here. This is optional but recommended + + //@input + @input vec4 viewport The viewport information (right, top, left, bottom) + @input vec3 cameraDir The direction of the camera + @input vec3 cameraPos The position of the camera + @input mat4 worldMatrix The world matrix + @input mat4 projectionMatrix The projection matrix + @input vec3 modelPosition the vertex position + @input float spriteHeight the desired image height in pixel + + //@output + @output float scale The constant scale + } + Input { + //all the node inputs + // + vec4 viewport + vec3 cameraDir + vec3 cameraPos + mat4 worldMatrix + mat4 projectionMatrix + vec3 modelPosition + float spriteHeight 10.0 + } + Output { + //all the node outputs + // + float scale + } + } +} \ No newline at end of file diff --git a/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Common/FixedScale100.frag b/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Common/FixedScale100.frag new file mode 100644 index 000000000..98a05d116 --- /dev/null +++ b/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Common/FixedScale100.frag @@ -0,0 +1,8 @@ +void main(){ + vec4 worldPos = worldMatrix * vec4(0.0, 0.0, 0.0, 1.0); + vec3 dir = worldPos.xyz - cameraPos; + float distance = dot(cameraDir, dir); + float m11 = projectionMatrix[1][1]; + float halfHeight = (viewport.w - viewport.y) * 0.5; + scale = ((distance/halfHeight) * spriteHeight)/m11; +} diff --git a/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Common/texCoord.j3sn b/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Common/texCoord.j3sn new file mode 100644 index 000000000..fcf1bddb9 --- /dev/null +++ b/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Common/texCoord.j3sn @@ -0,0 +1,57 @@ +ShaderNodeDefinitions{ + ShaderNodeDefinition TexCoord { + //Vertex/Fragment + Type: Vertex + + //Shader GLSL: + Shader GLSL100: Common/MatDefs/ShaderNodes/Common/texCoord100.frag + + Documentation{ + //type documentation here. This is optional but recommended + + //@input + @input vec2 texCoord The input texture Coord + @input vec2 texCoord2 The input texture Coord + @input vec2 texCoord3 The input texture Coord + @input vec2 texCoord4 The input texture Coord + @input vec2 texCoord5 The input texture Coord + @input vec2 texCoord6 The input texture Coord + @input vec2 texCoord7 The input texture Coord + @input vec2 texCoord8 The input texture Coord + + //@output + @output vec2 texCoord The input texture Coord + @output vec2 texCoord2 The input texture Coord + @output vec2 texCoord3 The input texture Coord + @output vec2 texCoord4 The input texture Coord + @output vec2 texCoord5 The input texture Coord + @output vec2 texCoord6 The input texture Coord + @output vec2 texCoord7 The input texture Coord + @output vec2 texCoord8 The input texture Coord + } + Input { + //all the node inputs + // + vec2 texCoord + vec2 texCoord2 + vec2 texCoord3 + vec2 texCoord4 + vec2 texCoord5 + vec2 texCoord6 + vec2 texCoord7 + vec2 texCoord8 + } + Output { + //all the node outputs + // + vec2 texCoord + vec2 texCoord2 + vec2 texCoord3 + vec2 texCoord4 + vec2 texCoord5 + vec2 texCoord6 + vec2 texCoord7 + vec2 texCoord8 + } + } +} \ No newline at end of file diff --git a/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Common/texCoord100.frag b/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Common/texCoord100.frag new file mode 100644 index 000000000..61a3f2e67 --- /dev/null +++ b/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Common/texCoord100.frag @@ -0,0 +1,2 @@ +void main(){ +} diff --git a/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Math/Mult.j3sn b/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Math/Mult.j3sn index 8a44949b4..2820438d5 100644 --- a/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Math/Mult.j3sn +++ b/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Math/Mult.j3sn @@ -9,8 +9,8 @@ ShaderNodeDefinitions{ @output outFloat the resulting coord } Input { - float float1 - float float2 + float float1 1.0 + float float2 1.0 } Output { float outFloat diff --git a/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Math/MultVec2.j3sn b/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Math/MultVec2.j3sn index ab30d5015..dc6d4fcb1 100644 --- a/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Math/MultVec2.j3sn +++ b/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Math/MultVec2.j3sn @@ -9,8 +9,8 @@ ShaderNodeDefinitions{ @output outCoord the resulting coord } Input { - vec2 coord1 - vec2 coord2 + vec2 coord1 vec2(1.0) + vec2 coord2 vec2(1.0) } Output { vec2 outCoord diff --git a/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Math/MultVec3.j3sn b/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Math/MultVec3.j3sn index ab3fdb4c1..3dcd63fbe 100644 --- a/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Math/MultVec3.j3sn +++ b/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Math/MultVec3.j3sn @@ -9,8 +9,8 @@ ShaderNodeDefinitions{ @output outPos the resulting position } Input { - vec2 pos1 - vec2 pos2 + vec3 pos1 vec3(1.0) + vec3 pos2 vec3(1.0) } Output { vec2 outPos diff --git a/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Misc/Dashed.j3sn b/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Misc/Dashed.j3sn new file mode 100644 index 000000000..87f235121 --- /dev/null +++ b/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Misc/Dashed.j3sn @@ -0,0 +1,37 @@ +ShaderNodeDefinitions{ + ShaderNodeDefinition Dashed { + //Vertex/Fragment + Type: Fragment + + //Shader GLSL: + Shader GLSL100: Common/MatDefs/ShaderNodes/Misc/Dashed100.frag + + Documentation{ + //type documentation here. This is optional but recommended + Output a dashed line (better have a LINE mode mesh) + + //@input + @input vec2 texCoord the texture coordinates + @input vec4 inColor The input color + + + //@output + @output vec4 outColor The modified output color + } + Input { + //all the node inputs + // + vec2 texCoord + vec4 inColor + vec4 startPos + vec2 resolution + + + } + Output { + //all the node outputs + // + vec4 outColor + } + } +} \ No newline at end of file diff --git a/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Misc/Dashed100.frag b/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Misc/Dashed100.frag new file mode 100644 index 000000000..4fa7babec --- /dev/null +++ b/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Misc/Dashed100.frag @@ -0,0 +1,10 @@ +void main(){ + startPos.xy = (startPos * 0.5 + 0.5).xy * resolution; + float len = distance(gl_FragCoord.xy,startPos.xy); + outColor = inColor; + float factor = float(int(len * 0.25)); + if(mod(factor, 2.0) > 0.0){ + discard; + } + +} diff --git a/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Misc/PerspectiveDivide.j3sn b/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Misc/PerspectiveDivide.j3sn new file mode 100644 index 000000000..61ada6c2c --- /dev/null +++ b/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Misc/PerspectiveDivide.j3sn @@ -0,0 +1,30 @@ +ShaderNodeDefinitions{ + ShaderNodeDefinition PerspectiveDivide { + //Vertex/Fragment + Type: Vertex + + //Shader GLSL: + Shader GLSL100: Common/MatDefs/ShaderNodes/Misc/PerspectiveDivide100.frag + + Documentation{ + //type documentation here. This is optional but recommended + performs inVec.xyz / inVec.w + + //@input + @input vec4 inVec The input vector + + //@output + @output vec4 outVec The modified output vector + } + Input { + //all the node inputs + // + vec4 inVec + } + Output { + //all the node outputs + // + vec4 outVec + } + } +} \ No newline at end of file diff --git a/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Misc/PerspectiveDivide100.frag b/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Misc/PerspectiveDivide100.frag new file mode 100644 index 000000000..0e4f1d5be --- /dev/null +++ b/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Misc/PerspectiveDivide100.frag @@ -0,0 +1,3 @@ +void main(){ + outVec = vec4(inVec.xyz / inVec.w,1.0); +} diff --git a/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Misc/fakeLighting.j3sn b/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Misc/fakeLighting.j3sn new file mode 100644 index 000000000..c47e1bf61 --- /dev/null +++ b/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Misc/fakeLighting.j3sn @@ -0,0 +1,33 @@ +ShaderNodeDefinitions{ + ShaderNodeDefinition FakeLighting { + //Vertex/Fragment + Type: Fragment + + //Shader GLSL: + Shader GLSL100: Common/MatDefs/ShaderNodes/Misc/fakeLighting100.frag + + Documentation{ + //type documentation here. This is optional but recommended + + //@input + @input vec4 inColor The input color + @input vec3 normal The normal in view space + + + //@output + @output vec4 outColor The modified output color + } + Input { + //all the node inputs + // + vec4 inColor + vec3 normal + + } + Output { + //all the node outputs + // + vec4 outColor + } + } +} \ No newline at end of file diff --git a/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Misc/fakeLighting100.frag b/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Misc/fakeLighting100.frag new file mode 100644 index 000000000..9b6b98b09 --- /dev/null +++ b/jme3-core/src/main/resources/Common/MatDefs/ShaderNodes/Misc/fakeLighting100.frag @@ -0,0 +1,9 @@ +void main(){ + + vec4 dark = inColor * 0.3; + vec4 bright = min(inColor * 4.0, 1.0); + normal = normalize(normal); + vec3 dir = vec3(0,0,1); + float factor = dot(dir, normal); + outColor = mix(dark, bright, factor); +} diff --git a/jme3-core/src/main/resources/Common/MatDefs/Shadow/PostShadow.vert b/jme3-core/src/main/resources/Common/MatDefs/Shadow/PostShadow.vert index 417427155..15be15f8d 100644 --- a/jme3-core/src/main/resources/Common/MatDefs/Shadow/PostShadow.vert +++ b/jme3-core/src/main/resources/Common/MatDefs/Shadow/PostShadow.vert @@ -49,10 +49,13 @@ const mat4 biasMat = mat4(0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5, 0.0, 0.5, 0.5, 0.5, 1.0); - void main(){ vec4 modelSpacePos = vec4(inPosition, 1.0); - + + #ifdef NUM_MORPH_TARGETS + Morph_Compute(modelSpacePos); + #endif + #ifdef NUM_BONES Skinning_Compute(modelSpacePos); #endif diff --git a/jme3-core/src/main/resources/Common/MatDefs/Shadow/PreShadow.vert b/jme3-core/src/main/resources/Common/MatDefs/Shadow/PreShadow.vert index 4e3023d7f..7157eea30 100644 --- a/jme3-core/src/main/resources/Common/MatDefs/Shadow/PreShadow.vert +++ b/jme3-core/src/main/resources/Common/MatDefs/Shadow/PreShadow.vert @@ -1,6 +1,8 @@ #import "Common/ShaderLib/GLSLCompat.glsllib" #import "Common/ShaderLib/Instancing.glsllib" #import "Common/ShaderLib/Skinning.glsllib" +#import "Common/ShaderLib/MorphAnim.glsllib" + attribute vec3 inPosition; attribute vec2 inTexCoord; @@ -8,7 +10,11 @@ varying vec2 texCoord; void main(){ vec4 modelSpacePos = vec4(inPosition, 1.0); - + + #ifdef NUM_MORPH_TARGETS + Morph_Compute(modelSpacePos, modelSpaceNorm); + #endif + #ifdef NUM_BONES Skinning_Compute(modelSpacePos); #endif diff --git a/jme3-core/src/main/resources/Common/ShaderLib/Instancing.glsllib b/jme3-core/src/main/resources/Common/ShaderLib/Instancing.glsllib index 5a45ed2f2..37c3a40cf 100644 --- a/jme3-core/src/main/resources/Common/ShaderLib/Instancing.glsllib +++ b/jme3-core/src/main/resources/Common/ShaderLib/Instancing.glsllib @@ -25,6 +25,7 @@ uniform mat4 g_WorldViewMatrix; uniform mat4 g_WorldViewProjectionMatrix; uniform mat4 g_ViewProjectionMatrix; uniform mat3 g_NormalMatrix; +uniform mat3 g_WorldNormalMatrix; #if defined INSTANCING @@ -101,7 +102,7 @@ vec3 TransformNormal(vec3 normal) { } vec3 TransformWorldNormal(vec3 normal) { - return normalize((g_WorldMatrix * vec4(normal,0.0)).xyz); + return normalize(g_WorldNormalMatrix * normal); } diff --git a/jme3-core/src/main/resources/Common/ShaderLib/MorphAnim.glsllib b/jme3-core/src/main/resources/Common/ShaderLib/MorphAnim.glsllib new file mode 100644 index 000000000..68c26f4ae --- /dev/null +++ b/jme3-core/src/main/resources/Common/ShaderLib/MorphAnim.glsllib @@ -0,0 +1,212 @@ +/** +A glsllib that perform morph animation. +Note that it only handles morphing position, normals and tangents. +*/ +#ifdef NUM_MORPH_TARGETS + vec3 dummy_norm = vec3(0.0); + vec3 dummy_tan = vec3(0.0); + #define NUM_BUFFERS NUM_MORPH_TARGETS * NUM_TARGETS_BUFFERS + #if (NUM_BUFFERS > 0) + uniform float m_MorphWeights[NUM_MORPH_TARGETS]; + attribute vec3 inMorphTarget0; + #endif + #if (NUM_BUFFERS > 1) + attribute vec3 inMorphTarget1; + #endif + #if (NUM_BUFFERS > 2) + attribute vec3 inMorphTarget2; + #endif + #if (NUM_BUFFERS > 3) + attribute vec3 inMorphTarget3; + #endif + #if (NUM_BUFFERS > 4) + attribute vec3 inMorphTarget4; + #endif + #if (NUM_BUFFERS > 5) + attribute vec3 inMorphTarget5; + #endif + #if (NUM_BUFFERS > 6) + attribute vec3 inMorphTarget6; + #endif + #if (NUM_BUFFERS > 7) + attribute vec3 inMorphTarget7; + #endif + #if (NUM_BUFFERS > 8) + attribute vec3 inMorphTarget8; + #endif + #if (NUM_BUFFERS > 9) + attribute vec3 inMorphTarget9; + #endif + #if (NUM_BUFFERS > 10) + attribute vec3 inMorphTarget10; + #endif + #if (NUM_BUFFERS > 11) + attribute vec3 inMorphTarget11; + #endif + #if (NUM_BUFFERS > 12) + attribute vec3 inMorphTarget12; + #endif + #if (NUM_BUFFERS > 13) + attribute vec3 inMorphTarget13; + #endif + + void Morph_Compute_Pos(inout vec4 pos){ + #if (NUM_TARGETS_BUFFERS == 1) + #if (NUM_MORPH_TARGETS > 0) + pos.xyz += m_MorphWeights[0] * inMorphTarget0; + #endif + #if (NUM_MORPH_TARGETS > 1) + pos.xyz += m_MorphWeights[1] * inMorphTarget1; + #endif + #if (NUM_MORPH_TARGETS > 2) + pos.xyz += m_MorphWeights[2] * inMorphTarget2; + #endif + #if (NUM_MORPH_TARGETS > 3) + pos.xyz += m_MorphWeights[3] * inMorphTarget3; + #endif + #if (NUM_MORPH_TARGETS > 4) + pos.xyz += m_MorphWeights[4] * inMorphTarget4; + #endif + #if (NUM_MORPH_TARGETS > 5) + pos.xyz += m_MorphWeights[5] * inMorphTarget5; + #endif + #if (NUM_MORPH_TARGETS > 6) + pos.xyz += m_MorphWeights[6] * inMorphTarget6; + #endif + #if (NUM_MORPH_TARGETS > 7) + pos.xyz += m_MorphWeights[7] * inMorphTarget7; + #endif + #if (NUM_MORPH_TARGETS > 8) + pos.xyz += m_MorphWeights[8] * inMorphTarget8; + #endif + #if (NUM_MORPH_TARGETS > 9) + pos.xyz += m_MorphWeights[9] * inMorphTarget9; + #endif + #if (NUM_MORPH_TARGETS > 10) + pos.xyz += m_MorphWeights[10] * inMorphTarget10; + #endif + #if (NUM_MORPH_TARGETS > 11) + pos.xyz += m_MorphWeights[11] * inMorphTarget11; + #endif + #if (NUM_MORPH_TARGETS > 12) + pos.xyz += m_MorphWeights[12] * inMorphTarget12; + #endif + #if (NUM_MORPH_TARGETS > 13) + pos.xyz += m_MorphWeights[13] * inMorphTarget13; + #endif + #endif + } + + float Get_Inverse_Weights_Sum(){ + float sum = 0; + for( int i = 0;i < NUM_MORPH_TARGETS; i++){ + sum += m_MorphWeights[i]; + } + return 1.0 / max(1.0, sum); + } + + void Morph_Compute_Pos_Norm(inout vec4 pos, inout vec3 norm){ + #if (NUM_TARGETS_BUFFERS == 2) + // weight sum may be over 1.0. It's totallyvalid for position + // but for normals. the weights needs to be normalized. + float invWeightsSum = Get_Inverse_Weights_Sum(); + #if (NUM_BUFFERS > 1) + pos.xyz += m_MorphWeights[0] * inMorphTarget0; + norm += m_MorphWeights[0] * invWeightsSum * inMorphTarget1; + #endif + #if (NUM_BUFFERS > 3) + pos.xyz += m_MorphWeights[1] * inMorphTarget2; + norm.xyz += m_MorphWeights[1] * invWeightsSum * inMorphTarget3; + #endif + #if (NUM_BUFFERS > 5) + pos.xyz += m_MorphWeights[2] * inMorphTarget4; + norm += m_MorphWeights[2] * invWeightsSum * inMorphTarget5; + #endif + #if (NUM_BUFFERS > 7) + pos.xyz += m_MorphWeights[3] * inMorphTarget6; + norm += m_MorphWeights[3] * invWeightsSum * inMorphTarget7; + #endif + #if (NUM_BUFFERS > 9) + pos.xyz += m_MorphWeights[4] * inMorphTarget8; + norm += m_MorphWeights[4] * invWeightsSum * inMorphTarget9; + #endif + #if (NUM_BUFFERS > 11) + pos.xyz += m_MorphWeights[5] * inMorphTarget10; + norm += m_MorphWeights[5] * invWeightsSum * inMorphTarget11; + #endif + #if (NUM_BUFFERS > 13) + pos.xyz += m_MorphWeights[6] * inMorphTarget12; + norm += m_MorphWeights[6] * invWeightsSum * inMorphTarget13; + #endif + #endif + } + + void Morph_Compute_Pos_Norm_Tan(inout vec4 pos, inout vec3 norm, inout vec3 tan){ + #if (NUM_TARGETS_BUFFERS == 3) + // weight sum may be over 1.0. It's totallyvalid for position + // but for normals. the weights needs to be normalized. + float invWeightsSum = Get_Inverse_Weights_Sum(); + #if (NUM_BUFFERS > 2) + float normWeight = m_MorphWeights[0] * invWeightsSum; + pos.xyz += m_MorphWeights[0] * inMorphTarget0; + norm += normWeight * inMorphTarget1; + tan += normWeight * inMorphTarget2; + #endif + #if (NUM_BUFFERS > 5) + float normWeight = m_MorphWeights[1] * invWeightsSum; + pos.xyz += m_MorphWeights[1] * inMorphTarget3; + norm += normWeight * inMorphTarget4; + tan += normWeight * inMorphTarget5; + #endif + #if (NUM_BUFFERS > 8) + float normWeight = m_MorphWeights[2] * invWeightsSum; + pos.xyz += m_MorphWeights[2] * inMorphTarget6; + norm += normWeight * inMorphTarget7; + tan += normWeight * inMorphTarget8; + #endif + #if (NUM_BUFFERS > 11) + float normWeight = m_MorphWeights[3] * invWeightsSum; + pos.xyz += m_MorphWeights[3] * inMorphTarget9; + norm += normWeight * inMorphTarget10; + tan += normWeight * inMorphTarget11; + #endif + #endif + } + + void Morph_Compute(inout vec4 pos){ + #if (NUM_TARGETS_BUFFERS == 2) + Morph_Compute_Pos_Norm(pos,dummy_norm); + return; + #elif (NUM_TARGETS_BUFFERS == 3) + Morph_Compute_Pos_Norm_Tan(pos, dummy_norm, dummy_tan); + return; + #endif + Morph_Compute_Pos(pos); + } + + void Morph_Compute(inout vec4 pos, inout vec3 norm){ + #if (NUM_TARGETS_BUFFERS == 1) + Morph_Compute_Pos(pos); + return; + #elif (NUM_TARGETS_BUFFERS == 3) + Morph_Compute_Pos_Norm_Tan(pos, dummy_norm, dummy_tan); + return; + #elif (NUM_TARGETS_BUFFERS == 2) + Morph_Compute_Pos_Norm(pos, norm); + #endif + } + + void Morph_Compute(inout vec4 pos, inout vec3 norm, inout vec3 tan){ + #if (NUM_TARGETS_BUFFERS == 1) + Morph_Compute_Pos(pos); + return; + #elif (NUM_TARGETS_BUFFERS == 2) + Morph_Compute_Pos_Norm(pos, norm); + tan = normalize(tan - dot(tan, norm) * norm); + return; + #elif (NUM_TARGETS_BUFFERS == 3) + Morph_Compute_Pos_Norm_Tan(pos, norm, tan); + #endif + } + +#endif diff --git a/jme3-core/src/main/resources/Common/ShaderLib/PBR.glsllib b/jme3-core/src/main/resources/Common/ShaderLib/PBR.glsllib index c5201f12f..ee4edac8e 100644 --- a/jme3-core/src/main/resources/Common/ShaderLib/PBR.glsllib +++ b/jme3-core/src/main/resources/Common/ShaderLib/PBR.glsllib @@ -9,50 +9,6 @@ vec3 F_Shlick(float vh, vec3 F0){ return mix(F0, vec3(1.0, 1.0, 1.0), fresnelFact); } -void PBR_ComputeDirectLightSpecWF(vec3 normal, vec3 lightDir, vec3 viewDir, - vec3 lightColor, vec3 specColor, float roughness, float ndotv, - out vec3 outDiffuse, out vec3 outSpecular){ - // Compute halfway vector. - vec3 halfVec = normalize(lightDir + viewDir); - - // Compute ndotl, ndoth, vdoth terms which are needed later. - float ndotl = max( dot(normal, lightDir), 0.0); - float ndoth = max( dot(normal, halfVec), 0.0); - float hdotv = max( dot(viewDir, halfVec), 0.0); - - // Compute diffuse using energy-conserving Lambert. - // Alternatively, use Oren-Nayar for really rough - // materials or if you have lots of processing power ... - outDiffuse = vec3(ndotl) * lightColor; - - //cook-torrence, microfacet BRDF : http://blog.selfshadow.com/publications/s2013-shading-course/karis/s2013_pbs_epic_notes_v2.pdf - - float alpha = roughness * roughness; - - //D, GGX normaal Distribution function - float alpha2 = alpha * alpha; - float sum = ((ndoth * ndoth) * (alpha2 - 1.0) + 1.0); - float denom = PI * sum * sum; - float D = alpha2 / denom; - - // Compute Fresnel function via Schlick's approximation. - vec3 fresnel = F_Shlick(hdotv, specColor); - - //G Shchlick GGX Gometry shadowing term, k = alpha/2 - float k = alpha * 0.5; - - // UE4 way to optimise shlick GGX Gometry shadowing term - //http://graphicrants.blogspot.co.uk/2013/08/specular-brdf-reference.html - float G_V = ndotv + sqrt( (ndotv - ndotv * k) * ndotv + k ); - float G_L = ndotl + sqrt( (ndotl - ndotl * k) * ndotl + k ); - // the max here is to avoid division by 0 that may cause some small glitches. - float G = 1.0/max( G_V * G_L ,0.01); - - float specular = D * G * ndotl; - - outSpecular = fresnel * vec3(specular) * lightColor; -} - vec3 sphericalHarmonics( const in vec3 normal, const vec3 sph[9] ){ float x = normal.x; float y = normal.y; @@ -76,8 +32,8 @@ vec3 sphericalHarmonics( const in vec3 normal, const vec3 sph[9] ){ } -void PBR_ComputeDirectLight(vec3 normal, vec3 lightDir, vec3 viewDir, - vec3 lightColor, float fZero, float roughness, float ndotv, +float PBR_ComputeDirectLight(vec3 normal, vec3 lightDir, vec3 viewDir, + vec3 lightColor, vec3 fZero, float roughness, float ndotv, out vec3 outDiffuse, out vec3 outSpecular){ // Compute halfway vector. vec3 halfVec = normalize(lightDir + viewDir); @@ -103,7 +59,7 @@ void PBR_ComputeDirectLight(vec3 normal, vec3 lightDir, vec3 viewDir, float D = alpha2 / denom; // Compute Fresnel function via Schlick's approximation. - float fresnel = fZero + ( 1.0 - fZero ) * pow( 2.0, (-5.55473 * hdotv - 6.98316) * hdotv); + vec3 fresnel = F_Shlick(hdotv, fZero); //G Shchlick GGX Gometry shadowing term, k = alpha/2 float k = alpha * 0.5; @@ -124,9 +80,10 @@ void PBR_ComputeDirectLight(vec3 normal, vec3 lightDir, vec3 viewDir, // the max here is to avoid division by 0 that may cause some small glitches. float G = 1.0/max( G_V * G_L ,0.01); - float specular = D * fresnel * G * ndotl; + float specular = D * G * ndotl; - outSpecular = vec3(specular) * lightColor; + outSpecular = vec3(specular) * fresnel * lightColor; + return hdotv; } vec3 integrateBRDFApprox( const in vec3 specular, float roughness, float NoV ){ @@ -164,6 +121,92 @@ vec3 ApproximateSpecularIBLPolynomial(samplerCube envMap, vec3 SpecularColor , f } +float renderProbe(vec3 viewDir, vec3 worldPos, vec3 normal, vec3 norm, float Roughness, vec4 diffuseColor, vec4 specularColor, float ndotv, vec3 ao, mat4 lightProbeData,vec3 shCoeffs[9],samplerCube prefEnvMap, inout vec3 color ){ + + // lightProbeData is a mat4 with this layout + // 3x3 rot mat| + // 0 1 2 | 3 + // 0 | ax bx cx | px | ) + // 1 | ay by cy | py | probe position + // 2 | az bz cz | pz | ) + // --|----------| + // 3 | sx sy sz sp | -> 1/probe radius + nbMipMaps + // --scale-- + // parallax fix for spherical / obb bounds and probe blending from + // from https://seblagarde.wordpress.com/2012/09/29/image-based-lighting-approaches-and-parallax-corrected-cubemap/ + vec3 rv = reflect(-viewDir, normal); + vec4 probePos = lightProbeData[3]; + float invRadius = fract( probePos.w); + float nbMipMaps = probePos.w - invRadius; + vec3 direction = worldPos - probePos.xyz; + float ndf = 0.0; + + if(lightProbeData[0][3] != 0.0){ + // oriented box probe + mat3 wToLocalRot = mat3(lightProbeData); + wToLocalRot = inverse(wToLocalRot); + vec3 scale = vec3(lightProbeData[0][3], lightProbeData[1][3], lightProbeData[2][3]); + #if NB_PROBES >= 2 + // probe blending + // compute fragment position in probe local space + vec3 localPos = wToLocalRot * worldPos; + localPos -= probePos.xyz; + // compute normalized distance field + vec3 localDir = abs(localPos); + localDir /= scale; + ndf = max(max(localDir.x, localDir.y), localDir.z); + #endif + // parallax fix + vec3 rayLs = wToLocalRot * rv; + rayLs /= scale; + + vec3 positionLs = worldPos - probePos.xyz; + positionLs = wToLocalRot * positionLs; + positionLs /= scale; + + vec3 unit = vec3(1.0); + vec3 firstPlaneIntersect = (unit - positionLs) / rayLs; + vec3 secondPlaneIntersect = (-unit - positionLs) / rayLs; + vec3 furthestPlane = max(firstPlaneIntersect, secondPlaneIntersect); + float distance = min(min(furthestPlane.x, furthestPlane.y), furthestPlane.z); + + vec3 intersectPositionWs = worldPos + rv * distance; + rv = intersectPositionWs - probePos.xyz; + + } else { + // spherical probe + // paralax fix + rv = invRadius * direction + rv; + + #if NB_PROBES >= 2 + // probe blending + float dist = sqrt(dot(direction, direction)); + ndf = dist * invRadius; + #endif + } + + vec3 indirectDiffuse = vec3(0.0); + vec3 indirectSpecular = vec3(0.0); + indirectDiffuse = sphericalHarmonics(normal.xyz, shCoeffs) * diffuseColor.rgb; + vec3 dominantR = getSpecularDominantDir( normal, rv.xyz, Roughness * Roughness ); + indirectSpecular = ApproximateSpecularIBLPolynomial(prefEnvMap, specularColor.rgb, Roughness, ndotv, dominantR, nbMipMaps); + + #ifdef HORIZON_FADE + //horizon fade from http://marmosetco.tumblr.com/post/81245981087 + float horiz = dot(rv, norm); + float horizFadePower = 1.0 - Roughness; + horiz = clamp( 1.0 + horizFadePower * horiz, 0.0, 1.0 ); + horiz *= horiz; + indirectSpecular *= vec3(horiz); + #endif + + vec3 indirectLighting = (indirectDiffuse + indirectSpecular) * ao; + + color = indirectLighting * step( 0.0, probePos.w); + return ndf; +} + + diff --git a/jme3-core/src/main/resources/Common/ShaderLib/Shadows.glsllib b/jme3-core/src/main/resources/Common/ShaderLib/Shadows.glsllib index baf003f88..c7c6b8851 100644 --- a/jme3-core/src/main/resources/Common/ShaderLib/Shadows.glsllib +++ b/jme3-core/src/main/resources/Common/ShaderLib/Shadows.glsllib @@ -3,7 +3,10 @@ // gather functions are declared to work on shadowmaps #extension GL_ARB_gpu_shader5 : enable #define IVEC2 ivec2 - #ifdef HARDWARE_SHADOWS + #if defined GL_ES + #define SHADOWMAP sampler2D + #define SHADOWCOMPARE(tex,coord) step(coord.z, texture2DProj(tex, coord).r) + #elif defined HARDWARE_SHADOWS #define SHADOWMAP sampler2DShadow #define SHADOWCOMPAREOFFSET(tex,coord,offset) textureProjOffset(tex, coord, offset) #define SHADOWCOMPARE(tex,coord) textureProj(tex, coord) diff --git a/jme3-core/src/main/resources/Common/Textures/dot.png b/jme3-core/src/main/resources/Common/Textures/dot.png new file mode 100644 index 000000000..59605f195 Binary files /dev/null and b/jme3-core/src/main/resources/Common/Textures/dot.png differ diff --git a/jme3-core/src/main/resources/com/jme3/asset/General.cfg b/jme3-core/src/main/resources/com/jme3/asset/General.cfg index 80b038ba6..2b3b25d93 100644 --- a/jme3-core/src/main/resources/com/jme3/asset/General.cfg +++ b/jme3-core/src/main/resources/com/jme3/asset/General.cfg @@ -25,3 +25,4 @@ LOADER com.jme3.shader.plugins.GLSLLoader : vert, frag, geom, tsctrl, tseval, gl LOADER com.jme3.scene.plugins.fbx.FbxLoader : fbx LOADER com.jme3.scene.plugins.gltf.GltfLoader : gltf LOADER com.jme3.scene.plugins.gltf.BinLoader : bin +LOADER com.jme3.scene.plugins.gltf.GlbLoader : glb diff --git a/jme3-core/src/plugins/java/com/jme3/export/binary/BinaryExporter.java b/jme3-core/src/plugins/java/com/jme3/export/binary/BinaryExporter.java index eb12bf908..3ad1b8b22 100644 --- a/jme3-core/src/plugins/java/com/jme3/export/binary/BinaryExporter.java +++ b/jme3-core/src/plugins/java/com/jme3/export/binary/BinaryExporter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -255,7 +255,7 @@ public class BinaryExporter implements JmeExporter { } ByteArrayOutputStream out = new ByteArrayOutputStream(); - // write out data to a seperate stream + // write out data to a separate stream int location = 0; // keep track of location for each piece HashMap> alreadySaved = new HashMap>( diff --git a/jme3-core/src/plugins/java/com/jme3/export/binary/BinaryInputCapsule.java b/jme3-core/src/plugins/java/com/jme3/export/binary/BinaryInputCapsule.java index 794617393..cca304a3b 100644 --- a/jme3-core/src/plugins/java/com/jme3/export/binary/BinaryInputCapsule.java +++ b/jme3-core/src/plugins/java/com/jme3/export/binary/BinaryInputCapsule.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -975,7 +975,7 @@ final class BinaryInputCapsule implements InputCapsule { /* * UTF-8 crash course: * - * UTF-8 codepoints map to UTF-16 codepoints and vv, which is what Java uses for it's Strings. + * UTF-8 codepoints map to UTF-16 codepoints and vv, which is what Java uses for its Strings. * (so a UTF-8 codepoint can contain all possible values for a Java char) * * A UTF-8 codepoint can be 1, 2 or 3 bytes long. How long a codepint is can be told by reading the first byte: @@ -1003,7 +1003,7 @@ final class BinaryInputCapsule implements InputCapsule { /* * @see ISSUE 276 * - * We'll transfer the bytes into a seperate byte array. + * We'll transfer the bytes into a separate byte array. * While we do that we'll take the opportunity to check if the byte data is valid UTF-8. * * If it is not UTF-8 it is most likely saved with the BinaryOutputCapsule bug, that saves Strings using their native @@ -1020,7 +1020,7 @@ final class BinaryInputCapsule implements InputCapsule { * * It is impossible to detect which one-byte encoding is used. Since UTF8 and practically all 1-byte encodings share the most * used characters (the "none-high" ones) parsing them will give the same result. However, not all byte sequences are legal in - * UTF-8 (see explantion above). If not UTF-8 encoded content is detected we therefor fallback on latin1. We also log a warning. + * UTF-8 (see explantion above). If not UTF-8 encoded content is detected we therefore fall back on latin1. We also log a warning. * * By this method we detect all use of 1 byte encoding if they: * - use a "high" codepoint after a "low" codepoint or a sequence of codepoints that is valid as UTF-8 bytes, that starts with 1000 @@ -1078,9 +1078,9 @@ final class BinaryInputCapsule implements InputCapsule { ); // We use ISO8859_1 to be consistent across platforms. We could default to native encoding, but this would lead to inconsistent // behaviour across platforms! - // Developers that have previously saved their exports using the old exporter (wich uses native encoding), can temporarly + // Developers that have previously saved their exports using the old exporter (which uses native encoding), can temporarly // remove the ""ISO8859_1" parameter, and change the above if statement to "if (false)". - // They should then import and re-export their models using the same enviroment they were orginally created in. + // They should then import and re-export their models using the same environment they were originally created in. return new String(bytes, "ISO8859_1"); } } catch (UnsupportedEncodingException uee) { diff --git a/jme3-core/src/plugins/java/com/jme3/export/binary/ByteUtils.java b/jme3-core/src/plugins/java/com/jme3/export/binary/ByteUtils.java index 62b01ecc5..f66a7fc7e 100644 --- a/jme3-core/src/plugins/java/com/jme3/export/binary/ByteUtils.java +++ b/jme3-core/src/plugins/java/com/jme3/export/binary/ByteUtils.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -269,7 +269,7 @@ public class ByteUtils { } public static long convertLongFromBytes(byte[] bytes, int offset) { - // Convert it to an long + // Convert it to a long return ((((long) bytes[offset+7]) & 0xFF) + ((((long) bytes[offset+6]) & 0xFF) << 8) + ((((long) bytes[offset+5]) & 0xFF) << 16) @@ -340,7 +340,7 @@ public class ByteUtils { // ********** byte <> float METHODS ********** /** - * Writes an float out to an OutputStream. + * Writes a float out to an OutputStream. * * @param outputStream * The OutputStream the float will be written to diff --git a/jme3-core/src/plugins/java/com/jme3/font/plugins/BitmapFontLoader.java b/jme3-core/src/plugins/java/com/jme3/font/plugins/BitmapFontLoader.java index 93d8bb5f0..07aa9813e 100644 --- a/jme3-core/src/plugins/java/com/jme3/font/plugins/BitmapFontLoader.java +++ b/jme3-core/src/plugins/java/com/jme3/font/plugins/BitmapFontLoader.java @@ -43,7 +43,6 @@ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; -import org.omg.PortableInterceptor.SYSTEM_EXCEPTION; public class BitmapFontLoader implements AssetLoader { diff --git a/jme3-core/src/plugins/java/com/jme3/material/plugins/ConditionParser.java b/jme3-core/src/plugins/java/com/jme3/material/plugins/ConditionParser.java index 2041fba09..07569ce90 100644 --- a/jme3-core/src/plugins/java/com/jme3/material/plugins/ConditionParser.java +++ b/jme3-core/src/plugins/java/com/jme3/material/plugins/ConditionParser.java @@ -51,8 +51,8 @@ public class ConditionParser { public static void main(String argv[]) { ConditionParser parser = new ConditionParser(); - List defines = parser.extractDefines("(LightMap && SeparateTexCoord) || !ColorMap"); - + //List defines = parser.extractDefines("(LightMap && SeparateTexCoord) || !ColorMap"); + List defines = parser.extractDefines("RoughnessMap && MetallicRoughnessMap"); for (String string : defines) { System.err.println(string); } @@ -78,15 +78,15 @@ public class ConditionParser { * parse a condition and returns the list of defines of this condition. * additionally this methods updates the formattedExpression with uppercased * defines names - * - * supported expression syntax example: + * + * supported expression syntax example: * * "(LightMap && SeparateTexCoord) || !ColorMap" * "#if (defined(LightMap) && defined(SeparateTexCoord)) || !defined(ColorMap)" * "#ifdef LightMap" * "#ifdef (LightMap && SeparateTexCoord) || !ColorMap" * - * + * * @param expression the expression to parse * @return the list of defines */ @@ -99,13 +99,13 @@ public class ConditionParser { while (m.find()) { String match = m.group(); defines.add(match); - formattedExpression = formattedExpression.replaceAll(match, "defined(" + match.toUpperCase() + ")"); + formattedExpression = formattedExpression.replaceAll("\\b" + match + "\\b", "defined(" + match.toUpperCase() + ")"); } return defines; } /** - * + * * @return the formatted expression previously updated by extractDefines */ public String getFormattedExpression() { diff --git a/jme3-core/src/plugins/java/com/jme3/material/plugins/J3MLoader.java b/jme3-core/src/plugins/java/com/jme3/material/plugins/J3MLoader.java index d0c36afc6..1afa6e3a7 100644 --- a/jme3-core/src/plugins/java/com/jme3/material/plugins/J3MLoader.java +++ b/jme3-core/src/plugins/java/com/jme3/material/plugins/J3MLoader.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -31,7 +31,6 @@ */ package com.jme3.material.plugins; -import com.jme3.material.logic.*; import com.jme3.asset.*; import com.jme3.material.*; import com.jme3.material.RenderState.BlendEquation; @@ -39,7 +38,7 @@ import com.jme3.material.RenderState.BlendMode; import com.jme3.material.RenderState.FaceCullMode; import com.jme3.material.TechniqueDef.LightMode; import com.jme3.material.TechniqueDef.ShadowMode; -import com.jme3.material.logic.StaticPassLightingLogic; +import com.jme3.material.logic.*; import com.jme3.math.ColorRGBA; import com.jme3.math.Vector2f; import com.jme3.math.Vector3f; @@ -51,7 +50,6 @@ import com.jme3.util.PlaceholderAssets; import com.jme3.util.blockparser.BlockLanguageParser; import com.jme3.util.blockparser.Statement; import com.jme3.util.clone.Cloner; - import java.io.IOException; import java.io.InputStream; import java.util.*; @@ -451,8 +449,15 @@ public class J3MLoader implements AssetLoader { } } - private boolean parseBoolean(String word){ - return word != null && word.equals("On"); + private boolean parseBoolean(String word) { + switch (word) { + case "On": + return true; + case "Off": + return false; + default: + throw new IllegalArgumentException(); + } } private void readRenderStateStatement(Statement statement) throws IOException{ @@ -652,7 +657,7 @@ public class J3MLoader implements AssetLoader { technique.setLogic(new SinglePassAndImageBasedLightingLogic(technique)); break; default: - throw new UnsupportedOperationException(); + throw new IOException("Light mode not supported:" + technique.getLightMode()); } List techniqueDefs = new ArrayList<>(); @@ -932,7 +937,7 @@ public class J3MLoader implements AssetLoader { } /** - * Internal object used for holding a {@link com.jme3.material.plugins.J3MLoader.TextureOption} and it's value. Also + * Internal object used for holding a {@link com.jme3.material.plugins.J3MLoader.TextureOption} and its value. Also * contains a couple of convenience methods for applying the TextureOption to either a TextureKey or a Texture. */ private static class TextureOptionValue { diff --git a/jme3-core/src/plugins/java/com/jme3/material/plugins/ShaderNodeDefinitionLoader.java b/jme3-core/src/plugins/java/com/jme3/material/plugins/ShaderNodeDefinitionLoader.java index a14937f82..05ef9fd54 100644 --- a/jme3-core/src/plugins/java/com/jme3/material/plugins/ShaderNodeDefinitionLoader.java +++ b/jme3-core/src/plugins/java/com/jme3/material/plugins/ShaderNodeDefinitionLoader.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -43,7 +43,7 @@ import java.io.InputStream; import java.util.List; /** - * ShaderNodeDefnition file loader (.j3sn) + * ShaderNodeDefinition file loader (.j3sn) * * a j3sn file is a block style file like j3md or j3m. It must contain one * ShaderNodeDefinition{} block that contains several ShaderNodeDefinition{} diff --git a/jme3-core/src/plugins/java/com/jme3/material/plugins/ShaderNodeLoaderDelegate.java b/jme3-core/src/plugins/java/com/jme3/material/plugins/ShaderNodeLoaderDelegate.java index 13f035426..c8c674046 100644 --- a/jme3-core/src/plugins/java/com/jme3/material/plugins/ShaderNodeLoaderDelegate.java +++ b/jme3-core/src/plugins/java/com/jme3/material/plugins/ShaderNodeLoaderDelegate.java @@ -38,20 +38,12 @@ import com.jme3.material.MatParam; import com.jme3.material.MaterialDef; import com.jme3.material.ShaderGenerationInfo; import com.jme3.material.TechniqueDef; -import com.jme3.shader.Shader; -import com.jme3.shader.ShaderNode; -import com.jme3.shader.ShaderNodeDefinition; -import com.jme3.shader.ShaderNodeVariable; -import com.jme3.shader.ShaderUtils; -import com.jme3.shader.UniformBinding; -import com.jme3.shader.VarType; -import com.jme3.shader.VariableMapping; +import com.jme3.shader.Shader.ShaderType; +import com.jme3.shader.*; import com.jme3.util.blockparser.Statement; + import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; /** * This class is here to be able to load shaderNodeDefinition from both the @@ -65,19 +57,22 @@ import java.util.Map; */ public class ShaderNodeLoaderDelegate { + private static final boolean[] IM_HAS_NAME_SPACE = {false, true}; + private static final boolean[] OM_HAS_NAME_SPACE = {true, false}; + protected Map nodeDefinitions; protected Map nodes; protected ShaderNodeDefinition shaderNodeDefinition; protected ShaderNode shaderNode; protected TechniqueDef techniqueDef; - protected Map attributes = new HashMap(); - protected Map vertexDeclaredUniforms = new HashMap(); - protected Map fragmentDeclaredUniforms = new HashMap(); - protected Map varyings = new HashMap(); + protected Map attributes = new HashMap<>(); + protected Map vertexDeclaredUniforms = new HashMap<>(); + protected Map fragmentDeclaredUniforms = new HashMap<>(); + protected Map varyings = new HashMap<>(); protected MaterialDef materialDef; protected String shaderLanguage; protected String shaderName; - protected String varNames = ""; + protected Set varNames = new HashSet<>(); protected AssetManager assetManager; protected ConditionParser conditionParser = new ConditionParser(); protected List nulledConditions = new ArrayList(); @@ -165,7 +160,7 @@ public class ShaderNodeLoaderDelegate { if (line.startsWith("Type")) { String type = line.substring(line.lastIndexOf(':') + 1).trim(); - shaderNodeDefinition.setType(Shader.ShaderType.valueOf(type)); + shaderNodeDefinition.setType(ShaderType.valueOf(type)); } else if (line.startsWith("Shader ")) { readShaderStatement(statement); shaderNodeDefinition.getShadersLanguage().add(shaderLanguage); @@ -179,7 +174,7 @@ public class ShaderNodeLoaderDelegate { shaderNodeDefinition.setDocumentation(doc); } } else if (line.startsWith("Input")) { - varNames = ""; + varNames.clear(); for (Statement statement1 : statement.getContents()) { try { shaderNodeDefinition.getInputs().add(readVariable(statement1)); @@ -188,7 +183,7 @@ public class ShaderNodeLoaderDelegate { } } } else if (line.startsWith("Output")) { - varNames = ""; + varNames.clear(); for (Statement statement1 : statement.getContents()) { try { if (statement1.getLine().trim().equals("None")) { @@ -217,11 +212,15 @@ public class ShaderNodeLoaderDelegate { * @throws IOException */ protected ShaderNodeVariable readVariable(Statement statement) throws IOException { + String line = statement.getLine().trim().replaceAll("\\s*\\[", "["); String[] splitVar = line.split("\\s"); - if (splitVar.length != 2) { - throw new MatParseException("2 arguments", splitVar.length + "", statement); + + if (splitVar.length > 3) { + throw new MatParseException("More than 3 arguments", splitVar.length + "", statement); } + + String defaultValue = splitVar.length > 2? splitVar[2] : null; String varName = splitVar[1]; String varType = splitVar[0]; String multiplicity = null; @@ -230,13 +229,19 @@ public class ShaderNodeLoaderDelegate { //we have an array String[] arr = splitVar[1].split("\\["); varName = arr[0].trim(); - multiplicity = arr[1].replaceAll("\\]", "").trim(); + multiplicity = arr[1].replaceAll("\\]", "").trim(); } - if (varNames.contains(varName + ";")) { + + if (varNames.contains(varName)) { throw new MatParseException("Duplicate variable name " + varName, statement); } - varNames += varName + ";"; - return new ShaderNodeVariable(varType, "", varName, multiplicity); + + varNames.add(varName); + + final ShaderNodeVariable variable = new ShaderNodeVariable(varType, "", varName, multiplicity); + variable.setDefaultValue(defaultValue); + + return variable; } /** @@ -257,61 +262,86 @@ public class ShaderNodeLoaderDelegate { * @throws IOException */ protected void readShaderNode(List statements) throws IOException { + + final ShaderGenerationInfo generationInfo = techniqueDef.getShaderGenerationInfo(); + final List unusedNodes = generationInfo.getUnusedNodes(); + for (Statement statement : statements) { + String line = statement.getLine(); String[] split = statement.getLine().split("[ \\{]"); + if (line.startsWith("Definition")) { ShaderNodeDefinition def = findDefinition(statement); - shaderNode.setDefinition(def); + shaderNode.setDefinition(def); if(def.isNoOutput()){ - techniqueDef.getShaderGenerationInfo().getUnusedNodes().remove(shaderNode.getName()); + unusedNodes.remove(shaderNode.getName()); } } else if (line.startsWith("Condition")) { String condition = line.substring(line.lastIndexOf(":") + 1).trim(); extractCondition(condition, statement); shaderNode.setCondition(conditionParser.getFormattedExpression()); - } else if (line.startsWith("InputMapping")) { - for (Statement statement1 : statement.getContents()) { - VariableMapping mapping = readInputMapping(statement1); - techniqueDef.getShaderGenerationInfo().getUnusedNodes().remove(mapping.getRightVariable().getNameSpace()); + } else if (line.startsWith("InputMappings")) { + for (final Statement subStatement : statement.getContents()) { + + VariableMapping mapping = readInputMapping(subStatement); + + final ShaderNodeVariable rightVariable = mapping.getRightVariable(); + if (rightVariable != null) { + unusedNodes.remove(rightVariable.getNameSpace()); + } + shaderNode.getInputMapping().add(mapping); } - } else if (line.startsWith("OutputMapping")) { + } else if (line.startsWith("OutputMappings")) { for (Statement statement1 : statement.getContents()) { VariableMapping mapping = readOutputMapping(statement1); - techniqueDef.getShaderGenerationInfo().getUnusedNodes().remove(shaderNode.getName()); + unusedNodes.remove(shaderNode.getName()); shaderNode.getOutputMapping().add(mapping); - } + } } else { throw new MatParseException("ShaderNodeDefinition", split[0], statement); } } - } /** - * reads a mapping statement. Sets the nameSpace, name and swizzling of the + * Reads a mapping statement. Sets the nameSpace, name and swizzling of the * left variable. Sets the name, nameSpace and swizzling of the right - * variable types will be determined later. + * variable types will be determined later. Also, we can have the right part as expression. + *
    +     * Format variable to variable: <nameSpace>.<varName>[.<swizzling>] = <nameSpace>.<varName>[.<swizzling>][:Condition]
    +     * Format expression to variable: <nameSpace>.<varName>[.<swizzling>] = %% expression %% [:Condition]
    +     * 
    * - * - * Format : .[.] = - * .[.][:Condition] - * - * - * @param statement the statement to read - * @return the read mapping + * @param statement the statement to read. + * @return the read mapping. + * @throws MatParseException if the statement isn't valid. */ - protected VariableMapping parseMapping(Statement statement, boolean[] hasNameSpace) throws IOException { + protected VariableMapping parseMapping(Statement statement, boolean[] hasNameSpace) throws MatParseException { + VariableMapping mapping = new VariableMapping(); String[] cond = statement.getLine().split(":"); - String[] vars = cond[0].split("="); + checkMappingFormat(vars, statement); + ShaderNodeVariable[] variables = new ShaderNodeVariable[2]; String[] swizzle = new String[2]; + String rightExpression = null; + for (int i = 0; i < vars.length; i++) { - String[] expression = vars[i].trim().split("\\."); + + final String var = vars[i].trim(); + + // it seems that is expression, not variable + if (var.contains("%%")) { + rightExpression = var.substring(2, var.length() - 2); + continue; + } + + String[] expression = var.split("\\."); + if (hasNameSpace[i]) { if (expression.length <= 3) { variables[i] = new ShaderNodeVariable("", expression[0].trim(), expression[1].trim()); @@ -327,13 +357,17 @@ public class ShaderNodeLoaderDelegate { swizzle[i] = expression[1].trim(); } } - } mapping.setLeftVariable(variables[0]); mapping.setLeftSwizzling(swizzle[0] != null ? swizzle[0] : ""); - mapping.setRightVariable(variables[1]); - mapping.setRightSwizzling(swizzle[1] != null ? swizzle[1] : ""); + + if (rightExpression != null) { + mapping.setRightExpression(rightExpression); + } else { + mapping.setRightVariable(variables[1]); + mapping.setRightSwizzling(swizzle[1] != null ? swizzle[1] : ""); + } if (cond.length > 1) { extractCondition(cond[1], statement); @@ -391,11 +425,11 @@ public class ShaderNodeLoaderDelegate { } /** - * search a variable in the given list and updates its type and namespace + * Searches a variable in the given list and updates its type and namespace. * - * @param var the variable to update - * @param list the variables list - * @return true if the variable has been found and updated + * @param var the variable to update. + * @param list the variables list. + * @return true if the variable has been found and updated. */ protected boolean updateVariableFromList(ShaderNodeVariable var, List list) { for (ShaderNodeVariable shaderNodeVariable : list) { @@ -410,10 +444,10 @@ public class ShaderNodeLoaderDelegate { } /** - * updates the type of the right variable of a mapping from the type of the - * left variable + * Updates the type of the right variable of a mapping from the type of the + * left variable. * - * @param mapping the mapping to consider + * @param mapping the mapping to consider. */ protected void updateRightTypeFromLeftType(VariableMapping mapping) { String type = mapping.getLeftVariable().getType(); @@ -429,24 +463,25 @@ public class ShaderNodeLoaderDelegate { } /** - * check if once a mapping expression is split by "=" the resulting array - * have 2 elements + * Checks if once a mapping expression is split by "=" the resulting array + * have 2 elements. * - * @param vars the array - * @param statement the statement - * @throws IOException + * @param vars the array. + * @param statement the statement. + * @throws MatParseException if the array isn't correct. */ - protected void checkMappingFormat(String[] vars, Statement statement) throws IOException { + protected void checkMappingFormat(String[] vars, Statement statement) throws MatParseException { if (vars.length != 2) { - throw new MatParseException("Not a valid expression should be '[.] = .[.][:Condition]'", statement); + throw new MatParseException("Not a valid expression should be '[.] = " + + ".[.][:Condition]'", statement); } } /** - * finds a MatParam in the materialDef from the given name + * Finds a {@link MatParam} in the {@link MaterialDef} from the given name. * - * @param varName the matparam name - * @return the MatParam + * @param varName the material param name. + * @return the found {@link MatParam} or null. */ protected MatParam findMatParam(String varName) { for (MatParam matParam : materialDef.getMaterialParams()) { @@ -483,6 +518,7 @@ public class ShaderNodeLoaderDelegate { * @return true if the param was added to the map */ protected boolean updateRightFromUniforms(UniformBinding param, VariableMapping mapping, Map map) { + ShaderNodeVariable right = mapping.getRightVariable(); String name = param.toString(); @@ -503,60 +539,74 @@ public class ShaderNodeLoaderDelegate { } /** - * updates the right variable of the given mapping from a MatParam (a + * Updates the right variable of the given mapping from a {@link MatParam} (a * WorldParam) it checks if the uniform hasn't already been loaded, add it * to the maps if not. * - * @param param the MatParam - * @param mapping the mapping - * @param map the map of uniforms to search into - * @return true if the param was added to the map + * @param param the mat param. + * @param mapping the mapping. + * @param map the map of uniforms to search into. + * @return true if the param was added to the map. */ - public boolean updateRightFromUniforms(MatParam param, VariableMapping mapping, Map map, Statement statement) throws MatParseException { - ShaderNodeVariable right = mapping.getRightVariable(); + public boolean updateRightFromUniforms(MatParam param, VariableMapping mapping, Map map, + Statement statement) throws MatParseException { + + final ShaderNodeVariable left = mapping.getLeftVariable(); + final ShaderNodeVariable right = mapping.getRightVariable(); + DeclaredVariable dv = map.get(param.getName()); + if (dv == null) { + right.setType(param.getVarType().getGlslType()); right.setName(param.getName()); right.setPrefix("m_"); - if(mapping.getLeftVariable().getMultiplicity() != null){ - if(!param.getVarType().name().endsWith("Array")){ + + if (left.getMultiplicity() != null) { + + if (!param.getVarType().name().endsWith("Array")) { throw new MatParseException(param.getName() + " is not of Array type", statement); } - String multiplicity = mapping.getLeftVariable().getMultiplicity(); + + String multiplicity = left.getMultiplicity(); try { Integer.parseInt(multiplicity); - } catch (NumberFormatException nfe) { - //multiplicity is not an int attempting to find for a material parameter. + } catch (final NumberFormatException nfe) { + // multiplicity is not an int attempting to find for a material parameter. MatParam mp = findMatParam(multiplicity); if (mp != null) { - //It's tied to a material param, let's create a define and use this as the multiplicity + // It's tied to a material param, let's create a define and use this as the multiplicity addDefine(multiplicity, VarType.Int); multiplicity = multiplicity.toUpperCase(); - mapping.getLeftVariable().setMultiplicity(multiplicity); - //only declare the variable if the define is defined. - mapping.getLeftVariable().setCondition(mergeConditions(mapping.getLeftVariable().getCondition(), "defined(" + multiplicity + ")", "||")); + left.setMultiplicity(multiplicity); + // only declare the variable if the define is defined. + left.setCondition(mergeConditions(left.getCondition(), "defined(" + multiplicity + ")", "||")); } else { - throw new MatParseException("Wrong multiplicity for variable" + mapping.getLeftVariable().getName() + ". " + multiplicity + " should be an int or a declared material parameter.", statement); + throw new MatParseException("Wrong multiplicity for variable" + left.getName() + ". " + + multiplicity + " should be an int or a declared material parameter.", statement); } } - //the right variable must have the same multiplicity and the same condition. + + // the right variable must have the same multiplicity and the same condition. right.setMultiplicity(multiplicity); - right.setCondition(mapping.getLeftVariable().getCondition()); - } + right.setCondition(left.getCondition()); + } + dv = new DeclaredVariable(right); map.put(right.getName(), dv); - dv.addNode(shaderNode); + dv.addNode(shaderNode); mapping.setRightVariable(right); return true; - } + } + dv.addNode(shaderNode); mapping.setRightVariable(dv.var); + return false; } /** - * updates a variable from the Attribute list + * Updates a variable from the attribute list. * * @param right the variable * @param mapping the mapping @@ -585,11 +635,11 @@ public class ShaderNodeLoaderDelegate { } /** - * find a variable with the given name from the list of variable + * Finds a variable with the given name from the list of variable. * - * @param vars a list of shaderNodeVariables - * @param rightVarName the variable name to search for - * @return the found variable or null is not found + * @param vars the list of shader node variables. + * @param rightVarName the variable name to search for. + * @return the found variable or null is not found. */ public ShaderNodeVariable findNodeOutput(List vars, String rightVarName) { ShaderNodeVariable var = null; @@ -602,152 +652,196 @@ public class ShaderNodeLoaderDelegate { } /** - * extract and check a condition expression + * Extracts and checks a condition expression. * - * @param cond the condition expression - * @param statement the statement being read - * @throws IOException + * @param condition the condition expression. + * @param statement the statement being read. + * @throws MatParseException if the condition isn't valid. */ - public void extractCondition(String cond, Statement statement) throws IOException { - List defines = conditionParser.extractDefines(cond); + public void extractCondition(String condition, Statement statement) throws MatParseException { + List defines = conditionParser.extractDefines(condition); for (String string : defines) { MatParam param = findMatParam(string); if (param != null) { addDefine(param.getName(), param.getVarType()); } else { - throw new MatParseException("Invalid condition, condition must match a Material Parameter named " + cond, statement); + throw new MatParseException("Invalid condition, condition must match a Material Parameter named " + condition, statement); } } } /** - * reads an input mapping + * Reads an input mapping. * - * @param statement1 the statement being read - * @return the mapping - * @throws IOException + * @param statement the statement being read. + * @return the variable mapping. + * @throws MatParseException if we have a problem with parsing input mapping statement. */ - public VariableMapping readInputMapping(Statement statement1) throws IOException { - VariableMapping mapping = null; + public VariableMapping readInputMapping(Statement statement) throws MatParseException { + + VariableMapping mapping; try { - mapping = parseMapping(statement1, new boolean[]{false, true}); - } catch (Exception e) { - throw new MatParseException("Unexpected mapping format", statement1, e); + mapping = parseMapping(statement, IM_HAS_NAME_SPACE); + } catch (final Exception e) { + throw new MatParseException("Unexpected mapping format", statement, e); } - ShaderNodeVariable left = mapping.getLeftVariable(); - ShaderNodeVariable right = mapping.getRightVariable(); - if (!updateVariableFromList(left, shaderNode.getDefinition().getInputs())) { - throw new MatParseException(left.getName() + " is not an input variable of " + shaderNode.getDefinition().getName(), statement1); + + final ShaderNodeDefinition definition = shaderNode.getDefinition(); + final ShaderNodeVariable left = mapping.getLeftVariable(); + final ShaderNodeVariable right = mapping.getRightVariable(); + final String expression = mapping.getRightExpression(); + + if (!updateVariableFromList(left, definition.getInputs())) { + throw new MatParseException(left.getName() + " is not an input variable of " + definition.getName(), statement); + } else if (left.getType().startsWith("sampler") && (right == null || !right.getNameSpace().equals(ShaderGenerator.NAME_SPACE_MAT_PARAM))) { + throw new MatParseException("Samplers can only be assigned to MatParams", statement); } - if (left.getType().startsWith("sampler") && !right.getNameSpace().equals("MatParam")) { - throw new MatParseException("Samplers can only be assigned to MatParams", statement1); + if (right == null && expression == null) { + throw new MatParseException("The mapping doesn't have a right variable or a right expression.", statement); } - if (right.getNameSpace().equals("Global")) { - right.setType("vec4");//Globals are all vec4 for now (maybe forever...) - storeGlobal(right, statement1); + if (right == null) { + return mapping; + } - } else if (right.getNameSpace().equals("Attr")) { - if (shaderNode.getDefinition().getType() == Shader.ShaderType.Fragment) { - throw new MatParseException("Cannot have an attribute as input in a fragment shader" + right.getName(), statement1); + if (right.getNameSpace().equals(ShaderGenerator.NAME_SPACE_GLOBAL)) { + right.setType("vec4"); // Globals are all vec4 for now (maybe forever...) + storeGlobal(right, statement); + } else if (right.getNameSpace().equals(ShaderGenerator.NAME_SPACE_VERTEX_ATTRIBUTE)) { + if (definition.getType() == ShaderType.Fragment) { + throw new MatParseException("Cannot have an attribute as input in a fragment shader" + right.getName(), statement); } updateVarFromAttributes(mapping.getRightVariable(), mapping); storeAttribute(mapping.getRightVariable()); - } else if (right.getNameSpace().equals("MatParam")) { + } else if (right.getNameSpace().equals(ShaderGenerator.NAME_SPACE_MAT_PARAM)) { + MatParam param = findMatParam(right.getName()); if (param == null) { - throw new MatParseException("Could not find a Material Parameter named " + right.getName(), statement1); + throw new MatParseException("Could not find a Material Parameter named " + right.getName(), statement); } - if (shaderNode.getDefinition().getType() == Shader.ShaderType.Vertex) { - if (updateRightFromUniforms(param, mapping, vertexDeclaredUniforms, statement1)) { + + if (definition.getType() == ShaderType.Vertex) { + if (updateRightFromUniforms(param, mapping, vertexDeclaredUniforms, statement)) { + updateMaterialTextureType(statement, mapping, left, param); storeVertexUniform(mapping.getRightVariable()); } } else { - if (updateRightFromUniforms(param, mapping, fragmentDeclaredUniforms, statement1)) { - if (mapping.getRightVariable().getType().contains("|")) { - String type = fixSamplerType(left.getType(), mapping.getRightVariable().getType()); - if (type != null) { - mapping.getRightVariable().setType(type); - } else { - throw new MatParseException(param.getVarType().toString() + " can only be matched to one of " + param.getVarType().getGlslType().replaceAll("\\|", ",") + " found " + left.getType(), statement1); - } - } + if (updateRightFromUniforms(param, mapping, fragmentDeclaredUniforms, statement)) { + updateMaterialTextureType(statement, mapping, left, param); storeFragmentUniform(mapping.getRightVariable()); } } - } else if (right.getNameSpace().equals("WorldParam")) { + } else if (right.getNameSpace().equals(ShaderGenerator.NAME_SPACE_WORLD_PARAM)) { + UniformBinding worldParam = findWorldParam(right.getName()); if (worldParam == null) { - throw new MatParseException("Could not find a World Parameter named " + right.getName(), statement1); + throw new MatParseException("Could not find a World Parameter named " + right.getName(), statement); } - if (shaderNode.getDefinition().getType() == Shader.ShaderType.Vertex) { - if (updateRightFromUniforms(worldParam, mapping, vertexDeclaredUniforms)) { + + if (definition.getType() == ShaderType.Vertex) { + if (updateRightFromUniforms(worldParam, mapping, vertexDeclaredUniforms)) { storeVertexUniform(mapping.getRightVariable()); } } else { - if (updateRightFromUniforms(worldParam, mapping, fragmentDeclaredUniforms)) { + if (updateRightFromUniforms(worldParam, mapping, fragmentDeclaredUniforms)) { storeFragmentUniform(mapping.getRightVariable()); } } } else { + ShaderNode node = nodes.get(right.getNameSpace()); + if (node == null) { - throw new MatParseException("Undeclared node" + right.getNameSpace() + ". Make sure this node is declared before the current node", statement1); + throw new MatParseException("Undeclared node" + right.getNameSpace() + + ". Make sure this node is declared before the current node", statement); } + ShaderNodeVariable var = findNodeOutput(node.getDefinition().getOutputs(), right.getName()); + if (var == null) { - throw new MatParseException("Cannot find output variable" + right.getName() + " form ShaderNode " + node.getName(), statement1); + throw new MatParseException("Cannot find output variable" + right.getName() + + " form ShaderNode " + node.getName(), statement); } + right.setNameSpace(node.getName()); right.setType(var.getType()); right.setMultiplicity(var.getMultiplicity()); - mapping.setRightVariable(right); - storeVaryings(node, mapping.getRightVariable()); + mapping.setRightVariable(right); + + storeVaryings(node, mapping.getRightVariable()); } - checkTypes(mapping, statement1); + checkTypes(mapping, statement); return mapping; } /** - * reads an output mapping + * Updates the material texture type of the variable mapping. * - * @param statement1 the statement being read + * @param statement the statement. + * @param mapping the variable mapping. + * @param left the left variable. + * @param param the material parameter. + * @throws MatParseException if the texture type isn't valid. + */ + private void updateMaterialTextureType(final Statement statement, final VariableMapping mapping, + final ShaderNodeVariable left, final MatParam param) throws MatParseException { + + if (!mapping.getRightVariable().getType().contains("|")) { + return; + } + + final String type = fixSamplerType(left.getType(), mapping.getRightVariable().getType()); + + if (type != null) { + mapping.getRightVariable().setType(type); + } else { + throw new MatParseException(param.getVarType().toString() + " can only be matched to one of " + + param.getVarType().getGlslType().replaceAll("\\|", ",") + " found " + left.getType(), statement); + } + } + + /** + * Reads an output mapping. + * + * @param statement the statement being read. * @return the mapping - * @throws IOException + * @throws MatParseException if we have a problem with parsing the statement. */ - public VariableMapping readOutputMapping(Statement statement1) throws IOException { - VariableMapping mapping = null; + public VariableMapping readOutputMapping(Statement statement) throws MatParseException { + + VariableMapping mapping; try { - mapping = parseMapping(statement1, new boolean[]{true, false}); - } catch (Exception e) { - throw new MatParseException("Unexpected mapping format", statement1, e); + mapping = parseMapping(statement, OM_HAS_NAME_SPACE); + } catch (final Exception e) { + throw new MatParseException("Unexpected mapping format", statement, e); } - ShaderNodeVariable left = mapping.getLeftVariable(); - ShaderNodeVariable right = mapping.getRightVariable(); + final ShaderNodeDefinition definition = shaderNode.getDefinition(); + final ShaderNodeVariable left = mapping.getLeftVariable(); + final ShaderNodeVariable right = mapping.getRightVariable(); if (left.getType().startsWith("sampler") || right.getType().startsWith("sampler")) { - throw new MatParseException("Samplers can only be inputs", statement1); + throw new MatParseException("Samplers can only be inputs", statement); } - if (left.getNameSpace().equals("Global")) { - left.setType("vec4");//Globals are all vec4 for now (maybe forever...) - storeGlobal(left, statement1); + if (left.getNameSpace().equals(ShaderGenerator.NAME_SPACE_GLOBAL)) { + left.setType("vec4"); // Globals are all vec4 for now (maybe forever...) + storeGlobal(left, statement); } else { - throw new MatParseException("Only Global nameSpace is allowed for outputMapping, got" + left.getNameSpace(), statement1); + throw new MatParseException("Only Global nameSpace is allowed for outputMapping, got" + left.getNameSpace(), statement); } - if (!updateVariableFromList(right, shaderNode.getDefinition().getOutputs())) { - throw new MatParseException(right.getName() + " is not an output variable of " + shaderNode.getDefinition().getName(), statement1); + if (!updateVariableFromList(right, definition.getOutputs())) { + throw new MatParseException(right.getName() + " is not an output variable of " + definition.getName(), statement); } - checkTypes(mapping, statement1); + checkTypes(mapping, statement); return mapping; } @@ -775,7 +869,6 @@ public class ShaderNodeLoaderDelegate { shaderNode = new ShaderNode(); shaderNode.setName(name); techniqueDef.getShaderGenerationInfo().getUnusedNodes().add(name); - readShaderNode(statement.getContents()); nodes.put(name, shaderNode); techniqueDef.getShaderNodes().add(shaderNode); @@ -808,45 +901,54 @@ public class ShaderNodeLoaderDelegate { } /** - * stores a global output + * Stores a global output. * - * @param var the variable to store - * @param statement1 the statement being read - * @throws IOException + * @param var the variable to store. + * @param varStatement the statement being read. + * @throws MatParseException if we have duplicates of a global vertex output variable. */ - public void storeGlobal(ShaderNodeVariable var, Statement statement1) throws IOException { + public void storeGlobal(ShaderNodeVariable var, Statement varStatement) throws MatParseException { var.setShaderOutput(true); - if (shaderNode.getDefinition().getType() == Shader.ShaderType.Vertex) { - ShaderNodeVariable global = techniqueDef.getShaderGenerationInfo().getVertexGlobal(); + + final ShaderGenerationInfo generationInfo = techniqueDef.getShaderGenerationInfo(); + final ShaderNodeDefinition definition = shaderNode.getDefinition(); + + if (definition.getType() == ShaderType.Vertex) { + + ShaderNodeVariable global = generationInfo.getVertexGlobal(); + if (global != null) { + if (!global.getName().equals(var.getName())) { - throw new MatParseException("A global output is already defined for the vertex shader: " + global.getName() + ". vertex shader can only have one global output", statement1); + throw new MatParseException("A global output is already defined for the vertex shader: " + + global.getName() + ". vertex shader can only have one global output", varStatement); } + } else { - techniqueDef.getShaderGenerationInfo().setVertexGlobal(var); + generationInfo.setVertexGlobal(var); } - } else if (shaderNode.getDefinition().getType() == Shader.ShaderType.Fragment) { - storeVariable(var, techniqueDef.getShaderGenerationInfo().getFragmentGlobals()); + + } else if (definition.getType() == ShaderType.Fragment) { + storeVariable(var, generationInfo.getFragmentGlobals()); } } /** - * store an attribute + * Stores an attribute. * - * @param var the variable to store + * @param var the variable to store. */ public void storeAttribute(ShaderNodeVariable var) { storeVariable(var, techniqueDef.getShaderGenerationInfo().getAttributes()); } /** - * store a vertex uniform + * Stores a vertex uniform. * - * @param var the variable to store + * @param var the variable to store. */ public void storeVertexUniform(ShaderNodeVariable var) { storeVariable(var, techniqueDef.getShaderGenerationInfo().getVertexUniforms()); - } /** @@ -856,7 +958,6 @@ public class ShaderNodeLoaderDelegate { */ public void storeFragmentUniform(ShaderNodeVariable var) { storeVariable(var, techniqueDef.getShaderGenerationInfo().getFragmentUniforms()); - } /** @@ -869,39 +970,51 @@ public class ShaderNodeLoaderDelegate { } /** - * find the definition from this statement (loads it if necessary) + * Find the definition from this statement (loads it if necessary) * * @param statement the statement being read * @return the definition * @throws IOException */ public ShaderNodeDefinition findDefinition(Statement statement) throws IOException { - String defLine[] = statement.getLine().split(":"); - String defName = defLine[1].trim(); - ShaderNodeDefinition def = getNodeDefinitions().get(defName); - if (def == null) { - if (defLine.length == 3) { - List defs = null; - try { - defs = assetManager.loadAsset(new ShaderNodeDefinitionKey(defLine[2].trim())); - } catch (AssetNotFoundException e) { - throw new MatParseException("Couldn't find " + defLine[2].trim(), statement, e); - } + final String defLine[] = statement.getLine().split(":"); - for (ShaderNodeDefinition definition : defs) { - if (defName.equals(definition.getName())) { - def = definition; - } - if (!(getNodeDefinitions().containsKey(definition.getName()))) { - getNodeDefinitions().put(definition.getName(), definition); - } - } + if (defLine.length != 3) { + throw new MatParseException("Can't find shader node definition for: ", statement); + } + + final Map nodeDefinitions = getNodeDefinitions(); + final String definitionName = defLine[1].trim(); + final String definitionPath = defLine[2].trim(); + final String fullName = definitionName + ":" + definitionPath; + + ShaderNodeDefinition def = nodeDefinitions.get(fullName); + if (def != null) { + return def; + } + + List defs; + try { + defs = assetManager.loadAsset(new ShaderNodeDefinitionKey(definitionPath)); + } catch (final AssetNotFoundException e) { + throw new MatParseException("Couldn't find " + definitionPath, statement, e); + } + + for (final ShaderNodeDefinition definition : defs) { + if (definitionName.equals(definition.getName())) { + def = definition; } - if (def == null) { - throw new MatParseException(defName + " is not a declared as Shader Node Definition", statement); + final String key = definition.getName() + ":" + definitionPath; + if (!(nodeDefinitions.containsKey(key))) { + nodeDefinitions.put(key, definition); } } + + if (def == null) { + throw new MatParseException(definitionName + " is not a declared as Shader Node Definition", statement); + } + return def; } @@ -913,23 +1026,35 @@ public class ShaderNodeLoaderDelegate { */ public void storeVaryings(ShaderNode node, ShaderNodeVariable variable) { variable.setShaderOutput(true); - if (node.getDefinition().getType() == Shader.ShaderType.Vertex && shaderNode.getDefinition().getType() == Shader.ShaderType.Fragment) { - DeclaredVariable dv = varyings.get(variable.getName()); - if (dv == null) { - techniqueDef.getShaderGenerationInfo().getVaryings().add(variable); - dv = new DeclaredVariable(variable); - varyings.put(variable.getName(), dv); - } - dv.addNode(shaderNode); - //if a variable is declared with the same name as an input and an output and is a varying, set it as a shader output so it's declared as a varying only once. - for (VariableMapping variableMapping : node.getInputMapping()) { - if (variableMapping.getLeftVariable().getName().equals(variable.getName())) { - variableMapping.getLeftVariable().setShaderOutput(true); - } - } + final ShaderNodeDefinition nodeDefinition = node.getDefinition(); + final ShaderNodeDefinition currentDefinition = shaderNode.getDefinition(); + + if (nodeDefinition.getType() != ShaderType.Vertex || + currentDefinition.getType() != ShaderType.Fragment) { + return; + } + + final String fullName = node.getName() + "." + variable.getName(); + + DeclaredVariable declaredVar = varyings.get(fullName); + + if (declaredVar == null) { + techniqueDef.getShaderGenerationInfo().getVaryings().add(variable); + declaredVar = new DeclaredVariable(variable); + varyings.put(fullName, declaredVar); } + declaredVar.addNode(shaderNode); + + // if a variable is declared with the same name as an input and an output and is a varying, + // set it as a shader output so it's declared as a varying only once. + for (final VariableMapping variableMapping : node.getInputMapping()) { + final ShaderNodeVariable leftVariable = variableMapping.getLeftVariable(); + if (leftVariable.getName().equals(variable.getName())) { + leftVariable.setShaderOutput(true); + } + } } /** @@ -954,11 +1079,11 @@ public class ShaderNodeLoaderDelegate { } /** - * search a variable in a list from its name and merge the conditions of the - * variables + * Searches a variable in a list from its name and merges the conditions of the + * variables. * - * @param variable the variable - * @param varList the variable list + * @param variable the variable. + * @param varList the variable list. */ public void storeVariable(ShaderNodeVariable variable, List varList) { for (ShaderNodeVariable var : varList) { @@ -992,7 +1117,7 @@ public class ShaderNodeLoaderDelegate { private Map getNodeDefinitions() { if (nodeDefinitions == null) { - nodeDefinitions = new HashMap(); + nodeDefinitions = new HashMap<>(); } return nodeDefinitions; } @@ -1011,7 +1136,7 @@ public class ShaderNodeLoaderDelegate { materialDef = null; shaderLanguage = ""; shaderName = ""; - varNames = ""; + varNames.clear(); assetManager = null; nulledConditions.clear(); } diff --git a/jme3-core/src/plugins/java/com/jme3/texture/plugins/HDRLoader.java b/jme3-core/src/plugins/java/com/jme3/texture/plugins/HDRLoader.java index 315d71955..50f7fe5c0 100644 --- a/jme3-core/src/plugins/java/com/jme3/texture/plugins/HDRLoader.java +++ b/jme3-core/src/plugins/java/com/jme3/texture/plugins/HDRLoader.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -149,7 +149,7 @@ public class HDRLoader implements AssetLoader { rleTempBuffer = BufferUtils.createByteBuffer(width * 4); } - // read each component seperately + // read each component separately for (int i = 0; i < 4; i++) { // read WIDTH bytes for the channel for (int j = 0; j < width;) { diff --git a/jme3-core/src/plugins/java/com/jme3/texture/plugins/PFMLoader.java b/jme3-core/src/plugins/java/com/jme3/texture/plugins/PFMLoader.java index e37e4f6bc..a94641f7e 100644 --- a/jme3-core/src/plugins/java/com/jme3/texture/plugins/PFMLoader.java +++ b/jme3-core/src/plugins/java/com/jme3/texture/plugins/PFMLoader.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -101,7 +101,7 @@ public class PFMLoader implements AssetLoader { ByteOrder order = scale < 0 ? ByteOrder.LITTLE_ENDIAN : ByteOrder.BIG_ENDIAN; boolean needEndienFlip = order != ByteOrder.nativeOrder(); - // make sure all unneccessary stuff gets deleted from heap + // make sure all unnecessary stuff gets deleted from heap // before allocating large amount of memory System.gc(); diff --git a/jme3-core/src/plugins/java/com/jme3/texture/plugins/TGALoader.java b/jme3-core/src/plugins/java/com/jme3/texture/plugins/TGALoader.java index 20f50df12..4ecb60b8f 100644 --- a/jme3-core/src/plugins/java/com/jme3/texture/plugins/TGALoader.java +++ b/jme3-core/src/plugins/java/com/jme3/texture/plugins/TGALoader.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -214,7 +214,7 @@ public final class TGALoader implements AssetLoader { byte alpha = 0; // Faster than doing a 16-or-24-or-32 check on each individual pixel, - // just make a seperate loop for each. + // just make a separate loop for each. if (pixelDepth == 16) { byte[] data = new byte[2]; float scalar = 255f / 31f; @@ -287,7 +287,7 @@ public final class TGALoader implements AssetLoader { byte blue = 0; byte alpha = 0; // Faster than doing a 16-or-24-or-32 check on each individual pixel, - // just make a seperate loop for each. + // just make a separate loop for each. if (pixelDepth == 32) { for (int i = 0; i <= (height - 1); ++i) { if (!flip) { @@ -312,7 +312,7 @@ public final class TGALoader implements AssetLoader { rawData[rawDataIndex++] = alpha; } } else { - // Its not RLE packed, but the next pixels are raw. + // It's not RLE packed, but the next pixels are raw. j += count; while (count-- >= 0) { blue = dis.readByte(); @@ -349,7 +349,7 @@ public final class TGALoader implements AssetLoader { rawData[rawDataIndex++] = blue; } } else { - // Its not RLE packed, but the next pixels are raw. + // It's not RLE packed, but the next pixels are raw. j += count; while (count-- >= 0) { blue = dis.readByte(); @@ -388,7 +388,7 @@ public final class TGALoader implements AssetLoader { rawData[rawDataIndex++] = blue; } } else { - // Its not RLE packed, but the next pixels are raw. + // It's not RLE packed, but the next pixels are raw. j += count; while (count-- >= 0) { data[1] = dis.readByte(); diff --git a/jme3-core/src/plugins/java/com/jme3/texture/plugins/ktx/KTXLoader.java b/jme3-core/src/plugins/java/com/jme3/texture/plugins/ktx/KTXLoader.java index 376774a0d..2aaa709cd 100644 --- a/jme3-core/src/plugins/java/com/jme3/texture/plugins/ktx/KTXLoader.java +++ b/jme3-core/src/plugins/java/com/jme3/texture/plugins/ktx/KTXLoader.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2015 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -166,9 +166,9 @@ public class KTXLoader implements AssetLoader { int offset = 0; //iterate over data for (int mipLevel = 0; mipLevel < numberOfMipmapLevels; mipLevel++) { - //size of the image in byte. + //size of the image in bytes. //this value is bogus in many example, when using mipmaps. - //instead we compute the theorical size and display a warning when it does not match. + //instead we compute the theoretical size and display a warning when it does not match. int fileImageSize = in.readInt(); int width = Math.max(1, pixelWidth >> mipLevel); @@ -312,7 +312,7 @@ public class KTXLoader implements AssetLoader { } /** - * Chacks the file id + * Checks the file id * @param b * @return */ diff --git a/jme3-core/src/test/java/com/jme3/light/LightFilterTest.java b/jme3-core/src/test/java/com/jme3/light/LightFilterTest.java index 447682964..aab30ff17 100644 --- a/jme3-core/src/test/java/com/jme3/light/LightFilterTest.java +++ b/jme3-core/src/test/java/com/jme3/light/LightFilterTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2015 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -231,21 +231,21 @@ public class LightFilterTest { geom.setLocalTranslation(Vector3f.ZERO); geom.setModelBound(new BoundingSphere(1f, Vector3f.ZERO)); - // Infinit spot lights are only filtered + // Infinite spot lights are only filtered // if the geometry is outside the infinite cone. sl.setSpotRange(0); checkFilteredLights(1); - //the geommetry is outside the infinit cone (cone direction going away from the geom) + //the geommetry is outside the infinite cone (cone direction going away from the geom) sl.setPosition(Vector3f.UNIT_Z.mult(1+FastMath.ZERO_TOLERANCE)); checkFilteredLights(0); - //place the spote ligth in the corner of the box geom, (in order to test bounding sphere) + //place the spot light in the corner of the box geom, (in order to test bounding sphere) sl.setDirection(new Vector3f(1, 1, 0).normalizeLocal()); geom.setLocalTranslation(0, 0, 10); sl.setPosition(sl.getDirection().mult(-2f).add(geom.getLocalTranslation())); - // make it barely reach the sphere, incorect with a box + // make it barely reach the sphere, incorrect with a box sl.setSpotRange(1f - FastMath.ZERO_TOLERANCE); checkFilteredLights(0); @@ -253,7 +253,7 @@ public class LightFilterTest { sl.setSpotRange(1f + FastMath.ZERO_TOLERANCE); checkFilteredLights(1); - // extent the range + // extend the range sl.setPosition(Vector3f.ZERO); sl.setDirection(Vector3f.UNIT_Z); sl.setSpotRange(20); diff --git a/jme3-core/src/test/java/com/jme3/material/plugins/LoadJ3mdTest.java b/jme3-core/src/test/java/com/jme3/material/plugins/LoadJ3mdTest.java index ea47129a7..eb76c18d9 100644 --- a/jme3-core/src/test/java/com/jme3/material/plugins/LoadJ3mdTest.java +++ b/jme3-core/src/test/java/com/jme3/material/plugins/LoadJ3mdTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2016 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -38,14 +38,12 @@ import com.jme3.scene.Geometry; import com.jme3.scene.shape.Box; import com.jme3.shader.Shader; import com.jme3.system.*; +import java.util.*; +import static org.junit.Assert.assertEquals; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.runners.MockitoJUnitRunner; -import java.util.*; - -import static org.junit.Assert.assertEquals; - @RunWith(MockitoJUnitRunner.class) public class LoadJ3mdTest { @@ -59,6 +57,24 @@ public class LoadJ3mdTest { } }); + @Test(expected = IllegalArgumentException.class) + public void testBadBooleans1() { + supportGlsl(100); + material("bad-booleans1.j3md"); // DepthTest yes + } + + @Test(expected = IllegalArgumentException.class) + public void testBadBooleans2() { + supportGlsl(100); + material("bad-booleans2.j3md"); // DepthWrite on + } + + @Test(expected = IllegalArgumentException.class) + public void testBadBooleans3() { + supportGlsl(100); + material("bad-booleans3.j3md"); // Wireframe true + } + @Test public void testShaderNodesMaterialDefLoading() { supportGlsl(100); diff --git a/jme3-core/src/test/java/com/jme3/math/TestIssue957.java b/jme3-core/src/test/java/com/jme3/math/TestIssue957.java new file mode 100644 index 000000000..16cca641e --- /dev/null +++ b/jme3-core/src/test/java/com/jme3/math/TestIssue957.java @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2018 jMonkeyEngine + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'jMonkeyEngine' nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package com.jme3.math; + +import org.junit.Test; + +/** + * Verify that a Triangle center and normal get recomputed after a change. This + * was issue #957 at GitHub. + * + * @author Stephen Gold + */ +public class TestIssue957 { + + final private Vector3f v0 = new Vector3f(0f, 0f, 0f); + final private Vector3f v1 = new Vector3f(3f, 0f, 0f); + final private Vector3f v2 = new Vector3f(0f, 3f, 0f); + + @Test + public void testIssue957() { + Vector3f v3 = new Vector3f(0f, 0f, 3f); + + Triangle t1 = makeTriangle(); + t1.set(2, v3); + checkTriangle(t1); + + Triangle t2 = makeTriangle(); + t2.set(v3, v0, v1); + checkTriangle(t2); + + Triangle t3 = makeTriangle(); + t3.set(2, v3.x, v3.y, v3.z); + checkTriangle(t3); + + Triangle t4 = makeTriangle(); + t4.set3(v3); + checkTriangle(t4); + } + + private Triangle makeTriangle() { + + Triangle triangle = new Triangle(v0, v1, v2); + /* + * Check center and normal before modification. + */ + Vector3f center = triangle.getCenter(); + Vector3f normal = triangle.getNormal(); + assert center.equals(new Vector3f(1f, 1f, 0f)); + assert normal.equals(new Vector3f(0f, 0f, 1f)); + + return triangle; + } + + /** + * Check center and normal after modification. + */ + private void checkTriangle(Triangle triangle) { + Vector3f center = triangle.getCenter(); + Vector3f normal = triangle.getNormal(); + assert center.equals(new Vector3f(1f, 0f, 1f)); + assert normal.equals(new Vector3f(0f, -1f, 0f)); + } +} diff --git a/jme3-core/src/test/java/com/jme3/scene/TestIssue954.java b/jme3-core/src/test/java/com/jme3/scene/TestIssue954.java new file mode 100644 index 000000000..6b94da664 --- /dev/null +++ b/jme3-core/src/test/java/com/jme3/scene/TestIssue954.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018 jMonkeyEngine + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'jMonkeyEngine' nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package com.jme3.scene; + +import org.junit.Test; + +/** + * Verify that an empty Node gets a valid bounding volume. This was issue #954 + * at GitHub. + * + * @author Stephen Gold + */ +public class TestIssue954 { + + Node rootNode; + + @Test + public void testIssue954() { + rootNode = new Node(); + rootNode.updateLogicalState(0.01f); + rootNode.updateGeometricState(); + assert rootNode.worldBound != null; + } +} diff --git a/jme3-core/src/test/resources/bad-booleans1.j3md b/jme3-core/src/test/resources/bad-booleans1.j3md new file mode 100644 index 000000000..a5a7ddf7c --- /dev/null +++ b/jme3-core/src/test/resources/bad-booleans1.j3md @@ -0,0 +1,199 @@ +MaterialDef bad-booleans1 { + + MaterialParameters { + Texture2D ColorMap + Texture2D LightMap + Color Color (Color) + Boolean VertexColor (UseVertexColor) + Float PointSize : 1.0 + Boolean SeparateTexCoord + + // Texture of the glowing parts of the material + Texture2D GlowMap + // The glow color of the object + Color GlowColor + + // For instancing + Boolean UseInstancing + + // For hardware skinning + Int NumberOfBones + Matrix4Array BoneMatrices + + // For Morph animation + FloatArray MorphWeights + Int NumberOfMorphTargets + Int NumberOfTargetsBuffers + + // Alpha threshold for fragment discarding + Float AlphaDiscardThreshold (AlphaTestFallOff) + + //Shadows + Int FilterMode + Boolean HardwareShadows + + Texture2D ShadowMap0 + Texture2D ShadowMap1 + Texture2D ShadowMap2 + Texture2D ShadowMap3 + //pointLights + Texture2D ShadowMap4 + Texture2D ShadowMap5 + + Float ShadowIntensity + Vector4 Splits + Vector2 FadeInfo + + Matrix4 LightViewProjectionMatrix0 + Matrix4 LightViewProjectionMatrix1 + Matrix4 LightViewProjectionMatrix2 + Matrix4 LightViewProjectionMatrix3 + //pointLight + Matrix4 LightViewProjectionMatrix4 + Matrix4 LightViewProjectionMatrix5 + Vector3 LightPos + Vector3 LightDir + + Float PCFEdge + + Float ShadowMapSize + + Boolean BackfaceShadows: true + } + + Technique { + VertexShader GLSL100 GLSL150: Common/MatDefs/Misc/Unshaded.vert + FragmentShader GLSL100 GLSL150: Common/MatDefs/Misc/Unshaded.frag + + WorldParameters { + WorldViewProjectionMatrix + ViewProjectionMatrix + ViewMatrix + } + + Defines { + INSTANCING : UseInstancing + SEPARATE_TEXCOORD : SeparateTexCoord + HAS_COLORMAP : ColorMap + HAS_LIGHTMAP : LightMap + HAS_VERTEXCOLOR : VertexColor + HAS_POINTSIZE : PointSize + HAS_COLOR : Color + NUM_BONES : NumberOfBones + DISCARD_ALPHA : AlphaDiscardThreshold + NUM_MORPH_TARGETS: NumberOfMorphTargets + NUM_TARGETS_BUFFERS: NumberOfTargetsBuffers + } + } + + Technique PreNormalPass { + + VertexShader GLSL100 GLSL150 : Common/MatDefs/SSAO/normal.vert + FragmentShader GLSL100 GLSL150 : Common/MatDefs/SSAO/normal.frag + + WorldParameters { + WorldViewProjectionMatrix + WorldViewMatrix + NormalMatrix + ViewProjectionMatrix + ViewMatrix + } + + Defines { + NUM_BONES : NumberOfBones + INSTANCING : UseInstancing + NUM_MORPH_TARGETS: NumberOfMorphTargets + NUM_TARGETS_BUFFERS: NumberOfTargetsBuffers + } + } + + Technique PreShadow { + + VertexShader GLSL100 GLSL150 : Common/MatDefs/Shadow/PreShadow.vert + FragmentShader GLSL100 GLSL150 : Common/MatDefs/Shadow/PreShadow.frag + + WorldParameters { + WorldViewProjectionMatrix + WorldViewMatrix + ViewProjectionMatrix + ViewMatrix + } + + Defines { + COLOR_MAP : ColorMap + DISCARD_ALPHA : AlphaDiscardThreshold + NUM_BONES : NumberOfBones + INSTANCING : UseInstancing + NUM_MORPH_TARGETS: NumberOfMorphTargets + NUM_TARGETS_BUFFERS: NumberOfTargetsBuffers + } + + ForcedRenderState { + FaceCull Off + DepthTest yes + DepthWrite On + PolyOffset 5 3 + ColorWrite Off + } + + } + + + Technique PostShadow { + VertexShader GLSL100 GLSL150: Common/MatDefs/Shadow/PostShadow.vert + FragmentShader GLSL100 GLSL150: Common/MatDefs/Shadow/PostShadow.frag + + WorldParameters { + WorldViewProjectionMatrix + WorldMatrix + ViewProjectionMatrix + ViewMatrix + } + + Defines { + HARDWARE_SHADOWS : HardwareShadows + FILTER_MODE : FilterMode + PCFEDGE : PCFEdge + DISCARD_ALPHA : AlphaDiscardThreshold + COLOR_MAP : ColorMap + SHADOWMAP_SIZE : ShadowMapSize + FADE : FadeInfo + PSSM : Splits + POINTLIGHT : LightViewProjectionMatrix5 + NUM_BONES : NumberOfBones + INSTANCING : UseInstancing + BACKFACE_SHADOWS: BackfaceShadows + NUM_MORPH_TARGETS: NumberOfMorphTargets + NUM_TARGETS_BUFFERS: NumberOfTargetsBuffers + } + + ForcedRenderState { + Blend Modulate + DepthWrite Off + PolyOffset -0.1 0 + } + } + + Technique Glow { + + VertexShader GLSL100 GLSL150: Common/MatDefs/Misc/Unshaded.vert + FragmentShader GLSL100 GLSL150: Common/MatDefs/Light/Glow.frag + + WorldParameters { + WorldViewProjectionMatrix + ViewProjectionMatrix + ViewMatrix + } + + Defines { + NEED_TEXCOORD1 + HAS_GLOWMAP : GlowMap + HAS_GLOWCOLOR : GlowColor + NUM_BONES : NumberOfBones + INSTANCING : UseInstancing + HAS_POINTSIZE : PointSize + NUM_MORPH_TARGETS: NumberOfMorphTargets + NUM_TARGETS_BUFFERS: NumberOfTargetsBuffers + } + } +} \ No newline at end of file diff --git a/jme3-core/src/test/resources/bad-booleans2.j3md b/jme3-core/src/test/resources/bad-booleans2.j3md new file mode 100644 index 000000000..0732d3cc7 --- /dev/null +++ b/jme3-core/src/test/resources/bad-booleans2.j3md @@ -0,0 +1,199 @@ +MaterialDef bad-booleans2 { + + MaterialParameters { + Texture2D ColorMap + Texture2D LightMap + Color Color (Color) + Boolean VertexColor (UseVertexColor) + Float PointSize : 1.0 + Boolean SeparateTexCoord + + // Texture of the glowing parts of the material + Texture2D GlowMap + // The glow color of the object + Color GlowColor + + // For instancing + Boolean UseInstancing + + // For hardware skinning + Int NumberOfBones + Matrix4Array BoneMatrices + + // For Morph animation + FloatArray MorphWeights + Int NumberOfMorphTargets + Int NumberOfTargetsBuffers + + // Alpha threshold for fragment discarding + Float AlphaDiscardThreshold (AlphaTestFallOff) + + //Shadows + Int FilterMode + Boolean HardwareShadows + + Texture2D ShadowMap0 + Texture2D ShadowMap1 + Texture2D ShadowMap2 + Texture2D ShadowMap3 + //pointLights + Texture2D ShadowMap4 + Texture2D ShadowMap5 + + Float ShadowIntensity + Vector4 Splits + Vector2 FadeInfo + + Matrix4 LightViewProjectionMatrix0 + Matrix4 LightViewProjectionMatrix1 + Matrix4 LightViewProjectionMatrix2 + Matrix4 LightViewProjectionMatrix3 + //pointLight + Matrix4 LightViewProjectionMatrix4 + Matrix4 LightViewProjectionMatrix5 + Vector3 LightPos + Vector3 LightDir + + Float PCFEdge + + Float ShadowMapSize + + Boolean BackfaceShadows: true + } + + Technique { + VertexShader GLSL100 GLSL150: Common/MatDefs/Misc/Unshaded.vert + FragmentShader GLSL100 GLSL150: Common/MatDefs/Misc/Unshaded.frag + + WorldParameters { + WorldViewProjectionMatrix + ViewProjectionMatrix + ViewMatrix + } + + Defines { + INSTANCING : UseInstancing + SEPARATE_TEXCOORD : SeparateTexCoord + HAS_COLORMAP : ColorMap + HAS_LIGHTMAP : LightMap + HAS_VERTEXCOLOR : VertexColor + HAS_POINTSIZE : PointSize + HAS_COLOR : Color + NUM_BONES : NumberOfBones + DISCARD_ALPHA : AlphaDiscardThreshold + NUM_MORPH_TARGETS: NumberOfMorphTargets + NUM_TARGETS_BUFFERS: NumberOfTargetsBuffers + } + } + + Technique PreNormalPass { + + VertexShader GLSL100 GLSL150 : Common/MatDefs/SSAO/normal.vert + FragmentShader GLSL100 GLSL150 : Common/MatDefs/SSAO/normal.frag + + WorldParameters { + WorldViewProjectionMatrix + WorldViewMatrix + NormalMatrix + ViewProjectionMatrix + ViewMatrix + } + + Defines { + NUM_BONES : NumberOfBones + INSTANCING : UseInstancing + NUM_MORPH_TARGETS: NumberOfMorphTargets + NUM_TARGETS_BUFFERS: NumberOfTargetsBuffers + } + } + + Technique PreShadow { + + VertexShader GLSL100 GLSL150 : Common/MatDefs/Shadow/PreShadow.vert + FragmentShader GLSL100 GLSL150 : Common/MatDefs/Shadow/PreShadow.frag + + WorldParameters { + WorldViewProjectionMatrix + WorldViewMatrix + ViewProjectionMatrix + ViewMatrix + } + + Defines { + COLOR_MAP : ColorMap + DISCARD_ALPHA : AlphaDiscardThreshold + NUM_BONES : NumberOfBones + INSTANCING : UseInstancing + NUM_MORPH_TARGETS: NumberOfMorphTargets + NUM_TARGETS_BUFFERS: NumberOfTargetsBuffers + } + + ForcedRenderState { + FaceCull Off + DepthTest On + DepthWrite on + PolyOffset 5 3 + ColorWrite Off + } + + } + + + Technique PostShadow { + VertexShader GLSL100 GLSL150: Common/MatDefs/Shadow/PostShadow.vert + FragmentShader GLSL100 GLSL150: Common/MatDefs/Shadow/PostShadow.frag + + WorldParameters { + WorldViewProjectionMatrix + WorldMatrix + ViewProjectionMatrix + ViewMatrix + } + + Defines { + HARDWARE_SHADOWS : HardwareShadows + FILTER_MODE : FilterMode + PCFEDGE : PCFEdge + DISCARD_ALPHA : AlphaDiscardThreshold + COLOR_MAP : ColorMap + SHADOWMAP_SIZE : ShadowMapSize + FADE : FadeInfo + PSSM : Splits + POINTLIGHT : LightViewProjectionMatrix5 + NUM_BONES : NumberOfBones + INSTANCING : UseInstancing + BACKFACE_SHADOWS: BackfaceShadows + NUM_MORPH_TARGETS: NumberOfMorphTargets + NUM_TARGETS_BUFFERS: NumberOfTargetsBuffers + } + + ForcedRenderState { + Blend Modulate + DepthWrite Off + PolyOffset -0.1 0 + } + } + + Technique Glow { + + VertexShader GLSL100 GLSL150: Common/MatDefs/Misc/Unshaded.vert + FragmentShader GLSL100 GLSL150: Common/MatDefs/Light/Glow.frag + + WorldParameters { + WorldViewProjectionMatrix + ViewProjectionMatrix + ViewMatrix + } + + Defines { + NEED_TEXCOORD1 + HAS_GLOWMAP : GlowMap + HAS_GLOWCOLOR : GlowColor + NUM_BONES : NumberOfBones + INSTANCING : UseInstancing + HAS_POINTSIZE : PointSize + NUM_MORPH_TARGETS: NumberOfMorphTargets + NUM_TARGETS_BUFFERS: NumberOfTargetsBuffers + } + } +} \ No newline at end of file diff --git a/jme3-core/src/test/resources/bad-booleans3.j3md b/jme3-core/src/test/resources/bad-booleans3.j3md new file mode 100644 index 000000000..8fda309da --- /dev/null +++ b/jme3-core/src/test/resources/bad-booleans3.j3md @@ -0,0 +1,200 @@ +MaterialDef bad-booleans3 { + + MaterialParameters { + Texture2D ColorMap + Texture2D LightMap + Color Color (Color) + Boolean VertexColor (UseVertexColor) + Float PointSize : 1.0 + Boolean SeparateTexCoord + + // Texture of the glowing parts of the material + Texture2D GlowMap + // The glow color of the object + Color GlowColor + + // For instancing + Boolean UseInstancing + + // For hardware skinning + Int NumberOfBones + Matrix4Array BoneMatrices + + // For Morph animation + FloatArray MorphWeights + Int NumberOfMorphTargets + Int NumberOfTargetsBuffers + + // Alpha threshold for fragment discarding + Float AlphaDiscardThreshold (AlphaTestFallOff) + + //Shadows + Int FilterMode + Boolean HardwareShadows + + Texture2D ShadowMap0 + Texture2D ShadowMap1 + Texture2D ShadowMap2 + Texture2D ShadowMap3 + //pointLights + Texture2D ShadowMap4 + Texture2D ShadowMap5 + + Float ShadowIntensity + Vector4 Splits + Vector2 FadeInfo + + Matrix4 LightViewProjectionMatrix0 + Matrix4 LightViewProjectionMatrix1 + Matrix4 LightViewProjectionMatrix2 + Matrix4 LightViewProjectionMatrix3 + //pointLight + Matrix4 LightViewProjectionMatrix4 + Matrix4 LightViewProjectionMatrix5 + Vector3 LightPos + Vector3 LightDir + + Float PCFEdge + + Float ShadowMapSize + + Boolean BackfaceShadows: true + } + + Technique { + VertexShader GLSL100 GLSL150: Common/MatDefs/Misc/Unshaded.vert + FragmentShader GLSL100 GLSL150: Common/MatDefs/Misc/Unshaded.frag + + WorldParameters { + WorldViewProjectionMatrix + ViewProjectionMatrix + ViewMatrix + } + + Defines { + INSTANCING : UseInstancing + SEPARATE_TEXCOORD : SeparateTexCoord + HAS_COLORMAP : ColorMap + HAS_LIGHTMAP : LightMap + HAS_VERTEXCOLOR : VertexColor + HAS_POINTSIZE : PointSize + HAS_COLOR : Color + NUM_BONES : NumberOfBones + DISCARD_ALPHA : AlphaDiscardThreshold + NUM_MORPH_TARGETS: NumberOfMorphTargets + NUM_TARGETS_BUFFERS: NumberOfTargetsBuffers + } + } + + Technique PreNormalPass { + + VertexShader GLSL100 GLSL150 : Common/MatDefs/SSAO/normal.vert + FragmentShader GLSL100 GLSL150 : Common/MatDefs/SSAO/normal.frag + + WorldParameters { + WorldViewProjectionMatrix + WorldViewMatrix + NormalMatrix + ViewProjectionMatrix + ViewMatrix + } + + Defines { + NUM_BONES : NumberOfBones + INSTANCING : UseInstancing + NUM_MORPH_TARGETS: NumberOfMorphTargets + NUM_TARGETS_BUFFERS: NumberOfTargetsBuffers + } + } + + Technique PreShadow { + + VertexShader GLSL100 GLSL150 : Common/MatDefs/Shadow/PreShadow.vert + FragmentShader GLSL100 GLSL150 : Common/MatDefs/Shadow/PreShadow.frag + + WorldParameters { + WorldViewProjectionMatrix + WorldViewMatrix + ViewProjectionMatrix + ViewMatrix + } + + Defines { + COLOR_MAP : ColorMap + DISCARD_ALPHA : AlphaDiscardThreshold + NUM_BONES : NumberOfBones + INSTANCING : UseInstancing + NUM_MORPH_TARGETS: NumberOfMorphTargets + NUM_TARGETS_BUFFERS: NumberOfTargetsBuffers + } + + ForcedRenderState { + Wireframe true + FaceCull Off + DepthTest On + DepthWrite On + PolyOffset 5 3 + ColorWrite Off + } + + } + + + Technique PostShadow { + VertexShader GLSL100 GLSL150: Common/MatDefs/Shadow/PostShadow.vert + FragmentShader GLSL100 GLSL150: Common/MatDefs/Shadow/PostShadow.frag + + WorldParameters { + WorldViewProjectionMatrix + WorldMatrix + ViewProjectionMatrix + ViewMatrix + } + + Defines { + HARDWARE_SHADOWS : HardwareShadows + FILTER_MODE : FilterMode + PCFEDGE : PCFEdge + DISCARD_ALPHA : AlphaDiscardThreshold + COLOR_MAP : ColorMap + SHADOWMAP_SIZE : ShadowMapSize + FADE : FadeInfo + PSSM : Splits + POINTLIGHT : LightViewProjectionMatrix5 + NUM_BONES : NumberOfBones + INSTANCING : UseInstancing + BACKFACE_SHADOWS: BackfaceShadows + NUM_MORPH_TARGETS: NumberOfMorphTargets + NUM_TARGETS_BUFFERS: NumberOfTargetsBuffers + } + + ForcedRenderState { + Blend Modulate + DepthWrite Off + PolyOffset -0.1 0 + } + } + + Technique Glow { + + VertexShader GLSL100 GLSL150: Common/MatDefs/Misc/Unshaded.vert + FragmentShader GLSL100 GLSL150: Common/MatDefs/Light/Glow.frag + + WorldParameters { + WorldViewProjectionMatrix + ViewProjectionMatrix + ViewMatrix + } + + Defines { + NEED_TEXCOORD1 + HAS_GLOWMAP : GlowMap + HAS_GLOWCOLOR : GlowColor + NUM_BONES : NumberOfBones + INSTANCING : UseInstancing + HAS_POINTSIZE : PointSize + NUM_MORPH_TARGETS: NumberOfMorphTargets + NUM_TARGETS_BUFFERS: NumberOfTargetsBuffers + } + } +} \ No newline at end of file diff --git a/jme3-desktop/src/main/java/com/jme3/app/SettingsDialog.java b/jme3-desktop/src/main/java/com/jme3/app/SettingsDialog.java index e2d64c8b9..15e7aa76c 100644 --- a/jme3-desktop/src/main/java/com/jme3/app/SettingsDialog.java +++ b/jme3-desktop/src/main/java/com/jme3/app/SettingsDialog.java @@ -442,6 +442,12 @@ public final class SettingsDialog extends JFrame { if (verifyAndSaveCurrentSelection()) { setUserSelection(APPROVE_SELECTION); dispose(); + + // System.gc() should be called to prevent "X Error of failed request: RenderBadPicture (invalid Picture parameter)" + // on Linux when using AWT/Swing + GLFW. + // For more info see: https://github.com/LWJGL/lwjgl3/issues/149, https://hub.jmonkeyengine.org/t/experimenting-lwjgl3/37275 + System.gc(); + System.gc(); } } }); diff --git a/jme3-desktop/src/main/java/com/jme3/cursors/plugins/CursorLoader.java b/jme3-desktop/src/main/java/com/jme3/cursors/plugins/CursorLoader.java index ce82cbe17..037927ac6 100644 --- a/jme3-desktop/src/main/java/com/jme3/cursors/plugins/CursorLoader.java +++ b/jme3-desktop/src/main/java/com/jme3/cursors/plugins/CursorLoader.java @@ -699,7 +699,7 @@ public class CursorLoader implements AssetLoader { imgDelay = BufferUtils.createIntBuffer(numImages); } imgDelay.put(cid.imgDelay); - } else if (imgData != null) { + } else if (imgDelay != null) { imgDelay.put(cid.imgDelay); } xHotSpot = cid.xHotSpot; diff --git a/jme3-desktop/src/main/java/com/jme3/input/awt/AwtKeyInput.java b/jme3-desktop/src/main/java/com/jme3/input/awt/AwtKeyInput.java index ac4ff75eb..b27e29035 100644 --- a/jme3-desktop/src/main/java/com/jme3/input/awt/AwtKeyInput.java +++ b/jme3-desktop/src/main/java/com/jme3/input/awt/AwtKeyInput.java @@ -371,6 +371,8 @@ public class AwtKeyInput implements KeyInput, KeyListener { return KeyEvent.VK_ALT; //todo: location left case KEY_RMENU: return KeyEvent.VK_ALT; //todo: location right + case KEY_PRTSCR: + return KeyEvent.VK_PRINTSCREEN; } logger.log(Level.WARNING, "unsupported key:{0}", key); return 0x10000 + key; @@ -600,6 +602,8 @@ public class AwtKeyInput implements KeyInput, KeyListener { return KEY_LMENU; //Left vs. Right need to improve case KeyEvent.VK_META: return KEY_RCONTROL; + case KeyEvent.VK_PRINTSCREEN: + return KEY_PRTSCR; } logger.log( Level.WARNING, "unsupported key:{0}", key); diff --git a/jme3-desktop/src/main/java/jme3tools/navigation/Coordinate.java b/jme3-desktop/src/main/java/jme3tools/navigation/Coordinate.java index 0a8e82360..79a72f571 100644 --- a/jme3-desktop/src/main/java/jme3tools/navigation/Coordinate.java +++ b/jme3-desktop/src/main/java/jme3tools/navigation/Coordinate.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -116,7 +116,7 @@ public class Coordinate { * This constructor takes a coordinate in the ALRS formats i.e * 38∞31.64'N for lat, and 28∞19.12'W for long * Note: ALRS positions are occasionally written with the decimal minutes - * apostrophe in the 'wrong' place and with an non CP1252 compliant decimal character. + * apostrophe in the 'wrong' place and with a non CP1252 compliant decimal character. * This issue has to be corrected in the source database * @param coOrdinate * @throws InvalidPositionException diff --git a/jme3-effects/src/main/java/com/jme3/post/filters/CartoonEdgeFilter.java b/jme3-effects/src/main/java/com/jme3/post/filters/CartoonEdgeFilter.java index 8308c8a46..efcc319a7 100644 --- a/jme3-effects/src/main/java/com/jme3/post/filters/CartoonEdgeFilter.java +++ b/jme3-effects/src/main/java/com/jme3/post/filters/CartoonEdgeFilter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -165,7 +165,7 @@ public class CartoonEdgeFilter extends Filter { /** * sets the edge intensity
    - * Defineshow visilble will be the outlined edges + * Defineshow visible will be the outlined edges * @param edgeIntensity */ public void setEdgeIntensity(float edgeIntensity) { diff --git a/jme3-effects/src/main/java/com/jme3/post/filters/ColorOverlayFilter.java b/jme3-effects/src/main/java/com/jme3/post/filters/ColorOverlayFilter.java index 50173c3fc..58f1c7941 100644 --- a/jme3-effects/src/main/java/com/jme3/post/filters/ColorOverlayFilter.java +++ b/jme3-effects/src/main/java/com/jme3/post/filters/ColorOverlayFilter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -53,7 +53,7 @@ public class ColorOverlayFilter extends Filter { private ColorRGBA color = ColorRGBA.White; /** - * creates a colorOverlayFilter with a white coor (transparent) + * creates a colorOverlayFilter with a white color (transparent) */ public ColorOverlayFilter() { super("Color Overlay"); diff --git a/jme3-effects/src/main/java/com/jme3/post/filters/CrossHatchFilter.java b/jme3-effects/src/main/java/com/jme3/post/filters/CrossHatchFilter.java index 699a252cd..31399e79c 100644 --- a/jme3-effects/src/main/java/com/jme3/post/filters/CrossHatchFilter.java +++ b/jme3-effects/src/main/java/com/jme3/post/filters/CrossHatchFilter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -269,35 +269,35 @@ public class CrossHatchFilter extends Filter { } /** - * Returns treshold for lines 1 + * Returns threshold for lines 1 */ public float getLuminance1() { return luminance1; } /** - * Returns treshold for lines 2 + * Returns threshold for lines 2 */ public float getLuminance2() { return luminance2; } /** - * Returns treshold for lines 3 + * Returns threshold for lines 3 */ public float getLuminance3() { return luminance3; } /** - * Returns treshold for lines 4 + * Returns threshold for lines 4 */ public float getLuminance4() { return luminance4; } /** - * Returns treshold for blobs + * Returns threshold for blobs */ public float getLuminance5() { return luminance5; diff --git a/jme3-effects/src/main/java/com/jme3/post/filters/DepthOfFieldFilter.java b/jme3-effects/src/main/java/com/jme3/post/filters/DepthOfFieldFilter.java index 381bff2ff..872b3566e 100644 --- a/jme3-effects/src/main/java/com/jme3/post/filters/DepthOfFieldFilter.java +++ b/jme3-effects/src/main/java/com/jme3/post/filters/DepthOfFieldFilter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -54,10 +54,13 @@ public class DepthOfFieldFilter extends Filter { private float focusDistance = 50f; private float focusRange = 10f; private float blurScale = 1f; + private float blurThreshold = 0.2f; // These values are set internally based on the // viewport size. private float xScale; private float yScale; + + private boolean debugUnfocus; /** * Creates a DepthOfField filter @@ -83,7 +86,8 @@ public class DepthOfFieldFilter extends Filter { material = new Material(assets, "Common/MatDefs/Post/DepthOfField.j3md"); material.setFloat("FocusDistance", focusDistance); material.setFloat("FocusRange", focusRange); - + material.setFloat("BlurThreshold", blurThreshold); + material.setBoolean("DebugUnfocus", debugUnfocus); xScale = 1.0f / w; yScale = 1.0f / h; @@ -136,7 +140,7 @@ public class DepthOfFieldFilter extends Filter { /** * Sets the blur amount by scaling the convolution filter up or * down. A value of 1 (the default) performs a sparse 5x5 evenly - * distribubted convolution at pixel level accuracy. Higher values skip + * distributed convolution at pixel level accuracy. Higher values skip * more pixels, and so on until you are no longer blurring the image * but simply hashing it. * @@ -161,13 +165,62 @@ public class DepthOfFieldFilter extends Filter { return blurScale; } + /** + * Sets the minimum blur factor before the convolution filter is + * calculated. The default is 0.2 which means if the "unfocus" + * amount is less than 0.2 (where 0 is no blur and 1.0 is full blurScale) + * then no blur will be applied at all. Depending on the GPU implementation, + * this may be an optimization since it uses branching to skip the expensive + * convolution filter. + * + *

    In scenes where the focus distance is close (like 0) and the focus range + * is relatively large, this threshold will remove some subtlety in + * the near-camera blurring and should be set smaller than the default + * or to 0 to disable completely. Sometimes that cut-off is desired if + * mid-to-far field unfocusing is all that is desired.

    + */ + public void setBlurThreshold( float f ) { + this.blurThreshold = f; + if (material != null) { + material.setFloat("BlurThreshold", blurThreshold); + } + } + + /** + * returns the blur threshold. + * @return + */ + public float getBlurThreshold() { + return blurThreshold; + } + + /** + * Turns on/off debugging of the 'unfocus' value that is used to + * mix the convolution filter. When this is on, the 'unfocus' value + * is rendered as gray scale. This can be used to more easily visualize + * where in your view the focus is centered and how steep the gradient/cutoff + * is, etc.. + */ + public void setDebugUnfocus( boolean b ) { + this.debugUnfocus = b; + if( material != null ) { + material.setBoolean("DebugUnfocus", debugUnfocus); + } + } + + public boolean getDebugUnfocus() { + return debugUnfocus; + } + @Override public void write(JmeExporter ex) throws IOException { super.write(ex); OutputCapsule oc = ex.getCapsule(this); oc.write(blurScale, "blurScale", 1f); + oc.write(blurScale, "blurThreshold", 0.2f); oc.write(focusDistance, "focusDistance", 50f); oc.write(focusRange, "focusRange", 10f); + oc.write(debugUnfocus, "debugUnfocus", false); // strange to write this I guess } @Override @@ -175,7 +228,9 @@ public class DepthOfFieldFilter extends Filter { super.read(im); InputCapsule ic = im.getCapsule(this); blurScale = ic.readFloat("blurScale", 1f); + blurThreshold = ic.readFloat("blurThreshold", 0.2f); focusDistance = ic.readFloat("focusDistance", 50f); focusRange = ic.readFloat("focusRange", 10f); + debugUnfocus = ic.readBoolean("debugUnfocus", false); } } diff --git a/jme3-effects/src/main/java/com/jme3/post/filters/FadeFilter.java b/jme3-effects/src/main/java/com/jme3/post/filters/FadeFilter.java index be7fe46ab..ba8210c30 100644 --- a/jme3-effects/src/main/java/com/jme3/post/filters/FadeFilter.java +++ b/jme3-effects/src/main/java/com/jme3/post/filters/FadeFilter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -154,7 +154,7 @@ public class FadeFilter extends Filter { /** * return the current value of the fading - * can be used to chack if fade is complete (eg value=1) + * can be used to check if fade is complete (eg value=1) * @return */ public float getValue() { diff --git a/jme3-effects/src/main/java/com/jme3/post/filters/LightScatteringFilter.java b/jme3-effects/src/main/java/com/jme3/post/filters/LightScatteringFilter.java index 271358454..3d98e1165 100644 --- a/jme3-effects/src/main/java/com/jme3/post/filters/LightScatteringFilter.java +++ b/jme3-effects/src/main/java/com/jme3/post/filters/LightScatteringFilter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -47,8 +47,8 @@ import com.jme3.renderer.queue.RenderQueue; import java.io.IOException; /** - * LightScattering filters creates rays comming from a light sources - * This is often reffered as god rays. + * LightScattering filters create rays coming from light sources + * This is often referred to as god rays. * * @author Rémy Bouquet aka Nehon */ @@ -67,7 +67,7 @@ public class LightScatteringFilter extends Filter { private ViewPort viewPort; /** - * creates a lightScaterring filter + * creates a lightScattering filter */ public LightScatteringFilter() { super("Light Scattering"); @@ -200,7 +200,7 @@ public class LightScatteringFilter extends Filter { } /** - * returns the nmber of samples for the radial blur + * returns the number of samples for the radial blur * @return */ public int getNbSamples() { @@ -209,7 +209,7 @@ public class LightScatteringFilter extends Filter { /** * sets the number of samples for the radial blur default is 50 - * the higher the value the higher the quality, but the slower the performances. + * the higher the value the higher the quality, but the slower the performance. * @param nbSamples */ public void setNbSamples(int nbSamples) { diff --git a/jme3-effects/src/main/java/com/jme3/post/filters/PosterizationFilter.java b/jme3-effects/src/main/java/com/jme3/post/filters/PosterizationFilter.java index 2e380c610..f3400c553 100644 --- a/jme3-effects/src/main/java/com/jme3/post/filters/PosterizationFilter.java +++ b/jme3-effects/src/main/java/com/jme3/post/filters/PosterizationFilter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -115,7 +115,7 @@ public class PosterizationFilter extends Filter { } /** - * Sets urrent strength value, i.e. influence on final image + * Sets current strength value, i.e. influence on final image */ public void setStrength(float strength) { this.strength = strength; diff --git a/jme3-effects/src/main/java/com/jme3/post/filters/RadialBlurFilter.java b/jme3-effects/src/main/java/com/jme3/post/filters/RadialBlurFilter.java index 3fb25b51e..28cc2c28c 100644 --- a/jme3-effects/src/main/java/com/jme3/post/filters/RadialBlurFilter.java +++ b/jme3-effects/src/main/java/com/jme3/post/filters/RadialBlurFilter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -63,7 +63,7 @@ public class RadialBlurFilter extends Filter { /** * Creates a RadialBlurFilter * @param sampleDist the distance between samples - * @param sampleStrength the strenght of each sample + * @param sampleStrength the strength of each sample */ public RadialBlurFilter(float sampleDist, float sampleStrength) { this(); @@ -124,7 +124,7 @@ public class RadialBlurFilter extends Filter { } /** - * sets the sample streanght default is 2.2 + * sets the sample strength default is 2.2 * @param sampleStrength */ public void setSampleStrength(float sampleStrength) { diff --git a/jme3-effects/src/main/java/com/jme3/post/ssao/SSAOFilter.java b/jme3-effects/src/main/java/com/jme3/post/ssao/SSAOFilter.java index 3645bfd36..611f9954f 100644 --- a/jme3-effects/src/main/java/com/jme3/post/ssao/SSAOFilter.java +++ b/jme3-effects/src/main/java/com/jme3/post/ssao/SSAOFilter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -53,7 +53,7 @@ import java.util.ArrayList; /** * SSAO stands for screen space ambient occlusion - * It's a technique that fake ambient lighting by computing shadows that near by objects would casts on each others + * It's a technique that fakes ambient lighting by computing shadows that near by objects would casts on each others * under the effect of an ambient light * more info on this in this blog post http://jmonkeyengine.org/2010/08/16/screen-space-ambient-occlusion-for-jmonkeyengine-3-0/ * @@ -207,7 +207,7 @@ public class SSAOFilter extends Filter { } /** - * Sets the the width of the occlusion cone considered by the occludee default is 0.1f + * Sets the width of the occlusion cone considered by the occludee default is 0.1f * @param bias */ public void setBias(float bias) { @@ -247,7 +247,7 @@ public class SSAOFilter extends Filter { } /** - * Sets the radius of the area where random samples will be picked dafault 5.1f + * Sets the radius of the area where random samples will be picked default 5.1f * @param sampleRadius */ public void setSampleRadius(float sampleRadius) { diff --git a/jme3-effects/src/main/java/com/jme3/water/SimpleWaterProcessor.java b/jme3-effects/src/main/java/com/jme3/water/SimpleWaterProcessor.java index 7f07cd550..36ae8ee60 100644 --- a/jme3-effects/src/main/java/com/jme3/water/SimpleWaterProcessor.java +++ b/jme3-effects/src/main/java/com/jme3/water/SimpleWaterProcessor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -50,7 +50,7 @@ import com.jme3.ui.Picture; * * Simple Water renders a simple plane that use reflection and refraction to look like water. * It's pretty basic, but much faster than the WaterFilter - * It's useful if you aim low specs hardware and still want a good looking water. + * It's useful if you aim for low specs hardware and still want a good looking water. * Usage is : * * SimpleWaterProcessor waterProcessor = new SimpleWaterProcessor(assetManager); @@ -514,7 +514,7 @@ public class SimpleWaterProcessor implements SceneProcessor { /** - * retruns true if the waterprocessor is in debug mode + * returns true if the waterprocessor is in debug mode * @return */ public boolean isDebug() { diff --git a/jme3-effects/src/main/java/com/jme3/water/WaterFilter.java b/jme3-effects/src/main/java/com/jme3/water/WaterFilter.java index a1240d12d..162abb85e 100644 --- a/jme3-effects/src/main/java/com/jme3/water/WaterFilter.java +++ b/jme3-effects/src/main/java/com/jme3/water/WaterFilter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -569,8 +569,8 @@ public class WaterFilter extends Filter implements JmeCloneable, Cloneable { /** * This is a constant related to the index of refraction (IOR) used to compute the fresnel term. * F = R0 + (1-R0)( 1 - N.V)^5 - * where F is the fresnel term, R0 the constant, N the normal vector and V tne view vector. - * It usually depend on the material you are lookinh through (here water). + * where F is the fresnel term, R0 the constant, N the normal vector and V the view vector. + * It usually depend on the material you are looking through (here water). * Default value is 0.3f * In practice, the lowest the value and the less the reflection can be seen on water * @param refractionConstant @@ -683,7 +683,7 @@ public class WaterFilter extends Filter implements JmeCloneable, Cloneable { } /** - * returns the refractionStrenght + * returns the refractionStrength * @return */ public float getRefractionStrength() { @@ -692,7 +692,7 @@ public class WaterFilter extends Filter implements JmeCloneable, Cloneable { /** * This value modifies current fresnel term. If you want to weaken - * reflections use bigger value. If you want to empasize them use + * reflections use bigger value. If you want to emphasize them use * value smaller then 0. Default is 0.0f. * @param refractionStrength */ @@ -725,7 +725,7 @@ public class WaterFilter extends Filter implements JmeCloneable, Cloneable { } /** - * returns the foam existance vector + * returns the foam existence vector * @return */ public Vector3f getFoamExistence() { @@ -766,7 +766,7 @@ public class WaterFilter extends Filter implements JmeCloneable, Cloneable { } /** - * Returns the color exctinction vector of the water + * Returns the color extinction vector of the water * @return */ public Vector3f getColorExtinction() { @@ -778,7 +778,7 @@ public class WaterFilter extends Filter implements JmeCloneable, Cloneable { * the first value is for red * the second is for green * the third is for blue - * Play with thos parameters to "trouble" the water + * Play with those parameters to "trouble" the water * default is (5.0, 20.0, 30.0f); * @param colorExtinction */ @@ -864,7 +864,7 @@ public class WaterFilter extends Filter implements JmeCloneable, Cloneable { } /** - * Sets the shinines factor of the water + * Sets the shininess factor of the water * default is 0.7f * @param shininess */ @@ -876,7 +876,7 @@ public class WaterFilter extends Filter implements JmeCloneable, Cloneable { } /** - * retruns the speed of the waves + * returns the speed of the waves * @return */ public float getSpeed() { diff --git a/jme3-effects/src/main/resources/Common/MatDefs/Post/DepthOfField.frag b/jme3-effects/src/main/resources/Common/MatDefs/Post/DepthOfField.frag index cdc1a3526..ccf20ba59 100644 --- a/jme3-effects/src/main/resources/Common/MatDefs/Post/DepthOfField.frag +++ b/jme3-effects/src/main/resources/Common/MatDefs/Post/DepthOfField.frag @@ -10,7 +10,7 @@ uniform float m_FocusDistance; uniform float m_XScale; uniform float m_YScale; -vec2 m_NearFar = vec2( 0.1, 1000.0 ); +uniform vec2 g_FrustumNearFar; void main() { @@ -31,8 +31,8 @@ void main() { // z * (zb - a) = b // z = b / (zb - a) // - float a = m_NearFar.y / (m_NearFar.y - m_NearFar.x); - float b = m_NearFar.y * m_NearFar.x / (m_NearFar.x - m_NearFar.y); + float a = g_FrustumNearFar.y / (g_FrustumNearFar.y - g_FrustumNearFar.x); + float b = g_FrustumNearFar.y * g_FrustumNearFar.x / (g_FrustumNearFar.x - g_FrustumNearFar.y); float z = b / (zBuffer - a); // Above could be the same for any depth-based filter @@ -42,7 +42,7 @@ void main() { // at +/- m_FocusRange to either side of that. float unfocus = min( 1.0, abs( z - m_FocusDistance ) / m_FocusRange ); - if( unfocus < 0.2 ) { + if( unfocus < BLUR_THRESHOLD ) { // If we are mostly in focus then don't bother with the // convolution filter gl_FragColor = texVal; @@ -86,7 +86,11 @@ void main() { gl_FragColor = mix( texVal, sum, unfocus ); - // I used this for debugging the range - // gl_FragColor.r = unfocus; + #ifdef DEBUG_UNFOCUS + // Used for debugging the range or user settings + gl_FragColor.r = unfocus; + gl_FragColor.g = unfocus; + gl_FragColor.b = unfocus; + #endif } -} \ No newline at end of file +} diff --git a/jme3-effects/src/main/resources/Common/MatDefs/Post/DepthOfField.j3md b/jme3-effects/src/main/resources/Common/MatDefs/Post/DepthOfField.j3md index a4fe79601..908889951 100644 --- a/jme3-effects/src/main/resources/Common/MatDefs/Post/DepthOfField.j3md +++ b/jme3-effects/src/main/resources/Common/MatDefs/Post/DepthOfField.j3md @@ -9,6 +9,8 @@ MaterialDef Depth Of Field { Float FocusDistance; Float XScale; Float YScale; + Float BlurThreshold : 0.2; + Boolean DebugUnfocus : false; } Technique { @@ -16,12 +18,15 @@ MaterialDef Depth Of Field { FragmentShader GLSL150 GLSL100: Common/MatDefs/Post/DepthOfField.frag WorldParameters { + FrustumNearFar } Defines { RESOLVE_MS : NumSamples RESOLVE_DEPTH_MS : NumSamplesDepth + BLUR_THRESHOLD : BlurThreshold + DEBUG_UNFOCUS : DebugUnfocus } } -} \ No newline at end of file +} diff --git a/jme3-examples/build.gradle b/jme3-examples/build.gradle index dde857609..cd98abaa9 100644 --- a/jme3-examples/build.gradle +++ b/jme3-examples/build.gradle @@ -7,10 +7,6 @@ if (!hasProperty('mainClass')) { task run(dependsOn: 'build', type:JavaExec) { main = mainClass classpath = sourceSets.main.runtimeClasspath - if (System.properties['os.name'].toLowerCase().contains('mac')) { - jvmArgs "-XstartOnFirstThread" - jvmArgs "-Djava.awt.headless=true" - } if (System.properties['java.util.logging.config.file'] != null) { systemProperty "java.util.logging.config.file", System.properties['java.util.logging.config.file'] diff --git a/jme3-examples/src/main/java/jme3test/TestChooser.java b/jme3-examples/src/main/java/jme3test/TestChooser.java index 5c2c572a1..c47196035 100644 --- a/jme3-examples/src/main/java/jme3test/TestChooser.java +++ b/jme3-examples/src/main/java/jme3test/TestChooser.java @@ -76,7 +76,7 @@ public class TestChooser extends JDialog { /** * Only accessed from EDT */ - private Object[] selectedClass = null; + private java.util.List selectedClass = null; private boolean showSetting = true; /** @@ -246,7 +246,7 @@ public class TestChooser extends JDialog { }; } - private void startApp(final Object[] appClass){ + private void startApp(final java.util.List appClass){ if (appClass == null){ JOptionPane.showMessageDialog(rootPane, "Please select a test from the list", @@ -257,8 +257,8 @@ public class TestChooser extends JDialog { new Thread(new Runnable(){ public void run(){ - for (int i = 0; i < appClass.length; i++) { - Class clazz = (Class)appClass[i]; + for (int i = 0; i < appClass.size(); i++) { + Class clazz = (Class)appClass.get(i); try { if (LegacyApplication.class.isAssignableFrom(clazz)) { Object app = clazz.newInstance(); @@ -333,7 +333,7 @@ public class TestChooser extends JDialog { list.getSelectionModel().addListSelectionListener( new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { - selectedClass = list.getSelectedValues(); + selectedClass = list.getSelectedValuesList(); } }); list.addMouseListener(new MouseAdapter() { @@ -485,7 +485,7 @@ public class TestChooser extends JDialog { }); jtf.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - selectedClass = classes.getSelectedValues(); + selectedClass = classes.getSelectedValuesList(); startApp(selectedClass); } }); diff --git a/jme3-examples/src/main/java/jme3test/animation/SubtitleTrack.java b/jme3-examples/src/main/java/jme3test/animation/SubtitleTrack.java index 177050118..d1d415128 100644 --- a/jme3-examples/src/main/java/jme3test/animation/SubtitleTrack.java +++ b/jme3-examples/src/main/java/jme3test/animation/SubtitleTrack.java @@ -31,7 +31,7 @@ */ package jme3test.animation; -import com.jme3.cinematic.events.GuiTrack; +import com.jme3.cinematic.events.GuiEvent; import de.lessvoid.nifty.Nifty; import de.lessvoid.nifty.elements.render.TextRenderer; @@ -39,7 +39,7 @@ import de.lessvoid.nifty.elements.render.TextRenderer; * * @author Nehon */ -public class SubtitleTrack extends GuiTrack{ +public class SubtitleTrack extends GuiEvent{ private String text=""; public SubtitleTrack(Nifty nifty, String screen,float initialDuration, String text) { @@ -50,7 +50,8 @@ public class SubtitleTrack extends GuiTrack{ @Override public void onPlay() { super.onPlay(); - nifty.getScreen(screen).findElementByName("text").getRenderer(TextRenderer.class).setText(text); + nifty.getScreen(screen).findElementById("text") + .getRenderer(TextRenderer.class).setText(text); } diff --git a/jme3-examples/src/main/java/jme3test/animation/TestCinematic.java b/jme3-examples/src/main/java/jme3test/animation/TestCinematic.java index a066426e4..8332ffafe 100644 --- a/jme3-examples/src/main/java/jme3test/animation/TestCinematic.java +++ b/jme3-examples/src/main/java/jme3test/animation/TestCinematic.java @@ -31,13 +31,9 @@ */ package jme3test.animation; -import com.jme3.animation.AnimControl; -import com.jme3.animation.AnimationFactory; -import com.jme3.animation.LoopMode; +import com.jme3.animation.*; import com.jme3.app.SimpleApplication; -import com.jme3.cinematic.Cinematic; -import com.jme3.cinematic.MotionPath; -import com.jme3.cinematic.PlayState; +import com.jme3.cinematic.*; import com.jme3.cinematic.events.*; import com.jme3.font.BitmapText; import com.jme3.input.ChaseCamera; @@ -45,21 +41,18 @@ import com.jme3.input.controls.ActionListener; import com.jme3.input.controls.KeyTrigger; import com.jme3.light.DirectionalLight; import com.jme3.material.Material; -import com.jme3.math.ColorRGBA; -import com.jme3.math.FastMath; -import com.jme3.math.Vector3f; +import com.jme3.math.*; import com.jme3.niftygui.NiftyJmeDisplay; import com.jme3.post.FilterPostProcessor; import com.jme3.post.filters.FadeFilter; import com.jme3.renderer.Caps; import com.jme3.renderer.queue.RenderQueue.ShadowMode; -import com.jme3.scene.CameraNode; -import com.jme3.scene.Geometry; -import com.jme3.scene.Spatial; +import com.jme3.scene.*; import com.jme3.scene.shape.Box; -import com.jme3.shadow.PssmShadowRenderer; +import com.jme3.shadow.DirectionalLightShadowRenderer; import de.lessvoid.nifty.Nifty; +//TODO rework this Test when the new animation system is done. public class TestCinematic extends SimpleApplication { private Spatial model; @@ -77,7 +70,6 @@ public class TestCinematic extends SimpleApplication { app.start(); - } @Override @@ -202,7 +194,7 @@ public class TestCinematic extends SimpleApplication { private void createScene() { - model = (Spatial) assetManager.loadModel("Models/Oto/Oto.mesh.xml"); + model = assetManager.loadModel("Models/Oto/OtoOldAnim.j3o"); model.center(); model.setShadowMode(ShadowMode.CastAndReceive); rootNode.attachChild(model); @@ -237,10 +229,11 @@ public class TestCinematic extends SimpleApplication { fpp.addFilter(fade); if (renderer.getCaps().contains(Caps.GLSL100)) { - PssmShadowRenderer pssm = new PssmShadowRenderer(assetManager, 512, 1); - pssm.setDirection(new Vector3f(0, -1, -1).normalizeLocal()); - pssm.setShadowIntensity(0.4f); - viewPort.addProcessor(pssm); + DirectionalLightShadowRenderer dlsr + = new DirectionalLightShadowRenderer(assetManager, 512, 1); + dlsr.setLight(light); + dlsr.setShadowIntensity(0.4f); + viewPort.addProcessor(dlsr); viewPort.addProcessor(fpp); } } diff --git a/jme3-examples/src/main/java/jme3test/audio/TestAmbient.java b/jme3-examples/src/main/java/jme3test/audio/TestAmbient.java index 2703d53da..6d300525e 100644 --- a/jme3-examples/src/main/java/jme3test/audio/TestAmbient.java +++ b/jme3-examples/src/main/java/jme3test/audio/TestAmbient.java @@ -29,6 +29,7 @@ package jme3test.audio; import com.jme3.app.SimpleApplication; +import com.jme3.audio.AudioData.DataType; import com.jme3.audio.AudioNode; import com.jme3.audio.Environment; import com.jme3.material.Material; @@ -55,13 +56,15 @@ public class TestAmbient extends SimpleApplication { Environment env = new Environment(eax); audioRenderer.setEnvironment(env); - waves = new AudioNode(assetManager, "Sound/Environment/Ocean Waves.ogg", false); + waves = new AudioNode(assetManager, "Sound/Environment/Ocean Waves.ogg", + DataType.Buffer); waves.setPositional(true); waves.setLocalTranslation(new Vector3f(0, 0,0)); waves.setMaxDistance(100); waves.setRefDistance(5); - nature = new AudioNode(assetManager, "Sound/Environment/Nature.ogg", true); + nature = new AudioNode(assetManager, "Sound/Environment/Nature.ogg", + DataType.Stream); nature.setPositional(false); nature.setVolume(3); diff --git a/jme3-examples/src/main/java/jme3test/audio/TestMusicStreaming.java b/jme3-examples/src/main/java/jme3test/audio/TestMusicStreaming.java index 6d7ceb913..35332b11d 100644 --- a/jme3-examples/src/main/java/jme3test/audio/TestMusicStreaming.java +++ b/jme3-examples/src/main/java/jme3test/audio/TestMusicStreaming.java @@ -34,6 +34,7 @@ package jme3test.audio; import com.jme3.app.SimpleApplication; import com.jme3.asset.plugins.UrlLocator; +import com.jme3.audio.AudioData; import com.jme3.audio.AudioNode; public class TestMusicStreaming extends SimpleApplication { @@ -46,7 +47,8 @@ public class TestMusicStreaming extends SimpleApplication { @Override public void simpleInitApp(){ assetManager.registerLocator("http://www.vorbis.com/music/", UrlLocator.class); - AudioNode audioSource = new AudioNode(assetManager, "Lumme-Badloop.ogg", true); + AudioNode audioSource = new AudioNode(assetManager, "Lumme-Badloop.ogg", + AudioData.DataType.Stream); audioSource.setPositional(false); audioSource.setReverbEnabled(false); audioSource.play(); diff --git a/jme3-examples/src/main/java/jme3test/audio/TestReverb.java b/jme3-examples/src/main/java/jme3test/audio/TestReverb.java index 262f2984d..8fd5d1b7f 100644 --- a/jme3-examples/src/main/java/jme3test/audio/TestReverb.java +++ b/jme3-examples/src/main/java/jme3test/audio/TestReverb.java @@ -29,6 +29,7 @@ package jme3test.audio; import com.jme3.app.SimpleApplication; +import com.jme3.audio.AudioData; import com.jme3.audio.AudioNode; import com.jme3.audio.Environment; import com.jme3.math.FastMath; @@ -47,7 +48,8 @@ public class TestReverb extends SimpleApplication { @Override public void simpleInitApp() { - audioSource = new AudioNode(assetManager, "Sound/Effects/Bang.wav"); + audioSource = new AudioNode(assetManager, "Sound/Effects/Bang.wav", + AudioData.DataType.Buffer); float[] eax = new float[]{15, 38.0f, 0.300f, -1000, -3300, 0, 1.49f, 0.54f, 1.00f, -2560, 0.162f, 0.00f, 0.00f, 0.00f, diff --git a/jme3-examples/src/main/java/jme3test/audio/TestWav.java b/jme3-examples/src/main/java/jme3test/audio/TestWav.java index 2c145ec75..09fcfe714 100644 --- a/jme3-examples/src/main/java/jme3test/audio/TestWav.java +++ b/jme3-examples/src/main/java/jme3test/audio/TestWav.java @@ -30,6 +30,7 @@ package jme3test.audio; import com.jme3.app.SimpleApplication; +import com.jme3.audio.AudioData; import com.jme3.audio.AudioNode; public class TestWav extends SimpleApplication { @@ -54,7 +55,8 @@ public class TestWav extends SimpleApplication { @Override public void simpleInitApp() { - audioSource = new AudioNode(assetManager, "Sound/Effects/Gun.wav", false); + audioSource = new AudioNode(assetManager, "Sound/Effects/Gun.wav", + AudioData.DataType.Buffer); audioSource.setLooping(false); } } diff --git a/jme3-examples/src/main/java/jme3test/bullet/BombControl.java b/jme3-examples/src/main/java/jme3test/bullet/BombControl.java index c02e5a441..4d9af6a45 100644 --- a/jme3-examples/src/main/java/jme3test/bullet/BombControl.java +++ b/jme3-examples/src/main/java/jme3test/bullet/BombControl.java @@ -102,8 +102,9 @@ public class BombControl extends RigidBodyControl implements PhysicsCollisionLis effect.setGravity(0, -5f, 0); effect.setLowLife(.4f); effect.setHighLife(.5f); - effect.setInitialVelocity(new Vector3f(0, 7, 0)); - effect.setVelocityVariation(1f); + effect.getParticleInfluencer() + .setInitialVelocity(new Vector3f(0, 7, 0)); + effect.getParticleInfluencer().setVelocityVariation(1f); effect.setImagesX(2); effect.setImagesY(2); Material mat = new Material(assetManager, "Common/MatDefs/Misc/Particle.j3md"); diff --git a/jme3-examples/src/main/java/jme3test/bullet/PhysicsHoverControl.java b/jme3-examples/src/main/java/jme3test/bullet/PhysicsHoverControl.java index a286501bb..f914f5da5 100644 --- a/jme3-examples/src/main/java/jme3test/bullet/PhysicsHoverControl.java +++ b/jme3-examples/src/main/java/jme3test/bullet/PhysicsHoverControl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -96,9 +96,10 @@ public class PhysicsHoverControl extends PhysicsVehicle implements PhysicsContro createWheels(); } + @Deprecated @Override public Control cloneForSpatial(Spatial spatial) { - throw new UnsupportedOperationException("Not supported yet."); + throw new UnsupportedOperationException(); } @Override diff --git a/jme3-examples/src/main/java/jme3test/bullet/PhysicsTestHelper.java b/jme3-examples/src/main/java/jme3test/bullet/PhysicsTestHelper.java index bb057606e..531331d13 100644 --- a/jme3-examples/src/main/java/jme3test/bullet/PhysicsTestHelper.java +++ b/jme3-examples/src/main/java/jme3test/bullet/PhysicsTestHelper.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -206,7 +206,7 @@ public class PhysicsTestHelper { } /** - * creates the necessary inputlistener and action to shoot balls from teh camera + * creates the necessary inputlistener and action to shoot balls from the camera * @param app * @param rootNode * @param space diff --git a/jme3-examples/src/main/java/jme3test/bullet/TestBetterCharacter.java b/jme3-examples/src/main/java/jme3test/bullet/TestBetterCharacter.java index 0b9dfbad3..4a86f8219 100644 --- a/jme3-examples/src/main/java/jme3test/bullet/TestBetterCharacter.java +++ b/jme3-examples/src/main/java/jme3test/bullet/TestBetterCharacter.java @@ -1,26 +1,33 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine All rights reserved.

    + * Copyright (c) 2009-2018 jMonkeyEngine + * All rights reserved. + * * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer.

    * Redistributions - * in binary form must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution.

    * Neither the name of - * 'jMonkeyEngine' nor the names of its contributors may be used to endorse or - * promote products derived from this software without specific prior written - * permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT - * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A - * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'jMonkeyEngine' nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package jme3test.bullet; @@ -30,7 +37,6 @@ import com.jme3.bullet.PhysicsSpace; import com.jme3.bullet.collision.shapes.MeshCollisionShape; import com.jme3.bullet.control.BetterCharacterControl; import com.jme3.bullet.control.RigidBodyControl; -import com.jme3.bullet.debug.DebugTools; import com.jme3.input.KeyInput; import com.jme3.input.controls.ActionListener; import com.jme3.input.controls.KeyTrigger; @@ -80,7 +86,13 @@ public class TestBetterCharacter extends SimpleApplication implements ActionList setupKeys(); // activate physics - bulletAppState = new BulletAppState(); + bulletAppState = new BulletAppState() { + @Override + public void prePhysicsTick(PhysicsSpace space, float tpf) { + // Apply radial gravity near the planet, downward gravity elsewhere. + checkPlanetGravity(); + } + }; stateManager.attach(bulletAppState); bulletAppState.setDebugEnabled(true); @@ -123,9 +135,6 @@ public class TestBetterCharacter extends SimpleApplication implements ActionList @Override public void simpleUpdate(float tpf) { - // Apply planet gravity to character if close enough (see below) - checkPlanetGravity(); - // Get current forward and left vectors of model by using its rotation // to rotate the unit vectors Vector3f modelForwardDir = characterNode.getWorldRotation().mult(Vector3f.UNIT_Z); diff --git a/jme3-examples/src/main/java/jme3test/bullet/TestBoneRagdoll.java b/jme3-examples/src/main/java/jme3test/bullet/TestBoneRagdoll.java index bc806b018..8b86f1b0c 100644 --- a/jme3-examples/src/main/java/jme3test/bullet/TestBoneRagdoll.java +++ b/jme3-examples/src/main/java/jme3test/bullet/TestBoneRagdoll.java @@ -36,24 +36,17 @@ import com.jme3.app.SimpleApplication; import com.jme3.asset.TextureKey; import com.jme3.bullet.BulletAppState; import com.jme3.bullet.PhysicsSpace; -import com.jme3.bullet.collision.PhysicsCollisionEvent; -import com.jme3.bullet.collision.PhysicsCollisionObject; -import com.jme3.bullet.collision.RagdollCollisionListener; +import com.jme3.bullet.collision.*; import com.jme3.bullet.collision.shapes.SphereCollisionShape; import com.jme3.bullet.control.KinematicRagdollControl; import com.jme3.bullet.control.RigidBodyControl; import com.jme3.font.BitmapText; import com.jme3.input.KeyInput; import com.jme3.input.MouseInput; -import com.jme3.input.controls.ActionListener; -import com.jme3.input.controls.KeyTrigger; -import com.jme3.input.controls.MouseButtonTrigger; +import com.jme3.input.controls.*; import com.jme3.light.DirectionalLight; import com.jme3.material.Material; -import com.jme3.math.ColorRGBA; -import com.jme3.math.FastMath; -import com.jme3.math.Quaternion; -import com.jme3.math.Vector3f; +import com.jme3.math.*; import com.jme3.scene.Geometry; import com.jme3.scene.Node; import com.jme3.scene.debug.SkeletonDebugger; @@ -65,6 +58,7 @@ import com.jme3.texture.Texture; * PHYSICS RAGDOLLS ARE NOT WORKING PROPERLY YET! * @author normenhansen */ +//TODO rework this Test when the new animation system is done. public class TestBoneRagdoll extends SimpleApplication implements RagdollCollisionListener, AnimEventListener { private BulletAppState bulletAppState; @@ -101,7 +95,7 @@ public class TestBoneRagdoll extends SimpleApplication implements RagdollCollisi PhysicsTestHelper.createPhysicsTestWorld(rootNode, assetManager, bulletAppState.getPhysicsSpace()); setupLight(); - model = (Node) assetManager.loadModel("Models/Sinbad/Sinbad.mesh.xml"); + model = (Node) assetManager.loadModel("Models/Sinbad/SinbadOldAnim.j3o"); // model.setLocalRotation(new Quaternion().fromAngleAxis(FastMath.HALF_PI, Vector3f.UNIT_X)); diff --git a/jme3-examples/src/main/java/jme3test/bullet/TestBrickTower.java b/jme3-examples/src/main/java/jme3test/bullet/TestBrickTower.java index 7b0df933d..feffac8e6 100644 --- a/jme3-examples/src/main/java/jme3test/bullet/TestBrickTower.java +++ b/jme3-examples/src/main/java/jme3test/bullet/TestBrickTower.java @@ -81,9 +81,6 @@ import com.jme3.scene.Geometry; import com.jme3.scene.shape.Box; import com.jme3.scene.shape.Sphere; import com.jme3.scene.shape.Sphere.TextureMode; -import com.jme3.shadow.PssmShadowRenderer; -import com.jme3.shadow.PssmShadowRenderer.CompareMode; -import com.jme3.shadow.PssmShadowRenderer.FilterMode; import com.jme3.texture.Texture; import com.jme3.texture.Texture.WrapMode; @@ -104,7 +101,6 @@ public class TestBrickTower extends SimpleApplication { Material mat; Material mat2; Material mat3; - PssmShadowRenderer bsr; private Sphere bullet; private Box brick; private SphereCollisionShape bulletCollisionShape; @@ -139,13 +135,6 @@ public class TestBrickTower extends SimpleApplication { inputManager.addMapping("shoot", new MouseButtonTrigger(MouseInput.BUTTON_LEFT)); inputManager.addListener(actionListener, "shoot"); rootNode.setShadowMode(ShadowMode.Off); - bsr = new PssmShadowRenderer(assetManager, 1024, 2); - bsr.setDirection(new Vector3f(-1, -1, -1).normalizeLocal()); - bsr.setLambda(0.55f); - bsr.setShadowIntensity(0.6f); - bsr.setCompareMode(CompareMode.Hardware); - bsr.setFilterMode(FilterMode.PCF4); - viewPort.addProcessor(bsr); } private PhysicsSpace getPhysicsSpace() { diff --git a/jme3-examples/src/main/java/jme3test/bullet/TestBrickWall.java b/jme3-examples/src/main/java/jme3test/bullet/TestBrickWall.java index 0173f1a44..ce61e355e 100644 --- a/jme3-examples/src/main/java/jme3test/bullet/TestBrickWall.java +++ b/jme3-examples/src/main/java/jme3test/bullet/TestBrickWall.java @@ -52,7 +52,6 @@ import com.jme3.scene.Geometry; import com.jme3.scene.shape.Box; import com.jme3.scene.shape.Sphere; import com.jme3.scene.shape.Sphere.TextureMode; -import com.jme3.shadow.BasicShadowRenderer; import com.jme3.texture.Texture; import com.jme3.texture.Texture.WrapMode; @@ -68,7 +67,6 @@ public class TestBrickWall extends SimpleApplication { Material mat; Material mat2; Material mat3; - BasicShadowRenderer bsr; private static Sphere bullet; private static Box brick; private static SphereCollisionShape bulletCollisionShape; @@ -106,9 +104,6 @@ public class TestBrickWall extends SimpleApplication { inputManager.addListener(actionListener, "gc"); rootNode.setShadowMode(ShadowMode.Off); - bsr = new BasicShadowRenderer(assetManager, 256); - bsr.setDirection(new Vector3f(-1, -1, -1).normalizeLocal()); - viewPort.addProcessor(bsr); } private PhysicsSpace getPhysicsSpace() { diff --git a/jme3-examples/src/main/java/jme3test/bullet/TestFancyCar.java b/jme3-examples/src/main/java/jme3test/bullet/TestFancyCar.java index ca64536de..3803c4c5d 100644 --- a/jme3-examples/src/main/java/jme3test/bullet/TestFancyCar.java +++ b/jme3-examples/src/main/java/jme3test/bullet/TestFancyCar.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -31,7 +31,6 @@ */ package jme3test.bullet; -import com.jme3.app.SettingsDialog; import com.jme3.app.SimpleApplication; import com.jme3.bounding.BoundingBox; import com.jme3.bullet.BulletAppState; @@ -51,8 +50,6 @@ import com.jme3.renderer.queue.RenderQueue.ShadowMode; import com.jme3.scene.Geometry; import com.jme3.scene.Node; import com.jme3.scene.Spatial; -import com.jme3.shadow.BasicShadowRenderer; -import com.jme3.system.AppSettings; public class TestFancyCar extends SimpleApplication implements ActionListener { @@ -90,11 +87,6 @@ public class TestFancyCar extends SimpleApplication implements ActionListener { bulletAppState = new BulletAppState(); stateManager.attach(bulletAppState); // bulletAppState.getPhysicsSpace().enableDebug(assetManager); - if (settings.getRenderer().startsWith("LWJGL")) { - BasicShadowRenderer bsr = new BasicShadowRenderer(assetManager, 512); - bsr.setDirection(new Vector3f(-0.5f, -0.3f, -0.3f).normalizeLocal()); - // viewPort.addProcessor(bsr); - } cam.setFrustumFar(150f); flyCam.setMoveSpeed(10); diff --git a/jme3-examples/src/main/java/jme3test/bullet/TestHoveringTank.java b/jme3-examples/src/main/java/jme3test/bullet/TestHoveringTank.java index d1def4203..a241072a2 100644 --- a/jme3-examples/src/main/java/jme3test/bullet/TestHoveringTank.java +++ b/jme3-examples/src/main/java/jme3test/bullet/TestHoveringTank.java @@ -54,9 +54,8 @@ import com.jme3.renderer.Camera; import com.jme3.renderer.queue.RenderQueue.ShadowMode; import com.jme3.scene.Geometry; import com.jme3.scene.Spatial; -import com.jme3.shadow.PssmShadowRenderer; -import com.jme3.shadow.PssmShadowRenderer.CompareMode; -import com.jme3.shadow.PssmShadowRenderer.FilterMode; +import com.jme3.shadow.DirectionalLightShadowRenderer; +import com.jme3.shadow.EdgeFilteringMode; import com.jme3.system.AppSettings; import com.jme3.terrain.geomipmap.TerrainLodControl; import com.jme3.terrain.geomipmap.TerrainQuad; @@ -65,6 +64,7 @@ import com.jme3.terrain.heightmap.ImageBasedHeightMap; import com.jme3.texture.Texture; import com.jme3.texture.Texture.WrapMode; import com.jme3.util.SkyFactory; +import com.jme3.util.SkyFactory.EnvMapType; import java.util.ArrayList; import java.util.List; @@ -113,21 +113,22 @@ public class TestHoveringTank extends SimpleApplication implements AnalogListene stateManager.attach(bulletAppState); // bulletAppState.getPhysicsSpace().enableDebug(assetManager); bulletAppState.getPhysicsSpace().setAccuracy(1f/30f); - rootNode.attachChild(SkyFactory.createSky(assetManager, "Textures/Sky/Bright/BrightSky.dds", false)); + rootNode.attachChild(SkyFactory.createSky(assetManager, + "Textures/Sky/Bright/BrightSky.dds", EnvMapType.CubeMap)); - PssmShadowRenderer pssmr = new PssmShadowRenderer(assetManager, 2048, 3); - pssmr.setDirection(new Vector3f(-0.5f, -0.3f, -0.3f).normalizeLocal()); - pssmr.setLambda(0.55f); - pssmr.setShadowIntensity(0.6f); - pssmr.setCompareMode(CompareMode.Hardware); - pssmr.setFilterMode(FilterMode.Bilinear); - viewPort.addProcessor(pssmr); + DirectionalLightShadowRenderer dlsr + = new DirectionalLightShadowRenderer(assetManager, 2048, 3); + dlsr.setLambda(0.55f); + dlsr.setShadowIntensity(0.6f); + dlsr.setEdgeFilteringMode(EdgeFilteringMode.Bilinear); + viewPort.addProcessor(dlsr); setupKeys(); createTerrain(); buildPlayer(); DirectionalLight dl = new DirectionalLight(); + dlsr.setLight(dl); dl.setColor(new ColorRGBA(1.0f, 0.94f, 0.8f, 1f).multLocal(1.3f)); dl.setDirection(new Vector3f(-0.5f, -0.3f, -0.3f).normalizeLocal()); rootNode.addLight(dl); diff --git a/jme3-examples/src/main/java/jme3test/bullet/TestIssue877.java b/jme3-examples/src/main/java/jme3test/bullet/TestIssue877.java new file mode 100644 index 000000000..d17d3407e --- /dev/null +++ b/jme3-examples/src/main/java/jme3test/bullet/TestIssue877.java @@ -0,0 +1,148 @@ +/* + * Copyright (c) 2018 jMonkeyEngine + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'jMonkeyEngine' nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package jme3test.bullet; + +/** + * Test case for JME issue #877: multiple hinges. Based on code submitted by + * Daniel Martensson. + * + * If successful, all pendulums will swing at the same frequency, and all the + * free-falling objects will fall straight down. + */ +import com.jme3.app.SimpleApplication; +import com.jme3.bullet.BulletAppState; +import com.jme3.bullet.collision.shapes.BoxCollisionShape; +import com.jme3.bullet.collision.shapes.CollisionShape; +import com.jme3.bullet.control.RigidBodyControl; +import com.jme3.bullet.joints.HingeJoint; +import com.jme3.math.Quaternion; +import com.jme3.math.Vector3f; +import com.jme3.scene.Node; + +public class TestIssue877 extends SimpleApplication { + + BulletAppState bulletAppState = new BulletAppState(); + int numPendulums = 6; + int numFalling = 6; + Node pivots[] = new Node[numPendulums]; + Node bobs[] = new Node[numPendulums]; + Node falling[] = new Node[numFalling]; + float timeToNextPrint = 1f; // in seconds + + public static void main(String[] args) { + TestIssue877 app = new TestIssue877(); + app.start(); + } + + @Override + public void simpleInitApp() { + flyCam.setEnabled(false); + cam.setLocation(new Vector3f(-4.77f, -7.55f, 16.52f)); + cam.setRotation(new Quaternion(-0.103433f, 0.889420f, 0.368792f, 0.249449f)); + + stateManager.attach(bulletAppState); + bulletAppState.setDebugEnabled(true); + + float pivotY = 14.6214f; + float bobStartY = 3f; + float length = pivotY - bobStartY; + for (int i = 0; i < numPendulums; i++) { + float x = 6f - 2.5f * i; + Vector3f pivotLocation = new Vector3f(x, pivotY, 0f); + pivots[i] = createTestNode(0f, pivotLocation); + + Vector3f bobLocation = new Vector3f(x, bobStartY, 0f); + bobs[i] = createTestNode(1f, bobLocation); + } + + for (int i = 0; i < numFalling; i++) { + float x = -6f - 2.5f * (i + numPendulums); + Vector3f createLocation = new Vector3f(x, bobStartY, 0f); + falling[i] = createTestNode(1f, createLocation); + } + + for (int i = 0; i < numPendulums; i++) { + HingeJoint joint = new HingeJoint( + pivots[i].getControl(RigidBodyControl.class), + bobs[i].getControl(RigidBodyControl.class), + new Vector3f(0f, 0f, 0f), + new Vector3f(length, 0f, 0f), + Vector3f.UNIT_Z.clone(), + Vector3f.UNIT_Z.clone()); + bulletAppState.getPhysicsSpace().add(joint); + } + } + + Node createTestNode(float mass, Vector3f location) { + float size = 0.1f; + Vector3f halfExtents = new Vector3f(size, size, size); + CollisionShape shape = new BoxCollisionShape(halfExtents); + RigidBodyControl control = new RigidBodyControl(shape, mass); + Node node = new Node(); + node.addControl(control); + rootNode.attachChild(node); + bulletAppState.getPhysicsSpace().add(node); + control.setPhysicsLocation(location); + + return node; + } + + @Override + public void simpleUpdate(float tpf) { + if (timeToNextPrint > 0f) { + timeToNextPrint -= tpf; + return; + } + + if (numFalling > 0) { + Vector3f fallingLocation = falling[0].getWorldTranslation(); + System.out.printf(" falling[0] location(x=%f, z=%f)", + fallingLocation.x, fallingLocation.z); + /* + * If an object is falling vertically, its X- and Z-coordinates + * should not change. + */ + } + if (numPendulums > 0) { + Vector3f bobLocation = bobs[0].getWorldTranslation(); + Vector3f pivotLocation = pivots[0].getWorldTranslation(); + float distance = bobLocation.distance(pivotLocation); + System.out.printf(" bob[0] distance=%f", distance); + /* + * If the hinge is working properly, the distance from the + * pivot to the bob should remain roughly constant. + */ + } + System.out.println(); + timeToNextPrint = 1f; + } +} diff --git a/jme3-examples/src/main/java/jme3test/bullet/TestIssue883.java b/jme3-examples/src/main/java/jme3test/bullet/TestIssue883.java new file mode 100644 index 000000000..f4e794fea --- /dev/null +++ b/jme3-examples/src/main/java/jme3test/bullet/TestIssue883.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2018 jMonkeyEngine + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'jMonkeyEngine' nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package jme3test.bullet; + +/** + * Test case for JME issue #883: extra physicsTicks in ThreadingType.PARALLEL. + * + * If successful, physics time and frame time will advance at the same rate. + */ +import com.jme3.app.SimpleApplication; +import com.jme3.bullet.BulletAppState; +import com.jme3.bullet.PhysicsSpace; + +public class TestIssue883 extends SimpleApplication { + + boolean firstPrint = true; + float timeToNextPrint = 1f; // in seconds + double frameTime; // in seconds + double physicsTime; // in seconds + + public static void main(String[] args) { + TestIssue883 app = new TestIssue883(); + app.start(); + } + + @Override + public void simpleInitApp() { + + BulletAppState bulletAppState = new BulletAppState() { + @Override + public void physicsTick(PhysicsSpace space, float timeStep) { + physicsTime += timeStep; + } + }; + bulletAppState.setThreadingType(BulletAppState.ThreadingType.PARALLEL); + stateManager.attach(bulletAppState); + } + + @Override + public void simpleUpdate(float tpf) { + frameTime += tpf; + + if (timeToNextPrint > 0f) { + timeToNextPrint -= tpf; + return; + } + + if (firstPrint) { // synchronize + frameTime = 0.; + physicsTime = 0.; + firstPrint = false; + } + + System.out.printf(" frameTime= %s physicsTime= %s%n", + frameTime, physicsTime); + timeToNextPrint = 1f; + } +} diff --git a/jme3-examples/src/main/java/jme3test/bullet/TestIssue889.java b/jme3-examples/src/main/java/jme3test/bullet/TestIssue889.java new file mode 100644 index 000000000..070423328 --- /dev/null +++ b/jme3-examples/src/main/java/jme3test/bullet/TestIssue889.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2018 jMonkeyEngine + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'jMonkeyEngine' nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package jme3test.bullet; + +/** + * Test case for JME issue #889: disabled physics control gets added to a + * physics space. + *

    + * If successful, no debug meshes will be visible. + */ +import com.jme3.app.SimpleApplication; +import com.jme3.bullet.BulletAppState; +import com.jme3.bullet.PhysicsSpace; +import com.jme3.bullet.collision.shapes.BoxCollisionShape; +import com.jme3.bullet.collision.shapes.CollisionShape; +import com.jme3.bullet.collision.shapes.SphereCollisionShape; +import com.jme3.bullet.control.BetterCharacterControl; +import com.jme3.bullet.control.GhostControl; +import com.jme3.bullet.control.RigidBodyControl; +import com.jme3.math.Vector3f; + +public class TestIssue889 extends SimpleApplication { + + public static void main(String[] args) { + TestIssue889 app = new TestIssue889(); + app.start(); + } + + @Override + public void simpleInitApp() { + flyCam.setEnabled(false); + + BulletAppState bulletAppState = new BulletAppState(); + bulletAppState.setDebugEnabled(true); + bulletAppState.setSpeed(0f); + stateManager.attach(bulletAppState); + PhysicsSpace space = bulletAppState.getPhysicsSpace(); + + float radius = 1f; + CollisionShape sphere = new SphereCollisionShape(radius); + CollisionShape box = new BoxCollisionShape(Vector3f.UNIT_XYZ); + + RigidBodyControl rbc = new RigidBodyControl(box); + rbc.setEnabled(false); + rbc.setPhysicsSpace(space); + rootNode.addControl(rbc); + + BetterCharacterControl bcc = new BetterCharacterControl(radius, 4f, 1f); + bcc.setEnabled(false); + bcc.setPhysicsSpace(space); + rootNode.addControl(bcc); + + GhostControl gc = new GhostControl(sphere); + gc.setEnabled(false); + gc.setPhysicsSpace(space); + rootNode.addControl(gc); + } +} diff --git a/jme3-examples/src/main/java/jme3test/bullet/TestIssue894.java b/jme3-examples/src/main/java/jme3test/bullet/TestIssue894.java new file mode 100644 index 000000000..9fa461676 --- /dev/null +++ b/jme3-examples/src/main/java/jme3test/bullet/TestIssue894.java @@ -0,0 +1,185 @@ +/* + * Copyright (c) 2018 jMonkeyEngine + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'jMonkeyEngine' nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package jme3test.bullet; + +/** + * Test case for JME issue #894: SliderJoint.setRestitutionOrthoLin() sets wrong + * joint parameter. The bug existed in Native Bullet only. + *

    + * If successful, no exception will be thrown during initialization. + */ +import com.jme3.app.SimpleApplication; +import com.jme3.bullet.collision.shapes.CollisionShape; +import com.jme3.bullet.collision.shapes.SphereCollisionShape; +import com.jme3.bullet.joints.SliderJoint; +import com.jme3.bullet.objects.PhysicsRigidBody; +import com.jme3.math.Vector3f; + +public class TestIssue894 extends SimpleApplication { + + public static void main(String[] args) { + TestIssue894 app = new TestIssue894(); + app.start(); + } + + @Override + public void simpleInitApp() { + float radius = 1f; + CollisionShape sphere = new SphereCollisionShape(radius); + + PhysicsRigidBody rb1 = new PhysicsRigidBody(sphere); + PhysicsRigidBody rb2 = new PhysicsRigidBody(sphere); + rb2.setPhysicsLocation(new Vector3f(4f, 0f, 0f)); + + SliderJoint joint = new SliderJoint(rb1, rb2, + new Vector3f(2f, 0f, 0f), + new Vector3f(-2f, 0f, 0f), true); + + joint.setLowerAngLimit(-0.01f); + joint.setLowerLinLimit(-0.02f); + joint.setUpperAngLimit(0.01f); + joint.setUpperLinLimit(0.02f); + + joint.setDampingDirAng(0.03f); + joint.setDampingDirLin(0.04f); + joint.setDampingLimAng(0.05f); + joint.setDampingLimLin(0.06f); + joint.setDampingOrthoAng(0.07f); + joint.setDampingOrthoLin(0.08f); + + joint.setRestitutionDirAng(0.09f); + joint.setRestitutionDirLin(0.10f); + joint.setRestitutionLimAng(0.11f); + joint.setRestitutionLimLin(0.12f); + joint.setRestitutionOrthoAng(0.13f); + joint.setRestitutionOrthoLin(0.14f); + + joint.setSoftnessDirAng(0.15f); + joint.setSoftnessDirLin(0.16f); + joint.setSoftnessLimAng(0.17f); + joint.setSoftnessLimLin(0.18f); + joint.setSoftnessOrthoAng(0.19f); + joint.setSoftnessOrthoLin(0.20f); + + joint.setMaxAngMotorForce(0.21f); + joint.setMaxLinMotorForce(0.22f); + + joint.setTargetAngMotorVelocity(0.23f); + joint.setTargetLinMotorVelocity(0.24f); + + RuntimeException e = new RuntimeException(); + + if (joint.getLowerAngLimit() != -0.01f) { + throw new RuntimeException(); + } + if (joint.getLowerLinLimit() != -0.02f) { + throw new RuntimeException(); + } + if (joint.getUpperAngLimit() != 0.01f) { + throw new RuntimeException(); + } + if (joint.getUpperLinLimit() != 0.02f) { + throw new RuntimeException(); + } + + if (joint.getDampingDirAng() != 0.03f) { + throw new RuntimeException(); + } + if (joint.getDampingDirLin() != 0.04f) { + throw new RuntimeException(); + } + if (joint.getDampingLimAng() != 0.05f) { + throw new RuntimeException(); + } + if (joint.getDampingLimLin() != 0.06f) { + throw new RuntimeException(); + } + if (joint.getDampingOrthoAng() != 0.07f) { + throw new RuntimeException(); + } + if (joint.getDampingOrthoLin() != 0.08f) { + throw new RuntimeException(); + } + + if (joint.getRestitutionDirAng() != 0.09f) { + throw new RuntimeException(); + } + if (joint.getRestitutionDirLin() != 0.10f) { + throw new RuntimeException(); + } + if (joint.getRestitutionLimAng() != 0.11f) { + throw new RuntimeException(); + } + if (joint.getRestitutionLimLin() != 0.12f) { + throw new RuntimeException(); + } + if (joint.getRestitutionOrthoAng() != 0.13f) { + throw new RuntimeException(); + } + if (joint.getRestitutionOrthoLin() != 0.14f) { + throw new RuntimeException(); + } + + if (joint.getSoftnessDirAng() != 0.15f) { + throw new RuntimeException(); + } + if (joint.getSoftnessDirLin() != 0.16f) { + throw new RuntimeException(); + } + if (joint.getSoftnessLimAng() != 0.17f) { + throw new RuntimeException(); + } + if (joint.getSoftnessLimLin() != 0.18f) { + throw new RuntimeException(); + } + if (joint.getSoftnessOrthoAng() != 0.19f) { + throw new RuntimeException(); + } + if (joint.getSoftnessOrthoLin() != 0.20f) { + throw new RuntimeException(); + } + + if (joint.getMaxAngMotorForce() != 0.21f) { + throw new RuntimeException(); + } + if (joint.getMaxLinMotorForce() != 0.22f) { + throw new RuntimeException(); + } + + if (joint.getTargetAngMotorVelocity() != 0.23f) { + throw new RuntimeException(); + } + if (joint.getTargetLinMotorVelocity() != 0.24f) { + throw new RuntimeException(); + } + } +} diff --git a/jme3-examples/src/main/java/jme3test/bullet/TestIssue911.java b/jme3-examples/src/main/java/jme3test/bullet/TestIssue911.java new file mode 100644 index 000000000..4698add65 --- /dev/null +++ b/jme3-examples/src/main/java/jme3test/bullet/TestIssue911.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2018 jMonkeyEngine + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'jMonkeyEngine' nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package jme3test.bullet; + +import com.jme3.app.SimpleApplication; +import com.jme3.bullet.collision.shapes.CollisionShape; +import com.jme3.bullet.collision.shapes.SphereCollisionShape; +import com.jme3.bullet.objects.PhysicsRigidBody; + +/** + * Test case for JME issue #911: PhysicsRigidBody sleeping threshold setters + * have unexpected side effects. The bug existed in Native Bullet only. + *

    + * If successful, no exception will be thrown. + */ +public class TestIssue911 extends SimpleApplication { + // ************************************************************************* + // new methods exposed + + public static void main(String[] args) { + TestIssue911 app = new TestIssue911(); + app.start(); + } + // ************************************************************************* + // SimpleApplication methods + + @Override + public void simpleInitApp() { + CollisionShape capsule = new SphereCollisionShape(1f); + PhysicsRigidBody body = new PhysicsRigidBody(capsule, 1f); + assert body.getAngularSleepingThreshold() == 1f; + assert body.getLinearSleepingThreshold() == 0.8f; + + body.setAngularSleepingThreshold(0.03f); + + assert body.getAngularSleepingThreshold() == 0.03f; + float lst = body.getLinearSleepingThreshold(); + assert lst == 0.8f : lst; // fails, actual value is 1f + + body.setLinearSleepingThreshold(0.17f); + + float ast = body.getAngularSleepingThreshold(); + assert ast == 0.03f : ast; // fails, actual value is 1f + + stop(); + } +} diff --git a/jme3-examples/src/main/java/jme3test/bullet/TestIssue918.java b/jme3-examples/src/main/java/jme3test/bullet/TestIssue918.java new file mode 100644 index 000000000..ed5a72664 --- /dev/null +++ b/jme3-examples/src/main/java/jme3test/bullet/TestIssue918.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2018 jMonkeyEngine + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'jMonkeyEngine' nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package jme3test.bullet; + +import com.jme3.app.SimpleApplication; +import com.jme3.bullet.collision.shapes.CollisionShape; +import com.jme3.bullet.collision.shapes.SphereCollisionShape; +import com.jme3.bullet.joints.Point2PointJoint; +import com.jme3.bullet.objects.PhysicsRigidBody; +import com.jme3.math.Vector3f; + +/** + * Test case for JME issue #918: Point2PointJoint.getImpulseClamp() and + * .getTau() return the damping value instead. The bug existed in Native Bullet + * only. + *

    + * If successful, no UnsatisfiedLinkError exception will be thrown. + */ +public class TestIssue918 extends SimpleApplication { + // ************************************************************************* + // new methods exposed + + public static void main(String[] args) { + TestIssue918 app = new TestIssue918(); + app.start(); + } + // ************************************************************************* + // SimpleApplication methods + + @Override + public void simpleInitApp() { + CollisionShape capsule = new SphereCollisionShape(1f); + PhysicsRigidBody body1 = new PhysicsRigidBody(capsule, 1f); + PhysicsRigidBody body2 = new PhysicsRigidBody(capsule, 1f); + Vector3f pivot1 = new Vector3f(); + Vector3f pivot2 = new Vector3f(); + Point2PointJoint joint + = new Point2PointJoint(body1, body2, pivot1, pivot2); + + joint.setImpulseClamp(42f); + joint.setTau(99f); + + if (joint.getImpulseClamp() != 42f) { + throw new RuntimeException(); + } + if (joint.getTau() != 99f) { + throw new RuntimeException(); + } + + stop(); + } +} diff --git a/jme3-examples/src/main/java/jme3test/bullet/TestIssue919.java b/jme3-examples/src/main/java/jme3test/bullet/TestIssue919.java new file mode 100644 index 000000000..3fb6578e0 --- /dev/null +++ b/jme3-examples/src/main/java/jme3test/bullet/TestIssue919.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2018 jMonkeyEngine + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'jMonkeyEngine' nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package jme3test.bullet; + +import com.jme3.app.SimpleApplication; +import com.jme3.bullet.collision.shapes.CollisionShape; +import com.jme3.bullet.collision.shapes.SphereCollisionShape; +import com.jme3.bullet.joints.SixDofJoint; +import com.jme3.bullet.objects.PhysicsRigidBody; +import com.jme3.math.Vector3f; + +/** + * Test case for JME issue #919: native implementation of + * TranslationalLimitMotor.getLimitSoftness() has wrong name. The bug existed in + * Native Bullet only. + *

    + * If successful, no UnsatisfiedLinkError exception will be thrown. + */ +public class TestIssue919 extends SimpleApplication { + // ************************************************************************* + // new methods exposed + + public static void main(String[] args) { + TestIssue919 app = new TestIssue919(); + app.start(); + } + // ************************************************************************* + // SimpleApplication methods + + @Override + public void simpleInitApp() { + CollisionShape capsule = new SphereCollisionShape(1f); + PhysicsRigidBody body1 = new PhysicsRigidBody(capsule, 1f); + PhysicsRigidBody body2 = new PhysicsRigidBody(capsule, 1f); + Vector3f pivot1 = new Vector3f(); + Vector3f pivot2 = new Vector3f(); + SixDofJoint joint = new SixDofJoint(body1, body2, pivot1, pivot2, true); + + joint.getTranslationalLimitMotor().getLimitSoftness(); + + stop(); + } +} diff --git a/jme3-examples/src/main/java/jme3test/bullet/TestIssue928.java b/jme3-examples/src/main/java/jme3test/bullet/TestIssue928.java new file mode 100644 index 000000000..886fb8259 --- /dev/null +++ b/jme3-examples/src/main/java/jme3test/bullet/TestIssue928.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2018 jMonkeyEngine + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'jMonkeyEngine' nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package jme3test.bullet; + +import com.jme3.app.SimpleApplication; +import com.jme3.bullet.BulletAppState; +import com.jme3.bullet.BulletAppState.ThreadingType; + +/** + * Test case for JME issue #928: crash after 64 attached and detached + * BulletAppStates with parallel threading. The bug existed in Native Bullet + * only. + *

    + * If successful, no crash will occur. + */ +public class TestIssue928 extends SimpleApplication { + // ************************************************************************* + // new methods exposed + + public static void main(String[] args) { + TestIssue928 app = new TestIssue928(); + app.start(); + } + + int count = 0; + int frame = 0; + BulletAppState bulletAppState; + // ************************************************************************* + // SimpleApplication methods + + @Override + public void simpleInitApp() { + } + + @Override + public void simpleUpdate(float tpf) { + if (frame % 4 == 0) { + System.out.println(++count); + bulletAppState = new BulletAppState(); + bulletAppState.setThreadingType(ThreadingType.PARALLEL); + stateManager.attach(bulletAppState); + } else if (frame % 4 == 2) { + stateManager.detach(bulletAppState); + } + + frame++; + if (count == 70) { + System.exit(0); + } + } +} diff --git a/jme3-examples/src/main/java/jme3test/bullet/TestIssue931.java b/jme3-examples/src/main/java/jme3test/bullet/TestIssue931.java new file mode 100644 index 000000000..63d56dd53 --- /dev/null +++ b/jme3-examples/src/main/java/jme3test/bullet/TestIssue931.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2018 jMonkeyEngine + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'jMonkeyEngine' nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package jme3test.bullet; + +import com.jme3.app.SimpleApplication; +import com.jme3.bullet.BulletAppState; +import com.jme3.bullet.control.KinematicRagdollControl; +import com.jme3.scene.Node; +import com.jme3.scene.Spatial; + +/** + * Test case for JME issue #931: RagdollUtils can miss model meshes or use the + * non-animated ones. + *

    + * If successful, no AssertionError will be thrown. + */ +public class TestIssue931 extends SimpleApplication { + // ************************************************************************* + // new methods exposed + + public static void main(String[] args) { + TestIssue931 app = new TestIssue931(); + app.start(); + } + // ************************************************************************* + // SimpleApplication methods + + @Override + public void simpleInitApp() { + BulletAppState bulletAppState = new BulletAppState(); + stateManager.attach(bulletAppState); + String sinbadPath = "Models/Sinbad/SinbadOldAnim.j3o"; + Node sinbad = (Node) assetManager.loadModel(sinbadPath); + + Node extender = new Node(); + for (Spatial child : sinbad.getChildren()) { + extender.attachChild(child); + } + sinbad.attachChild(extender); + + //Note: PhysicsRagdollControl is still a WIP, constructor will change + KinematicRagdollControl ragdoll = new KinematicRagdollControl(0.5f); + sinbad.addControl(ragdoll); + + stop(); + } +} diff --git a/jme3-examples/src/main/java/jme3test/bullet/TestIssue970.java b/jme3-examples/src/main/java/jme3test/bullet/TestIssue970.java new file mode 100644 index 000000000..c94d46c47 --- /dev/null +++ b/jme3-examples/src/main/java/jme3test/bullet/TestIssue970.java @@ -0,0 +1,139 @@ +/* + * Copyright (c) 2018 jMonkeyEngine + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'jMonkeyEngine' nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package jme3test.bullet; + +import com.jme3.app.SimpleApplication; +import com.jme3.asset.AssetNotFoundException; +import com.jme3.asset.ModelKey; +import com.jme3.asset.plugins.FileLocator; +import com.jme3.bullet.collision.shapes.CollisionShape; +import com.jme3.bullet.collision.shapes.SphereCollisionShape; +import com.jme3.bullet.control.RigidBodyControl; +import com.jme3.bullet.objects.PhysicsRigidBody; +import com.jme3.export.JmeExporter; +import com.jme3.export.binary.BinaryExporter; +import com.jme3.math.Matrix3f; +import com.jme3.math.Vector3f; +import com.jme3.scene.Node; +import com.jme3.scene.Spatial; +import com.jme3.scene.control.Control; +import java.io.File; +import java.io.IOException; + +/** + * Test case for JME issue #970: RigidBodyControl doesn't read/write velocities. + * + * If successful, no AssertionError will be thrown. + * + * @author Stephen Gold sgold@sonic.net + */ +public class TestIssue970 extends SimpleApplication { + + private int fileIndex = 0; + + public static void main(String[] args) { + TestIssue970 app = new TestIssue970(); + app.start(); + } + + @Override + public void simpleInitApp() { + assetManager.registerLocator(".", FileLocator.class); + + CollisionShape shape = new SphereCollisionShape(1f); + RigidBodyControl rbc = new RigidBodyControl(shape, 1f); + setParameters(rbc); + verifyParameters(rbc); + RigidBodyControl rbcCopy = (RigidBodyControl) saveThenLoad(rbc); + verifyParameters(rbcCopy); + + stop(); + } + + /** + * Clone a body that implements Control by saving and then loading it. + * + * @param sgc the body/control to copy (not null, unaffected) + * @return a new body/control + */ + private PhysicsRigidBody saveThenLoad(PhysicsRigidBody body) { + Control sgc = (Control) body; + Node savedNode = new Node(); + /* + * Add the Control to the Node without altering its physics transform. + */ + Vector3f pl = body.getPhysicsLocation(null); + Matrix3f pr = body.getPhysicsRotationMatrix(null); + savedNode.addControl(sgc); + body.setPhysicsLocation(pl); + body.setPhysicsRotation(pr); + + String fileName = String.format("tmp%d.j3o", ++fileIndex); + File file = new File(fileName); + + JmeExporter exporter = BinaryExporter.getInstance(); + try { + exporter.save(savedNode, file); + } catch (IOException exception) { + assert false; + } + + ModelKey key = new ModelKey(fileName); + Spatial loadedNode = new Node(); + try { + loadedNode = assetManager.loadAsset(key); + } catch (AssetNotFoundException e) { + assert false; + } + file.delete(); + Control loadedSgc = loadedNode.getControl(0); + + return (PhysicsRigidBody) loadedSgc; + } + + private void setParameters(PhysicsRigidBody body) { + body.setAngularVelocity(new Vector3f(0.04f, 0.05f, 0.06f)); + body.setLinearVelocity(new Vector3f(0.26f, 0.27f, 0.28f)); + } + + private void verifyParameters(PhysicsRigidBody body) { + Vector3f w = body.getAngularVelocity(); + assert w.x == 0.04f : w; + assert w.y == 0.05f : w; + assert w.z == 0.06f : w; + + Vector3f v = body.getLinearVelocity(); + assert v.x == 0.26f : v; + assert v.y == 0.27f : v; + assert v.z == 0.28f : v; + } +} diff --git a/jme3-examples/src/main/java/jme3test/bullet/TestKinematicAddToPhysicsSpaceIssue.java b/jme3-examples/src/main/java/jme3test/bullet/TestKinematicAddToPhysicsSpaceIssue.java index e63cd03e5..84bf607a4 100644 --- a/jme3-examples/src/main/java/jme3test/bullet/TestKinematicAddToPhysicsSpaceIssue.java +++ b/jme3-examples/src/main/java/jme3test/bullet/TestKinematicAddToPhysicsSpaceIssue.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -66,9 +66,9 @@ public class TestKinematicAddToPhysicsSpaceIssue extends SimpleApplication { physicsSphere.getControl(RigidBodyControl.class).setPhysicsLocation(new Vector3f(3, 6, 0)); rootNode.attachChild(physicsSphere); - //Setting the rigidBody to kinematic before adding it to the physic space + //Setting the rigidBody to kinematic before adding it to the physics space physicsSphere.getControl(RigidBodyControl.class).setKinematic(true); - //adding it to the physic space + //adding it to the physics space getPhysicsSpace().add(physicsSphere); //Making it not kinematic again, it should fall under gravity, it doesn't physicsSphere.getControl(RigidBodyControl.class).setKinematic(false); @@ -78,7 +78,7 @@ public class TestKinematicAddToPhysicsSpaceIssue extends SimpleApplication { physicsSphere2.getControl(RigidBodyControl.class).setPhysicsLocation(new Vector3f(5, 6, 0)); rootNode.attachChild(physicsSphere2); - //Adding the rigid body to physic space + //Adding the rigid body to physics space getPhysicsSpace().add(physicsSphere2); //making it kinematic physicsSphere2.getControl(RigidBodyControl.class).setKinematic(false); diff --git a/jme3-examples/src/main/java/jme3test/bullet/TestPhysicsRayCast.java b/jme3-examples/src/main/java/jme3test/bullet/TestPhysicsRayCast.java index 7a1ea5187..24665b42b 100644 --- a/jme3-examples/src/main/java/jme3test/bullet/TestPhysicsRayCast.java +++ b/jme3-examples/src/main/java/jme3test/bullet/TestPhysicsRayCast.java @@ -8,9 +8,11 @@ import com.jme3.bullet.collision.shapes.CollisionShape; import com.jme3.bullet.control.RigidBodyControl; import com.jme3.bullet.util.CollisionShapeFactory; import com.jme3.font.BitmapText; +import com.jme3.math.Vector3f; import com.jme3.scene.Node; import com.jme3.scene.Spatial; import java.util.List; + /** * * @author @wezrule @@ -42,12 +44,19 @@ public class TestPhysicsRayCast extends SimpleApplication { @Override public void simpleUpdate(float tpf) { - List rayTest = bulletAppState.getPhysicsSpace().rayTest(cam.getLocation(), cam.getLocation().add(cam.getDirection())); + float rayLength = 50f; + Vector3f start = cam.getLocation(); + Vector3f end = cam.getDirection().scaleAdd(rayLength, start); + List rayTest + = bulletAppState.getPhysicsSpace().rayTest(start, end); if (rayTest.size() > 0) { PhysicsRayTestResult get = rayTest.get(0); PhysicsCollisionObject collisionObject = get.getCollisionObject(); - //do stuff + // Display the name of the 1st object in place of FPS. fpsText.setText(collisionObject.getUserObject().toString()); + } else { + // Provide prompt feedback that no collision object was hit. + fpsText.setText("MISSING"); } } diff --git a/jme3-examples/src/main/java/jme3test/bullet/TestQ3.java b/jme3-examples/src/main/java/jme3test/bullet/TestQ3.java index 81d9cb7bf..01d0c9ade 100644 --- a/jme3-examples/src/main/java/jme3test/bullet/TestQ3.java +++ b/jme3-examples/src/main/java/jme3test/bullet/TestQ3.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -89,7 +89,9 @@ public class TestQ3 extends SimpleApplication implements ActionListener { // load the level from zip or http zip if (useHttp) { - assetManager.registerLocator("http://jmonkeyengine.googlecode.com/files/quake3level.zip", HttpZipLocator.class); + assetManager.registerLocator( + "https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/jmonkeyengine/quake3level.zip", + HttpZipLocator.class); } else { assetManager.registerLocator("quake3level.zip", ZipLocator.class); } diff --git a/jme3-examples/src/main/java/jme3test/bullet/TestRagdollCharacter.java b/jme3-examples/src/main/java/jme3test/bullet/TestRagdollCharacter.java index 5b9e948c8..f94307d6e 100644 --- a/jme3-examples/src/main/java/jme3test/bullet/TestRagdollCharacter.java +++ b/jme3-examples/src/main/java/jme3test/bullet/TestRagdollCharacter.java @@ -31,10 +31,7 @@ */ package jme3test.bullet; -import com.jme3.animation.AnimChannel; -import com.jme3.animation.AnimControl; -import com.jme3.animation.AnimEventListener; -import com.jme3.animation.LoopMode; +import com.jme3.animation.*; import com.jme3.app.SimpleApplication; import com.jme3.asset.TextureKey; import com.jme3.bullet.BulletAppState; @@ -46,9 +43,7 @@ import com.jme3.input.controls.ActionListener; import com.jme3.input.controls.KeyTrigger; import com.jme3.light.DirectionalLight; import com.jme3.material.Material; -import com.jme3.math.ColorRGBA; -import com.jme3.math.Vector2f; -import com.jme3.math.Vector3f; +import com.jme3.math.*; import com.jme3.renderer.queue.RenderQueue.ShadowMode; import com.jme3.scene.Geometry; import com.jme3.scene.Node; @@ -58,6 +53,7 @@ import com.jme3.texture.Texture; /** * @author normenhansen */ +//TODO rework this Test when the new animation system is done. public class TestRagdollCharacter extends SimpleApplication implements AnimEventListener, ActionListener { BulletAppState bulletAppState; @@ -89,7 +85,7 @@ public class TestRagdollCharacter extends SimpleApplication implements AnimEvent cam.setLocation(new Vector3f(-8,0,-4)); cam.lookAt(new Vector3f(4,0,-7), Vector3f.UNIT_Y); - model = (Node) assetManager.loadModel("Models/Sinbad/Sinbad.mesh.xml"); + model = (Node) assetManager.loadModel("Models/Sinbad/SinbadOldAnim.j3o"); model.lookAt(new Vector3f(0,0,-1), Vector3f.UNIT_Y); model.setLocalTranslation(4, 0, -7f); diff --git a/jme3-examples/src/main/java/jme3test/bullet/TestWalkingChar.java b/jme3-examples/src/main/java/jme3test/bullet/TestWalkingChar.java index c7e937c0b..4359154d1 100644 --- a/jme3-examples/src/main/java/jme3test/bullet/TestWalkingChar.java +++ b/jme3-examples/src/main/java/jme3test/bullet/TestWalkingChar.java @@ -31,10 +31,7 @@ */ package jme3test.bullet; -import com.jme3.animation.AnimChannel; -import com.jme3.animation.AnimControl; -import com.jme3.animation.AnimEventListener; -import com.jme3.animation.LoopMode; +import com.jme3.animation.*; import com.jme3.app.SimpleApplication; import com.jme3.bullet.BulletAppState; import com.jme3.bullet.PhysicsSpace; @@ -54,16 +51,12 @@ import com.jme3.input.controls.ActionListener; import com.jme3.input.controls.KeyTrigger; import com.jme3.light.DirectionalLight; import com.jme3.material.Material; -import com.jme3.math.ColorRGBA; -import com.jme3.math.Vector2f; -import com.jme3.math.Vector3f; +import com.jme3.math.*; import com.jme3.post.FilterPostProcessor; import com.jme3.post.filters.BloomFilter; import com.jme3.renderer.Camera; import com.jme3.renderer.queue.RenderQueue.ShadowMode; -import com.jme3.scene.Geometry; -import com.jme3.scene.Node; -import com.jme3.scene.Spatial; +import com.jme3.scene.*; import com.jme3.scene.shape.Box; import com.jme3.scene.shape.Sphere; import com.jme3.scene.shape.Sphere.TextureMode; @@ -74,6 +67,7 @@ import com.jme3.terrain.heightmap.ImageBasedHeightMap; import com.jme3.texture.Texture; import com.jme3.texture.Texture.WrapMode; import com.jme3.util.SkyFactory; + import java.util.ArrayList; import java.util.List; @@ -217,8 +211,9 @@ public class TestWalkingChar extends SimpleApplication implements ActionListener effect.setGravity(0, -5, 0); effect.setLowLife(.4f); effect.setHighLife(.5f); - effect.setInitialVelocity(new Vector3f(0, 7, 0)); - effect.setVelocityVariation(1f); + effect.getParticleInfluencer() + .setInitialVelocity(new Vector3f(0, 7, 0)); + effect.getParticleInfluencer().setVelocityVariation(1f); effect.setImagesX(2); effect.setImagesY(2); Material mat = new Material(assetManager, "Common/MatDefs/Misc/Particle.j3md"); @@ -237,7 +232,9 @@ public class TestWalkingChar extends SimpleApplication implements ActionListener } private void createSky() { - rootNode.attachChild(SkyFactory.createSky(assetManager, "Textures/Sky/Bright/BrightSky.dds", false)); + rootNode.attachChild(SkyFactory.createSky(assetManager, + "Textures/Sky/Bright/BrightSky.dds", + SkyFactory.EnvMapType.CubeMap)); } private void createTerrain() { @@ -294,7 +291,7 @@ public class TestWalkingChar extends SimpleApplication implements ActionListener private void createCharacter() { CapsuleCollisionShape capsule = new CapsuleCollisionShape(3f, 4f); character = new CharacterControl(capsule, 0.01f); - model = (Node) assetManager.loadModel("Models/Oto/Oto.mesh.xml"); + model = (Node) assetManager.loadModel("Models/Oto/OtoOldAnim.j3o"); //model.setLocalScale(0.5f); model.addControl(character); character.setPhysicsLocation(new Vector3f(-140, 40, -10)); diff --git a/jme3-examples/src/main/java/jme3test/collision/Main.java b/jme3-examples/src/main/java/jme3test/collision/Main.java new file mode 100644 index 000000000..e69de29bb diff --git a/jme3-examples/src/main/java/jme3test/conversion/TestMipMapGen.java b/jme3-examples/src/main/java/jme3test/conversion/TestMipMapGen.java index 55fc152f7..6110469ee 100644 --- a/jme3-examples/src/main/java/jme3test/conversion/TestMipMapGen.java +++ b/jme3-examples/src/main/java/jme3test/conversion/TestMipMapGen.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -39,7 +39,7 @@ import com.jme3.scene.Geometry; import com.jme3.scene.shape.Quad; import com.jme3.texture.Image; import com.jme3.texture.Texture; -import jme3tools.converters.MipMapGenerator; +import com.jme3.util.MipMapGenerator; public class TestMipMapGen extends SimpleApplication { diff --git a/jme3-examples/src/main/java/jme3test/effect/TestEverything.java b/jme3-examples/src/main/java/jme3test/effect/TestEverything.java index be05958c3..62f06a422 100644 --- a/jme3-examples/src/main/java/jme3test/effect/TestEverything.java +++ b/jme3-examples/src/main/java/jme3test/effect/TestEverything.java @@ -36,7 +36,8 @@ import com.jme3.app.SimpleApplication; import com.jme3.light.DirectionalLight; import com.jme3.material.Material; import com.jme3.math.*; -import com.jme3.post.HDRRenderer; +import com.jme3.post.FilterPostProcessor; +import com.jme3.post.filters.ToneMapFilter; import com.jme3.renderer.Caps; import com.jme3.renderer.queue.RenderQueue.ShadowMode; import com.jme3.scene.Geometry; @@ -44,7 +45,7 @@ import com.jme3.scene.Node; import com.jme3.scene.Spatial; import com.jme3.scene.Spatial.CullHint; import com.jme3.scene.shape.Box; -import com.jme3.shadow.BasicShadowRenderer; +import com.jme3.shadow.DirectionalLightShadowRenderer; import com.jme3.texture.Texture; import com.jme3.texture.Texture.WrapMode; import com.jme3.util.SkyFactory; @@ -52,8 +53,8 @@ import com.jme3.util.TangentBinormalGenerator; public class TestEverything extends SimpleApplication { - private BasicShadowRenderer bsr; - private HDRRenderer hdrRender; + private DirectionalLightShadowRenderer dlsr; + private ToneMapFilter toneMapFilter; private Vector3f lightDir = new Vector3f(-1, -1, .5f).normalizeLocal(); public static void main(String[] args){ @@ -63,26 +64,20 @@ public class TestEverything extends SimpleApplication { public void setupHdr(){ if (renderer.getCaps().contains(Caps.GLSL100)){ - hdrRender = new HDRRenderer(assetManager, renderer); - hdrRender.setMaxIterations(40); - hdrRender.setSamples(settings.getSamples()); - - hdrRender.setWhiteLevel(3); - hdrRender.setExposure(0.72f); - hdrRender.setThrottle(1); + toneMapFilter = new ToneMapFilter(); + toneMapFilter.setWhitePoint(new Vector3f(3f, 3f, 3f)); + FilterPostProcessor fpp = new FilterPostProcessor(assetManager); + fpp.addFilter(toneMapFilter); + viewPort.addProcessor(fpp); // setPauseOnLostFocus(false); - // new HDRConfig(hdrRender).setVisible(true); - - viewPort.addProcessor(hdrRender); } } public void setupBasicShadow(){ if (renderer.getCaps().contains(Caps.GLSL100)){ - bsr = new BasicShadowRenderer(assetManager, 1024); - bsr.setDirection(lightDir); - viewPort.addProcessor(bsr); + dlsr = new DirectionalLightShadowRenderer(assetManager, 1024, 1); + viewPort.addProcessor(dlsr); } } @@ -93,16 +88,20 @@ public class TestEverything extends SimpleApplication { }else{ envMap = assetManager.loadTexture("Textures/Sky/St Peters/StPeters.jpg"); } - rootNode.attachChild(SkyFactory.createSky(assetManager, envMap, new Vector3f(-1,-1,-1), true)); + rootNode.attachChild(SkyFactory.createSky(assetManager, envMap, + new Vector3f(-1,-1,-1), SkyFactory.EnvMapType.SphereMap)); } public void setupLighting(){ boolean hdr = false; - if (hdrRender != null){ - hdr = hdrRender.isEnabled(); + if (toneMapFilter != null){ + hdr = toneMapFilter.isEnabled(); } DirectionalLight dl = new DirectionalLight(); + if (dlsr != null) { + dlsr.setLight(dl); + } dl.setDirection(lightDir); if (hdr){ dl.setColor(new ColorRGBA(3, 3, 3, 1)); diff --git a/jme3-examples/src/main/java/jme3test/effect/TestExplosionEffect.java b/jme3-examples/src/main/java/jme3test/effect/TestExplosionEffect.java index 5d2d781a6..ff5100ffe 100644 --- a/jme3-examples/src/main/java/jme3test/effect/TestExplosionEffect.java +++ b/jme3-examples/src/main/java/jme3test/effect/TestExplosionEffect.java @@ -98,8 +98,9 @@ public class TestExplosionEffect extends SimpleApplication { flash.setGravity(0, 0, 0); flash.setLowLife(.2f); flash.setHighLife(.2f); - flash.setInitialVelocity(new Vector3f(0, 5f, 0)); - flash.setVelocityVariation(1); + flash.getParticleInfluencer() + .setInitialVelocity(new Vector3f(0, 5f, 0)); + flash.getParticleInfluencer().setVelocityVariation(1); flash.setImagesX(2); flash.setImagesY(2); Material mat = new Material(assetManager, "Common/MatDefs/Misc/Particle.j3md"); @@ -120,8 +121,9 @@ public class TestExplosionEffect extends SimpleApplication { roundspark.setGravity(0, -.5f, 0); roundspark.setLowLife(1.8f); roundspark.setHighLife(2f); - roundspark.setInitialVelocity(new Vector3f(0, 3, 0)); - roundspark.setVelocityVariation(.5f); + roundspark.getParticleInfluencer() + .setInitialVelocity(new Vector3f(0, 3, 0)); + roundspark.getParticleInfluencer().setVelocityVariation(.5f); roundspark.setImagesX(1); roundspark.setImagesY(1); Material mat = new Material(assetManager, "Common/MatDefs/Misc/Particle.j3md"); @@ -165,8 +167,9 @@ public class TestExplosionEffect extends SimpleApplication { smoketrail.setGravity(0, 1, 0); smoketrail.setLowLife(.4f); smoketrail.setHighLife(.5f); - smoketrail.setInitialVelocity(new Vector3f(0, 12, 0)); - smoketrail.setVelocityVariation(1); + smoketrail.getParticleInfluencer() + .setInitialVelocity(new Vector3f(0, 12, 0)); + smoketrail.getParticleInfluencer().setVelocityVariation(1); smoketrail.setImagesX(1); smoketrail.setImagesY(3); Material mat = new Material(assetManager, "Common/MatDefs/Misc/Particle.j3md"); @@ -190,8 +193,9 @@ public class TestExplosionEffect extends SimpleApplication { debris.setGravity(0, 12f, 0); debris.setLowLife(1.4f); debris.setHighLife(1.5f); - debris.setInitialVelocity(new Vector3f(0, 15, 0)); - debris.setVelocityVariation(.60f); + debris.getParticleInfluencer() + .setInitialVelocity(new Vector3f(0, 15, 0)); + debris.getParticleInfluencer().setVelocityVariation(.60f); debris.setImagesX(3); debris.setImagesY(3); Material mat = new Material(assetManager, "Common/MatDefs/Misc/Particle.j3md"); @@ -214,8 +218,9 @@ public class TestExplosionEffect extends SimpleApplication { shockwave.setGravity(0, 0, 0); shockwave.setLowLife(0.5f); shockwave.setHighLife(0.5f); - shockwave.setInitialVelocity(new Vector3f(0, 0, 0)); - shockwave.setVelocityVariation(0f); + shockwave.getParticleInfluencer() + .setInitialVelocity(new Vector3f(0, 0, 0)); + shockwave.getParticleInfluencer().setVelocityVariation(0f); shockwave.setImagesX(1); shockwave.setImagesY(1); Material mat = new Material(assetManager, "Common/MatDefs/Misc/Particle.j3md"); diff --git a/jme3-examples/src/main/java/jme3test/effect/TestMovingParticle.java b/jme3-examples/src/main/java/jme3test/effect/TestMovingParticle.java index d603e229a..b38eed97a 100644 --- a/jme3-examples/src/main/java/jme3test/effect/TestMovingParticle.java +++ b/jme3-examples/src/main/java/jme3test/effect/TestMovingParticle.java @@ -60,10 +60,11 @@ public class TestMovingParticle extends SimpleApplication { public void simpleInitApp() { emit = new ParticleEmitter("Emitter", Type.Triangle, 300); emit.setGravity(0, 0, 0); - emit.setVelocityVariation(1); + emit.getParticleInfluencer().setVelocityVariation(1); emit.setLowLife(1); emit.setHighLife(1); - emit.setInitialVelocity(new Vector3f(0, .5f, 0)); + emit.getParticleInfluencer() + .setInitialVelocity(new Vector3f(0, .5f, 0)); emit.setImagesX(15); Material mat = new Material(assetManager, "Common/MatDefs/Misc/Particle.j3md"); mat.setTexture("Texture", assetManager.loadTexture("Effects/Smoke/Smoke.png")); diff --git a/jme3-examples/src/main/java/jme3test/effect/TestParticleExportingCloning.java b/jme3-examples/src/main/java/jme3test/effect/TestParticleExportingCloning.java index d245de23f..d38fdbdf9 100644 --- a/jme3-examples/src/main/java/jme3test/effect/TestParticleExportingCloning.java +++ b/jme3-examples/src/main/java/jme3test/effect/TestParticleExportingCloning.java @@ -57,7 +57,7 @@ public class TestParticleExportingCloning extends SimpleApplication { emit.setGravity(0, 0, 0); emit.setLowLife(5); emit.setHighLife(10); - emit.setInitialVelocity(new Vector3f(0, 0, 0)); + emit.getParticleInfluencer().setInitialVelocity(new Vector3f(0, 0, 0)); emit.setImagesX(15); Material mat = new Material(assetManager, "Common/MatDefs/Misc/Particle.j3md"); mat.setTexture("Texture", assetManager.loadTexture("Effects/Smoke/Smoke.png")); diff --git a/jme3-examples/src/main/java/jme3test/export/TestOgreConvert.java b/jme3-examples/src/main/java/jme3test/export/TestOgreConvert.java index bfc03c0c5..57dba2fb5 100644 --- a/jme3-examples/src/main/java/jme3test/export/TestOgreConvert.java +++ b/jme3-examples/src/main/java/jme3test/export/TestOgreConvert.java @@ -32,8 +32,7 @@ package jme3test.export; -import com.jme3.animation.AnimChannel; -import com.jme3.animation.AnimControl; +import com.jme3.anim.AnimComposer; import com.jme3.app.SimpleApplication; import com.jme3.export.binary.BinaryExporter; import com.jme3.export.binary.BinaryImporter; @@ -42,9 +41,8 @@ import com.jme3.math.ColorRGBA; import com.jme3.math.Vector3f; import com.jme3.scene.Node; import com.jme3.scene.Spatial; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; + +import java.io.*; public class TestOgreConvert extends SimpleApplication { @@ -71,10 +69,9 @@ public class TestOgreConvert extends SimpleApplication { BinaryImporter imp = new BinaryImporter(); imp.setAssetManager(assetManager); Node ogreModelReloaded = (Node) imp.load(bais, null, null); - - AnimControl control = ogreModelReloaded.getControl(AnimControl.class); - AnimChannel chan = control.createChannel(); - chan.setAnim("Walk"); + + AnimComposer composer = ogreModelReloaded.getControl(AnimComposer.class); + composer.setCurrentAction("Walk"); rootNode.attachChild(ogreModelReloaded); } catch (IOException ex){ diff --git a/jme3-examples/src/main/java/jme3test/gui/TestBitmapFontLayout.java b/jme3-examples/src/main/java/jme3test/gui/TestBitmapFontLayout.java new file mode 100644 index 000000000..8d210c330 --- /dev/null +++ b/jme3-examples/src/main/java/jme3test/gui/TestBitmapFontLayout.java @@ -0,0 +1,551 @@ +/* + * Copyright (c) 20018 jMonkeyEngine + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package jme3test.gui; + +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Font; +import java.awt.FontFormatException; +import java.awt.FontMetrics; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.GridLayout; +import java.awt.RenderingHints; +import java.awt.Toolkit; +import java.awt.geom.AffineTransform; +import java.awt.image.BufferedImage; +import java.awt.font.TextAttribute; +import java.io.IOException; +import java.util.*; +import javax.swing.*; + +import com.jme3.app.DebugKeysAppState; +import com.jme3.app.StatsAppState; +import com.jme3.app.SimpleApplication; +import com.jme3.app.state.ScreenshotAppState; +import com.jme3.bounding.BoundingBox; +import com.jme3.font.BitmapCharacter; +import com.jme3.font.BitmapCharacterSet; +import com.jme3.font.BitmapFont; +import com.jme3.font.BitmapText; +import com.jme3.input.KeyInput; +import com.jme3.input.controls.ActionListener; +import com.jme3.input.controls.KeyTrigger; +import com.jme3.material.Material; +import com.jme3.math.ColorRGBA; +import com.jme3.math.Vector3f; +import com.jme3.scene.*; +import com.jme3.scene.debug.WireBox; +import com.jme3.scene.shape.*; +import com.jme3.texture.Image; +import com.jme3.texture.Texture; +import com.jme3.texture.Texture2D; +import com.jme3.texture.plugins.AWTLoader; + +/** + * + * @author pspeed42 + */ +public class TestBitmapFontLayout extends SimpleApplication { + + public static final String SCROLL_UP = "scroll up"; + public static final String SCROLL_DOWN = "scroll down"; + public static final String SCROLL_LEFT = "scroll left"; + public static final String SCROLL_RIGHT = "scroll right"; + public static final String ZOOM_IN = "zoom in"; + public static final String ZOOM_OUT = "zoom out"; + public static final String RESET_ZOOM = "reset zoom"; + public static final String RESET_VIEW = "reset view"; + + public static final float ZOOM_SPEED = 0.1f; + public static final float SCROLL_SPEED = 50; + + private Node testRoot = new Node("test root"); + private Node scrollRoot = new Node("scroll root"); + private Vector3f scroll = new Vector3f(0, 0, 0); + private Vector3f zoom = new Vector3f(0, 0, 0); + + public static void main(String[] args){ + TestBitmapFontLayout app = new TestBitmapFontLayout(); + app.start(); + } + + public TestBitmapFontLayout() { + super(new StatsAppState(), + new DebugKeysAppState(), + new ScreenshotAppState("", System.currentTimeMillis())); + } + + public static Font loadTtf( String resource ) { + try { + return Font.createFont(Font.TRUETYPE_FONT, + TestBitmapFontLayout.class.getResourceAsStream(resource)); + } catch( FontFormatException | IOException e ) { + throw new RuntimeException("Error loading resource:" + resource, e); + } + } + + protected Texture renderAwtFont( TestConfig test, int width, int height, BitmapFont bitmapFont ) { + + BitmapCharacterSet charset = bitmapFont.getCharSet(); + + // Create an image at least as big as our JME text + System.out.println("Creating image size:" + width + ", " + height); + BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); + Graphics2D g2 = (Graphics2D)image.getGraphics(); + + g2.setColor(Color.lightGray); + g2.fillRect(0, 0, width, height); + g2.setColor(Color.cyan); + g2.drawRect(0, 0, width, height); + + g2.setColor(new Color(0, 0, 128)); + //g2.drawLine(0, 0, 50, 50); + //g2.drawLine(xFont, yFont, xFont + 30, yFont); + //g2.drawLine(xFont, yFont, xFont, yFont + 30); + + //g2.drawString("Testing", 0, 10); + + Font font = test.awtFont; + System.out.println("Java font:" + font); + + float size = font.getSize2D(); + FontMetrics fm = g2.getFontMetrics(font); + System.out.println("Java font metrics:" + fm); + + String[] lines = test.text.split("\n"); + + g2.setFont(font); + g2.setRenderingHint( + RenderingHints.KEY_TEXT_ANTIALIASING, + RenderingHints.VALUE_TEXT_ANTIALIAS_ON); + + int y = fm.getLeading() + fm.getMaxAscent(); + for( String s : lines ) { + g2.drawString(s, 0, y); + y += fm.getHeight(); + } + + g2.dispose(); + + Image jmeImage = new AWTLoader().load(image, true); + return new Texture2D(jmeImage); + } + + protected Node createVisual( TestConfig test ) { + Node result = new Node(test.name); + + // For reasons I have trouble articulating, I want the visual's 0,0,0 to be + // the same as the JME rendered text. All other things will then be positioned relative + // to that. + // JME BitmapText (currently) renders from what it thinks the top of the letter is + // down. The actual bitmap text bounds may extend upwards... so we need to account + // for that in any labeling we add above it. + // Thus we add and setup the main test text first. + + BitmapFont bitmapFont = assetManager.loadFont(test.jmeFont); + BitmapCharacterSet charset = bitmapFont.getCharSet(); + + System.out.println("Test name:" + test.name); + System.out.println("Charset line height:" + charset.getLineHeight()); + System.out.println(" base:" + charset.getBase()); + System.out.println(" rendered size:" + charset.getRenderedSize()); + System.out.println(" width:" + charset.getWidth() + " height:" + charset.getHeight()); + + BitmapText bitmapText = new BitmapText(bitmapFont); + bitmapText.setText(test.text); + bitmapText.setColor(ColorRGBA.Black); + result.attachChild(bitmapText); + + // And force it to update because BitmapText builds itself lazily. + result.updateLogicalState(0.1f); + BoundingBox bb = (BoundingBox)bitmapText.getWorldBound(); + + BitmapText label = new BitmapText(assetManager.loadFont("Interface/Fonts/Default.fnt")); + label.setText("Test:" + test.name); + // Move the label up by its own size plus whatever extra headspace + // that the test text might have... plus a couple pixels of padding. + float yOffset = Math.max(0, bb.getCenter().y + bb.getYExtent()); + label.move(0, label.getSize() + yOffset + 2, 0); + label.setColor(new ColorRGBA(0, 0.2f, 0, 1f)); + result.attachChild(label); + + + // Bitmap text won't update itself automatically... it's lazy. + // That means it won't be able to tell us its bounding volume, etc... so + // we'll force it to update. + result.updateLogicalState(0.1f); + + // Add a bounding box visual + WireBox box = new WireBox(bb.getXExtent(), bb.getYExtent(), bb.getZExtent()); + Geometry geom = new Geometry(test.name + " bounds", box); + geom.setMaterial(new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md")); + geom.getMaterial().setColor("Color", ColorRGBA.Red); + geom.setLocalTranslation(bb.getCenter()); + result.attachChild(geom); + + // Add a box to show 0,0 + font size + float size = bitmapText.getLineHeight() * 0.5f; + box = new WireBox(size, size, 0); + geom = new Geometry(test.name + " metric", box); + geom.setMaterial(new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md")); + geom.getMaterial().setColor("Color", ColorRGBA.Blue); + geom.setLocalTranslation(size, -size, 0); + result.attachChild(geom); + + float yBaseline = -charset.getBase(); + Line line = new Line(new Vector3f(0, yBaseline, 0), new Vector3f(50, yBaseline, 0)); + geom = new Geometry(test.name + " base", line); + geom.setMaterial(new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md")); + geom.getMaterial().setColor("Color", ColorRGBA.Green); + result.attachChild(geom); + + System.out.println("text bb:" + bb); + // We want the width and the height to cover the whole potential area + // for the font. So it can't just be the rendered bounds but must encompass + // the whole abstract font space... 0, 0, to center + extents. + //int width = (int)Math.round(bb.getCenter().x + bb.getXExtent()); + //int height = (int)Math.round(-bb.getCenter().y + bb.getYExtent()); + // No, that's not right either because in case like this: + // text bb:BoundingBox [Center: (142.0, -15.5, 0.0) xExtent: 142.0 yExtent: 20.5 zExtent: 0.0] + // We get: + // Creating image size:284, 36 + // ...when it should be at least 41 high. + float x1 = bb.getCenter().x - bb.getXExtent(); + float x2 = bb.getCenter().x + bb.getXExtent(); + float y1 = bb.getCenter().y - bb.getYExtent(); + float y2 = bb.getCenter().y + bb.getYExtent(); + System.out.println("xy1:" + x1 + ", " + y1 + " xy2:" + x2 + ", " + y2); + int width = (int)Math.round(x2 - Math.min(0, x1)); + int height = (int)Math.round(y2 - Math.min(0, y1)); + + Texture awtText = renderAwtFont(test, width, height, bitmapFont); + Quad quad = new Quad(width, height); + geom = new Geometry(test.name + " awt1", quad); + geom.setMaterial(new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md")); + geom.getMaterial().setTexture("ColorMap", awtText); + // Quads render from the lower left corner up + geom.move(0, -height, 0); + + // That quad is now positioned directly over where the bitmap text is. + // We'll clone it and move one right and one down + Geometry right = geom.clone(); + right.move(width, 0, 0); + result.attachChild(right); + + Geometry down = geom.clone(); + down.move(0, bb.getCenter().y - bb.getYExtent() - 1, 0); + result.attachChild(down); + + return result; + } + + @Override + public void simpleInitApp() { + setPauseOnLostFocus(false); + setDisplayStatView(false); + setDisplayFps(false); + viewPort.setBackgroundColor(ColorRGBA.LightGray); + + setupTestScene(); + setupUserInput(); + + setupInstructionsNote(); + } + + protected void setupInstructionsNote() { + // Add some instructional text + String instructions = "WASD/Cursor Keys = scroll\n" + + "+/- = zoom\n" + + "space = reset view\n" + + "0 = reset zoom\n"; + BitmapText note = new BitmapText(guiFont); + note.setText(instructions); + note.setColor(new ColorRGBA(0, 0.3f, 0, 1)); + note.updateLogicalState(0.1f); + + BoundingBox bb = (BoundingBox)note.getWorldBound(); + + note.setLocalTranslation(cam.getWidth() - bb.getXExtent() * 2 - 20, + cam.getHeight() - 20, 10); + + guiNode.attachChild(note); + + BitmapText note2 = note.clone(); + note2.setColor(ColorRGBA.Black); + note2.move(1, -1, -2); + guiNode.attachChild(note2); + + BitmapText note3 = note.clone(); + note3.setColor(ColorRGBA.White); + note3.move(-1, 1, -1); + guiNode.attachChild(note3); + + } + + protected void setupTestScene() { + String fox = "The quick brown fox jumps over the lazy dog."; + String loremIpsum = "Lorem ipsum dolor sit amet, consectetur adipiscing elit"; + String foxIpsum = fox + "\n" + loremIpsum; + + List tests = new ArrayList<>(); + + + // Note: for some Java fonts we reduce the point size to more closely + // match the pixel size... other than the Java-rendered fonts from Hiero, it will never + // be exact because of different font engines. + tests.add(new TestConfig("Hiero Java FreeSerif-16-Italic", + foxIpsum, + "jme3test/font/FreeSerif16I.fnt", + loadTtf("/jme3test/font/FreeSerif.ttf").deriveFont(Font.ITALIC, 16f))); + + tests.add(new TestConfig("Hiero FreeType FreeSerif-16-Italic", + foxIpsum, + "jme3test/font/FT-FreeSerif16I.fnt", + loadTtf("/jme3test/font/FreeSerif.ttf").deriveFont(Font.ITALIC, 14f))); + + tests.add(new TestConfig("Hiero Native FreeSerif-16-Italic", + foxIpsum, + "jme3test/font/Native-FreeSerif16I.fnt", + loadTtf("/jme3test/font/FreeSerif.ttf").deriveFont(Font.ITALIC, 15f))); + + tests.add(new TestConfig("AngelCode FreeSerif-16-Italic", + foxIpsum, + "jme3test/font/BM-FreeSerif16I.fnt", + loadTtf("/jme3test/font/FreeSerif.ttf").deriveFont(Font.ITALIC, 12f))); + // It's actually between 12 and 13 but Java rounds up. + + tests.add(new TestConfig("Hiero Padded FreeSerif-16-Italic", + foxIpsum, + "jme3test/font/FreeSerif16Ipad5555.fnt", + loadTtf("/jme3test/font/FreeSerif.ttf").deriveFont(Font.ITALIC, 16f))); + + tests.add(new TestConfig("AngelCode Padded FreeSerif-16-Italic", + foxIpsum, + "jme3test/font/BM-FreeSerif16Ipad5555.fnt", + loadTtf("/jme3test/font/FreeSerif.ttf").deriveFont(Font.ITALIC, 12f))); + // It's actually between 12 and 13 but Java rounds up. + + tests.add(new TestConfig("Hiero FreeSerif-32", + foxIpsum, + "jme3test/font/FreeSerif32.fnt", + loadTtf("/jme3test/font/FreeSerif.ttf").deriveFont(32f))); + + tests.add(new TestConfig("AngelCode FreeSerif-32", + foxIpsum, + "jme3test/font/BM-FreeSerif32.fnt", + loadTtf("/jme3test/font/FreeSerif.ttf").deriveFont(25f))); + + tests.add(new TestConfig("Hiero FreeSerif-64-Italic", + foxIpsum, + "jme3test/font/FreeSerif64I.fnt", + loadTtf("/jme3test/font/FreeSerif.ttf").deriveFont(Font.ITALIC, 64f))); + + tests.add(new TestConfig("AngelCode FreeSerif-64-Italic", + foxIpsum, + "jme3test/font/BM-FreeSerif64I.fnt", + loadTtf("/jme3test/font/FreeSerif.ttf").deriveFont(Font.ITALIC, 50f))); + + + /*tests.add(new TestConfig("Japanese", + "\u3042\u3047\u3070\u3090\u309E\u3067\u308A\u3089\n"+ + "\u3042\u3047\u3070\u3090\u309E\u3067\u308A\u3089", + "jme3test/font/DJapaSubset.fnt", + loadTtf("/jme3test/font/DroidSansFallback.ttf").deriveFont(32f)));*/ + + /*tests.add(new TestConfig("DroidSansMono-32", + "Ă㥹ĔĕĖėχψωӮӯ₴₵₹\n"+ + "Ă㥹ĔĕĖėχψωӮӯ₴₵₹", + "jme3test/font/DMono32BI.fnt", + loadTtf("/jme3test/font/DroidSansMono.ttf").deriveFont(32f)));*/ + + /*tests.add(new TestConfig("DroidSansMono-32", + "Ă㥹ĔĕĖėχψωӮӯ\n"+ + "Ă㥹ĔĕĖėχψωӮӯ", + "jme3test/font/DMono32BI.fnt", + loadTtf("/jme3test/font/DroidSansMono.ttf").deriveFont(Font.BOLD | Font.ITALIC, 32f))); + */ + + // Setup the test root node so that y = 0 is the top of the screen + testRoot.setLocalTranslation(0, cam.getHeight(), 0); + testRoot.attachChild(scrollRoot); + guiNode.attachChild(testRoot); + + float y = 0; //cam.getHeight(); + + for( TestConfig test : tests ) { + System.out.println("y:" + y); + + Node vis = createVisual(test); + + BoundingBox bb = (BoundingBox)vis.getWorldBound(); + System.out.println("bb:" + bb); + + // Render it relative to y, projecting down + vis.setLocalTranslation(1 + bb.getCenter().x - bb.getXExtent(), + y - bb.getCenter().y - bb.getYExtent(), + 0); + //vis.setLocalTranslation(1, y, 0); + scrollRoot.attachChild(vis); + + // Position to render the next one + y -= bb.getYExtent() * 2; + + // plus 5 pixels of padding + y -= 5; + } + } + + protected void resetZoom() { + testRoot.setLocalScale(1, 1, 1); + } + + protected void resetView() { + resetZoom(); + scrollRoot.setLocalTranslation(0, 0, 0); + } + + protected void setupUserInput() { + + inputManager.addMapping(SCROLL_UP, new KeyTrigger(KeyInput.KEY_UP), + new KeyTrigger(KeyInput.KEY_W)); + inputManager.addMapping(SCROLL_DOWN, new KeyTrigger(KeyInput.KEY_DOWN), + new KeyTrigger(KeyInput.KEY_S)); + inputManager.addMapping(SCROLL_LEFT, new KeyTrigger(KeyInput.KEY_LEFT), + new KeyTrigger(KeyInput.KEY_A)); + inputManager.addMapping(SCROLL_RIGHT, new KeyTrigger(KeyInput.KEY_RIGHT), + new KeyTrigger(KeyInput.KEY_D)); + inputManager.addMapping(ZOOM_IN, new KeyTrigger(KeyInput.KEY_ADD), + new KeyTrigger(KeyInput.KEY_EQUALS), + new KeyTrigger(KeyInput.KEY_Q)); + inputManager.addMapping(ZOOM_OUT, new KeyTrigger(KeyInput.KEY_MINUS), + new KeyTrigger(KeyInput.KEY_SUBTRACT), + new KeyTrigger(KeyInput.KEY_Z)); + inputManager.addMapping(RESET_VIEW, new KeyTrigger(KeyInput.KEY_SPACE)); + inputManager.addMapping(RESET_ZOOM, new KeyTrigger(KeyInput.KEY_0)); + + inputManager.addListener(new KeyStateListener(), + RESET_VIEW, RESET_ZOOM, + SCROLL_UP, SCROLL_DOWN, SCROLL_LEFT, SCROLL_RIGHT, + ZOOM_IN, ZOOM_OUT); + } + + public void simpleUpdate( float tpf ) { + if( scroll.lengthSquared() != 0 ) { + scrollRoot.move(scroll.mult(tpf)); + } + if( zoom.lengthSquared() != 0 ) { + Vector3f current = testRoot.getLocalScale(); + testRoot.setLocalScale(current.add(zoom.mult(tpf))); + } + } + + private class KeyStateListener implements ActionListener { + public void onAction(String name, boolean value, float tpf) { + switch( name ) { + case RESET_VIEW: + // Only on the up + if( !value ) { + resetView(); + } + break; + case RESET_ZOOM: + // Only on the up + if( !value ) { + resetZoom(); + } + break; + case ZOOM_IN: + if( value ) { + zoom.set(ZOOM_SPEED, ZOOM_SPEED, 0); + } else { + zoom.set(0, 0, 0); + } + break; + case ZOOM_OUT: + if( value ) { + zoom.set(-ZOOM_SPEED, -ZOOM_SPEED, 0); + } else { + zoom.set(0, 0, 0); + } + break; + case SCROLL_UP: + if( value ) { + scroll.set(0, -SCROLL_SPEED, 0); + } else { + scroll.set(0, 0, 0); + } + break; + case SCROLL_DOWN: + if( value ) { + scroll.set(0, SCROLL_SPEED, 0); + } else { + scroll.set(0, 0, 0); + } + break; + case SCROLL_LEFT: + if( value ) { + scroll.set(SCROLL_SPEED, 0, 0); + } else { + scroll.set(0, 0, 0); + } + break; + case SCROLL_RIGHT: + if( value ) { + scroll.set(-SCROLL_SPEED, 0, 0); + } else { + scroll.set(0, 0, 0); + } + break; + } + } + } + + private class TestConfig { + String name; + String jmeFont; + Font awtFont; + String text; + + public TestConfig( String name, String text, String jmeFont, Font awtFont ) { + this.name = name; + this.text = text; + this.jmeFont = jmeFont; + this.awtFont = awtFont; + } + } +} diff --git a/jme3-examples/src/main/java/jme3test/helloworld/HelloAnimation.java b/jme3-examples/src/main/java/jme3test/helloworld/HelloAnimation.java index bb1587b3e..db9c700c8 100644 --- a/jme3-examples/src/main/java/jme3test/helloworld/HelloAnimation.java +++ b/jme3-examples/src/main/java/jme3test/helloworld/HelloAnimation.java @@ -32,10 +32,7 @@ package jme3test.helloworld; -import com.jme3.animation.AnimChannel; -import com.jme3.animation.AnimControl; -import com.jme3.animation.AnimEventListener; -import com.jme3.animation.LoopMode; +import com.jme3.animation.*; import com.jme3.app.SimpleApplication; import com.jme3.input.KeyInput; import com.jme3.input.controls.ActionListener; @@ -70,7 +67,7 @@ public class HelloAnimation extends SimpleApplication rootNode.addLight(dl); /** Load a model that contains animation */ - player = (Node) assetManager.loadModel("Models/Oto/Oto.mesh.xml"); + player = (Node) assetManager.loadModel("Models/Oto/OtoOldAnim.j3o"); player.setLocalScale(0.5f); rootNode.attachChild(player); diff --git a/jme3-examples/src/main/java/jme3test/helloworld/HelloAudio.java b/jme3-examples/src/main/java/jme3test/helloworld/HelloAudio.java index b9943879c..bc13e01e8 100644 --- a/jme3-examples/src/main/java/jme3test/helloworld/HelloAudio.java +++ b/jme3-examples/src/main/java/jme3test/helloworld/HelloAudio.java @@ -1,6 +1,7 @@ package jme3test.helloworld; import com.jme3.app.SimpleApplication; +import com.jme3.audio.AudioData.DataType; import com.jme3.audio.AudioNode; import com.jme3.input.MouseInput; import com.jme3.input.controls.ActionListener; @@ -42,14 +43,16 @@ public class HelloAudio extends SimpleApplication { /** We create two audio nodes. */ private void initAudio() { /* gun shot sound is to be triggered by a mouse click. */ - audio_gun = new AudioNode(assetManager, "Sound/Effects/Gun.wav", false); + audio_gun = new AudioNode(assetManager, + "Sound/Effects/Gun.wav", DataType.Buffer); audio_gun.setPositional(false); audio_gun.setLooping(false); audio_gun.setVolume(2); rootNode.attachChild(audio_gun); /* nature sound - keeps playing in a loop. */ - audio_nature = new AudioNode(assetManager, "Sound/Environment/Ocean Waves.ogg", true); + audio_nature = new AudioNode(assetManager, + "Sound/Environment/Ocean Waves.ogg", DataType.Stream); audio_nature.setLooping(true); // activate continuous playing audio_nature.setPositional(true); audio_nature.setVolume(3); diff --git a/jme3-examples/src/main/java/jme3test/helloworld/HelloPhysics.java b/jme3-examples/src/main/java/jme3test/helloworld/HelloPhysics.java index f1355e03e..0da38215d 100644 --- a/jme3-examples/src/main/java/jme3test/helloworld/HelloPhysics.java +++ b/jme3-examples/src/main/java/jme3test/helloworld/HelloPhysics.java @@ -1,5 +1,5 @@ /** - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -204,12 +204,12 @@ public class HelloPhysics extends SimpleApplication { rootNode.attachChild(ball_geo); /** Position the cannon ball */ ball_geo.setLocalTranslation(cam.getLocation()); - /** Make the ball physcial with a mass > 0.0f */ + /** Make the ball physical with a mass > 0.0f */ ball_phy = new RigidBodyControl(1f); /** Add physical ball to physics space. */ ball_geo.addControl(ball_phy); bulletAppState.getPhysicsSpace().add(ball_phy); - /** Accelerate the physcial ball to shoot it. */ + /** Accelerate the physical ball to shoot it. */ ball_phy.setLinearVelocity(cam.getDirection().mult(25)); } diff --git a/jme3-examples/src/main/java/jme3test/input/TestChaseCamera.java b/jme3-examples/src/main/java/jme3test/input/TestChaseCamera.java index b6041a519..d933f9638 100644 --- a/jme3-examples/src/main/java/jme3test/input/TestChaseCamera.java +++ b/jme3-examples/src/main/java/jme3test/input/TestChaseCamera.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -97,7 +97,7 @@ public class TestChaseCamera extends SimpleApplication implements AnalogListener //WARNING : setting this trigger disable the rotation on right and left mouse button click //chaseCam.setToggleRotationTrigger(new MouseButtonTrigger(MouseInput.BUTTON_MIDDLE)); - //Uncomment this to set mutiple triggers to enable rotation of the cam + //Uncomment this to set multiple triggers to enable rotation of the cam //Here spade bar and middle mouse button //chaseCam.setToggleRotationTrigger(new MouseButtonTrigger(MouseInput.BUTTON_MIDDLE),new KeyTrigger(KeyInput.KEY_SPACE)); diff --git a/jme3-examples/src/main/java/jme3test/input/TestChaseCameraAppState.java b/jme3-examples/src/main/java/jme3test/input/TestChaseCameraAppState.java index a3db00ff2..00d6dd81a 100644 --- a/jme3-examples/src/main/java/jme3test/input/TestChaseCameraAppState.java +++ b/jme3-examples/src/main/java/jme3test/input/TestChaseCameraAppState.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -90,7 +90,7 @@ public class TestChaseCameraAppState extends SimpleApplication implements Analog //WARNING : setting this trigger disable the rotation on right and left mouse button click //chaseCamAS.setToggleRotationTrigger(new MouseButtonTrigger(MouseInput.BUTTON_MIDDLE)); - //Uncomment this to set mutiple triggers to enable rotation of the cam + //Uncomment this to set multiple triggers to enable rotation of the cam //Here space bar and middle mouse button //chaseCamAS.setToggleRotationTrigger(new MouseButtonTrigger(MouseInput.BUTTON_MIDDLE),new KeyTrigger(KeyInput.KEY_SPACE)); diff --git a/jme3-examples/src/main/java/jme3test/light/DlsfError.java b/jme3-examples/src/main/java/jme3test/light/DlsfError.java new file mode 100644 index 000000000..e69de29bb diff --git a/jme3-examples/src/main/java/jme3test/light/TestConeVSFrustum.java b/jme3-examples/src/main/java/jme3test/light/TestConeVSFrustum.java index 24729948d..d96edf706 100644 --- a/jme3-examples/src/main/java/jme3test/light/TestConeVSFrustum.java +++ b/jme3-examples/src/main/java/jme3test/light/TestConeVSFrustum.java @@ -102,7 +102,7 @@ public class TestConeVSFrustum extends SimpleApplication { float radius = FastMath.tan(spotLight.getSpotOuterAngle()) * spotLight.getSpotRange(); - Cylinder cylinder = new Cylinder(5, 16, 0, radius, spotLight.getSpotRange(), true, false); + Cylinder cylinder = new Cylinder(5, 16, 0.01f, radius, spotLight.getSpotRange(), true, false); geom = new Geometry("light", cylinder); geom.setMaterial(new Material(assetManager, "Common/MatDefs/Light/Lighting.j3md")); geom.getMaterial().setColor("Diffuse", ColorRGBA.White); diff --git a/jme3-examples/src/main/java/jme3test/light/TestDirectionalLightShadow.java b/jme3-examples/src/main/java/jme3test/light/TestDirectionalLightShadow.java index 6e3ad412b..79aacc616 100644 --- a/jme3-examples/src/main/java/jme3test/light/TestDirectionalLightShadow.java +++ b/jme3-examples/src/main/java/jme3test/light/TestDirectionalLightShadow.java @@ -59,6 +59,7 @@ import com.jme3.shadow.EdgeFilteringMode; import com.jme3.texture.Texture; import com.jme3.texture.Texture.WrapMode; import com.jme3.util.SkyFactory; +import com.jme3.util.SkyFactory.EnvMapType; import com.jme3.util.TangentBinormalGenerator; public class TestDirectionalLightShadow extends SimpleApplication implements ActionListener, AnalogListener { @@ -155,7 +156,8 @@ public class TestDirectionalLightShadow extends SimpleApplication implements Act al.setColor(ColorRGBA.White.mult(0.02f)); rootNode.addLight(al); - Spatial sky = SkyFactory.createSky(assetManager, "Scenes/Beach/FullskiesSunset0068.dds", false); + Spatial sky = SkyFactory.createSky(assetManager, + "Scenes/Beach/FullskiesSunset0068.dds", EnvMapType.CubeMap); sky.setLocalScale(350); rootNode.attachChild(sky); diff --git a/jme3-examples/src/main/java/jme3test/light/TestEnvironmentMapping.java b/jme3-examples/src/main/java/jme3test/light/TestEnvironmentMapping.java index ff674f664..4785b33c1 100644 --- a/jme3-examples/src/main/java/jme3test/light/TestEnvironmentMapping.java +++ b/jme3-examples/src/main/java/jme3test/light/TestEnvironmentMapping.java @@ -48,7 +48,8 @@ public class TestEnvironmentMapping extends SimpleApplication { chaseCam.setLookAtOffset(new Vector3f(0,0.5f,-1.0f)); buggy.addControl(chaseCam); rootNode.attachChild(buggy); - rootNode.attachChild(SkyFactory.createSky(assetManager, tex, false)); + rootNode.attachChild(SkyFactory.createSky(assetManager, tex, + SkyFactory.EnvMapType.CubeMap)); FilterPostProcessor fpp = new FilterPostProcessor(assetManager); BloomFilter bf = new BloomFilter(BloomFilter.GlowMode.Objects); diff --git a/jme3-examples/src/main/java/jme3test/light/TestObbVsBounds.java b/jme3-examples/src/main/java/jme3test/light/TestObbVsBounds.java new file mode 100644 index 000000000..c32773070 --- /dev/null +++ b/jme3-examples/src/main/java/jme3test/light/TestObbVsBounds.java @@ -0,0 +1,301 @@ +/* + * Copyright (c) 2009-2012 jMonkeyEngine + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'jMonkeyEngine' nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package jme3test.light; + +import com.jme3.app.ChaseCameraAppState; +import com.jme3.app.SimpleApplication; +import com.jme3.bounding.BoundingBox; +import com.jme3.bounding.BoundingSphere; +import com.jme3.export.binary.BinaryExporter; +import com.jme3.input.KeyInput; +import com.jme3.input.MouseInput; +import com.jme3.input.controls.*; +import com.jme3.light.*; +import com.jme3.material.Material; +import com.jme3.math.*; +import com.jme3.renderer.Camera; +import com.jme3.scene.*; +import com.jme3.scene.debug.Grid; +import com.jme3.scene.debug.WireFrustum; +import com.jme3.scene.shape.*; +import com.jme3.shadow.ShadowUtil; +import com.jme3.util.TempVars; + +import java.io.File; +import java.io.IOException; + +public class TestObbVsBounds extends SimpleApplication { + + private Node ln; + private BoundingBox aabb = new BoundingBox(); + private BoundingSphere sphere = new BoundingSphere(10, new Vector3f(-30, 0, -60)); + + private final static float MOVE_SPEED = 60; + private Vector3f tmp = new Vector3f(); + private Quaternion tmpQuat = new Quaternion(); + private boolean moving, shift; + private boolean panning; + + private OrientedBoxProbeArea area = new OrientedBoxProbeArea(); + private Camera frustumCam; + + private Geometry areaGeom; + private Geometry frustumGeom; + private Geometry aabbGeom; + private Geometry sphereGeom; + + public static void main(String[] args) { + TestObbVsBounds app = new TestObbVsBounds(); + app.start(); + } + + @Override + public void simpleInitApp() { + viewPort.setBackgroundColor(ColorRGBA.DarkGray); + frustumCam = cam.clone(); + frustumCam.setFrustumFar(25); + makeCamFrustum(); + aabb.setCenter(20, 10, -60); + aabb.setXExtent(10); + aabb.setYExtent(5); + aabb.setZExtent(3); + makeBoxWire(aabb); + makeSphereWire(sphere); + + rootNode.addLight(new DirectionalLight()); + AmbientLight al = new AmbientLight(); + al.setColor(ColorRGBA.White.mult(0.2f)); + rootNode.addLight(al); + + Grid grid = new Grid(50, 50, 5); + Geometry gridGeom = new Geometry("grid", grid); + gridGeom.setMaterial(new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md")); + gridGeom.getMaterial().setColor("Color", ColorRGBA.Gray); + rootNode.attachChild(gridGeom); + gridGeom.setLocalTranslation(-125, -25, -125); + + area.setCenter(Vector3f.ZERO); + area.setExtent(new Vector3f(4, 8, 5)); + makeAreaGeom(); + + ln = new Node("lb"); + ln.setLocalRotation(new Quaternion(-0.18826798f, -0.38304946f, -0.12780227f, 0.895261f)); + ln.attachChild(areaGeom); + ln.setLocalScale(4,8,5); + rootNode.attachChild(ln); + + inputManager.addMapping("click", new MouseButtonTrigger(MouseInput.BUTTON_RIGHT)); + inputManager.addMapping("shift", new KeyTrigger(KeyInput.KEY_LSHIFT), new KeyTrigger(KeyInput.KEY_RSHIFT)); + inputManager.addMapping("middleClick", new MouseButtonTrigger(MouseInput.BUTTON_MIDDLE)); + inputManager.addMapping("up", new MouseAxisTrigger(MouseInput.AXIS_Y, false)); + inputManager.addMapping("down", new MouseAxisTrigger(MouseInput.AXIS_Y, true)); + inputManager.addMapping("left", new MouseAxisTrigger(MouseInput.AXIS_X, true)); + inputManager.addMapping("right", new MouseAxisTrigger(MouseInput.AXIS_X, false)); + + + final Node camTarget = new Node("CamTarget"); + rootNode.attachChild(camTarget); + + ChaseCameraAppState chaser = new ChaseCameraAppState(); + chaser.setTarget(camTarget); + chaser.setMaxDistance(150); + chaser.setDefaultDistance(70); + chaser.setDefaultHorizontalRotation(FastMath.HALF_PI); + chaser.setMinVerticalRotation(-FastMath.PI); + chaser.setMaxVerticalRotation(FastMath.PI * 2); + chaser.setToggleRotationTrigger(new MouseButtonTrigger(MouseInput.BUTTON_LEFT)); + stateManager.attach(chaser); + flyCam.setEnabled(false); + + inputManager.addListener(new AnalogListener() { + public void onAnalog(String name, float value, float tpf) { + Spatial s = null; + float mult = 1; + if (moving) { + s = ln; + } + if (panning) { + s = camTarget; + mult = -1; + } + if ((moving || panning) && s != null) { + if (shift) { + if (name.equals("left")) { + tmp.set(cam.getDirection()); + s.rotate(tmpQuat.fromAngleAxis(value, tmp)); + } + if (name.equals("right")) { + tmp.set(cam.getDirection()); + s.rotate(tmpQuat.fromAngleAxis(-value, tmp)); + } + } else { + value *= MOVE_SPEED * mult; + if (name.equals("up")) { + tmp.set(cam.getUp()).multLocal(value); + s.move(tmp); + } + if (name.equals("down")) { + tmp.set(cam.getUp()).multLocal(-value); + s.move(tmp); + } + if (name.equals("left")) { + tmp.set(cam.getLeft()).multLocal(value); + s.move(tmp); + } + if (name.equals("right")) { + tmp.set(cam.getLeft()).multLocal(-value); + s.move(tmp); + } + } + } + } + }, "up", "down", "left", "right"); + + inputManager.addListener(new ActionListener() { + public void onAction(String name, boolean isPressed, float tpf) { + if (name.equals("click")) { + if (isPressed) { + moving = true; + } else { + moving = false; + } + } + if (name.equals("middleClick")) { + if (isPressed) { + panning = true; + } else { + panning = false; + } + } + if (name.equals("shift")) { + if (isPressed) { + shift = true; + } else { + shift = false; + } + } + } + }, "click", "middleClick", "shift"); + + } + + public void makeAreaGeom() { + + Vector3f[] points = new Vector3f[8]; + + for (int i = 0; i < points.length; i++) { + points[i] = new Vector3f(); + } + + points[0].set(-1, -1, 1); + points[1].set(-1, 1, 1); + points[2].set(1, 1, 1); + points[3].set(1, -1, 1); + + points[4].set(-1, -1, -1); + points[5].set(-1, 1, -1); + points[6].set(1, 1, -1); + points[7].set(1, -1, -1); + + Mesh box = WireFrustum.makeFrustum(points); + areaGeom = new Geometry("light", (Mesh)box); + areaGeom.setMaterial(new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md")); + areaGeom.getMaterial().setColor("Color", ColorRGBA.White); + } + + public void makeCamFrustum() { + Vector3f[] points = new Vector3f[8]; + for (int i = 0; i < 8; i++) { + points[i] = new Vector3f(); + } + ShadowUtil.updateFrustumPoints2(frustumCam, points); + WireFrustum frustumShape = new WireFrustum(points); + frustumGeom = new Geometry("frustum", frustumShape); + frustumGeom.setMaterial(new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md")); + rootNode.attachChild(frustumGeom); + } + + public void makeBoxWire(BoundingBox box) { + Vector3f[] points = new Vector3f[8]; + for (int i = 0; i < 8; i++) { + points[i] = new Vector3f(); + } + points[0].set(-1, -1, 1); + points[1].set(-1, 1, 1); + points[2].set(1, 1, 1); + points[3].set(1, -1, 1); + + points[4].set(-1, -1, -1); + points[5].set(-1, 1, -1); + points[6].set(1, 1, -1); + points[7].set(1, -1, -1); + + WireFrustum frustumShape = new WireFrustum(points); + aabbGeom = new Geometry("box", frustumShape); + aabbGeom.setMaterial(new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md")); + aabbGeom.getMaterial().getAdditionalRenderState().setWireframe(true); + aabbGeom.setLocalTranslation(box.getCenter()); + aabbGeom.setLocalScale(box.getXExtent(), box.getYExtent(), box.getZExtent()); + rootNode.attachChild(aabbGeom); + } + + public void makeSphereWire(BoundingSphere sphere) { + + sphereGeom = new Geometry("box", new Sphere(16, 16, 10)); + sphereGeom.setMaterial(new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md")); + sphereGeom.getMaterial().getAdditionalRenderState().setWireframe(true); + sphereGeom.setLocalTranslation(sphere.getCenter()); + rootNode.attachChild(sphereGeom); + } + + + @Override + public void simpleUpdate(float tpf) { + + area.setCenter(ln.getLocalTranslation()); + area.setRotation(ln.getLocalRotation()); + + TempVars vars = TempVars.get(); + boolean intersectBox = area.intersectsBox(aabb, vars); + boolean intersectFrustum = area.intersectsFrustum(frustumCam, vars); + boolean intersectSphere = area.intersectsSphere(sphere, vars); + vars.release(); + + boolean intersect = intersectBox || intersectFrustum || intersectSphere; + + areaGeom.getMaterial().setColor("Color", intersect ? ColorRGBA.Green : ColorRGBA.White); + sphereGeom.getMaterial().setColor("Color", intersectSphere ? ColorRGBA.Cyan : ColorRGBA.White); + frustumGeom.getMaterial().setColor("Color", intersectFrustum ? ColorRGBA.Cyan : ColorRGBA.White); + aabbGeom.getMaterial().setColor("Color", intersectBox ? ColorRGBA.Cyan : ColorRGBA.White); + + } +} diff --git a/jme3-examples/src/main/java/jme3test/light/TestPssmShadow.java b/jme3-examples/src/main/java/jme3test/light/TestPssmShadow.java deleted file mode 100644 index 9f851d39c..000000000 --- a/jme3-examples/src/main/java/jme3test/light/TestPssmShadow.java +++ /dev/null @@ -1,426 +0,0 @@ -/* - * Copyright (c) 2009-2012 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package jme3test.light; - -import com.jme3.app.SimpleApplication; -import com.jme3.export.JmeExporter; -import com.jme3.export.JmeImporter; -import com.jme3.export.Savable; -import com.jme3.font.BitmapText; -import com.jme3.input.KeyInput; -import com.jme3.input.controls.ActionListener; -import com.jme3.input.controls.AnalogListener; -import com.jme3.input.controls.KeyTrigger; -import com.jme3.light.AmbientLight; -import com.jme3.light.DirectionalLight; -import com.jme3.material.Material; -import com.jme3.math.ColorRGBA; -import com.jme3.math.FastMath; -import com.jme3.math.Quaternion; -import com.jme3.math.Vector2f; -import com.jme3.math.Vector3f; -import com.jme3.post.FilterPostProcessor; -import com.jme3.post.filters.FXAAFilter; -import com.jme3.renderer.RenderManager; -import com.jme3.renderer.ViewPort; -import com.jme3.renderer.queue.RenderQueue.ShadowMode; -import com.jme3.scene.Geometry; -import com.jme3.scene.Spatial; -import com.jme3.scene.control.AbstractControl; -import com.jme3.scene.control.Control; -import com.jme3.scene.shape.Box; -import com.jme3.scene.shape.Sphere; -import com.jme3.shadow.PssmShadowFilter; -import com.jme3.shadow.PssmShadowRenderer; -import com.jme3.shadow.PssmShadowRenderer.CompareMode; -import com.jme3.shadow.PssmShadowRenderer.FilterMode; -import com.jme3.texture.Texture; -import com.jme3.texture.Texture.WrapMode; -import com.jme3.util.SkyFactory; -import com.jme3.util.TangentBinormalGenerator; -import com.jme3.util.clone.Cloner; -import com.jme3.util.clone.JmeCloneable; -import java.io.IOException; - -public class TestPssmShadow extends SimpleApplication implements ActionListener { - - private Spatial[] obj; - private Material[] mat; - private boolean hardwareShadows = false; - private PssmShadowRenderer pssmRenderer; - private PssmShadowFilter pssmFilter; - private Geometry ground; - private Material matGroundU; - private Material matGroundL; - - public static void main(String[] args) { - TestPssmShadow app = new TestPssmShadow(); - app.start(); - } - - public void loadScene() { - obj = new Spatial[2]; - mat = new Material[2]; - mat[0] = assetManager.loadMaterial("Common/Materials/RedColor.j3m"); - mat[1] = assetManager.loadMaterial("Textures/Terrain/Pond/Pond.j3m"); - mat[1].setBoolean("UseMaterialColors", true); - mat[1].setColor("Ambient", ColorRGBA.White.mult(0.5f)); - mat[1].setColor("Diffuse", ColorRGBA.White.clone()); - - - obj[0] = new Geometry("sphere", new Sphere(30, 30, 2)); - obj[0].setShadowMode(ShadowMode.CastAndReceive); - obj[1] = new Geometry("cube", new Box(1.0f, 1.0f, 1.0f)); - obj[1].setShadowMode(ShadowMode.CastAndReceive); - TangentBinormalGenerator.generate(obj[1]); - TangentBinormalGenerator.generate(obj[0]); - - - for (int i = 0; i < 60; i++) { - Spatial t = obj[FastMath.nextRandomInt(0, obj.length - 1)].clone(false); - t.setLocalScale(FastMath.nextRandomFloat() * 10f); - t.setMaterial(mat[FastMath.nextRandomInt(0, mat.length - 1)]); - rootNode.attachChild(t); - t.setLocalTranslation(FastMath.nextRandomFloat() * 200f, FastMath.nextRandomFloat() * 30f + 20, 30f * (i + 2f)); - } - - Box b = new Box(1000, 2, 1000); - b.scaleTextureCoordinates(new Vector2f(10, 10)); - ground = new Geometry("soil", b); - ground.setLocalTranslation(0, 10, 550); - matGroundU = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); - matGroundU.setColor("Color", ColorRGBA.Green); - - - matGroundL = new Material(assetManager, "Common/MatDefs/Light/Lighting.j3md"); - Texture grass = assetManager.loadTexture("Textures/Terrain/splat/grass.jpg"); - grass.setWrap(WrapMode.Repeat); - matGroundL.setTexture("DiffuseMap", grass); - - ground.setMaterial(matGroundL); - - ground.setShadowMode(ShadowMode.CastAndReceive); - rootNode.attachChild(ground); - - l = new DirectionalLight(); - l.setDirection(new Vector3f(-1, -1, -1)); - rootNode.addLight(l); - - AmbientLight al = new AmbientLight(); - al.setColor(ColorRGBA.White.mult(0.5f)); - rootNode.addLight(al); - - Spatial sky = SkyFactory.createSky(assetManager, "Scenes/Beach/FullskiesSunset0068.dds", false); - sky.setLocalScale(350); - - rootNode.attachChild(sky); - } - DirectionalLight l; - - @Override - public void simpleInitApp() { - // put the camera in a bad position - cam.setLocation(new Vector3f(65.25412f, 44.38738f, 9.087874f)); - cam.setRotation(new Quaternion(0.078139365f, 0.050241485f, -0.003942559f, 0.9956679f)); - - flyCam.setMoveSpeed(100); - - loadScene(); - - pssmRenderer = new PssmShadowRenderer(assetManager, 1024, 3); - //pssmRenderer.setDirection(new Vector3f(-1, -1, -1).normalizeLocal()); - pssmRenderer.setDirection(new Vector3f(-0.5973172f, -0.56583486f, 0.8846725f).normalizeLocal()); - pssmRenderer.setLambda(0.55f); - pssmRenderer.setShadowIntensity(0.6f); - pssmRenderer.setCompareMode(CompareMode.Software); - pssmRenderer.setFilterMode(FilterMode.Dither); - - pssmRenderer.displayFrustum(); - viewPort.addProcessor(pssmRenderer); - - - - pssmFilter = new PssmShadowFilter(assetManager, 1024, 3); - //pssmFilter.setDirection(new Vector3f(-1, -1, -1).normalizeLocal()); - pssmRenderer.setDirection(new Vector3f(-0.5973172f, -0.56583486f, 0.8846725f).normalizeLocal()); - pssmFilter.setLambda(0.55f); - pssmFilter.setShadowIntensity(0.6f); - pssmFilter.setCompareMode(CompareMode.Software); - pssmFilter.setFilterMode(FilterMode.Dither); - pssmFilter.setEnabled(false); - - -// pssmFilter.setShadowZFadeLength(300); -// pssmFilter.setShadowZExtend(500); - - FilterPostProcessor fpp = new FilterPostProcessor(assetManager); - // fpp.setNumSamples(4); - fpp.addFilter(pssmFilter); - - viewPort.addProcessor(fpp); - - - initInputs(); - } - BitmapText infoText; - - private void initInputs() { - /** Write text on the screen (HUD) */ - guiFont = assetManager.loadFont("Interface/Fonts/Default.fnt"); - infoText = new BitmapText(guiFont, false); - infoText.setSize(guiFont.getCharSet().getRenderedSize()); - - - inputManager.addMapping("toggle", new KeyTrigger(KeyInput.KEY_SPACE)); - inputManager.addMapping("changeFiltering", new KeyTrigger(KeyInput.KEY_F)); - inputManager.addMapping("ShadowUp", new KeyTrigger(KeyInput.KEY_T)); - inputManager.addMapping("ShadowDown", new KeyTrigger(KeyInput.KEY_G)); - inputManager.addMapping("ThicknessUp", new KeyTrigger(KeyInput.KEY_Y)); - inputManager.addMapping("ThicknessDown", new KeyTrigger(KeyInput.KEY_H)); - inputManager.addMapping("lambdaUp", new KeyTrigger(KeyInput.KEY_U)); - inputManager.addMapping("lambdaDown", new KeyTrigger(KeyInput.KEY_J)); - inputManager.addMapping("toggleHW", new KeyTrigger(KeyInput.KEY_RETURN)); - inputManager.addMapping("switchGroundMat", new KeyTrigger(KeyInput.KEY_M)); - inputManager.addMapping("splits", new KeyTrigger(KeyInput.KEY_X)); - - inputManager.addMapping("up", new KeyTrigger(KeyInput.KEY_NUMPAD8)); - inputManager.addMapping("down", new KeyTrigger(KeyInput.KEY_NUMPAD2)); - inputManager.addMapping("right", new KeyTrigger(KeyInput.KEY_NUMPAD6)); - inputManager.addMapping("left", new KeyTrigger(KeyInput.KEY_NUMPAD4)); - inputManager.addMapping("fwd", new KeyTrigger(KeyInput.KEY_PGUP)); - inputManager.addMapping("back", new KeyTrigger(KeyInput.KEY_PGDN)); - - - - inputManager.addListener(this, "lambdaUp", "lambdaDown", "toggleHW", "toggle", "ShadowUp", "ShadowDown", "ThicknessUp", "ThicknessDown", "changeFiltering", - "switchGroundMat", "splits", "up", "down", "right", "left", "fwd", "back"); - - } - - private void print(String str) { - infoText.setText(str); - infoText.setLocalTranslation(cam.getWidth() * 0.5f - infoText.getLineWidth() * 0.5f, infoText.getLineHeight(), 0); - guiNode.attachChild(infoText); - infoText.removeControl(ctrl); - infoText.addControl(ctrl); - } - AbstractControl ctrl = new AbstractControl() { - - float time; - - @Override - protected void controlUpdate(float tpf) { - time += tpf; - if (time > 3) { - spatial.removeFromParent(); - spatial.removeControl(this); - } - } - - @Override - public void setSpatial(Spatial spatial) { - super.setSpatial(spatial); - time = 0; - } - - @Override - public Object jmeClone() { - return null; - } - - @Override - public void cloneFields( Cloner cloner, Object original ) { - } - - @Override - protected void controlRender(RenderManager rm, ViewPort vp) { - } - - @Override - public Control cloneForSpatial(Spatial spatial) { - return null; - } - }; - int filteringIndex = 2; - int renderModeIndex = 0; - - public void onAction(String name, boolean keyPressed, float tpf) { - if (name.equals("toggle") && keyPressed) { - renderModeIndex += 1; - renderModeIndex %= 3; - - switch (renderModeIndex) { - case 0: - viewPort.addProcessor(pssmRenderer); - break; - case 1: - viewPort.removeProcessor(pssmRenderer); - pssmFilter.setEnabled(true); - break; - case 2: - pssmFilter.setEnabled(false); - break; - } - - - - } else if (name.equals("toggleHW") && keyPressed) { - hardwareShadows = !hardwareShadows; - pssmRenderer.setCompareMode(hardwareShadows ? CompareMode.Hardware : CompareMode.Software); - pssmFilter.setCompareMode(hardwareShadows ? CompareMode.Hardware : CompareMode.Software); - System.out.println("HW Shadows: " + hardwareShadows); - } -// -// renderShadows = true; -// viewPort.addProcessor(pssmRenderer); - - if (name.equals("changeFiltering") && keyPressed) { - filteringIndex = (filteringIndex + 1) % FilterMode.values().length; - FilterMode m = FilterMode.values()[filteringIndex]; - pssmRenderer.setFilterMode(m); - pssmFilter.setFilterMode(m); - print("Filter mode : " + m.toString()); - } - - if (name.equals("lambdaUp") && keyPressed) { - pssmRenderer.setLambda(pssmRenderer.getLambda() + 0.01f); - pssmFilter.setLambda(pssmRenderer.getLambda() + 0.01f); - System.out.println("Lambda : " + pssmRenderer.getLambda()); - } else if (name.equals("lambdaDown") && keyPressed) { - pssmRenderer.setLambda(pssmRenderer.getLambda() - 0.01f); - pssmFilter.setLambda(pssmRenderer.getLambda() - 0.01f); - System.out.println("Lambda : " + pssmRenderer.getLambda()); - } - - if (name.equals("ShadowUp") && keyPressed) { - pssmRenderer.setShadowIntensity(pssmRenderer.getShadowIntensity() + 0.1f); - pssmFilter.setShadowIntensity(pssmRenderer.getShadowIntensity() + 0.1f); - System.out.println("Shadow intensity : " + pssmRenderer.getShadowIntensity()); - } - if (name.equals("ShadowDown") && keyPressed) { - pssmRenderer.setShadowIntensity(pssmRenderer.getShadowIntensity() - 0.1f); - pssmFilter.setShadowIntensity(pssmRenderer.getShadowIntensity() - 0.1f); - System.out.println("Shadow intensity : " + pssmRenderer.getShadowIntensity()); - } - if (name.equals("ThicknessUp") && keyPressed) { - pssmRenderer.setEdgesThickness(pssmRenderer.getEdgesThickness() + 1); - pssmFilter.setEdgesThickness(pssmRenderer.getEdgesThickness() + 1); - System.out.println("Shadow thickness : " + pssmRenderer.getEdgesThickness()); - } - if (name.equals("ThicknessDown") && keyPressed) { - pssmRenderer.setEdgesThickness(pssmRenderer.getEdgesThickness() - 1); - pssmFilter.setEdgesThickness(pssmRenderer.getEdgesThickness() - 1); - System.out.println("Shadow thickness : " + pssmRenderer.getEdgesThickness()); - } - if (name.equals("switchGroundMat") && keyPressed) { - if (ground.getMaterial() == matGroundL) { - ground.setMaterial(matGroundU); - } else { - ground.setMaterial(matGroundL); - } - } - -// if (name.equals("splits") && keyPressed) { -// pssmRenderer.displayFrustum(); -// } - - - if (name.equals("up")) { - up = keyPressed; - } - if (name.equals("down")) { - down = keyPressed; - } - if (name.equals("right")) { - right = keyPressed; - } - if (name.equals("left") ) { - left = keyPressed; - } - if (name.equals("fwd")) { - fwd = keyPressed; - } - if (name.equals("back")) { - back = keyPressed; - } - - } - boolean up = false; - boolean down = false; - boolean left = false; - boolean right = false; - boolean fwd = false; - boolean back = false; - float time = 0; - float s = 1f; - - @Override - public void simpleUpdate(float tpf) { - if (up) { - Vector3f v = l.getDirection(); - v.y += tpf / s; - setDir(v); - } - if (down) { - Vector3f v = l.getDirection(); - v.y -= tpf / s; - setDir(v); - } - if (right) { - Vector3f v = l.getDirection(); - v.x += tpf / s; - setDir(v); - } - if (left) { - Vector3f v = l.getDirection(); - v.x -= tpf / s; - setDir(v); - } - if (fwd) { - Vector3f v = l.getDirection(); - v.z += tpf / s; - setDir(v); - } - if (back) { - Vector3f v = l.getDirection(); - v.z -= tpf / s; - setDir(v); - } - - } - - private void setDir(Vector3f v) { - l.setDirection(v); - pssmFilter.setDirection(v); - pssmRenderer.setDirection(v); - } -} diff --git a/jme3-examples/src/main/java/jme3test/light/TestShadow.java b/jme3-examples/src/main/java/jme3test/light/TestShadow.java deleted file mode 100644 index d3c7122fb..000000000 --- a/jme3-examples/src/main/java/jme3test/light/TestShadow.java +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright (c) 2009-2012 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package jme3test.light; - -import com.jme3.app.SimpleApplication; -import com.jme3.material.Material; -import com.jme3.math.ColorRGBA; -import com.jme3.math.Quaternion; -import com.jme3.math.Vector3f; -import com.jme3.renderer.Camera; -import com.jme3.renderer.queue.RenderQueue.ShadowMode; -import com.jme3.scene.Geometry; -import com.jme3.scene.Spatial; -import com.jme3.scene.debug.WireFrustum; -import com.jme3.scene.shape.Box; -import com.jme3.shadow.BasicShadowRenderer; -import com.jme3.shadow.ShadowUtil; - -public class TestShadow extends SimpleApplication { - - float angle; - Spatial lightMdl; - Spatial teapot; - Geometry frustumMdl; - WireFrustum frustum; - - private BasicShadowRenderer bsr; - private Vector3f[] points; - - { - points = new Vector3f[8]; - for (int i = 0; i < points.length; i++) points[i] = new Vector3f(); - } - - public static void main(String[] args){ - TestShadow app = new TestShadow(); - app.start(); - } - - @Override - public void simpleInitApp() { - // put the camera in a bad position - cam.setLocation(new Vector3f(0.7804813f, 1.7502685f, -2.1556435f)); - cam.setRotation(new Quaternion(0.1961598f, -0.7213164f, 0.2266092f, 0.6243975f)); - cam.setFrustumFar(10); - - Material mat = assetManager.loadMaterial("Common/Materials/WhiteColor.j3m"); - rootNode.setShadowMode(ShadowMode.Off); - Box floor = new Box(3, 0.1f, 3); - Geometry floorGeom = new Geometry("Floor", floor); - floorGeom.setMaterial(mat); - floorGeom.setLocalTranslation(0,-0.2f,0); - floorGeom.setShadowMode(ShadowMode.Receive); - rootNode.attachChild(floorGeom); - - teapot = assetManager.loadModel("Models/Teapot/Teapot.obj"); - teapot.setLocalScale(2f); - teapot.setMaterial(mat); - teapot.setShadowMode(ShadowMode.CastAndReceive); - rootNode.attachChild(teapot); -// lightMdl = new Geometry("Light", new Sphere(10, 10, 0.1f)); -// lightMdl.setMaterial(mat); -// // disable shadowing for light representation -// lightMdl.setShadowMode(ShadowMode.Off); -// rootNode.attachChild(lightMdl); - - bsr = new BasicShadowRenderer(assetManager, 512); - bsr.setDirection(new Vector3f(-1, -1, -1).normalizeLocal()); - viewPort.addProcessor(bsr); - - frustum = new WireFrustum(bsr.getPoints()); - frustumMdl = new Geometry("f", frustum); - frustumMdl.setCullHint(Spatial.CullHint.Never); - frustumMdl.setShadowMode(ShadowMode.Off); - frustumMdl.setMaterial(new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md")); - frustumMdl.getMaterial().getAdditionalRenderState().setWireframe(true); - frustumMdl.getMaterial().setColor("Color", ColorRGBA.Red); - rootNode.attachChild(frustumMdl); - } - - @Override - public void simpleUpdate(float tpf){ - Camera shadowCam = bsr.getShadowCamera(); - ShadowUtil.updateFrustumPoints2(shadowCam, points); - - frustum.update(points); - // rotate teapot around Y axis - teapot.rotate(0, tpf * 0.25f, 0); - } - -} diff --git a/jme3-examples/src/main/java/jme3test/light/TestShadowBug.java b/jme3-examples/src/main/java/jme3test/light/TestShadowBug.java index cecb53224..acf2d6df1 100644 --- a/jme3-examples/src/main/java/jme3test/light/TestShadowBug.java +++ b/jme3-examples/src/main/java/jme3test/light/TestShadowBug.java @@ -100,14 +100,12 @@ public class TestShadowBug extends SimpleApplication { slsr.setLight(spot); slsr.setEdgeFilteringMode(EdgeFilteringMode.Nearest); slsr.setShadowIntensity(0.6f); - slsr.setFlushQueues(false); viewPort.addProcessor(slsr); PointLightShadowRenderer plsr = new PointLightShadowRenderer(assetManager, 512); plsr.setLight(lamp_light); plsr.setShadowIntensity(0.6f); plsr.setEdgeFilteringMode(EdgeFilteringMode.Nearest); - plsr.setFlushQueues(false); viewPort.addProcessor(plsr); viewPort.getCamera().setLocation(new Vector3f(192.0f, 10f, 192f)); diff --git a/jme3-examples/src/main/java/jme3test/light/TestShadowsPerf.java b/jme3-examples/src/main/java/jme3test/light/TestShadowsPerf.java index f267b1d41..97629117e 100644 --- a/jme3-examples/src/main/java/jme3test/light/TestShadowsPerf.java +++ b/jme3-examples/src/main/java/jme3test/light/TestShadowsPerf.java @@ -69,7 +69,6 @@ public class TestShadowsPerf extends SimpleApplication { @Override public void simpleInitApp() { - Logger.getLogger("com.jme3").setLevel(Level.SEVERE); flyCam.setMoveSpeed(50); flyCam.setEnabled(false); viewPort.setBackgroundColor(ColorRGBA.DarkGray); diff --git a/jme3-examples/src/main/java/jme3test/light/pbr/RefEnv.java b/jme3-examples/src/main/java/jme3test/light/pbr/RefEnv.java index a88e12bb0..051202cda 100644 --- a/jme3-examples/src/main/java/jme3test/light/pbr/RefEnv.java +++ b/jme3-examples/src/main/java/jme3test/light/pbr/RefEnv.java @@ -1,7 +1,6 @@ package jme3test.light.pbr; import com.jme3.app.SimpleApplication; -import com.jme3.bounding.BoundingSphere; import com.jme3.environment.EnvironmentCamera; import com.jme3.environment.LightProbeFactory; import com.jme3.environment.generation.JobProgressAdapter; @@ -10,6 +9,7 @@ import com.jme3.input.KeyInput; import com.jme3.input.controls.ActionListener; import com.jme3.input.controls.KeyTrigger; import com.jme3.light.LightProbe; +import com.jme3.light.SphereProbeArea; import com.jme3.material.Material; import com.jme3.math.*; import com.jme3.scene.*; @@ -127,7 +127,7 @@ public class RefEnv extends SimpleApplication { rootNode.getChild(0).setCullHint(Spatial.CullHint.Dynamic); } }); - ((BoundingSphere) probe.getBounds()).setRadius(100); + ((SphereProbeArea) probe.getArea()).setRadius(100); rootNode.addLight(probe); } diff --git a/jme3-examples/src/main/java/jme3test/light/pbr/TestPBRLighting.java b/jme3-examples/src/main/java/jme3test/light/pbr/TestPBRLighting.java index 122b2612b..4cc36b123 100644 --- a/jme3-examples/src/main/java/jme3test/light/pbr/TestPBRLighting.java +++ b/jme3-examples/src/main/java/jme3test/light/pbr/TestPBRLighting.java @@ -33,27 +33,21 @@ package jme3test.light.pbr; import com.jme3.app.SimpleApplication; import com.jme3.bounding.BoundingSphere; -import com.jme3.environment.util.*; -import com.jme3.light.LightProbe; -import com.jme3.environment.LightProbeFactory; import com.jme3.environment.EnvironmentCamera; +import com.jme3.environment.LightProbeFactory; import com.jme3.environment.generation.JobProgressAdapter; +import com.jme3.environment.util.EnvMapUtils; +import com.jme3.environment.util.LightsDebugState; import com.jme3.input.ChaseCamera; import com.jme3.input.KeyInput; import com.jme3.input.controls.ActionListener; import com.jme3.input.controls.KeyTrigger; -import com.jme3.light.DirectionalLight; +import com.jme3.light.*; import com.jme3.material.Material; -import com.jme3.math.ColorRGBA; -import com.jme3.math.FastMath; -import com.jme3.math.Vector3f; +import com.jme3.math.*; import com.jme3.post.FilterPostProcessor; -import com.jme3.post.filters.FXAAFilter; import com.jme3.post.filters.ToneMapFilter; -import com.jme3.post.ssao.SSAOFilter; -import com.jme3.scene.Geometry; -import com.jme3.scene.Node; -import com.jme3.scene.Spatial; +import com.jme3.scene.*; import com.jme3.texture.plugins.ktx.KTXLoader; import com.jme3.util.MaterialDebugAppState; import com.jme3.util.SkyFactory; @@ -210,7 +204,7 @@ public class TestPBRLighting extends SimpleApplication { tex = EnvMapUtils.getCubeMapCrossDebugViewWithMipMaps(result.getPrefilteredEnvMap(), assetManager); } }); - ((BoundingSphere) probe.getBounds()).setRadius(100); + ((SphereProbeArea) probe.getArea()).setRadius(100); rootNode.addLight(probe); //getStateManager().getState(EnvironmentManager.class).addEnvProbe(probe); diff --git a/jme3-examples/src/main/java/jme3test/light/pbr/TestPbrEnv.java b/jme3-examples/src/main/java/jme3test/light/pbr/TestPbrEnv.java deleted file mode 100644 index eb30e2d2f..000000000 --- a/jme3-examples/src/main/java/jme3test/light/pbr/TestPbrEnv.java +++ /dev/null @@ -1,378 +0,0 @@ -/* - * Copyright (c) 2009-2015 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package jme3test.light.pbr; - -import com.jme3.app.SimpleApplication; -import com.jme3.bounding.BoundingSphere; -import com.jme3.input.CameraInput; -import com.jme3.input.KeyInput; -import com.jme3.input.MouseInput; -import com.jme3.input.controls.ActionListener; -import com.jme3.input.controls.KeyTrigger; -import com.jme3.input.controls.MouseAxisTrigger; -import com.jme3.light.AmbientLight; -import com.jme3.light.DirectionalLight; -import com.jme3.material.Material; -import com.jme3.math.ColorRGBA; -import com.jme3.math.Quaternion; -import com.jme3.math.Vector2f; -import com.jme3.math.Vector3f; -import com.jme3.renderer.queue.RenderQueue.ShadowMode; -import com.jme3.scene.Geometry; -import com.jme3.scene.Spatial; -import com.jme3.scene.shape.Box; -import com.jme3.scene.shape.Sphere; -import com.jme3.shadow.DirectionalLightShadowRenderer; -import com.jme3.shadow.EdgeFilteringMode; - -import com.jme3.environment.LightProbeFactory; -import com.jme3.environment.EnvironmentCamera; -import com.jme3.environment.util.LightsDebugState; -import com.jme3.light.LightProbe; -import com.jme3.material.TechniqueDef; -import com.jme3.post.FilterPostProcessor; -import com.jme3.post.filters.BloomFilter; -import com.jme3.post.filters.FXAAFilter; -import com.jme3.post.filters.ToneMapFilter; -import com.jme3.post.ssao.SSAOFilter; -import com.jme3.scene.Node; -import com.jme3.texture.plugins.ktx.KTXLoader; -import com.jme3.util.SkyFactory; -import com.jme3.util.TangentBinormalGenerator; - -public class TestPbrEnv extends SimpleApplication implements ActionListener { - - public static final int SHADOWMAP_SIZE = 1024; - private Spatial[] obj; - private Material[] mat; - private DirectionalLightShadowRenderer dlsr; - private LightsDebugState debugState; - - private EnvironmentCamera envCam; - - private Geometry ground; - private Material matGroundU; - private Material matGroundL; - - private Geometry camGeom; - - public static void main(String[] args) { - TestPbrEnv app = new TestPbrEnv(); - app.start(); - } - - - public void loadScene() { - - renderManager.setPreferredLightMode(TechniqueDef.LightMode.SinglePass); - renderManager.setSinglePassLightBatchSize(3); - obj = new Spatial[2]; - // Setup first view - - mat = new Material[2]; - mat[0] = assetManager.loadMaterial("jme3test/light/pbr/pbrMat.j3m"); - //mat[1] = assetManager.loadMaterial("Textures/Terrain/Pond/Pond.j3m"); - mat[1] = assetManager.loadMaterial("jme3test/light/pbr/pbrMat2.j3m"); -// mat[1].setBoolean("UseMaterialColors", true); -// mat[1].setColor("Ambient", ColorRGBA.White.mult(0.5f)); -// mat[1].setColor("Diffuse", ColorRGBA.White.clone()); - - obj[0] = new Geometry("sphere", new Sphere(30, 30, 2)); - obj[0].setShadowMode(ShadowMode.CastAndReceive); - obj[1] = new Geometry("cube", new Box(1.0f, 1.0f, 1.0f)); - obj[1].setShadowMode(ShadowMode.CastAndReceive); - TangentBinormalGenerator.generate(obj[1]); - TangentBinormalGenerator.generate(obj[0]); - -// for (int i = 0; i < 60; i++) { -// Spatial t = obj[FastMath.nextRandomInt(0, obj.length - 1)].clone(false); -// t.setName("Cube" + i); -// t.setLocalScale(FastMath.nextRandomFloat() * 10f); -// t.setMaterial(mat[FastMath.nextRandomInt(0, mat.length - 1)]); -// rootNode.attachChild(t); -// t.setLocalTranslation(FastMath.nextRandomFloat() * 200f, FastMath.nextRandomFloat() * 30f + 20, 30f * (i + 2f)); -// } - - for (int i = 0; i < 2; i++) { - Spatial t = obj[0].clone(false); - t.setName("Cube" + i); - t.setLocalScale( 10f); - t.setMaterial(mat[1].clone()); - rootNode.attachChild(t); - t.setLocalTranslation(i * 200f+ 100f, 50, 800f * (i)); - } - - Box b = new Box(1000, 2, 1000); - b.scaleTextureCoordinates(new Vector2f(20, 20)); - ground = new Geometry("soil", b); - TangentBinormalGenerator.generate(ground); - ground.setLocalTranslation(0, 10, 550); - matGroundU = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); - matGroundU.setColor("Color", ColorRGBA.Green); - -// matGroundL = new Material(assetManager, "Common/MatDefs/Light/Lighting.j3md"); -// Texture grass = assetManager.loadTexture("Textures/Terrain/splat/grass.jpg"); -// grass.setWrap(WrapMode.Repeat); -// matGroundL.setTexture("DiffuseMap", grass); - - matGroundL = assetManager.loadMaterial("jme3test/light/pbr/pbrMat4.j3m"); - - ground.setMaterial(matGroundL); - - //ground.setShadowMode(ShadowMode.CastAndReceive); - rootNode.attachChild(ground); - - l = new DirectionalLight(); - l.setColor(ColorRGBA.White); - //l.setDirection(new Vector3f(0.5973172f, -0.16583486f, 0.7846725f).normalizeLocal()); - l.setDirection(new Vector3f(-0.2823181f, -0.41889593f, 0.863031f).normalizeLocal()); - - rootNode.addLight(l); - - AmbientLight al = new AmbientLight(); - al.setColor(ColorRGBA.White.mult(0.5f)); - // rootNode.addLight(al); - - //Spatial sky = SkyFactory.createSky(assetManager, "Scenes/Beach/FullskiesSunset0068.dds", SkyFactory.EnvMapType.CubeMap); - Spatial sky = SkyFactory.createSky(assetManager, "Textures/Sky/Path.hdr", SkyFactory.EnvMapType.EquirectMap); - sky.setLocalScale(350); - - rootNode.attachChild(sky); - } - DirectionalLight l; - - @Override - public void simpleInitApp() { - assetManager.registerLoader(KTXLoader.class, "ktx"); - - - // put the camera in a bad position - cam.setLocation(new Vector3f(-52.433647f, 68.69636f, -118.60924f)); - cam.setRotation(new Quaternion(0.10294232f, 0.25269797f, -0.027049713f, 0.96167296f)); - - flyCam.setMoveSpeed(100); - - loadScene(); - - dlsr = new DirectionalLightShadowRenderer(assetManager, SHADOWMAP_SIZE, 4); - dlsr.setLight(l); - //dlsr.setLambda(0.55f); - dlsr.setShadowIntensity(0.5f); - dlsr.setEdgeFilteringMode(EdgeFilteringMode.PCFPOISSON); - //dlsr.displayDebug(); - // viewPort.addProcessor(dlsr); - - FilterPostProcessor fpp = new FilterPostProcessor(assetManager); - - fpp.addFilter(new ToneMapFilter(Vector3f.UNIT_XYZ.mult(6.0f))); - SSAOFilter ssao = new SSAOFilter(); - ssao.setIntensity(5); - - fpp.addFilter(ssao); - - BloomFilter bloomFilter = new BloomFilter(); - fpp.addFilter(bloomFilter); - fpp.addFilter(new FXAAFilter()); - //viewPort.addProcessor(fpp); - - initInputs(); - -// envManager = new EnvironmentManager(); -// getStateManager().attach(envManager); -// - envCam = new EnvironmentCamera(); - getStateManager().attach(envCam); - - debugState = new LightsDebugState(); - debugState.setProbeScale(5); - getStateManager().attach(debugState); - - camGeom = new Geometry("camGeom", new Sphere(16, 16, 2)); -// Material m = new Material(assetManager, "Common/MatDefs/Misc/UnshadedNodes.j3md"); -// m.setColor("Color", ColorRGBA.Green); - Material m = assetManager.loadMaterial("jme3test/light/pbr/pbrMat3.j3m"); - camGeom.setMaterial(m); - camGeom.setLocalTranslation(0, 20, 0); - camGeom.setLocalScale(5); - rootNode.attachChild(camGeom); - - // envManager.setScene(rootNode); - -// MaterialDebugAppState debug = new MaterialDebugAppState(); -// debug.registerBinding("MatDefs/PBRLighting.frag", rootNode); -// getStateManager().attach(debug); - - flyCam.setDragToRotate(true); - setPauseOnLostFocus(false); - - // cam.lookAt(camGeom.getWorldTranslation(), Vector3f.UNIT_Y); - - } - - private void fixFLyCamInputs() { - inputManager.deleteMapping(CameraInput.FLYCAM_LEFT); - inputManager.deleteMapping(CameraInput.FLYCAM_RIGHT); - inputManager.deleteMapping(CameraInput.FLYCAM_UP); - inputManager.deleteMapping(CameraInput.FLYCAM_DOWN); - - inputManager.addMapping(CameraInput.FLYCAM_LEFT, new MouseAxisTrigger(MouseInput.AXIS_X, true)); - - inputManager.addMapping(CameraInput.FLYCAM_RIGHT, new MouseAxisTrigger(MouseInput.AXIS_X, false)); - - inputManager.addMapping(CameraInput.FLYCAM_UP, new MouseAxisTrigger(MouseInput.AXIS_Y, false)); - - inputManager.addMapping(CameraInput.FLYCAM_DOWN, new MouseAxisTrigger(MouseInput.AXIS_Y, true)); - - inputManager.addListener(flyCam, CameraInput.FLYCAM_LEFT, CameraInput.FLYCAM_RIGHT, CameraInput.FLYCAM_UP, CameraInput.FLYCAM_DOWN); - } - - private void initInputs() { - inputManager.addMapping("switchGroundMat", new KeyTrigger(KeyInput.KEY_M)); - inputManager.addMapping("snapshot", new KeyTrigger(KeyInput.KEY_SPACE)); - inputManager.addMapping("fc", new KeyTrigger(KeyInput.KEY_F)); - inputManager.addMapping("debugProbe", new KeyTrigger(KeyInput.KEY_RETURN)); - inputManager.addMapping("debugTex", new KeyTrigger(KeyInput.KEY_T)); - inputManager.addMapping("up", new KeyTrigger(KeyInput.KEY_UP)); - inputManager.addMapping("down", new KeyTrigger(KeyInput.KEY_DOWN)); - inputManager.addMapping("right", new KeyTrigger(KeyInput.KEY_RIGHT)); - inputManager.addMapping("left", new KeyTrigger(KeyInput.KEY_LEFT)); - inputManager.addMapping("delete", new KeyTrigger(KeyInput.KEY_DELETE)); - - inputManager.addListener(this, "delete","switchGroundMat", "snapshot", "debugTex", "debugProbe", "fc", "up", "down", "left", "right"); - } - - private LightProbe lastProbe; - private Node debugGui ; - - @Override - public void onAction(String name, boolean keyPressed, float tpf) { - - if (name.equals("switchGroundMat") && keyPressed) { - if (ground.getMaterial() == matGroundL) { - ground.setMaterial(matGroundU); - } else { - - ground.setMaterial(matGroundL); - } - } - - if (name.equals("snapshot") && keyPressed) { - envCam.setPosition(camGeom.getWorldTranslation()); - lastProbe = LightProbeFactory.makeProbe(envCam, rootNode, new ConsoleProgressReporter()); - ((BoundingSphere)lastProbe.getBounds()).setRadius(200); - rootNode.addLight(lastProbe); - - } - - if (name.equals("delete") && keyPressed) { - System.err.println(rootNode.getWorldLightList().size()); - rootNode.removeLight(lastProbe); - System.err.println("deleted"); - System.err.println(rootNode.getWorldLightList().size()); - } - - if (name.equals("fc") && keyPressed) { - - flyCam.setEnabled(true); - } - - if (name.equals("debugProbe") && keyPressed) { - debugState.setEnabled(!debugState.isEnabled()); - } - - if (name.equals("debugTex") && keyPressed) { - if(debugGui == null || debugGui.getParent() == null){ - debugGui = lastProbe.getDebugGui(assetManager); - debugGui.setLocalTranslation(10, 200, 0); - guiNode.attachChild(debugGui); - } else if(debugGui != null){ - debugGui.removeFromParent(); - } - } - - if (name.equals("up")) { - up = keyPressed; - } - if (name.equals("down")) { - down = keyPressed; - } - if (name.equals("right")) { - right = keyPressed; - } - if (name.equals("left")) { - left = keyPressed; - } - if (name.equals("fwd")) { - fwd = keyPressed; - } - if (name.equals("back")) { - back = keyPressed; - } - - } - boolean up = false; - boolean down = false; - boolean left = false; - boolean right = false; - boolean fwd = false; - boolean back = false; - float time = 0; - float s = 50f; - boolean initialized = false; - - @Override - public void simpleUpdate(float tpf) { - - if (!initialized) { - fixFLyCamInputs(); - initialized = true; - } - float val = tpf * s; - if (up) { - camGeom.move(0, 0, val); - } - if (down) { - camGeom.move(0, 0, -val); - - } - if (right) { - camGeom.move(-val, 0, 0); - - } - if (left) { - camGeom.move(val, 0, 0); - - } - - } - -} diff --git a/jme3-examples/src/main/java/jme3test/material/TestMatParamOverride.java b/jme3-examples/src/main/java/jme3test/material/TestMatParamOverride.java index 224290f25..6124d9edd 100644 --- a/jme3-examples/src/main/java/jme3test/material/TestMatParamOverride.java +++ b/jme3-examples/src/main/java/jme3test/material/TestMatParamOverride.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2016 jMonkeyEngine + * Copyright (c) 2009-2017 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -38,6 +38,8 @@ import com.jme3.input.controls.KeyTrigger; import com.jme3.material.MatParamOverride; import com.jme3.material.Material; import com.jme3.math.ColorRGBA; +import com.jme3.math.Quaternion; +import com.jme3.math.Vector4f; import com.jme3.scene.Geometry; import com.jme3.scene.shape.Box; import com.jme3.shader.VarType; @@ -50,7 +52,15 @@ import com.jme3.shader.VarType; public class TestMatParamOverride extends SimpleApplication { private Box box = new Box(1, 1, 1); - private MatParamOverride override = new MatParamOverride(VarType.Vector4, "Color", ColorRGBA.Yellow); + final MatParamOverride overrideYellow + = new MatParamOverride(VarType.Vector4, "Color", + ColorRGBA.Yellow); + final MatParamOverride overrideWhite + = new MatParamOverride(VarType.Vector4, "Color", + Vector4f.UNIT_XYZW); + final MatParamOverride overrideGray + = new MatParamOverride(VarType.Vector4, "Color", + new Quaternion(0.5f, 0.5f, 0.5f, 1f)); public static void main(String[] args) { TestMatParamOverride app = new TestMatParamOverride(); @@ -74,19 +84,30 @@ public class TestMatParamOverride extends SimpleApplication { createBox(0, ColorRGBA.Green); createBox(3, ColorRGBA.Blue); - inputManager.addMapping("override", new KeyTrigger(KeyInput.KEY_SPACE)); + System.out.println("Press G, W, Y, or space bar ..."); + inputManager.addMapping("overrideClear", new KeyTrigger(KeyInput.KEY_SPACE)); + inputManager.addMapping("overrideGray", new KeyTrigger(KeyInput.KEY_G)); + inputManager.addMapping("overrideWhite", new KeyTrigger(KeyInput.KEY_W)); + inputManager.addMapping("overrideYellow", new KeyTrigger(KeyInput.KEY_Y)); inputManager.addListener(new ActionListener() { @Override public void onAction(String name, boolean isPressed, float tpf) { - if (name.equals("override") && isPressed) { - if (!rootNode.getLocalMatParamOverrides().isEmpty()) { + if (isPressed) { + if (name.equals("overrideClear")) { rootNode.clearMatParamOverrides(); - } else { - rootNode.addMatParamOverride(override); + } else if (name.equals("overrideGray")) { + rootNode.clearMatParamOverrides(); + rootNode.addMatParamOverride(overrideGray); + } else if (name.equals("overrideWhite")) { + rootNode.clearMatParamOverrides(); + rootNode.addMatParamOverride(overrideWhite); + } else if (name.equals("overrideYellow")) { + rootNode.clearMatParamOverrides(); + rootNode.addMatParamOverride(overrideYellow); } System.out.println(rootNode.getLocalMatParamOverrides()); } } - }, "override"); + }, "overrideClear", "overrideGray", "overrideWhite", "overrideYellow"); } } diff --git a/jme3-examples/src/main/java/jme3test/model/TestGltfLoading.java b/jme3-examples/src/main/java/jme3test/model/TestGltfLoading.java index 3373638fa..8aa044d55 100644 --- a/jme3-examples/src/main/java/jme3test/model/TestGltfLoading.java +++ b/jme3-examples/src/main/java/jme3test/model/TestGltfLoading.java @@ -31,21 +31,22 @@ */ package jme3test.model; -import com.jme3.animation.*; -import com.jme3.app.ChaseCameraAppState; -import com.jme3.app.SimpleApplication; +import com.jme3.anim.AnimComposer; +import com.jme3.anim.SkinningControl; +import com.jme3.app.*; +import com.jme3.asset.plugins.FileLocator; import com.jme3.input.KeyInput; import com.jme3.input.controls.ActionListener; import com.jme3.input.controls.KeyTrigger; import com.jme3.math.*; import com.jme3.renderer.Limits; -import com.jme3.scene.Node; -import com.jme3.scene.Spatial; +import com.jme3.scene.*; import com.jme3.scene.control.Control; -import com.jme3.scene.debug.custom.SkeletonDebugAppState; +import com.jme3.scene.debug.custom.ArmatureDebugAppState; +import com.jme3.scene.plugins.gltf.GltfModelKey; +import jme3test.model.anim.EraseTimer; -import java.util.ArrayList; -import java.util.List; +import java.util.*; public class TestGltfLoading extends SimpleApplication { @@ -56,9 +57,13 @@ public class TestGltfLoading extends SimpleApplication { int assetIndex = 0; boolean useAutoRotate = false; private final static String indentString = "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"; - int duration = 2; + int duration = 1; boolean playAnim = true; + Geometry g; + int morphIndex = 0; + + public static void main(String[] args) { TestGltfLoading app = new TestGltfLoading(); app.start(); @@ -71,10 +76,15 @@ public class TestGltfLoading extends SimpleApplication { https://sketchfab.com/features/gltf You have to copy them in Model/gltf folder in the test-data project. */ + @Override public void simpleInitApp() { - SkeletonDebugAppState skeletonDebugAppState = new SkeletonDebugAppState(); - getStateManager().attach(skeletonDebugAppState); + ArmatureDebugAppState armatureDebugappState = new ArmatureDebugAppState(); + getStateManager().attach(armatureDebugappState); + setTimer(new EraseTimer()); + + String folder = System.getProperty("user.home"); + assetManager.registerLocator(folder, FileLocator.class); // cam.setLocation(new Vector3f(4.0339394f, 2.645184f, 6.4627485f)); // cam.setRotation(new Quaternion(-0.013950467f, 0.98604023f, -0.119502485f, -0.11510504f)); @@ -105,31 +115,54 @@ public class TestGltfLoading extends SimpleApplication { // PointLight pl1 = new PointLight(new Vector3f(-5.0f, -5.0f, -5.0f), ColorRGBA.White.mult(0.5f), 50); // rootNode.addLight(pl1); + //loadModel("Models/gltf/polly/project_polly.gltf", new Vector3f(0, 0, 0), 0.5f); + //loadModel("Models/gltf/zophrac/scene.gltf", new Vector3f(0, 0, 0), 0.1f); + // loadModel("Models/gltf/scifigirl/scene.gltf", new Vector3f(0, -1, 0), 0.1f); + //loadModel("Models/gltf/man/scene.gltf", new Vector3f(0, -1, 0), 0.1f); + //loadModel("Models/gltf/torus/scene.gltf", new Vector3f(0, -1, 0), 0.1f); + //loadModel("Models/gltf/morph/scene.gltf", new Vector3f(0, 0, 0), 0.2f); + //loadModel("Models/gltf/morphCube/AnimatedMorphCube.gltf", new Vector3f(0, 0, 0), 1f); + // loadModel("Models/gltf/morph/SimpleMorph.gltf", new Vector3f(0, 0, 0), 0.1f); + //loadModel("Models/gltf/nier/scene.gltf", new Vector3f(0, -1.5f, 0), 0.01f); + loadModel("Models/gltf/izzy/scene.gltf", new Vector3f(0, -1, 0), 0.01f); + //loadModel("Models/gltf/darth/scene.gltf", new Vector3f(0, -1, 0), 0.01f); + //loadModel("Models/gltf/mech/scene.gltf", new Vector3f(0, -1, 0), 0.01f); + //loadModel("Models/gltf/elephant/scene.gltf", new Vector3f(0, -1, 0), 0.01f); + //loadModel("Models/gltf/buffalo/scene.gltf", new Vector3f(0, -1, 0), 0.1f); + //loadModel("Models/gltf/war/scene.gltf", new Vector3f(0, -1, 0), 0.1f); + //loadModel("Models/gltf/ganjaarl/scene.gltf", new Vector3f(0, -1, 0), 0.01f); + //loadModel("Models/gltf/hero/scene.gltf", new Vector3f(0, -1, 0), 0.1f); + //loadModel("Models/gltf/mercy/scene.gltf", new Vector3f(0, -1, 0), 0.01f); + //loadModel("Models/gltf/crab/scene.gltf", Vector3f.ZERO, 1); + //loadModel("Models/gltf/manta/scene.gltf", Vector3f.ZERO, 0.2f); + //loadModel("Models/gltf/bone/scene.gltf", Vector3f.ZERO, 0.1f); // loadModel("Models/gltf/box/box.gltf", Vector3f.ZERO, 1); // loadModel("Models/gltf/duck/Duck.gltf", new Vector3f(0, -1, 0), 1); // loadModel("Models/gltf/damagedHelmet/damagedHelmet.gltf", Vector3f.ZERO, 1); // loadModel("Models/gltf/hornet/scene.gltf", new Vector3f(0, -0.5f, 0), 0.4f); //// loadModel("Models/gltf/adamHead/adamHead.gltf", Vector3f.ZERO, 0.6f); - // loadModel("Models/gltf/busterDrone/busterDrone.gltf", new Vector3f(0, 0f, 0), 0.8f); + //loadModel("Models/gltf/busterDrone/busterDrone.gltf", new Vector3f(0, 0f, 0), 0.8f); // loadModel("Models/gltf/animatedCube/AnimatedCube.gltf", Vector3f.ZERO, 0.5f); // -// //loadModel("Models/gltf/BoxAnimated/BoxAnimated.gltf", new Vector3f(0, 0f, 0), 0.8f); + //loadModel("Models/gltf/BoxAnimated/BoxAnimated.gltf", new Vector3f(0, 0f, 0), 0.8f); // -// loadModel("Models/gltf/RiggedFigure/RiggedSimple.gltf", new Vector3f(0, -0.3f, 0), 0.2f); + //loadModel("Models/gltf/RiggedFigure/RiggedSimple.gltf", new Vector3f(0, -0.3f, 0), 0.2f); //loadModel("Models/gltf/RiggedFigure/RiggedFigure.gltf", new Vector3f(0, -1f, 0), 1f); //loadModel("Models/gltf/CesiumMan/CesiumMan.gltf", new Vector3f(0, -1, 0), 1f); //loadModel("Models/gltf/BrainStem/BrainStem.gltf", new Vector3f(0, -1, 0), 1f); //loadModel("Models/gltf/Jaime/Jaime.gltf", new Vector3f(0, -1, 0), 1f); -// loadModel("Models/gltf/GiantWorm/GiantWorm.gltf", new Vector3f(0, -1, 0), 1f); -// //loadModel("Models/gltf/RiggedFigure/WalkingLady.gltf", new Vector3f(0, -0.f, 0), 1f); -// loadModel("Models/gltf/Monster/Monster.gltf", Vector3f.ZERO, 0.03f); + // loadModel("Models/gltf/GiantWorm/GiantWorm.gltf", new Vector3f(0, -1, 0), 1f); + //loadModel("Models/gltf/RiggedFigure/WalkingLady.gltf", new Vector3f(0, -0.f, 0), 1f); + //loadModel("Models/gltf/Monster/Monster.gltf", Vector3f.ZERO, 0.03f); // loadModel("Models/gltf/corset/Corset.gltf", new Vector3f(0, -1, 0), 20f); - loadModel("Models/gltf/boxInter/BoxInterleaved.gltf", new Vector3f(0, 0, 0), 1f); + // loadModel("Models/gltf/boxInter/BoxInterleaved.gltf", new Vector3f(0, 0, 0), 1f); probeNode.attachChild(assets.get(0)); + // setMorphTarget(morphIndex); + ChaseCameraAppState chaseCam = new ChaseCameraAppState(); chaseCam.setTarget(probeNode); getStateManager().attach(chaseCam); @@ -152,6 +185,7 @@ public class TestGltfLoading extends SimpleApplication { }, "autorotate"); inputManager.addMapping("toggleAnim", new KeyTrigger(KeyInput.KEY_RETURN)); + inputManager.addListener(new ActionListener() { @Override public void onAction(String name, boolean isPressed, float tpf) { @@ -165,8 +199,21 @@ public class TestGltfLoading extends SimpleApplication { } } }, "toggleAnim"); + inputManager.addMapping("nextAnim", new KeyTrigger(KeyInput.KEY_RIGHT)); + inputManager.addListener(new ActionListener() { + @Override + public void onAction(String name, boolean isPressed, float tpf) { + if (isPressed && composer != null) { + String anim = anims.poll(); + anims.add(anim); + composer.setCurrentAction(anim); + } + } + }, "nextAnim"); dumpScene(rootNode, 0); + + // stateManager.attach(new DetailedProfilerState()); } private T findControl(Spatial s, Class controlClass) { @@ -187,7 +234,9 @@ public class TestGltfLoading extends SimpleApplication { } private void loadModel(String path, Vector3f offset, float scale) { - Spatial s = assetManager.loadModel(path); + GltfModelKey k = new GltfModelKey(path); + //k.setKeepSkeletonPose(true); + Spatial s = assetManager.loadModel(k); s.scale(scale); s.move(offset); assets.add(s); @@ -195,36 +244,44 @@ public class TestGltfLoading extends SimpleApplication { playFirstAnim(s); } - SkeletonControl ctrl = findControl(s, SkeletonControl.class); + SkinningControl ctrl = findControl(s, SkinningControl.class); -// //ctrl.getSpatial().removeControl(ctrl); + // ctrl.getSpatial().removeControl(ctrl); if (ctrl == null) { return; } - ctrl.setHardwareSkinningPreferred(false); - getStateManager().getState(SkeletonDebugAppState.class).addSkeleton(ctrl, true); + //System.err.println(ctrl.getArmature().toString()); + //ctrl.setHardwareSkinningPreferred(false); + // getStateManager().getState(ArmatureDebugAppState.class).addArmatureFrom(ctrl); // AnimControl aCtrl = findControl(s, AnimControl.class); // //ctrl.getSpatial().removeControl(ctrl); // if (aCtrl == null) { // return; // } -// if (aCtrl.getSkeleton() != null) { -// getStateManager().getState(SkeletonDebugAppState.class).addSkeleton(aCtrl.getSkeleton(), aCtrl.getSpatial(), true); +// if (aCtrl.getArmature() != null) { +// getStateManager().getState(SkeletonDebugAppState.class).addSkeleton(aCtrl.getArmature(), aCtrl.getSpatial(), true); // } } + Queue anims = new LinkedList<>(); + AnimComposer composer; + private void playFirstAnim(Spatial s) { - AnimControl control = s.getControl(AnimControl.class); + AnimComposer control = s.getControl(AnimComposer.class); if (control != null) { -// if (control.getAnimationNames().size() > 0) { -// control.createChannel().setAnim(control.getAnimationNames().iterator().next()); -// } - for (String name : control.getAnimationNames()) { - control.createChannel().setAnim(name); + anims.clear(); + for (String name : control.getAnimClipsNames()) { + anims.add(name); } - + if (anims.isEmpty()) { + return; + } + String anim = anims.poll(); + anims.add(anim); + control.setCurrentAction(anim); + composer = control; } if (s instanceof Node) { Node n = (Node) s; @@ -236,17 +293,9 @@ public class TestGltfLoading extends SimpleApplication { private void stopAnim(Spatial s) { - AnimControl control = s.getControl(AnimControl.class); + AnimComposer control = s.getControl(AnimComposer.class); if (control != null) { - for (int i = 0; i < control.getNumChannels(); i++) { - AnimChannel ch = control.getChannel(i); - ch.reset(true); - } - control.clearChannels(); - if (control.getSkeleton() != null) { - control.getSkeleton().reset(); - } - + control.reset(); } if (s instanceof Node) { Node n = (Node) s; @@ -258,18 +307,19 @@ public class TestGltfLoading extends SimpleApplication { @Override public void simpleUpdate(float tpf) { - if (!useAutoRotate) { return; } time += tpf; - autoRotate.rotate(0, tpf * 0.5f, 0); + // autoRotate.rotate(0, tpf * 0.5f, 0); if (time > duration) { + // morphIndex++; + // setMorphTarget(morphIndex); assets.get(assetIndex).removeFromParent(); assetIndex = (assetIndex + 1) % assets.size(); - if (assetIndex == 0) { - duration = 10; - } +// if (assetIndex == 0) { +// duration = 10; +// } probeNode.attachChild(assets.get(assetIndex)); time = 0; } diff --git a/jme3-examples/src/main/java/jme3test/model/anim/EraseTimer.java b/jme3-examples/src/main/java/jme3test/model/anim/EraseTimer.java new file mode 100644 index 000000000..ba6189195 --- /dev/null +++ b/jme3-examples/src/main/java/jme3test/model/anim/EraseTimer.java @@ -0,0 +1,76 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package jme3test.model.anim; + +import com.jme3.system.Timer; + +/** + * @author Nehon + */ +public class EraseTimer extends Timer { + + + //private static final long TIMER_RESOLUTION = 1000L; + //private static final float INVERSE_TIMER_RESOLUTION = 1f/1000L; + private static final long TIMER_RESOLUTION = 1000000000L; + private static final float INVERSE_TIMER_RESOLUTION = 1f / 1000000000L; + + private long startTime; + private long previousTime; + private float tpf; + private float fps; + + public EraseTimer() { + //startTime = System.currentTimeMillis(); + startTime = System.nanoTime(); + } + + /** + * Returns the time in seconds. The timer starts + * at 0.0 seconds. + * + * @return the current time in seconds + */ + @Override + public float getTimeInSeconds() { + return getTime() * INVERSE_TIMER_RESOLUTION; + } + + public long getTime() { + //return System.currentTimeMillis() - startTime; + return System.nanoTime() - startTime; + } + + public long getResolution() { + return TIMER_RESOLUTION; + } + + public float getFrameRate() { + return fps; + } + + public float getTimePerFrame() { + return tpf; + } + + public void update() { + tpf = (getTime() - previousTime) * (1.0f / TIMER_RESOLUTION); + if (tpf >= 0.2) { + //the frame lasted more than 200ms we erase its time to 16ms. + tpf = 0.016666f; + } else { + fps = 1.0f / tpf; + } + previousTime = getTime(); + } + + public void reset() { + //startTime = System.currentTimeMillis(); + startTime = System.nanoTime(); + previousTime = getTime(); + } + + +} diff --git a/jme3-examples/src/main/java/jme3test/model/anim/TestAnimBlendBug.java b/jme3-examples/src/main/java/jme3test/model/anim/TestAnimBlendBug.java deleted file mode 100644 index b57fc83cb..000000000 --- a/jme3-examples/src/main/java/jme3test/model/anim/TestAnimBlendBug.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright (c) 2009-2012 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package jme3test.model.anim; - -import com.jme3.animation.AnimChannel; -import com.jme3.animation.AnimControl; -import com.jme3.app.SimpleApplication; -import com.jme3.input.KeyInput; -import com.jme3.input.controls.ActionListener; -import com.jme3.input.controls.KeyTrigger; -import com.jme3.light.DirectionalLight; -import com.jme3.material.Material; -import com.jme3.math.ColorRGBA; -import com.jme3.math.Vector3f; -import com.jme3.scene.Node; -import com.jme3.scene.debug.SkeletonDebugger; - -public class TestAnimBlendBug extends SimpleApplication implements ActionListener { - -// private AnimControl control; - private AnimChannel channel1, channel2; - private String[] animNames; - - private float blendTime = 0.5f; - private float lockAfterBlending = blendTime + 0.25f; - private float blendingAnimationLock; - - public static void main(String[] args) { - TestAnimBlendBug app = new TestAnimBlendBug(); - app.start(); - } - - public void onAction(String name, boolean value, float tpf) { - if (name.equals("One") && value){ - channel1.setAnim(animNames[4], blendTime); - channel2.setAnim(animNames[4], 0); - channel1.setSpeed(0.25f); - channel2.setSpeed(0.25f); - blendingAnimationLock = lockAfterBlending; - } - } - - public void onPreUpdate(float tpf) { - } - - public void onPostUpdate(float tpf) { - } - - @Override - public void simpleUpdate(float tpf) { - // Is there currently a blending underway? - if (blendingAnimationLock > 0f) { - blendingAnimationLock -= tpf; - } - } - - @Override - public void simpleInitApp() { - inputManager.addMapping("One", new KeyTrigger(KeyInput.KEY_1)); - inputManager.addListener(this, "One"); - - flyCam.setMoveSpeed(100f); - cam.setLocation( new Vector3f( 0f, 150f, -325f ) ); - cam.lookAt( new Vector3f( 0f, 100f, 0f ), Vector3f.UNIT_Y ); - - DirectionalLight dl = new DirectionalLight(); - dl.setDirection(new Vector3f(-0.1f, -0.7f, 1).normalizeLocal()); - dl.setColor(new ColorRGBA(1f, 1f, 1f, 1.0f)); - rootNode.addLight(dl); - - Node model1 = (Node) assetManager.loadModel("Models/Ninja/Ninja.mesh.xml"); - Node model2 = (Node) assetManager.loadModel("Models/Ninja/Ninja.mesh.xml"); -// Node model2 = model1.clone(); - - model1.setLocalTranslation(-60, 0, 0); - model2.setLocalTranslation(60, 0, 0); - - AnimControl control1 = model1.getControl(AnimControl.class); - animNames = control1.getAnimationNames().toArray(new String[0]); - channel1 = control1.createChannel(); - - AnimControl control2 = model2.getControl(AnimControl.class); - channel2 = control2.createChannel(); - - SkeletonDebugger skeletonDebug = new SkeletonDebugger("skeleton1", control1.getSkeleton()); - Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); - mat.getAdditionalRenderState().setWireframe(true); - mat.setColor("Color", ColorRGBA.Red); - mat.setFloat("PointSize", 7f); - mat.getAdditionalRenderState().setDepthTest(false); - skeletonDebug.setMaterial(mat); - model1.attachChild(skeletonDebug); - - skeletonDebug = new SkeletonDebugger("skeleton2", control2.getSkeleton()); - skeletonDebug.setMaterial(mat); - model2.attachChild(skeletonDebug); - - rootNode.attachChild(model1); - rootNode.attachChild(model2); - } - -} diff --git a/jme3-examples/src/main/java/jme3test/model/anim/TestAnimMigration.java b/jme3-examples/src/main/java/jme3test/model/anim/TestAnimMigration.java new file mode 100644 index 000000000..18cbb0275 --- /dev/null +++ b/jme3-examples/src/main/java/jme3test/model/anim/TestAnimMigration.java @@ -0,0 +1,218 @@ +package jme3test.model.anim; + +import com.jme3.anim.*; +import com.jme3.anim.tween.action.Action; +import com.jme3.anim.tween.action.BlendAction; +import com.jme3.anim.tween.action.BlendableAction; +import com.jme3.anim.tween.action.LinearBlendSpace; +import com.jme3.anim.util.AnimMigrationUtils; +import com.jme3.app.ChaseCameraAppState; +import com.jme3.app.SimpleApplication; +import com.jme3.input.KeyInput; +import com.jme3.input.controls.ActionListener; +import com.jme3.input.controls.AnalogListener; +import com.jme3.input.controls.KeyTrigger; +import com.jme3.light.AmbientLight; +import com.jme3.light.DirectionalLight; +import com.jme3.math.*; +import com.jme3.scene.Node; +import com.jme3.scene.Spatial; +import com.jme3.scene.debug.custom.ArmatureDebugAppState; + +import java.util.LinkedList; +import java.util.Queue; + +/** + * Created by Nehon on 18/12/2017. + */ +public class TestAnimMigration extends SimpleApplication { + + ArmatureDebugAppState debugAppState; + AnimComposer composer; + LinkedList anims = new LinkedList<>(); + boolean playAnim = false; + BlendAction action; + float blendValue = 1f; + + public static void main(String... argv) { + TestAnimMigration app = new TestAnimMigration(); + app.start(); + } + + @Override + public void simpleInitApp() { + setTimer(new EraseTimer()); + cam.setFrustumPerspective(45f, (float) cam.getWidth() / cam.getHeight(), 0.1f, 100f); + viewPort.setBackgroundColor(ColorRGBA.DarkGray); + rootNode.addLight(new DirectionalLight(new Vector3f(-1, -1, -1).normalizeLocal())); + rootNode.addLight(new AmbientLight(ColorRGBA.DarkGray)); + + Spatial model = assetManager.loadModel("Models/Jaime/Jaime.j3o"); + // Spatial model = assetManager.loadModel("Models/Oto/Oto.mesh.xml").scale(0.2f).move(0, 1, 0); + //Spatial model = assetManager.loadModel("Models/Sinbad/Sinbad.mesh.xml"); + //Spatial model = assetManager.loadModel("Models/Elephant/Elephant.mesh.xml").scale(0.02f); + + AnimMigrationUtils.migrate(model); + + rootNode.attachChild(model); + + + debugAppState = new ArmatureDebugAppState(); + stateManager.attach(debugAppState); + + setupModel(model); + + flyCam.setEnabled(false); + + Node target = new Node("CamTarget"); + //target.setLocalTransform(model.getLocalTransform()); + target.move(0, 1, 0); + ChaseCameraAppState chaseCam = new ChaseCameraAppState(); + chaseCam.setTarget(target); + getStateManager().attach(chaseCam); + chaseCam.setInvertHorizontalAxis(true); + chaseCam.setInvertVerticalAxis(true); + chaseCam.setZoomSpeed(0.5f); + chaseCam.setMinVerticalRotation(-FastMath.HALF_PI); + chaseCam.setRotationSpeed(3); + chaseCam.setDefaultDistance(3); + chaseCam.setMinDistance(0.01f); + chaseCam.setZoomSpeed(0.01f); + chaseCam.setDefaultVerticalRotation(0.3f); + + initInputs(); + } + + public void initInputs() { + inputManager.addMapping("toggleAnim", new KeyTrigger(KeyInput.KEY_RETURN)); + + inputManager.addListener(new ActionListener() { + @Override + public void onAction(String name, boolean isPressed, float tpf) { + if (isPressed) { + playAnim = !playAnim; + if (playAnim) { + String anim = anims.poll(); + anims.add(anim); + composer.setCurrentAction(anim); + System.err.println(anim); + } else { + composer.reset(); + } + } + } + }, "toggleAnim"); + inputManager.addMapping("nextAnim", new KeyTrigger(KeyInput.KEY_RIGHT)); + inputManager.addListener(new ActionListener() { + @Override + public void onAction(String name, boolean isPressed, float tpf) { + if (isPressed && composer != null) { + String anim = anims.poll(); + anims.add(anim); + composer.setCurrentAction(anim); + System.err.println(anim); + } + } + }, "nextAnim"); + inputManager.addMapping("toggleArmature", new KeyTrigger(KeyInput.KEY_SPACE)); + inputManager.addListener(new ActionListener() { + @Override + public void onAction(String name, boolean isPressed, float tpf) { + if (isPressed) { + debugAppState.setEnabled(!debugAppState.isEnabled()); + } + } + }, "toggleArmature"); + + inputManager.addMapping("mask", new KeyTrigger(KeyInput.KEY_M)); + inputManager.addListener(new ActionListener() { + @Override + public void onAction(String name, boolean isPressed, float tpf) { + if (isPressed) { + composer.setCurrentAction("Wave", "LeftArm"); + } + } + }, "mask"); + + inputManager.addMapping("blendUp", new KeyTrigger(KeyInput.KEY_UP)); + inputManager.addMapping("blendDown", new KeyTrigger(KeyInput.KEY_DOWN)); + + inputManager.addListener(new AnalogListener() { + + @Override + public void onAnalog(String name, float value, float tpf) { + if (name.equals("blendUp")) { + blendValue += value; + blendValue = FastMath.clamp(blendValue, 1, 4); + action.getBlendSpace().setValue(blendValue); + action.setSpeed(blendValue); + } + if (name.equals("blendDown")) { + blendValue -= value; + blendValue = FastMath.clamp(blendValue, 1, 4); + action.getBlendSpace().setValue(blendValue); + action.setSpeed(blendValue); + } + //System.err.println(blendValue); + } + }, "blendUp", "blendDown"); + } + + private void setupModel(Spatial model) { + if (composer != null) { + return; + } + composer = model.getControl(AnimComposer.class); + if (composer != null) { + + SkinningControl sc = model.getControl(SkinningControl.class); + debugAppState.addArmatureFrom(sc); + + anims.clear(); + for (String name : composer.getAnimClipsNames()) { + anims.add(name); + } + composer.actionSequence("Sequence1", + composer.makeAction("Walk"), + composer.makeAction("Run"), + composer.makeAction("Jumping")).setSpeed(1); + + composer.actionSequence("Sequence2", + composer.makeAction("Walk"), + composer.makeAction("Run"), + composer.makeAction("Jumping")).setSpeed(-1); + + action = composer.actionBlended("Blend", new LinearBlendSpace(1, 4), + "Walk", "Run"); + + action.getBlendSpace().setValue(1); + + composer.action("Walk").setSpeed(-1); + + composer.makeLayer("LeftArm", ArmatureMask.createMask(sc.getArmature(), "shoulder.L")); + + anims.addFirst("Blend"); + anims.addFirst("Sequence2"); + anims.addFirst("Sequence1"); + + if (anims.isEmpty()) { + return; + } + if (playAnim) { + String anim = anims.poll(); + anims.add(anim); + composer.setCurrentAction(anim); + System.err.println(anim); + } + + } else { + if (model instanceof Node) { + Node n = (Node) model; + for (Spatial child : n.getChildren()) { + setupModel(child); + } + } + } + + } +} diff --git a/jme3-examples/src/main/java/jme3test/model/anim/TestAnimMorphSerialization.java b/jme3-examples/src/main/java/jme3test/model/anim/TestAnimMorphSerialization.java new file mode 100644 index 000000000..2e122a35e --- /dev/null +++ b/jme3-examples/src/main/java/jme3test/model/anim/TestAnimMorphSerialization.java @@ -0,0 +1,170 @@ +package jme3test.model.anim; + +import com.jme3.anim.*; +import com.jme3.anim.util.AnimMigrationUtils; +import com.jme3.app.ChaseCameraAppState; +import com.jme3.app.SimpleApplication; +import com.jme3.asset.plugins.FileLocator; +import com.jme3.export.binary.BinaryExporter; +import com.jme3.input.KeyInput; +import com.jme3.input.controls.ActionListener; +import com.jme3.input.controls.KeyTrigger; +import com.jme3.light.AmbientLight; +import com.jme3.light.DirectionalLight; +import com.jme3.math.*; +import com.jme3.scene.Node; +import com.jme3.scene.Spatial; +import com.jme3.scene.debug.custom.ArmatureDebugAppState; +import com.jme3.system.JmeSystem; + +import java.io.File; +import java.io.IOException; +import java.util.LinkedList; +import java.util.Queue; + +/** + * Created by Nehon on 18/12/2017. + */ +public class TestAnimMorphSerialization extends SimpleApplication { + + ArmatureDebugAppState debugAppState; + AnimComposer composer; + Queue anims = new LinkedList<>(); + boolean playAnim = true; + File file; + + public static void main(String... argv) { + TestAnimMorphSerialization app = new TestAnimMorphSerialization(); + app.start(); + } + + @Override + public void simpleInitApp() { + setTimer(new EraseTimer()); + //cam.setFrustumPerspective(90f, (float) cam.getWidth() / cam.getHeight(), 0.01f, 10f); + viewPort.setBackgroundColor(ColorRGBA.DarkGray); + //rootNode.addLight(new DirectionalLight(new Vector3f(-1, -1, -1).normalizeLocal())); + //rootNode.addLight(new AmbientLight(ColorRGBA.DarkGray)); + Node probeNode = (Node) assetManager.loadModel("Scenes/defaultProbe.j3o"); + rootNode.attachChild(probeNode); + Spatial model = assetManager.loadModel("Models/gltf/zophrac/scene.gltf"); + + File storageFolder = JmeSystem.getStorageFolder(); + file = new File(storageFolder.getPath() + File.separator + "zophrac.j3o"); + BinaryExporter be = new BinaryExporter(); + try { + be.save(model, file); + } catch (IOException e) { + e.printStackTrace(); + } + + assetManager.registerLocator(storageFolder.getPath(), FileLocator.class); + Spatial model2 = assetManager.loadModel("zophrac.j3o"); + model2.setLocalScale(0.1f); + probeNode.attachChild(model2); + + debugAppState = new ArmatureDebugAppState(); + stateManager.attach(debugAppState); + + setupModel(model2); + + flyCam.setEnabled(false); + + Node target = new Node("CamTarget"); + //target.setLocalTransform(model.getLocalTransform()); + target.move(0, 0, 0); + ChaseCameraAppState chaseCam = new ChaseCameraAppState(); + chaseCam.setTarget(target); + getStateManager().attach(chaseCam); + chaseCam.setInvertHorizontalAxis(true); + chaseCam.setInvertVerticalAxis(true); + chaseCam.setZoomSpeed(0.5f); + chaseCam.setMinVerticalRotation(-FastMath.HALF_PI); + chaseCam.setRotationSpeed(3); + chaseCam.setDefaultDistance(3); + chaseCam.setMinDistance(0.01f); + chaseCam.setZoomSpeed(0.01f); + chaseCam.setDefaultVerticalRotation(0.3f); + + initInputs(); + } + + public void initInputs() { + inputManager.addMapping("toggleAnim", new KeyTrigger(KeyInput.KEY_RETURN)); + + inputManager.addListener(new ActionListener() { + @Override + public void onAction(String name, boolean isPressed, float tpf) { + if (isPressed) { + playAnim = !playAnim; + if (playAnim) { + String anim = anims.poll(); + anims.add(anim); + composer.setCurrentAction(anim); + System.err.println(anim); + } else { + composer.reset(); + } + } + } + }, "toggleAnim"); + inputManager.addMapping("nextAnim", new KeyTrigger(KeyInput.KEY_RIGHT)); + inputManager.addListener(new ActionListener() { + @Override + public void onAction(String name, boolean isPressed, float tpf) { + if (isPressed && composer != null) { + String anim = anims.poll(); + anims.add(anim); + composer.setCurrentAction(anim); + System.err.println(anim); + } + } + }, "nextAnim"); + } + + private void setupModel(Spatial model) { + if (composer != null) { + return; + } + composer = model.getControl(AnimComposer.class); + if (composer != null) { +// model.getControl(SkinningControl.class).setEnabled(false); +// model.getControl(MorphControl.class).setEnabled(false); +// composer.setEnabled(false); + + + SkinningControl sc = model.getControl(SkinningControl.class); + debugAppState.addArmatureFrom(sc); + + anims.clear(); + for (String name : composer.getAnimClipsNames()) { + anims.add(name); + } + if (anims.isEmpty()) { + return; + } + if (playAnim) { + String anim = anims.poll(); + anims.add(anim); + composer.setCurrentAction(anim); + System.err.println(anim); + } + + } else { + if (model instanceof Node) { + Node n = (Node) model; + for (Spatial child : n.getChildren()) { + setupModel(child); + } + } + } + + } + + + @Override + public void destroy() { + super.destroy(); + file.delete(); + } +} diff --git a/jme3-examples/src/main/java/jme3test/model/anim/TestAnimSerialization.java b/jme3-examples/src/main/java/jme3test/model/anim/TestAnimSerialization.java new file mode 100644 index 000000000..1d3551df2 --- /dev/null +++ b/jme3-examples/src/main/java/jme3test/model/anim/TestAnimSerialization.java @@ -0,0 +1,168 @@ +package jme3test.model.anim; + +import com.jme3.anim.AnimComposer; +import com.jme3.anim.SkinningControl; +import com.jme3.anim.util.AnimMigrationUtils; +import com.jme3.app.ChaseCameraAppState; +import com.jme3.app.SimpleApplication; +import com.jme3.asset.plugins.FileLocator; +import com.jme3.export.binary.BinaryExporter; +import com.jme3.input.KeyInput; +import com.jme3.input.controls.ActionListener; +import com.jme3.input.controls.KeyTrigger; +import com.jme3.light.AmbientLight; +import com.jme3.light.DirectionalLight; +import com.jme3.math.*; +import com.jme3.scene.Node; +import com.jme3.scene.Spatial; +import com.jme3.scene.debug.custom.ArmatureDebugAppState; +import com.jme3.system.JmeSystem; + +import java.io.File; +import java.io.IOException; +import java.util.LinkedList; +import java.util.Queue; + +/** + * Created by Nehon on 18/12/2017. + */ +public class TestAnimSerialization extends SimpleApplication { + + ArmatureDebugAppState debugAppState; + AnimComposer composer; + Queue anims = new LinkedList<>(); + boolean playAnim = true; + File file; + + public static void main(String... argv) { + TestAnimSerialization app = new TestAnimSerialization(); + app.start(); + } + + @Override + public void simpleInitApp() { + setTimer(new EraseTimer()); + //cam.setFrustumPerspective(90f, (float) cam.getWidth() / cam.getHeight(), 0.01f, 10f); + viewPort.setBackgroundColor(ColorRGBA.DarkGray); + rootNode.addLight(new DirectionalLight(new Vector3f(-1, -1, -1).normalizeLocal())); + rootNode.addLight(new AmbientLight(ColorRGBA.DarkGray)); + + Spatial model = assetManager.loadModel("Models/Jaime/Jaime.j3o"); + + AnimMigrationUtils.migrate(model); + + File storageFolder = JmeSystem.getStorageFolder(); + file = new File(storageFolder.getPath() + File.separator + "newJaime.j3o"); + BinaryExporter be = new BinaryExporter(); + try { + be.save(model, file); + } catch (IOException e) { + e.printStackTrace(); + } + + assetManager.registerLocator(storageFolder.getPath(), FileLocator.class); + model = assetManager.loadModel("newJaime.j3o"); + + rootNode.attachChild(model); + + debugAppState = new ArmatureDebugAppState(); + stateManager.attach(debugAppState); + + setupModel(model); + + flyCam.setEnabled(false); + + Node target = new Node("CamTarget"); + //target.setLocalTransform(model.getLocalTransform()); + target.move(0, 1, 0); + ChaseCameraAppState chaseCam = new ChaseCameraAppState(); + chaseCam.setTarget(target); + getStateManager().attach(chaseCam); + chaseCam.setInvertHorizontalAxis(true); + chaseCam.setInvertVerticalAxis(true); + chaseCam.setZoomSpeed(0.5f); + chaseCam.setMinVerticalRotation(-FastMath.HALF_PI); + chaseCam.setRotationSpeed(3); + chaseCam.setDefaultDistance(3); + chaseCam.setMinDistance(0.01f); + chaseCam.setZoomSpeed(0.01f); + chaseCam.setDefaultVerticalRotation(0.3f); + + initInputs(); + } + + public void initInputs() { + inputManager.addMapping("toggleAnim", new KeyTrigger(KeyInput.KEY_RETURN)); + + inputManager.addListener(new ActionListener() { + @Override + public void onAction(String name, boolean isPressed, float tpf) { + if (isPressed) { + playAnim = !playAnim; + if (playAnim) { + String anim = anims.poll(); + anims.add(anim); + composer.setCurrentAction(anim); + System.err.println(anim); + } else { + composer.reset(); + } + } + } + }, "toggleAnim"); + inputManager.addMapping("nextAnim", new KeyTrigger(KeyInput.KEY_RIGHT)); + inputManager.addListener(new ActionListener() { + @Override + public void onAction(String name, boolean isPressed, float tpf) { + if (isPressed && composer != null) { + String anim = anims.poll(); + anims.add(anim); + composer.setCurrentAction(anim); + System.err.println(anim); + } + } + }, "nextAnim"); + } + + private void setupModel(Spatial model) { + if (composer != null) { + return; + } + composer = model.getControl(AnimComposer.class); + if (composer != null) { + + SkinningControl sc = model.getControl(SkinningControl.class); + + debugAppState.addArmatureFrom(sc); + anims.clear(); + for (String name : composer.getAnimClipsNames()) { + anims.add(name); + } + if (anims.isEmpty()) { + return; + } + if (playAnim) { + String anim = anims.poll(); + anims.add(anim); + composer.setCurrentAction(anim); + System.err.println(anim); + } + + } else { + if (model instanceof Node) { + Node n = (Node) model; + for (Spatial child : n.getChildren()) { + setupModel(child); + } + } + } + + } + + + @Override + public void destroy() { + super.destroy(); + file.delete(); + } +} diff --git a/jme3-examples/src/main/java/jme3test/model/anim/TestAnimationFactory.java b/jme3-examples/src/main/java/jme3test/model/anim/TestAnimationFactory.java index 55768517c..dfd249711 100644 --- a/jme3-examples/src/main/java/jme3test/model/anim/TestAnimationFactory.java +++ b/jme3-examples/src/main/java/jme3test/model/anim/TestAnimationFactory.java @@ -52,14 +52,14 @@ public class TestAnimationFactory extends SimpleApplication { //creating a translation keyFrame at time = 3 with a translation on the x axis of 5 WU animationFactory.addTimeTranslation(3, new Vector3f(5, 0, 0)); - //reseting the translation to the start position at time = 6 + //resetting the translation to the start position at time = 6 animationFactory.addTimeTranslation(6, new Vector3f(0, 0, 0)); //Creating a scale keyFrame at time = 2 with the unit scale. animationFactory.addTimeScale(2, new Vector3f(1, 1, 1)); //Creating a scale keyFrame at time = 4 scaling to 1.5 animationFactory.addTimeScale(4, new Vector3f(1.5f, 1.5f, 1.5f)); - //reseting the scale to the start value at time = 5 + //resetting the scale to the start value at time = 5 animationFactory.addTimeScale(5, new Vector3f(1, 1, 1)); diff --git a/jme3-examples/src/main/java/jme3test/model/anim/TestArmature.java b/jme3-examples/src/main/java/jme3test/model/anim/TestArmature.java new file mode 100644 index 000000000..f7a839327 --- /dev/null +++ b/jme3-examples/src/main/java/jme3test/model/anim/TestArmature.java @@ -0,0 +1,217 @@ +package jme3test.model.anim; + +import com.jme3.anim.*; +import com.jme3.app.ChaseCameraAppState; +import com.jme3.app.SimpleApplication; +import com.jme3.input.KeyInput; +import com.jme3.input.controls.ActionListener; +import com.jme3.input.controls.KeyTrigger; +import com.jme3.material.Material; +import com.jme3.math.*; +import com.jme3.scene.*; +import com.jme3.scene.debug.custom.ArmatureDebugAppState; +import com.jme3.scene.shape.Cylinder; +import com.jme3.util.TangentBinormalGenerator; + +import java.nio.FloatBuffer; +import java.nio.ShortBuffer; + +/** + * Created by Nehon on 18/12/2017. + */ +public class TestArmature extends SimpleApplication { + + Joint j1; + Joint j2; + + public static void main(String... argv) { + TestArmature app = new TestArmature(); + app.start(); + } + + @Override + public void simpleInitApp() { + setTimer(new EraseTimer()); + renderManager.setSinglePassLightBatchSize(2); + //cam.setFrustumPerspective(90f, (float) cam.getWidth() / cam.getHeight(), 0.01f, 10f); + viewPort.setBackgroundColor(ColorRGBA.DarkGray); + + //create armature + Joint root = new Joint("Root_Joint"); + j1 = new Joint("Joint_1"); + j2 = new Joint("Joint_2"); + Joint j3 = new Joint("Joint_3"); + root.addChild(j1); + j1.addChild(j2); + j2.addChild(j3); + root.setLocalTranslation(new Vector3f(0, 0, 0.5f)); + j1.setLocalTranslation(new Vector3f(0, 0.0f, -0.5f)); + j2.setLocalTranslation(new Vector3f(0, 0.0f, -0.3f)); + j3.setLocalTranslation(new Vector3f(0, 0, -0.2f)); + Joint[] joints = new Joint[]{root, j1, j2, j3}; + + final Armature armature = new Armature(joints); + //armature.setModelTransformClass(SeparateJointModelTransform.class); + armature.saveBindPose(); + + //create animations + AnimClip clip = new AnimClip("anim"); + float[] times = new float[]{0, 2, 4}; + Quaternion[] rotations = new Quaternion[]{ + new Quaternion().fromAngleAxis(-FastMath.HALF_PI, Vector3f.UNIT_X), + new Quaternion().fromAngleAxis(FastMath.HALF_PI, Vector3f.UNIT_X), + new Quaternion().fromAngleAxis(-FastMath.HALF_PI, Vector3f.UNIT_X) + }; + Vector3f[] translations = new Vector3f[]{ + new Vector3f(0, 0.2f, 0), + new Vector3f(0, 1.0f, 0), + new Vector3f(0, 0.2f, 0), + }; + Vector3f[] scales = new Vector3f[]{ + new Vector3f(1, 1, 1), + new Vector3f(1, 1, 2), + new Vector3f(1, 1, 1), + }; + Vector3f[] scales2 = new Vector3f[]{ + new Vector3f(1, 1, 1), + new Vector3f(1, 1, 0.5f), + new Vector3f(1, 1, 1), + }; + + TransformTrack track1 = new TransformTrack(j1, times, null, rotations, scales); + TransformTrack track2 = new TransformTrack(j2, times, null, rotations, null); + + clip.setTracks(new TransformTrack[]{track1, track2}); + + //create the animComposer control + final AnimComposer composer = new AnimComposer(); + composer.addAnimClip(clip); + + //create the SkinningControl + SkinningControl ac = new SkinningControl(armature); + ac.setHardwareSkinningPreferred(false); + Node node = new Node("Test Armature"); + + rootNode.attachChild(node); + + //Create the mesh to deform. + Geometry cylinder = new Geometry("cylinder", createMesh()); + Material m = new Material(assetManager, "Common/MatDefs/Misc/fakeLighting.j3md"); + m.setColor("Color", ColorRGBA.randomColor()); + cylinder.setMaterial(m); + node.attachChild(cylinder); + node.addControl(composer); + node.addControl(ac); + + composer.setCurrentAction("anim"); + + ArmatureDebugAppState debugAppState = new ArmatureDebugAppState(); + debugAppState.addArmatureFrom(ac); + stateManager.attach(debugAppState); + + flyCam.setEnabled(false); + + ChaseCameraAppState chaseCam = new ChaseCameraAppState(); + chaseCam.setTarget(node); + getStateManager().attach(chaseCam); + chaseCam.setInvertHorizontalAxis(true); + chaseCam.setInvertVerticalAxis(true); + chaseCam.setZoomSpeed(0.5f); + chaseCam.setMinVerticalRotation(-FastMath.HALF_PI); + chaseCam.setRotationSpeed(3); + chaseCam.setDefaultDistance(3); + chaseCam.setMinDistance(0.01f); + chaseCam.setZoomSpeed(0.01f); + chaseCam.setDefaultVerticalRotation(0.3f); + + + inputManager.addMapping("bind", new KeyTrigger(KeyInput.KEY_SPACE)); + inputManager.addListener(new ActionListener() { + @Override + public void onAction(String name, boolean isPressed, float tpf) { + if (isPressed) { + composer.reset(); + armature.applyBindPose(); + + } else { + composer.setCurrentAction("anim"); + } + } + }, "bind"); + } + + + private void displayNormals(Spatial s) { + final Node debugTangents = new Node("debug tangents"); + debugTangents.setCullHint(Spatial.CullHint.Never); + + rootNode.attachChild(debugTangents); + + final Material debugMat = assetManager.loadMaterial("Common/Materials/VertexColor.j3m"); + debugMat.getAdditionalRenderState().setLineWidth(2); + + s.depthFirstTraversal(new SceneGraphVisitorAdapter() { + @Override + public void visit(Geometry g) { + Mesh m = g.getMesh(); + Geometry debug = new Geometry( + "debug tangents geom", + TangentBinormalGenerator.genNormalLines(m, 0.1f) + ); + debug.setMaterial(debugMat); + debug.setCullHint(Spatial.CullHint.Never); + debug.setLocalTransform(g.getWorldTransform()); + debugTangents.attachChild(debug); + } + }); + } + + private Mesh createMesh() { + Cylinder c = new Cylinder(30, 16, 0.1f, 1, true); + + ShortBuffer jointIndex = (ShortBuffer) VertexBuffer.createBuffer(VertexBuffer.Format.UnsignedShort, 4, c.getVertexCount()); + jointIndex.rewind(); + c.setMaxNumWeights(1); + FloatBuffer jointWeight = (FloatBuffer) VertexBuffer.createBuffer(VertexBuffer.Format.Float, 4, c.getVertexCount()); + jointWeight.rewind(); + VertexBuffer vb = c.getBuffer(VertexBuffer.Type.Position); + FloatBuffer fvb = (FloatBuffer) vb.getData(); + fvb.rewind(); + for (int i = 0; i < c.getVertexCount(); i++) { + fvb.get(); + fvb.get(); + float z = fvb.get(); + int index = 0; + if (z > 0) { + index = 0; + } else if (z > -0.2) { + index = 1; + } else { + index = 2; + } + jointIndex.put((short) index).put((short) 0).put((short) 0).put((short) 0); + jointWeight.put(1f).put(0f).put(0f).put(0f); + + } + c.setBuffer(VertexBuffer.Type.BoneIndex, 4, jointIndex); + c.setBuffer(VertexBuffer.Type.BoneWeight, 4, jointWeight); + + c.updateCounts(); + c.updateBound(); + + VertexBuffer weightsHW = new VertexBuffer(VertexBuffer.Type.HWBoneWeight); + VertexBuffer indicesHW = new VertexBuffer(VertexBuffer.Type.HWBoneIndex); + + indicesHW.setUsage(VertexBuffer.Usage.CpuOnly); + weightsHW.setUsage(VertexBuffer.Usage.CpuOnly); + c.setBuffer(weightsHW); + c.setBuffer(indicesHW); + c.generateBindPose(); + + c.prepareForAnim(false); + + return c; + } + + +} diff --git a/jme3-examples/src/main/java/jme3test/model/anim/TestAttachmentsNode.java b/jme3-examples/src/main/java/jme3test/model/anim/TestAttachmentsNode.java index ab592d05e..89e60559d 100644 --- a/jme3-examples/src/main/java/jme3test/model/anim/TestAttachmentsNode.java +++ b/jme3-examples/src/main/java/jme3test/model/anim/TestAttachmentsNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2017 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -51,7 +51,7 @@ import com.jme3.scene.Spatial; import com.jme3.scene.shape.Box; /** - * Simple application to an test attachments node on the Jaime model. + * Simple application to test an attachments node on the Jaime model. * * Derived from {@link jme3test.model.anim.TestOgreAnim}. */ diff --git a/jme3-examples/src/main/java/jme3test/model/anim/TestBaseAnimSerialization.java b/jme3-examples/src/main/java/jme3test/model/anim/TestBaseAnimSerialization.java new file mode 100644 index 000000000..24d8b21e5 --- /dev/null +++ b/jme3-examples/src/main/java/jme3test/model/anim/TestBaseAnimSerialization.java @@ -0,0 +1,217 @@ +package jme3test.model.anim; + +import com.jme3.anim.*; +import com.jme3.app.ChaseCameraAppState; +import com.jme3.app.SimpleApplication; +import com.jme3.asset.plugins.FileLocator; +import com.jme3.export.binary.BinaryExporter; +import com.jme3.input.KeyInput; +import com.jme3.input.controls.ActionListener; +import com.jme3.input.controls.KeyTrigger; +import com.jme3.material.Material; +import com.jme3.math.*; +import com.jme3.scene.*; +import com.jme3.scene.debug.custom.ArmatureDebugAppState; +import com.jme3.scene.shape.Cylinder; +import com.jme3.system.JmeSystem; + +import java.io.File; +import java.io.IOException; +import java.nio.FloatBuffer; +import java.nio.ShortBuffer; + +/** + * Created by Nehon on 18/12/2017. + */ +public class TestBaseAnimSerialization extends SimpleApplication { + + Joint j1; + Joint j2; + AnimComposer composer; + Armature armature; + File file; + + public static void main(String... argv) { + TestBaseAnimSerialization app = new TestBaseAnimSerialization(); + app.start(); + } + + @Override + public void simpleInitApp() { + setTimer(new EraseTimer()); + renderManager.setSinglePassLightBatchSize(2); + //cam.setFrustumPerspective(90f, (float) cam.getWidth() / cam.getHeight(), 0.01f, 10f); + viewPort.setBackgroundColor(ColorRGBA.DarkGray); + + //create armature + Joint root = new Joint("Root_Joint"); + j1 = new Joint("Joint_1"); + j2 = new Joint("Joint_2"); + Joint j3 = new Joint("Joint_3"); + root.addChild(j1); + j1.addChild(j2); + j2.addChild(j3); + root.setLocalTranslation(new Vector3f(0, 0, 0.5f)); + j1.setLocalTranslation(new Vector3f(0, 0.0f, -0.5f)); + j2.setLocalTranslation(new Vector3f(0, 0.0f, -0.3f)); + j3.setLocalTranslation(new Vector3f(0, 0, -0.2f)); + Joint[] joints = new Joint[]{root, j1, j2, j3}; + + armature = new Armature(joints); + //armature.setModelTransformClass(SeparateJointModelTransform.class); + armature.saveBindPose(); + + //create animations + AnimClip clip = new AnimClip("anim"); + float[] times = new float[]{0, 2, 4}; + Quaternion[] rotations = new Quaternion[]{ + new Quaternion().fromAngleAxis(-FastMath.HALF_PI, Vector3f.UNIT_X), + new Quaternion().fromAngleAxis(FastMath.HALF_PI, Vector3f.UNIT_X), + new Quaternion().fromAngleAxis(-FastMath.HALF_PI, Vector3f.UNIT_X) + }; + Vector3f[] translations = new Vector3f[]{ + new Vector3f(0, 0.2f, 0), + new Vector3f(0, 1.0f, 0), + new Vector3f(0, 0.2f, 0), + }; + Vector3f[] scales = new Vector3f[]{ + new Vector3f(1, 1, 1), + new Vector3f(1, 1, 2), + new Vector3f(1, 1, 1), + }; + Vector3f[] scales2 = new Vector3f[]{ + new Vector3f(1, 1, 1), + new Vector3f(1, 1, 0.5f), + new Vector3f(1, 1, 1), + }; + + TransformTrack track1 = new TransformTrack(j1, times, null, rotations, scales); + TransformTrack track2 = new TransformTrack(j2, times, null, rotations, null); + + clip.setTracks(new TransformTrack[]{track1, track2}); + + //create the animComposer control + composer = new AnimComposer(); + composer.addAnimClip(clip); + + //create the SkinningControl + SkinningControl ac = new SkinningControl(armature); + Node node = new Node("Test Armature"); + + //Create the mesh to deform. + Geometry cylinder = new Geometry("cylinder", createMesh()); + Material m = new Material(assetManager, "Common/MatDefs/Misc/fakeLighting.j3md"); + m.setColor("Color", ColorRGBA.randomColor()); + cylinder.setMaterial(m); + node.attachChild(cylinder); + node.addControl(composer); + node.addControl(ac); + + File storageFolder = JmeSystem.getStorageFolder(); + file = new File(storageFolder.getPath() + File.separator + "test.j3o"); + BinaryExporter be = new BinaryExporter(); + try { + be.save(node, file); + } catch (IOException e) { + e.printStackTrace(); + } + + assetManager.registerLocator(storageFolder.getPath(), FileLocator.class); + Node newNode = (Node) assetManager.loadModel("test.j3o"); + + rootNode.attachChild(newNode); + + composer = newNode.getControl(AnimComposer.class); + ac = newNode.getControl(SkinningControl.class); + ac.setHardwareSkinningPreferred(false); + armature = ac.getArmature(); + composer.setCurrentAction("anim"); + + ArmatureDebugAppState debugAppState = new ArmatureDebugAppState(); + debugAppState.addArmatureFrom(ac); + stateManager.attach(debugAppState); + + flyCam.setEnabled(false); + + ChaseCameraAppState chaseCam = new ChaseCameraAppState(); + chaseCam.setTarget(node); + getStateManager().attach(chaseCam); + chaseCam.setInvertHorizontalAxis(true); + chaseCam.setInvertVerticalAxis(true); + chaseCam.setZoomSpeed(0.5f); + chaseCam.setMinVerticalRotation(-FastMath.HALF_PI); + chaseCam.setRotationSpeed(3); + chaseCam.setDefaultDistance(3); + chaseCam.setMinDistance(0.01f); + chaseCam.setZoomSpeed(0.01f); + chaseCam.setDefaultVerticalRotation(0.3f); + + + inputManager.addMapping("bind", new KeyTrigger(KeyInput.KEY_SPACE)); + inputManager.addListener(new ActionListener() { + @Override + public void onAction(String name, boolean isPressed, float tpf) { + if (isPressed) { + composer.reset(); + armature.applyBindPose(); + + } else { + composer.setCurrentAction("anim"); + } + } + }, "bind"); + } + + private Mesh createMesh() { + Cylinder c = new Cylinder(30, 16, 0.1f, 1, true); + + ShortBuffer jointIndex = (ShortBuffer) VertexBuffer.createBuffer(VertexBuffer.Format.UnsignedShort, 4, c.getVertexCount()); + jointIndex.rewind(); + c.setMaxNumWeights(1); + FloatBuffer jointWeight = (FloatBuffer) VertexBuffer.createBuffer(VertexBuffer.Format.Float, 4, c.getVertexCount()); + jointWeight.rewind(); + VertexBuffer vb = c.getBuffer(VertexBuffer.Type.Position); + FloatBuffer fvb = (FloatBuffer) vb.getData(); + fvb.rewind(); + for (int i = 0; i < c.getVertexCount(); i++) { + fvb.get(); + fvb.get(); + float z = fvb.get(); + int index = 0; + if (z > 0) { + index = 0; + } else if (z > -0.2) { + index = 1; + } else { + index = 2; + } + jointIndex.put((short) index).put((short) 0).put((short) 0).put((short) 0); + jointWeight.put(1f).put(0f).put(0f).put(0f); + + } + c.setBuffer(VertexBuffer.Type.BoneIndex, 4, jointIndex); + c.setBuffer(VertexBuffer.Type.BoneWeight, 4, jointWeight); + + c.updateCounts(); + c.updateBound(); + + VertexBuffer weightsHW = new VertexBuffer(VertexBuffer.Type.HWBoneWeight); + VertexBuffer indicesHW = new VertexBuffer(VertexBuffer.Type.HWBoneIndex); + + indicesHW.setUsage(VertexBuffer.Usage.CpuOnly); + weightsHW.setUsage(VertexBuffer.Usage.CpuOnly); + c.setBuffer(weightsHW); + c.setBuffer(indicesHW); + c.generateBindPose(); + + c.prepareForAnim(false); + + return c; + } + + @Override + public void destroy() { + super.destroy(); + file.delete(); + } +} diff --git a/jme3-examples/src/main/java/jme3test/model/anim/TestBlenderObjectAnim.java b/jme3-examples/src/main/java/jme3test/model/anim/TestBlenderObjectAnim.java index f7171f2bd..68855176a 100644 --- a/jme3-examples/src/main/java/jme3test/model/anim/TestBlenderObjectAnim.java +++ b/jme3-examples/src/main/java/jme3test/model/anim/TestBlenderObjectAnim.java @@ -69,13 +69,13 @@ public class TestBlenderObjectAnim extends SimpleApplication { Spatial scene = (Spatial) assetManager.loadModel(blenderKey); rootNode.attachChild(scene); - Spatial model = this.findNode(rootNode, "TestAnim"); + Spatial model = this.findNode(rootNode, "Cube"); model.center(); control = model.getControl(AnimControl.class); channel = control.createChannel(); - channel.setAnim("TestAnim"); + channel.setAnim("Action"); } /** diff --git a/jme3-examples/src/main/java/jme3test/model/anim/TestCustomAnim.java b/jme3-examples/src/main/java/jme3test/model/anim/TestCustomAnim.java index b5eeb5365..93403587a 100644 --- a/jme3-examples/src/main/java/jme3test/model/anim/TestCustomAnim.java +++ b/jme3-examples/src/main/java/jme3test/model/anim/TestCustomAnim.java @@ -93,7 +93,7 @@ public class TestCustomAnim extends SimpleApplication { box.setBuffer(indicesBuf); // Create bind pose buffers - box.generateBindPose(true); + box.generateBindPose(); // Create skeleton bone = new Bone("root"); diff --git a/jme3-examples/src/main/java/jme3test/model/anim/TestHWSkinning.java b/jme3-examples/src/main/java/jme3test/model/anim/TestHWSkinning.java index 9a2e78804..475075267 100644 --- a/jme3-examples/src/main/java/jme3test/model/anim/TestHWSkinning.java +++ b/jme3-examples/src/main/java/jme3test/model/anim/TestHWSkinning.java @@ -31,28 +31,30 @@ */ package jme3test.model.anim; -import com.jme3.animation.*; +import com.jme3.anim.AnimComposer; +import com.jme3.anim.SkinningControl; +import com.jme3.app.DetailedProfilerState; import com.jme3.app.SimpleApplication; import com.jme3.font.BitmapText; import com.jme3.input.KeyInput; import com.jme3.input.controls.ActionListener; import com.jme3.input.controls.KeyTrigger; import com.jme3.light.DirectionalLight; -import com.jme3.math.ColorRGBA; -import com.jme3.math.Quaternion; -import com.jme3.math.Vector3f; +import com.jme3.math.*; +import com.jme3.scene.Node; import com.jme3.scene.Spatial; + import java.util.ArrayList; import java.util.List; public class TestHWSkinning extends SimpleApplication implements ActionListener{ - private AnimChannel channel; - private AnimControl control; + + // private AnimComposer composer; private String[] animNames = {"Dodge", "Walk", "pull", "push"}; - private final static int SIZE = 10; + private final static int SIZE = 40; private boolean hwSkinningEnable = true; - private List skControls = new ArrayList(); + private List skControls = new ArrayList<>(); private BitmapText hwsText; public static void main(String[] args) { @@ -63,8 +65,11 @@ public class TestHWSkinning extends SimpleApplication implements ActionListener{ @Override public void simpleInitApp() { flyCam.setMoveSpeed(10f); - cam.setLocation(new Vector3f(3.8664846f, 6.2704787f, 9.664585f)); - cam.setRotation(new Quaternion(-0.054774776f, 0.94064945f, -0.27974048f, -0.18418397f)); + flyCam.setDragToRotate(true); + setPauseOnLostFocus(false); + cam.setLocation(new Vector3f(38.76639f, 14.744472f, 45.097454f)); + cam.setRotation(new Quaternion(-0.06086266f, 0.92303723f, -0.1639443f, -0.34266636f)); + makeHudText(); DirectionalLight dl = new DirectionalLight(); @@ -72,31 +77,45 @@ public class TestHWSkinning extends SimpleApplication implements ActionListener{ dl.setColor(new ColorRGBA(1f, 1f, 1f, 1.0f)); rootNode.addLight(dl); + Spatial models[] = new Spatial[4]; + for (int i = 0; i < 4; i++) { + models[i] =loadModel(i); + } + for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { - Spatial model = (Spatial) assetManager.loadModel("Models/Oto/Oto.mesh.xml"); - model.setLocalScale(0.1f); - model.setLocalTranslation(i - SIZE / 2, 0, j - SIZE / 2); - control = model.getControl(AnimControl.class); - - channel = control.createChannel(); - channel.setAnim(animNames[(i + j) % 4]); - SkeletonControl skeletonControl = model.getControl(SkeletonControl.class); - skeletonControl.setHardwareSkinningPreferred(hwSkinningEnable); - skControls.add(skeletonControl); - rootNode.attachChild(model); + Node model = (Node)models[(i + j) % 4]; + Spatial s = model.getChild(0).clone(); + model.attachChild(s); + float x = (float)(i - SIZE / 2) / 0.1f; + float z = (float)(j - SIZE / 2) / 0.1f; + s.setLocalTranslation(x, 0, z); } } inputManager.addListener(this, "toggleHWS"); inputManager.addMapping("toggleHWS", new KeyTrigger(KeyInput.KEY_SPACE)); + + } + + private Spatial loadModel(int i) { + Spatial model = assetManager.loadModel("Models/Oto/Oto.mesh.xml"); + model.setLocalScale(0.1f); + AnimComposer composer = model.getControl(AnimComposer.class); + + composer.setCurrentAction(animNames[i]); + SkinningControl skinningControl = model.getControl(SkinningControl.class); + skinningControl.setHardwareSkinningPreferred(hwSkinningEnable); + skControls.add(skinningControl); + rootNode.attachChild(model); + return model; } @Override public void onAction(String name, boolean isPressed, float tpf) { if(isPressed && name.equals("toggleHWS")){ hwSkinningEnable = !hwSkinningEnable; - for (SkeletonControl control : skControls) { + for (SkinningControl control : skControls) { control.setHardwareSkinningPreferred(hwSkinningEnable); hwsText.setText("HWS : "+ hwSkinningEnable); } diff --git a/jme3-examples/src/main/java/jme3test/model/anim/TestHWSkinningOld.java b/jme3-examples/src/main/java/jme3test/model/anim/TestHWSkinningOld.java new file mode 100644 index 000000000..f0fa27d8f --- /dev/null +++ b/jme3-examples/src/main/java/jme3test/model/anim/TestHWSkinningOld.java @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2009-2012 jMonkeyEngine + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'jMonkeyEngine' nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package jme3test.model.anim; + +import com.jme3.animation.*; +import com.jme3.app.SimpleApplication; +import com.jme3.font.BitmapText; +import com.jme3.input.KeyInput; +import com.jme3.input.controls.ActionListener; +import com.jme3.input.controls.KeyTrigger; +import com.jme3.light.DirectionalLight; +import com.jme3.math.*; +import com.jme3.scene.Spatial; + +import java.util.ArrayList; +import java.util.List; + +public class TestHWSkinningOld extends SimpleApplication implements ActionListener { + + private AnimChannel channel; + private AnimControl control; + private String[] animNames = {"Dodge", "Walk", "pull", "push"}; + private final static int SIZE = 50; + private boolean hwSkinningEnable = true; + private List skControls = new ArrayList(); + private BitmapText hwsText; + + public static void main(String[] args) { + TestHWSkinningOld app = new TestHWSkinningOld(); + app.start(); + } + + @Override + public void simpleInitApp() { + flyCam.setMoveSpeed(10f); + flyCam.setDragToRotate(true); + setPauseOnLostFocus(false); + cam.setLocation(new Vector3f(24.746134f, 13.081396f, 32.72753f)); + cam.setRotation(new Quaternion(-0.06867662f, 0.92435044f, -0.19981281f, -0.31770203f)); + makeHudText(); + + DirectionalLight dl = new DirectionalLight(); + dl.setDirection(new Vector3f(-0.1f, -0.7f, -1).normalizeLocal()); + dl.setColor(new ColorRGBA(1f, 1f, 1f, 1.0f)); + rootNode.addLight(dl); + + for (int i = 0; i < SIZE; i++) { + for (int j = 0; j < SIZE; j++) { + Spatial model = (Spatial) assetManager.loadModel("Models/Oto/OtoOldAnim.j3o"); + model.setLocalScale(0.1f); + model.setLocalTranslation(i - SIZE / 2, 0, j - SIZE / 2); + control = model.getControl(AnimControl.class); + + channel = control.createChannel(); + channel.setAnim(animNames[(i + j) % 4]); + SkeletonControl skeletonControl = model.getControl(SkeletonControl.class); + skeletonControl.setHardwareSkinningPreferred(hwSkinningEnable); + skControls.add(skeletonControl); + rootNode.attachChild(model); + } + } + + inputManager.addListener(this, "toggleHWS"); + inputManager.addMapping("toggleHWS", new KeyTrigger(KeyInput.KEY_SPACE)); + } + + @Override + public void onAction(String name, boolean isPressed, float tpf) { + if (isPressed && name.equals("toggleHWS")) { + hwSkinningEnable = !hwSkinningEnable; + for (SkeletonControl control : skControls) { + control.setHardwareSkinningPreferred(hwSkinningEnable); + hwsText.setText("HWS : " + hwSkinningEnable); + } + } + } + + private void makeHudText() { + guiFont = assetManager.loadFont("Interface/Fonts/Default.fnt"); + hwsText = new BitmapText(guiFont, false); + hwsText.setSize(guiFont.getCharSet().getRenderedSize()); + hwsText.setText("HWS : " + hwSkinningEnable); + hwsText.setLocalTranslation(0, cam.getHeight(), 0); + guiNode.attachChild(hwsText); + } +} \ No newline at end of file diff --git a/jme3-examples/src/main/java/jme3test/model/anim/TestModelExportingCloning.java b/jme3-examples/src/main/java/jme3test/model/anim/TestModelExportingCloning.java index de162907d..63b5023d6 100644 --- a/jme3-examples/src/main/java/jme3test/model/anim/TestModelExportingCloning.java +++ b/jme3-examples/src/main/java/jme3test/model/anim/TestModelExportingCloning.java @@ -31,8 +31,7 @@ */ package jme3test.model.anim; -import com.jme3.animation.AnimChannel; -import com.jme3.animation.AnimControl; +import com.jme3.anim.AnimComposer; import com.jme3.app.SimpleApplication; import com.jme3.export.binary.BinaryExporter; import com.jme3.light.DirectionalLight; @@ -57,27 +56,23 @@ public class TestModelExportingCloning extends SimpleApplication { dl.setColor(new ColorRGBA(1f, 1f, 1f, 1.0f)); rootNode.addLight(dl); - AnimControl control; - AnimChannel channel; - + AnimComposer composer; + Spatial originalModel = assetManager.loadModel("Models/Oto/Oto.mesh.xml"); - control = originalModel.getControl(AnimControl.class); - channel = control.createChannel(); - channel.setAnim("Walk"); + composer = originalModel.getControl(AnimComposer.class); + composer.setCurrentAction("Walk"); rootNode.attachChild(originalModel); Spatial clonedModel = originalModel.clone(); clonedModel.move(10, 0, 0); - control = clonedModel.getControl(AnimControl.class); - channel = control.createChannel(); - channel.setAnim("push"); + composer = clonedModel.getControl(AnimComposer.class); + composer.setCurrentAction("push"); rootNode.attachChild(clonedModel); Spatial exportedModel = BinaryExporter.saveAndLoad(assetManager, originalModel); exportedModel.move(20, 0, 0); - control = exportedModel.getControl(AnimControl.class); - channel = control.createChannel(); - channel.setAnim("pull"); + composer = exportedModel.getControl(AnimComposer.class); + composer.setCurrentAction("pull"); rootNode.attachChild(exportedModel); } } diff --git a/jme3-examples/src/main/java/jme3test/model/anim/TestMorph.java b/jme3-examples/src/main/java/jme3test/model/anim/TestMorph.java new file mode 100644 index 000000000..629046685 --- /dev/null +++ b/jme3-examples/src/main/java/jme3test/model/anim/TestMorph.java @@ -0,0 +1,122 @@ +package jme3test.model.anim; + +import com.jme3.anim.MorphControl; +import com.jme3.app.ChaseCameraAppState; +import com.jme3.app.SimpleApplication; +import com.jme3.input.KeyInput; +import com.jme3.input.controls.ActionListener; +import com.jme3.input.controls.AnalogListener; +import com.jme3.input.controls.KeyTrigger; +import com.jme3.material.Material; +import com.jme3.math.ColorRGBA; +import com.jme3.scene.Geometry; +import com.jme3.scene.Node; +import com.jme3.scene.VertexBuffer; +import com.jme3.scene.mesh.MorphTarget; +import com.jme3.scene.shape.Box; +import com.jme3.shader.VarType; +import com.jme3.util.BufferUtils; + +import java.nio.FloatBuffer; + +public class TestMorph extends SimpleApplication { + + float[] weights = new float[2]; + + public static void main(String... args) { + TestMorph app = new TestMorph(); + app.start(); + } + + @Override + public void simpleInitApp() { + final Box box = new Box(1, 1, 1); + FloatBuffer buffer = BufferUtils.createVector3Buffer(box.getVertexCount()); + + float[] d = new float[box.getVertexCount() * 3]; + for (int i = 0; i < d.length; i++) { + d[i] = 0; + } + + d[12] = 1f; + d[15] = 1f; + d[18] = 1f; + d[21] = 1f; + + buffer.put(d); + buffer.rewind(); + + MorphTarget target = new MorphTarget(); + target.setBuffer(VertexBuffer.Type.Position, buffer); + box.addMorphTarget(target); + + + buffer = BufferUtils.createVector3Buffer(box.getVertexCount()); + + for (int i = 0; i < d.length; i++) { + d[i] = 0; + } + + d[13] = 1f; + d[16] = 1f; + d[19] = 1f; + d[22] = 1f; + + buffer.put(d); + buffer.rewind(); + + final MorphTarget target2 = new MorphTarget(); + target2.setBuffer(VertexBuffer.Type.Position, buffer); + box.addMorphTarget(target2); + + final Geometry g = new Geometry("box", box); + Material m = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); + g.setMaterial(m); + m.setColor("Color", ColorRGBA.Red); + m.setInt("NumberOfMorphTargets", 2); + + rootNode.attachChild(g); + + g.setMorphState(weights); + g.addControl(new MorphControl()); + + ChaseCameraAppState chase = new ChaseCameraAppState(); + chase.setTarget(rootNode); + getStateManager().attach(chase); + flyCam.setEnabled(false); + + inputManager.addMapping("morphright", new KeyTrigger(KeyInput.KEY_I)); + inputManager.addMapping("morphleft", new KeyTrigger(KeyInput.KEY_Y)); + inputManager.addMapping("morphup", new KeyTrigger(KeyInput.KEY_U)); + inputManager.addMapping("morphdown", new KeyTrigger(KeyInput.KEY_J)); + inputManager.addMapping("change", new KeyTrigger(KeyInput.KEY_SPACE)); + inputManager.addListener(new AnalogListener() { + @Override + public void onAnalog(String name, float value, float tpf) { + if (name.equals("morphleft")) { + weights[0] -= tpf; + } + if (name.equals("morphright")) { + weights[0] += tpf; + } + if (name.equals("morphup")) { + weights[1] += tpf; + } + if (name.equals("morphdown")) { + weights[1] -= tpf; + } + g.setMorphState(weights); + + } + }, "morphup", "morphdown", "morphleft", "morphright"); + + inputManager.addListener(new ActionListener() { + @Override + public void onAction(String name, boolean isPressed, float tpf) { + if (name.equals("change") && isPressed) { + box.setBuffer(VertexBuffer.Type.MorphTarget0, 3, target2.getBuffer(VertexBuffer.Type.Position)); + } + } + }, "change"); + } +} diff --git a/jme3-examples/src/main/java/jme3test/model/anim/TestOgreAnim.java b/jme3-examples/src/main/java/jme3test/model/anim/TestOgreAnim.java index b6bd4cd63..a7616f7b5 100644 --- a/jme3-examples/src/main/java/jme3test/model/anim/TestOgreAnim.java +++ b/jme3-examples/src/main/java/jme3test/model/anim/TestOgreAnim.java @@ -38,15 +38,12 @@ import com.jme3.input.KeyInput; import com.jme3.input.controls.ActionListener; import com.jme3.input.controls.KeyTrigger; import com.jme3.light.DirectionalLight; -import com.jme3.math.ColorRGBA; -import com.jme3.math.Quaternion; -import com.jme3.math.Vector3f; -import com.jme3.scene.Geometry; -import com.jme3.scene.Node; -import com.jme3.scene.Spatial; +import com.jme3.math.*; +import com.jme3.scene.*; import com.jme3.scene.shape.Box; -public class TestOgreAnim extends SimpleApplication +//TODO rework this Test when the new animation system is done. +public class TestOgreAnim extends SimpleApplication implements AnimEventListener, ActionListener { private AnimChannel channel; @@ -69,7 +66,7 @@ public class TestOgreAnim extends SimpleApplication dl.setColor(new ColorRGBA(1f, 1f, 1f, 1.0f)); rootNode.addLight(dl); - Spatial model = (Spatial) assetManager.loadModel("Models/Oto/Oto.mesh.xml"); + Spatial model = (Spatial) assetManager.loadModel("Models/Oto/OtoOldAnim.j3o"); model.center(); control = model.getControl(AnimControl.class); @@ -102,7 +99,7 @@ public class TestOgreAnim extends SimpleApplication // geom.getMesh().createCollisionData(); } - + public void onAnimCycleDone(AnimControl control, AnimChannel channel, String animName) { if (animName.equals("Dodge")){ diff --git a/jme3-examples/src/main/java/jme3test/model/anim/TestOgreComplexAnim.java b/jme3-examples/src/main/java/jme3test/model/anim/TestOgreComplexAnim.java index fa1283540..e83fa7a6b 100644 --- a/jme3-examples/src/main/java/jme3test/model/anim/TestOgreComplexAnim.java +++ b/jme3-examples/src/main/java/jme3test/model/anim/TestOgreComplexAnim.java @@ -32,20 +32,15 @@ package jme3test.model.anim; -import com.jme3.animation.AnimChannel; -import com.jme3.animation.AnimControl; -import com.jme3.animation.Bone; -import com.jme3.animation.LoopMode; +import com.jme3.animation.*; import com.jme3.app.SimpleApplication; import com.jme3.light.DirectionalLight; import com.jme3.material.Material; -import com.jme3.math.ColorRGBA; -import com.jme3.math.FastMath; -import com.jme3.math.Quaternion; -import com.jme3.math.Vector3f; +import com.jme3.math.*; import com.jme3.scene.Node; import com.jme3.scene.debug.SkeletonDebugger; +//TODO rework this Test when the new animation system is done. public class TestOgreComplexAnim extends SimpleApplication { private AnimControl control; @@ -69,7 +64,7 @@ public class TestOgreComplexAnim extends SimpleApplication { dl.setColor(new ColorRGBA(1f, 1f, 1f, 1.0f)); rootNode.addLight(dl); - Node model = (Node) assetManager.loadModel("Models/Oto/Oto.mesh.xml"); + Node model = (Node) assetManager.loadModel("Models/Oto/OtoOldAnim.j3o"); control = model.getControl(AnimControl.class); @@ -118,8 +113,8 @@ public class TestOgreComplexAnim extends SimpleApplication { public void simpleUpdate(float tpf){ Bone b = control.getSkeleton().getBone("spinehigh"); Bone b2 = control.getSkeleton().getBone("uparm.left"); - - angle += tpf * rate; + + angle += tpf * rate; if (angle > FastMath.HALF_PI / 2f){ angle = FastMath.HALF_PI / 2f; rate = -1; @@ -133,11 +128,11 @@ public class TestOgreComplexAnim extends SimpleApplication { b.setUserControl(true); b.setUserTransforms(Vector3f.ZERO, q, Vector3f.UNIT_XYZ); - + b2.setUserControl(true); b2.setUserTransforms(Vector3f.ZERO, Quaternion.IDENTITY, new Vector3f(1+angle,1+ angle, 1+angle)); - - + + } } diff --git a/jme3-examples/src/main/java/jme3test/model/anim/TestSkeletonControlRefresh.java b/jme3-examples/src/main/java/jme3test/model/anim/TestSkeletonControlRefresh.java index d594f197f..bbc727af3 100644 --- a/jme3-examples/src/main/java/jme3test/model/anim/TestSkeletonControlRefresh.java +++ b/jme3-examples/src/main/java/jme3test/model/anim/TestSkeletonControlRefresh.java @@ -37,7 +37,6 @@ package jme3test.model.anim; */ - import com.jme3.animation.*; import com.jme3.app.SimpleApplication; import com.jme3.asset.TextureKey; @@ -47,11 +46,7 @@ import com.jme3.input.controls.ActionListener; import com.jme3.input.controls.KeyTrigger; import com.jme3.light.DirectionalLight; import com.jme3.material.Material; -import com.jme3.math.ColorRGBA; -import com.jme3.math.FastMath; -import com.jme3.math.Quaternion; -import com.jme3.math.Vector2f; -import com.jme3.math.Vector3f; +import com.jme3.math.*; import com.jme3.post.FilterPostProcessor; import com.jme3.post.ssao.SSAOFilter; import com.jme3.renderer.queue.RenderQueue; @@ -59,11 +54,11 @@ import com.jme3.scene.Geometry; import com.jme3.scene.Spatial; import com.jme3.scene.shape.Quad; import com.jme3.shadow.DirectionalLightShadowFilter; -import com.jme3.shadow.DirectionalLightShadowRenderer; + import java.util.ArrayList; import java.util.List; -import jme3test.post.SSAOUI; - + +//TODO rework this Test when the new animation system is done. public class TestSkeletonControlRefresh extends SimpleApplication implements ActionListener{ private AnimChannel channel; @@ -97,7 +92,7 @@ public class TestSkeletonControlRefresh extends SimpleApplication implements Act for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { - Spatial model = (Spatial) assetManager.loadModel("Models/Oto/Oto.mesh.xml"); + Spatial model = (Spatial) assetManager.loadModel("Models/Oto/OtoOldAnim.j3o"); //setting a different material model.setMaterial(m.clone()); model.setLocalScale(0.1f); diff --git a/jme3-examples/src/main/java/jme3test/network/MovingAverage.java b/jme3-examples/src/main/java/jme3test/network/MovingAverage.java index ef7a5e7cb..991b5e5f6 100644 --- a/jme3-examples/src/main/java/jme3test/network/MovingAverage.java +++ b/jme3-examples/src/main/java/jme3test/network/MovingAverage.java @@ -32,8 +32,7 @@ package jme3test.network; -@Deprecated -public class MovingAverage { +class MovingAverage { private long[] samples; private long sum; diff --git a/jme3-examples/src/main/java/jme3test/network/TestLatency.java b/jme3-examples/src/main/java/jme3test/network/TestLatency.java index 6f49a003b..c47ae0556 100644 --- a/jme3-examples/src/main/java/jme3test/network/TestLatency.java +++ b/jme3-examples/src/main/java/jme3test/network/TestLatency.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -85,7 +85,7 @@ public class TestLatency { long curTime = getTime(); //System.out.println("Time sent: " + timeMsg.timeSent); //System.out.println("Time received by server: " + timeMsg.timeReceived); - //System.out.println("Time recieved by client: " + curTime); + //System.out.println("Time received by client: " + curTime); long latency = (curTime - timeMsg.timeSent); System.out.println("Latency: " + (latency) + " ms"); diff --git a/jme3-examples/src/main/java/jme3test/post/TestBloom.java b/jme3-examples/src/main/java/jme3test/post/TestBloom.java index 1a394bf36..9572568ea 100644 --- a/jme3-examples/src/main/java/jme3test/post/TestBloom.java +++ b/jme3-examples/src/main/java/jme3test/post/TestBloom.java @@ -49,6 +49,7 @@ import com.jme3.scene.Spatial; import com.jme3.scene.debug.WireFrustum; import com.jme3.scene.shape.Box; import com.jme3.util.SkyFactory; +import com.jme3.util.SkyFactory.EnvMapType; public class TestBloom extends SimpleApplication { @@ -114,7 +115,9 @@ public class TestBloom extends SimpleApplication { rootNode.addLight(light); // load sky - Spatial sky = SkyFactory.createSky(assetManager, "Textures/Sky/Bright/FullskiesBlueClear03.dds", false); + Spatial sky = SkyFactory.createSky(assetManager, + "Textures/Sky/Bright/FullskiesBlueClear03.dds", + EnvMapType.CubeMap); sky.setCullHint(Spatial.CullHint.Never); rootNode.attachChild(sky); diff --git a/jme3-examples/src/main/java/jme3test/post/TestBloomAlphaThreshold.java b/jme3-examples/src/main/java/jme3test/post/TestBloomAlphaThreshold.java index 0514aced5..b9f136726 100644 --- a/jme3-examples/src/main/java/jme3test/post/TestBloomAlphaThreshold.java +++ b/jme3-examples/src/main/java/jme3test/post/TestBloomAlphaThreshold.java @@ -51,6 +51,7 @@ import com.jme3.scene.Spatial; import com.jme3.scene.debug.WireFrustum; import com.jme3.scene.shape.Box; import com.jme3.util.SkyFactory; +import com.jme3.util.SkyFactory.EnvMapType; public class TestBloomAlphaThreshold extends SimpleApplication { @@ -101,7 +102,10 @@ public class TestBloomAlphaThreshold extends SimpleApplication teapot.setLocalScale(10.0f); rootNode.attachChild(teapot); - Geometry soil = new Geometry("soil", new Box(new Vector3f(0, -13, 550), 800, 10, 700)); + Vector3f boxMin1 = new Vector3f(-800f, -23f, -150f); + Vector3f boxMax1 = new Vector3f(800f, 3f, 1250f); + Box boxMesh1 = new Box(boxMin1, boxMax1); + Geometry soil = new Geometry("soil", boxMesh1); soil.setMaterial(matSoil); soil.setShadowMode(ShadowMode.CastAndReceive); rootNode.attachChild(soil); @@ -110,7 +114,10 @@ public class TestBloomAlphaThreshold extends SimpleApplication matBox.setTexture("ColorMap", assetManager.loadTexture("Textures/ColoredTex/Monkey.png")); matBox.setFloat("AlphaDiscardThreshold", 0.5f); - Geometry box = new Geometry("box", new Box(new Vector3f(-3.5f, 10, -2), 2, 2, 2)); + Vector3f boxMin2 = new Vector3f(-5.5f, 8f, -4f); + Vector3f boxMax2 = new Vector3f(-1.5f, 12f, 0f); + Box boxMesh2 = new Box(boxMin2, boxMax2); + Geometry box = new Geometry("box", boxMesh2); box.setMaterial(matBox); box.setQueueBucket(RenderQueue.Bucket.Translucent); // box.setShadowMode(ShadowMode.CastAndReceive); @@ -122,7 +129,9 @@ public class TestBloomAlphaThreshold extends SimpleApplication rootNode.addLight(light); // load sky - Spatial sky = SkyFactory.createSky(assetManager, "Textures/Sky/Bright/FullskiesBlueClear03.dds", false); + Spatial sky = SkyFactory.createSky(assetManager, + "Textures/Sky/Bright/FullskiesBlueClear03.dds", + EnvMapType.CubeMap); sky.setCullHint(Spatial.CullHint.Never); rootNode.attachChild(sky); diff --git a/jme3-examples/src/main/java/jme3test/post/TestCrossHatch.java b/jme3-examples/src/main/java/jme3test/post/TestCrossHatch.java index ff3ef081c..5cc3669ae 100644 --- a/jme3-examples/src/main/java/jme3test/post/TestCrossHatch.java +++ b/jme3-examples/src/main/java/jme3test/post/TestCrossHatch.java @@ -49,6 +49,7 @@ import com.jme3.scene.Spatial; import com.jme3.scene.debug.WireFrustum; import com.jme3.scene.shape.Box; import com.jme3.util.SkyFactory; +import com.jme3.util.SkyFactory.EnvMapType; public class TestCrossHatch extends SimpleApplication { @@ -114,7 +115,9 @@ public class TestCrossHatch extends SimpleApplication { rootNode.addLight(light); // load sky - Spatial sky = SkyFactory.createSky(assetManager, "Textures/Sky/Bright/FullskiesBlueClear03.dds", false); + Spatial sky = SkyFactory.createSky(assetManager, + "Textures/Sky/Bright/FullskiesBlueClear03.dds", + EnvMapType.CubeMap); sky.setCullHint(Spatial.CullHint.Never); rootNode.attachChild(sky); diff --git a/jme3-examples/src/main/java/jme3test/post/TestDepthOfField.java b/jme3-examples/src/main/java/jme3test/post/TestDepthOfField.java index 9966adc61..263d45ff3 100644 --- a/jme3-examples/src/main/java/jme3test/post/TestDepthOfField.java +++ b/jme3-examples/src/main/java/jme3test/post/TestDepthOfField.java @@ -21,6 +21,7 @@ import com.jme3.terrain.heightmap.ImageBasedHeightMap; import com.jme3.texture.Texture; import com.jme3.texture.Texture.WrapMode; import com.jme3.util.SkyFactory; +import com.jme3.util.SkyFactory.EnvMapType; import java.util.ArrayList; import java.util.List; @@ -65,7 +66,8 @@ public class TestDepthOfField extends SimpleApplication { cam.setRotation(new Quaternion().fromAngles(new float[]{FastMath.PI * 0.06f, FastMath.PI * 0.65f, 0})); - Spatial sky = SkyFactory.createSky(assetManager, "Scenes/Beach/FullskiesSunset0068.dds", false); + Spatial sky = SkyFactory.createSky(assetManager, + "Scenes/Beach/FullskiesSunset0068.dds", EnvMapType.CubeMap); sky.setLocalScale(350); mainScene.attachChild(sky); diff --git a/jme3-examples/src/main/java/jme3test/post/TestFog.java b/jme3-examples/src/main/java/jme3test/post/TestFog.java index 5cecc4bde..544932ab6 100644 --- a/jme3-examples/src/main/java/jme3test/post/TestFog.java +++ b/jme3-examples/src/main/java/jme3test/post/TestFog.java @@ -77,7 +77,9 @@ public class TestFog extends SimpleApplication { cam.setRotation(new Quaternion(0.023536969f, 0.9361278f, -0.016098259f, -0.35050195f)); // load sky - mainScene.attachChild(SkyFactory.createSky(assetManager, "Textures/Sky/Bright/BrightSky.dds", false)); + mainScene.attachChild(SkyFactory.createSky(assetManager, + "Textures/Sky/Bright/BrightSky.dds", + SkyFactory.EnvMapType.CubeMap)); createTerrain(mainScene); diff --git a/jme3-examples/src/main/java/jme3test/post/TestHDR.java b/jme3-examples/src/main/java/jme3test/post/TestHDR.java deleted file mode 100644 index 6cfcbdb7f..000000000 --- a/jme3-examples/src/main/java/jme3test/post/TestHDR.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright (c) 2009-2012 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package jme3test.post; - -import com.jme3.app.SimpleApplication; -import com.jme3.material.Material; -import com.jme3.math.Vector3f; -import com.jme3.post.HDRRenderer; -import com.jme3.scene.Geometry; -import com.jme3.scene.shape.Box; -import com.jme3.ui.Picture; - -public class TestHDR extends SimpleApplication { - - private HDRRenderer hdrRender; - private Picture dispQuad; - - public static void main(String[] args){ - TestHDR app = new TestHDR(); - app.start(); - } - - public Geometry createHDRBox(){ - Box boxMesh = new Box(1, 1, 1); - Geometry box = new Geometry("Box", boxMesh); - Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); - mat.setTexture("ColorMap", assetManager.loadTexture("Textures/HdrTest/Memorial.hdr")); - box.setMaterial(mat); - return box; - } - -// private Material disp; - - @Override - public void simpleInitApp() { - hdrRender = new HDRRenderer(assetManager, renderer); - hdrRender.setSamples(0); - hdrRender.setMaxIterations(20); - hdrRender.setExposure(0.87f); - hdrRender.setThrottle(0.33f); - viewPort.addProcessor(hdrRender); -// config.setVisible(true); - rootNode.attachChild(createHDRBox()); - } - - public void simpleUpdate(float tpf){ - if (hdrRender.isInitialized() && dispQuad == null){ - dispQuad = hdrRender.createDisplayQuad(); - dispQuad.setWidth(128); - dispQuad.setHeight(128); - dispQuad.setPosition(30, cam.getHeight() - 128 - 30); - guiNode.attachChild(dispQuad); - } - } - -// public void displayAvg(Renderer r){ -// r.setFrameBuffer(null); -// disp = prepare(-1, -1, settings.getWidth(), settings.getHeight(), 3, -1, scene64, disp); -// r.clearBuffers(true, true, true); -// r.renderGeometry(pic); -// } - -} diff --git a/jme3-examples/src/main/java/jme3test/post/TestLightScattering.java b/jme3-examples/src/main/java/jme3test/post/TestLightScattering.java index 2f12f3892..c2940cab6 100644 --- a/jme3-examples/src/main/java/jme3test/post/TestLightScattering.java +++ b/jme3-examples/src/main/java/jme3test/post/TestLightScattering.java @@ -44,7 +44,6 @@ import com.jme3.renderer.queue.RenderQueue.ShadowMode; import com.jme3.scene.Geometry; import com.jme3.scene.Node; import com.jme3.scene.Spatial; -import com.jme3.shadow.PssmShadowRenderer; import com.jme3.util.SkyFactory; import com.jme3.util.TangentBinormalGenerator; @@ -76,7 +75,9 @@ public class TestLightScattering extends SimpleApplication { rootNode.attachChild(scene); // load sky - rootNode.attachChild(SkyFactory.createSky(assetManager, "Textures/Sky/Bright/FullskiesBlueClear03.dds", false)); + rootNode.attachChild(SkyFactory.createSky(assetManager, + "Textures/Sky/Bright/FullskiesBlueClear03.dds", + SkyFactory.EnvMapType.CubeMap)); DirectionalLight sun = new DirectionalLight(); Vector3f lightDir = new Vector3f(-0.12f, -0.3729129f, 0.74847335f); diff --git a/jme3-examples/src/main/java/jme3test/post/TestMultiViewsFilters.java b/jme3-examples/src/main/java/jme3test/post/TestMultiViewsFilters.java index 477dd96c7..adbc036c7 100644 --- a/jme3-examples/src/main/java/jme3test/post/TestMultiViewsFilters.java +++ b/jme3-examples/src/main/java/jme3test/post/TestMultiViewsFilters.java @@ -126,7 +126,9 @@ public class TestMultiViewsFilters extends SimpleApplication { - rootNode.attachChild(SkyFactory.createSky(assetManager, "Textures/Sky/Bright/BrightSky.dds", false)); + rootNode.attachChild(SkyFactory.createSky(assetManager, + "Textures/Sky/Bright/BrightSky.dds", + SkyFactory.EnvMapType.CubeMap)); final FilterPostProcessor fpp = new FilterPostProcessor(assetManager); final FilterPostProcessor fpp2 = new FilterPostProcessor(assetManager); diff --git a/jme3-examples/src/main/java/jme3test/post/TestMultiplesFilters.java b/jme3-examples/src/main/java/jme3test/post/TestMultiplesFilters.java index 010651379..46efd639a 100644 --- a/jme3-examples/src/main/java/jme3test/post/TestMultiplesFilters.java +++ b/jme3-examples/src/main/java/jme3test/post/TestMultiplesFilters.java @@ -72,7 +72,9 @@ public class TestMultiplesFilters extends SimpleApplication { cam.setRotation(new Quaternion(0.0016069f, 0.9810479f, -0.008143323f, 0.19358753f)); // load sky - rootNode.attachChild(SkyFactory.createSky(assetManager, "Textures/Sky/Bright/BrightSky.dds", false)); + rootNode.attachChild(SkyFactory.createSky(assetManager, + "Textures/Sky/Bright/BrightSky.dds", + SkyFactory.EnvMapType.CubeMap)); // create the geometry and attach it // load the level from zip or http zip diff --git a/jme3-examples/src/main/java/jme3test/post/TestPostFilters.java b/jme3-examples/src/main/java/jme3test/post/TestPostFilters.java index c5fc0b9d8..c2ee5b04b 100644 --- a/jme3-examples/src/main/java/jme3test/post/TestPostFilters.java +++ b/jme3-examples/src/main/java/jme3test/post/TestPostFilters.java @@ -50,6 +50,7 @@ import com.jme3.system.AppSettings; import com.jme3.texture.Texture; import com.jme3.texture.Texture.WrapMode; import com.jme3.util.SkyFactory; +import com.jme3.util.SkyFactory.EnvMapType; import com.jme3.util.TangentBinormalGenerator; public class TestPostFilters extends SimpleApplication implements ActionListener { @@ -88,7 +89,9 @@ public class TestPostFilters extends SimpleApplication implements ActionListener } else { envMap = assetManager.loadTexture("Textures/Sky/St Peters/StPeters.jpg"); } - rootNode.attachChild(SkyFactory.createSky(assetManager, envMap, new Vector3f(-1, -1, -1), true)); + Spatial sky = SkyFactory.createSky(assetManager, envMap, + new Vector3f(-1f, -1f, -1f), EnvMapType.SphereMap); + rootNode.attachChild(sky); } public void setupLighting() { diff --git a/jme3-examples/src/main/java/jme3test/post/TestRenderToCubemap.java b/jme3-examples/src/main/java/jme3test/post/TestRenderToCubemap.java index e5aa79d55..b3473b7ec 100644 --- a/jme3-examples/src/main/java/jme3test/post/TestRenderToCubemap.java +++ b/jme3-examples/src/main/java/jme3test/post/TestRenderToCubemap.java @@ -41,12 +41,14 @@ import com.jme3.math.Vector3f; import com.jme3.renderer.Camera; import com.jme3.renderer.ViewPort; import com.jme3.scene.Geometry; +import com.jme3.scene.Spatial; import com.jme3.scene.shape.Box; import com.jme3.texture.FrameBuffer; import com.jme3.texture.Image.Format; import com.jme3.texture.Texture; import com.jme3.texture.TextureCubeMap; import com.jme3.util.SkyFactory; +import com.jme3.util.SkyFactory.EnvMapType; /** * Renders a rotating box to a cubemap texture, then applies the cubemap @@ -114,7 +116,9 @@ public class TestRenderToCubemap extends SimpleApplication { cam.lookAt(Vector3f.ZERO, Vector3f.UNIT_Y); Texture offTex = setupOffscreenView(); - rootNode.attachChild(SkyFactory.createSky(assetManager, offTex, false)); + Spatial sky = SkyFactory.createSky(assetManager, offTex, + EnvMapType.CubeMap); + rootNode.attachChild(sky); } @Override diff --git a/jme3-examples/src/main/java/jme3test/renderer/TestAspectRatio.java b/jme3-examples/src/main/java/jme3test/renderer/TestAspectRatio.java index c557b7f5f..bdb526710 100644 --- a/jme3-examples/src/main/java/jme3test/renderer/TestAspectRatio.java +++ b/jme3-examples/src/main/java/jme3test/renderer/TestAspectRatio.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2017 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -38,7 +38,7 @@ import com.jme3.scene.Geometry; import com.jme3.scene.shape.Box; /** - * Simple application to an test a viewport/camera with a different aspect ratio + * Simple application to test a viewport/camera with a different aspect ratio * than the display -- issue #357. The cube should render as a blue square, not * a rectangle. * diff --git a/jme3-examples/src/main/java/jme3test/renderer/TestBlendEquations.java b/jme3-examples/src/main/java/jme3test/renderer/TestBlendEquations.java index 9335912b6..435d57db3 100644 --- a/jme3-examples/src/main/java/jme3test/renderer/TestBlendEquations.java +++ b/jme3-examples/src/main/java/jme3test/renderer/TestBlendEquations.java @@ -36,75 +36,106 @@ import com.jme3.light.DirectionalLight; import com.jme3.material.Material; import com.jme3.material.RenderState; import com.jme3.math.ColorRGBA; +import com.jme3.math.FastMath; import com.jme3.math.Vector3f; import com.jme3.renderer.queue.RenderQueue; import com.jme3.scene.Geometry; +import com.jme3.scene.Spatial; import com.jme3.scene.shape.Quad; +/** + * This test demonstrates the usage of customized blend equations and factors on a material.
    + * Customized blend equations and factors always requires {@link RenderState.BlendMode#Custom}. + * + * @author the_Minka + */ public class TestBlendEquations extends SimpleApplication { + private Geometry leftQuad; + private Geometry rightQuad; + + private float timer; + public static void main(String[] args) { TestBlendEquations app = new TestBlendEquations(); app.start(); } public void simpleInitApp() { - Geometry teaGeom = (Geometry) assetManager.loadModel("Models/Teapot/Teapot.obj"); - teaGeom.scale(6); - teaGeom.getMaterial().getAdditionalRenderState().setBlendEquation(RenderState.BlendEquation.Add); - teaGeom.move(0, -2f, 0); - - DirectionalLight dl = new DirectionalLight(); - dl.setColor(ColorRGBA.Red); - dl.setDirection(Vector3f.UNIT_XYZ.negate()); - - rootNode.addLight(dl); - rootNode.attachChild(teaGeom); - - Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); - mat.setColor("Color", new ColorRGBA(0.5f, 0f, 1f, 0.3f)); - mat.getAdditionalRenderState().setBlendMode(RenderState.BlendMode.Color); - mat.getAdditionalRenderState().setBlendEquation(RenderState.BlendEquation.Subtract); - - Geometry geo = new Geometry("BottomLeft", new Quad(guiViewPort.getCamera().getWidth() / 2, guiViewPort.getCamera().getHeight() / 2)); - geo.setMaterial(mat); - geo.setQueueBucket(RenderQueue.Bucket.Gui); - geo.setLocalTranslation(0, 0, 1); - - guiNode.attachChild(geo); - - Material m = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); - m.getAdditionalRenderState().setBlendEquation(RenderState.BlendEquation.ReverseSubtract); - m.setColor("Color", new ColorRGBA(0.0f, 1f, 1.f, 1f)); - m.getAdditionalRenderState().setBlendMode(RenderState.BlendMode.AlphaAdditive); - - geo = new Geometry("BottomRight", new Quad(guiViewPort.getCamera().getWidth() / 2, guiViewPort.getCamera().getHeight() / 2)); - geo.setMaterial(m); - geo.setQueueBucket(RenderQueue.Bucket.Gui); - geo.setLocalTranslation(guiViewPort.getCamera().getWidth() / 2, 0, 1); - - guiNode.attachChild(geo); - - m = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); - m.getAdditionalRenderState().setBlendEquation(RenderState.BlendEquation.Min); - m.setColor("Color", new ColorRGBA(0.3f, 0f, 0.1f, 0.3f)); - m.getAdditionalRenderState().setBlendMode(RenderState.BlendMode.Additive); - - geo = new Geometry("TopRight", new Quad(guiViewPort.getCamera().getWidth() / 2, guiViewPort.getCamera().getHeight() / 2)); - geo.setMaterial(m); - geo.setQueueBucket(RenderQueue.Bucket.Gui); - geo.setLocalTranslation(guiViewPort.getCamera().getWidth() / 2, guiViewPort.getCamera().getHeight() / 2, 1); - - guiNode.attachChild(geo); - - geo = new Geometry("OverTeaPot", new Quad(guiViewPort.getCamera().getWidth() / 2, guiViewPort.getCamera().getHeight() / 2)); - geo.setMaterial(mat); - geo.setQueueBucket(RenderQueue.Bucket.Transparent); - geo.setLocalTranslation(0, -100, 5); - - rootNode.attachChild(geo); + cam.setLocation(new Vector3f(0f, 0.5f, 3f)); + viewPort.setBackgroundColor(ColorRGBA.LightGray); + + // Add a light source to the scene. + DirectionalLight directionalLight = new DirectionalLight(); + directionalLight.setColor(ColorRGBA.Magenta); + directionalLight.setDirection(Vector3f.UNIT_XYZ.negate()); + rootNode.addLight(directionalLight); + + + // Create and add a teapot to the scene graph. + Spatial teapotModel = assetManager.loadModel("Models/Teapot/Teapot.obj"); + rootNode.attachChild(teapotModel); + // Create the two moving quads with custom blend modes. + createLeftQuad(); + createRightQuad(); } + /** + * Adds a "transparent" quad to the scene, that shows an inverse blue value sight of the scene behind. + */ + private void createLeftQuad() { + Material material = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); + + // This color creates a blue value image. The effect will have a strength of 80% (set by the alpha value). + material.setColor("Color", new ColorRGBA(0f, 0f, 1f, 0.8f)); + + // Result.RGB = Source.A * Source.RGB - Source.A * Destination.RGB + // Result.A = Destination.A + material.getAdditionalRenderState().setBlendMode(RenderState.BlendMode.Custom); + material.getAdditionalRenderState().setBlendEquation(RenderState.BlendEquation.Subtract); + material.getAdditionalRenderState().setBlendEquationAlpha(RenderState.BlendEquationAlpha.Add); + material.getAdditionalRenderState().setCustomBlendFactors( + RenderState.BlendFunc.Src_Alpha, RenderState.BlendFunc.Src_Alpha, + RenderState.BlendFunc.Zero, RenderState.BlendFunc.One); + + leftQuad = new Geometry("LeftQuad", new Quad(1f, 1f)); + leftQuad.setMaterial(material); + leftQuad.setQueueBucket(RenderQueue.Bucket.Transparent); + rootNode.attachChild(leftQuad); + } + + /** + * Adds a "transparent" quad to the scene, that limits the color values of the scene behind the object.
    + * This effect can be good seen on bright areas of the scene (e.g. areas with specular lighting effects). + */ + private void createRightQuad() { + Material material = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); + material.setColor("Color", new ColorRGBA(0.4f, 0.4f, 0.4f, 1f)); + + // Min( Source , Destination) + material.getAdditionalRenderState().setBlendMode(RenderState.BlendMode.Custom); + material.getAdditionalRenderState().setBlendEquation(RenderState.BlendEquation.Min); + material.getAdditionalRenderState().setBlendEquationAlpha(RenderState.BlendEquationAlpha.Min); + + // In OpenGL no blend factors are used, when using the blend equations Min or Max! + //material.getAdditionalRenderState().setCustomBlendFactors( + // RenderState.BlendFunc.One, RenderState.BlendFunc.One, + // RenderState.BlendFunc.One, RenderState.BlendFunc.One); + + rightQuad = new Geometry("RightQuad", new Quad(1f, 1f)); + rightQuad.setMaterial(material); + rightQuad.setQueueBucket(RenderQueue.Bucket.Transparent); + rootNode.attachChild(rightQuad); + } + + @Override + public void simpleUpdate(float tpf) { + timer += tpf; + + float xOffset = FastMath.sin(timer * 0.5f) * 2f; + leftQuad.setLocalTranslation(xOffset - 2f, 0f, 0.5f); + rightQuad.setLocalTranslation(xOffset + 1f, 0f, 0.5f); + } } diff --git a/jme3-examples/src/main/java/jme3test/scene/TestSceneLoading.java b/jme3-examples/src/main/java/jme3test/scene/TestSceneLoading.java index cadc42e54..2567d94fa 100644 --- a/jme3-examples/src/main/java/jme3test/scene/TestSceneLoading.java +++ b/jme3-examples/src/main/java/jme3test/scene/TestSceneLoading.java @@ -66,7 +66,9 @@ public class TestSceneLoading extends SimpleApplication { this.flyCam.setMoveSpeed(10); // load sky - rootNode.attachChild(SkyFactory.createSky(assetManager, "Textures/Sky/Bright/BrightSky.dds", false)); + rootNode.attachChild(SkyFactory.createSky(assetManager, + "Textures/Sky/Bright/BrightSky.dds", + SkyFactory.EnvMapType.CubeMap)); File file = new File("wildhouse.zip"); if (!file.exists()) { diff --git a/jme3-examples/src/main/java/jme3test/stress/TestLodGeneration.java b/jme3-examples/src/main/java/jme3test/stress/TestLodGeneration.java index cf8dbb64b..5400e98d8 100644 --- a/jme3-examples/src/main/java/jme3test/stress/TestLodGeneration.java +++ b/jme3-examples/src/main/java/jme3test/stress/TestLodGeneration.java @@ -31,9 +31,8 @@ */ package jme3test.stress; +import com.jme3.anim.SkinningControl; import com.jme3.animation.AnimChannel; -import com.jme3.animation.AnimControl; -import com.jme3.animation.SkeletonControl; import com.jme3.app.SimpleApplication; import com.jme3.bounding.BoundingBox; import com.jme3.font.BitmapText; @@ -43,18 +42,14 @@ import com.jme3.input.controls.ActionListener; import com.jme3.input.controls.KeyTrigger; import com.jme3.light.AmbientLight; import com.jme3.light.DirectionalLight; -import com.jme3.math.ColorRGBA; -import com.jme3.math.FastMath; -import com.jme3.math.Vector3f; -import com.jme3.scene.Geometry; -import com.jme3.scene.Node; -import com.jme3.scene.Spatial; -import com.jme3.scene.VertexBuffer; +import com.jme3.math.*; +import com.jme3.scene.*; +import jme3tools.optimize.LodGenerator; + import java.util.ArrayList; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ScheduledThreadPoolExecutor; -import jme3tools.optimize.LodGenerator; public class TestLodGeneration extends SimpleApplication { @@ -101,7 +96,7 @@ public class TestLodGeneration extends SimpleApplication { // ch = model.getControl(AnimControl.class).createChannel(); // ch.setAnim("Wave"); - SkeletonControl c = model.getControl(SkeletonControl.class); + SkinningControl c = model.getControl(SkinningControl.class); if (c != null) { c.setEnabled(false); } diff --git a/jme3-examples/src/main/java/jme3test/terrain/TerrainTest.java b/jme3-examples/src/main/java/jme3test/terrain/TerrainTest.java index 7eff18b8f..5da9d9d2b 100644 --- a/jme3-examples/src/main/java/jme3test/terrain/TerrainTest.java +++ b/jme3-examples/src/main/java/jme3test/terrain/TerrainTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -53,7 +53,7 @@ import com.jme3.texture.Texture.WrapMode; /** * Demonstrates how to use terrain. * The base terrain class it uses is TerrainQuad, which is a quad tree of actual - * meshes called TerainPatches. + * meshes called TerrainPatches. * There are a couple options for the terrain in this test: * The first is wireframe mode. Here you can see the underlying trianglestrip structure. * You will notice some off lines; these are degenerate triangles and are part of the @@ -203,7 +203,7 @@ public class TerrainTest extends SimpleApplication { matRock.setBoolean("useTriPlanarMapping", true); // planar textures don't use the mesh's texture coordinates but real world coordinates, // so we need to convert these texture coordinate scales into real world scales so it looks - // the same when we switch to/from tr-planar mode + // the same when we switch to/from tri-planar mode matRock.setFloat("Tex1Scale", 1f / (float) (512f / grassScale)); matRock.setFloat("Tex2Scale", 1f / (float) (512f / dirtScale)); matRock.setFloat("Tex3Scale", 1f / (float) (512f / rockScale)); diff --git a/jme3-examples/src/main/java/jme3test/terrain/TerrainTestCollision.java b/jme3-examples/src/main/java/jme3test/terrain/TerrainTestCollision.java index 32f1734e6..6822251ba 100644 --- a/jme3-examples/src/main/java/jme3test/terrain/TerrainTestCollision.java +++ b/jme3-examples/src/main/java/jme3test/terrain/TerrainTestCollision.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -48,6 +48,7 @@ import com.jme3.light.DirectionalLight; import com.jme3.light.PointLight; import com.jme3.material.Material; import com.jme3.math.ColorRGBA; +import com.jme3.math.Quaternion; import com.jme3.math.Ray; import com.jme3.math.Vector2f; import com.jme3.math.Vector3f; @@ -176,16 +177,15 @@ public class TerrainTestCollision extends SimpleApplication { dl.setColor(new ColorRGBA(0.50f, 0.40f, 0.50f, 1.0f)); rootNode.addLight(dl); - cam.setLocation(new Vector3f(0, 25, -10)); - cam.lookAtDirection(new Vector3f(0, -1, 0).normalizeLocal(), Vector3f.UNIT_Y); + cam.setLocation(new Vector3f(43f, 121f, 10f)); + cam.setRotation(new Quaternion(0.15824f, -0.79309f, 0.23223f, 0.5404f)); } public void loadHintText() { hintText = new BitmapText(guiFont, false); hintText.setSize(guiFont.getCharSet().getRenderedSize()); hintText.setLocalTranslation(0, getCamera().getHeight(), 0); - //hintText.setText("Hit T to switch to wireframe"); - hintText.setText(""); + hintText.setText("Press T to toggle wireframe"); guiNode.attachChild(hintText); } @@ -241,7 +241,7 @@ public class TerrainTestCollision extends SimpleApplication { public void onAction(String binding, boolean keyPressed, float tpf) { if (binding.equals("wireframe") && !keyPressed) { wireframe = !wireframe; - if (!wireframe) { + if (wireframe) { terrain.setMaterial(matWire); } else { terrain.setMaterial(matRock); diff --git a/jme3-examples/src/main/java/jme3test/tools/TestSaveGame.java b/jme3-examples/src/main/java/jme3test/tools/TestSaveGame.java index d9ef51db1..8e90d181a 100644 --- a/jme3-examples/src/main/java/jme3test/tools/TestSaveGame.java +++ b/jme3-examples/src/main/java/jme3test/tools/TestSaveGame.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -62,7 +62,7 @@ public class TestSaveGame extends SimpleApplication { Spatial model = (Spatial) assetManager.loadModel("Models/Oto/Oto.mesh.xml"); myPlayer.attachChild(model); - //before saving the game, the model should be detached so its not saved along with the node + //before saving the game, the model should be detached so it's not saved along with the node myPlayer.detachAllChildren(); SaveGame.saveGame("mycompany/mygame", "savegame_001", myPlayer); diff --git a/jme3-examples/src/main/java/jme3test/water/TestMultiPostWater.java b/jme3-examples/src/main/java/jme3test/water/TestMultiPostWater.java index 2821b818c..2611d9696 100644 --- a/jme3-examples/src/main/java/jme3test/water/TestMultiPostWater.java +++ b/jme3-examples/src/main/java/jme3test/water/TestMultiPostWater.java @@ -20,6 +20,7 @@ import com.jme3.texture.Texture; import com.jme3.texture.Texture.WrapMode; import com.jme3.texture.Texture2D; import com.jme3.util.SkyFactory; +import com.jme3.util.SkyFactory.EnvMapType; import com.jme3.water.WaterFilter; import java.util.ArrayList; import java.util.List; @@ -73,7 +74,8 @@ public class TestMultiPostWater extends SimpleApplication { cam.setRotation(new Quaternion().fromAngles(new float[]{FastMath.PI * 0.06f, FastMath.PI * 0.65f, 0})); - Spatial sky = SkyFactory.createSky(assetManager, "Scenes/Beach/FullskiesSunset0068.dds", false); + Spatial sky = SkyFactory.createSky(assetManager, + "Scenes/Beach/FullskiesSunset0068.dds", EnvMapType.CubeMap); sky.setLocalScale(350); mainScene.attachChild(sky); diff --git a/jme3-examples/src/main/java/jme3test/water/TestPostWater.java b/jme3-examples/src/main/java/jme3test/water/TestPostWater.java index e1d3a08dd..21e11d153 100644 --- a/jme3-examples/src/main/java/jme3test/water/TestPostWater.java +++ b/jme3-examples/src/main/java/jme3test/water/TestPostWater.java @@ -1,6 +1,7 @@ package jme3test.water; import com.jme3.app.SimpleApplication; +import com.jme3.audio.AudioData.DataType; import com.jme3.audio.AudioNode; import com.jme3.audio.LowPassFilter; import com.jme3.effect.ParticleEmitter; @@ -35,6 +36,7 @@ import com.jme3.texture.Texture; import com.jme3.texture.Texture.WrapMode; import com.jme3.texture.Texture2D; import com.jme3.util.SkyFactory; +import com.jme3.util.SkyFactory.EnvMapType; import com.jme3.water.WaterFilter; import java.util.ArrayList; import java.util.List; @@ -93,7 +95,8 @@ public class TestPostWater extends SimpleApplication { - Spatial sky = SkyFactory.createSky(assetManager, "Scenes/Beach/FullskiesSunset0068.dds", false); + Spatial sky = SkyFactory.createSky(assetManager, + "Scenes/Beach/FullskiesSunset0068.dds", EnvMapType.CubeMap); sky.setLocalScale(350); mainScene.attachChild(sky); @@ -149,7 +152,8 @@ public class TestPostWater extends SimpleApplication { uw = cam.getLocation().y < waterHeight; - waves = new AudioNode(assetManager, "Sound/Environment/Ocean Waves.ogg", false); + waves = new AudioNode(assetManager, "Sound/Environment/Ocean Waves.ogg", + DataType.Buffer); waves.setLooping(true); waves.setReverbEnabled(true); if (uw) { diff --git a/jme3-examples/src/main/java/jme3test/water/TestPostWaterLake.java b/jme3-examples/src/main/java/jme3test/water/TestPostWaterLake.java index e178c12ac..16441025c 100644 --- a/jme3-examples/src/main/java/jme3test/water/TestPostWaterLake.java +++ b/jme3-examples/src/main/java/jme3test/water/TestPostWaterLake.java @@ -62,7 +62,9 @@ public class TestPostWaterLake extends SimpleApplication { // cam.setRotation(new Quaternion(0.03f, 0.9f, 0f, 0.4f)); // load sky - rootNode.attachChild(SkyFactory.createSky(assetManager, "Textures/Sky/Bright/BrightSky.dds", false)); + rootNode.attachChild(SkyFactory.createSky(assetManager, + "Textures/Sky/Bright/BrightSky.dds", + SkyFactory.EnvMapType.CubeMap)); File file = new File("wildhouse.zip"); diff --git a/jme3-examples/src/main/java/jme3test/water/TestSceneWater.java b/jme3-examples/src/main/java/jme3test/water/TestSceneWater.java index 41e71c2d3..4e0d8d6fc 100644 --- a/jme3-examples/src/main/java/jme3test/water/TestSceneWater.java +++ b/jme3-examples/src/main/java/jme3test/water/TestSceneWater.java @@ -66,7 +66,9 @@ public class TestSceneWater extends SimpleApplication { cam.setRotation(new Quaternion(0.03f, 0.9f, 0f, 0.4f)); // load sky - mainScene.attachChild(SkyFactory.createSky(assetManager, "Textures/Sky/Bright/BrightSky.dds", false)); + mainScene.attachChild(SkyFactory.createSky(assetManager, + "Textures/Sky/Bright/BrightSky.dds", + SkyFactory.EnvMapType.CubeMap)); File file = new File("wildhouse.zip"); diff --git a/jme3-examples/src/main/java/jme3test/water/TestSimpleWater.java b/jme3-examples/src/main/java/jme3test/water/TestSimpleWater.java index 4a8855df6..c8ba06fed 100644 --- a/jme3-examples/src/main/java/jme3test/water/TestSimpleWater.java +++ b/jme3-examples/src/main/java/jme3test/water/TestSimpleWater.java @@ -103,7 +103,9 @@ public class TestSimpleWater extends SimpleApplication implements ActionListener sceneNode.attachChild(geom); // load sky - sceneNode.attachChild(SkyFactory.createSky(assetManager, "Textures/Sky/Bright/BrightSky.dds", false)); + sceneNode.attachChild(SkyFactory.createSky(assetManager, + "Textures/Sky/Bright/BrightSky.dds", + SkyFactory.EnvMapType.CubeMap)); rootNode.attachChild(sceneNode); //add lightPos Geometry diff --git a/jme3-examples/src/main/resources/jme3test/font/BM-FreeSerif16I.fnt b/jme3-examples/src/main/resources/jme3test/font/BM-FreeSerif16I.fnt new file mode 100644 index 000000000..f77819afb --- /dev/null +++ b/jme3-examples/src/main/resources/jme3test/font/BM-FreeSerif16I.fnt @@ -0,0 +1,1031 @@ +info face="FreeSerif" size=16 bold=0 italic=1 charset="" unicode=1 stretchH=100 smooth=1 aa=2 padding=0,0,0,0 spacing=3,3 outline=0 +common lineHeight=16 base=12 scaleW=1024 scaleH=1024 pages=1 packed=0 alphaChnl=0 redChnl=4 greenChnl=4 blueChnl=4 +page id=0 file="BM-FreeSerif16I_0.png" +chars count=406 +char id=-1 x=889 y=16 width=11 height=10 xoffset=1 yoffset=2 xadvance=9 page=0 chnl=15 +char id=32 x=489 y=56 width=1 height=1 xoffset=0 yoffset=0 xadvance=3 page=0 chnl=15 +char id=33 x=36 y=45 width=5 height=10 xoffset=1 yoffset=2 xadvance=4 page=0 chnl=15 +char id=34 x=196 y=56 width=4 height=4 xoffset=3 yoffset=2 xadvance=5 page=0 chnl=15 +char id=35 x=468 y=44 width=8 height=9 xoffset=1 yoffset=3 xadvance=6 page=0 chnl=15 +char id=36 x=403 y=16 width=9 height=12 xoffset=0 yoffset=2 xadvance=6 page=0 chnl=15 +char id=37 x=66 y=32 width=10 height=10 xoffset=2 yoffset=2 xadvance=11 page=0 chnl=15 +char id=38 x=945 y=15 width=11 height=10 xoffset=1 yoffset=2 xadvance=10 page=0 chnl=15 +char id=39 x=1019 y=41 width=2 height=4 xoffset=3 yoffset=2 xadvance=2 page=0 chnl=15 +char id=40 x=543 y=16 width=7 height=12 xoffset=1 yoffset=2 xadvance=4 page=0 chnl=15 +char id=41 x=553 y=16 width=6 height=12 xoffset=0 yoffset=3 xadvance=4 page=0 chnl=15 +char id=42 x=53 y=58 width=6 height=6 xoffset=2 yoffset=2 xadvance=6 page=0 chnl=15 +char id=43 x=897 y=42 width=8 height=7 xoffset=1 yoffset=5 xadvance=7 page=0 chnl=15 +char id=44 x=209 y=56 width=3 height=4 xoffset=0 yoffset=10 xadvance=3 page=0 chnl=15 +char id=45 x=475 y=56 width=4 height=1 xoffset=1 yoffset=8 xadvance=4 page=0 chnl=15 +char id=46 x=408 y=56 width=2 height=2 xoffset=1 yoffset=10 xadvance=3 page=0 chnl=15 +char id=47 x=489 y=31 width=8 height=10 xoffset=0 yoffset=2 xadvance=3 page=0 chnl=15 +char id=48 x=500 y=31 width=8 height=10 xoffset=1 yoffset=2 xadvance=6 page=0 chnl=15 +char id=49 x=27 y=45 width=6 height=10 xoffset=1 yoffset=2 xadvance=6 page=0 chnl=15 +char id=50 x=194 y=31 width=9 height=10 xoffset=0 yoffset=2 xadvance=6 page=0 chnl=15 +char id=51 x=632 y=30 width=8 height=10 xoffset=0 yoffset=2 xadvance=6 page=0 chnl=15 +char id=52 x=522 y=31 width=8 height=10 xoffset=0 yoffset=2 xadvance=6 page=0 chnl=15 +char id=53 x=230 y=31 width=9 height=10 xoffset=0 yoffset=2 xadvance=6 page=0 chnl=15 +char id=54 x=242 y=31 width=9 height=10 xoffset=1 yoffset=2 xadvance=6 page=0 chnl=15 +char id=55 x=533 y=31 width=8 height=10 xoffset=2 yoffset=3 xadvance=6 page=0 chnl=15 +char id=56 x=544 y=31 width=8 height=10 xoffset=1 yoffset=2 xadvance=6 page=0 chnl=15 +char id=57 x=555 y=31 width=8 height=10 xoffset=0 yoffset=2 xadvance=6 page=0 chnl=15 +char id=58 x=8 y=58 width=4 height=7 xoffset=1 yoffset=5 xadvance=3 page=0 chnl=15 +char id=59 x=701 y=43 width=4 height=9 xoffset=0 yoffset=5 xadvance=3 page=0 chnl=15 +char id=60 x=733 y=43 width=9 height=8 xoffset=1 yoffset=5 xadvance=7 page=0 chnl=15 +char id=61 x=127 y=56 width=9 height=4 xoffset=0 yoffset=6 xadvance=7 page=0 chnl=15 +char id=62 x=721 y=43 width=9 height=8 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=15 +char id=63 x=989 y=28 width=6 height=10 xoffset=2 yoffset=2 xadvance=6 page=0 chnl=15 +char id=64 x=1001 y=15 width=11 height=10 xoffset=2 yoffset=2 xadvance=12 page=0 chnl=15 +char id=65 x=131 y=31 width=10 height=10 xoffset=0 yoffset=2 xadvance=9 page=0 chnl=15 +char id=66 x=335 y=44 width=10 height=9 xoffset=0 yoffset=3 xadvance=9 page=0 chnl=15 +char id=67 x=14 y=32 width=10 height=10 xoffset=1 yoffset=2 xadvance=9 page=0 chnl=15 +char id=68 x=181 y=44 width=12 height=9 xoffset=0 yoffset=3 xadvance=9 page=0 chnl=15 +char id=69 x=268 y=44 width=11 height=9 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=15 +char id=70 x=240 y=44 width=11 height=9 xoffset=0 yoffset=3 xadvance=7 page=0 chnl=15 +char id=71 x=27 y=32 width=10 height=10 xoffset=1 yoffset=2 xadvance=9 page=0 chnl=15 +char id=72 x=101 y=44 width=13 height=9 xoffset=0 yoffset=3 xadvance=9 page=0 chnl=15 +char id=73 x=479 y=44 width=8 height=9 xoffset=0 yoffset=3 xadvance=4 page=0 chnl=15 +char id=74 x=398 y=31 width=9 height=10 xoffset=0 yoffset=3 xadvance=5 page=0 chnl=15 +char id=75 x=165 y=44 width=13 height=9 xoffset=0 yoffset=3 xadvance=9 page=0 chnl=15 +char id=76 x=397 y=44 width=9 height=9 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=15 +char id=77 x=65 y=45 width=15 height=9 xoffset=0 yoffset=3 xadvance=12 page=0 chnl=15 +char id=78 x=828 y=16 width=13 height=10 xoffset=0 yoffset=3 xadvance=9 page=0 chnl=15 +char id=79 x=40 y=32 width=10 height=10 xoffset=1 yoffset=2 xadvance=9 page=0 chnl=15 +char id=80 x=322 y=44 width=10 height=9 xoffset=0 yoffset=3 xadvance=7 page=0 chnl=15 +char id=81 x=265 y=16 width=10 height=12 xoffset=1 yoffset=2 xadvance=9 page=0 chnl=15 +char id=82 x=296 y=44 width=10 height=9 xoffset=0 yoffset=3 xadvance=9 page=0 chnl=15 +char id=83 x=254 y=31 width=9 height=10 xoffset=0 yoffset=2 xadvance=7 page=0 chnl=15 +char id=84 x=361 y=44 width=9 height=9 xoffset=2 yoffset=3 xadvance=8 page=0 chnl=15 +char id=85 x=987 y=15 width=11 height=10 xoffset=2 yoffset=3 xadvance=9 page=0 chnl=15 +char id=86 x=105 y=31 width=10 height=10 xoffset=3 yoffset=3 xadvance=9 page=0 chnl=15 +char id=87 x=777 y=16 width=14 height=10 xoffset=2 yoffset=3 xadvance=12 page=0 chnl=15 +char id=88 x=133 y=44 width=13 height=9 xoffset=0 yoffset=3 xadvance=9 page=0 chnl=15 +char id=89 x=282 y=44 width=11 height=9 xoffset=2 yoffset=3 xadvance=9 page=0 chnl=15 +char id=90 x=254 y=44 width=11 height=9 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=15 +char id=91 x=415 y=16 width=8 height=12 xoffset=0 yoffset=3 xadvance=4 page=0 chnl=15 +char id=92 x=60 y=45 width=2 height=10 xoffset=2 yoffset=2 xadvance=4 page=0 chnl=15 +char id=93 x=523 y=16 width=7 height=12 xoffset=0 yoffset=2 xadvance=4 page=0 chnl=15 +char id=94 x=35 y=58 width=6 height=6 xoffset=1 yoffset=3 xadvance=6 page=0 chnl=15 +char id=95 x=344 y=56 width=8 height=2 xoffset=-1 yoffset=12 xadvance=6 page=0 chnl=15 +char id=96 x=306 y=56 width=3 height=3 xoffset=3 yoffset=2 xadvance=4 page=0 chnl=15 +char id=97 x=951 y=41 width=7 height=7 xoffset=0 yoffset=5 xadvance=6 page=0 chnl=15 +char id=98 x=979 y=28 width=7 height=10 xoffset=1 yoffset=2 xadvance=6 page=0 chnl=15 +char id=99 x=941 y=42 width=7 height=7 xoffset=1 yoffset=5 xadvance=6 page=0 chnl=15 +char id=100 x=687 y=30 width=8 height=10 xoffset=1 yoffset=2 xadvance=6 page=0 chnl=15 +char id=101 x=1001 y=41 width=6 height=7 xoffset=1 yoffset=5 xadvance=6 page=0 chnl=15 +char id=102 x=278 y=31 width=9 height=10 xoffset=0 yoffset=2 xadvance=4 page=0 chnl=15 +char id=103 x=374 y=31 width=9 height=10 xoffset=0 yoffset=5 xadvance=6 page=0 chnl=15 +char id=104 x=467 y=31 width=8 height=10 xoffset=0 yoffset=2 xadvance=6 page=0 chnl=15 +char id=105 x=18 y=45 width=6 height=10 xoffset=0 yoffset=2 xadvance=3 page=0 chnl=15 +char id=106 x=922 y=0 width=8 height=13 xoffset=-2 yoffset=2 xadvance=3 page=0 chnl=15 +char id=107 x=170 y=31 width=9 height=10 xoffset=0 yoffset=2 xadvance=6 page=0 chnl=15 +char id=108 x=1015 y=15 width=6 height=10 xoffset=0 yoffset=2 xadvance=3 page=0 chnl=15 +char id=109 x=808 y=42 width=12 height=7 xoffset=0 yoffset=5 xadvance=10 page=0 chnl=15 +char id=110 x=908 y=42 width=8 height=7 xoffset=0 yoffset=5 xadvance=6 page=0 chnl=15 +char id=111 x=991 y=41 width=7 height=7 xoffset=1 yoffset=5 xadvance=6 page=0 chnl=15 +char id=112 x=302 y=31 width=9 height=10 xoffset=-1 yoffset=5 xadvance=6 page=0 chnl=15 +char id=113 x=577 y=31 width=8 height=10 xoffset=0 yoffset=5 xadvance=6 page=0 chnl=15 +char id=114 x=981 y=41 width=7 height=7 xoffset=0 yoffset=5 xadvance=4 page=0 chnl=15 +char id=115 x=1010 y=41 width=6 height=7 xoffset=0 yoffset=5 xadvance=5 page=0 chnl=15 +char id=116 x=693 y=43 width=5 height=9 xoffset=1 yoffset=4 xadvance=3 page=0 chnl=15 +char id=117 x=971 y=41 width=7 height=7 xoffset=1 yoffset=5 xadvance=6 page=0 chnl=15 +char id=118 x=961 y=41 width=7 height=7 xoffset=2 yoffset=5 xadvance=6 page=0 chnl=15 +char id=119 x=823 y=42 width=10 height=7 xoffset=2 yoffset=5 xadvance=9 page=0 chnl=15 +char id=120 x=930 y=42 width=8 height=7 xoffset=0 yoffset=5 xadvance=6 page=0 chnl=15 +char id=121 x=410 y=31 width=9 height=10 xoffset=0 yoffset=5 xadvance=6 page=0 chnl=15 +char id=122 x=919 y=42 width=8 height=7 xoffset=0 yoffset=5 xadvance=6 page=0 chnl=15 +char id=123 x=580 y=16 width=6 height=12 xoffset=2 yoffset=2 xadvance=6 page=0 chnl=15 +char id=124 x=44 y=45 width=5 height=10 xoffset=0 yoffset=2 xadvance=2 page=0 chnl=15 +char id=125 x=513 y=16 width=7 height=12 xoffset=0 yoffset=3 xadvance=6 page=0 chnl=15 +char id=126 x=239 y=56 width=7 height=3 xoffset=1 yoffset=7 xadvance=7 page=0 chnl=15 +char id=160 x=493 y=56 width=1 height=1 xoffset=0 yoffset=0 xadvance=3 page=0 chnl=15 +char id=161 x=1016 y=28 width=5 height=10 xoffset=0 yoffset=5 xadvance=4 page=0 chnl=15 +char id=162 x=797 y=29 width=8 height=10 xoffset=0 yoffset=4 xadvance=6 page=0 chnl=15 +char id=163 x=206 y=31 width=9 height=10 xoffset=0 yoffset=2 xadvance=6 page=0 chnl=15 +char id=164 x=708 y=43 width=10 height=8 xoffset=0 yoffset=3 xadvance=6 page=0 chnl=15 +char id=165 x=433 y=44 width=9 height=9 xoffset=1 yoffset=3 xadvance=6 page=0 chnl=15 +char id=166 x=52 y=45 width=5 height=10 xoffset=0 yoffset=2 xadvance=2 page=0 chnl=15 +char id=167 x=503 y=16 width=7 height=12 xoffset=1 yoffset=2 xadvance=6 page=0 chnl=15 +char id=168 x=384 y=56 width=5 height=2 xoffset=2 yoffset=3 xadvance=4 page=0 chnl=15 +char id=169 x=648 y=16 width=11 height=11 xoffset=1 yoffset=2 xadvance=10 page=0 chnl=15 +char id=170 x=120 y=56 width=4 height=5 xoffset=2 yoffset=2 xadvance=3 page=0 chnl=15 +char id=171 x=15 y=58 width=7 height=6 xoffset=1 yoffset=6 xadvance=6 page=0 chnl=15 +char id=172 x=93 y=56 width=8 height=5 xoffset=1 yoffset=6 xadvance=7 page=0 chnl=15 +char id=173 x=482 y=56 width=4 height=1 xoffset=1 yoffset=8 xadvance=4 page=0 chnl=15 +char id=174 x=606 y=16 width=11 height=11 xoffset=1 yoffset=2 xadvance=10 page=0 chnl=15 +char id=175 x=392 y=56 width=5 height=2 xoffset=2 yoffset=3 xadvance=4 page=0 chnl=15 +char id=176 x=112 y=56 width=5 height=5 xoffset=3 yoffset=2 xadvance=5 page=0 chnl=15 +char id=177 x=348 y=44 width=10 height=9 xoffset=0 yoffset=3 xadvance=7 page=0 chnl=15 +char id=178 x=44 y=58 width=6 height=6 xoffset=1 yoffset=2 xadvance=4 page=0 chnl=15 +char id=179 x=78 y=57 width=5 height=6 xoffset=1 yoffset=2 xadvance=4 page=0 chnl=15 +char id=180 x=299 y=56 width=4 height=3 xoffset=3 yoffset=2 xadvance=4 page=0 chnl=15 +char id=181 x=362 y=31 width=9 height=10 xoffset=0 yoffset=5 xadvance=6 page=0 chnl=15 +char id=182 x=391 y=16 width=9 height=12 xoffset=0 yoffset=3 xadvance=6 page=0 chnl=15 +char id=183 x=413 y=56 width=2 height=2 xoffset=2 yoffset=8 xadvance=3 page=0 chnl=15 +char id=184 x=182 y=56 width=4 height=4 xoffset=0 yoffset=11 xadvance=4 page=0 chnl=15 +char id=185 x=86 y=56 width=4 height=6 xoffset=2 yoffset=2 xadvance=4 page=0 chnl=15 +char id=186 x=104 y=56 width=5 height=5 xoffset=2 yoffset=2 xadvance=4 page=0 chnl=15 +char id=187 x=25 y=58 width=7 height=6 xoffset=0 yoffset=6 xadvance=6 page=0 chnl=15 +char id=188 x=973 y=15 width=11 height=10 xoffset=1 yoffset=2 xadvance=10 page=0 chnl=15 +char id=189 x=0 y=32 width=11 height=10 xoffset=1 yoffset=2 xadvance=10 page=0 chnl=15 +char id=190 x=875 y=16 width=11 height=10 xoffset=1 yoffset=2 xadvance=10 page=0 chnl=15 +char id=191 x=9 y=45 width=6 height=10 xoffset=0 yoffset=5 xadvance=6 page=0 chnl=15 +char id=192 x=681 y=0 width=10 height=13 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=15 +char id=193 x=193 y=0 width=11 height=13 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=15 +char id=194 x=42 y=17 width=11 height=12 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=15 +char id=195 x=168 y=16 width=11 height=12 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=15 +char id=196 x=182 y=16 width=11 height=12 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=15 +char id=197 x=694 y=0 width=10 height=13 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=15 +char id=198 x=83 y=44 width=15 height=9 xoffset=0 yoffset=3 xadvance=12 page=0 chnl=15 +char id=199 x=499 y=0 width=10 height=13 xoffset=1 yoffset=2 xadvance=9 page=0 chnl=15 +char id=200 x=431 y=0 width=11 height=13 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=15 +char id=201 x=417 y=0 width=11 height=13 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=15 +char id=202 x=196 y=16 width=11 height=12 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=15 +char id=203 x=210 y=16 width=11 height=12 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=15 +char id=204 x=933 y=0 width=8 height=13 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=15 +char id=205 x=899 y=0 width=9 height=13 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=15 +char id=206 x=481 y=16 width=8 height=12 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=15 +char id=207 x=492 y=16 width=8 height=12 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=15 +char id=208 x=196 y=44 width=12 height=9 xoffset=0 yoffset=3 xadvance=9 page=0 chnl=15 +char id=209 x=960 y=0 width=13 height=12 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=15 +char id=210 x=564 y=0 width=10 height=13 xoffset=1 yoffset=0 xadvance=9 page=0 chnl=15 +char id=211 x=473 y=0 width=10 height=13 xoffset=1 yoffset=0 xadvance=9 page=0 chnl=15 +char id=212 x=486 y=0 width=10 height=13 xoffset=1 yoffset=0 xadvance=9 page=0 chnl=15 +char id=213 x=291 y=16 width=10 height=12 xoffset=1 yoffset=0 xadvance=9 page=0 chnl=15 +char id=214 x=330 y=16 width=10 height=12 xoffset=1 yoffset=0 xadvance=9 page=0 chnl=15 +char id=215 x=874 y=42 width=9 height=7 xoffset=0 yoffset=5 xadvance=7 page=0 chnl=15 +char id=216 x=944 y=0 width=13 height=12 xoffset=0 yoffset=2 xadvance=9 page=0 chnl=15 +char id=217 x=263 y=0 width=11 height=13 xoffset=2 yoffset=0 xadvance=9 page=0 chnl=15 +char id=218 x=347 y=0 width=11 height=13 xoffset=2 yoffset=0 xadvance=9 page=0 chnl=15 +char id=219 x=291 y=0 width=11 height=13 xoffset=2 yoffset=0 xadvance=9 page=0 chnl=15 +char id=220 x=70 y=16 width=11 height=12 xoffset=2 yoffset=0 xadvance=9 page=0 chnl=15 +char id=221 x=277 y=0 width=11 height=13 xoffset=2 yoffset=0 xadvance=9 page=0 chnl=15 +char id=222 x=309 y=44 width=10 height=9 xoffset=0 yoffset=3 xadvance=7 page=0 chnl=15 +char id=223 x=290 y=31 width=9 height=10 xoffset=0 yoffset=2 xadvance=6 page=0 chnl=15 +char id=224 x=899 y=29 width=7 height=10 xoffset=0 yoffset=2 xadvance=6 page=0 chnl=15 +char id=225 x=566 y=31 width=8 height=10 xoffset=0 yoffset=2 xadvance=6 page=0 chnl=15 +char id=226 x=919 y=29 width=7 height=10 xoffset=0 yoffset=2 xadvance=6 page=0 chnl=15 +char id=227 x=545 y=44 width=8 height=9 xoffset=0 yoffset=3 xadvance=6 page=0 chnl=15 +char id=228 x=523 y=44 width=8 height=9 xoffset=0 yoffset=3 xadvance=6 page=0 chnl=15 +char id=229 x=731 y=16 width=7 height=11 xoffset=0 yoffset=2 xadvance=6 page=0 chnl=15 +char id=230 x=836 y=42 width=10 height=7 xoffset=0 yoffset=5 xadvance=8 page=0 chnl=15 +char id=231 x=829 y=29 width=7 height=10 xoffset=0 yoffset=5 xadvance=6 page=0 chnl=15 +char id=232 x=1007 y=28 width=6 height=10 xoffset=1 yoffset=2 xadvance=6 page=0 chnl=15 +char id=233 x=849 y=29 width=7 height=10 xoffset=1 yoffset=2 xadvance=6 page=0 chnl=15 +char id=234 x=869 y=29 width=7 height=10 xoffset=1 yoffset=2 xadvance=6 page=0 chnl=15 +char id=235 x=627 y=43 width=7 height=9 xoffset=1 yoffset=3 xadvance=6 page=0 chnl=15 +char id=236 x=998 y=28 width=6 height=10 xoffset=0 yoffset=2 xadvance=3 page=0 chnl=15 +char id=237 x=819 y=29 width=7 height=10 xoffset=0 yoffset=2 xadvance=3 page=0 chnl=15 +char id=238 x=949 y=28 width=7 height=10 xoffset=0 yoffset=2 xadvance=3 page=0 chnl=15 +char id=239 x=577 y=44 width=7 height=9 xoffset=0 yoffset=3 xadvance=3 page=0 chnl=15 +char id=240 x=808 y=29 width=8 height=10 xoffset=1 yoffset=2 xadvance=6 page=0 chnl=15 +char id=241 x=421 y=44 width=9 height=9 xoffset=0 yoffset=3 xadvance=6 page=0 chnl=15 +char id=242 x=959 y=28 width=7 height=10 xoffset=1 yoffset=2 xadvance=6 page=0 chnl=15 +char id=243 x=775 y=29 width=8 height=10 xoffset=1 yoffset=2 xadvance=6 page=0 chnl=15 +char id=244 x=939 y=29 width=7 height=10 xoffset=1 yoffset=2 xadvance=6 page=0 chnl=15 +char id=245 x=512 y=44 width=8 height=9 xoffset=1 yoffset=3 xadvance=6 page=0 chnl=15 +char id=246 x=501 y=44 width=8 height=9 xoffset=1 yoffset=3 xadvance=6 page=0 chnl=15 +char id=247 x=769 y=42 width=8 height=8 xoffset=1 yoffset=4 xadvance=7 page=0 chnl=15 +char id=248 x=409 y=44 width=9 height=9 xoffset=0 yoffset=4 xadvance=6 page=0 chnl=15 +char id=249 x=889 y=29 width=7 height=10 xoffset=1 yoffset=2 xadvance=6 page=0 chnl=15 +char id=250 x=764 y=29 width=8 height=10 xoffset=1 yoffset=2 xadvance=6 page=0 chnl=15 +char id=251 x=909 y=29 width=7 height=10 xoffset=1 yoffset=2 xadvance=6 page=0 chnl=15 +char id=252 x=617 y=43 width=7 height=9 xoffset=1 yoffset=3 xadvance=6 page=0 chnl=15 +char id=253 x=743 y=0 width=9 height=13 xoffset=0 yoffset=2 xadvance=6 page=0 chnl=15 +char id=254 x=731 y=0 width=9 height=13 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=15 +char id=255 x=355 y=16 width=9 height=12 xoffset=0 yoffset=3 xadvance=6 page=0 chnl=15 +char id=256 x=620 y=16 width=11 height=11 xoffset=0 yoffset=1 xadvance=9 page=0 chnl=15 +char id=257 x=490 y=44 width=8 height=9 xoffset=0 yoffset=4 xadvance=6 page=0 chnl=15 +char id=258 x=361 y=0 width=11 height=13 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=15 +char id=259 x=731 y=30 width=8 height=10 xoffset=0 yoffset=3 xadvance=6 page=0 chnl=15 +char id=260 x=56 y=17 width=11 height=12 xoffset=0 yoffset=2 xadvance=9 page=0 chnl=15 +char id=261 x=647 y=43 width=7 height=9 xoffset=0 yoffset=5 xadvance=6 page=0 chnl=15 +char id=262 x=538 y=0 width=10 height=13 xoffset=1 yoffset=0 xadvance=9 page=0 chnl=15 +char id=263 x=709 y=30 width=8 height=10 xoffset=1 yoffset=2 xadvance=6 page=0 chnl=15 +char id=264 x=551 y=0 width=10 height=13 xoffset=1 yoffset=0 xadvance=9 page=0 chnl=15 +char id=265 x=969 y=28 width=7 height=10 xoffset=1 yoffset=2 xadvance=6 page=0 chnl=15 +char id=266 x=278 y=16 width=10 height=12 xoffset=1 yoffset=0 xadvance=9 page=0 chnl=15 +char id=267 x=657 y=43 width=7 height=9 xoffset=1 yoffset=3 xadvance=6 page=0 chnl=15 +char id=268 x=525 y=0 width=10 height=13 xoffset=1 yoffset=0 xadvance=9 page=0 chnl=15 +char id=269 x=621 y=30 width=8 height=10 xoffset=1 yoffset=2 xadvance=6 page=0 chnl=15 +char id=270 x=178 y=0 width=12 height=13 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=15 +char id=271 x=79 y=31 width=10 height=10 xoffset=1 yoffset=2 xadvance=8 page=0 chnl=15 +char id=272 x=211 y=44 width=12 height=9 xoffset=0 yoffset=3 xadvance=9 page=0 chnl=15 +char id=273 x=386 y=31 width=9 height=10 xoffset=1 yoffset=2 xadvance=6 page=0 chnl=15 +char id=274 x=634 y=16 width=11 height=11 xoffset=0 yoffset=1 xadvance=8 page=0 chnl=15 +char id=275 x=637 y=43 width=7 height=9 xoffset=1 yoffset=4 xadvance=6 page=0 chnl=15 +char id=276 x=98 y=16 width=11 height=12 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=15 +char id=277 x=720 y=30 width=8 height=10 xoffset=1 yoffset=2 xadvance=6 page=0 chnl=15 +char id=278 x=126 y=16 width=11 height=12 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=15 +char id=279 x=676 y=43 width=6 height=9 xoffset=1 yoffset=3 xadvance=6 page=0 chnl=15 +char id=280 x=84 y=16 width=11 height=12 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=15 +char id=281 x=667 y=43 width=6 height=9 xoffset=1 yoffset=5 xadvance=6 page=0 chnl=15 +char id=282 x=112 y=16 width=11 height=12 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=15 +char id=283 x=753 y=30 width=8 height=10 xoffset=1 yoffset=2 xadvance=6 page=0 chnl=15 +char id=284 x=668 y=0 width=10 height=13 xoffset=1 yoffset=0 xadvance=9 page=0 chnl=15 +char id=285 x=815 y=0 width=9 height=13 xoffset=0 yoffset=2 xadvance=6 page=0 chnl=15 +char id=286 x=642 y=0 width=10 height=13 xoffset=1 yoffset=0 xadvance=9 page=0 chnl=15 +char id=287 x=863 y=0 width=9 height=13 xoffset=0 yoffset=2 xadvance=6 page=0 chnl=15 +char id=288 x=252 y=16 width=10 height=12 xoffset=1 yoffset=0 xadvance=9 page=0 chnl=15 +char id=289 x=367 y=16 width=9 height=12 xoffset=0 yoffset=3 xadvance=6 page=0 chnl=15 +char id=290 x=16 y=0 width=10 height=14 xoffset=1 yoffset=2 xadvance=9 page=0 chnl=15 +char id=291 x=41 y=0 width=9 height=14 xoffset=0 yoffset=1 xadvance=6 page=0 chnl=15 +char id=292 x=162 y=0 width=13 height=13 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=15 +char id=293 x=755 y=0 width=9 height=13 xoffset=0 yoffset=0 xadvance=6 page=0 chnl=15 +char id=294 x=117 y=44 width=13 height=9 xoffset=0 yoffset=3 xadvance=9 page=0 chnl=15 +char id=295 x=786 y=29 width=8 height=10 xoffset=0 yoffset=2 xadvance=6 page=0 chnl=15 +char id=296 x=343 y=16 width=9 height=12 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=15 +char id=297 x=567 y=44 width=7 height=9 xoffset=0 yoffset=3 xadvance=3 page=0 chnl=15 +char id=298 x=687 y=16 width=8 height=11 xoffset=0 yoffset=1 xadvance=4 page=0 chnl=15 +char id=299 x=780 y=42 width=7 height=8 xoffset=0 yoffset=4 xadvance=3 page=0 chnl=15 +char id=300 x=779 y=0 width=9 height=13 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=15 +char id=301 x=597 y=44 width=7 height=9 xoffset=0 yoffset=3 xadvance=3 page=0 chnl=15 +char id=302 x=448 y=16 width=8 height=12 xoffset=0 yoffset=3 xadvance=4 page=0 chnl=15 +char id=303 x=571 y=16 width=6 height=12 xoffset=0 yoffset=2 xadvance=3 page=0 chnl=15 +char id=304 x=459 y=16 width=8 height=12 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=15 +char id=305 x=0 y=58 width=5 height=7 xoffset=0 yoffset=5 xadvance=3 page=0 chnl=15 +char id=306 x=844 y=16 width=13 height=10 xoffset=0 yoffset=3 xadvance=9 page=0 chnl=15 +char id=307 x=851 y=0 width=9 height=13 xoffset=0 yoffset=2 xadvance=7 page=0 chnl=15 +char id=308 x=839 y=0 width=9 height=13 xoffset=0 yoffset=0 xadvance=5 page=0 chnl=15 +char id=309 x=827 y=0 width=9 height=13 xoffset=-2 yoffset=2 xadvance=3 page=0 chnl=15 +char id=310 x=130 y=0 width=13 height=13 xoffset=0 yoffset=3 xadvance=9 page=0 chnl=15 +char id=311 x=29 y=0 width=9 height=14 xoffset=0 yoffset=2 xadvance=6 page=0 chnl=15 +char id=312 x=862 y=42 width=9 height=7 xoffset=0 yoffset=5 xadvance=6 page=0 chnl=15 +char id=313 x=707 y=0 width=9 height=13 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=15 +char id=314 x=911 y=0 width=8 height=13 xoffset=0 yoffset=0 xadvance=3 page=0 chnl=15 +char id=315 x=791 y=0 width=9 height=13 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=15 +char id=316 x=53 y=0 width=7 height=14 xoffset=0 yoffset=2 xadvance=3 page=0 chnl=15 +char id=317 x=118 y=31 width=10 height=10 xoffset=0 yoffset=2 xadvance=8 page=0 chnl=15 +char id=318 x=511 y=31 width=8 height=10 xoffset=0 yoffset=2 xadvance=5 page=0 chnl=15 +char id=319 x=445 y=44 width=9 height=9 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=15 +char id=320 x=879 y=29 width=7 height=10 xoffset=0 yoffset=2 xadvance=6 page=0 chnl=15 +char id=321 x=385 y=44 width=9 height=9 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=15 +char id=322 x=0 y=45 width=6 height=10 xoffset=0 yoffset=2 xadvance=3 page=0 chnl=15 +char id=323 x=98 y=0 width=13 height=13 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=15 +char id=324 x=314 y=31 width=9 height=10 xoffset=0 yoffset=2 xadvance=6 page=0 chnl=15 +char id=325 x=114 y=0 width=13 height=13 xoffset=0 yoffset=3 xadvance=9 page=0 chnl=15 +char id=326 x=709 y=16 width=8 height=11 xoffset=0 yoffset=5 xadvance=6 page=0 chnl=15 +char id=327 x=146 y=0 width=13 height=13 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=15 +char id=328 x=266 y=31 width=9 height=10 xoffset=0 yoffset=2 xadvance=6 page=0 chnl=15 +char id=329 x=610 y=30 width=8 height=10 xoffset=0 yoffset=2 xadvance=7 page=0 chnl=15 +char id=330 x=903 y=16 width=11 height=10 xoffset=0 yoffset=2 xadvance=9 page=0 chnl=15 +char id=331 x=643 y=30 width=8 height=10 xoffset=0 yoffset=5 xadvance=6 page=0 chnl=15 +char id=332 x=317 y=16 width=10 height=12 xoffset=1 yoffset=1 xadvance=9 page=0 chnl=15 +char id=333 x=534 y=44 width=8 height=9 xoffset=1 yoffset=4 xadvance=6 page=0 chnl=15 +char id=334 x=512 y=0 width=10 height=13 xoffset=1 yoffset=0 xadvance=9 page=0 chnl=15 +char id=335 x=676 y=30 width=8 height=10 xoffset=1 yoffset=3 xadvance=6 page=0 chnl=15 +char id=336 x=445 y=0 width=11 height=13 xoffset=1 yoffset=0 xadvance=9 page=0 chnl=15 +char id=337 x=218 y=31 width=9 height=10 xoffset=1 yoffset=2 xadvance=6 page=0 chnl=15 +char id=338 x=811 y=16 width=14 height=10 xoffset=1 yoffset=2 xadvance=12 page=0 chnl=15 +char id=339 x=849 y=42 width=10 height=7 xoffset=1 yoffset=5 xadvance=9 page=0 chnl=15 +char id=340 x=655 y=0 width=10 height=13 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=15 +char id=341 x=742 y=30 width=8 height=10 xoffset=0 yoffset=2 xadvance=4 page=0 chnl=15 +char id=342 x=629 y=0 width=10 height=13 xoffset=0 yoffset=3 xadvance=9 page=0 chnl=15 +char id=343 x=720 y=16 width=8 height=11 xoffset=-1 yoffset=5 xadvance=4 page=0 chnl=15 +char id=344 x=140 y=16 width=11 height=12 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=15 +char id=345 x=665 y=30 width=8 height=10 xoffset=0 yoffset=2 xadvance=4 page=0 chnl=15 +char id=346 x=616 y=0 width=10 height=13 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=15 +char id=347 x=478 y=31 width=8 height=10 xoffset=0 yoffset=2 xadvance=5 page=0 chnl=15 +char id=348 x=767 y=0 width=9 height=13 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=15 +char id=349 x=859 y=29 width=7 height=10 xoffset=0 yoffset=2 xadvance=5 page=0 chnl=15 +char id=350 x=803 y=0 width=9 height=13 xoffset=0 yoffset=2 xadvance=7 page=0 chnl=15 +char id=351 x=929 y=29 width=7 height=10 xoffset=0 yoffset=5 xadvance=5 page=0 chnl=15 +char id=352 x=603 y=0 width=10 height=13 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=15 +char id=353 x=445 y=31 width=8 height=10 xoffset=0 yoffset=2 xadvance=5 page=0 chnl=15 +char id=354 x=304 y=16 width=10 height=12 xoffset=1 yoffset=3 xadvance=8 page=0 chnl=15 +char id=355 x=751 y=16 width=6 height=11 xoffset=0 yoffset=4 xadvance=3 page=0 chnl=15 +char id=356 x=875 y=0 width=9 height=13 xoffset=2 yoffset=0 xadvance=8 page=0 chnl=15 +char id=357 x=456 y=31 width=8 height=10 xoffset=1 yoffset=2 xadvance=5 page=0 chnl=15 +char id=358 x=373 y=44 width=9 height=9 xoffset=2 yoffset=3 xadvance=8 page=0 chnl=15 +char id=359 x=685 y=43 width=5 height=9 xoffset=1 yoffset=4 xadvance=3 page=0 chnl=15 +char id=360 x=28 y=17 width=11 height=12 xoffset=2 yoffset=0 xadvance=9 page=0 chnl=15 +char id=361 x=556 y=44 width=8 height=9 xoffset=1 yoffset=3 xadvance=6 page=0 chnl=15 +char id=362 x=0 y=17 width=11 height=12 xoffset=2 yoffset=1 xadvance=9 page=0 chnl=15 +char id=363 x=607 y=43 width=7 height=9 xoffset=1 yoffset=4 xadvance=6 page=0 chnl=15 +char id=364 x=207 y=0 width=11 height=13 xoffset=2 yoffset=0 xadvance=9 page=0 chnl=15 +char id=365 x=434 y=31 width=8 height=10 xoffset=1 yoffset=3 xadvance=6 page=0 chnl=15 +char id=366 x=221 y=0 width=11 height=13 xoffset=2 yoffset=0 xadvance=9 page=0 chnl=15 +char id=367 x=741 y=16 width=7 height=11 xoffset=1 yoffset=2 xadvance=6 page=0 chnl=15 +char id=368 x=235 y=0 width=11 height=13 xoffset=2 yoffset=0 xadvance=9 page=0 chnl=15 +char id=369 x=350 y=31 width=9 height=10 xoffset=1 yoffset=2 xadvance=6 page=0 chnl=15 +char id=370 x=154 y=16 width=11 height=12 xoffset=2 yoffset=3 xadvance=9 page=0 chnl=15 +char id=371 x=587 y=44 width=7 height=9 xoffset=1 yoffset=5 xadvance=6 page=0 chnl=15 +char id=372 x=81 y=0 width=14 height=13 xoffset=2 yoffset=0 xadvance=12 page=0 chnl=15 +char id=373 x=157 y=31 width=10 height=10 xoffset=2 yoffset=2 xadvance=9 page=0 chnl=15 +char id=374 x=459 y=0 width=11 height=13 xoffset=2 yoffset=0 xadvance=9 page=0 chnl=15 +char id=375 x=887 y=0 width=9 height=13 xoffset=0 yoffset=2 xadvance=6 page=0 chnl=15 +char id=376 x=224 y=16 width=11 height=12 xoffset=2 yoffset=0 xadvance=9 page=0 chnl=15 +char id=377 x=305 y=0 width=11 height=13 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=15 +char id=378 x=422 y=31 width=9 height=10 xoffset=0 yoffset=2 xadvance=6 page=0 chnl=15 +char id=379 x=14 y=17 width=11 height=12 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=15 +char id=380 x=457 y=44 width=8 height=9 xoffset=0 yoffset=3 xadvance=6 page=0 chnl=15 +char id=381 x=238 y=16 width=11 height=12 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=15 +char id=382 x=326 y=31 width=9 height=10 xoffset=0 yoffset=2 xadvance=6 page=0 chnl=15 +char id=383 x=338 y=31 width=9 height=10 xoffset=0 yoffset=2 xadvance=4 page=0 chnl=15 +char id=399 x=144 y=31 width=10 height=10 xoffset=1 yoffset=2 xadvance=9 page=0 chnl=15 +char id=402 x=590 y=0 width=10 height=13 xoffset=-1 yoffset=2 xadvance=5 page=0 chnl=15 +char id=416 x=1006 y=0 width=12 height=12 xoffset=1 yoffset=1 xadvance=9 page=0 chnl=15 +char id=417 x=745 y=43 width=9 height=8 xoffset=1 yoffset=4 xadvance=7 page=0 chnl=15 +char id=431 x=991 y=0 width=12 height=12 xoffset=2 yoffset=1 xadvance=10 page=0 chnl=15 +char id=432 x=757 y=43 width=9 height=8 xoffset=1 yoffset=4 xadvance=7 page=0 chnl=15 +char id=461 x=976 y=0 width=12 height=12 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=15 +char id=462 x=698 y=30 width=8 height=10 xoffset=0 yoffset=2 xadvance=6 page=0 chnl=15 +char id=463 x=379 y=16 width=9 height=12 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=15 +char id=464 x=839 y=29 width=7 height=10 xoffset=0 yoffset=2 xadvance=3 page=0 chnl=15 +char id=465 x=577 y=0 width=10 height=13 xoffset=1 yoffset=0 xadvance=9 page=0 chnl=15 +char id=466 x=599 y=30 width=8 height=10 xoffset=1 yoffset=2 xadvance=6 page=0 chnl=15 +char id=467 x=319 y=0 width=11 height=13 xoffset=2 yoffset=0 xadvance=9 page=0 chnl=15 +char id=468 x=588 y=31 width=8 height=10 xoffset=1 yoffset=2 xadvance=6 page=0 chnl=15 +char id=469 x=333 y=0 width=11 height=13 xoffset=2 yoffset=0 xadvance=9 page=0 chnl=15 +char id=470 x=698 y=16 width=8 height=11 xoffset=1 yoffset=2 xadvance=6 page=0 chnl=15 +char id=471 x=375 y=0 width=11 height=13 xoffset=2 yoffset=0 xadvance=9 page=0 chnl=15 +char id=472 x=426 y=16 width=8 height=12 xoffset=1 yoffset=1 xadvance=6 page=0 chnl=15 +char id=473 x=389 y=0 width=11 height=13 xoffset=2 yoffset=0 xadvance=9 page=0 chnl=15 +char id=474 x=470 y=16 width=8 height=12 xoffset=1 yoffset=1 xadvance=6 page=0 chnl=15 +char id=475 x=403 y=0 width=11 height=13 xoffset=2 yoffset=0 xadvance=9 page=0 chnl=15 +char id=476 x=533 y=16 width=7 height=12 xoffset=1 yoffset=1 xadvance=6 page=0 chnl=15 +char id=506 x=249 y=0 width=11 height=13 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=15 +char id=507 x=719 y=0 width=9 height=13 xoffset=0 yoffset=0 xadvance=6 page=0 chnl=15 +char id=508 x=63 y=0 width=15 height=13 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=15 +char id=509 x=53 y=32 width=10 height=10 xoffset=0 yoffset=2 xadvance=8 page=0 chnl=15 +char id=510 x=0 y=0 width=13 height=14 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=15 +char id=511 x=675 y=16 width=9 height=11 xoffset=0 yoffset=2 xadvance=6 page=0 chnl=15 +char id=710 x=268 y=56 width=5 height=3 xoffset=2 yoffset=2 xadvance=4 page=0 chnl=15 +char id=711 x=276 y=56 width=5 height=3 xoffset=3 yoffset=2 xadvance=4 page=0 chnl=15 +char id=713 x=400 y=56 width=5 height=2 xoffset=2 yoffset=3 xadvance=4 page=0 chnl=15 +char id=728 x=284 y=56 width=5 height=3 xoffset=3 yoffset=3 xadvance=4 page=0 chnl=15 +char id=729 x=418 y=56 width=2 height=2 xoffset=4 yoffset=3 xadvance=4 page=0 chnl=15 +char id=730 x=233 y=56 width=3 height=4 xoffset=3 yoffset=2 xadvance=4 page=0 chnl=15 +char id=731 x=312 y=56 width=3 height=3 xoffset=0 yoffset=11 xadvance=4 page=0 chnl=15 +char id=732 x=366 y=56 width=6 height=2 xoffset=2 yoffset=3 xadvance=4 page=0 chnl=15 +char id=733 x=249 y=56 width=7 height=3 xoffset=2 yoffset=2 xadvance=5 page=0 chnl=15 +char id=768 x=318 y=56 width=3 height=3 xoffset=-1 yoffset=2 xadvance=0 page=0 chnl=15 +char id=769 x=292 y=56 width=4 height=3 xoffset=-1 yoffset=2 xadvance=0 page=0 chnl=15 +char id=771 x=375 y=56 width=6 height=2 xoffset=-2 yoffset=3 xadvance=0 page=0 chnl=15 +char id=777 x=324 y=56 width=3 height=3 xoffset=-1 yoffset=2 xadvance=0 page=0 chnl=15 +char id=803 x=423 y=56 width=2 height=2 xoffset=-5 yoffset=12 xadvance=0 page=0 chnl=15 +char id=8204 x=513 y=56 width=1 height=1 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=8205 x=517 y=56 width=1 height=1 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=8206 x=521 y=56 width=1 height=1 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=8207 x=525 y=56 width=1 height=1 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=8211 x=464 y=56 width=8 height=1 xoffset=0 yoffset=8 xadvance=6 page=0 chnl=15 +char id=8212 x=428 y=56 width=15 height=1 xoffset=0 yoffset=8 xadvance=13 page=0 chnl=15 +char id=8213 x=446 y=56 width=15 height=1 xoffset=0 yoffset=8 xadvance=13 page=0 chnl=15 +char id=8215 x=259 y=56 width=6 height=3 xoffset=0 yoffset=12 xadvance=6 page=0 chnl=15 +char id=8216 x=215 y=56 width=3 height=4 xoffset=3 yoffset=2 xadvance=3 page=0 chnl=15 +char id=8217 x=227 y=56 width=3 height=4 xoffset=3 yoffset=2 xadvance=3 page=0 chnl=15 +char id=8218 x=221 y=56 width=3 height=4 xoffset=0 yoffset=10 xadvance=3 page=0 chnl=15 +char id=8219 x=203 y=56 width=3 height=4 xoffset=3 yoffset=2 xadvance=3 page=0 chnl=15 +char id=8220 x=174 y=56 width=5 height=4 xoffset=3 yoffset=2 xadvance=6 page=0 chnl=15 +char id=8221 x=166 y=56 width=5 height=4 xoffset=3 yoffset=2 xadvance=6 page=0 chnl=15 +char id=8222 x=149 y=56 width=6 height=4 xoffset=0 yoffset=10 xadvance=6 page=0 chnl=15 +char id=8224 x=562 y=16 width=6 height=12 xoffset=2 yoffset=2 xadvance=6 page=0 chnl=15 +char id=8225 x=437 y=16 width=8 height=12 xoffset=1 yoffset=2 xadvance=6 page=0 chnl=15 +char id=8226 x=158 y=56 width=5 height=4 xoffset=1 yoffset=5 xadvance=4 page=0 chnl=15 +char id=8230 x=330 y=56 width=11 height=2 xoffset=1 yoffset=10 xadvance=13 page=0 chnl=15 +char id=8234 x=497 y=56 width=1 height=1 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=8235 x=501 y=56 width=1 height=1 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=8236 x=505 y=56 width=1 height=1 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=8237 x=509 y=56 width=1 height=1 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=8238 x=529 y=56 width=1 height=1 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=8240 x=589 y=16 width=14 height=11 xoffset=1 yoffset=2 xadvance=13 page=0 chnl=15 +char id=8242 x=189 y=56 width=4 height=4 xoffset=2 yoffset=2 xadvance=3 page=0 chnl=15 +char id=8243 x=139 y=56 width=7 height=4 xoffset=2 yoffset=2 xadvance=5 page=0 chnl=15 +char id=8249 x=70 y=57 width=5 height=6 xoffset=1 yoffset=6 xadvance=3 page=0 chnl=15 +char id=8250 x=62 y=58 width=5 height=6 xoffset=0 yoffset=6 xadvance=3 page=0 chnl=15 +char id=8252 x=92 y=31 width=10 height=10 xoffset=1 yoffset=2 xadvance=9 page=0 chnl=15 +char id=8254 x=355 y=56 width=8 height=2 xoffset=2 yoffset=3 xadvance=6 page=0 chnl=15 +char id=8260 x=917 y=16 width=11 height=10 xoffset=-2 yoffset=2 xadvance=2 page=0 chnl=15 +char id=8355 x=226 y=44 width=11 height=9 xoffset=0 yoffset=3 xadvance=7 page=0 chnl=15 +char id=8356 x=182 y=31 width=9 height=10 xoffset=0 yoffset=2 xadvance=6 page=0 chnl=15 +char id=8359 x=794 y=16 width=14 height=10 xoffset=0 yoffset=3 xadvance=12 page=0 chnl=15 +char id=8362 x=149 y=44 width=13 height=9 xoffset=0 yoffset=3 xadvance=11 page=0 chnl=15 +char id=8363 x=662 y=16 width=10 height=11 xoffset=0 yoffset=1 xadvance=7 page=0 chnl=15 +char id=8364 x=931 y=16 width=11 height=10 xoffset=1 yoffset=2 xadvance=10 page=0 chnl=15 +char id=8453 x=959 y=15 width=11 height=10 xoffset=1 yoffset=2 xadvance=10 page=0 chnl=15 +char id=8467 x=654 y=30 width=8 height=10 xoffset=1 yoffset=2 xadvance=5 page=0 chnl=15 +char id=8470 x=760 y=16 width=14 height=10 xoffset=0 yoffset=3 xadvance=11 page=0 chnl=15 +char id=8482 x=790 y=42 width=15 height=7 xoffset=2 yoffset=2 xadvance=13 page=0 chnl=15 +char id=8486 x=860 y=16 width=12 height=10 xoffset=0 yoffset=2 xadvance=10 page=0 chnl=15 +char id=8494 x=886 y=42 width=8 height=7 xoffset=1 yoffset=5 xadvance=7 page=0 chnl=15 +kernings count=620 +kerning first=212 second=260 amount=-1 +kerning first=212 second=256 amount=-1 +kerning first=212 second=198 amount=-1 +kerning first=44 second=8217 amount=-1 +kerning first=44 second=8220 amount=-1 +kerning first=44 second=8221 amount=-1 +kerning first=212 second=197 amount=-1 +kerning first=45 second=65 amount=-1 +kerning first=45 second=66 amount=-1 +kerning first=45 second=68 amount=-1 +kerning first=45 second=69 amount=-1 +kerning first=45 second=70 amount=-1 +kerning first=45 second=72 amount=-1 +kerning first=45 second=73 amount=-1 +kerning first=45 second=74 amount=-1 +kerning first=45 second=75 amount=-1 +kerning first=45 second=76 amount=-1 +kerning first=45 second=77 amount=-1 +kerning first=45 second=78 amount=-1 +kerning first=45 second=80 amount=-1 +kerning first=45 second=82 amount=-1 +kerning first=212 second=196 amount=-1 +kerning first=45 second=84 amount=-1 +kerning first=45 second=85 amount=-1 +kerning first=45 second=86 amount=-1 +kerning first=45 second=87 amount=-1 +kerning first=45 second=89 amount=-1 +kerning first=45 second=90 amount=-1 +kerning first=212 second=194 amount=-1 +kerning first=212 second=193 amount=-1 +kerning first=212 second=192 amount=-1 +kerning first=212 second=65 amount=-1 +kerning first=211 second=260 amount=-1 +kerning first=211 second=256 amount=-1 +kerning first=211 second=198 amount=-1 +kerning first=211 second=197 amount=-1 +kerning first=211 second=196 amount=-1 +kerning first=211 second=194 amount=-1 +kerning first=211 second=193 amount=-1 +kerning first=211 second=192 amount=-1 +kerning first=211 second=65 amount=-1 +kerning first=210 second=260 amount=-1 +kerning first=210 second=256 amount=-1 +kerning first=210 second=198 amount=-1 +kerning first=210 second=197 amount=-1 +kerning first=210 second=196 amount=-1 +kerning first=210 second=194 amount=-1 +kerning first=210 second=193 amount=-1 +kerning first=45 second=122 amount=-1 +kerning first=45 second=192 amount=-1 +kerning first=45 second=193 amount=-1 +kerning first=45 second=194 amount=-1 +kerning first=45 second=195 amount=-1 +kerning first=45 second=196 amount=-1 +kerning first=45 second=197 amount=-1 +kerning first=45 second=198 amount=-1 +kerning first=45 second=200 amount=-1 +kerning first=45 second=201 amount=-1 +kerning first=45 second=202 amount=-1 +kerning first=45 second=203 amount=-1 +kerning first=45 second=204 amount=-1 +kerning first=45 second=205 amount=-1 +kerning first=45 second=206 amount=-1 +kerning first=45 second=207 amount=-1 +kerning first=45 second=209 amount=-1 +kerning first=45 second=217 amount=-1 +kerning first=45 second=218 amount=-1 +kerning first=45 second=219 amount=-1 +kerning first=45 second=220 amount=-1 +kerning first=45 second=221 amount=-1 +kerning first=210 second=192 amount=-1 +kerning first=210 second=65 amount=-1 +kerning first=209 second=8249 amount=-1 +kerning first=209 second=171 amount=-1 +kerning first=209 second=45 amount=-1 +kerning first=208 second=260 amount=-1 +kerning first=208 second=256 amount=-1 +kerning first=208 second=198 amount=-1 +kerning first=208 second=197 amount=-1 +kerning first=208 second=196 amount=-1 +kerning first=208 second=194 amount=-1 +kerning first=208 second=193 amount=-1 +kerning first=208 second=192 amount=-1 +kerning first=208 second=65 amount=-1 +kerning first=206 second=8249 amount=-1 +kerning first=206 second=171 amount=-1 +kerning first=45 second=256 amount=-1 +kerning first=206 second=45 amount=-1 +kerning first=199 second=8249 amount=-1 +kerning first=45 second=260 amount=-1 +kerning first=199 second=171 amount=-1 +kerning first=45 second=270 amount=-1 +kerning first=45 second=274 amount=-1 +kerning first=45 second=278 amount=-1 +kerning first=45 second=280 amount=-1 +kerning first=45 second=282 amount=-1 +kerning first=199 second=45 amount=-1 +kerning first=197 second=8249 amount=-1 +kerning first=197 second=8221 amount=-1 +kerning first=45 second=296 amount=-1 +kerning first=45 second=298 amount=-1 +kerning first=45 second=302 amount=-1 +kerning first=197 second=8220 amount=-1 +kerning first=197 second=8217 amount=-1 +kerning first=197 second=374 amount=-1 +kerning first=45 second=310 amount=-1 +kerning first=197 second=356 amount=-1 +kerning first=45 second=313 amount=-1 +kerning first=197 second=354 amount=-1 +kerning first=45 second=315 amount=-1 +kerning first=197 second=221 amount=-1 +kerning first=45 second=317 amount=-1 +kerning first=197 second=171 amount=-1 +kerning first=45 second=323 amount=-1 +kerning first=197 second=89 amount=-1 +kerning first=45 second=325 amount=-1 +kerning first=197 second=87 amount=-1 +kerning first=45 second=327 amount=-1 +kerning first=197 second=86 amount=-1 +kerning first=45 second=330 amount=-1 +kerning first=197 second=84 amount=-1 +kerning first=45 second=344 amount=-1 +kerning first=197 second=45 amount=-1 +kerning first=196 second=8249 amount=-1 +kerning first=196 second=8221 amount=-1 +kerning first=196 second=8220 amount=-1 +kerning first=196 second=8217 amount=-1 +kerning first=196 second=374 amount=-1 +kerning first=196 second=356 amount=-1 +kerning first=45 second=354 amount=-1 +kerning first=196 second=354 amount=-1 +kerning first=45 second=356 amount=-1 +kerning first=196 second=221 amount=-1 +kerning first=196 second=171 amount=-1 +kerning first=45 second=362 amount=-1 +kerning first=196 second=89 amount=-1 +kerning first=45 second=364 amount=-1 +kerning first=196 second=87 amount=-1 +kerning first=45 second=366 amount=-1 +kerning first=196 second=86 amount=-1 +kerning first=45 second=368 amount=-1 +kerning first=196 second=84 amount=-1 +kerning first=45 second=370 amount=-1 +kerning first=196 second=45 amount=-1 +kerning first=45 second=374 amount=-1 +kerning first=195 second=8249 amount=-1 +kerning first=45 second=377 amount=-1 +kerning first=45 second=378 amount=-1 +kerning first=45 second=379 amount=-1 +kerning first=45 second=380 amount=-1 +kerning first=45 second=381 amount=-1 +kerning first=45 second=382 amount=-1 +kerning first=195 second=8221 amount=-1 +kerning first=195 second=8220 amount=-1 +kerning first=195 second=8217 amount=-1 +kerning first=195 second=374 amount=-1 +kerning first=195 second=356 amount=-1 +kerning first=195 second=354 amount=-1 +kerning first=195 second=221 amount=-1 +kerning first=195 second=171 amount=-1 +kerning first=195 second=89 amount=-1 +kerning first=195 second=87 amount=-1 +kerning first=195 second=86 amount=-1 +kerning first=195 second=84 amount=-1 +kerning first=195 second=45 amount=-1 +kerning first=194 second=8249 amount=-1 +kerning first=194 second=8221 amount=-1 +kerning first=194 second=8220 amount=-1 +kerning first=194 second=8217 amount=-1 +kerning first=194 second=374 amount=-1 +kerning first=194 second=356 amount=-1 +kerning first=194 second=354 amount=-1 +kerning first=194 second=221 amount=-1 +kerning first=194 second=171 amount=-1 +kerning first=194 second=89 amount=-1 +kerning first=194 second=87 amount=-1 +kerning first=194 second=86 amount=-1 +kerning first=194 second=84 amount=-1 +kerning first=194 second=45 amount=-1 +kerning first=193 second=8249 amount=-1 +kerning first=193 second=8221 amount=-1 +kerning first=193 second=8220 amount=-1 +kerning first=193 second=8217 amount=-1 +kerning first=193 second=374 amount=-1 +kerning first=46 second=8217 amount=-1 +kerning first=46 second=8220 amount=-1 +kerning first=46 second=8221 amount=-1 +kerning first=193 second=356 amount=-1 +kerning first=65 second=45 amount=-1 +kerning first=193 second=354 amount=-1 +kerning first=193 second=221 amount=-1 +kerning first=193 second=171 amount=-1 +kerning first=193 second=89 amount=-1 +kerning first=193 second=87 amount=-1 +kerning first=65 second=84 amount=-1 +kerning first=193 second=86 amount=-1 +kerning first=65 second=86 amount=-1 +kerning first=65 second=87 amount=-1 +kerning first=65 second=89 amount=-1 +kerning first=193 second=84 amount=-1 +kerning first=193 second=45 amount=-1 +kerning first=192 second=8249 amount=-1 +kerning first=192 second=8221 amount=-1 +kerning first=192 second=8220 amount=-1 +kerning first=192 second=8217 amount=-1 +kerning first=192 second=374 amount=-1 +kerning first=192 second=356 amount=-1 +kerning first=192 second=354 amount=-1 +kerning first=192 second=221 amount=-1 +kerning first=192 second=171 amount=-1 +kerning first=192 second=89 amount=-1 +kerning first=192 second=87 amount=-1 +kerning first=192 second=86 amount=-1 +kerning first=192 second=84 amount=-1 +kerning first=192 second=45 amount=-1 +kerning first=187 second=382 amount=-1 +kerning first=187 second=381 amount=-1 +kerning first=187 second=380 amount=-1 +kerning first=65 second=171 amount=-1 +kerning first=187 second=379 amount=-1 +kerning first=187 second=378 amount=-1 +kerning first=187 second=377 amount=-1 +kerning first=187 second=374 amount=-1 +kerning first=187 second=370 amount=-1 +kerning first=187 second=368 amount=-1 +kerning first=187 second=366 amount=-1 +kerning first=187 second=364 amount=-1 +kerning first=187 second=362 amount=-1 +kerning first=187 second=356 amount=-1 +kerning first=187 second=354 amount=-1 +kerning first=65 second=221 amount=-1 +kerning first=187 second=344 amount=-1 +kerning first=187 second=330 amount=-1 +kerning first=187 second=327 amount=-1 +kerning first=187 second=325 amount=-1 +kerning first=187 second=323 amount=-1 +kerning first=187 second=317 amount=-1 +kerning first=187 second=315 amount=-1 +kerning first=187 second=313 amount=-1 +kerning first=187 second=310 amount=-1 +kerning first=187 second=302 amount=-1 +kerning first=187 second=298 amount=-1 +kerning first=187 second=296 amount=-1 +kerning first=187 second=282 amount=-1 +kerning first=187 second=280 amount=-1 +kerning first=187 second=278 amount=-1 +kerning first=187 second=274 amount=-1 +kerning first=187 second=270 amount=-1 +kerning first=187 second=260 amount=-1 +kerning first=187 second=256 amount=-1 +kerning first=187 second=221 amount=-1 +kerning first=187 second=220 amount=-1 +kerning first=187 second=219 amount=-1 +kerning first=187 second=218 amount=-1 +kerning first=187 second=217 amount=-1 +kerning first=187 second=209 amount=-1 +kerning first=187 second=207 amount=-1 +kerning first=187 second=206 amount=-1 +kerning first=187 second=205 amount=-1 +kerning first=187 second=204 amount=-1 +kerning first=187 second=203 amount=-1 +kerning first=187 second=202 amount=-1 +kerning first=187 second=201 amount=-1 +kerning first=187 second=200 amount=-1 +kerning first=187 second=198 amount=-1 +kerning first=187 second=197 amount=-1 +kerning first=187 second=196 amount=-1 +kerning first=187 second=195 amount=-1 +kerning first=187 second=194 amount=-1 +kerning first=187 second=193 amount=-1 +kerning first=187 second=192 amount=-1 +kerning first=187 second=122 amount=-1 +kerning first=187 second=90 amount=-1 +kerning first=187 second=89 amount=-1 +kerning first=187 second=87 amount=-1 +kerning first=187 second=86 amount=-1 +kerning first=187 second=85 amount=-1 +kerning first=187 second=84 amount=-1 +kerning first=187 second=82 amount=-1 +kerning first=187 second=80 amount=-1 +kerning first=187 second=78 amount=-1 +kerning first=187 second=77 amount=-1 +kerning first=187 second=76 amount=-1 +kerning first=187 second=75 amount=-1 +kerning first=187 second=74 amount=-1 +kerning first=187 second=73 amount=-1 +kerning first=187 second=72 amount=-1 +kerning first=187 second=70 amount=-1 +kerning first=187 second=69 amount=-1 +kerning first=187 second=68 amount=-1 +kerning first=65 second=354 amount=-1 +kerning first=187 second=66 amount=-1 +kerning first=65 second=356 amount=-1 +kerning first=187 second=65 amount=-1 +kerning first=121 second=8249 amount=-1 +kerning first=121 second=171 amount=-1 +kerning first=121 second=46 amount=-1 +kerning first=121 second=45 amount=-1 +kerning first=121 second=44 amount=-1 +kerning first=119 second=8249 amount=-1 +kerning first=119 second=171 amount=-1 +kerning first=119 second=46 amount=-1 +kerning first=119 second=45 amount=-1 +kerning first=65 second=374 amount=-1 +kerning first=119 second=44 amount=-1 +kerning first=118 second=8249 amount=-1 +kerning first=118 second=171 amount=-1 +kerning first=118 second=46 amount=-1 +kerning first=118 second=45 amount=-1 +kerning first=118 second=44 amount=-1 +kerning first=114 second=46 amount=-1 +kerning first=114 second=44 amount=-1 +kerning first=113 second=106 amount=1 +kerning first=110 second=8221 amount=-1 +kerning first=110 second=8220 amount=-1 +kerning first=110 second=8217 amount=-1 +kerning first=109 second=8221 amount=-1 +kerning first=109 second=8220 amount=-1 +kerning first=109 second=8217 amount=-1 +kerning first=104 second=8221 amount=-1 +kerning first=65 second=8217 amount=-1 +kerning first=65 second=8220 amount=-1 +kerning first=65 second=8221 amount=-1 +kerning first=65 second=8249 amount=-1 +kerning first=104 second=8220 amount=-1 +kerning first=104 second=8217 amount=-1 +kerning first=102 second=254 amount=1 +kerning first=102 second=98 amount=1 +kerning first=89 second=8249 amount=-1 +kerning first=66 second=44 amount=-1 +kerning first=89 second=291 amount=-1 +kerning first=66 second=46 amount=-1 +kerning first=66 second=65 amount=-1 +kerning first=66 second=66 amount=-1 +kerning first=89 second=289 amount=-1 +kerning first=66 second=68 amount=-1 +kerning first=66 second=69 amount=-1 +kerning first=66 second=70 amount=-1 +kerning first=89 second=287 amount=-1 +kerning first=66 second=72 amount=-1 +kerning first=66 second=73 amount=-1 +kerning first=66 second=74 amount=-1 +kerning first=66 second=75 amount=-1 +kerning first=66 second=76 amount=-1 +kerning first=66 second=77 amount=-1 +kerning first=66 second=78 amount=-1 +kerning first=89 second=261 amount=-1 +kerning first=66 second=80 amount=-1 +kerning first=89 second=260 amount=-1 +kerning first=66 second=82 amount=-1 +kerning first=66 second=83 amount=-1 +kerning first=89 second=259 amount=-1 +kerning first=89 second=257 amount=-1 +kerning first=89 second=256 amount=-1 +kerning first=89 second=230 amount=-1 +kerning first=89 second=229 amount=-1 +kerning first=66 second=90 amount=-1 +kerning first=89 second=227 amount=-1 +kerning first=89 second=226 amount=-1 +kerning first=89 second=225 amount=-1 +kerning first=89 second=198 amount=-1 +kerning first=89 second=197 amount=-1 +kerning first=89 second=196 amount=-1 +kerning first=66 second=103 amount=-1 +kerning first=89 second=194 amount=-1 +kerning first=89 second=193 amount=-1 +kerning first=89 second=192 amount=-1 +kerning first=89 second=171 amount=-1 +kerning first=89 second=103 amount=-1 +kerning first=89 second=97 amount=-1 +kerning first=89 second=74 amount=-1 +kerning first=89 second=65 amount=-1 +kerning first=89 second=46 amount=-1 +kerning first=89 second=45 amount=-1 +kerning first=89 second=44 amount=-1 +kerning first=88 second=8249 amount=-1 +kerning first=88 second=171 amount=-1 +kerning first=88 second=45 amount=-1 +kerning first=87 second=8249 amount=-1 +kerning first=87 second=291 amount=-1 +kerning first=87 second=289 amount=-1 +kerning first=87 second=287 amount=-1 +kerning first=66 second=122 amount=-1 +kerning first=87 second=261 amount=-1 +kerning first=87 second=260 amount=-1 +kerning first=66 second=192 amount=-1 +kerning first=66 second=193 amount=-1 +kerning first=66 second=194 amount=-1 +kerning first=66 second=196 amount=-1 +kerning first=66 second=197 amount=-1 +kerning first=66 second=198 amount=-1 +kerning first=87 second=259 amount=-1 +kerning first=66 second=200 amount=-1 +kerning first=66 second=201 amount=-1 +kerning first=66 second=202 amount=-1 +kerning first=66 second=203 amount=-1 +kerning first=66 second=204 amount=-1 +kerning first=66 second=205 amount=-1 +kerning first=66 second=206 amount=-1 +kerning first=66 second=207 amount=-1 +kerning first=66 second=209 amount=-1 +kerning first=87 second=257 amount=-1 +kerning first=87 second=256 amount=-1 +kerning first=87 second=230 amount=-1 +kerning first=87 second=229 amount=-1 +kerning first=87 second=227 amount=-1 +kerning first=87 second=226 amount=-1 +kerning first=87 second=225 amount=-1 +kerning first=87 second=198 amount=-1 +kerning first=87 second=197 amount=-1 +kerning first=87 second=196 amount=-1 +kerning first=87 second=194 amount=-1 +kerning first=87 second=193 amount=-1 +kerning first=87 second=192 amount=-1 +kerning first=87 second=171 amount=-1 +kerning first=87 second=103 amount=-1 +kerning first=87 second=97 amount=-1 +kerning first=87 second=74 amount=-1 +kerning first=87 second=65 amount=-1 +kerning first=87 second=46 amount=-1 +kerning first=87 second=45 amount=-1 +kerning first=87 second=44 amount=-1 +kerning first=86 second=8249 amount=-1 +kerning first=86 second=291 amount=-1 +kerning first=86 second=289 amount=-1 +kerning first=86 second=287 amount=-1 +kerning first=86 second=261 amount=-1 +kerning first=86 second=260 amount=-1 +kerning first=86 second=259 amount=-1 +kerning first=86 second=257 amount=-1 +kerning first=86 second=256 amount=-1 +kerning first=86 second=230 amount=-1 +kerning first=86 second=229 amount=-1 +kerning first=86 second=227 amount=-1 +kerning first=86 second=226 amount=-1 +kerning first=86 second=225 amount=-1 +kerning first=86 second=198 amount=-1 +kerning first=86 second=197 amount=-1 +kerning first=86 second=196 amount=-1 +kerning first=86 second=194 amount=-1 +kerning first=86 second=193 amount=-1 +kerning first=66 second=256 amount=-1 +kerning first=86 second=192 amount=-1 +kerning first=86 second=171 amount=-1 +kerning first=66 second=260 amount=-1 +kerning first=86 second=103 amount=-1 +kerning first=86 second=97 amount=-1 +kerning first=86 second=74 amount=-1 +kerning first=86 second=65 amount=-1 +kerning first=86 second=46 amount=-1 +kerning first=86 second=45 amount=-1 +kerning first=86 second=44 amount=-1 +kerning first=85 second=8249 amount=-1 +kerning first=66 second=270 amount=-1 +kerning first=66 second=274 amount=-1 +kerning first=85 second=291 amount=-1 +kerning first=85 second=289 amount=-1 +kerning first=66 second=278 amount=-1 +kerning first=85 second=287 amount=-1 +kerning first=66 second=280 amount=-1 +kerning first=85 second=260 amount=-1 +kerning first=66 second=282 amount=-1 +kerning first=85 second=256 amount=-1 +kerning first=85 second=198 amount=-1 +kerning first=85 second=197 amount=-1 +kerning first=66 second=287 amount=-1 +kerning first=85 second=196 amount=-1 +kerning first=66 second=289 amount=-1 +kerning first=85 second=194 amount=-1 +kerning first=66 second=291 amount=-1 +kerning first=66 second=296 amount=-1 +kerning first=66 second=298 amount=-1 +kerning first=66 second=302 amount=-1 +kerning first=85 second=193 amount=-1 +kerning first=66 second=304 amount=-1 +kerning first=85 second=192 amount=-1 +kerning first=66 second=310 amount=-1 +kerning first=85 second=171 amount=-1 +kerning first=66 second=313 amount=-1 +kerning first=85 second=103 amount=-1 +kerning first=66 second=315 amount=-1 +kerning first=85 second=65 amount=-1 +kerning first=66 second=317 amount=-1 +kerning first=85 second=46 amount=-1 +kerning first=66 second=323 amount=-1 +kerning first=85 second=45 amount=-1 +kerning first=66 second=325 amount=-1 +kerning first=85 second=44 amount=-1 +kerning first=66 second=327 amount=-1 +kerning first=84 second=8249 amount=-1 +kerning first=66 second=330 amount=-1 +kerning first=84 second=291 amount=-1 +kerning first=84 second=289 amount=-1 +kerning first=84 second=287 amount=-1 +kerning first=84 second=261 amount=-1 +kerning first=84 second=260 amount=-1 +kerning first=84 second=259 amount=-1 +kerning first=84 second=257 amount=-1 +kerning first=84 second=256 amount=-1 +kerning first=84 second=230 amount=-1 +kerning first=66 second=344 amount=-1 +kerning first=84 second=229 amount=-1 +kerning first=66 second=346 amount=-1 +kerning first=84 second=227 amount=-1 +kerning first=66 second=350 amount=-1 +kerning first=84 second=226 amount=-1 +kerning first=66 second=352 amount=-1 +kerning first=84 second=225 amount=-1 +kerning first=84 second=198 amount=-1 +kerning first=84 second=197 amount=-1 +kerning first=84 second=196 amount=-1 +kerning first=84 second=194 amount=-1 +kerning first=84 second=193 amount=-1 +kerning first=84 second=192 amount=-1 +kerning first=84 second=171 amount=-1 +kerning first=84 second=103 amount=-1 +kerning first=84 second=97 amount=-1 +kerning first=84 second=74 amount=-1 +kerning first=84 second=65 amount=-1 +kerning first=84 second=46 amount=-1 +kerning first=84 second=45 amount=-1 +kerning first=84 second=44 amount=-1 +kerning first=83 second=260 amount=-1 +kerning first=66 second=377 amount=-1 +kerning first=66 second=378 amount=-1 +kerning first=66 second=379 amount=-1 +kerning first=66 second=380 amount=-1 +kerning first=66 second=381 amount=-1 +kerning first=66 second=382 amount=-1 +kerning first=83 second=256 amount=-1 +kerning first=83 second=198 amount=-1 +kerning first=83 second=197 amount=-1 +kerning first=83 second=196 amount=-1 +kerning first=83 second=194 amount=-1 +kerning first=83 second=193 amount=-1 +kerning first=83 second=192 amount=-1 +kerning first=83 second=65 amount=-1 +kerning first=83 second=46 amount=-1 +kerning first=83 second=44 amount=-1 +kerning first=82 second=8249 amount=-1 +kerning first=82 second=8221 amount=-1 +kerning first=82 second=8220 amount=-1 +kerning first=82 second=8217 amount=-1 +kerning first=82 second=171 amount=-1 +kerning first=82 second=45 amount=-1 +kerning first=81 second=260 amount=-1 +kerning first=81 second=256 amount=-1 +kerning first=81 second=198 amount=-1 +kerning first=81 second=197 amount=-1 +kerning first=81 second=196 amount=-1 +kerning first=81 second=194 amount=-1 +kerning first=81 second=193 amount=-1 +kerning first=81 second=192 amount=-1 +kerning first=81 second=65 amount=-1 +kerning first=80 second=260 amount=-1 +kerning first=66 second=8217 amount=-1 +kerning first=66 second=8220 amount=-1 +kerning first=66 second=8221 amount=-1 +kerning first=80 second=256 amount=-1 +kerning first=80 second=198 amount=-1 +kerning first=80 second=197 amount=-1 +kerning first=80 second=196 amount=-1 +kerning first=80 second=194 amount=-1 +kerning first=80 second=193 amount=-1 +kerning first=80 second=192 amount=-1 +kerning first=80 second=65 amount=-1 +kerning first=67 second=45 amount=-1 +kerning first=80 second=46 amount=-1 +kerning first=80 second=44 amount=-1 +kerning first=79 second=260 amount=-1 +kerning first=79 second=256 amount=-1 +kerning first=79 second=198 amount=-1 +kerning first=79 second=197 amount=-1 +kerning first=79 second=196 amount=-1 +kerning first=79 second=194 amount=-1 +kerning first=79 second=193 amount=-1 +kerning first=79 second=192 amount=-1 +kerning first=79 second=65 amount=-1 +kerning first=78 second=8249 amount=-1 +kerning first=78 second=171 amount=-1 +kerning first=78 second=45 amount=-1 +kerning first=77 second=8249 amount=-1 +kerning first=77 second=171 amount=-1 +kerning first=77 second=45 amount=-1 +kerning first=76 second=8221 amount=-1 +kerning first=76 second=8220 amount=-1 +kerning first=76 second=8217 amount=-1 +kerning first=75 second=8249 amount=-1 +kerning first=75 second=171 amount=-1 +kerning first=75 second=45 amount=-1 +kerning first=74 second=8249 amount=-1 +kerning first=74 second=260 amount=-1 +kerning first=74 second=256 amount=-1 +kerning first=74 second=198 amount=-1 +kerning first=74 second=197 amount=-1 +kerning first=74 second=196 amount=-1 +kerning first=74 second=194 amount=-1 +kerning first=74 second=193 amount=-1 +kerning first=74 second=192 amount=-1 +kerning first=74 second=171 amount=-1 +kerning first=74 second=65 amount=-1 +kerning first=74 second=45 amount=-1 +kerning first=73 second=8249 amount=-1 +kerning first=73 second=171 amount=-1 +kerning first=73 second=45 amount=-1 +kerning first=72 second=8249 amount=-1 +kerning first=72 second=171 amount=-1 +kerning first=72 second=45 amount=-1 +kerning first=70 second=74 amount=-1 +kerning first=68 second=260 amount=-1 +kerning first=68 second=256 amount=-1 +kerning first=68 second=198 amount=-1 +kerning first=68 second=197 amount=-1 +kerning first=68 second=196 amount=-1 +kerning first=68 second=194 amount=-1 +kerning first=68 second=193 amount=-1 +kerning first=68 second=192 amount=-1 +kerning first=67 second=171 amount=-1 +kerning first=68 second=65 amount=-1 +kerning first=67 second=8249 amount=-1 diff --git a/jme3-examples/src/main/resources/jme3test/font/BM-FreeSerif16I_0.png b/jme3-examples/src/main/resources/jme3test/font/BM-FreeSerif16I_0.png new file mode 100644 index 000000000..42977ca06 Binary files /dev/null and b/jme3-examples/src/main/resources/jme3test/font/BM-FreeSerif16I_0.png differ diff --git a/jme3-examples/src/main/resources/jme3test/font/BM-FreeSerif16Ipad5555.fnt b/jme3-examples/src/main/resources/jme3test/font/BM-FreeSerif16Ipad5555.fnt new file mode 100644 index 000000000..61497cf7f --- /dev/null +++ b/jme3-examples/src/main/resources/jme3test/font/BM-FreeSerif16Ipad5555.fnt @@ -0,0 +1,1031 @@ +info face="FreeSerif" size=16 bold=0 italic=1 charset="" unicode=1 stretchH=100 smooth=1 aa=2 padding=5,5,5,5 spacing=3,3 outline=0 +common lineHeight=16 base=12 scaleW=512 scaleH=512 pages=1 packed=0 alphaChnl=0 redChnl=4 greenChnl=4 blueChnl=4 +page id=0 file="BM-FreeSerif16Ipad5555_0.png" +chars count=406 +char id=-1 x=352 y=152 width=21 height=20 xoffset=-4 yoffset=-3 xadvance=9 page=0 chnl=15 +char id=32 x=427 y=367 width=11 height=11 xoffset=-5 yoffset=-5 xadvance=3 page=0 chnl=15 +char id=33 x=76 y=271 width=15 height=20 xoffset=-4 yoffset=-3 xadvance=4 page=0 chnl=15 +char id=34 x=276 y=353 width=14 height=14 xoffset=-2 yoffset=-3 xadvance=5 page=0 chnl=15 +char id=35 x=312 y=290 width=18 height=19 xoffset=-4 yoffset=-2 xadvance=6 page=0 chnl=15 +char id=36 x=487 y=103 width=19 height=22 xoffset=-5 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=37 x=188 y=176 width=20 height=20 xoffset=-3 yoffset=-3 xadvance=11 page=0 chnl=15 +char id=38 x=448 y=152 width=21 height=20 xoffset=-4 yoffset=-3 xadvance=10 page=0 chnl=15 +char id=39 x=373 y=353 width=12 height=14 xoffset=-2 yoffset=-3 xadvance=2 page=0 chnl=15 +char id=40 x=248 y=128 width=17 height=22 xoffset=-4 yoffset=-3 xadvance=4 page=0 chnl=15 +char id=41 x=268 y=128 width=16 height=22 xoffset=-5 yoffset=-2 xadvance=4 page=0 chnl=15 +char id=42 x=466 y=331 width=16 height=16 xoffset=-3 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=43 x=111 y=338 width=18 height=17 xoffset=-4 yoffset=0 xadvance=7 page=0 chnl=15 +char id=44 x=293 y=353 width=13 height=14 xoffset=-5 yoffset=5 xadvance=3 page=0 chnl=15 +char id=45 x=393 y=368 width=14 height=11 xoffset=-4 yoffset=3 xadvance=4 page=0 chnl=15 +char id=46 x=256 y=374 width=12 height=12 xoffset=-4 yoffset=5 xadvance=3 page=0 chnl=15 +char id=47 x=457 y=198 width=18 height=20 xoffset=-5 yoffset=-3 xadvance=3 page=0 chnl=15 +char id=48 x=478 y=198 width=18 height=20 xoffset=-4 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=49 x=57 y=271 width=16 height=20 xoffset=-4 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=50 x=416 y=175 width=19 height=20 xoffset=-5 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=51 x=231 y=222 width=18 height=20 xoffset=-5 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=52 x=21 y=225 width=18 height=20 xoffset=-5 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=53 x=482 y=175 width=19 height=20 xoffset=-5 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=54 x=0 y=202 width=19 height=20 xoffset=-4 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=55 x=42 y=225 width=18 height=20 xoffset=-3 yoffset=-2 xadvance=6 page=0 chnl=15 +char id=56 x=63 y=225 width=18 height=20 xoffset=-4 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=57 x=84 y=225 width=18 height=20 xoffset=-5 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=58 x=371 y=333 width=14 height=17 xoffset=-4 yoffset=0 xadvance=3 page=0 chnl=15 +char id=59 x=495 y=75 width=14 height=19 xoffset=-5 yoffset=0 xadvance=3 page=0 chnl=15 +char id=60 x=319 y=312 width=19 height=18 xoffset=-4 yoffset=0 xadvance=7 page=0 chnl=15 +char id=61 x=127 y=358 width=19 height=14 xoffset=-5 yoffset=1 xadvance=7 page=0 chnl=15 +char id=62 x=297 y=312 width=19 height=18 xoffset=-5 yoffset=-1 xadvance=7 page=0 chnl=15 +char id=63 x=443 y=244 width=16 height=20 xoffset=-3 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=64 x=48 y=179 width=21 height=20 xoffset=-3 yoffset=-3 xadvance=12 page=0 chnl=15 +char id=65 x=303 y=176 width=20 height=20 xoffset=-5 yoffset=-3 xadvance=9 page=0 chnl=15 +char id=66 x=69 y=294 width=20 height=19 xoffset=-5 yoffset=-2 xadvance=9 page=0 chnl=15 +char id=67 x=96 y=179 width=20 height=20 xoffset=-4 yoffset=-3 xadvance=9 page=0 chnl=15 +char id=68 x=316 y=268 width=22 height=19 xoffset=-5 yoffset=-2 xadvance=9 page=0 chnl=15 +char id=69 x=463 y=267 width=21 height=19 xoffset=-5 yoffset=-2 xadvance=8 page=0 chnl=15 +char id=70 x=415 y=267 width=21 height=19 xoffset=-5 yoffset=-2 xadvance=7 page=0 chnl=15 +char id=71 x=119 y=179 width=20 height=20 xoffset=-4 yoffset=-3 xadvance=9 page=0 chnl=15 +char id=72 x=186 y=271 width=23 height=19 xoffset=-5 yoffset=-2 xadvance=9 page=0 chnl=15 +char id=73 x=333 y=290 width=18 height=19 xoffset=-5 yoffset=-2 xadvance=4 page=0 chnl=15 +char id=74 x=286 y=199 width=19 height=20 xoffset=-5 yoffset=-2 xadvance=5 page=0 chnl=15 +char id=75 x=290 y=268 width=23 height=19 xoffset=-5 yoffset=-2 xadvance=9 page=0 chnl=15 +char id=76 x=181 y=293 width=19 height=19 xoffset=-5 yoffset=-2 xadvance=8 page=0 chnl=15 +char id=77 x=130 y=271 width=25 height=19 xoffset=-5 yoffset=-2 xadvance=12 page=0 chnl=15 +char id=78 x=251 y=153 width=23 height=20 xoffset=-5 yoffset=-2 xadvance=9 page=0 chnl=15 +char id=79 x=142 y=179 width=20 height=20 xoffset=-4 yoffset=-3 xadvance=9 page=0 chnl=15 +char id=80 x=46 y=294 width=20 height=19 xoffset=-5 yoffset=-2 xadvance=7 page=0 chnl=15 +char id=81 x=239 y=103 width=20 height=22 xoffset=-4 yoffset=-3 xadvance=9 page=0 chnl=15 +char id=82 x=0 y=294 width=20 height=19 xoffset=-5 yoffset=-2 xadvance=9 page=0 chnl=15 +char id=83 x=22 y=202 width=19 height=20 xoffset=-5 yoffset=-3 xadvance=7 page=0 chnl=15 +char id=84 x=115 y=294 width=19 height=19 xoffset=-3 yoffset=-2 xadvance=8 page=0 chnl=15 +char id=85 x=24 y=179 width=21 height=20 xoffset=-3 yoffset=-2 xadvance=9 page=0 chnl=15 +char id=86 x=257 y=176 width=20 height=20 xoffset=-2 yoffset=-2 xadvance=9 page=0 chnl=15 +char id=87 x=170 y=153 width=24 height=20 xoffset=-3 yoffset=-2 xadvance=12 page=0 chnl=15 +char id=88 x=238 y=268 width=23 height=19 xoffset=-5 yoffset=-2 xadvance=9 page=0 chnl=15 +char id=89 x=487 y=267 width=21 height=19 xoffset=-3 yoffset=-2 xadvance=9 page=0 chnl=15 +char id=90 x=439 y=267 width=21 height=19 xoffset=-5 yoffset=-2 xadvance=8 page=0 chnl=15 +char id=91 x=0 y=130 width=18 height=22 xoffset=-5 yoffset=-2 xadvance=4 page=0 chnl=15 +char id=92 x=496 y=26 width=12 height=20 xoffset=-3 yoffset=-3 xadvance=4 page=0 chnl=15 +char id=93 x=208 y=128 width=17 height=22 xoffset=-5 yoffset=-3 xadvance=4 page=0 chnl=15 +char id=94 x=428 y=331 width=16 height=16 xoffset=-4 yoffset=-2 xadvance=6 page=0 chnl=15 +char id=95 x=122 y=376 width=18 height=12 xoffset=-6 yoffset=7 xadvance=6 page=0 chnl=15 +char id=96 x=34 y=377 width=13 height=13 xoffset=-2 yoffset=-3 xadvance=4 page=0 chnl=15 +char id=97 x=215 y=337 width=17 height=17 xoffset=-5 yoffset=0 xadvance=6 page=0 chnl=15 +char id=98 x=404 y=244 width=17 height=20 xoffset=-4 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=99 x=195 y=337 width=17 height=17 xoffset=-4 yoffset=0 xadvance=6 page=0 chnl=15 +char id=100 x=336 y=222 width=18 height=20 xoffset=-4 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=101 x=315 y=333 width=16 height=17 xoffset=-4 yoffset=0 xadvance=6 page=0 chnl=15 +char id=102 x=66 y=202 width=19 height=20 xoffset=-5 yoffset=-3 xadvance=4 page=0 chnl=15 +char id=103 x=242 y=199 width=19 height=20 xoffset=-5 yoffset=0 xadvance=6 page=0 chnl=15 +char id=104 x=415 y=198 width=18 height=20 xoffset=-5 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=105 x=38 y=271 width=16 height=20 xoffset=-5 yoffset=-3 xadvance=3 page=0 chnl=15 +char id=106 x=110 y=79 width=18 height=23 xoffset=-7 yoffset=-3 xadvance=3 page=0 chnl=15 +char id=107 x=372 y=175 width=19 height=20 xoffset=-5 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=108 x=424 y=244 width=16 height=20 xoffset=-5 yoffset=-3 xadvance=3 page=0 chnl=15 +char id=109 x=454 y=311 width=22 height=17 xoffset=-5 yoffset=0 xadvance=10 page=0 chnl=15 +char id=110 x=132 y=338 width=18 height=17 xoffset=-5 yoffset=0 xadvance=6 page=0 chnl=15 +char id=111 x=295 y=333 width=17 height=17 xoffset=-4 yoffset=0 xadvance=6 page=0 chnl=15 +char id=112 x=110 y=202 width=19 height=20 xoffset=-6 yoffset=0 xadvance=6 page=0 chnl=15 +char id=113 x=126 y=225 width=18 height=20 xoffset=-5 yoffset=0 xadvance=6 page=0 chnl=15 +char id=114 x=275 y=333 width=17 height=17 xoffset=-5 yoffset=0 xadvance=4 page=0 chnl=15 +char id=115 x=334 y=333 width=16 height=17 xoffset=-5 yoffset=0 xadvance=5 page=0 chnl=15 +char id=116 x=256 y=312 width=15 height=19 xoffset=-4 yoffset=-1 xadvance=3 page=0 chnl=15 +char id=117 x=255 y=336 width=17 height=17 xoffset=-4 yoffset=0 xadvance=6 page=0 chnl=15 +char id=118 x=235 y=337 width=17 height=17 xoffset=-3 yoffset=0 xadvance=6 page=0 chnl=15 +char id=119 x=479 y=311 width=20 height=17 xoffset=-3 yoffset=0 xadvance=9 page=0 chnl=15 +char id=120 x=174 y=337 width=18 height=17 xoffset=-5 yoffset=0 xadvance=6 page=0 chnl=15 +char id=121 x=308 y=199 width=19 height=20 xoffset=-5 yoffset=0 xadvance=6 page=0 chnl=15 +char id=122 x=153 y=337 width=18 height=17 xoffset=-5 yoffset=0 xadvance=6 page=0 chnl=15 +char id=123 x=325 y=128 width=16 height=22 xoffset=-3 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=124 x=94 y=271 width=15 height=20 xoffset=-5 yoffset=-3 xadvance=2 page=0 chnl=15 +char id=125 x=188 y=128 width=17 height=22 xoffset=-5 yoffset=-2 xadvance=6 page=0 chnl=15 +char id=126 x=388 y=352 width=17 height=13 xoffset=-4 yoffset=2 xadvance=7 page=0 chnl=15 +char id=160 x=441 y=366 width=11 height=11 xoffset=-5 yoffset=-5 xadvance=3 page=0 chnl=15 +char id=161 x=494 y=52 width=15 height=20 xoffset=-5 yoffset=0 xadvance=4 page=0 chnl=15 +char id=162 x=42 y=248 width=18 height=20 xoffset=-5 yoffset=-1 xadvance=6 page=0 chnl=15 +char id=163 x=438 y=175 width=19 height=20 xoffset=-5 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=164 x=274 y=312 width=20 height=18 xoffset=-5 yoffset=-2 xadvance=6 page=0 chnl=15 +char id=165 x=247 y=290 width=19 height=19 xoffset=-4 yoffset=-2 xadvance=6 page=0 chnl=15 +char id=166 x=112 y=271 width=15 height=20 xoffset=-5 yoffset=-3 xadvance=2 page=0 chnl=15 +char id=167 x=168 y=128 width=17 height=22 xoffset=-4 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=168 x=202 y=374 width=15 height=12 xoffset=-3 yoffset=-2 xadvance=4 page=0 chnl=15 +char id=169 x=443 y=128 width=21 height=21 xoffset=-4 yoffset=-3 xadvance=10 page=0 chnl=15 +char id=170 x=110 y=358 width=14 height=15 xoffset=-3 yoffset=-3 xadvance=3 page=0 chnl=15 +char id=171 x=388 y=333 width=17 height=16 xoffset=-4 yoffset=1 xadvance=6 page=0 chnl=15 +char id=172 x=53 y=358 width=18 height=15 xoffset=-4 yoffset=1 xadvance=7 page=0 chnl=15 +char id=173 x=410 y=367 width=14 height=11 xoffset=-4 yoffset=3 xadvance=4 page=0 chnl=15 +char id=174 x=371 y=128 width=21 height=21 xoffset=-4 yoffset=-3 xadvance=10 page=0 chnl=15 +char id=175 x=220 y=374 width=15 height=12 xoffset=-3 yoffset=-2 xadvance=4 page=0 chnl=15 +char id=176 x=92 y=358 width=15 height=15 xoffset=-2 yoffset=-3 xadvance=5 page=0 chnl=15 +char id=177 x=92 y=294 width=20 height=19 xoffset=-5 yoffset=-2 xadvance=7 page=0 chnl=15 +char id=178 x=447 y=331 width=16 height=16 xoffset=-4 yoffset=-3 xadvance=4 page=0 chnl=15 +char id=179 x=18 y=358 width=15 height=16 xoffset=-4 yoffset=-3 xadvance=4 page=0 chnl=15 +char id=180 x=17 y=377 width=14 height=13 xoffset=-2 yoffset=-3 xadvance=4 page=0 chnl=15 +char id=181 x=220 y=199 width=19 height=20 xoffset=-5 yoffset=0 xadvance=6 page=0 chnl=15 +char id=182 x=465 y=103 width=19 height=22 xoffset=-5 yoffset=-2 xadvance=6 page=0 chnl=15 +char id=183 x=271 y=373 width=12 height=12 xoffset=-3 yoffset=3 xadvance=3 page=0 chnl=15 +char id=184 x=242 y=357 width=14 height=14 xoffset=-5 yoffset=6 xadvance=4 page=0 chnl=15 +char id=185 x=36 y=358 width=14 height=16 xoffset=-3 yoffset=-3 xadvance=4 page=0 chnl=15 +char id=186 x=74 y=358 width=15 height=15 xoffset=-3 yoffset=-3 xadvance=4 page=0 chnl=15 +char id=187 x=408 y=332 width=17 height=16 xoffset=-5 yoffset=1 xadvance=6 page=0 chnl=15 +char id=188 x=0 y=179 width=21 height=20 xoffset=-4 yoffset=-3 xadvance=10 page=0 chnl=15 +char id=189 x=72 y=179 width=21 height=20 xoffset=-4 yoffset=-3 xadvance=10 page=0 chnl=15 +char id=190 x=328 y=153 width=21 height=20 xoffset=-4 yoffset=-3 xadvance=10 page=0 chnl=15 +char id=191 x=19 y=271 width=16 height=20 xoffset=-5 yoffset=0 xadvance=6 page=0 chnl=15 +char id=192 x=184 y=52 width=20 height=23 xoffset=-5 yoffset=-5 xadvance=9 page=0 chnl=15 +char id=193 x=323 y=0 width=21 height=23 xoffset=-5 yoffset=-5 xadvance=9 page=0 chnl=15 +char id=194 x=351 y=78 width=21 height=22 xoffset=-5 yoffset=-5 xadvance=9 page=0 chnl=15 +char id=195 x=72 y=105 width=21 height=22 xoffset=-5 yoffset=-5 xadvance=9 page=0 chnl=15 +char id=196 x=96 y=105 width=21 height=22 xoffset=-5 yoffset=-5 xadvance=9 page=0 chnl=15 +char id=197 x=207 y=52 width=20 height=23 xoffset=-5 yoffset=-5 xadvance=9 page=0 chnl=15 +char id=198 x=158 y=271 width=25 height=19 xoffset=-5 yoffset=-2 xadvance=12 page=0 chnl=15 +char id=199 x=358 y=26 width=20 height=23 xoffset=-4 yoffset=-3 xadvance=9 page=0 chnl=15 +char id=200 x=240 y=26 width=21 height=23 xoffset=-5 yoffset=-5 xadvance=8 page=0 chnl=15 +char id=201 x=216 y=26 width=21 height=23 xoffset=-5 yoffset=-5 xadvance=8 page=0 chnl=15 +char id=202 x=120 y=105 width=21 height=22 xoffset=-5 yoffset=-5 xadvance=8 page=0 chnl=15 +char id=203 x=144 y=105 width=21 height=22 xoffset=-5 yoffset=-5 xadvance=8 page=0 chnl=15 +char id=204 x=131 y=79 width=18 height=23 xoffset=-5 yoffset=-5 xadvance=4 page=0 chnl=15 +char id=205 x=88 y=79 width=19 height=23 xoffset=-5 yoffset=-5 xadvance=4 page=0 chnl=15 +char id=206 x=126 y=130 width=18 height=22 xoffset=-5 yoffset=-5 xadvance=4 page=0 chnl=15 +char id=207 x=147 y=130 width=18 height=22 xoffset=-5 yoffset=-5 xadvance=4 page=0 chnl=15 +char id=208 x=341 y=268 width=22 height=19 xoffset=-5 yoffset=-2 xadvance=9 page=0 chnl=15 +char id=209 x=178 y=78 width=23 height=22 xoffset=-5 yoffset=-5 xadvance=9 page=0 chnl=15 +char id=210 x=473 y=26 width=20 height=23 xoffset=-4 yoffset=-5 xadvance=9 page=0 chnl=15 +char id=211 x=312 y=26 width=20 height=23 xoffset=-4 yoffset=-5 xadvance=9 page=0 chnl=15 +char id=212 x=335 y=26 width=20 height=23 xoffset=-4 yoffset=-5 xadvance=9 page=0 chnl=15 +char id=213 x=285 y=103 width=20 height=22 xoffset=-4 yoffset=-5 xadvance=9 page=0 chnl=15 +char id=214 x=354 y=103 width=20 height=22 xoffset=-4 yoffset=-5 xadvance=9 page=0 chnl=15 +char id=215 x=68 y=338 width=19 height=17 xoffset=-5 yoffset=0 xadvance=7 page=0 chnl=15 +char id=216 x=152 y=78 width=23 height=22 xoffset=-5 yoffset=-3 xadvance=9 page=0 chnl=15 +char id=217 x=443 y=0 width=21 height=23 xoffset=-3 yoffset=-5 xadvance=9 page=0 chnl=15 +char id=218 x=96 y=27 width=21 height=23 xoffset=-3 yoffset=-5 xadvance=9 page=0 chnl=15 +char id=219 x=0 y=27 width=21 height=23 xoffset=-3 yoffset=-5 xadvance=9 page=0 chnl=15 +char id=220 x=399 y=78 width=21 height=22 xoffset=-3 yoffset=-5 xadvance=9 page=0 chnl=15 +char id=221 x=467 y=0 width=21 height=23 xoffset=-3 yoffset=-5 xadvance=9 page=0 chnl=15 +char id=222 x=23 y=294 width=20 height=19 xoffset=-5 yoffset=-2 xadvance=7 page=0 chnl=15 +char id=223 x=88 y=202 width=19 height=20 xoffset=-5 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=224 x=244 y=245 width=17 height=20 xoffset=-5 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=225 x=105 y=225 width=18 height=20 xoffset=-5 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=226 x=284 y=245 width=17 height=20 xoffset=-5 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=227 x=459 y=289 width=18 height=19 xoffset=-5 yoffset=-2 xadvance=6 page=0 chnl=15 +char id=228 x=417 y=289 width=18 height=19 xoffset=-5 yoffset=-2 xadvance=6 page=0 chnl=15 +char id=229 x=84 y=155 width=17 height=21 xoffset=-5 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=230 x=0 y=338 width=20 height=17 xoffset=-5 yoffset=0 xadvance=8 page=0 chnl=15 +char id=231 x=104 y=248 width=17 height=20 xoffset=-5 yoffset=0 xadvance=6 page=0 chnl=15 +char id=232 x=481 y=244 width=16 height=20 xoffset=-4 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=233 x=144 y=248 width=17 height=20 xoffset=-4 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=234 x=184 y=248 width=17 height=20 xoffset=-4 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=235 x=120 y=316 width=17 height=19 xoffset=-4 yoffset=-2 xadvance=6 page=0 chnl=15 +char id=236 x=462 y=244 width=16 height=20 xoffset=-5 yoffset=-3 xadvance=3 page=0 chnl=15 +char id=237 x=84 y=248 width=17 height=20 xoffset=-5 yoffset=-3 xadvance=3 page=0 chnl=15 +char id=238 x=344 y=245 width=17 height=20 xoffset=-5 yoffset=-3 xadvance=3 page=0 chnl=15 +char id=239 x=20 y=316 width=17 height=19 xoffset=-5 yoffset=-2 xadvance=3 page=0 chnl=15 +char id=240 x=63 y=248 width=18 height=20 xoffset=-4 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=241 x=225 y=292 width=19 height=19 xoffset=-5 yoffset=-2 xadvance=6 page=0 chnl=15 +char id=242 x=364 y=245 width=17 height=20 xoffset=-4 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=243 x=0 y=248 width=18 height=20 xoffset=-4 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=244 x=324 y=245 width=17 height=20 xoffset=-4 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=245 x=396 y=289 width=18 height=19 xoffset=-4 yoffset=-2 xadvance=6 page=0 chnl=15 +char id=246 x=375 y=290 width=18 height=19 xoffset=-4 yoffset=-2 xadvance=6 page=0 chnl=15 +char id=247 x=385 y=312 width=18 height=18 xoffset=-4 yoffset=-1 xadvance=7 page=0 chnl=15 +char id=248 x=203 y=293 width=19 height=19 xoffset=-5 yoffset=-1 xadvance=6 page=0 chnl=15 +char id=249 x=224 y=245 width=17 height=20 xoffset=-4 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=250 x=483 y=221 width=18 height=20 xoffset=-4 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=251 x=264 y=245 width=17 height=20 xoffset=-4 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=252 x=100 y=316 width=17 height=19 xoffset=-4 yoffset=-2 xadvance=6 page=0 chnl=15 +char id=253 x=296 y=52 width=19 height=23 xoffset=-5 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=254 x=274 y=52 width=19 height=23 xoffset=-6 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=255 x=399 y=103 width=19 height=22 xoffset=-5 yoffset=-2 xadvance=6 page=0 chnl=15 +char id=256 x=395 y=128 width=21 height=21 xoffset=-5 yoffset=-4 xadvance=9 page=0 chnl=15 +char id=257 x=354 y=290 width=18 height=19 xoffset=-5 yoffset=-1 xadvance=6 page=0 chnl=15 +char id=258 x=120 y=26 width=21 height=23 xoffset=-5 yoffset=-5 xadvance=9 page=0 chnl=15 +char id=259 x=420 y=221 width=18 height=20 xoffset=-5 yoffset=-2 xadvance=6 page=0 chnl=15 +char id=260 x=375 y=78 width=21 height=22 xoffset=-5 yoffset=-3 xadvance=9 page=0 chnl=15 +char id=261 x=160 y=315 width=17 height=19 xoffset=-5 yoffset=0 xadvance=6 page=0 chnl=15 +char id=262 x=427 y=26 width=20 height=23 xoffset=-4 yoffset=-5 xadvance=9 page=0 chnl=15 +char id=263 x=378 y=221 width=18 height=20 xoffset=-4 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=264 x=450 y=26 width=20 height=23 xoffset=-4 yoffset=-5 xadvance=9 page=0 chnl=15 +char id=265 x=384 y=244 width=17 height=20 xoffset=-4 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=266 x=262 y=103 width=20 height=22 xoffset=-4 yoffset=-5 xadvance=9 page=0 chnl=15 +char id=267 x=180 y=315 width=17 height=19 xoffset=-4 yoffset=-2 xadvance=6 page=0 chnl=15 +char id=268 x=404 y=26 width=20 height=23 xoffset=-4 yoffset=-5 xadvance=9 page=0 chnl=15 +char id=269 x=210 y=222 width=18 height=20 xoffset=-4 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=270 x=298 y=0 width=22 height=23 xoffset=-5 yoffset=-5 xadvance=9 page=0 chnl=15 +char id=271 x=211 y=176 width=20 height=20 xoffset=-4 yoffset=-3 xadvance=8 page=0 chnl=15 +char id=272 x=366 y=268 width=22 height=19 xoffset=-5 yoffset=-2 xadvance=9 page=0 chnl=15 +char id=273 x=264 y=199 width=19 height=20 xoffset=-4 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=274 x=419 y=128 width=21 height=21 xoffset=-5 yoffset=-4 xadvance=8 page=0 chnl=15 +char id=275 x=140 y=315 width=17 height=19 xoffset=-4 yoffset=-1 xadvance=6 page=0 chnl=15 +char id=276 x=447 y=78 width=21 height=22 xoffset=-5 yoffset=-5 xadvance=8 page=0 chnl=15 +char id=277 x=399 y=221 width=18 height=20 xoffset=-4 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=278 x=0 y=105 width=21 height=22 xoffset=-5 yoffset=-5 xadvance=8 page=0 chnl=15 +char id=279 x=219 y=315 width=16 height=19 xoffset=-4 yoffset=-2 xadvance=6 page=0 chnl=15 +char id=280 x=423 y=78 width=21 height=22 xoffset=-5 yoffset=-2 xadvance=8 page=0 chnl=15 +char id=281 x=200 y=315 width=16 height=19 xoffset=-4 yoffset=0 xadvance=6 page=0 chnl=15 +char id=282 x=471 y=78 width=21 height=22 xoffset=-5 yoffset=-5 xadvance=8 page=0 chnl=15 +char id=283 x=462 y=221 width=18 height=20 xoffset=-4 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=284 x=161 y=52 width=20 height=23 xoffset=-4 yoffset=-5 xadvance=9 page=0 chnl=15 +char id=285 x=428 y=52 width=19 height=23 xoffset=-5 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=286 x=115 y=53 width=20 height=23 xoffset=-4 yoffset=-5 xadvance=9 page=0 chnl=15 +char id=287 x=22 y=79 width=19 height=23 xoffset=-5 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=288 x=216 y=103 width=20 height=22 xoffset=-4 yoffset=-5 xadvance=9 page=0 chnl=15 +char id=289 x=421 y=103 width=19 height=22 xoffset=-5 yoffset=-2 xadvance=6 page=0 chnl=15 +char id=290 x=26 y=0 width=20 height=24 xoffset=-4 yoffset=-3 xadvance=9 page=0 chnl=15 +char id=291 x=71 y=0 width=19 height=24 xoffset=-5 yoffset=-4 xadvance=6 page=0 chnl=15 +char id=292 x=272 y=0 width=23 height=23 xoffset=-5 yoffset=-5 xadvance=9 page=0 chnl=15 +char id=293 x=318 y=52 width=19 height=23 xoffset=-5 yoffset=-5 xadvance=6 page=0 chnl=15 +char id=294 x=212 y=270 width=23 height=19 xoffset=-5 yoffset=-2 xadvance=9 page=0 chnl=15 +char id=295 x=21 y=248 width=18 height=20 xoffset=-5 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=296 x=377 y=103 width=19 height=22 xoffset=-5 yoffset=-5 xadvance=4 page=0 chnl=15 +char id=297 x=0 y=316 width=17 height=19 xoffset=-5 yoffset=-2 xadvance=3 page=0 chnl=15 +char id=298 x=0 y=155 width=18 height=21 xoffset=-5 yoffset=-4 xadvance=4 page=0 chnl=15 +char id=299 x=406 y=311 width=17 height=18 xoffset=-5 yoffset=-1 xadvance=3 page=0 chnl=15 +char id=300 x=362 y=52 width=19 height=23 xoffset=-5 yoffset=-5 xadvance=4 page=0 chnl=15 +char id=301 x=60 y=316 width=17 height=19 xoffset=-5 yoffset=-2 xadvance=3 page=0 chnl=15 +char id=302 x=63 y=130 width=18 height=22 xoffset=-5 yoffset=-2 xadvance=4 page=0 chnl=15 +char id=303 x=306 y=128 width=16 height=22 xoffset=-5 yoffset=-3 xadvance=3 page=0 chnl=15 +char id=304 x=84 y=130 width=18 height=22 xoffset=-5 yoffset=-5 xadvance=4 page=0 chnl=15 +char id=305 x=353 y=333 width=15 height=17 xoffset=-5 yoffset=0 xadvance=3 page=0 chnl=15 +char id=306 x=277 y=153 width=23 height=20 xoffset=-5 yoffset=-2 xadvance=9 page=0 chnl=15 +char id=307 x=0 y=79 width=19 height=23 xoffset=-5 yoffset=-3 xadvance=7 page=0 chnl=15 +char id=308 x=472 y=52 width=19 height=23 xoffset=-5 yoffset=-5 xadvance=5 page=0 chnl=15 +char id=309 x=450 y=52 width=19 height=23 xoffset=-7 yoffset=-3 xadvance=3 page=0 chnl=15 +char id=310 x=220 y=0 width=23 height=23 xoffset=-5 yoffset=-2 xadvance=9 page=0 chnl=15 +char id=311 x=49 y=0 width=19 height=24 xoffset=-5 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=312 x=46 y=338 width=19 height=17 xoffset=-5 yoffset=0 xadvance=6 page=0 chnl=15 +char id=313 x=230 y=52 width=19 height=23 xoffset=-5 yoffset=-5 xadvance=8 page=0 chnl=15 +char id=314 x=491 y=0 width=18 height=23 xoffset=-5 yoffset=-5 xadvance=3 page=0 chnl=15 +char id=315 x=384 y=52 width=19 height=23 xoffset=-5 yoffset=-2 xadvance=8 page=0 chnl=15 +char id=316 x=93 y=0 width=17 height=24 xoffset=-5 yoffset=-3 xadvance=3 page=0 chnl=15 +char id=317 x=280 y=176 width=20 height=20 xoffset=-5 yoffset=-3 xadvance=8 page=0 chnl=15 +char id=318 x=0 y=225 width=18 height=20 xoffset=-5 yoffset=-3 xadvance=5 page=0 chnl=15 +char id=319 x=269 y=290 width=19 height=19 xoffset=-5 yoffset=-2 xadvance=8 page=0 chnl=15 +char id=320 x=204 y=247 width=17 height=20 xoffset=-5 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=321 x=159 y=293 width=19 height=19 xoffset=-5 yoffset=-2 xadvance=8 page=0 chnl=15 +char id=322 x=0 y=271 width=16 height=20 xoffset=-5 yoffset=-3 xadvance=3 page=0 chnl=15 +char id=323 x=168 y=0 width=23 height=23 xoffset=-5 yoffset=-5 xadvance=9 page=0 chnl=15 +char id=324 x=132 y=202 width=19 height=20 xoffset=-5 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=325 x=194 y=0 width=23 height=23 xoffset=-5 yoffset=-2 xadvance=9 page=0 chnl=15 +char id=326 x=42 y=155 width=18 height=21 xoffset=-5 yoffset=0 xadvance=6 page=0 chnl=15 +char id=327 x=246 y=0 width=23 height=23 xoffset=-5 yoffset=-5 xadvance=9 page=0 chnl=15 +char id=328 x=44 y=202 width=19 height=20 xoffset=-5 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=329 x=189 y=224 width=18 height=20 xoffset=-5 yoffset=-3 xadvance=7 page=0 chnl=15 +char id=330 x=376 y=152 width=21 height=20 xoffset=-5 yoffset=-3 xadvance=9 page=0 chnl=15 +char id=331 x=252 y=222 width=18 height=20 xoffset=-5 yoffset=0 xadvance=6 page=0 chnl=15 +char id=332 x=331 y=103 width=20 height=22 xoffset=-4 yoffset=-4 xadvance=9 page=0 chnl=15 +char id=333 x=438 y=289 width=18 height=19 xoffset=-4 yoffset=-1 xadvance=6 page=0 chnl=15 +char id=334 x=381 y=26 width=20 height=23 xoffset=-4 yoffset=-5 xadvance=9 page=0 chnl=15 +char id=335 x=315 y=222 width=18 height=20 xoffset=-4 yoffset=-2 xadvance=6 page=0 chnl=15 +char id=336 x=264 y=26 width=21 height=23 xoffset=-4 yoffset=-5 xadvance=9 page=0 chnl=15 +char id=337 x=460 y=175 width=19 height=20 xoffset=-4 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=338 x=224 y=153 width=24 height=20 xoffset=-4 yoffset=-3 xadvance=12 page=0 chnl=15 +char id=339 x=23 y=338 width=20 height=17 xoffset=-4 yoffset=0 xadvance=9 page=0 chnl=15 +char id=340 x=138 y=52 width=20 height=23 xoffset=-5 yoffset=-5 xadvance=9 page=0 chnl=15 +char id=341 x=441 y=221 width=18 height=20 xoffset=-5 yoffset=-3 xadvance=4 page=0 chnl=15 +char id=342 x=92 y=53 width=20 height=23 xoffset=-5 yoffset=-2 xadvance=9 page=0 chnl=15 +char id=343 x=63 y=155 width=18 height=21 xoffset=-6 yoffset=0 xadvance=4 page=0 chnl=15 +char id=344 x=24 y=105 width=21 height=22 xoffset=-5 yoffset=-5 xadvance=9 page=0 chnl=15 +char id=345 x=294 y=222 width=18 height=20 xoffset=-5 yoffset=-3 xadvance=4 page=0 chnl=15 +char id=346 x=69 y=53 width=20 height=23 xoffset=-5 yoffset=-5 xadvance=7 page=0 chnl=15 +char id=347 x=436 y=198 width=18 height=20 xoffset=-5 yoffset=-3 xadvance=5 page=0 chnl=15 +char id=348 x=340 y=52 width=19 height=23 xoffset=-5 yoffset=-5 xadvance=7 page=0 chnl=15 +char id=349 x=164 y=248 width=17 height=20 xoffset=-5 yoffset=-3 xadvance=5 page=0 chnl=15 +char id=350 x=406 y=52 width=19 height=23 xoffset=-5 yoffset=-3 xadvance=7 page=0 chnl=15 +char id=351 x=304 y=245 width=17 height=20 xoffset=-5 yoffset=0 xadvance=5 page=0 chnl=15 +char id=352 x=46 y=53 width=20 height=23 xoffset=-5 yoffset=-5 xadvance=7 page=0 chnl=15 +char id=353 x=373 y=198 width=18 height=20 xoffset=-5 yoffset=-3 xadvance=5 page=0 chnl=15 +char id=354 x=308 y=103 width=20 height=22 xoffset=-4 yoffset=-2 xadvance=8 page=0 chnl=15 +char id=355 x=124 y=155 width=16 height=21 xoffset=-5 yoffset=-1 xadvance=3 page=0 chnl=15 +char id=356 x=44 y=79 width=19 height=23 xoffset=-3 yoffset=-5 xadvance=8 page=0 chnl=15 +char id=357 x=394 y=198 width=18 height=20 xoffset=-4 yoffset=-3 xadvance=5 page=0 chnl=15 +char id=358 x=137 y=293 width=19 height=19 xoffset=-3 yoffset=-2 xadvance=8 page=0 chnl=15 +char id=359 x=238 y=314 width=15 height=19 xoffset=-4 yoffset=-1 xadvance=3 page=0 chnl=15 +char id=360 x=327 y=78 width=21 height=22 xoffset=-3 yoffset=-5 xadvance=9 page=0 chnl=15 +char id=361 x=480 y=289 width=18 height=19 xoffset=-4 yoffset=-2 xadvance=6 page=0 chnl=15 +char id=362 x=279 y=78 width=21 height=22 xoffset=-3 yoffset=-4 xadvance=9 page=0 chnl=15 +char id=363 x=80 y=316 width=17 height=19 xoffset=-4 yoffset=-1 xadvance=6 page=0 chnl=15 +char id=364 x=347 y=0 width=21 height=23 xoffset=-3 yoffset=-5 xadvance=9 page=0 chnl=15 +char id=365 x=352 y=199 width=18 height=20 xoffset=-4 yoffset=-2 xadvance=6 page=0 chnl=15 +char id=366 x=371 y=0 width=21 height=23 xoffset=-3 yoffset=-5 xadvance=9 page=0 chnl=15 +char id=367 x=104 y=155 width=17 height=21 xoffset=-4 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=368 x=395 y=0 width=21 height=23 xoffset=-3 yoffset=-5 xadvance=9 page=0 chnl=15 +char id=369 x=198 y=199 width=19 height=20 xoffset=-4 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=370 x=48 y=105 width=21 height=22 xoffset=-3 yoffset=-2 xadvance=9 page=0 chnl=15 +char id=371 x=40 y=316 width=17 height=19 xoffset=-4 yoffset=0 xadvance=6 page=0 chnl=15 +char id=372 x=141 y=0 width=24 height=23 xoffset=-3 yoffset=-5 xadvance=12 page=0 chnl=15 +char id=373 x=349 y=176 width=20 height=20 xoffset=-3 yoffset=-3 xadvance=9 page=0 chnl=15 +char id=374 x=288 y=26 width=21 height=23 xoffset=-3 yoffset=-5 xadvance=9 page=0 chnl=15 +char id=375 x=66 y=79 width=19 height=23 xoffset=-5 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=376 x=168 y=103 width=21 height=22 xoffset=-3 yoffset=-5 xadvance=9 page=0 chnl=15 +char id=377 x=24 y=27 width=21 height=23 xoffset=-5 yoffset=-5 xadvance=8 page=0 chnl=15 +char id=378 x=330 y=199 width=19 height=20 xoffset=-5 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=379 x=303 y=78 width=21 height=22 xoffset=-5 yoffset=-5 xadvance=8 page=0 chnl=15 +char id=380 x=291 y=290 width=18 height=19 xoffset=-5 yoffset=-2 xadvance=6 page=0 chnl=15 +char id=381 x=192 y=103 width=21 height=22 xoffset=-5 yoffset=-5 xadvance=8 page=0 chnl=15 +char id=382 x=154 y=202 width=19 height=20 xoffset=-5 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=383 x=176 y=201 width=19 height=20 xoffset=-5 yoffset=-3 xadvance=4 page=0 chnl=15 +char id=399 x=326 y=176 width=20 height=20 xoffset=-4 yoffset=-3 xadvance=9 page=0 chnl=15 +char id=402 x=23 y=53 width=20 height=23 xoffset=-6 yoffset=-3 xadvance=5 page=0 chnl=15 +char id=416 x=254 y=78 width=22 height=22 xoffset=-4 yoffset=-4 xadvance=9 page=0 chnl=15 +char id=417 x=341 y=312 width=19 height=18 xoffset=-4 yoffset=-1 xadvance=7 page=0 chnl=15 +char id=431 x=229 y=78 width=22 height=22 xoffset=-3 yoffset=-4 xadvance=10 page=0 chnl=15 +char id=432 x=363 y=312 width=19 height=18 xoffset=-4 yoffset=-1 xadvance=7 page=0 chnl=15 +char id=461 x=204 y=78 width=22 height=22 xoffset=-5 yoffset=-5 xadvance=9 page=0 chnl=15 +char id=462 x=357 y=222 width=18 height=20 xoffset=-5 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=463 x=443 y=103 width=19 height=22 xoffset=-5 yoffset=-5 xadvance=4 page=0 chnl=15 +char id=464 x=124 y=248 width=17 height=20 xoffset=-5 yoffset=-3 xadvance=3 page=0 chnl=15 +char id=465 x=0 y=53 width=20 height=23 xoffset=-4 yoffset=-5 xadvance=9 page=0 chnl=15 +char id=466 x=168 y=225 width=18 height=20 xoffset=-4 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=467 x=48 y=27 width=21 height=23 xoffset=-3 yoffset=-5 xadvance=9 page=0 chnl=15 +char id=468 x=147 y=225 width=18 height=20 xoffset=-4 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=469 x=72 y=27 width=21 height=23 xoffset=-3 yoffset=-5 xadvance=9 page=0 chnl=15 +char id=470 x=21 y=155 width=18 height=21 xoffset=-4 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=471 x=144 y=26 width=21 height=23 xoffset=-3 yoffset=-5 xadvance=9 page=0 chnl=15 +char id=472 x=21 y=130 width=18 height=22 xoffset=-4 yoffset=-4 xadvance=6 page=0 chnl=15 +char id=473 x=168 y=26 width=21 height=23 xoffset=-3 yoffset=-5 xadvance=9 page=0 chnl=15 +char id=474 x=105 y=130 width=18 height=22 xoffset=-4 yoffset=-4 xadvance=6 page=0 chnl=15 +char id=475 x=192 y=26 width=21 height=23 xoffset=-3 yoffset=-5 xadvance=9 page=0 chnl=15 +char id=476 x=228 y=128 width=17 height=22 xoffset=-4 yoffset=-4 xadvance=6 page=0 chnl=15 +char id=506 x=419 y=0 width=21 height=23 xoffset=-5 yoffset=-5 xadvance=9 page=0 chnl=15 +char id=507 x=252 y=52 width=19 height=23 xoffset=-5 yoffset=-5 xadvance=6 page=0 chnl=15 +char id=508 x=113 y=0 width=25 height=23 xoffset=-5 yoffset=-5 xadvance=12 page=0 chnl=15 +char id=509 x=165 y=178 width=20 height=20 xoffset=-5 yoffset=-3 xadvance=8 page=0 chnl=15 +char id=510 x=0 y=0 width=23 height=24 xoffset=-5 yoffset=-5 xadvance=9 page=0 chnl=15 +char id=511 x=490 y=128 width=19 height=21 xoffset=-5 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=710 x=447 y=350 width=15 height=13 xoffset=-3 yoffset=-3 xadvance=4 page=0 chnl=15 +char id=711 x=465 y=350 width=15 height=13 xoffset=-2 yoffset=-3 xadvance=4 page=0 chnl=15 +char id=713 x=238 y=374 width=15 height=12 xoffset=-3 yoffset=-2 xadvance=4 page=0 chnl=15 +char id=728 x=483 y=350 width=15 height=13 xoffset=-2 yoffset=-2 xadvance=4 page=0 chnl=15 +char id=729 x=286 y=370 width=12 height=12 xoffset=-1 yoffset=-2 xadvance=4 page=0 chnl=15 +char id=730 x=357 y=353 width=13 height=14 xoffset=-2 yoffset=-3 xadvance=4 page=0 chnl=15 +char id=731 x=50 y=377 width=13 height=13 xoffset=-5 yoffset=6 xadvance=4 page=0 chnl=15 +char id=732 x=164 y=375 width=16 height=12 xoffset=-3 yoffset=-2 xadvance=4 page=0 chnl=15 +char id=733 x=408 y=351 width=17 height=13 xoffset=-3 yoffset=-3 xadvance=5 page=0 chnl=15 +char id=768 x=66 y=376 width=13 height=13 xoffset=-6 yoffset=-3 xadvance=0 page=0 chnl=15 +char id=769 x=0 y=377 width=14 height=13 xoffset=-6 yoffset=-3 xadvance=0 page=0 chnl=15 +char id=771 x=183 y=374 width=16 height=12 xoffset=-7 yoffset=-2 xadvance=0 page=0 chnl=15 +char id=777 x=82 y=376 width=13 height=13 xoffset=-6 yoffset=-3 xadvance=0 page=0 chnl=15 +char id=803 x=301 y=370 width=12 height=12 xoffset=-10 yoffset=7 xadvance=0 page=0 chnl=15 +char id=8204 x=0 y=393 width=11 height=11 xoffset=-5 yoffset=-5 xadvance=0 page=0 chnl=15 +char id=8205 x=14 y=393 width=11 height=11 xoffset=-5 yoffset=-5 xadvance=0 page=0 chnl=15 +char id=8206 x=28 y=393 width=11 height=11 xoffset=-5 yoffset=-5 xadvance=0 page=0 chnl=15 +char id=8207 x=42 y=393 width=11 height=11 xoffset=-5 yoffset=-5 xadvance=0 page=0 chnl=15 +char id=8211 x=372 y=370 width=18 height=11 xoffset=-5 yoffset=3 xadvance=6 page=0 chnl=15 +char id=8212 x=316 y=370 width=25 height=11 xoffset=-5 yoffset=3 xadvance=13 page=0 chnl=15 +char id=8213 x=344 y=370 width=25 height=11 xoffset=-5 yoffset=3 xadvance=13 page=0 chnl=15 +char id=8215 x=428 y=350 width=16 height=13 xoffset=-5 yoffset=7 xadvance=6 page=0 chnl=15 +char id=8216 x=309 y=353 width=13 height=14 xoffset=-2 yoffset=-3 xadvance=3 page=0 chnl=15 +char id=8217 x=341 y=353 width=13 height=14 xoffset=-2 yoffset=-3 xadvance=3 page=0 chnl=15 +char id=8218 x=325 y=353 width=13 height=14 xoffset=-5 yoffset=5 xadvance=3 page=0 chnl=15 +char id=8219 x=496 y=152 width=13 height=14 xoffset=-2 yoffset=-3 xadvance=3 page=0 chnl=15 +char id=8220 x=224 y=357 width=15 height=14 xoffset=-2 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=8221 x=206 y=357 width=15 height=14 xoffset=-2 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=8222 x=169 y=357 width=16 height=14 xoffset=-5 yoffset=5 xadvance=6 page=0 chnl=15 +char id=8224 x=287 y=128 width=16 height=22 xoffset=-3 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=8225 x=42 y=130 width=18 height=22 xoffset=-4 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=8226 x=188 y=357 width=15 height=14 xoffset=-4 yoffset=0 xadvance=4 page=0 chnl=15 +char id=8230 x=98 y=376 width=21 height=12 xoffset=-4 yoffset=5 xadvance=13 page=0 chnl=15 +char id=8234 x=455 y=366 width=11 height=11 xoffset=-5 yoffset=-5 xadvance=0 page=0 chnl=15 +char id=8235 x=469 y=366 width=11 height=11 xoffset=-5 yoffset=-5 xadvance=0 page=0 chnl=15 +char id=8236 x=483 y=366 width=11 height=11 xoffset=-5 yoffset=-5 xadvance=0 page=0 chnl=15 +char id=8237 x=497 y=366 width=11 height=11 xoffset=-5 yoffset=-5 xadvance=0 page=0 chnl=15 +char id=8238 x=56 y=393 width=11 height=11 xoffset=-5 yoffset=-5 xadvance=0 page=0 chnl=15 +char id=8240 x=344 y=128 width=24 height=21 xoffset=-4 yoffset=-3 xadvance=13 page=0 chnl=15 +char id=8242 x=259 y=356 width=14 height=14 xoffset=-3 yoffset=-3 xadvance=3 page=0 chnl=15 +char id=8243 x=149 y=358 width=17 height=14 xoffset=-3 yoffset=-3 xadvance=5 page=0 chnl=15 +char id=8249 x=0 y=358 width=15 height=16 xoffset=-4 yoffset=1 xadvance=3 page=0 chnl=15 +char id=8250 x=485 y=331 width=15 height=16 xoffset=-5 yoffset=1 xadvance=3 page=0 chnl=15 +char id=8252 x=234 y=176 width=20 height=20 xoffset=-4 yoffset=-3 xadvance=9 page=0 chnl=15 +char id=8254 x=143 y=375 width=18 height=12 xoffset=-3 yoffset=-2 xadvance=6 page=0 chnl=15 +char id=8260 x=400 y=152 width=21 height=20 xoffset=-7 yoffset=-3 xadvance=2 page=0 chnl=15 +char id=8355 x=391 y=267 width=21 height=19 xoffset=-5 yoffset=-2 xadvance=7 page=0 chnl=15 +char id=8356 x=394 y=175 width=19 height=20 xoffset=-5 yoffset=-3 xadvance=6 page=0 chnl=15 +char id=8359 x=197 y=153 width=24 height=20 xoffset=-5 yoffset=-2 xadvance=12 page=0 chnl=15 +char id=8362 x=264 y=268 width=23 height=19 xoffset=-5 yoffset=-2 xadvance=11 page=0 chnl=15 +char id=8363 x=467 y=128 width=20 height=21 xoffset=-5 yoffset=-4 xadvance=7 page=0 chnl=15 +char id=8364 x=424 y=152 width=21 height=20 xoffset=-4 yoffset=-3 xadvance=10 page=0 chnl=15 +char id=8453 x=472 y=152 width=21 height=20 xoffset=-4 yoffset=-3 xadvance=10 page=0 chnl=15 +char id=8467 x=273 y=222 width=18 height=20 xoffset=-4 yoffset=-3 xadvance=5 page=0 chnl=15 +char id=8470 x=143 y=155 width=24 height=20 xoffset=-5 yoffset=-2 xadvance=11 page=0 chnl=15 +char id=8482 x=426 y=311 width=25 height=17 xoffset=-3 yoffset=-3 xadvance=13 page=0 chnl=15 +char id=8486 x=303 y=153 width=22 height=20 xoffset=-5 yoffset=-3 xadvance=10 page=0 chnl=15 +char id=8494 x=90 y=338 width=18 height=17 xoffset=-4 yoffset=0 xadvance=7 page=0 chnl=15 +kernings count=620 +kerning first=212 second=260 amount=-1 +kerning first=212 second=256 amount=-1 +kerning first=212 second=198 amount=-1 +kerning first=44 second=8217 amount=-1 +kerning first=44 second=8220 amount=-1 +kerning first=44 second=8221 amount=-1 +kerning first=212 second=197 amount=-1 +kerning first=45 second=65 amount=-1 +kerning first=45 second=66 amount=-1 +kerning first=45 second=68 amount=-1 +kerning first=45 second=69 amount=-1 +kerning first=45 second=70 amount=-1 +kerning first=45 second=72 amount=-1 +kerning first=45 second=73 amount=-1 +kerning first=45 second=74 amount=-1 +kerning first=45 second=75 amount=-1 +kerning first=45 second=76 amount=-1 +kerning first=45 second=77 amount=-1 +kerning first=45 second=78 amount=-1 +kerning first=45 second=80 amount=-1 +kerning first=45 second=82 amount=-1 +kerning first=212 second=196 amount=-1 +kerning first=45 second=84 amount=-1 +kerning first=45 second=85 amount=-1 +kerning first=45 second=86 amount=-1 +kerning first=45 second=87 amount=-1 +kerning first=45 second=89 amount=-1 +kerning first=45 second=90 amount=-1 +kerning first=212 second=194 amount=-1 +kerning first=212 second=193 amount=-1 +kerning first=212 second=192 amount=-1 +kerning first=212 second=65 amount=-1 +kerning first=211 second=260 amount=-1 +kerning first=211 second=256 amount=-1 +kerning first=211 second=198 amount=-1 +kerning first=211 second=197 amount=-1 +kerning first=211 second=196 amount=-1 +kerning first=211 second=194 amount=-1 +kerning first=211 second=193 amount=-1 +kerning first=211 second=192 amount=-1 +kerning first=211 second=65 amount=-1 +kerning first=210 second=260 amount=-1 +kerning first=210 second=256 amount=-1 +kerning first=210 second=198 amount=-1 +kerning first=210 second=197 amount=-1 +kerning first=210 second=196 amount=-1 +kerning first=210 second=194 amount=-1 +kerning first=210 second=193 amount=-1 +kerning first=45 second=122 amount=-1 +kerning first=45 second=192 amount=-1 +kerning first=45 second=193 amount=-1 +kerning first=45 second=194 amount=-1 +kerning first=45 second=195 amount=-1 +kerning first=45 second=196 amount=-1 +kerning first=45 second=197 amount=-1 +kerning first=45 second=198 amount=-1 +kerning first=45 second=200 amount=-1 +kerning first=45 second=201 amount=-1 +kerning first=45 second=202 amount=-1 +kerning first=45 second=203 amount=-1 +kerning first=45 second=204 amount=-1 +kerning first=45 second=205 amount=-1 +kerning first=45 second=206 amount=-1 +kerning first=45 second=207 amount=-1 +kerning first=45 second=209 amount=-1 +kerning first=45 second=217 amount=-1 +kerning first=45 second=218 amount=-1 +kerning first=45 second=219 amount=-1 +kerning first=45 second=220 amount=-1 +kerning first=45 second=221 amount=-1 +kerning first=210 second=192 amount=-1 +kerning first=210 second=65 amount=-1 +kerning first=209 second=8249 amount=-1 +kerning first=209 second=171 amount=-1 +kerning first=209 second=45 amount=-1 +kerning first=208 second=260 amount=-1 +kerning first=208 second=256 amount=-1 +kerning first=208 second=198 amount=-1 +kerning first=208 second=197 amount=-1 +kerning first=208 second=196 amount=-1 +kerning first=208 second=194 amount=-1 +kerning first=208 second=193 amount=-1 +kerning first=208 second=192 amount=-1 +kerning first=208 second=65 amount=-1 +kerning first=206 second=8249 amount=-1 +kerning first=206 second=171 amount=-1 +kerning first=45 second=256 amount=-1 +kerning first=206 second=45 amount=-1 +kerning first=199 second=8249 amount=-1 +kerning first=45 second=260 amount=-1 +kerning first=199 second=171 amount=-1 +kerning first=45 second=270 amount=-1 +kerning first=45 second=274 amount=-1 +kerning first=45 second=278 amount=-1 +kerning first=45 second=280 amount=-1 +kerning first=45 second=282 amount=-1 +kerning first=199 second=45 amount=-1 +kerning first=197 second=8249 amount=-1 +kerning first=197 second=8221 amount=-1 +kerning first=45 second=296 amount=-1 +kerning first=45 second=298 amount=-1 +kerning first=45 second=302 amount=-1 +kerning first=197 second=8220 amount=-1 +kerning first=197 second=8217 amount=-1 +kerning first=197 second=374 amount=-1 +kerning first=45 second=310 amount=-1 +kerning first=197 second=356 amount=-1 +kerning first=45 second=313 amount=-1 +kerning first=197 second=354 amount=-1 +kerning first=45 second=315 amount=-1 +kerning first=197 second=221 amount=-1 +kerning first=45 second=317 amount=-1 +kerning first=197 second=171 amount=-1 +kerning first=45 second=323 amount=-1 +kerning first=197 second=89 amount=-1 +kerning first=45 second=325 amount=-1 +kerning first=197 second=87 amount=-1 +kerning first=45 second=327 amount=-1 +kerning first=197 second=86 amount=-1 +kerning first=45 second=330 amount=-1 +kerning first=197 second=84 amount=-1 +kerning first=45 second=344 amount=-1 +kerning first=197 second=45 amount=-1 +kerning first=196 second=8249 amount=-1 +kerning first=196 second=8221 amount=-1 +kerning first=196 second=8220 amount=-1 +kerning first=196 second=8217 amount=-1 +kerning first=196 second=374 amount=-1 +kerning first=196 second=356 amount=-1 +kerning first=45 second=354 amount=-1 +kerning first=196 second=354 amount=-1 +kerning first=45 second=356 amount=-1 +kerning first=196 second=221 amount=-1 +kerning first=196 second=171 amount=-1 +kerning first=45 second=362 amount=-1 +kerning first=196 second=89 amount=-1 +kerning first=45 second=364 amount=-1 +kerning first=196 second=87 amount=-1 +kerning first=45 second=366 amount=-1 +kerning first=196 second=86 amount=-1 +kerning first=45 second=368 amount=-1 +kerning first=196 second=84 amount=-1 +kerning first=45 second=370 amount=-1 +kerning first=196 second=45 amount=-1 +kerning first=45 second=374 amount=-1 +kerning first=195 second=8249 amount=-1 +kerning first=45 second=377 amount=-1 +kerning first=45 second=378 amount=-1 +kerning first=45 second=379 amount=-1 +kerning first=45 second=380 amount=-1 +kerning first=45 second=381 amount=-1 +kerning first=45 second=382 amount=-1 +kerning first=195 second=8221 amount=-1 +kerning first=195 second=8220 amount=-1 +kerning first=195 second=8217 amount=-1 +kerning first=195 second=374 amount=-1 +kerning first=195 second=356 amount=-1 +kerning first=195 second=354 amount=-1 +kerning first=195 second=221 amount=-1 +kerning first=195 second=171 amount=-1 +kerning first=195 second=89 amount=-1 +kerning first=195 second=87 amount=-1 +kerning first=195 second=86 amount=-1 +kerning first=195 second=84 amount=-1 +kerning first=195 second=45 amount=-1 +kerning first=194 second=8249 amount=-1 +kerning first=194 second=8221 amount=-1 +kerning first=194 second=8220 amount=-1 +kerning first=194 second=8217 amount=-1 +kerning first=194 second=374 amount=-1 +kerning first=194 second=356 amount=-1 +kerning first=194 second=354 amount=-1 +kerning first=194 second=221 amount=-1 +kerning first=194 second=171 amount=-1 +kerning first=194 second=89 amount=-1 +kerning first=194 second=87 amount=-1 +kerning first=194 second=86 amount=-1 +kerning first=194 second=84 amount=-1 +kerning first=194 second=45 amount=-1 +kerning first=193 second=8249 amount=-1 +kerning first=193 second=8221 amount=-1 +kerning first=193 second=8220 amount=-1 +kerning first=193 second=8217 amount=-1 +kerning first=193 second=374 amount=-1 +kerning first=46 second=8217 amount=-1 +kerning first=46 second=8220 amount=-1 +kerning first=46 second=8221 amount=-1 +kerning first=193 second=356 amount=-1 +kerning first=65 second=45 amount=-1 +kerning first=193 second=354 amount=-1 +kerning first=193 second=221 amount=-1 +kerning first=193 second=171 amount=-1 +kerning first=193 second=89 amount=-1 +kerning first=193 second=87 amount=-1 +kerning first=65 second=84 amount=-1 +kerning first=193 second=86 amount=-1 +kerning first=65 second=86 amount=-1 +kerning first=65 second=87 amount=-1 +kerning first=65 second=89 amount=-1 +kerning first=193 second=84 amount=-1 +kerning first=193 second=45 amount=-1 +kerning first=192 second=8249 amount=-1 +kerning first=192 second=8221 amount=-1 +kerning first=192 second=8220 amount=-1 +kerning first=192 second=8217 amount=-1 +kerning first=192 second=374 amount=-1 +kerning first=192 second=356 amount=-1 +kerning first=192 second=354 amount=-1 +kerning first=192 second=221 amount=-1 +kerning first=192 second=171 amount=-1 +kerning first=192 second=89 amount=-1 +kerning first=192 second=87 amount=-1 +kerning first=192 second=86 amount=-1 +kerning first=192 second=84 amount=-1 +kerning first=192 second=45 amount=-1 +kerning first=187 second=382 amount=-1 +kerning first=187 second=381 amount=-1 +kerning first=187 second=380 amount=-1 +kerning first=65 second=171 amount=-1 +kerning first=187 second=379 amount=-1 +kerning first=187 second=378 amount=-1 +kerning first=187 second=377 amount=-1 +kerning first=187 second=374 amount=-1 +kerning first=187 second=370 amount=-1 +kerning first=187 second=368 amount=-1 +kerning first=187 second=366 amount=-1 +kerning first=187 second=364 amount=-1 +kerning first=187 second=362 amount=-1 +kerning first=187 second=356 amount=-1 +kerning first=187 second=354 amount=-1 +kerning first=65 second=221 amount=-1 +kerning first=187 second=344 amount=-1 +kerning first=187 second=330 amount=-1 +kerning first=187 second=327 amount=-1 +kerning first=187 second=325 amount=-1 +kerning first=187 second=323 amount=-1 +kerning first=187 second=317 amount=-1 +kerning first=187 second=315 amount=-1 +kerning first=187 second=313 amount=-1 +kerning first=187 second=310 amount=-1 +kerning first=187 second=302 amount=-1 +kerning first=187 second=298 amount=-1 +kerning first=187 second=296 amount=-1 +kerning first=187 second=282 amount=-1 +kerning first=187 second=280 amount=-1 +kerning first=187 second=278 amount=-1 +kerning first=187 second=274 amount=-1 +kerning first=187 second=270 amount=-1 +kerning first=187 second=260 amount=-1 +kerning first=187 second=256 amount=-1 +kerning first=187 second=221 amount=-1 +kerning first=187 second=220 amount=-1 +kerning first=187 second=219 amount=-1 +kerning first=187 second=218 amount=-1 +kerning first=187 second=217 amount=-1 +kerning first=187 second=209 amount=-1 +kerning first=187 second=207 amount=-1 +kerning first=187 second=206 amount=-1 +kerning first=187 second=205 amount=-1 +kerning first=187 second=204 amount=-1 +kerning first=187 second=203 amount=-1 +kerning first=187 second=202 amount=-1 +kerning first=187 second=201 amount=-1 +kerning first=187 second=200 amount=-1 +kerning first=187 second=198 amount=-1 +kerning first=187 second=197 amount=-1 +kerning first=187 second=196 amount=-1 +kerning first=187 second=195 amount=-1 +kerning first=187 second=194 amount=-1 +kerning first=187 second=193 amount=-1 +kerning first=187 second=192 amount=-1 +kerning first=187 second=122 amount=-1 +kerning first=187 second=90 amount=-1 +kerning first=187 second=89 amount=-1 +kerning first=187 second=87 amount=-1 +kerning first=187 second=86 amount=-1 +kerning first=187 second=85 amount=-1 +kerning first=187 second=84 amount=-1 +kerning first=187 second=82 amount=-1 +kerning first=187 second=80 amount=-1 +kerning first=187 second=78 amount=-1 +kerning first=187 second=77 amount=-1 +kerning first=187 second=76 amount=-1 +kerning first=187 second=75 amount=-1 +kerning first=187 second=74 amount=-1 +kerning first=187 second=73 amount=-1 +kerning first=187 second=72 amount=-1 +kerning first=187 second=70 amount=-1 +kerning first=187 second=69 amount=-1 +kerning first=187 second=68 amount=-1 +kerning first=65 second=354 amount=-1 +kerning first=187 second=66 amount=-1 +kerning first=65 second=356 amount=-1 +kerning first=187 second=65 amount=-1 +kerning first=121 second=8249 amount=-1 +kerning first=121 second=171 amount=-1 +kerning first=121 second=46 amount=-1 +kerning first=121 second=45 amount=-1 +kerning first=121 second=44 amount=-1 +kerning first=119 second=8249 amount=-1 +kerning first=119 second=171 amount=-1 +kerning first=119 second=46 amount=-1 +kerning first=119 second=45 amount=-1 +kerning first=65 second=374 amount=-1 +kerning first=119 second=44 amount=-1 +kerning first=118 second=8249 amount=-1 +kerning first=118 second=171 amount=-1 +kerning first=118 second=46 amount=-1 +kerning first=118 second=45 amount=-1 +kerning first=118 second=44 amount=-1 +kerning first=114 second=46 amount=-1 +kerning first=114 second=44 amount=-1 +kerning first=113 second=106 amount=1 +kerning first=110 second=8221 amount=-1 +kerning first=110 second=8220 amount=-1 +kerning first=110 second=8217 amount=-1 +kerning first=109 second=8221 amount=-1 +kerning first=109 second=8220 amount=-1 +kerning first=109 second=8217 amount=-1 +kerning first=104 second=8221 amount=-1 +kerning first=65 second=8217 amount=-1 +kerning first=65 second=8220 amount=-1 +kerning first=65 second=8221 amount=-1 +kerning first=65 second=8249 amount=-1 +kerning first=104 second=8220 amount=-1 +kerning first=104 second=8217 amount=-1 +kerning first=102 second=254 amount=1 +kerning first=102 second=98 amount=1 +kerning first=89 second=8249 amount=-1 +kerning first=66 second=44 amount=-1 +kerning first=89 second=291 amount=-1 +kerning first=66 second=46 amount=-1 +kerning first=66 second=65 amount=-1 +kerning first=66 second=66 amount=-1 +kerning first=89 second=289 amount=-1 +kerning first=66 second=68 amount=-1 +kerning first=66 second=69 amount=-1 +kerning first=66 second=70 amount=-1 +kerning first=89 second=287 amount=-1 +kerning first=66 second=72 amount=-1 +kerning first=66 second=73 amount=-1 +kerning first=66 second=74 amount=-1 +kerning first=66 second=75 amount=-1 +kerning first=66 second=76 amount=-1 +kerning first=66 second=77 amount=-1 +kerning first=66 second=78 amount=-1 +kerning first=89 second=261 amount=-1 +kerning first=66 second=80 amount=-1 +kerning first=89 second=260 amount=-1 +kerning first=66 second=82 amount=-1 +kerning first=66 second=83 amount=-1 +kerning first=89 second=259 amount=-1 +kerning first=89 second=257 amount=-1 +kerning first=89 second=256 amount=-1 +kerning first=89 second=230 amount=-1 +kerning first=89 second=229 amount=-1 +kerning first=66 second=90 amount=-1 +kerning first=89 second=227 amount=-1 +kerning first=89 second=226 amount=-1 +kerning first=89 second=225 amount=-1 +kerning first=89 second=198 amount=-1 +kerning first=89 second=197 amount=-1 +kerning first=89 second=196 amount=-1 +kerning first=66 second=103 amount=-1 +kerning first=89 second=194 amount=-1 +kerning first=89 second=193 amount=-1 +kerning first=89 second=192 amount=-1 +kerning first=89 second=171 amount=-1 +kerning first=89 second=103 amount=-1 +kerning first=89 second=97 amount=-1 +kerning first=89 second=74 amount=-1 +kerning first=89 second=65 amount=-1 +kerning first=89 second=46 amount=-1 +kerning first=89 second=45 amount=-1 +kerning first=89 second=44 amount=-1 +kerning first=88 second=8249 amount=-1 +kerning first=88 second=171 amount=-1 +kerning first=88 second=45 amount=-1 +kerning first=87 second=8249 amount=-1 +kerning first=87 second=291 amount=-1 +kerning first=87 second=289 amount=-1 +kerning first=87 second=287 amount=-1 +kerning first=66 second=122 amount=-1 +kerning first=87 second=261 amount=-1 +kerning first=87 second=260 amount=-1 +kerning first=66 second=192 amount=-1 +kerning first=66 second=193 amount=-1 +kerning first=66 second=194 amount=-1 +kerning first=66 second=196 amount=-1 +kerning first=66 second=197 amount=-1 +kerning first=66 second=198 amount=-1 +kerning first=87 second=259 amount=-1 +kerning first=66 second=200 amount=-1 +kerning first=66 second=201 amount=-1 +kerning first=66 second=202 amount=-1 +kerning first=66 second=203 amount=-1 +kerning first=66 second=204 amount=-1 +kerning first=66 second=205 amount=-1 +kerning first=66 second=206 amount=-1 +kerning first=66 second=207 amount=-1 +kerning first=66 second=209 amount=-1 +kerning first=87 second=257 amount=-1 +kerning first=87 second=256 amount=-1 +kerning first=87 second=230 amount=-1 +kerning first=87 second=229 amount=-1 +kerning first=87 second=227 amount=-1 +kerning first=87 second=226 amount=-1 +kerning first=87 second=225 amount=-1 +kerning first=87 second=198 amount=-1 +kerning first=87 second=197 amount=-1 +kerning first=87 second=196 amount=-1 +kerning first=87 second=194 amount=-1 +kerning first=87 second=193 amount=-1 +kerning first=87 second=192 amount=-1 +kerning first=87 second=171 amount=-1 +kerning first=87 second=103 amount=-1 +kerning first=87 second=97 amount=-1 +kerning first=87 second=74 amount=-1 +kerning first=87 second=65 amount=-1 +kerning first=87 second=46 amount=-1 +kerning first=87 second=45 amount=-1 +kerning first=87 second=44 amount=-1 +kerning first=86 second=8249 amount=-1 +kerning first=86 second=291 amount=-1 +kerning first=86 second=289 amount=-1 +kerning first=86 second=287 amount=-1 +kerning first=86 second=261 amount=-1 +kerning first=86 second=260 amount=-1 +kerning first=86 second=259 amount=-1 +kerning first=86 second=257 amount=-1 +kerning first=86 second=256 amount=-1 +kerning first=86 second=230 amount=-1 +kerning first=86 second=229 amount=-1 +kerning first=86 second=227 amount=-1 +kerning first=86 second=226 amount=-1 +kerning first=86 second=225 amount=-1 +kerning first=86 second=198 amount=-1 +kerning first=86 second=197 amount=-1 +kerning first=86 second=196 amount=-1 +kerning first=86 second=194 amount=-1 +kerning first=86 second=193 amount=-1 +kerning first=66 second=256 amount=-1 +kerning first=86 second=192 amount=-1 +kerning first=86 second=171 amount=-1 +kerning first=66 second=260 amount=-1 +kerning first=86 second=103 amount=-1 +kerning first=86 second=97 amount=-1 +kerning first=86 second=74 amount=-1 +kerning first=86 second=65 amount=-1 +kerning first=86 second=46 amount=-1 +kerning first=86 second=45 amount=-1 +kerning first=86 second=44 amount=-1 +kerning first=85 second=8249 amount=-1 +kerning first=66 second=270 amount=-1 +kerning first=66 second=274 amount=-1 +kerning first=85 second=291 amount=-1 +kerning first=85 second=289 amount=-1 +kerning first=66 second=278 amount=-1 +kerning first=85 second=287 amount=-1 +kerning first=66 second=280 amount=-1 +kerning first=85 second=260 amount=-1 +kerning first=66 second=282 amount=-1 +kerning first=85 second=256 amount=-1 +kerning first=85 second=198 amount=-1 +kerning first=85 second=197 amount=-1 +kerning first=66 second=287 amount=-1 +kerning first=85 second=196 amount=-1 +kerning first=66 second=289 amount=-1 +kerning first=85 second=194 amount=-1 +kerning first=66 second=291 amount=-1 +kerning first=66 second=296 amount=-1 +kerning first=66 second=298 amount=-1 +kerning first=66 second=302 amount=-1 +kerning first=85 second=193 amount=-1 +kerning first=66 second=304 amount=-1 +kerning first=85 second=192 amount=-1 +kerning first=66 second=310 amount=-1 +kerning first=85 second=171 amount=-1 +kerning first=66 second=313 amount=-1 +kerning first=85 second=103 amount=-1 +kerning first=66 second=315 amount=-1 +kerning first=85 second=65 amount=-1 +kerning first=66 second=317 amount=-1 +kerning first=85 second=46 amount=-1 +kerning first=66 second=323 amount=-1 +kerning first=85 second=45 amount=-1 +kerning first=66 second=325 amount=-1 +kerning first=85 second=44 amount=-1 +kerning first=66 second=327 amount=-1 +kerning first=84 second=8249 amount=-1 +kerning first=66 second=330 amount=-1 +kerning first=84 second=291 amount=-1 +kerning first=84 second=289 amount=-1 +kerning first=84 second=287 amount=-1 +kerning first=84 second=261 amount=-1 +kerning first=84 second=260 amount=-1 +kerning first=84 second=259 amount=-1 +kerning first=84 second=257 amount=-1 +kerning first=84 second=256 amount=-1 +kerning first=84 second=230 amount=-1 +kerning first=66 second=344 amount=-1 +kerning first=84 second=229 amount=-1 +kerning first=66 second=346 amount=-1 +kerning first=84 second=227 amount=-1 +kerning first=66 second=350 amount=-1 +kerning first=84 second=226 amount=-1 +kerning first=66 second=352 amount=-1 +kerning first=84 second=225 amount=-1 +kerning first=84 second=198 amount=-1 +kerning first=84 second=197 amount=-1 +kerning first=84 second=196 amount=-1 +kerning first=84 second=194 amount=-1 +kerning first=84 second=193 amount=-1 +kerning first=84 second=192 amount=-1 +kerning first=84 second=171 amount=-1 +kerning first=84 second=103 amount=-1 +kerning first=84 second=97 amount=-1 +kerning first=84 second=74 amount=-1 +kerning first=84 second=65 amount=-1 +kerning first=84 second=46 amount=-1 +kerning first=84 second=45 amount=-1 +kerning first=84 second=44 amount=-1 +kerning first=83 second=260 amount=-1 +kerning first=66 second=377 amount=-1 +kerning first=66 second=378 amount=-1 +kerning first=66 second=379 amount=-1 +kerning first=66 second=380 amount=-1 +kerning first=66 second=381 amount=-1 +kerning first=66 second=382 amount=-1 +kerning first=83 second=256 amount=-1 +kerning first=83 second=198 amount=-1 +kerning first=83 second=197 amount=-1 +kerning first=83 second=196 amount=-1 +kerning first=83 second=194 amount=-1 +kerning first=83 second=193 amount=-1 +kerning first=83 second=192 amount=-1 +kerning first=83 second=65 amount=-1 +kerning first=83 second=46 amount=-1 +kerning first=83 second=44 amount=-1 +kerning first=82 second=8249 amount=-1 +kerning first=82 second=8221 amount=-1 +kerning first=82 second=8220 amount=-1 +kerning first=82 second=8217 amount=-1 +kerning first=82 second=171 amount=-1 +kerning first=82 second=45 amount=-1 +kerning first=81 second=260 amount=-1 +kerning first=81 second=256 amount=-1 +kerning first=81 second=198 amount=-1 +kerning first=81 second=197 amount=-1 +kerning first=81 second=196 amount=-1 +kerning first=81 second=194 amount=-1 +kerning first=81 second=193 amount=-1 +kerning first=81 second=192 amount=-1 +kerning first=81 second=65 amount=-1 +kerning first=80 second=260 amount=-1 +kerning first=66 second=8217 amount=-1 +kerning first=66 second=8220 amount=-1 +kerning first=66 second=8221 amount=-1 +kerning first=80 second=256 amount=-1 +kerning first=80 second=198 amount=-1 +kerning first=80 second=197 amount=-1 +kerning first=80 second=196 amount=-1 +kerning first=80 second=194 amount=-1 +kerning first=80 second=193 amount=-1 +kerning first=80 second=192 amount=-1 +kerning first=80 second=65 amount=-1 +kerning first=67 second=45 amount=-1 +kerning first=80 second=46 amount=-1 +kerning first=80 second=44 amount=-1 +kerning first=79 second=260 amount=-1 +kerning first=79 second=256 amount=-1 +kerning first=79 second=198 amount=-1 +kerning first=79 second=197 amount=-1 +kerning first=79 second=196 amount=-1 +kerning first=79 second=194 amount=-1 +kerning first=79 second=193 amount=-1 +kerning first=79 second=192 amount=-1 +kerning first=79 second=65 amount=-1 +kerning first=78 second=8249 amount=-1 +kerning first=78 second=171 amount=-1 +kerning first=78 second=45 amount=-1 +kerning first=77 second=8249 amount=-1 +kerning first=77 second=171 amount=-1 +kerning first=77 second=45 amount=-1 +kerning first=76 second=8221 amount=-1 +kerning first=76 second=8220 amount=-1 +kerning first=76 second=8217 amount=-1 +kerning first=75 second=8249 amount=-1 +kerning first=75 second=171 amount=-1 +kerning first=75 second=45 amount=-1 +kerning first=74 second=8249 amount=-1 +kerning first=74 second=260 amount=-1 +kerning first=74 second=256 amount=-1 +kerning first=74 second=198 amount=-1 +kerning first=74 second=197 amount=-1 +kerning first=74 second=196 amount=-1 +kerning first=74 second=194 amount=-1 +kerning first=74 second=193 amount=-1 +kerning first=74 second=192 amount=-1 +kerning first=74 second=171 amount=-1 +kerning first=74 second=65 amount=-1 +kerning first=74 second=45 amount=-1 +kerning first=73 second=8249 amount=-1 +kerning first=73 second=171 amount=-1 +kerning first=73 second=45 amount=-1 +kerning first=72 second=8249 amount=-1 +kerning first=72 second=171 amount=-1 +kerning first=72 second=45 amount=-1 +kerning first=70 second=74 amount=-1 +kerning first=68 second=260 amount=-1 +kerning first=68 second=256 amount=-1 +kerning first=68 second=198 amount=-1 +kerning first=68 second=197 amount=-1 +kerning first=68 second=196 amount=-1 +kerning first=68 second=194 amount=-1 +kerning first=68 second=193 amount=-1 +kerning first=68 second=192 amount=-1 +kerning first=67 second=171 amount=-1 +kerning first=68 second=65 amount=-1 +kerning first=67 second=8249 amount=-1 diff --git a/jme3-examples/src/main/resources/jme3test/font/BM-FreeSerif16Ipad5555_0.png b/jme3-examples/src/main/resources/jme3test/font/BM-FreeSerif16Ipad5555_0.png new file mode 100644 index 000000000..72b806625 Binary files /dev/null and b/jme3-examples/src/main/resources/jme3test/font/BM-FreeSerif16Ipad5555_0.png differ diff --git a/jme3-examples/src/main/resources/jme3test/font/BM-FreeSerif32.fnt b/jme3-examples/src/main/resources/jme3test/font/BM-FreeSerif32.fnt new file mode 100644 index 000000000..c7b6891c1 --- /dev/null +++ b/jme3-examples/src/main/resources/jme3test/font/BM-FreeSerif32.fnt @@ -0,0 +1,5904 @@ +info face="FreeSerif" size=32 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=2 padding=0,0,0,0 spacing=3,3 outline=0 +common lineHeight=32 base=24 scaleW=512 scaleH=512 pages=1 packed=0 alphaChnl=0 redChnl=4 greenChnl=4 blueChnl=4 +page id=0 file="BM-FreeSerif32_0.png" +chars count=406 +char id=-1 x=148 y=222 width=15 height=18 xoffset=2 yoffset=6 xadvance=18 page=0 chnl=15 +char id=32 x=507 y=229 width=1 height=1 xoffset=0 yoffset=0 xadvance=6 page=0 chnl=15 +char id=33 x=110 y=201 width=4 height=19 xoffset=3 yoffset=6 xadvance=9 page=0 chnl=15 +char id=34 x=422 y=256 width=7 height=7 xoffset=2 yoffset=6 xadvance=11 page=0 chnl=15 +char id=35 x=200 y=222 width=14 height=18 xoffset=0 yoffset=6 xadvance=13 page=0 chnl=15 +char id=36 x=224 y=109 width=12 height=22 xoffset=1 yoffset=4 xadvance=13 page=0 chnl=15 +char id=37 x=241 y=134 width=19 height=19 xoffset=1 yoffset=6 xadvance=22 page=0 chnl=15 +char id=38 x=263 y=134 width=19 height=19 xoffset=1 yoffset=6 xadvance=20 page=0 chnl=15 +char id=39 x=505 y=238 width=3 height=7 xoffset=1 yoffset=6 xadvance=5 page=0 chnl=15 +char id=40 x=495 y=82 width=8 height=23 xoffset=1 yoffset=6 xadvance=9 page=0 chnl=15 +char id=41 x=0 y=112 width=8 height=23 xoffset=0 yoffset=6 xadvance=9 page=0 chnl=15 +char id=42 x=170 y=262 width=10 height=12 xoffset=1 yoffset=6 xadvance=13 page=0 chnl=15 +char id=43 x=340 y=241 width=14 height=14 xoffset=0 yoffset=10 xadvance=15 page=0 chnl=15 +char id=44 x=465 y=255 width=5 height=7 xoffset=1 yoffset=21 xadvance=6 page=0 chnl=15 +char id=45 x=333 y=270 width=7 height=2 xoffset=1 yoffset=17 xadvance=9 page=0 chnl=15 +char id=46 x=179 y=277 width=4 height=4 xoffset=1 yoffset=21 xadvance=6 page=0 chnl=15 +char id=47 x=471 y=175 width=9 height=19 xoffset=0 yoffset=6 xadvance=7 page=0 chnl=15 +char id=48 x=206 y=156 width=13 height=19 xoffset=0 yoffset=6 xadvance=13 page=0 chnl=15 +char id=49 x=404 y=219 width=8 height=18 xoffset=2 yoffset=6 xadvance=13 page=0 chnl=15 +char id=50 x=233 y=221 width=13 height=18 xoffset=0 yoffset=6 xadvance=13 page=0 chnl=15 +char id=51 x=498 y=131 width=11 height=19 xoffset=1 yoffset=6 xadvance=13 page=0 chnl=15 +char id=52 x=249 y=221 width=13 height=18 xoffset=0 yoffset=6 xadvance=13 page=0 chnl=15 +char id=53 x=135 y=179 width=12 height=19 xoffset=0 yoffset=5 xadvance=13 page=0 chnl=15 +char id=54 x=60 y=180 width=12 height=19 xoffset=0 yoffset=5 xadvance=13 page=0 chnl=15 +char id=55 x=90 y=180 width=12 height=19 xoffset=0 yoffset=6 xadvance=13 page=0 chnl=15 +char id=56 x=378 y=176 width=11 height=19 xoffset=1 yoffset=6 xadvance=13 page=0 chnl=15 +char id=57 x=165 y=179 width=12 height=19 xoffset=0 yoffset=6 xadvance=13 page=0 chnl=15 +char id=58 x=505 y=197 width=4 height=13 xoffset=2 yoffset=11 xadvance=7 page=0 chnl=15 +char id=59 x=154 y=243 width=5 height=17 xoffset=1 yoffset=11 xadvance=7 page=0 chnl=15 +char id=60 x=289 y=242 width=14 height=15 xoffset=0 yoffset=10 xadvance=15 page=0 chnl=15 +char id=61 x=280 y=260 width=14 height=8 xoffset=0 yoffset=13 xadvance=15 page=0 chnl=15 +char id=62 x=306 y=242 width=14 height=15 xoffset=0 yoffset=10 xadvance=15 page=0 chnl=15 +char id=63 x=458 y=175 width=10 height=19 xoffset=1 yoffset=6 xadvance=12 page=0 chnl=15 +char id=64 x=219 y=134 width=19 height=19 xoffset=3 yoffset=6 xadvance=24 page=0 chnl=15 +char id=65 x=235 y=200 width=19 height=18 xoffset=0 yoffset=6 xadvance=19 page=0 chnl=15 +char id=66 x=0 y=226 width=16 height=18 xoffset=0 yoffset=6 xadvance=18 page=0 chnl=15 +char id=67 x=478 y=131 width=17 height=19 xoffset=0 yoffset=6 xadvance=18 page=0 chnl=15 +char id=68 x=257 y=200 width=19 height=18 xoffset=0 yoffset=6 xadvance=19 page=0 chnl=15 +char id=69 x=19 y=226 width=16 height=18 xoffset=0 yoffset=6 xadvance=16 page=0 chnl=15 +char id=70 x=76 y=224 width=15 height=18 xoffset=0 yoffset=6 xadvance=15 page=0 chnl=15 +char id=71 x=285 y=134 width=19 height=19 xoffset=0 yoffset=6 xadvance=19 page=0 chnl=15 +char id=72 x=279 y=200 width=19 height=18 xoffset=0 yoffset=6 xadvance=19 page=0 chnl=15 +char id=73 x=368 y=219 width=9 height=18 xoffset=0 yoffset=6 xadvance=9 page=0 chnl=15 +char id=74 x=406 y=176 width=10 height=19 xoffset=0 yoffset=6 xadvance=10 page=0 chnl=15 +char id=75 x=345 y=198 width=19 height=18 xoffset=0 yoffset=6 xadvance=19 page=0 chnl=15 +char id=76 x=38 y=226 width=16 height=18 xoffset=0 yoffset=6 xadvance=16 page=0 chnl=15 +char id=77 x=143 y=201 width=23 height=18 xoffset=0 yoffset=6 xadvance=23 page=0 chnl=15 +char id=78 x=307 y=133 width=19 height=19 xoffset=0 yoffset=6 xadvance=19 page=0 chnl=15 +char id=79 x=436 y=131 width=18 height=19 xoffset=0 yoffset=6 xadvance=19 page=0 chnl=15 +char id=80 x=94 y=224 width=15 height=18 xoffset=0 yoffset=6 xadvance=15 page=0 chnl=15 +char id=81 x=179 y=83 width=19 height=23 xoffset=0 yoffset=6 xadvance=19 page=0 chnl=15 +char id=82 x=389 y=198 width=18 height=18 xoffset=0 yoffset=6 xadvance=18 page=0 chnl=15 +char id=83 x=459 y=153 width=12 height=19 xoffset=1 yoffset=6 xadvance=15 page=0 chnl=15 +char id=84 x=57 y=226 width=16 height=18 xoffset=0 yoffset=6 xadvance=16 page=0 chnl=15 +char id=85 x=351 y=132 width=19 height=19 xoffset=0 yoffset=6 xadvance=19 page=0 chnl=15 +char id=86 x=131 y=135 width=19 height=19 xoffset=0 yoffset=6 xadvance=19 page=0 chnl=15 +char id=87 x=0 y=138 width=25 height=19 xoffset=0 yoffset=6 xadvance=25 page=0 chnl=15 +char id=88 x=191 y=201 width=19 height=18 xoffset=0 yoffset=6 xadvance=19 page=0 chnl=15 +char id=89 x=213 y=200 width=19 height=18 xoffset=0 yoffset=6 xadvance=19 page=0 chnl=15 +char id=90 x=410 y=198 width=16 height=18 xoffset=0 yoffset=6 xadvance=16 page=0 chnl=15 +char id=91 x=41 y=111 width=6 height=23 xoffset=2 yoffset=6 xadvance=9 page=0 chnl=15 +char id=92 x=59 y=204 width=8 height=19 xoffset=0 yoffset=6 xadvance=8 page=0 chnl=15 +char id=93 x=32 y=111 width=6 height=23 xoffset=1 yoffset=6 xadvance=9 page=0 chnl=15 +char id=94 x=194 y=262 width=12 height=11 xoffset=0 yoffset=6 xadvance=12 page=0 chnl=15 +char id=95 x=258 y=275 width=14 height=2 xoffset=0 yoffset=25 xadvance=13 page=0 chnl=15 +char id=96 x=10 y=283 width=7 height=6 xoffset=0 yoffset=5 xadvance=9 page=0 chnl=15 +char id=97 x=48 y=267 width=12 height=13 xoffset=0 yoffset=11 xadvance=12 page=0 chnl=15 +char id=98 x=222 y=156 width=13 height=19 xoffset=0 yoffset=5 xadvance=13 page=0 chnl=15 +char id=99 x=78 y=267 width=11 height=13 xoffset=0 yoffset=11 xadvance=12 page=0 chnl=15 +char id=100 x=174 y=157 width=13 height=19 xoffset=0 yoffset=5 xadvance=13 page=0 chnl=15 +char id=101 x=92 y=265 width=11 height=13 xoffset=0 yoffset=11 xadvance=12 page=0 chnl=15 +char id=102 x=419 y=176 width=10 height=19 xoffset=0 yoffset=5 xadvance=9 page=0 chnl=15 +char id=103 x=429 y=154 width=12 height=19 xoffset=0 yoffset=11 xadvance=13 page=0 chnl=15 +char id=104 x=302 y=156 width=13 height=19 xoffset=0 yoffset=5 xadvance=13 page=0 chnl=15 +char id=105 x=100 y=202 width=7 height=19 xoffset=0 yoffset=5 xadvance=7 page=0 chnl=15 +char id=106 x=274 y=28 width=8 height=25 xoffset=-2 yoffset=5 xadvance=7 page=0 chnl=15 +char id=107 x=93 y=157 width=14 height=19 xoffset=0 yoffset=5 xadvance=13 page=0 chnl=15 +char id=108 x=90 y=202 width=7 height=19 xoffset=0 yoffset=5 xadvance=7 page=0 chnl=15 +char id=109 x=387 y=240 width=21 height=13 xoffset=0 yoffset=11 xadvance=20 page=0 chnl=15 +char id=110 x=16 y=267 width=13 height=13 xoffset=0 yoffset=11 xadvance=13 page=0 chnl=15 +char id=111 x=63 y=267 width=12 height=13 xoffset=0 yoffset=11 xadvance=13 page=0 chnl=15 +char id=112 x=254 y=156 width=13 height=19 xoffset=0 yoffset=11 xadvance=13 page=0 chnl=15 +char id=113 x=270 y=156 width=13 height=19 xoffset=0 yoffset=11 xadvance=13 page=0 chnl=15 +char id=114 x=106 y=265 width=9 height=13 xoffset=0 yoffset=11 xadvance=9 page=0 chnl=15 +char id=115 x=118 y=264 width=9 height=13 xoffset=1 yoffset=11 xadvance=10 page=0 chnl=15 +char id=116 x=243 y=242 width=8 height=16 xoffset=0 yoffset=8 xadvance=7 page=0 chnl=15 +char id=117 x=32 y=267 width=13 height=13 xoffset=0 yoffset=12 xadvance=13 page=0 chnl=15 +char id=118 x=489 y=238 width=13 height=13 xoffset=0 yoffset=12 xadvance=13 page=0 chnl=15 +char id=119 x=411 y=240 width=18 height=13 xoffset=0 yoffset=12 xadvance=19 page=0 chnl=15 +char id=120 x=140 y=263 width=13 height=12 xoffset=0 yoffset=12 xadvance=13 page=0 chnl=15 +char id=121 x=217 y=221 width=13 height=18 xoffset=0 yoffset=12 xadvance=13 page=0 chnl=15 +char id=122 x=156 y=263 width=11 height=12 xoffset=0 yoffset=12 xadvance=12 page=0 chnl=15 +char id=123 x=502 y=0 width=7 height=24 xoffset=2 yoffset=5 xadvance=13 page=0 chnl=15 +char id=124 x=507 y=175 width=2 height=19 xoffset=1 yoffset=6 xadvance=5 page=0 chnl=15 +char id=125 x=22 y=112 width=7 height=23 xoffset=3 yoffset=6 xadvance=13 page=0 chnl=15 +char id=126 x=38 y=283 width=13 height=5 xoffset=1 yoffset=15 xadvance=14 page=0 chnl=15 +char id=160 x=353 y=269 width=1 height=1 xoffset=0 yoffset=0 xadvance=6 page=0 chnl=15 +char id=161 x=504 y=153 width=4 height=19 xoffset=2 yoffset=11 xadvance=9 page=0 chnl=15 +char id=162 x=496 y=108 width=11 height=20 xoffset=1 yoffset=8 xadvance=13 page=0 chnl=15 +char id=163 x=398 y=154 width=13 height=19 xoffset=0 yoffset=6 xadvance=13 page=0 chnl=15 +char id=164 x=254 y=242 width=15 height=15 xoffset=-1 yoffset=8 xadvance=13 page=0 chnl=15 +char id=165 x=429 y=198 width=16 height=18 xoffset=-1 yoffset=6 xadvance=13 page=0 chnl=15 +char id=166 x=506 y=82 width=2 height=19 xoffset=1 yoffset=6 xadvance=5 page=0 chnl=15 +char id=167 x=268 y=109 width=10 height=22 xoffset=1 yoffset=6 xadvance=13 page=0 chnl=15 +char id=168 x=167 y=278 width=9 height=4 xoffset=0 yoffset=7 xadvance=9 page=0 chnl=15 +char id=169 x=292 y=109 width=20 height=21 xoffset=0 yoffset=4 xadvance=21 page=0 chnl=15 +char id=170 x=352 y=258 width=8 height=8 xoffset=0 yoffset=6 xadvance=7 page=0 chnl=15 +char id=171 x=209 y=262 width=12 height=11 xoffset=0 yoffset=12 xadvance=12 page=0 chnl=15 +char id=172 x=297 y=260 width=14 height=8 xoffset=0 yoffset=13 xadvance=15 page=0 chnl=15 +char id=173 x=343 y=269 width=7 height=2 xoffset=1 yoffset=17 xadvance=9 page=0 chnl=15 +char id=174 x=315 y=108 width=20 height=21 xoffset=0 yoffset=4 xadvance=21 page=0 chnl=15 +char id=175 x=309 y=271 width=9 height=2 xoffset=0 yoffset=8 xadvance=9 page=0 chnl=15 +char id=176 x=340 y=258 width=9 height=8 xoffset=1 yoffset=6 xadvance=10 page=0 chnl=15 +char id=177 x=166 y=222 width=14 height=18 xoffset=0 yoffset=7 xadvance=15 page=0 chnl=15 +char id=178 x=239 y=261 width=9 height=11 xoffset=0 yoffset=6 xadvance=8 page=0 chnl=15 +char id=179 x=183 y=262 width=8 height=12 xoffset=0 yoffset=6 xadvance=8 page=0 chnl=15 +char id=180 x=0 y=283 width=7 height=6 xoffset=2 yoffset=5 xadvance=9 page=0 chnl=15 +char id=181 x=183 y=222 width=14 height=18 xoffset=0 yoffset=12 xadvance=13 page=0 chnl=15 +char id=182 x=384 y=82 width=13 height=23 xoffset=0 yoffset=6 xadvance=13 page=0 chnl=15 +char id=183 x=505 y=248 width=4 height=4 xoffset=1 yoffset=16 xadvance=6 page=0 chnl=15 +char id=184 x=432 y=255 width=6 height=7 xoffset=1 yoffset=23 xadvance=9 page=0 chnl=15 +char id=185 x=271 y=260 width=6 height=11 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=186 x=328 y=259 width=9 height=8 xoffset=0 yoffset=6 xadvance=8 page=0 chnl=15 +char id=187 x=224 y=261 width=12 height=11 xoffset=0 yoffset=12 xadvance=12 page=0 chnl=15 +char id=188 x=175 y=135 width=19 height=19 xoffset=0 yoffset=6 xadvance=20 page=0 chnl=15 +char id=189 x=108 y=135 width=20 height=19 xoffset=0 yoffset=6 xadvance=20 page=0 chnl=15 +char id=190 x=197 y=134 width=19 height=19 xoffset=0 yoffset=6 xadvance=20 page=0 chnl=15 +char id=191 x=445 y=175 width=10 height=19 xoffset=0 yoffset=11 xadvance=12 page=0 chnl=15 +char id=192 x=355 y=28 width=19 height=24 xoffset=0 yoffset=0 xadvance=19 page=0 chnl=15 +char id=193 x=421 y=28 width=19 height=24 xoffset=0 yoffset=0 xadvance=19 page=0 chnl=15 +char id=194 x=110 y=57 width=19 height=24 xoffset=0 yoffset=0 xadvance=19 page=0 chnl=15 +char id=195 x=91 y=84 width=19 height=23 xoffset=0 yoffset=1 xadvance=19 page=0 chnl=15 +char id=196 x=47 y=85 width=19 height=23 xoffset=0 yoffset=1 xadvance=19 page=0 chnl=15 +char id=197 x=465 y=28 width=19 height=24 xoffset=0 yoffset=0 xadvance=19 page=0 chnl=15 +char id=198 x=117 y=201 width=23 height=18 xoffset=0 yoffset=6 xadvance=23 page=0 chnl=15 +char id=199 x=174 y=56 width=17 height=24 xoffset=0 yoffset=6 xadvance=18 page=0 chnl=15 +char id=200 x=365 y=55 width=16 height=24 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=201 x=346 y=55 width=16 height=24 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=202 x=327 y=55 width=16 height=24 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=203 x=346 y=82 width=16 height=23 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=204 x=0 y=85 width=9 height=24 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=15 +char id=205 x=497 y=55 width=9 height=24 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=15 +char id=206 x=485 y=55 width=9 height=24 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=15 +char id=207 x=483 y=82 width=9 height=23 xoffset=0 yoffset=1 xadvance=9 page=0 chnl=15 +char id=208 x=169 y=201 width=19 height=18 xoffset=0 yoffset=6 xadvance=19 page=0 chnl=15 +char id=209 x=135 y=84 width=19 height=23 xoffset=0 yoffset=1 xadvance=19 page=0 chnl=15 +char id=210 x=481 y=0 width=18 height=25 xoffset=0 yoffset=0 xadvance=19 page=0 chnl=15 +char id=211 x=42 y=30 width=18 height=25 xoffset=0 yoffset=0 xadvance=19 page=0 chnl=15 +char id=212 x=460 y=0 width=18 height=25 xoffset=0 yoffset=0 xadvance=19 page=0 chnl=15 +char id=213 x=266 y=83 width=18 height=23 xoffset=0 yoffset=1 xadvance=19 page=0 chnl=15 +char id=214 x=245 y=83 width=18 height=23 xoffset=0 yoffset=1 xadvance=19 page=0 chnl=15 +char id=215 x=323 y=242 width=14 height=14 xoffset=0 yoffset=10 xadvance=15 page=0 chnl=15 +char id=216 x=139 y=110 width=18 height=22 xoffset=0 yoffset=4 xadvance=19 page=0 chnl=15 +char id=217 x=373 y=0 width=19 height=25 xoffset=0 yoffset=0 xadvance=19 page=0 chnl=15 +char id=218 x=219 y=0 width=19 height=25 xoffset=0 yoffset=0 xadvance=19 page=0 chnl=15 +char id=219 x=417 y=0 width=19 height=25 xoffset=0 yoffset=0 xadvance=19 page=0 chnl=15 +char id=220 x=201 y=83 width=19 height=23 xoffset=0 yoffset=1 xadvance=19 page=0 chnl=15 +char id=221 x=333 y=28 width=19 height=24 xoffset=0 yoffset=0 xadvance=19 page=0 chnl=15 +char id=222 x=112 y=223 width=15 height=18 xoffset=0 yoffset=6 xadvance=15 page=0 chnl=15 +char id=223 x=158 y=157 width=13 height=19 xoffset=0 yoffset=5 xadvance=13 page=0 chnl=15 +char id=224 x=444 y=153 width=12 height=19 xoffset=0 yoffset=5 xadvance=12 page=0 chnl=15 +char id=225 x=474 y=153 width=12 height=19 xoffset=0 yoffset=5 xadvance=12 page=0 chnl=15 +char id=226 x=120 y=179 width=12 height=19 xoffset=0 yoffset=6 xadvance=12 page=0 chnl=15 +char id=227 x=296 y=221 width=12 height=18 xoffset=0 yoffset=7 xadvance=12 page=0 chnl=15 +char id=228 x=0 y=247 width=12 height=17 xoffset=0 yoffset=7 xadvance=12 page=0 chnl=15 +char id=229 x=481 y=108 width=12 height=20 xoffset=0 yoffset=4 xadvance=12 page=0 chnl=15 +char id=230 x=453 y=239 width=17 height=13 xoffset=0 yoffset=11 xadvance=17 page=0 chnl=15 +char id=231 x=294 y=178 width=11 height=19 xoffset=0 yoffset=11 xadvance=12 page=0 chnl=15 +char id=232 x=392 y=176 width=11 height=19 xoffset=0 yoffset=5 xadvance=12 page=0 chnl=15 +char id=233 x=308 y=178 width=11 height=19 xoffset=0 yoffset=5 xadvance=12 page=0 chnl=15 +char id=234 x=322 y=177 width=11 height=19 xoffset=0 yoffset=6 xadvance=12 page=0 chnl=15 +char id=235 x=89 y=245 width=11 height=17 xoffset=0 yoffset=7 xadvance=12 page=0 chnl=15 +char id=236 x=80 y=202 width=7 height=19 xoffset=0 yoffset=5 xadvance=7 page=0 chnl=15 +char id=237 x=48 y=204 width=8 height=19 xoffset=0 yoffset=5 xadvance=7 page=0 chnl=15 +char id=238 x=392 y=219 width=9 height=18 xoffset=0 yoffset=6 xadvance=7 page=0 chnl=15 +char id=239 x=143 y=243 width=8 height=17 xoffset=0 yoffset=7 xadvance=7 page=0 chnl=15 +char id=240 x=0 y=182 width=12 height=19 xoffset=0 yoffset=5 xadvance=13 page=0 chnl=15 +char id=241 x=443 y=219 width=13 height=17 xoffset=0 yoffset=7 xadvance=13 page=0 chnl=15 +char id=242 x=489 y=153 width=12 height=19 xoffset=0 yoffset=5 xadvance=13 page=0 chnl=15 +char id=243 x=75 y=180 width=12 height=19 xoffset=0 yoffset=5 xadvance=13 page=0 chnl=15 +char id=244 x=105 y=179 width=12 height=19 xoffset=0 yoffset=6 xadvance=13 page=0 chnl=15 +char id=245 x=281 y=221 width=12 height=18 xoffset=0 yoffset=7 xadvance=13 page=0 chnl=15 +char id=246 x=45 y=247 width=12 height=17 xoffset=0 yoffset=7 xadvance=13 page=0 chnl=15 +char id=247 x=272 y=242 width=14 height=15 xoffset=0 yoffset=10 xadvance=15 page=0 chnl=15 +char id=248 x=311 y=221 width=12 height=18 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15 +char id=249 x=350 y=154 width=13 height=19 xoffset=0 yoffset=5 xadvance=13 page=0 chnl=15 +char id=250 x=366 y=154 width=13 height=19 xoffset=0 yoffset=5 xadvance=13 page=0 chnl=15 +char id=251 x=190 y=157 width=13 height=19 xoffset=0 yoffset=6 xadvance=13 page=0 chnl=15 +char id=252 x=459 y=218 width=13 height=17 xoffset=0 yoffset=7 xadvance=13 page=0 chnl=15 +char id=253 x=139 y=29 width=13 height=25 xoffset=0 yoffset=5 xadvance=13 page=0 chnl=15 +char id=254 x=155 y=29 width=13 height=25 xoffset=0 yoffset=5 xadvance=13 page=0 chnl=15 +char id=255 x=400 y=82 width=13 height=23 xoffset=0 yoffset=7 xadvance=13 page=0 chnl=15 +char id=256 x=338 y=108 width=19 height=21 xoffset=0 yoffset=3 xadvance=19 page=0 chnl=15 +char id=257 x=30 y=247 width=12 height=17 xoffset=0 yoffset=8 xadvance=12 page=0 chnl=15 +char id=258 x=0 y=58 width=19 height=24 xoffset=0 yoffset=0 xadvance=19 page=0 chnl=15 +char id=259 x=30 y=182 width=12 height=19 xoffset=0 yoffset=6 xadvance=12 page=0 chnl=15 +char id=260 x=23 y=85 width=21 height=23 xoffset=0 yoffset=6 xadvance=19 page=0 chnl=15 +char id=261 x=60 y=247 width=12 height=17 xoffset=0 yoffset=11 xadvance=12 page=0 chnl=15 +char id=262 x=83 y=29 width=17 height=25 xoffset=0 yoffset=0 xadvance=18 page=0 chnl=15 +char id=263 x=238 y=178 width=11 height=19 xoffset=0 yoffset=5 xadvance=12 page=0 chnl=15 +char id=264 x=103 y=29 width=17 height=25 xoffset=0 yoffset=0 xadvance=18 page=0 chnl=15 +char id=265 x=364 y=176 width=11 height=19 xoffset=0 yoffset=6 xadvance=12 page=0 chnl=15 +char id=266 x=307 y=82 width=17 height=23 xoffset=0 yoffset=1 xadvance=18 page=0 chnl=15 +char id=267 x=340 y=220 width=11 height=18 xoffset=0 yoffset=7 xadvance=12 page=0 chnl=15 +char id=268 x=63 y=29 width=17 height=25 xoffset=0 yoffset=0 xadvance=18 page=0 chnl=15 +char id=269 x=280 y=178 width=11 height=19 xoffset=0 yoffset=6 xadvance=12 page=0 chnl=15 +char id=270 x=443 y=28 width=19 height=24 xoffset=0 yoffset=0 xadvance=19 page=0 chnl=15 +char id=271 x=20 y=160 width=16 height=19 xoffset=0 yoffset=5 xadvance=17 page=0 chnl=15 +char id=272 x=301 y=200 width=19 height=18 xoffset=0 yoffset=6 xadvance=19 page=0 chnl=15 +char id=273 x=334 y=154 width=13 height=19 xoffset=0 yoffset=5 xadvance=13 page=0 chnl=15 +char id=274 x=360 y=108 width=16 height=21 xoffset=0 yoffset=3 xadvance=16 page=0 chnl=15 +char id=275 x=117 y=244 width=11 height=17 xoffset=0 yoffset=8 xadvance=12 page=0 chnl=15 +char id=276 x=289 y=55 width=16 height=24 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=277 x=350 y=176 width=11 height=19 xoffset=0 yoffset=6 xadvance=12 page=0 chnl=15 +char id=278 x=365 y=82 width=16 height=23 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=279 x=326 y=220 width=11 height=18 xoffset=0 yoffset=7 xadvance=12 page=0 chnl=15 +char id=280 x=287 y=83 width=17 height=23 xoffset=0 yoffset=6 xadvance=16 page=0 chnl=15 +char id=281 x=103 y=245 width=11 height=17 xoffset=0 yoffset=11 xadvance=12 page=0 chnl=15 +char id=282 x=308 y=55 width=16 height=24 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=283 x=336 y=176 width=11 height=19 xoffset=0 yoffset=6 xadvance=12 page=0 chnl=15 +char id=284 x=66 y=57 width=19 height=24 xoffset=0 yoffset=0 xadvance=19 page=0 chnl=15 +char id=285 x=446 y=55 width=12 height=24 xoffset=0 yoffset=6 xadvance=13 page=0 chnl=15 +char id=286 x=311 y=28 width=19 height=24 xoffset=0 yoffset=0 xadvance=19 page=0 chnl=15 +char id=287 x=431 y=55 width=12 height=24 xoffset=0 yoffset=6 xadvance=13 page=0 chnl=15 +char id=288 x=69 y=84 width=19 height=23 xoffset=0 yoffset=1 xadvance=19 page=0 chnl=15 +char id=289 x=416 y=82 width=12 height=23 xoffset=0 yoffset=7 xadvance=13 page=0 chnl=15 +char id=290 x=92 y=0 width=19 height=26 xoffset=0 yoffset=6 xadvance=19 page=0 chnl=15 +char id=291 x=154 y=0 width=12 height=26 xoffset=0 yoffset=4 xadvance=13 page=0 chnl=15 +char id=292 x=399 y=28 width=19 height=24 xoffset=0 yoffset=0 xadvance=19 page=0 chnl=15 +char id=293 x=400 y=55 width=13 height=24 xoffset=0 yoffset=0 xadvance=13 page=0 chnl=15 +char id=294 x=323 y=199 width=19 height=18 xoffset=0 yoffset=6 xadvance=19 page=0 chnl=15 +char id=295 x=126 y=157 width=13 height=19 xoffset=0 yoffset=5 xadvance=13 page=0 chnl=15 +char id=296 x=459 y=82 width=9 height=23 xoffset=0 yoffset=1 xadvance=9 page=0 chnl=15 +char id=297 x=131 y=243 width=9 height=17 xoffset=-1 yoffset=7 xadvance=7 page=0 chnl=15 +char id=298 x=395 y=108 width=9 height=21 xoffset=0 yoffset=3 xadvance=9 page=0 chnl=15 +char id=299 x=220 y=242 width=9 height=16 xoffset=0 yoffset=8 xadvance=7 page=0 chnl=15 +char id=300 x=461 y=55 width=9 height=24 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=15 +char id=301 x=415 y=219 width=8 height=18 xoffset=0 yoffset=6 xadvance=7 page=0 chnl=15 +char id=302 x=445 y=82 width=11 height=23 xoffset=0 yoffset=6 xadvance=9 page=0 chnl=15 +char id=303 x=11 y=112 width=8 height=23 xoffset=0 yoffset=5 xadvance=7 page=0 chnl=15 +char id=304 x=471 y=82 width=9 height=23 xoffset=0 yoffset=1 xadvance=9 page=0 chnl=15 +char id=305 x=130 y=264 width=7 height=13 xoffset=0 yoffset=11 xadvance=7 page=0 chnl=15 +char id=306 x=153 y=135 width=19 height=19 xoffset=0 yoffset=6 xadvance=18 page=0 chnl=15 +char id=307 x=231 y=28 width=12 height=25 xoffset=0 yoffset=5 xadvance=14 page=0 chnl=15 +char id=308 x=260 y=28 width=11 height=25 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=15 +char id=309 x=246 y=28 width=11 height=25 xoffset=-2 yoffset=5 xadvance=7 page=0 chnl=15 +char id=310 x=70 y=0 width=19 height=26 xoffset=0 yoffset=6 xadvance=19 page=0 chnl=15 +char id=311 x=21 y=0 width=14 height=27 xoffset=0 yoffset=5 xadvance=13 page=0 chnl=15 +char id=312 x=473 y=238 width=13 height=13 xoffset=0 yoffset=11 xadvance=13 page=0 chnl=15 +char id=313 x=232 y=56 width=16 height=24 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=314 x=12 y=85 width=8 height=24 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=15 +char id=315 x=135 y=0 width=16 height=26 xoffset=0 yoffset=6 xadvance=16 page=0 chnl=15 +char id=316 x=38 y=0 width=7 height=27 xoffset=0 yoffset=5 xadvance=7 page=0 chnl=15 +char id=317 x=39 y=160 width=16 height=19 xoffset=0 yoffset=5 xadvance=16 page=0 chnl=15 +char id=318 x=266 y=178 width=11 height=19 xoffset=0 yoffset=5 xadvance=10 page=0 chnl=15 +char id=319 x=448 y=197 width=16 height=18 xoffset=0 yoffset=6 xadvance=16 page=0 chnl=15 +char id=320 x=252 y=178 width=11 height=19 xoffset=0 yoffset=5 xadvance=12 page=0 chnl=15 +char id=321 x=467 y=197 width=16 height=18 xoffset=0 yoffset=6 xadvance=16 page=0 chnl=15 +char id=322 x=70 y=202 width=7 height=19 xoffset=0 yoffset=5 xadvance=7 page=0 chnl=15 +char id=323 x=351 y=0 width=19 height=25 xoffset=0 yoffset=0 xadvance=19 page=0 chnl=15 +char id=324 x=286 y=156 width=13 height=19 xoffset=0 yoffset=5 xadvance=13 page=0 chnl=15 +char id=325 x=48 y=0 width=19 height=26 xoffset=0 yoffset=6 xadvance=19 page=0 chnl=15 +char id=326 x=379 y=108 width=13 height=21 xoffset=0 yoffset=11 xadvance=13 page=0 chnl=15 +char id=327 x=377 y=28 width=19 height=24 xoffset=0 yoffset=0 xadvance=19 page=0 chnl=15 +char id=328 x=265 y=221 width=13 height=18 xoffset=0 yoffset=6 xadvance=13 page=0 chnl=15 +char id=329 x=58 y=158 width=15 height=19 xoffset=0 yoffset=5 xadvance=15 page=0 chnl=15 +char id=330 x=373 y=132 width=18 height=19 xoffset=0 yoffset=6 xadvance=19 page=0 chnl=15 +char id=331 x=150 y=179 width=12 height=19 xoffset=0 yoffset=11 xadvance=13 page=0 chnl=15 +char id=332 x=118 y=110 width=18 height=22 xoffset=0 yoffset=3 xadvance=19 page=0 chnl=15 +char id=333 x=15 y=247 width=12 height=17 xoffset=0 yoffset=8 xadvance=13 page=0 chnl=15 +char id=334 x=0 y=30 width=18 height=25 xoffset=0 yoffset=0 xadvance=19 page=0 chnl=15 +char id=335 x=414 y=154 width=12 height=19 xoffset=0 yoffset=6 xadvance=13 page=0 chnl=15 +char id=336 x=439 y=0 width=18 height=25 xoffset=0 yoffset=0 xadvance=19 page=0 chnl=15 +char id=337 x=15 y=182 width=12 height=19 xoffset=0 yoffset=5 xadvance=13 page=0 chnl=15 +char id=338 x=56 y=136 width=23 height=19 xoffset=0 yoffset=6 xadvance=23 page=0 chnl=15 +char id=339 x=432 y=239 width=18 height=13 xoffset=0 yoffset=11 xadvance=19 page=0 chnl=15 +char id=340 x=153 y=57 width=18 height=24 xoffset=0 yoffset=0 xadvance=18 page=0 chnl=15 +char id=341 x=36 y=204 width=9 height=19 xoffset=0 yoffset=5 xadvance=9 page=0 chnl=15 +char id=342 x=114 y=0 width=18 height=26 xoffset=0 yoffset=6 xadvance=18 page=0 chnl=15 +char id=343 x=407 y=108 width=9 height=21 xoffset=0 yoffset=11 xadvance=9 page=0 chnl=15 +char id=344 x=132 y=57 width=18 height=24 xoffset=0 yoffset=0 xadvance=18 page=0 chnl=15 +char id=345 x=380 y=219 width=9 height=18 xoffset=0 yoffset=6 xadvance=9 page=0 chnl=15 +char id=346 x=216 y=28 width=12 height=25 xoffset=1 yoffset=0 xadvance=15 page=0 chnl=15 +char id=347 x=24 y=204 width=9 height=19 xoffset=1 yoffset=5 xadvance=10 page=0 chnl=15 +char id=348 x=201 y=28 width=12 height=25 xoffset=1 yoffset=0 xadvance=15 page=0 chnl=15 +char id=349 x=12 y=204 width=9 height=19 xoffset=0 yoffset=6 xadvance=10 page=0 chnl=15 +char id=350 x=416 y=55 width=12 height=24 xoffset=1 yoffset=6 xadvance=15 page=0 chnl=15 +char id=351 x=495 y=175 width=9 height=19 xoffset=1 yoffset=11 xadvance=10 page=0 chnl=15 +char id=352 x=171 y=28 width=12 height=25 xoffset=1 yoffset=0 xadvance=15 page=0 chnl=15 +char id=353 x=0 y=204 width=9 height=19 xoffset=1 yoffset=6 xadvance=10 page=0 chnl=15 +char id=354 x=251 y=56 width=16 height=24 xoffset=0 yoffset=6 xadvance=16 page=0 chnl=15 +char id=355 x=281 y=109 width=8 height=22 xoffset=0 yoffset=8 xadvance=7 page=0 chnl=15 +char id=356 x=213 y=56 width=16 height=24 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=357 x=224 y=178 width=11 height=19 xoffset=0 yoffset=5 xadvance=11 page=0 chnl=15 +char id=358 x=486 y=197 width=16 height=18 xoffset=0 yoffset=6 xadvance=16 page=0 chnl=15 +char id=359 x=232 y=242 width=8 height=16 xoffset=0 yoffset=8 xadvance=7 page=0 chnl=15 +char id=360 x=223 y=83 width=19 height=23 xoffset=0 yoffset=1 xadvance=19 page=0 chnl=15 +char id=361 x=475 y=218 width=13 height=17 xoffset=0 yoffset=7 xadvance=13 page=0 chnl=15 +char id=362 x=96 y=110 width=19 height=22 xoffset=0 yoffset=3 xadvance=19 page=0 chnl=15 +char id=363 x=491 y=218 width=13 height=17 xoffset=0 yoffset=8 xadvance=13 page=0 chnl=15 +char id=364 x=285 y=0 width=19 height=25 xoffset=0 yoffset=0 xadvance=19 page=0 chnl=15 +char id=365 x=238 y=156 width=13 height=19 xoffset=0 yoffset=6 xadvance=13 page=0 chnl=15 +char id=366 x=307 y=0 width=19 height=25 xoffset=0 yoffset=0 xadvance=19 page=0 chnl=15 +char id=367 x=449 y=108 width=13 height=20 xoffset=0 yoffset=4 xadvance=13 page=0 chnl=15 +char id=368 x=395 y=0 width=19 height=25 xoffset=0 yoffset=0 xadvance=19 page=0 chnl=15 +char id=369 x=110 y=157 width=13 height=19 xoffset=0 yoffset=5 xadvance=13 page=0 chnl=15 +char id=370 x=157 y=84 width=19 height=23 xoffset=0 yoffset=6 xadvance=19 page=0 chnl=15 +char id=371 x=426 y=219 width=14 height=17 xoffset=0 yoffset=12 xadvance=13 page=0 chnl=15 +char id=372 x=169 y=0 width=25 height=25 xoffset=0 yoffset=0 xadvance=25 page=0 chnl=15 +char id=373 x=394 y=132 width=18 height=19 xoffset=0 yoffset=6 xadvance=19 page=0 chnl=15 +char id=374 x=88 y=57 width=19 height=24 xoffset=0 yoffset=0 xadvance=19 page=0 chnl=15 +char id=375 x=384 y=55 width=13 height=24 xoffset=0 yoffset=6 xadvance=13 page=0 chnl=15 +char id=376 x=113 y=84 width=19 height=23 xoffset=0 yoffset=1 xadvance=19 page=0 chnl=15 +char id=377 x=270 y=56 width=16 height=24 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=378 x=210 y=178 width=11 height=19 xoffset=0 yoffset=5 xadvance=12 page=0 chnl=15 +char id=379 x=327 y=82 width=16 height=23 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=380 x=75 y=247 width=11 height=17 xoffset=0 yoffset=7 xadvance=12 page=0 chnl=15 +char id=381 x=194 y=56 width=16 height=24 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=382 x=354 y=219 width=11 height=18 xoffset=0 yoffset=6 xadvance=12 page=0 chnl=15 +char id=383 x=432 y=176 width=10 height=19 xoffset=0 yoffset=5 xadvance=9 page=0 chnl=15 +char id=399 x=415 y=132 width=18 height=19 xoffset=0 yoffset=6 xadvance=19 page=0 chnl=15 +char id=402 x=123 y=29 width=13 height=25 xoffset=-1 yoffset=5 xadvance=9 page=0 chnl=15 +char id=416 x=74 y=110 width=19 height=22 xoffset=0 yoffset=2 xadvance=19 page=0 chnl=15 +char id=417 x=203 y=243 width=14 height=16 xoffset=0 yoffset=9 xadvance=14 page=0 chnl=15 +char id=431 x=50 y=111 width=21 height=22 xoffset=0 yoffset=2 xadvance=21 page=0 chnl=15 +char id=432 x=185 y=243 width=15 height=16 xoffset=0 yoffset=9 xadvance=14 page=0 chnl=15 +char id=461 x=487 y=28 width=19 height=24 xoffset=0 yoffset=0 xadvance=19 page=0 chnl=15 +char id=462 x=45 y=182 width=12 height=19 xoffset=0 yoffset=6 xadvance=12 page=0 chnl=15 +char id=463 x=473 y=55 width=9 height=24 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=15 +char id=464 x=483 y=175 width=9 height=19 xoffset=0 yoffset=6 xadvance=7 page=0 chnl=15 +char id=465 x=21 y=30 width=18 height=25 xoffset=0 yoffset=0 xadvance=19 page=0 chnl=15 +char id=466 x=195 y=179 width=12 height=19 xoffset=0 yoffset=6 xadvance=13 page=0 chnl=15 +char id=467 x=22 y=58 width=19 height=24 xoffset=0 yoffset=0 xadvance=19 page=0 chnl=15 +char id=468 x=382 y=154 width=13 height=19 xoffset=0 yoffset=6 xadvance=13 page=0 chnl=15 +char id=469 x=329 y=0 width=19 height=25 xoffset=0 yoffset=0 xadvance=19 page=0 chnl=15 +char id=470 x=465 y=108 width=13 height=20 xoffset=0 yoffset=4 xadvance=13 page=0 chnl=15 +char id=471 x=197 y=0 width=19 height=25 xoffset=0 yoffset=0 xadvance=19 page=0 chnl=15 +char id=472 x=160 y=110 width=13 height=22 xoffset=0 yoffset=2 xadvance=13 page=0 chnl=15 +char id=473 x=263 y=0 width=19 height=25 xoffset=0 yoffset=0 xadvance=19 page=0 chnl=15 +char id=474 x=176 y=110 width=13 height=22 xoffset=0 yoffset=2 xadvance=13 page=0 chnl=15 +char id=475 x=241 y=0 width=19 height=25 xoffset=0 yoffset=0 xadvance=19 page=0 chnl=15 +char id=476 x=192 y=109 width=13 height=22 xoffset=0 yoffset=2 xadvance=13 page=0 chnl=15 +char id=506 x=44 y=58 width=19 height=24 xoffset=0 yoffset=0 xadvance=19 page=0 chnl=15 +char id=507 x=186 y=28 width=12 height=25 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=15 +char id=508 x=285 y=28 width=23 height=24 xoffset=0 yoffset=0 xadvance=23 page=0 chnl=15 +char id=509 x=0 y=160 width=17 height=19 xoffset=0 yoffset=5 xadvance=17 page=0 chnl=15 +char id=510 x=0 y=0 width=18 height=27 xoffset=0 yoffset=0 xadvance=19 page=0 chnl=15 +char id=511 x=239 y=109 width=12 height=22 xoffset=0 yoffset=5 xadvance=13 page=0 chnl=15 +char id=710 x=66 y=283 width=9 height=5 xoffset=0 yoffset=6 xadvance=9 page=0 chnl=15 +char id=711 x=54 y=283 width=9 height=5 xoffset=0 yoffset=6 xadvance=9 page=0 chnl=15 +char id=713 x=321 y=271 width=9 height=2 xoffset=0 yoffset=8 xadvance=9 page=0 chnl=15 +char id=728 x=90 y=283 width=8 height=5 xoffset=0 yoffset=6 xadvance=9 page=0 chnl=15 +char id=729 x=186 y=277 width=3 height=4 xoffset=3 yoffset=7 xadvance=9 page=0 chnl=15 +char id=730 x=20 y=283 width=6 height=6 xoffset=1 yoffset=5 xadvance=9 page=0 chnl=15 +char id=731 x=101 y=281 width=6 height=5 xoffset=1 yoffset=23 xadvance=9 page=0 chnl=15 +char id=732 x=143 y=278 width=9 height=4 xoffset=0 yoffset=7 xadvance=9 page=0 chnl=15 +char id=733 x=481 y=254 width=11 height=6 xoffset=0 yoffset=5 xadvance=10 page=0 chnl=15 +char id=768 x=29 y=283 width=6 height=6 xoffset=-8 yoffset=5 xadvance=0 page=0 chnl=15 +char id=769 x=495 y=254 width=7 height=6 xoffset=-7 yoffset=5 xadvance=0 page=0 chnl=15 +char id=771 x=155 y=278 width=9 height=4 xoffset=-9 yoffset=7 xadvance=0 page=0 chnl=15 +char id=777 x=110 y=281 width=5 height=5 xoffset=-7 yoffset=5 xadvance=0 page=0 chnl=15 +char id=803 x=192 y=277 width=3 height=3 xoffset=-8 yoffset=25 xadvance=0 page=0 chnl=15 +char id=8204 x=506 y=104 width=1 height=1 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=8205 x=507 y=213 width=1 height=1 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=8206 x=507 y=217 width=1 height=1 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=8207 x=507 y=221 width=1 height=1 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=8211 x=292 y=271 width=14 height=2 xoffset=0 yoffset=17 xadvance=13 page=0 chnl=15 +char id=8212 x=228 y=275 width=27 height=2 xoffset=0 yoffset=17 xadvance=26 page=0 chnl=15 +char id=8213 x=198 y=276 width=27 height=2 xoffset=0 yoffset=17 xadvance=26 page=0 chnl=15 +char id=8215 x=78 y=283 width=9 height=5 xoffset=2 yoffset=24 xadvance=12 page=0 chnl=15 +char id=8216 x=441 y=255 width=5 height=7 xoffset=1 yoffset=6 xadvance=6 page=0 chnl=15 +char id=8217 x=457 y=255 width=5 height=7 xoffset=1 yoffset=6 xadvance=6 page=0 chnl=15 +char id=8218 x=473 y=254 width=5 height=7 xoffset=1 yoffset=21 xadvance=6 page=0 chnl=15 +char id=8219 x=449 y=255 width=5 height=7 xoffset=1 yoffset=6 xadvance=6 page=0 chnl=15 +char id=8220 x=383 y=256 width=10 height=7 xoffset=1 yoffset=6 xadvance=12 page=0 chnl=15 +char id=8221 x=396 y=256 width=10 height=7 xoffset=1 yoffset=6 xadvance=12 page=0 chnl=15 +char id=8222 x=409 y=256 width=10 height=7 xoffset=1 yoffset=21 xadvance=12 page=0 chnl=15 +char id=8224 x=254 y=109 width=11 height=22 xoffset=1 yoffset=6 xadvance=13 page=0 chnl=15 +char id=8225 x=431 y=82 width=11 height=23 xoffset=1 yoffset=6 xadvance=13 page=0 chnl=15 +char id=8226 x=363 y=256 width=8 height=8 xoffset=1 yoffset=11 xadvance=9 page=0 chnl=15 +char id=8230 x=118 y=280 width=22 height=4 xoffset=2 yoffset=21 xadvance=26 page=0 chnl=15 +char id=8234 x=365 y=267 width=1 height=1 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=8235 x=361 y=269 width=1 height=1 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=8236 x=357 y=269 width=1 height=1 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=8237 x=507 y=233 width=1 height=1 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=8238 x=507 y=225 width=1 height=1 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=8240 x=419 y=108 width=27 height=20 xoffset=0 yoffset=5 xadvance=26 page=0 chnl=15 +char id=8242 x=374 y=256 width=6 height=8 xoffset=0 yoffset=4 xadvance=6 page=0 chnl=15 +char id=8243 x=314 y=260 width=11 height=8 xoffset=0 yoffset=4 xadvance=11 page=0 chnl=15 +char id=8249 x=251 y=261 width=7 height=11 xoffset=0 yoffset=12 xadvance=6 page=0 chnl=15 +char id=8250 x=261 y=260 width=7 height=11 xoffset=0 yoffset=12 xadvance=6 page=0 chnl=15 +char id=8252 x=142 y=157 width=13 height=19 xoffset=3 yoffset=6 xadvance=18 page=0 chnl=15 +char id=8254 x=275 y=274 width=14 height=2 xoffset=0 yoffset=8 xadvance=13 page=0 chnl=15 +char id=8260 x=76 y=158 width=14 height=19 xoffset=-4 yoffset=6 xadvance=4 page=0 chnl=15 +char id=8355 x=130 y=222 width=15 height=18 xoffset=0 yoffset=6 xadvance=15 page=0 chnl=15 +char id=8356 x=318 y=155 width=13 height=19 xoffset=0 yoffset=6 xadvance=13 page=0 chnl=15 +char id=8359 x=28 y=138 width=25 height=19 xoffset=0 yoffset=6 xadvance=25 page=0 chnl=15 +char id=8362 x=162 y=243 width=20 height=16 xoffset=1 yoffset=8 xadvance=23 page=0 chnl=15 +char id=8363 x=208 y=109 width=13 height=22 xoffset=0 yoffset=2 xadvance=13 page=0 chnl=15 +char id=8364 x=329 y=132 width=19 height=19 xoffset=0 yoffset=6 xadvance=20 page=0 chnl=15 +char id=8453 x=457 y=131 width=18 height=19 xoffset=1 yoffset=5 xadvance=21 page=0 chnl=15 +char id=8467 x=180 y=179 width=12 height=19 xoffset=0 yoffset=6 xadvance=11 page=0 chnl=15 +char id=8470 x=82 y=135 width=23 height=19 xoffset=0 yoffset=6 xadvance=23 page=0 chnl=15 +char id=8482 x=357 y=240 width=27 height=13 xoffset=0 yoffset=6 xadvance=27 page=0 chnl=15 +char id=8486 x=367 y=198 width=19 height=18 xoffset=0 yoffset=6 xadvance=20 page=0 chnl=15 +char id=8494 x=0 y=267 width=13 height=13 xoffset=0 yoffset=11 xadvance=14 page=0 chnl=15 +kernings count=5493 +kerning first=212 second=8221 amount=-1 +kerning first=44 second=45 amount=-1 +kerning first=44 second=171 amount=-1 +kerning first=44 second=8217 amount=-2 +kerning first=44 second=8220 amount=-2 +kerning first=44 second=8221 amount=-2 +kerning first=44 second=8249 amount=-1 +kerning first=45 second=65 amount=-1 +kerning first=45 second=66 amount=-2 +kerning first=45 second=68 amount=-2 +kerning first=45 second=69 amount=-2 +kerning first=45 second=70 amount=-2 +kerning first=45 second=72 amount=-2 +kerning first=45 second=73 amount=-2 +kerning first=45 second=74 amount=-1 +kerning first=45 second=75 amount=-2 +kerning first=45 second=76 amount=-2 +kerning first=45 second=77 amount=-2 +kerning first=45 second=78 amount=-2 +kerning first=45 second=80 amount=-2 +kerning first=45 second=82 amount=-2 +kerning first=45 second=83 amount=-1 +kerning first=45 second=84 amount=-1 +kerning first=45 second=85 amount=-1 +kerning first=45 second=86 amount=-1 +kerning first=45 second=87 amount=-1 +kerning first=45 second=89 amount=-1 +kerning first=45 second=90 amount=-1 +kerning first=212 second=8220 amount=-1 +kerning first=212 second=8217 amount=-1 +kerning first=212 second=382 amount=-1 +kerning first=45 second=103 amount=-1 +kerning first=212 second=381 amount=-1 +kerning first=212 second=380 amount=-1 +kerning first=45 second=106 amount=-1 +kerning first=212 second=379 amount=-1 +kerning first=212 second=378 amount=-1 +kerning first=45 second=109 amount=-1 +kerning first=45 second=110 amount=-1 +kerning first=45 second=112 amount=-1 +kerning first=45 second=114 amount=-1 +kerning first=212 second=377 amount=-1 +kerning first=212 second=374 amount=-1 +kerning first=212 second=356 amount=-1 +kerning first=45 second=118 amount=-1 +kerning first=45 second=119 amount=-1 +kerning first=45 second=120 amount=-1 +kerning first=45 second=121 amount=-1 +kerning first=45 second=122 amount=-2 +kerning first=45 second=192 amount=-1 +kerning first=45 second=193 amount=-1 +kerning first=45 second=194 amount=-1 +kerning first=45 second=195 amount=-1 +kerning first=45 second=196 amount=-1 +kerning first=45 second=197 amount=-1 +kerning first=45 second=198 amount=-1 +kerning first=45 second=200 amount=-2 +kerning first=45 second=201 amount=-2 +kerning first=45 second=202 amount=-2 +kerning first=45 second=203 amount=-2 +kerning first=45 second=204 amount=-2 +kerning first=45 second=205 amount=-2 +kerning first=45 second=206 amount=-2 +kerning first=45 second=207 amount=-2 +kerning first=45 second=209 amount=-2 +kerning first=45 second=217 amount=-1 +kerning first=45 second=218 amount=-1 +kerning first=45 second=219 amount=-1 +kerning first=45 second=220 amount=-1 +kerning first=45 second=221 amount=-1 +kerning first=45 second=223 amount=-1 +kerning first=212 second=354 amount=-1 +kerning first=212 second=344 amount=-1 +kerning first=212 second=330 amount=-1 +kerning first=212 second=327 amount=-1 +kerning first=212 second=325 amount=-1 +kerning first=212 second=323 amount=-1 +kerning first=212 second=317 amount=-1 +kerning first=45 second=241 amount=-1 +kerning first=212 second=315 amount=-1 +kerning first=212 second=313 amount=-1 +kerning first=212 second=310 amount=-1 +kerning first=212 second=304 amount=-1 +kerning first=45 second=253 amount=-1 +kerning first=212 second=302 amount=-1 +kerning first=45 second=255 amount=-1 +kerning first=45 second=256 amount=-1 +kerning first=212 second=298 amount=-1 +kerning first=212 second=296 amount=-1 +kerning first=45 second=260 amount=-1 +kerning first=212 second=282 amount=-1 +kerning first=45 second=270 amount=-2 +kerning first=45 second=274 amount=-2 +kerning first=45 second=278 amount=-2 +kerning first=45 second=280 amount=-2 +kerning first=45 second=282 amount=-2 +kerning first=45 second=287 amount=-1 +kerning first=45 second=289 amount=-1 +kerning first=45 second=291 amount=-1 +kerning first=45 second=296 amount=-2 +kerning first=45 second=298 amount=-2 +kerning first=45 second=302 amount=-2 +kerning first=212 second=280 amount=-1 +kerning first=212 second=278 amount=-1 +kerning first=212 second=274 amount=-1 +kerning first=45 second=310 amount=-2 +kerning first=212 second=270 amount=-1 +kerning first=45 second=313 amount=-2 +kerning first=212 second=260 amount=-1 +kerning first=45 second=315 amount=-2 +kerning first=212 second=256 amount=-1 +kerning first=45 second=317 amount=-2 +kerning first=212 second=221 amount=-1 +kerning first=45 second=323 amount=-2 +kerning first=45 second=324 amount=-1 +kerning first=45 second=325 amount=-2 +kerning first=45 second=326 amount=-1 +kerning first=45 second=327 amount=-2 +kerning first=45 second=328 amount=-1 +kerning first=45 second=330 amount=-2 +kerning first=45 second=331 amount=-1 +kerning first=45 second=344 amount=-2 +kerning first=45 second=345 amount=-1 +kerning first=45 second=346 amount=-1 +kerning first=212 second=209 amount=-1 +kerning first=45 second=350 amount=-1 +kerning first=212 second=207 amount=-1 +kerning first=45 second=352 amount=-1 +kerning first=212 second=206 amount=-1 +kerning first=45 second=354 amount=-1 +kerning first=212 second=205 amount=-1 +kerning first=45 second=356 amount=-1 +kerning first=212 second=204 amount=-1 +kerning first=212 second=203 amount=-1 +kerning first=45 second=362 amount=-1 +kerning first=212 second=202 amount=-1 +kerning first=45 second=364 amount=-1 +kerning first=212 second=201 amount=-1 +kerning first=45 second=366 amount=-1 +kerning first=212 second=200 amount=-1 +kerning first=45 second=368 amount=-1 +kerning first=212 second=198 amount=-1 +kerning first=45 second=370 amount=-1 +kerning first=212 second=197 amount=-1 +kerning first=45 second=374 amount=-1 +kerning first=45 second=375 amount=-1 +kerning first=45 second=377 amount=-1 +kerning first=45 second=378 amount=-2 +kerning first=45 second=379 amount=-1 +kerning first=45 second=380 amount=-2 +kerning first=45 second=381 amount=-1 +kerning first=45 second=382 amount=-2 +kerning first=212 second=196 amount=-1 +kerning first=212 second=194 amount=-1 +kerning first=212 second=193 amount=-1 +kerning first=212 second=192 amount=-1 +kerning first=212 second=122 amount=-1 +kerning first=212 second=90 amount=-1 +kerning first=212 second=89 amount=-1 +kerning first=212 second=87 amount=-1 +kerning first=212 second=86 amount=-1 +kerning first=212 second=84 amount=-1 +kerning first=212 second=82 amount=-1 +kerning first=212 second=80 amount=-1 +kerning first=212 second=78 amount=-1 +kerning first=212 second=77 amount=-1 +kerning first=212 second=76 amount=-1 +kerning first=212 second=75 amount=-1 +kerning first=212 second=74 amount=-1 +kerning first=212 second=73 amount=-1 +kerning first=212 second=72 amount=-1 +kerning first=212 second=70 amount=-1 +kerning first=212 second=69 amount=-1 +kerning first=212 second=68 amount=-1 +kerning first=212 second=66 amount=-1 +kerning first=212 second=65 amount=-1 +kerning first=212 second=46 amount=-1 +kerning first=212 second=44 amount=-1 +kerning first=211 second=8221 amount=-1 +kerning first=211 second=8220 amount=-1 +kerning first=211 second=8217 amount=-1 +kerning first=211 second=382 amount=-1 +kerning first=46 second=45 amount=-1 +kerning first=46 second=171 amount=-1 +kerning first=46 second=8217 amount=-2 +kerning first=46 second=8220 amount=-2 +kerning first=46 second=8221 amount=-2 +kerning first=46 second=8249 amount=-1 +kerning first=65 second=45 amount=-1 +kerning first=65 second=67 amount=-1 +kerning first=65 second=71 amount=-1 +kerning first=65 second=79 amount=-1 +kerning first=65 second=81 amount=-1 +kerning first=65 second=83 amount=-1 +kerning first=65 second=84 amount=-2 +kerning first=65 second=85 amount=-1 +kerning first=65 second=86 amount=-2 +kerning first=65 second=87 amount=-2 +kerning first=65 second=89 amount=-2 +kerning first=65 second=98 amount=-1 +kerning first=211 second=381 amount=-1 +kerning first=211 second=380 amount=-1 +kerning first=211 second=379 amount=-1 +kerning first=211 second=378 amount=-1 +kerning first=65 second=103 amount=-1 +kerning first=65 second=104 amount=-1 +kerning first=211 second=377 amount=-1 +kerning first=65 second=107 amount=-1 +kerning first=65 second=108 amount=-1 +kerning first=211 second=374 amount=-1 +kerning first=65 second=112 amount=-1 +kerning first=211 second=356 amount=-1 +kerning first=65 second=115 amount=-1 +kerning first=211 second=354 amount=-1 +kerning first=65 second=117 amount=-1 +kerning first=65 second=118 amount=-1 +kerning first=65 second=119 amount=-1 +kerning first=65 second=121 amount=-1 +kerning first=65 second=171 amount=-1 +kerning first=65 second=199 amount=-1 +kerning first=65 second=210 amount=-1 +kerning first=65 second=211 amount=-1 +kerning first=65 second=212 amount=-1 +kerning first=65 second=213 amount=-1 +kerning first=65 second=214 amount=-1 +kerning first=65 second=216 amount=-1 +kerning first=65 second=217 amount=-1 +kerning first=65 second=218 amount=-1 +kerning first=65 second=219 amount=-1 +kerning first=65 second=220 amount=-1 +kerning first=65 second=221 amount=-2 +kerning first=211 second=344 amount=-1 +kerning first=211 second=330 amount=-1 +kerning first=211 second=327 amount=-1 +kerning first=211 second=325 amount=-1 +kerning first=211 second=323 amount=-1 +kerning first=211 second=317 amount=-1 +kerning first=211 second=315 amount=-1 +kerning first=211 second=313 amount=-1 +kerning first=211 second=310 amount=-1 +kerning first=211 second=304 amount=-1 +kerning first=211 second=302 amount=-1 +kerning first=211 second=298 amount=-1 +kerning first=211 second=296 amount=-1 +kerning first=65 second=249 amount=-1 +kerning first=65 second=250 amount=-1 +kerning first=65 second=251 amount=-1 +kerning first=65 second=252 amount=-1 +kerning first=65 second=253 amount=-1 +kerning first=65 second=254 amount=-1 +kerning first=65 second=255 amount=-1 +kerning first=65 second=262 amount=-1 +kerning first=211 second=282 amount=-1 +kerning first=65 second=264 amount=-1 +kerning first=65 second=266 amount=-1 +kerning first=211 second=280 amount=-1 +kerning first=65 second=268 amount=-1 +kerning first=211 second=278 amount=-1 +kerning first=211 second=274 amount=-1 +kerning first=211 second=270 amount=-1 +kerning first=211 second=260 amount=-1 +kerning first=211 second=256 amount=-1 +kerning first=211 second=221 amount=-1 +kerning first=65 second=284 amount=-1 +kerning first=65 second=286 amount=-1 +kerning first=65 second=287 amount=-1 +kerning first=65 second=288 amount=-1 +kerning first=65 second=289 amount=-1 +kerning first=65 second=290 amount=-1 +kerning first=65 second=291 amount=-1 +kerning first=211 second=209 amount=-1 +kerning first=211 second=207 amount=-1 +kerning first=65 second=311 amount=-1 +kerning first=65 second=314 amount=-1 +kerning first=65 second=316 amount=-1 +kerning first=65 second=318 amount=-1 +kerning first=65 second=332 amount=-1 +kerning first=211 second=206 amount=-1 +kerning first=65 second=334 amount=-1 +kerning first=211 second=205 amount=-1 +kerning first=65 second=336 amount=-1 +kerning first=211 second=204 amount=-1 +kerning first=65 second=338 amount=-1 +kerning first=211 second=203 amount=-1 +kerning first=65 second=346 amount=-1 +kerning first=65 second=347 amount=-1 +kerning first=65 second=350 amount=-1 +kerning first=65 second=351 amount=-1 +kerning first=65 second=352 amount=-1 +kerning first=65 second=353 amount=-1 +kerning first=65 second=354 amount=-2 +kerning first=211 second=202 amount=-1 +kerning first=65 second=356 amount=-2 +kerning first=65 second=361 amount=-1 +kerning first=65 second=362 amount=-1 +kerning first=65 second=363 amount=-1 +kerning first=65 second=364 amount=-1 +kerning first=65 second=365 amount=-1 +kerning first=65 second=366 amount=-1 +kerning first=65 second=367 amount=-1 +kerning first=65 second=368 amount=-1 +kerning first=65 second=369 amount=-1 +kerning first=65 second=370 amount=-1 +kerning first=65 second=374 amount=-2 +kerning first=65 second=375 amount=-1 +kerning first=211 second=201 amount=-1 +kerning first=211 second=200 amount=-1 +kerning first=211 second=198 amount=-1 +kerning first=211 second=197 amount=-1 +kerning first=211 second=196 amount=-1 +kerning first=211 second=194 amount=-1 +kerning first=211 second=193 amount=-1 +kerning first=211 second=192 amount=-1 +kerning first=211 second=122 amount=-1 +kerning first=211 second=90 amount=-1 +kerning first=211 second=89 amount=-1 +kerning first=211 second=87 amount=-1 +kerning first=211 second=86 amount=-1 +kerning first=211 second=84 amount=-1 +kerning first=211 second=82 amount=-1 +kerning first=65 second=8217 amount=-2 +kerning first=65 second=8220 amount=-2 +kerning first=65 second=8221 amount=-2 +kerning first=65 second=8249 amount=-1 +kerning first=211 second=80 amount=-1 +kerning first=211 second=78 amount=-1 +kerning first=211 second=77 amount=-1 +kerning first=211 second=76 amount=-1 +kerning first=211 second=75 amount=-1 +kerning first=66 second=44 amount=-1 +kerning first=66 second=45 amount=-1 +kerning first=66 second=46 amount=-1 +kerning first=66 second=65 amount=-2 +kerning first=66 second=66 amount=-1 +kerning first=66 second=67 amount=-1 +kerning first=66 second=68 amount=-1 +kerning first=66 second=69 amount=-1 +kerning first=66 second=70 amount=-1 +kerning first=66 second=71 amount=-1 +kerning first=66 second=72 amount=-1 +kerning first=66 second=73 amount=-1 +kerning first=66 second=74 amount=-1 +kerning first=66 second=75 amount=-1 +kerning first=66 second=76 amount=-1 +kerning first=66 second=77 amount=-1 +kerning first=66 second=78 amount=-1 +kerning first=66 second=79 amount=-1 +kerning first=66 second=80 amount=-1 +kerning first=66 second=81 amount=-1 +kerning first=66 second=82 amount=-1 +kerning first=66 second=83 amount=-2 +kerning first=66 second=84 amount=-1 +kerning first=66 second=85 amount=-1 +kerning first=66 second=86 amount=-1 +kerning first=66 second=87 amount=-1 +kerning first=66 second=89 amount=-1 +kerning first=66 second=90 amount=-1 +kerning first=66 second=97 amount=-1 +kerning first=66 second=98 amount=-1 +kerning first=211 second=74 amount=-1 +kerning first=211 second=73 amount=-1 +kerning first=211 second=72 amount=-1 +kerning first=66 second=102 amount=-1 +kerning first=66 second=103 amount=-1 +kerning first=66 second=104 amount=-1 +kerning first=66 second=105 amount=-1 +kerning first=66 second=106 amount=-1 +kerning first=66 second=107 amount=-1 +kerning first=66 second=108 amount=-1 +kerning first=66 second=109 amount=-1 +kerning first=66 second=110 amount=-1 +kerning first=211 second=70 amount=-1 +kerning first=66 second=112 amount=-1 +kerning first=211 second=69 amount=-1 +kerning first=66 second=114 amount=-1 +kerning first=66 second=115 amount=-1 +kerning first=66 second=116 amount=-1 +kerning first=66 second=117 amount=-1 +kerning first=66 second=118 amount=-1 +kerning first=66 second=119 amount=-1 +kerning first=66 second=120 amount=-1 +kerning first=66 second=121 amount=-1 +kerning first=66 second=122 amount=-1 +kerning first=66 second=171 amount=-1 +kerning first=66 second=187 amount=-1 +kerning first=66 second=192 amount=-2 +kerning first=66 second=193 amount=-2 +kerning first=66 second=194 amount=-2 +kerning first=66 second=196 amount=-2 +kerning first=66 second=197 amount=-2 +kerning first=66 second=198 amount=-2 +kerning first=66 second=199 amount=-1 +kerning first=66 second=200 amount=-1 +kerning first=66 second=201 amount=-1 +kerning first=66 second=202 amount=-1 +kerning first=66 second=203 amount=-1 +kerning first=66 second=204 amount=-1 +kerning first=66 second=205 amount=-1 +kerning first=66 second=206 amount=-1 +kerning first=66 second=207 amount=-1 +kerning first=66 second=209 amount=-1 +kerning first=66 second=210 amount=-1 +kerning first=66 second=211 amount=-1 +kerning first=66 second=212 amount=-1 +kerning first=66 second=213 amount=-1 +kerning first=66 second=214 amount=-1 +kerning first=66 second=216 amount=-1 +kerning first=66 second=217 amount=-1 +kerning first=66 second=218 amount=-1 +kerning first=66 second=219 amount=-1 +kerning first=66 second=220 amount=-1 +kerning first=66 second=221 amount=-1 +kerning first=66 second=223 amount=-1 +kerning first=66 second=224 amount=-1 +kerning first=66 second=225 amount=-1 +kerning first=66 second=226 amount=-1 +kerning first=66 second=227 amount=-1 +kerning first=66 second=228 amount=-1 +kerning first=66 second=229 amount=-1 +kerning first=66 second=230 amount=-1 +kerning first=211 second=68 amount=-1 +kerning first=211 second=66 amount=-1 +kerning first=211 second=65 amount=-1 +kerning first=211 second=46 amount=-1 +kerning first=211 second=44 amount=-1 +kerning first=66 second=237 amount=-1 +kerning first=210 second=8221 amount=-1 +kerning first=66 second=241 amount=-1 +kerning first=210 second=8220 amount=-1 +kerning first=210 second=8217 amount=-1 +kerning first=210 second=382 amount=-1 +kerning first=210 second=381 amount=-1 +kerning first=210 second=380 amount=-1 +kerning first=210 second=379 amount=-1 +kerning first=66 second=249 amount=-1 +kerning first=66 second=250 amount=-1 +kerning first=66 second=251 amount=-1 +kerning first=66 second=252 amount=-1 +kerning first=66 second=253 amount=-1 +kerning first=66 second=254 amount=-1 +kerning first=66 second=255 amount=-1 +kerning first=66 second=256 amount=-2 +kerning first=66 second=257 amount=-1 +kerning first=66 second=259 amount=-1 +kerning first=66 second=260 amount=-2 +kerning first=66 second=261 amount=-1 +kerning first=66 second=262 amount=-1 +kerning first=210 second=378 amount=-1 +kerning first=66 second=264 amount=-1 +kerning first=66 second=266 amount=-1 +kerning first=210 second=377 amount=-1 +kerning first=66 second=268 amount=-1 +kerning first=210 second=374 amount=-1 +kerning first=66 second=270 amount=-1 +kerning first=66 second=274 amount=-1 +kerning first=210 second=356 amount=-1 +kerning first=210 second=354 amount=-1 +kerning first=66 second=278 amount=-1 +kerning first=210 second=344 amount=-1 +kerning first=66 second=280 amount=-1 +kerning first=210 second=330 amount=-1 +kerning first=66 second=282 amount=-1 +kerning first=210 second=327 amount=-1 +kerning first=66 second=284 amount=-1 +kerning first=66 second=286 amount=-1 +kerning first=66 second=287 amount=-1 +kerning first=66 second=288 amount=-1 +kerning first=66 second=289 amount=-1 +kerning first=66 second=290 amount=-1 +kerning first=66 second=291 amount=-1 +kerning first=66 second=296 amount=-1 +kerning first=66 second=298 amount=-1 +kerning first=66 second=302 amount=-1 +kerning first=66 second=303 amount=-1 +kerning first=66 second=304 amount=-1 +kerning first=66 second=305 amount=-1 +kerning first=66 second=310 amount=-1 +kerning first=66 second=311 amount=-1 +kerning first=66 second=313 amount=-1 +kerning first=66 second=314 amount=-1 +kerning first=66 second=315 amount=-1 +kerning first=66 second=316 amount=-1 +kerning first=66 second=317 amount=-1 +kerning first=66 second=318 amount=-1 +kerning first=66 second=323 amount=-1 +kerning first=66 second=324 amount=-1 +kerning first=66 second=325 amount=-1 +kerning first=66 second=326 amount=-1 +kerning first=66 second=327 amount=-1 +kerning first=66 second=328 amount=-1 +kerning first=66 second=330 amount=-1 +kerning first=66 second=331 amount=-1 +kerning first=66 second=332 amount=-1 +kerning first=210 second=325 amount=-1 +kerning first=66 second=334 amount=-1 +kerning first=210 second=323 amount=-1 +kerning first=66 second=336 amount=-1 +kerning first=210 second=317 amount=-1 +kerning first=66 second=338 amount=-1 +kerning first=210 second=315 amount=-1 +kerning first=66 second=344 amount=-1 +kerning first=66 second=345 amount=-1 +kerning first=66 second=346 amount=-2 +kerning first=66 second=347 amount=-1 +kerning first=66 second=350 amount=-2 +kerning first=66 second=351 amount=-1 +kerning first=66 second=352 amount=-2 +kerning first=66 second=353 amount=-1 +kerning first=66 second=354 amount=-1 +kerning first=66 second=355 amount=-1 +kerning first=66 second=356 amount=-1 +kerning first=66 second=361 amount=-1 +kerning first=66 second=362 amount=-1 +kerning first=66 second=363 amount=-1 +kerning first=66 second=364 amount=-1 +kerning first=66 second=365 amount=-1 +kerning first=66 second=366 amount=-1 +kerning first=66 second=367 amount=-1 +kerning first=66 second=368 amount=-1 +kerning first=66 second=369 amount=-1 +kerning first=66 second=370 amount=-1 +kerning first=66 second=374 amount=-1 +kerning first=66 second=375 amount=-1 +kerning first=66 second=377 amount=-1 +kerning first=66 second=378 amount=-1 +kerning first=66 second=379 amount=-1 +kerning first=66 second=380 amount=-1 +kerning first=66 second=381 amount=-1 +kerning first=66 second=382 amount=-1 +kerning first=210 second=313 amount=-1 +kerning first=210 second=310 amount=-1 +kerning first=210 second=304 amount=-1 +kerning first=210 second=302 amount=-1 +kerning first=210 second=298 amount=-1 +kerning first=210 second=296 amount=-1 +kerning first=210 second=282 amount=-1 +kerning first=210 second=280 amount=-1 +kerning first=210 second=278 amount=-1 +kerning first=210 second=274 amount=-1 +kerning first=210 second=270 amount=-1 +kerning first=210 second=260 amount=-1 +kerning first=210 second=256 amount=-1 +kerning first=210 second=221 amount=-1 +kerning first=210 second=209 amount=-1 +kerning first=210 second=207 amount=-1 +kerning first=210 second=206 amount=-1 +kerning first=210 second=205 amount=-1 +kerning first=210 second=204 amount=-1 +kerning first=210 second=203 amount=-1 +kerning first=210 second=202 amount=-1 +kerning first=210 second=201 amount=-1 +kerning first=210 second=200 amount=-1 +kerning first=210 second=198 amount=-1 +kerning first=210 second=197 amount=-1 +kerning first=210 second=196 amount=-1 +kerning first=66 second=8217 amount=-2 +kerning first=66 second=8220 amount=-2 +kerning first=66 second=8221 amount=-2 +kerning first=66 second=8249 amount=-1 +kerning first=66 second=8250 amount=-1 +kerning first=210 second=194 amount=-1 +kerning first=210 second=193 amount=-1 +kerning first=210 second=192 amount=-1 +kerning first=210 second=122 amount=-1 +kerning first=210 second=90 amount=-1 +kerning first=210 second=89 amount=-1 +kerning first=67 second=45 amount=-1 +kerning first=210 second=87 amount=-1 +kerning first=67 second=65 amount=-1 +kerning first=67 second=66 amount=-1 +kerning first=67 second=67 amount=-1 +kerning first=67 second=68 amount=-1 +kerning first=67 second=69 amount=-1 +kerning first=67 second=70 amount=-1 +kerning first=67 second=71 amount=-1 +kerning first=67 second=72 amount=-1 +kerning first=67 second=73 amount=-1 +kerning first=67 second=74 amount=-1 +kerning first=67 second=75 amount=-1 +kerning first=67 second=76 amount=-1 +kerning first=67 second=77 amount=-1 +kerning first=67 second=78 amount=-1 +kerning first=67 second=79 amount=-1 +kerning first=67 second=80 amount=-1 +kerning first=67 second=81 amount=-1 +kerning first=67 second=82 amount=-1 +kerning first=67 second=83 amount=-1 +kerning first=210 second=86 amount=-1 +kerning first=67 second=85 amount=-1 +kerning first=210 second=84 amount=-1 +kerning first=210 second=82 amount=-1 +kerning first=210 second=80 amount=-1 +kerning first=67 second=90 amount=-1 +kerning first=210 second=78 amount=-1 +kerning first=210 second=77 amount=-1 +kerning first=67 second=99 amount=-1 +kerning first=67 second=100 amount=-1 +kerning first=67 second=101 amount=-1 +kerning first=67 second=102 amount=-1 +kerning first=67 second=103 amount=-1 +kerning first=210 second=76 amount=-1 +kerning first=210 second=75 amount=-1 +kerning first=210 second=74 amount=-1 +kerning first=210 second=73 amount=-1 +kerning first=210 second=72 amount=-1 +kerning first=210 second=70 amount=-1 +kerning first=210 second=69 amount=-1 +kerning first=67 second=111 amount=-1 +kerning first=67 second=112 amount=-1 +kerning first=67 second=113 amount=-1 +kerning first=210 second=68 amount=-1 +kerning first=210 second=66 amount=-1 +kerning first=67 second=117 amount=-1 +kerning first=210 second=65 amount=-1 +kerning first=210 second=46 amount=-1 +kerning first=210 second=44 amount=-1 +kerning first=67 second=122 amount=-1 +kerning first=67 second=171 amount=-1 +kerning first=67 second=192 amount=-1 +kerning first=67 second=193 amount=-1 +kerning first=67 second=194 amount=-1 +kerning first=67 second=196 amount=-1 +kerning first=67 second=197 amount=-1 +kerning first=67 second=198 amount=-1 +kerning first=67 second=199 amount=-1 +kerning first=67 second=200 amount=-1 +kerning first=67 second=201 amount=-1 +kerning first=67 second=202 amount=-1 +kerning first=67 second=203 amount=-1 +kerning first=67 second=204 amount=-1 +kerning first=67 second=205 amount=-1 +kerning first=67 second=206 amount=-1 +kerning first=67 second=207 amount=-1 +kerning first=67 second=209 amount=-1 +kerning first=67 second=210 amount=-1 +kerning first=67 second=211 amount=-1 +kerning first=67 second=212 amount=-1 +kerning first=67 second=213 amount=-1 +kerning first=67 second=214 amount=-1 +kerning first=67 second=216 amount=-1 +kerning first=67 second=217 amount=-1 +kerning first=67 second=218 amount=-1 +kerning first=67 second=219 amount=-1 +kerning first=67 second=220 amount=-1 +kerning first=209 second=8249 amount=-1 +kerning first=209 second=375 amount=-1 +kerning first=209 second=369 amount=-1 +kerning first=209 second=367 amount=-1 +kerning first=209 second=365 amount=-1 +kerning first=209 second=363 amount=-1 +kerning first=209 second=361 amount=-1 +kerning first=209 second=353 amount=-1 +kerning first=209 second=352 amount=-1 +kerning first=67 second=231 amount=-1 +kerning first=67 second=232 amount=-1 +kerning first=67 second=233 amount=-1 +kerning first=67 second=234 amount=-1 +kerning first=67 second=235 amount=-1 +kerning first=209 second=351 amount=-1 +kerning first=67 second=240 amount=-1 +kerning first=209 second=350 amount=-1 +kerning first=67 second=242 amount=-1 +kerning first=67 second=243 amount=-1 +kerning first=67 second=244 amount=-1 +kerning first=67 second=245 amount=-1 +kerning first=67 second=246 amount=-1 +kerning first=67 second=248 amount=-1 +kerning first=67 second=249 amount=-1 +kerning first=67 second=250 amount=-1 +kerning first=67 second=251 amount=-1 +kerning first=67 second=252 amount=-1 +kerning first=209 second=347 amount=-1 +kerning first=209 second=346 amount=-1 +kerning first=209 second=339 amount=-1 +kerning first=67 second=256 amount=-1 +kerning first=209 second=338 amount=-1 +kerning first=209 second=337 amount=-1 +kerning first=67 second=260 amount=-1 +kerning first=209 second=336 amount=-1 +kerning first=67 second=262 amount=-1 +kerning first=67 second=263 amount=-1 +kerning first=67 second=264 amount=-1 +kerning first=67 second=266 amount=-1 +kerning first=67 second=267 amount=-1 +kerning first=67 second=268 amount=-1 +kerning first=67 second=269 amount=-1 +kerning first=67 second=270 amount=-1 +kerning first=67 second=274 amount=-1 +kerning first=67 second=275 amount=-1 +kerning first=67 second=277 amount=-1 +kerning first=67 second=278 amount=-1 +kerning first=67 second=279 amount=-1 +kerning first=67 second=280 amount=-1 +kerning first=67 second=281 amount=-1 +kerning first=67 second=282 amount=-1 +kerning first=67 second=283 amount=-1 +kerning first=67 second=284 amount=-1 +kerning first=67 second=286 amount=-1 +kerning first=67 second=287 amount=-1 +kerning first=67 second=288 amount=-1 +kerning first=67 second=289 amount=-1 +kerning first=67 second=290 amount=-1 +kerning first=67 second=291 amount=-1 +kerning first=67 second=296 amount=-1 +kerning first=67 second=298 amount=-1 +kerning first=67 second=302 amount=-1 +kerning first=209 second=335 amount=-1 +kerning first=67 second=304 amount=-1 +kerning first=209 second=334 amount=-1 +kerning first=67 second=310 amount=-1 +kerning first=209 second=333 amount=-1 +kerning first=67 second=313 amount=-1 +kerning first=209 second=332 amount=-1 +kerning first=67 second=315 amount=-1 +kerning first=209 second=291 amount=-1 +kerning first=67 second=317 amount=-1 +kerning first=209 second=290 amount=-1 +kerning first=67 second=323 amount=-1 +kerning first=209 second=289 amount=-1 +kerning first=67 second=325 amount=-1 +kerning first=209 second=288 amount=-1 +kerning first=67 second=327 amount=-1 +kerning first=209 second=287 amount=-1 +kerning first=67 second=330 amount=-1 +kerning first=209 second=286 amount=-1 +kerning first=67 second=332 amount=-1 +kerning first=67 second=333 amount=-1 +kerning first=67 second=334 amount=-1 +kerning first=67 second=335 amount=-1 +kerning first=67 second=336 amount=-1 +kerning first=67 second=337 amount=-1 +kerning first=67 second=338 amount=-1 +kerning first=67 second=339 amount=-1 +kerning first=67 second=344 amount=-1 +kerning first=209 second=284 amount=-1 +kerning first=67 second=346 amount=-1 +kerning first=209 second=283 amount=-1 +kerning first=67 second=350 amount=-1 +kerning first=209 second=281 amount=-1 +kerning first=67 second=352 amount=-1 +kerning first=209 second=279 amount=-1 +kerning first=209 second=277 amount=-1 +kerning first=209 second=275 amount=-1 +kerning first=67 second=361 amount=-1 +kerning first=67 second=362 amount=-1 +kerning first=67 second=363 amount=-1 +kerning first=67 second=364 amount=-1 +kerning first=67 second=365 amount=-1 +kerning first=67 second=366 amount=-1 +kerning first=67 second=367 amount=-1 +kerning first=67 second=368 amount=-1 +kerning first=67 second=369 amount=-1 +kerning first=67 second=370 amount=-1 +kerning first=209 second=269 amount=-1 +kerning first=209 second=268 amount=-1 +kerning first=67 second=377 amount=-1 +kerning first=67 second=378 amount=-1 +kerning first=67 second=379 amount=-1 +kerning first=67 second=380 amount=-1 +kerning first=67 second=381 amount=-1 +kerning first=67 second=382 amount=-1 +kerning first=209 second=267 amount=-1 +kerning first=209 second=266 amount=-1 +kerning first=209 second=264 amount=-1 +kerning first=209 second=263 amount=-1 +kerning first=209 second=262 amount=-1 +kerning first=209 second=261 amount=-1 +kerning first=209 second=259 amount=-1 +kerning first=209 second=257 amount=-1 +kerning first=209 second=255 amount=-1 +kerning first=209 second=253 amount=-1 +kerning first=209 second=251 amount=-1 +kerning first=209 second=250 amount=-1 +kerning first=209 second=248 amount=-1 +kerning first=209 second=246 amount=-1 +kerning first=209 second=245 amount=-1 +kerning first=209 second=244 amount=-1 +kerning first=209 second=243 amount=-1 +kerning first=209 second=242 amount=-1 +kerning first=209 second=240 amount=-1 +kerning first=209 second=235 amount=-1 +kerning first=209 second=234 amount=-1 +kerning first=209 second=233 amount=-1 +kerning first=209 second=232 amount=-1 +kerning first=209 second=231 amount=-1 +kerning first=67 second=8249 amount=-1 +kerning first=209 second=230 amount=-1 +kerning first=209 second=229 amount=-1 +kerning first=209 second=228 amount=-1 +kerning first=209 second=227 amount=-1 +kerning first=209 second=226 amount=-1 +kerning first=68 second=44 amount=-1 +kerning first=209 second=225 amount=-1 +kerning first=68 second=46 amount=-1 +kerning first=68 second=65 amount=-1 +kerning first=68 second=66 amount=-1 +kerning first=68 second=68 amount=-1 +kerning first=68 second=69 amount=-1 +kerning first=68 second=70 amount=-1 +kerning first=68 second=72 amount=-1 +kerning first=68 second=73 amount=-1 +kerning first=68 second=74 amount=-1 +kerning first=68 second=75 amount=-1 +kerning first=68 second=76 amount=-1 +kerning first=68 second=77 amount=-1 +kerning first=68 second=78 amount=-1 +kerning first=68 second=80 amount=-1 +kerning first=68 second=82 amount=-1 +kerning first=209 second=224 amount=-1 +kerning first=68 second=84 amount=-1 +kerning first=209 second=216 amount=-1 +kerning first=68 second=86 amount=-1 +kerning first=68 second=87 amount=-1 +kerning first=68 second=89 amount=-1 +kerning first=68 second=90 amount=-1 +kerning first=209 second=214 amount=-1 +kerning first=209 second=213 amount=-1 +kerning first=209 second=212 amount=-1 +kerning first=209 second=211 amount=-1 +kerning first=209 second=210 amount=-1 +kerning first=209 second=199 amount=-1 +kerning first=68 second=122 amount=-1 +kerning first=209 second=171 amount=-1 +kerning first=68 second=192 amount=-1 +kerning first=68 second=193 amount=-1 +kerning first=68 second=194 amount=-1 +kerning first=68 second=196 amount=-1 +kerning first=68 second=197 amount=-1 +kerning first=68 second=198 amount=-1 +kerning first=68 second=200 amount=-1 +kerning first=68 second=201 amount=-1 +kerning first=68 second=202 amount=-1 +kerning first=68 second=203 amount=-1 +kerning first=68 second=204 amount=-1 +kerning first=68 second=205 amount=-1 +kerning first=68 second=206 amount=-1 +kerning first=68 second=207 amount=-1 +kerning first=68 second=209 amount=-1 +kerning first=209 second=121 amount=-1 +kerning first=209 second=119 amount=-1 +kerning first=209 second=118 amount=-1 +kerning first=209 second=117 amount=-1 +kerning first=68 second=221 amount=-1 +kerning first=209 second=115 amount=-1 +kerning first=209 second=113 amount=-1 +kerning first=209 second=111 amount=-1 +kerning first=209 second=103 amount=-1 +kerning first=209 second=101 amount=-1 +kerning first=209 second=100 amount=-1 +kerning first=209 second=99 amount=-1 +kerning first=209 second=97 amount=-1 +kerning first=68 second=256 amount=-1 +kerning first=209 second=83 amount=-1 +kerning first=209 second=81 amount=-1 +kerning first=68 second=260 amount=-1 +kerning first=209 second=79 amount=-1 +kerning first=68 second=270 amount=-1 +kerning first=68 second=274 amount=-1 +kerning first=68 second=278 amount=-1 +kerning first=68 second=280 amount=-1 +kerning first=68 second=282 amount=-1 +kerning first=209 second=71 amount=-1 +kerning first=209 second=67 amount=-1 +kerning first=209 second=45 amount=-1 +kerning first=68 second=296 amount=-1 +kerning first=68 second=298 amount=-1 +kerning first=68 second=302 amount=-1 +kerning first=208 second=8221 amount=-1 +kerning first=68 second=304 amount=-1 +kerning first=208 second=8220 amount=-1 +kerning first=68 second=310 amount=-1 +kerning first=68 second=313 amount=-1 +kerning first=68 second=315 amount=-1 +kerning first=68 second=317 amount=-1 +kerning first=68 second=323 amount=-1 +kerning first=68 second=325 amount=-1 +kerning first=68 second=327 amount=-1 +kerning first=68 second=330 amount=-1 +kerning first=68 second=344 amount=-1 +kerning first=208 second=8217 amount=-1 +kerning first=208 second=382 amount=-1 +kerning first=208 second=381 amount=-1 +kerning first=68 second=354 amount=-1 +kerning first=68 second=356 amount=-1 +kerning first=208 second=380 amount=-1 +kerning first=208 second=379 amount=-1 +kerning first=208 second=378 amount=-1 +kerning first=208 second=377 amount=-1 +kerning first=208 second=374 amount=-1 +kerning first=68 second=374 amount=-1 +kerning first=68 second=377 amount=-1 +kerning first=68 second=378 amount=-1 +kerning first=68 second=379 amount=-1 +kerning first=68 second=380 amount=-1 +kerning first=68 second=381 amount=-1 +kerning first=68 second=382 amount=-1 +kerning first=208 second=356 amount=-1 +kerning first=208 second=354 amount=-1 +kerning first=208 second=344 amount=-1 +kerning first=208 second=330 amount=-1 +kerning first=208 second=327 amount=-1 +kerning first=208 second=325 amount=-1 +kerning first=208 second=323 amount=-1 +kerning first=208 second=317 amount=-1 +kerning first=208 second=315 amount=-1 +kerning first=208 second=313 amount=-1 +kerning first=208 second=310 amount=-1 +kerning first=208 second=304 amount=-1 +kerning first=208 second=302 amount=-1 +kerning first=208 second=298 amount=-1 +kerning first=208 second=296 amount=-1 +kerning first=208 second=282 amount=-1 +kerning first=68 second=8217 amount=-1 +kerning first=68 second=8220 amount=-1 +kerning first=68 second=8221 amount=-1 +kerning first=208 second=280 amount=-1 +kerning first=208 second=278 amount=-1 +kerning first=69 second=45 amount=-1 +kerning first=208 second=274 amount=-1 +kerning first=69 second=65 amount=-1 +kerning first=69 second=66 amount=-1 +kerning first=208 second=270 amount=-1 +kerning first=69 second=68 amount=-1 +kerning first=69 second=69 amount=-1 +kerning first=69 second=70 amount=-1 +kerning first=208 second=260 amount=-1 +kerning first=69 second=72 amount=-1 +kerning first=69 second=73 amount=-1 +kerning first=208 second=256 amount=-1 +kerning first=69 second=75 amount=-1 +kerning first=69 second=76 amount=-1 +kerning first=69 second=77 amount=-1 +kerning first=69 second=78 amount=-1 +kerning first=208 second=221 amount=-1 +kerning first=69 second=80 amount=-1 +kerning first=208 second=209 amount=-1 +kerning first=69 second=82 amount=-1 +kerning first=69 second=83 amount=-1 +kerning first=208 second=207 amount=-1 +kerning first=69 second=85 amount=-1 +kerning first=208 second=206 amount=-1 +kerning first=208 second=205 amount=-1 +kerning first=208 second=204 amount=-1 +kerning first=208 second=203 amount=-1 +kerning first=208 second=202 amount=-1 +kerning first=208 second=201 amount=-1 +kerning first=69 second=102 amount=-1 +kerning first=69 second=103 amount=-1 +kerning first=208 second=200 amount=-1 +kerning first=208 second=198 amount=-1 +kerning first=208 second=197 amount=-1 +kerning first=208 second=196 amount=-1 +kerning first=208 second=194 amount=-1 +kerning first=208 second=193 amount=-1 +kerning first=69 second=112 amount=-1 +kerning first=208 second=192 amount=-1 +kerning first=69 second=117 amount=-1 +kerning first=208 second=122 amount=-1 +kerning first=208 second=90 amount=-1 +kerning first=208 second=89 amount=-1 +kerning first=69 second=122 amount=-1 +kerning first=69 second=171 amount=-1 +kerning first=69 second=192 amount=-1 +kerning first=69 second=193 amount=-1 +kerning first=69 second=194 amount=-1 +kerning first=69 second=196 amount=-1 +kerning first=69 second=197 amount=-1 +kerning first=69 second=198 amount=-1 +kerning first=208 second=87 amount=-1 +kerning first=69 second=200 amount=-1 +kerning first=69 second=201 amount=-1 +kerning first=69 second=202 amount=-1 +kerning first=69 second=203 amount=-1 +kerning first=69 second=204 amount=-1 +kerning first=69 second=205 amount=-1 +kerning first=69 second=206 amount=-1 +kerning first=69 second=207 amount=-1 +kerning first=69 second=209 amount=-1 +kerning first=208 second=86 amount=-1 +kerning first=208 second=84 amount=-1 +kerning first=208 second=82 amount=-1 +kerning first=208 second=80 amount=-1 +kerning first=208 second=78 amount=-1 +kerning first=208 second=77 amount=-1 +kerning first=69 second=217 amount=-1 +kerning first=69 second=218 amount=-1 +kerning first=69 second=219 amount=-1 +kerning first=69 second=220 amount=-1 +kerning first=208 second=76 amount=-1 +kerning first=208 second=75 amount=-1 +kerning first=208 second=74 amount=-1 +kerning first=208 second=73 amount=-1 +kerning first=208 second=72 amount=-1 +kerning first=208 second=70 amount=-1 +kerning first=208 second=69 amount=-1 +kerning first=208 second=68 amount=-1 +kerning first=208 second=66 amount=-1 +kerning first=208 second=65 amount=-1 +kerning first=208 second=46 amount=-1 +kerning first=69 second=249 amount=-1 +kerning first=69 second=250 amount=-1 +kerning first=69 second=251 amount=-1 +kerning first=69 second=252 amount=-1 +kerning first=208 second=44 amount=-1 +kerning first=69 second=256 amount=-1 +kerning first=207 second=375 amount=-1 +kerning first=207 second=369 amount=-1 +kerning first=69 second=260 amount=-1 +kerning first=207 second=367 amount=-1 +kerning first=207 second=365 amount=-1 +kerning first=207 second=363 amount=-1 +kerning first=207 second=361 amount=-1 +kerning first=207 second=353 amount=-1 +kerning first=69 second=270 amount=-1 +kerning first=69 second=274 amount=-1 +kerning first=69 second=278 amount=-1 +kerning first=69 second=280 amount=-1 +kerning first=69 second=282 amount=-1 +kerning first=207 second=352 amount=-1 +kerning first=207 second=351 amount=-1 +kerning first=69 second=287 amount=-1 +kerning first=207 second=350 amount=-1 +kerning first=69 second=289 amount=-1 +kerning first=207 second=347 amount=-1 +kerning first=69 second=291 amount=-1 +kerning first=69 second=296 amount=-1 +kerning first=69 second=298 amount=-1 +kerning first=69 second=302 amount=-1 +kerning first=207 second=346 amount=-1 +kerning first=69 second=304 amount=-1 +kerning first=207 second=339 amount=-1 +kerning first=69 second=310 amount=-1 +kerning first=207 second=338 amount=-1 +kerning first=69 second=313 amount=-1 +kerning first=207 second=337 amount=-1 +kerning first=69 second=315 amount=-1 +kerning first=207 second=336 amount=-1 +kerning first=69 second=317 amount=-1 +kerning first=207 second=335 amount=-1 +kerning first=69 second=323 amount=-1 +kerning first=207 second=334 amount=-1 +kerning first=69 second=325 amount=-1 +kerning first=207 second=333 amount=-1 +kerning first=69 second=327 amount=-1 +kerning first=207 second=332 amount=-1 +kerning first=69 second=330 amount=-1 +kerning first=207 second=291 amount=-1 +kerning first=207 second=290 amount=-1 +kerning first=207 second=289 amount=-1 +kerning first=207 second=288 amount=-1 +kerning first=207 second=287 amount=-1 +kerning first=69 second=344 amount=-1 +kerning first=69 second=346 amount=-1 +kerning first=207 second=286 amount=-1 +kerning first=69 second=350 amount=-1 +kerning first=207 second=284 amount=-1 +kerning first=69 second=352 amount=-1 +kerning first=207 second=283 amount=-1 +kerning first=207 second=281 amount=-1 +kerning first=207 second=279 amount=-1 +kerning first=69 second=361 amount=-1 +kerning first=69 second=362 amount=-1 +kerning first=69 second=363 amount=-1 +kerning first=69 second=364 amount=-1 +kerning first=69 second=365 amount=-1 +kerning first=69 second=366 amount=-1 +kerning first=69 second=367 amount=-1 +kerning first=69 second=368 amount=-1 +kerning first=69 second=369 amount=-1 +kerning first=69 second=370 amount=-1 +kerning first=207 second=277 amount=-1 +kerning first=207 second=275 amount=-1 +kerning first=69 second=378 amount=-1 +kerning first=207 second=269 amount=-1 +kerning first=69 second=380 amount=-1 +kerning first=207 second=268 amount=-1 +kerning first=69 second=382 amount=-1 +kerning first=207 second=267 amount=-1 +kerning first=207 second=266 amount=-1 +kerning first=207 second=264 amount=-1 +kerning first=207 second=263 amount=-1 +kerning first=207 second=262 amount=-1 +kerning first=207 second=261 amount=-1 +kerning first=207 second=259 amount=-1 +kerning first=207 second=257 amount=-1 +kerning first=207 second=255 amount=-1 +kerning first=207 second=253 amount=-1 +kerning first=207 second=251 amount=-1 +kerning first=207 second=250 amount=-1 +kerning first=207 second=248 amount=-1 +kerning first=207 second=246 amount=-1 +kerning first=207 second=245 amount=-1 +kerning first=207 second=244 amount=-1 +kerning first=207 second=243 amount=-1 +kerning first=207 second=242 amount=-1 +kerning first=207 second=240 amount=-1 +kerning first=207 second=235 amount=-1 +kerning first=207 second=234 amount=-1 +kerning first=207 second=233 amount=-1 +kerning first=69 second=8249 amount=-1 +kerning first=207 second=232 amount=-1 +kerning first=207 second=231 amount=-1 +kerning first=207 second=230 amount=-1 +kerning first=207 second=229 amount=-1 +kerning first=207 second=228 amount=-1 +kerning first=70 second=44 amount=-1 +kerning first=70 second=45 amount=-1 +kerning first=70 second=46 amount=-1 +kerning first=70 second=65 amount=-1 +kerning first=207 second=227 amount=-1 +kerning first=207 second=226 amount=-1 +kerning first=70 second=74 amount=-1 +kerning first=207 second=225 amount=-1 +kerning first=207 second=224 amount=-1 +kerning first=70 second=83 amount=-1 +kerning first=70 second=97 amount=-1 +kerning first=207 second=216 amount=-1 +kerning first=207 second=214 amount=-1 +kerning first=207 second=213 amount=-1 +kerning first=207 second=212 amount=-1 +kerning first=70 second=103 amount=-1 +kerning first=207 second=211 amount=-1 +kerning first=207 second=210 amount=-1 +kerning first=207 second=199 amount=-1 +kerning first=207 second=121 amount=-1 +kerning first=207 second=119 amount=-1 +kerning first=70 second=115 amount=-1 +kerning first=207 second=118 amount=-1 +kerning first=207 second=117 amount=-1 +kerning first=207 second=115 amount=-1 +kerning first=207 second=113 amount=-1 +kerning first=70 second=122 amount=-1 +kerning first=70 second=171 amount=-1 +kerning first=70 second=192 amount=-1 +kerning first=70 second=193 amount=-1 +kerning first=70 second=194 amount=-1 +kerning first=70 second=196 amount=-1 +kerning first=70 second=197 amount=-1 +kerning first=70 second=198 amount=-1 +kerning first=207 second=111 amount=-1 +kerning first=207 second=103 amount=-1 +kerning first=207 second=101 amount=-1 +kerning first=207 second=100 amount=-1 +kerning first=207 second=99 amount=-1 +kerning first=207 second=97 amount=-1 +kerning first=207 second=83 amount=-1 +kerning first=207 second=81 amount=-1 +kerning first=207 second=79 amount=-1 +kerning first=70 second=225 amount=-1 +kerning first=70 second=226 amount=-1 +kerning first=70 second=227 amount=-1 +kerning first=207 second=71 amount=-1 +kerning first=70 second=229 amount=-1 +kerning first=70 second=230 amount=-1 +kerning first=207 second=67 amount=-1 +kerning first=206 second=8249 amount=-1 +kerning first=206 second=375 amount=-1 +kerning first=206 second=369 amount=-1 +kerning first=206 second=367 amount=-1 +kerning first=206 second=365 amount=-1 +kerning first=206 second=363 amount=-1 +kerning first=206 second=361 amount=-1 +kerning first=206 second=353 amount=-1 +kerning first=206 second=352 amount=-1 +kerning first=206 second=351 amount=-1 +kerning first=206 second=350 amount=-1 +kerning first=206 second=347 amount=-1 +kerning first=206 second=346 amount=-1 +kerning first=206 second=339 amount=-1 +kerning first=70 second=256 amount=-1 +kerning first=70 second=257 amount=-1 +kerning first=70 second=259 amount=-1 +kerning first=70 second=260 amount=-1 +kerning first=70 second=261 amount=-1 +kerning first=206 second=338 amount=-1 +kerning first=206 second=337 amount=-1 +kerning first=206 second=336 amount=-1 +kerning first=206 second=335 amount=-1 +kerning first=206 second=334 amount=-1 +kerning first=206 second=333 amount=-1 +kerning first=206 second=332 amount=-1 +kerning first=206 second=291 amount=-1 +kerning first=206 second=290 amount=-1 +kerning first=206 second=289 amount=-1 +kerning first=206 second=288 amount=-1 +kerning first=206 second=287 amount=-1 +kerning first=206 second=286 amount=-1 +kerning first=206 second=284 amount=-1 +kerning first=70 second=287 amount=-1 +kerning first=206 second=283 amount=-1 +kerning first=70 second=289 amount=-1 +kerning first=206 second=281 amount=-1 +kerning first=70 second=291 amount=-1 +kerning first=206 second=279 amount=-1 +kerning first=206 second=277 amount=-1 +kerning first=206 second=275 amount=-1 +kerning first=206 second=269 amount=-1 +kerning first=206 second=268 amount=-1 +kerning first=206 second=267 amount=-1 +kerning first=206 second=266 amount=-1 +kerning first=206 second=264 amount=-1 +kerning first=206 second=263 amount=-1 +kerning first=206 second=262 amount=-1 +kerning first=206 second=261 amount=-1 +kerning first=206 second=259 amount=-1 +kerning first=70 second=346 amount=-1 +kerning first=70 second=347 amount=-1 +kerning first=70 second=350 amount=-1 +kerning first=70 second=351 amount=-1 +kerning first=70 second=352 amount=-1 +kerning first=70 second=353 amount=-1 +kerning first=206 second=257 amount=-1 +kerning first=206 second=255 amount=-1 +kerning first=206 second=253 amount=-1 +kerning first=206 second=251 amount=-1 +kerning first=206 second=250 amount=-1 +kerning first=70 second=378 amount=-1 +kerning first=70 second=380 amount=-1 +kerning first=70 second=382 amount=-1 +kerning first=206 second=248 amount=-1 +kerning first=206 second=246 amount=-1 +kerning first=206 second=245 amount=-1 +kerning first=206 second=244 amount=-1 +kerning first=206 second=243 amount=-1 +kerning first=206 second=242 amount=-1 +kerning first=206 second=240 amount=-1 +kerning first=206 second=235 amount=-1 +kerning first=206 second=234 amount=-1 +kerning first=206 second=233 amount=-1 +kerning first=70 second=8249 amount=-1 +kerning first=206 second=232 amount=-1 +kerning first=206 second=231 amount=-1 +kerning first=206 second=230 amount=-1 +kerning first=206 second=229 amount=-1 +kerning first=206 second=228 amount=-1 +kerning first=71 second=44 amount=-1 +kerning first=71 second=45 amount=-1 +kerning first=71 second=46 amount=-1 +kerning first=71 second=65 amount=-1 +kerning first=206 second=227 amount=-1 +kerning first=206 second=226 amount=-1 +kerning first=206 second=225 amount=-1 +kerning first=206 second=224 amount=-1 +kerning first=206 second=216 amount=-1 +kerning first=206 second=214 amount=-1 +kerning first=206 second=213 amount=-1 +kerning first=206 second=212 amount=-1 +kerning first=206 second=211 amount=-1 +kerning first=206 second=210 amount=-1 +kerning first=206 second=199 amount=-1 +kerning first=206 second=171 amount=-1 +kerning first=206 second=121 amount=-1 +kerning first=71 second=83 amount=-1 +kerning first=71 second=84 amount=-1 +kerning first=206 second=119 amount=-1 +kerning first=71 second=86 amount=-1 +kerning first=71 second=87 amount=-1 +kerning first=71 second=89 amount=-1 +kerning first=71 second=90 amount=-1 +kerning first=206 second=118 amount=-1 +kerning first=206 second=117 amount=-1 +kerning first=71 second=102 amount=-1 +kerning first=71 second=103 amount=-1 +kerning first=206 second=115 amount=-1 +kerning first=206 second=113 amount=-1 +kerning first=206 second=111 amount=-1 +kerning first=206 second=103 amount=-1 +kerning first=206 second=101 amount=-1 +kerning first=206 second=100 amount=-1 +kerning first=206 second=99 amount=-1 +kerning first=206 second=97 amount=-1 +kerning first=206 second=83 amount=-1 +kerning first=71 second=171 amount=-1 +kerning first=71 second=192 amount=-1 +kerning first=71 second=193 amount=-1 +kerning first=71 second=194 amount=-1 +kerning first=71 second=196 amount=-1 +kerning first=71 second=197 amount=-1 +kerning first=71 second=198 amount=-1 +kerning first=206 second=81 amount=-1 +kerning first=206 second=79 amount=-1 +kerning first=206 second=71 amount=-1 +kerning first=206 second=67 amount=-1 +kerning first=206 second=45 amount=-1 +kerning first=205 second=375 amount=-1 +kerning first=205 second=369 amount=-1 +kerning first=205 second=367 amount=-1 +kerning first=205 second=365 amount=-1 +kerning first=205 second=363 amount=-1 +kerning first=205 second=361 amount=-1 +kerning first=205 second=353 amount=-1 +kerning first=205 second=352 amount=-1 +kerning first=71 second=221 amount=-1 +kerning first=205 second=351 amount=-1 +kerning first=205 second=350 amount=-1 +kerning first=205 second=347 amount=-1 +kerning first=205 second=346 amount=-1 +kerning first=205 second=339 amount=-1 +kerning first=205 second=338 amount=-1 +kerning first=205 second=337 amount=-1 +kerning first=205 second=336 amount=-1 +kerning first=205 second=335 amount=-1 +kerning first=205 second=334 amount=-1 +kerning first=205 second=333 amount=-1 +kerning first=205 second=332 amount=-1 +kerning first=71 second=256 amount=-1 +kerning first=205 second=291 amount=-1 +kerning first=205 second=290 amount=-1 +kerning first=71 second=260 amount=-1 +kerning first=205 second=289 amount=-1 +kerning first=205 second=288 amount=-1 +kerning first=205 second=287 amount=-1 +kerning first=205 second=286 amount=-1 +kerning first=205 second=284 amount=-1 +kerning first=205 second=283 amount=-1 +kerning first=71 second=287 amount=-1 +kerning first=71 second=289 amount=-1 +kerning first=71 second=291 amount=-1 +kerning first=205 second=281 amount=-1 +kerning first=205 second=279 amount=-1 +kerning first=205 second=277 amount=-1 +kerning first=205 second=275 amount=-1 +kerning first=205 second=269 amount=-1 +kerning first=205 second=268 amount=-1 +kerning first=205 second=267 amount=-1 +kerning first=205 second=266 amount=-1 +kerning first=205 second=264 amount=-1 +kerning first=205 second=263 amount=-1 +kerning first=205 second=262 amount=-1 +kerning first=205 second=261 amount=-1 +kerning first=205 second=259 amount=-1 +kerning first=205 second=257 amount=-1 +kerning first=205 second=255 amount=-1 +kerning first=205 second=253 amount=-1 +kerning first=205 second=251 amount=-1 +kerning first=71 second=346 amount=-1 +kerning first=71 second=350 amount=-1 +kerning first=71 second=352 amount=-1 +kerning first=71 second=354 amount=-1 +kerning first=71 second=356 amount=-1 +kerning first=205 second=250 amount=-1 +kerning first=205 second=248 amount=-1 +kerning first=205 second=246 amount=-1 +kerning first=205 second=245 amount=-1 +kerning first=205 second=244 amount=-1 +kerning first=205 second=243 amount=-1 +kerning first=205 second=242 amount=-1 +kerning first=205 second=240 amount=-1 +kerning first=205 second=235 amount=-1 +kerning first=205 second=234 amount=-1 +kerning first=71 second=374 amount=-1 +kerning first=71 second=377 amount=-1 +kerning first=205 second=233 amount=-1 +kerning first=71 second=379 amount=-1 +kerning first=205 second=232 amount=-1 +kerning first=71 second=381 amount=-1 +kerning first=205 second=231 amount=-1 +kerning first=205 second=230 amount=-1 +kerning first=205 second=229 amount=-1 +kerning first=205 second=228 amount=-1 +kerning first=205 second=227 amount=-1 +kerning first=205 second=226 amount=-1 +kerning first=205 second=225 amount=-1 +kerning first=205 second=224 amount=-1 +kerning first=205 second=216 amount=-1 +kerning first=205 second=214 amount=-1 +kerning first=205 second=213 amount=-1 +kerning first=205 second=212 amount=-1 +kerning first=205 second=211 amount=-1 +kerning first=205 second=210 amount=-1 +kerning first=205 second=199 amount=-1 +kerning first=205 second=121 amount=-1 +kerning first=205 second=119 amount=-1 +kerning first=205 second=118 amount=-1 +kerning first=205 second=117 amount=-1 +kerning first=205 second=115 amount=-1 +kerning first=205 second=113 amount=-1 +kerning first=205 second=111 amount=-1 +kerning first=205 second=103 amount=-1 +kerning first=71 second=8249 amount=-1 +kerning first=205 second=101 amount=-1 +kerning first=205 second=100 amount=-1 +kerning first=205 second=99 amount=-1 +kerning first=205 second=97 amount=-1 +kerning first=205 second=83 amount=-1 +kerning first=205 second=81 amount=-1 +kerning first=72 second=45 amount=-1 +kerning first=205 second=79 amount=-1 +kerning first=72 second=67 amount=-1 +kerning first=72 second=71 amount=-1 +kerning first=205 second=71 amount=-1 +kerning first=72 second=79 amount=-1 +kerning first=72 second=81 amount=-1 +kerning first=72 second=83 amount=-1 +kerning first=72 second=97 amount=-1 +kerning first=72 second=99 amount=-1 +kerning first=72 second=100 amount=-1 +kerning first=72 second=101 amount=-1 +kerning first=72 second=103 amount=-1 +kerning first=205 second=67 amount=-1 +kerning first=72 second=111 amount=-1 +kerning first=204 second=375 amount=-1 +kerning first=72 second=113 amount=-1 +kerning first=72 second=115 amount=-1 +kerning first=72 second=117 amount=-1 +kerning first=72 second=118 amount=-1 +kerning first=72 second=119 amount=-1 +kerning first=72 second=121 amount=-1 +kerning first=204 second=369 amount=-1 +kerning first=72 second=171 amount=-1 +kerning first=72 second=199 amount=-1 +kerning first=72 second=210 amount=-1 +kerning first=72 second=211 amount=-1 +kerning first=72 second=212 amount=-1 +kerning first=72 second=213 amount=-1 +kerning first=72 second=214 amount=-1 +kerning first=72 second=216 amount=-1 +kerning first=72 second=224 amount=-1 +kerning first=72 second=225 amount=-1 +kerning first=72 second=226 amount=-1 +kerning first=72 second=227 amount=-1 +kerning first=72 second=228 amount=-1 +kerning first=72 second=229 amount=-1 +kerning first=72 second=230 amount=-1 +kerning first=72 second=231 amount=-1 +kerning first=72 second=232 amount=-1 +kerning first=72 second=233 amount=-1 +kerning first=72 second=234 amount=-1 +kerning first=72 second=235 amount=-1 +kerning first=204 second=367 amount=-1 +kerning first=72 second=240 amount=-1 +kerning first=72 second=242 amount=-1 +kerning first=72 second=243 amount=-1 +kerning first=72 second=244 amount=-1 +kerning first=72 second=245 amount=-1 +kerning first=72 second=246 amount=-1 +kerning first=72 second=248 amount=-1 +kerning first=204 second=365 amount=-1 +kerning first=72 second=250 amount=-1 +kerning first=72 second=251 amount=-1 +kerning first=204 second=363 amount=-1 +kerning first=72 second=253 amount=-1 +kerning first=72 second=255 amount=-1 +kerning first=72 second=257 amount=-1 +kerning first=72 second=259 amount=-1 +kerning first=72 second=261 amount=-1 +kerning first=72 second=262 amount=-1 +kerning first=72 second=263 amount=-1 +kerning first=72 second=264 amount=-1 +kerning first=72 second=266 amount=-1 +kerning first=72 second=267 amount=-1 +kerning first=72 second=268 amount=-1 +kerning first=72 second=269 amount=-1 +kerning first=72 second=275 amount=-1 +kerning first=72 second=277 amount=-1 +kerning first=72 second=279 amount=-1 +kerning first=72 second=281 amount=-1 +kerning first=72 second=283 amount=-1 +kerning first=72 second=284 amount=-1 +kerning first=72 second=286 amount=-1 +kerning first=72 second=287 amount=-1 +kerning first=72 second=288 amount=-1 +kerning first=72 second=289 amount=-1 +kerning first=72 second=290 amount=-1 +kerning first=72 second=291 amount=-1 +kerning first=204 second=361 amount=-1 +kerning first=204 second=353 amount=-1 +kerning first=72 second=332 amount=-1 +kerning first=72 second=333 amount=-1 +kerning first=72 second=334 amount=-1 +kerning first=72 second=335 amount=-1 +kerning first=72 second=336 amount=-1 +kerning first=72 second=337 amount=-1 +kerning first=72 second=338 amount=-1 +kerning first=72 second=339 amount=-1 +kerning first=72 second=346 amount=-1 +kerning first=72 second=347 amount=-1 +kerning first=72 second=350 amount=-1 +kerning first=72 second=351 amount=-1 +kerning first=72 second=352 amount=-1 +kerning first=72 second=353 amount=-1 +kerning first=72 second=361 amount=-1 +kerning first=72 second=363 amount=-1 +kerning first=72 second=365 amount=-1 +kerning first=72 second=367 amount=-1 +kerning first=72 second=369 amount=-1 +kerning first=72 second=375 amount=-1 +kerning first=204 second=352 amount=-1 +kerning first=204 second=351 amount=-1 +kerning first=204 second=350 amount=-1 +kerning first=204 second=347 amount=-1 +kerning first=204 second=346 amount=-1 +kerning first=204 second=339 amount=-1 +kerning first=204 second=338 amount=-1 +kerning first=204 second=337 amount=-1 +kerning first=204 second=336 amount=-1 +kerning first=204 second=335 amount=-1 +kerning first=204 second=334 amount=-1 +kerning first=204 second=333 amount=-1 +kerning first=72 second=8249 amount=-1 +kerning first=204 second=332 amount=-1 +kerning first=73 second=45 amount=-1 +kerning first=204 second=291 amount=-1 +kerning first=73 second=67 amount=-1 +kerning first=73 second=71 amount=-1 +kerning first=204 second=290 amount=-1 +kerning first=73 second=79 amount=-1 +kerning first=73 second=81 amount=-1 +kerning first=73 second=83 amount=-1 +kerning first=73 second=97 amount=-1 +kerning first=73 second=99 amount=-1 +kerning first=73 second=100 amount=-1 +kerning first=73 second=101 amount=-1 +kerning first=73 second=103 amount=-1 +kerning first=204 second=289 amount=-1 +kerning first=73 second=111 amount=-1 +kerning first=204 second=288 amount=-1 +kerning first=73 second=113 amount=-1 +kerning first=73 second=115 amount=-1 +kerning first=73 second=117 amount=-1 +kerning first=73 second=118 amount=-1 +kerning first=73 second=119 amount=-1 +kerning first=73 second=121 amount=-1 +kerning first=204 second=287 amount=-1 +kerning first=73 second=171 amount=-1 +kerning first=73 second=199 amount=-1 +kerning first=73 second=210 amount=-1 +kerning first=73 second=211 amount=-1 +kerning first=73 second=212 amount=-1 +kerning first=73 second=213 amount=-1 +kerning first=73 second=214 amount=-1 +kerning first=73 second=216 amount=-1 +kerning first=73 second=224 amount=-1 +kerning first=73 second=225 amount=-1 +kerning first=73 second=226 amount=-1 +kerning first=73 second=227 amount=-1 +kerning first=73 second=228 amount=-1 +kerning first=73 second=229 amount=-1 +kerning first=73 second=230 amount=-1 +kerning first=73 second=231 amount=-1 +kerning first=73 second=232 amount=-1 +kerning first=73 second=233 amount=-1 +kerning first=73 second=234 amount=-1 +kerning first=73 second=235 amount=-1 +kerning first=204 second=286 amount=-1 +kerning first=73 second=240 amount=-1 +kerning first=73 second=242 amount=-1 +kerning first=73 second=243 amount=-1 +kerning first=73 second=244 amount=-1 +kerning first=73 second=245 amount=-1 +kerning first=73 second=246 amount=-1 +kerning first=73 second=248 amount=-1 +kerning first=204 second=284 amount=-1 +kerning first=73 second=250 amount=-1 +kerning first=73 second=251 amount=-1 +kerning first=204 second=283 amount=-1 +kerning first=73 second=253 amount=-1 +kerning first=73 second=255 amount=-1 +kerning first=73 second=257 amount=-1 +kerning first=73 second=259 amount=-1 +kerning first=73 second=261 amount=-1 +kerning first=73 second=262 amount=-1 +kerning first=73 second=263 amount=-1 +kerning first=73 second=264 amount=-1 +kerning first=73 second=266 amount=-1 +kerning first=73 second=267 amount=-1 +kerning first=73 second=268 amount=-1 +kerning first=73 second=269 amount=-1 +kerning first=73 second=275 amount=-1 +kerning first=73 second=277 amount=-1 +kerning first=73 second=279 amount=-1 +kerning first=73 second=281 amount=-1 +kerning first=73 second=283 amount=-1 +kerning first=73 second=284 amount=-1 +kerning first=73 second=286 amount=-1 +kerning first=73 second=287 amount=-1 +kerning first=73 second=288 amount=-1 +kerning first=73 second=289 amount=-1 +kerning first=73 second=290 amount=-1 +kerning first=73 second=291 amount=-1 +kerning first=204 second=281 amount=-1 +kerning first=204 second=279 amount=-1 +kerning first=73 second=332 amount=-1 +kerning first=73 second=333 amount=-1 +kerning first=73 second=334 amount=-1 +kerning first=73 second=335 amount=-1 +kerning first=73 second=336 amount=-1 +kerning first=73 second=337 amount=-1 +kerning first=73 second=338 amount=-1 +kerning first=73 second=339 amount=-1 +kerning first=73 second=346 amount=-1 +kerning first=73 second=347 amount=-1 +kerning first=73 second=350 amount=-1 +kerning first=73 second=351 amount=-1 +kerning first=73 second=352 amount=-1 +kerning first=73 second=353 amount=-1 +kerning first=73 second=361 amount=-1 +kerning first=73 second=363 amount=-1 +kerning first=73 second=365 amount=-1 +kerning first=73 second=367 amount=-1 +kerning first=73 second=369 amount=-1 +kerning first=73 second=375 amount=-1 +kerning first=204 second=277 amount=-1 +kerning first=204 second=275 amount=-1 +kerning first=204 second=269 amount=-1 +kerning first=204 second=268 amount=-1 +kerning first=204 second=267 amount=-1 +kerning first=204 second=266 amount=-1 +kerning first=204 second=264 amount=-1 +kerning first=204 second=263 amount=-1 +kerning first=204 second=262 amount=-1 +kerning first=204 second=261 amount=-1 +kerning first=204 second=259 amount=-1 +kerning first=204 second=257 amount=-1 +kerning first=73 second=8249 amount=-1 +kerning first=204 second=255 amount=-1 +kerning first=74 second=45 amount=-1 +kerning first=204 second=253 amount=-1 +kerning first=74 second=65 amount=-2 +kerning first=74 second=67 amount=-1 +kerning first=74 second=71 amount=-1 +kerning first=74 second=74 amount=-1 +kerning first=74 second=79 amount=-1 +kerning first=74 second=81 amount=-1 +kerning first=204 second=251 amount=-1 +kerning first=204 second=250 amount=-1 +kerning first=204 second=248 amount=-1 +kerning first=204 second=246 amount=-1 +kerning first=204 second=245 amount=-1 +kerning first=74 second=97 amount=-1 +kerning first=74 second=99 amount=-1 +kerning first=74 second=100 amount=-1 +kerning first=74 second=101 amount=-1 +kerning first=204 second=244 amount=-1 +kerning first=74 second=103 amount=-1 +kerning first=74 second=105 amount=-1 +kerning first=204 second=243 amount=-1 +kerning first=204 second=242 amount=-1 +kerning first=74 second=111 amount=-1 +kerning first=74 second=112 amount=-1 +kerning first=74 second=113 amount=-1 +kerning first=204 second=240 amount=-1 +kerning first=74 second=115 amount=-1 +kerning first=204 second=235 amount=-1 +kerning first=204 second=234 amount=-1 +kerning first=204 second=233 amount=-1 +kerning first=74 second=171 amount=-1 +kerning first=74 second=192 amount=-2 +kerning first=74 second=193 amount=-2 +kerning first=74 second=194 amount=-2 +kerning first=74 second=196 amount=-2 +kerning first=74 second=197 amount=-2 +kerning first=74 second=198 amount=-2 +kerning first=74 second=199 amount=-1 +kerning first=74 second=210 amount=-1 +kerning first=74 second=211 amount=-1 +kerning first=74 second=212 amount=-1 +kerning first=74 second=213 amount=-1 +kerning first=74 second=214 amount=-1 +kerning first=74 second=216 amount=-1 +kerning first=204 second=232 amount=-1 +kerning first=204 second=231 amount=-1 +kerning first=74 second=224 amount=-1 +kerning first=74 second=225 amount=-1 +kerning first=74 second=226 amount=-1 +kerning first=74 second=227 amount=-1 +kerning first=74 second=228 amount=-1 +kerning first=74 second=229 amount=-1 +kerning first=74 second=230 amount=-1 +kerning first=74 second=231 amount=-1 +kerning first=204 second=230 amount=-1 +kerning first=74 second=233 amount=-1 +kerning first=74 second=234 amount=-1 +kerning first=204 second=229 amount=-1 +kerning first=74 second=237 amount=-1 +kerning first=74 second=240 amount=-1 +kerning first=204 second=228 amount=-1 +kerning first=204 second=227 amount=-1 +kerning first=74 second=243 amount=-1 +kerning first=74 second=244 amount=-1 +kerning first=74 second=245 amount=-1 +kerning first=204 second=226 amount=-1 +kerning first=74 second=248 amount=-1 +kerning first=74 second=256 amount=-2 +kerning first=74 second=257 amount=-1 +kerning first=74 second=259 amount=-1 +kerning first=74 second=260 amount=-2 +kerning first=74 second=261 amount=-1 +kerning first=74 second=262 amount=-1 +kerning first=74 second=263 amount=-1 +kerning first=74 second=264 amount=-1 +kerning first=74 second=266 amount=-1 +kerning first=74 second=267 amount=-1 +kerning first=74 second=268 amount=-1 +kerning first=74 second=269 amount=-1 +kerning first=74 second=275 amount=-1 +kerning first=74 second=277 amount=-1 +kerning first=74 second=279 amount=-1 +kerning first=74 second=281 amount=-1 +kerning first=74 second=283 amount=-1 +kerning first=74 second=284 amount=-1 +kerning first=74 second=286 amount=-1 +kerning first=74 second=287 amount=-1 +kerning first=74 second=288 amount=-1 +kerning first=74 second=289 amount=-1 +kerning first=74 second=290 amount=-1 +kerning first=74 second=291 amount=-1 +kerning first=74 second=303 amount=-1 +kerning first=74 second=305 amount=-1 +kerning first=204 second=225 amount=-1 +kerning first=204 second=224 amount=-1 +kerning first=204 second=216 amount=-1 +kerning first=204 second=214 amount=-1 +kerning first=74 second=332 amount=-1 +kerning first=74 second=333 amount=-1 +kerning first=74 second=334 amount=-1 +kerning first=74 second=335 amount=-1 +kerning first=74 second=336 amount=-1 +kerning first=74 second=337 amount=-1 +kerning first=74 second=338 amount=-1 +kerning first=74 second=339 amount=-1 +kerning first=204 second=213 amount=-1 +kerning first=204 second=212 amount=-1 +kerning first=74 second=347 amount=-1 +kerning first=204 second=211 amount=-1 +kerning first=74 second=351 amount=-1 +kerning first=204 second=210 amount=-1 +kerning first=74 second=353 amount=-1 +kerning first=204 second=199 amount=-1 +kerning first=204 second=121 amount=-1 +kerning first=204 second=119 amount=-1 +kerning first=204 second=118 amount=-1 +kerning first=204 second=117 amount=-1 +kerning first=204 second=115 amount=-1 +kerning first=204 second=113 amount=-1 +kerning first=204 second=111 amount=-1 +kerning first=204 second=103 amount=-1 +kerning first=204 second=101 amount=-1 +kerning first=204 second=100 amount=-1 +kerning first=204 second=99 amount=-1 +kerning first=204 second=97 amount=-1 +kerning first=204 second=83 amount=-1 +kerning first=204 second=81 amount=-1 +kerning first=204 second=79 amount=-1 +kerning first=204 second=71 amount=-1 +kerning first=204 second=67 amount=-1 +kerning first=203 second=8249 amount=-1 +kerning first=74 second=8249 amount=-1 +kerning first=203 second=382 amount=-1 +kerning first=203 second=380 amount=-1 +kerning first=203 second=378 amount=-1 +kerning first=203 second=370 amount=-1 +kerning first=203 second=369 amount=-1 +kerning first=203 second=368 amount=-1 +kerning first=75 second=45 amount=-2 +kerning first=203 second=367 amount=-1 +kerning first=75 second=67 amount=-1 +kerning first=75 second=71 amount=-1 +kerning first=75 second=79 amount=-1 +kerning first=75 second=81 amount=-1 +kerning first=75 second=83 amount=-1 +kerning first=75 second=84 amount=-1 +kerning first=75 second=85 amount=-1 +kerning first=75 second=86 amount=-1 +kerning first=75 second=87 amount=-1 +kerning first=75 second=89 amount=-1 +kerning first=203 second=366 amount=-1 +kerning first=203 second=365 amount=-1 +kerning first=75 second=99 amount=-1 +kerning first=75 second=100 amount=-1 +kerning first=75 second=101 amount=-1 +kerning first=75 second=103 amount=-1 +kerning first=203 second=364 amount=-1 +kerning first=203 second=363 amount=-1 +kerning first=203 second=362 amount=-1 +kerning first=203 second=361 amount=-1 +kerning first=75 second=111 amount=-1 +kerning first=203 second=352 amount=-1 +kerning first=75 second=113 amount=-1 +kerning first=203 second=350 amount=-1 +kerning first=203 second=346 amount=-1 +kerning first=203 second=344 amount=-1 +kerning first=75 second=117 amount=-1 +kerning first=75 second=118 amount=-1 +kerning first=75 second=119 amount=-1 +kerning first=75 second=121 amount=-1 +kerning first=75 second=171 amount=-2 +kerning first=75 second=199 amount=-1 +kerning first=75 second=210 amount=-1 +kerning first=75 second=211 amount=-1 +kerning first=75 second=212 amount=-1 +kerning first=75 second=213 amount=-1 +kerning first=75 second=214 amount=-1 +kerning first=75 second=216 amount=-1 +kerning first=75 second=217 amount=-1 +kerning first=75 second=218 amount=-1 +kerning first=75 second=219 amount=-1 +kerning first=75 second=220 amount=-1 +kerning first=75 second=221 amount=-1 +kerning first=203 second=330 amount=-1 +kerning first=203 second=327 amount=-1 +kerning first=203 second=325 amount=-1 +kerning first=203 second=323 amount=-1 +kerning first=203 second=317 amount=-1 +kerning first=203 second=315 amount=-1 +kerning first=203 second=313 amount=-1 +kerning first=75 second=231 amount=-1 +kerning first=75 second=232 amount=-1 +kerning first=75 second=233 amount=-1 +kerning first=75 second=234 amount=-1 +kerning first=75 second=235 amount=-1 +kerning first=75 second=240 amount=-1 +kerning first=75 second=242 amount=-1 +kerning first=75 second=243 amount=-1 +kerning first=75 second=244 amount=-1 +kerning first=75 second=245 amount=-1 +kerning first=75 second=246 amount=-1 +kerning first=75 second=248 amount=-1 +kerning first=75 second=249 amount=-1 +kerning first=75 second=250 amount=-1 +kerning first=75 second=251 amount=-1 +kerning first=75 second=252 amount=-1 +kerning first=75 second=253 amount=-1 +kerning first=203 second=310 amount=-1 +kerning first=75 second=255 amount=-1 +kerning first=203 second=304 amount=-1 +kerning first=203 second=302 amount=-1 +kerning first=203 second=298 amount=-1 +kerning first=75 second=262 amount=-1 +kerning first=75 second=263 amount=-1 +kerning first=75 second=264 amount=-1 +kerning first=75 second=266 amount=-1 +kerning first=75 second=267 amount=-1 +kerning first=75 second=268 amount=-1 +kerning first=75 second=269 amount=-1 +kerning first=75 second=275 amount=-1 +kerning first=75 second=277 amount=-1 +kerning first=75 second=279 amount=-1 +kerning first=75 second=281 amount=-1 +kerning first=75 second=283 amount=-1 +kerning first=75 second=284 amount=-1 +kerning first=75 second=286 amount=-1 +kerning first=75 second=287 amount=-1 +kerning first=75 second=288 amount=-1 +kerning first=75 second=289 amount=-1 +kerning first=75 second=290 amount=-1 +kerning first=75 second=291 amount=-1 +kerning first=203 second=296 amount=-1 +kerning first=203 second=291 amount=-1 +kerning first=203 second=289 amount=-1 +kerning first=203 second=287 amount=-1 +kerning first=75 second=332 amount=-1 +kerning first=75 second=333 amount=-1 +kerning first=75 second=334 amount=-1 +kerning first=75 second=335 amount=-1 +kerning first=75 second=336 amount=-1 +kerning first=75 second=337 amount=-1 +kerning first=75 second=338 amount=-1 +kerning first=75 second=339 amount=-1 +kerning first=203 second=282 amount=-1 +kerning first=75 second=346 amount=-1 +kerning first=203 second=280 amount=-1 +kerning first=75 second=350 amount=-1 +kerning first=203 second=278 amount=-1 +kerning first=75 second=352 amount=-1 +kerning first=203 second=274 amount=-1 +kerning first=75 second=354 amount=-1 +kerning first=203 second=270 amount=-1 +kerning first=75 second=356 amount=-1 +kerning first=75 second=361 amount=-1 +kerning first=75 second=362 amount=-1 +kerning first=75 second=363 amount=-1 +kerning first=75 second=364 amount=-1 +kerning first=75 second=365 amount=-1 +kerning first=75 second=366 amount=-1 +kerning first=75 second=367 amount=-1 +kerning first=75 second=368 amount=-1 +kerning first=75 second=369 amount=-1 +kerning first=75 second=370 amount=-1 +kerning first=75 second=374 amount=-1 +kerning first=75 second=375 amount=-1 +kerning first=203 second=260 amount=-1 +kerning first=203 second=256 amount=-1 +kerning first=203 second=252 amount=-1 +kerning first=203 second=251 amount=-1 +kerning first=203 second=250 amount=-1 +kerning first=203 second=249 amount=-1 +kerning first=203 second=220 amount=-1 +kerning first=203 second=219 amount=-1 +kerning first=203 second=218 amount=-1 +kerning first=203 second=217 amount=-1 +kerning first=203 second=209 amount=-1 +kerning first=203 second=207 amount=-1 +kerning first=203 second=206 amount=-1 +kerning first=203 second=205 amount=-1 +kerning first=75 second=8217 amount=-1 +kerning first=75 second=8220 amount=-1 +kerning first=75 second=8221 amount=-1 +kerning first=75 second=8249 amount=-2 +kerning first=203 second=204 amount=-1 +kerning first=76 second=65 amount=-1 +kerning first=76 second=66 amount=-1 +kerning first=203 second=203 amount=-1 +kerning first=76 second=68 amount=-1 +kerning first=76 second=69 amount=-1 +kerning first=76 second=70 amount=-1 +kerning first=203 second=202 amount=-1 +kerning first=76 second=72 amount=-1 +kerning first=76 second=73 amount=-1 +kerning first=203 second=201 amount=-1 +kerning first=76 second=75 amount=-1 +kerning first=76 second=76 amount=-1 +kerning first=76 second=77 amount=-1 +kerning first=76 second=78 amount=-1 +kerning first=203 second=200 amount=-1 +kerning first=76 second=80 amount=-1 +kerning first=203 second=198 amount=-1 +kerning first=76 second=82 amount=-1 +kerning first=203 second=197 amount=-1 +kerning first=76 second=84 amount=-1 +kerning first=76 second=85 amount=-1 +kerning first=76 second=86 amount=-1 +kerning first=76 second=87 amount=-1 +kerning first=76 second=89 amount=-1 +kerning first=76 second=90 amount=-1 +kerning first=76 second=98 amount=-1 +kerning first=76 second=103 amount=-1 +kerning first=76 second=104 amount=-1 +kerning first=76 second=105 amount=-1 +kerning first=76 second=106 amount=-1 +kerning first=76 second=107 amount=-1 +kerning first=76 second=108 amount=-1 +kerning first=203 second=196 amount=-1 +kerning first=203 second=194 amount=-1 +kerning first=76 second=112 amount=-1 +kerning first=203 second=193 amount=-1 +kerning first=76 second=117 amount=-1 +kerning first=76 second=118 amount=-1 +kerning first=76 second=119 amount=-1 +kerning first=203 second=192 amount=-1 +kerning first=76 second=121 amount=-1 +kerning first=76 second=122 amount=-1 +kerning first=203 second=171 amount=-1 +kerning first=76 second=192 amount=-1 +kerning first=76 second=193 amount=-1 +kerning first=76 second=194 amount=-1 +kerning first=76 second=196 amount=-1 +kerning first=76 second=197 amount=-1 +kerning first=76 second=198 amount=-1 +kerning first=203 second=122 amount=-1 +kerning first=76 second=200 amount=-1 +kerning first=76 second=201 amount=-1 +kerning first=76 second=202 amount=-1 +kerning first=76 second=203 amount=-1 +kerning first=76 second=204 amount=-1 +kerning first=76 second=205 amount=-1 +kerning first=76 second=206 amount=-1 +kerning first=76 second=207 amount=-1 +kerning first=76 second=209 amount=-1 +kerning first=203 second=117 amount=-1 +kerning first=203 second=112 amount=-1 +kerning first=203 second=103 amount=-1 +kerning first=203 second=102 amount=-1 +kerning first=203 second=85 amount=-1 +kerning first=203 second=83 amount=-1 +kerning first=76 second=217 amount=-1 +kerning first=76 second=218 amount=-1 +kerning first=76 second=219 amount=-1 +kerning first=76 second=220 amount=-1 +kerning first=76 second=221 amount=-1 +kerning first=203 second=82 amount=-1 +kerning first=76 second=237 amount=-1 +kerning first=203 second=80 amount=-1 +kerning first=76 second=249 amount=-1 +kerning first=76 second=250 amount=-1 +kerning first=76 second=251 amount=-1 +kerning first=76 second=252 amount=-1 +kerning first=76 second=253 amount=-1 +kerning first=76 second=254 amount=-1 +kerning first=76 second=255 amount=-1 +kerning first=76 second=256 amount=-1 +kerning first=76 second=260 amount=-1 +kerning first=203 second=78 amount=-1 +kerning first=203 second=77 amount=-1 +kerning first=203 second=76 amount=-1 +kerning first=203 second=75 amount=-1 +kerning first=76 second=270 amount=-1 +kerning first=76 second=274 amount=-1 +kerning first=76 second=278 amount=-1 +kerning first=76 second=280 amount=-1 +kerning first=76 second=282 amount=-1 +kerning first=203 second=73 amount=-1 +kerning first=203 second=72 amount=-1 +kerning first=76 second=287 amount=-1 +kerning first=203 second=70 amount=-1 +kerning first=76 second=289 amount=-1 +kerning first=203 second=69 amount=-1 +kerning first=76 second=291 amount=-1 +kerning first=76 second=296 amount=-1 +kerning first=76 second=298 amount=-1 +kerning first=76 second=302 amount=-1 +kerning first=76 second=303 amount=-1 +kerning first=76 second=304 amount=-1 +kerning first=76 second=305 amount=-1 +kerning first=76 second=310 amount=-1 +kerning first=76 second=311 amount=-1 +kerning first=76 second=313 amount=-1 +kerning first=76 second=314 amount=-1 +kerning first=76 second=315 amount=-1 +kerning first=76 second=316 amount=-1 +kerning first=76 second=317 amount=-1 +kerning first=76 second=318 amount=-1 +kerning first=76 second=323 amount=-1 +kerning first=203 second=68 amount=-1 +kerning first=76 second=325 amount=-1 +kerning first=203 second=66 amount=-1 +kerning first=76 second=327 amount=-1 +kerning first=203 second=65 amount=-1 +kerning first=76 second=330 amount=-1 +kerning first=203 second=45 amount=-1 +kerning first=202 second=8249 amount=-1 +kerning first=202 second=382 amount=-1 +kerning first=202 second=380 amount=-1 +kerning first=202 second=378 amount=-1 +kerning first=76 second=344 amount=-1 +kerning first=202 second=370 amount=-1 +kerning first=202 second=369 amount=-1 +kerning first=202 second=368 amount=-1 +kerning first=202 second=367 amount=-1 +kerning first=202 second=366 amount=-1 +kerning first=202 second=365 amount=-1 +kerning first=76 second=354 amount=-1 +kerning first=76 second=356 amount=-1 +kerning first=76 second=361 amount=-1 +kerning first=76 second=362 amount=-1 +kerning first=76 second=363 amount=-1 +kerning first=76 second=364 amount=-1 +kerning first=76 second=365 amount=-1 +kerning first=76 second=366 amount=-1 +kerning first=76 second=367 amount=-1 +kerning first=76 second=368 amount=-1 +kerning first=76 second=369 amount=-1 +kerning first=76 second=370 amount=-1 +kerning first=76 second=374 amount=-1 +kerning first=76 second=375 amount=-1 +kerning first=76 second=377 amount=-1 +kerning first=76 second=378 amount=-1 +kerning first=76 second=379 amount=-1 +kerning first=76 second=380 amount=-1 +kerning first=76 second=381 amount=-1 +kerning first=76 second=382 amount=-1 +kerning first=202 second=364 amount=-1 +kerning first=202 second=363 amount=-1 +kerning first=202 second=362 amount=-1 +kerning first=202 second=361 amount=-1 +kerning first=202 second=352 amount=-1 +kerning first=202 second=350 amount=-1 +kerning first=202 second=346 amount=-1 +kerning first=202 second=344 amount=-1 +kerning first=202 second=330 amount=-1 +kerning first=202 second=327 amount=-1 +kerning first=202 second=325 amount=-1 +kerning first=202 second=323 amount=-1 +kerning first=202 second=317 amount=-1 +kerning first=202 second=315 amount=-1 +kerning first=202 second=313 amount=-1 +kerning first=202 second=310 amount=-1 +kerning first=202 second=304 amount=-1 +kerning first=202 second=302 amount=-1 +kerning first=202 second=298 amount=-1 +kerning first=202 second=296 amount=-1 +kerning first=202 second=291 amount=-1 +kerning first=202 second=289 amount=-1 +kerning first=76 second=8217 amount=-1 +kerning first=76 second=8220 amount=-1 +kerning first=76 second=8221 amount=-1 +kerning first=202 second=287 amount=-1 +kerning first=202 second=282 amount=-1 +kerning first=77 second=45 amount=-1 +kerning first=202 second=280 amount=-1 +kerning first=77 second=67 amount=-1 +kerning first=77 second=71 amount=-1 +kerning first=202 second=278 amount=-1 +kerning first=77 second=79 amount=-1 +kerning first=77 second=81 amount=-1 +kerning first=77 second=83 amount=-1 +kerning first=77 second=97 amount=-1 +kerning first=77 second=99 amount=-1 +kerning first=77 second=100 amount=-1 +kerning first=77 second=101 amount=-1 +kerning first=77 second=103 amount=-1 +kerning first=202 second=274 amount=-1 +kerning first=77 second=111 amount=-1 +kerning first=202 second=270 amount=-1 +kerning first=77 second=113 amount=-1 +kerning first=77 second=115 amount=-1 +kerning first=77 second=117 amount=-1 +kerning first=77 second=118 amount=-1 +kerning first=77 second=119 amount=-1 +kerning first=77 second=121 amount=-1 +kerning first=202 second=260 amount=-1 +kerning first=77 second=171 amount=-1 +kerning first=77 second=199 amount=-1 +kerning first=77 second=210 amount=-1 +kerning first=77 second=211 amount=-1 +kerning first=77 second=212 amount=-1 +kerning first=77 second=213 amount=-1 +kerning first=77 second=214 amount=-1 +kerning first=77 second=216 amount=-1 +kerning first=77 second=224 amount=-1 +kerning first=77 second=225 amount=-1 +kerning first=77 second=226 amount=-1 +kerning first=77 second=227 amount=-1 +kerning first=77 second=228 amount=-1 +kerning first=77 second=229 amount=-1 +kerning first=77 second=230 amount=-1 +kerning first=77 second=231 amount=-1 +kerning first=77 second=232 amount=-1 +kerning first=77 second=233 amount=-1 +kerning first=77 second=234 amount=-1 +kerning first=77 second=235 amount=-1 +kerning first=202 second=256 amount=-1 +kerning first=77 second=240 amount=-1 +kerning first=77 second=242 amount=-1 +kerning first=77 second=243 amount=-1 +kerning first=77 second=244 amount=-1 +kerning first=77 second=245 amount=-1 +kerning first=77 second=246 amount=-1 +kerning first=77 second=248 amount=-1 +kerning first=202 second=252 amount=-1 +kerning first=77 second=250 amount=-1 +kerning first=77 second=251 amount=-1 +kerning first=202 second=251 amount=-1 +kerning first=77 second=253 amount=-1 +kerning first=77 second=255 amount=-1 +kerning first=77 second=257 amount=-1 +kerning first=77 second=259 amount=-1 +kerning first=77 second=261 amount=-1 +kerning first=77 second=262 amount=-1 +kerning first=77 second=263 amount=-1 +kerning first=77 second=264 amount=-1 +kerning first=77 second=266 amount=-1 +kerning first=77 second=267 amount=-1 +kerning first=77 second=268 amount=-1 +kerning first=77 second=269 amount=-1 +kerning first=77 second=275 amount=-1 +kerning first=77 second=277 amount=-1 +kerning first=77 second=279 amount=-1 +kerning first=77 second=281 amount=-1 +kerning first=77 second=283 amount=-1 +kerning first=77 second=284 amount=-1 +kerning first=77 second=286 amount=-1 +kerning first=77 second=287 amount=-1 +kerning first=77 second=288 amount=-1 +kerning first=77 second=289 amount=-1 +kerning first=77 second=290 amount=-1 +kerning first=77 second=291 amount=-1 +kerning first=202 second=250 amount=-1 +kerning first=202 second=249 amount=-1 +kerning first=77 second=332 amount=-1 +kerning first=77 second=333 amount=-1 +kerning first=77 second=334 amount=-1 +kerning first=77 second=335 amount=-1 +kerning first=77 second=336 amount=-1 +kerning first=77 second=337 amount=-1 +kerning first=77 second=338 amount=-1 +kerning first=77 second=339 amount=-1 +kerning first=77 second=346 amount=-1 +kerning first=77 second=347 amount=-1 +kerning first=77 second=350 amount=-1 +kerning first=77 second=351 amount=-1 +kerning first=77 second=352 amount=-1 +kerning first=77 second=353 amount=-1 +kerning first=77 second=361 amount=-1 +kerning first=77 second=363 amount=-1 +kerning first=77 second=365 amount=-1 +kerning first=77 second=367 amount=-1 +kerning first=77 second=369 amount=-1 +kerning first=77 second=375 amount=-1 +kerning first=202 second=220 amount=-1 +kerning first=202 second=219 amount=-1 +kerning first=202 second=218 amount=-1 +kerning first=202 second=217 amount=-1 +kerning first=202 second=209 amount=-1 +kerning first=202 second=207 amount=-1 +kerning first=202 second=206 amount=-1 +kerning first=202 second=205 amount=-1 +kerning first=202 second=204 amount=-1 +kerning first=202 second=203 amount=-1 +kerning first=202 second=202 amount=-1 +kerning first=202 second=201 amount=-1 +kerning first=77 second=8249 amount=-1 +kerning first=202 second=200 amount=-1 +kerning first=78 second=45 amount=-1 +kerning first=202 second=198 amount=-1 +kerning first=78 second=67 amount=-1 +kerning first=78 second=71 amount=-1 +kerning first=202 second=197 amount=-1 +kerning first=78 second=79 amount=-1 +kerning first=78 second=81 amount=-1 +kerning first=78 second=83 amount=-1 +kerning first=78 second=97 amount=-1 +kerning first=78 second=99 amount=-1 +kerning first=78 second=100 amount=-1 +kerning first=78 second=101 amount=-1 +kerning first=78 second=103 amount=-1 +kerning first=202 second=196 amount=-1 +kerning first=78 second=111 amount=-1 +kerning first=202 second=194 amount=-1 +kerning first=78 second=113 amount=-1 +kerning first=78 second=115 amount=-1 +kerning first=78 second=117 amount=-1 +kerning first=78 second=118 amount=-1 +kerning first=78 second=119 amount=-1 +kerning first=78 second=121 amount=-1 +kerning first=202 second=193 amount=-1 +kerning first=78 second=171 amount=-1 +kerning first=78 second=199 amount=-1 +kerning first=78 second=210 amount=-1 +kerning first=78 second=211 amount=-1 +kerning first=78 second=212 amount=-1 +kerning first=78 second=213 amount=-1 +kerning first=78 second=214 amount=-1 +kerning first=78 second=216 amount=-1 +kerning first=78 second=224 amount=-1 +kerning first=78 second=225 amount=-1 +kerning first=78 second=226 amount=-1 +kerning first=78 second=227 amount=-1 +kerning first=78 second=228 amount=-1 +kerning first=78 second=229 amount=-1 +kerning first=78 second=230 amount=-1 +kerning first=78 second=231 amount=-1 +kerning first=78 second=232 amount=-1 +kerning first=78 second=233 amount=-1 +kerning first=78 second=234 amount=-1 +kerning first=78 second=235 amount=-1 +kerning first=202 second=192 amount=-1 +kerning first=78 second=240 amount=-1 +kerning first=78 second=242 amount=-1 +kerning first=78 second=243 amount=-1 +kerning first=78 second=244 amount=-1 +kerning first=78 second=245 amount=-1 +kerning first=78 second=246 amount=-1 +kerning first=78 second=248 amount=-1 +kerning first=202 second=171 amount=-1 +kerning first=78 second=250 amount=-1 +kerning first=78 second=251 amount=-1 +kerning first=202 second=122 amount=-1 +kerning first=78 second=253 amount=-1 +kerning first=78 second=255 amount=-1 +kerning first=78 second=257 amount=-1 +kerning first=78 second=259 amount=-1 +kerning first=78 second=261 amount=-1 +kerning first=78 second=262 amount=-1 +kerning first=78 second=263 amount=-1 +kerning first=78 second=264 amount=-1 +kerning first=78 second=266 amount=-1 +kerning first=78 second=267 amount=-1 +kerning first=78 second=268 amount=-1 +kerning first=78 second=269 amount=-1 +kerning first=78 second=275 amount=-1 +kerning first=78 second=277 amount=-1 +kerning first=78 second=279 amount=-1 +kerning first=78 second=281 amount=-1 +kerning first=78 second=283 amount=-1 +kerning first=78 second=284 amount=-1 +kerning first=78 second=286 amount=-1 +kerning first=78 second=287 amount=-1 +kerning first=78 second=288 amount=-1 +kerning first=78 second=289 amount=-1 +kerning first=78 second=290 amount=-1 +kerning first=78 second=291 amount=-1 +kerning first=202 second=117 amount=-1 +kerning first=202 second=112 amount=-1 +kerning first=78 second=332 amount=-1 +kerning first=78 second=333 amount=-1 +kerning first=78 second=334 amount=-1 +kerning first=78 second=335 amount=-1 +kerning first=78 second=336 amount=-1 +kerning first=78 second=337 amount=-1 +kerning first=78 second=338 amount=-1 +kerning first=78 second=339 amount=-1 +kerning first=78 second=346 amount=-1 +kerning first=78 second=347 amount=-1 +kerning first=78 second=350 amount=-1 +kerning first=78 second=351 amount=-1 +kerning first=78 second=352 amount=-1 +kerning first=78 second=353 amount=-1 +kerning first=78 second=361 amount=-1 +kerning first=78 second=363 amount=-1 +kerning first=78 second=365 amount=-1 +kerning first=78 second=367 amount=-1 +kerning first=78 second=369 amount=-1 +kerning first=78 second=375 amount=-1 +kerning first=202 second=103 amount=-1 +kerning first=202 second=102 amount=-1 +kerning first=202 second=85 amount=-1 +kerning first=202 second=83 amount=-1 +kerning first=202 second=82 amount=-1 +kerning first=202 second=80 amount=-1 +kerning first=202 second=78 amount=-1 +kerning first=202 second=77 amount=-1 +kerning first=202 second=76 amount=-1 +kerning first=202 second=75 amount=-1 +kerning first=202 second=73 amount=-1 +kerning first=202 second=72 amount=-1 +kerning first=78 second=8249 amount=-1 +kerning first=79 second=44 amount=-1 +kerning first=202 second=70 amount=-1 +kerning first=79 second=46 amount=-1 +kerning first=79 second=65 amount=-1 +kerning first=79 second=66 amount=-1 +kerning first=79 second=68 amount=-1 +kerning first=79 second=69 amount=-1 +kerning first=79 second=70 amount=-1 +kerning first=79 second=72 amount=-1 +kerning first=79 second=73 amount=-1 +kerning first=79 second=74 amount=-1 +kerning first=79 second=75 amount=-1 +kerning first=79 second=76 amount=-1 +kerning first=79 second=77 amount=-1 +kerning first=79 second=78 amount=-1 +kerning first=79 second=80 amount=-1 +kerning first=79 second=82 amount=-1 +kerning first=202 second=69 amount=-1 +kerning first=79 second=84 amount=-1 +kerning first=202 second=68 amount=-1 +kerning first=79 second=86 amount=-1 +kerning first=79 second=87 amount=-1 +kerning first=79 second=89 amount=-1 +kerning first=79 second=90 amount=-1 +kerning first=202 second=66 amount=-1 +kerning first=202 second=65 amount=-1 +kerning first=202 second=45 amount=-1 +kerning first=201 second=8249 amount=-1 +kerning first=201 second=382 amount=-1 +kerning first=201 second=380 amount=-1 +kerning first=79 second=122 amount=-1 +kerning first=201 second=378 amount=-1 +kerning first=79 second=192 amount=-1 +kerning first=79 second=193 amount=-1 +kerning first=79 second=194 amount=-1 +kerning first=79 second=196 amount=-1 +kerning first=79 second=197 amount=-1 +kerning first=79 second=198 amount=-1 +kerning first=79 second=200 amount=-1 +kerning first=79 second=201 amount=-1 +kerning first=79 second=202 amount=-1 +kerning first=79 second=203 amount=-1 +kerning first=79 second=204 amount=-1 +kerning first=79 second=205 amount=-1 +kerning first=79 second=206 amount=-1 +kerning first=79 second=207 amount=-1 +kerning first=79 second=209 amount=-1 +kerning first=201 second=370 amount=-1 +kerning first=201 second=369 amount=-1 +kerning first=201 second=368 amount=-1 +kerning first=201 second=367 amount=-1 +kerning first=79 second=221 amount=-1 +kerning first=201 second=366 amount=-1 +kerning first=201 second=365 amount=-1 +kerning first=201 second=364 amount=-1 +kerning first=201 second=363 amount=-1 +kerning first=201 second=362 amount=-1 +kerning first=201 second=361 amount=-1 +kerning first=201 second=352 amount=-1 +kerning first=201 second=350 amount=-1 +kerning first=79 second=256 amount=-1 +kerning first=201 second=346 amount=-1 +kerning first=201 second=344 amount=-1 +kerning first=79 second=260 amount=-1 +kerning first=201 second=330 amount=-1 +kerning first=79 second=270 amount=-1 +kerning first=79 second=274 amount=-1 +kerning first=79 second=278 amount=-1 +kerning first=79 second=280 amount=-1 +kerning first=79 second=282 amount=-1 +kerning first=201 second=327 amount=-1 +kerning first=201 second=325 amount=-1 +kerning first=201 second=323 amount=-1 +kerning first=79 second=296 amount=-1 +kerning first=79 second=298 amount=-1 +kerning first=79 second=302 amount=-1 +kerning first=201 second=317 amount=-1 +kerning first=79 second=304 amount=-1 +kerning first=201 second=315 amount=-1 +kerning first=79 second=310 amount=-1 +kerning first=79 second=313 amount=-1 +kerning first=79 second=315 amount=-1 +kerning first=79 second=317 amount=-1 +kerning first=79 second=323 amount=-1 +kerning first=79 second=325 amount=-1 +kerning first=79 second=327 amount=-1 +kerning first=79 second=330 amount=-1 +kerning first=79 second=344 amount=-1 +kerning first=201 second=313 amount=-1 +kerning first=201 second=310 amount=-1 +kerning first=201 second=304 amount=-1 +kerning first=79 second=354 amount=-1 +kerning first=79 second=356 amount=-1 +kerning first=201 second=302 amount=-1 +kerning first=201 second=298 amount=-1 +kerning first=201 second=296 amount=-1 +kerning first=201 second=291 amount=-1 +kerning first=201 second=289 amount=-1 +kerning first=79 second=374 amount=-1 +kerning first=79 second=377 amount=-1 +kerning first=79 second=378 amount=-1 +kerning first=79 second=379 amount=-1 +kerning first=79 second=380 amount=-1 +kerning first=79 second=381 amount=-1 +kerning first=79 second=382 amount=-1 +kerning first=201 second=287 amount=-1 +kerning first=201 second=282 amount=-1 +kerning first=201 second=280 amount=-1 +kerning first=201 second=278 amount=-1 +kerning first=201 second=274 amount=-1 +kerning first=201 second=270 amount=-1 +kerning first=201 second=260 amount=-1 +kerning first=201 second=256 amount=-1 +kerning first=201 second=252 amount=-1 +kerning first=201 second=251 amount=-1 +kerning first=201 second=250 amount=-1 +kerning first=201 second=249 amount=-1 +kerning first=201 second=220 amount=-1 +kerning first=201 second=219 amount=-1 +kerning first=201 second=218 amount=-1 +kerning first=201 second=217 amount=-1 +kerning first=79 second=8217 amount=-1 +kerning first=79 second=8220 amount=-1 +kerning first=79 second=8221 amount=-1 +kerning first=201 second=209 amount=-1 +kerning first=80 second=44 amount=-1 +kerning first=80 second=45 amount=-1 +kerning first=80 second=46 amount=-1 +kerning first=80 second=65 amount=-1 +kerning first=201 second=207 amount=-1 +kerning first=201 second=206 amount=-1 +kerning first=201 second=205 amount=-1 +kerning first=201 second=204 amount=-1 +kerning first=201 second=203 amount=-1 +kerning first=201 second=202 amount=-1 +kerning first=80 second=74 amount=-1 +kerning first=201 second=201 amount=-1 +kerning first=201 second=200 amount=-1 +kerning first=201 second=198 amount=-1 +kerning first=201 second=197 amount=-1 +kerning first=201 second=196 amount=-1 +kerning first=201 second=194 amount=-1 +kerning first=201 second=193 amount=-1 +kerning first=201 second=192 amount=-1 +kerning first=201 second=171 amount=-1 +kerning first=201 second=122 amount=-1 +kerning first=201 second=117 amount=-1 +kerning first=201 second=112 amount=-1 +kerning first=201 second=103 amount=-1 +kerning first=201 second=102 amount=-1 +kerning first=80 second=103 amount=-1 +kerning first=201 second=85 amount=-1 +kerning first=201 second=83 amount=-1 +kerning first=201 second=82 amount=-1 +kerning first=201 second=80 amount=-1 +kerning first=80 second=171 amount=-1 +kerning first=80 second=192 amount=-1 +kerning first=80 second=193 amount=-1 +kerning first=80 second=194 amount=-1 +kerning first=80 second=196 amount=-1 +kerning first=80 second=197 amount=-1 +kerning first=80 second=198 amount=-1 +kerning first=201 second=78 amount=-1 +kerning first=201 second=77 amount=-1 +kerning first=201 second=76 amount=-1 +kerning first=201 second=75 amount=-1 +kerning first=201 second=73 amount=-1 +kerning first=201 second=72 amount=-1 +kerning first=201 second=70 amount=-1 +kerning first=201 second=69 amount=-1 +kerning first=201 second=68 amount=-1 +kerning first=201 second=66 amount=-1 +kerning first=201 second=65 amount=-1 +kerning first=201 second=45 amount=-1 +kerning first=200 second=8249 amount=-1 +kerning first=200 second=382 amount=-1 +kerning first=200 second=380 amount=-1 +kerning first=200 second=378 amount=-1 +kerning first=200 second=370 amount=-1 +kerning first=200 second=369 amount=-1 +kerning first=200 second=368 amount=-1 +kerning first=200 second=367 amount=-1 +kerning first=200 second=366 amount=-1 +kerning first=200 second=365 amount=-1 +kerning first=200 second=364 amount=-1 +kerning first=200 second=363 amount=-1 +kerning first=200 second=362 amount=-1 +kerning first=200 second=361 amount=-1 +kerning first=200 second=352 amount=-1 +kerning first=200 second=350 amount=-1 +kerning first=200 second=346 amount=-1 +kerning first=80 second=256 amount=-1 +kerning first=200 second=344 amount=-1 +kerning first=200 second=330 amount=-1 +kerning first=80 second=260 amount=-1 +kerning first=200 second=327 amount=-1 +kerning first=200 second=325 amount=-1 +kerning first=200 second=323 amount=-1 +kerning first=200 second=317 amount=-1 +kerning first=200 second=315 amount=-1 +kerning first=200 second=313 amount=-1 +kerning first=200 second=310 amount=-1 +kerning first=200 second=304 amount=-1 +kerning first=200 second=302 amount=-1 +kerning first=200 second=298 amount=-1 +kerning first=200 second=296 amount=-1 +kerning first=200 second=291 amount=-1 +kerning first=200 second=289 amount=-1 +kerning first=200 second=287 amount=-1 +kerning first=80 second=287 amount=-1 +kerning first=80 second=289 amount=-1 +kerning first=80 second=291 amount=-1 +kerning first=200 second=282 amount=-1 +kerning first=200 second=280 amount=-1 +kerning first=200 second=278 amount=-1 +kerning first=200 second=274 amount=-1 +kerning first=200 second=270 amount=-1 +kerning first=200 second=260 amount=-1 +kerning first=200 second=256 amount=-1 +kerning first=200 second=252 amount=-1 +kerning first=200 second=251 amount=-1 +kerning first=200 second=250 amount=-1 +kerning first=200 second=249 amount=-1 +kerning first=200 second=220 amount=-1 +kerning first=200 second=219 amount=-1 +kerning first=200 second=218 amount=-1 +kerning first=200 second=217 amount=-1 +kerning first=200 second=209 amount=-1 +kerning first=200 second=207 amount=-1 +kerning first=200 second=206 amount=-1 +kerning first=200 second=205 amount=-1 +kerning first=200 second=204 amount=-1 +kerning first=200 second=203 amount=-1 +kerning first=200 second=202 amount=-1 +kerning first=200 second=201 amount=-1 +kerning first=200 second=200 amount=-1 +kerning first=200 second=198 amount=-1 +kerning first=200 second=197 amount=-1 +kerning first=200 second=196 amount=-1 +kerning first=200 second=194 amount=-1 +kerning first=200 second=193 amount=-1 +kerning first=200 second=192 amount=-1 +kerning first=200 second=171 amount=-1 +kerning first=200 second=122 amount=-1 +kerning first=200 second=117 amount=-1 +kerning first=200 second=112 amount=-1 +kerning first=200 second=103 amount=-1 +kerning first=200 second=102 amount=-1 +kerning first=200 second=85 amount=-1 +kerning first=200 second=83 amount=-1 +kerning first=80 second=8249 amount=-1 +kerning first=81 second=44 amount=-1 +kerning first=200 second=82 amount=-1 +kerning first=81 second=46 amount=-1 +kerning first=81 second=65 amount=-1 +kerning first=81 second=66 amount=-1 +kerning first=81 second=68 amount=-1 +kerning first=81 second=69 amount=-1 +kerning first=81 second=70 amount=-1 +kerning first=81 second=72 amount=-1 +kerning first=81 second=73 amount=-1 +kerning first=81 second=74 amount=-1 +kerning first=81 second=75 amount=-1 +kerning first=81 second=76 amount=-1 +kerning first=81 second=77 amount=-1 +kerning first=81 second=78 amount=-1 +kerning first=81 second=80 amount=-1 +kerning first=81 second=82 amount=-1 +kerning first=200 second=80 amount=-1 +kerning first=81 second=84 amount=-1 +kerning first=200 second=78 amount=-1 +kerning first=81 second=86 amount=-1 +kerning first=81 second=87 amount=-1 +kerning first=81 second=89 amount=-1 +kerning first=81 second=90 amount=-1 +kerning first=200 second=77 amount=-1 +kerning first=200 second=76 amount=-1 +kerning first=200 second=75 amount=-1 +kerning first=200 second=73 amount=-1 +kerning first=200 second=72 amount=-1 +kerning first=200 second=70 amount=-1 +kerning first=81 second=122 amount=-1 +kerning first=200 second=69 amount=-1 +kerning first=81 second=192 amount=-1 +kerning first=81 second=193 amount=-1 +kerning first=81 second=194 amount=-1 +kerning first=81 second=196 amount=-1 +kerning first=81 second=197 amount=-1 +kerning first=81 second=198 amount=-1 +kerning first=81 second=200 amount=-1 +kerning first=81 second=201 amount=-1 +kerning first=81 second=202 amount=-1 +kerning first=81 second=203 amount=-1 +kerning first=81 second=204 amount=-1 +kerning first=81 second=205 amount=-1 +kerning first=81 second=206 amount=-1 +kerning first=81 second=207 amount=-1 +kerning first=81 second=209 amount=-1 +kerning first=200 second=68 amount=-1 +kerning first=200 second=66 amount=-1 +kerning first=200 second=65 amount=-1 +kerning first=200 second=45 amount=-1 +kerning first=81 second=221 amount=-1 +kerning first=199 second=8249 amount=-1 +kerning first=199 second=382 amount=-1 +kerning first=199 second=381 amount=-1 +kerning first=199 second=380 amount=-1 +kerning first=199 second=379 amount=-1 +kerning first=199 second=378 amount=-1 +kerning first=199 second=377 amount=-1 +kerning first=199 second=370 amount=-1 +kerning first=81 second=256 amount=-1 +kerning first=199 second=369 amount=-1 +kerning first=199 second=368 amount=-1 +kerning first=81 second=260 amount=-1 +kerning first=199 second=367 amount=-1 +kerning first=81 second=270 amount=-1 +kerning first=81 second=274 amount=-1 +kerning first=81 second=278 amount=-1 +kerning first=81 second=280 amount=-1 +kerning first=81 second=282 amount=-1 +kerning first=199 second=366 amount=-1 +kerning first=199 second=365 amount=-1 +kerning first=199 second=364 amount=-1 +kerning first=81 second=296 amount=-1 +kerning first=81 second=298 amount=-1 +kerning first=81 second=302 amount=-1 +kerning first=199 second=363 amount=-1 +kerning first=81 second=304 amount=-1 +kerning first=199 second=362 amount=-1 +kerning first=81 second=310 amount=-1 +kerning first=81 second=313 amount=-1 +kerning first=81 second=315 amount=-1 +kerning first=81 second=317 amount=-1 +kerning first=81 second=323 amount=-1 +kerning first=81 second=325 amount=-1 +kerning first=81 second=327 amount=-1 +kerning first=81 second=330 amount=-1 +kerning first=81 second=344 amount=-1 +kerning first=199 second=361 amount=-1 +kerning first=199 second=352 amount=-1 +kerning first=199 second=350 amount=-1 +kerning first=81 second=354 amount=-1 +kerning first=81 second=356 amount=-1 +kerning first=199 second=346 amount=-1 +kerning first=199 second=344 amount=-1 +kerning first=199 second=339 amount=-1 +kerning first=199 second=338 amount=-1 +kerning first=199 second=337 amount=-1 +kerning first=81 second=374 amount=-1 +kerning first=81 second=377 amount=-1 +kerning first=81 second=378 amount=-1 +kerning first=81 second=379 amount=-1 +kerning first=81 second=380 amount=-1 +kerning first=81 second=381 amount=-1 +kerning first=81 second=382 amount=-1 +kerning first=199 second=336 amount=-1 +kerning first=199 second=335 amount=-1 +kerning first=199 second=334 amount=-1 +kerning first=199 second=333 amount=-1 +kerning first=199 second=332 amount=-1 +kerning first=199 second=330 amount=-1 +kerning first=199 second=327 amount=-1 +kerning first=199 second=325 amount=-1 +kerning first=199 second=323 amount=-1 +kerning first=199 second=317 amount=-1 +kerning first=199 second=315 amount=-1 +kerning first=199 second=313 amount=-1 +kerning first=199 second=310 amount=-1 +kerning first=199 second=304 amount=-1 +kerning first=199 second=302 amount=-1 +kerning first=199 second=298 amount=-1 +kerning first=81 second=8217 amount=-1 +kerning first=81 second=8220 amount=-1 +kerning first=81 second=8221 amount=-1 +kerning first=199 second=296 amount=-1 +kerning first=82 second=44 amount=-1 +kerning first=82 second=45 amount=-2 +kerning first=82 second=46 amount=-1 +kerning first=82 second=67 amount=-1 +kerning first=82 second=71 amount=-1 +kerning first=82 second=79 amount=-1 +kerning first=82 second=81 amount=-1 +kerning first=82 second=83 amount=-1 +kerning first=82 second=84 amount=-1 +kerning first=82 second=85 amount=-1 +kerning first=82 second=86 amount=-1 +kerning first=82 second=87 amount=-1 +kerning first=82 second=89 amount=-1 +kerning first=82 second=97 amount=-1 +kerning first=82 second=98 amount=-1 +kerning first=82 second=99 amount=-1 +kerning first=82 second=100 amount=-1 +kerning first=82 second=101 amount=-1 +kerning first=82 second=103 amount=-1 +kerning first=82 second=104 amount=-1 +kerning first=199 second=291 amount=-1 +kerning first=199 second=290 amount=-1 +kerning first=82 second=107 amount=-1 +kerning first=82 second=108 amount=-1 +kerning first=82 second=111 amount=-1 +kerning first=199 second=289 amount=-1 +kerning first=82 second=113 amount=-1 +kerning first=82 second=115 amount=-1 +kerning first=82 second=116 amount=-1 +kerning first=82 second=117 amount=-1 +kerning first=82 second=118 amount=-1 +kerning first=82 second=119 amount=-1 +kerning first=82 second=121 amount=-1 +kerning first=82 second=171 amount=-2 +kerning first=82 second=199 amount=-1 +kerning first=82 second=210 amount=-1 +kerning first=82 second=211 amount=-1 +kerning first=82 second=212 amount=-1 +kerning first=82 second=213 amount=-1 +kerning first=82 second=214 amount=-1 +kerning first=82 second=216 amount=-1 +kerning first=82 second=217 amount=-1 +kerning first=82 second=218 amount=-1 +kerning first=82 second=219 amount=-1 +kerning first=82 second=220 amount=-1 +kerning first=82 second=221 amount=-1 +kerning first=82 second=224 amount=-1 +kerning first=82 second=225 amount=-1 +kerning first=82 second=226 amount=-1 +kerning first=82 second=227 amount=-1 +kerning first=82 second=228 amount=-1 +kerning first=82 second=229 amount=-1 +kerning first=82 second=230 amount=-1 +kerning first=82 second=231 amount=-1 +kerning first=82 second=232 amount=-1 +kerning first=82 second=233 amount=-1 +kerning first=82 second=234 amount=-1 +kerning first=82 second=235 amount=-1 +kerning first=199 second=288 amount=-1 +kerning first=82 second=240 amount=-1 +kerning first=82 second=242 amount=-1 +kerning first=82 second=243 amount=-1 +kerning first=82 second=244 amount=-1 +kerning first=82 second=245 amount=-1 +kerning first=82 second=246 amount=-1 +kerning first=82 second=248 amount=-1 +kerning first=82 second=249 amount=-1 +kerning first=82 second=250 amount=-1 +kerning first=82 second=251 amount=-1 +kerning first=82 second=252 amount=-1 +kerning first=82 second=253 amount=-1 +kerning first=82 second=254 amount=-1 +kerning first=82 second=255 amount=-1 +kerning first=82 second=257 amount=-1 +kerning first=82 second=259 amount=-1 +kerning first=82 second=261 amount=-1 +kerning first=82 second=262 amount=-1 +kerning first=82 second=263 amount=-1 +kerning first=82 second=264 amount=-1 +kerning first=82 second=266 amount=-1 +kerning first=82 second=267 amount=-1 +kerning first=82 second=268 amount=-1 +kerning first=82 second=269 amount=-1 +kerning first=82 second=275 amount=-1 +kerning first=82 second=277 amount=-1 +kerning first=82 second=279 amount=-1 +kerning first=82 second=281 amount=-1 +kerning first=82 second=283 amount=-1 +kerning first=82 second=284 amount=-1 +kerning first=82 second=286 amount=-1 +kerning first=82 second=287 amount=-1 +kerning first=82 second=288 amount=-1 +kerning first=82 second=289 amount=-1 +kerning first=82 second=290 amount=-1 +kerning first=82 second=291 amount=-1 +kerning first=199 second=287 amount=-1 +kerning first=199 second=286 amount=-1 +kerning first=82 second=311 amount=-1 +kerning first=82 second=314 amount=-1 +kerning first=82 second=316 amount=-1 +kerning first=82 second=318 amount=-1 +kerning first=82 second=332 amount=-1 +kerning first=82 second=333 amount=-1 +kerning first=82 second=334 amount=-1 +kerning first=82 second=335 amount=-1 +kerning first=82 second=336 amount=-1 +kerning first=82 second=337 amount=-1 +kerning first=82 second=338 amount=-1 +kerning first=82 second=339 amount=-1 +kerning first=82 second=346 amount=-1 +kerning first=82 second=347 amount=-1 +kerning first=82 second=350 amount=-1 +kerning first=82 second=351 amount=-1 +kerning first=82 second=352 amount=-1 +kerning first=82 second=353 amount=-1 +kerning first=82 second=354 amount=-1 +kerning first=82 second=355 amount=-1 +kerning first=82 second=356 amount=-1 +kerning first=82 second=361 amount=-1 +kerning first=82 second=362 amount=-1 +kerning first=82 second=363 amount=-1 +kerning first=82 second=364 amount=-1 +kerning first=82 second=365 amount=-1 +kerning first=82 second=366 amount=-1 +kerning first=82 second=367 amount=-1 +kerning first=82 second=368 amount=-1 +kerning first=82 second=369 amount=-1 +kerning first=82 second=370 amount=-1 +kerning first=82 second=374 amount=-1 +kerning first=82 second=375 amount=-1 +kerning first=199 second=284 amount=-1 +kerning first=199 second=283 amount=-1 +kerning first=199 second=282 amount=-1 +kerning first=199 second=281 amount=-1 +kerning first=199 second=280 amount=-1 +kerning first=199 second=279 amount=-1 +kerning first=199 second=278 amount=-1 +kerning first=199 second=277 amount=-1 +kerning first=199 second=275 amount=-1 +kerning first=199 second=274 amount=-1 +kerning first=199 second=270 amount=-1 +kerning first=199 second=269 amount=-1 +kerning first=199 second=268 amount=-1 +kerning first=199 second=267 amount=-1 +kerning first=82 second=8217 amount=-2 +kerning first=82 second=8220 amount=-2 +kerning first=82 second=8221 amount=-2 +kerning first=82 second=8249 amount=-2 +kerning first=83 second=44 amount=-1 +kerning first=83 second=45 amount=-1 +kerning first=83 second=46 amount=-1 +kerning first=83 second=65 amount=-1 +kerning first=83 second=66 amount=-1 +kerning first=83 second=68 amount=-1 +kerning first=83 second=69 amount=-1 +kerning first=83 second=70 amount=-1 +kerning first=83 second=72 amount=-1 +kerning first=83 second=73 amount=-1 +kerning first=83 second=74 amount=-1 +kerning first=83 second=75 amount=-1 +kerning first=83 second=76 amount=-1 +kerning first=83 second=77 amount=-1 +kerning first=83 second=78 amount=-1 +kerning first=83 second=80 amount=-1 +kerning first=83 second=82 amount=-1 +kerning first=199 second=266 amount=-1 +kerning first=83 second=84 amount=-1 +kerning first=83 second=85 amount=-1 +kerning first=83 second=86 amount=-1 +kerning first=83 second=87 amount=-1 +kerning first=83 second=89 amount=-1 +kerning first=199 second=264 amount=-1 +kerning first=199 second=263 amount=-1 +kerning first=83 second=98 amount=-1 +kerning first=199 second=262 amount=-1 +kerning first=199 second=260 amount=-1 +kerning first=199 second=256 amount=-1 +kerning first=83 second=102 amount=-1 +kerning first=83 second=103 amount=-1 +kerning first=83 second=104 amount=-1 +kerning first=83 second=105 amount=-1 +kerning first=199 second=252 amount=-1 +kerning first=83 second=107 amount=-1 +kerning first=83 second=108 amount=-1 +kerning first=199 second=251 amount=-1 +kerning first=199 second=250 amount=-1 +kerning first=199 second=249 amount=-1 +kerning first=83 second=112 amount=-1 +kerning first=199 second=248 amount=-1 +kerning first=83 second=114 amount=-1 +kerning first=199 second=246 amount=-1 +kerning first=199 second=245 amount=-1 +kerning first=199 second=244 amount=-1 +kerning first=83 second=118 amount=-1 +kerning first=83 second=119 amount=-1 +kerning first=83 second=120 amount=-1 +kerning first=83 second=121 amount=-1 +kerning first=83 second=122 amount=-1 +kerning first=83 second=171 amount=-1 +kerning first=199 second=243 amount=-1 +kerning first=83 second=192 amount=-1 +kerning first=83 second=193 amount=-1 +kerning first=83 second=194 amount=-1 +kerning first=83 second=196 amount=-1 +kerning first=83 second=197 amount=-1 +kerning first=83 second=198 amount=-1 +kerning first=83 second=200 amount=-1 +kerning first=83 second=201 amount=-1 +kerning first=83 second=202 amount=-1 +kerning first=83 second=203 amount=-1 +kerning first=83 second=204 amount=-1 +kerning first=83 second=205 amount=-1 +kerning first=83 second=206 amount=-1 +kerning first=83 second=207 amount=-1 +kerning first=83 second=209 amount=-1 +kerning first=83 second=217 amount=-1 +kerning first=83 second=218 amount=-1 +kerning first=83 second=219 amount=-1 +kerning first=83 second=220 amount=-1 +kerning first=83 second=221 amount=-1 +kerning first=199 second=242 amount=-1 +kerning first=199 second=240 amount=-1 +kerning first=199 second=235 amount=-1 +kerning first=199 second=234 amount=-1 +kerning first=199 second=233 amount=-1 +kerning first=199 second=232 amount=-1 +kerning first=199 second=231 amount=-1 +kerning first=199 second=220 amount=-1 +kerning first=199 second=219 amount=-1 +kerning first=199 second=218 amount=-1 +kerning first=199 second=217 amount=-1 +kerning first=199 second=216 amount=-1 +kerning first=199 second=214 amount=-1 +kerning first=83 second=237 amount=-1 +kerning first=199 second=213 amount=-1 +kerning first=199 second=212 amount=-1 +kerning first=199 second=211 amount=-1 +kerning first=199 second=210 amount=-1 +kerning first=199 second=209 amount=-1 +kerning first=199 second=207 amount=-1 +kerning first=199 second=206 amount=-1 +kerning first=199 second=205 amount=-1 +kerning first=199 second=204 amount=-1 +kerning first=199 second=203 amount=-1 +kerning first=199 second=202 amount=-1 +kerning first=199 second=201 amount=-1 +kerning first=83 second=253 amount=-1 +kerning first=83 second=254 amount=-1 +kerning first=83 second=255 amount=-1 +kerning first=83 second=256 amount=-1 +kerning first=199 second=200 amount=-1 +kerning first=199 second=199 amount=-1 +kerning first=83 second=260 amount=-1 +kerning first=199 second=198 amount=-1 +kerning first=199 second=197 amount=-1 +kerning first=199 second=196 amount=-1 +kerning first=199 second=194 amount=-1 +kerning first=83 second=270 amount=-1 +kerning first=83 second=274 amount=-1 +kerning first=199 second=193 amount=-1 +kerning first=199 second=192 amount=-1 +kerning first=83 second=278 amount=-1 +kerning first=199 second=171 amount=-1 +kerning first=83 second=280 amount=-1 +kerning first=199 second=122 amount=-1 +kerning first=83 second=282 amount=-1 +kerning first=199 second=117 amount=-1 +kerning first=83 second=287 amount=-1 +kerning first=83 second=289 amount=-1 +kerning first=83 second=291 amount=-1 +kerning first=83 second=296 amount=-1 +kerning first=83 second=298 amount=-1 +kerning first=83 second=302 amount=-1 +kerning first=83 second=303 amount=-1 +kerning first=83 second=304 amount=-1 +kerning first=83 second=305 amount=-1 +kerning first=83 second=310 amount=-1 +kerning first=83 second=311 amount=-1 +kerning first=83 second=313 amount=-1 +kerning first=83 second=314 amount=-1 +kerning first=83 second=315 amount=-1 +kerning first=83 second=316 amount=-1 +kerning first=83 second=317 amount=-1 +kerning first=83 second=318 amount=-1 +kerning first=83 second=323 amount=-1 +kerning first=199 second=113 amount=-1 +kerning first=83 second=325 amount=-1 +kerning first=199 second=112 amount=-1 +kerning first=83 second=327 amount=-1 +kerning first=199 second=111 amount=-1 +kerning first=83 second=330 amount=-1 +kerning first=199 second=103 amount=-1 +kerning first=199 second=102 amount=-1 +kerning first=199 second=101 amount=-1 +kerning first=199 second=100 amount=-1 +kerning first=199 second=99 amount=-1 +kerning first=83 second=344 amount=-1 +kerning first=83 second=345 amount=-1 +kerning first=199 second=90 amount=-1 +kerning first=199 second=85 amount=-1 +kerning first=199 second=83 amount=-1 +kerning first=199 second=82 amount=-1 +kerning first=199 second=81 amount=-1 +kerning first=199 second=80 amount=-1 +kerning first=83 second=354 amount=-1 +kerning first=199 second=79 amount=-1 +kerning first=83 second=356 amount=-1 +kerning first=199 second=78 amount=-1 +kerning first=83 second=362 amount=-1 +kerning first=199 second=77 amount=-1 +kerning first=83 second=364 amount=-1 +kerning first=199 second=76 amount=-1 +kerning first=83 second=366 amount=-1 +kerning first=199 second=75 amount=-1 +kerning first=83 second=368 amount=-1 +kerning first=199 second=74 amount=-1 +kerning first=83 second=370 amount=-1 +kerning first=83 second=374 amount=-1 +kerning first=83 second=375 amount=-1 +kerning first=199 second=73 amount=-1 +kerning first=83 second=378 amount=-1 +kerning first=199 second=72 amount=-1 +kerning first=83 second=380 amount=-1 +kerning first=199 second=71 amount=-1 +kerning first=83 second=382 amount=-1 +kerning first=199 second=70 amount=-1 +kerning first=199 second=69 amount=-1 +kerning first=199 second=68 amount=-1 +kerning first=199 second=67 amount=-1 +kerning first=199 second=66 amount=-1 +kerning first=199 second=65 amount=-1 +kerning first=199 second=45 amount=-1 +kerning first=198 second=8249 amount=-1 +kerning first=198 second=382 amount=-1 +kerning first=198 second=380 amount=-1 +kerning first=198 second=378 amount=-1 +kerning first=198 second=370 amount=-1 +kerning first=198 second=369 amount=-1 +kerning first=198 second=368 amount=-1 +kerning first=198 second=367 amount=-1 +kerning first=198 second=366 amount=-1 +kerning first=198 second=365 amount=-1 +kerning first=198 second=364 amount=-1 +kerning first=198 second=363 amount=-1 +kerning first=198 second=362 amount=-1 +kerning first=198 second=361 amount=-1 +kerning first=198 second=352 amount=-1 +kerning first=198 second=350 amount=-1 +kerning first=198 second=346 amount=-1 +kerning first=198 second=344 amount=-1 +kerning first=198 second=330 amount=-1 +kerning first=83 second=8217 amount=-1 +kerning first=83 second=8220 amount=-1 +kerning first=83 second=8221 amount=-1 +kerning first=83 second=8249 amount=-1 +kerning first=198 second=327 amount=-1 +kerning first=198 second=325 amount=-1 +kerning first=198 second=323 amount=-1 +kerning first=198 second=317 amount=-1 +kerning first=198 second=315 amount=-1 +kerning first=198 second=313 amount=-1 +kerning first=84 second=44 amount=-2 +kerning first=84 second=45 amount=-2 +kerning first=84 second=46 amount=-2 +kerning first=84 second=65 amount=-2 +kerning first=198 second=310 amount=-1 +kerning first=84 second=67 amount=-1 +kerning first=198 second=304 amount=-1 +kerning first=198 second=302 amount=-1 +kerning first=198 second=298 amount=-1 +kerning first=84 second=71 amount=-1 +kerning first=198 second=296 amount=-1 +kerning first=198 second=291 amount=-1 +kerning first=84 second=74 amount=-1 +kerning first=198 second=289 amount=-1 +kerning first=198 second=287 amount=-1 +kerning first=198 second=282 amount=-1 +kerning first=198 second=280 amount=-1 +kerning first=84 second=79 amount=-1 +kerning first=198 second=278 amount=-1 +kerning first=84 second=81 amount=-1 +kerning first=198 second=274 amount=-1 +kerning first=84 second=83 amount=-1 +kerning first=198 second=270 amount=-1 +kerning first=84 second=90 amount=-1 +kerning first=84 second=97 amount=-2 +kerning first=84 second=99 amount=-1 +kerning first=84 second=100 amount=-1 +kerning first=84 second=101 amount=-1 +kerning first=198 second=260 amount=-1 +kerning first=84 second=103 amount=-2 +kerning first=84 second=105 amount=-1 +kerning first=84 second=109 amount=-1 +kerning first=84 second=110 amount=-1 +kerning first=84 second=111 amount=-1 +kerning first=84 second=112 amount=-1 +kerning first=84 second=113 amount=-1 +kerning first=198 second=256 amount=-1 +kerning first=84 second=115 amount=-1 +kerning first=198 second=252 amount=-1 +kerning first=84 second=117 amount=-1 +kerning first=84 second=118 amount=-1 +kerning first=84 second=119 amount=-1 +kerning first=84 second=120 amount=-1 +kerning first=84 second=121 amount=-1 +kerning first=84 second=122 amount=-1 +kerning first=84 second=171 amount=-2 +kerning first=84 second=187 amount=-1 +kerning first=84 second=192 amount=-2 +kerning first=84 second=193 amount=-2 +kerning first=84 second=194 amount=-2 +kerning first=84 second=196 amount=-2 +kerning first=84 second=197 amount=-2 +kerning first=84 second=198 amount=-2 +kerning first=84 second=199 amount=-1 +kerning first=198 second=251 amount=-1 +kerning first=198 second=250 amount=-1 +kerning first=198 second=249 amount=-1 +kerning first=198 second=220 amount=-1 +kerning first=198 second=219 amount=-1 +kerning first=198 second=218 amount=-1 +kerning first=198 second=217 amount=-1 +kerning first=198 second=209 amount=-1 +kerning first=198 second=207 amount=-1 +kerning first=84 second=210 amount=-1 +kerning first=84 second=211 amount=-1 +kerning first=84 second=212 amount=-1 +kerning first=84 second=213 amount=-1 +kerning first=84 second=214 amount=-1 +kerning first=84 second=216 amount=-1 +kerning first=198 second=206 amount=-1 +kerning first=198 second=205 amount=-1 +kerning first=198 second=204 amount=-1 +kerning first=198 second=203 amount=-1 +kerning first=84 second=223 amount=-1 +kerning first=84 second=224 amount=-1 +kerning first=84 second=225 amount=-2 +kerning first=84 second=226 amount=-2 +kerning first=84 second=227 amount=-2 +kerning first=84 second=228 amount=-1 +kerning first=84 second=229 amount=-2 +kerning first=84 second=230 amount=-2 +kerning first=84 second=231 amount=-1 +kerning first=84 second=232 amount=-1 +kerning first=84 second=233 amount=-1 +kerning first=84 second=234 amount=-1 +kerning first=84 second=235 amount=-1 +kerning first=84 second=237 amount=-1 +kerning first=84 second=240 amount=-1 +kerning first=84 second=241 amount=-1 +kerning first=84 second=242 amount=-1 +kerning first=84 second=243 amount=-1 +kerning first=84 second=244 amount=-1 +kerning first=84 second=245 amount=-1 +kerning first=84 second=246 amount=-1 +kerning first=84 second=248 amount=-1 +kerning first=198 second=202 amount=-1 +kerning first=84 second=250 amount=-1 +kerning first=84 second=251 amount=-1 +kerning first=198 second=201 amount=-1 +kerning first=84 second=253 amount=-1 +kerning first=84 second=255 amount=-1 +kerning first=84 second=256 amount=-2 +kerning first=84 second=257 amount=-2 +kerning first=84 second=259 amount=-2 +kerning first=84 second=260 amount=-2 +kerning first=84 second=261 amount=-2 +kerning first=84 second=262 amount=-1 +kerning first=84 second=263 amount=-1 +kerning first=84 second=264 amount=-1 +kerning first=84 second=266 amount=-1 +kerning first=84 second=267 amount=-1 +kerning first=84 second=268 amount=-1 +kerning first=84 second=269 amount=-1 +kerning first=198 second=200 amount=-1 +kerning first=198 second=198 amount=-1 +kerning first=84 second=275 amount=-1 +kerning first=84 second=277 amount=-1 +kerning first=198 second=197 amount=-1 +kerning first=84 second=279 amount=-1 +kerning first=198 second=196 amount=-1 +kerning first=84 second=281 amount=-1 +kerning first=198 second=194 amount=-1 +kerning first=84 second=283 amount=-1 +kerning first=84 second=284 amount=-1 +kerning first=84 second=286 amount=-1 +kerning first=84 second=287 amount=-2 +kerning first=84 second=288 amount=-1 +kerning first=84 second=289 amount=-2 +kerning first=84 second=290 amount=-1 +kerning first=84 second=291 amount=-2 +kerning first=198 second=193 amount=-1 +kerning first=198 second=192 amount=-1 +kerning first=198 second=171 amount=-1 +kerning first=84 second=303 amount=-1 +kerning first=198 second=122 amount=-1 +kerning first=84 second=305 amount=-1 +kerning first=198 second=117 amount=-1 +kerning first=198 second=112 amount=-1 +kerning first=198 second=103 amount=-1 +kerning first=198 second=102 amount=-1 +kerning first=198 second=85 amount=-1 +kerning first=84 second=324 amount=-1 +kerning first=198 second=83 amount=-1 +kerning first=84 second=326 amount=-1 +kerning first=198 second=82 amount=-1 +kerning first=84 second=328 amount=-1 +kerning first=198 second=80 amount=-1 +kerning first=84 second=331 amount=-1 +kerning first=84 second=332 amount=-1 +kerning first=84 second=333 amount=-1 +kerning first=84 second=334 amount=-1 +kerning first=84 second=335 amount=-1 +kerning first=84 second=336 amount=-1 +kerning first=84 second=337 amount=-1 +kerning first=84 second=338 amount=-1 +kerning first=84 second=339 amount=-1 +kerning first=198 second=78 amount=-1 +kerning first=198 second=77 amount=-1 +kerning first=84 second=346 amount=-1 +kerning first=84 second=347 amount=-1 +kerning first=84 second=350 amount=-1 +kerning first=84 second=351 amount=-1 +kerning first=84 second=352 amount=-1 +kerning first=84 second=353 amount=-1 +kerning first=198 second=76 amount=-1 +kerning first=84 second=361 amount=-1 +kerning first=198 second=75 amount=-1 +kerning first=84 second=363 amount=-1 +kerning first=198 second=73 amount=-1 +kerning first=84 second=365 amount=-1 +kerning first=198 second=72 amount=-1 +kerning first=84 second=367 amount=-1 +kerning first=198 second=70 amount=-1 +kerning first=84 second=369 amount=-1 +kerning first=198 second=69 amount=-1 +kerning first=84 second=375 amount=-1 +kerning first=84 second=377 amount=-1 +kerning first=84 second=378 amount=-1 +kerning first=84 second=379 amount=-1 +kerning first=84 second=380 amount=-1 +kerning first=84 second=381 amount=-1 +kerning first=84 second=382 amount=-1 +kerning first=198 second=68 amount=-1 +kerning first=198 second=66 amount=-1 +kerning first=198 second=65 amount=-1 +kerning first=198 second=45 amount=-1 +kerning first=197 second=8249 amount=-1 +kerning first=197 second=8221 amount=-2 +kerning first=197 second=8220 amount=-2 +kerning first=197 second=8217 amount=-2 +kerning first=197 second=375 amount=-1 +kerning first=197 second=374 amount=-2 +kerning first=197 second=370 amount=-1 +kerning first=197 second=369 amount=-1 +kerning first=197 second=368 amount=-1 +kerning first=197 second=367 amount=-1 +kerning first=197 second=366 amount=-1 +kerning first=197 second=365 amount=-1 +kerning first=197 second=364 amount=-1 +kerning first=197 second=363 amount=-1 +kerning first=197 second=362 amount=-1 +kerning first=197 second=361 amount=-1 +kerning first=197 second=356 amount=-2 +kerning first=84 second=8249 amount=-2 +kerning first=84 second=8250 amount=-1 +kerning first=197 second=354 amount=-2 +kerning first=197 second=353 amount=-1 +kerning first=197 second=352 amount=-1 +kerning first=197 second=351 amount=-1 +kerning first=197 second=350 amount=-1 +kerning first=85 second=44 amount=-2 +kerning first=85 second=45 amount=-2 +kerning first=85 second=46 amount=-2 +kerning first=85 second=65 amount=-1 +kerning first=197 second=347 amount=-1 +kerning first=197 second=346 amount=-1 +kerning first=85 second=74 amount=-1 +kerning first=197 second=338 amount=-1 +kerning first=197 second=336 amount=-1 +kerning first=85 second=83 amount=-1 +kerning first=197 second=334 amount=-1 +kerning first=85 second=97 amount=-1 +kerning first=85 second=99 amount=-1 +kerning first=85 second=100 amount=-1 +kerning first=85 second=101 amount=-1 +kerning first=197 second=332 amount=-1 +kerning first=85 second=103 amount=-1 +kerning first=85 second=105 amount=-1 +kerning first=85 second=109 amount=-1 +kerning first=85 second=110 amount=-1 +kerning first=85 second=111 amount=-1 +kerning first=85 second=112 amount=-1 +kerning first=85 second=113 amount=-1 +kerning first=197 second=318 amount=-1 +kerning first=85 second=115 amount=-1 +kerning first=197 second=316 amount=-1 +kerning first=85 second=118 amount=-1 +kerning first=85 second=119 amount=-1 +kerning first=85 second=120 amount=-1 +kerning first=197 second=314 amount=-1 +kerning first=85 second=122 amount=-1 +kerning first=85 second=171 amount=-2 +kerning first=85 second=192 amount=-1 +kerning first=85 second=193 amount=-1 +kerning first=85 second=194 amount=-1 +kerning first=85 second=196 amount=-1 +kerning first=85 second=197 amount=-1 +kerning first=85 second=198 amount=-1 +kerning first=197 second=311 amount=-1 +kerning first=197 second=291 amount=-1 +kerning first=197 second=290 amount=-1 +kerning first=197 second=289 amount=-1 +kerning first=197 second=288 amount=-1 +kerning first=197 second=287 amount=-1 +kerning first=197 second=286 amount=-1 +kerning first=85 second=223 amount=-1 +kerning first=85 second=224 amount=-1 +kerning first=85 second=225 amount=-1 +kerning first=85 second=226 amount=-1 +kerning first=85 second=227 amount=-1 +kerning first=85 second=228 amount=-1 +kerning first=85 second=229 amount=-1 +kerning first=85 second=230 amount=-1 +kerning first=85 second=231 amount=-1 +kerning first=85 second=232 amount=-1 +kerning first=85 second=233 amount=-1 +kerning first=85 second=234 amount=-1 +kerning first=85 second=235 amount=-1 +kerning first=85 second=237 amount=-1 +kerning first=85 second=240 amount=-1 +kerning first=85 second=241 amount=-1 +kerning first=85 second=242 amount=-1 +kerning first=85 second=243 amount=-1 +kerning first=85 second=244 amount=-1 +kerning first=85 second=245 amount=-1 +kerning first=85 second=246 amount=-1 +kerning first=85 second=248 amount=-1 +kerning first=197 second=284 amount=-1 +kerning first=197 second=268 amount=-1 +kerning first=197 second=266 amount=-1 +kerning first=197 second=264 amount=-1 +kerning first=197 second=262 amount=-1 +kerning first=197 second=255 amount=-1 +kerning first=85 second=256 amount=-1 +kerning first=85 second=257 amount=-1 +kerning first=85 second=259 amount=-1 +kerning first=85 second=260 amount=-1 +kerning first=85 second=261 amount=-1 +kerning first=197 second=254 amount=-1 +kerning first=85 second=263 amount=-1 +kerning first=197 second=253 amount=-1 +kerning first=197 second=252 amount=-1 +kerning first=85 second=267 amount=-1 +kerning first=197 second=251 amount=-1 +kerning first=85 second=269 amount=-1 +kerning first=85 second=275 amount=-1 +kerning first=85 second=277 amount=-1 +kerning first=85 second=279 amount=-1 +kerning first=85 second=281 amount=-1 +kerning first=85 second=283 amount=-1 +kerning first=197 second=250 amount=-1 +kerning first=197 second=249 amount=-1 +kerning first=85 second=287 amount=-1 +kerning first=197 second=221 amount=-2 +kerning first=85 second=289 amount=-1 +kerning first=197 second=220 amount=-1 +kerning first=85 second=291 amount=-1 +kerning first=85 second=303 amount=-1 +kerning first=85 second=305 amount=-1 +kerning first=85 second=324 amount=-1 +kerning first=85 second=326 amount=-1 +kerning first=85 second=328 amount=-1 +kerning first=85 second=331 amount=-1 +kerning first=197 second=219 amount=-1 +kerning first=85 second=333 amount=-1 +kerning first=197 second=218 amount=-1 +kerning first=85 second=335 amount=-1 +kerning first=197 second=217 amount=-1 +kerning first=85 second=337 amount=-1 +kerning first=197 second=216 amount=-1 +kerning first=85 second=339 amount=-1 +kerning first=197 second=214 amount=-1 +kerning first=85 second=346 amount=-1 +kerning first=85 second=347 amount=-1 +kerning first=85 second=350 amount=-1 +kerning first=85 second=351 amount=-1 +kerning first=85 second=352 amount=-1 +kerning first=85 second=353 amount=-1 +kerning first=197 second=213 amount=-1 +kerning first=197 second=212 amount=-1 +kerning first=197 second=211 amount=-1 +kerning first=197 second=210 amount=-1 +kerning first=197 second=199 amount=-1 +kerning first=197 second=171 amount=-1 +kerning first=197 second=121 amount=-1 +kerning first=85 second=378 amount=-1 +kerning first=197 second=119 amount=-1 +kerning first=85 second=380 amount=-1 +kerning first=197 second=118 amount=-1 +kerning first=85 second=382 amount=-1 +kerning first=197 second=117 amount=-1 +kerning first=197 second=115 amount=-1 +kerning first=197 second=112 amount=-1 +kerning first=197 second=108 amount=-1 +kerning first=197 second=107 amount=-1 +kerning first=197 second=104 amount=-1 +kerning first=197 second=103 amount=-1 +kerning first=197 second=98 amount=-1 +kerning first=197 second=89 amount=-2 +kerning first=197 second=87 amount=-2 +kerning first=197 second=86 amount=-2 +kerning first=85 second=8249 amount=-2 +kerning first=197 second=85 amount=-1 +kerning first=197 second=84 amount=-2 +kerning first=197 second=83 amount=-1 +kerning first=197 second=81 amount=-1 +kerning first=197 second=79 amount=-1 +kerning first=86 second=44 amount=-2 +kerning first=86 second=45 amount=-2 +kerning first=86 second=46 amount=-2 +kerning first=86 second=65 amount=-2 +kerning first=197 second=71 amount=-1 +kerning first=86 second=67 amount=-1 +kerning first=197 second=67 amount=-1 +kerning first=197 second=45 amount=-1 +kerning first=196 second=8249 amount=-1 +kerning first=86 second=71 amount=-1 +kerning first=196 second=8221 amount=-2 +kerning first=196 second=8220 amount=-2 +kerning first=86 second=74 amount=-1 +kerning first=196 second=8217 amount=-2 +kerning first=196 second=375 amount=-1 +kerning first=196 second=374 amount=-2 +kerning first=196 second=370 amount=-1 +kerning first=86 second=79 amount=-1 +kerning first=196 second=369 amount=-1 +kerning first=86 second=81 amount=-1 +kerning first=196 second=368 amount=-1 +kerning first=86 second=83 amount=-1 +kerning first=196 second=367 amount=-1 +kerning first=86 second=90 amount=-1 +kerning first=86 second=97 amount=-2 +kerning first=86 second=99 amount=-1 +kerning first=86 second=100 amount=-1 +kerning first=86 second=101 amount=-1 +kerning first=196 second=366 amount=-1 +kerning first=86 second=103 amount=-2 +kerning first=86 second=105 amount=-1 +kerning first=86 second=109 amount=-1 +kerning first=86 second=110 amount=-1 +kerning first=86 second=111 amount=-1 +kerning first=86 second=112 amount=-1 +kerning first=86 second=113 amount=-1 +kerning first=196 second=365 amount=-1 +kerning first=86 second=115 amount=-1 +kerning first=196 second=364 amount=-1 +kerning first=86 second=117 amount=-1 +kerning first=86 second=118 amount=-1 +kerning first=86 second=119 amount=-1 +kerning first=86 second=120 amount=-1 +kerning first=86 second=121 amount=-1 +kerning first=86 second=122 amount=-1 +kerning first=86 second=171 amount=-2 +kerning first=86 second=187 amount=-1 +kerning first=86 second=192 amount=-2 +kerning first=86 second=193 amount=-2 +kerning first=86 second=194 amount=-2 +kerning first=86 second=196 amount=-2 +kerning first=86 second=197 amount=-2 +kerning first=86 second=198 amount=-2 +kerning first=86 second=199 amount=-1 +kerning first=196 second=363 amount=-1 +kerning first=196 second=362 amount=-1 +kerning first=196 second=361 amount=-1 +kerning first=196 second=356 amount=-2 +kerning first=196 second=354 amount=-2 +kerning first=196 second=353 amount=-1 +kerning first=196 second=352 amount=-1 +kerning first=196 second=351 amount=-1 +kerning first=196 second=350 amount=-1 +kerning first=86 second=210 amount=-1 +kerning first=86 second=211 amount=-1 +kerning first=86 second=212 amount=-1 +kerning first=86 second=213 amount=-1 +kerning first=86 second=214 amount=-1 +kerning first=86 second=216 amount=-1 +kerning first=196 second=347 amount=-1 +kerning first=196 second=346 amount=-1 +kerning first=196 second=338 amount=-1 +kerning first=196 second=336 amount=-1 +kerning first=86 second=223 amount=-1 +kerning first=86 second=224 amount=-1 +kerning first=86 second=225 amount=-2 +kerning first=86 second=226 amount=-2 +kerning first=86 second=227 amount=-2 +kerning first=86 second=228 amount=-1 +kerning first=86 second=229 amount=-2 +kerning first=86 second=230 amount=-2 +kerning first=86 second=231 amount=-1 +kerning first=86 second=232 amount=-1 +kerning first=86 second=233 amount=-1 +kerning first=86 second=234 amount=-1 +kerning first=86 second=235 amount=-1 +kerning first=86 second=237 amount=-1 +kerning first=86 second=240 amount=-1 +kerning first=86 second=241 amount=-1 +kerning first=86 second=242 amount=-1 +kerning first=86 second=243 amount=-1 +kerning first=86 second=244 amount=-1 +kerning first=86 second=245 amount=-1 +kerning first=86 second=246 amount=-1 +kerning first=86 second=248 amount=-1 +kerning first=196 second=334 amount=-1 +kerning first=86 second=250 amount=-1 +kerning first=86 second=251 amount=-1 +kerning first=196 second=332 amount=-1 +kerning first=86 second=253 amount=-1 +kerning first=86 second=255 amount=-1 +kerning first=86 second=256 amount=-2 +kerning first=86 second=257 amount=-2 +kerning first=86 second=259 amount=-2 +kerning first=86 second=260 amount=-2 +kerning first=86 second=261 amount=-2 +kerning first=86 second=262 amount=-1 +kerning first=86 second=263 amount=-1 +kerning first=86 second=264 amount=-1 +kerning first=86 second=266 amount=-1 +kerning first=86 second=267 amount=-1 +kerning first=86 second=268 amount=-1 +kerning first=86 second=269 amount=-1 +kerning first=196 second=318 amount=-1 +kerning first=196 second=316 amount=-1 +kerning first=86 second=275 amount=-1 +kerning first=86 second=277 amount=-1 +kerning first=196 second=314 amount=-1 +kerning first=86 second=279 amount=-1 +kerning first=196 second=311 amount=-1 +kerning first=86 second=281 amount=-1 +kerning first=196 second=291 amount=-1 +kerning first=86 second=283 amount=-1 +kerning first=86 second=284 amount=-1 +kerning first=86 second=286 amount=-1 +kerning first=86 second=287 amount=-2 +kerning first=86 second=288 amount=-1 +kerning first=86 second=289 amount=-2 +kerning first=86 second=290 amount=-1 +kerning first=86 second=291 amount=-2 +kerning first=196 second=290 amount=-1 +kerning first=196 second=289 amount=-1 +kerning first=196 second=288 amount=-1 +kerning first=86 second=303 amount=-1 +kerning first=196 second=287 amount=-1 +kerning first=86 second=305 amount=-1 +kerning first=196 second=286 amount=-1 +kerning first=196 second=284 amount=-1 +kerning first=196 second=268 amount=-1 +kerning first=196 second=266 amount=-1 +kerning first=196 second=264 amount=-1 +kerning first=86 second=324 amount=-1 +kerning first=196 second=262 amount=-1 +kerning first=86 second=326 amount=-1 +kerning first=196 second=255 amount=-1 +kerning first=86 second=328 amount=-1 +kerning first=196 second=254 amount=-1 +kerning first=86 second=331 amount=-1 +kerning first=86 second=332 amount=-1 +kerning first=86 second=333 amount=-1 +kerning first=86 second=334 amount=-1 +kerning first=86 second=335 amount=-1 +kerning first=86 second=336 amount=-1 +kerning first=86 second=337 amount=-1 +kerning first=86 second=338 amount=-1 +kerning first=86 second=339 amount=-1 +kerning first=196 second=253 amount=-1 +kerning first=196 second=252 amount=-1 +kerning first=86 second=346 amount=-1 +kerning first=86 second=347 amount=-1 +kerning first=86 second=350 amount=-1 +kerning first=86 second=351 amount=-1 +kerning first=86 second=352 amount=-1 +kerning first=86 second=353 amount=-1 +kerning first=196 second=251 amount=-1 +kerning first=86 second=361 amount=-1 +kerning first=196 second=250 amount=-1 +kerning first=86 second=363 amount=-1 +kerning first=196 second=249 amount=-1 +kerning first=86 second=365 amount=-1 +kerning first=196 second=221 amount=-2 +kerning first=86 second=367 amount=-1 +kerning first=196 second=220 amount=-1 +kerning first=86 second=369 amount=-1 +kerning first=196 second=219 amount=-1 +kerning first=86 second=375 amount=-1 +kerning first=86 second=377 amount=-1 +kerning first=86 second=378 amount=-1 +kerning first=86 second=379 amount=-1 +kerning first=86 second=380 amount=-1 +kerning first=86 second=381 amount=-1 +kerning first=86 second=382 amount=-1 +kerning first=196 second=218 amount=-1 +kerning first=196 second=217 amount=-1 +kerning first=196 second=216 amount=-1 +kerning first=196 second=214 amount=-1 +kerning first=196 second=213 amount=-1 +kerning first=196 second=212 amount=-1 +kerning first=196 second=211 amount=-1 +kerning first=196 second=210 amount=-1 +kerning first=196 second=199 amount=-1 +kerning first=196 second=171 amount=-1 +kerning first=196 second=121 amount=-1 +kerning first=196 second=119 amount=-1 +kerning first=196 second=118 amount=-1 +kerning first=196 second=117 amount=-1 +kerning first=196 second=115 amount=-1 +kerning first=196 second=112 amount=-1 +kerning first=196 second=108 amount=-1 +kerning first=196 second=107 amount=-1 +kerning first=196 second=104 amount=-1 +kerning first=196 second=103 amount=-1 +kerning first=196 second=98 amount=-1 +kerning first=86 second=8249 amount=-2 +kerning first=86 second=8250 amount=-1 +kerning first=196 second=89 amount=-2 +kerning first=196 second=87 amount=-2 +kerning first=196 second=86 amount=-2 +kerning first=196 second=85 amount=-1 +kerning first=196 second=84 amount=-2 +kerning first=87 second=44 amount=-2 +kerning first=87 second=45 amount=-2 +kerning first=87 second=46 amount=-2 +kerning first=87 second=65 amount=-2 +kerning first=196 second=83 amount=-1 +kerning first=87 second=67 amount=-1 +kerning first=196 second=81 amount=-1 +kerning first=196 second=79 amount=-1 +kerning first=196 second=71 amount=-1 +kerning first=87 second=71 amount=-1 +kerning first=196 second=67 amount=-1 +kerning first=196 second=45 amount=-1 +kerning first=87 second=74 amount=-1 +kerning first=195 second=8249 amount=-1 +kerning first=195 second=8221 amount=-2 +kerning first=195 second=8220 amount=-2 +kerning first=195 second=8217 amount=-2 +kerning first=87 second=79 amount=-1 +kerning first=195 second=375 amount=-1 +kerning first=87 second=81 amount=-1 +kerning first=195 second=374 amount=-2 +kerning first=87 second=83 amount=-1 +kerning first=195 second=370 amount=-1 +kerning first=87 second=90 amount=-1 +kerning first=87 second=97 amount=-2 +kerning first=87 second=99 amount=-1 +kerning first=87 second=100 amount=-1 +kerning first=87 second=101 amount=-1 +kerning first=195 second=369 amount=-1 +kerning first=87 second=103 amount=-2 +kerning first=87 second=105 amount=-1 +kerning first=87 second=109 amount=-1 +kerning first=87 second=110 amount=-1 +kerning first=87 second=111 amount=-1 +kerning first=87 second=112 amount=-1 +kerning first=87 second=113 amount=-1 +kerning first=195 second=368 amount=-1 +kerning first=87 second=115 amount=-1 +kerning first=195 second=367 amount=-1 +kerning first=87 second=117 amount=-1 +kerning first=87 second=118 amount=-1 +kerning first=87 second=119 amount=-1 +kerning first=87 second=120 amount=-1 +kerning first=87 second=121 amount=-1 +kerning first=87 second=122 amount=-1 +kerning first=87 second=171 amount=-2 +kerning first=87 second=187 amount=-1 +kerning first=87 second=192 amount=-2 +kerning first=87 second=193 amount=-2 +kerning first=87 second=194 amount=-2 +kerning first=87 second=196 amount=-2 +kerning first=87 second=197 amount=-2 +kerning first=87 second=198 amount=-2 +kerning first=87 second=199 amount=-1 +kerning first=195 second=366 amount=-1 +kerning first=195 second=365 amount=-1 +kerning first=195 second=364 amount=-1 +kerning first=195 second=363 amount=-1 +kerning first=195 second=362 amount=-1 +kerning first=195 second=361 amount=-1 +kerning first=195 second=356 amount=-2 +kerning first=195 second=354 amount=-2 +kerning first=195 second=353 amount=-1 +kerning first=87 second=210 amount=-1 +kerning first=87 second=211 amount=-1 +kerning first=87 second=212 amount=-1 +kerning first=87 second=213 amount=-1 +kerning first=87 second=214 amount=-1 +kerning first=87 second=216 amount=-1 +kerning first=195 second=352 amount=-1 +kerning first=195 second=351 amount=-1 +kerning first=195 second=350 amount=-1 +kerning first=195 second=347 amount=-1 +kerning first=87 second=223 amount=-1 +kerning first=87 second=224 amount=-1 +kerning first=87 second=225 amount=-2 +kerning first=87 second=226 amount=-2 +kerning first=87 second=227 amount=-2 +kerning first=87 second=228 amount=-1 +kerning first=87 second=229 amount=-2 +kerning first=87 second=230 amount=-2 +kerning first=87 second=231 amount=-1 +kerning first=87 second=232 amount=-1 +kerning first=87 second=233 amount=-1 +kerning first=87 second=234 amount=-1 +kerning first=87 second=235 amount=-1 +kerning first=87 second=237 amount=-1 +kerning first=87 second=240 amount=-1 +kerning first=87 second=241 amount=-1 +kerning first=87 second=242 amount=-1 +kerning first=87 second=243 amount=-1 +kerning first=87 second=244 amount=-1 +kerning first=87 second=245 amount=-1 +kerning first=87 second=246 amount=-1 +kerning first=87 second=248 amount=-1 +kerning first=195 second=346 amount=-1 +kerning first=87 second=250 amount=-1 +kerning first=87 second=251 amount=-1 +kerning first=195 second=338 amount=-1 +kerning first=87 second=253 amount=-1 +kerning first=87 second=255 amount=-1 +kerning first=87 second=256 amount=-2 +kerning first=87 second=257 amount=-2 +kerning first=87 second=259 amount=-2 +kerning first=87 second=260 amount=-2 +kerning first=87 second=261 amount=-2 +kerning first=87 second=262 amount=-1 +kerning first=87 second=263 amount=-1 +kerning first=87 second=264 amount=-1 +kerning first=87 second=266 amount=-1 +kerning first=87 second=267 amount=-1 +kerning first=87 second=268 amount=-1 +kerning first=87 second=269 amount=-1 +kerning first=195 second=336 amount=-1 +kerning first=195 second=334 amount=-1 +kerning first=87 second=275 amount=-1 +kerning first=87 second=277 amount=-1 +kerning first=195 second=332 amount=-1 +kerning first=87 second=279 amount=-1 +kerning first=195 second=318 amount=-1 +kerning first=87 second=281 amount=-1 +kerning first=195 second=316 amount=-1 +kerning first=87 second=283 amount=-1 +kerning first=87 second=284 amount=-1 +kerning first=87 second=286 amount=-1 +kerning first=87 second=287 amount=-2 +kerning first=87 second=288 amount=-1 +kerning first=87 second=289 amount=-2 +kerning first=87 second=290 amount=-1 +kerning first=87 second=291 amount=-2 +kerning first=195 second=314 amount=-1 +kerning first=195 second=311 amount=-1 +kerning first=195 second=291 amount=-1 +kerning first=87 second=303 amount=-1 +kerning first=195 second=290 amount=-1 +kerning first=87 second=305 amount=-1 +kerning first=195 second=289 amount=-1 +kerning first=195 second=288 amount=-1 +kerning first=195 second=287 amount=-1 +kerning first=195 second=286 amount=-1 +kerning first=195 second=284 amount=-1 +kerning first=87 second=324 amount=-1 +kerning first=195 second=268 amount=-1 +kerning first=87 second=326 amount=-1 +kerning first=195 second=266 amount=-1 +kerning first=87 second=328 amount=-1 +kerning first=195 second=264 amount=-1 +kerning first=87 second=331 amount=-1 +kerning first=87 second=332 amount=-1 +kerning first=87 second=333 amount=-1 +kerning first=87 second=334 amount=-1 +kerning first=87 second=335 amount=-1 +kerning first=87 second=336 amount=-1 +kerning first=87 second=337 amount=-1 +kerning first=87 second=338 amount=-1 +kerning first=87 second=339 amount=-1 +kerning first=195 second=262 amount=-1 +kerning first=195 second=255 amount=-1 +kerning first=87 second=346 amount=-1 +kerning first=87 second=347 amount=-1 +kerning first=87 second=350 amount=-1 +kerning first=87 second=351 amount=-1 +kerning first=87 second=352 amount=-1 +kerning first=87 second=353 amount=-1 +kerning first=195 second=254 amount=-1 +kerning first=87 second=361 amount=-1 +kerning first=195 second=253 amount=-1 +kerning first=87 second=363 amount=-1 +kerning first=195 second=252 amount=-1 +kerning first=87 second=365 amount=-1 +kerning first=195 second=251 amount=-1 +kerning first=87 second=367 amount=-1 +kerning first=195 second=250 amount=-1 +kerning first=87 second=369 amount=-1 +kerning first=195 second=249 amount=-1 +kerning first=87 second=375 amount=-1 +kerning first=87 second=377 amount=-1 +kerning first=87 second=378 amount=-1 +kerning first=87 second=379 amount=-1 +kerning first=87 second=380 amount=-1 +kerning first=87 second=381 amount=-1 +kerning first=87 second=382 amount=-1 +kerning first=195 second=221 amount=-2 +kerning first=195 second=220 amount=-1 +kerning first=195 second=219 amount=-1 +kerning first=195 second=218 amount=-1 +kerning first=195 second=217 amount=-1 +kerning first=195 second=216 amount=-1 +kerning first=195 second=214 amount=-1 +kerning first=195 second=213 amount=-1 +kerning first=195 second=212 amount=-1 +kerning first=195 second=211 amount=-1 +kerning first=195 second=210 amount=-1 +kerning first=195 second=199 amount=-1 +kerning first=195 second=171 amount=-1 +kerning first=195 second=121 amount=-1 +kerning first=195 second=119 amount=-1 +kerning first=195 second=118 amount=-1 +kerning first=195 second=117 amount=-1 +kerning first=195 second=115 amount=-1 +kerning first=195 second=112 amount=-1 +kerning first=195 second=108 amount=-1 +kerning first=195 second=107 amount=-1 +kerning first=87 second=8249 amount=-2 +kerning first=87 second=8250 amount=-1 +kerning first=195 second=104 amount=-1 +kerning first=195 second=103 amount=-1 +kerning first=195 second=98 amount=-1 +kerning first=195 second=89 amount=-2 +kerning first=195 second=87 amount=-2 +kerning first=195 second=86 amount=-2 +kerning first=88 second=45 amount=-2 +kerning first=195 second=85 amount=-1 +kerning first=88 second=67 amount=-1 +kerning first=88 second=71 amount=-1 +kerning first=88 second=79 amount=-1 +kerning first=88 second=81 amount=-1 +kerning first=88 second=83 amount=-1 +kerning first=88 second=84 amount=-1 +kerning first=88 second=85 amount=-1 +kerning first=88 second=86 amount=-1 +kerning first=88 second=87 amount=-1 +kerning first=88 second=89 amount=-1 +kerning first=195 second=84 amount=-2 +kerning first=195 second=83 amount=-1 +kerning first=88 second=99 amount=-1 +kerning first=88 second=100 amount=-1 +kerning first=88 second=101 amount=-1 +kerning first=88 second=103 amount=-1 +kerning first=195 second=81 amount=-1 +kerning first=195 second=79 amount=-1 +kerning first=195 second=71 amount=-1 +kerning first=195 second=67 amount=-1 +kerning first=88 second=111 amount=-1 +kerning first=195 second=45 amount=-1 +kerning first=88 second=113 amount=-1 +kerning first=194 second=8249 amount=-1 +kerning first=194 second=8221 amount=-2 +kerning first=194 second=8220 amount=-2 +kerning first=88 second=117 amount=-1 +kerning first=88 second=118 amount=-1 +kerning first=88 second=119 amount=-1 +kerning first=88 second=121 amount=-1 +kerning first=88 second=171 amount=-2 +kerning first=88 second=199 amount=-1 +kerning first=88 second=210 amount=-1 +kerning first=88 second=211 amount=-1 +kerning first=88 second=212 amount=-1 +kerning first=88 second=213 amount=-1 +kerning first=88 second=214 amount=-1 +kerning first=88 second=216 amount=-1 +kerning first=88 second=217 amount=-1 +kerning first=88 second=218 amount=-1 +kerning first=88 second=219 amount=-1 +kerning first=88 second=220 amount=-1 +kerning first=88 second=221 amount=-1 +kerning first=194 second=8217 amount=-2 +kerning first=194 second=375 amount=-1 +kerning first=194 second=374 amount=-2 +kerning first=194 second=370 amount=-1 +kerning first=194 second=369 amount=-1 +kerning first=194 second=368 amount=-1 +kerning first=194 second=367 amount=-1 +kerning first=88 second=231 amount=-1 +kerning first=88 second=232 amount=-1 +kerning first=88 second=233 amount=-1 +kerning first=88 second=234 amount=-1 +kerning first=88 second=235 amount=-1 +kerning first=88 second=240 amount=-1 +kerning first=88 second=242 amount=-1 +kerning first=88 second=243 amount=-1 +kerning first=88 second=244 amount=-1 +kerning first=88 second=245 amount=-1 +kerning first=88 second=246 amount=-1 +kerning first=88 second=248 amount=-1 +kerning first=88 second=249 amount=-1 +kerning first=88 second=250 amount=-1 +kerning first=88 second=251 amount=-1 +kerning first=88 second=252 amount=-1 +kerning first=88 second=253 amount=-1 +kerning first=194 second=366 amount=-1 +kerning first=88 second=255 amount=-1 +kerning first=194 second=365 amount=-1 +kerning first=194 second=364 amount=-1 +kerning first=194 second=363 amount=-1 +kerning first=88 second=262 amount=-1 +kerning first=88 second=263 amount=-1 +kerning first=88 second=264 amount=-1 +kerning first=88 second=266 amount=-1 +kerning first=88 second=267 amount=-1 +kerning first=88 second=268 amount=-1 +kerning first=88 second=269 amount=-1 +kerning first=88 second=275 amount=-1 +kerning first=88 second=277 amount=-1 +kerning first=88 second=279 amount=-1 +kerning first=88 second=281 amount=-1 +kerning first=88 second=283 amount=-1 +kerning first=88 second=284 amount=-1 +kerning first=88 second=286 amount=-1 +kerning first=88 second=287 amount=-1 +kerning first=88 second=288 amount=-1 +kerning first=88 second=289 amount=-1 +kerning first=88 second=290 amount=-1 +kerning first=88 second=291 amount=-1 +kerning first=194 second=362 amount=-1 +kerning first=194 second=361 amount=-1 +kerning first=194 second=356 amount=-2 +kerning first=194 second=354 amount=-2 +kerning first=88 second=332 amount=-1 +kerning first=88 second=333 amount=-1 +kerning first=88 second=334 amount=-1 +kerning first=88 second=335 amount=-1 +kerning first=88 second=336 amount=-1 +kerning first=88 second=337 amount=-1 +kerning first=88 second=338 amount=-1 +kerning first=88 second=339 amount=-1 +kerning first=194 second=353 amount=-1 +kerning first=88 second=346 amount=-1 +kerning first=194 second=352 amount=-1 +kerning first=88 second=350 amount=-1 +kerning first=194 second=351 amount=-1 +kerning first=88 second=352 amount=-1 +kerning first=194 second=350 amount=-1 +kerning first=88 second=354 amount=-1 +kerning first=194 second=347 amount=-1 +kerning first=88 second=356 amount=-1 +kerning first=88 second=361 amount=-1 +kerning first=88 second=362 amount=-1 +kerning first=88 second=363 amount=-1 +kerning first=88 second=364 amount=-1 +kerning first=88 second=365 amount=-1 +kerning first=88 second=366 amount=-1 +kerning first=88 second=367 amount=-1 +kerning first=88 second=368 amount=-1 +kerning first=88 second=369 amount=-1 +kerning first=88 second=370 amount=-1 +kerning first=88 second=374 amount=-1 +kerning first=88 second=375 amount=-1 +kerning first=194 second=346 amount=-1 +kerning first=194 second=338 amount=-1 +kerning first=194 second=336 amount=-1 +kerning first=194 second=334 amount=-1 +kerning first=194 second=332 amount=-1 +kerning first=194 second=318 amount=-1 +kerning first=194 second=316 amount=-1 +kerning first=194 second=314 amount=-1 +kerning first=194 second=311 amount=-1 +kerning first=194 second=291 amount=-1 +kerning first=194 second=290 amount=-1 +kerning first=194 second=289 amount=-1 +kerning first=194 second=288 amount=-1 +kerning first=194 second=287 amount=-1 +kerning first=88 second=8217 amount=-1 +kerning first=88 second=8220 amount=-1 +kerning first=88 second=8221 amount=-1 +kerning first=88 second=8249 amount=-2 +kerning first=89 second=44 amount=-2 +kerning first=89 second=45 amount=-2 +kerning first=89 second=46 amount=-2 +kerning first=89 second=65 amount=-2 +kerning first=194 second=286 amount=-1 +kerning first=89 second=67 amount=-1 +kerning first=194 second=284 amount=-1 +kerning first=194 second=268 amount=-1 +kerning first=194 second=266 amount=-1 +kerning first=89 second=71 amount=-1 +kerning first=194 second=264 amount=-1 +kerning first=194 second=262 amount=-1 +kerning first=89 second=74 amount=-1 +kerning first=194 second=255 amount=-1 +kerning first=194 second=254 amount=-1 +kerning first=194 second=253 amount=-1 +kerning first=194 second=252 amount=-1 +kerning first=89 second=79 amount=-1 +kerning first=194 second=251 amount=-1 +kerning first=89 second=81 amount=-1 +kerning first=194 second=250 amount=-1 +kerning first=89 second=83 amount=-1 +kerning first=194 second=249 amount=-1 +kerning first=89 second=90 amount=-1 +kerning first=89 second=97 amount=-2 +kerning first=89 second=99 amount=-1 +kerning first=89 second=100 amount=-1 +kerning first=89 second=101 amount=-1 +kerning first=194 second=221 amount=-2 +kerning first=89 second=103 amount=-2 +kerning first=89 second=105 amount=-1 +kerning first=89 second=109 amount=-1 +kerning first=89 second=110 amount=-1 +kerning first=89 second=111 amount=-1 +kerning first=89 second=112 amount=-1 +kerning first=89 second=113 amount=-1 +kerning first=194 second=220 amount=-1 +kerning first=89 second=115 amount=-1 +kerning first=194 second=219 amount=-1 +kerning first=89 second=117 amount=-1 +kerning first=89 second=118 amount=-1 +kerning first=89 second=119 amount=-1 +kerning first=89 second=120 amount=-1 +kerning first=89 second=121 amount=-1 +kerning first=89 second=122 amount=-1 +kerning first=89 second=171 amount=-2 +kerning first=89 second=187 amount=-1 +kerning first=89 second=192 amount=-2 +kerning first=89 second=193 amount=-2 +kerning first=89 second=194 amount=-2 +kerning first=89 second=196 amount=-2 +kerning first=89 second=197 amount=-2 +kerning first=89 second=198 amount=-2 +kerning first=89 second=199 amount=-1 +kerning first=194 second=218 amount=-1 +kerning first=194 second=217 amount=-1 +kerning first=194 second=216 amount=-1 +kerning first=194 second=214 amount=-1 +kerning first=194 second=213 amount=-1 +kerning first=194 second=212 amount=-1 +kerning first=194 second=211 amount=-1 +kerning first=194 second=210 amount=-1 +kerning first=194 second=199 amount=-1 +kerning first=89 second=210 amount=-1 +kerning first=89 second=211 amount=-1 +kerning first=89 second=212 amount=-1 +kerning first=89 second=213 amount=-1 +kerning first=89 second=214 amount=-1 +kerning first=89 second=216 amount=-1 +kerning first=194 second=171 amount=-1 +kerning first=194 second=121 amount=-1 +kerning first=194 second=119 amount=-1 +kerning first=194 second=118 amount=-1 +kerning first=89 second=223 amount=-1 +kerning first=89 second=224 amount=-1 +kerning first=89 second=225 amount=-2 +kerning first=89 second=226 amount=-2 +kerning first=89 second=227 amount=-2 +kerning first=89 second=228 amount=-1 +kerning first=89 second=229 amount=-2 +kerning first=89 second=230 amount=-2 +kerning first=89 second=231 amount=-1 +kerning first=89 second=232 amount=-1 +kerning first=89 second=233 amount=-1 +kerning first=89 second=234 amount=-1 +kerning first=89 second=235 amount=-1 +kerning first=89 second=237 amount=-1 +kerning first=89 second=240 amount=-1 +kerning first=89 second=241 amount=-1 +kerning first=89 second=242 amount=-1 +kerning first=89 second=243 amount=-1 +kerning first=89 second=244 amount=-1 +kerning first=89 second=245 amount=-1 +kerning first=89 second=246 amount=-1 +kerning first=89 second=248 amount=-1 +kerning first=194 second=117 amount=-1 +kerning first=89 second=250 amount=-1 +kerning first=89 second=251 amount=-1 +kerning first=194 second=115 amount=-1 +kerning first=89 second=253 amount=-1 +kerning first=89 second=255 amount=-1 +kerning first=89 second=256 amount=-2 +kerning first=89 second=257 amount=-2 +kerning first=89 second=259 amount=-2 +kerning first=89 second=260 amount=-2 +kerning first=89 second=261 amount=-2 +kerning first=89 second=262 amount=-1 +kerning first=89 second=263 amount=-1 +kerning first=89 second=264 amount=-1 +kerning first=89 second=266 amount=-1 +kerning first=89 second=267 amount=-1 +kerning first=89 second=268 amount=-1 +kerning first=89 second=269 amount=-1 +kerning first=194 second=112 amount=-1 +kerning first=194 second=108 amount=-1 +kerning first=89 second=275 amount=-1 +kerning first=89 second=277 amount=-1 +kerning first=194 second=107 amount=-1 +kerning first=89 second=279 amount=-1 +kerning first=194 second=104 amount=-1 +kerning first=89 second=281 amount=-1 +kerning first=194 second=103 amount=-1 +kerning first=89 second=283 amount=-1 +kerning first=89 second=284 amount=-1 +kerning first=89 second=286 amount=-1 +kerning first=89 second=287 amount=-2 +kerning first=89 second=288 amount=-1 +kerning first=89 second=289 amount=-2 +kerning first=89 second=290 amount=-1 +kerning first=89 second=291 amount=-2 +kerning first=194 second=98 amount=-1 +kerning first=194 second=89 amount=-2 +kerning first=194 second=87 amount=-2 +kerning first=89 second=303 amount=-1 +kerning first=194 second=86 amount=-2 +kerning first=89 second=305 amount=-1 +kerning first=194 second=85 amount=-1 +kerning first=194 second=84 amount=-2 +kerning first=194 second=83 amount=-1 +kerning first=194 second=81 amount=-1 +kerning first=194 second=79 amount=-1 +kerning first=89 second=324 amount=-1 +kerning first=194 second=71 amount=-1 +kerning first=89 second=326 amount=-1 +kerning first=194 second=67 amount=-1 +kerning first=89 second=328 amount=-1 +kerning first=194 second=45 amount=-1 +kerning first=89 second=331 amount=-1 +kerning first=89 second=332 amount=-1 +kerning first=89 second=333 amount=-1 +kerning first=89 second=334 amount=-1 +kerning first=89 second=335 amount=-1 +kerning first=89 second=336 amount=-1 +kerning first=89 second=337 amount=-1 +kerning first=89 second=338 amount=-1 +kerning first=89 second=339 amount=-1 +kerning first=193 second=8249 amount=-1 +kerning first=193 second=8221 amount=-2 +kerning first=89 second=346 amount=-1 +kerning first=89 second=347 amount=-1 +kerning first=89 second=350 amount=-1 +kerning first=89 second=351 amount=-1 +kerning first=89 second=352 amount=-1 +kerning first=89 second=353 amount=-1 +kerning first=193 second=8220 amount=-2 +kerning first=89 second=361 amount=-1 +kerning first=193 second=8217 amount=-2 +kerning first=89 second=363 amount=-1 +kerning first=193 second=375 amount=-1 +kerning first=89 second=365 amount=-1 +kerning first=193 second=374 amount=-2 +kerning first=89 second=367 amount=-1 +kerning first=193 second=370 amount=-1 +kerning first=89 second=369 amount=-1 +kerning first=193 second=369 amount=-1 +kerning first=89 second=375 amount=-1 +kerning first=89 second=377 amount=-1 +kerning first=89 second=378 amount=-1 +kerning first=89 second=379 amount=-1 +kerning first=89 second=380 amount=-1 +kerning first=89 second=381 amount=-1 +kerning first=89 second=382 amount=-1 +kerning first=193 second=368 amount=-1 +kerning first=193 second=367 amount=-1 +kerning first=193 second=366 amount=-1 +kerning first=193 second=365 amount=-1 +kerning first=193 second=364 amount=-1 +kerning first=193 second=363 amount=-1 +kerning first=193 second=362 amount=-1 +kerning first=193 second=361 amount=-1 +kerning first=193 second=356 amount=-2 +kerning first=193 second=354 amount=-2 +kerning first=193 second=353 amount=-1 +kerning first=193 second=352 amount=-1 +kerning first=193 second=351 amount=-1 +kerning first=193 second=350 amount=-1 +kerning first=193 second=347 amount=-1 +kerning first=193 second=346 amount=-1 +kerning first=193 second=338 amount=-1 +kerning first=193 second=336 amount=-1 +kerning first=193 second=334 amount=-1 +kerning first=193 second=332 amount=-1 +kerning first=193 second=318 amount=-1 +kerning first=89 second=8249 amount=-2 +kerning first=89 second=8250 amount=-1 +kerning first=193 second=316 amount=-1 +kerning first=193 second=314 amount=-1 +kerning first=193 second=311 amount=-1 +kerning first=193 second=291 amount=-1 +kerning first=193 second=290 amount=-1 +kerning first=193 second=289 amount=-1 +kerning first=90 second=45 amount=-1 +kerning first=193 second=288 amount=-1 +kerning first=193 second=287 amount=-1 +kerning first=193 second=286 amount=-1 +kerning first=193 second=284 amount=-1 +kerning first=193 second=268 amount=-1 +kerning first=193 second=266 amount=-1 +kerning first=193 second=264 amount=-1 +kerning first=193 second=262 amount=-1 +kerning first=193 second=255 amount=-1 +kerning first=193 second=254 amount=-1 +kerning first=193 second=253 amount=-1 +kerning first=193 second=252 amount=-1 +kerning first=193 second=251 amount=-1 +kerning first=193 second=250 amount=-1 +kerning first=193 second=249 amount=-1 +kerning first=193 second=221 amount=-2 +kerning first=193 second=220 amount=-1 +kerning first=193 second=219 amount=-1 +kerning first=193 second=218 amount=-1 +kerning first=90 second=84 amount=-1 +kerning first=90 second=86 amount=-1 +kerning first=90 second=87 amount=-1 +kerning first=90 second=89 amount=-1 +kerning first=193 second=217 amount=-1 +kerning first=193 second=216 amount=-1 +kerning first=193 second=214 amount=-1 +kerning first=193 second=213 amount=-1 +kerning first=193 second=212 amount=-1 +kerning first=90 second=102 amount=-1 +kerning first=90 second=103 amount=-1 +kerning first=193 second=211 amount=-1 +kerning first=193 second=210 amount=-1 +kerning first=193 second=199 amount=-1 +kerning first=193 second=171 amount=-1 +kerning first=193 second=121 amount=-1 +kerning first=193 second=119 amount=-1 +kerning first=90 second=115 amount=-1 +kerning first=193 second=118 amount=-1 +kerning first=90 second=117 amount=-1 +kerning first=90 second=118 amount=-1 +kerning first=90 second=119 amount=-1 +kerning first=90 second=121 amount=-1 +kerning first=90 second=122 amount=-1 +kerning first=90 second=171 amount=-1 +kerning first=193 second=117 amount=-1 +kerning first=193 second=115 amount=-1 +kerning first=193 second=112 amount=-1 +kerning first=193 second=108 amount=-1 +kerning first=193 second=107 amount=-1 +kerning first=193 second=104 amount=-1 +kerning first=193 second=103 amount=-1 +kerning first=193 second=98 amount=-1 +kerning first=193 second=89 amount=-2 +kerning first=193 second=87 amount=-2 +kerning first=193 second=86 amount=-2 +kerning first=193 second=85 amount=-1 +kerning first=193 second=84 amount=-2 +kerning first=193 second=83 amount=-1 +kerning first=193 second=81 amount=-1 +kerning first=193 second=79 amount=-1 +kerning first=193 second=71 amount=-1 +kerning first=193 second=67 amount=-1 +kerning first=193 second=45 amount=-1 +kerning first=192 second=8249 amount=-1 +kerning first=192 second=8221 amount=-2 +kerning first=192 second=8220 amount=-2 +kerning first=192 second=8217 amount=-2 +kerning first=90 second=221 amount=-1 +kerning first=192 second=375 amount=-1 +kerning first=192 second=374 amount=-2 +kerning first=192 second=370 amount=-1 +kerning first=192 second=369 amount=-1 +kerning first=192 second=368 amount=-1 +kerning first=192 second=367 amount=-1 +kerning first=192 second=366 amount=-1 +kerning first=192 second=365 amount=-1 +kerning first=192 second=364 amount=-1 +kerning first=192 second=363 amount=-1 +kerning first=192 second=362 amount=-1 +kerning first=192 second=361 amount=-1 +kerning first=192 second=356 amount=-2 +kerning first=192 second=354 amount=-2 +kerning first=192 second=353 amount=-1 +kerning first=192 second=352 amount=-1 +kerning first=192 second=351 amount=-1 +kerning first=192 second=350 amount=-1 +kerning first=192 second=347 amount=-1 +kerning first=192 second=346 amount=-1 +kerning first=192 second=338 amount=-1 +kerning first=192 second=336 amount=-1 +kerning first=90 second=249 amount=-1 +kerning first=90 second=250 amount=-1 +kerning first=90 second=251 amount=-1 +kerning first=90 second=252 amount=-1 +kerning first=90 second=253 amount=-1 +kerning first=90 second=255 amount=-1 +kerning first=192 second=334 amount=-1 +kerning first=192 second=332 amount=-1 +kerning first=192 second=318 amount=-1 +kerning first=192 second=316 amount=-1 +kerning first=192 second=314 amount=-1 +kerning first=192 second=311 amount=-1 +kerning first=192 second=291 amount=-1 +kerning first=192 second=290 amount=-1 +kerning first=192 second=289 amount=-1 +kerning first=192 second=288 amount=-1 +kerning first=192 second=287 amount=-1 +kerning first=192 second=286 amount=-1 +kerning first=192 second=284 amount=-1 +kerning first=192 second=268 amount=-1 +kerning first=192 second=266 amount=-1 +kerning first=192 second=264 amount=-1 +kerning first=192 second=262 amount=-1 +kerning first=192 second=255 amount=-1 +kerning first=192 second=254 amount=-1 +kerning first=192 second=253 amount=-1 +kerning first=192 second=252 amount=-1 +kerning first=192 second=251 amount=-1 +kerning first=192 second=250 amount=-1 +kerning first=192 second=249 amount=-1 +kerning first=90 second=287 amount=-1 +kerning first=192 second=221 amount=-2 +kerning first=90 second=289 amount=-1 +kerning first=192 second=220 amount=-1 +kerning first=90 second=291 amount=-1 +kerning first=192 second=219 amount=-1 +kerning first=192 second=218 amount=-1 +kerning first=192 second=217 amount=-1 +kerning first=192 second=216 amount=-1 +kerning first=192 second=214 amount=-1 +kerning first=192 second=213 amount=-1 +kerning first=192 second=212 amount=-1 +kerning first=192 second=211 amount=-1 +kerning first=192 second=210 amount=-1 +kerning first=192 second=199 amount=-1 +kerning first=192 second=171 amount=-1 +kerning first=192 second=121 amount=-1 +kerning first=192 second=119 amount=-1 +kerning first=192 second=118 amount=-1 +kerning first=192 second=117 amount=-1 +kerning first=192 second=115 amount=-1 +kerning first=192 second=112 amount=-1 +kerning first=192 second=108 amount=-1 +kerning first=192 second=107 amount=-1 +kerning first=192 second=104 amount=-1 +kerning first=192 second=103 amount=-1 +kerning first=192 second=98 amount=-1 +kerning first=192 second=89 amount=-2 +kerning first=192 second=87 amount=-2 +kerning first=192 second=86 amount=-2 +kerning first=192 second=85 amount=-1 +kerning first=192 second=84 amount=-2 +kerning first=192 second=83 amount=-1 +kerning first=90 second=347 amount=-1 +kerning first=192 second=81 amount=-1 +kerning first=90 second=351 amount=-1 +kerning first=192 second=79 amount=-1 +kerning first=90 second=353 amount=-1 +kerning first=90 second=354 amount=-1 +kerning first=192 second=71 amount=-1 +kerning first=90 second=356 amount=-1 +kerning first=90 second=361 amount=-1 +kerning first=90 second=363 amount=-1 +kerning first=90 second=365 amount=-1 +kerning first=90 second=367 amount=-1 +kerning first=90 second=369 amount=-1 +kerning first=90 second=374 amount=-1 +kerning first=90 second=375 amount=-1 +kerning first=192 second=67 amount=-1 +kerning first=90 second=378 amount=-1 +kerning first=192 second=45 amount=-1 +kerning first=90 second=380 amount=-1 +kerning first=187 second=382 amount=-2 +kerning first=90 second=382 amount=-1 +kerning first=187 second=381 amount=-1 +kerning first=187 second=380 amount=-2 +kerning first=187 second=379 amount=-1 +kerning first=187 second=378 amount=-2 +kerning first=187 second=377 amount=-1 +kerning first=187 second=375 amount=-1 +kerning first=187 second=374 amount=-1 +kerning first=187 second=370 amount=-1 +kerning first=187 second=368 amount=-1 +kerning first=187 second=366 amount=-1 +kerning first=187 second=364 amount=-1 +kerning first=187 second=362 amount=-1 +kerning first=187 second=356 amount=-1 +kerning first=187 second=354 amount=-1 +kerning first=187 second=352 amount=-1 +kerning first=187 second=350 amount=-1 +kerning first=187 second=346 amount=-1 +kerning first=187 second=345 amount=-1 +kerning first=187 second=344 amount=-2 +kerning first=187 second=331 amount=-1 +kerning first=187 second=330 amount=-2 +kerning first=187 second=328 amount=-1 +kerning first=187 second=327 amount=-2 +kerning first=90 second=8249 amount=-1 +kerning first=187 second=326 amount=-1 +kerning first=187 second=325 amount=-2 +kerning first=187 second=324 amount=-1 +kerning first=187 second=323 amount=-2 +kerning first=187 second=317 amount=-2 +kerning first=187 second=315 amount=-2 +kerning first=187 second=313 amount=-2 +kerning first=97 second=45 amount=-1 +kerning first=187 second=310 amount=-2 +kerning first=187 second=302 amount=-2 +kerning first=187 second=298 amount=-2 +kerning first=187 second=296 amount=-2 +kerning first=187 second=291 amount=-1 +kerning first=187 second=289 amount=-1 +kerning first=187 second=287 amount=-1 +kerning first=97 second=103 amount=-1 +kerning first=187 second=282 amount=-2 +kerning first=187 second=280 amount=-2 +kerning first=187 second=278 amount=-2 +kerning first=187 second=274 amount=-2 +kerning first=187 second=270 amount=-2 +kerning first=187 second=260 amount=-1 +kerning first=187 second=256 amount=-1 +kerning first=187 second=255 amount=-1 +kerning first=187 second=253 amount=-1 +kerning first=187 second=241 amount=-1 +kerning first=187 second=223 amount=-1 +kerning first=187 second=221 amount=-1 +kerning first=97 second=118 amount=-1 +kerning first=97 second=119 amount=-1 +kerning first=187 second=220 amount=-1 +kerning first=97 second=121 amount=-1 +kerning first=187 second=219 amount=-1 +kerning first=97 second=171 amount=-1 +kerning first=187 second=218 amount=-1 +kerning first=187 second=217 amount=-1 +kerning first=187 second=209 amount=-2 +kerning first=187 second=207 amount=-2 +kerning first=187 second=206 amount=-2 +kerning first=187 second=205 amount=-2 +kerning first=187 second=204 amount=-2 +kerning first=187 second=203 amount=-2 +kerning first=187 second=202 amount=-2 +kerning first=187 second=201 amount=-2 +kerning first=187 second=200 amount=-2 +kerning first=187 second=198 amount=-1 +kerning first=187 second=197 amount=-1 +kerning first=187 second=196 amount=-1 +kerning first=187 second=195 amount=-1 +kerning first=187 second=194 amount=-1 +kerning first=187 second=193 amount=-1 +kerning first=187 second=192 amount=-1 +kerning first=187 second=122 amount=-2 +kerning first=187 second=121 amount=-1 +kerning first=187 second=120 amount=-1 +kerning first=187 second=119 amount=-1 +kerning first=187 second=118 amount=-1 +kerning first=187 second=114 amount=-1 +kerning first=187 second=112 amount=-1 +kerning first=97 second=253 amount=-1 +kerning first=187 second=110 amount=-1 +kerning first=97 second=255 amount=-1 +kerning first=187 second=109 amount=-1 +kerning first=187 second=106 amount=-1 +kerning first=187 second=103 amount=-1 +kerning first=187 second=90 amount=-1 +kerning first=187 second=89 amount=-1 +kerning first=187 second=87 amount=-1 +kerning first=187 second=86 amount=-1 +kerning first=187 second=85 amount=-1 +kerning first=187 second=84 amount=-1 +kerning first=187 second=83 amount=-1 +kerning first=187 second=82 amount=-2 +kerning first=187 second=80 amount=-2 +kerning first=187 second=78 amount=-2 +kerning first=97 second=287 amount=-1 +kerning first=97 second=289 amount=-1 +kerning first=97 second=291 amount=-1 +kerning first=187 second=77 amount=-2 +kerning first=187 second=76 amount=-2 +kerning first=187 second=75 amount=-2 +kerning first=187 second=74 amount=-1 +kerning first=187 second=73 amount=-2 +kerning first=187 second=72 amount=-2 +kerning first=187 second=70 amount=-2 +kerning first=187 second=69 amount=-2 +kerning first=187 second=68 amount=-2 +kerning first=187 second=66 amount=-2 +kerning first=187 second=65 amount=-1 +kerning first=171 second=374 amount=-1 +kerning first=171 second=356 amount=-1 +kerning first=171 second=354 amount=-1 +kerning first=171 second=221 amount=-1 +kerning first=171 second=89 amount=-1 +kerning first=171 second=87 amount=-1 +kerning first=171 second=86 amount=-1 +kerning first=171 second=84 amount=-1 +kerning first=122 second=8249 amount=-1 +kerning first=122 second=382 amount=-1 +kerning first=122 second=380 amount=-1 +kerning first=122 second=378 amount=-1 +kerning first=122 second=375 amount=-1 +kerning first=122 second=371 amount=-1 +kerning first=97 second=375 amount=-1 +kerning first=122 second=369 amount=-1 +kerning first=122 second=367 amount=-1 +kerning first=122 second=365 amount=-1 +kerning first=122 second=363 amount=-1 +kerning first=122 second=361 amount=-1 +kerning first=122 second=353 amount=-1 +kerning first=122 second=351 amount=-1 +kerning first=122 second=347 amount=-1 +kerning first=122 second=331 amount=-1 +kerning first=122 second=328 amount=-1 +kerning first=122 second=326 amount=-1 +kerning first=122 second=324 amount=-1 +kerning first=122 second=318 amount=-1 +kerning first=122 second=316 amount=-1 +kerning first=122 second=314 amount=-1 +kerning first=97 second=8217 amount=-1 +kerning first=97 second=8220 amount=-1 +kerning first=97 second=8221 amount=-1 +kerning first=97 second=8249 amount=-1 +kerning first=122 second=311 amount=-1 +kerning first=122 second=305 amount=-1 +kerning first=122 second=291 amount=-1 +kerning first=122 second=289 amount=-1 +kerning first=122 second=287 amount=-1 +kerning first=98 second=44 amount=-1 +kerning first=98 second=46 amount=-1 +kerning first=122 second=255 amount=-1 +kerning first=122 second=253 amount=-1 +kerning first=122 second=252 amount=-1 +kerning first=98 second=103 amount=-1 +kerning first=122 second=251 amount=-1 +kerning first=122 second=250 amount=-1 +kerning first=98 second=106 amount=-1 +kerning first=122 second=249 amount=-1 +kerning first=98 second=108 amount=-1 +kerning first=122 second=241 amount=-1 +kerning first=122 second=171 amount=-1 +kerning first=122 second=122 amount=-1 +kerning first=122 second=121 amount=-1 +kerning first=98 second=115 amount=-1 +kerning first=122 second=119 amount=-1 +kerning first=122 second=118 amount=-1 +kerning first=98 second=118 amount=-1 +kerning first=98 second=119 amount=-1 +kerning first=98 second=120 amount=-1 +kerning first=98 second=121 amount=-1 +kerning first=98 second=122 amount=-1 +kerning first=98 second=187 amount=-1 +kerning first=122 second=117 amount=-1 +kerning first=122 second=115 amount=-1 +kerning first=122 second=112 amount=-1 +kerning first=122 second=110 amount=-1 +kerning first=122 second=109 amount=-1 +kerning first=122 second=108 amount=-1 +kerning first=122 second=107 amount=-1 +kerning first=122 second=106 amount=-1 +kerning first=122 second=104 amount=-1 +kerning first=122 second=103 amount=-1 +kerning first=122 second=102 amount=-1 +kerning first=122 second=45 amount=-1 +kerning first=121 second=8249 amount=-1 +kerning first=121 second=382 amount=-1 +kerning first=98 second=253 amount=-1 +kerning first=121 second=380 amount=-1 +kerning first=98 second=255 amount=-1 +kerning first=121 second=378 amount=-1 +kerning first=121 second=353 amount=-1 +kerning first=121 second=351 amount=-1 +kerning first=98 second=287 amount=-1 +kerning first=98 second=289 amount=-1 +kerning first=98 second=291 amount=-1 +kerning first=121 second=347 amount=-1 +kerning first=121 second=339 amount=-1 +kerning first=121 second=337 amount=-1 +kerning first=121 second=335 amount=-1 +kerning first=98 second=314 amount=-1 +kerning first=98 second=316 amount=-1 +kerning first=98 second=318 amount=-1 +kerning first=121 second=333 amount=-1 +kerning first=121 second=331 amount=-1 +kerning first=121 second=328 amount=-1 +kerning first=121 second=326 amount=-1 +kerning first=121 second=324 amount=-1 +kerning first=98 second=347 amount=-1 +kerning first=98 second=351 amount=-1 +kerning first=98 second=353 amount=-1 +kerning first=121 second=318 amount=-1 +kerning first=121 second=316 amount=-1 +kerning first=121 second=314 amount=-1 +kerning first=121 second=307 amount=-1 +kerning first=121 second=305 amount=-1 +kerning first=121 second=303 amount=-1 +kerning first=121 second=291 amount=-1 +kerning first=98 second=375 amount=-1 +kerning first=98 second=378 amount=-1 +kerning first=98 second=380 amount=-1 +kerning first=98 second=382 amount=-1 +kerning first=121 second=289 amount=-1 +kerning first=121 second=287 amount=-1 +kerning first=121 second=283 amount=-1 +kerning first=121 second=281 amount=-1 +kerning first=121 second=279 amount=-1 +kerning first=121 second=277 amount=-1 +kerning first=121 second=275 amount=-1 +kerning first=121 second=273 amount=-1 +kerning first=121 second=271 amount=-1 +kerning first=121 second=269 amount=-1 +kerning first=121 second=267 amount=-1 +kerning first=98 second=8217 amount=-1 +kerning first=98 second=8220 amount=-1 +kerning first=98 second=8221 amount=-1 +kerning first=98 second=8250 amount=-1 +kerning first=121 second=263 amount=-1 +kerning first=121 second=261 amount=-1 +kerning first=121 second=259 amount=-1 +kerning first=121 second=257 amount=-1 +kerning first=121 second=248 amount=-1 +kerning first=99 second=44 amount=-1 +kerning first=99 second=45 amount=-1 +kerning first=99 second=46 amount=-1 +kerning first=99 second=97 amount=-1 +kerning first=99 second=98 amount=-1 +kerning first=121 second=246 amount=-1 +kerning first=121 second=245 amount=-1 +kerning first=121 second=244 amount=-1 +kerning first=99 second=102 amount=-1 +kerning first=99 second=103 amount=-1 +kerning first=99 second=104 amount=-1 +kerning first=99 second=105 amount=-1 +kerning first=99 second=106 amount=-1 +kerning first=99 second=107 amount=-1 +kerning first=99 second=108 amount=-1 +kerning first=121 second=243 amount=-1 +kerning first=121 second=242 amount=-1 +kerning first=121 second=241 amount=-1 +kerning first=121 second=240 amount=-1 +kerning first=121 second=237 amount=-1 +kerning first=121 second=235 amount=-1 +kerning first=121 second=234 amount=-1 +kerning first=121 second=233 amount=-1 +kerning first=99 second=117 amount=-1 +kerning first=99 second=118 amount=-1 +kerning first=99 second=119 amount=-1 +kerning first=99 second=120 amount=-1 +kerning first=99 second=121 amount=-1 +kerning first=99 second=122 amount=-1 +kerning first=99 second=171 amount=-1 +kerning first=121 second=232 amount=-1 +kerning first=99 second=224 amount=-1 +kerning first=99 second=225 amount=-1 +kerning first=99 second=226 amount=-1 +kerning first=99 second=227 amount=-1 +kerning first=99 second=228 amount=-1 +kerning first=99 second=229 amount=-1 +kerning first=99 second=230 amount=-1 +kerning first=121 second=231 amount=-1 +kerning first=121 second=230 amount=-1 +kerning first=121 second=229 amount=-1 +kerning first=121 second=228 amount=-1 +kerning first=121 second=227 amount=-1 +kerning first=99 second=237 amount=-1 +kerning first=121 second=226 amount=-1 +kerning first=121 second=225 amount=-1 +kerning first=121 second=224 amount=-1 +kerning first=121 second=171 amount=-1 +kerning first=121 second=122 amount=-1 +kerning first=121 second=115 amount=-1 +kerning first=121 second=113 amount=-1 +kerning first=121 second=112 amount=-1 +kerning first=99 second=249 amount=-1 +kerning first=99 second=250 amount=-1 +kerning first=99 second=251 amount=-1 +kerning first=99 second=252 amount=-1 +kerning first=99 second=253 amount=-1 +kerning first=99 second=254 amount=-1 +kerning first=99 second=255 amount=-1 +kerning first=99 second=257 amount=-1 +kerning first=99 second=259 amount=-1 +kerning first=99 second=261 amount=-1 +kerning first=121 second=111 amount=-1 +kerning first=121 second=110 amount=-1 +kerning first=121 second=109 amount=-1 +kerning first=121 second=108 amount=-1 +kerning first=121 second=106 amount=-1 +kerning first=121 second=105 amount=-1 +kerning first=121 second=103 amount=-1 +kerning first=121 second=101 amount=-1 +kerning first=121 second=100 amount=-1 +kerning first=121 second=99 amount=-1 +kerning first=99 second=287 amount=-1 +kerning first=99 second=289 amount=-1 +kerning first=99 second=291 amount=-1 +kerning first=99 second=303 amount=-1 +kerning first=121 second=97 amount=-1 +kerning first=99 second=307 amount=-1 +kerning first=99 second=311 amount=-1 +kerning first=99 second=314 amount=-1 +kerning first=99 second=316 amount=-1 +kerning first=99 second=318 amount=-1 +kerning first=121 second=46 amount=-2 +kerning first=121 second=45 amount=-1 +kerning first=121 second=44 amount=-2 +kerning first=120 second=8249 amount=-1 +kerning first=120 second=8221 amount=-1 +kerning first=120 second=8220 amount=-1 +kerning first=120 second=8217 amount=-1 +kerning first=120 second=382 amount=-1 +kerning first=120 second=380 amount=-1 +kerning first=120 second=378 amount=-1 +kerning first=120 second=375 amount=-1 +kerning first=120 second=371 amount=-1 +kerning first=120 second=369 amount=-1 +kerning first=99 second=361 amount=-1 +kerning first=99 second=363 amount=-1 +kerning first=99 second=365 amount=-1 +kerning first=99 second=367 amount=-1 +kerning first=99 second=369 amount=-1 +kerning first=99 second=371 amount=-1 +kerning first=99 second=375 amount=-1 +kerning first=99 second=378 amount=-1 +kerning first=99 second=380 amount=-1 +kerning first=99 second=382 amount=-1 +kerning first=120 second=367 amount=-1 +kerning first=120 second=365 amount=-1 +kerning first=120 second=363 amount=-1 +kerning first=120 second=361 amount=-1 +kerning first=120 second=353 amount=-1 +kerning first=120 second=351 amount=-1 +kerning first=120 second=347 amount=-1 +kerning first=120 second=339 amount=-1 +kerning first=120 second=337 amount=-1 +kerning first=120 second=335 amount=-1 +kerning first=120 second=333 amount=-1 +kerning first=120 second=291 amount=-1 +kerning first=120 second=289 amount=-1 +kerning first=99 second=8217 amount=-1 +kerning first=99 second=8220 amount=-1 +kerning first=99 second=8221 amount=-1 +kerning first=99 second=8249 amount=-1 +kerning first=120 second=287 amount=-1 +kerning first=120 second=283 amount=-1 +kerning first=120 second=281 amount=-1 +kerning first=120 second=279 amount=-1 +kerning first=120 second=277 amount=-1 +kerning first=100 second=45 amount=-1 +kerning first=120 second=275 amount=-1 +kerning first=120 second=273 amount=-1 +kerning first=120 second=271 amount=-1 +kerning first=120 second=269 amount=-1 +kerning first=120 second=267 amount=-1 +kerning first=120 second=263 amount=-1 +kerning first=100 second=103 amount=-1 +kerning first=120 second=261 amount=-1 +kerning first=120 second=259 amount=-1 +kerning first=120 second=257 amount=-1 +kerning first=120 second=255 amount=-1 +kerning first=120 second=254 amount=-1 +kerning first=120 second=253 amount=-1 +kerning first=120 second=252 amount=-1 +kerning first=120 second=251 amount=-1 +kerning first=120 second=250 amount=-1 +kerning first=120 second=249 amount=-1 +kerning first=120 second=248 amount=-1 +kerning first=120 second=246 amount=-1 +kerning first=120 second=245 amount=-1 +kerning first=100 second=118 amount=-1 +kerning first=100 second=119 amount=-1 +kerning first=120 second=244 amount=-1 +kerning first=100 second=121 amount=-1 +kerning first=120 second=243 amount=-1 +kerning first=100 second=171 amount=-1 +kerning first=120 second=242 amount=-1 +kerning first=120 second=240 amount=-1 +kerning first=120 second=235 amount=-1 +kerning first=120 second=234 amount=-1 +kerning first=120 second=233 amount=-1 +kerning first=120 second=232 amount=-1 +kerning first=120 second=231 amount=-1 +kerning first=120 second=230 amount=-1 +kerning first=120 second=229 amount=-1 +kerning first=120 second=228 amount=-1 +kerning first=120 second=227 amount=-1 +kerning first=120 second=226 amount=-1 +kerning first=120 second=225 amount=-1 +kerning first=120 second=224 amount=-1 +kerning first=120 second=171 amount=-1 +kerning first=120 second=122 amount=-1 +kerning first=120 second=121 amount=-1 +kerning first=120 second=119 amount=-1 +kerning first=120 second=118 amount=-1 +kerning first=120 second=117 amount=-1 +kerning first=120 second=115 amount=-1 +kerning first=120 second=113 amount=-1 +kerning first=120 second=112 amount=-1 +kerning first=120 second=111 amount=-1 +kerning first=120 second=103 amount=-1 +kerning first=100 second=253 amount=-1 +kerning first=120 second=101 amount=-1 +kerning first=100 second=255 amount=-1 +kerning first=120 second=100 amount=-1 +kerning first=120 second=99 amount=-1 +kerning first=120 second=98 amount=-1 +kerning first=120 second=97 amount=-1 +kerning first=120 second=45 amount=-1 +kerning first=119 second=8249 amount=-1 +kerning first=119 second=382 amount=-1 +kerning first=119 second=380 amount=-1 +kerning first=119 second=378 amount=-1 +kerning first=119 second=353 amount=-1 +kerning first=119 second=351 amount=-1 +kerning first=119 second=347 amount=-1 +kerning first=119 second=339 amount=-1 +kerning first=100 second=287 amount=-1 +kerning first=100 second=289 amount=-1 +kerning first=100 second=291 amount=-1 +kerning first=119 second=337 amount=-1 +kerning first=119 second=335 amount=-1 +kerning first=119 second=333 amount=-1 +kerning first=119 second=331 amount=-1 +kerning first=119 second=328 amount=-1 +kerning first=119 second=326 amount=-1 +kerning first=119 second=324 amount=-1 +kerning first=119 second=318 amount=-1 +kerning first=119 second=316 amount=-1 +kerning first=119 second=314 amount=-1 +kerning first=119 second=307 amount=-1 +kerning first=119 second=305 amount=-1 +kerning first=119 second=303 amount=-1 +kerning first=119 second=291 amount=-1 +kerning first=119 second=289 amount=-1 +kerning first=119 second=287 amount=-1 +kerning first=119 second=283 amount=-1 +kerning first=119 second=281 amount=-1 +kerning first=119 second=279 amount=-1 +kerning first=119 second=277 amount=-1 +kerning first=119 second=275 amount=-1 +kerning first=119 second=273 amount=-1 +kerning first=119 second=271 amount=-1 +kerning first=119 second=269 amount=-1 +kerning first=119 second=267 amount=-1 +kerning first=100 second=375 amount=-1 +kerning first=119 second=263 amount=-1 +kerning first=119 second=261 amount=-1 +kerning first=119 second=259 amount=-1 +kerning first=119 second=257 amount=-1 +kerning first=119 second=248 amount=-1 +kerning first=119 second=246 amount=-1 +kerning first=119 second=245 amount=-1 +kerning first=119 second=244 amount=-1 +kerning first=119 second=243 amount=-1 +kerning first=119 second=242 amount=-1 +kerning first=119 second=241 amount=-1 +kerning first=119 second=240 amount=-1 +kerning first=119 second=237 amount=-1 +kerning first=119 second=235 amount=-1 +kerning first=119 second=234 amount=-1 +kerning first=119 second=233 amount=-1 +kerning first=100 second=8217 amount=-1 +kerning first=100 second=8220 amount=-1 +kerning first=100 second=8221 amount=-1 +kerning first=100 second=8249 amount=-1 +kerning first=119 second=232 amount=-1 +kerning first=119 second=231 amount=-1 +kerning first=119 second=230 amount=-1 +kerning first=119 second=229 amount=-1 +kerning first=119 second=228 amount=-1 +kerning first=101 second=44 amount=-1 +kerning first=101 second=46 amount=-1 +kerning first=101 second=97 amount=-1 +kerning first=101 second=98 amount=-1 +kerning first=119 second=227 amount=-1 +kerning first=119 second=226 amount=-1 +kerning first=119 second=225 amount=-1 +kerning first=101 second=102 amount=-1 +kerning first=101 second=103 amount=-1 +kerning first=101 second=104 amount=-1 +kerning first=101 second=105 amount=-1 +kerning first=101 second=106 amount=-1 +kerning first=101 second=107 amount=-1 +kerning first=101 second=108 amount=-1 +kerning first=119 second=224 amount=-1 +kerning first=119 second=171 amount=-1 +kerning first=119 second=122 amount=-1 +kerning first=119 second=115 amount=-1 +kerning first=119 second=113 amount=-1 +kerning first=119 second=112 amount=-1 +kerning first=119 second=111 amount=-1 +kerning first=119 second=110 amount=-1 +kerning first=101 second=117 amount=-1 +kerning first=101 second=118 amount=-1 +kerning first=101 second=119 amount=-1 +kerning first=101 second=120 amount=-1 +kerning first=101 second=121 amount=-1 +kerning first=101 second=122 amount=-1 +kerning first=101 second=187 amount=-1 +kerning first=119 second=109 amount=-1 +kerning first=101 second=224 amount=-1 +kerning first=101 second=225 amount=-1 +kerning first=101 second=226 amount=-1 +kerning first=101 second=227 amount=-1 +kerning first=101 second=228 amount=-1 +kerning first=101 second=229 amount=-1 +kerning first=101 second=230 amount=-1 +kerning first=119 second=108 amount=-1 +kerning first=119 second=106 amount=-1 +kerning first=119 second=105 amount=-1 +kerning first=119 second=103 amount=-1 +kerning first=119 second=101 amount=-1 +kerning first=101 second=237 amount=-1 +kerning first=119 second=100 amount=-1 +kerning first=119 second=99 amount=-1 +kerning first=119 second=97 amount=-1 +kerning first=119 second=46 amount=-2 +kerning first=119 second=45 amount=-1 +kerning first=119 second=44 amount=-2 +kerning first=118 second=8249 amount=-1 +kerning first=118 second=382 amount=-1 +kerning first=101 second=249 amount=-1 +kerning first=101 second=250 amount=-1 +kerning first=101 second=251 amount=-1 +kerning first=101 second=252 amount=-1 +kerning first=101 second=253 amount=-1 +kerning first=101 second=254 amount=-1 +kerning first=101 second=255 amount=-1 +kerning first=101 second=257 amount=-1 +kerning first=101 second=259 amount=-1 +kerning first=101 second=261 amount=-1 +kerning first=118 second=380 amount=-1 +kerning first=118 second=378 amount=-1 +kerning first=118 second=353 amount=-1 +kerning first=118 second=351 amount=-1 +kerning first=118 second=347 amount=-1 +kerning first=118 second=339 amount=-1 +kerning first=118 second=337 amount=-1 +kerning first=118 second=335 amount=-1 +kerning first=118 second=333 amount=-1 +kerning first=118 second=331 amount=-1 +kerning first=101 second=287 amount=-1 +kerning first=101 second=289 amount=-1 +kerning first=101 second=291 amount=-1 +kerning first=101 second=303 amount=-1 +kerning first=118 second=328 amount=-1 +kerning first=101 second=307 amount=-1 +kerning first=101 second=311 amount=-1 +kerning first=101 second=314 amount=-1 +kerning first=101 second=316 amount=-1 +kerning first=101 second=318 amount=-1 +kerning first=118 second=326 amount=-1 +kerning first=118 second=324 amount=-1 +kerning first=118 second=318 amount=-1 +kerning first=118 second=316 amount=-1 +kerning first=118 second=314 amount=-1 +kerning first=118 second=307 amount=-1 +kerning first=118 second=305 amount=-1 +kerning first=118 second=303 amount=-1 +kerning first=118 second=291 amount=-1 +kerning first=118 second=289 amount=-1 +kerning first=118 second=287 amount=-1 +kerning first=118 second=283 amount=-1 +kerning first=118 second=281 amount=-1 +kerning first=101 second=361 amount=-1 +kerning first=101 second=363 amount=-1 +kerning first=101 second=365 amount=-1 +kerning first=101 second=367 amount=-1 +kerning first=101 second=369 amount=-1 +kerning first=101 second=371 amount=-1 +kerning first=101 second=375 amount=-1 +kerning first=101 second=378 amount=-1 +kerning first=101 second=380 amount=-1 +kerning first=101 second=382 amount=-1 +kerning first=118 second=279 amount=-1 +kerning first=118 second=277 amount=-1 +kerning first=118 second=275 amount=-1 +kerning first=118 second=273 amount=-1 +kerning first=118 second=271 amount=-1 +kerning first=118 second=269 amount=-1 +kerning first=118 second=267 amount=-1 +kerning first=118 second=263 amount=-1 +kerning first=118 second=261 amount=-1 +kerning first=118 second=259 amount=-1 +kerning first=118 second=257 amount=-1 +kerning first=118 second=248 amount=-1 +kerning first=118 second=246 amount=-1 +kerning first=101 second=8217 amount=-1 +kerning first=101 second=8220 amount=-1 +kerning first=101 second=8221 amount=-1 +kerning first=101 second=8250 amount=-1 +kerning first=118 second=245 amount=-1 +kerning first=118 second=244 amount=-1 +kerning first=118 second=243 amount=-1 +kerning first=118 second=242 amount=-1 +kerning first=118 second=241 amount=-1 +kerning first=118 second=240 amount=-1 +kerning first=102 second=45 amount=-1 +kerning first=118 second=237 amount=-1 +kerning first=102 second=97 amount=-1 +kerning first=102 second=98 amount=1 +kerning first=118 second=235 amount=-1 +kerning first=118 second=234 amount=-1 +kerning first=118 second=233 amount=-1 +kerning first=118 second=232 amount=-1 +kerning first=102 second=103 amount=-1 +kerning first=102 second=104 amount=1 +kerning first=118 second=231 amount=-1 +kerning first=102 second=107 amount=1 +kerning first=102 second=108 amount=1 +kerning first=118 second=230 amount=-1 +kerning first=118 second=229 amount=-1 +kerning first=118 second=228 amount=-1 +kerning first=118 second=227 amount=-1 +kerning first=118 second=226 amount=-1 +kerning first=102 second=115 amount=-1 +kerning first=118 second=225 amount=-1 +kerning first=118 second=224 amount=-1 +kerning first=118 second=171 amount=-1 +kerning first=118 second=122 amount=-1 +kerning first=118 second=115 amount=-1 +kerning first=102 second=171 amount=-1 +kerning first=118 second=113 amount=-1 +kerning first=102 second=225 amount=-1 +kerning first=102 second=226 amount=-1 +kerning first=102 second=227 amount=-1 +kerning first=102 second=229 amount=-1 +kerning first=102 second=230 amount=-1 +kerning first=118 second=112 amount=-1 +kerning first=118 second=111 amount=-1 +kerning first=118 second=110 amount=-1 +kerning first=118 second=109 amount=-1 +kerning first=118 second=108 amount=-1 +kerning first=118 second=106 amount=-1 +kerning first=118 second=105 amount=-1 +kerning first=118 second=103 amount=-1 +kerning first=118 second=101 amount=-1 +kerning first=118 second=100 amount=-1 +kerning first=118 second=99 amount=-1 +kerning first=118 second=97 amount=-1 +kerning first=102 second=254 amount=1 +kerning first=118 second=46 amount=-2 +kerning first=102 second=257 amount=-1 +kerning first=102 second=259 amount=-1 +kerning first=102 second=261 amount=-1 +kerning first=118 second=45 amount=-1 +kerning first=118 second=44 amount=-2 +kerning first=117 second=8249 amount=-1 +kerning first=117 second=8221 amount=-1 +kerning first=117 second=8220 amount=-1 +kerning first=117 second=8217 amount=-1 +kerning first=117 second=382 amount=-1 +kerning first=117 second=380 amount=-1 +kerning first=117 second=378 amount=-1 +kerning first=117 second=375 amount=-1 +kerning first=102 second=287 amount=-1 +kerning first=102 second=289 amount=-1 +kerning first=102 second=291 amount=-1 +kerning first=117 second=353 amount=-1 +kerning first=102 second=311 amount=1 +kerning first=102 second=314 amount=1 +kerning first=102 second=316 amount=1 +kerning first=102 second=318 amount=1 +kerning first=117 second=351 amount=-1 +kerning first=117 second=347 amount=-1 +kerning first=117 second=318 amount=-1 +kerning first=117 second=316 amount=-1 +kerning first=117 second=314 amount=-1 +kerning first=117 second=291 amount=-1 +kerning first=117 second=289 amount=-1 +kerning first=117 second=287 amount=-1 +kerning first=117 second=255 amount=-1 +kerning first=102 second=347 amount=-1 +kerning first=102 second=351 amount=-1 +kerning first=102 second=353 amount=-1 +kerning first=117 second=254 amount=-1 +kerning first=117 second=253 amount=-1 +kerning first=117 second=171 amount=-1 +kerning first=117 second=122 amount=-1 +kerning first=117 second=121 amount=-1 +kerning first=117 second=120 amount=-1 +kerning first=117 second=119 amount=-1 +kerning first=117 second=118 amount=-1 +kerning first=117 second=115 amount=-1 +kerning first=117 second=112 amount=-1 +kerning first=117 second=108 amount=-1 +kerning first=117 second=106 amount=-1 +kerning first=117 second=103 amount=-1 +kerning first=117 second=98 amount=-1 +kerning first=117 second=46 amount=-1 +kerning first=117 second=45 amount=-1 +kerning first=117 second=44 amount=-1 +kerning first=116 second=291 amount=-1 +kerning first=116 second=289 amount=-1 +kerning first=116 second=287 amount=-1 +kerning first=116 second=103 amount=-1 +kerning first=115 second=8221 amount=-1 +kerning first=115 second=8220 amount=-1 +kerning first=102 second=8217 amount=1 +kerning first=102 second=8220 amount=1 +kerning first=102 second=8221 amount=1 +kerning first=102 second=8249 amount=-1 +kerning first=115 second=8217 amount=-1 +kerning first=115 second=382 amount=-1 +kerning first=115 second=380 amount=-1 +kerning first=115 second=378 amount=-1 +kerning first=115 second=375 amount=-1 +kerning first=103 second=44 amount=-1 +kerning first=103 second=45 amount=-1 +kerning first=103 second=46 amount=-1 +kerning first=103 second=97 amount=-1 +kerning first=115 second=353 amount=-1 +kerning first=115 second=351 amount=-1 +kerning first=115 second=347 amount=-1 +kerning first=115 second=307 amount=-1 +kerning first=115 second=303 amount=-1 +kerning first=103 second=103 amount=-1 +kerning first=103 second=104 amount=-1 +kerning first=103 second=105 amount=-1 +kerning first=103 second=107 amount=-1 +kerning first=103 second=108 amount=-1 +kerning first=115 second=291 amount=-1 +kerning first=115 second=289 amount=-1 +kerning first=115 second=287 amount=-1 +kerning first=115 second=255 amount=-1 +kerning first=115 second=254 amount=-1 +kerning first=115 second=253 amount=-1 +kerning first=103 second=115 amount=-1 +kerning first=115 second=237 amount=-1 +kerning first=115 second=122 amount=-1 +kerning first=115 second=121 amount=-1 +kerning first=115 second=120 amount=-1 +kerning first=103 second=120 amount=-1 +kerning first=115 second=119 amount=-1 +kerning first=103 second=122 amount=-1 +kerning first=103 second=171 amount=-1 +kerning first=115 second=118 amount=-1 +kerning first=103 second=224 amount=-1 +kerning first=103 second=225 amount=-1 +kerning first=103 second=226 amount=-1 +kerning first=103 second=227 amount=-1 +kerning first=103 second=228 amount=-1 +kerning first=103 second=229 amount=-1 +kerning first=103 second=230 amount=-1 +kerning first=115 second=115 amount=-1 +kerning first=115 second=112 amount=-1 +kerning first=115 second=105 amount=-1 +kerning first=115 second=103 amount=-1 +kerning first=115 second=102 amount=-1 +kerning first=103 second=237 amount=-1 +kerning first=115 second=98 amount=-1 +kerning first=115 second=46 amount=-1 +kerning first=115 second=44 amount=-1 +kerning first=114 second=291 amount=-1 +kerning first=114 second=289 amount=-1 +kerning first=114 second=287 amount=-1 +kerning first=114 second=103 amount=-1 +kerning first=114 second=46 amount=-1 +kerning first=114 second=44 amount=-1 +kerning first=113 second=8249 amount=-1 +kerning first=113 second=8221 amount=-1 +kerning first=113 second=8220 amount=-1 +kerning first=113 second=8217 amount=-1 +kerning first=113 second=382 amount=-1 +kerning first=113 second=380 amount=-1 +kerning first=103 second=257 amount=-1 +kerning first=103 second=259 amount=-1 +kerning first=103 second=261 amount=-1 +kerning first=113 second=378 amount=-1 +kerning first=113 second=371 amount=-1 +kerning first=113 second=369 amount=-1 +kerning first=113 second=367 amount=-1 +kerning first=113 second=365 amount=-1 +kerning first=113 second=363 amount=-1 +kerning first=113 second=361 amount=-1 +kerning first=113 second=353 amount=-1 +kerning first=113 second=351 amount=-1 +kerning first=113 second=347 amount=-1 +kerning first=103 second=287 amount=-1 +kerning first=103 second=289 amount=-1 +kerning first=103 second=291 amount=-1 +kerning first=103 second=303 amount=-1 +kerning first=113 second=331 amount=-1 +kerning first=103 second=307 amount=-1 +kerning first=103 second=311 amount=-1 +kerning first=103 second=314 amount=-1 +kerning first=103 second=316 amount=-1 +kerning first=103 second=318 amount=-1 +kerning first=113 second=328 amount=-1 +kerning first=113 second=326 amount=-1 +kerning first=113 second=324 amount=-1 +kerning first=113 second=318 amount=-1 +kerning first=113 second=316 amount=-1 +kerning first=113 second=314 amount=-1 +kerning first=113 second=311 amount=-1 +kerning first=113 second=305 amount=-1 +kerning first=113 second=261 amount=-1 +kerning first=103 second=347 amount=-1 +kerning first=103 second=351 amount=-1 +kerning first=103 second=353 amount=-1 +kerning first=113 second=259 amount=-1 +kerning first=113 second=257 amount=-1 +kerning first=113 second=254 amount=-1 +kerning first=113 second=252 amount=-1 +kerning first=113 second=251 amount=-1 +kerning first=113 second=250 amount=-1 +kerning first=113 second=249 amount=-1 +kerning first=113 second=241 amount=-1 +kerning first=103 second=378 amount=-1 +kerning first=103 second=380 amount=-1 +kerning first=103 second=382 amount=-1 +kerning first=113 second=230 amount=-1 +kerning first=113 second=229 amount=-1 +kerning first=113 second=228 amount=-1 +kerning first=113 second=227 amount=-1 +kerning first=113 second=226 amount=-1 +kerning first=113 second=225 amount=-1 +kerning first=113 second=224 amount=-1 +kerning first=113 second=171 amount=-1 +kerning first=113 second=122 amount=-1 +kerning first=113 second=119 amount=-1 +kerning first=113 second=118 amount=-1 +kerning first=113 second=117 amount=-1 +kerning first=113 second=115 amount=-1 +kerning first=103 second=8249 amount=-1 +kerning first=113 second=110 amount=-1 +kerning first=113 second=109 amount=-1 +kerning first=113 second=108 amount=-1 +kerning first=113 second=107 amount=-1 +kerning first=113 second=106 amount=1 +kerning first=113 second=104 amount=-1 +kerning first=104 second=45 amount=-1 +kerning first=113 second=102 amount=-1 +kerning first=113 second=98 amount=-1 +kerning first=104 second=98 amount=-1 +kerning first=113 second=97 amount=-1 +kerning first=113 second=46 amount=-1 +kerning first=113 second=45 amount=-1 +kerning first=113 second=44 amount=-1 +kerning first=104 second=103 amount=-1 +kerning first=112 second=8250 amount=-1 +kerning first=104 second=106 amount=-1 +kerning first=112 second=8221 amount=-1 +kerning first=112 second=8220 amount=-1 +kerning first=112 second=8217 amount=-1 +kerning first=112 second=382 amount=-1 +kerning first=112 second=380 amount=-1 +kerning first=112 second=378 amount=-1 +kerning first=112 second=375 amount=-1 +kerning first=112 second=353 amount=-1 +kerning first=104 second=118 amount=-1 +kerning first=104 second=119 amount=-1 +kerning first=112 second=351 amount=-1 +kerning first=104 second=121 amount=-1 +kerning first=112 second=347 amount=-1 +kerning first=104 second=171 amount=-1 +kerning first=112 second=318 amount=-1 +kerning first=112 second=316 amount=-1 +kerning first=112 second=314 amount=-1 +kerning first=112 second=291 amount=-1 +kerning first=112 second=289 amount=-1 +kerning first=112 second=287 amount=-1 +kerning first=112 second=255 amount=-1 +kerning first=112 second=253 amount=-1 +kerning first=112 second=187 amount=-1 +kerning first=112 second=122 amount=-1 +kerning first=112 second=121 amount=-1 +kerning first=112 second=120 amount=-1 +kerning first=112 second=119 amount=-1 +kerning first=112 second=118 amount=-1 +kerning first=112 second=115 amount=-1 +kerning first=112 second=108 amount=-1 +kerning first=112 second=106 amount=-1 +kerning first=112 second=103 amount=-1 +kerning first=112 second=46 amount=-1 +kerning first=112 second=44 amount=-1 +kerning first=111 second=8250 amount=-1 +kerning first=111 second=8221 amount=-1 +kerning first=111 second=8220 amount=-1 +kerning first=111 second=8217 amount=-1 +kerning first=111 second=382 amount=-1 +kerning first=104 second=253 amount=-1 +kerning first=104 second=254 amount=-1 +kerning first=104 second=255 amount=-1 +kerning first=111 second=380 amount=-1 +kerning first=111 second=378 amount=-1 +kerning first=111 second=375 amount=-1 +kerning first=111 second=353 amount=-1 +kerning first=111 second=351 amount=-1 +kerning first=111 second=347 amount=-1 +kerning first=111 second=318 amount=-1 +kerning first=111 second=316 amount=-1 +kerning first=111 second=314 amount=-1 +kerning first=111 second=291 amount=-1 +kerning first=111 second=289 amount=-1 +kerning first=111 second=287 amount=-1 +kerning first=111 second=255 amount=-1 +kerning first=104 second=287 amount=-1 +kerning first=104 second=289 amount=-1 +kerning first=104 second=291 amount=-1 +kerning first=111 second=253 amount=-1 +kerning first=111 second=187 amount=-1 +kerning first=111 second=122 amount=-1 +kerning first=111 second=121 amount=-1 +kerning first=111 second=120 amount=-1 +kerning first=111 second=119 amount=-1 +kerning first=111 second=118 amount=-1 +kerning first=111 second=115 amount=-1 +kerning first=111 second=108 amount=-1 +kerning first=111 second=106 amount=-1 +kerning first=111 second=103 amount=-1 +kerning first=111 second=46 amount=-1 +kerning first=111 second=44 amount=-1 +kerning first=110 second=8249 amount=-1 +kerning first=110 second=8221 amount=-1 +kerning first=110 second=8220 amount=-1 +kerning first=110 second=8217 amount=-1 +kerning first=110 second=375 amount=-1 +kerning first=110 second=291 amount=-1 +kerning first=110 second=289 amount=-1 +kerning first=110 second=287 amount=-1 +kerning first=110 second=255 amount=-1 +kerning first=110 second=254 amount=-1 +kerning first=104 second=375 amount=-1 +kerning first=110 second=253 amount=-1 +kerning first=110 second=171 amount=-1 +kerning first=110 second=121 amount=-1 +kerning first=110 second=119 amount=-1 +kerning first=110 second=118 amount=-1 +kerning first=110 second=106 amount=-1 +kerning first=110 second=103 amount=-1 +kerning first=110 second=98 amount=-1 +kerning first=110 second=45 amount=-1 +kerning first=109 second=8249 amount=-1 +kerning first=109 second=8221 amount=-1 +kerning first=109 second=8220 amount=-1 +kerning first=109 second=8217 amount=-1 +kerning first=104 second=8217 amount=-1 +kerning first=104 second=8220 amount=-1 +kerning first=104 second=8221 amount=-1 +kerning first=104 second=8249 amount=-1 +kerning first=109 second=375 amount=-1 +kerning first=109 second=291 amount=-1 +kerning first=109 second=289 amount=-1 +kerning first=109 second=287 amount=-1 +kerning first=109 second=255 amount=-1 +kerning first=105 second=44 amount=-1 +kerning first=105 second=45 amount=-1 +kerning first=105 second=46 amount=-1 +kerning first=105 second=97 amount=-1 +kerning first=109 second=254 amount=-1 +kerning first=109 second=253 amount=-1 +kerning first=109 second=171 amount=-1 +kerning first=109 second=121 amount=-1 +kerning first=109 second=119 amount=-1 +kerning first=105 second=103 amount=-1 +kerning first=109 second=118 amount=-1 +kerning first=109 second=106 amount=-1 +kerning first=105 second=106 amount=-1 +kerning first=109 second=103 amount=-1 +kerning first=105 second=108 amount=-1 +kerning first=109 second=98 amount=-1 +kerning first=109 second=45 amount=-1 +kerning first=108 second=8249 amount=-1 +kerning first=108 second=8221 amount=-1 +kerning first=108 second=8220 amount=-1 +kerning first=108 second=8217 amount=-1 +kerning first=105 second=115 amount=-1 +kerning first=108 second=375 amount=-1 +kerning first=108 second=371 amount=-1 +kerning first=105 second=118 amount=-1 +kerning first=105 second=119 amount=-1 +kerning first=108 second=369 amount=-1 +kerning first=105 second=121 amount=-1 +kerning first=108 second=367 amount=-1 +kerning first=105 second=171 amount=-1 +kerning first=108 second=365 amount=-1 +kerning first=105 second=224 amount=-1 +kerning first=105 second=225 amount=-1 +kerning first=105 second=226 amount=-1 +kerning first=105 second=227 amount=-1 +kerning first=105 second=228 amount=-1 +kerning first=105 second=229 amount=-1 +kerning first=105 second=230 amount=-1 +kerning first=108 second=363 amount=-1 +kerning first=108 second=361 amount=-1 +kerning first=108 second=291 amount=-1 +kerning first=108 second=289 amount=-1 +kerning first=108 second=287 amount=-1 +kerning first=108 second=261 amount=-1 +kerning first=108 second=259 amount=-1 +kerning first=108 second=257 amount=-1 +kerning first=108 second=255 amount=-1 +kerning first=108 second=253 amount=-1 +kerning first=108 second=252 amount=-1 +kerning first=108 second=251 amount=-1 +kerning first=108 second=250 amount=-1 +kerning first=108 second=249 amount=-1 +kerning first=108 second=230 amount=-1 +kerning first=108 second=229 amount=-1 +kerning first=108 second=228 amount=-1 +kerning first=108 second=227 amount=-1 +kerning first=105 second=253 amount=-1 +kerning first=108 second=226 amount=-1 +kerning first=105 second=255 amount=-1 +kerning first=105 second=257 amount=-1 +kerning first=105 second=259 amount=-1 +kerning first=105 second=261 amount=-1 +kerning first=108 second=225 amount=-1 +kerning first=108 second=224 amount=-1 +kerning first=108 second=171 amount=-1 +kerning first=108 second=121 amount=-1 +kerning first=108 second=119 amount=-1 +kerning first=108 second=118 amount=-1 +kerning first=108 second=117 amount=-1 +kerning first=108 second=106 amount=-1 +kerning first=108 second=103 amount=-1 +kerning first=108 second=97 amount=-1 +kerning first=105 second=287 amount=-1 +kerning first=105 second=289 amount=-1 +kerning first=105 second=291 amount=-1 +kerning first=108 second=45 amount=-1 +kerning first=107 second=8249 amount=-1 +kerning first=107 second=8221 amount=-1 +kerning first=107 second=8220 amount=-1 +kerning first=105 second=314 amount=-1 +kerning first=105 second=316 amount=-1 +kerning first=105 second=318 amount=-1 +kerning first=107 second=8217 amount=-1 +kerning first=107 second=353 amount=-1 +kerning first=107 second=351 amount=-1 +kerning first=107 second=347 amount=-1 +kerning first=107 second=339 amount=-1 +kerning first=107 second=337 amount=-1 +kerning first=107 second=335 amount=-1 +kerning first=107 second=333 amount=-1 +kerning first=107 second=291 amount=-1 +kerning first=105 second=347 amount=-1 +kerning first=105 second=351 amount=-1 +kerning first=105 second=353 amount=-1 +kerning first=107 second=289 amount=-1 +kerning first=107 second=287 amount=-1 +kerning first=107 second=283 amount=-1 +kerning first=107 second=281 amount=-1 +kerning first=107 second=279 amount=-1 +kerning first=107 second=277 amount=-1 +kerning first=107 second=275 amount=-1 +kerning first=105 second=375 amount=-1 +kerning first=107 second=273 amount=-1 +kerning first=107 second=271 amount=-1 +kerning first=107 second=269 amount=-1 +kerning first=107 second=267 amount=-1 +kerning first=107 second=263 amount=-1 +kerning first=107 second=248 amount=-1 +kerning first=107 second=246 amount=-1 +kerning first=107 second=245 amount=-1 +kerning first=107 second=244 amount=-1 +kerning first=107 second=243 amount=-1 +kerning first=107 second=242 amount=-1 +kerning first=107 second=240 amount=-1 +kerning first=107 second=235 amount=-1 +kerning first=107 second=234 amount=-1 +kerning first=107 second=233 amount=-1 +kerning first=107 second=232 amount=-1 +kerning first=105 second=8217 amount=-1 +kerning first=105 second=8220 amount=-1 +kerning first=105 second=8221 amount=-1 +kerning first=105 second=8249 amount=-1 +kerning first=107 second=231 amount=-1 +kerning first=107 second=171 amount=-1 +kerning first=107 second=115 amount=-1 +kerning first=107 second=113 amount=-1 +kerning first=107 second=111 amount=-1 +kerning first=106 second=44 amount=-1 +kerning first=106 second=45 amount=-1 +kerning first=106 second=46 amount=-1 +kerning first=106 second=97 amount=-1 +kerning first=107 second=103 amount=-1 +kerning first=107 second=101 amount=-1 +kerning first=107 second=100 amount=-1 +kerning first=107 second=99 amount=-1 +kerning first=107 second=45 amount=-1 +kerning first=106 second=103 amount=-1 +kerning first=106 second=8249 amount=-1 +kerning first=106 second=8221 amount=-1 +kerning first=106 second=106 amount=-1 +kerning first=106 second=8220 amount=-1 +kerning first=106 second=108 amount=-1 +kerning first=106 second=8217 amount=-1 +kerning first=106 second=375 amount=-1 +kerning first=106 second=353 amount=-1 +kerning first=106 second=351 amount=-1 +kerning first=106 second=347 amount=-1 +kerning first=106 second=318 amount=-1 +kerning first=106 second=115 amount=-1 +kerning first=106 second=316 amount=-1 +kerning first=106 second=314 amount=-1 +kerning first=106 second=118 amount=-1 +kerning first=106 second=119 amount=-1 +kerning first=106 second=291 amount=-1 +kerning first=106 second=121 amount=-1 +kerning first=106 second=289 amount=-1 +kerning first=106 second=171 amount=-1 +kerning first=106 second=287 amount=-1 +kerning first=106 second=224 amount=-1 +kerning first=106 second=225 amount=-1 +kerning first=106 second=226 amount=-1 +kerning first=106 second=227 amount=-1 +kerning first=106 second=228 amount=-1 +kerning first=106 second=229 amount=-1 +kerning first=106 second=230 amount=-1 +kerning first=106 second=261 amount=-1 +kerning first=106 second=259 amount=-1 +kerning first=106 second=257 amount=-1 +kerning first=106 second=255 amount=-1 +kerning first=106 second=253 amount=-1 diff --git a/jme3-examples/src/main/resources/jme3test/font/BM-FreeSerif32_0.png b/jme3-examples/src/main/resources/jme3test/font/BM-FreeSerif32_0.png new file mode 100644 index 000000000..9af61dfa0 Binary files /dev/null and b/jme3-examples/src/main/resources/jme3test/font/BM-FreeSerif32_0.png differ diff --git a/jme3-examples/src/main/resources/jme3test/font/BM-FreeSerif64I.fnt b/jme3-examples/src/main/resources/jme3test/font/BM-FreeSerif64I.fnt new file mode 100644 index 000000000..f6cab8b7c --- /dev/null +++ b/jme3-examples/src/main/resources/jme3test/font/BM-FreeSerif64I.fnt @@ -0,0 +1,8790 @@ +info face="FreeSerif" size=64 bold=0 italic=1 charset="" unicode=1 stretchH=100 smooth=1 aa=2 padding=0,0,0,0 spacing=3,3 outline=0 +common lineHeight=64 base=48 scaleW=1024 scaleH=1024 pages=1 packed=0 alphaChnl=0 redChnl=4 greenChnl=4 blueChnl=4 +page id=0 file="BM-FreeSerif64I_0.png" +chars count=406 +char id=-1 x=0 y=468 width=41 height=36 xoffset=4 yoffset=12 xadvance=37 page=0 chnl=15 +char id=32 x=1018 y=175 width=1 height=1 xoffset=0 yoffset=0 xadvance=13 page=0 chnl=15 +char id=33 x=381 y=421 width=17 height=37 xoffset=7 yoffset=11 xadvance=18 page=0 chnl=15 +char id=34 x=786 y=520 width=16 height=14 xoffset=13 yoffset=11 xadvance=22 page=0 chnl=15 +char id=35 x=559 y=457 width=31 height=36 xoffset=4 yoffset=12 xadvance=26 page=0 chnl=15 +char id=36 x=877 y=204 width=31 height=44 xoffset=3 yoffset=9 xadvance=26 page=0 chnl=15 +char id=37 x=208 y=304 width=37 height=38 xoffset=10 yoffset=11 xadvance=44 page=0 chnl=15 +char id=38 x=596 y=252 width=42 height=38 xoffset=4 yoffset=11 xadvance=41 page=0 chnl=15 +char id=39 x=1013 y=203 width=7 height=14 xoffset=12 yoffset=11 xadvance=9 page=0 chnl=15 +char id=40 x=896 y=155 width=23 height=46 xoffset=5 yoffset=11 xadvance=18 page=0 chnl=15 +char id=41 x=922 y=155 width=23 height=46 xoffset=-1 yoffset=12 xadvance=18 page=0 chnl=15 +char id=42 x=333 y=541 width=23 height=23 xoffset=10 yoffset=11 xadvance=26 page=0 chnl=15 +char id=43 x=627 y=496 width=29 height=28 xoffset=5 yoffset=20 xadvance=30 page=0 chnl=15 +char id=44 x=867 y=520 width=10 height=13 xoffset=1 yoffset=42 xadvance=13 page=0 chnl=15 +char id=45 x=433 y=557 width=15 height=4 xoffset=5 yoffset=34 xadvance=18 page=0 chnl=15 +char id=46 x=1012 y=349 width=7 height=7 xoffset=4 yoffset=42 xadvance=13 page=0 chnl=15 +char id=47 x=768 y=293 width=29 height=38 xoffset=-1 yoffset=11 xadvance=15 page=0 chnl=15 +char id=48 x=62 y=346 width=28 height=38 xoffset=5 yoffset=11 xadvance=26 page=0 chnl=15 +char id=49 x=206 y=427 width=23 height=37 xoffset=6 yoffset=11 xadvance=26 page=0 chnl=15 +char id=50 x=515 y=378 width=31 height=37 xoffset=1 yoffset=11 xadvance=26 page=0 chnl=15 +char id=51 x=670 y=293 width=30 height=38 xoffset=2 yoffset=11 xadvance=26 page=0 chnl=15 +char id=52 x=943 y=373 width=29 height=37 xoffset=3 yoffset=11 xadvance=26 page=0 chnl=15 +char id=53 x=287 y=300 width=34 height=38 xoffset=2 yoffset=11 xadvance=26 page=0 chnl=15 +char id=54 x=432 y=299 width=32 height=38 xoffset=5 yoffset=11 xadvance=26 page=0 chnl=15 +char id=55 x=625 y=457 width=28 height=36 xoffset=9 yoffset=12 xadvance=26 page=0 chnl=15 +char id=56 x=93 y=346 width=28 height=38 xoffset=5 yoffset=11 xadvance=26 page=0 chnl=15 +char id=57 x=537 y=295 width=31 height=38 xoffset=2 yoffset=11 xadvance=26 page=0 chnl=15 +char id=58 x=26 y=544 width=14 height=26 xoffset=4 yoffset=23 xadvance=15 page=0 chnl=15 +char id=59 x=1006 y=373 width=15 height=32 xoffset=3 yoffset=23 xadvance=15 page=0 chnl=15 +char id=60 x=522 y=499 width=34 height=29 xoffset=5 yoffset=20 xadvance=30 page=0 chnl=15 +char id=61 x=638 y=527 width=33 height=15 xoffset=3 yoffset=27 xadvance=30 page=0 chnl=15 +char id=62 x=559 y=496 width=33 height=29 xoffset=1 yoffset=20 xadvance=30 page=0 chnl=15 +char id=63 x=232 y=426 width=23 height=37 xoffset=10 yoffset=11 xadvance=23 page=0 chnl=15 +char id=64 x=730 y=252 width=41 height=38 xoffset=11 yoffset=11 xadvance=49 page=0 chnl=15 +char id=65 x=971 y=333 width=38 height=37 xoffset=0 yoffset=11 xadvance=38 page=0 chnl=15 +char id=66 x=130 y=467 width=39 height=36 xoffset=0 yoffset=12 xadvance=35 page=0 chnl=15 +char id=67 x=85 y=305 width=39 height=38 xoffset=6 yoffset=11 xadvance=35 page=0 chnl=15 +char id=68 x=776 y=414 width=44 height=36 xoffset=0 yoffset=12 xadvance=38 page=0 chnl=15 +char id=69 x=916 y=413 width=41 height=36 xoffset=0 yoffset=12 xadvance=32 page=0 chnl=15 +char id=70 x=960 y=413 width=41 height=36 xoffset=0 yoffset=12 xadvance=29 page=0 chnl=15 +char id=71 x=774 y=251 width=40 height=38 xoffset=6 yoffset=11 xadvance=38 page=0 chnl=15 +char id=72 x=521 y=418 width=50 height=36 xoffset=0 yoffset=12 xadvance=38 page=0 chnl=15 +char id=73 x=593 y=457 width=29 height=36 xoffset=0 yoffset=12 xadvance=18 page=0 chnl=15 +char id=74 x=651 y=374 width=31 height=37 xoffset=1 yoffset=12 xadvance=20 page=0 chnl=15 +char id=75 x=679 y=414 width=47 height=36 xoffset=1 yoffset=12 xadvance=38 page=0 chnl=15 +char id=76 x=409 y=460 width=35 height=36 xoffset=0 yoffset=12 xadvance=32 page=0 chnl=15 +char id=77 x=401 y=421 width=58 height=36 xoffset=0 yoffset=12 xadvance=47 page=0 chnl=15 +char id=78 x=733 y=334 width=50 height=37 xoffset=0 yoffset=12 xadvance=38 page=0 chnl=15 +char id=79 x=43 y=305 width=39 height=38 xoffset=6 yoffset=11 xadvance=38 page=0 chnl=15 +char id=80 x=214 y=467 width=38 height=36 xoffset=0 yoffset=12 xadvance=29 page=0 chnl=15 +char id=81 x=778 y=155 width=39 height=46 xoffset=6 yoffset=11 xadvance=38 page=0 chnl=15 +char id=82 x=172 y=467 width=39 height=36 xoffset=0 yoffset=12 xadvance=35 page=0 chnl=15 +char id=83 x=396 y=299 width=33 height=38 xoffset=3 yoffset=11 xadvance=29 page=0 chnl=15 +char id=84 x=371 y=462 width=35 height=36 xoffset=8 yoffset=12 xadvance=32 page=0 chnl=15 +char id=85 x=885 y=333 width=42 height=37 xoffset=8 yoffset=12 xadvance=38 page=0 chnl=15 +char id=86 x=0 y=388 width=37 height=37 xoffset=12 yoffset=12 xadvance=38 page=0 chnl=15 +char id=87 x=679 y=334 width=51 height=37 xoffset=11 yoffset=12 xadvance=50 page=0 chnl=15 +char id=88 x=627 y=416 width=49 height=36 xoffset=0 yoffset=12 xadvance=38 page=0 chnl=15 +char id=89 x=88 y=468 width=39 height=36 xoffset=11 yoffset=12 xadvance=38 page=0 chnl=15 +char id=90 x=870 y=413 width=43 height=36 xoffset=0 yoffset=12 xadvance=32 page=0 chnl=15 +char id=91 x=975 y=203 width=27 height=44 xoffset=1 yoffset=12 xadvance=18 page=0 chnl=15 +char id=92 x=1005 y=203 width=5 height=38 xoffset=11 yoffset=11 xadvance=16 page=0 chnl=15 +char id=93 x=945 y=204 width=27 height=44 xoffset=-1 yoffset=12 xadvance=18 page=0 chnl=15 +char id=94 x=520 y=532 width=23 height=20 xoffset=6 yoffset=12 xadvance=25 page=0 chnl=15 +char id=95 x=360 y=567 width=28 height=4 xoffset=-2 yoffset=51 xadvance=26 page=0 chnl=15 +char id=96 x=14 y=573 width=10 height=10 xoffset=12 yoffset=11 xadvance=18 page=0 chnl=15 +char id=97 x=987 y=490 width=24 height=26 xoffset=3 yoffset=23 xadvance=23 page=0 chnl=15 +char id=98 x=389 y=340 width=26 height=38 xoffset=4 yoffset=11 xadvance=26 page=0 chnl=15 +char id=99 x=960 y=490 width=24 height=26 xoffset=4 yoffset=23 xadvance=23 page=0 chnl=15 +char id=100 x=502 y=297 width=32 height=38 xoffset=4 yoffset=11 xadvance=26 page=0 chnl=15 +char id=101 x=933 y=490 width=24 height=26 xoffset=4 yoffset=23 xadvance=23 page=0 chnl=15 +char id=102 x=549 y=378 width=31 height=37 xoffset=1 yoffset=11 xadvance=18 page=0 chnl=15 +char id=103 x=266 y=386 width=34 height=37 xoffset=-1 yoffset=23 xadvance=26 page=0 chnl=15 +char id=104 x=685 y=374 width=30 height=37 xoffset=0 yoffset=11 xadvance=26 page=0 chnl=15 +char id=105 x=357 y=422 width=21 height=37 xoffset=0 yoffset=11 xadvance=15 page=0 chnl=15 +char id=106 x=109 y=108 width=30 height=49 xoffset=-7 yoffset=11 xadvance=15 page=0 chnl=15 +char id=107 x=303 y=382 width=34 height=37 xoffset=0 yoffset=11 xadvance=26 page=0 chnl=15 +char id=108 x=308 y=422 width=22 height=37 xoffset=1 yoffset=11 xadvance=15 page=0 chnl=15 +char id=109 x=102 y=544 width=44 height=25 xoffset=0 yoffset=23 xadvance=41 page=0 chnl=15 +char id=110 x=219 y=542 width=29 height=25 xoffset=0 yoffset=23 xadvance=26 page=0 chnl=15 +char id=111 x=846 y=491 width=26 height=26 xoffset=4 yoffset=23 xadvance=26 page=0 chnl=15 +char id=112 x=117 y=387 width=35 height=37 xoffset=-4 yoffset=23 xadvance=26 page=0 chnl=15 +char id=113 x=0 y=428 width=28 height=37 xoffset=3 yoffset=23 xadvance=26 page=0 chnl=15 +char id=114 x=283 y=541 width=26 height=25 xoffset=0 yoffset=23 xadvance=18 page=0 chnl=15 +char id=115 x=0 y=544 width=23 height=26 xoffset=2 yoffset=23 xadvance=20 page=0 chnl=15 +char id=116 x=1004 y=413 width=17 height=33 xoffset=5 yoffset=16 xadvance=15 page=0 chnl=15 +char id=117 x=904 y=490 width=26 height=26 xoffset=5 yoffset=23 xadvance=26 page=0 chnl=15 +char id=118 x=875 y=491 width=26 height=26 xoffset=8 yoffset=23 xadvance=26 page=0 chnl=15 +char id=119 x=737 y=491 width=37 height=26 xoffset=9 yoffset=23 xadvance=38 page=0 chnl=15 +char id=120 x=185 y=542 width=31 height=25 xoffset=0 yoffset=23 xadvance=26 page=0 chnl=15 +char id=121 x=40 y=388 width=36 height=37 xoffset=-1 yoffset=23 xadvance=26 page=0 chnl=15 +char id=122 x=251 y=542 width=29 height=25 xoffset=1 yoffset=23 xadvance=23 page=0 chnl=15 +char id=123 x=396 y=158 width=24 height=47 xoffset=8 yoffset=11 xadvance=25 page=0 chnl=15 +char id=124 x=492 y=338 width=17 height=38 xoffset=3 yoffset=11 xadvance=10 page=0 chnl=15 +char id=125 x=369 y=158 width=24 height=47 xoffset=3 yoffset=11 xadvance=25 page=0 chnl=15 +char id=126 x=95 y=572 width=26 height=8 xoffset=6 yoffset=30 xadvance=29 page=0 chnl=15 +char id=160 x=1018 y=155 width=1 height=1 xoffset=0 yoffset=0 xadvance=13 page=0 chnl=15 +char id=161 x=472 y=338 width=17 height=38 xoffset=2 yoffset=22 xadvance=18 page=0 chnl=15 +char id=162 x=518 y=253 width=29 height=39 xoffset=3 yoffset=16 xadvance=26 page=0 chnl=15 +char id=163 x=192 y=387 width=34 height=37 xoffset=1 yoffset=11 xadvance=26 page=0 chnl=15 +char id=164 x=481 y=499 width=38 height=30 xoffset=0 yoffset=15 xadvance=26 page=0 chnl=15 +char id=165 x=255 y=466 width=36 height=36 xoffset=4 yoffset=12 xadvance=26 page=0 chnl=15 +char id=166 x=1001 y=52 width=17 height=38 xoffset=3 yoffset=11 xadvance=10 page=0 chnl=15 +char id=167 x=474 y=207 width=27 height=45 xoffset=4 yoffset=11 xadvance=26 page=0 chnl=15 +char id=168 x=193 y=570 width=17 height=6 xoffset=11 yoffset=14 xadvance=18 page=0 chnl=15 +char id=169 x=279 y=257 width=43 height=40 xoffset=6 yoffset=9 xadvance=42 page=0 chnl=15 +char id=170 x=619 y=528 width=16 height=16 xoffset=8 yoffset=11 xadvance=14 page=0 chnl=15 +char id=171 x=423 y=533 width=27 height=21 xoffset=4 yoffset=25 xadvance=23 page=0 chnl=15 +char id=172 x=546 y=531 width=29 height=16 xoffset=7 yoffset=27 xadvance=30 page=0 chnl=15 +char id=173 x=451 y=557 width=15 height=4 xoffset=5 yoffset=34 xadvance=18 page=0 chnl=15 +char id=174 x=325 y=256 width=43 height=40 xoffset=6 yoffset=9 xadvance=42 page=0 chnl=15 +char id=175 x=391 y=562 width=18 height=4 xoffset=10 yoffset=15 xadvance=18 page=0 chnl=15 +char id=176 x=599 y=528 width=17 height=16 xoffset=12 yoffset=11 xadvance=21 page=0 chnl=15 +char id=177 x=686 y=453 width=36 height=35 xoffset=1 yoffset=13 xadvance=30 page=0 chnl=15 +char id=178 x=359 y=541 width=21 height=23 xoffset=5 yoffset=11 xadvance=17 page=0 chnl=15 +char id=179 x=383 y=536 width=19 height=23 xoffset=6 yoffset=11 xadvance=17 page=0 chnl=15 +char id=180 x=977 y=519 width=15 height=10 xoffset=14 yoffset=11 xadvance=18 page=0 chnl=15 +char id=181 x=376 y=381 width=33 height=37 xoffset=-1 yoffset=23 xadvance=26 page=0 chnl=15 +char id=182 x=805 y=204 width=35 height=44 xoffset=3 yoffset=12 xadvance=26 page=0 chnl=15 +char id=183 x=1014 y=489 width=6 height=6 xoffset=8 yoffset=32 xadvance=13 page=0 chnl=15 +char id=184 x=880 y=520 width=13 height=12 xoffset=-1 yoffset=47 xadvance=18 page=0 chnl=15 +char id=185 x=405 y=536 width=15 height=23 xoffset=8 yoffset=11 xadvance=17 page=0 chnl=15 +char id=186 x=578 y=528 width=18 height=16 xoffset=9 yoffset=11 xadvance=16 page=0 chnl=15 +char id=187 x=453 y=533 width=26 height=21 xoffset=1 yoffset=25 xadvance=23 page=0 chnl=15 +char id=188 x=903 y=251 width=40 height=38 xoffset=6 yoffset=11 xadvance=40 page=0 chnl=15 +char id=189 x=0 y=306 width=40 height=38 xoffset=5 yoffset=11 xadvance=40 page=0 chnl=15 +char id=190 x=686 y=252 width=41 height=38 xoffset=6 yoffset=11 xadvance=40 page=0 chnl=15 +char id=191 x=258 y=426 width=22 height=37 xoffset=0 yoffset=23 xadvance=23 page=0 chnl=15 +char id=192 x=912 y=104 width=38 height=48 xoffset=0 yoffset=0 xadvance=38 page=0 chnl=15 +char id=193 x=295 y=107 width=43 height=48 xoffset=0 yoffset=0 xadvance=38 page=0 chnl=15 +char id=194 x=743 y=104 width=40 height=48 xoffset=0 yoffset=0 xadvance=38 page=0 chnl=15 +char id=195 x=972 y=155 width=43 height=45 xoffset=0 yoffset=3 xadvance=38 page=0 chnl=15 +char id=196 x=179 y=210 width=41 height=45 xoffset=0 yoffset=3 xadvance=38 page=0 chnl=15 +char id=197 x=353 y=55 width=39 height=49 xoffset=0 yoffset=0 xadvance=38 page=0 chnl=15 +char id=198 x=462 y=421 width=56 height=36 xoffset=0 yoffset=12 xadvance=47 page=0 chnl=15 +char id=199 x=828 y=104 width=39 height=48 xoffset=6 yoffset=11 xadvance=35 page=0 chnl=15 +char id=200 x=656 y=105 width=41 height=48 xoffset=0 yoffset=0 xadvance=32 page=0 chnl=15 +char id=201 x=568 y=105 width=41 height=48 xoffset=0 yoffset=0 xadvance=32 page=0 chnl=15 +char id=202 x=524 y=105 width=41 height=48 xoffset=0 yoffset=0 xadvance=32 page=0 chnl=15 +char id=203 x=135 y=211 width=41 height=45 xoffset=0 yoffset=3 xadvance=32 page=0 chnl=15 +char id=204 x=253 y=158 width=29 height=48 xoffset=0 yoffset=0 xadvance=18 page=0 chnl=15 +char id=205 x=111 y=160 width=33 height=48 xoffset=0 yoffset=0 xadvance=18 page=0 chnl=15 +char id=206 x=991 y=104 width=30 height=48 xoffset=0 yoffset=0 xadvance=18 page=0 chnl=15 +char id=207 x=345 y=208 width=31 height=45 xoffset=0 yoffset=3 xadvance=18 page=0 chnl=15 +char id=208 x=823 y=414 width=44 height=36 xoffset=0 yoffset=12 xadvance=38 page=0 chnl=15 +char id=209 x=423 y=158 width=50 height=46 xoffset=0 yoffset=3 xadvance=38 page=0 chnl=15 +char id=210 x=647 y=53 width=39 height=49 xoffset=6 yoffset=0 xadvance=38 page=0 chnl=15 +char id=211 x=521 y=53 width=39 height=49 xoffset=6 yoffset=0 xadvance=38 page=0 chnl=15 +char id=212 x=479 y=53 width=39 height=49 xoffset=6 yoffset=0 xadvance=38 page=0 chnl=15 +char id=213 x=736 y=155 width=39 height=46 xoffset=6 yoffset=3 xadvance=38 page=0 chnl=15 +char id=214 x=694 y=156 width=39 height=46 xoffset=6 yoffset=3 xadvance=38 page=0 chnl=15 +char id=215 x=659 y=494 width=34 height=27 xoffset=3 yoffset=21 xadvance=30 page=0 chnl=15 +char id=216 x=529 y=205 width=48 height=44 xoffset=1 yoffset=8 xadvance=38 page=0 chnl=15 +char id=217 x=135 y=56 width=42 height=49 xoffset=8 yoffset=0 xadvance=38 page=0 chnl=15 +char id=218 x=45 y=56 width=42 height=49 xoffset=8 yoffset=0 xadvance=38 page=0 chnl=15 +char id=219 x=180 y=56 width=42 height=49 xoffset=8 yoffset=0 xadvance=38 page=0 chnl=15 +char id=220 x=476 y=156 width=42 height=46 xoffset=8 yoffset=3 xadvance=38 page=0 chnl=15 +char id=221 x=870 y=104 width=39 height=48 xoffset=11 yoffset=0 xadvance=38 page=0 chnl=15 +char id=222 x=294 y=466 width=36 height=36 xoffset=0 yoffset=12 xadvance=30 page=0 chnl=15 +char id=223 x=324 y=300 width=33 height=38 xoffset=0 yoffset=11 xadvance=26 page=0 chnl=15 +char id=224 x=418 y=340 width=24 height=38 xoffset=3 yoffset=11 xadvance=23 page=0 chnl=15 +char id=225 x=960 y=292 width=29 height=38 xoffset=3 yoffset=11 xadvance=23 page=0 chnl=15 +char id=226 x=214 y=345 width=27 height=38 xoffset=3 yoffset=11 xadvance=23 page=0 chnl=15 +char id=227 x=758 y=453 width=29 height=35 xoffset=3 yoffset=14 xadvance=23 page=0 chnl=15 +char id=228 x=821 y=453 width=28 height=35 xoffset=3 yoffset=14 xadvance=23 page=0 chnl=15 +char id=229 x=403 y=256 width=26 height=40 xoffset=3 yoffset=9 xadvance=23 page=0 chnl=15 +char id=230 x=777 y=491 width=36 height=26 xoffset=3 yoffset=23 xadvance=34 page=0 chnl=15 +char id=231 x=92 y=427 width=26 height=37 xoffset=2 yoffset=23 xadvance=23 page=0 chnl=15 +char id=232 x=445 y=340 width=24 height=38 xoffset=4 yoffset=11 xadvance=23 page=0 chnl=15 +char id=233 x=0 y=347 width=28 height=38 xoffset=4 yoffset=11 xadvance=23 page=0 chnl=15 +char id=234 x=273 y=343 width=26 height=38 xoffset=4 yoffset=11 xadvance=23 page=0 chnl=15 +char id=235 x=883 y=452 width=27 height=35 xoffset=4 yoffset=14 xadvance=23 page=0 chnl=15 +char id=236 x=333 y=422 width=21 height=37 xoffset=0 yoffset=11 xadvance=15 page=0 chnl=15 +char id=237 x=62 y=428 width=27 height=37 xoffset=0 yoffset=11 xadvance=15 page=0 chnl=15 +char id=238 x=178 y=427 width=25 height=37 xoffset=0 yoffset=11 xadvance=15 page=0 chnl=15 +char id=239 x=98 y=507 width=25 height=34 xoffset=0 yoffset=14 xadvance=15 page=0 chnl=15 +char id=240 x=703 y=293 width=30 height=38 xoffset=4 yoffset=11 xadvance=26 page=0 chnl=15 +char id=241 x=0 y=507 width=34 height=34 xoffset=0 yoffset=14 xadvance=26 page=0 chnl=15 +char id=242 x=302 y=341 width=26 height=38 xoffset=4 yoffset=11 xadvance=26 page=0 chnl=15 +char id=243 x=800 y=292 width=29 height=38 xoffset=4 yoffset=11 xadvance=26 page=0 chnl=15 +char id=244 x=184 y=346 width=27 height=38 xoffset=4 yoffset=11 xadvance=26 page=0 chnl=15 +char id=245 x=725 y=453 width=30 height=35 xoffset=4 yoffset=14 xadvance=26 page=0 chnl=15 +char id=246 x=852 y=453 width=28 height=35 xoffset=4 yoffset=14 xadvance=26 page=0 chnl=15 +char id=247 x=595 y=496 width=29 height=29 xoffset=5 yoffset=20 xadvance=30 page=0 chnl=15 +char id=248 x=523 y=457 width=33 height=36 xoffset=0 yoffset=18 xadvance=26 page=0 chnl=15 +char id=249 x=331 y=341 width=26 height=38 xoffset=5 yoffset=11 xadvance=26 page=0 chnl=15 +char id=250 x=896 y=292 width=29 height=38 xoffset=5 yoffset=11 xadvance=26 page=0 chnl=15 +char id=251 x=360 y=340 width=26 height=38 xoffset=5 yoffset=11 xadvance=26 page=0 chnl=15 +char id=252 x=913 y=452 width=27 height=35 xoffset=5 yoffset=14 xadvance=26 page=0 chnl=15 +char id=253 x=809 y=52 width=36 height=49 xoffset=-1 yoffset=11 xadvance=26 page=0 chnl=15 +char id=254 x=925 y=52 width=35 height=49 xoffset=-4 yoffset=11 xadvance=26 page=0 chnl=15 +char id=255 x=820 y=155 width=36 height=46 xoffset=-1 yoffset=14 xadvance=26 page=0 chnl=15 +char id=256 x=29 y=259 width=42 height=43 xoffset=0 yoffset=5 xadvance=38 page=0 chnl=15 +char id=257 x=238 y=506 width=28 height=33 xoffset=3 yoffset=16 xadvance=23 page=0 chnl=15 +char id=258 x=341 y=107 width=43 height=48 xoffset=0 yoffset=0 xadvance=38 page=0 chnl=15 +char id=259 x=911 y=373 width=29 height=37 xoffset=3 yoffset=12 xadvance=23 page=0 chnl=15 +char id=260 x=609 y=156 width=40 height=46 xoffset=0 yoffset=11 xadvance=38 page=0 chnl=15 +char id=261 x=126 y=507 width=24 height=34 xoffset=3 yoffset=23 xadvance=23 page=0 chnl=15 +char id=262 x=605 y=53 width=39 height=49 xoffset=6 yoffset=0 xadvance=35 page=0 chnl=15 +char id=263 x=832 y=292 width=29 height=38 xoffset=4 yoffset=11 xadvance=23 page=0 chnl=15 +char id=264 x=689 y=52 width=39 height=49 xoffset=6 yoffset=0 xadvance=35 page=0 chnl=15 +char id=265 x=124 y=346 width=27 height=38 xoffset=4 yoffset=11 xadvance=23 page=0 chnl=15 +char id=266 x=652 y=156 width=39 height=46 xoffset=6 yoffset=3 xadvance=35 page=0 chnl=15 +char id=267 x=970 y=452 width=24 height=35 xoffset=4 yoffset=14 xadvance=23 page=0 chnl=15 +char id=268 x=311 y=55 width=39 height=49 xoffset=6 yoffset=0 xadvance=35 page=0 chnl=15 +char id=269 x=571 y=293 width=30 height=38 xoffset=4 yoffset=11 xadvance=23 page=0 chnl=15 +char id=270 x=248 y=107 width=44 height=48 xoffset=0 yoffset=0 xadvance=38 page=0 chnl=15 +char id=271 x=946 y=251 width=40 height=38 xoffset=4 yoffset=11 xadvance=33 page=0 chnl=15 +char id=272 x=729 y=414 width=44 height=36 xoffset=0 yoffset=12 xadvance=38 page=0 chnl=15 +char id=273 x=360 y=299 width=33 height=38 xoffset=4 yoffset=11 xadvance=26 page=0 chnl=15 +char id=274 x=74 y=259 width=41 height=43 xoffset=0 yoffset=5 xadvance=32 page=0 chnl=15 +char id=275 x=269 y=505 width=28 height=33 xoffset=4 yoffset=16 xadvance=23 page=0 chnl=15 +char id=276 x=285 y=158 width=41 height=47 xoffset=0 yoffset=1 xadvance=32 page=0 chnl=15 +char id=277 x=783 y=374 width=29 height=37 xoffset=4 yoffset=12 xadvance=23 page=0 chnl=15 +char id=278 x=91 y=211 width=41 height=45 xoffset=0 yoffset=3 xadvance=32 page=0 chnl=15 +char id=279 x=943 y=452 width=24 height=35 xoffset=4 yoffset=14 xadvance=23 page=0 chnl=15 +char id=280 x=223 y=210 width=41 height=45 xoffset=0 yoffset=12 xadvance=32 page=0 chnl=15 +char id=281 x=997 y=452 width=24 height=34 xoffset=4 yoffset=23 xadvance=23 page=0 chnl=15 +char id=282 x=612 y=105 width=41 height=48 xoffset=0 yoffset=0 xadvance=32 page=0 chnl=15 +char id=283 x=928 y=292 width=29 height=38 xoffset=4 yoffset=11 xadvance=23 page=0 chnl=15 +char id=284 x=268 y=55 width=40 height=49 xoffset=6 yoffset=0 xadvance=38 page=0 chnl=15 +char id=285 x=0 y=108 width=34 height=49 xoffset=-1 yoffset=11 xadvance=26 page=0 chnl=15 +char id=286 x=700 y=104 width=40 height=48 xoffset=6 yoffset=1 xadvance=38 page=0 chnl=15 +char id=287 x=38 y=160 width=34 height=48 xoffset=-1 yoffset=12 xadvance=26 page=0 chnl=15 +char id=288 x=566 y=156 width=40 height=46 xoffset=6 yoffset=3 xadvance=38 page=0 chnl=15 +char id=289 x=859 y=155 width=34 height=46 xoffset=-1 yoffset=14 xadvance=26 page=0 chnl=15 +char id=290 x=51 y=0 width=40 height=53 xoffset=6 yoffset=11 xadvance=38 page=0 chnl=15 +char id=291 x=131 y=0 width=34 height=53 xoffset=-1 yoffset=7 xadvance=26 page=0 chnl=15 +char id=292 x=727 y=0 width=50 height=49 xoffset=0 yoffset=0 xadvance=38 page=0 chnl=15 +char id=293 x=0 y=160 width=35 height=48 xoffset=0 yoffset=0 xadvance=26 page=0 chnl=15 +char id=294 x=574 y=418 width=50 height=36 xoffset=0 yoffset=12 xadvance=38 page=0 chnl=15 +char id=295 x=481 y=379 width=31 height=37 xoffset=0 yoffset=11 xadvance=26 page=0 chnl=15 +char id=296 x=309 y=208 width=33 height=45 xoffset=0 yoffset=3 xadvance=18 page=0 chnl=15 +char id=297 x=330 y=505 width=27 height=33 xoffset=0 yoffset=15 xadvance=15 page=0 chnl=15 +char id=298 x=154 y=259 width=32 height=43 xoffset=0 yoffset=5 xadvance=18 page=0 chnl=15 +char id=299 x=380 y=501 width=26 height=32 xoffset=0 yoffset=16 xadvance=15 page=0 chnl=15 +char id=300 x=183 y=159 width=33 height=48 xoffset=0 yoffset=0 xadvance=18 page=0 chnl=15 +char id=301 x=656 y=455 width=27 height=36 xoffset=0 yoffset=12 xadvance=15 page=0 chnl=15 +char id=302 x=411 y=208 width=29 height=45 xoffset=0 yoffset=12 xadvance=18 page=0 chnl=15 +char id=303 x=948 y=155 width=21 height=46 xoffset=0 yoffset=11 xadvance=15 page=0 chnl=15 +char id=304 x=379 y=208 width=29 height=45 xoffset=0 yoffset=3 xadvance=18 page=0 chnl=15 +char id=305 x=312 y=541 width=18 height=25 xoffset=0 yoffset=23 xadvance=15 page=0 chnl=15 +char id=306 x=786 y=334 width=49 height=37 xoffset=0 yoffset=12 xadvance=37 page=0 chnl=15 +char id=307 x=887 y=52 width=35 height=49 xoffset=0 yoffset=11 xadvance=28 page=0 chnl=15 +char id=308 x=637 y=0 width=33 height=50 xoffset=1 yoffset=0 xadvance=20 page=0 chnl=15 +char id=309 x=37 y=108 width=33 height=49 xoffset=-7 yoffset=11 xadvance=15 page=0 chnl=15 +char id=310 x=247 y=0 width=47 height=52 xoffset=1 yoffset=12 xadvance=38 page=0 chnl=15 +char id=311 x=94 y=0 width=34 height=53 xoffset=0 yoffset=11 xadvance=26 page=0 chnl=15 +char id=312 x=149 y=544 width=33 height=25 xoffset=0 yoffset=23 xadvance=26 page=0 chnl=15 +char id=313 x=963 y=52 width=35 height=49 xoffset=0 yoffset=0 xadvance=32 page=0 chnl=15 +char id=314 x=219 y=159 width=31 height=48 xoffset=1 yoffset=0 xadvance=15 page=0 chnl=15 +char id=315 x=339 y=0 width=35 height=52 xoffset=0 yoffset=12 xadvance=32 page=0 chnl=15 +char id=316 x=168 y=0 width=23 height=53 xoffset=0 yoffset=11 xadvance=15 page=0 chnl=15 +char id=317 x=930 y=333 width=38 height=37 xoffset=0 yoffset=11 xadvance=32 page=0 chnl=15 +char id=318 x=447 y=381 width=31 height=37 xoffset=1 yoffset=11 xadvance=21 page=0 chnl=15 +char id=319 x=447 y=460 width=35 height=36 xoffset=0 yoffset=12 xadvance=32 page=0 chnl=15 +char id=320 x=121 y=427 width=26 height=37 xoffset=1 yoffset=11 xadvance=23 page=0 chnl=15 +char id=321 x=485 y=460 width=35 height=36 xoffset=0 yoffset=12 xadvance=32 page=0 chnl=15 +char id=322 x=283 y=426 width=22 height=37 xoffset=1 yoffset=11 xadvance=15 page=0 chnl=15 +char id=323 x=780 y=0 width=50 height=49 xoffset=0 yoffset=0 xadvance=38 page=0 chnl=15 +char id=324 x=340 y=382 width=33 height=37 xoffset=0 yoffset=11 xadvance=26 page=0 chnl=15 +char id=325 x=194 y=0 width=50 height=52 xoffset=0 yoffset=12 xadvance=38 page=0 chnl=15 +char id=326 x=215 y=258 width=29 height=41 xoffset=0 yoffset=23 xadvance=26 page=0 chnl=15 +char id=327 x=833 y=0 width=50 height=49 xoffset=0 yoffset=0 xadvance=38 page=0 chnl=15 +char id=328 x=229 y=386 width=34 height=37 xoffset=0 yoffset=11 xadvance=26 page=0 chnl=15 +char id=329 x=847 y=373 width=29 height=37 xoffset=3 yoffset=11 xadvance=29 page=0 chnl=15 +char id=330 x=550 y=252 width=43 height=38 xoffset=2 yoffset=11 xadvance=38 page=0 chnl=15 +char id=331 x=815 y=374 width=29 height=37 xoffset=0 yoffset=23 xadvance=26 page=0 chnl=15 +char id=332 x=724 y=205 width=39 height=44 xoffset=6 yoffset=5 xadvance=38 page=0 chnl=15 +char id=333 x=207 y=506 width=28 height=33 xoffset=4 yoffset=16 xadvance=26 page=0 chnl=15 +char id=334 x=563 y=53 width=39 height=49 xoffset=6 yoffset=0 xadvance=38 page=0 chnl=15 +char id=335 x=751 y=374 width=29 height=37 xoffset=4 yoffset=12 xadvance=26 page=0 chnl=15 +char id=336 x=886 y=0 width=43 height=49 xoffset=6 yoffset=0 xadvance=38 page=0 chnl=15 +char id=337 x=467 y=297 width=32 height=38 xoffset=4 yoffset=11 xadvance=26 page=0 chnl=15 +char id=338 x=625 y=334 width=51 height=37 xoffset=6 yoffset=12 xadvance=47 page=0 chnl=15 +char id=339 x=696 y=491 width=38 height=26 xoffset=4 yoffset=23 xadvance=38 page=0 chnl=15 +char id=340 x=437 y=53 width=39 height=49 xoffset=0 yoffset=0 xadvance=35 page=0 chnl=15 +char id=341 x=879 y=373 width=29 height=37 xoffset=0 yoffset=11 xadvance=18 page=0 chnl=15 +char id=342 x=297 y=0 width=39 height=52 xoffset=0 yoffset=12 xadvance=35 page=0 chnl=15 +char id=343 x=247 y=258 width=29 height=41 xoffset=-2 yoffset=23 xadvance=18 page=0 chnl=15 +char id=344 x=479 y=105 width=42 height=48 xoffset=0 yoffset=0 xadvance=35 page=0 chnl=15 +char id=345 x=718 y=374 width=30 height=37 xoffset=0 yoffset=11 xadvance=18 page=0 chnl=15 +char id=346 x=770 y=52 width=36 height=49 xoffset=3 yoffset=0 xadvance=29 page=0 chnl=15 +char id=347 x=736 y=293 width=29 height=38 xoffset=2 yoffset=11 xadvance=20 page=0 chnl=15 +char id=348 x=73 y=108 width=33 height=49 xoffset=3 yoffset=0 xadvance=29 page=0 chnl=15 +char id=349 x=244 y=345 width=26 height=38 xoffset=2 yoffset=11 xadvance=20 page=0 chnl=15 +char id=350 x=147 y=159 width=33 height=48 xoffset=3 yoffset=11 xadvance=29 page=0 chnl=15 +char id=351 x=150 y=427 width=25 height=37 xoffset=0 yoffset=23 xadvance=20 page=0 chnl=15 +char id=352 x=731 y=52 width=36 height=49 xoffset=3 yoffset=0 xadvance=29 page=0 chnl=15 +char id=353 x=864 y=292 width=29 height=38 xoffset=2 yoffset=11 xadvance=20 page=0 chnl=15 +char id=354 x=329 y=158 width=37 height=47 xoffset=7 yoffset=12 xadvance=32 page=0 chnl=15 +char id=355 x=189 y=258 width=23 height=43 xoffset=-1 yoffset=16 xadvance=15 page=0 chnl=15 +char id=356 x=953 y=104 width=35 height=48 xoffset=8 yoffset=0 xadvance=32 page=0 chnl=15 +char id=357 x=154 y=346 width=27 height=38 xoffset=5 yoffset=11 xadvance=22 page=0 chnl=15 +char id=358 x=333 y=462 width=35 height=36 xoffset=8 yoffset=12 xadvance=32 page=0 chnl=15 +char id=359 x=360 y=501 width=17 height=33 xoffset=5 yoffset=16 xadvance=15 page=0 chnl=15 +char id=360 x=521 y=156 width=42 height=46 xoffset=8 yoffset=3 xadvance=38 page=0 chnl=15 +char id=361 x=790 y=453 width=28 height=35 xoffset=5 yoffset=14 xadvance=26 page=0 chnl=15 +char id=362 x=679 y=205 width=42 height=44 xoffset=8 yoffset=5 xadvance=38 page=0 chnl=15 +char id=363 x=300 y=505 width=27 height=33 xoffset=5 yoffset=16 xadvance=26 page=0 chnl=15 +char id=364 x=978 y=0 width=42 height=49 xoffset=8 yoffset=0 xadvance=38 page=0 chnl=15 +char id=365 x=975 y=373 width=28 height=37 xoffset=5 yoffset=12 xadvance=26 page=0 chnl=15 +char id=366 x=512 y=0 width=42 height=50 xoffset=8 yoffset=0 xadvance=38 page=0 chnl=15 +char id=367 x=432 y=256 width=26 height=40 xoffset=5 yoffset=9 xadvance=26 page=0 chnl=15 +char id=368 x=90 y=56 width=42 height=49 xoffset=8 yoffset=0 xadvance=38 page=0 chnl=15 +char id=369 x=989 y=250 width=32 height=38 xoffset=5 yoffset=11 xadvance=26 page=0 chnl=15 +char id=370 x=46 y=211 width=42 height=45 xoffset=8 yoffset=12 xadvance=38 page=0 chnl=15 +char id=371 x=69 y=507 width=26 height=34 xoffset=5 yoffset=23 xadvance=26 page=0 chnl=15 +char id=372 x=673 y=0 width=51 height=49 xoffset=11 yoffset=0 xadvance=50 page=0 chnl=15 +char id=373 x=168 y=305 width=37 height=38 xoffset=9 yoffset=11 xadvance=38 page=0 chnl=15 +char id=374 x=786 y=104 width=39 height=48 xoffset=11 yoffset=0 xadvance=38 page=0 chnl=15 +char id=375 x=848 y=52 width=36 height=49 xoffset=-1 yoffset=11 xadvance=26 page=0 chnl=15 +char id=376 x=267 y=209 width=39 height=45 xoffset=11 yoffset=3 xadvance=38 page=0 chnl=15 +char id=377 x=387 y=107 width=43 height=48 xoffset=0 yoffset=0 xadvance=32 page=0 chnl=15 +char id=378 x=583 y=376 width=31 height=37 xoffset=1 yoffset=11 xadvance=23 page=0 chnl=15 +char id=379 x=0 y=211 width=43 height=45 xoffset=0 yoffset=3 xadvance=32 page=0 chnl=15 +char id=380 x=37 y=507 width=29 height=34 xoffset=1 yoffset=14 xadvance=23 page=0 chnl=15 +char id=381 x=433 y=105 width=43 height=48 xoffset=0 yoffset=0 xadvance=32 page=0 chnl=15 +char id=382 x=412 y=381 width=32 height=37 xoffset=1 yoffset=11 xadvance=23 page=0 chnl=15 +char id=383 x=617 y=376 width=31 height=37 xoffset=1 yoffset=11 xadvance=18 page=0 chnl=15 +char id=399 x=127 y=305 width=38 height=38 xoffset=5 yoffset=11 xadvance=38 page=0 chnl=15 +char id=402 x=225 y=55 width=40 height=49 xoffset=-6 yoffset=11 xadvance=19 page=0 chnl=15 +char id=416 x=630 y=205 width=46 height=44 xoffset=6 yoffset=5 xadvance=38 page=0 chnl=15 +char id=417 x=445 y=499 width=33 height=31 xoffset=4 yoffset=18 xadvance=29 page=0 chnl=15 +char id=431 x=580 y=205 width=47 height=44 xoffset=8 yoffset=5 xadvance=41 page=0 chnl=15 +char id=432 x=409 y=499 width=33 height=31 xoffset=5 yoffset=18 xadvance=29 page=0 chnl=15 +char id=461 x=201 y=108 width=44 height=48 xoffset=0 yoffset=0 xadvance=38 page=0 chnl=15 +char id=462 x=992 y=291 width=29 height=38 xoffset=3 yoffset=11 xadvance=23 page=0 chnl=15 +char id=463 x=75 y=160 width=33 height=48 xoffset=0 yoffset=0 xadvance=18 page=0 chnl=15 +char id=464 x=31 y=428 width=28 height=37 xoffset=0 yoffset=12 xadvance=15 page=0 chnl=15 +char id=465 x=395 y=53 width=39 height=49 xoffset=6 yoffset=0 xadvance=38 page=0 chnl=15 +char id=466 x=637 y=293 width=30 height=38 xoffset=4 yoffset=11 xadvance=26 page=0 chnl=15 +char id=467 x=0 y=56 width=42 height=49 xoffset=8 yoffset=0 xadvance=38 page=0 chnl=15 +char id=468 x=31 y=347 width=28 height=38 xoffset=5 yoffset=11 xadvance=26 page=0 chnl=15 +char id=469 x=467 y=0 width=42 height=50 xoffset=8 yoffset=0 xadvance=38 page=0 chnl=15 +char id=470 x=371 y=256 width=29 height=40 xoffset=5 yoffset=9 xadvance=26 page=0 chnl=15 +char id=471 x=422 y=0 width=42 height=50 xoffset=8 yoffset=0 xadvance=38 page=0 chnl=15 +char id=472 x=843 y=204 width=31 height=44 xoffset=5 yoffset=5 xadvance=26 page=0 chnl=15 +char id=473 x=557 y=0 width=40 height=50 xoffset=8 yoffset=0 xadvance=38 page=0 chnl=15 +char id=474 x=911 y=204 width=31 height=44 xoffset=5 yoffset=5 xadvance=26 page=0 chnl=15 +char id=475 x=377 y=0 width=42 height=50 xoffset=8 yoffset=0 xadvance=38 page=0 chnl=15 +char id=476 x=0 y=259 width=26 height=44 xoffset=5 yoffset=5 xadvance=26 page=0 chnl=15 +char id=506 x=932 y=0 width=43 height=49 xoffset=0 yoffset=0 xadvance=38 page=0 chnl=15 +char id=507 x=600 y=0 width=34 height=50 xoffset=3 yoffset=0 xadvance=23 page=0 chnl=15 +char id=508 x=142 y=108 width=56 height=48 xoffset=0 yoffset=0 xadvance=47 page=0 chnl=15 +char id=509 x=248 y=302 width=36 height=38 xoffset=3 yoffset=11 xadvance=34 page=0 chnl=15 +char id=510 x=0 y=0 width=48 height=53 xoffset=1 yoffset=0 xadvance=38 page=0 chnl=15 +char id=511 x=118 y=259 width=33 height=43 xoffset=0 yoffset=11 xadvance=26 page=0 chnl=15 +char id=710 x=937 y=519 width=17 height=10 xoffset=9 yoffset=11 xadvance=18 page=0 chnl=15 +char id=711 x=957 y=519 width=17 height=10 xoffset=12 yoffset=11 xadvance=18 page=0 chnl=15 +char id=713 x=412 y=562 width=18 height=4 xoffset=10 yoffset=15 xadvance=18 page=0 chnl=15 +char id=728 x=76 y=572 width=16 height=9 xoffset=12 yoffset=12 xadvance=18 page=0 chnl=15 +char id=729 x=1012 y=359 width=6 height=6 xoffset=16 yoffset=14 xadvance=18 page=0 chnl=15 +char id=730 x=896 y=520 width=12 height=12 xoffset=14 yoffset=9 xadvance=18 page=0 chnl=15 +char id=731 x=0 y=573 width=11 height=10 xoffset=1 yoffset=47 xadvance=18 page=0 chnl=15 +char id=732 x=124 y=572 width=21 height=7 xoffset=9 yoffset=14 xadvance=18 page=0 chnl=15 +char id=733 x=911 y=519 width=23 height=10 xoffset=9 yoffset=11 xadvance=20 page=0 chnl=15 +char id=768 x=27 y=573 width=10 height=10 xoffset=-5 yoffset=11 xadvance=0 page=0 chnl=15 +char id=769 x=995 y=519 width=15 height=10 xoffset=-4 yoffset=11 xadvance=0 page=0 chnl=15 +char id=771 x=1001 y=93 width=20 height=6 xoffset=-8 yoffset=15 xadvance=0 page=0 chnl=15 +char id=777 x=40 y=573 width=10 height=10 xoffset=-2 yoffset=11 xadvance=0 page=0 chnl=15 +char id=803 x=1013 y=519 width=6 height=6 xoffset=-19 yoffset=51 xadvance=0 page=0 chnl=15 +char id=8204 x=1018 y=187 width=1 height=1 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=8205 x=1018 y=191 width=1 height=1 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=8206 x=1018 y=195 width=1 height=1 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=8207 x=1018 y=159 width=1 height=1 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=8211 x=329 y=569 width=28 height=4 xoffset=3 yoffset=34 xadvance=26 page=0 chnl=15 +char id=8212 x=213 y=570 width=55 height=4 xoffset=3 yoffset=34 xadvance=53 page=0 chnl=15 +char id=8213 x=271 y=570 width=55 height=4 xoffset=3 yoffset=34 xadvance=53 page=0 chnl=15 +char id=8215 x=53 y=572 width=20 height=9 xoffset=1 yoffset=50 xadvance=25 page=0 chnl=15 +char id=8216 x=805 y=520 width=10 height=14 xoffset=12 yoffset=11 xadvance=13 page=0 chnl=15 +char id=8217 x=818 y=520 width=10 height=14 xoffset=12 yoffset=11 xadvance=13 page=0 chnl=15 +char id=8218 x=854 y=520 width=10 height=13 xoffset=1 yoffset=42 xadvance=13 page=0 chnl=15 +char id=8219 x=1012 y=332 width=9 height=14 xoffset=13 yoffset=11 xadvance=13 page=0 chnl=15 +char id=8220 x=740 y=520 width=20 height=14 xoffset=12 yoffset=11 xadvance=23 page=0 chnl=15 +char id=8221 x=763 y=520 width=20 height=14 xoffset=12 yoffset=11 xadvance=23 page=0 chnl=15 +char id=8222 x=831 y=520 width=20 height=13 xoffset=1 yoffset=42 xadvance=23 page=0 chnl=15 +char id=8224 x=504 y=205 width=22 height=45 xoffset=10 yoffset=11 xadvance=26 page=0 chnl=15 +char id=8225 x=443 y=207 width=28 height=45 xoffset=4 yoffset=11 xadvance=26 page=0 chnl=15 +char id=8226 x=703 y=520 width=16 height=15 xoffset=7 yoffset=23 xadvance=18 page=0 chnl=15 +char id=8230 x=148 y=572 width=42 height=6 xoffset=7 yoffset=42 xadvance=53 page=0 chnl=15 +char id=8234 x=1018 y=171 width=1 height=1 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=8235 x=1018 y=163 width=1 height=1 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=8236 x=1018 y=167 width=1 height=1 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=8237 x=1018 y=183 width=1 height=1 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=8238 x=1018 y=179 width=1 height=1 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=8240 x=461 y=255 width=54 height=39 xoffset=4 yoffset=10 xadvance=53 page=0 chnl=15 +char id=8242 x=722 y=520 width=15 height=15 xoffset=10 yoffset=8 xadvance=13 page=0 chnl=15 +char id=8243 x=674 y=524 width=26 height=15 xoffset=9 yoffset=8 xadvance=22 page=0 chnl=15 +char id=8249 x=482 y=532 width=16 height=21 xoffset=4 yoffset=25 xadvance=13 page=0 chnl=15 +char id=8250 x=501 y=532 width=16 height=21 xoffset=1 yoffset=25 xadvance=13 page=0 chnl=15 +char id=8252 x=79 y=387 width=35 height=37 xoffset=7 yoffset=11 xadvance=35 page=0 chnl=15 +char id=8254 x=469 y=557 width=29 height=3 xoffset=9 yoffset=16 xadvance=26 page=0 chnl=15 +char id=8260 x=860 y=251 width=40 height=38 xoffset=-9 yoffset=11 xadvance=9 page=0 chnl=15 +char id=8355 x=44 y=468 width=41 height=36 xoffset=0 yoffset=12 xadvance=29 page=0 chnl=15 +char id=8356 x=155 y=387 width=34 height=37 xoffset=1 yoffset=11 xadvance=26 page=0 chnl=15 +char id=8359 x=512 y=338 width=55 height=37 xoffset=0 yoffset=12 xadvance=50 page=0 chnl=15 +char id=8362 x=153 y=506 width=51 height=33 xoffset=3 yoffset=15 xadvance=46 page=0 chnl=15 +char id=8363 x=766 y=204 width=36 height=44 xoffset=4 yoffset=5 xadvance=27 page=0 chnl=15 +char id=8364 x=641 y=252 width=42 height=38 xoffset=6 yoffset=11 xadvance=39 page=0 chnl=15 +char id=8453 x=817 y=251 width=40 height=38 xoffset=6 yoffset=11 xadvance=41 page=0 chnl=15 +char id=8467 x=604 y=293 width=30 height=38 xoffset=5 yoffset=11 xadvance=22 page=0 chnl=15 +char id=8470 x=570 y=336 width=52 height=37 xoffset=0 yoffset=12 xadvance=47 page=0 chnl=15 +char id=8482 x=43 y=544 width=56 height=25 xoffset=9 yoffset=12 xadvance=54 page=0 chnl=15 +char id=8486 x=838 y=333 width=44 height=37 xoffset=1 yoffset=11 xadvance=39 page=0 chnl=15 +char id=8494 x=816 y=491 width=27 height=26 xoffset=5 yoffset=23 xadvance=28 page=0 chnl=15 +kernings count=8379 +kerning first=212 second=8249 amount=-1 +kerning first=44 second=45 amount=-2 +kerning first=44 second=171 amount=-2 +kerning first=44 second=8217 amount=-4 +kerning first=44 second=8220 amount=-4 +kerning first=44 second=8221 amount=-4 +kerning first=44 second=8249 amount=-2 +kerning first=45 second=65 amount=-3 +kerning first=45 second=66 amount=-4 +kerning first=45 second=68 amount=-4 +kerning first=45 second=69 amount=-4 +kerning first=45 second=70 amount=-4 +kerning first=45 second=72 amount=-4 +kerning first=45 second=73 amount=-4 +kerning first=45 second=74 amount=-3 +kerning first=45 second=75 amount=-4 +kerning first=45 second=76 amount=-4 +kerning first=45 second=77 amount=-4 +kerning first=45 second=78 amount=-4 +kerning first=45 second=80 amount=-4 +kerning first=45 second=82 amount=-4 +kerning first=45 second=83 amount=-2 +kerning first=45 second=84 amount=-3 +kerning first=45 second=85 amount=-3 +kerning first=45 second=86 amount=-3 +kerning first=45 second=87 amount=-3 +kerning first=45 second=89 amount=-3 +kerning first=45 second=90 amount=-3 +kerning first=45 second=97 amount=-1 +kerning first=45 second=98 amount=-1 +kerning first=45 second=102 amount=-1 +kerning first=45 second=103 amount=-2 +kerning first=45 second=104 amount=-1 +kerning first=45 second=105 amount=-1 +kerning first=45 second=106 amount=-1 +kerning first=45 second=107 amount=-1 +kerning first=45 second=108 amount=-1 +kerning first=45 second=109 amount=-1 +kerning first=45 second=110 amount=-1 +kerning first=45 second=112 amount=-1 +kerning first=45 second=114 amount=-1 +kerning first=45 second=115 amount=-1 +kerning first=45 second=116 amount=-1 +kerning first=45 second=117 amount=-1 +kerning first=45 second=118 amount=-2 +kerning first=45 second=119 amount=-2 +kerning first=45 second=120 amount=-2 +kerning first=45 second=121 amount=-2 +kerning first=45 second=122 amount=-4 +kerning first=45 second=192 amount=-3 +kerning first=45 second=193 amount=-3 +kerning first=45 second=194 amount=-3 +kerning first=45 second=195 amount=-3 +kerning first=45 second=196 amount=-3 +kerning first=45 second=197 amount=-3 +kerning first=45 second=198 amount=-3 +kerning first=45 second=200 amount=-4 +kerning first=45 second=201 amount=-4 +kerning first=45 second=202 amount=-4 +kerning first=45 second=203 amount=-4 +kerning first=45 second=204 amount=-4 +kerning first=45 second=205 amount=-4 +kerning first=45 second=206 amount=-4 +kerning first=45 second=207 amount=-4 +kerning first=45 second=209 amount=-4 +kerning first=45 second=217 amount=-3 +kerning first=45 second=218 amount=-3 +kerning first=45 second=219 amount=-3 +kerning first=45 second=220 amount=-3 +kerning first=45 second=221 amount=-3 +kerning first=45 second=223 amount=-1 +kerning first=45 second=224 amount=-1 +kerning first=45 second=225 amount=-1 +kerning first=45 second=226 amount=-1 +kerning first=45 second=227 amount=-1 +kerning first=45 second=229 amount=-1 +kerning first=45 second=230 amount=-1 +kerning first=45 second=237 amount=-1 +kerning first=45 second=241 amount=-1 +kerning first=45 second=249 amount=-1 +kerning first=45 second=250 amount=-1 +kerning first=45 second=251 amount=-1 +kerning first=45 second=252 amount=-1 +kerning first=45 second=253 amount=-2 +kerning first=45 second=254 amount=-1 +kerning first=45 second=255 amount=-2 +kerning first=45 second=256 amount=-3 +kerning first=45 second=257 amount=-1 +kerning first=45 second=259 amount=-1 +kerning first=45 second=260 amount=-3 +kerning first=45 second=261 amount=-1 +kerning first=45 second=270 amount=-4 +kerning first=45 second=274 amount=-4 +kerning first=45 second=278 amount=-4 +kerning first=45 second=280 amount=-4 +kerning first=45 second=282 amount=-4 +kerning first=45 second=287 amount=-2 +kerning first=45 second=289 amount=-2 +kerning first=45 second=291 amount=-2 +kerning first=45 second=296 amount=-4 +kerning first=45 second=298 amount=-4 +kerning first=45 second=302 amount=-4 +kerning first=45 second=303 amount=-1 +kerning first=45 second=305 amount=-1 +kerning first=45 second=307 amount=-1 +kerning first=45 second=310 amount=-4 +kerning first=45 second=311 amount=-1 +kerning first=45 second=313 amount=-4 +kerning first=45 second=314 amount=-1 +kerning first=45 second=315 amount=-4 +kerning first=45 second=316 amount=-1 +kerning first=45 second=317 amount=-4 +kerning first=45 second=318 amount=-1 +kerning first=45 second=323 amount=-4 +kerning first=45 second=324 amount=-1 +kerning first=45 second=325 amount=-4 +kerning first=45 second=326 amount=-1 +kerning first=45 second=327 amount=-4 +kerning first=45 second=328 amount=-1 +kerning first=45 second=330 amount=-4 +kerning first=45 second=331 amount=-1 +kerning first=45 second=344 amount=-4 +kerning first=45 second=345 amount=-1 +kerning first=45 second=346 amount=-2 +kerning first=45 second=347 amount=-1 +kerning first=45 second=350 amount=-2 +kerning first=45 second=351 amount=-1 +kerning first=45 second=352 amount=-2 +kerning first=45 second=353 amount=-1 +kerning first=45 second=354 amount=-3 +kerning first=45 second=355 amount=-1 +kerning first=45 second=356 amount=-3 +kerning first=45 second=357 amount=-1 +kerning first=45 second=361 amount=-1 +kerning first=45 second=362 amount=-3 +kerning first=45 second=363 amount=-1 +kerning first=45 second=364 amount=-3 +kerning first=45 second=365 amount=-1 +kerning first=45 second=366 amount=-3 +kerning first=45 second=367 amount=-1 +kerning first=45 second=368 amount=-3 +kerning first=45 second=369 amount=-1 +kerning first=45 second=370 amount=-3 +kerning first=45 second=371 amount=-1 +kerning first=45 second=374 amount=-3 +kerning first=45 second=375 amount=-2 +kerning first=45 second=377 amount=-3 +kerning first=45 second=378 amount=-4 +kerning first=45 second=379 amount=-3 +kerning first=45 second=380 amount=-4 +kerning first=45 second=381 amount=-3 +kerning first=45 second=382 amount=-4 +kerning first=212 second=8221 amount=-1 +kerning first=212 second=8220 amount=-1 +kerning first=212 second=8217 amount=-1 +kerning first=212 second=382 amount=-1 +kerning first=212 second=381 amount=-1 +kerning first=212 second=380 amount=-1 +kerning first=212 second=379 amount=-1 +kerning first=212 second=378 amount=-1 +kerning first=212 second=377 amount=-1 +kerning first=212 second=374 amount=-1 +kerning first=212 second=370 amount=-1 +kerning first=212 second=368 amount=-1 +kerning first=212 second=366 amount=-1 +kerning first=212 second=364 amount=-1 +kerning first=212 second=362 amount=-1 +kerning first=212 second=356 amount=-1 +kerning first=212 second=354 amount=-1 +kerning first=212 second=352 amount=-1 +kerning first=212 second=350 amount=-1 +kerning first=212 second=346 amount=-1 +kerning first=212 second=344 amount=-1 +kerning first=212 second=330 amount=-1 +kerning first=212 second=327 amount=-1 +kerning first=212 second=325 amount=-1 +kerning first=212 second=323 amount=-1 +kerning first=212 second=317 amount=-1 +kerning first=212 second=315 amount=-1 +kerning first=212 second=313 amount=-1 +kerning first=212 second=310 amount=-1 +kerning first=212 second=304 amount=-1 +kerning first=46 second=45 amount=-2 +kerning first=46 second=171 amount=-2 +kerning first=46 second=8217 amount=-4 +kerning first=46 second=8220 amount=-4 +kerning first=46 second=8221 amount=-4 +kerning first=46 second=8249 amount=-2 +kerning first=65 second=45 amount=-3 +kerning first=65 second=67 amount=-2 +kerning first=65 second=71 amount=-2 +kerning first=65 second=79 amount=-2 +kerning first=65 second=81 amount=-2 +kerning first=65 second=83 amount=-2 +kerning first=65 second=84 amount=-5 +kerning first=65 second=85 amount=-2 +kerning first=65 second=86 amount=-5 +kerning first=65 second=87 amount=-5 +kerning first=65 second=89 amount=-5 +kerning first=65 second=98 amount=-1 +kerning first=65 second=99 amount=-1 +kerning first=65 second=100 amount=-1 +kerning first=65 second=101 amount=-1 +kerning first=212 second=302 amount=-1 +kerning first=65 second=103 amount=-2 +kerning first=65 second=104 amount=-1 +kerning first=212 second=298 amount=-1 +kerning first=65 second=107 amount=-1 +kerning first=65 second=108 amount=-1 +kerning first=65 second=111 amount=-1 +kerning first=65 second=112 amount=-2 +kerning first=65 second=113 amount=-1 +kerning first=65 second=115 amount=-2 +kerning first=65 second=116 amount=-1 +kerning first=65 second=117 amount=-2 +kerning first=65 second=118 amount=-2 +kerning first=65 second=119 amount=-2 +kerning first=65 second=121 amount=-2 +kerning first=65 second=171 amount=-3 +kerning first=65 second=199 amount=-2 +kerning first=65 second=210 amount=-2 +kerning first=65 second=211 amount=-2 +kerning first=65 second=212 amount=-2 +kerning first=65 second=213 amount=-2 +kerning first=65 second=214 amount=-2 +kerning first=65 second=216 amount=-2 +kerning first=65 second=217 amount=-2 +kerning first=65 second=218 amount=-2 +kerning first=65 second=219 amount=-2 +kerning first=65 second=220 amount=-2 +kerning first=65 second=221 amount=-5 +kerning first=65 second=231 amount=-1 +kerning first=65 second=232 amount=-1 +kerning first=65 second=233 amount=-1 +kerning first=65 second=234 amount=-1 +kerning first=65 second=235 amount=-1 +kerning first=212 second=296 amount=-1 +kerning first=65 second=240 amount=-1 +kerning first=65 second=242 amount=-1 +kerning first=65 second=243 amount=-1 +kerning first=65 second=244 amount=-1 +kerning first=65 second=245 amount=-1 +kerning first=65 second=246 amount=-1 +kerning first=65 second=248 amount=-1 +kerning first=65 second=249 amount=-2 +kerning first=65 second=250 amount=-2 +kerning first=65 second=251 amount=-2 +kerning first=65 second=252 amount=-2 +kerning first=65 second=253 amount=-2 +kerning first=65 second=254 amount=-1 +kerning first=65 second=255 amount=-2 +kerning first=65 second=262 amount=-2 +kerning first=65 second=263 amount=-1 +kerning first=65 second=264 amount=-2 +kerning first=65 second=266 amount=-2 +kerning first=65 second=267 amount=-1 +kerning first=65 second=268 amount=-2 +kerning first=65 second=269 amount=-1 +kerning first=65 second=275 amount=-1 +kerning first=65 second=277 amount=-1 +kerning first=65 second=279 amount=-1 +kerning first=65 second=281 amount=-1 +kerning first=65 second=283 amount=-1 +kerning first=65 second=284 amount=-2 +kerning first=65 second=286 amount=-2 +kerning first=65 second=287 amount=-2 +kerning first=65 second=288 amount=-2 +kerning first=65 second=289 amount=-2 +kerning first=65 second=290 amount=-2 +kerning first=65 second=291 amount=-2 +kerning first=212 second=291 amount=-1 +kerning first=212 second=289 amount=-1 +kerning first=65 second=311 amount=-1 +kerning first=65 second=314 amount=-1 +kerning first=65 second=316 amount=-1 +kerning first=65 second=318 amount=-1 +kerning first=65 second=332 amount=-2 +kerning first=65 second=333 amount=-1 +kerning first=65 second=334 amount=-2 +kerning first=65 second=335 amount=-1 +kerning first=65 second=336 amount=-2 +kerning first=65 second=337 amount=-1 +kerning first=65 second=338 amount=-2 +kerning first=65 second=339 amount=-1 +kerning first=65 second=346 amount=-2 +kerning first=65 second=347 amount=-2 +kerning first=65 second=350 amount=-2 +kerning first=65 second=351 amount=-2 +kerning first=65 second=352 amount=-2 +kerning first=65 second=353 amount=-2 +kerning first=65 second=354 amount=-5 +kerning first=65 second=355 amount=-1 +kerning first=65 second=356 amount=-5 +kerning first=65 second=361 amount=-2 +kerning first=65 second=362 amount=-2 +kerning first=65 second=363 amount=-2 +kerning first=65 second=364 amount=-2 +kerning first=65 second=365 amount=-2 +kerning first=65 second=366 amount=-2 +kerning first=65 second=367 amount=-2 +kerning first=65 second=368 amount=-2 +kerning first=65 second=369 amount=-2 +kerning first=65 second=370 amount=-2 +kerning first=65 second=374 amount=-5 +kerning first=65 second=375 amount=-2 +kerning first=212 second=287 amount=-1 +kerning first=212 second=282 amount=-1 +kerning first=212 second=280 amount=-1 +kerning first=212 second=278 amount=-1 +kerning first=212 second=274 amount=-1 +kerning first=212 second=270 amount=-1 +kerning first=212 second=261 amount=-1 +kerning first=212 second=260 amount=-3 +kerning first=212 second=259 amount=-1 +kerning first=212 second=257 amount=-1 +kerning first=212 second=256 amount=-3 +kerning first=212 second=230 amount=-1 +kerning first=212 second=229 amount=-1 +kerning first=212 second=228 amount=-1 +kerning first=212 second=227 amount=-1 +kerning first=65 second=8217 amount=-4 +kerning first=65 second=8220 amount=-4 +kerning first=65 second=8221 amount=-4 +kerning first=65 second=8249 amount=-3 +kerning first=212 second=226 amount=-1 +kerning first=212 second=225 amount=-1 +kerning first=212 second=224 amount=-1 +kerning first=212 second=221 amount=-1 +kerning first=212 second=220 amount=-1 +kerning first=66 second=44 amount=-3 +kerning first=66 second=45 amount=-2 +kerning first=66 second=46 amount=-3 +kerning first=66 second=65 amount=-4 +kerning first=66 second=66 amount=-3 +kerning first=66 second=67 amount=-2 +kerning first=66 second=68 amount=-3 +kerning first=66 second=69 amount=-3 +kerning first=66 second=70 amount=-3 +kerning first=66 second=71 amount=-2 +kerning first=66 second=72 amount=-3 +kerning first=66 second=73 amount=-3 +kerning first=66 second=74 amount=-3 +kerning first=66 second=75 amount=-3 +kerning first=66 second=76 amount=-3 +kerning first=66 second=77 amount=-3 +kerning first=66 second=78 amount=-3 +kerning first=66 second=79 amount=-2 +kerning first=66 second=80 amount=-3 +kerning first=66 second=81 amount=-2 +kerning first=66 second=82 amount=-3 +kerning first=66 second=83 amount=-3 +kerning first=66 second=84 amount=-2 +kerning first=66 second=85 amount=-2 +kerning first=66 second=86 amount=-2 +kerning first=66 second=87 amount=-2 +kerning first=66 second=89 amount=-2 +kerning first=66 second=90 amount=-3 +kerning first=66 second=97 amount=-2 +kerning first=66 second=98 amount=-2 +kerning first=212 second=219 amount=-1 +kerning first=212 second=218 amount=-1 +kerning first=212 second=217 amount=-1 +kerning first=66 second=102 amount=-2 +kerning first=66 second=103 amount=-3 +kerning first=66 second=104 amount=-2 +kerning first=66 second=105 amount=-2 +kerning first=66 second=106 amount=-2 +kerning first=66 second=107 amount=-2 +kerning first=66 second=108 amount=-2 +kerning first=66 second=109 amount=-2 +kerning first=66 second=110 amount=-2 +kerning first=212 second=209 amount=-1 +kerning first=66 second=112 amount=-3 +kerning first=212 second=207 amount=-1 +kerning first=66 second=114 amount=-2 +kerning first=66 second=115 amount=-2 +kerning first=66 second=116 amount=-1 +kerning first=66 second=117 amount=-2 +kerning first=66 second=118 amount=-2 +kerning first=66 second=119 amount=-2 +kerning first=66 second=120 amount=-2 +kerning first=66 second=121 amount=-2 +kerning first=66 second=122 amount=-3 +kerning first=66 second=171 amount=-2 +kerning first=66 second=187 amount=-1 +kerning first=66 second=192 amount=-4 +kerning first=66 second=193 amount=-4 +kerning first=66 second=194 amount=-4 +kerning first=66 second=196 amount=-4 +kerning first=66 second=197 amount=-4 +kerning first=66 second=198 amount=-4 +kerning first=66 second=199 amount=-2 +kerning first=66 second=200 amount=-3 +kerning first=66 second=201 amount=-3 +kerning first=66 second=202 amount=-3 +kerning first=66 second=203 amount=-3 +kerning first=66 second=204 amount=-3 +kerning first=66 second=205 amount=-3 +kerning first=66 second=206 amount=-3 +kerning first=66 second=207 amount=-3 +kerning first=66 second=209 amount=-3 +kerning first=66 second=210 amount=-2 +kerning first=66 second=211 amount=-2 +kerning first=66 second=212 amount=-2 +kerning first=66 second=213 amount=-2 +kerning first=66 second=214 amount=-2 +kerning first=66 second=216 amount=-2 +kerning first=66 second=217 amount=-2 +kerning first=66 second=218 amount=-2 +kerning first=66 second=219 amount=-2 +kerning first=66 second=220 amount=-2 +kerning first=66 second=221 amount=-2 +kerning first=66 second=223 amount=-2 +kerning first=66 second=224 amount=-2 +kerning first=66 second=225 amount=-2 +kerning first=66 second=226 amount=-2 +kerning first=66 second=227 amount=-2 +kerning first=66 second=228 amount=-2 +kerning first=66 second=229 amount=-2 +kerning first=66 second=230 amount=-2 +kerning first=212 second=206 amount=-1 +kerning first=212 second=205 amount=-1 +kerning first=212 second=204 amount=-1 +kerning first=212 second=203 amount=-1 +kerning first=212 second=202 amount=-1 +kerning first=66 second=237 amount=-2 +kerning first=212 second=201 amount=-1 +kerning first=66 second=241 amount=-2 +kerning first=212 second=200 amount=-1 +kerning first=212 second=198 amount=-3 +kerning first=212 second=197 amount=-3 +kerning first=212 second=196 amount=-3 +kerning first=212 second=194 amount=-3 +kerning first=212 second=193 amount=-3 +kerning first=66 second=249 amount=-2 +kerning first=66 second=250 amount=-2 +kerning first=66 second=251 amount=-2 +kerning first=66 second=252 amount=-2 +kerning first=66 second=253 amount=-2 +kerning first=66 second=254 amount=-2 +kerning first=66 second=255 amount=-2 +kerning first=66 second=256 amount=-4 +kerning first=66 second=257 amount=-2 +kerning first=66 second=259 amount=-2 +kerning first=66 second=260 amount=-4 +kerning first=66 second=261 amount=-2 +kerning first=66 second=262 amount=-2 +kerning first=212 second=192 amount=-3 +kerning first=66 second=264 amount=-2 +kerning first=66 second=266 amount=-2 +kerning first=212 second=171 amount=-1 +kerning first=66 second=268 amount=-2 +kerning first=212 second=122 amount=-1 +kerning first=66 second=270 amount=-3 +kerning first=66 second=274 amount=-3 +kerning first=212 second=120 amount=-1 +kerning first=212 second=106 amount=-1 +kerning first=66 second=278 amount=-3 +kerning first=212 second=103 amount=-1 +kerning first=66 second=280 amount=-3 +kerning first=212 second=97 amount=-1 +kerning first=66 second=282 amount=-3 +kerning first=212 second=90 amount=-1 +kerning first=66 second=284 amount=-2 +kerning first=66 second=286 amount=-2 +kerning first=66 second=287 amount=-3 +kerning first=66 second=288 amount=-2 +kerning first=66 second=289 amount=-3 +kerning first=66 second=290 amount=-2 +kerning first=66 second=291 amount=-3 +kerning first=66 second=296 amount=-3 +kerning first=66 second=298 amount=-3 +kerning first=66 second=302 amount=-3 +kerning first=66 second=303 amount=-2 +kerning first=66 second=304 amount=-3 +kerning first=66 second=305 amount=-2 +kerning first=66 second=310 amount=-3 +kerning first=66 second=311 amount=-2 +kerning first=66 second=313 amount=-3 +kerning first=66 second=314 amount=-2 +kerning first=66 second=315 amount=-3 +kerning first=66 second=316 amount=-2 +kerning first=66 second=317 amount=-3 +kerning first=66 second=318 amount=-2 +kerning first=66 second=323 amount=-3 +kerning first=66 second=324 amount=-2 +kerning first=66 second=325 amount=-3 +kerning first=66 second=326 amount=-2 +kerning first=66 second=327 amount=-3 +kerning first=66 second=328 amount=-2 +kerning first=66 second=330 amount=-3 +kerning first=66 second=331 amount=-2 +kerning first=66 second=332 amount=-2 +kerning first=212 second=89 amount=-1 +kerning first=66 second=334 amount=-2 +kerning first=212 second=87 amount=-1 +kerning first=66 second=336 amount=-2 +kerning first=212 second=86 amount=-1 +kerning first=66 second=338 amount=-2 +kerning first=212 second=85 amount=-1 +kerning first=66 second=344 amount=-3 +kerning first=66 second=345 amount=-2 +kerning first=66 second=346 amount=-3 +kerning first=66 second=347 amount=-2 +kerning first=66 second=350 amount=-3 +kerning first=66 second=351 amount=-2 +kerning first=66 second=352 amount=-3 +kerning first=66 second=353 amount=-2 +kerning first=66 second=354 amount=-2 +kerning first=66 second=355 amount=-1 +kerning first=66 second=356 amount=-2 +kerning first=66 second=361 amount=-2 +kerning first=66 second=362 amount=-2 +kerning first=66 second=363 amount=-2 +kerning first=66 second=364 amount=-2 +kerning first=66 second=365 amount=-2 +kerning first=66 second=366 amount=-2 +kerning first=66 second=367 amount=-2 +kerning first=66 second=368 amount=-2 +kerning first=66 second=369 amount=-2 +kerning first=66 second=370 amount=-2 +kerning first=66 second=374 amount=-2 +kerning first=66 second=375 amount=-2 +kerning first=66 second=377 amount=-3 +kerning first=66 second=378 amount=-3 +kerning first=66 second=379 amount=-3 +kerning first=66 second=380 amount=-3 +kerning first=66 second=381 amount=-3 +kerning first=66 second=382 amount=-3 +kerning first=212 second=84 amount=-1 +kerning first=212 second=83 amount=-1 +kerning first=212 second=82 amount=-1 +kerning first=212 second=80 amount=-1 +kerning first=212 second=78 amount=-1 +kerning first=212 second=77 amount=-1 +kerning first=212 second=76 amount=-1 +kerning first=212 second=75 amount=-1 +kerning first=212 second=74 amount=-1 +kerning first=212 second=73 amount=-1 +kerning first=212 second=72 amount=-1 +kerning first=212 second=70 amount=-1 +kerning first=212 second=69 amount=-1 +kerning first=212 second=68 amount=-1 +kerning first=212 second=66 amount=-1 +kerning first=212 second=65 amount=-3 +kerning first=212 second=46 amount=-2 +kerning first=212 second=45 amount=-1 +kerning first=212 second=44 amount=-2 +kerning first=211 second=8249 amount=-1 +kerning first=211 second=8221 amount=-1 +kerning first=211 second=8220 amount=-1 +kerning first=211 second=8217 amount=-1 +kerning first=211 second=382 amount=-1 +kerning first=211 second=381 amount=-1 +kerning first=211 second=380 amount=-1 +kerning first=66 second=8217 amount=-3 +kerning first=66 second=8220 amount=-3 +kerning first=66 second=8221 amount=-3 +kerning first=66 second=8249 amount=-2 +kerning first=66 second=8250 amount=-1 +kerning first=211 second=379 amount=-1 +kerning first=211 second=378 amount=-1 +kerning first=211 second=377 amount=-1 +kerning first=211 second=374 amount=-1 +kerning first=211 second=370 amount=-1 +kerning first=67 second=44 amount=-1 +kerning first=67 second=45 amount=-3 +kerning first=67 second=46 amount=-1 +kerning first=67 second=65 amount=-2 +kerning first=67 second=66 amount=-2 +kerning first=67 second=67 amount=-2 +kerning first=67 second=68 amount=-2 +kerning first=67 second=69 amount=-2 +kerning first=67 second=70 amount=-2 +kerning first=67 second=71 amount=-2 +kerning first=67 second=72 amount=-2 +kerning first=67 second=73 amount=-2 +kerning first=67 second=74 amount=-1 +kerning first=67 second=75 amount=-2 +kerning first=67 second=76 amount=-2 +kerning first=67 second=77 amount=-2 +kerning first=67 second=78 amount=-2 +kerning first=67 second=79 amount=-2 +kerning first=67 second=80 amount=-2 +kerning first=67 second=81 amount=-2 +kerning first=67 second=82 amount=-2 +kerning first=67 second=83 amount=-2 +kerning first=67 second=84 amount=-1 +kerning first=67 second=85 amount=-1 +kerning first=67 second=86 amount=-1 +kerning first=67 second=87 amount=-1 +kerning first=67 second=89 amount=-1 +kerning first=67 second=90 amount=-1 +kerning first=67 second=97 amount=-1 +kerning first=67 second=98 amount=-1 +kerning first=67 second=99 amount=-1 +kerning first=67 second=100 amount=-1 +kerning first=67 second=101 amount=-1 +kerning first=67 second=102 amount=-1 +kerning first=67 second=103 amount=-2 +kerning first=67 second=104 amount=-1 +kerning first=67 second=105 amount=-1 +kerning first=67 second=106 amount=-1 +kerning first=67 second=107 amount=-1 +kerning first=67 second=108 amount=-1 +kerning first=67 second=109 amount=-1 +kerning first=67 second=110 amount=-1 +kerning first=67 second=111 amount=-1 +kerning first=67 second=112 amount=-2 +kerning first=67 second=113 amount=-1 +kerning first=67 second=114 amount=-1 +kerning first=67 second=115 amount=-1 +kerning first=67 second=117 amount=-1 +kerning first=67 second=118 amount=-1 +kerning first=67 second=119 amount=-1 +kerning first=211 second=368 amount=-1 +kerning first=67 second=122 amount=-2 +kerning first=67 second=171 amount=-3 +kerning first=67 second=192 amount=-2 +kerning first=67 second=193 amount=-2 +kerning first=67 second=194 amount=-2 +kerning first=67 second=196 amount=-2 +kerning first=67 second=197 amount=-2 +kerning first=67 second=198 amount=-2 +kerning first=67 second=199 amount=-2 +kerning first=67 second=200 amount=-2 +kerning first=67 second=201 amount=-2 +kerning first=67 second=202 amount=-2 +kerning first=67 second=203 amount=-2 +kerning first=67 second=204 amount=-2 +kerning first=67 second=205 amount=-2 +kerning first=67 second=206 amount=-2 +kerning first=67 second=207 amount=-2 +kerning first=67 second=209 amount=-2 +kerning first=67 second=210 amount=-2 +kerning first=67 second=211 amount=-2 +kerning first=67 second=212 amount=-2 +kerning first=67 second=213 amount=-2 +kerning first=67 second=214 amount=-2 +kerning first=67 second=216 amount=-2 +kerning first=67 second=217 amount=-1 +kerning first=67 second=218 amount=-1 +kerning first=67 second=219 amount=-1 +kerning first=67 second=220 amount=-1 +kerning first=67 second=221 amount=-1 +kerning first=67 second=223 amount=-1 +kerning first=67 second=224 amount=-1 +kerning first=67 second=225 amount=-1 +kerning first=67 second=226 amount=-1 +kerning first=67 second=227 amount=-1 +kerning first=67 second=228 amount=-1 +kerning first=67 second=229 amount=-1 +kerning first=67 second=230 amount=-1 +kerning first=67 second=231 amount=-1 +kerning first=67 second=232 amount=-1 +kerning first=67 second=233 amount=-1 +kerning first=67 second=234 amount=-1 +kerning first=67 second=235 amount=-1 +kerning first=67 second=237 amount=-1 +kerning first=67 second=240 amount=-1 +kerning first=67 second=241 amount=-1 +kerning first=67 second=242 amount=-1 +kerning first=67 second=243 amount=-1 +kerning first=67 second=244 amount=-1 +kerning first=67 second=245 amount=-1 +kerning first=67 second=246 amount=-1 +kerning first=67 second=248 amount=-1 +kerning first=67 second=249 amount=-1 +kerning first=67 second=250 amount=-1 +kerning first=67 second=251 amount=-1 +kerning first=67 second=252 amount=-1 +kerning first=211 second=366 amount=-1 +kerning first=67 second=254 amount=-1 +kerning first=211 second=364 amount=-1 +kerning first=67 second=256 amount=-2 +kerning first=67 second=257 amount=-1 +kerning first=67 second=259 amount=-1 +kerning first=67 second=260 amount=-2 +kerning first=67 second=261 amount=-1 +kerning first=67 second=262 amount=-2 +kerning first=67 second=263 amount=-1 +kerning first=67 second=264 amount=-2 +kerning first=67 second=266 amount=-2 +kerning first=67 second=267 amount=-1 +kerning first=67 second=268 amount=-2 +kerning first=67 second=269 amount=-1 +kerning first=67 second=270 amount=-2 +kerning first=67 second=274 amount=-2 +kerning first=67 second=275 amount=-1 +kerning first=67 second=277 amount=-1 +kerning first=67 second=278 amount=-2 +kerning first=67 second=279 amount=-1 +kerning first=67 second=280 amount=-2 +kerning first=67 second=281 amount=-1 +kerning first=67 second=282 amount=-2 +kerning first=67 second=283 amount=-1 +kerning first=67 second=284 amount=-2 +kerning first=67 second=286 amount=-2 +kerning first=67 second=287 amount=-2 +kerning first=67 second=288 amount=-2 +kerning first=67 second=289 amount=-2 +kerning first=67 second=290 amount=-2 +kerning first=67 second=291 amount=-2 +kerning first=67 second=296 amount=-2 +kerning first=67 second=298 amount=-2 +kerning first=67 second=302 amount=-2 +kerning first=67 second=303 amount=-1 +kerning first=67 second=304 amount=-2 +kerning first=67 second=305 amount=-1 +kerning first=67 second=310 amount=-2 +kerning first=67 second=311 amount=-1 +kerning first=67 second=313 amount=-2 +kerning first=67 second=314 amount=-1 +kerning first=67 second=315 amount=-2 +kerning first=67 second=316 amount=-1 +kerning first=67 second=317 amount=-2 +kerning first=67 second=318 amount=-1 +kerning first=67 second=323 amount=-2 +kerning first=67 second=324 amount=-1 +kerning first=67 second=325 amount=-2 +kerning first=67 second=326 amount=-1 +kerning first=67 second=327 amount=-2 +kerning first=67 second=328 amount=-1 +kerning first=67 second=330 amount=-2 +kerning first=67 second=331 amount=-1 +kerning first=67 second=332 amount=-2 +kerning first=67 second=333 amount=-1 +kerning first=67 second=334 amount=-2 +kerning first=67 second=335 amount=-1 +kerning first=67 second=336 amount=-2 +kerning first=67 second=337 amount=-1 +kerning first=67 second=338 amount=-2 +kerning first=67 second=339 amount=-1 +kerning first=67 second=344 amount=-2 +kerning first=67 second=345 amount=-1 +kerning first=67 second=346 amount=-2 +kerning first=67 second=347 amount=-1 +kerning first=67 second=350 amount=-2 +kerning first=67 second=351 amount=-1 +kerning first=67 second=352 amount=-2 +kerning first=67 second=353 amount=-1 +kerning first=67 second=354 amount=-1 +kerning first=67 second=356 amount=-1 +kerning first=67 second=361 amount=-1 +kerning first=67 second=362 amount=-1 +kerning first=67 second=363 amount=-1 +kerning first=67 second=364 amount=-1 +kerning first=67 second=365 amount=-1 +kerning first=67 second=366 amount=-1 +kerning first=67 second=367 amount=-1 +kerning first=67 second=368 amount=-1 +kerning first=67 second=369 amount=-1 +kerning first=67 second=370 amount=-1 +kerning first=67 second=374 amount=-1 +kerning first=211 second=362 amount=-1 +kerning first=67 second=377 amount=-1 +kerning first=67 second=378 amount=-2 +kerning first=67 second=379 amount=-1 +kerning first=67 second=380 amount=-2 +kerning first=67 second=381 amount=-1 +kerning first=67 second=382 amount=-2 +kerning first=211 second=356 amount=-1 +kerning first=211 second=354 amount=-1 +kerning first=211 second=352 amount=-1 +kerning first=211 second=350 amount=-1 +kerning first=211 second=346 amount=-1 +kerning first=211 second=344 amount=-1 +kerning first=211 second=330 amount=-1 +kerning first=211 second=327 amount=-1 +kerning first=211 second=325 amount=-1 +kerning first=211 second=323 amount=-1 +kerning first=211 second=317 amount=-1 +kerning first=211 second=315 amount=-1 +kerning first=211 second=313 amount=-1 +kerning first=211 second=310 amount=-1 +kerning first=211 second=304 amount=-1 +kerning first=211 second=302 amount=-1 +kerning first=211 second=298 amount=-1 +kerning first=211 second=296 amount=-1 +kerning first=211 second=291 amount=-1 +kerning first=211 second=289 amount=-1 +kerning first=211 second=287 amount=-1 +kerning first=211 second=282 amount=-1 +kerning first=211 second=280 amount=-1 +kerning first=211 second=278 amount=-1 +kerning first=67 second=8249 amount=-3 +kerning first=211 second=274 amount=-1 +kerning first=211 second=270 amount=-1 +kerning first=211 second=261 amount=-1 +kerning first=211 second=260 amount=-3 +kerning first=211 second=259 amount=-1 +kerning first=68 second=44 amount=-2 +kerning first=68 second=45 amount=-1 +kerning first=68 second=46 amount=-2 +kerning first=68 second=65 amount=-3 +kerning first=68 second=66 amount=-1 +kerning first=68 second=68 amount=-1 +kerning first=68 second=69 amount=-1 +kerning first=68 second=70 amount=-1 +kerning first=68 second=72 amount=-1 +kerning first=68 second=73 amount=-1 +kerning first=68 second=74 amount=-1 +kerning first=68 second=75 amount=-1 +kerning first=68 second=76 amount=-1 +kerning first=68 second=77 amount=-1 +kerning first=68 second=78 amount=-1 +kerning first=68 second=80 amount=-1 +kerning first=68 second=82 amount=-1 +kerning first=68 second=83 amount=-1 +kerning first=68 second=84 amount=-1 +kerning first=68 second=85 amount=-1 +kerning first=68 second=86 amount=-1 +kerning first=68 second=87 amount=-1 +kerning first=68 second=89 amount=-1 +kerning first=68 second=90 amount=-1 +kerning first=68 second=97 amount=-1 +kerning first=68 second=103 amount=-1 +kerning first=211 second=257 amount=-1 +kerning first=68 second=106 amount=-1 +kerning first=211 second=256 amount=-3 +kerning first=68 second=120 amount=-1 +kerning first=68 second=122 amount=-1 +kerning first=68 second=171 amount=-1 +kerning first=68 second=192 amount=-3 +kerning first=68 second=193 amount=-3 +kerning first=68 second=194 amount=-3 +kerning first=68 second=196 amount=-3 +kerning first=68 second=197 amount=-3 +kerning first=68 second=198 amount=-3 +kerning first=68 second=200 amount=-1 +kerning first=68 second=201 amount=-1 +kerning first=68 second=202 amount=-1 +kerning first=68 second=203 amount=-1 +kerning first=68 second=204 amount=-1 +kerning first=68 second=205 amount=-1 +kerning first=68 second=206 amount=-1 +kerning first=68 second=207 amount=-1 +kerning first=68 second=209 amount=-1 +kerning first=68 second=217 amount=-1 +kerning first=68 second=218 amount=-1 +kerning first=68 second=219 amount=-1 +kerning first=68 second=220 amount=-1 +kerning first=68 second=221 amount=-1 +kerning first=68 second=224 amount=-1 +kerning first=68 second=225 amount=-1 +kerning first=68 second=226 amount=-1 +kerning first=68 second=227 amount=-1 +kerning first=68 second=228 amount=-1 +kerning first=68 second=229 amount=-1 +kerning first=68 second=230 amount=-1 +kerning first=211 second=230 amount=-1 +kerning first=68 second=256 amount=-3 +kerning first=68 second=257 amount=-1 +kerning first=68 second=259 amount=-1 +kerning first=68 second=260 amount=-3 +kerning first=68 second=261 amount=-1 +kerning first=68 second=270 amount=-1 +kerning first=68 second=274 amount=-1 +kerning first=68 second=278 amount=-1 +kerning first=68 second=280 amount=-1 +kerning first=68 second=282 amount=-1 +kerning first=68 second=287 amount=-1 +kerning first=68 second=289 amount=-1 +kerning first=68 second=291 amount=-1 +kerning first=68 second=296 amount=-1 +kerning first=68 second=298 amount=-1 +kerning first=68 second=302 amount=-1 +kerning first=211 second=229 amount=-1 +kerning first=68 second=304 amount=-1 +kerning first=211 second=228 amount=-1 +kerning first=68 second=310 amount=-1 +kerning first=68 second=313 amount=-1 +kerning first=68 second=315 amount=-1 +kerning first=68 second=317 amount=-1 +kerning first=68 second=323 amount=-1 +kerning first=68 second=325 amount=-1 +kerning first=68 second=327 amount=-1 +kerning first=68 second=330 amount=-1 +kerning first=68 second=344 amount=-1 +kerning first=68 second=346 amount=-1 +kerning first=68 second=350 amount=-1 +kerning first=68 second=352 amount=-1 +kerning first=68 second=354 amount=-1 +kerning first=68 second=356 amount=-1 +kerning first=68 second=362 amount=-1 +kerning first=68 second=364 amount=-1 +kerning first=68 second=366 amount=-1 +kerning first=68 second=368 amount=-1 +kerning first=68 second=370 amount=-1 +kerning first=68 second=374 amount=-1 +kerning first=68 second=377 amount=-1 +kerning first=68 second=378 amount=-1 +kerning first=68 second=379 amount=-1 +kerning first=68 second=380 amount=-1 +kerning first=68 second=381 amount=-1 +kerning first=68 second=382 amount=-1 +kerning first=211 second=227 amount=-1 +kerning first=211 second=226 amount=-1 +kerning first=211 second=225 amount=-1 +kerning first=211 second=224 amount=-1 +kerning first=211 second=221 amount=-1 +kerning first=211 second=220 amount=-1 +kerning first=211 second=219 amount=-1 +kerning first=211 second=218 amount=-1 +kerning first=211 second=217 amount=-1 +kerning first=211 second=209 amount=-1 +kerning first=211 second=207 amount=-1 +kerning first=211 second=206 amount=-1 +kerning first=211 second=205 amount=-1 +kerning first=211 second=204 amount=-1 +kerning first=211 second=203 amount=-1 +kerning first=211 second=202 amount=-1 +kerning first=68 second=8217 amount=-1 +kerning first=68 second=8220 amount=-1 +kerning first=68 second=8221 amount=-1 +kerning first=68 second=8249 amount=-1 +kerning first=69 second=44 amount=-1 +kerning first=69 second=45 amount=-1 +kerning first=69 second=46 amount=-1 +kerning first=69 second=65 amount=-1 +kerning first=69 second=66 amount=-1 +kerning first=69 second=67 amount=-1 +kerning first=69 second=68 amount=-1 +kerning first=69 second=69 amount=-1 +kerning first=69 second=70 amount=-1 +kerning first=69 second=71 amount=-1 +kerning first=69 second=72 amount=-1 +kerning first=69 second=73 amount=-1 +kerning first=69 second=74 amount=-1 +kerning first=69 second=75 amount=-1 +kerning first=69 second=76 amount=-1 +kerning first=69 second=77 amount=-1 +kerning first=69 second=78 amount=-1 +kerning first=69 second=79 amount=-1 +kerning first=69 second=80 amount=-1 +kerning first=69 second=81 amount=-1 +kerning first=69 second=82 amount=-1 +kerning first=69 second=83 amount=-1 +kerning first=69 second=84 amount=-1 +kerning first=69 second=85 amount=-1 +kerning first=69 second=86 amount=-1 +kerning first=69 second=87 amount=-1 +kerning first=69 second=89 amount=-1 +kerning first=69 second=90 amount=-1 +kerning first=69 second=97 amount=-1 +kerning first=69 second=98 amount=-1 +kerning first=69 second=102 amount=-1 +kerning first=69 second=103 amount=-2 +kerning first=69 second=104 amount=-1 +kerning first=211 second=201 amount=-1 +kerning first=69 second=107 amount=-1 +kerning first=69 second=108 amount=-1 +kerning first=69 second=109 amount=-1 +kerning first=69 second=110 amount=-1 +kerning first=69 second=112 amount=-1 +kerning first=69 second=115 amount=-1 +kerning first=69 second=117 amount=-1 +kerning first=69 second=118 amount=-1 +kerning first=69 second=119 amount=-1 +kerning first=69 second=120 amount=-1 +kerning first=69 second=122 amount=-1 +kerning first=69 second=171 amount=-1 +kerning first=69 second=192 amount=-1 +kerning first=69 second=193 amount=-1 +kerning first=69 second=194 amount=-1 +kerning first=69 second=196 amount=-1 +kerning first=69 second=197 amount=-1 +kerning first=69 second=198 amount=-1 +kerning first=69 second=199 amount=-1 +kerning first=69 second=200 amount=-1 +kerning first=69 second=201 amount=-1 +kerning first=69 second=202 amount=-1 +kerning first=69 second=203 amount=-1 +kerning first=69 second=204 amount=-1 +kerning first=69 second=205 amount=-1 +kerning first=69 second=206 amount=-1 +kerning first=69 second=207 amount=-1 +kerning first=69 second=209 amount=-1 +kerning first=69 second=210 amount=-1 +kerning first=69 second=211 amount=-1 +kerning first=69 second=212 amount=-1 +kerning first=69 second=213 amount=-1 +kerning first=69 second=214 amount=-1 +kerning first=69 second=216 amount=-1 +kerning first=69 second=217 amount=-1 +kerning first=69 second=218 amount=-1 +kerning first=69 second=219 amount=-1 +kerning first=69 second=220 amount=-1 +kerning first=69 second=221 amount=-1 +kerning first=69 second=223 amount=-1 +kerning first=69 second=224 amount=-1 +kerning first=69 second=225 amount=-1 +kerning first=69 second=226 amount=-1 +kerning first=69 second=227 amount=-1 +kerning first=69 second=228 amount=-1 +kerning first=69 second=229 amount=-1 +kerning first=69 second=230 amount=-1 +kerning first=211 second=200 amount=-1 +kerning first=69 second=241 amount=-1 +kerning first=69 second=249 amount=-1 +kerning first=69 second=250 amount=-1 +kerning first=69 second=251 amount=-1 +kerning first=69 second=252 amount=-1 +kerning first=69 second=254 amount=-1 +kerning first=69 second=256 amount=-1 +kerning first=69 second=257 amount=-1 +kerning first=69 second=259 amount=-1 +kerning first=69 second=260 amount=-1 +kerning first=69 second=261 amount=-1 +kerning first=69 second=262 amount=-1 +kerning first=69 second=264 amount=-1 +kerning first=69 second=266 amount=-1 +kerning first=69 second=268 amount=-1 +kerning first=69 second=270 amount=-1 +kerning first=69 second=274 amount=-1 +kerning first=69 second=278 amount=-1 +kerning first=69 second=280 amount=-1 +kerning first=69 second=282 amount=-1 +kerning first=69 second=284 amount=-1 +kerning first=69 second=286 amount=-1 +kerning first=69 second=287 amount=-2 +kerning first=69 second=288 amount=-1 +kerning first=69 second=289 amount=-2 +kerning first=69 second=290 amount=-1 +kerning first=69 second=291 amount=-2 +kerning first=69 second=296 amount=-1 +kerning first=69 second=298 amount=-1 +kerning first=69 second=302 amount=-1 +kerning first=211 second=198 amount=-3 +kerning first=69 second=304 amount=-1 +kerning first=211 second=197 amount=-3 +kerning first=69 second=310 amount=-1 +kerning first=69 second=311 amount=-1 +kerning first=69 second=313 amount=-1 +kerning first=69 second=314 amount=-1 +kerning first=69 second=315 amount=-1 +kerning first=69 second=316 amount=-1 +kerning first=69 second=317 amount=-1 +kerning first=69 second=318 amount=-1 +kerning first=69 second=323 amount=-1 +kerning first=69 second=324 amount=-1 +kerning first=69 second=325 amount=-1 +kerning first=69 second=326 amount=-1 +kerning first=69 second=327 amount=-1 +kerning first=69 second=328 amount=-1 +kerning first=69 second=330 amount=-1 +kerning first=69 second=331 amount=-1 +kerning first=69 second=332 amount=-1 +kerning first=69 second=334 amount=-1 +kerning first=69 second=336 amount=-1 +kerning first=69 second=338 amount=-1 +kerning first=69 second=344 amount=-1 +kerning first=69 second=346 amount=-1 +kerning first=69 second=347 amount=-1 +kerning first=69 second=350 amount=-1 +kerning first=69 second=351 amount=-1 +kerning first=69 second=352 amount=-1 +kerning first=69 second=353 amount=-1 +kerning first=69 second=354 amount=-1 +kerning first=69 second=356 amount=-1 +kerning first=69 second=361 amount=-1 +kerning first=69 second=362 amount=-1 +kerning first=69 second=363 amount=-1 +kerning first=69 second=364 amount=-1 +kerning first=69 second=365 amount=-1 +kerning first=69 second=366 amount=-1 +kerning first=69 second=367 amount=-1 +kerning first=69 second=368 amount=-1 +kerning first=69 second=369 amount=-1 +kerning first=69 second=370 amount=-1 +kerning first=69 second=374 amount=-1 +kerning first=69 second=377 amount=-1 +kerning first=69 second=378 amount=-1 +kerning first=69 second=379 amount=-1 +kerning first=69 second=380 amount=-1 +kerning first=69 second=381 amount=-1 +kerning first=69 second=382 amount=-1 +kerning first=211 second=196 amount=-3 +kerning first=211 second=194 amount=-3 +kerning first=211 second=193 amount=-3 +kerning first=211 second=192 amount=-3 +kerning first=211 second=171 amount=-1 +kerning first=211 second=122 amount=-1 +kerning first=211 second=120 amount=-1 +kerning first=211 second=106 amount=-1 +kerning first=211 second=103 amount=-1 +kerning first=211 second=97 amount=-1 +kerning first=211 second=90 amount=-1 +kerning first=211 second=89 amount=-1 +kerning first=211 second=87 amount=-1 +kerning first=211 second=86 amount=-1 +kerning first=211 second=85 amount=-1 +kerning first=211 second=84 amount=-1 +kerning first=211 second=83 amount=-1 +kerning first=211 second=82 amount=-1 +kerning first=211 second=80 amount=-1 +kerning first=211 second=78 amount=-1 +kerning first=211 second=77 amount=-1 +kerning first=211 second=76 amount=-1 +kerning first=69 second=8249 amount=-1 +kerning first=211 second=75 amount=-1 +kerning first=211 second=74 amount=-1 +kerning first=211 second=73 amount=-1 +kerning first=211 second=72 amount=-1 +kerning first=211 second=70 amount=-1 +kerning first=70 second=44 amount=-2 +kerning first=70 second=45 amount=-2 +kerning first=70 second=46 amount=-2 +kerning first=70 second=65 amount=-2 +kerning first=70 second=67 amount=-1 +kerning first=70 second=71 amount=-1 +kerning first=70 second=74 amount=-3 +kerning first=70 second=79 amount=-1 +kerning first=70 second=81 amount=-1 +kerning first=70 second=83 amount=-2 +kerning first=70 second=97 amount=-1 +kerning first=70 second=99 amount=-1 +kerning first=70 second=100 amount=-1 +kerning first=70 second=101 amount=-1 +kerning first=70 second=102 amount=-1 +kerning first=70 second=103 amount=-2 +kerning first=211 second=69 amount=-1 +kerning first=211 second=68 amount=-1 +kerning first=70 second=111 amount=-1 +kerning first=211 second=66 amount=-1 +kerning first=70 second=113 amount=-1 +kerning first=70 second=115 amount=-1 +kerning first=70 second=117 amount=-1 +kerning first=70 second=118 amount=-1 +kerning first=70 second=119 amount=-1 +kerning first=70 second=120 amount=-1 +kerning first=70 second=122 amount=-1 +kerning first=70 second=171 amount=-2 +kerning first=70 second=192 amount=-2 +kerning first=70 second=193 amount=-2 +kerning first=70 second=194 amount=-2 +kerning first=70 second=196 amount=-2 +kerning first=70 second=197 amount=-2 +kerning first=70 second=198 amount=-2 +kerning first=70 second=199 amount=-1 +kerning first=70 second=210 amount=-1 +kerning first=70 second=211 amount=-1 +kerning first=70 second=212 amount=-1 +kerning first=70 second=213 amount=-1 +kerning first=70 second=214 amount=-1 +kerning first=70 second=216 amount=-1 +kerning first=211 second=65 amount=-3 +kerning first=70 second=224 amount=-1 +kerning first=70 second=225 amount=-1 +kerning first=70 second=226 amount=-1 +kerning first=70 second=227 amount=-1 +kerning first=70 second=228 amount=-1 +kerning first=70 second=229 amount=-1 +kerning first=70 second=230 amount=-1 +kerning first=70 second=231 amount=-1 +kerning first=211 second=46 amount=-2 +kerning first=70 second=233 amount=-1 +kerning first=70 second=234 amount=-1 +kerning first=211 second=45 amount=-1 +kerning first=70 second=240 amount=-1 +kerning first=211 second=44 amount=-2 +kerning first=210 second=8249 amount=-1 +kerning first=70 second=243 amount=-1 +kerning first=70 second=244 amount=-1 +kerning first=70 second=245 amount=-1 +kerning first=210 second=8221 amount=-1 +kerning first=70 second=248 amount=-1 +kerning first=70 second=250 amount=-1 +kerning first=70 second=251 amount=-1 +kerning first=70 second=256 amount=-2 +kerning first=70 second=257 amount=-1 +kerning first=70 second=259 amount=-1 +kerning first=70 second=260 amount=-2 +kerning first=70 second=261 amount=-1 +kerning first=70 second=262 amount=-1 +kerning first=70 second=263 amount=-1 +kerning first=70 second=264 amount=-1 +kerning first=70 second=266 amount=-1 +kerning first=70 second=267 amount=-1 +kerning first=70 second=268 amount=-1 +kerning first=70 second=269 amount=-1 +kerning first=70 second=275 amount=-1 +kerning first=70 second=277 amount=-1 +kerning first=70 second=279 amount=-1 +kerning first=70 second=281 amount=-1 +kerning first=70 second=283 amount=-1 +kerning first=70 second=284 amount=-1 +kerning first=70 second=286 amount=-1 +kerning first=70 second=287 amount=-2 +kerning first=70 second=288 amount=-1 +kerning first=70 second=289 amount=-2 +kerning first=70 second=290 amount=-1 +kerning first=70 second=291 amount=-2 +kerning first=210 second=8220 amount=-1 +kerning first=210 second=8217 amount=-1 +kerning first=210 second=382 amount=-1 +kerning first=210 second=381 amount=-1 +kerning first=70 second=332 amount=-1 +kerning first=70 second=333 amount=-1 +kerning first=70 second=334 amount=-1 +kerning first=70 second=335 amount=-1 +kerning first=70 second=336 amount=-1 +kerning first=70 second=337 amount=-1 +kerning first=70 second=338 amount=-1 +kerning first=70 second=339 amount=-1 +kerning first=70 second=346 amount=-2 +kerning first=70 second=347 amount=-1 +kerning first=70 second=350 amount=-2 +kerning first=70 second=351 amount=-1 +kerning first=70 second=352 amount=-2 +kerning first=70 second=353 amount=-1 +kerning first=70 second=361 amount=-1 +kerning first=70 second=363 amount=-1 +kerning first=70 second=365 amount=-1 +kerning first=70 second=367 amount=-1 +kerning first=70 second=369 amount=-1 +kerning first=70 second=378 amount=-1 +kerning first=70 second=380 amount=-1 +kerning first=70 second=382 amount=-1 +kerning first=210 second=380 amount=-1 +kerning first=210 second=379 amount=-1 +kerning first=210 second=378 amount=-1 +kerning first=210 second=377 amount=-1 +kerning first=210 second=374 amount=-1 +kerning first=210 second=370 amount=-1 +kerning first=210 second=368 amount=-1 +kerning first=210 second=366 amount=-1 +kerning first=210 second=364 amount=-1 +kerning first=210 second=362 amount=-1 +kerning first=70 second=8249 amount=-2 +kerning first=210 second=356 amount=-1 +kerning first=210 second=354 amount=-1 +kerning first=210 second=352 amount=-1 +kerning first=210 second=350 amount=-1 +kerning first=210 second=346 amount=-1 +kerning first=71 second=44 amount=-2 +kerning first=71 second=45 amount=-2 +kerning first=71 second=46 amount=-2 +kerning first=71 second=65 amount=-2 +kerning first=71 second=66 amount=-1 +kerning first=71 second=68 amount=-1 +kerning first=71 second=69 amount=-1 +kerning first=71 second=70 amount=-1 +kerning first=71 second=72 amount=-1 +kerning first=71 second=73 amount=-1 +kerning first=71 second=74 amount=-1 +kerning first=71 second=75 amount=-1 +kerning first=71 second=76 amount=-1 +kerning first=71 second=77 amount=-1 +kerning first=71 second=78 amount=-1 +kerning first=71 second=80 amount=-1 +kerning first=71 second=82 amount=-1 +kerning first=71 second=83 amount=-1 +kerning first=71 second=84 amount=-2 +kerning first=71 second=85 amount=-1 +kerning first=71 second=86 amount=-2 +kerning first=71 second=87 amount=-2 +kerning first=71 second=89 amount=-2 +kerning first=71 second=90 amount=-1 +kerning first=71 second=97 amount=-1 +kerning first=210 second=344 amount=-1 +kerning first=71 second=102 amount=-1 +kerning first=71 second=103 amount=-2 +kerning first=210 second=330 amount=-1 +kerning first=71 second=106 amount=-1 +kerning first=210 second=327 amount=-1 +kerning first=210 second=325 amount=-1 +kerning first=210 second=323 amount=-1 +kerning first=71 second=117 amount=-1 +kerning first=71 second=118 amount=-1 +kerning first=71 second=119 amount=-1 +kerning first=71 second=122 amount=-1 +kerning first=71 second=171 amount=-2 +kerning first=71 second=192 amount=-2 +kerning first=71 second=193 amount=-2 +kerning first=71 second=194 amount=-2 +kerning first=71 second=196 amount=-2 +kerning first=71 second=197 amount=-2 +kerning first=71 second=198 amount=-2 +kerning first=71 second=200 amount=-1 +kerning first=71 second=201 amount=-1 +kerning first=71 second=202 amount=-1 +kerning first=71 second=203 amount=-1 +kerning first=71 second=204 amount=-1 +kerning first=71 second=205 amount=-1 +kerning first=71 second=206 amount=-1 +kerning first=71 second=207 amount=-1 +kerning first=71 second=209 amount=-1 +kerning first=71 second=217 amount=-1 +kerning first=71 second=218 amount=-1 +kerning first=71 second=219 amount=-1 +kerning first=71 second=220 amount=-1 +kerning first=71 second=221 amount=-2 +kerning first=71 second=224 amount=-1 +kerning first=71 second=225 amount=-1 +kerning first=71 second=226 amount=-1 +kerning first=71 second=227 amount=-1 +kerning first=71 second=228 amount=-1 +kerning first=71 second=229 amount=-1 +kerning first=71 second=230 amount=-1 +kerning first=210 second=317 amount=-1 +kerning first=71 second=250 amount=-1 +kerning first=71 second=251 amount=-1 +kerning first=210 second=315 amount=-1 +kerning first=210 second=313 amount=-1 +kerning first=71 second=256 amount=-2 +kerning first=71 second=257 amount=-1 +kerning first=71 second=259 amount=-1 +kerning first=71 second=260 amount=-2 +kerning first=71 second=261 amount=-1 +kerning first=71 second=270 amount=-1 +kerning first=71 second=274 amount=-1 +kerning first=71 second=278 amount=-1 +kerning first=71 second=280 amount=-1 +kerning first=71 second=282 amount=-1 +kerning first=71 second=287 amount=-2 +kerning first=71 second=289 amount=-2 +kerning first=71 second=291 amount=-2 +kerning first=71 second=296 amount=-1 +kerning first=71 second=298 amount=-1 +kerning first=71 second=302 amount=-1 +kerning first=71 second=304 amount=-1 +kerning first=71 second=310 amount=-1 +kerning first=210 second=310 amount=-1 +kerning first=71 second=313 amount=-1 +kerning first=210 second=304 amount=-1 +kerning first=71 second=315 amount=-1 +kerning first=210 second=302 amount=-1 +kerning first=71 second=317 amount=-1 +kerning first=210 second=298 amount=-1 +kerning first=71 second=323 amount=-1 +kerning first=71 second=325 amount=-1 +kerning first=71 second=327 amount=-1 +kerning first=71 second=330 amount=-1 +kerning first=71 second=344 amount=-1 +kerning first=71 second=346 amount=-1 +kerning first=71 second=350 amount=-1 +kerning first=71 second=352 amount=-1 +kerning first=71 second=354 amount=-2 +kerning first=71 second=356 amount=-2 +kerning first=71 second=361 amount=-1 +kerning first=71 second=362 amount=-1 +kerning first=71 second=363 amount=-1 +kerning first=71 second=364 amount=-1 +kerning first=71 second=365 amount=-1 +kerning first=71 second=366 amount=-1 +kerning first=71 second=367 amount=-1 +kerning first=71 second=368 amount=-1 +kerning first=71 second=369 amount=-1 +kerning first=71 second=370 amount=-1 +kerning first=71 second=374 amount=-2 +kerning first=71 second=377 amount=-1 +kerning first=71 second=378 amount=-1 +kerning first=71 second=379 amount=-1 +kerning first=71 second=380 amount=-1 +kerning first=71 second=381 amount=-1 +kerning first=71 second=382 amount=-1 +kerning first=210 second=296 amount=-1 +kerning first=210 second=291 amount=-1 +kerning first=210 second=289 amount=-1 +kerning first=210 second=287 amount=-1 +kerning first=210 second=282 amount=-1 +kerning first=210 second=280 amount=-1 +kerning first=210 second=278 amount=-1 +kerning first=210 second=274 amount=-1 +kerning first=210 second=270 amount=-1 +kerning first=210 second=261 amount=-1 +kerning first=210 second=260 amount=-3 +kerning first=210 second=259 amount=-1 +kerning first=210 second=257 amount=-1 +kerning first=210 second=256 amount=-3 +kerning first=210 second=230 amount=-1 +kerning first=210 second=229 amount=-1 +kerning first=210 second=228 amount=-1 +kerning first=210 second=227 amount=-1 +kerning first=210 second=226 amount=-1 +kerning first=71 second=8217 amount=-1 +kerning first=71 second=8220 amount=-1 +kerning first=71 second=8221 amount=-1 +kerning first=71 second=8249 amount=-2 +kerning first=210 second=225 amount=-1 +kerning first=210 second=224 amount=-1 +kerning first=210 second=221 amount=-1 +kerning first=210 second=220 amount=-1 +kerning first=210 second=219 amount=-1 +kerning first=72 second=44 amount=-1 +kerning first=72 second=45 amount=-3 +kerning first=72 second=46 amount=-1 +kerning first=72 second=67 amount=-1 +kerning first=72 second=71 amount=-1 +kerning first=72 second=74 amount=-1 +kerning first=72 second=79 amount=-1 +kerning first=72 second=81 amount=-1 +kerning first=72 second=83 amount=-1 +kerning first=72 second=97 amount=-2 +kerning first=72 second=99 amount=-1 +kerning first=72 second=100 amount=-1 +kerning first=72 second=101 amount=-1 +kerning first=72 second=103 amount=-2 +kerning first=210 second=218 amount=-1 +kerning first=72 second=111 amount=-1 +kerning first=72 second=112 amount=-1 +kerning first=72 second=113 amount=-1 +kerning first=72 second=115 amount=-1 +kerning first=72 second=117 amount=-2 +kerning first=72 second=118 amount=-1 +kerning first=72 second=119 amount=-1 +kerning first=72 second=121 amount=-1 +kerning first=72 second=122 amount=-1 +kerning first=72 second=171 amount=-3 +kerning first=72 second=199 amount=-1 +kerning first=72 second=210 amount=-1 +kerning first=72 second=211 amount=-1 +kerning first=72 second=212 amount=-1 +kerning first=72 second=213 amount=-1 +kerning first=72 second=214 amount=-1 +kerning first=72 second=216 amount=-1 +kerning first=72 second=224 amount=-2 +kerning first=72 second=225 amount=-2 +kerning first=72 second=226 amount=-2 +kerning first=72 second=227 amount=-2 +kerning first=72 second=228 amount=-2 +kerning first=72 second=229 amount=-2 +kerning first=72 second=230 amount=-2 +kerning first=72 second=231 amount=-1 +kerning first=72 second=232 amount=-1 +kerning first=72 second=233 amount=-1 +kerning first=72 second=234 amount=-1 +kerning first=72 second=235 amount=-1 +kerning first=210 second=217 amount=-1 +kerning first=72 second=240 amount=-1 +kerning first=72 second=242 amount=-1 +kerning first=72 second=243 amount=-1 +kerning first=72 second=244 amount=-1 +kerning first=72 second=245 amount=-1 +kerning first=72 second=246 amount=-1 +kerning first=72 second=248 amount=-1 +kerning first=72 second=249 amount=-1 +kerning first=72 second=250 amount=-2 +kerning first=72 second=251 amount=-2 +kerning first=72 second=252 amount=-1 +kerning first=72 second=253 amount=-1 +kerning first=72 second=255 amount=-1 +kerning first=72 second=257 amount=-2 +kerning first=72 second=259 amount=-2 +kerning first=72 second=261 amount=-2 +kerning first=72 second=262 amount=-1 +kerning first=72 second=263 amount=-1 +kerning first=72 second=264 amount=-1 +kerning first=72 second=266 amount=-1 +kerning first=72 second=267 amount=-1 +kerning first=72 second=268 amount=-1 +kerning first=72 second=269 amount=-1 +kerning first=72 second=275 amount=-1 +kerning first=72 second=277 amount=-1 +kerning first=72 second=279 amount=-1 +kerning first=72 second=281 amount=-1 +kerning first=72 second=283 amount=-1 +kerning first=72 second=284 amount=-1 +kerning first=72 second=286 amount=-1 +kerning first=72 second=287 amount=-2 +kerning first=72 second=288 amount=-1 +kerning first=72 second=289 amount=-2 +kerning first=72 second=290 amount=-1 +kerning first=72 second=291 amount=-2 +kerning first=210 second=209 amount=-1 +kerning first=210 second=207 amount=-1 +kerning first=72 second=332 amount=-1 +kerning first=72 second=333 amount=-1 +kerning first=72 second=334 amount=-1 +kerning first=72 second=335 amount=-1 +kerning first=72 second=336 amount=-1 +kerning first=72 second=337 amount=-1 +kerning first=72 second=338 amount=-1 +kerning first=72 second=339 amount=-1 +kerning first=72 second=346 amount=-1 +kerning first=72 second=347 amount=-1 +kerning first=72 second=350 amount=-1 +kerning first=72 second=351 amount=-1 +kerning first=72 second=352 amount=-1 +kerning first=72 second=353 amount=-1 +kerning first=72 second=361 amount=-2 +kerning first=72 second=363 amount=-2 +kerning first=72 second=365 amount=-2 +kerning first=72 second=367 amount=-2 +kerning first=72 second=369 amount=-2 +kerning first=72 second=375 amount=-1 +kerning first=72 second=378 amount=-1 +kerning first=72 second=380 amount=-1 +kerning first=72 second=382 amount=-1 +kerning first=210 second=206 amount=-1 +kerning first=210 second=205 amount=-1 +kerning first=210 second=204 amount=-1 +kerning first=210 second=203 amount=-1 +kerning first=210 second=202 amount=-1 +kerning first=210 second=201 amount=-1 +kerning first=210 second=200 amount=-1 +kerning first=210 second=198 amount=-3 +kerning first=210 second=197 amount=-3 +kerning first=72 second=8249 amount=-3 +kerning first=73 second=44 amount=-1 +kerning first=73 second=45 amount=-3 +kerning first=73 second=46 amount=-1 +kerning first=73 second=67 amount=-1 +kerning first=73 second=71 amount=-1 +kerning first=73 second=74 amount=-1 +kerning first=73 second=79 amount=-1 +kerning first=73 second=81 amount=-1 +kerning first=73 second=83 amount=-1 +kerning first=73 second=97 amount=-2 +kerning first=73 second=99 amount=-1 +kerning first=73 second=100 amount=-1 +kerning first=73 second=101 amount=-1 +kerning first=73 second=103 amount=-2 +kerning first=210 second=196 amount=-3 +kerning first=73 second=111 amount=-1 +kerning first=73 second=112 amount=-1 +kerning first=73 second=113 amount=-1 +kerning first=73 second=115 amount=-1 +kerning first=73 second=117 amount=-2 +kerning first=73 second=118 amount=-1 +kerning first=73 second=119 amount=-1 +kerning first=73 second=121 amount=-1 +kerning first=73 second=122 amount=-1 +kerning first=73 second=171 amount=-3 +kerning first=73 second=199 amount=-1 +kerning first=73 second=210 amount=-1 +kerning first=73 second=211 amount=-1 +kerning first=73 second=212 amount=-1 +kerning first=73 second=213 amount=-1 +kerning first=73 second=214 amount=-1 +kerning first=73 second=216 amount=-1 +kerning first=73 second=224 amount=-2 +kerning first=73 second=225 amount=-2 +kerning first=73 second=226 amount=-2 +kerning first=73 second=227 amount=-2 +kerning first=73 second=228 amount=-2 +kerning first=73 second=229 amount=-2 +kerning first=73 second=230 amount=-2 +kerning first=73 second=231 amount=-1 +kerning first=73 second=232 amount=-1 +kerning first=73 second=233 amount=-1 +kerning first=73 second=234 amount=-1 +kerning first=73 second=235 amount=-1 +kerning first=210 second=194 amount=-3 +kerning first=73 second=240 amount=-1 +kerning first=73 second=242 amount=-1 +kerning first=73 second=243 amount=-1 +kerning first=73 second=244 amount=-1 +kerning first=73 second=245 amount=-1 +kerning first=73 second=246 amount=-1 +kerning first=73 second=248 amount=-1 +kerning first=73 second=249 amount=-1 +kerning first=73 second=250 amount=-2 +kerning first=73 second=251 amount=-2 +kerning first=73 second=252 amount=-1 +kerning first=73 second=253 amount=-1 +kerning first=73 second=255 amount=-1 +kerning first=73 second=257 amount=-2 +kerning first=73 second=259 amount=-2 +kerning first=73 second=261 amount=-2 +kerning first=73 second=262 amount=-1 +kerning first=73 second=263 amount=-1 +kerning first=73 second=264 amount=-1 +kerning first=73 second=266 amount=-1 +kerning first=73 second=267 amount=-1 +kerning first=73 second=268 amount=-1 +kerning first=73 second=269 amount=-1 +kerning first=73 second=275 amount=-1 +kerning first=73 second=277 amount=-1 +kerning first=73 second=279 amount=-1 +kerning first=73 second=281 amount=-1 +kerning first=73 second=283 amount=-1 +kerning first=73 second=284 amount=-1 +kerning first=73 second=286 amount=-1 +kerning first=73 second=287 amount=-2 +kerning first=73 second=288 amount=-1 +kerning first=73 second=289 amount=-2 +kerning first=73 second=290 amount=-1 +kerning first=73 second=291 amount=-2 +kerning first=210 second=193 amount=-3 +kerning first=210 second=192 amount=-3 +kerning first=73 second=332 amount=-1 +kerning first=73 second=333 amount=-1 +kerning first=73 second=334 amount=-1 +kerning first=73 second=335 amount=-1 +kerning first=73 second=336 amount=-1 +kerning first=73 second=337 amount=-1 +kerning first=73 second=338 amount=-1 +kerning first=73 second=339 amount=-1 +kerning first=73 second=346 amount=-1 +kerning first=73 second=347 amount=-1 +kerning first=73 second=350 amount=-1 +kerning first=73 second=351 amount=-1 +kerning first=73 second=352 amount=-1 +kerning first=73 second=353 amount=-1 +kerning first=73 second=361 amount=-2 +kerning first=73 second=363 amount=-2 +kerning first=73 second=365 amount=-2 +kerning first=73 second=367 amount=-2 +kerning first=73 second=369 amount=-2 +kerning first=73 second=375 amount=-1 +kerning first=73 second=378 amount=-1 +kerning first=73 second=380 amount=-1 +kerning first=73 second=382 amount=-1 +kerning first=210 second=171 amount=-1 +kerning first=210 second=122 amount=-1 +kerning first=210 second=120 amount=-1 +kerning first=210 second=106 amount=-1 +kerning first=210 second=103 amount=-1 +kerning first=210 second=97 amount=-1 +kerning first=210 second=90 amount=-1 +kerning first=210 second=89 amount=-1 +kerning first=210 second=87 amount=-1 +kerning first=73 second=8249 amount=-3 +kerning first=74 second=44 amount=-1 +kerning first=74 second=45 amount=-3 +kerning first=74 second=46 amount=-1 +kerning first=74 second=65 amount=-4 +kerning first=74 second=67 amount=-1 +kerning first=74 second=71 amount=-1 +kerning first=74 second=74 amount=-1 +kerning first=74 second=79 amount=-1 +kerning first=74 second=81 amount=-1 +kerning first=74 second=83 amount=-1 +kerning first=210 second=86 amount=-1 +kerning first=210 second=85 amount=-1 +kerning first=210 second=84 amount=-1 +kerning first=210 second=83 amount=-1 +kerning first=74 second=97 amount=-2 +kerning first=74 second=99 amount=-1 +kerning first=74 second=100 amount=-1 +kerning first=74 second=101 amount=-1 +kerning first=74 second=102 amount=-1 +kerning first=74 second=103 amount=-2 +kerning first=74 second=105 amount=-1 +kerning first=74 second=109 amount=-1 +kerning first=74 second=110 amount=-1 +kerning first=74 second=111 amount=-1 +kerning first=74 second=112 amount=-1 +kerning first=74 second=113 amount=-1 +kerning first=210 second=82 amount=-1 +kerning first=74 second=115 amount=-1 +kerning first=74 second=118 amount=-1 +kerning first=74 second=119 amount=-1 +kerning first=74 second=122 amount=-1 +kerning first=74 second=171 amount=-3 +kerning first=74 second=192 amount=-4 +kerning first=74 second=193 amount=-4 +kerning first=74 second=194 amount=-4 +kerning first=74 second=196 amount=-4 +kerning first=74 second=197 amount=-4 +kerning first=74 second=198 amount=-4 +kerning first=74 second=199 amount=-1 +kerning first=74 second=210 amount=-1 +kerning first=74 second=211 amount=-1 +kerning first=74 second=212 amount=-1 +kerning first=74 second=213 amount=-1 +kerning first=74 second=214 amount=-1 +kerning first=74 second=216 amount=-1 +kerning first=210 second=80 amount=-1 +kerning first=74 second=223 amount=-1 +kerning first=74 second=224 amount=-1 +kerning first=74 second=225 amount=-2 +kerning first=74 second=226 amount=-2 +kerning first=74 second=227 amount=-2 +kerning first=74 second=228 amount=-1 +kerning first=74 second=229 amount=-2 +kerning first=74 second=230 amount=-2 +kerning first=74 second=231 amount=-1 +kerning first=74 second=232 amount=-1 +kerning first=74 second=233 amount=-1 +kerning first=74 second=234 amount=-1 +kerning first=74 second=235 amount=-1 +kerning first=74 second=237 amount=-1 +kerning first=74 second=240 amount=-1 +kerning first=74 second=241 amount=-1 +kerning first=74 second=242 amount=-1 +kerning first=74 second=243 amount=-1 +kerning first=74 second=244 amount=-1 +kerning first=74 second=245 amount=-1 +kerning first=74 second=246 amount=-1 +kerning first=74 second=248 amount=-1 +kerning first=74 second=256 amount=-4 +kerning first=74 second=257 amount=-2 +kerning first=74 second=259 amount=-2 +kerning first=74 second=260 amount=-4 +kerning first=74 second=261 amount=-2 +kerning first=74 second=262 amount=-1 +kerning first=74 second=263 amount=-1 +kerning first=74 second=264 amount=-1 +kerning first=74 second=266 amount=-1 +kerning first=74 second=267 amount=-1 +kerning first=74 second=268 amount=-1 +kerning first=74 second=269 amount=-1 +kerning first=74 second=275 amount=-1 +kerning first=74 second=277 amount=-1 +kerning first=74 second=279 amount=-1 +kerning first=74 second=281 amount=-1 +kerning first=74 second=283 amount=-1 +kerning first=74 second=284 amount=-1 +kerning first=74 second=286 amount=-1 +kerning first=74 second=287 amount=-2 +kerning first=74 second=288 amount=-1 +kerning first=74 second=289 amount=-2 +kerning first=74 second=290 amount=-1 +kerning first=74 second=291 amount=-2 +kerning first=74 second=303 amount=-1 +kerning first=74 second=305 amount=-1 +kerning first=74 second=324 amount=-1 +kerning first=74 second=326 amount=-1 +kerning first=74 second=328 amount=-1 +kerning first=74 second=331 amount=-1 +kerning first=74 second=332 amount=-1 +kerning first=74 second=333 amount=-1 +kerning first=74 second=334 amount=-1 +kerning first=74 second=335 amount=-1 +kerning first=74 second=336 amount=-1 +kerning first=74 second=337 amount=-1 +kerning first=74 second=338 amount=-1 +kerning first=74 second=339 amount=-1 +kerning first=210 second=78 amount=-1 +kerning first=74 second=346 amount=-1 +kerning first=74 second=347 amount=-1 +kerning first=74 second=350 amount=-1 +kerning first=74 second=351 amount=-1 +kerning first=74 second=352 amount=-1 +kerning first=74 second=353 amount=-1 +kerning first=210 second=77 amount=-1 +kerning first=210 second=76 amount=-1 +kerning first=210 second=75 amount=-1 +kerning first=74 second=378 amount=-1 +kerning first=74 second=380 amount=-1 +kerning first=74 second=382 amount=-1 +kerning first=210 second=74 amount=-1 +kerning first=210 second=73 amount=-1 +kerning first=210 second=72 amount=-1 +kerning first=210 second=70 amount=-1 +kerning first=210 second=69 amount=-1 +kerning first=210 second=68 amount=-1 +kerning first=210 second=66 amount=-1 +kerning first=210 second=65 amount=-3 +kerning first=210 second=46 amount=-2 +kerning first=210 second=45 amount=-1 +kerning first=210 second=44 amount=-2 +kerning first=209 second=8249 amount=-3 +kerning first=209 second=382 amount=-1 +kerning first=74 second=8249 amount=-3 +kerning first=209 second=380 amount=-1 +kerning first=209 second=378 amount=-1 +kerning first=209 second=375 amount=-1 +kerning first=209 second=369 amount=-2 +kerning first=209 second=367 amount=-2 +kerning first=75 second=44 amount=-1 +kerning first=75 second=45 amount=-3 +kerning first=75 second=46 amount=-1 +kerning first=75 second=67 amount=-2 +kerning first=75 second=71 amount=-2 +kerning first=75 second=79 amount=-2 +kerning first=75 second=81 amount=-2 +kerning first=75 second=83 amount=-1 +kerning first=75 second=84 amount=-1 +kerning first=75 second=85 amount=-1 +kerning first=75 second=86 amount=-1 +kerning first=75 second=87 amount=-1 +kerning first=75 second=89 amount=-1 +kerning first=75 second=97 amount=-1 +kerning first=75 second=98 amount=-1 +kerning first=75 second=99 amount=-1 +kerning first=75 second=100 amount=-1 +kerning first=75 second=101 amount=-1 +kerning first=75 second=103 amount=-1 +kerning first=75 second=104 amount=-1 +kerning first=75 second=106 amount=-1 +kerning first=75 second=107 amount=-1 +kerning first=75 second=108 amount=-1 +kerning first=75 second=111 amount=-1 +kerning first=75 second=112 amount=-1 +kerning first=75 second=113 amount=-1 +kerning first=209 second=365 amount=-2 +kerning first=75 second=115 amount=-1 +kerning first=75 second=116 amount=-1 +kerning first=75 second=117 amount=-2 +kerning first=75 second=118 amount=-2 +kerning first=75 second=119 amount=-2 +kerning first=75 second=121 amount=-2 +kerning first=75 second=171 amount=-3 +kerning first=75 second=199 amount=-2 +kerning first=75 second=210 amount=-2 +kerning first=75 second=211 amount=-2 +kerning first=75 second=212 amount=-2 +kerning first=75 second=213 amount=-2 +kerning first=75 second=214 amount=-2 +kerning first=75 second=216 amount=-2 +kerning first=75 second=217 amount=-1 +kerning first=75 second=218 amount=-1 +kerning first=75 second=219 amount=-1 +kerning first=75 second=220 amount=-1 +kerning first=75 second=221 amount=-1 +kerning first=75 second=224 amount=-1 +kerning first=75 second=225 amount=-1 +kerning first=75 second=226 amount=-1 +kerning first=75 second=227 amount=-1 +kerning first=75 second=228 amount=-1 +kerning first=75 second=229 amount=-1 +kerning first=75 second=230 amount=-1 +kerning first=75 second=231 amount=-1 +kerning first=75 second=232 amount=-1 +kerning first=75 second=233 amount=-1 +kerning first=75 second=234 amount=-1 +kerning first=75 second=235 amount=-1 +kerning first=75 second=240 amount=-1 +kerning first=75 second=242 amount=-1 +kerning first=75 second=243 amount=-1 +kerning first=75 second=244 amount=-1 +kerning first=75 second=245 amount=-1 +kerning first=75 second=246 amount=-1 +kerning first=75 second=248 amount=-1 +kerning first=75 second=249 amount=-2 +kerning first=75 second=250 amount=-2 +kerning first=75 second=251 amount=-2 +kerning first=75 second=252 amount=-2 +kerning first=75 second=253 amount=-2 +kerning first=75 second=254 amount=-1 +kerning first=75 second=255 amount=-2 +kerning first=75 second=257 amount=-1 +kerning first=75 second=259 amount=-1 +kerning first=75 second=261 amount=-1 +kerning first=75 second=262 amount=-2 +kerning first=75 second=263 amount=-1 +kerning first=75 second=264 amount=-2 +kerning first=75 second=266 amount=-2 +kerning first=75 second=267 amount=-1 +kerning first=75 second=268 amount=-2 +kerning first=75 second=269 amount=-1 +kerning first=75 second=275 amount=-1 +kerning first=75 second=277 amount=-1 +kerning first=75 second=279 amount=-1 +kerning first=75 second=281 amount=-1 +kerning first=75 second=283 amount=-1 +kerning first=75 second=284 amount=-2 +kerning first=75 second=286 amount=-2 +kerning first=75 second=287 amount=-1 +kerning first=75 second=288 amount=-2 +kerning first=75 second=289 amount=-1 +kerning first=75 second=290 amount=-2 +kerning first=75 second=291 amount=-1 +kerning first=75 second=311 amount=-1 +kerning first=75 second=314 amount=-1 +kerning first=75 second=316 amount=-1 +kerning first=75 second=318 amount=-1 +kerning first=75 second=332 amount=-2 +kerning first=75 second=333 amount=-1 +kerning first=75 second=334 amount=-2 +kerning first=75 second=335 amount=-1 +kerning first=75 second=336 amount=-2 +kerning first=75 second=337 amount=-1 +kerning first=75 second=338 amount=-2 +kerning first=75 second=339 amount=-1 +kerning first=209 second=363 amount=-2 +kerning first=75 second=346 amount=-1 +kerning first=75 second=347 amount=-1 +kerning first=75 second=350 amount=-1 +kerning first=75 second=351 amount=-1 +kerning first=75 second=352 amount=-1 +kerning first=75 second=353 amount=-1 +kerning first=75 second=354 amount=-1 +kerning first=75 second=355 amount=-1 +kerning first=75 second=356 amount=-1 +kerning first=75 second=361 amount=-2 +kerning first=75 second=362 amount=-1 +kerning first=75 second=363 amount=-2 +kerning first=75 second=364 amount=-1 +kerning first=75 second=365 amount=-2 +kerning first=75 second=366 amount=-1 +kerning first=75 second=367 amount=-2 +kerning first=75 second=368 amount=-1 +kerning first=75 second=369 amount=-2 +kerning first=75 second=370 amount=-1 +kerning first=75 second=374 amount=-1 +kerning first=75 second=375 amount=-2 +kerning first=209 second=361 amount=-2 +kerning first=209 second=353 amount=-1 +kerning first=209 second=352 amount=-1 +kerning first=209 second=351 amount=-1 +kerning first=209 second=350 amount=-1 +kerning first=209 second=347 amount=-1 +kerning first=209 second=346 amount=-1 +kerning first=209 second=339 amount=-1 +kerning first=209 second=338 amount=-1 +kerning first=209 second=337 amount=-1 +kerning first=209 second=336 amount=-1 +kerning first=209 second=335 amount=-1 +kerning first=209 second=334 amount=-1 +kerning first=209 second=333 amount=-1 +kerning first=75 second=8217 amount=-1 +kerning first=75 second=8220 amount=-1 +kerning first=75 second=8221 amount=-1 +kerning first=75 second=8249 amount=-3 +kerning first=76 second=45 amount=-1 +kerning first=76 second=65 amount=-1 +kerning first=76 second=66 amount=-1 +kerning first=76 second=67 amount=-1 +kerning first=76 second=68 amount=-1 +kerning first=76 second=69 amount=-1 +kerning first=76 second=70 amount=-1 +kerning first=76 second=71 amount=-1 +kerning first=76 second=72 amount=-1 +kerning first=76 second=73 amount=-1 +kerning first=76 second=74 amount=-1 +kerning first=76 second=75 amount=-1 +kerning first=76 second=76 amount=-1 +kerning first=76 second=77 amount=-1 +kerning first=76 second=78 amount=-1 +kerning first=76 second=79 amount=-1 +kerning first=76 second=80 amount=-1 +kerning first=76 second=81 amount=-1 +kerning first=76 second=82 amount=-1 +kerning first=76 second=83 amount=-1 +kerning first=76 second=84 amount=-2 +kerning first=76 second=85 amount=-2 +kerning first=76 second=86 amount=-2 +kerning first=76 second=87 amount=-2 +kerning first=76 second=89 amount=-2 +kerning first=76 second=90 amount=-2 +kerning first=76 second=98 amount=-1 +kerning first=76 second=103 amount=-2 +kerning first=76 second=104 amount=-1 +kerning first=76 second=105 amount=-1 +kerning first=76 second=106 amount=-1 +kerning first=76 second=107 amount=-1 +kerning first=76 second=108 amount=-1 +kerning first=76 second=109 amount=-1 +kerning first=76 second=110 amount=-1 +kerning first=76 second=112 amount=-1 +kerning first=76 second=115 amount=-1 +kerning first=76 second=117 amount=-1 +kerning first=76 second=118 amount=-2 +kerning first=76 second=119 amount=-2 +kerning first=76 second=120 amount=-1 +kerning first=76 second=121 amount=-2 +kerning first=76 second=122 amount=-2 +kerning first=76 second=171 amount=-1 +kerning first=76 second=192 amount=-1 +kerning first=76 second=193 amount=-1 +kerning first=76 second=194 amount=-1 +kerning first=76 second=196 amount=-1 +kerning first=76 second=197 amount=-1 +kerning first=76 second=198 amount=-1 +kerning first=76 second=199 amount=-1 +kerning first=76 second=200 amount=-1 +kerning first=76 second=201 amount=-1 +kerning first=76 second=202 amount=-1 +kerning first=76 second=203 amount=-1 +kerning first=76 second=204 amount=-1 +kerning first=76 second=205 amount=-1 +kerning first=76 second=206 amount=-1 +kerning first=76 second=207 amount=-1 +kerning first=76 second=209 amount=-1 +kerning first=76 second=210 amount=-1 +kerning first=76 second=211 amount=-1 +kerning first=76 second=212 amount=-1 +kerning first=76 second=213 amount=-1 +kerning first=76 second=214 amount=-1 +kerning first=76 second=216 amount=-1 +kerning first=76 second=217 amount=-2 +kerning first=76 second=218 amount=-2 +kerning first=76 second=219 amount=-2 +kerning first=76 second=220 amount=-2 +kerning first=76 second=221 amount=-2 +kerning first=76 second=223 amount=-1 +kerning first=76 second=237 amount=-1 +kerning first=76 second=241 amount=-1 +kerning first=76 second=249 amount=-1 +kerning first=76 second=250 amount=-1 +kerning first=76 second=251 amount=-1 +kerning first=76 second=252 amount=-1 +kerning first=76 second=253 amount=-2 +kerning first=76 second=254 amount=-1 +kerning first=76 second=255 amount=-2 +kerning first=76 second=256 amount=-1 +kerning first=76 second=260 amount=-1 +kerning first=76 second=262 amount=-1 +kerning first=76 second=264 amount=-1 +kerning first=76 second=266 amount=-1 +kerning first=76 second=268 amount=-1 +kerning first=76 second=270 amount=-1 +kerning first=76 second=274 amount=-1 +kerning first=76 second=278 amount=-1 +kerning first=76 second=280 amount=-1 +kerning first=76 second=282 amount=-1 +kerning first=76 second=284 amount=-1 +kerning first=76 second=286 amount=-1 +kerning first=76 second=287 amount=-2 +kerning first=76 second=288 amount=-1 +kerning first=76 second=289 amount=-2 +kerning first=76 second=290 amount=-1 +kerning first=76 second=291 amount=-2 +kerning first=76 second=296 amount=-1 +kerning first=76 second=298 amount=-1 +kerning first=76 second=302 amount=-1 +kerning first=76 second=303 amount=-1 +kerning first=76 second=304 amount=-1 +kerning first=76 second=305 amount=-1 +kerning first=76 second=310 amount=-1 +kerning first=76 second=311 amount=-1 +kerning first=76 second=313 amount=-1 +kerning first=76 second=314 amount=-1 +kerning first=76 second=315 amount=-1 +kerning first=76 second=316 amount=-1 +kerning first=76 second=317 amount=-1 +kerning first=76 second=318 amount=-1 +kerning first=76 second=323 amount=-1 +kerning first=76 second=324 amount=-1 +kerning first=76 second=325 amount=-1 +kerning first=76 second=326 amount=-1 +kerning first=76 second=327 amount=-1 +kerning first=76 second=328 amount=-1 +kerning first=76 second=330 amount=-1 +kerning first=76 second=331 amount=-1 +kerning first=76 second=332 amount=-1 +kerning first=76 second=334 amount=-1 +kerning first=76 second=336 amount=-1 +kerning first=76 second=338 amount=-1 +kerning first=76 second=344 amount=-1 +kerning first=76 second=346 amount=-1 +kerning first=76 second=347 amount=-1 +kerning first=76 second=350 amount=-1 +kerning first=76 second=351 amount=-1 +kerning first=76 second=352 amount=-1 +kerning first=76 second=353 amount=-1 +kerning first=76 second=354 amount=-2 +kerning first=76 second=356 amount=-2 +kerning first=76 second=361 amount=-1 +kerning first=76 second=362 amount=-2 +kerning first=76 second=363 amount=-1 +kerning first=76 second=364 amount=-2 +kerning first=76 second=365 amount=-1 +kerning first=76 second=366 amount=-2 +kerning first=76 second=367 amount=-1 +kerning first=76 second=368 amount=-2 +kerning first=76 second=369 amount=-1 +kerning first=76 second=370 amount=-2 +kerning first=76 second=374 amount=-2 +kerning first=76 second=375 amount=-2 +kerning first=76 second=377 amount=-2 +kerning first=76 second=378 amount=-2 +kerning first=76 second=379 amount=-2 +kerning first=76 second=380 amount=-2 +kerning first=76 second=381 amount=-2 +kerning first=76 second=382 amount=-2 +kerning first=209 second=332 amount=-1 +kerning first=209 second=291 amount=-2 +kerning first=209 second=290 amount=-1 +kerning first=209 second=289 amount=-2 +kerning first=209 second=288 amount=-1 +kerning first=209 second=287 amount=-2 +kerning first=209 second=286 amount=-1 +kerning first=209 second=284 amount=-1 +kerning first=209 second=283 amount=-1 +kerning first=209 second=281 amount=-1 +kerning first=209 second=279 amount=-1 +kerning first=209 second=277 amount=-1 +kerning first=209 second=275 amount=-1 +kerning first=209 second=269 amount=-1 +kerning first=209 second=268 amount=-1 +kerning first=209 second=267 amount=-1 +kerning first=209 second=266 amount=-1 +kerning first=209 second=264 amount=-1 +kerning first=209 second=263 amount=-1 +kerning first=209 second=262 amount=-1 +kerning first=209 second=261 amount=-2 +kerning first=209 second=259 amount=-2 +kerning first=76 second=8217 amount=-3 +kerning first=76 second=8220 amount=-3 +kerning first=76 second=8221 amount=-3 +kerning first=76 second=8249 amount=-1 +kerning first=77 second=44 amount=-1 +kerning first=77 second=45 amount=-3 +kerning first=77 second=46 amount=-1 +kerning first=77 second=67 amount=-1 +kerning first=77 second=71 amount=-1 +kerning first=77 second=74 amount=-1 +kerning first=77 second=79 amount=-1 +kerning first=77 second=81 amount=-1 +kerning first=77 second=83 amount=-1 +kerning first=77 second=97 amount=-2 +kerning first=77 second=99 amount=-1 +kerning first=77 second=100 amount=-1 +kerning first=77 second=101 amount=-1 +kerning first=77 second=103 amount=-2 +kerning first=209 second=257 amount=-2 +kerning first=77 second=111 amount=-1 +kerning first=77 second=112 amount=-1 +kerning first=77 second=113 amount=-1 +kerning first=77 second=115 amount=-1 +kerning first=77 second=117 amount=-2 +kerning first=77 second=118 amount=-1 +kerning first=77 second=119 amount=-1 +kerning first=77 second=121 amount=-1 +kerning first=77 second=122 amount=-1 +kerning first=77 second=171 amount=-3 +kerning first=77 second=199 amount=-1 +kerning first=77 second=210 amount=-1 +kerning first=77 second=211 amount=-1 +kerning first=77 second=212 amount=-1 +kerning first=77 second=213 amount=-1 +kerning first=77 second=214 amount=-1 +kerning first=77 second=216 amount=-1 +kerning first=77 second=224 amount=-2 +kerning first=77 second=225 amount=-2 +kerning first=77 second=226 amount=-2 +kerning first=77 second=227 amount=-2 +kerning first=77 second=228 amount=-2 +kerning first=77 second=229 amount=-2 +kerning first=77 second=230 amount=-2 +kerning first=77 second=231 amount=-1 +kerning first=77 second=232 amount=-1 +kerning first=77 second=233 amount=-1 +kerning first=77 second=234 amount=-1 +kerning first=77 second=235 amount=-1 +kerning first=209 second=255 amount=-1 +kerning first=77 second=240 amount=-1 +kerning first=77 second=242 amount=-1 +kerning first=77 second=243 amount=-1 +kerning first=77 second=244 amount=-1 +kerning first=77 second=245 amount=-1 +kerning first=77 second=246 amount=-1 +kerning first=77 second=248 amount=-1 +kerning first=77 second=249 amount=-1 +kerning first=77 second=250 amount=-2 +kerning first=77 second=251 amount=-2 +kerning first=77 second=252 amount=-1 +kerning first=77 second=253 amount=-1 +kerning first=77 second=255 amount=-1 +kerning first=77 second=257 amount=-2 +kerning first=77 second=259 amount=-2 +kerning first=77 second=261 amount=-2 +kerning first=77 second=262 amount=-1 +kerning first=77 second=263 amount=-1 +kerning first=77 second=264 amount=-1 +kerning first=77 second=266 amount=-1 +kerning first=77 second=267 amount=-1 +kerning first=77 second=268 amount=-1 +kerning first=77 second=269 amount=-1 +kerning first=77 second=275 amount=-1 +kerning first=77 second=277 amount=-1 +kerning first=77 second=279 amount=-1 +kerning first=77 second=281 amount=-1 +kerning first=77 second=283 amount=-1 +kerning first=77 second=284 amount=-1 +kerning first=77 second=286 amount=-1 +kerning first=77 second=287 amount=-2 +kerning first=77 second=288 amount=-1 +kerning first=77 second=289 amount=-2 +kerning first=77 second=290 amount=-1 +kerning first=77 second=291 amount=-2 +kerning first=209 second=253 amount=-1 +kerning first=209 second=252 amount=-1 +kerning first=77 second=332 amount=-1 +kerning first=77 second=333 amount=-1 +kerning first=77 second=334 amount=-1 +kerning first=77 second=335 amount=-1 +kerning first=77 second=336 amount=-1 +kerning first=77 second=337 amount=-1 +kerning first=77 second=338 amount=-1 +kerning first=77 second=339 amount=-1 +kerning first=77 second=346 amount=-1 +kerning first=77 second=347 amount=-1 +kerning first=77 second=350 amount=-1 +kerning first=77 second=351 amount=-1 +kerning first=77 second=352 amount=-1 +kerning first=77 second=353 amount=-1 +kerning first=77 second=361 amount=-2 +kerning first=77 second=363 amount=-2 +kerning first=77 second=365 amount=-2 +kerning first=77 second=367 amount=-2 +kerning first=77 second=369 amount=-2 +kerning first=77 second=375 amount=-1 +kerning first=77 second=378 amount=-1 +kerning first=77 second=380 amount=-1 +kerning first=77 second=382 amount=-1 +kerning first=209 second=251 amount=-2 +kerning first=209 second=250 amount=-2 +kerning first=209 second=249 amount=-1 +kerning first=209 second=248 amount=-1 +kerning first=209 second=246 amount=-1 +kerning first=209 second=245 amount=-1 +kerning first=209 second=244 amount=-1 +kerning first=209 second=243 amount=-1 +kerning first=209 second=242 amount=-1 +kerning first=77 second=8249 amount=-3 +kerning first=78 second=44 amount=-1 +kerning first=78 second=45 amount=-3 +kerning first=78 second=46 amount=-1 +kerning first=78 second=67 amount=-1 +kerning first=78 second=71 amount=-1 +kerning first=78 second=74 amount=-1 +kerning first=78 second=79 amount=-1 +kerning first=78 second=81 amount=-1 +kerning first=78 second=83 amount=-1 +kerning first=78 second=97 amount=-2 +kerning first=78 second=99 amount=-1 +kerning first=78 second=100 amount=-1 +kerning first=78 second=101 amount=-1 +kerning first=78 second=103 amount=-2 +kerning first=209 second=240 amount=-1 +kerning first=78 second=111 amount=-1 +kerning first=78 second=112 amount=-1 +kerning first=78 second=113 amount=-1 +kerning first=78 second=115 amount=-1 +kerning first=78 second=117 amount=-2 +kerning first=78 second=118 amount=-1 +kerning first=78 second=119 amount=-1 +kerning first=78 second=121 amount=-1 +kerning first=78 second=122 amount=-1 +kerning first=78 second=171 amount=-3 +kerning first=78 second=199 amount=-1 +kerning first=78 second=210 amount=-1 +kerning first=78 second=211 amount=-1 +kerning first=78 second=212 amount=-1 +kerning first=78 second=213 amount=-1 +kerning first=78 second=214 amount=-1 +kerning first=78 second=216 amount=-1 +kerning first=78 second=224 amount=-2 +kerning first=78 second=225 amount=-2 +kerning first=78 second=226 amount=-2 +kerning first=78 second=227 amount=-2 +kerning first=78 second=228 amount=-2 +kerning first=78 second=229 amount=-2 +kerning first=78 second=230 amount=-2 +kerning first=78 second=231 amount=-1 +kerning first=78 second=232 amount=-1 +kerning first=78 second=233 amount=-1 +kerning first=78 second=234 amount=-1 +kerning first=78 second=235 amount=-1 +kerning first=209 second=235 amount=-1 +kerning first=78 second=240 amount=-1 +kerning first=78 second=242 amount=-1 +kerning first=78 second=243 amount=-1 +kerning first=78 second=244 amount=-1 +kerning first=78 second=245 amount=-1 +kerning first=78 second=246 amount=-1 +kerning first=78 second=248 amount=-1 +kerning first=78 second=249 amount=-1 +kerning first=78 second=250 amount=-2 +kerning first=78 second=251 amount=-2 +kerning first=78 second=252 amount=-1 +kerning first=78 second=253 amount=-1 +kerning first=78 second=255 amount=-1 +kerning first=78 second=257 amount=-2 +kerning first=78 second=259 amount=-2 +kerning first=78 second=261 amount=-2 +kerning first=78 second=262 amount=-1 +kerning first=78 second=263 amount=-1 +kerning first=78 second=264 amount=-1 +kerning first=78 second=266 amount=-1 +kerning first=78 second=267 amount=-1 +kerning first=78 second=268 amount=-1 +kerning first=78 second=269 amount=-1 +kerning first=78 second=275 amount=-1 +kerning first=78 second=277 amount=-1 +kerning first=78 second=279 amount=-1 +kerning first=78 second=281 amount=-1 +kerning first=78 second=283 amount=-1 +kerning first=78 second=284 amount=-1 +kerning first=78 second=286 amount=-1 +kerning first=78 second=287 amount=-2 +kerning first=78 second=288 amount=-1 +kerning first=78 second=289 amount=-2 +kerning first=78 second=290 amount=-1 +kerning first=78 second=291 amount=-2 +kerning first=209 second=234 amount=-1 +kerning first=209 second=233 amount=-1 +kerning first=78 second=332 amount=-1 +kerning first=78 second=333 amount=-1 +kerning first=78 second=334 amount=-1 +kerning first=78 second=335 amount=-1 +kerning first=78 second=336 amount=-1 +kerning first=78 second=337 amount=-1 +kerning first=78 second=338 amount=-1 +kerning first=78 second=339 amount=-1 +kerning first=78 second=346 amount=-1 +kerning first=78 second=347 amount=-1 +kerning first=78 second=350 amount=-1 +kerning first=78 second=351 amount=-1 +kerning first=78 second=352 amount=-1 +kerning first=78 second=353 amount=-1 +kerning first=78 second=361 amount=-2 +kerning first=78 second=363 amount=-2 +kerning first=78 second=365 amount=-2 +kerning first=78 second=367 amount=-2 +kerning first=78 second=369 amount=-2 +kerning first=78 second=375 amount=-1 +kerning first=78 second=378 amount=-1 +kerning first=78 second=380 amount=-1 +kerning first=78 second=382 amount=-1 +kerning first=209 second=232 amount=-1 +kerning first=209 second=231 amount=-1 +kerning first=209 second=230 amount=-2 +kerning first=209 second=229 amount=-2 +kerning first=209 second=228 amount=-2 +kerning first=209 second=227 amount=-2 +kerning first=209 second=226 amount=-2 +kerning first=209 second=225 amount=-2 +kerning first=209 second=224 amount=-2 +kerning first=78 second=8249 amount=-3 +kerning first=79 second=44 amount=-2 +kerning first=79 second=45 amount=-1 +kerning first=79 second=46 amount=-2 +kerning first=79 second=65 amount=-3 +kerning first=79 second=66 amount=-1 +kerning first=79 second=68 amount=-1 +kerning first=79 second=69 amount=-1 +kerning first=79 second=70 amount=-1 +kerning first=79 second=72 amount=-1 +kerning first=79 second=73 amount=-1 +kerning first=79 second=74 amount=-1 +kerning first=79 second=75 amount=-1 +kerning first=79 second=76 amount=-1 +kerning first=79 second=77 amount=-1 +kerning first=79 second=78 amount=-1 +kerning first=79 second=80 amount=-1 +kerning first=79 second=82 amount=-1 +kerning first=79 second=83 amount=-1 +kerning first=79 second=84 amount=-1 +kerning first=79 second=85 amount=-1 +kerning first=79 second=86 amount=-1 +kerning first=79 second=87 amount=-1 +kerning first=79 second=89 amount=-1 +kerning first=79 second=90 amount=-1 +kerning first=79 second=97 amount=-1 +kerning first=79 second=103 amount=-1 +kerning first=209 second=216 amount=-1 +kerning first=79 second=106 amount=-1 +kerning first=209 second=214 amount=-1 +kerning first=79 second=120 amount=-1 +kerning first=79 second=122 amount=-1 +kerning first=79 second=171 amount=-1 +kerning first=79 second=192 amount=-3 +kerning first=79 second=193 amount=-3 +kerning first=79 second=194 amount=-3 +kerning first=79 second=196 amount=-3 +kerning first=79 second=197 amount=-3 +kerning first=79 second=198 amount=-3 +kerning first=79 second=200 amount=-1 +kerning first=79 second=201 amount=-1 +kerning first=79 second=202 amount=-1 +kerning first=79 second=203 amount=-1 +kerning first=79 second=204 amount=-1 +kerning first=79 second=205 amount=-1 +kerning first=79 second=206 amount=-1 +kerning first=79 second=207 amount=-1 +kerning first=79 second=209 amount=-1 +kerning first=79 second=217 amount=-1 +kerning first=79 second=218 amount=-1 +kerning first=79 second=219 amount=-1 +kerning first=79 second=220 amount=-1 +kerning first=79 second=221 amount=-1 +kerning first=79 second=224 amount=-1 +kerning first=79 second=225 amount=-1 +kerning first=79 second=226 amount=-1 +kerning first=79 second=227 amount=-1 +kerning first=79 second=228 amount=-1 +kerning first=79 second=229 amount=-1 +kerning first=79 second=230 amount=-1 +kerning first=209 second=213 amount=-1 +kerning first=79 second=256 amount=-3 +kerning first=79 second=257 amount=-1 +kerning first=79 second=259 amount=-1 +kerning first=79 second=260 amount=-3 +kerning first=79 second=261 amount=-1 +kerning first=79 second=270 amount=-1 +kerning first=79 second=274 amount=-1 +kerning first=79 second=278 amount=-1 +kerning first=79 second=280 amount=-1 +kerning first=79 second=282 amount=-1 +kerning first=79 second=287 amount=-1 +kerning first=79 second=289 amount=-1 +kerning first=79 second=291 amount=-1 +kerning first=79 second=296 amount=-1 +kerning first=79 second=298 amount=-1 +kerning first=79 second=302 amount=-1 +kerning first=209 second=212 amount=-1 +kerning first=79 second=304 amount=-1 +kerning first=209 second=211 amount=-1 +kerning first=79 second=310 amount=-1 +kerning first=79 second=313 amount=-1 +kerning first=79 second=315 amount=-1 +kerning first=79 second=317 amount=-1 +kerning first=79 second=323 amount=-1 +kerning first=79 second=325 amount=-1 +kerning first=79 second=327 amount=-1 +kerning first=79 second=330 amount=-1 +kerning first=79 second=344 amount=-1 +kerning first=79 second=346 amount=-1 +kerning first=79 second=350 amount=-1 +kerning first=79 second=352 amount=-1 +kerning first=79 second=354 amount=-1 +kerning first=79 second=356 amount=-1 +kerning first=79 second=362 amount=-1 +kerning first=79 second=364 amount=-1 +kerning first=79 second=366 amount=-1 +kerning first=79 second=368 amount=-1 +kerning first=79 second=370 amount=-1 +kerning first=79 second=374 amount=-1 +kerning first=79 second=377 amount=-1 +kerning first=79 second=378 amount=-1 +kerning first=79 second=379 amount=-1 +kerning first=79 second=380 amount=-1 +kerning first=79 second=381 amount=-1 +kerning first=79 second=382 amount=-1 +kerning first=209 second=210 amount=-1 +kerning first=209 second=199 amount=-1 +kerning first=209 second=171 amount=-3 +kerning first=209 second=122 amount=-1 +kerning first=209 second=121 amount=-1 +kerning first=209 second=119 amount=-1 +kerning first=209 second=118 amount=-1 +kerning first=209 second=117 amount=-2 +kerning first=209 second=115 amount=-1 +kerning first=209 second=113 amount=-1 +kerning first=209 second=112 amount=-1 +kerning first=209 second=111 amount=-1 +kerning first=209 second=103 amount=-2 +kerning first=209 second=101 amount=-1 +kerning first=209 second=100 amount=-1 +kerning first=209 second=99 amount=-1 +kerning first=79 second=8217 amount=-1 +kerning first=79 second=8220 amount=-1 +kerning first=79 second=8221 amount=-1 +kerning first=79 second=8249 amount=-1 +kerning first=80 second=44 amount=-3 +kerning first=80 second=45 amount=-2 +kerning first=80 second=46 amount=-3 +kerning first=80 second=65 amount=-3 +kerning first=80 second=66 amount=-1 +kerning first=80 second=68 amount=-1 +kerning first=80 second=69 amount=-1 +kerning first=80 second=70 amount=-1 +kerning first=80 second=72 amount=-1 +kerning first=80 second=73 amount=-1 +kerning first=80 second=74 amount=-2 +kerning first=80 second=75 amount=-1 +kerning first=80 second=76 amount=-1 +kerning first=80 second=77 amount=-1 +kerning first=80 second=78 amount=-1 +kerning first=80 second=80 amount=-1 +kerning first=80 second=82 amount=-1 +kerning first=80 second=84 amount=-1 +kerning first=80 second=86 amount=-1 +kerning first=80 second=87 amount=-1 +kerning first=80 second=89 amount=-1 +kerning first=209 second=97 amount=-2 +kerning first=80 second=99 amount=-1 +kerning first=80 second=100 amount=-1 +kerning first=80 second=101 amount=-1 +kerning first=80 second=103 amount=-2 +kerning first=80 second=111 amount=-1 +kerning first=80 second=113 amount=-1 +kerning first=80 second=115 amount=-1 +kerning first=209 second=83 amount=-1 +kerning first=80 second=171 amount=-2 +kerning first=80 second=192 amount=-3 +kerning first=80 second=193 amount=-3 +kerning first=80 second=194 amount=-3 +kerning first=80 second=196 amount=-3 +kerning first=80 second=197 amount=-3 +kerning first=80 second=198 amount=-3 +kerning first=80 second=200 amount=-1 +kerning first=80 second=201 amount=-1 +kerning first=80 second=202 amount=-1 +kerning first=80 second=203 amount=-1 +kerning first=80 second=204 amount=-1 +kerning first=80 second=205 amount=-1 +kerning first=80 second=206 amount=-1 +kerning first=80 second=207 amount=-1 +kerning first=80 second=209 amount=-1 +kerning first=80 second=221 amount=-1 +kerning first=209 second=81 amount=-1 +kerning first=209 second=79 amount=-1 +kerning first=209 second=74 amount=-1 +kerning first=209 second=71 amount=-1 +kerning first=209 second=67 amount=-1 +kerning first=209 second=46 amount=-1 +kerning first=209 second=45 amount=-3 +kerning first=80 second=231 amount=-1 +kerning first=80 second=232 amount=-1 +kerning first=80 second=233 amount=-1 +kerning first=80 second=234 amount=-1 +kerning first=80 second=235 amount=-1 +kerning first=80 second=240 amount=-1 +kerning first=80 second=242 amount=-1 +kerning first=80 second=243 amount=-1 +kerning first=80 second=244 amount=-1 +kerning first=80 second=245 amount=-1 +kerning first=80 second=246 amount=-1 +kerning first=80 second=248 amount=-1 +kerning first=80 second=256 amount=-3 +kerning first=209 second=44 amount=-1 +kerning first=208 second=8249 amount=-1 +kerning first=80 second=260 amount=-3 +kerning first=208 second=8221 amount=-1 +kerning first=80 second=263 amount=-1 +kerning first=80 second=267 amount=-1 +kerning first=80 second=269 amount=-1 +kerning first=80 second=270 amount=-1 +kerning first=80 second=274 amount=-1 +kerning first=80 second=275 amount=-1 +kerning first=80 second=277 amount=-1 +kerning first=80 second=278 amount=-1 +kerning first=80 second=279 amount=-1 +kerning first=80 second=280 amount=-1 +kerning first=80 second=281 amount=-1 +kerning first=80 second=282 amount=-1 +kerning first=80 second=283 amount=-1 +kerning first=80 second=287 amount=-2 +kerning first=80 second=289 amount=-2 +kerning first=80 second=291 amount=-2 +kerning first=80 second=296 amount=-1 +kerning first=80 second=298 amount=-1 +kerning first=80 second=302 amount=-1 +kerning first=80 second=304 amount=-1 +kerning first=80 second=310 amount=-1 +kerning first=80 second=313 amount=-1 +kerning first=80 second=315 amount=-1 +kerning first=80 second=317 amount=-1 +kerning first=80 second=323 amount=-1 +kerning first=80 second=325 amount=-1 +kerning first=80 second=327 amount=-1 +kerning first=80 second=330 amount=-1 +kerning first=80 second=333 amount=-1 +kerning first=80 second=335 amount=-1 +kerning first=80 second=337 amount=-1 +kerning first=80 second=339 amount=-1 +kerning first=80 second=344 amount=-1 +kerning first=80 second=347 amount=-1 +kerning first=80 second=351 amount=-1 +kerning first=80 second=353 amount=-1 +kerning first=80 second=354 amount=-1 +kerning first=80 second=356 amount=-1 +kerning first=80 second=374 amount=-1 +kerning first=208 second=8220 amount=-1 +kerning first=208 second=8217 amount=-1 +kerning first=208 second=382 amount=-1 +kerning first=208 second=381 amount=-1 +kerning first=208 second=380 amount=-1 +kerning first=208 second=379 amount=-1 +kerning first=208 second=378 amount=-1 +kerning first=208 second=377 amount=-1 +kerning first=208 second=374 amount=-1 +kerning first=208 second=370 amount=-1 +kerning first=208 second=368 amount=-1 +kerning first=208 second=366 amount=-1 +kerning first=208 second=364 amount=-1 +kerning first=208 second=362 amount=-1 +kerning first=208 second=356 amount=-1 +kerning first=80 second=8249 amount=-2 +kerning first=81 second=44 amount=-2 +kerning first=81 second=45 amount=-1 +kerning first=81 second=46 amount=-2 +kerning first=81 second=65 amount=-3 +kerning first=81 second=66 amount=-1 +kerning first=81 second=68 amount=-1 +kerning first=81 second=69 amount=-1 +kerning first=81 second=70 amount=-1 +kerning first=81 second=72 amount=-1 +kerning first=81 second=73 amount=-1 +kerning first=81 second=74 amount=-1 +kerning first=81 second=75 amount=-1 +kerning first=81 second=76 amount=-1 +kerning first=81 second=77 amount=-1 +kerning first=81 second=78 amount=-1 +kerning first=81 second=80 amount=-1 +kerning first=81 second=82 amount=-1 +kerning first=81 second=83 amount=-1 +kerning first=81 second=84 amount=-1 +kerning first=81 second=85 amount=-1 +kerning first=81 second=86 amount=-1 +kerning first=81 second=87 amount=-1 +kerning first=81 second=89 amount=-1 +kerning first=81 second=90 amount=-1 +kerning first=81 second=97 amount=-1 +kerning first=81 second=103 amount=-1 +kerning first=208 second=354 amount=-1 +kerning first=81 second=106 amount=-1 +kerning first=208 second=352 amount=-1 +kerning first=81 second=120 amount=-1 +kerning first=81 second=122 amount=-1 +kerning first=81 second=171 amount=-1 +kerning first=81 second=192 amount=-3 +kerning first=81 second=193 amount=-3 +kerning first=81 second=194 amount=-3 +kerning first=81 second=196 amount=-3 +kerning first=81 second=197 amount=-3 +kerning first=81 second=198 amount=-3 +kerning first=81 second=200 amount=-1 +kerning first=81 second=201 amount=-1 +kerning first=81 second=202 amount=-1 +kerning first=81 second=203 amount=-1 +kerning first=81 second=204 amount=-1 +kerning first=81 second=205 amount=-1 +kerning first=81 second=206 amount=-1 +kerning first=81 second=207 amount=-1 +kerning first=81 second=209 amount=-1 +kerning first=81 second=217 amount=-1 +kerning first=81 second=218 amount=-1 +kerning first=81 second=219 amount=-1 +kerning first=81 second=220 amount=-1 +kerning first=81 second=221 amount=-1 +kerning first=81 second=224 amount=-1 +kerning first=81 second=225 amount=-1 +kerning first=81 second=226 amount=-1 +kerning first=81 second=227 amount=-1 +kerning first=81 second=228 amount=-1 +kerning first=81 second=229 amount=-1 +kerning first=81 second=230 amount=-1 +kerning first=208 second=350 amount=-1 +kerning first=81 second=256 amount=-3 +kerning first=81 second=257 amount=-1 +kerning first=81 second=259 amount=-1 +kerning first=81 second=260 amount=-3 +kerning first=81 second=261 amount=-1 +kerning first=81 second=270 amount=-1 +kerning first=81 second=274 amount=-1 +kerning first=81 second=278 amount=-1 +kerning first=81 second=280 amount=-1 +kerning first=81 second=282 amount=-1 +kerning first=81 second=287 amount=-1 +kerning first=81 second=289 amount=-1 +kerning first=81 second=291 amount=-1 +kerning first=81 second=296 amount=-1 +kerning first=81 second=298 amount=-1 +kerning first=81 second=302 amount=-1 +kerning first=208 second=346 amount=-1 +kerning first=81 second=304 amount=-1 +kerning first=208 second=344 amount=-1 +kerning first=81 second=310 amount=-1 +kerning first=81 second=313 amount=-1 +kerning first=81 second=315 amount=-1 +kerning first=81 second=317 amount=-1 +kerning first=81 second=323 amount=-1 +kerning first=81 second=325 amount=-1 +kerning first=81 second=327 amount=-1 +kerning first=81 second=330 amount=-1 +kerning first=81 second=344 amount=-1 +kerning first=81 second=346 amount=-1 +kerning first=81 second=350 amount=-1 +kerning first=81 second=352 amount=-1 +kerning first=81 second=354 amount=-1 +kerning first=81 second=356 amount=-1 +kerning first=81 second=362 amount=-1 +kerning first=81 second=364 amount=-1 +kerning first=81 second=366 amount=-1 +kerning first=81 second=368 amount=-1 +kerning first=81 second=370 amount=-1 +kerning first=81 second=374 amount=-1 +kerning first=81 second=377 amount=-1 +kerning first=81 second=378 amount=-1 +kerning first=81 second=379 amount=-1 +kerning first=81 second=380 amount=-1 +kerning first=81 second=381 amount=-1 +kerning first=81 second=382 amount=-1 +kerning first=208 second=330 amount=-1 +kerning first=208 second=327 amount=-1 +kerning first=208 second=325 amount=-1 +kerning first=208 second=323 amount=-1 +kerning first=208 second=317 amount=-1 +kerning first=208 second=315 amount=-1 +kerning first=208 second=313 amount=-1 +kerning first=208 second=310 amount=-1 +kerning first=208 second=304 amount=-1 +kerning first=208 second=302 amount=-1 +kerning first=208 second=298 amount=-1 +kerning first=208 second=296 amount=-1 +kerning first=208 second=291 amount=-1 +kerning first=208 second=289 amount=-1 +kerning first=208 second=287 amount=-1 +kerning first=208 second=282 amount=-1 +kerning first=81 second=8217 amount=-1 +kerning first=81 second=8220 amount=-1 +kerning first=81 second=8221 amount=-1 +kerning first=81 second=8249 amount=-1 +kerning first=82 second=44 amount=-1 +kerning first=82 second=45 amount=-3 +kerning first=82 second=46 amount=-1 +kerning first=82 second=67 amount=-2 +kerning first=82 second=71 amount=-2 +kerning first=82 second=79 amount=-2 +kerning first=82 second=81 amount=-2 +kerning first=82 second=83 amount=-2 +kerning first=82 second=84 amount=-2 +kerning first=82 second=85 amount=-2 +kerning first=82 second=86 amount=-2 +kerning first=82 second=87 amount=-2 +kerning first=82 second=89 amount=-2 +kerning first=82 second=97 amount=-1 +kerning first=82 second=98 amount=-2 +kerning first=82 second=99 amount=-2 +kerning first=82 second=100 amount=-2 +kerning first=82 second=101 amount=-2 +kerning first=82 second=103 amount=-2 +kerning first=82 second=104 amount=-2 +kerning first=208 second=280 amount=-1 +kerning first=82 second=106 amount=-1 +kerning first=82 second=107 amount=-2 +kerning first=82 second=108 amount=-2 +kerning first=82 second=111 amount=-2 +kerning first=82 second=112 amount=-1 +kerning first=82 second=113 amount=-2 +kerning first=82 second=115 amount=-1 +kerning first=82 second=116 amount=-2 +kerning first=82 second=117 amount=-1 +kerning first=82 second=118 amount=-2 +kerning first=82 second=119 amount=-2 +kerning first=82 second=121 amount=-2 +kerning first=82 second=171 amount=-3 +kerning first=82 second=199 amount=-2 +kerning first=82 second=210 amount=-2 +kerning first=82 second=211 amount=-2 +kerning first=82 second=212 amount=-2 +kerning first=82 second=213 amount=-2 +kerning first=82 second=214 amount=-2 +kerning first=82 second=216 amount=-2 +kerning first=82 second=217 amount=-2 +kerning first=82 second=218 amount=-2 +kerning first=82 second=219 amount=-2 +kerning first=82 second=220 amount=-2 +kerning first=82 second=221 amount=-2 +kerning first=82 second=224 amount=-1 +kerning first=82 second=225 amount=-1 +kerning first=82 second=226 amount=-1 +kerning first=82 second=227 amount=-1 +kerning first=82 second=228 amount=-1 +kerning first=82 second=229 amount=-1 +kerning first=82 second=230 amount=-1 +kerning first=82 second=231 amount=-2 +kerning first=82 second=232 amount=-2 +kerning first=82 second=233 amount=-2 +kerning first=82 second=234 amount=-2 +kerning first=82 second=235 amount=-2 +kerning first=208 second=278 amount=-1 +kerning first=82 second=240 amount=-2 +kerning first=82 second=242 amount=-2 +kerning first=82 second=243 amount=-2 +kerning first=82 second=244 amount=-2 +kerning first=82 second=245 amount=-2 +kerning first=82 second=246 amount=-2 +kerning first=82 second=248 amount=-2 +kerning first=82 second=249 amount=-1 +kerning first=82 second=250 amount=-1 +kerning first=82 second=251 amount=-1 +kerning first=82 second=252 amount=-1 +kerning first=82 second=253 amount=-2 +kerning first=82 second=254 amount=-2 +kerning first=82 second=255 amount=-2 +kerning first=82 second=257 amount=-1 +kerning first=82 second=259 amount=-1 +kerning first=82 second=261 amount=-1 +kerning first=82 second=262 amount=-2 +kerning first=82 second=263 amount=-2 +kerning first=82 second=264 amount=-2 +kerning first=82 second=266 amount=-2 +kerning first=82 second=267 amount=-2 +kerning first=82 second=268 amount=-2 +kerning first=82 second=269 amount=-2 +kerning first=82 second=275 amount=-2 +kerning first=82 second=277 amount=-2 +kerning first=82 second=279 amount=-2 +kerning first=82 second=281 amount=-2 +kerning first=82 second=283 amount=-2 +kerning first=82 second=284 amount=-2 +kerning first=82 second=286 amount=-2 +kerning first=82 second=287 amount=-2 +kerning first=82 second=288 amount=-2 +kerning first=82 second=289 amount=-2 +kerning first=82 second=290 amount=-2 +kerning first=82 second=291 amount=-2 +kerning first=208 second=274 amount=-1 +kerning first=208 second=270 amount=-1 +kerning first=82 second=311 amount=-2 +kerning first=82 second=314 amount=-2 +kerning first=82 second=316 amount=-2 +kerning first=82 second=318 amount=-2 +kerning first=82 second=332 amount=-2 +kerning first=82 second=333 amount=-2 +kerning first=82 second=334 amount=-2 +kerning first=82 second=335 amount=-2 +kerning first=82 second=336 amount=-2 +kerning first=82 second=337 amount=-2 +kerning first=82 second=338 amount=-2 +kerning first=82 second=339 amount=-2 +kerning first=82 second=346 amount=-2 +kerning first=82 second=347 amount=-1 +kerning first=82 second=350 amount=-2 +kerning first=82 second=351 amount=-1 +kerning first=82 second=352 amount=-2 +kerning first=82 second=353 amount=-1 +kerning first=82 second=354 amount=-2 +kerning first=82 second=355 amount=-2 +kerning first=82 second=356 amount=-2 +kerning first=82 second=361 amount=-1 +kerning first=82 second=362 amount=-2 +kerning first=82 second=363 amount=-1 +kerning first=82 second=364 amount=-2 +kerning first=82 second=365 amount=-1 +kerning first=82 second=366 amount=-2 +kerning first=82 second=367 amount=-1 +kerning first=82 second=368 amount=-2 +kerning first=82 second=369 amount=-1 +kerning first=82 second=370 amount=-2 +kerning first=82 second=374 amount=-2 +kerning first=82 second=375 amount=-2 +kerning first=208 second=261 amount=-1 +kerning first=208 second=260 amount=-3 +kerning first=208 second=259 amount=-1 +kerning first=208 second=257 amount=-1 +kerning first=208 second=256 amount=-3 +kerning first=208 second=230 amount=-1 +kerning first=208 second=229 amount=-1 +kerning first=208 second=228 amount=-1 +kerning first=208 second=227 amount=-1 +kerning first=208 second=226 amount=-1 +kerning first=208 second=225 amount=-1 +kerning first=208 second=224 amount=-1 +kerning first=208 second=221 amount=-1 +kerning first=208 second=220 amount=-1 +kerning first=82 second=8217 amount=-4 +kerning first=82 second=8220 amount=-4 +kerning first=82 second=8221 amount=-4 +kerning first=82 second=8249 amount=-3 +kerning first=83 second=44 amount=-3 +kerning first=83 second=45 amount=-2 +kerning first=83 second=46 amount=-3 +kerning first=83 second=65 amount=-3 +kerning first=83 second=66 amount=-2 +kerning first=83 second=68 amount=-2 +kerning first=83 second=69 amount=-2 +kerning first=83 second=70 amount=-2 +kerning first=83 second=72 amount=-2 +kerning first=83 second=73 amount=-2 +kerning first=83 second=74 amount=-1 +kerning first=83 second=75 amount=-2 +kerning first=83 second=76 amount=-2 +kerning first=83 second=77 amount=-2 +kerning first=83 second=78 amount=-2 +kerning first=83 second=80 amount=-2 +kerning first=83 second=82 amount=-2 +kerning first=83 second=83 amount=-1 +kerning first=83 second=84 amount=-2 +kerning first=83 second=85 amount=-2 +kerning first=83 second=86 amount=-2 +kerning first=83 second=87 amount=-2 +kerning first=83 second=89 amount=-2 +kerning first=83 second=90 amount=-1 +kerning first=83 second=97 amount=-1 +kerning first=83 second=98 amount=-1 +kerning first=208 second=219 amount=-1 +kerning first=208 second=218 amount=-1 +kerning first=208 second=217 amount=-1 +kerning first=83 second=102 amount=-2 +kerning first=83 second=103 amount=-2 +kerning first=83 second=104 amount=-1 +kerning first=83 second=105 amount=-2 +kerning first=83 second=106 amount=-1 +kerning first=83 second=107 amount=-1 +kerning first=83 second=108 amount=-1 +kerning first=83 second=109 amount=-1 +kerning first=83 second=110 amount=-1 +kerning first=208 second=209 amount=-1 +kerning first=83 second=112 amount=-2 +kerning first=208 second=207 amount=-1 +kerning first=83 second=114 amount=-1 +kerning first=83 second=115 amount=-1 +kerning first=83 second=116 amount=-1 +kerning first=83 second=117 amount=-1 +kerning first=83 second=118 amount=-2 +kerning first=83 second=119 amount=-2 +kerning first=83 second=120 amount=-2 +kerning first=83 second=121 amount=-1 +kerning first=83 second=122 amount=-1 +kerning first=83 second=171 amount=-2 +kerning first=83 second=187 amount=-1 +kerning first=83 second=192 amount=-3 +kerning first=83 second=193 amount=-3 +kerning first=83 second=194 amount=-3 +kerning first=83 second=196 amount=-3 +kerning first=83 second=197 amount=-3 +kerning first=83 second=198 amount=-3 +kerning first=83 second=200 amount=-2 +kerning first=83 second=201 amount=-2 +kerning first=83 second=202 amount=-2 +kerning first=83 second=203 amount=-2 +kerning first=83 second=204 amount=-2 +kerning first=83 second=205 amount=-2 +kerning first=83 second=206 amount=-2 +kerning first=83 second=207 amount=-2 +kerning first=83 second=209 amount=-2 +kerning first=83 second=217 amount=-2 +kerning first=83 second=218 amount=-2 +kerning first=83 second=219 amount=-2 +kerning first=83 second=220 amount=-2 +kerning first=83 second=221 amount=-2 +kerning first=83 second=223 amount=-1 +kerning first=83 second=224 amount=-1 +kerning first=83 second=225 amount=-1 +kerning first=83 second=226 amount=-1 +kerning first=83 second=227 amount=-1 +kerning first=83 second=228 amount=-1 +kerning first=83 second=229 amount=-1 +kerning first=83 second=230 amount=-1 +kerning first=208 second=206 amount=-1 +kerning first=208 second=205 amount=-1 +kerning first=208 second=204 amount=-1 +kerning first=208 second=203 amount=-1 +kerning first=208 second=202 amount=-1 +kerning first=83 second=237 amount=-2 +kerning first=208 second=201 amount=-1 +kerning first=83 second=241 amount=-1 +kerning first=208 second=200 amount=-1 +kerning first=208 second=198 amount=-3 +kerning first=208 second=197 amount=-3 +kerning first=208 second=196 amount=-3 +kerning first=208 second=194 amount=-3 +kerning first=208 second=193 amount=-3 +kerning first=83 second=249 amount=-1 +kerning first=83 second=250 amount=-1 +kerning first=83 second=251 amount=-1 +kerning first=83 second=252 amount=-1 +kerning first=83 second=253 amount=-1 +kerning first=83 second=254 amount=-1 +kerning first=83 second=255 amount=-1 +kerning first=83 second=256 amount=-3 +kerning first=83 second=257 amount=-1 +kerning first=83 second=259 amount=-1 +kerning first=83 second=260 amount=-3 +kerning first=83 second=261 amount=-1 +kerning first=208 second=192 amount=-3 +kerning first=208 second=171 amount=-1 +kerning first=208 second=122 amount=-1 +kerning first=83 second=270 amount=-2 +kerning first=83 second=274 amount=-2 +kerning first=208 second=120 amount=-1 +kerning first=208 second=106 amount=-1 +kerning first=83 second=278 amount=-2 +kerning first=208 second=103 amount=-1 +kerning first=83 second=280 amount=-2 +kerning first=208 second=97 amount=-1 +kerning first=83 second=282 amount=-2 +kerning first=208 second=90 amount=-1 +kerning first=83 second=287 amount=-2 +kerning first=83 second=289 amount=-2 +kerning first=83 second=291 amount=-2 +kerning first=83 second=296 amount=-2 +kerning first=83 second=298 amount=-2 +kerning first=83 second=302 amount=-2 +kerning first=83 second=303 amount=-2 +kerning first=83 second=304 amount=-2 +kerning first=83 second=305 amount=-2 +kerning first=83 second=310 amount=-2 +kerning first=83 second=311 amount=-1 +kerning first=83 second=313 amount=-2 +kerning first=83 second=314 amount=-1 +kerning first=83 second=315 amount=-2 +kerning first=83 second=316 amount=-1 +kerning first=83 second=317 amount=-2 +kerning first=83 second=318 amount=-1 +kerning first=83 second=323 amount=-2 +kerning first=83 second=324 amount=-1 +kerning first=83 second=325 amount=-2 +kerning first=83 second=326 amount=-1 +kerning first=83 second=327 amount=-2 +kerning first=83 second=328 amount=-1 +kerning first=83 second=330 amount=-2 +kerning first=83 second=331 amount=-1 +kerning first=208 second=89 amount=-1 +kerning first=208 second=87 amount=-1 +kerning first=208 second=86 amount=-1 +kerning first=208 second=85 amount=-1 +kerning first=83 second=344 amount=-2 +kerning first=83 second=345 amount=-1 +kerning first=83 second=346 amount=-1 +kerning first=83 second=347 amount=-1 +kerning first=83 second=350 amount=-1 +kerning first=83 second=351 amount=-1 +kerning first=83 second=352 amount=-1 +kerning first=83 second=353 amount=-1 +kerning first=83 second=354 amount=-2 +kerning first=83 second=355 amount=-1 +kerning first=83 second=356 amount=-2 +kerning first=83 second=361 amount=-1 +kerning first=83 second=362 amount=-2 +kerning first=83 second=363 amount=-1 +kerning first=83 second=364 amount=-2 +kerning first=83 second=365 amount=-1 +kerning first=83 second=366 amount=-2 +kerning first=83 second=367 amount=-1 +kerning first=83 second=368 amount=-2 +kerning first=83 second=369 amount=-1 +kerning first=83 second=370 amount=-2 +kerning first=83 second=374 amount=-2 +kerning first=83 second=375 amount=-1 +kerning first=83 second=377 amount=-1 +kerning first=83 second=378 amount=-1 +kerning first=83 second=379 amount=-1 +kerning first=83 second=380 amount=-1 +kerning first=83 second=381 amount=-1 +kerning first=83 second=382 amount=-1 +kerning first=208 second=84 amount=-1 +kerning first=208 second=83 amount=-1 +kerning first=208 second=82 amount=-1 +kerning first=208 second=80 amount=-1 +kerning first=208 second=78 amount=-1 +kerning first=208 second=77 amount=-1 +kerning first=208 second=76 amount=-1 +kerning first=208 second=75 amount=-1 +kerning first=208 second=74 amount=-1 +kerning first=208 second=73 amount=-1 +kerning first=208 second=72 amount=-1 +kerning first=208 second=70 amount=-1 +kerning first=208 second=69 amount=-1 +kerning first=208 second=68 amount=-1 +kerning first=208 second=66 amount=-1 +kerning first=208 second=65 amount=-3 +kerning first=208 second=46 amount=-2 +kerning first=208 second=45 amount=-1 +kerning first=208 second=44 amount=-2 +kerning first=207 second=382 amount=-1 +kerning first=207 second=380 amount=-1 +kerning first=207 second=378 amount=-1 +kerning first=207 second=375 amount=-1 +kerning first=207 second=369 amount=-2 +kerning first=207 second=367 amount=-2 +kerning first=207 second=365 amount=-2 +kerning first=83 second=8217 amount=-1 +kerning first=83 second=8220 amount=-1 +kerning first=83 second=8221 amount=-1 +kerning first=83 second=8249 amount=-2 +kerning first=83 second=8250 amount=-1 +kerning first=207 second=363 amount=-2 +kerning first=207 second=361 amount=-2 +kerning first=207 second=353 amount=-1 +kerning first=207 second=352 amount=-1 +kerning first=207 second=351 amount=-1 +kerning first=84 second=44 amount=-4 +kerning first=84 second=45 amount=-4 +kerning first=84 second=46 amount=-4 +kerning first=84 second=65 amount=-5 +kerning first=84 second=66 amount=-1 +kerning first=84 second=67 amount=-2 +kerning first=84 second=68 amount=-1 +kerning first=84 second=69 amount=-1 +kerning first=84 second=70 amount=-1 +kerning first=84 second=71 amount=-2 +kerning first=84 second=72 amount=-1 +kerning first=84 second=73 amount=-1 +kerning first=84 second=74 amount=-3 +kerning first=84 second=75 amount=-1 +kerning first=84 second=76 amount=-1 +kerning first=84 second=77 amount=-1 +kerning first=84 second=78 amount=-1 +kerning first=84 second=79 amount=-2 +kerning first=84 second=80 amount=-1 +kerning first=84 second=81 amount=-2 +kerning first=84 second=82 amount=-1 +kerning first=84 second=83 amount=-2 +kerning first=84 second=85 amount=-1 +kerning first=84 second=90 amount=-2 +kerning first=84 second=97 amount=-4 +kerning first=84 second=99 amount=-2 +kerning first=84 second=100 amount=-2 +kerning first=84 second=101 amount=-2 +kerning first=84 second=102 amount=-1 +kerning first=84 second=103 amount=-3 +kerning first=84 second=105 amount=-1 +kerning first=84 second=109 amount=-2 +kerning first=84 second=110 amount=-2 +kerning first=84 second=111 amount=-2 +kerning first=84 second=112 amount=-1 +kerning first=84 second=113 amount=-2 +kerning first=84 second=114 amount=-1 +kerning first=84 second=115 amount=-2 +kerning first=84 second=116 amount=-1 +kerning first=84 second=117 amount=-1 +kerning first=84 second=118 amount=-2 +kerning first=84 second=119 amount=-2 +kerning first=84 second=120 amount=-1 +kerning first=84 second=121 amount=-2 +kerning first=84 second=122 amount=-2 +kerning first=84 second=171 amount=-4 +kerning first=84 second=187 amount=-2 +kerning first=84 second=192 amount=-5 +kerning first=84 second=193 amount=-5 +kerning first=84 second=194 amount=-5 +kerning first=84 second=196 amount=-5 +kerning first=84 second=197 amount=-5 +kerning first=84 second=198 amount=-5 +kerning first=84 second=199 amount=-2 +kerning first=84 second=200 amount=-1 +kerning first=84 second=201 amount=-1 +kerning first=84 second=202 amount=-1 +kerning first=84 second=203 amount=-1 +kerning first=84 second=204 amount=-1 +kerning first=84 second=205 amount=-1 +kerning first=84 second=206 amount=-1 +kerning first=84 second=207 amount=-1 +kerning first=84 second=209 amount=-1 +kerning first=84 second=210 amount=-2 +kerning first=84 second=211 amount=-2 +kerning first=84 second=212 amount=-2 +kerning first=84 second=213 amount=-2 +kerning first=84 second=214 amount=-2 +kerning first=84 second=216 amount=-2 +kerning first=84 second=217 amount=-1 +kerning first=84 second=218 amount=-1 +kerning first=84 second=219 amount=-1 +kerning first=84 second=220 amount=-1 +kerning first=84 second=223 amount=-2 +kerning first=84 second=224 amount=-3 +kerning first=84 second=225 amount=-4 +kerning first=84 second=226 amount=-4 +kerning first=84 second=227 amount=-4 +kerning first=84 second=228 amount=-3 +kerning first=84 second=229 amount=-4 +kerning first=84 second=230 amount=-4 +kerning first=84 second=231 amount=-2 +kerning first=84 second=232 amount=-2 +kerning first=84 second=233 amount=-2 +kerning first=84 second=234 amount=-2 +kerning first=84 second=235 amount=-2 +kerning first=84 second=237 amount=-1 +kerning first=84 second=240 amount=-2 +kerning first=84 second=241 amount=-2 +kerning first=84 second=242 amount=-2 +kerning first=84 second=243 amount=-2 +kerning first=84 second=244 amount=-2 +kerning first=84 second=245 amount=-2 +kerning first=84 second=246 amount=-2 +kerning first=84 second=248 amount=-2 +kerning first=84 second=249 amount=-1 +kerning first=84 second=250 amount=-1 +kerning first=84 second=251 amount=-1 +kerning first=84 second=252 amount=-1 +kerning first=84 second=253 amount=-2 +kerning first=84 second=255 amount=-2 +kerning first=84 second=256 amount=-5 +kerning first=84 second=257 amount=-4 +kerning first=84 second=259 amount=-4 +kerning first=84 second=260 amount=-5 +kerning first=84 second=261 amount=-4 +kerning first=84 second=262 amount=-2 +kerning first=84 second=263 amount=-2 +kerning first=84 second=264 amount=-2 +kerning first=84 second=266 amount=-2 +kerning first=84 second=267 amount=-2 +kerning first=84 second=268 amount=-2 +kerning first=84 second=269 amount=-2 +kerning first=84 second=270 amount=-1 +kerning first=84 second=274 amount=-1 +kerning first=84 second=275 amount=-2 +kerning first=84 second=277 amount=-2 +kerning first=84 second=278 amount=-1 +kerning first=84 second=279 amount=-2 +kerning first=84 second=280 amount=-1 +kerning first=84 second=281 amount=-2 +kerning first=84 second=282 amount=-1 +kerning first=84 second=283 amount=-2 +kerning first=84 second=284 amount=-2 +kerning first=84 second=286 amount=-2 +kerning first=84 second=287 amount=-3 +kerning first=84 second=288 amount=-2 +kerning first=84 second=289 amount=-3 +kerning first=84 second=290 amount=-2 +kerning first=84 second=291 amount=-3 +kerning first=84 second=296 amount=-1 +kerning first=84 second=298 amount=-1 +kerning first=84 second=302 amount=-1 +kerning first=84 second=303 amount=-1 +kerning first=84 second=304 amount=-1 +kerning first=84 second=305 amount=-1 +kerning first=84 second=310 amount=-1 +kerning first=84 second=313 amount=-1 +kerning first=84 second=315 amount=-1 +kerning first=84 second=317 amount=-1 +kerning first=84 second=323 amount=-1 +kerning first=84 second=324 amount=-2 +kerning first=84 second=325 amount=-1 +kerning first=84 second=326 amount=-2 +kerning first=84 second=327 amount=-1 +kerning first=84 second=328 amount=-2 +kerning first=84 second=330 amount=-1 +kerning first=84 second=331 amount=-2 +kerning first=84 second=332 amount=-2 +kerning first=84 second=333 amount=-2 +kerning first=84 second=334 amount=-2 +kerning first=84 second=335 amount=-2 +kerning first=84 second=336 amount=-2 +kerning first=84 second=337 amount=-2 +kerning first=84 second=338 amount=-2 +kerning first=84 second=339 amount=-2 +kerning first=84 second=344 amount=-1 +kerning first=84 second=345 amount=-1 +kerning first=84 second=346 amount=-2 +kerning first=84 second=347 amount=-2 +kerning first=84 second=350 amount=-2 +kerning first=84 second=351 amount=-2 +kerning first=84 second=352 amount=-2 +kerning first=84 second=353 amount=-2 +kerning first=84 second=355 amount=-1 +kerning first=84 second=361 amount=-1 +kerning first=84 second=362 amount=-1 +kerning first=84 second=363 amount=-1 +kerning first=84 second=364 amount=-1 +kerning first=84 second=365 amount=-1 +kerning first=84 second=366 amount=-1 +kerning first=84 second=367 amount=-1 +kerning first=84 second=368 amount=-1 +kerning first=84 second=369 amount=-1 +kerning first=84 second=370 amount=-1 +kerning first=84 second=375 amount=-2 +kerning first=84 second=377 amount=-2 +kerning first=84 second=378 amount=-2 +kerning first=84 second=379 amount=-2 +kerning first=84 second=380 amount=-2 +kerning first=84 second=381 amount=-2 +kerning first=84 second=382 amount=-2 +kerning first=207 second=350 amount=-1 +kerning first=207 second=347 amount=-1 +kerning first=207 second=346 amount=-1 +kerning first=207 second=339 amount=-1 +kerning first=207 second=338 amount=-1 +kerning first=207 second=337 amount=-1 +kerning first=207 second=336 amount=-1 +kerning first=207 second=335 amount=-1 +kerning first=207 second=334 amount=-1 +kerning first=207 second=333 amount=-1 +kerning first=207 second=332 amount=-1 +kerning first=207 second=291 amount=-2 +kerning first=207 second=290 amount=-1 +kerning first=207 second=289 amount=-2 +kerning first=207 second=288 amount=-1 +kerning first=207 second=287 amount=-2 +kerning first=207 second=286 amount=-1 +kerning first=207 second=284 amount=-1 +kerning first=207 second=283 amount=-1 +kerning first=207 second=281 amount=-1 +kerning first=207 second=279 amount=-1 +kerning first=84 second=8249 amount=-4 +kerning first=84 second=8250 amount=-2 +kerning first=207 second=277 amount=-1 +kerning first=207 second=275 amount=-1 +kerning first=207 second=269 amount=-1 +kerning first=207 second=268 amount=-1 +kerning first=207 second=267 amount=-1 +kerning first=85 second=44 amount=-4 +kerning first=85 second=45 amount=-4 +kerning first=85 second=46 amount=-4 +kerning first=85 second=65 amount=-3 +kerning first=85 second=67 amount=-1 +kerning first=85 second=71 amount=-1 +kerning first=85 second=74 amount=-2 +kerning first=85 second=79 amount=-1 +kerning first=85 second=81 amount=-1 +kerning first=85 second=83 amount=-2 +kerning first=85 second=90 amount=-1 +kerning first=85 second=97 amount=-2 +kerning first=85 second=99 amount=-1 +kerning first=85 second=100 amount=-1 +kerning first=85 second=101 amount=-1 +kerning first=85 second=102 amount=-1 +kerning first=85 second=103 amount=-3 +kerning first=85 second=105 amount=-1 +kerning first=85 second=109 amount=-1 +kerning first=85 second=110 amount=-1 +kerning first=85 second=111 amount=-1 +kerning first=85 second=112 amount=-1 +kerning first=85 second=113 amount=-1 +kerning first=85 second=114 amount=-1 +kerning first=85 second=115 amount=-1 +kerning first=85 second=117 amount=-1 +kerning first=85 second=118 amount=-1 +kerning first=85 second=119 amount=-1 +kerning first=85 second=120 amount=-1 +kerning first=85 second=121 amount=-1 +kerning first=85 second=122 amount=-2 +kerning first=85 second=171 amount=-4 +kerning first=85 second=192 amount=-3 +kerning first=85 second=193 amount=-3 +kerning first=85 second=194 amount=-3 +kerning first=85 second=196 amount=-3 +kerning first=85 second=197 amount=-3 +kerning first=85 second=198 amount=-3 +kerning first=85 second=199 amount=-1 +kerning first=85 second=210 amount=-1 +kerning first=85 second=211 amount=-1 +kerning first=85 second=212 amount=-1 +kerning first=85 second=213 amount=-1 +kerning first=85 second=214 amount=-1 +kerning first=85 second=216 amount=-1 +kerning first=85 second=223 amount=-1 +kerning first=85 second=224 amount=-2 +kerning first=85 second=225 amount=-2 +kerning first=85 second=226 amount=-2 +kerning first=85 second=227 amount=-2 +kerning first=85 second=228 amount=-2 +kerning first=85 second=229 amount=-2 +kerning first=85 second=230 amount=-2 +kerning first=85 second=231 amount=-1 +kerning first=85 second=232 amount=-1 +kerning first=85 second=233 amount=-1 +kerning first=85 second=234 amount=-1 +kerning first=85 second=235 amount=-1 +kerning first=85 second=237 amount=-1 +kerning first=85 second=240 amount=-1 +kerning first=85 second=241 amount=-1 +kerning first=85 second=242 amount=-1 +kerning first=85 second=243 amount=-1 +kerning first=85 second=244 amount=-1 +kerning first=85 second=245 amount=-1 +kerning first=85 second=246 amount=-1 +kerning first=85 second=248 amount=-1 +kerning first=85 second=249 amount=-1 +kerning first=85 second=250 amount=-1 +kerning first=85 second=251 amount=-1 +kerning first=85 second=252 amount=-1 +kerning first=85 second=253 amount=-1 +kerning first=85 second=255 amount=-1 +kerning first=85 second=256 amount=-3 +kerning first=85 second=257 amount=-2 +kerning first=85 second=259 amount=-2 +kerning first=85 second=260 amount=-3 +kerning first=85 second=261 amount=-2 +kerning first=85 second=262 amount=-1 +kerning first=85 second=263 amount=-1 +kerning first=85 second=264 amount=-1 +kerning first=85 second=266 amount=-1 +kerning first=85 second=267 amount=-1 +kerning first=85 second=268 amount=-1 +kerning first=85 second=269 amount=-1 +kerning first=85 second=275 amount=-1 +kerning first=85 second=277 amount=-1 +kerning first=85 second=279 amount=-1 +kerning first=85 second=281 amount=-1 +kerning first=85 second=283 amount=-1 +kerning first=85 second=284 amount=-1 +kerning first=85 second=286 amount=-1 +kerning first=85 second=287 amount=-3 +kerning first=85 second=288 amount=-1 +kerning first=85 second=289 amount=-3 +kerning first=85 second=290 amount=-1 +kerning first=85 second=291 amount=-3 +kerning first=85 second=303 amount=-1 +kerning first=85 second=305 amount=-1 +kerning first=85 second=324 amount=-1 +kerning first=85 second=326 amount=-1 +kerning first=85 second=328 amount=-1 +kerning first=85 second=331 amount=-1 +kerning first=85 second=332 amount=-1 +kerning first=85 second=333 amount=-1 +kerning first=85 second=334 amount=-1 +kerning first=85 second=335 amount=-1 +kerning first=85 second=336 amount=-1 +kerning first=85 second=337 amount=-1 +kerning first=85 second=338 amount=-1 +kerning first=85 second=339 amount=-1 +kerning first=85 second=345 amount=-1 +kerning first=85 second=346 amount=-2 +kerning first=85 second=347 amount=-1 +kerning first=85 second=350 amount=-2 +kerning first=85 second=351 amount=-1 +kerning first=85 second=352 amount=-2 +kerning first=85 second=353 amount=-1 +kerning first=85 second=361 amount=-1 +kerning first=85 second=363 amount=-1 +kerning first=85 second=365 amount=-1 +kerning first=85 second=367 amount=-1 +kerning first=85 second=369 amount=-1 +kerning first=85 second=375 amount=-1 +kerning first=85 second=377 amount=-1 +kerning first=85 second=378 amount=-2 +kerning first=85 second=379 amount=-1 +kerning first=85 second=380 amount=-2 +kerning first=85 second=381 amount=-1 +kerning first=85 second=382 amount=-2 +kerning first=207 second=266 amount=-1 +kerning first=207 second=264 amount=-1 +kerning first=207 second=263 amount=-1 +kerning first=207 second=262 amount=-1 +kerning first=207 second=261 amount=-2 +kerning first=207 second=259 amount=-2 +kerning first=207 second=257 amount=-2 +kerning first=207 second=255 amount=-1 +kerning first=207 second=253 amount=-1 +kerning first=207 second=252 amount=-1 +kerning first=207 second=251 amount=-2 +kerning first=85 second=8249 amount=-4 +kerning first=207 second=250 amount=-2 +kerning first=207 second=249 amount=-1 +kerning first=207 second=248 amount=-1 +kerning first=207 second=246 amount=-1 +kerning first=207 second=245 amount=-1 +kerning first=86 second=44 amount=-4 +kerning first=86 second=45 amount=-4 +kerning first=86 second=46 amount=-4 +kerning first=86 second=65 amount=-5 +kerning first=86 second=66 amount=-1 +kerning first=86 second=67 amount=-2 +kerning first=86 second=68 amount=-1 +kerning first=86 second=69 amount=-1 +kerning first=86 second=70 amount=-1 +kerning first=86 second=71 amount=-2 +kerning first=86 second=72 amount=-1 +kerning first=86 second=73 amount=-1 +kerning first=86 second=74 amount=-3 +kerning first=86 second=75 amount=-1 +kerning first=86 second=76 amount=-1 +kerning first=86 second=77 amount=-1 +kerning first=86 second=78 amount=-1 +kerning first=86 second=79 amount=-2 +kerning first=86 second=80 amount=-1 +kerning first=86 second=81 amount=-2 +kerning first=86 second=82 amount=-1 +kerning first=86 second=83 amount=-2 +kerning first=86 second=85 amount=-1 +kerning first=86 second=90 amount=-2 +kerning first=86 second=97 amount=-4 +kerning first=86 second=99 amount=-2 +kerning first=86 second=100 amount=-2 +kerning first=86 second=101 amount=-2 +kerning first=86 second=102 amount=-1 +kerning first=86 second=103 amount=-3 +kerning first=86 second=105 amount=-1 +kerning first=86 second=109 amount=-2 +kerning first=86 second=110 amount=-2 +kerning first=86 second=111 amount=-2 +kerning first=86 second=112 amount=-1 +kerning first=86 second=113 amount=-2 +kerning first=86 second=114 amount=-1 +kerning first=86 second=115 amount=-2 +kerning first=86 second=116 amount=-1 +kerning first=86 second=117 amount=-1 +kerning first=86 second=118 amount=-2 +kerning first=86 second=119 amount=-2 +kerning first=86 second=120 amount=-1 +kerning first=86 second=121 amount=-2 +kerning first=86 second=122 amount=-2 +kerning first=86 second=171 amount=-4 +kerning first=86 second=187 amount=-2 +kerning first=86 second=192 amount=-5 +kerning first=86 second=193 amount=-5 +kerning first=86 second=194 amount=-5 +kerning first=86 second=196 amount=-5 +kerning first=86 second=197 amount=-5 +kerning first=86 second=198 amount=-5 +kerning first=86 second=199 amount=-2 +kerning first=86 second=200 amount=-1 +kerning first=86 second=201 amount=-1 +kerning first=86 second=202 amount=-1 +kerning first=86 second=203 amount=-1 +kerning first=86 second=204 amount=-1 +kerning first=86 second=205 amount=-1 +kerning first=86 second=206 amount=-1 +kerning first=86 second=207 amount=-1 +kerning first=86 second=209 amount=-1 +kerning first=86 second=210 amount=-2 +kerning first=86 second=211 amount=-2 +kerning first=86 second=212 amount=-2 +kerning first=86 second=213 amount=-2 +kerning first=86 second=214 amount=-2 +kerning first=86 second=216 amount=-2 +kerning first=86 second=217 amount=-1 +kerning first=86 second=218 amount=-1 +kerning first=86 second=219 amount=-1 +kerning first=86 second=220 amount=-1 +kerning first=86 second=223 amount=-2 +kerning first=86 second=224 amount=-3 +kerning first=86 second=225 amount=-4 +kerning first=86 second=226 amount=-4 +kerning first=86 second=227 amount=-4 +kerning first=86 second=228 amount=-3 +kerning first=86 second=229 amount=-4 +kerning first=86 second=230 amount=-4 +kerning first=86 second=231 amount=-2 +kerning first=86 second=232 amount=-2 +kerning first=86 second=233 amount=-2 +kerning first=86 second=234 amount=-2 +kerning first=86 second=235 amount=-2 +kerning first=86 second=237 amount=-1 +kerning first=86 second=240 amount=-2 +kerning first=86 second=241 amount=-2 +kerning first=86 second=242 amount=-2 +kerning first=86 second=243 amount=-2 +kerning first=86 second=244 amount=-2 +kerning first=86 second=245 amount=-2 +kerning first=86 second=246 amount=-2 +kerning first=86 second=248 amount=-2 +kerning first=86 second=249 amount=-1 +kerning first=86 second=250 amount=-1 +kerning first=86 second=251 amount=-1 +kerning first=86 second=252 amount=-1 +kerning first=86 second=253 amount=-2 +kerning first=86 second=255 amount=-2 +kerning first=86 second=256 amount=-5 +kerning first=86 second=257 amount=-4 +kerning first=86 second=259 amount=-4 +kerning first=86 second=260 amount=-5 +kerning first=86 second=261 amount=-4 +kerning first=86 second=262 amount=-2 +kerning first=86 second=263 amount=-2 +kerning first=86 second=264 amount=-2 +kerning first=86 second=266 amount=-2 +kerning first=86 second=267 amount=-2 +kerning first=86 second=268 amount=-2 +kerning first=86 second=269 amount=-2 +kerning first=86 second=270 amount=-1 +kerning first=86 second=274 amount=-1 +kerning first=86 second=275 amount=-2 +kerning first=86 second=277 amount=-2 +kerning first=86 second=278 amount=-1 +kerning first=86 second=279 amount=-2 +kerning first=86 second=280 amount=-1 +kerning first=86 second=281 amount=-2 +kerning first=86 second=282 amount=-1 +kerning first=86 second=283 amount=-2 +kerning first=86 second=284 amount=-2 +kerning first=86 second=286 amount=-2 +kerning first=86 second=287 amount=-3 +kerning first=86 second=288 amount=-2 +kerning first=86 second=289 amount=-3 +kerning first=86 second=290 amount=-2 +kerning first=86 second=291 amount=-3 +kerning first=86 second=296 amount=-1 +kerning first=86 second=298 amount=-1 +kerning first=86 second=302 amount=-1 +kerning first=86 second=303 amount=-1 +kerning first=86 second=304 amount=-1 +kerning first=86 second=305 amount=-1 +kerning first=86 second=310 amount=-1 +kerning first=86 second=313 amount=-1 +kerning first=86 second=315 amount=-1 +kerning first=86 second=317 amount=-1 +kerning first=86 second=323 amount=-1 +kerning first=86 second=324 amount=-2 +kerning first=86 second=325 amount=-1 +kerning first=86 second=326 amount=-2 +kerning first=86 second=327 amount=-1 +kerning first=86 second=328 amount=-2 +kerning first=86 second=330 amount=-1 +kerning first=86 second=331 amount=-2 +kerning first=86 second=332 amount=-2 +kerning first=86 second=333 amount=-2 +kerning first=86 second=334 amount=-2 +kerning first=86 second=335 amount=-2 +kerning first=86 second=336 amount=-2 +kerning first=86 second=337 amount=-2 +kerning first=86 second=338 amount=-2 +kerning first=86 second=339 amount=-2 +kerning first=86 second=344 amount=-1 +kerning first=86 second=345 amount=-1 +kerning first=86 second=346 amount=-2 +kerning first=86 second=347 amount=-2 +kerning first=86 second=350 amount=-2 +kerning first=86 second=351 amount=-2 +kerning first=86 second=352 amount=-2 +kerning first=86 second=353 amount=-2 +kerning first=86 second=355 amount=-1 +kerning first=86 second=361 amount=-1 +kerning first=86 second=362 amount=-1 +kerning first=86 second=363 amount=-1 +kerning first=86 second=364 amount=-1 +kerning first=86 second=365 amount=-1 +kerning first=86 second=366 amount=-1 +kerning first=86 second=367 amount=-1 +kerning first=86 second=368 amount=-1 +kerning first=86 second=369 amount=-1 +kerning first=86 second=370 amount=-1 +kerning first=86 second=375 amount=-2 +kerning first=86 second=377 amount=-2 +kerning first=86 second=378 amount=-2 +kerning first=86 second=379 amount=-2 +kerning first=86 second=380 amount=-2 +kerning first=86 second=381 amount=-2 +kerning first=86 second=382 amount=-2 +kerning first=207 second=244 amount=-1 +kerning first=207 second=243 amount=-1 +kerning first=207 second=242 amount=-1 +kerning first=207 second=240 amount=-1 +kerning first=207 second=235 amount=-1 +kerning first=207 second=234 amount=-1 +kerning first=207 second=233 amount=-1 +kerning first=207 second=232 amount=-1 +kerning first=207 second=231 amount=-1 +kerning first=207 second=230 amount=-2 +kerning first=207 second=229 amount=-2 +kerning first=207 second=228 amount=-2 +kerning first=207 second=227 amount=-2 +kerning first=207 second=226 amount=-2 +kerning first=207 second=225 amount=-2 +kerning first=207 second=224 amount=-2 +kerning first=207 second=216 amount=-1 +kerning first=207 second=214 amount=-1 +kerning first=207 second=213 amount=-1 +kerning first=207 second=212 amount=-1 +kerning first=207 second=211 amount=-1 +kerning first=86 second=8249 amount=-4 +kerning first=86 second=8250 amount=-2 +kerning first=207 second=210 amount=-1 +kerning first=207 second=199 amount=-1 +kerning first=207 second=122 amount=-1 +kerning first=207 second=121 amount=-1 +kerning first=207 second=119 amount=-1 +kerning first=87 second=44 amount=-4 +kerning first=87 second=45 amount=-4 +kerning first=87 second=46 amount=-4 +kerning first=87 second=65 amount=-5 +kerning first=87 second=66 amount=-1 +kerning first=87 second=67 amount=-2 +kerning first=87 second=68 amount=-1 +kerning first=87 second=69 amount=-1 +kerning first=87 second=70 amount=-1 +kerning first=87 second=71 amount=-2 +kerning first=87 second=72 amount=-1 +kerning first=87 second=73 amount=-1 +kerning first=87 second=74 amount=-3 +kerning first=87 second=75 amount=-1 +kerning first=87 second=76 amount=-1 +kerning first=87 second=77 amount=-1 +kerning first=87 second=78 amount=-1 +kerning first=87 second=79 amount=-2 +kerning first=87 second=80 amount=-1 +kerning first=87 second=81 amount=-2 +kerning first=87 second=82 amount=-1 +kerning first=87 second=83 amount=-2 +kerning first=87 second=85 amount=-1 +kerning first=87 second=90 amount=-2 +kerning first=87 second=97 amount=-4 +kerning first=87 second=99 amount=-2 +kerning first=87 second=100 amount=-2 +kerning first=87 second=101 amount=-2 +kerning first=87 second=102 amount=-1 +kerning first=87 second=103 amount=-3 +kerning first=87 second=105 amount=-1 +kerning first=87 second=109 amount=-2 +kerning first=87 second=110 amount=-2 +kerning first=87 second=111 amount=-2 +kerning first=87 second=112 amount=-1 +kerning first=87 second=113 amount=-2 +kerning first=87 second=114 amount=-1 +kerning first=87 second=115 amount=-2 +kerning first=87 second=116 amount=-1 +kerning first=87 second=117 amount=-1 +kerning first=87 second=118 amount=-2 +kerning first=87 second=119 amount=-2 +kerning first=87 second=120 amount=-1 +kerning first=87 second=121 amount=-2 +kerning first=87 second=122 amount=-2 +kerning first=87 second=171 amount=-4 +kerning first=87 second=187 amount=-2 +kerning first=87 second=192 amount=-5 +kerning first=87 second=193 amount=-5 +kerning first=87 second=194 amount=-5 +kerning first=87 second=196 amount=-5 +kerning first=87 second=197 amount=-5 +kerning first=87 second=198 amount=-5 +kerning first=87 second=199 amount=-2 +kerning first=87 second=200 amount=-1 +kerning first=87 second=201 amount=-1 +kerning first=87 second=202 amount=-1 +kerning first=87 second=203 amount=-1 +kerning first=87 second=204 amount=-1 +kerning first=87 second=205 amount=-1 +kerning first=87 second=206 amount=-1 +kerning first=87 second=207 amount=-1 +kerning first=87 second=209 amount=-1 +kerning first=87 second=210 amount=-2 +kerning first=87 second=211 amount=-2 +kerning first=87 second=212 amount=-2 +kerning first=87 second=213 amount=-2 +kerning first=87 second=214 amount=-2 +kerning first=87 second=216 amount=-2 +kerning first=87 second=217 amount=-1 +kerning first=87 second=218 amount=-1 +kerning first=87 second=219 amount=-1 +kerning first=87 second=220 amount=-1 +kerning first=87 second=223 amount=-2 +kerning first=87 second=224 amount=-3 +kerning first=87 second=225 amount=-4 +kerning first=87 second=226 amount=-4 +kerning first=87 second=227 amount=-4 +kerning first=87 second=228 amount=-3 +kerning first=87 second=229 amount=-4 +kerning first=87 second=230 amount=-4 +kerning first=87 second=231 amount=-2 +kerning first=87 second=232 amount=-2 +kerning first=87 second=233 amount=-2 +kerning first=87 second=234 amount=-2 +kerning first=87 second=235 amount=-2 +kerning first=87 second=237 amount=-1 +kerning first=87 second=240 amount=-2 +kerning first=87 second=241 amount=-2 +kerning first=87 second=242 amount=-2 +kerning first=87 second=243 amount=-2 +kerning first=87 second=244 amount=-2 +kerning first=87 second=245 amount=-2 +kerning first=87 second=246 amount=-2 +kerning first=87 second=248 amount=-2 +kerning first=87 second=249 amount=-1 +kerning first=87 second=250 amount=-1 +kerning first=87 second=251 amount=-1 +kerning first=87 second=252 amount=-1 +kerning first=87 second=253 amount=-2 +kerning first=87 second=255 amount=-2 +kerning first=87 second=256 amount=-5 +kerning first=87 second=257 amount=-4 +kerning first=87 second=259 amount=-4 +kerning first=87 second=260 amount=-5 +kerning first=87 second=261 amount=-4 +kerning first=87 second=262 amount=-2 +kerning first=87 second=263 amount=-2 +kerning first=87 second=264 amount=-2 +kerning first=87 second=266 amount=-2 +kerning first=87 second=267 amount=-2 +kerning first=87 second=268 amount=-2 +kerning first=87 second=269 amount=-2 +kerning first=87 second=270 amount=-1 +kerning first=87 second=274 amount=-1 +kerning first=87 second=275 amount=-2 +kerning first=87 second=277 amount=-2 +kerning first=87 second=278 amount=-1 +kerning first=87 second=279 amount=-2 +kerning first=87 second=280 amount=-1 +kerning first=87 second=281 amount=-2 +kerning first=87 second=282 amount=-1 +kerning first=87 second=283 amount=-2 +kerning first=87 second=284 amount=-2 +kerning first=87 second=286 amount=-2 +kerning first=87 second=287 amount=-3 +kerning first=87 second=288 amount=-2 +kerning first=87 second=289 amount=-3 +kerning first=87 second=290 amount=-2 +kerning first=87 second=291 amount=-3 +kerning first=87 second=296 amount=-1 +kerning first=87 second=298 amount=-1 +kerning first=87 second=302 amount=-1 +kerning first=87 second=303 amount=-1 +kerning first=87 second=304 amount=-1 +kerning first=87 second=305 amount=-1 +kerning first=87 second=310 amount=-1 +kerning first=87 second=313 amount=-1 +kerning first=87 second=315 amount=-1 +kerning first=87 second=317 amount=-1 +kerning first=87 second=323 amount=-1 +kerning first=87 second=324 amount=-2 +kerning first=87 second=325 amount=-1 +kerning first=87 second=326 amount=-2 +kerning first=87 second=327 amount=-1 +kerning first=87 second=328 amount=-2 +kerning first=87 second=330 amount=-1 +kerning first=87 second=331 amount=-2 +kerning first=87 second=332 amount=-2 +kerning first=87 second=333 amount=-2 +kerning first=87 second=334 amount=-2 +kerning first=87 second=335 amount=-2 +kerning first=87 second=336 amount=-2 +kerning first=87 second=337 amount=-2 +kerning first=87 second=338 amount=-2 +kerning first=87 second=339 amount=-2 +kerning first=87 second=344 amount=-1 +kerning first=87 second=345 amount=-1 +kerning first=87 second=346 amount=-2 +kerning first=87 second=347 amount=-2 +kerning first=87 second=350 amount=-2 +kerning first=87 second=351 amount=-2 +kerning first=87 second=352 amount=-2 +kerning first=87 second=353 amount=-2 +kerning first=87 second=355 amount=-1 +kerning first=87 second=361 amount=-1 +kerning first=87 second=362 amount=-1 +kerning first=87 second=363 amount=-1 +kerning first=87 second=364 amount=-1 +kerning first=87 second=365 amount=-1 +kerning first=87 second=366 amount=-1 +kerning first=87 second=367 amount=-1 +kerning first=87 second=368 amount=-1 +kerning first=87 second=369 amount=-1 +kerning first=87 second=370 amount=-1 +kerning first=87 second=375 amount=-2 +kerning first=87 second=377 amount=-2 +kerning first=87 second=378 amount=-2 +kerning first=87 second=379 amount=-2 +kerning first=87 second=380 amount=-2 +kerning first=87 second=381 amount=-2 +kerning first=87 second=382 amount=-2 +kerning first=207 second=118 amount=-1 +kerning first=207 second=117 amount=-2 +kerning first=207 second=115 amount=-1 +kerning first=207 second=113 amount=-1 +kerning first=207 second=112 amount=-1 +kerning first=207 second=111 amount=-1 +kerning first=207 second=103 amount=-2 +kerning first=207 second=101 amount=-1 +kerning first=207 second=100 amount=-1 +kerning first=207 second=99 amount=-1 +kerning first=207 second=97 amount=-2 +kerning first=207 second=83 amount=-1 +kerning first=207 second=81 amount=-1 +kerning first=207 second=79 amount=-1 +kerning first=207 second=74 amount=-1 +kerning first=207 second=71 amount=-1 +kerning first=207 second=67 amount=-1 +kerning first=206 second=8249 amount=-3 +kerning first=206 second=382 amount=-1 +kerning first=206 second=380 amount=-1 +kerning first=206 second=378 amount=-1 +kerning first=87 second=8249 amount=-4 +kerning first=87 second=8250 amount=-2 +kerning first=206 second=375 amount=-1 +kerning first=206 second=369 amount=-2 +kerning first=206 second=367 amount=-2 +kerning first=206 second=365 amount=-2 +kerning first=206 second=363 amount=-2 +kerning first=88 second=44 amount=-1 +kerning first=88 second=45 amount=-3 +kerning first=88 second=46 amount=-1 +kerning first=88 second=67 amount=-2 +kerning first=88 second=71 amount=-2 +kerning first=88 second=79 amount=-2 +kerning first=88 second=81 amount=-2 +kerning first=88 second=83 amount=-1 +kerning first=88 second=84 amount=-1 +kerning first=88 second=85 amount=-1 +kerning first=88 second=86 amount=-1 +kerning first=88 second=87 amount=-1 +kerning first=88 second=89 amount=-1 +kerning first=88 second=97 amount=-1 +kerning first=88 second=98 amount=-1 +kerning first=88 second=99 amount=-1 +kerning first=88 second=100 amount=-1 +kerning first=88 second=101 amount=-1 +kerning first=88 second=103 amount=-1 +kerning first=88 second=104 amount=-1 +kerning first=88 second=106 amount=-1 +kerning first=88 second=107 amount=-1 +kerning first=88 second=108 amount=-1 +kerning first=88 second=111 amount=-1 +kerning first=88 second=112 amount=-1 +kerning first=88 second=113 amount=-1 +kerning first=206 second=361 amount=-2 +kerning first=88 second=115 amount=-1 +kerning first=88 second=116 amount=-1 +kerning first=88 second=117 amount=-2 +kerning first=88 second=118 amount=-2 +kerning first=88 second=119 amount=-2 +kerning first=88 second=121 amount=-2 +kerning first=88 second=171 amount=-3 +kerning first=88 second=199 amount=-2 +kerning first=88 second=210 amount=-2 +kerning first=88 second=211 amount=-2 +kerning first=88 second=212 amount=-2 +kerning first=88 second=213 amount=-2 +kerning first=88 second=214 amount=-2 +kerning first=88 second=216 amount=-2 +kerning first=88 second=217 amount=-1 +kerning first=88 second=218 amount=-1 +kerning first=88 second=219 amount=-1 +kerning first=88 second=220 amount=-1 +kerning first=88 second=221 amount=-1 +kerning first=88 second=224 amount=-1 +kerning first=88 second=225 amount=-1 +kerning first=88 second=226 amount=-1 +kerning first=88 second=227 amount=-1 +kerning first=88 second=228 amount=-1 +kerning first=88 second=229 amount=-1 +kerning first=88 second=230 amount=-1 +kerning first=88 second=231 amount=-1 +kerning first=88 second=232 amount=-1 +kerning first=88 second=233 amount=-1 +kerning first=88 second=234 amount=-1 +kerning first=88 second=235 amount=-1 +kerning first=88 second=240 amount=-1 +kerning first=88 second=242 amount=-1 +kerning first=88 second=243 amount=-1 +kerning first=88 second=244 amount=-1 +kerning first=88 second=245 amount=-1 +kerning first=88 second=246 amount=-1 +kerning first=88 second=248 amount=-1 +kerning first=88 second=249 amount=-2 +kerning first=88 second=250 amount=-2 +kerning first=88 second=251 amount=-2 +kerning first=88 second=252 amount=-2 +kerning first=88 second=253 amount=-2 +kerning first=88 second=254 amount=-1 +kerning first=88 second=255 amount=-2 +kerning first=88 second=257 amount=-1 +kerning first=88 second=259 amount=-1 +kerning first=88 second=261 amount=-1 +kerning first=88 second=262 amount=-2 +kerning first=88 second=263 amount=-1 +kerning first=88 second=264 amount=-2 +kerning first=88 second=266 amount=-2 +kerning first=88 second=267 amount=-1 +kerning first=88 second=268 amount=-2 +kerning first=88 second=269 amount=-1 +kerning first=88 second=275 amount=-1 +kerning first=88 second=277 amount=-1 +kerning first=88 second=279 amount=-1 +kerning first=88 second=281 amount=-1 +kerning first=88 second=283 amount=-1 +kerning first=88 second=284 amount=-2 +kerning first=88 second=286 amount=-2 +kerning first=88 second=287 amount=-1 +kerning first=88 second=288 amount=-2 +kerning first=88 second=289 amount=-1 +kerning first=88 second=290 amount=-2 +kerning first=88 second=291 amount=-1 +kerning first=88 second=311 amount=-1 +kerning first=88 second=314 amount=-1 +kerning first=88 second=316 amount=-1 +kerning first=88 second=318 amount=-1 +kerning first=88 second=332 amount=-2 +kerning first=88 second=333 amount=-1 +kerning first=88 second=334 amount=-2 +kerning first=88 second=335 amount=-1 +kerning first=88 second=336 amount=-2 +kerning first=88 second=337 amount=-1 +kerning first=88 second=338 amount=-2 +kerning first=88 second=339 amount=-1 +kerning first=206 second=353 amount=-1 +kerning first=88 second=346 amount=-1 +kerning first=88 second=347 amount=-1 +kerning first=88 second=350 amount=-1 +kerning first=88 second=351 amount=-1 +kerning first=88 second=352 amount=-1 +kerning first=88 second=353 amount=-1 +kerning first=88 second=354 amount=-1 +kerning first=88 second=355 amount=-1 +kerning first=88 second=356 amount=-1 +kerning first=88 second=361 amount=-2 +kerning first=88 second=362 amount=-1 +kerning first=88 second=363 amount=-2 +kerning first=88 second=364 amount=-1 +kerning first=88 second=365 amount=-2 +kerning first=88 second=366 amount=-1 +kerning first=88 second=367 amount=-2 +kerning first=88 second=368 amount=-1 +kerning first=88 second=369 amount=-2 +kerning first=88 second=370 amount=-1 +kerning first=88 second=374 amount=-1 +kerning first=88 second=375 amount=-2 +kerning first=206 second=352 amount=-1 +kerning first=206 second=351 amount=-1 +kerning first=206 second=350 amount=-1 +kerning first=206 second=347 amount=-1 +kerning first=206 second=346 amount=-1 +kerning first=206 second=339 amount=-1 +kerning first=206 second=338 amount=-1 +kerning first=206 second=337 amount=-1 +kerning first=206 second=336 amount=-1 +kerning first=206 second=335 amount=-1 +kerning first=206 second=334 amount=-1 +kerning first=206 second=333 amount=-1 +kerning first=206 second=332 amount=-1 +kerning first=206 second=291 amount=-2 +kerning first=88 second=8217 amount=-1 +kerning first=88 second=8220 amount=-1 +kerning first=88 second=8221 amount=-1 +kerning first=88 second=8249 amount=-3 +kerning first=89 second=44 amount=-4 +kerning first=89 second=45 amount=-4 +kerning first=89 second=46 amount=-4 +kerning first=89 second=65 amount=-5 +kerning first=89 second=66 amount=-1 +kerning first=89 second=67 amount=-2 +kerning first=89 second=68 amount=-1 +kerning first=89 second=69 amount=-1 +kerning first=89 second=70 amount=-1 +kerning first=89 second=71 amount=-2 +kerning first=89 second=72 amount=-1 +kerning first=89 second=73 amount=-1 +kerning first=89 second=74 amount=-3 +kerning first=89 second=75 amount=-1 +kerning first=89 second=76 amount=-1 +kerning first=89 second=77 amount=-1 +kerning first=89 second=78 amount=-1 +kerning first=89 second=79 amount=-2 +kerning first=89 second=80 amount=-1 +kerning first=89 second=81 amount=-2 +kerning first=89 second=82 amount=-1 +kerning first=89 second=83 amount=-2 +kerning first=89 second=85 amount=-1 +kerning first=89 second=90 amount=-2 +kerning first=89 second=97 amount=-4 +kerning first=89 second=99 amount=-2 +kerning first=89 second=100 amount=-2 +kerning first=89 second=101 amount=-2 +kerning first=89 second=102 amount=-1 +kerning first=89 second=103 amount=-3 +kerning first=89 second=105 amount=-1 +kerning first=89 second=109 amount=-2 +kerning first=89 second=110 amount=-2 +kerning first=89 second=111 amount=-2 +kerning first=89 second=112 amount=-1 +kerning first=89 second=113 amount=-2 +kerning first=89 second=114 amount=-1 +kerning first=89 second=115 amount=-2 +kerning first=89 second=116 amount=-1 +kerning first=89 second=117 amount=-1 +kerning first=89 second=118 amount=-2 +kerning first=89 second=119 amount=-2 +kerning first=89 second=120 amount=-1 +kerning first=89 second=121 amount=-2 +kerning first=89 second=122 amount=-2 +kerning first=89 second=171 amount=-4 +kerning first=89 second=187 amount=-2 +kerning first=89 second=192 amount=-5 +kerning first=89 second=193 amount=-5 +kerning first=89 second=194 amount=-5 +kerning first=89 second=196 amount=-5 +kerning first=89 second=197 amount=-5 +kerning first=89 second=198 amount=-5 +kerning first=89 second=199 amount=-2 +kerning first=89 second=200 amount=-1 +kerning first=89 second=201 amount=-1 +kerning first=89 second=202 amount=-1 +kerning first=89 second=203 amount=-1 +kerning first=89 second=204 amount=-1 +kerning first=89 second=205 amount=-1 +kerning first=89 second=206 amount=-1 +kerning first=89 second=207 amount=-1 +kerning first=89 second=209 amount=-1 +kerning first=89 second=210 amount=-2 +kerning first=89 second=211 amount=-2 +kerning first=89 second=212 amount=-2 +kerning first=89 second=213 amount=-2 +kerning first=89 second=214 amount=-2 +kerning first=89 second=216 amount=-2 +kerning first=89 second=217 amount=-1 +kerning first=89 second=218 amount=-1 +kerning first=89 second=219 amount=-1 +kerning first=89 second=220 amount=-1 +kerning first=89 second=223 amount=-2 +kerning first=89 second=224 amount=-3 +kerning first=89 second=225 amount=-4 +kerning first=89 second=226 amount=-4 +kerning first=89 second=227 amount=-4 +kerning first=89 second=228 amount=-3 +kerning first=89 second=229 amount=-4 +kerning first=89 second=230 amount=-4 +kerning first=89 second=231 amount=-2 +kerning first=89 second=232 amount=-2 +kerning first=89 second=233 amount=-2 +kerning first=89 second=234 amount=-2 +kerning first=89 second=235 amount=-2 +kerning first=89 second=237 amount=-1 +kerning first=89 second=240 amount=-2 +kerning first=89 second=241 amount=-2 +kerning first=89 second=242 amount=-2 +kerning first=89 second=243 amount=-2 +kerning first=89 second=244 amount=-2 +kerning first=89 second=245 amount=-2 +kerning first=89 second=246 amount=-2 +kerning first=89 second=248 amount=-2 +kerning first=89 second=249 amount=-1 +kerning first=89 second=250 amount=-1 +kerning first=89 second=251 amount=-1 +kerning first=89 second=252 amount=-1 +kerning first=89 second=253 amount=-2 +kerning first=89 second=255 amount=-2 +kerning first=89 second=256 amount=-5 +kerning first=89 second=257 amount=-4 +kerning first=89 second=259 amount=-4 +kerning first=89 second=260 amount=-5 +kerning first=89 second=261 amount=-4 +kerning first=89 second=262 amount=-2 +kerning first=89 second=263 amount=-2 +kerning first=89 second=264 amount=-2 +kerning first=89 second=266 amount=-2 +kerning first=89 second=267 amount=-2 +kerning first=89 second=268 amount=-2 +kerning first=89 second=269 amount=-2 +kerning first=89 second=270 amount=-1 +kerning first=89 second=274 amount=-1 +kerning first=89 second=275 amount=-2 +kerning first=89 second=277 amount=-2 +kerning first=89 second=278 amount=-1 +kerning first=89 second=279 amount=-2 +kerning first=89 second=280 amount=-1 +kerning first=89 second=281 amount=-2 +kerning first=89 second=282 amount=-1 +kerning first=89 second=283 amount=-2 +kerning first=89 second=284 amount=-2 +kerning first=89 second=286 amount=-2 +kerning first=89 second=287 amount=-3 +kerning first=89 second=288 amount=-2 +kerning first=89 second=289 amount=-3 +kerning first=89 second=290 amount=-2 +kerning first=89 second=291 amount=-3 +kerning first=89 second=296 amount=-1 +kerning first=89 second=298 amount=-1 +kerning first=89 second=302 amount=-1 +kerning first=89 second=303 amount=-1 +kerning first=89 second=304 amount=-1 +kerning first=89 second=305 amount=-1 +kerning first=89 second=310 amount=-1 +kerning first=89 second=313 amount=-1 +kerning first=89 second=315 amount=-1 +kerning first=89 second=317 amount=-1 +kerning first=89 second=323 amount=-1 +kerning first=89 second=324 amount=-2 +kerning first=89 second=325 amount=-1 +kerning first=89 second=326 amount=-2 +kerning first=89 second=327 amount=-1 +kerning first=89 second=328 amount=-2 +kerning first=89 second=330 amount=-1 +kerning first=89 second=331 amount=-2 +kerning first=89 second=332 amount=-2 +kerning first=89 second=333 amount=-2 +kerning first=89 second=334 amount=-2 +kerning first=89 second=335 amount=-2 +kerning first=89 second=336 amount=-2 +kerning first=89 second=337 amount=-2 +kerning first=89 second=338 amount=-2 +kerning first=89 second=339 amount=-2 +kerning first=89 second=344 amount=-1 +kerning first=89 second=345 amount=-1 +kerning first=89 second=346 amount=-2 +kerning first=89 second=347 amount=-2 +kerning first=89 second=350 amount=-2 +kerning first=89 second=351 amount=-2 +kerning first=89 second=352 amount=-2 +kerning first=89 second=353 amount=-2 +kerning first=89 second=355 amount=-1 +kerning first=89 second=361 amount=-1 +kerning first=89 second=362 amount=-1 +kerning first=89 second=363 amount=-1 +kerning first=89 second=364 amount=-1 +kerning first=89 second=365 amount=-1 +kerning first=89 second=366 amount=-1 +kerning first=89 second=367 amount=-1 +kerning first=89 second=368 amount=-1 +kerning first=89 second=369 amount=-1 +kerning first=89 second=370 amount=-1 +kerning first=89 second=375 amount=-2 +kerning first=89 second=377 amount=-2 +kerning first=89 second=378 amount=-2 +kerning first=89 second=379 amount=-2 +kerning first=89 second=380 amount=-2 +kerning first=89 second=381 amount=-2 +kerning first=89 second=382 amount=-2 +kerning first=206 second=290 amount=-1 +kerning first=206 second=289 amount=-2 +kerning first=206 second=288 amount=-1 +kerning first=206 second=287 amount=-2 +kerning first=206 second=286 amount=-1 +kerning first=206 second=284 amount=-1 +kerning first=206 second=283 amount=-1 +kerning first=206 second=281 amount=-1 +kerning first=206 second=279 amount=-1 +kerning first=206 second=277 amount=-1 +kerning first=206 second=275 amount=-1 +kerning first=206 second=269 amount=-1 +kerning first=206 second=268 amount=-1 +kerning first=206 second=267 amount=-1 +kerning first=206 second=266 amount=-1 +kerning first=206 second=264 amount=-1 +kerning first=206 second=263 amount=-1 +kerning first=206 second=262 amount=-1 +kerning first=206 second=261 amount=-2 +kerning first=206 second=259 amount=-2 +kerning first=206 second=257 amount=-2 +kerning first=89 second=8249 amount=-4 +kerning first=89 second=8250 amount=-2 +kerning first=206 second=255 amount=-1 +kerning first=206 second=253 amount=-1 +kerning first=206 second=252 amount=-1 +kerning first=206 second=251 amount=-2 +kerning first=206 second=250 amount=-2 +kerning first=206 second=249 amount=-1 +kerning first=90 second=45 amount=-2 +kerning first=206 second=248 amount=-1 +kerning first=90 second=65 amount=-1 +kerning first=90 second=66 amount=-1 +kerning first=90 second=67 amount=-1 +kerning first=90 second=68 amount=-1 +kerning first=90 second=69 amount=-1 +kerning first=90 second=70 amount=-1 +kerning first=90 second=71 amount=-1 +kerning first=90 second=72 amount=-1 +kerning first=90 second=73 amount=-1 +kerning first=90 second=75 amount=-1 +kerning first=90 second=76 amount=-1 +kerning first=90 second=77 amount=-1 +kerning first=90 second=78 amount=-1 +kerning first=90 second=79 amount=-1 +kerning first=90 second=80 amount=-1 +kerning first=90 second=81 amount=-1 +kerning first=90 second=82 amount=-1 +kerning first=90 second=83 amount=-1 +kerning first=90 second=84 amount=-1 +kerning first=90 second=86 amount=-1 +kerning first=90 second=87 amount=-1 +kerning first=90 second=89 amount=-1 +kerning first=90 second=90 amount=-1 +kerning first=90 second=97 amount=-1 +kerning first=90 second=99 amount=-1 +kerning first=90 second=100 amount=-1 +kerning first=90 second=101 amount=-1 +kerning first=90 second=102 amount=-2 +kerning first=90 second=103 amount=-2 +kerning first=90 second=105 amount=-1 +kerning first=90 second=109 amount=-1 +kerning first=90 second=110 amount=-1 +kerning first=90 second=111 amount=-1 +kerning first=90 second=112 amount=-1 +kerning first=90 second=113 amount=-1 +kerning first=90 second=115 amount=-1 +kerning first=90 second=116 amount=-1 +kerning first=90 second=117 amount=-2 +kerning first=90 second=118 amount=-1 +kerning first=90 second=119 amount=-1 +kerning first=90 second=121 amount=-2 +kerning first=90 second=122 amount=-2 +kerning first=90 second=171 amount=-2 +kerning first=90 second=187 amount=-1 +kerning first=90 second=192 amount=-1 +kerning first=90 second=193 amount=-1 +kerning first=90 second=194 amount=-1 +kerning first=90 second=196 amount=-1 +kerning first=90 second=197 amount=-1 +kerning first=90 second=198 amount=-1 +kerning first=90 second=199 amount=-1 +kerning first=90 second=200 amount=-1 +kerning first=90 second=201 amount=-1 +kerning first=90 second=202 amount=-1 +kerning first=90 second=203 amount=-1 +kerning first=90 second=204 amount=-1 +kerning first=90 second=205 amount=-1 +kerning first=90 second=206 amount=-1 +kerning first=90 second=207 amount=-1 +kerning first=90 second=209 amount=-1 +kerning first=90 second=210 amount=-1 +kerning first=90 second=211 amount=-1 +kerning first=90 second=212 amount=-1 +kerning first=90 second=213 amount=-1 +kerning first=90 second=214 amount=-1 +kerning first=90 second=216 amount=-1 +kerning first=90 second=221 amount=-1 +kerning first=90 second=223 amount=-1 +kerning first=90 second=224 amount=-1 +kerning first=90 second=225 amount=-1 +kerning first=90 second=226 amount=-1 +kerning first=90 second=227 amount=-1 +kerning first=90 second=228 amount=-1 +kerning first=90 second=229 amount=-1 +kerning first=90 second=230 amount=-1 +kerning first=90 second=231 amount=-1 +kerning first=90 second=232 amount=-1 +kerning first=90 second=233 amount=-1 +kerning first=90 second=234 amount=-1 +kerning first=90 second=235 amount=-1 +kerning first=90 second=237 amount=-1 +kerning first=90 second=240 amount=-1 +kerning first=90 second=241 amount=-1 +kerning first=90 second=242 amount=-1 +kerning first=90 second=243 amount=-1 +kerning first=90 second=244 amount=-1 +kerning first=90 second=245 amount=-1 +kerning first=90 second=246 amount=-1 +kerning first=90 second=248 amount=-1 +kerning first=90 second=249 amount=-2 +kerning first=90 second=250 amount=-2 +kerning first=90 second=251 amount=-2 +kerning first=90 second=252 amount=-2 +kerning first=90 second=253 amount=-2 +kerning first=90 second=255 amount=-2 +kerning first=90 second=256 amount=-1 +kerning first=90 second=257 amount=-1 +kerning first=90 second=259 amount=-1 +kerning first=90 second=260 amount=-1 +kerning first=90 second=261 amount=-1 +kerning first=90 second=262 amount=-1 +kerning first=90 second=263 amount=-1 +kerning first=90 second=264 amount=-1 +kerning first=90 second=266 amount=-1 +kerning first=90 second=267 amount=-1 +kerning first=90 second=268 amount=-1 +kerning first=90 second=269 amount=-1 +kerning first=90 second=270 amount=-1 +kerning first=90 second=274 amount=-1 +kerning first=90 second=275 amount=-1 +kerning first=90 second=277 amount=-1 +kerning first=90 second=278 amount=-1 +kerning first=90 second=279 amount=-1 +kerning first=90 second=280 amount=-1 +kerning first=90 second=281 amount=-1 +kerning first=90 second=282 amount=-1 +kerning first=90 second=283 amount=-1 +kerning first=90 second=284 amount=-1 +kerning first=90 second=286 amount=-1 +kerning first=90 second=287 amount=-2 +kerning first=90 second=288 amount=-1 +kerning first=90 second=289 amount=-2 +kerning first=90 second=290 amount=-1 +kerning first=90 second=291 amount=-2 +kerning first=90 second=296 amount=-1 +kerning first=90 second=298 amount=-1 +kerning first=90 second=302 amount=-1 +kerning first=90 second=303 amount=-1 +kerning first=90 second=304 amount=-1 +kerning first=90 second=305 amount=-1 +kerning first=90 second=310 amount=-1 +kerning first=90 second=313 amount=-1 +kerning first=90 second=315 amount=-1 +kerning first=90 second=317 amount=-1 +kerning first=90 second=323 amount=-1 +kerning first=90 second=324 amount=-1 +kerning first=90 second=325 amount=-1 +kerning first=90 second=326 amount=-1 +kerning first=90 second=327 amount=-1 +kerning first=90 second=328 amount=-1 +kerning first=90 second=330 amount=-1 +kerning first=90 second=331 amount=-1 +kerning first=90 second=332 amount=-1 +kerning first=90 second=333 amount=-1 +kerning first=90 second=334 amount=-1 +kerning first=90 second=335 amount=-1 +kerning first=90 second=336 amount=-1 +kerning first=90 second=337 amount=-1 +kerning first=90 second=338 amount=-1 +kerning first=90 second=339 amount=-1 +kerning first=90 second=344 amount=-1 +kerning first=90 second=346 amount=-1 +kerning first=90 second=347 amount=-1 +kerning first=90 second=350 amount=-1 +kerning first=90 second=351 amount=-1 +kerning first=90 second=352 amount=-1 +kerning first=90 second=353 amount=-1 +kerning first=90 second=354 amount=-1 +kerning first=90 second=355 amount=-1 +kerning first=90 second=356 amount=-1 +kerning first=90 second=361 amount=-2 +kerning first=90 second=363 amount=-2 +kerning first=90 second=365 amount=-2 +kerning first=90 second=367 amount=-2 +kerning first=90 second=369 amount=-2 +kerning first=90 second=374 amount=-1 +kerning first=90 second=375 amount=-2 +kerning first=90 second=377 amount=-1 +kerning first=90 second=378 amount=-2 +kerning first=90 second=379 amount=-1 +kerning first=90 second=380 amount=-2 +kerning first=90 second=381 amount=-1 +kerning first=90 second=382 amount=-2 +kerning first=206 second=246 amount=-1 +kerning first=206 second=245 amount=-1 +kerning first=206 second=244 amount=-1 +kerning first=206 second=243 amount=-1 +kerning first=206 second=242 amount=-1 +kerning first=206 second=240 amount=-1 +kerning first=206 second=235 amount=-1 +kerning first=206 second=234 amount=-1 +kerning first=206 second=233 amount=-1 +kerning first=206 second=232 amount=-1 +kerning first=206 second=231 amount=-1 +kerning first=206 second=230 amount=-2 +kerning first=206 second=229 amount=-2 +kerning first=206 second=228 amount=-2 +kerning first=206 second=227 amount=-2 +kerning first=206 second=226 amount=-2 +kerning first=206 second=225 amount=-2 +kerning first=206 second=224 amount=-2 +kerning first=206 second=216 amount=-1 +kerning first=206 second=214 amount=-1 +kerning first=206 second=213 amount=-1 +kerning first=206 second=212 amount=-1 +kerning first=206 second=211 amount=-1 +kerning first=90 second=8249 amount=-2 +kerning first=90 second=8250 amount=-1 +kerning first=206 second=210 amount=-1 +kerning first=206 second=199 amount=-1 +kerning first=206 second=171 amount=-3 +kerning first=206 second=122 amount=-1 +kerning first=206 second=121 amount=-1 +kerning first=97 second=44 amount=-1 +kerning first=97 second=45 amount=-1 +kerning first=97 second=46 amount=-1 +kerning first=97 second=97 amount=-1 +kerning first=97 second=98 amount=-1 +kerning first=206 second=119 amount=-1 +kerning first=206 second=118 amount=-1 +kerning first=206 second=117 amount=-2 +kerning first=206 second=115 amount=-1 +kerning first=97 second=103 amount=-1 +kerning first=206 second=113 amount=-1 +kerning first=206 second=112 amount=-1 +kerning first=97 second=106 amount=-1 +kerning first=206 second=111 amount=-1 +kerning first=97 second=108 amount=-1 +kerning first=206 second=103 amount=-2 +kerning first=206 second=101 amount=-1 +kerning first=206 second=100 amount=-1 +kerning first=206 second=99 amount=-1 +kerning first=97 second=115 amount=-1 +kerning first=206 second=97 amount=-2 +kerning first=97 second=117 amount=-1 +kerning first=97 second=118 amount=-2 +kerning first=97 second=119 amount=-2 +kerning first=97 second=120 amount=-1 +kerning first=97 second=121 amount=-2 +kerning first=206 second=83 amount=-1 +kerning first=97 second=171 amount=-1 +kerning first=97 second=224 amount=-1 +kerning first=97 second=225 amount=-1 +kerning first=97 second=226 amount=-1 +kerning first=97 second=227 amount=-1 +kerning first=97 second=228 amount=-1 +kerning first=97 second=229 amount=-1 +kerning first=97 second=230 amount=-1 +kerning first=206 second=81 amount=-1 +kerning first=206 second=79 amount=-1 +kerning first=206 second=74 amount=-1 +kerning first=206 second=71 amount=-1 +kerning first=206 second=67 amount=-1 +kerning first=206 second=46 amount=-1 +kerning first=206 second=45 amount=-3 +kerning first=206 second=44 amount=-1 +kerning first=205 second=382 amount=-1 +kerning first=205 second=380 amount=-1 +kerning first=205 second=378 amount=-1 +kerning first=205 second=375 amount=-1 +kerning first=205 second=369 amount=-2 +kerning first=205 second=367 amount=-2 +kerning first=97 second=249 amount=-1 +kerning first=97 second=250 amount=-1 +kerning first=97 second=251 amount=-1 +kerning first=97 second=252 amount=-1 +kerning first=97 second=253 amount=-2 +kerning first=97 second=254 amount=-1 +kerning first=97 second=255 amount=-2 +kerning first=97 second=257 amount=-1 +kerning first=97 second=259 amount=-1 +kerning first=97 second=261 amount=-1 +kerning first=205 second=365 amount=-2 +kerning first=205 second=363 amount=-2 +kerning first=205 second=361 amount=-2 +kerning first=205 second=353 amount=-1 +kerning first=205 second=352 amount=-1 +kerning first=205 second=351 amount=-1 +kerning first=205 second=350 amount=-1 +kerning first=205 second=347 amount=-1 +kerning first=205 second=346 amount=-1 +kerning first=205 second=339 amount=-1 +kerning first=97 second=287 amount=-1 +kerning first=97 second=289 amount=-1 +kerning first=97 second=291 amount=-1 +kerning first=205 second=338 amount=-1 +kerning first=205 second=337 amount=-1 +kerning first=205 second=336 amount=-1 +kerning first=205 second=335 amount=-1 +kerning first=97 second=314 amount=-1 +kerning first=97 second=316 amount=-1 +kerning first=97 second=318 amount=-1 +kerning first=205 second=334 amount=-1 +kerning first=205 second=333 amount=-1 +kerning first=205 second=332 amount=-1 +kerning first=205 second=291 amount=-2 +kerning first=205 second=290 amount=-1 +kerning first=205 second=289 amount=-2 +kerning first=205 second=288 amount=-1 +kerning first=205 second=287 amount=-2 +kerning first=97 second=347 amount=-1 +kerning first=97 second=351 amount=-1 +kerning first=97 second=353 amount=-1 +kerning first=205 second=286 amount=-1 +kerning first=97 second=361 amount=-1 +kerning first=97 second=363 amount=-1 +kerning first=97 second=365 amount=-1 +kerning first=97 second=367 amount=-1 +kerning first=97 second=369 amount=-1 +kerning first=97 second=371 amount=-1 +kerning first=97 second=375 amount=-2 +kerning first=205 second=284 amount=-1 +kerning first=205 second=283 amount=-1 +kerning first=205 second=281 amount=-1 +kerning first=205 second=279 amount=-1 +kerning first=205 second=277 amount=-1 +kerning first=205 second=275 amount=-1 +kerning first=205 second=269 amount=-1 +kerning first=205 second=268 amount=-1 +kerning first=205 second=267 amount=-1 +kerning first=205 second=266 amount=-1 +kerning first=205 second=264 amount=-1 +kerning first=205 second=263 amount=-1 +kerning first=205 second=262 amount=-1 +kerning first=205 second=261 amount=-2 +kerning first=205 second=259 amount=-2 +kerning first=97 second=8217 amount=-2 +kerning first=97 second=8220 amount=-2 +kerning first=97 second=8221 amount=-2 +kerning first=97 second=8249 amount=-1 +kerning first=205 second=257 amount=-2 +kerning first=205 second=255 amount=-1 +kerning first=205 second=253 amount=-1 +kerning first=205 second=252 amount=-1 +kerning first=205 second=251 amount=-2 +kerning first=98 second=44 amount=-2 +kerning first=98 second=46 amount=-2 +kerning first=98 second=97 amount=-1 +kerning first=205 second=250 amount=-2 +kerning first=98 second=102 amount=-1 +kerning first=98 second=103 amount=-1 +kerning first=98 second=104 amount=-1 +kerning first=98 second=105 amount=-1 +kerning first=98 second=106 amount=-1 +kerning first=98 second=107 amount=-1 +kerning first=98 second=108 amount=-2 +kerning first=98 second=109 amount=-1 +kerning first=98 second=110 amount=-1 +kerning first=98 second=112 amount=-1 +kerning first=205 second=249 amount=-1 +kerning first=98 second=115 amount=-1 +kerning first=205 second=248 amount=-1 +kerning first=205 second=246 amount=-1 +kerning first=98 second=118 amount=-1 +kerning first=98 second=119 amount=-1 +kerning first=98 second=120 amount=-2 +kerning first=98 second=121 amount=-2 +kerning first=98 second=122 amount=-1 +kerning first=98 second=187 amount=-1 +kerning first=205 second=245 amount=-1 +kerning first=98 second=224 amount=-1 +kerning first=98 second=225 amount=-1 +kerning first=98 second=226 amount=-1 +kerning first=98 second=227 amount=-1 +kerning first=98 second=228 amount=-1 +kerning first=98 second=229 amount=-1 +kerning first=98 second=230 amount=-1 +kerning first=98 second=237 amount=-1 +kerning first=98 second=241 amount=-1 +kerning first=205 second=244 amount=-1 +kerning first=205 second=243 amount=-1 +kerning first=205 second=242 amount=-1 +kerning first=205 second=240 amount=-1 +kerning first=98 second=253 amount=-2 +kerning first=205 second=235 amount=-1 +kerning first=98 second=255 amount=-2 +kerning first=98 second=257 amount=-1 +kerning first=98 second=259 amount=-1 +kerning first=98 second=261 amount=-1 +kerning first=98 second=287 amount=-1 +kerning first=98 second=289 amount=-1 +kerning first=98 second=291 amount=-1 +kerning first=98 second=303 amount=-1 +kerning first=98 second=305 amount=-1 +kerning first=98 second=307 amount=-1 +kerning first=98 second=311 amount=-1 +kerning first=98 second=314 amount=-2 +kerning first=98 second=316 amount=-2 +kerning first=98 second=318 amount=-2 +kerning first=98 second=324 amount=-1 +kerning first=98 second=326 amount=-1 +kerning first=98 second=328 amount=-1 +kerning first=98 second=331 amount=-1 +kerning first=205 second=234 amount=-1 +kerning first=98 second=347 amount=-1 +kerning first=98 second=351 amount=-1 +kerning first=98 second=353 amount=-1 +kerning first=205 second=233 amount=-1 +kerning first=205 second=232 amount=-1 +kerning first=205 second=231 amount=-1 +kerning first=205 second=230 amount=-2 +kerning first=205 second=229 amount=-2 +kerning first=205 second=228 amount=-2 +kerning first=205 second=227 amount=-2 +kerning first=98 second=375 amount=-2 +kerning first=98 second=378 amount=-1 +kerning first=98 second=380 amount=-1 +kerning first=98 second=382 amount=-1 +kerning first=205 second=226 amount=-2 +kerning first=205 second=225 amount=-2 +kerning first=205 second=224 amount=-2 +kerning first=205 second=216 amount=-1 +kerning first=205 second=214 amount=-1 +kerning first=205 second=213 amount=-1 +kerning first=205 second=212 amount=-1 +kerning first=205 second=211 amount=-1 +kerning first=205 second=210 amount=-1 +kerning first=205 second=199 amount=-1 +kerning first=205 second=122 amount=-1 +kerning first=98 second=8217 amount=-1 +kerning first=98 second=8220 amount=-1 +kerning first=98 second=8221 amount=-1 +kerning first=98 second=8250 amount=-1 +kerning first=205 second=121 amount=-1 +kerning first=205 second=119 amount=-1 +kerning first=205 second=118 amount=-1 +kerning first=205 second=117 amount=-2 +kerning first=205 second=115 amount=-1 +kerning first=99 second=44 amount=-2 +kerning first=99 second=45 amount=-1 +kerning first=99 second=46 amount=-2 +kerning first=99 second=97 amount=-2 +kerning first=99 second=98 amount=-1 +kerning first=99 second=99 amount=-1 +kerning first=99 second=100 amount=-1 +kerning first=99 second=101 amount=-1 +kerning first=99 second=102 amount=-1 +kerning first=99 second=103 amount=-2 +kerning first=99 second=104 amount=-1 +kerning first=99 second=105 amount=-2 +kerning first=99 second=106 amount=-1 +kerning first=99 second=107 amount=-1 +kerning first=99 second=108 amount=-2 +kerning first=99 second=109 amount=-1 +kerning first=99 second=110 amount=-1 +kerning first=99 second=111 amount=-1 +kerning first=99 second=112 amount=-1 +kerning first=99 second=113 amount=-1 +kerning first=99 second=114 amount=-1 +kerning first=99 second=115 amount=-1 +kerning first=99 second=116 amount=-1 +kerning first=99 second=117 amount=-1 +kerning first=99 second=118 amount=-2 +kerning first=99 second=119 amount=-2 +kerning first=99 second=120 amount=-1 +kerning first=99 second=121 amount=-2 +kerning first=99 second=122 amount=-1 +kerning first=99 second=171 amount=-1 +kerning first=99 second=223 amount=-1 +kerning first=99 second=224 amount=-2 +kerning first=99 second=225 amount=-2 +kerning first=99 second=226 amount=-2 +kerning first=99 second=227 amount=-2 +kerning first=99 second=228 amount=-2 +kerning first=99 second=229 amount=-2 +kerning first=99 second=230 amount=-2 +kerning first=99 second=231 amount=-1 +kerning first=99 second=232 amount=-1 +kerning first=99 second=233 amount=-1 +kerning first=99 second=234 amount=-1 +kerning first=99 second=235 amount=-1 +kerning first=99 second=237 amount=-2 +kerning first=99 second=240 amount=-1 +kerning first=99 second=241 amount=-1 +kerning first=99 second=242 amount=-1 +kerning first=99 second=243 amount=-1 +kerning first=99 second=244 amount=-1 +kerning first=99 second=245 amount=-1 +kerning first=99 second=246 amount=-1 +kerning first=99 second=248 amount=-1 +kerning first=99 second=249 amount=-1 +kerning first=99 second=250 amount=-1 +kerning first=99 second=251 amount=-1 +kerning first=99 second=252 amount=-1 +kerning first=99 second=253 amount=-2 +kerning first=99 second=254 amount=-1 +kerning first=99 second=255 amount=-2 +kerning first=99 second=257 amount=-2 +kerning first=99 second=259 amount=-2 +kerning first=99 second=261 amount=-2 +kerning first=99 second=263 amount=-1 +kerning first=99 second=267 amount=-1 +kerning first=99 second=269 amount=-1 +kerning first=99 second=271 amount=-1 +kerning first=99 second=273 amount=-1 +kerning first=99 second=275 amount=-1 +kerning first=99 second=277 amount=-1 +kerning first=99 second=279 amount=-1 +kerning first=99 second=281 amount=-1 +kerning first=99 second=283 amount=-1 +kerning first=99 second=287 amount=-2 +kerning first=99 second=289 amount=-2 +kerning first=99 second=291 amount=-2 +kerning first=99 second=303 amount=-2 +kerning first=99 second=305 amount=-1 +kerning first=99 second=307 amount=-2 +kerning first=99 second=311 amount=-1 +kerning first=99 second=314 amount=-2 +kerning first=99 second=316 amount=-2 +kerning first=99 second=318 amount=-2 +kerning first=99 second=324 amount=-1 +kerning first=99 second=326 amount=-1 +kerning first=99 second=328 amount=-1 +kerning first=99 second=331 amount=-1 +kerning first=99 second=333 amount=-1 +kerning first=99 second=335 amount=-1 +kerning first=99 second=337 amount=-1 +kerning first=99 second=339 amount=-1 +kerning first=99 second=345 amount=-1 +kerning first=99 second=347 amount=-1 +kerning first=99 second=351 amount=-1 +kerning first=99 second=353 amount=-1 +kerning first=99 second=355 amount=-1 +kerning first=99 second=361 amount=-1 +kerning first=99 second=363 amount=-1 +kerning first=99 second=365 amount=-1 +kerning first=99 second=367 amount=-1 +kerning first=99 second=369 amount=-1 +kerning first=99 second=371 amount=-1 +kerning first=99 second=375 amount=-2 +kerning first=99 second=378 amount=-1 +kerning first=99 second=380 amount=-1 +kerning first=99 second=382 amount=-1 +kerning first=205 second=113 amount=-1 +kerning first=205 second=112 amount=-1 +kerning first=205 second=111 amount=-1 +kerning first=205 second=103 amount=-2 +kerning first=205 second=101 amount=-1 +kerning first=205 second=100 amount=-1 +kerning first=205 second=99 amount=-1 +kerning first=205 second=97 amount=-2 +kerning first=205 second=83 amount=-1 +kerning first=205 second=81 amount=-1 +kerning first=205 second=79 amount=-1 +kerning first=205 second=74 amount=-1 +kerning first=205 second=71 amount=-1 +kerning first=99 second=8217 amount=-1 +kerning first=99 second=8220 amount=-1 +kerning first=99 second=8221 amount=-1 +kerning first=99 second=8249 amount=-1 +kerning first=205 second=67 amount=-1 +kerning first=204 second=382 amount=-1 +kerning first=204 second=380 amount=-1 +kerning first=204 second=378 amount=-1 +kerning first=204 second=375 amount=-1 +kerning first=100 second=45 amount=-1 +kerning first=100 second=97 amount=-1 +kerning first=100 second=98 amount=-1 +kerning first=204 second=369 amount=-2 +kerning first=204 second=367 amount=-2 +kerning first=204 second=365 amount=-2 +kerning first=204 second=363 amount=-2 +kerning first=100 second=103 amount=-1 +kerning first=100 second=104 amount=-1 +kerning first=204 second=361 amount=-2 +kerning first=204 second=353 amount=-1 +kerning first=100 second=107 amount=-1 +kerning first=100 second=108 amount=-1 +kerning first=204 second=352 amount=-1 +kerning first=204 second=351 amount=-1 +kerning first=204 second=350 amount=-1 +kerning first=100 second=112 amount=-1 +kerning first=204 second=347 amount=-1 +kerning first=100 second=115 amount=-1 +kerning first=204 second=346 amount=-1 +kerning first=100 second=117 amount=-1 +kerning first=100 second=118 amount=-1 +kerning first=100 second=119 amount=-1 +kerning first=100 second=120 amount=-1 +kerning first=100 second=121 amount=-1 +kerning first=100 second=122 amount=-1 +kerning first=100 second=171 amount=-1 +kerning first=100 second=224 amount=-1 +kerning first=100 second=225 amount=-1 +kerning first=100 second=226 amount=-1 +kerning first=100 second=227 amount=-1 +kerning first=100 second=228 amount=-1 +kerning first=100 second=229 amount=-1 +kerning first=100 second=230 amount=-1 +kerning first=204 second=339 amount=-1 +kerning first=204 second=338 amount=-1 +kerning first=204 second=337 amount=-1 +kerning first=204 second=336 amount=-1 +kerning first=204 second=335 amount=-1 +kerning first=204 second=334 amount=-1 +kerning first=204 second=333 amount=-1 +kerning first=204 second=332 amount=-1 +kerning first=204 second=291 amount=-2 +kerning first=204 second=290 amount=-1 +kerning first=204 second=289 amount=-2 +kerning first=204 second=288 amount=-1 +kerning first=204 second=287 amount=-2 +kerning first=204 second=286 amount=-1 +kerning first=100 second=249 amount=-1 +kerning first=100 second=250 amount=-1 +kerning first=100 second=251 amount=-1 +kerning first=100 second=252 amount=-1 +kerning first=100 second=253 amount=-1 +kerning first=100 second=254 amount=-1 +kerning first=100 second=255 amount=-1 +kerning first=100 second=257 amount=-1 +kerning first=100 second=259 amount=-1 +kerning first=100 second=261 amount=-1 +kerning first=204 second=284 amount=-1 +kerning first=204 second=283 amount=-1 +kerning first=204 second=281 amount=-1 +kerning first=204 second=279 amount=-1 +kerning first=204 second=277 amount=-1 +kerning first=204 second=275 amount=-1 +kerning first=204 second=269 amount=-1 +kerning first=204 second=268 amount=-1 +kerning first=204 second=267 amount=-1 +kerning first=204 second=266 amount=-1 +kerning first=100 second=287 amount=-1 +kerning first=100 second=289 amount=-1 +kerning first=100 second=291 amount=-1 +kerning first=204 second=264 amount=-1 +kerning first=204 second=263 amount=-1 +kerning first=204 second=262 amount=-1 +kerning first=100 second=311 amount=-1 +kerning first=100 second=314 amount=-1 +kerning first=100 second=316 amount=-1 +kerning first=100 second=318 amount=-1 +kerning first=204 second=261 amount=-2 +kerning first=204 second=259 amount=-2 +kerning first=204 second=257 amount=-2 +kerning first=204 second=255 amount=-1 +kerning first=204 second=253 amount=-1 +kerning first=204 second=252 amount=-1 +kerning first=204 second=251 amount=-2 +kerning first=204 second=250 amount=-2 +kerning first=100 second=347 amount=-1 +kerning first=100 second=351 amount=-1 +kerning first=100 second=353 amount=-1 +kerning first=204 second=249 amount=-1 +kerning first=100 second=361 amount=-1 +kerning first=100 second=363 amount=-1 +kerning first=100 second=365 amount=-1 +kerning first=100 second=367 amount=-1 +kerning first=100 second=369 amount=-1 +kerning first=100 second=371 amount=-1 +kerning first=100 second=375 amount=-1 +kerning first=100 second=378 amount=-1 +kerning first=100 second=380 amount=-1 +kerning first=100 second=382 amount=-1 +kerning first=204 second=248 amount=-1 +kerning first=204 second=246 amount=-1 +kerning first=204 second=245 amount=-1 +kerning first=204 second=244 amount=-1 +kerning first=204 second=243 amount=-1 +kerning first=204 second=242 amount=-1 +kerning first=204 second=240 amount=-1 +kerning first=204 second=235 amount=-1 +kerning first=204 second=234 amount=-1 +kerning first=204 second=233 amount=-1 +kerning first=204 second=232 amount=-1 +kerning first=204 second=231 amount=-1 +kerning first=204 second=230 amount=-2 +kerning first=100 second=8217 amount=-1 +kerning first=100 second=8220 amount=-1 +kerning first=100 second=8221 amount=-1 +kerning first=100 second=8249 amount=-1 +kerning first=204 second=229 amount=-2 +kerning first=204 second=228 amount=-2 +kerning first=204 second=227 amount=-2 +kerning first=204 second=226 amount=-2 +kerning first=204 second=225 amount=-2 +kerning first=101 second=44 amount=-2 +kerning first=101 second=46 amount=-2 +kerning first=101 second=97 amount=-1 +kerning first=101 second=98 amount=-1 +kerning first=204 second=224 amount=-2 +kerning first=204 second=216 amount=-1 +kerning first=204 second=214 amount=-1 +kerning first=101 second=102 amount=-1 +kerning first=101 second=103 amount=-2 +kerning first=101 second=104 amount=-2 +kerning first=101 second=105 amount=-1 +kerning first=101 second=106 amount=-1 +kerning first=101 second=107 amount=-2 +kerning first=101 second=108 amount=-2 +kerning first=101 second=109 amount=-1 +kerning first=101 second=110 amount=-1 +kerning first=204 second=213 amount=-1 +kerning first=101 second=112 amount=-1 +kerning first=204 second=212 amount=-1 +kerning first=101 second=114 amount=-1 +kerning first=101 second=115 amount=-1 +kerning first=101 second=116 amount=-1 +kerning first=101 second=117 amount=-1 +kerning first=101 second=118 amount=-2 +kerning first=101 second=119 amount=-2 +kerning first=101 second=120 amount=-1 +kerning first=101 second=121 amount=-2 +kerning first=101 second=122 amount=-1 +kerning first=101 second=187 amount=-1 +kerning first=101 second=223 amount=-1 +kerning first=101 second=224 amount=-1 +kerning first=101 second=225 amount=-1 +kerning first=101 second=226 amount=-1 +kerning first=101 second=227 amount=-1 +kerning first=101 second=228 amount=-1 +kerning first=101 second=229 amount=-1 +kerning first=101 second=230 amount=-1 +kerning first=204 second=211 amount=-1 +kerning first=204 second=210 amount=-1 +kerning first=204 second=199 amount=-1 +kerning first=204 second=122 amount=-1 +kerning first=204 second=121 amount=-1 +kerning first=101 second=237 amount=-1 +kerning first=204 second=119 amount=-1 +kerning first=101 second=241 amount=-1 +kerning first=204 second=118 amount=-1 +kerning first=204 second=117 amount=-2 +kerning first=204 second=115 amount=-1 +kerning first=204 second=113 amount=-1 +kerning first=204 second=112 amount=-1 +kerning first=204 second=111 amount=-1 +kerning first=101 second=249 amount=-1 +kerning first=101 second=250 amount=-1 +kerning first=101 second=251 amount=-1 +kerning first=101 second=252 amount=-1 +kerning first=101 second=253 amount=-2 +kerning first=101 second=254 amount=-1 +kerning first=101 second=255 amount=-2 +kerning first=101 second=257 amount=-1 +kerning first=101 second=259 amount=-1 +kerning first=101 second=261 amount=-1 +kerning first=204 second=103 amount=-2 +kerning first=204 second=101 amount=-1 +kerning first=204 second=100 amount=-1 +kerning first=204 second=99 amount=-1 +kerning first=204 second=97 amount=-2 +kerning first=204 second=83 amount=-1 +kerning first=204 second=81 amount=-1 +kerning first=204 second=79 amount=-1 +kerning first=204 second=74 amount=-1 +kerning first=204 second=71 amount=-1 +kerning first=101 second=287 amount=-2 +kerning first=101 second=289 amount=-2 +kerning first=101 second=291 amount=-2 +kerning first=101 second=303 amount=-1 +kerning first=101 second=305 amount=-1 +kerning first=101 second=307 amount=-1 +kerning first=101 second=311 amount=-2 +kerning first=101 second=314 amount=-2 +kerning first=101 second=316 amount=-2 +kerning first=101 second=318 amount=-2 +kerning first=101 second=324 amount=-1 +kerning first=101 second=326 amount=-1 +kerning first=101 second=328 amount=-1 +kerning first=101 second=331 amount=-1 +kerning first=204 second=67 amount=-1 +kerning first=203 second=8249 amount=-1 +kerning first=203 second=382 amount=-1 +kerning first=203 second=381 amount=-1 +kerning first=101 second=345 amount=-1 +kerning first=101 second=347 amount=-1 +kerning first=101 second=351 amount=-1 +kerning first=101 second=353 amount=-1 +kerning first=101 second=355 amount=-1 +kerning first=101 second=361 amount=-1 +kerning first=101 second=363 amount=-1 +kerning first=101 second=365 amount=-1 +kerning first=101 second=367 amount=-1 +kerning first=101 second=369 amount=-1 +kerning first=101 second=371 amount=-1 +kerning first=101 second=375 amount=-2 +kerning first=101 second=378 amount=-1 +kerning first=101 second=380 amount=-1 +kerning first=101 second=382 amount=-1 +kerning first=203 second=380 amount=-1 +kerning first=203 second=379 amount=-1 +kerning first=203 second=378 amount=-1 +kerning first=203 second=377 amount=-1 +kerning first=203 second=374 amount=-1 +kerning first=203 second=370 amount=-1 +kerning first=203 second=369 amount=-1 +kerning first=203 second=368 amount=-1 +kerning first=203 second=367 amount=-1 +kerning first=203 second=366 amount=-1 +kerning first=203 second=365 amount=-1 +kerning first=203 second=364 amount=-1 +kerning first=203 second=363 amount=-1 +kerning first=101 second=8217 amount=-1 +kerning first=101 second=8220 amount=-1 +kerning first=101 second=8221 amount=-1 +kerning first=101 second=8250 amount=-1 +kerning first=203 second=362 amount=-1 +kerning first=203 second=361 amount=-1 +kerning first=203 second=356 amount=-1 +kerning first=203 second=354 amount=-1 +kerning first=203 second=353 amount=-1 +kerning first=102 second=44 amount=-1 +kerning first=102 second=45 amount=-2 +kerning first=102 second=46 amount=-1 +kerning first=102 second=97 amount=-1 +kerning first=102 second=98 amount=3 +kerning first=102 second=99 amount=-1 +kerning first=102 second=100 amount=-1 +kerning first=102 second=101 amount=-1 +kerning first=102 second=102 amount=-1 +kerning first=102 second=103 amount=-1 +kerning first=102 second=104 amount=2 +kerning first=203 second=352 amount=-1 +kerning first=102 second=107 amount=2 +kerning first=102 second=108 amount=2 +kerning first=203 second=351 amount=-1 +kerning first=203 second=350 amount=-1 +kerning first=102 second=111 amount=-1 +kerning first=102 second=113 amount=-1 +kerning first=203 second=347 amount=-1 +kerning first=102 second=115 amount=-1 +kerning first=203 second=346 amount=-1 +kerning first=203 second=344 amount=-1 +kerning first=102 second=120 amount=-1 +kerning first=203 second=338 amount=-1 +kerning first=102 second=122 amount=-1 +kerning first=102 second=171 amount=-2 +kerning first=203 second=336 amount=-1 +kerning first=102 second=225 amount=-1 +kerning first=102 second=226 amount=-1 +kerning first=102 second=227 amount=-1 +kerning first=102 second=229 amount=-1 +kerning first=102 second=230 amount=-1 +kerning first=102 second=231 amount=-1 +kerning first=102 second=233 amount=-1 +kerning first=102 second=234 amount=-1 +kerning first=102 second=240 amount=-1 +kerning first=203 second=334 amount=-1 +kerning first=102 second=243 amount=-1 +kerning first=102 second=244 amount=-1 +kerning first=102 second=245 amount=-1 +kerning first=102 second=248 amount=-1 +kerning first=203 second=332 amount=-1 +kerning first=203 second=331 amount=-1 +kerning first=203 second=330 amount=-1 +kerning first=102 second=254 amount=3 +kerning first=203 second=328 amount=-1 +kerning first=102 second=257 amount=-1 +kerning first=102 second=259 amount=-1 +kerning first=102 second=261 amount=-1 +kerning first=102 second=263 amount=-1 +kerning first=102 second=267 amount=-1 +kerning first=102 second=269 amount=-1 +kerning first=102 second=271 amount=-1 +kerning first=102 second=273 amount=-1 +kerning first=102 second=275 amount=-1 +kerning first=102 second=277 amount=-1 +kerning first=102 second=279 amount=-1 +kerning first=102 second=281 amount=-1 +kerning first=102 second=283 amount=-1 +kerning first=102 second=287 amount=-1 +kerning first=102 second=289 amount=-1 +kerning first=102 second=291 amount=-1 +kerning first=203 second=327 amount=-1 +kerning first=102 second=311 amount=2 +kerning first=102 second=314 amount=2 +kerning first=102 second=316 amount=2 +kerning first=102 second=318 amount=2 +kerning first=203 second=326 amount=-1 +kerning first=203 second=325 amount=-1 +kerning first=203 second=324 amount=-1 +kerning first=203 second=323 amount=-1 +kerning first=102 second=333 amount=-1 +kerning first=102 second=335 amount=-1 +kerning first=102 second=337 amount=-1 +kerning first=102 second=339 amount=-1 +kerning first=203 second=318 amount=-1 +kerning first=102 second=347 amount=-1 +kerning first=102 second=351 amount=-1 +kerning first=102 second=353 amount=-1 +kerning first=203 second=317 amount=-1 +kerning first=203 second=316 amount=-1 +kerning first=203 second=315 amount=-1 +kerning first=203 second=314 amount=-1 +kerning first=203 second=313 amount=-1 +kerning first=203 second=311 amount=-1 +kerning first=203 second=310 amount=-1 +kerning first=203 second=304 amount=-1 +kerning first=102 second=378 amount=-1 +kerning first=102 second=380 amount=-1 +kerning first=102 second=382 amount=-1 +kerning first=203 second=302 amount=-1 +kerning first=203 second=298 amount=-1 +kerning first=203 second=296 amount=-1 +kerning first=203 second=291 amount=-2 +kerning first=203 second=290 amount=-1 +kerning first=203 second=289 amount=-2 +kerning first=203 second=288 amount=-1 +kerning first=203 second=287 amount=-2 +kerning first=203 second=286 amount=-1 +kerning first=203 second=284 amount=-1 +kerning first=203 second=282 amount=-1 +kerning first=203 second=280 amount=-1 +kerning first=102 second=8217 amount=2 +kerning first=102 second=8220 amount=2 +kerning first=102 second=8221 amount=2 +kerning first=102 second=8249 amount=-2 +kerning first=203 second=278 amount=-1 +kerning first=203 second=274 amount=-1 +kerning first=203 second=270 amount=-1 +kerning first=203 second=268 amount=-1 +kerning first=203 second=266 amount=-1 +kerning first=103 second=44 amount=-2 +kerning first=103 second=45 amount=-2 +kerning first=103 second=46 amount=-2 +kerning first=103 second=97 amount=-2 +kerning first=103 second=98 amount=-1 +kerning first=103 second=99 amount=-1 +kerning first=103 second=100 amount=-1 +kerning first=103 second=101 amount=-1 +kerning first=203 second=264 amount=-1 +kerning first=103 second=103 amount=-1 +kerning first=103 second=104 amount=-1 +kerning first=103 second=105 amount=-1 +kerning first=103 second=107 amount=-1 +kerning first=103 second=108 amount=-2 +kerning first=103 second=109 amount=-1 +kerning first=103 second=110 amount=-1 +kerning first=103 second=111 amount=-1 +kerning first=203 second=262 amount=-1 +kerning first=103 second=113 amount=-1 +kerning first=203 second=261 amount=-1 +kerning first=103 second=115 amount=-2 +kerning first=103 second=116 amount=-1 +kerning first=103 second=117 amount=-1 +kerning first=103 second=118 amount=-1 +kerning first=103 second=119 amount=-1 +kerning first=103 second=120 amount=-1 +kerning first=103 second=121 amount=-1 +kerning first=103 second=122 amount=-2 +kerning first=103 second=171 amount=-2 +kerning first=203 second=260 amount=-1 +kerning first=103 second=224 amount=-2 +kerning first=103 second=225 amount=-2 +kerning first=103 second=226 amount=-2 +kerning first=103 second=227 amount=-2 +kerning first=103 second=228 amount=-2 +kerning first=103 second=229 amount=-2 +kerning first=103 second=230 amount=-2 +kerning first=103 second=231 amount=-1 +kerning first=103 second=232 amount=-1 +kerning first=103 second=233 amount=-1 +kerning first=103 second=234 amount=-1 +kerning first=103 second=235 amount=-1 +kerning first=103 second=237 amount=-1 +kerning first=103 second=240 amount=-1 +kerning first=103 second=241 amount=-1 +kerning first=103 second=242 amount=-1 +kerning first=103 second=243 amount=-1 +kerning first=103 second=244 amount=-1 +kerning first=103 second=245 amount=-1 +kerning first=103 second=246 amount=-1 +kerning first=103 second=248 amount=-1 +kerning first=103 second=249 amount=-1 +kerning first=103 second=250 amount=-1 +kerning first=103 second=251 amount=-1 +kerning first=103 second=252 amount=-1 +kerning first=103 second=253 amount=-1 +kerning first=103 second=254 amount=-1 +kerning first=103 second=255 amount=-1 +kerning first=103 second=257 amount=-2 +kerning first=103 second=259 amount=-2 +kerning first=103 second=261 amount=-2 +kerning first=103 second=263 amount=-1 +kerning first=103 second=267 amount=-1 +kerning first=103 second=269 amount=-1 +kerning first=103 second=271 amount=-1 +kerning first=103 second=273 amount=-1 +kerning first=103 second=275 amount=-1 +kerning first=103 second=277 amount=-1 +kerning first=103 second=279 amount=-1 +kerning first=103 second=281 amount=-1 +kerning first=103 second=283 amount=-1 +kerning first=103 second=287 amount=-1 +kerning first=103 second=289 amount=-1 +kerning first=103 second=291 amount=-1 +kerning first=103 second=303 amount=-1 +kerning first=103 second=305 amount=-1 +kerning first=103 second=307 amount=-1 +kerning first=103 second=311 amount=-1 +kerning first=103 second=314 amount=-2 +kerning first=103 second=316 amount=-2 +kerning first=103 second=318 amount=-2 +kerning first=103 second=324 amount=-1 +kerning first=103 second=326 amount=-1 +kerning first=103 second=328 amount=-1 +kerning first=103 second=331 amount=-1 +kerning first=103 second=333 amount=-1 +kerning first=103 second=335 amount=-1 +kerning first=103 second=337 amount=-1 +kerning first=103 second=339 amount=-1 +kerning first=203 second=259 amount=-1 +kerning first=103 second=347 amount=-2 +kerning first=103 second=351 amount=-2 +kerning first=103 second=353 amount=-2 +kerning first=103 second=355 amount=-1 +kerning first=103 second=361 amount=-1 +kerning first=103 second=363 amount=-1 +kerning first=103 second=365 amount=-1 +kerning first=103 second=367 amount=-1 +kerning first=103 second=369 amount=-1 +kerning first=103 second=371 amount=-1 +kerning first=103 second=375 amount=-1 +kerning first=103 second=378 amount=-2 +kerning first=103 second=380 amount=-2 +kerning first=103 second=382 amount=-2 +kerning first=203 second=257 amount=-1 +kerning first=203 second=256 amount=-1 +kerning first=203 second=254 amount=-1 +kerning first=203 second=252 amount=-1 +kerning first=203 second=251 amount=-1 +kerning first=203 second=250 amount=-1 +kerning first=203 second=249 amount=-1 +kerning first=203 second=241 amount=-1 +kerning first=203 second=230 amount=-1 +kerning first=203 second=229 amount=-1 +kerning first=203 second=228 amount=-1 +kerning first=203 second=227 amount=-1 +kerning first=203 second=226 amount=-1 +kerning first=103 second=8249 amount=-2 +kerning first=203 second=225 amount=-1 +kerning first=203 second=224 amount=-1 +kerning first=203 second=223 amount=-1 +kerning first=203 second=221 amount=-1 +kerning first=203 second=220 amount=-1 +kerning first=104 second=44 amount=-1 +kerning first=104 second=45 amount=-2 +kerning first=104 second=46 amount=-1 +kerning first=104 second=97 amount=-1 +kerning first=104 second=98 amount=-1 +kerning first=203 second=219 amount=-1 +kerning first=203 second=218 amount=-1 +kerning first=203 second=217 amount=-1 +kerning first=203 second=216 amount=-1 +kerning first=104 second=103 amount=-1 +kerning first=203 second=214 amount=-1 +kerning first=104 second=106 amount=-1 +kerning first=104 second=108 amount=-1 +kerning first=203 second=213 amount=-1 +kerning first=203 second=212 amount=-1 +kerning first=203 second=211 amount=-1 +kerning first=104 second=112 amount=-1 +kerning first=203 second=210 amount=-1 +kerning first=104 second=115 amount=-1 +kerning first=104 second=117 amount=-1 +kerning first=104 second=118 amount=-2 +kerning first=104 second=119 amount=-2 +kerning first=203 second=209 amount=-1 +kerning first=104 second=121 amount=-1 +kerning first=203 second=207 amount=-1 +kerning first=104 second=171 amount=-2 +kerning first=104 second=224 amount=-1 +kerning first=104 second=225 amount=-1 +kerning first=104 second=226 amount=-1 +kerning first=104 second=227 amount=-1 +kerning first=104 second=228 amount=-1 +kerning first=104 second=229 amount=-1 +kerning first=104 second=230 amount=-1 +kerning first=203 second=206 amount=-1 +kerning first=203 second=205 amount=-1 +kerning first=203 second=204 amount=-1 +kerning first=203 second=203 amount=-1 +kerning first=203 second=202 amount=-1 +kerning first=203 second=201 amount=-1 +kerning first=203 second=200 amount=-1 +kerning first=203 second=199 amount=-1 +kerning first=203 second=198 amount=-1 +kerning first=203 second=197 amount=-1 +kerning first=203 second=196 amount=-1 +kerning first=203 second=194 amount=-1 +kerning first=203 second=193 amount=-1 +kerning first=203 second=192 amount=-1 +kerning first=104 second=249 amount=-1 +kerning first=104 second=250 amount=-1 +kerning first=104 second=251 amount=-1 +kerning first=104 second=252 amount=-1 +kerning first=104 second=253 amount=-1 +kerning first=104 second=254 amount=-1 +kerning first=104 second=255 amount=-1 +kerning first=104 second=257 amount=-1 +kerning first=104 second=259 amount=-1 +kerning first=104 second=261 amount=-1 +kerning first=203 second=171 amount=-1 +kerning first=203 second=122 amount=-1 +kerning first=203 second=120 amount=-1 +kerning first=203 second=119 amount=-1 +kerning first=203 second=118 amount=-1 +kerning first=203 second=117 amount=-1 +kerning first=203 second=115 amount=-1 +kerning first=203 second=112 amount=-1 +kerning first=203 second=110 amount=-1 +kerning first=203 second=109 amount=-1 +kerning first=104 second=287 amount=-1 +kerning first=104 second=289 amount=-1 +kerning first=104 second=291 amount=-1 +kerning first=203 second=108 amount=-1 +kerning first=203 second=107 amount=-1 +kerning first=203 second=104 amount=-1 +kerning first=104 second=314 amount=-1 +kerning first=104 second=316 amount=-1 +kerning first=104 second=318 amount=-1 +kerning first=203 second=103 amount=-2 +kerning first=203 second=102 amount=-1 +kerning first=203 second=98 amount=-1 +kerning first=203 second=97 amount=-1 +kerning first=203 second=90 amount=-1 +kerning first=203 second=89 amount=-1 +kerning first=203 second=87 amount=-1 +kerning first=203 second=86 amount=-1 +kerning first=104 second=347 amount=-1 +kerning first=104 second=351 amount=-1 +kerning first=104 second=353 amount=-1 +kerning first=104 second=361 amount=-1 +kerning first=104 second=363 amount=-1 +kerning first=104 second=365 amount=-1 +kerning first=104 second=367 amount=-1 +kerning first=104 second=369 amount=-1 +kerning first=104 second=371 amount=-1 +kerning first=104 second=375 amount=-1 +kerning first=203 second=85 amount=-1 +kerning first=203 second=84 amount=-1 +kerning first=203 second=83 amount=-1 +kerning first=203 second=82 amount=-1 +kerning first=203 second=81 amount=-1 +kerning first=203 second=80 amount=-1 +kerning first=203 second=79 amount=-1 +kerning first=203 second=78 amount=-1 +kerning first=203 second=77 amount=-1 +kerning first=203 second=76 amount=-1 +kerning first=203 second=75 amount=-1 +kerning first=203 second=74 amount=-1 +kerning first=203 second=73 amount=-1 +kerning first=104 second=8217 amount=-3 +kerning first=104 second=8220 amount=-3 +kerning first=104 second=8221 amount=-3 +kerning first=104 second=8249 amount=-2 +kerning first=203 second=72 amount=-1 +kerning first=203 second=71 amount=-1 +kerning first=203 second=70 amount=-1 +kerning first=203 second=69 amount=-1 +kerning first=203 second=68 amount=-1 +kerning first=105 second=44 amount=-1 +kerning first=105 second=45 amount=-2 +kerning first=105 second=46 amount=-1 +kerning first=105 second=97 amount=-1 +kerning first=105 second=98 amount=-1 +kerning first=105 second=99 amount=-1 +kerning first=105 second=100 amount=-1 +kerning first=105 second=101 amount=-1 +kerning first=105 second=102 amount=-1 +kerning first=105 second=103 amount=-2 +kerning first=105 second=104 amount=-1 +kerning first=105 second=105 amount=-1 +kerning first=105 second=106 amount=-1 +kerning first=105 second=107 amount=-1 +kerning first=105 second=108 amount=-1 +kerning first=105 second=109 amount=-1 +kerning first=105 second=110 amount=-1 +kerning first=105 second=111 amount=-1 +kerning first=105 second=112 amount=-1 +kerning first=105 second=113 amount=-1 +kerning first=203 second=67 amount=-1 +kerning first=105 second=115 amount=-1 +kerning first=105 second=116 amount=-1 +kerning first=105 second=117 amount=-1 +kerning first=105 second=118 amount=-2 +kerning first=105 second=119 amount=-2 +kerning first=105 second=120 amount=-1 +kerning first=105 second=121 amount=-2 +kerning first=105 second=122 amount=-1 +kerning first=105 second=171 amount=-2 +kerning first=203 second=66 amount=-1 +kerning first=105 second=224 amount=-1 +kerning first=105 second=225 amount=-1 +kerning first=105 second=226 amount=-1 +kerning first=105 second=227 amount=-1 +kerning first=105 second=228 amount=-1 +kerning first=105 second=229 amount=-1 +kerning first=105 second=230 amount=-1 +kerning first=105 second=231 amount=-1 +kerning first=105 second=232 amount=-1 +kerning first=105 second=233 amount=-1 +kerning first=105 second=234 amount=-1 +kerning first=105 second=235 amount=-1 +kerning first=105 second=237 amount=-1 +kerning first=105 second=240 amount=-1 +kerning first=105 second=241 amount=-1 +kerning first=105 second=242 amount=-1 +kerning first=105 second=243 amount=-1 +kerning first=105 second=244 amount=-1 +kerning first=105 second=245 amount=-1 +kerning first=105 second=246 amount=-1 +kerning first=105 second=248 amount=-1 +kerning first=105 second=249 amount=-1 +kerning first=105 second=250 amount=-1 +kerning first=105 second=251 amount=-1 +kerning first=105 second=252 amount=-1 +kerning first=105 second=253 amount=-2 +kerning first=105 second=254 amount=-1 +kerning first=105 second=255 amount=-2 +kerning first=105 second=257 amount=-1 +kerning first=105 second=259 amount=-1 +kerning first=105 second=261 amount=-1 +kerning first=105 second=263 amount=-1 +kerning first=105 second=267 amount=-1 +kerning first=105 second=269 amount=-1 +kerning first=105 second=271 amount=-1 +kerning first=105 second=273 amount=-1 +kerning first=105 second=275 amount=-1 +kerning first=105 second=277 amount=-1 +kerning first=105 second=279 amount=-1 +kerning first=105 second=281 amount=-1 +kerning first=105 second=283 amount=-1 +kerning first=105 second=287 amount=-2 +kerning first=105 second=289 amount=-2 +kerning first=105 second=291 amount=-2 +kerning first=105 second=303 amount=-1 +kerning first=105 second=305 amount=-1 +kerning first=105 second=307 amount=-1 +kerning first=105 second=311 amount=-1 +kerning first=105 second=314 amount=-1 +kerning first=105 second=316 amount=-1 +kerning first=105 second=318 amount=-1 +kerning first=105 second=324 amount=-1 +kerning first=105 second=326 amount=-1 +kerning first=105 second=328 amount=-1 +kerning first=105 second=331 amount=-1 +kerning first=105 second=333 amount=-1 +kerning first=105 second=335 amount=-1 +kerning first=105 second=337 amount=-1 +kerning first=105 second=339 amount=-1 +kerning first=203 second=65 amount=-1 +kerning first=105 second=347 amount=-1 +kerning first=105 second=351 amount=-1 +kerning first=105 second=353 amount=-1 +kerning first=105 second=355 amount=-1 +kerning first=105 second=361 amount=-1 +kerning first=105 second=363 amount=-1 +kerning first=105 second=365 amount=-1 +kerning first=105 second=367 amount=-1 +kerning first=105 second=369 amount=-1 +kerning first=105 second=371 amount=-1 +kerning first=105 second=375 amount=-2 +kerning first=105 second=378 amount=-1 +kerning first=105 second=380 amount=-1 +kerning first=105 second=382 amount=-1 +kerning first=203 second=46 amount=-1 +kerning first=203 second=45 amount=-1 +kerning first=203 second=44 amount=-1 +kerning first=202 second=8249 amount=-1 +kerning first=202 second=382 amount=-1 +kerning first=202 second=381 amount=-1 +kerning first=202 second=380 amount=-1 +kerning first=202 second=379 amount=-1 +kerning first=202 second=378 amount=-1 +kerning first=202 second=377 amount=-1 +kerning first=202 second=374 amount=-1 +kerning first=202 second=370 amount=-1 +kerning first=202 second=369 amount=-1 +kerning first=105 second=8217 amount=-1 +kerning first=105 second=8220 amount=-1 +kerning first=105 second=8221 amount=-1 +kerning first=105 second=8249 amount=-2 +kerning first=202 second=368 amount=-1 +kerning first=202 second=367 amount=-1 +kerning first=202 second=366 amount=-1 +kerning first=202 second=365 amount=-1 +kerning first=202 second=364 amount=-1 +kerning first=106 second=44 amount=-1 +kerning first=106 second=45 amount=-2 +kerning first=106 second=46 amount=-1 +kerning first=106 second=97 amount=-1 +kerning first=106 second=98 amount=-1 +kerning first=106 second=99 amount=-1 +kerning first=106 second=100 amount=-1 +kerning first=106 second=101 amount=-1 +kerning first=106 second=102 amount=-1 +kerning first=106 second=103 amount=-2 +kerning first=106 second=104 amount=-1 +kerning first=106 second=105 amount=-1 +kerning first=106 second=106 amount=-1 +kerning first=106 second=107 amount=-1 +kerning first=106 second=108 amount=-1 +kerning first=106 second=109 amount=-1 +kerning first=106 second=110 amount=-1 +kerning first=106 second=111 amount=-1 +kerning first=106 second=112 amount=-1 +kerning first=106 second=113 amount=-1 +kerning first=202 second=363 amount=-1 +kerning first=106 second=115 amount=-1 +kerning first=106 second=116 amount=-1 +kerning first=106 second=117 amount=-1 +kerning first=106 second=118 amount=-2 +kerning first=106 second=119 amount=-2 +kerning first=106 second=120 amount=-1 +kerning first=106 second=121 amount=-2 +kerning first=106 second=122 amount=-1 +kerning first=106 second=171 amount=-2 +kerning first=202 second=362 amount=-1 +kerning first=106 second=224 amount=-1 +kerning first=106 second=225 amount=-1 +kerning first=106 second=226 amount=-1 +kerning first=106 second=227 amount=-1 +kerning first=106 second=228 amount=-1 +kerning first=106 second=229 amount=-1 +kerning first=106 second=230 amount=-1 +kerning first=106 second=231 amount=-1 +kerning first=106 second=232 amount=-1 +kerning first=106 second=233 amount=-1 +kerning first=106 second=234 amount=-1 +kerning first=106 second=235 amount=-1 +kerning first=106 second=237 amount=-1 +kerning first=106 second=240 amount=-1 +kerning first=106 second=241 amount=-1 +kerning first=106 second=242 amount=-1 +kerning first=106 second=243 amount=-1 +kerning first=106 second=244 amount=-1 +kerning first=106 second=245 amount=-1 +kerning first=106 second=246 amount=-1 +kerning first=106 second=248 amount=-1 +kerning first=106 second=249 amount=-1 +kerning first=106 second=250 amount=-1 +kerning first=106 second=251 amount=-1 +kerning first=106 second=252 amount=-1 +kerning first=106 second=253 amount=-2 +kerning first=106 second=254 amount=-1 +kerning first=106 second=255 amount=-2 +kerning first=106 second=257 amount=-1 +kerning first=106 second=259 amount=-1 +kerning first=106 second=261 amount=-1 +kerning first=106 second=263 amount=-1 +kerning first=106 second=267 amount=-1 +kerning first=106 second=269 amount=-1 +kerning first=106 second=271 amount=-1 +kerning first=106 second=273 amount=-1 +kerning first=106 second=275 amount=-1 +kerning first=106 second=277 amount=-1 +kerning first=106 second=279 amount=-1 +kerning first=106 second=281 amount=-1 +kerning first=106 second=283 amount=-1 +kerning first=106 second=287 amount=-2 +kerning first=106 second=289 amount=-2 +kerning first=106 second=291 amount=-2 +kerning first=106 second=303 amount=-1 +kerning first=106 second=305 amount=-1 +kerning first=106 second=307 amount=-1 +kerning first=106 second=311 amount=-1 +kerning first=106 second=314 amount=-1 +kerning first=106 second=316 amount=-1 +kerning first=106 second=318 amount=-1 +kerning first=106 second=324 amount=-1 +kerning first=106 second=326 amount=-1 +kerning first=106 second=328 amount=-1 +kerning first=106 second=331 amount=-1 +kerning first=106 second=333 amount=-1 +kerning first=106 second=335 amount=-1 +kerning first=106 second=337 amount=-1 +kerning first=106 second=339 amount=-1 +kerning first=202 second=361 amount=-1 +kerning first=106 second=347 amount=-1 +kerning first=106 second=351 amount=-1 +kerning first=106 second=353 amount=-1 +kerning first=106 second=355 amount=-1 +kerning first=106 second=361 amount=-1 +kerning first=106 second=363 amount=-1 +kerning first=106 second=365 amount=-1 +kerning first=106 second=367 amount=-1 +kerning first=106 second=369 amount=-1 +kerning first=106 second=371 amount=-1 +kerning first=106 second=375 amount=-2 +kerning first=106 second=378 amount=-1 +kerning first=106 second=380 amount=-1 +kerning first=106 second=382 amount=-1 +kerning first=202 second=356 amount=-1 +kerning first=202 second=354 amount=-1 +kerning first=202 second=353 amount=-1 +kerning first=202 second=352 amount=-1 +kerning first=202 second=351 amount=-1 +kerning first=202 second=350 amount=-1 +kerning first=202 second=347 amount=-1 +kerning first=202 second=346 amount=-1 +kerning first=202 second=344 amount=-1 +kerning first=202 second=338 amount=-1 +kerning first=202 second=336 amount=-1 +kerning first=202 second=334 amount=-1 +kerning first=202 second=332 amount=-1 +kerning first=106 second=8217 amount=-1 +kerning first=106 second=8220 amount=-1 +kerning first=106 second=8221 amount=-1 +kerning first=106 second=8249 amount=-2 +kerning first=202 second=331 amount=-1 +kerning first=202 second=330 amount=-1 +kerning first=202 second=328 amount=-1 +kerning first=202 second=327 amount=-1 +kerning first=202 second=326 amount=-1 +kerning first=107 second=44 amount=-1 +kerning first=107 second=45 amount=-2 +kerning first=107 second=46 amount=-1 +kerning first=107 second=97 amount=-1 +kerning first=107 second=98 amount=-1 +kerning first=107 second=99 amount=-2 +kerning first=107 second=100 amount=-2 +kerning first=107 second=101 amount=-2 +kerning first=107 second=103 amount=-1 +kerning first=202 second=325 amount=-1 +kerning first=107 second=111 amount=-2 +kerning first=107 second=112 amount=-1 +kerning first=107 second=113 amount=-2 +kerning first=107 second=115 amount=-1 +kerning first=107 second=116 amount=-1 +kerning first=202 second=324 amount=-1 +kerning first=107 second=118 amount=-1 +kerning first=107 second=119 amount=-1 +kerning first=202 second=323 amount=-1 +kerning first=202 second=318 amount=-1 +kerning first=107 second=171 amount=-2 +kerning first=107 second=224 amount=-1 +kerning first=107 second=225 amount=-1 +kerning first=107 second=226 amount=-1 +kerning first=107 second=227 amount=-1 +kerning first=107 second=228 amount=-1 +kerning first=107 second=229 amount=-1 +kerning first=107 second=230 amount=-1 +kerning first=107 second=231 amount=-2 +kerning first=107 second=232 amount=-2 +kerning first=107 second=233 amount=-2 +kerning first=107 second=234 amount=-2 +kerning first=107 second=235 amount=-2 +kerning first=107 second=240 amount=-2 +kerning first=107 second=242 amount=-2 +kerning first=107 second=243 amount=-2 +kerning first=107 second=244 amount=-2 +kerning first=107 second=245 amount=-2 +kerning first=107 second=246 amount=-2 +kerning first=107 second=248 amount=-2 +kerning first=202 second=317 amount=-1 +kerning first=202 second=316 amount=-1 +kerning first=202 second=315 amount=-1 +kerning first=202 second=314 amount=-1 +kerning first=202 second=313 amount=-1 +kerning first=107 second=254 amount=-1 +kerning first=202 second=311 amount=-1 +kerning first=107 second=257 amount=-1 +kerning first=107 second=259 amount=-1 +kerning first=107 second=261 amount=-1 +kerning first=107 second=263 amount=-2 +kerning first=107 second=267 amount=-2 +kerning first=107 second=269 amount=-2 +kerning first=107 second=271 amount=-2 +kerning first=107 second=273 amount=-2 +kerning first=107 second=275 amount=-2 +kerning first=107 second=277 amount=-2 +kerning first=107 second=279 amount=-2 +kerning first=107 second=281 amount=-2 +kerning first=107 second=283 amount=-2 +kerning first=107 second=287 amount=-1 +kerning first=107 second=289 amount=-1 +kerning first=107 second=291 amount=-1 +kerning first=107 second=333 amount=-2 +kerning first=107 second=335 amount=-2 +kerning first=107 second=337 amount=-2 +kerning first=107 second=339 amount=-2 +kerning first=107 second=347 amount=-1 +kerning first=107 second=351 amount=-1 +kerning first=107 second=353 amount=-1 +kerning first=107 second=355 amount=-1 +kerning first=202 second=310 amount=-1 +kerning first=202 second=304 amount=-1 +kerning first=202 second=302 amount=-1 +kerning first=202 second=298 amount=-1 +kerning first=202 second=296 amount=-1 +kerning first=202 second=291 amount=-2 +kerning first=202 second=290 amount=-1 +kerning first=202 second=289 amount=-2 +kerning first=202 second=288 amount=-1 +kerning first=202 second=287 amount=-2 +kerning first=202 second=286 amount=-1 +kerning first=202 second=284 amount=-1 +kerning first=202 second=282 amount=-1 +kerning first=202 second=280 amount=-1 +kerning first=202 second=278 amount=-1 +kerning first=202 second=274 amount=-1 +kerning first=202 second=270 amount=-1 +kerning first=202 second=268 amount=-1 +kerning first=202 second=266 amount=-1 +kerning first=202 second=264 amount=-1 +kerning first=107 second=8217 amount=-1 +kerning first=107 second=8220 amount=-1 +kerning first=107 second=8221 amount=-1 +kerning first=107 second=8249 amount=-2 +kerning first=108 second=45 amount=-2 +kerning first=108 second=97 amount=-1 +kerning first=108 second=98 amount=-1 +kerning first=108 second=99 amount=-1 +kerning first=108 second=100 amount=-1 +kerning first=108 second=101 amount=-1 +kerning first=108 second=102 amount=-1 +kerning first=108 second=103 amount=-2 +kerning first=202 second=262 amount=-1 +kerning first=108 second=105 amount=-1 +kerning first=108 second=106 amount=-2 +kerning first=202 second=261 amount=-1 +kerning first=108 second=108 amount=-1 +kerning first=108 second=109 amount=-1 +kerning first=108 second=110 amount=-1 +kerning first=108 second=111 amount=-1 +kerning first=108 second=112 amount=-1 +kerning first=108 second=113 amount=-1 +kerning first=108 second=115 amount=-1 +kerning first=108 second=116 amount=-1 +kerning first=108 second=117 amount=-1 +kerning first=108 second=118 amount=-2 +kerning first=108 second=119 amount=-2 +kerning first=108 second=120 amount=-1 +kerning first=108 second=121 amount=-2 +kerning first=108 second=122 amount=-1 +kerning first=108 second=171 amount=-2 +kerning first=108 second=224 amount=-1 +kerning first=108 second=225 amount=-1 +kerning first=108 second=226 amount=-1 +kerning first=108 second=227 amount=-1 +kerning first=108 second=228 amount=-1 +kerning first=108 second=229 amount=-1 +kerning first=108 second=230 amount=-1 +kerning first=108 second=231 amount=-1 +kerning first=108 second=232 amount=-1 +kerning first=108 second=233 amount=-1 +kerning first=108 second=234 amount=-1 +kerning first=108 second=235 amount=-1 +kerning first=108 second=237 amount=-1 +kerning first=108 second=240 amount=-1 +kerning first=108 second=241 amount=-1 +kerning first=108 second=242 amount=-1 +kerning first=108 second=243 amount=-1 +kerning first=108 second=244 amount=-1 +kerning first=108 second=245 amount=-1 +kerning first=108 second=246 amount=-1 +kerning first=108 second=248 amount=-1 +kerning first=108 second=249 amount=-1 +kerning first=108 second=250 amount=-1 +kerning first=108 second=251 amount=-1 +kerning first=108 second=252 amount=-1 +kerning first=108 second=253 amount=-2 +kerning first=108 second=254 amount=-1 +kerning first=108 second=255 amount=-2 +kerning first=108 second=257 amount=-1 +kerning first=108 second=259 amount=-1 +kerning first=108 second=261 amount=-1 +kerning first=108 second=263 amount=-1 +kerning first=108 second=267 amount=-1 +kerning first=108 second=269 amount=-1 +kerning first=108 second=271 amount=-1 +kerning first=108 second=273 amount=-1 +kerning first=108 second=275 amount=-1 +kerning first=108 second=277 amount=-1 +kerning first=108 second=279 amount=-1 +kerning first=108 second=281 amount=-1 +kerning first=108 second=283 amount=-1 +kerning first=108 second=287 amount=-2 +kerning first=108 second=289 amount=-2 +kerning first=108 second=291 amount=-2 +kerning first=108 second=303 amount=-1 +kerning first=108 second=305 amount=-1 +kerning first=108 second=307 amount=-1 +kerning first=202 second=260 amount=-1 +kerning first=108 second=314 amount=-1 +kerning first=108 second=316 amount=-1 +kerning first=108 second=318 amount=-1 +kerning first=108 second=324 amount=-1 +kerning first=108 second=326 amount=-1 +kerning first=108 second=328 amount=-1 +kerning first=108 second=331 amount=-1 +kerning first=108 second=333 amount=-1 +kerning first=108 second=335 amount=-1 +kerning first=108 second=337 amount=-1 +kerning first=108 second=339 amount=-1 +kerning first=108 second=347 amount=-1 +kerning first=108 second=351 amount=-1 +kerning first=108 second=353 amount=-1 +kerning first=108 second=355 amount=-1 +kerning first=108 second=361 amount=-1 +kerning first=108 second=363 amount=-1 +kerning first=108 second=365 amount=-1 +kerning first=108 second=367 amount=-1 +kerning first=108 second=369 amount=-1 +kerning first=108 second=371 amount=-1 +kerning first=108 second=375 amount=-2 +kerning first=108 second=378 amount=-1 +kerning first=108 second=380 amount=-1 +kerning first=108 second=382 amount=-1 +kerning first=202 second=259 amount=-1 +kerning first=202 second=257 amount=-1 +kerning first=202 second=256 amount=-1 +kerning first=202 second=254 amount=-1 +kerning first=202 second=252 amount=-1 +kerning first=202 second=251 amount=-1 +kerning first=202 second=250 amount=-1 +kerning first=202 second=249 amount=-1 +kerning first=202 second=241 amount=-1 +kerning first=202 second=230 amount=-1 +kerning first=202 second=229 amount=-1 +kerning first=202 second=228 amount=-1 +kerning first=202 second=227 amount=-1 +kerning first=108 second=8217 amount=-2 +kerning first=108 second=8220 amount=-2 +kerning first=108 second=8221 amount=-2 +kerning first=108 second=8249 amount=-2 +kerning first=202 second=226 amount=-1 +kerning first=202 second=225 amount=-1 +kerning first=202 second=224 amount=-1 +kerning first=202 second=223 amount=-1 +kerning first=202 second=221 amount=-1 +kerning first=109 second=44 amount=-1 +kerning first=109 second=45 amount=-2 +kerning first=109 second=46 amount=-1 +kerning first=109 second=97 amount=-1 +kerning first=109 second=98 amount=-1 +kerning first=202 second=220 amount=-1 +kerning first=202 second=219 amount=-1 +kerning first=202 second=218 amount=-1 +kerning first=202 second=217 amount=-1 +kerning first=109 second=103 amount=-1 +kerning first=202 second=216 amount=-1 +kerning first=109 second=106 amount=-1 +kerning first=109 second=108 amount=-1 +kerning first=202 second=214 amount=-1 +kerning first=202 second=213 amount=-1 +kerning first=202 second=212 amount=-1 +kerning first=109 second=112 amount=-1 +kerning first=202 second=211 amount=-1 +kerning first=109 second=115 amount=-1 +kerning first=109 second=117 amount=-1 +kerning first=109 second=118 amount=-2 +kerning first=109 second=119 amount=-2 +kerning first=202 second=210 amount=-1 +kerning first=109 second=121 amount=-1 +kerning first=202 second=209 amount=-1 +kerning first=109 second=171 amount=-2 +kerning first=109 second=224 amount=-1 +kerning first=109 second=225 amount=-1 +kerning first=109 second=226 amount=-1 +kerning first=109 second=227 amount=-1 +kerning first=109 second=228 amount=-1 +kerning first=109 second=229 amount=-1 +kerning first=109 second=230 amount=-1 +kerning first=202 second=207 amount=-1 +kerning first=202 second=206 amount=-1 +kerning first=202 second=205 amount=-1 +kerning first=202 second=204 amount=-1 +kerning first=202 second=203 amount=-1 +kerning first=202 second=202 amount=-1 +kerning first=202 second=201 amount=-1 +kerning first=202 second=200 amount=-1 +kerning first=202 second=199 amount=-1 +kerning first=202 second=198 amount=-1 +kerning first=202 second=197 amount=-1 +kerning first=202 second=196 amount=-1 +kerning first=202 second=194 amount=-1 +kerning first=202 second=193 amount=-1 +kerning first=109 second=249 amount=-1 +kerning first=109 second=250 amount=-1 +kerning first=109 second=251 amount=-1 +kerning first=109 second=252 amount=-1 +kerning first=109 second=253 amount=-1 +kerning first=109 second=254 amount=-1 +kerning first=109 second=255 amount=-1 +kerning first=109 second=257 amount=-1 +kerning first=109 second=259 amount=-1 +kerning first=109 second=261 amount=-1 +kerning first=202 second=192 amount=-1 +kerning first=202 second=171 amount=-1 +kerning first=202 second=122 amount=-1 +kerning first=202 second=120 amount=-1 +kerning first=202 second=119 amount=-1 +kerning first=202 second=118 amount=-1 +kerning first=202 second=117 amount=-1 +kerning first=202 second=115 amount=-1 +kerning first=202 second=112 amount=-1 +kerning first=202 second=110 amount=-1 +kerning first=109 second=287 amount=-1 +kerning first=109 second=289 amount=-1 +kerning first=109 second=291 amount=-1 +kerning first=202 second=109 amount=-1 +kerning first=202 second=108 amount=-1 +kerning first=202 second=107 amount=-1 +kerning first=109 second=314 amount=-1 +kerning first=109 second=316 amount=-1 +kerning first=109 second=318 amount=-1 +kerning first=202 second=104 amount=-1 +kerning first=202 second=103 amount=-2 +kerning first=202 second=102 amount=-1 +kerning first=202 second=98 amount=-1 +kerning first=202 second=97 amount=-1 +kerning first=202 second=90 amount=-1 +kerning first=202 second=89 amount=-1 +kerning first=202 second=87 amount=-1 +kerning first=109 second=347 amount=-1 +kerning first=109 second=351 amount=-1 +kerning first=109 second=353 amount=-1 +kerning first=109 second=361 amount=-1 +kerning first=109 second=363 amount=-1 +kerning first=109 second=365 amount=-1 +kerning first=109 second=367 amount=-1 +kerning first=109 second=369 amount=-1 +kerning first=109 second=371 amount=-1 +kerning first=109 second=375 amount=-1 +kerning first=202 second=86 amount=-1 +kerning first=202 second=85 amount=-1 +kerning first=202 second=84 amount=-1 +kerning first=202 second=83 amount=-1 +kerning first=202 second=82 amount=-1 +kerning first=202 second=81 amount=-1 +kerning first=202 second=80 amount=-1 +kerning first=202 second=79 amount=-1 +kerning first=202 second=78 amount=-1 +kerning first=202 second=77 amount=-1 +kerning first=202 second=76 amount=-1 +kerning first=202 second=75 amount=-1 +kerning first=202 second=74 amount=-1 +kerning first=109 second=8217 amount=-3 +kerning first=109 second=8220 amount=-3 +kerning first=109 second=8221 amount=-3 +kerning first=109 second=8249 amount=-2 +kerning first=202 second=73 amount=-1 +kerning first=202 second=72 amount=-1 +kerning first=202 second=71 amount=-1 +kerning first=202 second=70 amount=-1 +kerning first=202 second=69 amount=-1 +kerning first=110 second=44 amount=-1 +kerning first=110 second=45 amount=-2 +kerning first=110 second=46 amount=-1 +kerning first=110 second=97 amount=-1 +kerning first=110 second=98 amount=-1 +kerning first=202 second=68 amount=-1 +kerning first=202 second=67 amount=-1 +kerning first=202 second=66 amount=-1 +kerning first=202 second=65 amount=-1 +kerning first=110 second=103 amount=-1 +kerning first=202 second=46 amount=-1 +kerning first=110 second=106 amount=-1 +kerning first=110 second=108 amount=-1 +kerning first=202 second=45 amount=-1 +kerning first=202 second=44 amount=-1 +kerning first=201 second=8249 amount=-1 +kerning first=110 second=112 amount=-1 +kerning first=201 second=382 amount=-1 +kerning first=110 second=115 amount=-1 +kerning first=110 second=117 amount=-1 +kerning first=110 second=118 amount=-2 +kerning first=110 second=119 amount=-2 +kerning first=201 second=381 amount=-1 +kerning first=110 second=121 amount=-1 +kerning first=201 second=380 amount=-1 +kerning first=110 second=171 amount=-2 +kerning first=110 second=224 amount=-1 +kerning first=110 second=225 amount=-1 +kerning first=110 second=226 amount=-1 +kerning first=110 second=227 amount=-1 +kerning first=110 second=228 amount=-1 +kerning first=110 second=229 amount=-1 +kerning first=110 second=230 amount=-1 +kerning first=201 second=379 amount=-1 +kerning first=201 second=378 amount=-1 +kerning first=201 second=377 amount=-1 +kerning first=201 second=374 amount=-1 +kerning first=201 second=370 amount=-1 +kerning first=201 second=369 amount=-1 +kerning first=201 second=368 amount=-1 +kerning first=201 second=367 amount=-1 +kerning first=201 second=366 amount=-1 +kerning first=201 second=365 amount=-1 +kerning first=201 second=364 amount=-1 +kerning first=201 second=363 amount=-1 +kerning first=201 second=362 amount=-1 +kerning first=201 second=361 amount=-1 +kerning first=110 second=249 amount=-1 +kerning first=110 second=250 amount=-1 +kerning first=110 second=251 amount=-1 +kerning first=110 second=252 amount=-1 +kerning first=110 second=253 amount=-1 +kerning first=110 second=254 amount=-1 +kerning first=110 second=255 amount=-1 +kerning first=110 second=257 amount=-1 +kerning first=110 second=259 amount=-1 +kerning first=110 second=261 amount=-1 +kerning first=201 second=356 amount=-1 +kerning first=201 second=354 amount=-1 +kerning first=201 second=353 amount=-1 +kerning first=201 second=352 amount=-1 +kerning first=201 second=351 amount=-1 +kerning first=201 second=350 amount=-1 +kerning first=201 second=347 amount=-1 +kerning first=201 second=346 amount=-1 +kerning first=201 second=344 amount=-1 +kerning first=201 second=338 amount=-1 +kerning first=110 second=287 amount=-1 +kerning first=110 second=289 amount=-1 +kerning first=110 second=291 amount=-1 +kerning first=201 second=336 amount=-1 +kerning first=201 second=334 amount=-1 +kerning first=201 second=332 amount=-1 +kerning first=110 second=314 amount=-1 +kerning first=110 second=316 amount=-1 +kerning first=110 second=318 amount=-1 +kerning first=201 second=331 amount=-1 +kerning first=201 second=330 amount=-1 +kerning first=201 second=328 amount=-1 +kerning first=201 second=327 amount=-1 +kerning first=201 second=326 amount=-1 +kerning first=201 second=325 amount=-1 +kerning first=201 second=324 amount=-1 +kerning first=201 second=323 amount=-1 +kerning first=110 second=347 amount=-1 +kerning first=110 second=351 amount=-1 +kerning first=110 second=353 amount=-1 +kerning first=110 second=361 amount=-1 +kerning first=110 second=363 amount=-1 +kerning first=110 second=365 amount=-1 +kerning first=110 second=367 amount=-1 +kerning first=110 second=369 amount=-1 +kerning first=110 second=371 amount=-1 +kerning first=110 second=375 amount=-1 +kerning first=201 second=318 amount=-1 +kerning first=201 second=317 amount=-1 +kerning first=201 second=316 amount=-1 +kerning first=201 second=315 amount=-1 +kerning first=201 second=314 amount=-1 +kerning first=201 second=313 amount=-1 +kerning first=201 second=311 amount=-1 +kerning first=201 second=310 amount=-1 +kerning first=201 second=304 amount=-1 +kerning first=201 second=302 amount=-1 +kerning first=201 second=298 amount=-1 +kerning first=201 second=296 amount=-1 +kerning first=201 second=291 amount=-2 +kerning first=110 second=8217 amount=-3 +kerning first=110 second=8220 amount=-3 +kerning first=110 second=8221 amount=-3 +kerning first=110 second=8249 amount=-2 +kerning first=201 second=290 amount=-1 +kerning first=201 second=289 amount=-2 +kerning first=201 second=288 amount=-1 +kerning first=201 second=287 amount=-2 +kerning first=201 second=286 amount=-1 +kerning first=111 second=44 amount=-2 +kerning first=111 second=46 amount=-2 +kerning first=111 second=97 amount=-1 +kerning first=201 second=284 amount=-1 +kerning first=111 second=102 amount=-1 +kerning first=111 second=103 amount=-1 +kerning first=111 second=104 amount=-1 +kerning first=111 second=105 amount=-1 +kerning first=111 second=106 amount=-1 +kerning first=111 second=107 amount=-1 +kerning first=111 second=108 amount=-2 +kerning first=111 second=109 amount=-1 +kerning first=111 second=110 amount=-1 +kerning first=111 second=112 amount=-1 +kerning first=201 second=282 amount=-1 +kerning first=111 second=115 amount=-1 +kerning first=201 second=280 amount=-1 +kerning first=201 second=278 amount=-1 +kerning first=111 second=118 amount=-1 +kerning first=111 second=119 amount=-1 +kerning first=111 second=120 amount=-2 +kerning first=111 second=121 amount=-2 +kerning first=111 second=122 amount=-1 +kerning first=111 second=187 amount=-1 +kerning first=201 second=274 amount=-1 +kerning first=111 second=224 amount=-1 +kerning first=111 second=225 amount=-1 +kerning first=111 second=226 amount=-1 +kerning first=111 second=227 amount=-1 +kerning first=111 second=228 amount=-1 +kerning first=111 second=229 amount=-1 +kerning first=111 second=230 amount=-1 +kerning first=111 second=237 amount=-1 +kerning first=111 second=241 amount=-1 +kerning first=201 second=270 amount=-1 +kerning first=201 second=268 amount=-1 +kerning first=201 second=266 amount=-1 +kerning first=201 second=264 amount=-1 +kerning first=111 second=253 amount=-2 +kerning first=201 second=262 amount=-1 +kerning first=111 second=255 amount=-2 +kerning first=111 second=257 amount=-1 +kerning first=111 second=259 amount=-1 +kerning first=111 second=261 amount=-1 +kerning first=111 second=287 amount=-1 +kerning first=111 second=289 amount=-1 +kerning first=111 second=291 amount=-1 +kerning first=111 second=303 amount=-1 +kerning first=111 second=305 amount=-1 +kerning first=111 second=307 amount=-1 +kerning first=111 second=311 amount=-1 +kerning first=111 second=314 amount=-2 +kerning first=111 second=316 amount=-2 +kerning first=111 second=318 amount=-2 +kerning first=111 second=324 amount=-1 +kerning first=111 second=326 amount=-1 +kerning first=111 second=328 amount=-1 +kerning first=111 second=331 amount=-1 +kerning first=201 second=261 amount=-1 +kerning first=111 second=347 amount=-1 +kerning first=111 second=351 amount=-1 +kerning first=111 second=353 amount=-1 +kerning first=201 second=260 amount=-1 +kerning first=201 second=259 amount=-1 +kerning first=201 second=257 amount=-1 +kerning first=201 second=256 amount=-1 +kerning first=201 second=254 amount=-1 +kerning first=201 second=252 amount=-1 +kerning first=201 second=251 amount=-1 +kerning first=111 second=375 amount=-2 +kerning first=111 second=378 amount=-1 +kerning first=111 second=380 amount=-1 +kerning first=111 second=382 amount=-1 +kerning first=201 second=250 amount=-1 +kerning first=201 second=249 amount=-1 +kerning first=201 second=241 amount=-1 +kerning first=201 second=230 amount=-1 +kerning first=201 second=229 amount=-1 +kerning first=201 second=228 amount=-1 +kerning first=201 second=227 amount=-1 +kerning first=201 second=226 amount=-1 +kerning first=201 second=225 amount=-1 +kerning first=201 second=224 amount=-1 +kerning first=201 second=223 amount=-1 +kerning first=111 second=8217 amount=-1 +kerning first=111 second=8220 amount=-1 +kerning first=111 second=8221 amount=-1 +kerning first=111 second=8250 amount=-1 +kerning first=201 second=221 amount=-1 +kerning first=201 second=220 amount=-1 +kerning first=201 second=219 amount=-1 +kerning first=201 second=218 amount=-1 +kerning first=201 second=217 amount=-1 +kerning first=112 second=44 amount=-2 +kerning first=112 second=46 amount=-2 +kerning first=112 second=97 amount=-1 +kerning first=201 second=216 amount=-1 +kerning first=112 second=102 amount=-1 +kerning first=112 second=103 amount=-1 +kerning first=112 second=104 amount=-1 +kerning first=112 second=105 amount=-1 +kerning first=112 second=106 amount=-1 +kerning first=112 second=107 amount=-1 +kerning first=112 second=108 amount=-2 +kerning first=112 second=109 amount=-1 +kerning first=112 second=110 amount=-1 +kerning first=112 second=112 amount=-1 +kerning first=201 second=214 amount=-1 +kerning first=112 second=115 amount=-1 +kerning first=201 second=213 amount=-1 +kerning first=201 second=212 amount=-1 +kerning first=112 second=118 amount=-1 +kerning first=112 second=119 amount=-1 +kerning first=112 second=120 amount=-2 +kerning first=112 second=121 amount=-2 +kerning first=112 second=122 amount=-1 +kerning first=112 second=187 amount=-1 +kerning first=201 second=211 amount=-1 +kerning first=112 second=224 amount=-1 +kerning first=112 second=225 amount=-1 +kerning first=112 second=226 amount=-1 +kerning first=112 second=227 amount=-1 +kerning first=112 second=228 amount=-1 +kerning first=112 second=229 amount=-1 +kerning first=112 second=230 amount=-1 +kerning first=112 second=237 amount=-1 +kerning first=112 second=241 amount=-1 +kerning first=201 second=210 amount=-1 +kerning first=201 second=209 amount=-1 +kerning first=201 second=207 amount=-1 +kerning first=201 second=206 amount=-1 +kerning first=112 second=253 amount=-2 +kerning first=201 second=205 amount=-1 +kerning first=112 second=255 amount=-2 +kerning first=112 second=257 amount=-1 +kerning first=112 second=259 amount=-1 +kerning first=112 second=261 amount=-1 +kerning first=112 second=287 amount=-1 +kerning first=112 second=289 amount=-1 +kerning first=112 second=291 amount=-1 +kerning first=112 second=303 amount=-1 +kerning first=112 second=305 amount=-1 +kerning first=112 second=307 amount=-1 +kerning first=112 second=311 amount=-1 +kerning first=112 second=314 amount=-2 +kerning first=112 second=316 amount=-2 +kerning first=112 second=318 amount=-2 +kerning first=112 second=324 amount=-1 +kerning first=112 second=326 amount=-1 +kerning first=112 second=328 amount=-1 +kerning first=112 second=331 amount=-1 +kerning first=201 second=204 amount=-1 +kerning first=112 second=347 amount=-1 +kerning first=112 second=351 amount=-1 +kerning first=112 second=353 amount=-1 +kerning first=201 second=203 amount=-1 +kerning first=201 second=202 amount=-1 +kerning first=201 second=201 amount=-1 +kerning first=201 second=200 amount=-1 +kerning first=201 second=199 amount=-1 +kerning first=201 second=198 amount=-1 +kerning first=201 second=197 amount=-1 +kerning first=112 second=375 amount=-2 +kerning first=112 second=378 amount=-1 +kerning first=112 second=380 amount=-1 +kerning first=112 second=382 amount=-1 +kerning first=201 second=196 amount=-1 +kerning first=201 second=194 amount=-1 +kerning first=201 second=193 amount=-1 +kerning first=201 second=192 amount=-1 +kerning first=201 second=171 amount=-1 +kerning first=201 second=122 amount=-1 +kerning first=201 second=120 amount=-1 +kerning first=201 second=119 amount=-1 +kerning first=201 second=118 amount=-1 +kerning first=201 second=117 amount=-1 +kerning first=201 second=115 amount=-1 +kerning first=112 second=8217 amount=-1 +kerning first=112 second=8220 amount=-1 +kerning first=112 second=8221 amount=-1 +kerning first=112 second=8250 amount=-1 +kerning first=201 second=112 amount=-1 +kerning first=201 second=110 amount=-1 +kerning first=201 second=109 amount=-1 +kerning first=201 second=108 amount=-1 +kerning first=201 second=107 amount=-1 +kerning first=113 second=44 amount=-1 +kerning first=113 second=45 amount=-1 +kerning first=113 second=46 amount=-1 +kerning first=113 second=97 amount=-1 +kerning first=113 second=98 amount=-1 +kerning first=113 second=99 amount=-1 +kerning first=113 second=100 amount=-1 +kerning first=113 second=101 amount=-1 +kerning first=113 second=102 amount=-1 +kerning first=113 second=104 amount=-1 +kerning first=113 second=105 amount=-1 +kerning first=113 second=106 amount=3 +kerning first=113 second=107 amount=-1 +kerning first=113 second=108 amount=-1 +kerning first=113 second=109 amount=-1 +kerning first=113 second=110 amount=-1 +kerning first=113 second=111 amount=-1 +kerning first=113 second=113 amount=-1 +kerning first=113 second=114 amount=-1 +kerning first=113 second=115 amount=-1 +kerning first=113 second=116 amount=-1 +kerning first=113 second=117 amount=-1 +kerning first=113 second=118 amount=-2 +kerning first=113 second=119 amount=-2 +kerning first=113 second=120 amount=-1 +kerning first=113 second=121 amount=-1 +kerning first=113 second=122 amount=-1 +kerning first=113 second=171 amount=-1 +kerning first=113 second=223 amount=-1 +kerning first=113 second=224 amount=-1 +kerning first=113 second=225 amount=-1 +kerning first=113 second=226 amount=-1 +kerning first=113 second=227 amount=-1 +kerning first=113 second=228 amount=-1 +kerning first=113 second=229 amount=-1 +kerning first=113 second=230 amount=-1 +kerning first=113 second=231 amount=-1 +kerning first=113 second=232 amount=-1 +kerning first=113 second=233 amount=-1 +kerning first=113 second=234 amount=-1 +kerning first=113 second=235 amount=-1 +kerning first=113 second=237 amount=-1 +kerning first=113 second=240 amount=-1 +kerning first=113 second=241 amount=-1 +kerning first=113 second=242 amount=-1 +kerning first=113 second=243 amount=-1 +kerning first=113 second=244 amount=-1 +kerning first=113 second=245 amount=-1 +kerning first=113 second=246 amount=-1 +kerning first=113 second=248 amount=-1 +kerning first=113 second=249 amount=-1 +kerning first=113 second=250 amount=-1 +kerning first=113 second=251 amount=-1 +kerning first=113 second=252 amount=-1 +kerning first=113 second=253 amount=-1 +kerning first=113 second=254 amount=-1 +kerning first=113 second=255 amount=-1 +kerning first=113 second=257 amount=-1 +kerning first=113 second=259 amount=-1 +kerning first=113 second=261 amount=-1 +kerning first=113 second=263 amount=-1 +kerning first=113 second=267 amount=-1 +kerning first=113 second=269 amount=-1 +kerning first=113 second=271 amount=-1 +kerning first=113 second=273 amount=-1 +kerning first=113 second=275 amount=-1 +kerning first=113 second=277 amount=-1 +kerning first=113 second=279 amount=-1 +kerning first=113 second=281 amount=-1 +kerning first=113 second=283 amount=-1 +kerning first=113 second=303 amount=-1 +kerning first=113 second=305 amount=-1 +kerning first=113 second=307 amount=-1 +kerning first=113 second=311 amount=-1 +kerning first=113 second=314 amount=-1 +kerning first=113 second=316 amount=-1 +kerning first=113 second=318 amount=-1 +kerning first=113 second=324 amount=-1 +kerning first=113 second=326 amount=-1 +kerning first=113 second=328 amount=-1 +kerning first=113 second=331 amount=-1 +kerning first=113 second=333 amount=-1 +kerning first=113 second=335 amount=-1 +kerning first=113 second=337 amount=-1 +kerning first=113 second=339 amount=-1 +kerning first=113 second=345 amount=-1 +kerning first=113 second=347 amount=-1 +kerning first=113 second=351 amount=-1 +kerning first=113 second=353 amount=-1 +kerning first=113 second=355 amount=-1 +kerning first=113 second=361 amount=-1 +kerning first=113 second=363 amount=-1 +kerning first=113 second=365 amount=-1 +kerning first=113 second=367 amount=-1 +kerning first=113 second=369 amount=-1 +kerning first=113 second=371 amount=-1 +kerning first=113 second=375 amount=-1 +kerning first=113 second=378 amount=-1 +kerning first=113 second=380 amount=-1 +kerning first=113 second=382 amount=-1 +kerning first=201 second=104 amount=-1 +kerning first=201 second=103 amount=-2 +kerning first=201 second=102 amount=-1 +kerning first=201 second=98 amount=-1 +kerning first=201 second=97 amount=-1 +kerning first=201 second=90 amount=-1 +kerning first=201 second=89 amount=-1 +kerning first=201 second=87 amount=-1 +kerning first=201 second=86 amount=-1 +kerning first=201 second=85 amount=-1 +kerning first=201 second=84 amount=-1 +kerning first=201 second=83 amount=-1 +kerning first=113 second=8217 amount=-2 +kerning first=113 second=8220 amount=-2 +kerning first=113 second=8221 amount=-2 +kerning first=113 second=8249 amount=-1 +kerning first=201 second=82 amount=-1 +kerning first=201 second=81 amount=-1 +kerning first=201 second=80 amount=-1 +kerning first=201 second=79 amount=-1 +kerning first=201 second=78 amount=-1 +kerning first=114 second=44 amount=-3 +kerning first=114 second=45 amount=-1 +kerning first=114 second=46 amount=-3 +kerning first=201 second=77 amount=-1 +kerning first=201 second=76 amount=-1 +kerning first=201 second=75 amount=-1 +kerning first=201 second=74 amount=-1 +kerning first=114 second=103 amount=-1 +kerning first=201 second=73 amount=-1 +kerning first=201 second=72 amount=-1 +kerning first=201 second=71 amount=-1 +kerning first=201 second=70 amount=-1 +kerning first=114 second=171 amount=-1 +kerning first=201 second=69 amount=-1 +kerning first=201 second=68 amount=-1 +kerning first=201 second=67 amount=-1 +kerning first=201 second=66 amount=-1 +kerning first=201 second=65 amount=-1 +kerning first=201 second=46 amount=-1 +kerning first=201 second=45 amount=-1 +kerning first=201 second=44 amount=-1 +kerning first=200 second=8249 amount=-1 +kerning first=200 second=382 amount=-1 +kerning first=200 second=381 amount=-1 +kerning first=200 second=380 amount=-1 +kerning first=200 second=379 amount=-1 +kerning first=200 second=378 amount=-1 +kerning first=200 second=377 amount=-1 +kerning first=200 second=374 amount=-1 +kerning first=200 second=370 amount=-1 +kerning first=200 second=369 amount=-1 +kerning first=200 second=368 amount=-1 +kerning first=200 second=367 amount=-1 +kerning first=200 second=366 amount=-1 +kerning first=200 second=365 amount=-1 +kerning first=200 second=364 amount=-1 +kerning first=200 second=363 amount=-1 +kerning first=200 second=362 amount=-1 +kerning first=200 second=361 amount=-1 +kerning first=200 second=356 amount=-1 +kerning first=200 second=354 amount=-1 +kerning first=200 second=353 amount=-1 +kerning first=200 second=352 amount=-1 +kerning first=200 second=351 amount=-1 +kerning first=200 second=350 amount=-1 +kerning first=114 second=287 amount=-1 +kerning first=114 second=289 amount=-1 +kerning first=114 second=291 amount=-1 +kerning first=200 second=347 amount=-1 +kerning first=200 second=346 amount=-1 +kerning first=200 second=344 amount=-1 +kerning first=200 second=338 amount=-1 +kerning first=200 second=336 amount=-1 +kerning first=200 second=334 amount=-1 +kerning first=200 second=332 amount=-1 +kerning first=200 second=331 amount=-1 +kerning first=200 second=330 amount=-1 +kerning first=200 second=328 amount=-1 +kerning first=200 second=327 amount=-1 +kerning first=200 second=326 amount=-1 +kerning first=114 second=8249 amount=-1 +kerning first=115 second=44 amount=-1 +kerning first=115 second=45 amount=-1 +kerning first=115 second=46 amount=-1 +kerning first=115 second=97 amount=-1 +kerning first=115 second=98 amount=-1 +kerning first=200 second=325 amount=-1 +kerning first=200 second=324 amount=-1 +kerning first=200 second=323 amount=-1 +kerning first=115 second=102 amount=-1 +kerning first=115 second=103 amount=-2 +kerning first=115 second=104 amount=-1 +kerning first=115 second=105 amount=-1 +kerning first=115 second=106 amount=-1 +kerning first=115 second=107 amount=-1 +kerning first=115 second=108 amount=-1 +kerning first=115 second=109 amount=-1 +kerning first=115 second=110 amount=-1 +kerning first=200 second=318 amount=-1 +kerning first=115 second=112 amount=-2 +kerning first=200 second=317 amount=-1 +kerning first=115 second=114 amount=-1 +kerning first=115 second=115 amount=-2 +kerning first=115 second=116 amount=-1 +kerning first=115 second=117 amount=-1 +kerning first=115 second=118 amount=-2 +kerning first=115 second=119 amount=-2 +kerning first=115 second=120 amount=-2 +kerning first=115 second=121 amount=-2 +kerning first=115 second=122 amount=-1 +kerning first=115 second=171 amount=-1 +kerning first=115 second=223 amount=-1 +kerning first=115 second=224 amount=-1 +kerning first=115 second=225 amount=-1 +kerning first=115 second=226 amount=-1 +kerning first=115 second=227 amount=-1 +kerning first=115 second=228 amount=-1 +kerning first=115 second=229 amount=-1 +kerning first=115 second=230 amount=-1 +kerning first=200 second=316 amount=-1 +kerning first=200 second=315 amount=-1 +kerning first=200 second=314 amount=-1 +kerning first=200 second=313 amount=-1 +kerning first=200 second=311 amount=-1 +kerning first=115 second=237 amount=-1 +kerning first=200 second=310 amount=-1 +kerning first=115 second=241 amount=-1 +kerning first=200 second=304 amount=-1 +kerning first=200 second=302 amount=-1 +kerning first=200 second=298 amount=-1 +kerning first=200 second=296 amount=-1 +kerning first=200 second=291 amount=-2 +kerning first=200 second=290 amount=-1 +kerning first=115 second=249 amount=-1 +kerning first=115 second=250 amount=-1 +kerning first=115 second=251 amount=-1 +kerning first=115 second=252 amount=-1 +kerning first=115 second=253 amount=-2 +kerning first=115 second=254 amount=-1 +kerning first=115 second=255 amount=-2 +kerning first=115 second=257 amount=-1 +kerning first=115 second=259 amount=-1 +kerning first=115 second=261 amount=-1 +kerning first=200 second=289 amount=-2 +kerning first=200 second=288 amount=-1 +kerning first=200 second=287 amount=-2 +kerning first=200 second=286 amount=-1 +kerning first=200 second=284 amount=-1 +kerning first=200 second=282 amount=-1 +kerning first=200 second=280 amount=-1 +kerning first=200 second=278 amount=-1 +kerning first=200 second=274 amount=-1 +kerning first=200 second=270 amount=-1 +kerning first=115 second=287 amount=-2 +kerning first=115 second=289 amount=-2 +kerning first=115 second=291 amount=-2 +kerning first=115 second=303 amount=-1 +kerning first=115 second=305 amount=-1 +kerning first=115 second=307 amount=-1 +kerning first=115 second=311 amount=-1 +kerning first=115 second=314 amount=-1 +kerning first=115 second=316 amount=-1 +kerning first=115 second=318 amount=-1 +kerning first=115 second=324 amount=-1 +kerning first=115 second=326 amount=-1 +kerning first=115 second=328 amount=-1 +kerning first=115 second=331 amount=-1 +kerning first=200 second=268 amount=-1 +kerning first=200 second=266 amount=-1 +kerning first=200 second=264 amount=-1 +kerning first=200 second=262 amount=-1 +kerning first=115 second=345 amount=-1 +kerning first=115 second=347 amount=-2 +kerning first=115 second=351 amount=-2 +kerning first=115 second=353 amount=-2 +kerning first=115 second=355 amount=-1 +kerning first=115 second=361 amount=-1 +kerning first=115 second=363 amount=-1 +kerning first=115 second=365 amount=-1 +kerning first=115 second=367 amount=-1 +kerning first=115 second=369 amount=-1 +kerning first=115 second=371 amount=-1 +kerning first=115 second=375 amount=-2 +kerning first=115 second=378 amount=-1 +kerning first=115 second=380 amount=-1 +kerning first=115 second=382 amount=-1 +kerning first=200 second=261 amount=-1 +kerning first=200 second=260 amount=-1 +kerning first=200 second=259 amount=-1 +kerning first=200 second=257 amount=-1 +kerning first=200 second=256 amount=-1 +kerning first=200 second=254 amount=-1 +kerning first=200 second=252 amount=-1 +kerning first=200 second=251 amount=-1 +kerning first=200 second=250 amount=-1 +kerning first=200 second=249 amount=-1 +kerning first=200 second=241 amount=-1 +kerning first=200 second=230 amount=-1 +kerning first=200 second=229 amount=-1 +kerning first=115 second=8217 amount=-1 +kerning first=115 second=8220 amount=-1 +kerning first=115 second=8221 amount=-1 +kerning first=115 second=8249 amount=-1 +kerning first=200 second=228 amount=-1 +kerning first=200 second=227 amount=-1 +kerning first=200 second=226 amount=-1 +kerning first=200 second=225 amount=-1 +kerning first=200 second=224 amount=-1 +kerning first=116 second=45 amount=-1 +kerning first=200 second=223 amount=-1 +kerning first=200 second=221 amount=-1 +kerning first=200 second=220 amount=-1 +kerning first=200 second=219 amount=-1 +kerning first=200 second=218 amount=-1 +kerning first=116 second=103 amount=-1 +kerning first=200 second=217 amount=-1 +kerning first=116 second=108 amount=-1 +kerning first=200 second=216 amount=-1 +kerning first=200 second=214 amount=-1 +kerning first=200 second=213 amount=-1 +kerning first=116 second=115 amount=-1 +kerning first=200 second=212 amount=-1 +kerning first=200 second=211 amount=-1 +kerning first=116 second=118 amount=-1 +kerning first=116 second=119 amount=-1 +kerning first=116 second=120 amount=-1 +kerning first=116 second=121 amount=-1 +kerning first=116 second=122 amount=-1 +kerning first=116 second=171 amount=-1 +kerning first=200 second=210 amount=-1 +kerning first=200 second=209 amount=-1 +kerning first=200 second=207 amount=-1 +kerning first=200 second=206 amount=-1 +kerning first=200 second=205 amount=-1 +kerning first=200 second=204 amount=-1 +kerning first=200 second=203 amount=-1 +kerning first=200 second=202 amount=-1 +kerning first=200 second=201 amount=-1 +kerning first=200 second=200 amount=-1 +kerning first=200 second=199 amount=-1 +kerning first=200 second=198 amount=-1 +kerning first=200 second=197 amount=-1 +kerning first=200 second=196 amount=-1 +kerning first=200 second=194 amount=-1 +kerning first=200 second=193 amount=-1 +kerning first=200 second=192 amount=-1 +kerning first=200 second=171 amount=-1 +kerning first=200 second=122 amount=-1 +kerning first=200 second=120 amount=-1 +kerning first=200 second=119 amount=-1 +kerning first=200 second=118 amount=-1 +kerning first=200 second=117 amount=-1 +kerning first=200 second=115 amount=-1 +kerning first=116 second=253 amount=-1 +kerning first=200 second=112 amount=-1 +kerning first=116 second=255 amount=-1 +kerning first=200 second=110 amount=-1 +kerning first=200 second=109 amount=-1 +kerning first=200 second=108 amount=-1 +kerning first=200 second=107 amount=-1 +kerning first=200 second=104 amount=-1 +kerning first=200 second=103 amount=-2 +kerning first=200 second=102 amount=-1 +kerning first=200 second=98 amount=-1 +kerning first=200 second=97 amount=-1 +kerning first=200 second=90 amount=-1 +kerning first=200 second=89 amount=-1 +kerning first=200 second=87 amount=-1 +kerning first=200 second=86 amount=-1 +kerning first=116 second=287 amount=-1 +kerning first=116 second=289 amount=-1 +kerning first=116 second=291 amount=-1 +kerning first=200 second=85 amount=-1 +kerning first=200 second=84 amount=-1 +kerning first=116 second=314 amount=-1 +kerning first=116 second=316 amount=-1 +kerning first=116 second=318 amount=-1 +kerning first=200 second=83 amount=-1 +kerning first=200 second=82 amount=-1 +kerning first=200 second=81 amount=-1 +kerning first=200 second=80 amount=-1 +kerning first=116 second=347 amount=-1 +kerning first=116 second=351 amount=-1 +kerning first=116 second=353 amount=-1 +kerning first=200 second=79 amount=-1 +kerning first=200 second=78 amount=-1 +kerning first=200 second=77 amount=-1 +kerning first=200 second=76 amount=-1 +kerning first=200 second=75 amount=-1 +kerning first=200 second=74 amount=-1 +kerning first=200 second=73 amount=-1 +kerning first=116 second=375 amount=-1 +kerning first=116 second=378 amount=-1 +kerning first=116 second=380 amount=-1 +kerning first=116 second=382 amount=-1 +kerning first=200 second=72 amount=-1 +kerning first=200 second=71 amount=-1 +kerning first=200 second=70 amount=-1 +kerning first=200 second=69 amount=-1 +kerning first=200 second=68 amount=-1 +kerning first=200 second=67 amount=-1 +kerning first=200 second=66 amount=-1 +kerning first=200 second=65 amount=-1 +kerning first=200 second=46 amount=-1 +kerning first=200 second=45 amount=-1 +kerning first=116 second=8249 amount=-1 +kerning first=117 second=44 amount=-1 +kerning first=117 second=45 amount=-1 +kerning first=117 second=46 amount=-1 +kerning first=117 second=97 amount=-1 +kerning first=117 second=98 amount=-1 +kerning first=117 second=99 amount=-1 +kerning first=117 second=100 amount=-1 +kerning first=117 second=101 amount=-1 +kerning first=117 second=102 amount=-1 +kerning first=117 second=103 amount=-2 +kerning first=117 second=104 amount=-1 +kerning first=117 second=105 amount=-1 +kerning first=117 second=106 amount=-1 +kerning first=117 second=107 amount=-1 +kerning first=117 second=108 amount=-2 +kerning first=117 second=109 amount=-1 +kerning first=117 second=110 amount=-1 +kerning first=117 second=111 amount=-1 +kerning first=117 second=112 amount=-1 +kerning first=117 second=113 amount=-1 +kerning first=200 second=44 amount=-1 +kerning first=117 second=115 amount=-1 +kerning first=199 second=8249 amount=-3 +kerning first=117 second=117 amount=-1 +kerning first=117 second=118 amount=-2 +kerning first=117 second=119 amount=-2 +kerning first=117 second=120 amount=-1 +kerning first=117 second=121 amount=-2 +kerning first=117 second=122 amount=-1 +kerning first=117 second=171 amount=-1 +kerning first=199 second=382 amount=-2 +kerning first=199 second=381 amount=-1 +kerning first=117 second=225 amount=-1 +kerning first=117 second=226 amount=-1 +kerning first=117 second=227 amount=-1 +kerning first=199 second=380 amount=-2 +kerning first=117 second=229 amount=-1 +kerning first=117 second=230 amount=-1 +kerning first=117 second=231 amount=-1 +kerning first=117 second=232 amount=-1 +kerning first=117 second=233 amount=-1 +kerning first=117 second=234 amount=-1 +kerning first=117 second=235 amount=-1 +kerning first=117 second=237 amount=-1 +kerning first=117 second=240 amount=-1 +kerning first=117 second=241 amount=-1 +kerning first=117 second=242 amount=-1 +kerning first=117 second=243 amount=-1 +kerning first=117 second=244 amount=-1 +kerning first=117 second=245 amount=-1 +kerning first=117 second=246 amount=-1 +kerning first=117 second=248 amount=-1 +kerning first=117 second=249 amount=-1 +kerning first=117 second=250 amount=-1 +kerning first=117 second=251 amount=-1 +kerning first=117 second=252 amount=-1 +kerning first=117 second=253 amount=-2 +kerning first=117 second=254 amount=-1 +kerning first=117 second=255 amount=-2 +kerning first=117 second=257 amount=-1 +kerning first=117 second=259 amount=-1 +kerning first=117 second=261 amount=-1 +kerning first=117 second=263 amount=-1 +kerning first=117 second=267 amount=-1 +kerning first=117 second=269 amount=-1 +kerning first=117 second=271 amount=-1 +kerning first=117 second=273 amount=-1 +kerning first=117 second=275 amount=-1 +kerning first=117 second=277 amount=-1 +kerning first=117 second=279 amount=-1 +kerning first=117 second=281 amount=-1 +kerning first=117 second=283 amount=-1 +kerning first=117 second=287 amount=-2 +kerning first=117 second=289 amount=-2 +kerning first=117 second=291 amount=-2 +kerning first=117 second=303 amount=-1 +kerning first=117 second=305 amount=-1 +kerning first=117 second=307 amount=-1 +kerning first=117 second=311 amount=-1 +kerning first=117 second=314 amount=-2 +kerning first=117 second=316 amount=-2 +kerning first=117 second=318 amount=-2 +kerning first=117 second=324 amount=-1 +kerning first=117 second=326 amount=-1 +kerning first=117 second=328 amount=-1 +kerning first=117 second=331 amount=-1 +kerning first=117 second=333 amount=-1 +kerning first=117 second=335 amount=-1 +kerning first=117 second=337 amount=-1 +kerning first=117 second=339 amount=-1 +kerning first=199 second=379 amount=-1 +kerning first=117 second=347 amount=-1 +kerning first=117 second=351 amount=-1 +kerning first=117 second=353 amount=-1 +kerning first=199 second=378 amount=-2 +kerning first=117 second=361 amount=-1 +kerning first=117 second=363 amount=-1 +kerning first=117 second=365 amount=-1 +kerning first=117 second=367 amount=-1 +kerning first=117 second=369 amount=-1 +kerning first=117 second=371 amount=-1 +kerning first=117 second=375 amount=-2 +kerning first=117 second=378 amount=-1 +kerning first=117 second=380 amount=-1 +kerning first=117 second=382 amount=-1 +kerning first=199 second=377 amount=-1 +kerning first=199 second=374 amount=-1 +kerning first=199 second=370 amount=-1 +kerning first=199 second=369 amount=-1 +kerning first=199 second=368 amount=-1 +kerning first=199 second=367 amount=-1 +kerning first=199 second=366 amount=-1 +kerning first=199 second=365 amount=-1 +kerning first=199 second=364 amount=-1 +kerning first=199 second=363 amount=-1 +kerning first=199 second=362 amount=-1 +kerning first=199 second=361 amount=-1 +kerning first=199 second=356 amount=-1 +kerning first=117 second=8217 amount=-2 +kerning first=117 second=8220 amount=-2 +kerning first=117 second=8221 amount=-2 +kerning first=117 second=8249 amount=-1 +kerning first=199 second=354 amount=-1 +kerning first=199 second=353 amount=-1 +kerning first=199 second=352 amount=-2 +kerning first=199 second=351 amount=-1 +kerning first=199 second=350 amount=-2 +kerning first=118 second=44 amount=-4 +kerning first=118 second=45 amount=-3 +kerning first=118 second=46 amount=-4 +kerning first=118 second=97 amount=-2 +kerning first=118 second=98 amount=-1 +kerning first=118 second=99 amount=-2 +kerning first=118 second=100 amount=-2 +kerning first=118 second=101 amount=-2 +kerning first=118 second=103 amount=-2 +kerning first=118 second=104 amount=-1 +kerning first=118 second=105 amount=-1 +kerning first=118 second=106 amount=-1 +kerning first=118 second=107 amount=-1 +kerning first=118 second=108 amount=-2 +kerning first=118 second=109 amount=-1 +kerning first=118 second=110 amount=-1 +kerning first=118 second=111 amount=-2 +kerning first=118 second=112 amount=-1 +kerning first=118 second=113 amount=-2 +kerning first=118 second=114 amount=-1 +kerning first=118 second=115 amount=-2 +kerning first=118 second=116 amount=-1 +kerning first=199 second=347 amount=-1 +kerning first=118 second=118 amount=-1 +kerning first=118 second=119 amount=-1 +kerning first=118 second=120 amount=-1 +kerning first=118 second=122 amount=-2 +kerning first=118 second=171 amount=-3 +kerning first=118 second=223 amount=-1 +kerning first=118 second=224 amount=-2 +kerning first=118 second=225 amount=-2 +kerning first=118 second=226 amount=-2 +kerning first=118 second=227 amount=-2 +kerning first=118 second=228 amount=-2 +kerning first=118 second=229 amount=-2 +kerning first=118 second=230 amount=-2 +kerning first=118 second=231 amount=-2 +kerning first=118 second=232 amount=-2 +kerning first=118 second=233 amount=-2 +kerning first=118 second=234 amount=-2 +kerning first=118 second=235 amount=-2 +kerning first=118 second=237 amount=-1 +kerning first=118 second=240 amount=-2 +kerning first=118 second=241 amount=-1 +kerning first=118 second=242 amount=-2 +kerning first=118 second=243 amount=-2 +kerning first=118 second=244 amount=-2 +kerning first=118 second=245 amount=-2 +kerning first=118 second=246 amount=-2 +kerning first=118 second=248 amount=-2 +kerning first=199 second=346 amount=-2 +kerning first=199 second=345 amount=-1 +kerning first=199 second=344 amount=-2 +kerning first=199 second=339 amount=-1 +kerning first=118 second=254 amount=-1 +kerning first=118 second=257 amount=-2 +kerning first=118 second=259 amount=-2 +kerning first=118 second=261 amount=-2 +kerning first=118 second=263 amount=-2 +kerning first=118 second=267 amount=-2 +kerning first=118 second=269 amount=-2 +kerning first=118 second=271 amount=-2 +kerning first=118 second=273 amount=-2 +kerning first=118 second=275 amount=-2 +kerning first=118 second=277 amount=-2 +kerning first=118 second=279 amount=-2 +kerning first=118 second=281 amount=-2 +kerning first=118 second=283 amount=-2 +kerning first=118 second=287 amount=-2 +kerning first=118 second=289 amount=-2 +kerning first=118 second=291 amount=-2 +kerning first=118 second=303 amount=-1 +kerning first=118 second=305 amount=-1 +kerning first=118 second=307 amount=-1 +kerning first=118 second=311 amount=-1 +kerning first=118 second=314 amount=-2 +kerning first=118 second=316 amount=-2 +kerning first=118 second=318 amount=-2 +kerning first=118 second=324 amount=-1 +kerning first=118 second=326 amount=-1 +kerning first=118 second=328 amount=-1 +kerning first=118 second=331 amount=-1 +kerning first=118 second=333 amount=-2 +kerning first=118 second=335 amount=-2 +kerning first=118 second=337 amount=-2 +kerning first=118 second=339 amount=-2 +kerning first=118 second=345 amount=-1 +kerning first=118 second=347 amount=-2 +kerning first=118 second=351 amount=-2 +kerning first=118 second=353 amount=-2 +kerning first=118 second=355 amount=-1 +kerning first=199 second=338 amount=-2 +kerning first=199 second=337 amount=-1 +kerning first=199 second=336 amount=-2 +kerning first=199 second=335 amount=-1 +kerning first=199 second=334 amount=-2 +kerning first=199 second=333 amount=-1 +kerning first=118 second=378 amount=-2 +kerning first=118 second=380 amount=-2 +kerning first=118 second=382 amount=-2 +kerning first=199 second=332 amount=-2 +kerning first=199 second=331 amount=-1 +kerning first=199 second=330 amount=-2 +kerning first=199 second=328 amount=-1 +kerning first=199 second=327 amount=-2 +kerning first=199 second=326 amount=-1 +kerning first=199 second=325 amount=-2 +kerning first=199 second=324 amount=-1 +kerning first=199 second=323 amount=-2 +kerning first=199 second=318 amount=-1 +kerning first=199 second=317 amount=-2 +kerning first=118 second=8249 amount=-3 +kerning first=119 second=44 amount=-4 +kerning first=119 second=45 amount=-3 +kerning first=119 second=46 amount=-4 +kerning first=119 second=97 amount=-2 +kerning first=119 second=98 amount=-1 +kerning first=119 second=99 amount=-2 +kerning first=119 second=100 amount=-2 +kerning first=119 second=101 amount=-2 +kerning first=119 second=103 amount=-2 +kerning first=119 second=104 amount=-1 +kerning first=119 second=105 amount=-1 +kerning first=119 second=106 amount=-1 +kerning first=119 second=107 amount=-1 +kerning first=119 second=108 amount=-2 +kerning first=119 second=109 amount=-1 +kerning first=119 second=110 amount=-1 +kerning first=119 second=111 amount=-2 +kerning first=119 second=112 amount=-1 +kerning first=119 second=113 amount=-2 +kerning first=119 second=114 amount=-1 +kerning first=119 second=115 amount=-2 +kerning first=119 second=116 amount=-1 +kerning first=199 second=316 amount=-1 +kerning first=119 second=118 amount=-1 +kerning first=119 second=119 amount=-1 +kerning first=119 second=120 amount=-1 +kerning first=119 second=122 amount=-2 +kerning first=119 second=171 amount=-3 +kerning first=119 second=223 amount=-1 +kerning first=119 second=224 amount=-2 +kerning first=119 second=225 amount=-2 +kerning first=119 second=226 amount=-2 +kerning first=119 second=227 amount=-2 +kerning first=119 second=228 amount=-2 +kerning first=119 second=229 amount=-2 +kerning first=119 second=230 amount=-2 +kerning first=119 second=231 amount=-2 +kerning first=119 second=232 amount=-2 +kerning first=119 second=233 amount=-2 +kerning first=119 second=234 amount=-2 +kerning first=119 second=235 amount=-2 +kerning first=119 second=237 amount=-1 +kerning first=119 second=240 amount=-2 +kerning first=119 second=241 amount=-1 +kerning first=119 second=242 amount=-2 +kerning first=119 second=243 amount=-2 +kerning first=119 second=244 amount=-2 +kerning first=119 second=245 amount=-2 +kerning first=119 second=246 amount=-2 +kerning first=119 second=248 amount=-2 +kerning first=199 second=315 amount=-2 +kerning first=199 second=314 amount=-1 +kerning first=199 second=313 amount=-2 +kerning first=199 second=311 amount=-1 +kerning first=119 second=254 amount=-1 +kerning first=119 second=257 amount=-2 +kerning first=119 second=259 amount=-2 +kerning first=119 second=261 amount=-2 +kerning first=119 second=263 amount=-2 +kerning first=119 second=267 amount=-2 +kerning first=119 second=269 amount=-2 +kerning first=119 second=271 amount=-2 +kerning first=119 second=273 amount=-2 +kerning first=119 second=275 amount=-2 +kerning first=119 second=277 amount=-2 +kerning first=119 second=279 amount=-2 +kerning first=119 second=281 amount=-2 +kerning first=119 second=283 amount=-2 +kerning first=119 second=287 amount=-2 +kerning first=119 second=289 amount=-2 +kerning first=119 second=291 amount=-2 +kerning first=119 second=303 amount=-1 +kerning first=119 second=305 amount=-1 +kerning first=119 second=307 amount=-1 +kerning first=119 second=311 amount=-1 +kerning first=119 second=314 amount=-2 +kerning first=119 second=316 amount=-2 +kerning first=119 second=318 amount=-2 +kerning first=119 second=324 amount=-1 +kerning first=119 second=326 amount=-1 +kerning first=119 second=328 amount=-1 +kerning first=119 second=331 amount=-1 +kerning first=119 second=333 amount=-2 +kerning first=119 second=335 amount=-2 +kerning first=119 second=337 amount=-2 +kerning first=119 second=339 amount=-2 +kerning first=119 second=345 amount=-1 +kerning first=119 second=347 amount=-2 +kerning first=119 second=351 amount=-2 +kerning first=119 second=353 amount=-2 +kerning first=119 second=355 amount=-1 +kerning first=199 second=310 amount=-2 +kerning first=199 second=305 amount=-1 +kerning first=199 second=304 amount=-2 +kerning first=199 second=303 amount=-1 +kerning first=199 second=302 amount=-2 +kerning first=199 second=298 amount=-2 +kerning first=119 second=378 amount=-2 +kerning first=119 second=380 amount=-2 +kerning first=119 second=382 amount=-2 +kerning first=199 second=296 amount=-2 +kerning first=199 second=291 amount=-2 +kerning first=199 second=290 amount=-2 +kerning first=199 second=289 amount=-2 +kerning first=199 second=288 amount=-2 +kerning first=199 second=287 amount=-2 +kerning first=199 second=286 amount=-2 +kerning first=199 second=284 amount=-2 +kerning first=199 second=283 amount=-1 +kerning first=199 second=282 amount=-2 +kerning first=199 second=281 amount=-1 +kerning first=119 second=8249 amount=-3 +kerning first=120 second=44 amount=-1 +kerning first=120 second=45 amount=-2 +kerning first=120 second=46 amount=-1 +kerning first=120 second=97 amount=-2 +kerning first=120 second=98 amount=-2 +kerning first=120 second=99 amount=-1 +kerning first=120 second=100 amount=-1 +kerning first=120 second=101 amount=-1 +kerning first=199 second=280 amount=-2 +kerning first=120 second=103 amount=-1 +kerning first=199 second=279 amount=-1 +kerning first=199 second=278 amount=-2 +kerning first=199 second=277 amount=-1 +kerning first=199 second=275 amount=-1 +kerning first=120 second=111 amount=-1 +kerning first=120 second=112 amount=-2 +kerning first=120 second=113 amount=-1 +kerning first=120 second=115 amount=-2 +kerning first=120 second=116 amount=-1 +kerning first=120 second=117 amount=-2 +kerning first=120 second=118 amount=-2 +kerning first=120 second=119 amount=-2 +kerning first=199 second=274 amount=-2 +kerning first=120 second=121 amount=-2 +kerning first=120 second=122 amount=-1 +kerning first=120 second=171 amount=-2 +kerning first=120 second=224 amount=-2 +kerning first=120 second=225 amount=-2 +kerning first=120 second=226 amount=-2 +kerning first=120 second=227 amount=-2 +kerning first=120 second=228 amount=-2 +kerning first=120 second=229 amount=-2 +kerning first=120 second=230 amount=-2 +kerning first=120 second=231 amount=-1 +kerning first=120 second=232 amount=-1 +kerning first=120 second=233 amount=-1 +kerning first=120 second=234 amount=-1 +kerning first=120 second=235 amount=-1 +kerning first=199 second=270 amount=-2 +kerning first=120 second=240 amount=-1 +kerning first=199 second=269 amount=-1 +kerning first=120 second=242 amount=-1 +kerning first=120 second=243 amount=-1 +kerning first=120 second=244 amount=-1 +kerning first=120 second=245 amount=-1 +kerning first=120 second=246 amount=-1 +kerning first=120 second=248 amount=-1 +kerning first=120 second=249 amount=-2 +kerning first=120 second=250 amount=-2 +kerning first=120 second=251 amount=-2 +kerning first=120 second=252 amount=-2 +kerning first=120 second=253 amount=-2 +kerning first=120 second=254 amount=-2 +kerning first=120 second=255 amount=-2 +kerning first=120 second=257 amount=-2 +kerning first=120 second=259 amount=-2 +kerning first=120 second=261 amount=-2 +kerning first=120 second=263 amount=-1 +kerning first=120 second=267 amount=-1 +kerning first=120 second=269 amount=-1 +kerning first=120 second=271 amount=-1 +kerning first=120 second=273 amount=-1 +kerning first=120 second=275 amount=-1 +kerning first=120 second=277 amount=-1 +kerning first=120 second=279 amount=-1 +kerning first=120 second=281 amount=-1 +kerning first=120 second=283 amount=-1 +kerning first=120 second=287 amount=-1 +kerning first=120 second=289 amount=-1 +kerning first=120 second=291 amount=-1 +kerning first=199 second=268 amount=-2 +kerning first=199 second=267 amount=-1 +kerning first=199 second=266 amount=-2 +kerning first=199 second=264 amount=-2 +kerning first=199 second=263 amount=-1 +kerning first=199 second=262 amount=-2 +kerning first=199 second=261 amount=-1 +kerning first=199 second=260 amount=-2 +kerning first=199 second=259 amount=-1 +kerning first=199 second=257 amount=-1 +kerning first=120 second=333 amount=-1 +kerning first=120 second=335 amount=-1 +kerning first=120 second=337 amount=-1 +kerning first=120 second=339 amount=-1 +kerning first=120 second=347 amount=-2 +kerning first=120 second=351 amount=-2 +kerning first=120 second=353 amount=-2 +kerning first=120 second=355 amount=-1 +kerning first=120 second=361 amount=-2 +kerning first=120 second=363 amount=-2 +kerning first=120 second=365 amount=-2 +kerning first=120 second=367 amount=-2 +kerning first=120 second=369 amount=-2 +kerning first=120 second=371 amount=-2 +kerning first=120 second=375 amount=-2 +kerning first=120 second=378 amount=-1 +kerning first=120 second=380 amount=-1 +kerning first=120 second=382 amount=-1 +kerning first=199 second=256 amount=-2 +kerning first=199 second=254 amount=-1 +kerning first=199 second=252 amount=-1 +kerning first=199 second=251 amount=-1 +kerning first=199 second=250 amount=-1 +kerning first=199 second=249 amount=-1 +kerning first=199 second=248 amount=-1 +kerning first=199 second=246 amount=-1 +kerning first=199 second=245 amount=-1 +kerning first=199 second=244 amount=-1 +kerning first=199 second=243 amount=-1 +kerning first=199 second=242 amount=-1 +kerning first=120 second=8217 amount=-1 +kerning first=120 second=8220 amount=-1 +kerning first=120 second=8221 amount=-1 +kerning first=120 second=8249 amount=-2 +kerning first=199 second=241 amount=-1 +kerning first=199 second=240 amount=-1 +kerning first=199 second=237 amount=-1 +kerning first=199 second=235 amount=-1 +kerning first=199 second=234 amount=-1 +kerning first=121 second=44 amount=-4 +kerning first=121 second=45 amount=-3 +kerning first=121 second=46 amount=-4 +kerning first=121 second=97 amount=-2 +kerning first=121 second=98 amount=-1 +kerning first=121 second=99 amount=-2 +kerning first=121 second=100 amount=-2 +kerning first=121 second=101 amount=-2 +kerning first=121 second=103 amount=-2 +kerning first=121 second=104 amount=-1 +kerning first=121 second=105 amount=-1 +kerning first=121 second=106 amount=-1 +kerning first=121 second=107 amount=-1 +kerning first=121 second=108 amount=-2 +kerning first=121 second=109 amount=-1 +kerning first=121 second=110 amount=-1 +kerning first=121 second=111 amount=-2 +kerning first=121 second=112 amount=-1 +kerning first=121 second=113 amount=-2 +kerning first=121 second=114 amount=-1 +kerning first=121 second=115 amount=-2 +kerning first=121 second=116 amount=-1 +kerning first=199 second=233 amount=-1 +kerning first=121 second=118 amount=-1 +kerning first=121 second=119 amount=-1 +kerning first=121 second=120 amount=-1 +kerning first=121 second=122 amount=-2 +kerning first=121 second=171 amount=-3 +kerning first=121 second=223 amount=-1 +kerning first=121 second=224 amount=-2 +kerning first=121 second=225 amount=-2 +kerning first=121 second=226 amount=-2 +kerning first=121 second=227 amount=-2 +kerning first=121 second=228 amount=-2 +kerning first=121 second=229 amount=-2 +kerning first=121 second=230 amount=-2 +kerning first=121 second=231 amount=-2 +kerning first=121 second=232 amount=-2 +kerning first=121 second=233 amount=-2 +kerning first=121 second=234 amount=-2 +kerning first=121 second=235 amount=-2 +kerning first=121 second=237 amount=-1 +kerning first=121 second=240 amount=-2 +kerning first=121 second=241 amount=-1 +kerning first=121 second=242 amount=-2 +kerning first=121 second=243 amount=-2 +kerning first=121 second=244 amount=-2 +kerning first=121 second=245 amount=-2 +kerning first=121 second=246 amount=-2 +kerning first=121 second=248 amount=-2 +kerning first=199 second=232 amount=-1 +kerning first=199 second=231 amount=-1 +kerning first=199 second=230 amount=-1 +kerning first=199 second=229 amount=-1 +kerning first=121 second=254 amount=-1 +kerning first=121 second=257 amount=-2 +kerning first=121 second=259 amount=-2 +kerning first=121 second=261 amount=-2 +kerning first=121 second=263 amount=-2 +kerning first=121 second=267 amount=-2 +kerning first=121 second=269 amount=-2 +kerning first=121 second=271 amount=-2 +kerning first=121 second=273 amount=-2 +kerning first=121 second=275 amount=-2 +kerning first=121 second=277 amount=-2 +kerning first=121 second=279 amount=-2 +kerning first=121 second=281 amount=-2 +kerning first=121 second=283 amount=-2 +kerning first=121 second=287 amount=-2 +kerning first=121 second=289 amount=-2 +kerning first=121 second=291 amount=-2 +kerning first=121 second=303 amount=-1 +kerning first=121 second=305 amount=-1 +kerning first=121 second=307 amount=-1 +kerning first=121 second=311 amount=-1 +kerning first=121 second=314 amount=-2 +kerning first=121 second=316 amount=-2 +kerning first=121 second=318 amount=-2 +kerning first=121 second=324 amount=-1 +kerning first=121 second=326 amount=-1 +kerning first=121 second=328 amount=-1 +kerning first=121 second=331 amount=-1 +kerning first=121 second=333 amount=-2 +kerning first=121 second=335 amount=-2 +kerning first=121 second=337 amount=-2 +kerning first=121 second=339 amount=-2 +kerning first=121 second=345 amount=-1 +kerning first=121 second=347 amount=-2 +kerning first=121 second=351 amount=-2 +kerning first=121 second=353 amount=-2 +kerning first=121 second=355 amount=-1 +kerning first=199 second=228 amount=-1 +kerning first=199 second=227 amount=-1 +kerning first=199 second=226 amount=-1 +kerning first=199 second=225 amount=-1 +kerning first=199 second=224 amount=-1 +kerning first=199 second=223 amount=-1 +kerning first=121 second=378 amount=-2 +kerning first=121 second=380 amount=-2 +kerning first=121 second=382 amount=-2 +kerning first=199 second=221 amount=-1 +kerning first=199 second=220 amount=-1 +kerning first=199 second=219 amount=-1 +kerning first=199 second=218 amount=-1 +kerning first=199 second=217 amount=-1 +kerning first=199 second=216 amount=-2 +kerning first=199 second=214 amount=-2 +kerning first=199 second=213 amount=-2 +kerning first=199 second=212 amount=-2 +kerning first=199 second=211 amount=-2 +kerning first=199 second=210 amount=-2 +kerning first=121 second=8249 amount=-3 +kerning first=122 second=44 amount=-1 +kerning first=122 second=45 amount=-2 +kerning first=122 second=46 amount=-1 +kerning first=122 second=97 amount=-1 +kerning first=122 second=98 amount=-1 +kerning first=122 second=99 amount=-1 +kerning first=122 second=100 amount=-1 +kerning first=122 second=101 amount=-1 +kerning first=122 second=102 amount=-1 +kerning first=122 second=103 amount=-1 +kerning first=122 second=104 amount=-1 +kerning first=122 second=105 amount=-1 +kerning first=122 second=106 amount=-1 +kerning first=122 second=107 amount=-1 +kerning first=122 second=108 amount=-1 +kerning first=122 second=109 amount=-1 +kerning first=122 second=110 amount=-1 +kerning first=122 second=111 amount=-1 +kerning first=122 second=112 amount=-2 +kerning first=122 second=113 amount=-1 +kerning first=122 second=115 amount=-1 +kerning first=122 second=116 amount=-1 +kerning first=122 second=117 amount=-1 +kerning first=122 second=118 amount=-1 +kerning first=122 second=119 amount=-1 +kerning first=122 second=120 amount=-1 +kerning first=122 second=121 amount=-1 +kerning first=122 second=122 amount=-1 +kerning first=122 second=171 amount=-2 +kerning first=122 second=224 amount=-1 +kerning first=122 second=225 amount=-1 +kerning first=122 second=226 amount=-1 +kerning first=122 second=227 amount=-1 +kerning first=122 second=228 amount=-1 +kerning first=122 second=229 amount=-1 +kerning first=122 second=230 amount=-1 +kerning first=122 second=231 amount=-1 +kerning first=122 second=232 amount=-1 +kerning first=122 second=233 amount=-1 +kerning first=122 second=234 amount=-1 +kerning first=122 second=235 amount=-1 +kerning first=122 second=237 amount=-1 +kerning first=122 second=240 amount=-1 +kerning first=122 second=241 amount=-1 +kerning first=122 second=242 amount=-1 +kerning first=122 second=243 amount=-1 +kerning first=122 second=244 amount=-1 +kerning first=122 second=245 amount=-1 +kerning first=122 second=246 amount=-1 +kerning first=122 second=248 amount=-1 +kerning first=122 second=249 amount=-1 +kerning first=122 second=250 amount=-1 +kerning first=122 second=251 amount=-1 +kerning first=122 second=252 amount=-1 +kerning first=122 second=253 amount=-1 +kerning first=122 second=254 amount=-1 +kerning first=122 second=255 amount=-1 +kerning first=122 second=257 amount=-1 +kerning first=122 second=259 amount=-1 +kerning first=122 second=261 amount=-1 +kerning first=122 second=263 amount=-1 +kerning first=122 second=267 amount=-1 +kerning first=122 second=269 amount=-1 +kerning first=122 second=271 amount=-1 +kerning first=122 second=273 amount=-1 +kerning first=122 second=275 amount=-1 +kerning first=122 second=277 amount=-1 +kerning first=122 second=279 amount=-1 +kerning first=122 second=281 amount=-1 +kerning first=122 second=283 amount=-1 +kerning first=122 second=287 amount=-1 +kerning first=122 second=289 amount=-1 +kerning first=122 second=291 amount=-1 +kerning first=122 second=303 amount=-1 +kerning first=122 second=305 amount=-1 +kerning first=122 second=307 amount=-1 +kerning first=122 second=311 amount=-1 +kerning first=122 second=314 amount=-1 +kerning first=122 second=316 amount=-1 +kerning first=122 second=318 amount=-1 +kerning first=122 second=324 amount=-1 +kerning first=122 second=326 amount=-1 +kerning first=122 second=328 amount=-1 +kerning first=122 second=331 amount=-1 +kerning first=122 second=333 amount=-1 +kerning first=122 second=335 amount=-1 +kerning first=122 second=337 amount=-1 +kerning first=122 second=339 amount=-1 +kerning first=122 second=347 amount=-1 +kerning first=122 second=351 amount=-1 +kerning first=122 second=353 amount=-1 +kerning first=122 second=355 amount=-1 +kerning first=122 second=361 amount=-1 +kerning first=122 second=363 amount=-1 +kerning first=122 second=365 amount=-1 +kerning first=122 second=367 amount=-1 +kerning first=122 second=369 amount=-1 +kerning first=122 second=371 amount=-1 +kerning first=122 second=375 amount=-1 +kerning first=122 second=378 amount=-1 +kerning first=122 second=380 amount=-1 +kerning first=122 second=382 amount=-1 +kerning first=199 second=209 amount=-2 +kerning first=199 second=207 amount=-2 +kerning first=199 second=206 amount=-2 +kerning first=199 second=205 amount=-2 +kerning first=199 second=204 amount=-2 +kerning first=199 second=203 amount=-2 +kerning first=199 second=202 amount=-2 +kerning first=199 second=201 amount=-2 +kerning first=199 second=200 amount=-2 +kerning first=199 second=199 amount=-2 +kerning first=199 second=198 amount=-2 +kerning first=199 second=197 amount=-2 +kerning first=199 second=196 amount=-2 +kerning first=122 second=8249 amount=-2 +kerning first=199 second=194 amount=-2 +kerning first=199 second=193 amount=-2 +kerning first=199 second=192 amount=-2 +kerning first=199 second=171 amount=-3 +kerning first=199 second=122 amount=-2 +kerning first=171 second=84 amount=-2 +kerning first=171 second=86 amount=-2 +kerning first=171 second=87 amount=-2 +kerning first=171 second=89 amount=-2 +kerning first=171 second=221 amount=-2 +kerning first=171 second=354 amount=-2 +kerning first=171 second=356 amount=-2 +kerning first=171 second=374 amount=-2 +kerning first=199 second=119 amount=-1 +kerning first=199 second=118 amount=-1 +kerning first=199 second=117 amount=-1 +kerning first=187 second=65 amount=-3 +kerning first=187 second=66 amount=-4 +kerning first=187 second=68 amount=-4 +kerning first=187 second=69 amount=-4 +kerning first=187 second=70 amount=-4 +kerning first=187 second=72 amount=-4 +kerning first=187 second=73 amount=-4 +kerning first=187 second=74 amount=-3 +kerning first=187 second=75 amount=-4 +kerning first=187 second=76 amount=-4 +kerning first=187 second=77 amount=-4 +kerning first=187 second=78 amount=-4 +kerning first=187 second=80 amount=-4 +kerning first=187 second=82 amount=-4 +kerning first=187 second=83 amount=-2 +kerning first=187 second=84 amount=-3 +kerning first=187 second=85 amount=-3 +kerning first=187 second=86 amount=-3 +kerning first=187 second=87 amount=-3 +kerning first=187 second=89 amount=-3 +kerning first=187 second=90 amount=-3 +kerning first=187 second=97 amount=-1 +kerning first=187 second=98 amount=-1 +kerning first=187 second=102 amount=-1 +kerning first=187 second=103 amount=-2 +kerning first=187 second=104 amount=-1 +kerning first=187 second=105 amount=-1 +kerning first=187 second=106 amount=-1 +kerning first=187 second=107 amount=-1 +kerning first=187 second=108 amount=-1 +kerning first=187 second=109 amount=-1 +kerning first=187 second=110 amount=-1 +kerning first=187 second=112 amount=-1 +kerning first=187 second=114 amount=-1 +kerning first=187 second=115 amount=-1 +kerning first=187 second=116 amount=-1 +kerning first=187 second=117 amount=-1 +kerning first=187 second=118 amount=-2 +kerning first=187 second=119 amount=-2 +kerning first=187 second=120 amount=-2 +kerning first=187 second=121 amount=-2 +kerning first=187 second=122 amount=-4 +kerning first=187 second=192 amount=-3 +kerning first=187 second=193 amount=-3 +kerning first=187 second=194 amount=-3 +kerning first=187 second=195 amount=-3 +kerning first=187 second=196 amount=-3 +kerning first=187 second=197 amount=-3 +kerning first=187 second=198 amount=-3 +kerning first=187 second=200 amount=-4 +kerning first=187 second=201 amount=-4 +kerning first=187 second=202 amount=-4 +kerning first=187 second=203 amount=-4 +kerning first=187 second=204 amount=-4 +kerning first=187 second=205 amount=-4 +kerning first=187 second=206 amount=-4 +kerning first=187 second=207 amount=-4 +kerning first=187 second=209 amount=-4 +kerning first=187 second=217 amount=-3 +kerning first=187 second=218 amount=-3 +kerning first=187 second=219 amount=-3 +kerning first=187 second=220 amount=-3 +kerning first=187 second=221 amount=-3 +kerning first=187 second=223 amount=-1 +kerning first=187 second=224 amount=-1 +kerning first=187 second=225 amount=-1 +kerning first=187 second=226 amount=-1 +kerning first=187 second=227 amount=-1 +kerning first=187 second=229 amount=-1 +kerning first=187 second=230 amount=-1 +kerning first=187 second=237 amount=-1 +kerning first=187 second=241 amount=-1 +kerning first=187 second=249 amount=-1 +kerning first=187 second=250 amount=-1 +kerning first=187 second=251 amount=-1 +kerning first=187 second=252 amount=-1 +kerning first=187 second=253 amount=-2 +kerning first=187 second=254 amount=-1 +kerning first=187 second=255 amount=-2 +kerning first=187 second=256 amount=-3 +kerning first=187 second=257 amount=-1 +kerning first=187 second=259 amount=-1 +kerning first=187 second=260 amount=-3 +kerning first=187 second=261 amount=-1 +kerning first=187 second=270 amount=-4 +kerning first=187 second=274 amount=-4 +kerning first=187 second=278 amount=-4 +kerning first=187 second=280 amount=-4 +kerning first=187 second=282 amount=-4 +kerning first=187 second=287 amount=-2 +kerning first=187 second=289 amount=-2 +kerning first=187 second=291 amount=-2 +kerning first=187 second=296 amount=-4 +kerning first=187 second=298 amount=-4 +kerning first=187 second=302 amount=-4 +kerning first=187 second=303 amount=-1 +kerning first=187 second=305 amount=-1 +kerning first=187 second=307 amount=-1 +kerning first=187 second=310 amount=-4 +kerning first=187 second=311 amount=-1 +kerning first=187 second=313 amount=-4 +kerning first=187 second=314 amount=-1 +kerning first=187 second=315 amount=-4 +kerning first=187 second=316 amount=-1 +kerning first=187 second=317 amount=-4 +kerning first=187 second=318 amount=-1 +kerning first=187 second=323 amount=-4 +kerning first=187 second=324 amount=-1 +kerning first=187 second=325 amount=-4 +kerning first=187 second=326 amount=-1 +kerning first=187 second=327 amount=-4 +kerning first=187 second=328 amount=-1 +kerning first=187 second=330 amount=-4 +kerning first=187 second=331 amount=-1 +kerning first=187 second=344 amount=-4 +kerning first=187 second=345 amount=-1 +kerning first=187 second=346 amount=-2 +kerning first=187 second=347 amount=-1 +kerning first=187 second=350 amount=-2 +kerning first=187 second=351 amount=-1 +kerning first=187 second=352 amount=-2 +kerning first=187 second=353 amount=-1 +kerning first=187 second=354 amount=-3 +kerning first=187 second=355 amount=-1 +kerning first=187 second=356 amount=-3 +kerning first=187 second=357 amount=-1 +kerning first=187 second=361 amount=-1 +kerning first=187 second=362 amount=-3 +kerning first=187 second=363 amount=-1 +kerning first=187 second=364 amount=-3 +kerning first=187 second=365 amount=-1 +kerning first=187 second=366 amount=-3 +kerning first=187 second=367 amount=-1 +kerning first=187 second=368 amount=-3 +kerning first=187 second=369 amount=-1 +kerning first=187 second=370 amount=-3 +kerning first=187 second=371 amount=-1 +kerning first=187 second=374 amount=-3 +kerning first=187 second=375 amount=-2 +kerning first=187 second=377 amount=-3 +kerning first=187 second=378 amount=-4 +kerning first=187 second=379 amount=-3 +kerning first=187 second=380 amount=-4 +kerning first=187 second=381 amount=-3 +kerning first=187 second=382 amount=-4 +kerning first=199 second=115 amount=-1 +kerning first=199 second=114 amount=-1 +kerning first=199 second=113 amount=-1 +kerning first=199 second=112 amount=-2 +kerning first=199 second=111 amount=-1 +kerning first=199 second=110 amount=-1 +kerning first=199 second=109 amount=-1 +kerning first=199 second=108 amount=-1 +kerning first=199 second=107 amount=-1 +kerning first=199 second=106 amount=-1 +kerning first=199 second=105 amount=-1 +kerning first=199 second=104 amount=-1 +kerning first=199 second=103 amount=-2 +kerning first=199 second=102 amount=-1 +kerning first=199 second=101 amount=-1 +kerning first=199 second=100 amount=-1 +kerning first=199 second=99 amount=-1 +kerning first=199 second=98 amount=-1 +kerning first=199 second=97 amount=-1 +kerning first=199 second=90 amount=-1 +kerning first=199 second=89 amount=-1 +kerning first=199 second=87 amount=-1 +kerning first=199 second=86 amount=-1 +kerning first=199 second=85 amount=-1 +kerning first=199 second=84 amount=-1 +kerning first=199 second=83 amount=-2 +kerning first=199 second=82 amount=-2 +kerning first=199 second=81 amount=-2 +kerning first=199 second=80 amount=-2 +kerning first=199 second=79 amount=-2 +kerning first=192 second=45 amount=-3 +kerning first=192 second=67 amount=-2 +kerning first=192 second=71 amount=-2 +kerning first=192 second=79 amount=-2 +kerning first=192 second=81 amount=-2 +kerning first=192 second=83 amount=-2 +kerning first=192 second=84 amount=-5 +kerning first=192 second=85 amount=-2 +kerning first=192 second=86 amount=-5 +kerning first=192 second=87 amount=-5 +kerning first=192 second=89 amount=-5 +kerning first=192 second=98 amount=-1 +kerning first=192 second=99 amount=-1 +kerning first=192 second=100 amount=-1 +kerning first=192 second=101 amount=-1 +kerning first=199 second=78 amount=-2 +kerning first=192 second=103 amount=-2 +kerning first=192 second=104 amount=-1 +kerning first=199 second=77 amount=-2 +kerning first=192 second=107 amount=-1 +kerning first=192 second=108 amount=-1 +kerning first=192 second=111 amount=-1 +kerning first=192 second=112 amount=-2 +kerning first=192 second=113 amount=-1 +kerning first=192 second=115 amount=-2 +kerning first=192 second=116 amount=-1 +kerning first=192 second=117 amount=-2 +kerning first=192 second=118 amount=-2 +kerning first=192 second=119 amount=-2 +kerning first=192 second=121 amount=-2 +kerning first=192 second=171 amount=-3 +kerning first=192 second=199 amount=-2 +kerning first=192 second=210 amount=-2 +kerning first=192 second=211 amount=-2 +kerning first=192 second=212 amount=-2 +kerning first=192 second=213 amount=-2 +kerning first=192 second=214 amount=-2 +kerning first=192 second=216 amount=-2 +kerning first=192 second=217 amount=-2 +kerning first=192 second=218 amount=-2 +kerning first=192 second=219 amount=-2 +kerning first=192 second=220 amount=-2 +kerning first=192 second=221 amount=-5 +kerning first=192 second=231 amount=-1 +kerning first=192 second=232 amount=-1 +kerning first=192 second=233 amount=-1 +kerning first=192 second=234 amount=-1 +kerning first=192 second=235 amount=-1 +kerning first=199 second=76 amount=-2 +kerning first=192 second=240 amount=-1 +kerning first=192 second=242 amount=-1 +kerning first=192 second=243 amount=-1 +kerning first=192 second=244 amount=-1 +kerning first=192 second=245 amount=-1 +kerning first=192 second=246 amount=-1 +kerning first=192 second=248 amount=-1 +kerning first=192 second=249 amount=-2 +kerning first=192 second=250 amount=-2 +kerning first=192 second=251 amount=-2 +kerning first=192 second=252 amount=-2 +kerning first=192 second=253 amount=-2 +kerning first=192 second=254 amount=-1 +kerning first=192 second=255 amount=-2 +kerning first=192 second=262 amount=-2 +kerning first=192 second=263 amount=-1 +kerning first=192 second=264 amount=-2 +kerning first=192 second=266 amount=-2 +kerning first=192 second=267 amount=-1 +kerning first=192 second=268 amount=-2 +kerning first=192 second=269 amount=-1 +kerning first=192 second=275 amount=-1 +kerning first=192 second=277 amount=-1 +kerning first=192 second=279 amount=-1 +kerning first=192 second=281 amount=-1 +kerning first=192 second=283 amount=-1 +kerning first=192 second=284 amount=-2 +kerning first=192 second=286 amount=-2 +kerning first=192 second=287 amount=-2 +kerning first=192 second=288 amount=-2 +kerning first=192 second=289 amount=-2 +kerning first=192 second=290 amount=-2 +kerning first=192 second=291 amount=-2 +kerning first=199 second=75 amount=-2 +kerning first=199 second=74 amount=-1 +kerning first=192 second=311 amount=-1 +kerning first=192 second=314 amount=-1 +kerning first=192 second=316 amount=-1 +kerning first=192 second=318 amount=-1 +kerning first=192 second=332 amount=-2 +kerning first=192 second=333 amount=-1 +kerning first=192 second=334 amount=-2 +kerning first=192 second=335 amount=-1 +kerning first=192 second=336 amount=-2 +kerning first=192 second=337 amount=-1 +kerning first=192 second=338 amount=-2 +kerning first=192 second=339 amount=-1 +kerning first=192 second=346 amount=-2 +kerning first=192 second=347 amount=-2 +kerning first=192 second=350 amount=-2 +kerning first=192 second=351 amount=-2 +kerning first=192 second=352 amount=-2 +kerning first=192 second=353 amount=-2 +kerning first=192 second=354 amount=-5 +kerning first=192 second=355 amount=-1 +kerning first=192 second=356 amount=-5 +kerning first=192 second=361 amount=-2 +kerning first=192 second=362 amount=-2 +kerning first=192 second=363 amount=-2 +kerning first=192 second=364 amount=-2 +kerning first=192 second=365 amount=-2 +kerning first=192 second=366 amount=-2 +kerning first=192 second=367 amount=-2 +kerning first=192 second=368 amount=-2 +kerning first=192 second=369 amount=-2 +kerning first=192 second=370 amount=-2 +kerning first=192 second=374 amount=-5 +kerning first=192 second=375 amount=-2 +kerning first=199 second=73 amount=-2 +kerning first=199 second=72 amount=-2 +kerning first=199 second=71 amount=-2 +kerning first=199 second=70 amount=-2 +kerning first=199 second=69 amount=-2 +kerning first=199 second=68 amount=-2 +kerning first=199 second=67 amount=-2 +kerning first=199 second=66 amount=-2 +kerning first=199 second=65 amount=-2 +kerning first=199 second=46 amount=-1 +kerning first=199 second=45 amount=-3 +kerning first=199 second=44 amount=-1 +kerning first=198 second=8249 amount=-1 +kerning first=198 second=382 amount=-1 +kerning first=198 second=381 amount=-1 +kerning first=192 second=8217 amount=-4 +kerning first=192 second=8220 amount=-4 +kerning first=192 second=8221 amount=-4 +kerning first=192 second=8249 amount=-3 +kerning first=198 second=380 amount=-1 +kerning first=198 second=379 amount=-1 +kerning first=198 second=378 amount=-1 +kerning first=198 second=377 amount=-1 +kerning first=198 second=374 amount=-1 +kerning first=193 second=45 amount=-3 +kerning first=193 second=67 amount=-2 +kerning first=193 second=71 amount=-2 +kerning first=193 second=79 amount=-2 +kerning first=193 second=81 amount=-2 +kerning first=193 second=83 amount=-2 +kerning first=193 second=84 amount=-5 +kerning first=193 second=85 amount=-2 +kerning first=193 second=86 amount=-5 +kerning first=193 second=87 amount=-5 +kerning first=193 second=89 amount=-5 +kerning first=193 second=98 amount=-1 +kerning first=193 second=99 amount=-1 +kerning first=193 second=100 amount=-1 +kerning first=193 second=101 amount=-1 +kerning first=198 second=370 amount=-1 +kerning first=193 second=103 amount=-2 +kerning first=193 second=104 amount=-1 +kerning first=198 second=369 amount=-1 +kerning first=193 second=107 amount=-1 +kerning first=193 second=108 amount=-1 +kerning first=193 second=111 amount=-1 +kerning first=193 second=112 amount=-2 +kerning first=193 second=113 amount=-1 +kerning first=193 second=115 amount=-2 +kerning first=193 second=116 amount=-1 +kerning first=193 second=117 amount=-2 +kerning first=193 second=118 amount=-2 +kerning first=193 second=119 amount=-2 +kerning first=193 second=121 amount=-2 +kerning first=193 second=171 amount=-3 +kerning first=193 second=199 amount=-2 +kerning first=193 second=210 amount=-2 +kerning first=193 second=211 amount=-2 +kerning first=193 second=212 amount=-2 +kerning first=193 second=213 amount=-2 +kerning first=193 second=214 amount=-2 +kerning first=193 second=216 amount=-2 +kerning first=193 second=217 amount=-2 +kerning first=193 second=218 amount=-2 +kerning first=193 second=219 amount=-2 +kerning first=193 second=220 amount=-2 +kerning first=193 second=221 amount=-5 +kerning first=193 second=231 amount=-1 +kerning first=193 second=232 amount=-1 +kerning first=193 second=233 amount=-1 +kerning first=193 second=234 amount=-1 +kerning first=193 second=235 amount=-1 +kerning first=198 second=368 amount=-1 +kerning first=193 second=240 amount=-1 +kerning first=193 second=242 amount=-1 +kerning first=193 second=243 amount=-1 +kerning first=193 second=244 amount=-1 +kerning first=193 second=245 amount=-1 +kerning first=193 second=246 amount=-1 +kerning first=193 second=248 amount=-1 +kerning first=193 second=249 amount=-2 +kerning first=193 second=250 amount=-2 +kerning first=193 second=251 amount=-2 +kerning first=193 second=252 amount=-2 +kerning first=193 second=253 amount=-2 +kerning first=193 second=254 amount=-1 +kerning first=193 second=255 amount=-2 +kerning first=193 second=262 amount=-2 +kerning first=193 second=263 amount=-1 +kerning first=193 second=264 amount=-2 +kerning first=193 second=266 amount=-2 +kerning first=193 second=267 amount=-1 +kerning first=193 second=268 amount=-2 +kerning first=193 second=269 amount=-1 +kerning first=193 second=275 amount=-1 +kerning first=193 second=277 amount=-1 +kerning first=193 second=279 amount=-1 +kerning first=193 second=281 amount=-1 +kerning first=193 second=283 amount=-1 +kerning first=193 second=284 amount=-2 +kerning first=193 second=286 amount=-2 +kerning first=193 second=287 amount=-2 +kerning first=193 second=288 amount=-2 +kerning first=193 second=289 amount=-2 +kerning first=193 second=290 amount=-2 +kerning first=193 second=291 amount=-2 +kerning first=198 second=367 amount=-1 +kerning first=198 second=366 amount=-1 +kerning first=193 second=311 amount=-1 +kerning first=193 second=314 amount=-1 +kerning first=193 second=316 amount=-1 +kerning first=193 second=318 amount=-1 +kerning first=193 second=332 amount=-2 +kerning first=193 second=333 amount=-1 +kerning first=193 second=334 amount=-2 +kerning first=193 second=335 amount=-1 +kerning first=193 second=336 amount=-2 +kerning first=193 second=337 amount=-1 +kerning first=193 second=338 amount=-2 +kerning first=193 second=339 amount=-1 +kerning first=193 second=346 amount=-2 +kerning first=193 second=347 amount=-2 +kerning first=193 second=350 amount=-2 +kerning first=193 second=351 amount=-2 +kerning first=193 second=352 amount=-2 +kerning first=193 second=353 amount=-2 +kerning first=193 second=354 amount=-5 +kerning first=193 second=355 amount=-1 +kerning first=193 second=356 amount=-5 +kerning first=193 second=361 amount=-2 +kerning first=193 second=362 amount=-2 +kerning first=193 second=363 amount=-2 +kerning first=193 second=364 amount=-2 +kerning first=193 second=365 amount=-2 +kerning first=193 second=366 amount=-2 +kerning first=193 second=367 amount=-2 +kerning first=193 second=368 amount=-2 +kerning first=193 second=369 amount=-2 +kerning first=193 second=370 amount=-2 +kerning first=193 second=374 amount=-5 +kerning first=193 second=375 amount=-2 +kerning first=198 second=365 amount=-1 +kerning first=198 second=364 amount=-1 +kerning first=198 second=363 amount=-1 +kerning first=198 second=362 amount=-1 +kerning first=198 second=361 amount=-1 +kerning first=198 second=356 amount=-1 +kerning first=198 second=354 amount=-1 +kerning first=198 second=353 amount=-1 +kerning first=198 second=352 amount=-1 +kerning first=198 second=351 amount=-1 +kerning first=198 second=350 amount=-1 +kerning first=198 second=347 amount=-1 +kerning first=198 second=346 amount=-1 +kerning first=198 second=344 amount=-1 +kerning first=198 second=338 amount=-1 +kerning first=193 second=8217 amount=-4 +kerning first=193 second=8220 amount=-4 +kerning first=193 second=8221 amount=-4 +kerning first=193 second=8249 amount=-3 +kerning first=198 second=336 amount=-1 +kerning first=198 second=334 amount=-1 +kerning first=198 second=332 amount=-1 +kerning first=198 second=331 amount=-1 +kerning first=198 second=330 amount=-1 +kerning first=194 second=45 amount=-3 +kerning first=194 second=67 amount=-2 +kerning first=194 second=71 amount=-2 +kerning first=194 second=79 amount=-2 +kerning first=194 second=81 amount=-2 +kerning first=194 second=83 amount=-2 +kerning first=194 second=84 amount=-5 +kerning first=194 second=85 amount=-2 +kerning first=194 second=86 amount=-5 +kerning first=194 second=87 amount=-5 +kerning first=194 second=89 amount=-5 +kerning first=194 second=98 amount=-1 +kerning first=194 second=99 amount=-1 +kerning first=194 second=100 amount=-1 +kerning first=194 second=101 amount=-1 +kerning first=198 second=328 amount=-1 +kerning first=194 second=103 amount=-2 +kerning first=194 second=104 amount=-1 +kerning first=198 second=327 amount=-1 +kerning first=194 second=107 amount=-1 +kerning first=194 second=108 amount=-1 +kerning first=194 second=111 amount=-1 +kerning first=194 second=112 amount=-2 +kerning first=194 second=113 amount=-1 +kerning first=194 second=115 amount=-2 +kerning first=194 second=116 amount=-1 +kerning first=194 second=117 amount=-2 +kerning first=194 second=118 amount=-2 +kerning first=194 second=119 amount=-2 +kerning first=194 second=121 amount=-2 +kerning first=194 second=171 amount=-3 +kerning first=194 second=199 amount=-2 +kerning first=194 second=210 amount=-2 +kerning first=194 second=211 amount=-2 +kerning first=194 second=212 amount=-2 +kerning first=194 second=213 amount=-2 +kerning first=194 second=214 amount=-2 +kerning first=194 second=216 amount=-2 +kerning first=194 second=217 amount=-2 +kerning first=194 second=218 amount=-2 +kerning first=194 second=219 amount=-2 +kerning first=194 second=220 amount=-2 +kerning first=194 second=221 amount=-5 +kerning first=194 second=231 amount=-1 +kerning first=194 second=232 amount=-1 +kerning first=194 second=233 amount=-1 +kerning first=194 second=234 amount=-1 +kerning first=194 second=235 amount=-1 +kerning first=198 second=326 amount=-1 +kerning first=194 second=240 amount=-1 +kerning first=194 second=242 amount=-1 +kerning first=194 second=243 amount=-1 +kerning first=194 second=244 amount=-1 +kerning first=194 second=245 amount=-1 +kerning first=194 second=246 amount=-1 +kerning first=194 second=248 amount=-1 +kerning first=194 second=249 amount=-2 +kerning first=194 second=250 amount=-2 +kerning first=194 second=251 amount=-2 +kerning first=194 second=252 amount=-2 +kerning first=194 second=253 amount=-2 +kerning first=194 second=254 amount=-1 +kerning first=194 second=255 amount=-2 +kerning first=194 second=262 amount=-2 +kerning first=194 second=263 amount=-1 +kerning first=194 second=264 amount=-2 +kerning first=194 second=266 amount=-2 +kerning first=194 second=267 amount=-1 +kerning first=194 second=268 amount=-2 +kerning first=194 second=269 amount=-1 +kerning first=194 second=275 amount=-1 +kerning first=194 second=277 amount=-1 +kerning first=194 second=279 amount=-1 +kerning first=194 second=281 amount=-1 +kerning first=194 second=283 amount=-1 +kerning first=194 second=284 amount=-2 +kerning first=194 second=286 amount=-2 +kerning first=194 second=287 amount=-2 +kerning first=194 second=288 amount=-2 +kerning first=194 second=289 amount=-2 +kerning first=194 second=290 amount=-2 +kerning first=194 second=291 amount=-2 +kerning first=198 second=325 amount=-1 +kerning first=198 second=324 amount=-1 +kerning first=194 second=311 amount=-1 +kerning first=194 second=314 amount=-1 +kerning first=194 second=316 amount=-1 +kerning first=194 second=318 amount=-1 +kerning first=194 second=332 amount=-2 +kerning first=194 second=333 amount=-1 +kerning first=194 second=334 amount=-2 +kerning first=194 second=335 amount=-1 +kerning first=194 second=336 amount=-2 +kerning first=194 second=337 amount=-1 +kerning first=194 second=338 amount=-2 +kerning first=194 second=339 amount=-1 +kerning first=194 second=346 amount=-2 +kerning first=194 second=347 amount=-2 +kerning first=194 second=350 amount=-2 +kerning first=194 second=351 amount=-2 +kerning first=194 second=352 amount=-2 +kerning first=194 second=353 amount=-2 +kerning first=194 second=354 amount=-5 +kerning first=194 second=355 amount=-1 +kerning first=194 second=356 amount=-5 +kerning first=194 second=361 amount=-2 +kerning first=194 second=362 amount=-2 +kerning first=194 second=363 amount=-2 +kerning first=194 second=364 amount=-2 +kerning first=194 second=365 amount=-2 +kerning first=194 second=366 amount=-2 +kerning first=194 second=367 amount=-2 +kerning first=194 second=368 amount=-2 +kerning first=194 second=369 amount=-2 +kerning first=194 second=370 amount=-2 +kerning first=194 second=374 amount=-5 +kerning first=194 second=375 amount=-2 +kerning first=198 second=323 amount=-1 +kerning first=198 second=318 amount=-1 +kerning first=198 second=317 amount=-1 +kerning first=198 second=316 amount=-1 +kerning first=198 second=315 amount=-1 +kerning first=198 second=314 amount=-1 +kerning first=198 second=313 amount=-1 +kerning first=198 second=311 amount=-1 +kerning first=198 second=310 amount=-1 +kerning first=198 second=304 amount=-1 +kerning first=198 second=302 amount=-1 +kerning first=198 second=298 amount=-1 +kerning first=198 second=296 amount=-1 +kerning first=198 second=291 amount=-2 +kerning first=198 second=290 amount=-1 +kerning first=194 second=8217 amount=-4 +kerning first=194 second=8220 amount=-4 +kerning first=194 second=8221 amount=-4 +kerning first=194 second=8249 amount=-3 +kerning first=198 second=289 amount=-2 +kerning first=198 second=288 amount=-1 +kerning first=198 second=287 amount=-2 +kerning first=198 second=286 amount=-1 +kerning first=198 second=284 amount=-1 +kerning first=195 second=45 amount=-3 +kerning first=195 second=67 amount=-2 +kerning first=195 second=71 amount=-2 +kerning first=195 second=79 amount=-2 +kerning first=195 second=81 amount=-2 +kerning first=195 second=83 amount=-2 +kerning first=195 second=84 amount=-5 +kerning first=195 second=85 amount=-2 +kerning first=195 second=86 amount=-5 +kerning first=195 second=87 amount=-5 +kerning first=195 second=89 amount=-5 +kerning first=195 second=98 amount=-1 +kerning first=195 second=99 amount=-1 +kerning first=195 second=100 amount=-1 +kerning first=195 second=101 amount=-1 +kerning first=198 second=282 amount=-1 +kerning first=195 second=103 amount=-2 +kerning first=195 second=104 amount=-1 +kerning first=198 second=280 amount=-1 +kerning first=195 second=107 amount=-1 +kerning first=195 second=108 amount=-1 +kerning first=195 second=111 amount=-1 +kerning first=195 second=112 amount=-2 +kerning first=195 second=113 amount=-1 +kerning first=195 second=115 amount=-2 +kerning first=195 second=116 amount=-1 +kerning first=195 second=117 amount=-2 +kerning first=195 second=118 amount=-2 +kerning first=195 second=119 amount=-2 +kerning first=195 second=121 amount=-2 +kerning first=195 second=171 amount=-3 +kerning first=195 second=199 amount=-2 +kerning first=195 second=210 amount=-2 +kerning first=195 second=211 amount=-2 +kerning first=195 second=212 amount=-2 +kerning first=195 second=213 amount=-2 +kerning first=195 second=214 amount=-2 +kerning first=195 second=216 amount=-2 +kerning first=195 second=217 amount=-2 +kerning first=195 second=218 amount=-2 +kerning first=195 second=219 amount=-2 +kerning first=195 second=220 amount=-2 +kerning first=195 second=221 amount=-5 +kerning first=195 second=231 amount=-1 +kerning first=195 second=232 amount=-1 +kerning first=195 second=233 amount=-1 +kerning first=195 second=234 amount=-1 +kerning first=195 second=235 amount=-1 +kerning first=198 second=278 amount=-1 +kerning first=195 second=240 amount=-1 +kerning first=195 second=242 amount=-1 +kerning first=195 second=243 amount=-1 +kerning first=195 second=244 amount=-1 +kerning first=195 second=245 amount=-1 +kerning first=195 second=246 amount=-1 +kerning first=195 second=248 amount=-1 +kerning first=195 second=249 amount=-2 +kerning first=195 second=250 amount=-2 +kerning first=195 second=251 amount=-2 +kerning first=195 second=252 amount=-2 +kerning first=195 second=253 amount=-2 +kerning first=195 second=254 amount=-1 +kerning first=195 second=255 amount=-2 +kerning first=195 second=262 amount=-2 +kerning first=195 second=263 amount=-1 +kerning first=195 second=264 amount=-2 +kerning first=195 second=266 amount=-2 +kerning first=195 second=267 amount=-1 +kerning first=195 second=268 amount=-2 +kerning first=195 second=269 amount=-1 +kerning first=195 second=275 amount=-1 +kerning first=195 second=277 amount=-1 +kerning first=195 second=279 amount=-1 +kerning first=195 second=281 amount=-1 +kerning first=195 second=283 amount=-1 +kerning first=195 second=284 amount=-2 +kerning first=195 second=286 amount=-2 +kerning first=195 second=287 amount=-2 +kerning first=195 second=288 amount=-2 +kerning first=195 second=289 amount=-2 +kerning first=195 second=290 amount=-2 +kerning first=195 second=291 amount=-2 +kerning first=198 second=274 amount=-1 +kerning first=198 second=270 amount=-1 +kerning first=195 second=311 amount=-1 +kerning first=195 second=314 amount=-1 +kerning first=195 second=316 amount=-1 +kerning first=195 second=318 amount=-1 +kerning first=195 second=332 amount=-2 +kerning first=195 second=333 amount=-1 +kerning first=195 second=334 amount=-2 +kerning first=195 second=335 amount=-1 +kerning first=195 second=336 amount=-2 +kerning first=195 second=337 amount=-1 +kerning first=195 second=338 amount=-2 +kerning first=195 second=339 amount=-1 +kerning first=195 second=346 amount=-2 +kerning first=195 second=347 amount=-2 +kerning first=195 second=350 amount=-2 +kerning first=195 second=351 amount=-2 +kerning first=195 second=352 amount=-2 +kerning first=195 second=353 amount=-2 +kerning first=195 second=354 amount=-5 +kerning first=195 second=355 amount=-1 +kerning first=195 second=356 amount=-5 +kerning first=195 second=361 amount=-2 +kerning first=195 second=362 amount=-2 +kerning first=195 second=363 amount=-2 +kerning first=195 second=364 amount=-2 +kerning first=195 second=365 amount=-2 +kerning first=195 second=366 amount=-2 +kerning first=195 second=367 amount=-2 +kerning first=195 second=368 amount=-2 +kerning first=195 second=369 amount=-2 +kerning first=195 second=370 amount=-2 +kerning first=195 second=374 amount=-5 +kerning first=195 second=375 amount=-2 +kerning first=198 second=268 amount=-1 +kerning first=198 second=266 amount=-1 +kerning first=198 second=264 amount=-1 +kerning first=198 second=262 amount=-1 +kerning first=198 second=261 amount=-1 +kerning first=198 second=260 amount=-1 +kerning first=198 second=259 amount=-1 +kerning first=198 second=257 amount=-1 +kerning first=198 second=256 amount=-1 +kerning first=198 second=254 amount=-1 +kerning first=198 second=252 amount=-1 +kerning first=198 second=251 amount=-1 +kerning first=198 second=250 amount=-1 +kerning first=198 second=249 amount=-1 +kerning first=198 second=241 amount=-1 +kerning first=195 second=8217 amount=-4 +kerning first=195 second=8220 amount=-4 +kerning first=195 second=8221 amount=-4 +kerning first=195 second=8249 amount=-3 +kerning first=198 second=230 amount=-1 +kerning first=198 second=229 amount=-1 +kerning first=198 second=228 amount=-1 +kerning first=198 second=227 amount=-1 +kerning first=198 second=226 amount=-1 +kerning first=196 second=45 amount=-3 +kerning first=196 second=67 amount=-2 +kerning first=196 second=71 amount=-2 +kerning first=196 second=79 amount=-2 +kerning first=196 second=81 amount=-2 +kerning first=196 second=83 amount=-2 +kerning first=196 second=84 amount=-5 +kerning first=196 second=85 amount=-2 +kerning first=196 second=86 amount=-5 +kerning first=196 second=87 amount=-5 +kerning first=196 second=89 amount=-5 +kerning first=196 second=98 amount=-1 +kerning first=196 second=99 amount=-1 +kerning first=196 second=100 amount=-1 +kerning first=196 second=101 amount=-1 +kerning first=198 second=225 amount=-1 +kerning first=196 second=103 amount=-2 +kerning first=196 second=104 amount=-1 +kerning first=198 second=224 amount=-1 +kerning first=196 second=107 amount=-1 +kerning first=196 second=108 amount=-1 +kerning first=196 second=111 amount=-1 +kerning first=196 second=112 amount=-2 +kerning first=196 second=113 amount=-1 +kerning first=196 second=115 amount=-2 +kerning first=196 second=116 amount=-1 +kerning first=196 second=117 amount=-2 +kerning first=196 second=118 amount=-2 +kerning first=196 second=119 amount=-2 +kerning first=196 second=121 amount=-2 +kerning first=196 second=171 amount=-3 +kerning first=196 second=199 amount=-2 +kerning first=196 second=210 amount=-2 +kerning first=196 second=211 amount=-2 +kerning first=196 second=212 amount=-2 +kerning first=196 second=213 amount=-2 +kerning first=196 second=214 amount=-2 +kerning first=196 second=216 amount=-2 +kerning first=196 second=217 amount=-2 +kerning first=196 second=218 amount=-2 +kerning first=196 second=219 amount=-2 +kerning first=196 second=220 amount=-2 +kerning first=196 second=221 amount=-5 +kerning first=196 second=231 amount=-1 +kerning first=196 second=232 amount=-1 +kerning first=196 second=233 amount=-1 +kerning first=196 second=234 amount=-1 +kerning first=196 second=235 amount=-1 +kerning first=198 second=223 amount=-1 +kerning first=196 second=240 amount=-1 +kerning first=196 second=242 amount=-1 +kerning first=196 second=243 amount=-1 +kerning first=196 second=244 amount=-1 +kerning first=196 second=245 amount=-1 +kerning first=196 second=246 amount=-1 +kerning first=196 second=248 amount=-1 +kerning first=196 second=249 amount=-2 +kerning first=196 second=250 amount=-2 +kerning first=196 second=251 amount=-2 +kerning first=196 second=252 amount=-2 +kerning first=196 second=253 amount=-2 +kerning first=196 second=254 amount=-1 +kerning first=196 second=255 amount=-2 +kerning first=196 second=262 amount=-2 +kerning first=196 second=263 amount=-1 +kerning first=196 second=264 amount=-2 +kerning first=196 second=266 amount=-2 +kerning first=196 second=267 amount=-1 +kerning first=196 second=268 amount=-2 +kerning first=196 second=269 amount=-1 +kerning first=196 second=275 amount=-1 +kerning first=196 second=277 amount=-1 +kerning first=196 second=279 amount=-1 +kerning first=196 second=281 amount=-1 +kerning first=196 second=283 amount=-1 +kerning first=196 second=284 amount=-2 +kerning first=196 second=286 amount=-2 +kerning first=196 second=287 amount=-2 +kerning first=196 second=288 amount=-2 +kerning first=196 second=289 amount=-2 +kerning first=196 second=290 amount=-2 +kerning first=196 second=291 amount=-2 +kerning first=198 second=221 amount=-1 +kerning first=198 second=220 amount=-1 +kerning first=196 second=311 amount=-1 +kerning first=196 second=314 amount=-1 +kerning first=196 second=316 amount=-1 +kerning first=196 second=318 amount=-1 +kerning first=196 second=332 amount=-2 +kerning first=196 second=333 amount=-1 +kerning first=196 second=334 amount=-2 +kerning first=196 second=335 amount=-1 +kerning first=196 second=336 amount=-2 +kerning first=196 second=337 amount=-1 +kerning first=196 second=338 amount=-2 +kerning first=196 second=339 amount=-1 +kerning first=196 second=346 amount=-2 +kerning first=196 second=347 amount=-2 +kerning first=196 second=350 amount=-2 +kerning first=196 second=351 amount=-2 +kerning first=196 second=352 amount=-2 +kerning first=196 second=353 amount=-2 +kerning first=196 second=354 amount=-5 +kerning first=196 second=355 amount=-1 +kerning first=196 second=356 amount=-5 +kerning first=196 second=361 amount=-2 +kerning first=196 second=362 amount=-2 +kerning first=196 second=363 amount=-2 +kerning first=196 second=364 amount=-2 +kerning first=196 second=365 amount=-2 +kerning first=196 second=366 amount=-2 +kerning first=196 second=367 amount=-2 +kerning first=196 second=368 amount=-2 +kerning first=196 second=369 amount=-2 +kerning first=196 second=370 amount=-2 +kerning first=196 second=374 amount=-5 +kerning first=196 second=375 amount=-2 +kerning first=198 second=219 amount=-1 +kerning first=198 second=218 amount=-1 +kerning first=198 second=217 amount=-1 +kerning first=198 second=216 amount=-1 +kerning first=198 second=214 amount=-1 +kerning first=198 second=213 amount=-1 +kerning first=198 second=212 amount=-1 +kerning first=198 second=211 amount=-1 +kerning first=198 second=210 amount=-1 +kerning first=198 second=209 amount=-1 +kerning first=198 second=207 amount=-1 +kerning first=198 second=206 amount=-1 +kerning first=198 second=205 amount=-1 +kerning first=198 second=204 amount=-1 +kerning first=198 second=203 amount=-1 +kerning first=196 second=8217 amount=-4 +kerning first=196 second=8220 amount=-4 +kerning first=196 second=8221 amount=-4 +kerning first=196 second=8249 amount=-3 +kerning first=198 second=202 amount=-1 +kerning first=198 second=201 amount=-1 +kerning first=198 second=200 amount=-1 +kerning first=198 second=199 amount=-1 +kerning first=198 second=198 amount=-1 +kerning first=197 second=45 amount=-3 +kerning first=197 second=67 amount=-2 +kerning first=197 second=71 amount=-2 +kerning first=197 second=79 amount=-2 +kerning first=197 second=81 amount=-2 +kerning first=197 second=83 amount=-2 +kerning first=197 second=84 amount=-5 +kerning first=197 second=85 amount=-2 +kerning first=197 second=86 amount=-5 +kerning first=197 second=87 amount=-5 +kerning first=197 second=89 amount=-5 +kerning first=197 second=98 amount=-1 +kerning first=197 second=99 amount=-1 +kerning first=197 second=100 amount=-1 +kerning first=197 second=101 amount=-1 +kerning first=198 second=197 amount=-1 +kerning first=197 second=103 amount=-2 +kerning first=197 second=104 amount=-1 +kerning first=198 second=196 amount=-1 +kerning first=197 second=107 amount=-1 +kerning first=197 second=108 amount=-1 +kerning first=197 second=111 amount=-1 +kerning first=197 second=112 amount=-2 +kerning first=197 second=113 amount=-1 +kerning first=197 second=115 amount=-2 +kerning first=197 second=116 amount=-1 +kerning first=197 second=117 amount=-2 +kerning first=197 second=118 amount=-2 +kerning first=197 second=119 amount=-2 +kerning first=197 second=121 amount=-2 +kerning first=197 second=171 amount=-3 +kerning first=197 second=199 amount=-2 +kerning first=197 second=210 amount=-2 +kerning first=197 second=211 amount=-2 +kerning first=197 second=212 amount=-2 +kerning first=197 second=213 amount=-2 +kerning first=197 second=214 amount=-2 +kerning first=197 second=216 amount=-2 +kerning first=197 second=217 amount=-2 +kerning first=197 second=218 amount=-2 +kerning first=197 second=219 amount=-2 +kerning first=197 second=220 amount=-2 +kerning first=197 second=221 amount=-5 +kerning first=197 second=231 amount=-1 +kerning first=197 second=232 amount=-1 +kerning first=197 second=233 amount=-1 +kerning first=197 second=234 amount=-1 +kerning first=197 second=235 amount=-1 +kerning first=198 second=194 amount=-1 +kerning first=197 second=240 amount=-1 +kerning first=197 second=242 amount=-1 +kerning first=197 second=243 amount=-1 +kerning first=197 second=244 amount=-1 +kerning first=197 second=245 amount=-1 +kerning first=197 second=246 amount=-1 +kerning first=197 second=248 amount=-1 +kerning first=197 second=249 amount=-2 +kerning first=197 second=250 amount=-2 +kerning first=197 second=251 amount=-2 +kerning first=197 second=252 amount=-2 +kerning first=197 second=253 amount=-2 +kerning first=197 second=254 amount=-1 +kerning first=197 second=255 amount=-2 +kerning first=197 second=262 amount=-2 +kerning first=197 second=263 amount=-1 +kerning first=197 second=264 amount=-2 +kerning first=197 second=266 amount=-2 +kerning first=197 second=267 amount=-1 +kerning first=197 second=268 amount=-2 +kerning first=197 second=269 amount=-1 +kerning first=197 second=275 amount=-1 +kerning first=197 second=277 amount=-1 +kerning first=197 second=279 amount=-1 +kerning first=197 second=281 amount=-1 +kerning first=197 second=283 amount=-1 +kerning first=197 second=284 amount=-2 +kerning first=197 second=286 amount=-2 +kerning first=197 second=287 amount=-2 +kerning first=197 second=288 amount=-2 +kerning first=197 second=289 amount=-2 +kerning first=197 second=290 amount=-2 +kerning first=197 second=291 amount=-2 +kerning first=198 second=193 amount=-1 +kerning first=198 second=192 amount=-1 +kerning first=197 second=311 amount=-1 +kerning first=197 second=314 amount=-1 +kerning first=197 second=316 amount=-1 +kerning first=197 second=318 amount=-1 +kerning first=197 second=332 amount=-2 +kerning first=197 second=333 amount=-1 +kerning first=197 second=334 amount=-2 +kerning first=197 second=335 amount=-1 +kerning first=197 second=336 amount=-2 +kerning first=197 second=337 amount=-1 +kerning first=197 second=338 amount=-2 +kerning first=197 second=339 amount=-1 +kerning first=197 second=346 amount=-2 +kerning first=197 second=347 amount=-2 +kerning first=197 second=350 amount=-2 +kerning first=197 second=351 amount=-2 +kerning first=197 second=352 amount=-2 +kerning first=197 second=353 amount=-2 +kerning first=197 second=354 amount=-5 +kerning first=197 second=355 amount=-1 +kerning first=197 second=356 amount=-5 +kerning first=197 second=361 amount=-2 +kerning first=197 second=362 amount=-2 +kerning first=197 second=363 amount=-2 +kerning first=197 second=364 amount=-2 +kerning first=197 second=365 amount=-2 +kerning first=197 second=366 amount=-2 +kerning first=197 second=367 amount=-2 +kerning first=197 second=368 amount=-2 +kerning first=197 second=369 amount=-2 +kerning first=197 second=370 amount=-2 +kerning first=197 second=374 amount=-5 +kerning first=197 second=375 amount=-2 +kerning first=198 second=171 amount=-1 +kerning first=198 second=122 amount=-1 +kerning first=198 second=120 amount=-1 +kerning first=198 second=119 amount=-1 +kerning first=198 second=118 amount=-1 +kerning first=198 second=117 amount=-1 +kerning first=198 second=115 amount=-1 +kerning first=198 second=112 amount=-1 +kerning first=198 second=110 amount=-1 +kerning first=198 second=109 amount=-1 +kerning first=198 second=108 amount=-1 +kerning first=198 second=107 amount=-1 +kerning first=198 second=104 amount=-1 +kerning first=198 second=103 amount=-2 +kerning first=198 second=102 amount=-1 +kerning first=197 second=8217 amount=-4 +kerning first=197 second=8220 amount=-4 +kerning first=197 second=8221 amount=-4 +kerning first=197 second=8249 amount=-3 +kerning first=198 second=98 amount=-1 +kerning first=198 second=97 amount=-1 +kerning first=198 second=90 amount=-1 +kerning first=198 second=89 amount=-1 +kerning first=198 second=87 amount=-1 +kerning first=198 second=44 amount=-1 +kerning first=198 second=45 amount=-1 +kerning first=198 second=46 amount=-1 +kerning first=198 second=65 amount=-1 +kerning first=198 second=66 amount=-1 +kerning first=198 second=67 amount=-1 +kerning first=198 second=68 amount=-1 +kerning first=198 second=69 amount=-1 +kerning first=198 second=70 amount=-1 +kerning first=198 second=71 amount=-1 +kerning first=198 second=72 amount=-1 +kerning first=198 second=73 amount=-1 +kerning first=198 second=74 amount=-1 +kerning first=198 second=75 amount=-1 +kerning first=198 second=76 amount=-1 +kerning first=198 second=77 amount=-1 +kerning first=198 second=78 amount=-1 +kerning first=198 second=79 amount=-1 +kerning first=198 second=80 amount=-1 +kerning first=198 second=81 amount=-1 +kerning first=198 second=82 amount=-1 +kerning first=198 second=83 amount=-1 +kerning first=198 second=84 amount=-1 +kerning first=198 second=85 amount=-1 +kerning first=198 second=86 amount=-1 diff --git a/jme3-examples/src/main/resources/jme3test/font/BM-FreeSerif64I_0.png b/jme3-examples/src/main/resources/jme3test/font/BM-FreeSerif64I_0.png new file mode 100644 index 000000000..50d479e03 Binary files /dev/null and b/jme3-examples/src/main/resources/jme3test/font/BM-FreeSerif64I_0.png differ diff --git a/jme3-examples/src/main/resources/jme3test/font/FT-FreeSerif16I.fnt b/jme3-examples/src/main/resources/jme3test/font/FT-FreeSerif16I.fnt new file mode 100644 index 000000000..41f96ff7a --- /dev/null +++ b/jme3-examples/src/main/resources/jme3test/font/FT-FreeSerif16I.fnt @@ -0,0 +1,18131 @@ +info face="Free Serif Italic" size=16 bold=0 italic=1 charset="" unicode=0 stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=0,0 +common lineHeight=22 base=16 scaleW=512 scaleH=512 pages=1 packed=0 +page id=0 file="FT-FreeSerif16I.png" +chars count=754 +char id=0 x=406 y=60 width=12 height=11 xoffset=1 yoffset=3 xadvance=11 page=0 chnl=0 +char id=13 x=83 y=0 width=15 height=15 xoffset=1 yoffset=1 xadvance=14 page=0 chnl=0 +char id=32 x=0 y=0 width=0 height=0 xoffset=0 yoffset=14 xadvance=4 page=0 chnl=0 +char id=33 x=235 y=84 width=5 height=10 xoffset=0 yoffset=4 xadvance=5 page=0 chnl=0 +char id=34 x=101 y=152 width=5 height=4 xoffset=2 yoffset=4 xadvance=7 page=0 chnl=0 +char id=35 x=418 y=60 width=9 height=11 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0 +char id=36 x=435 y=0 width=8 height=14 xoffset=0 yoffset=2 xadvance=8 page=0 chnl=0 +char id=37 x=427 y=60 width=12 height=11 xoffset=1 yoffset=3 xadvance=13 page=0 chnl=0 +char id=38 x=240 y=84 width=11 height=10 xoffset=1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=39 x=509 y=95 width=2 height=4 xoffset=2 yoffset=4 xadvance=3 page=0 chnl=0 +char id=40 x=443 y=0 width=6 height=14 xoffset=0 yoffset=3 xadvance=5 page=0 chnl=0 +char id=41 x=449 y=0 width=5 height=14 xoffset=0 yoffset=3 xadvance=5 page=0 chnl=0 +char id=42 x=481 y=135 width=6 height=7 xoffset=2 yoffset=4 xadvance=8 page=0 chnl=0 +char id=43 x=295 y=135 width=9 height=8 xoffset=1 yoffset=6 xadvance=11 page=0 chnl=0 +char id=44 x=106 y=152 width=4 height=4 xoffset=-1 yoffset=12 xadvance=4 page=0 chnl=0 +char id=45 x=242 y=152 width=5 height=1 xoffset=0 yoffset=10 xadvance=5 page=0 chnl=0 +char id=46 x=210 y=152 width=3 height=2 xoffset=0 yoffset=12 xadvance=4 page=0 chnl=0 +char id=47 x=439 y=60 width=9 height=11 xoffset=-2 yoffset=3 xadvance=4 page=0 chnl=0 +char id=48 x=448 y=60 width=8 height=11 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0 +char id=49 x=456 y=60 width=7 height=11 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0 +char id=50 x=463 y=60 width=8 height=11 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0 +char id=51 x=471 y=60 width=8 height=11 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0 +char id=52 x=479 y=60 width=8 height=11 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0 +char id=53 x=487 y=60 width=8 height=11 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0 +char id=54 x=495 y=60 width=9 height=11 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0 +char id=55 x=0 y=73 width=8 height=11 xoffset=1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=56 x=8 y=73 width=8 height=11 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0 +char id=57 x=16 y=73 width=8 height=11 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0 +char id=58 x=487 y=135 width=5 height=7 xoffset=0 yoffset=7 xadvance=5 page=0 chnl=0 +char id=59 x=186 y=135 width=5 height=9 xoffset=0 yoffset=7 xadvance=5 page=0 chnl=0 +char id=60 x=251 y=84 width=9 height=10 xoffset=1 yoffset=5 xadvance=11 page=0 chnl=0 +char id=61 x=22 y=152 width=9 height=5 xoffset=1 yoffset=8 xadvance=11 page=0 chnl=0 +char id=62 x=260 y=84 width=9 height=10 xoffset=1 yoffset=5 xadvance=11 page=0 chnl=0 +char id=63 x=269 y=84 width=6 height=10 xoffset=2 yoffset=4 xadvance=8 page=0 chnl=0 +char id=64 x=275 y=84 width=12 height=10 xoffset=1 yoffset=4 xadvance=15 page=0 chnl=0 +char id=65 x=24 y=73 width=11 height=11 xoffset=-1 yoffset=3 xadvance=10 page=0 chnl=0 +char id=66 x=287 y=84 width=11 height=10 xoffset=-1 yoffset=4 xadvance=10 page=0 chnl=0 +char id=67 x=298 y=84 width=11 height=10 xoffset=1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=68 x=309 y=84 width=13 height=10 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=69 x=322 y=84 width=12 height=10 xoffset=-1 yoffset=4 xadvance=10 page=0 chnl=0 +char id=70 x=334 y=84 width=12 height=10 xoffset=-1 yoffset=4 xadvance=10 page=0 chnl=0 +char id=71 x=346 y=84 width=12 height=10 xoffset=0 yoffset=4 xadvance=12 page=0 chnl=0 +char id=72 x=358 y=84 width=14 height=10 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=73 x=372 y=84 width=8 height=10 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=74 x=380 y=84 width=9 height=10 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=75 x=389 y=84 width=13 height=10 xoffset=-1 yoffset=4 xadvance=10 page=0 chnl=0 +char id=76 x=402 y=84 width=10 height=10 xoffset=-1 yoffset=4 xadvance=9 page=0 chnl=0 +char id=77 x=412 y=84 width=15 height=10 xoffset=-1 yoffset=4 xadvance=13 page=0 chnl=0 +char id=78 x=427 y=84 width=13 height=10 xoffset=-1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=79 x=440 y=84 width=12 height=10 xoffset=0 yoffset=4 xadvance=12 page=0 chnl=0 +char id=80 x=452 y=84 width=11 height=10 xoffset=-1 yoffset=4 xadvance=10 page=0 chnl=0 +char id=81 x=348 y=33 width=12 height=13 xoffset=0 yoffset=4 xadvance=12 page=0 chnl=0 +char id=82 x=463 y=84 width=11 height=10 xoffset=-1 yoffset=4 xadvance=10 page=0 chnl=0 +char id=83 x=474 y=84 width=9 height=10 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=84 x=483 y=84 width=11 height=10 xoffset=0 yoffset=4 xadvance=9 page=0 chnl=0 +char id=85 x=494 y=84 width=12 height=10 xoffset=1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=86 x=0 y=95 width=11 height=10 xoffset=1 yoffset=4 xadvance=10 page=0 chnl=0 +char id=87 x=11 y=95 width=14 height=10 xoffset=1 yoffset=4 xadvance=13 page=0 chnl=0 +char id=88 x=25 y=95 width=12 height=10 xoffset=-1 yoffset=4 xadvance=10 page=0 chnl=0 +char id=89 x=37 y=95 width=10 height=10 xoffset=1 yoffset=4 xadvance=9 page=0 chnl=0 +char id=90 x=47 y=95 width=11 height=10 xoffset=-1 yoffset=4 xadvance=9 page=0 chnl=0 +char id=91 x=360 y=33 width=7 height=13 xoffset=0 yoffset=3 xadvance=6 page=0 chnl=0 +char id=92 x=504 y=60 width=7 height=11 xoffset=-1 yoffset=3 xadvance=4 page=0 chnl=0 +char id=93 x=367 y=33 width=7 height=13 xoffset=0 yoffset=3 xadvance=6 page=0 chnl=0 +char id=94 x=497 y=145 width=7 height=6 xoffset=0 yoffset=3 xadvance=7 page=0 chnl=0 +char id=95 x=247 y=152 width=8 height=1 xoffset=0 yoffset=15 xadvance=8 page=0 chnl=0 +char id=96 x=162 y=152 width=3 height=3 xoffset=6 yoffset=3 xadvance=5 page=0 chnl=0 +char id=97 x=492 y=135 width=8 height=7 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=0 +char id=98 x=130 y=60 width=8 height=12 xoffset=0 yoffset=2 xadvance=8 page=0 chnl=0 +char id=99 x=500 y=135 width=7 height=7 xoffset=0 yoffset=7 xadvance=7 page=0 chnl=0 +char id=100 x=138 y=60 width=9 height=12 xoffset=0 yoffset=2 xadvance=8 page=0 chnl=0 +char id=101 x=0 y=145 width=7 height=7 xoffset=0 yoffset=7 xadvance=7 page=0 chnl=0 +char id=102 x=454 y=0 width=10 height=14 xoffset=-3 yoffset=3 xadvance=4 page=0 chnl=0 +char id=103 x=58 y=95 width=8 height=10 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=0 +char id=104 x=147 y=60 width=8 height=12 xoffset=0 yoffset=2 xadvance=8 page=0 chnl=0 +char id=105 x=506 y=84 width=5 height=10 xoffset=0 yoffset=4 xadvance=4 page=0 chnl=0 +char id=106 x=374 y=33 width=7 height=13 xoffset=-2 yoffset=4 xadvance=4 page=0 chnl=0 +char id=107 x=155 y=60 width=8 height=12 xoffset=0 yoffset=2 xadvance=7 page=0 chnl=0 +char id=108 x=163 y=60 width=5 height=12 xoffset=0 yoffset=2 xadvance=4 page=0 chnl=0 +char id=109 x=7 y=145 width=12 height=7 xoffset=0 yoffset=7 xadvance=12 page=0 chnl=0 +char id=110 x=19 y=145 width=8 height=7 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=0 +char id=111 x=27 y=145 width=8 height=7 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=0 +char id=112 x=66 y=95 width=10 height=10 xoffset=-2 yoffset=7 xadvance=8 page=0 chnl=0 +char id=113 x=76 y=95 width=8 height=10 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=0 +char id=114 x=35 y=145 width=7 height=7 xoffset=0 yoffset=7 xadvance=6 page=0 chnl=0 +char id=115 x=42 y=145 width=6 height=7 xoffset=0 yoffset=7 xadvance=6 page=0 chnl=0 +char id=116 x=191 y=135 width=5 height=9 xoffset=0 yoffset=5 xadvance=4 page=0 chnl=0 +char id=117 x=304 y=135 width=8 height=8 xoffset=0 yoffset=6 xadvance=8 page=0 chnl=0 +char id=118 x=48 y=145 width=7 height=7 xoffset=0 yoffset=7 xadvance=7 page=0 chnl=0 +char id=119 x=55 y=145 width=11 height=7 xoffset=0 yoffset=7 xadvance=11 page=0 chnl=0 +char id=120 x=66 y=145 width=9 height=7 xoffset=-1 yoffset=7 xadvance=7 page=0 chnl=0 +char id=121 x=84 y=95 width=8 height=10 xoffset=-1 yoffset=7 xadvance=7 page=0 chnl=0 +char id=122 x=196 y=135 width=8 height=9 xoffset=-1 yoffset=7 xadvance=6 page=0 chnl=0 +char id=123 x=464 y=0 width=7 height=14 xoffset=0 yoffset=3 xadvance=6 page=0 chnl=0 +char id=124 x=508 y=47 width=2 height=11 xoffset=1 yoffset=3 xadvance=4 page=0 chnl=0 +char id=125 x=471 y=0 width=7 height=14 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=126 x=165 y=152 width=9 height=3 xoffset=0 yoffset=9 xadvance=9 page=0 chnl=0 +char id=160 x=0 y=0 width=0 height=0 xoffset=0 yoffset=14 xadvance=4 page=0 chnl=0 +char id=161 x=35 y=73 width=6 height=11 xoffset=0 yoffset=6 xadvance=6 page=0 chnl=0 +char id=162 x=41 y=73 width=7 height=11 xoffset=1 yoffset=5 xadvance=8 page=0 chnl=0 +char id=163 x=48 y=73 width=9 height=11 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0 +char id=164 x=204 y=135 width=10 height=9 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=165 x=92 y=95 width=10 height=10 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=166 x=57 y=73 width=2 height=11 xoffset=1 yoffset=3 xadvance=4 page=0 chnl=0 +char id=167 x=381 y=33 width=8 height=13 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=168 x=213 y=152 width=6 height=2 xoffset=1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=169 x=59 y=73 width=12 height=11 xoffset=0 yoffset=3 xadvance=12 page=0 chnl=0 +char id=170 x=31 y=152 width=6 height=5 xoffset=0 yoffset=3 xadvance=4 page=0 chnl=0 +char id=171 x=0 y=152 width=8 height=6 xoffset=0 yoffset=8 xadvance=7 page=0 chnl=0 +char id=172 x=37 y=152 width=9 height=5 xoffset=1 yoffset=8 xadvance=11 page=0 chnl=0 +char id=173 x=242 y=152 width=5 height=1 xoffset=0 yoffset=10 xadvance=5 page=0 chnl=0 +char id=174 x=71 y=73 width=12 height=11 xoffset=0 yoffset=3 xadvance=12 page=0 chnl=0 +char id=175 x=255 y=152 width=6 height=1 xoffset=1 yoffset=5 xadvance=5 page=0 chnl=0 +char id=176 x=46 y=152 width=6 height=5 xoffset=1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=177 x=214 y=135 width=9 height=9 xoffset=1 yoffset=5 xadvance=11 page=0 chnl=0 +char id=178 x=75 y=145 width=6 height=7 xoffset=1 yoffset=3 xadvance=5 page=0 chnl=0 +char id=179 x=81 y=145 width=5 height=7 xoffset=2 yoffset=3 xadvance=5 page=0 chnl=0 +char id=180 x=174 y=152 width=5 height=3 xoffset=2 yoffset=3 xadvance=5 page=0 chnl=0 +char id=181 x=102 y=95 width=9 height=10 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=0 +char id=182 x=389 y=33 width=10 height=13 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=183 x=509 y=105 width=2 height=2 xoffset=2 yoffset=9 xadvance=4 page=0 chnl=0 +char id=184 x=110 y=152 width=4 height=4 xoffset=-1 yoffset=14 xadvance=5 page=0 chnl=0 +char id=185 x=86 y=145 width=5 height=7 xoffset=1 yoffset=3 xadvance=4 page=0 chnl=0 +char id=186 x=52 y=152 width=5 height=5 xoffset=1 yoffset=3 xadvance=5 page=0 chnl=0 +char id=187 x=504 y=145 width=7 height=6 xoffset=0 yoffset=7 xadvance=7 page=0 chnl=0 +char id=188 x=168 y=60 width=12 height=12 xoffset=1 yoffset=3 xadvance=12 page=0 chnl=0 +char id=189 x=83 y=73 width=12 height=11 xoffset=1 yoffset=3 xadvance=12 page=0 chnl=0 +char id=190 x=95 y=73 width=12 height=11 xoffset=1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=191 x=107 y=73 width=6 height=11 xoffset=0 yoffset=6 xadvance=8 page=0 chnl=0 +char id=192 x=478 y=0 width=11 height=14 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=193 x=489 y=0 width=11 height=14 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=194 x=500 y=0 width=11 height=14 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=195 x=399 y=33 width=11 height=13 xoffset=-1 yoffset=1 xadvance=10 page=0 chnl=0 +char id=196 x=410 y=33 width=11 height=13 xoffset=-1 yoffset=1 xadvance=10 page=0 chnl=0 +char id=197 x=98 y=0 width=11 height=15 xoffset=-1 yoffset=-1 xadvance=10 page=0 chnl=0 +char id=198 x=111 y=95 width=16 height=10 xoffset=-1 yoffset=4 xadvance=14 page=0 chnl=0 +char id=199 x=421 y=33 width=11 height=13 xoffset=1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=200 x=0 y=19 width=12 height=14 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=201 x=12 y=19 width=12 height=14 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=202 x=24 y=19 width=12 height=14 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=203 x=432 y=33 width=12 height=13 xoffset=-1 yoffset=1 xadvance=10 page=0 chnl=0 +char id=204 x=36 y=19 width=8 height=14 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=205 x=44 y=19 width=8 height=14 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=206 x=52 y=19 width=9 height=14 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=207 x=444 y=33 width=8 height=13 xoffset=-1 yoffset=1 xadvance=5 page=0 chnl=0 +char id=208 x=127 y=95 width=13 height=10 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=209 x=61 y=19 width=13 height=14 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=210 x=109 y=0 width=12 height=15 xoffset=0 yoffset=-1 xadvance=12 page=0 chnl=0 +char id=211 x=74 y=19 width=12 height=14 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=212 x=121 y=0 width=12 height=15 xoffset=0 yoffset=-1 xadvance=12 page=0 chnl=0 +char id=213 x=452 y=33 width=12 height=13 xoffset=0 yoffset=1 xadvance=12 page=0 chnl=0 +char id=214 x=464 y=33 width=12 height=13 xoffset=0 yoffset=1 xadvance=12 page=0 chnl=0 +char id=215 x=312 y=135 width=9 height=8 xoffset=1 yoffset=6 xadvance=11 page=0 chnl=0 +char id=216 x=86 y=19 width=12 height=14 xoffset=0 yoffset=2 xadvance=12 page=0 chnl=0 +char id=217 x=133 y=0 width=12 height=15 xoffset=1 yoffset=-1 xadvance=12 page=0 chnl=0 +char id=218 x=98 y=19 width=12 height=14 xoffset=1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=219 x=145 y=0 width=12 height=15 xoffset=1 yoffset=-1 xadvance=12 page=0 chnl=0 +char id=220 x=476 y=33 width=12 height=13 xoffset=1 yoffset=1 xadvance=12 page=0 chnl=0 +char id=221 x=110 y=19 width=10 height=14 xoffset=1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=222 x=140 y=95 width=10 height=10 xoffset=0 yoffset=4 xadvance=10 page=0 chnl=0 +char id=223 x=120 y=19 width=11 height=14 xoffset=-3 yoffset=3 xadvance=8 page=0 chnl=0 +char id=224 x=113 y=73 width=8 height=11 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0 +char id=225 x=150 y=95 width=8 height=10 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=226 x=121 y=73 width=8 height=11 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0 +char id=227 x=158 y=95 width=9 height=10 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=228 x=167 y=95 width=8 height=10 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=229 x=180 y=60 width=8 height=12 xoffset=0 yoffset=2 xadvance=8 page=0 chnl=0 +char id=230 x=91 y=145 width=11 height=7 xoffset=0 yoffset=7 xadvance=11 page=0 chnl=0 +char id=231 x=175 y=95 width=7 height=10 xoffset=0 yoffset=7 xadvance=7 page=0 chnl=0 +char id=232 x=129 y=73 width=7 height=11 xoffset=0 yoffset=3 xadvance=7 page=0 chnl=0 +char id=233 x=182 y=95 width=9 height=10 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=0 +char id=234 x=136 y=73 width=8 height=11 xoffset=0 yoffset=3 xadvance=7 page=0 chnl=0 +char id=235 x=191 y=95 width=8 height=10 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=0 +char id=236 x=144 y=73 width=5 height=11 xoffset=0 yoffset=3 xadvance=4 page=0 chnl=0 +char id=237 x=199 y=95 width=6 height=10 xoffset=0 yoffset=4 xadvance=4 page=0 chnl=0 +char id=238 x=149 y=73 width=6 height=11 xoffset=0 yoffset=3 xadvance=4 page=0 chnl=0 +char id=239 x=205 y=95 width=6 height=10 xoffset=0 yoffset=4 xadvance=4 page=0 chnl=0 +char id=240 x=155 y=73 width=8 height=11 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0 +char id=241 x=211 y=95 width=9 height=10 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=242 x=163 y=73 width=8 height=11 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0 +char id=243 x=220 y=95 width=8 height=10 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=244 x=171 y=73 width=8 height=11 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0 +char id=245 x=228 y=95 width=9 height=10 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=246 x=237 y=95 width=8 height=10 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=247 x=321 y=135 width=9 height=8 xoffset=1 yoffset=6 xadvance=11 page=0 chnl=0 +char id=248 x=179 y=73 width=8 height=11 xoffset=0 yoffset=5 xadvance=8 page=0 chnl=0 +char id=249 x=187 y=73 width=8 height=11 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0 +char id=250 x=245 y=95 width=8 height=10 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=251 x=195 y=73 width=8 height=11 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0 +char id=252 x=253 y=95 width=8 height=10 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=253 x=488 y=33 width=9 height=13 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=254 x=157 y=0 width=10 height=15 xoffset=-2 yoffset=2 xadvance=8 page=0 chnl=0 +char id=255 x=497 y=33 width=9 height=13 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=256 x=0 y=47 width=11 height=13 xoffset=-1 yoffset=1 xadvance=10 page=0 chnl=0 +char id=257 x=261 y=95 width=8 height=10 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=258 x=131 y=19 width=11 height=14 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=259 x=203 y=73 width=8 height=11 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0 +char id=260 x=142 y=19 width=13 height=14 xoffset=-1 yoffset=3 xadvance=10 page=0 chnl=0 +char id=261 x=269 y=95 width=8 height=10 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=0 +char id=262 x=155 y=19 width=11 height=14 xoffset=1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=263 x=277 y=95 width=8 height=10 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=0 +char id=264 x=167 y=0 width=11 height=15 xoffset=1 yoffset=-1 xadvance=11 page=0 chnl=0 +char id=265 x=211 y=73 width=8 height=11 xoffset=0 yoffset=3 xadvance=7 page=0 chnl=0 +char id=266 x=166 y=19 width=11 height=14 xoffset=1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=267 x=285 y=95 width=7 height=10 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=0 +char id=268 x=178 y=0 width=11 height=15 xoffset=1 yoffset=-1 xadvance=11 page=0 chnl=0 +char id=269 x=219 y=73 width=9 height=11 xoffset=0 yoffset=3 xadvance=7 page=0 chnl=0 +char id=270 x=177 y=19 width=13 height=14 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=271 x=228 y=73 width=12 height=11 xoffset=0 yoffset=3 xadvance=10 page=0 chnl=0 +char id=272 x=127 y=95 width=13 height=10 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=273 x=188 y=60 width=9 height=12 xoffset=0 yoffset=2 xadvance=8 page=0 chnl=0 +char id=274 x=11 y=47 width=12 height=13 xoffset=-1 yoffset=1 xadvance=10 page=0 chnl=0 +char id=275 x=223 y=135 width=8 height=9 xoffset=0 yoffset=5 xadvance=7 page=0 chnl=0 +char id=276 x=190 y=19 width=12 height=14 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=277 x=240 y=73 width=9 height=11 xoffset=0 yoffset=3 xadvance=7 page=0 chnl=0 +char id=278 x=23 y=47 width=12 height=13 xoffset=-1 yoffset=1 xadvance=10 page=0 chnl=0 +char id=279 x=292 y=95 width=7 height=10 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=0 +char id=280 x=35 y=47 width=12 height=13 xoffset=-1 yoffset=4 xadvance=10 page=0 chnl=0 +char id=281 x=299 y=95 width=8 height=10 xoffset=0 yoffset=7 xadvance=7 page=0 chnl=0 +char id=282 x=202 y=19 width=12 height=14 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=283 x=249 y=73 width=9 height=11 xoffset=0 yoffset=3 xadvance=7 page=0 chnl=0 +char id=284 x=189 y=0 width=12 height=15 xoffset=0 yoffset=-1 xadvance=12 page=0 chnl=0 +char id=285 x=214 y=19 width=8 height=14 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0 +char id=286 x=222 y=19 width=12 height=14 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=287 x=234 y=19 width=8 height=14 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0 +char id=288 x=47 y=47 width=12 height=13 xoffset=0 yoffset=1 xadvance=12 page=0 chnl=0 +char id=289 x=59 y=47 width=8 height=13 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=290 x=201 y=0 width=12 height=15 xoffset=0 yoffset=4 xadvance=12 page=0 chnl=0 +char id=291 x=75 y=0 width=8 height=16 xoffset=0 yoffset=1 xadvance=8 page=0 chnl=0 +char id=292 x=242 y=19 width=14 height=14 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=293 x=213 y=0 width=10 height=15 xoffset=0 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=294 x=307 y=95 width=14 height=10 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=295 x=197 y=60 width=8 height=12 xoffset=0 yoffset=2 xadvance=8 page=0 chnl=0 +char id=296 x=67 y=47 width=9 height=13 xoffset=-1 yoffset=1 xadvance=5 page=0 chnl=0 +char id=297 x=321 y=95 width=7 height=10 xoffset=0 yoffset=4 xadvance=4 page=0 chnl=0 +char id=298 x=76 y=47 width=9 height=13 xoffset=-1 yoffset=1 xadvance=5 page=0 chnl=0 +char id=299 x=328 y=95 width=7 height=10 xoffset=0 yoffset=4 xadvance=4 page=0 chnl=0 +char id=300 x=256 y=19 width=9 height=14 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=301 x=258 y=73 width=7 height=11 xoffset=0 yoffset=3 xadvance=4 page=0 chnl=0 +char id=302 x=85 y=47 width=8 height=13 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=303 x=506 y=33 width=5 height=13 xoffset=0 yoffset=4 xadvance=4 page=0 chnl=0 +char id=304 x=93 y=47 width=8 height=13 xoffset=-1 yoffset=1 xadvance=5 page=0 chnl=0 +char id=305 x=507 y=115 width=4 height=8 xoffset=0 yoffset=6 xadvance=4 page=0 chnl=0 +char id=306 x=335 y=95 width=14 height=10 xoffset=-1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=307 x=101 y=47 width=8 height=13 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=308 x=223 y=0 width=11 height=15 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=309 x=265 y=19 width=9 height=14 xoffset=-2 yoffset=3 xadvance=4 page=0 chnl=0 +char id=310 x=234 y=0 width=13 height=15 xoffset=-1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=311 x=19 y=0 width=8 height=17 xoffset=0 yoffset=2 xadvance=7 page=0 chnl=0 +char id=312 x=330 y=135 width=8 height=8 xoffset=0 yoffset=6 xadvance=7 page=0 chnl=0 +char id=313 x=274 y=19 width=10 height=14 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=314 x=284 y=19 width=7 height=14 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=0 +char id=315 x=247 y=0 width=10 height=15 xoffset=-1 yoffset=4 xadvance=9 page=0 chnl=0 +char id=316 x=27 y=0 width=5 height=17 xoffset=0 yoffset=2 xadvance=4 page=0 chnl=0 +char id=317 x=349 y=95 width=12 height=10 xoffset=-1 yoffset=4 xadvance=9 page=0 chnl=0 +char id=318 x=265 y=73 width=8 height=11 xoffset=0 yoffset=3 xadvance=6 page=0 chnl=0 +char id=319 x=361 y=95 width=10 height=10 xoffset=-1 yoffset=4 xadvance=9 page=0 chnl=0 +char id=320 x=205 y=60 width=6 height=12 xoffset=0 yoffset=2 xadvance=4 page=0 chnl=0 +char id=321 x=371 y=95 width=10 height=10 xoffset=-1 yoffset=4 xadvance=9 page=0 chnl=0 +char id=322 x=211 y=60 width=5 height=12 xoffset=0 yoffset=2 xadvance=4 page=0 chnl=0 +char id=323 x=291 y=19 width=13 height=14 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=324 x=381 y=95 width=8 height=10 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=325 x=257 y=0 width=13 height=15 xoffset=-1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=326 x=216 y=60 width=8 height=12 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=0 +char id=327 x=270 y=0 width=13 height=15 xoffset=-1 yoffset=-1 xadvance=11 page=0 chnl=0 +char id=328 x=273 y=73 width=9 height=11 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0 +char id=329 x=224 y=60 width=8 height=12 xoffset=1 yoffset=2 xadvance=9 page=0 chnl=0 +char id=330 x=282 y=73 width=13 height=11 xoffset=0 yoffset=3 xadvance=12 page=0 chnl=0 +char id=331 x=389 y=95 width=8 height=10 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=0 +char id=332 x=109 y=47 width=12 height=13 xoffset=0 yoffset=1 xadvance=12 page=0 chnl=0 +char id=333 x=231 y=135 width=8 height=9 xoffset=0 yoffset=5 xadvance=8 page=0 chnl=0 +char id=334 x=304 y=19 width=12 height=14 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=335 x=295 y=73 width=9 height=11 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0 +char id=336 x=283 y=0 width=13 height=15 xoffset=0 yoffset=-1 xadvance=12 page=0 chnl=0 +char id=337 x=304 y=73 width=11 height=11 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0 +char id=338 x=397 y=95 width=16 height=10 xoffset=0 yoffset=4 xadvance=15 page=0 chnl=0 +char id=339 x=102 y=145 width=11 height=7 xoffset=0 yoffset=7 xadvance=11 page=0 chnl=0 +char id=340 x=316 y=19 width=11 height=14 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=341 x=413 y=95 width=7 height=10 xoffset=0 yoffset=4 xadvance=6 page=0 chnl=0 +char id=342 x=296 y=0 width=11 height=15 xoffset=-1 yoffset=4 xadvance=10 page=0 chnl=0 +char id=343 x=232 y=60 width=8 height=12 xoffset=-1 yoffset=7 xadvance=6 page=0 chnl=0 +char id=344 x=327 y=19 width=11 height=14 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=345 x=315 y=73 width=8 height=11 xoffset=0 yoffset=3 xadvance=6 page=0 chnl=0 +char id=346 x=338 y=19 width=9 height=14 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=347 x=420 y=95 width=7 height=10 xoffset=0 yoffset=4 xadvance=6 page=0 chnl=0 +char id=348 x=307 y=0 width=9 height=15 xoffset=0 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=349 x=323 y=73 width=7 height=11 xoffset=0 yoffset=3 xadvance=6 page=0 chnl=0 +char id=350 x=121 y=47 width=9 height=13 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=351 x=427 y=95 width=7 height=10 xoffset=-1 yoffset=7 xadvance=6 page=0 chnl=0 +char id=352 x=316 y=0 width=9 height=15 xoffset=0 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=353 x=330 y=73 width=8 height=11 xoffset=0 yoffset=3 xadvance=6 page=0 chnl=0 +char id=354 x=130 y=47 width=11 height=13 xoffset=0 yoffset=4 xadvance=9 page=0 chnl=0 +char id=355 x=141 y=47 width=6 height=13 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=356 x=347 y=19 width=11 height=14 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=357 x=434 y=95 width=9 height=10 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=0 +char id=358 x=443 y=95 width=11 height=10 xoffset=0 yoffset=4 xadvance=9 page=0 chnl=0 +char id=359 x=239 y=135 width=5 height=9 xoffset=0 yoffset=5 xadvance=4 page=0 chnl=0 +char id=360 x=147 y=47 width=12 height=13 xoffset=1 yoffset=1 xadvance=12 page=0 chnl=0 +char id=361 x=454 y=95 width=9 height=10 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=362 x=159 y=47 width=12 height=13 xoffset=1 yoffset=1 xadvance=12 page=0 chnl=0 +char id=363 x=244 y=135 width=8 height=9 xoffset=0 yoffset=5 xadvance=8 page=0 chnl=0 +char id=364 x=358 y=19 width=12 height=14 xoffset=1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=365 x=338 y=73 width=8 height=11 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0 +char id=366 x=325 y=0 width=12 height=15 xoffset=1 yoffset=-1 xadvance=12 page=0 chnl=0 +char id=367 x=240 y=60 width=8 height=12 xoffset=0 yoffset=2 xadvance=8 page=0 chnl=0 +char id=368 x=337 y=0 width=12 height=15 xoffset=1 yoffset=-1 xadvance=12 page=0 chnl=0 +char id=369 x=346 y=73 width=10 height=11 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0 +char id=370 x=248 y=60 width=12 height=12 xoffset=1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=371 x=356 y=73 width=8 height=11 xoffset=0 yoffset=6 xadvance=8 page=0 chnl=0 +char id=372 x=349 y=0 width=14 height=15 xoffset=1 yoffset=-1 xadvance=13 page=0 chnl=0 +char id=373 x=364 y=73 width=11 height=11 xoffset=0 yoffset=3 xadvance=11 page=0 chnl=0 +char id=374 x=370 y=19 width=10 height=14 xoffset=1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=375 x=380 y=19 width=9 height=14 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=376 x=171 y=47 width=10 height=13 xoffset=1 yoffset=1 xadvance=9 page=0 chnl=0 +char id=377 x=389 y=19 width=11 height=14 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=378 x=260 y=60 width=8 height=12 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=379 x=181 y=47 width=11 height=13 xoffset=-1 yoffset=1 xadvance=9 page=0 chnl=0 +char id=380 x=268 y=60 width=8 height=12 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=381 x=400 y=19 width=11 height=14 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=382 x=192 y=47 width=9 height=13 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=383 x=411 y=19 width=10 height=14 xoffset=-3 yoffset=3 xadvance=4 page=0 chnl=0 +char id=884 x=114 y=152 width=4 height=4 xoffset=0 yoffset=2 xadvance=3 page=0 chnl=0 +char id=885 x=118 y=152 width=4 height=4 xoffset=0 yoffset=13 xadvance=3 page=0 chnl=0 +char id=890 x=179 y=152 width=3 height=3 xoffset=0 yoffset=14 xadvance=5 page=0 chnl=0 +char id=894 x=252 y=135 width=5 height=9 xoffset=0 yoffset=7 xadvance=5 page=0 chnl=0 +char id=900 x=122 y=152 width=3 height=4 xoffset=1 yoffset=2 xadvance=4 page=0 chnl=0 +char id=901 x=57 y=152 width=6 height=5 xoffset=2 yoffset=2 xadvance=5 page=0 chnl=0 +char id=902 x=375 y=73 width=11 height=11 xoffset=-1 yoffset=3 xadvance=11 page=0 chnl=0 +char id=903 x=219 y=152 width=3 height=2 xoffset=2 yoffset=7 xadvance=4 page=0 chnl=0 +char id=904 x=463 y=95 width=12 height=10 xoffset=2 yoffset=4 xadvance=13 page=0 chnl=0 +char id=905 x=475 y=95 width=14 height=10 xoffset=2 yoffset=4 xadvance=15 page=0 chnl=0 +char id=906 x=489 y=95 width=8 height=10 xoffset=2 yoffset=4 xadvance=9 page=0 chnl=0 +char id=908 x=497 y=95 width=12 height=10 xoffset=2 yoffset=4 xadvance=13 page=0 chnl=0 +char id=910 x=0 y=105 width=14 height=10 xoffset=2 yoffset=4 xadvance=14 page=0 chnl=0 +char id=911 x=14 y=105 width=13 height=10 xoffset=2 yoffset=4 xadvance=14 page=0 chnl=0 +char id=912 x=276 y=60 width=6 height=12 xoffset=0 yoffset=2 xadvance=4 page=0 chnl=0 +char id=913 x=386 y=73 width=11 height=11 xoffset=-1 yoffset=3 xadvance=11 page=0 chnl=0 +char id=914 x=27 y=105 width=11 height=10 xoffset=-1 yoffset=4 xadvance=9 page=0 chnl=0 +char id=915 x=38 y=105 width=11 height=10 xoffset=0 yoffset=4 xadvance=10 page=0 chnl=0 +char id=916 x=397 y=73 width=11 height=11 xoffset=-1 yoffset=3 xadvance=11 page=0 chnl=0 +char id=917 x=49 y=105 width=11 height=10 xoffset=-1 yoffset=4 xadvance=10 page=0 chnl=0 +char id=918 x=60 y=105 width=11 height=10 xoffset=-1 yoffset=4 xadvance=10 page=0 chnl=0 +char id=919 x=71 y=105 width=13 height=10 xoffset=0 yoffset=4 xadvance=12 page=0 chnl=0 +char id=920 x=84 y=105 width=11 height=10 xoffset=0 yoffset=4 xadvance=11 page=0 chnl=0 +char id=921 x=95 y=105 width=8 height=10 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=922 x=103 y=105 width=13 height=10 xoffset=-1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=923 x=408 y=73 width=11 height=11 xoffset=-1 yoffset=3 xadvance=10 page=0 chnl=0 +char id=924 x=116 y=105 width=15 height=10 xoffset=-1 yoffset=4 xadvance=13 page=0 chnl=0 +char id=925 x=131 y=105 width=13 height=10 xoffset=-1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=926 x=144 y=105 width=11 height=10 xoffset=0 yoffset=4 xadvance=11 page=0 chnl=0 +char id=927 x=155 y=105 width=12 height=10 xoffset=0 yoffset=4 xadvance=11 page=0 chnl=0 +char id=928 x=167 y=105 width=13 height=10 xoffset=0 yoffset=4 xadvance=12 page=0 chnl=0 +char id=929 x=180 y=105 width=10 height=10 xoffset=0 yoffset=4 xadvance=10 page=0 chnl=0 +char id=931 x=190 y=105 width=13 height=10 xoffset=-1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=932 x=203 y=105 width=10 height=10 xoffset=1 yoffset=4 xadvance=10 page=0 chnl=0 +char id=933 x=213 y=105 width=11 height=10 xoffset=1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=934 x=224 y=105 width=12 height=10 xoffset=0 yoffset=4 xadvance=12 page=0 chnl=0 +char id=935 x=236 y=105 width=12 height=10 xoffset=-1 yoffset=4 xadvance=10 page=0 chnl=0 +char id=936 x=248 y=105 width=14 height=10 xoffset=1 yoffset=4 xadvance=13 page=0 chnl=0 +char id=937 x=262 y=105 width=14 height=10 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=938 x=201 y=47 width=9 height=13 xoffset=-1 yoffset=1 xadvance=5 page=0 chnl=0 +char id=939 x=210 y=47 width=11 height=13 xoffset=1 yoffset=1 xadvance=11 page=0 chnl=0 +char id=940 x=419 y=73 width=9 height=11 xoffset=0 yoffset=3 xadvance=9 page=0 chnl=0 +char id=941 x=428 y=73 width=8 height=11 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=942 x=421 y=19 width=8 height=14 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0 +char id=943 x=436 y=73 width=5 height=11 xoffset=0 yoffset=3 xadvance=4 page=0 chnl=0 +char id=944 x=282 y=60 width=8 height=12 xoffset=0 yoffset=2 xadvance=8 page=0 chnl=0 +char id=945 x=113 y=145 width=9 height=7 xoffset=0 yoffset=7 xadvance=9 page=0 chnl=0 +char id=946 x=429 y=19 width=9 height=14 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=947 x=276 y=105 width=8 height=10 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=0 +char id=948 x=441 y=73 width=8 height=11 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0 +char id=949 x=122 y=145 width=8 height=7 xoffset=-1 yoffset=7 xadvance=7 page=0 chnl=0 +char id=950 x=438 y=19 width=7 height=14 xoffset=0 yoffset=3 xadvance=6 page=0 chnl=0 +char id=951 x=284 y=105 width=8 height=10 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=0 +char id=952 x=292 y=105 width=9 height=10 xoffset=0 yoffset=4 xadvance=9 page=0 chnl=0 +char id=953 x=507 y=135 width=4 height=7 xoffset=0 yoffset=7 xadvance=4 page=0 chnl=0 +char id=954 x=130 y=145 width=8 height=7 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=0 +char id=955 x=449 y=73 width=9 height=11 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=956 x=301 y=105 width=9 height=10 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=0 +char id=957 x=138 y=145 width=8 height=7 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=0 +char id=958 x=445 y=19 width=7 height=14 xoffset=0 yoffset=3 xadvance=7 page=0 chnl=0 +char id=959 x=146 y=145 width=8 height=7 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=0 +char id=960 x=154 y=145 width=11 height=7 xoffset=-1 yoffset=7 xadvance=10 page=0 chnl=0 +char id=961 x=458 y=73 width=9 height=11 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=0 +char id=962 x=310 y=105 width=8 height=10 xoffset=-1 yoffset=7 xadvance=7 page=0 chnl=0 +char id=963 x=165 y=145 width=9 height=7 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=0 +char id=964 x=174 y=145 width=7 height=7 xoffset=0 yoffset=7 xadvance=7 page=0 chnl=0 +char id=965 x=181 y=145 width=8 height=7 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=0 +char id=966 x=318 y=105 width=10 height=10 xoffset=0 yoffset=7 xadvance=10 page=0 chnl=0 +char id=967 x=328 y=105 width=10 height=10 xoffset=-2 yoffset=7 xadvance=7 page=0 chnl=0 +char id=968 x=221 y=47 width=11 height=13 xoffset=0 yoffset=4 xadvance=11 page=0 chnl=0 +char id=969 x=189 y=145 width=11 height=7 xoffset=0 yoffset=7 xadvance=11 page=0 chnl=0 +char id=970 x=338 y=105 width=6 height=10 xoffset=0 yoffset=4 xadvance=4 page=0 chnl=0 +char id=971 x=344 y=105 width=8 height=10 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=972 x=467 y=73 width=8 height=11 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0 +char id=973 x=475 y=73 width=8 height=11 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0 +char id=974 x=483 y=73 width=11 height=11 xoffset=0 yoffset=3 xadvance=11 page=0 chnl=0 +char id=976 x=494 y=73 width=9 height=11 xoffset=0 yoffset=3 xadvance=9 page=0 chnl=0 +char id=977 x=0 y=84 width=10 height=11 xoffset=0 yoffset=3 xadvance=9 page=0 chnl=0 +char id=978 x=352 y=105 width=11 height=10 xoffset=0 yoffset=4 xadvance=10 page=0 chnl=0 +char id=979 x=363 y=105 width=14 height=10 xoffset=1 yoffset=4 xadvance=13 page=0 chnl=0 +char id=980 x=232 y=47 width=11 height=13 xoffset=1 yoffset=1 xadvance=10 page=0 chnl=0 +char id=981 x=243 y=47 width=10 height=13 xoffset=0 yoffset=4 xadvance=10 page=0 chnl=0 +char id=982 x=257 y=135 width=12 height=9 xoffset=0 yoffset=5 xadvance=11 page=0 chnl=0 +char id=983 x=377 y=105 width=8 height=10 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=0 +char id=984 x=385 y=105 width=10 height=10 xoffset=1 yoffset=4 xadvance=9 page=0 chnl=0 +char id=985 x=395 y=105 width=8 height=10 xoffset=0 yoffset=7 xadvance=9 page=0 chnl=0 +char id=986 x=403 y=105 width=10 height=10 xoffset=0 yoffset=4 xadvance=9 page=0 chnl=0 +char id=987 x=413 y=105 width=9 height=10 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=0 +char id=988 x=422 y=105 width=11 height=10 xoffset=0 yoffset=4 xadvance=10 page=0 chnl=0 +char id=989 x=433 y=105 width=10 height=10 xoffset=-2 yoffset=7 xadvance=8 page=0 chnl=0 +char id=990 x=443 y=105 width=10 height=10 xoffset=0 yoffset=4 xadvance=10 page=0 chnl=0 +char id=991 x=452 y=19 width=7 height=14 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=992 x=10 y=84 width=12 height=11 xoffset=-1 yoffset=3 xadvance=11 page=0 chnl=0 +char id=993 x=459 y=19 width=10 height=14 xoffset=-1 yoffset=3 xadvance=9 page=0 chnl=0 +char id=1008 x=200 y=145 width=8 height=7 xoffset=0 yoffset=7 xadvance=9 page=0 chnl=0 +char id=1009 x=453 y=105 width=9 height=10 xoffset=-1 yoffset=7 xadvance=9 page=0 chnl=0 +char id=1010 x=208 y=145 width=8 height=7 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=0 +char id=1011 x=253 y=47 width=7 height=13 xoffset=-2 yoffset=4 xadvance=4 page=0 chnl=0 +char id=1012 x=462 y=105 width=12 height=10 xoffset=0 yoffset=4 xadvance=12 page=0 chnl=0 +char id=1013 x=216 y=145 width=5 height=7 xoffset=0 yoffset=7 xadvance=4 page=0 chnl=0 +char id=1014 x=221 y=145 width=5 height=7 xoffset=0 yoffset=7 xadvance=4 page=0 chnl=0 +char id=1015 x=474 y=105 width=10 height=10 xoffset=0 yoffset=4 xadvance=10 page=0 chnl=0 +char id=1016 x=469 y=19 width=9 height=14 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=1017 x=484 y=105 width=10 height=10 xoffset=1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=1018 x=494 y=105 width=15 height=10 xoffset=-1 yoffset=4 xadvance=13 page=0 chnl=0 +char id=1019 x=0 y=115 width=12 height=10 xoffset=-1 yoffset=7 xadvance=11 page=0 chnl=0 +char id=1020 x=12 y=115 width=11 height=10 xoffset=-3 yoffset=7 xadvance=9 page=0 chnl=0 +char id=1021 x=23 y=115 width=10 height=10 xoffset=1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=1022 x=33 y=115 width=10 height=10 xoffset=1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=1023 x=43 y=115 width=10 height=10 xoffset=1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=1024 x=478 y=19 width=12 height=14 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1025 x=490 y=19 width=12 height=14 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1026 x=53 y=115 width=11 height=10 xoffset=0 yoffset=4 xadvance=11 page=0 chnl=0 +char id=1027 x=0 y=33 width=11 height=14 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1028 x=64 y=115 width=11 height=10 xoffset=1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=1029 x=474 y=84 width=9 height=10 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=1030 x=372 y=84 width=8 height=10 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=1031 x=260 y=47 width=9 height=13 xoffset=-1 yoffset=1 xadvance=5 page=0 chnl=0 +char id=1032 x=380 y=84 width=9 height=10 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=1033 x=75 y=115 width=16 height=10 xoffset=-1 yoffset=4 xadvance=16 page=0 chnl=0 +char id=1034 x=91 y=115 width=16 height=10 xoffset=-1 yoffset=4 xadvance=16 page=0 chnl=0 +char id=1035 x=107 y=115 width=11 height=10 xoffset=0 yoffset=4 xadvance=11 page=0 chnl=0 +char id=1036 x=11 y=33 width=13 height=14 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1037 x=24 y=33 width=14 height=14 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1038 x=38 y=33 width=12 height=14 xoffset=1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1039 x=269 y=47 width=14 height=13 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=1040 x=118 y=115 width=11 height=10 xoffset=-1 yoffset=4 xadvance=10 page=0 chnl=0 +char id=1041 x=129 y=115 width=11 height=10 xoffset=-1 yoffset=4 xadvance=10 page=0 chnl=0 +char id=1042 x=287 y=84 width=11 height=10 xoffset=-1 yoffset=4 xadvance=10 page=0 chnl=0 +char id=1043 x=140 y=115 width=11 height=10 xoffset=0 yoffset=4 xadvance=10 page=0 chnl=0 +char id=1044 x=283 y=47 width=14 height=13 xoffset=-2 yoffset=4 xadvance=11 page=0 chnl=0 +char id=1045 x=322 y=84 width=12 height=10 xoffset=-1 yoffset=4 xadvance=10 page=0 chnl=0 +char id=1046 x=151 y=115 width=18 height=10 xoffset=-1 yoffset=4 xadvance=16 page=0 chnl=0 +char id=1047 x=169 y=115 width=10 height=10 xoffset=0 yoffset=4 xadvance=9 page=0 chnl=0 +char id=1048 x=179 y=115 width=14 height=10 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=1049 x=50 y=33 width=14 height=14 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1050 x=193 y=115 width=13 height=10 xoffset=-1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=1051 x=206 y=115 width=14 height=10 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=1052 x=412 y=84 width=15 height=10 xoffset=-1 yoffset=4 xadvance=13 page=0 chnl=0 +char id=1053 x=358 y=84 width=14 height=10 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=1054 x=440 y=84 width=12 height=10 xoffset=0 yoffset=4 xadvance=12 page=0 chnl=0 +char id=1055 x=220 y=115 width=13 height=10 xoffset=0 yoffset=4 xadvance=12 page=0 chnl=0 +char id=1056 x=452 y=84 width=11 height=10 xoffset=-1 yoffset=4 xadvance=10 page=0 chnl=0 +char id=1057 x=298 y=84 width=11 height=10 xoffset=1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=1058 x=483 y=84 width=11 height=10 xoffset=0 yoffset=4 xadvance=9 page=0 chnl=0 +char id=1059 x=233 y=115 width=12 height=10 xoffset=1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=1060 x=245 y=115 width=12 height=10 xoffset=0 yoffset=4 xadvance=12 page=0 chnl=0 +char id=1061 x=25 y=95 width=12 height=10 xoffset=-1 yoffset=4 xadvance=10 page=0 chnl=0 +char id=1062 x=297 y=47 width=14 height=13 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=1063 x=257 y=115 width=11 height=10 xoffset=1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=1064 x=268 y=115 width=18 height=10 xoffset=-1 yoffset=4 xadvance=16 page=0 chnl=0 +char id=1065 x=311 y=47 width=18 height=13 xoffset=-1 yoffset=4 xadvance=16 page=0 chnl=0 +char id=1066 x=286 y=115 width=11 height=10 xoffset=0 yoffset=4 xadvance=11 page=0 chnl=0 +char id=1067 x=297 y=115 width=16 height=10 xoffset=-1 yoffset=4 xadvance=14 page=0 chnl=0 +char id=1068 x=313 y=115 width=10 height=10 xoffset=-1 yoffset=4 xadvance=10 page=0 chnl=0 +char id=1069 x=323 y=115 width=10 height=10 xoffset=0 yoffset=4 xadvance=10 page=0 chnl=0 +char id=1070 x=333 y=115 width=18 height=10 xoffset=-1 yoffset=4 xadvance=16 page=0 chnl=0 +char id=1071 x=351 y=115 width=13 height=10 xoffset=-1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=1072 x=492 y=135 width=8 height=7 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=0 +char id=1073 x=22 y=84 width=10 height=11 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0 +char id=1074 x=226 y=145 width=7 height=7 xoffset=0 yoffset=7 xadvance=7 page=0 chnl=0 +char id=1075 x=233 y=145 width=7 height=7 xoffset=-1 yoffset=7 xadvance=6 page=0 chnl=0 +char id=1076 x=503 y=73 width=8 height=11 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0 +char id=1077 x=240 y=145 width=7 height=7 xoffset=0 yoffset=7 xadvance=7 page=0 chnl=0 +char id=1078 x=247 y=145 width=15 height=7 xoffset=0 yoffset=7 xadvance=15 page=0 chnl=0 +char id=1079 x=262 y=145 width=8 height=7 xoffset=-1 yoffset=7 xadvance=6 page=0 chnl=0 +char id=1080 x=304 y=135 width=8 height=8 xoffset=0 yoffset=6 xadvance=8 page=0 chnl=0 +char id=1081 x=364 y=115 width=8 height=10 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=1082 x=270 y=145 width=8 height=7 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=0 +char id=1083 x=278 y=145 width=9 height=7 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=0 +char id=1084 x=338 y=135 width=11 height=8 xoffset=-1 yoffset=6 xadvance=10 page=0 chnl=0 +char id=1085 x=349 y=135 width=8 height=8 xoffset=0 yoffset=6 xadvance=8 page=0 chnl=0 +char id=1086 x=27 y=145 width=8 height=7 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=0 +char id=1087 x=19 y=145 width=8 height=7 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=0 +char id=1088 x=66 y=95 width=10 height=10 xoffset=-2 yoffset=7 xadvance=8 page=0 chnl=0 +char id=1089 x=287 y=145 width=7 height=7 xoffset=0 yoffset=7 xadvance=7 page=0 chnl=0 +char id=1090 x=7 y=145 width=12 height=7 xoffset=0 yoffset=7 xadvance=12 page=0 chnl=0 +char id=1091 x=32 y=84 width=8 height=11 xoffset=0 yoffset=6 xadvance=8 page=0 chnl=0 +char id=1092 x=329 y=47 width=12 height=13 xoffset=0 yoffset=4 xadvance=12 page=0 chnl=0 +char id=1093 x=66 y=145 width=9 height=7 xoffset=-1 yoffset=7 xadvance=7 page=0 chnl=0 +char id=1094 x=40 y=84 width=8 height=11 xoffset=0 yoffset=6 xadvance=8 page=0 chnl=0 +char id=1095 x=357 y=135 width=8 height=8 xoffset=0 yoffset=6 xadvance=8 page=0 chnl=0 +char id=1096 x=365 y=135 width=12 height=8 xoffset=0 yoffset=6 xadvance=12 page=0 chnl=0 +char id=1097 x=48 y=84 width=12 height=11 xoffset=0 yoffset=6 xadvance=12 page=0 chnl=0 +char id=1098 x=294 y=145 width=9 height=7 xoffset=0 yoffset=7 xadvance=9 page=0 chnl=0 +char id=1099 x=377 y=135 width=11 height=8 xoffset=0 yoffset=6 xadvance=11 page=0 chnl=0 +char id=1100 x=388 y=135 width=7 height=8 xoffset=0 yoffset=6 xadvance=7 page=0 chnl=0 +char id=1101 x=303 y=145 width=7 height=7 xoffset=0 yoffset=7 xadvance=7 page=0 chnl=0 +char id=1102 x=310 y=145 width=11 height=7 xoffset=0 yoffset=7 xadvance=11 page=0 chnl=0 +char id=1103 x=321 y=145 width=9 height=7 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=0 +char id=1104 x=372 y=115 width=7 height=10 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=0 +char id=1105 x=379 y=115 width=8 height=10 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=0 +char id=1106 x=363 y=0 width=8 height=15 xoffset=0 yoffset=2 xadvance=8 page=0 chnl=0 +char id=1107 x=387 y=115 width=7 height=10 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=1108 x=330 y=145 width=7 height=7 xoffset=0 yoffset=7 xadvance=7 page=0 chnl=0 +char id=1109 x=42 y=145 width=6 height=7 xoffset=0 yoffset=7 xadvance=6 page=0 chnl=0 +char id=1110 x=506 y=84 width=5 height=10 xoffset=0 yoffset=4 xadvance=4 page=0 chnl=0 +char id=1111 x=394 y=115 width=6 height=10 xoffset=0 yoffset=4 xadvance=4 page=0 chnl=0 +char id=1112 x=374 y=33 width=7 height=13 xoffset=-2 yoffset=4 xadvance=4 page=0 chnl=0 +char id=1113 x=337 y=145 width=12 height=7 xoffset=-1 yoffset=7 xadvance=11 page=0 chnl=0 +char id=1114 x=395 y=135 width=11 height=8 xoffset=0 yoffset=6 xadvance=11 page=0 chnl=0 +char id=1115 x=290 y=60 width=8 height=12 xoffset=0 yoffset=2 xadvance=8 page=0 chnl=0 +char id=1116 x=400 y=115 width=8 height=10 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=1117 x=408 y=115 width=8 height=10 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=1118 x=341 y=47 width=8 height=13 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=1119 x=60 y=84 width=8 height=11 xoffset=0 yoffset=6 xadvance=8 page=0 chnl=0 +char id=1120 x=416 y=115 width=16 height=10 xoffset=0 yoffset=4 xadvance=15 page=0 chnl=0 +char id=1121 x=349 y=145 width=11 height=7 xoffset=0 yoffset=7 xadvance=11 page=0 chnl=0 +char id=1122 x=432 y=115 width=10 height=10 xoffset=1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=1123 x=360 y=145 width=11 height=7 xoffset=0 yoffset=7 xadvance=11 page=0 chnl=0 +char id=1124 x=442 y=115 width=17 height=10 xoffset=-1 yoffset=4 xadvance=16 page=0 chnl=0 +char id=1125 x=406 y=135 width=11 height=8 xoffset=0 yoffset=6 xadvance=10 page=0 chnl=0 +char id=1126 x=459 y=115 width=14 height=10 xoffset=-1 yoffset=4 xadvance=13 page=0 chnl=0 +char id=1127 x=417 y=135 width=11 height=8 xoffset=-1 yoffset=6 xadvance=10 page=0 chnl=0 +char id=1128 x=473 y=115 width=18 height=10 xoffset=-1 yoffset=4 xadvance=18 page=0 chnl=0 +char id=1129 x=428 y=135 width=13 height=8 xoffset=0 yoffset=6 xadvance=13 page=0 chnl=0 +char id=1130 x=491 y=115 width=16 height=10 xoffset=-1 yoffset=4 xadvance=15 page=0 chnl=0 +char id=1131 x=371 y=145 width=13 height=7 xoffset=-1 yoffset=7 xadvance=12 page=0 chnl=0 +char id=1132 x=0 y=125 width=21 height=10 xoffset=-1 yoffset=4 xadvance=20 page=0 chnl=0 +char id=1133 x=441 y=135 width=14 height=8 xoffset=0 yoffset=6 xadvance=14 page=0 chnl=0 +char id=1134 x=32 y=0 width=11 height=17 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1135 x=298 y=60 width=9 height=12 xoffset=-1 yoffset=5 xadvance=6 page=0 chnl=0 +char id=1136 x=21 y=125 width=14 height=10 xoffset=2 yoffset=4 xadvance=13 page=0 chnl=0 +char id=1137 x=371 y=0 width=12 height=15 xoffset=1 yoffset=2 xadvance=11 page=0 chnl=0 +char id=1138 x=35 y=125 width=12 height=10 xoffset=0 yoffset=4 xadvance=12 page=0 chnl=0 +char id=1139 x=384 y=145 width=8 height=7 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=0 +char id=1140 x=47 y=125 width=12 height=10 xoffset=1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=1141 x=392 y=145 width=9 height=7 xoffset=0 yoffset=7 xadvance=9 page=0 chnl=0 +char id=1142 x=383 y=0 width=12 height=15 xoffset=1 yoffset=-1 xadvance=12 page=0 chnl=0 +char id=1143 x=307 y=60 width=9 height=12 xoffset=0 yoffset=2 xadvance=9 page=0 chnl=0 +char id=1144 x=349 y=47 width=20 height=13 xoffset=0 yoffset=4 xadvance=19 page=0 chnl=0 +char id=1145 x=59 y=125 width=16 height=10 xoffset=0 yoffset=7 xadvance=15 page=0 chnl=0 +char id=1146 x=369 y=47 width=14 height=13 xoffset=0 yoffset=2 xadvance=14 page=0 chnl=0 +char id=1147 x=75 y=125 width=10 height=10 xoffset=0 yoffset=5 xadvance=10 page=0 chnl=0 +char id=1148 x=395 y=0 width=16 height=15 xoffset=0 yoffset=-1 xadvance=15 page=0 chnl=0 +char id=1149 x=85 y=125 width=12 height=10 xoffset=0 yoffset=4 xadvance=11 page=0 chnl=0 +char id=1150 x=64 y=33 width=16 height=14 xoffset=0 yoffset=0 xadvance=15 page=0 chnl=0 +char id=1151 x=97 y=125 width=12 height=10 xoffset=0 yoffset=4 xadvance=11 page=0 chnl=0 +char id=1152 x=109 y=125 width=10 height=10 xoffset=0 yoffset=4 xadvance=9 page=0 chnl=0 +char id=1153 x=119 y=125 width=7 height=10 xoffset=0 yoffset=7 xadvance=7 page=0 chnl=0 +char id=1154 x=8 y=152 width=5 height=6 xoffset=0 yoffset=11 xadvance=5 page=0 chnl=0 +char id=1155 x=222 y=152 width=7 height=2 xoffset=-4 yoffset=4 xadvance=0 page=0 chnl=0 +char id=1156 x=182 y=152 width=8 height=3 xoffset=-5 yoffset=4 xadvance=0 page=0 chnl=0 +char id=1157 x=63 y=152 width=4 height=5 xoffset=-1 yoffset=1 xadvance=0 page=0 chnl=0 +char id=1158 x=67 y=152 width=4 height=5 xoffset=-1 yoffset=1 xadvance=0 page=0 chnl=0 +char id=1159 x=190 y=152 width=11 height=3 xoffset=-7 yoffset=3 xadvance=0 page=0 chnl=0 +char id=1160 x=43 y=0 width=18 height=17 xoffset=-13 yoffset=0 xadvance=0 page=0 chnl=0 +char id=1161 x=0 y=0 width=19 height=19 xoffset=-13 yoffset=-1 xadvance=0 page=0 chnl=0 +char id=1162 x=61 y=0 width=14 height=17 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1163 x=383 y=47 width=8 height=13 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=1164 x=126 y=125 width=10 height=10 xoffset=-1 yoffset=4 xadvance=10 page=0 chnl=0 +char id=1165 x=455 y=135 width=7 height=8 xoffset=0 yoffset=6 xadvance=7 page=0 chnl=0 +char id=1166 x=136 y=125 width=10 height=10 xoffset=0 yoffset=4 xadvance=10 page=0 chnl=0 +char id=1167 x=146 y=125 width=10 height=10 xoffset=-2 yoffset=7 xadvance=8 page=0 chnl=0 +char id=1168 x=316 y=60 width=12 height=12 xoffset=-1 yoffset=2 xadvance=9 page=0 chnl=0 +char id=1169 x=269 y=135 width=8 height=9 xoffset=0 yoffset=5 xadvance=7 page=0 chnl=0 +char id=1170 x=156 y=125 width=12 height=10 xoffset=-1 yoffset=4 xadvance=9 page=0 chnl=0 +char id=1171 x=401 y=145 width=7 height=7 xoffset=0 yoffset=7 xadvance=7 page=0 chnl=0 +char id=1172 x=80 y=33 width=11 height=14 xoffset=0 yoffset=4 xadvance=10 page=0 chnl=0 +char id=1173 x=168 y=125 width=7 height=10 xoffset=0 yoffset=7 xadvance=7 page=0 chnl=0 +char id=1174 x=391 y=47 width=18 height=13 xoffset=-1 yoffset=4 xadvance=16 page=0 chnl=0 +char id=1175 x=175 y=125 width=15 height=10 xoffset=0 yoffset=7 xadvance=15 page=0 chnl=0 +char id=1176 x=409 y=47 width=10 height=13 xoffset=0 yoffset=4 xadvance=9 page=0 chnl=0 +char id=1177 x=190 y=125 width=8 height=10 xoffset=-1 yoffset=7 xadvance=6 page=0 chnl=0 +char id=1178 x=419 y=47 width=13 height=13 xoffset=-1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=1179 x=198 y=125 width=8 height=10 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=0 +char id=1180 x=206 y=125 width=13 height=10 xoffset=-1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=1181 x=408 y=145 width=9 height=7 xoffset=0 yoffset=7 xadvance=9 page=0 chnl=0 +char id=1182 x=219 y=125 width=13 height=10 xoffset=-1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=1183 x=417 y=145 width=8 height=7 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=0 +char id=1184 x=232 y=125 width=13 height=10 xoffset=0 yoffset=4 xadvance=12 page=0 chnl=0 +char id=1185 x=425 y=145 width=11 height=7 xoffset=0 yoffset=7 xadvance=11 page=0 chnl=0 +char id=1186 x=432 y=47 width=14 height=13 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=1187 x=68 y=84 width=8 height=11 xoffset=0 yoffset=6 xadvance=8 page=0 chnl=0 +char id=1188 x=245 y=125 width=17 height=10 xoffset=-1 yoffset=4 xadvance=15 page=0 chnl=0 +char id=1189 x=462 y=135 width=11 height=8 xoffset=0 yoffset=6 xadvance=11 page=0 chnl=0 +char id=1190 x=91 y=33 width=16 height=14 xoffset=0 yoffset=4 xadvance=17 page=0 chnl=0 +char id=1191 x=262 y=125 width=11 height=10 xoffset=0 yoffset=7 xadvance=11 page=0 chnl=0 +char id=1192 x=273 y=125 width=12 height=10 xoffset=0 yoffset=4 xadvance=12 page=0 chnl=0 +char id=1193 x=436 y=145 width=9 height=7 xoffset=0 yoffset=7 xadvance=9 page=0 chnl=0 +char id=1194 x=446 y=47 width=11 height=13 xoffset=1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=1195 x=285 y=125 width=7 height=10 xoffset=0 yoffset=7 xadvance=7 page=0 chnl=0 +char id=1196 x=328 y=60 width=11 height=12 xoffset=0 yoffset=4 xadvance=9 page=0 chnl=0 +char id=1197 x=292 y=125 width=12 height=10 xoffset=0 yoffset=7 xadvance=12 page=0 chnl=0 +char id=1198 x=37 y=95 width=10 height=10 xoffset=1 yoffset=4 xadvance=9 page=0 chnl=0 +char id=1199 x=304 y=125 width=10 height=10 xoffset=0 yoffset=7 xadvance=9 page=0 chnl=0 +char id=1200 x=314 y=125 width=10 height=10 xoffset=1 yoffset=4 xadvance=9 page=0 chnl=0 +char id=1201 x=324 y=125 width=10 height=10 xoffset=0 yoffset=7 xadvance=9 page=0 chnl=0 +char id=1202 x=457 y=47 width=12 height=13 xoffset=-1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=1203 x=334 y=125 width=9 height=10 xoffset=-1 yoffset=7 xadvance=7 page=0 chnl=0 +char id=1204 x=339 y=60 width=15 height=12 xoffset=0 yoffset=4 xadvance=13 page=0 chnl=0 +char id=1205 x=343 y=125 width=9 height=10 xoffset=0 yoffset=7 xadvance=9 page=0 chnl=0 +char id=1206 x=469 y=47 width=11 height=13 xoffset=1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=1207 x=76 y=84 width=8 height=11 xoffset=0 yoffset=6 xadvance=8 page=0 chnl=0 +char id=1208 x=352 y=125 width=11 height=10 xoffset=1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=1209 x=473 y=135 width=8 height=8 xoffset=0 yoffset=6 xadvance=8 page=0 chnl=0 +char id=1210 x=363 y=125 width=11 height=10 xoffset=-1 yoffset=4 xadvance=10 page=0 chnl=0 +char id=1211 x=147 y=60 width=8 height=12 xoffset=0 yoffset=2 xadvance=8 page=0 chnl=0 +char id=1212 x=374 y=125 width=13 height=10 xoffset=0 yoffset=4 xadvance=13 page=0 chnl=0 +char id=1213 x=445 y=145 width=10 height=7 xoffset=0 yoffset=7 xadvance=9 page=0 chnl=0 +char id=1214 x=354 y=60 width=13 height=12 xoffset=0 yoffset=4 xadvance=13 page=0 chnl=0 +char id=1215 x=277 y=135 width=10 height=9 xoffset=0 yoffset=7 xadvance=9 page=0 chnl=0 +char id=1216 x=372 y=84 width=8 height=10 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=1217 x=107 y=33 width=18 height=14 xoffset=-1 yoffset=0 xadvance=16 page=0 chnl=0 +char id=1218 x=387 y=125 width=15 height=10 xoffset=0 yoffset=4 xadvance=15 page=0 chnl=0 +char id=1219 x=125 y=33 width=13 height=14 xoffset=-1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=1220 x=402 y=125 width=8 height=10 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=0 +char id=1221 x=480 y=47 width=14 height=13 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=1222 x=410 y=125 width=9 height=10 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=0 +char id=1223 x=138 y=33 width=14 height=14 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=1224 x=84 y=84 width=8 height=11 xoffset=0 yoffset=6 xadvance=8 page=0 chnl=0 +char id=1225 x=494 y=47 width=14 height=13 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=1226 x=92 y=84 width=8 height=11 xoffset=0 yoffset=6 xadvance=8 page=0 chnl=0 +char id=1227 x=0 y=60 width=11 height=13 xoffset=1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=1228 x=100 y=84 width=8 height=11 xoffset=0 yoffset=6 xadvance=8 page=0 chnl=0 +char id=1229 x=11 y=60 width=15 height=13 xoffset=-1 yoffset=4 xadvance=13 page=0 chnl=0 +char id=1230 x=108 y=84 width=11 height=11 xoffset=-1 yoffset=6 xadvance=10 page=0 chnl=0 +char id=1231 x=372 y=84 width=8 height=10 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=1232 x=152 y=33 width=11 height=14 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1233 x=419 y=125 width=8 height=10 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=1234 x=163 y=33 width=11 height=14 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1235 x=427 y=125 width=8 height=10 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=1236 x=111 y=95 width=16 height=10 xoffset=-1 yoffset=4 xadvance=14 page=0 chnl=0 +char id=1237 x=91 y=145 width=11 height=7 xoffset=0 yoffset=7 xadvance=11 page=0 chnl=0 +char id=1238 x=174 y=33 width=12 height=14 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1239 x=435 y=125 width=8 height=10 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=0 +char id=1240 x=443 y=125 width=11 height=10 xoffset=1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=1241 x=455 y=145 width=7 height=7 xoffset=0 yoffset=7 xadvance=7 page=0 chnl=0 +char id=1242 x=186 y=33 width=11 height=14 xoffset=1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1243 x=454 y=125 width=8 height=10 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=0 +char id=1244 x=197 y=33 width=18 height=14 xoffset=-1 yoffset=0 xadvance=16 page=0 chnl=0 +char id=1245 x=462 y=125 width=15 height=10 xoffset=0 yoffset=4 xadvance=15 page=0 chnl=0 +char id=1246 x=215 y=33 width=10 height=14 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1247 x=477 y=125 width=8 height=10 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=1248 x=485 y=125 width=11 height=10 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=1249 x=496 y=125 width=8 height=10 xoffset=-1 yoffset=7 xadvance=7 page=0 chnl=0 +char id=1250 x=26 y=60 width=14 height=13 xoffset=-1 yoffset=1 xadvance=12 page=0 chnl=0 +char id=1251 x=287 y=135 width=8 height=9 xoffset=0 yoffset=5 xadvance=8 page=0 chnl=0 +char id=1252 x=225 y=33 width=14 height=14 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1253 x=0 y=135 width=8 height=10 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=1254 x=239 y=33 width=12 height=14 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1255 x=8 y=135 width=9 height=10 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=1256 x=17 y=135 width=12 height=10 xoffset=0 yoffset=4 xadvance=12 page=0 chnl=0 +char id=1257 x=462 y=145 width=8 height=7 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=0 +char id=1258 x=251 y=33 width=12 height=14 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1259 x=29 y=135 width=9 height=10 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=1260 x=263 y=33 width=10 height=14 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1261 x=504 y=125 width=7 height=10 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=0 +char id=1262 x=40 y=60 width=12 height=13 xoffset=1 yoffset=1 xadvance=12 page=0 chnl=0 +char id=1263 x=52 y=60 width=8 height=13 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=1264 x=273 y=33 width=12 height=14 xoffset=1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1265 x=60 y=60 width=8 height=13 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=1266 x=411 y=0 width=12 height=15 xoffset=1 yoffset=-1 xadvance=12 page=0 chnl=0 +char id=1267 x=68 y=60 width=10 height=13 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=1268 x=285 y=33 width=11 height=14 xoffset=1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1269 x=38 y=135 width=8 height=10 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=1270 x=78 y=60 width=11 height=13 xoffset=0 yoffset=4 xadvance=10 page=0 chnl=0 +char id=1271 x=46 y=135 width=7 height=10 xoffset=0 yoffset=7 xadvance=7 page=0 chnl=0 +char id=1272 x=296 y=33 width=16 height=14 xoffset=-1 yoffset=0 xadvance=14 page=0 chnl=0 +char id=1273 x=53 y=135 width=11 height=10 xoffset=0 yoffset=4 xadvance=11 page=0 chnl=0 +char id=1296 x=64 y=135 width=9 height=10 xoffset=1 yoffset=4 xadvance=9 page=0 chnl=0 +char id=1297 x=470 y=145 width=8 height=7 xoffset=0 yoffset=7 xadvance=7 page=0 chnl=0 +char id=1298 x=312 y=33 width=14 height=14 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=1299 x=73 y=135 width=8 height=10 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=0 +char id=1306 x=348 y=33 width=12 height=13 xoffset=0 yoffset=4 xadvance=12 page=0 chnl=0 +char id=1307 x=81 y=135 width=8 height=10 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=0 +char id=1308 x=11 y=95 width=14 height=10 xoffset=1 yoffset=4 xadvance=13 page=0 chnl=0 +char id=1309 x=478 y=145 width=11 height=7 xoffset=0 yoffset=7 xadvance=11 page=0 chnl=0 +char id=1310 x=89 y=135 width=13 height=10 xoffset=-1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=1311 x=489 y=145 width=8 height=7 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=0 +char id=8192 x=0 y=0 width=0 height=0 xoffset=0 yoffset=14 xadvance=8 page=0 chnl=0 +char id=8193 x=0 y=0 width=0 height=0 xoffset=0 yoffset=14 xadvance=16 page=0 chnl=0 +char id=8194 x=0 y=0 width=0 height=0 xoffset=0 yoffset=14 xadvance=8 page=0 chnl=0 +char id=8195 x=0 y=0 width=0 height=0 xoffset=0 yoffset=14 xadvance=16 page=0 chnl=0 +char id=8196 x=0 y=0 width=0 height=0 xoffset=0 yoffset=14 xadvance=5 page=0 chnl=0 +char id=8197 x=0 y=0 width=0 height=0 xoffset=0 yoffset=14 xadvance=4 page=0 chnl=0 +char id=8198 x=0 y=0 width=0 height=0 xoffset=0 yoffset=14 xadvance=3 page=0 chnl=0 +char id=8199 x=0 y=0 width=0 height=0 xoffset=0 yoffset=14 xadvance=8 page=0 chnl=0 +char id=8200 x=0 y=0 width=0 height=0 xoffset=0 yoffset=14 xadvance=4 page=0 chnl=0 +char id=8201 x=0 y=0 width=0 height=0 xoffset=0 yoffset=14 xadvance=3 page=0 chnl=0 +char id=8202 x=0 y=0 width=0 height=0 xoffset=0 yoffset=14 xadvance=2 page=0 chnl=0 +char id=8203 x=0 y=0 width=0 height=0 xoffset=0 yoffset=14 xadvance=0 page=0 chnl=0 +char id=8204 x=0 y=0 width=0 height=0 xoffset=0 yoffset=14 xadvance=0 page=0 chnl=0 +char id=8210 x=261 y=152 width=9 height=1 xoffset=1 yoffset=10 xadvance=8 page=0 chnl=0 +char id=8211 x=270 y=152 width=9 height=1 xoffset=0 yoffset=10 xadvance=8 page=0 chnl=0 +char id=8212 x=279 y=152 width=17 height=1 xoffset=0 yoffset=10 xadvance=16 page=0 chnl=0 +char id=8213 x=296 y=152 width=17 height=1 xoffset=1 yoffset=10 xadvance=16 page=0 chnl=0 +char id=8214 x=102 y=135 width=6 height=10 xoffset=0 yoffset=5 xadvance=5 page=0 chnl=0 +char id=8215 x=201 y=152 width=9 height=3 xoffset=-1 yoffset=15 xadvance=7 page=0 chnl=0 +char id=8216 x=125 y=152 width=3 height=4 xoffset=2 yoffset=3 xadvance=4 page=0 chnl=0 +char id=8217 x=128 y=152 width=3 height=4 xoffset=2 yoffset=4 xadvance=4 page=0 chnl=0 +char id=8218 x=131 y=152 width=3 height=4 xoffset=0 yoffset=12 xadvance=4 page=0 chnl=0 +char id=8219 x=134 y=152 width=3 height=4 xoffset=2 yoffset=4 xadvance=4 page=0 chnl=0 +char id=8220 x=137 y=152 width=7 height=4 xoffset=2 yoffset=3 xadvance=7 page=0 chnl=0 +char id=8221 x=144 y=152 width=6 height=4 xoffset=3 yoffset=4 xadvance=7 page=0 chnl=0 +char id=8222 x=150 y=152 width=6 height=4 xoffset=0 yoffset=12 xadvance=7 page=0 chnl=0 +char id=8223 x=156 y=152 width=6 height=4 xoffset=3 yoffset=4 xadvance=7 page=0 chnl=0 +char id=8224 x=89 y=60 width=7 height=13 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=8225 x=96 y=60 width=8 height=13 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=8226 x=71 y=152 width=6 height=5 xoffset=1 yoffset=7 xadvance=6 page=0 chnl=0 +char id=8230 x=229 y=152 width=13 height=2 xoffset=0 yoffset=12 xadvance=14 page=0 chnl=0 +char id=8239 x=0 y=0 width=0 height=0 xoffset=0 yoffset=14 xadvance=4 page=0 chnl=0 +char id=8240 x=367 y=60 width=17 height=12 xoffset=0 yoffset=2 xadvance=16 page=0 chnl=0 +char id=8242 x=77 y=152 width=5 height=5 xoffset=1 yoffset=2 xadvance=4 page=0 chnl=0 +char id=8243 x=82 y=152 width=8 height=5 xoffset=1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=8244 x=90 y=152 width=11 height=5 xoffset=1 yoffset=2 xadvance=10 page=0 chnl=0 +char id=8249 x=13 y=152 width=5 height=6 xoffset=0 yoffset=8 xadvance=4 page=0 chnl=0 +char id=8250 x=18 y=152 width=4 height=6 xoffset=0 yoffset=7 xadvance=4 page=0 chnl=0 +char id=8252 x=108 y=135 width=11 height=10 xoffset=0 yoffset=4 xadvance=11 page=0 chnl=0 +char id=8254 x=313 y=152 width=9 height=1 xoffset=2 yoffset=4 xadvance=8 page=0 chnl=0 +char id=8260 x=119 y=84 width=12 height=11 xoffset=-3 yoffset=3 xadvance=3 page=0 chnl=0 +char id=8286 x=104 y=60 width=6 height=13 xoffset=0 yoffset=1 xadvance=3 page=0 chnl=0 +char id=8352 x=131 y=84 width=10 height=11 xoffset=2 yoffset=3 xadvance=11 page=0 chnl=0 +char id=8353 x=423 y=0 width=12 height=15 xoffset=1 yoffset=1 xadvance=11 page=0 chnl=0 +char id=8354 x=119 y=135 width=11 height=10 xoffset=1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=8355 x=130 y=135 width=11 height=10 xoffset=0 yoffset=4 xadvance=10 page=0 chnl=0 +char id=8356 x=141 y=84 width=9 height=11 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0 +char id=8357 x=384 y=60 width=12 height=12 xoffset=0 yoffset=4 xadvance=12 page=0 chnl=0 +char id=8358 x=141 y=135 width=13 height=10 xoffset=-1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=8359 x=150 y=84 width=16 height=11 xoffset=0 yoffset=3 xadvance=16 page=0 chnl=0 +char id=8360 x=154 y=135 width=17 height=10 xoffset=-1 yoffset=4 xadvance=15 page=0 chnl=0 +char id=8361 x=171 y=135 width=15 height=10 xoffset=0 yoffset=4 xadvance=13 page=0 chnl=0 +char id=8363 x=110 y=60 width=10 height=13 xoffset=1 yoffset=1 xadvance=8 page=0 chnl=0 +char id=8364 x=166 y=84 width=13 height=11 xoffset=1 yoffset=3 xadvance=12 page=0 chnl=0 +char id=8365 x=179 y=84 width=13 height=11 xoffset=0 yoffset=3 xadvance=12 page=0 chnl=0 +char id=8366 x=192 y=84 width=11 height=11 xoffset=1 yoffset=3 xadvance=10 page=0 chnl=0 +char id=8367 x=326 y=33 width=22 height=14 xoffset=0 yoffset=3 xadvance=21 page=0 chnl=0 +char id=8368 x=502 y=19 width=9 height=14 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0 +char id=8369 x=203 y=84 width=11 height=11 xoffset=0 yoffset=3 xadvance=9 page=0 chnl=0 +char id=8370 x=120 y=60 width=10 height=13 xoffset=1 yoffset=2 xadvance=10 page=0 chnl=0 +char id=8371 x=214 y=84 width=12 height=11 xoffset=0 yoffset=3 xadvance=12 page=0 chnl=0 +char id=8372 x=226 y=84 width=9 height=11 xoffset=1 yoffset=3 xadvance=9 page=0 chnl=0 +char id=8373 x=396 y=60 width=10 height=12 xoffset=0 yoffset=3 xadvance=10 page=0 chnl=0 +kernings count=17372 +kerning first=1051 second=1052 amount=-1 +kerning first=1049 second=1107 amount=-1 +kerning first=354 second=233 amount=-1 +kerning first=8249 second=217 amount=-1 +kerning first=351 second=44 amount=-1 +kerning first=314 second=45 amount=-1 +kerning first=197 second=46 amount=-1 +kerning first=280 second=288 amount=-1 +kerning first=375 second=291 amount=-1 +kerning first=339 second=291 amount=-1 +kerning first=211 second=65 amount=-1 +kerning first=79 second=66 amount=-1 +kerning first=370 second=67 amount=-1 +kerning first=334 second=68 amount=-1 +kerning first=211 second=70 amount=-1 +kerning first=8217 second=71 amount=-1 +kerning first=327 second=72 amount=-1 +kerning first=346 second=75 amount=-1 +kerning first=201 second=76 amount=-1 +kerning first=207 second=77 amount=-1 +kerning first=202 second=78 amount=-1 +kerning first=366 second=80 amount=-1 +kerning first=304 second=82 amount=-1 +kerning first=72 second=83 amount=-1 +kerning first=79 second=84 amount=-1 +kerning first=8216 second=85 amount=-1 +kerning first=231 second=291 amount=-1 +kerning first=270 second=87 amount=-1 +kerning first=211 second=88 amount=-1 +kerning first=76 second=89 amount=-1 +kerning first=187 second=90 amount=-1 +kerning first=362 second=97 amount=-1 +kerning first=230 second=98 amount=-1 +kerning first=116 second=99 amount=-1 +kerning first=8218 second=100 amount=-1 +kerning first=283 second=101 amount=-1 +kerning first=70 second=102 amount=-1 +kerning first=8218 second=104 amount=-1 +kerning first=88 second=105 amount=-1 +kerning first=187 second=106 amount=-1 +kerning first=192 second=107 amount=-1 +kerning first=253 second=108 amount=-1 +kerning first=304 second=109 amount=-1 +kerning first=327 second=110 amount=-1 +kerning first=364 second=111 amount=-1 +kerning first=99 second=112 amount=-1 +kerning first=233 second=113 amount=-1 +kerning first=110 second=114 amount=-1 +kerning first=291 second=115 amount=-1 +kerning first=194 second=116 amount=-1 +kerning first=364 second=117 amount=-1 +kerning first=8250 second=119 amount=-1 +kerning first=103 second=120 amount=-1 +kerning first=1030 second=1043 amount=-1 +kerning first=89 second=122 amount=-1 +kerning first=336 second=8218 amount=-1 +kerning first=1067 second=1079 amount=-1 +kerning first=8220 second=65 amount=-2 +kerning first=325 second=81 amount=-1 +kerning first=1064 second=1049 amount=-1 +kerning first=197 second=171 amount=-1 +kerning first=121 second=353 amount=-1 +kerning first=282 second=187 amount=-1 +kerning first=356 second=273 amount=-1 +kerning first=368 second=192 amount=-1 +kerning first=45 second=193 amount=-1 +kerning first=8217 second=196 amount=-2 +kerning first=8217 second=197 amount=-2 +kerning first=74 second=198 amount=-1 +kerning first=72 second=199 amount=-1 +kerning first=209 second=201 amount=-1 +kerning first=209 second=202 amount=-1 +kerning first=80 second=203 amount=-1 +kerning first=284 second=204 amount=-1 +kerning first=262 second=205 amount=-1 +kerning first=220 second=206 amount=-1 +kerning first=366 second=207 amount=-1 +kerning first=78 second=209 amount=-1 +kerning first=302 second=210 amount=-1 +kerning first=220 second=211 amount=-1 +kerning first=199 second=212 amount=-1 +kerning first=209 second=213 amount=-1 +kerning first=82 second=214 amount=-1 +kerning first=67 second=216 amount=-1 +kerning first=88 second=217 amount=-1 +kerning first=187 second=218 amount=-1 +kerning first=65 second=219 amount=-1 +kerning first=74 second=80 amount=-1 +kerning first=68 second=221 amount=-1 +kerning first=194 second=223 amount=-1 +kerning first=304 second=224 amount=-1 +kerning first=99 second=225 amount=-1 +kerning first=77 second=227 amount=-1 +kerning first=263 second=228 amount=-1 +kerning first=220 second=230 amount=-1 +kerning first=314 second=231 amount=-1 +kerning first=281 second=232 amount=-1 +kerning first=206 second=234 amount=-1 +kerning first=264 second=8218 amount=-1 +kerning first=231 second=240 amount=-1 +kerning first=77 second=241 amount=-1 +kerning first=266 second=242 amount=-1 +kerning first=226 second=243 amount=-1 +kerning first=281 second=187 amount=-1 +kerning first=304 second=245 amount=-1 +kerning first=8218 second=246 amount=-1 +kerning first=325 second=248 amount=-1 +kerning first=198 second=249 amount=-1 +kerning first=366 second=250 amount=-1 +kerning first=66 second=251 amount=-1 +kerning first=8222 second=252 amount=-1 +kerning first=196 second=253 amount=-1 +kerning first=264 second=254 amount=-1 +kerning first=193 second=255 amount=-1 +kerning first=204 second=257 amount=-1 +kerning first=8217 second=259 amount=-1 +kerning first=323 second=261 amount=-1 +kerning first=187 second=377 amount=-1 +kerning first=367 second=263 amount=-1 +kerning first=344 second=266 amount=-1 +kerning first=229 second=267 amount=-1 +kerning first=85 second=268 amount=-1 +kerning first=266 second=199 amount=-1 +kerning first=218 second=271 amount=-1 +kerning first=217 second=273 amount=-1 +kerning first=369 second=275 amount=-1 +kerning first=45 second=278 amount=-1 +kerning first=235 second=279 amount=-1 +kerning first=217 second=280 amount=-1 +kerning first=289 second=281 amount=-1 +kerning first=45 second=282 amount=-1 +kerning first=305 second=283 amount=-1 +kerning first=310 second=284 amount=-1 +kerning first=8218 second=286 amount=-1 +kerning first=296 second=290 amount=-1 +kerning first=101 second=291 amount=-1 +kerning first=1062 second=1104 amount=-1 +kerning first=355 second=279 amount=-1 +kerning first=270 second=296 amount=-1 +kerning first=68 second=187 amount=-1 +kerning first=272 second=302 amount=-1 +kerning first=195 second=303 amount=-1 +kerning first=206 second=304 amount=-1 +kerning first=269 second=305 amount=-1 +kerning first=287 second=307 amount=-1 +kerning first=70 second=310 amount=-1 +kerning first=279 second=311 amount=-1 +kerning first=259 second=314 amount=-1 +kerning first=266 second=315 amount=-1 +kerning first=79 second=317 amount=-1 +kerning first=227 second=318 amount=-1 +kerning first=78 second=323 amount=-1 +kerning first=231 second=324 amount=-1 +kerning first=78 second=325 amount=-1 +kerning first=263 second=326 amount=-1 +kerning first=73 second=327 amount=-1 +kerning first=45 second=328 amount=-1 +kerning first=74 second=316 amount=-1 +kerning first=268 second=330 amount=-1 +kerning first=80 second=331 amount=-1 +kerning first=203 second=332 amount=-1 +kerning first=289 second=333 amount=-1 +kerning first=325 second=334 amount=-1 +kerning first=362 second=335 amount=-1 +kerning first=355 second=337 amount=-1 +kerning first=366 second=338 amount=-1 +kerning first=78 second=206 amount=-1 +kerning first=210 second=66 amount=-1 +kerning first=82 second=364 amount=-1 +kerning first=78 second=344 amount=-1 +kerning first=201 second=345 amount=-1 +kerning first=72 second=346 amount=-1 +kerning first=291 second=347 amount=-1 +kerning first=204 second=264 amount=-1 +kerning first=209 second=350 amount=-1 +kerning first=217 second=352 amount=-1 +kerning first=264 second=353 amount=-1 +kerning first=274 second=355 amount=-1 +kerning first=196 second=356 amount=-1 +kerning first=194 second=357 amount=-1 +kerning first=324 second=283 amount=-1 +kerning first=88 second=361 amount=-1 +kerning first=298 second=362 amount=-1 +kerning first=45 second=363 amount=-1 +kerning first=67 second=364 amount=-1 +kerning first=8250 second=366 amount=-1 +kerning first=296 second=368 amount=-1 +kerning first=321 second=370 amount=-1 +kerning first=103 second=108 amount=-1 +kerning first=79 second=374 amount=-1 +kerning first=192 second=375 amount=-1 +kerning first=325 second=261 amount=-1 +kerning first=45 second=377 amount=-1 +kerning first=266 second=378 amount=-1 +kerning first=289 second=380 amount=-1 +kerning first=282 second=367 amount=-1 +kerning first=233 second=382 amount=-1 +kerning first=219 second=193 amount=-1 +kerning first=298 second=368 amount=-1 +kerning first=73 second=257 amount=-1 +kerning first=69 second=367 amount=-1 +kerning first=246 second=380 amount=-1 +kerning first=1067 second=1027 amount=-1 +kerning first=354 second=380 amount=-1 +kerning first=68 second=200 amount=-1 +kerning first=8250 second=325 amount=-1 +kerning first=356 second=245 amount=-1 +kerning first=203 second=205 amount=-1 +kerning first=286 second=270 amount=-1 +kerning first=316 second=108 amount=-1 +kerning first=81 second=197 amount=-1 +kerning first=70 second=99 amount=-1 +kerning first=45 second=197 amount=-1 +kerning first=1054 second=1030 amount=-1 +kerning first=262 second=368 amount=-1 +kerning first=350 second=209 amount=-1 +kerning first=338 second=78 amount=-1 +kerning first=355 second=8221 amount=-1 +kerning first=213 second=44 amount=-1 +kerning first=302 second=78 amount=-1 +kerning first=298 second=355 amount=-1 +kerning first=220 second=252 amount=-1 +kerning first=344 second=214 amount=-1 +kerning first=262 second=355 amount=-1 +kerning first=1054 second=1043 amount=-1 +kerning first=307 second=8222 amount=-1 +kerning first=1030 second=1071 amount=-1 +kerning first=1046 second=1116 amount=-1 +kerning first=8250 second=250 amount=-1 +kerning first=71 second=325 amount=-1 +kerning first=364 second=252 amount=-1 +kerning first=366 second=197 amount=-1 +kerning first=266 second=78 amount=-1 +kerning first=85 second=355 amount=-1 +kerning first=8220 second=366 amount=-1 +kerning first=366 second=8249 amount=-2 +kerning first=217 second=248 amount=-1 +kerning first=277 second=117 amount=-1 +kerning first=75 second=8250 amount=-1 +kerning first=1118 second=1116 amount=-1 +kerning first=270 second=282 amount=-1 +kerning first=1051 second=1039 amount=-1 +kerning first=202 second=296 amount=-1 +kerning first=1091 second=1096 amount=-1 +kerning first=72 second=44 amount=-1 +kerning first=200 second=214 amount=-1 +kerning first=121 second=367 amount=-1 +kerning first=8218 second=363 amount=-1 +kerning first=370 second=355 amount=-1 +kerning first=119 second=171 amount=-1 +kerning first=68 second=347 amount=-1 +kerning first=268 second=350 amount=-1 +kerning first=69 second=220 amount=-1 +kerning first=304 second=350 amount=-1 +kerning first=1038 second=1072 amount=-1 +kerning first=1041 second=1059 amount=-1 +kerning first=229 second=333 amount=-1 +kerning first=73 second=77 amount=-1 +kerning first=1118 second=1103 amount=-1 +kerning first=112 second=382 amount=-1 +kerning first=354 second=246 amount=-1 +kerning first=1054 second=1056 amount=-1 +kerning first=263 second=251 amount=-1 +kerning first=217 second=382 amount=-1 +kerning first=119 second=289 amount=-1 +kerning first=1048 second=1048 amount=-1 +kerning first=86 second=100 amount=-1 +kerning first=250 second=103 amount=-1 +kerning first=284 second=327 amount=-1 +kerning first=350 second=330 amount=-1 +kerning first=224 second=289 amount=-1 +kerning first=282 second=77 amount=-1 +kerning first=1051 second=1065 amount=-1 +kerning first=217 second=8218 amount=-2 +kerning first=1049 second=1094 amount=-1 +kerning first=1088 second=1113 amount=-1 +kerning first=286 second=77 amount=-1 +kerning first=105 second=246 amount=-1 +kerning first=65 second=356 amount=-1 +kerning first=1062 second=1091 amount=-1 +kerning first=326 second=281 amount=-1 +kerning first=210 second=220 amount=-1 +kerning first=214 second=77 amount=-1 +kerning first=366 second=171 amount=-2 +kerning first=362 second=281 amount=-1 +kerning first=244 second=378 amount=-1 +kerning first=296 second=109 amount=-1 +kerning first=87 second=120 amount=-1 +kerning first=220 second=85 amount=-1 +kerning first=79 second=85 amount=-1 +kerning first=298 second=72 amount=-1 +kerning first=72 second=211 amount=-1 +kerning first=264 second=120 amount=-1 +kerning first=1038 second=1079 amount=-1 +kerning first=77 second=281 amount=-1 +kerning first=253 second=382 amount=-1 +kerning first=275 second=339 amount=-1 +kerning first=202 second=332 amount=-1 +kerning first=289 second=382 amount=-1 +kerning first=231 second=275 amount=-1 +kerning first=325 second=382 amount=-1 +kerning first=74 second=290 amount=-1 +kerning first=1060 second=1025 amount=-1 +kerning first=8250 second=374 amount=-2 +kerning first=281 second=347 amount=-1 +kerning first=310 second=332 amount=-1 +kerning first=1048 second=1074 amount=-1 +kerning first=1071 second=1051 amount=-1 +kerning first=274 second=332 amount=-1 +kerning first=209 second=347 amount=-1 +kerning first=1065 second=1108 amount=-1 +kerning first=264 second=313 amount=-1 +kerning first=1091 second=1076 amount=-1 +kerning first=267 second=111 amount=-1 +kerning first=310 second=8250 amount=-1 +kerning first=263 second=254 amount=-1 +kerning first=279 second=337 amount=-1 +kerning first=272 second=374 amount=-1 +kerning first=274 second=8250 amount=-1 +kerning first=233 second=357 amount=-1 +kerning first=205 second=113 amount=-1 +kerning first=302 second=271 amount=-1 +kerning first=370 second=195 amount=-1 +kerning first=266 second=271 amount=-1 +kerning first=1055 second=1076 amount=-1 +kerning first=67 second=8221 amount=-1 +kerning first=202 second=8250 amount=-1 +kerning first=205 second=323 amount=-1 +kerning first=374 second=271 amount=-1 +kerning first=219 second=219 amount=-1 +kerning first=1047 second=1041 amount=-1 +kerning first=97 second=8250 amount=-1 +kerning first=1053 second=1118 amount=-1 +kerning first=197 second=357 amount=-1 +kerning first=8216 second=368 amount=-1 +kerning first=187 second=76 amount=-1 +kerning first=269 second=107 amount=-1 +kerning first=1059 second=1071 amount=-1 +kerning first=248 second=8217 amount=-2 +kerning first=193 second=212 amount=-1 +kerning first=284 second=8217 amount=-1 +kerning first=356 second=8217 amount=-1 +kerning first=1039 second=1075 amount=-1 +kerning first=71 second=8217 amount=-1 +kerning first=364 second=85 amount=-1 +kerning first=1067 second=1107 amount=-1 +kerning first=107 second=8217 amount=-1 +kerning first=197 second=262 amount=-1 +kerning first=202 second=310 amount=-1 +kerning first=88 second=212 amount=-1 +kerning first=231 second=111 amount=-1 +kerning first=194 second=366 amount=-1 +kerning first=217 second=68 amount=-1 +kerning first=330 second=331 amount=-1 +kerning first=278 second=8250 amount=-1 +kerning first=325 second=68 amount=-1 +kerning first=366 second=331 amount=-1 +kerning first=67 second=314 amount=-1 +kerning first=224 second=263 amount=-1 +kerning first=1068 second=1024 amount=-1 +kerning first=1041 second=1025 amount=-1 +kerning first=1053 second=1027 amount=-1 +kerning first=1040 second=1028 amount=-1 +kerning first=1060 second=1030 amount=-1 +kerning first=1064 second=1031 amount=-1 +kerning first=1060 second=1034 amount=-1 +kerning first=316 second=314 amount=-1 +kerning first=1041 second=1036 amount=-1 +kerning first=296 second=263 amount=-1 +kerning first=1068 second=1038 amount=-2 +kerning first=1064 second=1039 amount=-1 +kerning first=203 second=365 amount=-1 +kerning first=119 second=117 amount=-1 +kerning first=234 second=314 amount=-1 +kerning first=298 second=67 amount=-1 +kerning first=1041 second=1044 amount=-1 +kerning first=1041 second=1045 amount=-1 +kerning first=1040 second=1047 amount=-1 +kerning first=1041 second=1048 amount=-1 +kerning first=1069 second=1049 amount=-1 +kerning first=1071 second=1050 amount=-1 +kerning first=1052 second=1051 amount=-1 +kerning first=1041 second=1052 amount=-1 +kerning first=1042 second=1053 amount=-1 +kerning first=1046 second=1054 amount=-1 +kerning first=1051 second=1055 amount=-1 +kerning first=1053 second=1056 amount=-1 +kerning first=1065 second=1057 amount=-1 +kerning first=1060 second=1059 amount=-1 +kerning first=1046 second=1060 amount=-1 +kerning first=1041 second=1061 amount=-1 +kerning first=1034 second=1062 amount=-1 +kerning first=1040 second=1063 amount=-2 +kerning first=1041 second=1064 amount=-1 +kerning first=1054 second=1065 amount=-1 +kerning first=262 second=67 amount=-1 +kerning first=1041 second=1068 amount=-1 +kerning first=1049 second=1069 amount=-1 +kerning first=1049 second=1070 amount=-1 +kerning first=1071 second=1071 amount=-1 +kerning first=1053 second=1072 amount=-1 +kerning first=1040 second=1073 amount=-1 +kerning first=1027 second=1074 amount=-1 +kerning first=8250 second=70 amount=-1 +kerning first=1078 second=1076 amount=-1 +kerning first=1050 second=1077 amount=-1 +kerning first=1073 second=1078 amount=-1 +kerning first=1051 second=1079 amount=-1 +kerning first=1059 second=1080 amount=-1 +kerning first=1042 second=1081 amount=-1 +kerning first=1041 second=1082 amount=-1 +kerning first=1041 second=1083 amount=-1 +kerning first=1056 second=1084 amount=-1 +kerning first=1041 second=1085 amount=-1 +kerning first=1071 second=1086 amount=-1 +kerning first=1058 second=1087 amount=-1 +kerning first=1027 second=1088 amount=-1 +kerning first=1027 second=1089 amount=-1 +kerning first=1041 second=1090 amount=-1 +kerning first=1077 second=1091 amount=-1 +kerning first=8218 second=307 amount=-1 +kerning first=338 second=366 amount=-1 +kerning first=1048 second=1094 amount=-1 +kerning first=1094 second=1095 amount=-1 +kerning first=1040 second=1096 amount=-1 +kerning first=1076 second=1097 amount=-1 +kerning first=1052 second=1098 amount=-1 +kerning first=85 second=67 amount=-1 +kerning first=1059 second=1100 amount=-1 +kerning first=1065 second=1101 amount=-1 +kerning first=1041 second=1102 amount=-1 +kerning first=1078 second=1103 amount=-1 +kerning first=1027 second=1104 amount=-1 +kerning first=207 second=229 amount=-1 +kerning first=1027 second=1107 amount=-1 +kerning first=1049 second=1108 amount=-1 +kerning first=266 second=366 amount=-1 +kerning first=1054 second=1113 amount=-1 +kerning first=89 second=271 amount=-1 +kerning first=268 second=203 amount=-1 +kerning first=344 second=374 amount=-1 +kerning first=1047 second=1117 amount=-1 +kerning first=1105 second=1118 amount=-1 +kerning first=1065 second=1119 amount=-1 +kerning first=194 second=104 amount=-1 +kerning first=230 second=104 amount=-1 +kerning first=256 second=46 amount=-1 +kerning first=87 second=192 amount=-1 +kerning first=296 second=70 amount=-1 +kerning first=73 second=378 amount=-1 +kerning first=68 second=46 amount=-1 +kerning first=207 second=101 amount=-1 +kerning first=209 second=46 amount=-1 +kerning first=83 second=70 amount=-1 +kerning first=279 second=101 amount=-1 +kerning first=281 second=46 amount=-1 +kerning first=270 second=76 amount=-1 +kerning first=1064 second=1075 amount=-1 +kerning first=67 second=262 amount=-1 +kerning first=69 second=207 amount=-1 +kerning first=8218 second=261 amount=-1 +kerning first=198 second=76 amount=-1 +kerning first=280 second=262 amount=-1 +kerning first=207 second=286 amount=-1 +kerning first=73 second=296 amount=-1 +kerning first=201 second=8217 amount=-1 +kerning first=66 second=216 amount=-1 +kerning first=207 second=216 amount=-1 +kerning first=1059 second=1087 amount=-1 +kerning first=258 second=357 amount=-1 +kerning first=286 second=296 amount=-1 +kerning first=266 second=104 amount=-1 +kerning first=366 second=357 amount=-1 +kerning first=97 second=345 amount=-1 +kerning first=214 second=296 amount=-1 +kerning first=212 second=204 amount=-1 +kerning first=196 second=311 amount=-1 +kerning first=232 second=311 amount=-1 +kerning first=202 second=345 amount=-1 +kerning first=78 second=366 amount=-1 +kerning first=253 second=369 amount=-1 +kerning first=8250 second=262 amount=-1 +kerning first=274 second=280 amount=-1 +kerning first=274 second=345 amount=-1 +kerning first=217 second=369 amount=-1 +kerning first=368 second=122 amount=-1 +kerning first=366 second=210 amount=-1 +kerning first=354 second=259 amount=-1 +kerning first=8217 second=100 amount=-1 +kerning first=310 second=345 amount=-1 +kerning first=70 second=8218 amount=-2 +kerning first=213 second=198 amount=-1 +kerning first=346 second=280 amount=-1 +kerning first=346 second=345 amount=-1 +kerning first=112 second=287 amount=-1 +kerning first=1053 second=1105 amount=-1 +kerning first=296 second=122 amount=-1 +kerning first=221 second=225 amount=-1 +kerning first=330 second=210 amount=-1 +kerning first=8250 second=109 amount=-1 +kerning first=1056 second=1096 amount=-1 +kerning first=210 second=207 amount=-1 +kerning first=66 second=210 amount=-1 +kerning first=258 second=210 amount=-1 +kerning first=65 second=318 amount=-1 +kerning first=289 second=287 amount=-1 +kerning first=263 second=113 amount=-1 +kerning first=282 second=207 amount=-1 +kerning first=253 second=287 amount=-1 +kerning first=1030 second=1113 amount=-1 +kerning first=327 second=366 amount=-1 +kerning first=45 second=210 amount=-1 +kerning first=1038 second=1114 amount=-1 +kerning first=201 second=67 amount=-1 +kerning first=219 second=366 amount=-1 +kerning first=227 second=113 amount=-1 +kerning first=277 second=271 amount=-1 +kerning first=205 second=336 amount=-1 +kerning first=86 second=113 amount=-1 +kerning first=8218 second=279 amount=-1 +kerning first=74 second=195 amount=-1 +kerning first=346 second=8250 amount=-1 +kerning first=279 second=281 amount=-1 +kerning first=109 second=244 amount=-1 +kerning first=79 second=278 amount=-1 +kerning first=200 second=73 amount=-1 +kerning first=220 second=347 amount=-1 +kerning first=272 second=73 amount=-1 +kerning first=207 second=268 amount=-1 +kerning first=1048 second=1108 amount=-1 +kerning first=235 second=8220 amount=-2 +kerning first=344 second=86 amount=-1 +kerning first=79 second=347 amount=-1 +kerning first=220 second=278 amount=-1 +kerning first=323 second=97 amount=-1 +kerning first=307 second=8220 amount=-1 +kerning first=272 second=86 amount=-1 +kerning first=66 second=268 amount=-1 +kerning first=271 second=8220 amount=-1 +kerning first=258 second=303 amount=-1 +kerning first=84 second=283 amount=-1 +kerning first=281 second=365 amount=-1 +kerning first=364 second=278 amount=-1 +kerning first=99 second=277 amount=-1 +kerning first=364 second=323 amount=-1 +kerning first=1030 second=1099 amount=-1 +kerning first=250 second=267 amount=-1 +kerning first=203 second=77 amount=-1 +kerning first=8250 second=122 amount=-1 +kerning first=217 second=235 amount=-1 +kerning first=207 second=281 amount=-1 +kerning first=240 second=277 amount=-1 +kerning first=369 second=283 amount=-1 +kerning first=259 second=269 amount=-1 +kerning first=80 second=79 amount=-1 +kerning first=70 second=253 amount=-1 +kerning first=8217 second=267 amount=-1 +kerning first=1038 second=1081 amount=-1 +kerning first=225 second=283 amount=-1 +kerning first=103 second=246 amount=-1 +kerning first=275 second=231 amount=-1 +kerning first=261 second=283 amount=-1 +kerning first=84 second=380 amount=-1 +kerning first=219 second=65 amount=-1 +kerning first=187 second=338 amount=-1 +kerning first=367 second=269 amount=-1 +kerning first=85 second=260 amount=-1 +kerning first=379 second=8220 amount=-1 +kerning first=82 second=338 amount=-1 +kerning first=196 second=363 amount=-1 +kerning first=8250 second=290 amount=-1 +kerning first=232 second=363 amount=-1 +kerning first=201 second=286 amount=-1 +kerning first=221 second=79 amount=-1 +kerning first=364 second=347 amount=-1 +kerning first=73 second=244 amount=-1 +kerning first=334 second=8250 amount=-1 +kerning first=111 second=289 amount=-1 +kerning first=264 second=261 amount=-1 +kerning first=67 second=275 amount=-1 +kerning first=85 second=85 amount=-1 +kerning first=1036 second=1097 amount=-1 +kerning first=334 second=260 amount=-1 +kerning first=201 second=80 amount=-1 +kerning first=370 second=260 amount=-1 +kerning first=375 second=8222 amount=-1 +kerning first=264 second=82 amount=-1 +kerning first=279 second=114 amount=-1 +kerning first=82 second=217 amount=-1 +kerning first=66 second=114 amount=-1 +kerning first=334 second=368 amount=-1 +kerning first=81 second=344 amount=-1 +kerning first=88 second=251 amount=-1 +kerning first=267 second=8222 amount=-1 +kerning first=231 second=8222 amount=-1 +kerning first=68 second=115 amount=-1 +kerning first=8220 second=193 amount=-2 +kerning first=78 second=353 amount=-1 +kerning first=288 second=310 amount=-1 +kerning first=1051 second=1070 amount=-1 +kerning first=193 second=251 amount=-1 +kerning first=264 second=205 amount=-1 +kerning first=281 second=115 amount=-1 +kerning first=87 second=261 amount=-1 +kerning first=219 second=353 amount=-1 +kerning first=1056 second=1027 amount=-1 +kerning first=89 second=258 amount=-1 +kerning first=205 second=284 amount=-1 +kerning first=1031 second=1053 amount=-1 +kerning first=291 second=353 amount=-1 +kerning first=1067 second=1053 amount=-1 +kerning first=200 second=81 amount=-1 +kerning first=289 second=235 amount=-1 +kerning first=375 second=252 amount=-1 +kerning first=325 second=235 amount=-1 +kerning first=197 second=249 amount=-1 +kerning first=1055 second=1037 amount=-1 +kerning first=233 second=249 amount=-1 +kerning first=288 second=362 amount=-1 +kerning first=1030 second=1092 amount=-1 +kerning first=232 second=242 amount=-1 +kerning first=316 second=380 amount=-1 +kerning first=268 second=242 amount=-1 +kerning first=8218 second=107 amount=-1 +kerning first=8222 second=311 amount=-1 +kerning first=1027 second=1116 amount=-1 +kerning first=248 second=106 amount=-1 +kerning first=209 second=200 amount=-1 +kerning first=74 second=97 amount=-1 +kerning first=304 second=242 amount=-1 +kerning first=366 second=223 amount=-1 +kerning first=88 second=45 amount=-1 +kerning first=1034 second=1044 amount=-1 +kerning first=324 second=248 amount=-1 +kerning first=269 second=249 amount=-1 +kerning first=75 second=362 amount=-1 +kerning first=231 second=252 amount=-1 +kerning first=339 second=252 amount=-1 +kerning first=204 second=71 amount=-1 +kerning first=364 second=226 amount=-1 +kerning first=316 second=275 amount=-1 +kerning first=71 second=270 amount=-1 +kerning first=235 second=233 amount=-1 +kerning first=328 second=291 amount=-1 +kerning first=271 second=233 amount=-1 +kerning first=45 second=223 amount=-1 +kerning first=70 second=364 amount=-1 +kerning first=199 second=233 amount=-1 +kerning first=199 second=302 amount=-1 +kerning first=258 second=223 amount=-1 +kerning first=115 second=291 amount=-1 +kerning first=307 second=233 amount=-1 +kerning first=67 second=327 amount=-1 +kerning first=200 second=361 amount=-1 +kerning first=250 second=101 amount=-1 +kerning first=1048 second=1113 amount=-1 +kerning first=224 second=122 amount=-1 +kerning first=369 second=335 amount=-1 +kerning first=234 second=243 amount=-1 +kerning first=327 second=232 amount=-1 +kerning first=291 second=232 amount=-1 +kerning first=119 second=122 amount=-1 +kerning first=1101 second=1083 amount=-1 +kerning first=209 second=8217 amount=-1 +kerning first=218 second=284 amount=-1 +kerning first=219 second=232 amount=-1 +kerning first=1058 second=1080 amount=-1 +kerning first=110 second=8221 amount=-2 +kerning first=280 second=327 amount=-1 +kerning first=8218 second=382 amount=-1 +kerning first=264 second=107 amount=-1 +kerning first=352 second=327 amount=-1 +kerning first=268 second=311 amount=-1 +kerning first=251 second=8221 amount=-1 +kerning first=363 second=232 amount=-1 +kerning first=207 second=337 amount=-1 +kerning first=338 second=250 amount=-1 +kerning first=1051 second=1077 amount=-1 +kerning first=204 second=225 amount=-1 +kerning first=45 second=211 amount=-1 +kerning first=8222 second=363 amount=-1 +kerning first=70 second=318 amount=-1 +kerning first=8216 second=260 amount=-2 +kerning first=1059 second=1113 amount=-1 +kerning first=220 second=72 amount=-1 +kerning first=270 second=89 amount=-1 +kerning first=79 second=72 amount=-1 +kerning first=78 second=232 amount=-1 +kerning first=71 second=76 amount=-1 +kerning first=261 second=335 amount=-1 +kerning first=1075 second=1088 amount=-1 +kerning first=1051 second=1104 amount=-1 +kerning first=353 second=46 amount=-1 +kerning first=283 second=318 amount=-1 +kerning first=364 second=72 amount=-1 +kerning first=1049 second=1055 amount=-1 +kerning first=267 second=98 amount=-1 +kerning first=330 second=344 amount=-1 +kerning first=263 second=267 amount=-1 +kerning first=195 second=98 amount=-1 +kerning first=8222 second=107 amount=-1 +kerning first=88 second=199 amount=-1 +kerning first=212 second=325 amount=-1 +kerning first=366 second=344 amount=-1 +kerning first=1053 second=1036 amount=-1 +kerning first=298 second=210 amount=-1 +kerning first=193 second=199 amount=-1 +kerning first=375 second=98 amount=-1 +kerning first=86 second=267 amount=-1 +kerning first=339 second=98 amount=-1 +kerning first=324 second=267 amount=-1 +kerning first=362 second=212 amount=-1 +kerning first=1056 second=1070 amount=-1 +kerning first=8218 second=235 amount=-1 +kerning first=218 second=212 amount=-1 +kerning first=337 second=114 amount=-1 +kerning first=1036 second=1028 amount=-1 +kerning first=67 second=206 amount=-1 +kerning first=252 second=267 amount=-1 +kerning first=105 second=118 amount=-1 +kerning first=229 second=114 amount=-1 +kerning first=1053 second=1079 amount=-1 +kerning first=118 second=115 amount=-1 +kerning first=352 second=206 amount=-1 +kerning first=193 second=114 amount=-1 +kerning first=100 second=245 amount=-1 +kerning first=77 second=212 amount=-1 +kerning first=1118 second=1096 amount=-1 +kerning first=219 second=258 amount=-1 +kerning first=282 second=315 amount=-1 +kerning first=355 second=8249 amount=-1 +kerning first=280 second=206 amount=-1 +kerning first=206 second=111 amount=-1 +kerning first=8222 second=242 amount=-1 +kerning first=73 second=352 amount=-1 +kerning first=314 second=111 amount=-1 +kerning first=88 second=114 amount=-1 +kerning first=74 second=368 amount=-1 +kerning first=302 second=310 amount=-1 +kerning first=235 second=263 amount=-1 +kerning first=8217 second=336 amount=-1 +kerning first=266 second=310 amount=-1 +kerning first=85 second=120 amount=-1 +kerning first=70 second=197 amount=-1 +kerning first=67 second=370 amount=-1 +kerning first=8250 second=117 amount=-1 +kerning first=1118 second=1082 amount=-1 +kerning first=307 second=263 amount=-1 +kerning first=211 second=197 amount=-1 +kerning first=278 second=81 amount=-1 +kerning first=70 second=8249 amount=-2 +kerning first=87 second=365 amount=-1 +kerning first=106 second=8249 amount=-1 +kerning first=339 second=8218 amount=-1 +kerning first=108 second=8221 amount=-1 +kerning first=255 second=8222 amount=-1 +kerning first=70 second=331 amount=-1 +kerning first=264 second=68 amount=-1 +kerning first=1033 second=1037 amount=-1 +kerning first=209 second=72 amount=-1 +kerning first=352 second=370 amount=-1 +kerning first=1069 second=1037 amount=-1 +kerning first=75 second=8249 amount=-1 +kerning first=280 second=370 amount=-1 +kerning first=204 second=199 amount=-1 +kerning first=121 second=106 amount=-1 +kerning first=70 second=361 amount=-1 +kerning first=1064 second=1101 amount=-1 +kerning first=338 second=310 amount=-1 +kerning first=202 second=67 amount=-1 +kerning first=1055 second=1024 amount=-1 +kerning first=364 second=8222 amount=-2 +kerning first=362 second=346 amount=-1 +kerning first=70 second=227 amount=-1 +kerning first=68 second=282 amount=-1 +kerning first=220 second=298 amount=-1 +kerning first=220 second=8222 amount=-2 +kerning first=218 second=346 amount=-1 +kerning first=266 second=327 amount=-1 +kerning first=73 second=207 amount=-1 +kerning first=302 second=327 amount=-1 +kerning first=115 second=8222 amount=-1 +kerning first=338 second=327 amount=-1 +kerning first=79 second=8222 amount=-1 +kerning first=77 second=346 amount=-1 +kerning first=80 second=350 amount=-1 +kerning first=314 second=291 amount=-1 +kerning first=219 second=288 amount=-1 +kerning first=116 second=337 amount=-1 +kerning first=364 second=334 amount=-1 +kerning first=78 second=288 amount=-1 +kerning first=80 second=337 amount=-1 +kerning first=242 second=291 amount=-1 +kerning first=346 second=44 amount=-1 +kerning first=219 second=8218 amount=-2 +kerning first=327 second=288 amount=-1 +kerning first=206 second=81 amount=-1 +kerning first=1066 second=1046 amount=-1 +kerning first=197 second=318 amount=-1 +kerning first=192 second=253 amount=-1 +kerning first=233 second=318 amount=-1 +kerning first=290 second=75 amount=-1 +kerning first=269 second=318 amount=-1 +kerning first=1033 second=1050 amount=-1 +kerning first=1053 second=1098 amount=-1 +kerning first=84 second=46 amount=-1 +kerning first=365 second=337 amount=-1 +kerning first=234 second=187 amount=-1 +kerning first=1058 second=1119 amount=-1 +kerning first=85 second=195 amount=-1 +kerning first=270 second=187 amount=-1 +kerning first=1060 second=1064 amount=-1 +kerning first=77 second=75 amount=-1 +kerning first=277 second=245 amount=-1 +kerning first=257 second=337 amount=-1 +kerning first=241 second=245 amount=-1 +kerning first=198 second=187 amount=-1 +kerning first=221 second=337 amount=-1 +kerning first=205 second=245 amount=-1 +kerning first=356 second=230 amount=-1 +kerning first=330 second=279 amount=-1 +kerning first=1039 second=1036 amount=-1 +kerning first=366 second=279 amount=-1 +kerning first=345 second=226 amount=-1 +kerning first=268 second=234 amount=-1 +kerning first=327 second=364 amount=-1 +kerning first=305 second=8250 amount=-1 +kerning first=199 second=243 amount=-1 +kerning first=8218 second=339 amount=-1 +kerning first=196 second=105 amount=-1 +kerning first=1066 second=1059 amount=-2 +kerning first=362 second=75 amount=-1 +kerning first=86 second=332 amount=-1 +kerning first=262 second=316 amount=-1 +kerning first=82 second=8217 amount=-1 +kerning first=205 second=202 amount=-1 +kerning first=226 second=316 amount=-1 +kerning first=118 second=8217 amount=-2 +kerning first=86 second=8250 amount=-1 +kerning first=374 second=117 amount=-1 +kerning first=323 second=264 amount=-1 +kerning first=201 second=362 amount=-1 +kerning first=345 second=8220 amount=-1 +kerning first=364 second=80 amount=-1 +kerning first=338 second=117 amount=-1 +kerning first=270 second=351 amount=-1 +kerning first=234 second=351 amount=-1 +kerning first=1071 second=1025 amount=-1 +kerning first=8222 second=105 amount=-1 +kerning first=278 second=361 amount=-1 +kerning first=88 second=307 amount=-1 +kerning first=233 second=108 amount=-1 +kerning first=74 second=264 amount=-1 +kerning first=280 second=69 amount=-1 +kerning first=1057 second=1073 amount=-1 +kerning first=325 second=8217 amount=-1 +kerning first=268 second=248 amount=-1 +kerning first=193 second=307 amount=-1 +kerning first=330 second=82 amount=-1 +kerning first=284 second=364 amount=-1 +kerning first=352 second=69 amount=-1 +kerning first=197 second=108 amount=-1 +kerning first=223 second=8217 amount=-2 +kerning first=212 second=364 amount=-1 +kerning first=1069 second=1050 amount=-1 +kerning first=338 second=323 amount=-1 +kerning first=366 second=82 amount=-1 +kerning first=302 second=323 amount=-1 +kerning first=266 second=323 amount=-1 +kerning first=201 second=338 amount=-1 +kerning first=71 second=364 amount=-1 +kerning first=262 second=286 amount=-1 +kerning first=84 second=103 amount=-1 +kerning first=8250 second=194 amount=-1 +kerning first=298 second=286 amount=-1 +kerning first=1062 second=1117 amount=-1 +kerning first=249 second=113 amount=-1 +kerning first=67 second=69 amount=-1 +kerning first=268 second=262 amount=-1 +kerning first=268 second=171 amount=-1 +kerning first=187 second=325 amount=-1 +kerning first=370 second=286 amount=-1 +kerning first=199 second=257 amount=-1 +kerning first=74 second=355 amount=-1 +kerning first=1047 second=1067 amount=-1 +kerning first=85 second=286 amount=-1 +kerning first=335 second=316 amount=-1 +kerning first=197 second=314 amount=-1 +kerning first=81 second=82 amount=-1 +kerning first=68 second=72 amount=-1 +kerning first=72 second=113 amount=-1 +kerning first=108 second=113 amount=-1 +kerning first=73 second=8250 amount=-1 +kerning first=1040 second=1069 amount=-1 +kerning first=325 second=317 amount=-1 +kerning first=269 second=314 amount=-1 +kerning first=233 second=314 amount=-1 +kerning first=8222 second=229 amount=-1 +kerning first=323 second=355 amount=-1 +kerning first=287 second=355 amount=-1 +kerning first=230 second=117 amount=-1 +kerning first=209 second=282 amount=-1 +kerning first=121 second=316 amount=-1 +kerning first=194 second=117 amount=-1 +kerning first=277 second=267 amount=-1 +kerning first=1048 second=1100 amount=-1 +kerning first=235 second=289 amount=-1 +kerning first=264 second=339 amount=-1 +kerning first=268 second=229 amount=-1 +kerning first=228 second=339 amount=-1 +kerning first=307 second=289 amount=-1 +kerning first=195 second=356 amount=-1 +kerning first=1049 second=1042 amount=-1 +kerning first=271 second=289 amount=-1 +kerning first=304 second=229 amount=-1 +kerning first=269 second=171 amount=-1 +kerning first=1053 second=1049 amount=-1 +kerning first=232 second=101 amount=-1 +kerning first=365 second=246 amount=-1 +kerning first=369 second=103 amount=-1 +kerning first=364 second=304 amount=-1 +kerning first=304 second=101 amount=-1 +kerning first=368 second=194 amount=-1 +kerning first=66 second=315 amount=-1 +kerning first=257 second=246 amount=-1 +kerning first=240 second=333 amount=-1 +kerning first=220 second=256 amount=-1 +kerning first=362 second=246 amount=-1 +kerning first=221 second=246 amount=-1 +kerning first=225 second=103 amount=-1 +kerning first=220 second=304 amount=-1 +kerning first=199 second=220 amount=-1 +kerning first=1051 second=1091 amount=-1 +kerning first=116 second=246 amount=-1 +kerning first=204 second=333 amount=-1 +kerning first=275 second=120 amount=-1 +kerning first=69 second=315 amount=-1 +kerning first=202 second=211 amount=-1 +kerning first=72 second=109 amount=-1 +kerning first=45 second=86 amount=-2 +kerning first=79 second=304 amount=-1 +kerning first=81 second=86 amount=-1 +kerning first=325 second=313 amount=-1 +kerning first=347 second=8218 amount=-1 +kerning first=195 second=85 amount=-1 +kerning first=311 second=8218 amount=-1 +kerning first=288 second=202 amount=-1 +kerning first=229 second=281 amount=-1 +kerning first=101 second=382 amount=-1 +kerning first=87 second=339 amount=-1 +kerning first=101 second=287 amount=-1 +kerning first=206 second=382 amount=-1 +kerning first=304 second=298 amount=-1 +kerning first=242 second=382 amount=-1 +kerning first=8217 second=332 amount=-1 +kerning first=274 second=211 amount=-1 +kerning first=1056 second=1040 amount=-1 +kerning first=262 second=290 amount=-1 +kerning first=68 second=65 amount=-1 +kerning first=98 second=120 amount=-1 +kerning first=314 second=382 amount=-1 +kerning first=8250 second=198 amount=-1 +kerning first=298 second=290 amount=-1 +kerning first=242 second=287 amount=-1 +kerning first=263 second=8250 amount=-1 +kerning first=310 second=211 amount=-1 +kerning first=258 second=86 amount=-1 +kerning first=370 second=290 amount=-1 +kerning first=1046 second=1090 amount=-1 +kerning first=289 second=339 amount=-1 +kerning first=289 second=107 amount=-1 +kerning first=83 second=302 amount=-1 +kerning first=253 second=107 amount=-1 +kerning first=246 second=289 amount=-1 +kerning first=325 second=339 amount=-1 +kerning first=83 second=8220 amount=-1 +kerning first=8217 second=362 amount=-1 +kerning first=1052 second=1067 amount=-1 +kerning first=338 second=219 amount=-1 +kerning first=356 second=234 amount=-1 +kerning first=1118 second=1090 amount=-1 +kerning first=252 second=101 amount=-1 +kerning first=219 second=211 amount=-1 +kerning first=68 second=278 amount=-1 +kerning first=266 second=219 amount=-1 +kerning first=217 second=339 amount=-1 +kerning first=8222 second=268 amount=-1 +kerning first=119 second=8220 amount=-2 +kerning first=302 second=219 amount=-1 +kerning first=194 second=219 amount=-1 +kerning first=79 second=330 amount=-1 +kerning first=103 second=232 amount=-1 +kerning first=106 second=8222 amount=-1 +kerning first=220 second=330 amount=-1 +kerning first=67 second=232 amount=-1 +kerning first=279 second=365 amount=-1 +kerning first=271 second=122 amount=-1 +kerning first=1059 second=1057 amount=-1 +kerning first=1042 second=1118 amount=-1 +kerning first=209 second=278 amount=-1 +kerning first=72 second=280 amount=-1 +kerning first=316 second=232 amount=-1 +kerning first=199 second=122 amount=-1 +kerning first=253 second=187 amount=-1 +kerning first=205 second=74 amount=-1 +kerning first=1046 second=1101 amount=-1 +kerning first=66 second=298 amount=-1 +kerning first=1046 second=1094 amount=-1 +kerning first=68 second=76 amount=-1 +kerning first=1060 second=1047 amount=-1 +kerning first=323 second=225 amount=-1 +kerning first=66 second=363 amount=-1 +kerning first=187 second=89 amount=-2 +kerning first=1027 second=1094 amount=-1 +kerning first=207 second=298 amount=-1 +kerning first=350 second=85 amount=-1 +kerning first=101 second=246 amount=-1 +kerning first=352 second=8217 amount=-1 +kerning first=370 second=296 amount=-1 +kerning first=8218 second=314 amount=-1 +kerning first=279 second=363 amount=-1 +kerning first=278 second=85 amount=-1 +kerning first=77 second=216 amount=-1 +kerning first=260 second=8220 amount=-2 +kerning first=234 second=46 amount=-1 +kerning first=224 second=8220 amount=-2 +kerning first=206 second=85 amount=-1 +kerning first=332 second=8220 amount=-2 +kerning first=74 second=225 amount=-1 +kerning first=1051 second=1028 amount=-1 +kerning first=65 second=85 amount=-1 +kerning first=205 second=241 amount=-1 +kerning first=74 second=260 amount=-1 +kerning first=368 second=8220 amount=-1 +kerning first=368 second=302 amount=-1 +kerning first=355 second=283 amount=-1 +kerning first=105 second=289 amount=-1 +kerning first=296 second=302 amount=-1 +kerning first=1060 second=1038 amount=-1 +kerning first=72 second=70 amount=-1 +kerning first=266 second=82 amount=-1 +kerning first=287 second=109 amount=-1 +kerning first=261 second=378 amount=-1 +kerning first=78 second=262 amount=-1 +kerning first=80 second=207 amount=-1 +kerning first=225 second=378 amount=-1 +kerning first=277 second=104 amount=-1 +kerning first=213 second=70 amount=-1 +kerning first=1053 second=1075 amount=-1 +kerning first=352 second=366 amount=-1 +kerning first=346 second=250 amount=-1 +kerning first=310 second=250 amount=-1 +kerning first=280 second=366 amount=-1 +kerning first=274 second=250 amount=-1 +kerning first=219 second=262 amount=-1 +kerning first=333 second=378 amount=-1 +kerning first=8218 second=231 amount=-1 +kerning first=200 second=317 amount=-1 +kerning first=1053 second=1070 amount=-1 +kerning first=86 second=198 amount=-1 +kerning first=324 second=8221 amount=-2 +kerning first=209 second=76 amount=-1 +kerning first=304 second=225 amount=-1 +kerning first=362 second=216 amount=-1 +kerning first=1046 second=1073 amount=-1 +kerning first=84 second=378 amount=-1 +kerning first=67 second=339 amount=-1 +kerning first=45 second=253 amount=-1 +kerning first=272 second=201 amount=-1 +kerning first=218 second=251 amount=-1 +kerning first=1086 second=1084 amount=-1 +kerning first=200 second=201 amount=-1 +kerning first=97 second=113 amount=-1 +kerning first=73 second=116 amount=-1 +kerning first=362 second=251 amount=-1 +kerning first=8220 second=353 amount=-1 +kerning first=80 second=242 amount=-1 +kerning first=199 second=259 amount=-1 +kerning first=201 second=204 amount=-1 +kerning first=255 second=250 amount=-1 +kerning first=68 second=44 amount=-1 +kerning first=368 second=198 amount=-1 +kerning first=230 second=99 amount=-1 +kerning first=257 second=242 amount=-1 +kerning first=196 second=268 amount=-1 +kerning first=87 second=369 amount=-1 +kerning first=206 second=317 amount=-1 +kerning first=275 second=8218 amount=-1 +kerning first=267 second=8217 amount=-2 +kerning first=278 second=317 amount=-1 +kerning first=187 second=256 amount=-1 +kerning first=197 second=210 amount=-1 +kerning first=67 second=366 amount=-1 +kerning first=350 second=317 amount=-1 +kerning first=1060 second=1061 amount=-1 +kerning first=304 second=268 amount=-1 +kerning first=192 second=369 amount=-1 +kerning first=365 second=242 amount=-1 +kerning first=1073 second=1113 amount=-1 +kerning first=324 second=171 amount=-1 +kerning first=218 second=207 amount=-1 +kerning first=369 second=244 amount=-1 +kerning first=272 second=69 amount=-1 +kerning first=78 second=327 amount=-1 +kerning first=224 second=233 amount=-1 +kerning first=305 second=279 amount=-1 +kerning first=1105 second=1080 amount=-1 +kerning first=368 second=371 amount=-1 +kerning first=217 second=209 amount=-1 +kerning first=233 second=279 amount=-1 +kerning first=219 second=327 amount=-1 +kerning first=8250 second=302 amount=-1 +kerning first=269 second=279 amount=-1 +kerning first=368 second=233 amount=-1 +kerning first=302 second=288 amount=-1 +kerning first=87 second=235 amount=-1 +kerning first=198 second=213 amount=-1 +kerning first=338 second=288 amount=-1 +kerning first=298 second=280 amount=-1 +kerning first=327 second=327 amount=-1 +kerning first=296 second=233 amount=-1 +kerning first=207 second=335 amount=-1 +kerning first=220 second=200 amount=-1 +kerning first=266 second=288 amount=-1 +kerning first=228 second=235 amount=-1 +kerning first=83 second=371 amount=-1 +kerning first=264 second=235 amount=-1 +kerning first=86 second=224 amount=-1 +kerning first=79 second=200 amount=-1 +kerning first=374 second=288 amount=-1 +kerning first=8220 second=219 amount=-1 +kerning first=99 second=8221 amount=-2 +kerning first=334 second=84 amount=-1 +kerning first=264 second=231 amount=-1 +kerning first=1053 second=1077 amount=-1 +kerning first=250 second=283 amount=-1 +kerning first=286 second=218 amount=-1 +kerning first=80 second=380 amount=-1 +kerning first=263 second=224 amount=-1 +kerning first=214 second=218 amount=-1 +kerning first=272 second=270 amount=-1 +kerning first=87 second=231 amount=-1 +kerning first=73 second=283 amount=-1 +kerning first=257 second=380 amount=-1 +kerning first=206 second=248 amount=-1 +kerning first=109 second=283 amount=-1 +kerning first=73 second=218 amount=-1 +kerning first=221 second=380 amount=-1 +kerning first=314 second=248 amount=-1 +kerning first=1031 second=1027 amount=-1 +kerning first=213 second=280 amount=-1 +kerning first=228 second=231 amount=-1 +kerning first=79 second=196 amount=-1 +kerning first=268 second=66 amount=-1 +kerning first=282 second=79 amount=-1 +kerning first=368 second=367 amount=-1 +kerning first=84 second=244 amount=-1 +kerning first=66 second=266 amount=-1 +kerning first=69 second=79 amount=-1 +kerning first=72 second=218 amount=-1 +kerning first=8217 second=228 amount=-1 +kerning first=200 second=270 amount=-1 +kerning first=225 second=244 amount=-1 +kerning first=261 second=244 amount=-1 +kerning first=220 second=196 amount=-1 +kerning first=1039 second=1062 amount=-1 +kerning first=83 second=367 amount=-1 +kerning first=259 second=99 amount=-1 +kerning first=85 second=80 amount=-1 +kerning first=362 second=114 amount=-1 +kerning first=332 second=8250 amount=-1 +kerning first=362 second=45 amount=-2 +kerning first=241 second=283 amount=-1 +kerning first=198 second=217 amount=-1 +kerning first=210 second=354 amount=-1 +kerning first=119 second=367 amount=-1 +kerning first=290 second=45 amount=-1 +kerning first=217 second=205 amount=-1 +kerning first=298 second=80 amount=-1 +kerning first=65 second=252 amount=-1 +kerning first=254 second=114 amount=-1 +kerning first=270 second=217 amount=-1 +kerning first=266 second=284 amount=-1 +kerning first=262 second=80 amount=-1 +kerning first=187 second=69 amount=-1 +kerning first=8249 second=364 amount=-1 +kerning first=326 second=114 amount=-1 +kerning first=325 second=205 amount=-1 +kerning first=101 second=252 amount=-1 +kerning first=304 second=66 amount=-1 +kerning first=302 second=284 amount=-1 +kerning first=72 second=232 amount=-1 +kerning first=230 second=353 amount=-1 +kerning first=77 second=114 amount=-1 +kerning first=1027 second=1098 amount=-1 +kerning first=89 second=284 amount=-1 +kerning first=1052 second=1072 amount=-1 +kerning first=108 second=243 amount=-1 +kerning first=302 second=353 amount=-1 +kerning first=194 second=284 amount=-1 +kerning first=266 second=353 amount=-1 +kerning first=72 second=345 amount=-1 +kerning first=374 second=353 amount=-1 +kerning first=108 second=345 amount=-1 +kerning first=262 second=268 amount=-1 +kerning first=234 second=115 amount=-1 +kerning first=270 second=115 amount=-1 +kerning first=249 second=345 amount=-1 +kerning first=364 second=45 amount=-2 +kerning first=1031 second=1054 amount=-1 +kerning first=108 second=250 amount=-1 +kerning first=45 second=249 amount=-1 +kerning first=200 second=266 amount=-1 +kerning first=73 second=214 amount=-1 +kerning first=1049 second=1077 amount=-1 +kerning first=104 second=243 amount=-1 +kerning first=193 second=71 amount=-1 +kerning first=204 second=368 amount=-1 +kerning first=209 second=243 amount=-1 +kerning first=364 second=200 amount=-1 +kerning first=231 second=226 amount=-1 +kerning first=89 second=353 amount=-1 +kerning first=75 second=336 amount=-1 +kerning first=205 second=310 amount=-1 +kerning first=267 second=226 amount=-1 +kerning first=269 second=275 amount=-1 +kerning first=272 second=197 amount=-1 +kerning first=233 second=275 amount=-1 +kerning first=67 second=318 amount=-1 +kerning first=370 second=80 amount=-1 +kerning first=314 second=252 amount=-1 +kerning first=334 second=80 amount=-1 +kerning first=278 second=252 amount=-1 +kerning first=1030 second=1089 amount=-1 +kerning first=374 second=8220 amount=-1 +kerning first=305 second=275 amount=-1 +kerning first=73 second=270 amount=-1 +kerning first=350 second=252 amount=-1 +kerning first=218 second=45 amount=-2 +kerning first=88 second=71 amount=-1 +kerning first=77 second=45 amount=-1 +kerning first=1046 second=1087 amount=-1 +kerning first=258 second=249 amount=-1 +kerning first=113 second=45 amount=-1 +kerning first=1046 second=1086 amount=-1 +kerning first=374 second=275 amount=-1 +kerning first=85 second=71 amount=-1 +kerning first=8217 second=338 amount=-1 +kerning first=233 second=353 amount=-1 +kerning first=317 second=217 amount=-1 +kerning first=102 second=45 amount=-1 +kerning first=77 second=97 amount=-1 +kerning first=230 second=275 amount=-1 +kerning first=262 second=71 amount=-1 +kerning first=258 second=214 amount=-1 +kerning first=209 second=79 amount=-1 +kerning first=269 second=353 amount=-1 +kerning first=1071 second=1031 amount=-1 +kerning first=266 second=275 amount=-1 +kerning first=1052 second=1068 amount=-1 +kerning first=217 second=66 amount=-1 +kerning first=302 second=362 amount=-1 +kerning first=266 second=362 amount=-1 +kerning first=1047 second=1045 amount=-1 +kerning first=246 second=122 amount=-1 +kerning first=219 second=223 amount=-1 +kerning first=8217 second=224 amount=-1 +kerning first=103 second=318 amount=-1 +kerning first=8217 second=241 amount=-1 +kerning first=1042 second=1062 amount=-1 +kerning first=187 second=80 amount=-1 +kerning first=338 second=362 amount=-1 +kerning first=89 second=275 amount=-1 +kerning first=1058 second=1097 amount=-1 +kerning first=244 second=318 amount=-1 +kerning first=218 second=97 amount=-1 +kerning first=327 second=223 amount=-1 +kerning first=316 second=318 amount=-1 +kerning first=291 second=223 amount=-1 +kerning first=211 second=315 amount=-1 +kerning first=187 second=200 amount=-1 +kerning first=240 second=234 amount=-1 +kerning first=324 second=232 amount=-1 +kerning first=206 second=226 amount=-1 +kerning first=8222 second=354 amount=-1 +kerning first=1038 second=1085 amount=-1 +kerning first=75 second=249 amount=-1 +kerning first=194 second=362 amount=-1 +kerning first=217 second=80 amount=-1 +kerning first=264 second=283 amount=-1 +kerning first=197 second=266 amount=-1 +kerning first=86 second=371 amount=-1 +kerning first=370 second=71 amount=-1 +kerning first=1077 second=1076 amount=-1 +kerning first=1042 second=1079 amount=-1 +kerning first=298 second=71 amount=-1 +kerning first=283 second=249 amount=-1 +kerning first=75 second=332 amount=-1 +kerning first=68 second=217 amount=-1 +kerning first=66 second=45 amount=-1 +kerning first=197 second=8250 amount=-1 +kerning first=70 second=249 amount=-1 +kerning first=209 second=217 amount=-1 +kerning first=289 second=98 amount=-1 +kerning first=366 second=361 amount=-1 +kerning first=270 second=206 amount=-1 +kerning first=253 second=98 amount=-1 +kerning first=8250 second=66 amount=-1 +kerning first=205 second=267 amount=-1 +kerning first=258 second=361 amount=-1 +kerning first=241 second=267 amount=-1 +kerning first=201 second=250 amount=-1 +kerning first=1042 second=1051 amount=-1 +kerning first=1047 second=1042 amount=-1 +kerning first=1050 second=1080 amount=-1 +kerning first=69 second=216 amount=-1 +kerning first=199 second=345 amount=-1 +kerning first=100 second=267 amount=-1 +kerning first=235 second=345 amount=-1 +kerning first=8250 second=380 amount=-1 +kerning first=271 second=345 amount=-1 +kerning first=1071 second=1107 amount=-1 +kerning first=207 second=225 amount=-1 +kerning first=1064 second=1079 amount=-1 +kerning first=1036 second=1080 amount=-1 +kerning first=275 second=335 amount=-1 +kerning first=72 second=241 amount=-1 +kerning first=1041 second=1063 amount=-1 +kerning first=80 second=302 amount=-1 +kerning first=355 second=97 amount=-1 +kerning first=240 second=114 amount=-1 +kerning first=262 second=171 amount=-1 +kerning first=72 second=207 amount=-1 +kerning first=325 second=378 amount=-1 +kerning first=327 second=323 amount=-1 +kerning first=69 second=250 amount=-1 +kerning first=78 second=310 amount=-1 +kerning first=289 second=378 amount=-1 +kerning first=78 second=370 amount=-1 +kerning first=99 second=114 amount=-1 +kerning first=202 second=336 amount=-1 +kerning first=253 second=378 amount=-1 +kerning first=327 second=370 amount=-1 +kerning first=282 second=250 amount=-1 +kerning first=274 second=336 amount=-1 +kerning first=74 second=199 amount=-1 +kerning first=213 second=207 amount=-1 +kerning first=219 second=378 amount=-1 +kerning first=310 second=336 amount=-1 +kerning first=65 second=46 amount=-1 +kerning first=86 second=284 amount=-1 +kerning first=79 second=89 amount=-1 +kerning first=45 second=361 amount=-1 +kerning first=1039 second=1071 amount=-1 +kerning first=207 second=259 amount=-1 +kerning first=368 second=337 amount=-1 +kerning first=323 second=199 amount=-1 +kerning first=327 second=310 amount=-1 +kerning first=217 second=378 amount=-1 +kerning first=270 second=72 amount=-1 +kerning first=1044 second=1054 amount=-1 +kerning first=200 second=344 amount=-1 +kerning first=112 second=378 amount=-1 +kerning first=1056 second=1105 amount=-1 +kerning first=219 second=310 amount=-1 +kerning first=198 second=72 amount=-1 +kerning first=258 second=314 amount=-1 +kerning first=45 second=288 amount=-1 +kerning first=207 second=346 amount=-1 +kerning first=307 second=235 amount=-1 +kerning first=195 second=334 amount=-1 +kerning first=67 second=331 amount=-1 +kerning first=66 second=346 amount=-1 +kerning first=321 second=87 amount=-1 +kerning first=1052 second=1055 amount=-1 +kerning first=258 second=288 amount=-1 +kerning first=362 second=110 amount=-1 +kerning first=368 second=109 amount=-1 +kerning first=79 second=282 amount=-1 +kerning first=1058 second=1095 amount=-1 +kerning first=110 second=119 amount=-1 +kerning first=116 second=101 amount=-1 +kerning first=201 second=278 amount=-1 +kerning first=80 second=101 amount=-1 +kerning first=209 second=230 amount=-1 +kerning first=221 second=101 amount=-1 +kerning first=8250 second=220 amount=-1 +kerning first=289 second=291 amount=-1 +kerning first=253 second=291 amount=-1 +kerning first=198 second=325 amount=-1 +kerning first=257 second=101 amount=-1 +kerning first=354 second=337 amount=-1 +kerning first=67 second=245 amount=-1 +kerning first=225 second=279 amount=-1 +kerning first=74 second=212 amount=-1 +kerning first=283 second=281 amount=-1 +kerning first=8217 second=211 amount=-1 +kerning first=261 second=279 amount=-1 +kerning first=1070 second=1061 amount=-1 +kerning first=286 second=8218 amount=-1 +kerning first=1034 second=1061 amount=-1 +kerning first=84 second=99 amount=-1 +kerning first=88 second=303 amount=-1 +kerning first=369 second=279 amount=-1 +kerning first=1066 second=1098 amount=-1 +kerning first=267 second=279 amount=-1 +kerning first=1030 second=1098 amount=-1 +kerning first=105 second=337 amount=-1 +kerning first=264 second=296 amount=-1 +kerning first=193 second=303 amount=-1 +kerning first=1049 second=1064 amount=-1 +kerning first=261 second=99 amount=-1 +kerning first=366 second=288 amount=-1 +kerning first=1055 second=1119 amount=-1 +kerning first=231 second=187 amount=-1 +kerning first=1091 second=1119 amount=-1 +kerning first=316 second=245 amount=-1 +kerning first=1039 second=1118 amount=-1 +kerning first=80 second=75 amount=-1 +kerning first=225 second=99 amount=-1 +kerning first=216 second=8250 amount=-1 +kerning first=330 second=288 amount=-1 +kerning first=339 second=187 amount=-1 +kerning first=214 second=8218 amount=-1 +kerning first=352 second=363 amount=-1 +kerning first=84 second=279 amount=-1 +kerning first=212 second=221 amount=-1 +kerning first=307 second=243 amount=-1 +kerning first=103 second=245 amount=-1 +kerning first=67 second=214 amount=-1 +kerning first=104 second=277 amount=-1 +kerning first=291 second=117 amount=-1 +kerning first=80 second=226 amount=-1 +kerning first=365 second=8220 amount=-1 +kerning first=1071 second=1065 amount=-1 +kerning first=296 second=380 amount=-1 +kerning first=255 second=117 amount=-1 +kerning first=219 second=117 amount=-1 +kerning first=267 second=287 amount=-1 +kerning first=275 second=248 amount=-1 +kerning first=368 second=380 amount=-1 +kerning first=231 second=287 amount=-1 +kerning first=368 second=212 amount=-1 +kerning first=325 second=218 amount=-1 +kerning first=267 second=363 amount=-1 +kerning first=99 second=307 amount=-1 +kerning first=298 second=264 amount=-1 +kerning first=1068 second=1030 amount=-1 +kerning first=262 second=264 amount=-1 +kerning first=291 second=171 amount=-1 +kerning first=198 second=278 amount=-1 +kerning first=296 second=66 amount=-1 +kerning first=201 second=364 amount=-1 +kerning first=116 second=8220 amount=-1 +kerning first=194 second=121 amount=-1 +kerning first=220 second=209 amount=-1 +kerning first=80 second=8220 amount=-1 +kerning first=85 second=264 amount=-1 +kerning first=196 second=367 amount=-1 +kerning first=266 second=202 amount=-1 +kerning first=119 second=380 amount=-1 +kerning first=264 second=270 amount=-1 +kerning first=79 second=209 amount=-1 +kerning first=83 second=66 amount=-1 +kerning first=338 second=202 amount=-1 +kerning first=327 second=69 amount=-1 +kerning first=257 second=8220 amount=-2 +kerning first=89 second=74 amount=-1 +kerning first=302 second=202 amount=-1 +kerning first=270 second=325 amount=-1 +kerning first=8217 second=269 amount=-1 +kerning first=78 second=69 amount=-1 +kerning first=208 second=8220 amount=-2 +kerning first=362 second=330 amount=-1 +kerning first=201 second=202 amount=-1 +kerning first=219 second=69 amount=-1 +kerning first=1040 second=1091 amount=-1 +kerning first=352 second=203 amount=-1 +kerning first=302 second=74 amount=-1 +kerning first=364 second=330 amount=-1 +kerning first=234 second=252 amount=-1 +kerning first=374 second=74 amount=-1 +kerning first=275 second=252 amount=-1 +kerning first=198 second=252 amount=-1 +kerning first=368 second=66 amount=-1 +kerning first=280 second=313 amount=-1 +kerning first=73 second=227 amount=-1 +kerning first=235 second=44 amount=-1 +kerning first=288 second=78 amount=-1 +kerning first=366 second=214 amount=-1 +kerning first=1055 second=1057 amount=-1 +kerning first=330 second=214 amount=-1 +kerning first=76 second=218 amount=-1 +kerning first=8217 second=284 amount=-1 +kerning first=269 second=112 amount=-1 +kerning first=204 second=68 amount=-1 +kerning first=204 second=355 amount=-1 +kerning first=1104 second=1103 amount=-1 +kerning first=1043 second=1082 amount=-1 +kerning first=364 second=282 amount=-1 +kerning first=307 second=44 amount=-1 +kerning first=200 second=365 amount=-1 +kerning first=82 second=286 amount=-1 +kerning first=103 second=117 amount=-1 +kerning first=200 second=171 amount=-1 +kerning first=70 second=252 amount=-1 +kerning first=368 second=204 amount=-1 +kerning first=103 second=112 amount=-1 +kerning first=316 second=117 amount=-1 +kerning first=116 second=229 amount=-1 +kerning first=1051 second=1108 amount=-1 +kerning first=1049 second=1051 amount=-1 +kerning first=280 second=117 amount=-1 +kerning first=80 second=229 amount=-1 +kerning first=344 second=171 amount=-1 +kerning first=364 second=68 amount=-1 +kerning first=380 second=171 amount=-1 +kerning first=212 second=192 amount=-1 +kerning first=362 second=8218 amount=-2 +kerning first=240 second=287 amount=-1 +kerning first=83 second=220 amount=-1 +kerning first=1052 second=1042 amount=-1 +kerning first=352 second=117 amount=-1 +kerning first=195 second=361 amount=-1 +kerning first=227 second=263 amount=-1 +kerning first=197 second=374 amount=-1 +kerning first=1054 second=1039 amount=-1 +kerning first=77 second=298 amount=-1 +kerning first=263 second=263 amount=-1 +kerning first=304 second=246 amount=-1 +kerning first=72 second=100 amount=-1 +kerning first=279 second=251 amount=-1 +kerning first=268 second=246 amount=-1 +kerning first=339 second=382 amount=-1 +kerning first=232 second=246 amount=-1 +kerning first=1054 second=1034 amount=-1 +kerning first=375 second=382 amount=-1 +kerning first=283 second=103 amount=-1 +kerning first=325 second=77 amount=-1 +kerning first=296 second=220 amount=-1 +kerning first=1047 second=1062 amount=-1 +kerning first=368 second=220 amount=-1 +kerning first=212 second=206 amount=-1 +kerning first=325 second=304 amount=-1 +kerning first=107 second=316 amount=-1 +kerning first=209 second=330 amount=-1 +kerning first=8217 second=198 amount=-2 +kerning first=106 second=103 amount=-1 +kerning first=248 second=316 amount=-1 +kerning first=279 second=333 amount=-1 +kerning first=193 second=118 amount=-1 +kerning first=79 second=68 amount=-1 +kerning first=365 second=281 amount=-1 +kerning first=8250 second=207 amount=-1 +kerning first=207 second=333 amount=-1 +kerning first=328 second=248 amount=-1 +kerning first=325 second=8222 amount=-1 +kerning first=217 second=304 amount=-1 +kerning first=1051 second=1048 amount=-1 +kerning first=289 second=8222 amount=-1 +kerning first=86 second=211 amount=-1 +kerning first=253 second=8222 amount=-1 +kerning first=334 second=221 amount=-1 +kerning first=8217 second=83 amount=-1 +kerning first=231 second=382 amount=-1 +kerning first=1050 second=1060 amount=-1 +kerning first=1044 second=1087 amount=-1 +kerning first=267 second=382 amount=-1 +kerning first=262 second=310 amount=-1 +kerning first=365 second=289 amount=-1 +kerning first=286 second=313 amount=-1 +kerning first=195 second=375 amount=-1 +kerning first=187 second=221 amount=-2 +kerning first=67 second=210 amount=-1 +kerning first=206 second=339 amount=-1 +kerning first=213 second=315 amount=-1 +kerning first=354 second=242 amount=-1 +kerning first=72 second=233 amount=-1 +kerning first=104 second=111 amount=-1 +kerning first=108 second=233 amount=-1 +kerning first=83 second=280 amount=-1 +kerning first=209 second=111 amount=-1 +kerning first=305 second=245 amount=-1 +kerning first=206 second=205 amount=-1 +kerning first=214 second=313 amount=-1 +kerning first=269 second=245 amount=-1 +kerning first=249 second=233 amount=-1 +kerning first=1048 second=1057 amount=-1 +kerning first=101 second=120 amount=-1 +kerning first=364 second=230 amount=-1 +kerning first=68 second=330 amount=-1 +kerning first=313 second=219 amount=-1 +kerning first=314 second=339 amount=-1 +kerning first=72 second=315 amount=-1 +kerning first=296 second=280 amount=-1 +kerning first=1036 second=1101 amount=-1 +kerning first=368 second=280 amount=-1 +kerning first=80 second=317 amount=-1 +kerning first=1044 second=1101 amount=-1 +kerning first=262 second=212 amount=-1 +kerning first=218 second=298 amount=-1 +kerning first=110 second=8217 amount=-2 +kerning first=298 second=212 amount=-1 +kerning first=220 second=76 amount=-1 +kerning first=290 second=298 amount=-1 +kerning first=79 second=76 amount=-1 +kerning first=323 second=231 amount=-1 +kerning first=370 second=212 amount=-1 +kerning first=251 second=8217 amount=-1 +kerning first=85 second=212 amount=-1 +kerning first=362 second=298 amount=-1 +kerning first=45 second=344 amount=-1 +kerning first=75 second=118 amount=-1 +kerning first=1055 second=1113 amount=-1 +kerning first=8222 second=367 amount=-1 +kerning first=345 second=46 amount=-1 +kerning first=281 second=111 amount=-1 +kerning first=217 second=218 amount=-1 +kerning first=325 second=85 amount=-1 +kerning first=194 second=254 amount=-1 +kerning first=116 second=289 amount=-1 +kerning first=230 second=254 amount=-1 +kerning first=266 second=254 amount=-1 +kerning first=217 second=85 amount=-1 +kerning first=287 second=8217 amount=-2 +kerning first=323 second=8217 amount=-1 +kerning first=76 second=85 amount=-1 +kerning first=257 second=289 amount=-1 +kerning first=80 second=216 amount=-1 +kerning first=89 second=262 amount=-1 +kerning first=267 second=46 amount=-1 +kerning first=375 second=46 amount=-1 +kerning first=339 second=46 amount=-1 +kerning first=302 second=262 amount=-1 +kerning first=187 second=67 amount=-1 +kerning first=224 second=8250 amount=-1 +kerning first=266 second=262 amount=-1 +kerning first=70 second=116 amount=-1 +kerning first=221 second=216 amount=-1 +kerning first=374 second=262 amount=-1 +kerning first=82 second=67 amount=-1 +kerning first=1104 second=1095 amount=-1 +kerning first=338 second=262 amount=-1 +kerning first=197 second=366 amount=-1 +kerning first=83 second=345 amount=-1 +kerning first=45 second=206 amount=-1 +kerning first=272 second=304 amount=-1 +kerning first=274 second=70 amount=-1 +kerning first=204 second=110 amount=-1 +kerning first=355 second=353 amount=-1 +kerning first=214 second=192 amount=-1 +kerning first=8217 second=380 amount=-1 +kerning first=235 second=250 amount=-1 +kerning first=346 second=70 amount=-1 +kerning first=224 second=345 amount=-1 +kerning first=8250 second=75 amount=-1 +kerning first=67 second=104 amount=-1 +kerning first=362 second=225 amount=-1 +kerning first=364 second=76 amount=-1 +kerning first=77 second=229 amount=-1 +kerning first=1039 second=1084 amount=-1 +kerning first=231 second=46 amount=-1 +kerning first=197 second=253 amount=-1 +kerning first=202 second=70 amount=-1 +kerning first=350 second=274 amount=-1 +kerning first=368 second=345 amount=-1 +kerning first=302 second=224 amount=-1 +kerning first=206 second=366 amount=-1 +kerning first=366 second=206 amount=-1 +kerning first=217 second=44 amount=-2 +kerning first=193 second=368 amount=-1 +kerning first=8220 second=362 amount=-1 +kerning first=68 second=317 amount=-1 +kerning first=296 second=207 amount=-1 +kerning first=1031 second=1105 amount=-1 +kerning first=86 second=271 amount=-1 +kerning first=194 second=375 amount=-1 +kerning first=330 second=206 amount=-1 +kerning first=88 second=8221 amount=-1 +kerning first=368 second=207 amount=-1 +kerning first=195 second=369 amount=-1 +kerning first=209 second=317 amount=-1 +kerning first=97 second=122 amount=-1 +kerning first=193 second=8221 amount=-2 +kerning first=211 second=201 amount=-1 +kerning first=263 second=271 amount=-1 +kerning first=229 second=8221 amount=-2 +kerning first=88 second=368 amount=-1 +kerning first=70 second=201 amount=-1 +kerning first=1054 second=1047 amount=-1 +kerning first=1108 second=1093 amount=-1 +kerning first=212 second=256 amount=-1 +kerning first=228 second=378 amount=-1 +kerning first=283 second=116 amount=-1 +kerning first=100 second=113 amount=-1 +kerning first=337 second=8221 amount=-2 +kerning first=1056 second=1031 amount=-1 +kerning first=304 second=122 amount=-1 +kerning first=87 second=378 amount=-1 +kerning first=214 second=270 amount=-1 +kerning first=85 second=204 amount=-1 +kerning first=78 second=267 amount=-1 +kerning first=88 second=219 amount=-1 +kerning first=370 second=204 amount=-1 +kerning first=304 second=259 amount=-1 +kerning first=1067 second=1105 amount=-1 +kerning first=334 second=204 amount=-1 +kerning first=268 second=259 amount=-1 +kerning first=298 second=204 amount=-1 +kerning first=83 second=207 amount=-1 +kerning first=264 second=378 amount=-1 +kerning first=262 second=204 amount=-1 +kerning first=214 second=86 amount=-1 +kerning first=80 second=281 amount=-1 +kerning first=193 second=268 amount=-1 +kerning first=8250 second=280 amount=-1 +kerning first=1055 second=1091 amount=-1 +kerning first=221 second=281 amount=-1 +kerning first=257 second=281 amount=-1 +kerning first=206 second=347 amount=-1 +kerning first=199 second=350 amount=-1 +kerning first=275 second=235 amount=-1 +kerning first=218 second=290 amount=-1 +kerning first=101 second=347 amount=-1 +kerning first=370 second=277 amount=-1 +kerning first=1051 second=1056 amount=-1 +kerning first=366 second=73 amount=-1 +kerning first=330 second=73 amount=-1 +kerning first=88 second=268 amount=-1 +kerning first=351 second=8220 amount=-2 +kerning first=333 second=8218 amount=-1 +kerning first=8217 second=271 amount=-1 +kerning first=375 second=369 amount=-1 +kerning first=204 second=282 amount=-1 +kerning first=352 second=8249 amount=-1 +kerning first=327 second=82 amount=-1 +kerning first=8250 second=328 amount=-1 +kerning first=275 second=108 amount=-1 +kerning first=218 second=363 amount=-1 +kerning first=85 second=277 amount=-1 +kerning first=249 second=235 amount=-1 +kerning first=45 second=73 amount=-1 +kerning first=1027 second=1072 amount=-1 +kerning first=298 second=277 amount=-1 +kerning first=99 second=246 amount=-1 +kerning first=362 second=363 amount=-1 +kerning first=262 second=277 amount=-1 +kerning first=77 second=290 amount=-1 +kerning first=226 second=277 amount=-1 +kerning first=81 second=73 amount=-1 +kerning first=353 second=103 amount=-1 +kerning first=1068 second=1041 amount=-1 +kerning first=67 second=8249 amount=-1 +kerning first=78 second=73 amount=-1 +kerning first=103 second=8249 amount=-1 +kerning first=199 second=79 amount=-1 +kerning first=78 second=82 amount=-1 +kerning first=219 second=82 amount=-1 +kerning first=289 second=231 amount=-1 +kerning first=325 second=231 amount=-1 +kerning first=275 second=283 amount=-1 +kerning first=209 second=338 amount=-1 +kerning first=280 second=8249 amount=-1 +kerning first=316 second=8249 amount=-1 +kerning first=1048 second=1065 amount=-1 +kerning first=217 second=196 amount=-1 +kerning first=199 second=66 amount=-1 +kerning first=73 second=235 amount=-1 +kerning first=69 second=345 amount=-1 +kerning first=109 second=235 amount=-1 +kerning first=105 second=345 amount=-1 +kerning first=87 second=248 amount=-1 +kerning first=289 second=283 amount=-1 +kerning first=246 second=345 amount=-1 +kerning first=325 second=283 amount=-1 +kerning first=282 second=345 amount=-1 +kerning first=217 second=283 amount=-1 +kerning first=206 second=261 amount=-1 +kerning first=1030 second=1076 amount=-1 +kerning first=72 second=79 amount=-1 +kerning first=8216 second=370 amount=-1 +kerning first=1033 second=1067 amount=-1 +kerning first=221 second=367 amount=-1 +kerning first=1069 second=1067 amount=-1 +kerning first=235 second=380 amount=-1 +kerning first=286 second=205 amount=-1 +kerning first=199 second=380 amount=-1 +kerning first=220 second=274 amount=-1 +kerning first=272 second=192 amount=-1 +kerning first=79 second=274 amount=-1 +kerning first=67 second=323 amount=-1 +kerning first=72 second=336 amount=-1 +kerning first=1047 second=1080 amount=-1 +kerning first=84 second=257 amount=-1 +kerning first=195 second=249 amount=-1 +kerning first=288 second=70 amount=-1 +kerning first=332 second=44 amount=-1 +kerning first=73 second=205 amount=-1 +kerning first=368 second=44 amount=-2 +kerning first=260 second=44 amount=-1 +kerning first=214 second=205 amount=-1 +kerning first=70 second=244 amount=-1 +kerning first=106 second=244 amount=-1 +kerning first=1048 second=1052 amount=-1 +kerning first=268 second=83 amount=-1 +kerning first=364 second=274 amount=-1 +kerning first=280 second=323 amount=-1 +kerning first=70 second=314 amount=-1 +kerning first=1055 second=1054 amount=-1 +kerning first=283 second=244 amount=-1 +kerning first=264 second=218 amount=-1 +kerning first=355 second=244 amount=-1 +kerning first=192 second=218 amount=-1 +kerning first=228 second=248 amount=-1 +kerning first=206 second=231 amount=-1 +kerning first=288 second=327 amount=-1 +kerning first=83 second=44 amount=-1 +kerning first=187 second=290 amount=-1 +kerning first=264 second=248 amount=-1 +kerning first=119 second=44 amount=-1 +kerning first=364 second=217 amount=-1 +kerning first=1039 second=1049 amount=-1 +kerning first=219 second=275 amount=-1 +kerning first=1046 second=1081 amount=-1 +kerning first=356 second=243 amount=-1 +kerning first=327 second=275 amount=-1 +kerning first=207 second=110 amount=-1 +kerning first=352 second=223 amount=-1 +kerning first=283 second=314 amount=-1 +kerning first=291 second=275 amount=-1 +kerning first=117 second=8220 amount=-1 +kerning first=1036 second=1088 amount=-1 +kerning first=70 second=214 amount=-1 +kerning first=196 second=45 amount=-1 +kerning first=1038 second=1107 amount=-1 +kerning first=78 second=275 amount=-1 +kerning first=200 second=249 amount=-1 +kerning first=8222 second=259 amount=-1 +kerning first=1069 second=1031 amount=-1 +kerning first=330 second=298 amount=-1 +kerning first=1118 second=1081 amount=-1 +kerning first=103 second=223 amount=-1 +kerning first=1105 second=1097 amount=-1 +kerning first=71 second=80 amount=-1 +kerning first=207 second=97 amount=-1 +kerning first=67 second=223 amount=-1 +kerning first=268 second=45 amount=-1 +kerning first=194 second=370 amount=-1 +kerning first=284 second=80 amount=-1 +kerning first=103 second=353 amount=-1 +kerning first=280 second=223 amount=-1 +kerning first=67 second=353 amount=-1 +kerning first=212 second=80 amount=-1 +kerning first=1028 second=1091 amount=-1 +kerning first=105 second=101 amount=-1 +kerning first=69 second=200 amount=-1 +kerning first=277 second=232 amount=-1 +kerning first=366 second=266 amount=-1 +kerning first=270 second=200 amount=-1 +kerning first=330 second=266 amount=-1 +kerning first=205 second=232 amount=-1 +kerning first=1049 second=1072 amount=-1 +kerning first=205 second=362 amount=-1 +kerning first=198 second=200 amount=-1 +kerning first=325 second=226 amount=-1 +kerning first=217 second=296 amount=-1 +kerning first=77 second=225 amount=-1 +kerning first=354 second=101 amount=-1 +kerning first=277 second=8250 amount=-1 +kerning first=219 second=122 amount=-1 +kerning first=258 second=266 amount=-1 +kerning first=313 second=362 amount=-1 +kerning first=310 second=371 amount=-1 +kerning first=74 second=234 amount=-1 +kerning first=45 second=266 amount=-1 +kerning first=79 second=217 amount=-1 +kerning first=274 second=371 amount=-1 +kerning first=89 second=251 amount=-1 +kerning first=100 second=8250 amount=-1 +kerning first=207 second=209 amount=-1 +kerning first=315 second=354 amount=-1 +kerning first=110 second=234 amount=-1 +kerning first=8217 second=219 amount=-1 +kerning first=220 second=217 amount=-1 +kerning first=100 second=232 amount=-1 +kerning first=251 second=234 amount=-1 +kerning first=1044 second=1089 amount=-1 +kerning first=203 second=264 amount=-1 +kerning first=363 second=275 amount=-1 +kerning first=210 second=88 amount=-1 +kerning first=70 second=274 amount=-1 +kerning first=323 second=71 amount=-1 +kerning first=323 second=234 amount=-1 +kerning first=287 second=234 amount=-1 +kerning first=1069 second=1065 amount=-1 +kerning first=1047 second=1037 amount=-1 +kerning first=262 second=380 amount=-1 +kerning first=207 second=203 amount=-1 +kerning first=115 second=287 amount=-1 +kerning first=282 second=8220 amount=-1 +kerning first=203 second=313 amount=-1 +kerning first=289 second=324 amount=-1 +kerning first=368 second=315 amount=-1 +kerning first=220 second=111 amount=-1 +kerning first=1042 second=1070 amount=-1 +kerning first=84 second=8218 amount=-1 +kerning first=354 second=8220 amount=-1 +kerning first=328 second=287 amount=-1 +kerning first=1033 second=1024 amount=-1 +kerning first=211 second=374 amount=-1 +kerning first=328 second=111 amount=-1 +kerning first=66 second=203 amount=-1 +kerning first=1047 second=1034 amount=-1 +kerning first=8218 second=248 amount=-1 +kerning first=83 second=315 amount=-1 +kerning first=289 second=120 amount=-1 +kerning first=1064 second=1054 amount=-1 +kerning first=374 second=267 amount=-1 +kerning first=1050 second=1028 amount=-1 +kerning first=288 second=278 amount=-1 +kerning first=323 second=114 amount=-1 +kerning first=296 second=315 amount=-1 +kerning first=196 second=118 amount=-1 +kerning first=230 second=267 amount=-1 +kerning first=204 second=212 amount=-1 +kerning first=105 second=8220 amount=-1 +kerning first=266 second=267 amount=-1 +kerning first=187 second=220 amount=-1 +kerning first=69 second=8220 amount=-1 +kerning first=302 second=267 amount=-1 +kerning first=338 second=370 amount=-1 +kerning first=1105 second=1076 amount=-1 +kerning first=76 second=356 amount=-1 +kerning first=85 second=199 amount=-1 +kerning first=206 second=68 amount=-1 +kerning first=266 second=370 amount=-1 +kerning first=8217 second=113 amount=-1 +kerning first=251 second=114 amount=-1 +kerning first=78 second=74 amount=-1 +kerning first=302 second=370 amount=-1 +kerning first=72 second=263 amount=-1 +kerning first=330 second=242 amount=-1 +kerning first=108 second=263 amount=-1 +kerning first=219 second=74 amount=-1 +kerning first=262 second=199 amount=-1 +kerning first=210 second=194 amount=-1 +kerning first=74 second=114 amount=-1 +kerning first=284 second=85 amount=-1 +kerning first=220 second=81 amount=-1 +kerning first=249 second=263 amount=-1 +kerning first=352 second=310 amount=-1 +kerning first=327 second=74 amount=-1 +kerning first=370 second=199 amount=-1 +kerning first=197 second=361 amount=-1 +kerning first=99 second=106 amount=-1 +kerning first=280 second=310 amount=-1 +kerning first=364 second=81 amount=-1 +kerning first=85 second=269 amount=-1 +kerning first=278 second=68 amount=-1 +kerning first=298 second=269 amount=-1 +kerning first=45 second=65 amount=-1 +kerning first=350 second=68 amount=-1 +kerning first=226 second=269 amount=-1 +kerning first=8222 second=79 amount=-1 +kerning first=1107 second=1116 amount=-1 +kerning first=67 second=310 amount=-1 +kerning first=209 second=315 amount=-1 +kerning first=206 second=334 amount=-1 +kerning first=197 second=288 amount=-1 +kerning first=368 second=101 amount=-1 +kerning first=1050 second=1101 amount=-1 +kerning first=1051 second=1043 amount=-1 +kerning first=304 second=100 amount=-1 +kerning first=1041 second=1055 amount=-1 +kerning first=68 second=325 amount=-1 +kerning first=193 second=84 amount=-1 +kerning first=203 second=278 amount=-1 +kerning first=255 second=318 amount=-1 +kerning first=8220 second=370 amount=-1 +kerning first=84 second=227 amount=-1 +kerning first=304 second=346 amount=-1 +kerning first=268 second=346 amount=-1 +kerning first=1069 second=1051 amount=-1 +kerning first=209 second=325 amount=-1 +kerning first=207 second=114 amount=-1 +kerning first=283 second=108 amount=-1 +kerning first=219 second=245 amount=-1 +kerning first=235 second=337 amount=-1 +kerning first=364 second=187 amount=-2 +kerning first=199 second=337 amount=-1 +kerning first=228 second=291 amount=-1 +kerning first=256 second=187 amount=-1 +kerning first=333 second=122 amount=-1 +kerning first=78 second=245 amount=-1 +kerning first=1027 second=1085 amount=-1 +kerning first=8250 second=315 amount=-1 +kerning first=281 second=351 amount=-1 +kerning first=196 second=251 amount=-1 +kerning first=345 second=8217 amount=-1 +kerning first=232 second=251 amount=-1 +kerning first=381 second=8217 amount=-1 +kerning first=73 second=99 amount=-1 +kerning first=304 second=75 amount=-1 +kerning first=217 second=274 amount=-1 +kerning first=109 second=99 amount=-1 +kerning first=268 second=75 amount=-1 +kerning first=363 second=245 amount=-1 +kerning first=250 second=99 amount=-1 +kerning first=327 second=245 amount=-1 +kerning first=220 second=187 amount=-2 +kerning first=1044 second=1119 amount=-1 +kerning first=291 second=245 amount=-1 +kerning first=79 second=187 amount=-1 +kerning first=307 second=337 amount=-1 +kerning first=65 second=334 amount=-1 +kerning first=1064 second=1027 amount=-1 +kerning first=115 second=187 amount=-1 +kerning first=271 second=337 amount=-1 +kerning first=197 second=375 amount=-1 +kerning first=339 second=347 amount=-1 +kerning first=271 second=242 amount=-1 +kerning first=277 second=122 amount=-1 +kerning first=234 second=106 amount=-1 +kerning first=70 second=330 amount=-1 +kerning first=375 second=347 amount=-1 +kerning first=1054 second=1069 amount=-1 +kerning first=307 second=242 amount=-1 +kerning first=232 second=281 amount=-1 +kerning first=77 second=268 amount=-1 +kerning first=1070 second=1069 amount=-1 +kerning first=268 second=281 amount=-1 +kerning first=235 second=242 amount=-1 +kerning first=304 second=281 amount=-1 +kerning first=85 second=362 amount=-1 +kerning first=231 second=347 amount=-1 +kerning first=218 second=268 amount=-1 +kerning first=79 second=325 amount=-1 +kerning first=85 second=364 amount=-1 +kerning first=97 second=233 amount=-1 +kerning first=323 second=277 amount=-1 +kerning first=287 second=277 amount=-1 +kerning first=327 second=202 amount=-1 +kerning first=70 second=73 amount=-1 +kerning first=211 second=73 amount=-1 +kerning first=78 second=202 amount=-1 +kerning first=219 second=202 amount=-1 +kerning first=201 second=264 amount=-1 +kerning first=1071 second=1073 amount=-1 +kerning first=262 second=8217 amount=-1 +kerning first=105 second=267 amount=-1 +kerning first=302 second=69 amount=-1 +kerning first=370 second=364 amount=-1 +kerning first=81 second=193 amount=-1 +kerning first=266 second=69 amount=-1 +kerning first=1070 second=1083 amount=-1 +kerning first=334 second=8217 amount=-2 +kerning first=334 second=364 amount=-1 +kerning first=280 second=82 amount=-1 +kerning first=298 second=364 amount=-1 +kerning first=88 second=290 amount=-1 +kerning first=356 second=351 amount=-1 +kerning first=338 second=69 amount=-1 +kerning first=85 second=8217 amount=-1 +kerning first=262 second=364 amount=-1 +kerning first=121 second=8217 amount=-2 +kerning first=352 second=82 amount=-1 +kerning first=193 second=290 amount=-1 +kerning first=374 second=338 amount=-1 +kerning first=110 second=277 amount=-1 +kerning first=1065 second=1091 amount=-1 +kerning first=226 second=8217 amount=-2 +kerning first=355 second=103 amount=-1 +kerning first=198 second=338 amount=-1 +kerning first=234 second=273 amount=-1 +kerning first=193 second=355 amount=-1 +kerning first=70 second=266 amount=-1 +kerning first=1051 second=1113 amount=-1 +kerning first=251 second=277 amount=-1 +kerning first=205 second=224 amount=-1 +kerning first=88 second=355 amount=-1 +kerning first=366 second=193 amount=-1 +kerning first=350 second=223 amount=-1 +kerning first=217 second=334 amount=-1 +kerning first=1042 second=1059 amount=-2 +kerning first=212 second=351 amount=-1 +kerning first=77 second=333 amount=-1 +kerning first=290 second=203 amount=-1 +kerning first=355 second=171 amount=-1 +kerning first=45 second=122 amount=-1 +kerning first=291 second=112 amount=-1 +kerning first=1093 second=1095 amount=-1 +kerning first=362 second=203 amount=-1 +kerning first=197 second=117 amount=-1 +kerning first=77 second=203 amount=-1 +kerning first=218 second=333 amount=-1 +kerning first=218 second=203 amount=-1 +kerning first=97 second=263 amount=-1 +kerning first=72 second=220 amount=-1 +kerning first=269 second=117 amount=-1 +kerning first=8222 second=216 amount=-1 +kerning first=70 second=171 amount=-2 +kerning first=233 second=117 amount=-1 +kerning first=81 second=374 amount=-1 +kerning first=106 second=171 amount=-1 +kerning first=8222 second=251 amount=-1 +kerning first=70 second=206 amount=-1 +kerning first=65 second=367 amount=-1 +kerning first=344 second=264 amount=-1 +kerning first=323 second=212 amount=-1 +kerning first=354 second=229 amount=-1 +kerning first=321 second=220 amount=-1 +kerning first=8250 second=87 amount=-2 +kerning first=278 second=304 amount=-1 +kerning first=77 second=368 amount=-1 +kerning first=220 second=382 amount=-1 +kerning first=118 second=316 amount=-1 +kerning first=350 second=304 amount=-1 +kerning first=192 second=356 amount=-1 +kerning first=279 second=246 amount=-1 +kerning first=211 second=206 amount=-1 +kerning first=1056 second=1118 amount=-1 +kerning first=366 second=103 amount=-1 +kerning first=223 second=316 amount=-1 +kerning first=112 second=120 amount=-1 +kerning first=230 second=244 amount=-1 +kerning first=207 second=246 amount=-1 +kerning first=364 second=382 amount=-1 +kerning first=217 second=120 amount=-1 +kerning first=77 second=8221 amount=-1 +kerning first=213 second=220 amount=-1 +kerning first=259 second=316 amount=-1 +kerning first=253 second=120 amount=-1 +kerning first=113 second=8221 amount=-2 +kerning first=80 second=194 amount=-1 +kerning first=323 second=273 amount=-1 +kerning first=362 second=368 amount=-1 +kerning first=75 second=211 amount=-1 +kerning first=199 second=109 amount=-1 +kerning first=218 second=8221 amount=-1 +kerning first=117 second=103 amount=-1 +kerning first=1060 second=1051 amount=-1 +kerning first=378 second=8220 amount=-1 +kerning first=326 second=333 amount=-1 +kerning first=254 second=8221 amount=-2 +kerning first=221 second=194 amount=-1 +kerning first=362 second=333 amount=-1 +kerning first=290 second=8221 amount=-1 +kerning first=218 second=368 amount=-1 +kerning first=326 second=8221 amount=-2 +kerning first=270 second=330 amount=-1 +kerning first=362 second=8221 amount=-1 +kerning first=1064 second=1092 amount=-1 +kerning first=290 second=368 amount=-1 +kerning first=1050 second=1088 amount=-1 +kerning first=214 second=197 amount=-1 +kerning first=192 second=85 amount=-1 +kerning first=269 second=223 amount=-1 +kerning first=327 second=210 amount=-1 +kerning first=101 second=98 amount=-1 +kerning first=65 second=98 amount=-1 +kerning first=367 second=243 amount=-1 +kerning first=197 second=223 amount=-1 +kerning first=85 second=234 amount=-1 +kerning first=219 second=210 amount=-1 +kerning first=1050 second=1108 amount=-1 +kerning first=78 second=210 amount=-1 +kerning first=199 second=280 amount=-1 +kerning first=289 second=326 amount=-1 +kerning first=282 second=302 amount=-1 +kerning first=72 second=122 amount=-1 +kerning first=250 second=335 amount=-1 +kerning first=1027 second=1077 amount=-1 +kerning first=80 second=87 amount=-1 +kerning first=108 second=122 amount=-1 +kerning first=210 second=302 amount=-1 +kerning first=264 second=213 amount=-1 +kerning first=69 second=302 amount=-1 +kerning first=259 second=243 amount=-1 +kerning first=88 second=363 amount=-1 +kerning first=1071 second=1079 amount=-1 +kerning first=267 second=339 amount=-1 +kerning first=193 second=363 amount=-1 +kerning first=288 second=219 amount=-1 +kerning first=231 second=339 amount=-1 +kerning first=75 second=284 amount=-1 +kerning first=1033 second=1059 amount=-2 +kerning first=269 second=8249 amount=-1 +kerning first=368 second=350 amount=-1 +kerning first=89 second=232 amount=-1 +kerning first=8218 second=218 amount=-1 +kerning first=75 second=219 amount=-1 +kerning first=305 second=8249 amount=-1 +kerning first=251 second=235 amount=-1 +kerning first=205 second=78 amount=-1 +kerning first=86 second=46 amount=-1 +kerning first=1069 second=1059 amount=-1 +kerning first=73 second=335 amount=-1 +kerning first=302 second=232 amount=-1 +kerning first=266 second=232 amount=-1 +kerning first=230 second=232 amount=-1 +kerning first=109 second=335 amount=-1 +kerning first=296 second=350 amount=-1 +kerning first=317 second=89 amount=-1 +kerning first=262 second=234 amount=-1 +kerning first=8250 second=79 amount=-1 +kerning first=252 second=281 amount=-1 +kerning first=69 second=262 amount=-1 +kerning first=263 second=241 amount=-1 +kerning first=226 second=234 amount=-1 +kerning first=291 second=116 amount=-1 +kerning first=70 second=344 amount=-1 +kerning first=1071 second=1081 amount=-1 +kerning first=196 second=354 amount=-1 +kerning first=278 second=8222 amount=-1 +kerning first=298 second=234 amount=-1 +kerning first=232 second=289 amount=-1 +kerning first=117 second=171 amount=-1 +kerning first=1030 second=1068 amount=-1 +kerning first=370 second=234 amount=-1 +kerning first=1067 second=1075 amount=-1 +kerning first=68 second=89 amount=-1 +kerning first=264 second=85 amount=-1 +kerning first=1031 second=1075 amount=-1 +kerning first=197 second=8249 amount=-1 +kerning first=1066 second=1068 amount=-1 +kerning first=296 second=79 amount=-1 +kerning first=258 second=366 amount=-1 +kerning first=196 second=216 amount=-1 +kerning first=115 second=46 amount=-1 +kerning first=1062 second=1108 amount=-1 +kerning first=304 second=216 amount=-1 +kerning first=323 second=204 amount=-1 +kerning first=368 second=79 amount=-1 +kerning first=268 second=216 amount=-1 +kerning first=368 second=250 amount=-1 +kerning first=81 second=366 amount=-1 +kerning first=89 second=332 amount=-1 +kerning first=86 second=241 amount=-1 +kerning first=98 second=378 amount=-1 +kerning first=1056 second=1053 amount=-1 +kerning first=350 second=8222 amount=-1 +kerning first=45 second=366 amount=-1 +kerning first=1046 second=1038 amount=-1 +kerning first=266 second=332 amount=-1 +kerning first=1064 second=1084 amount=-1 +kerning first=198 second=67 amount=-1 +kerning first=83 second=250 amount=-1 +kerning first=291 second=104 amount=-1 +kerning first=194 second=332 amount=-1 +kerning first=369 second=99 amount=-1 +kerning first=362 second=195 amount=-1 +kerning first=255 second=104 amount=-1 +kerning first=374 second=332 amount=-1 +kerning first=79 second=46 amount=-1 +kerning first=330 second=366 amount=-1 +kerning first=338 second=332 amount=-1 +kerning first=366 second=366 amount=-1 +kerning first=302 second=332 amount=-1 +kerning first=1078 second=1105 amount=-1 +kerning first=220 second=317 amount=-1 +kerning first=366 second=201 amount=-1 +kerning first=291 second=110 amount=-1 +kerning first=221 second=259 amount=-1 +kerning first=344 second=116 amount=-1 +kerning first=65 second=369 amount=-1 +kerning first=330 second=201 amount=-1 +kerning first=187 second=381 amount=-1 +kerning first=314 second=369 amount=-1 +kerning first=364 second=317 amount=-1 +kerning first=99 second=316 amount=-1 +kerning first=282 second=355 amount=-1 +kerning first=1049 second=1062 amount=-1 +kerning first=74 second=204 amount=-1 +kerning first=8218 second=356 amount=-1 +kerning first=88 second=119 amount=-1 +kerning first=252 second=113 amount=-1 +kerning first=275 second=378 amount=-1 +kerning first=45 second=201 amount=-1 +kerning first=242 second=8222 amount=-1 +kerning first=81 second=201 amount=-1 +kerning first=1039 second=1041 amount=-1 +kerning first=362 second=268 amount=-1 +kerning first=1056 second=1061 amount=-1 +kerning first=116 second=259 amount=-1 +kerning first=101 second=8222 amount=-1 +kerning first=199 second=207 amount=-1 +kerning first=80 second=259 amount=-1 +kerning first=1059 second=1044 amount=-1 +kerning first=78 second=331 amount=-1 +kerning first=200 second=116 amount=-1 +kerning first=205 second=262 amount=-1 +kerning first=1062 second=1095 amount=-1 +kerning first=74 second=256 amount=-1 +kerning first=99 second=311 amount=-1 +kerning first=233 second=116 amount=-1 +kerning first=205 second=271 amount=-1 +kerning first=73 second=313 amount=-1 +kerning first=197 second=116 amount=-1 +kerning first=89 second=198 amount=-1 +kerning first=334 second=8221 amount=-2 +kerning first=83 second=363 amount=-1 +kerning first=362 second=67 amount=-1 +kerning first=119 second=363 amount=-1 +kerning first=187 second=110 amount=-1 +kerning first=282 second=270 amount=-1 +kerning first=66 second=195 amount=-1 +kerning first=1033 second=1039 amount=-1 +kerning first=370 second=268 amount=-1 +kerning first=77 second=207 amount=-1 +kerning first=339 second=378 amount=-1 +kerning first=187 second=317 amount=-1 +kerning first=354 second=113 amount=-1 +kerning first=218 second=67 amount=-1 +kerning first=346 second=366 amount=-1 +kerning first=205 second=210 amount=-1 +kerning first=298 second=268 amount=-1 +kerning first=274 second=366 amount=-1 +kerning first=310 second=366 amount=-1 +kerning first=1030 second=1081 amount=-1 +kerning first=8222 second=97 amount=-1 +kerning first=202 second=366 amount=-1 +kerning first=77 second=67 amount=-1 +kerning first=8250 second=249 amount=-1 +kerning first=370 second=115 amount=-1 +kerning first=187 second=68 amount=-1 +kerning first=374 second=8250 amount=-1 +kerning first=1086 second=1093 amount=-1 +kerning first=288 second=302 amount=-1 +kerning first=338 second=8250 amount=-1 +kerning first=75 second=8220 amount=-1 +kerning first=199 second=101 amount=-1 +kerning first=281 second=107 amount=-1 +kerning first=327 second=73 amount=-1 +kerning first=266 second=8250 amount=-1 +kerning first=271 second=101 amount=-1 +kerning first=230 second=8250 amount=-1 +kerning first=111 second=8220 amount=-2 +kerning first=235 second=101 amount=-1 +kerning first=194 second=8250 amount=-1 +kerning first=252 second=8220 amount=-1 +kerning first=78 second=8218 amount=-1 +kerning first=211 second=219 amount=-1 +kerning first=216 second=8220 amount=-2 +kerning first=287 second=351 amount=-1 +kerning first=307 second=101 amount=-1 +kerning first=89 second=8250 amount=-1 +kerning first=268 second=277 amount=-1 +kerning first=232 second=277 amount=-1 +kerning first=70 second=219 amount=-1 +kerning first=111 second=122 amount=-1 +kerning first=1056 second=1089 amount=-1 +kerning first=220 second=334 amount=-1 +kerning first=374 second=198 amount=-1 +kerning first=89 second=345 amount=-1 +kerning first=350 second=296 amount=-1 +kerning first=219 second=73 amount=-1 +kerning first=1038 second=1102 amount=-1 +kerning first=194 second=345 amount=-1 +kerning first=278 second=296 amount=-1 +kerning first=225 second=235 amount=-1 +kerning first=261 second=235 amount=-1 +kerning first=233 second=283 amount=-1 +kerning first=269 second=283 amount=-1 +kerning first=369 second=235 amount=-1 +kerning first=1041 second=1047 amount=-1 +kerning first=339 second=231 amount=-1 +kerning first=204 second=338 amount=-1 +kerning first=364 second=286 amount=-1 +kerning first=8217 second=328 amount=-1 +kerning first=8250 second=256 amount=-1 +kerning first=310 second=79 amount=-1 +kerning first=324 second=8220 amount=-2 +kerning first=231 second=351 amount=-1 +kerning first=288 second=8220 amount=-1 +kerning first=220 second=286 amount=-1 +kerning first=68 second=197 amount=-1 +kerning first=1064 second=1076 amount=-1 +kerning first=192 second=86 amount=-1 +kerning first=68 second=274 amount=-1 +kerning first=375 second=351 amount=-1 +kerning first=205 second=83 amount=-1 +kerning first=202 second=79 amount=-1 +kerning first=339 second=351 amount=-1 +kerning first=1062 second=1074 amount=-1 +kerning first=274 second=79 amount=-1 +kerning first=257 second=8250 amount=-1 +kerning first=267 second=351 amount=-1 +kerning first=1043 second=1051 amount=-1 +kerning first=1049 second=1041 amount=-1 +kerning first=258 second=104 amount=-1 +kerning first=212 second=8220 amount=-2 +kerning first=374 second=171 amount=-2 +kerning first=334 second=362 amount=-1 +kerning first=71 second=278 amount=-1 +kerning first=268 second=70 amount=-1 +kerning first=8250 second=323 amount=-1 +kerning first=70 second=192 amount=-1 +kerning first=231 second=244 amount=-1 +kerning first=8216 second=115 amount=-1 +kerning first=267 second=244 amount=-1 +kerning first=284 second=278 amount=-1 +kerning first=209 second=274 amount=-1 +kerning first=207 second=280 amount=-1 +kerning first=339 second=244 amount=-1 +kerning first=1034 second=1065 amount=-1 +kerning first=8250 second=216 amount=-1 +kerning first=108 second=382 amount=-1 +kerning first=1070 second=1065 amount=-1 +kerning first=1057 second=1094 amount=-1 +kerning first=231 second=231 amount=-1 +kerning first=325 second=201 amount=-1 +kerning first=267 second=231 amount=-1 +kerning first=194 second=171 amount=-1 +kerning first=219 second=100 amount=-1 +kerning first=304 second=70 amount=-1 +kerning first=327 second=100 amount=-1 +kerning first=84 second=235 amount=-1 +kerning first=266 second=171 amount=-1 +kerning first=206 second=269 amount=-1 +kerning first=338 second=171 amount=-1 +kerning first=217 second=201 amount=-1 +kerning first=101 second=269 amount=-1 +kerning first=192 second=266 amount=-1 +kerning first=314 second=269 amount=-1 +kerning first=70 second=65 amount=-1 +kerning first=1053 second=1071 amount=-1 +kerning first=264 second=266 amount=-1 +kerning first=280 second=214 amount=-1 +kerning first=8250 second=363 amount=-1 +kerning first=1064 second=1048 amount=-1 +kerning first=8222 second=250 amount=-1 +kerning first=194 second=318 amount=-1 +kerning first=71 second=45 amount=-1 +kerning first=1107 second=1090 amount=-1 +kerning first=70 second=353 amount=-1 +kerning first=87 second=266 amount=-1 +kerning first=266 second=318 amount=-1 +kerning first=220 second=313 amount=-1 +kerning first=316 second=171 amount=-1 +kerning first=264 second=200 amount=-1 +kerning first=324 second=275 amount=-1 +kerning first=210 second=200 amount=-1 +kerning first=218 second=260 amount=-1 +kerning first=214 second=370 amount=-1 +kerning first=214 second=8222 amount=-1 +kerning first=107 second=45 amount=-1 +kerning first=73 second=370 amount=-1 +kerning first=114 second=240 amount=-1 +kerning first=261 second=243 amount=-1 +kerning first=1044 second=1097 amount=-1 +kerning first=356 second=45 amount=-1 +kerning first=199 second=362 amount=-1 +kerning first=73 second=8222 amount=-1 +kerning first=362 second=260 amount=-1 +kerning first=1051 second=1050 amount=-1 +kerning first=263 second=100 amount=-1 +kerning first=1038 second=1092 amount=-1 +kerning first=284 second=45 amount=-1 +kerning first=375 second=187 amount=-1 +kerning first=252 second=275 amount=-1 +kerning first=268 second=333 amount=-1 +kerning first=286 second=370 amount=-1 +kerning first=80 second=71 amount=-1 +kerning first=330 second=257 amount=-1 +kerning first=77 second=234 amount=-1 +kerning first=366 second=257 amount=-1 +kerning first=270 second=209 amount=-1 +kerning first=363 second=267 amount=-1 +kerning first=198 second=209 amount=-1 +kerning first=268 second=97 amount=-1 +kerning first=213 second=80 amount=-1 +kerning first=286 second=223 amount=-1 +kerning first=304 second=97 amount=-1 +kerning first=218 second=234 amount=-1 +kerning first=195 second=217 amount=-1 +kerning first=337 second=380 amount=-1 +kerning first=101 second=243 amount=-1 +kerning first=1048 second=1027 amount=-1 +kerning first=213 second=258 amount=-1 +kerning first=314 second=243 amount=-1 +kerning first=74 second=266 amount=-1 +kerning first=8218 second=224 amount=-1 +kerning first=218 second=325 amount=-1 +kerning first=71 second=72 amount=-1 +kerning first=232 second=8221 amount=-2 +kerning first=230 second=345 amount=-1 +kerning first=8222 second=277 amount=-1 +kerning first=268 second=8221 amount=-1 +kerning first=266 second=345 amount=-1 +kerning first=217 second=335 amount=-1 +kerning first=302 second=345 amount=-1 +kerning first=338 second=345 amount=-1 +kerning first=84 second=171 amount=-1 +kerning first=296 second=242 amount=-1 +kerning first=374 second=345 amount=-1 +kerning first=284 second=72 amount=-1 +kerning first=1030 second=1054 amount=-1 +kerning first=250 second=245 amount=-1 +kerning first=224 second=242 amount=-1 +kerning first=220 second=352 amount=-1 +kerning first=354 second=99 amount=-1 +kerning first=325 second=335 amount=-1 +kerning first=356 second=225 amount=-1 +kerning first=97 second=232 amount=-1 +kerning first=219 second=267 amount=-1 +kerning first=326 second=234 amount=-1 +kerning first=368 second=242 amount=-1 +kerning first=364 second=352 amount=-1 +kerning first=327 second=267 amount=-1 +kerning first=362 second=234 amount=-1 +kerning first=193 second=105 amount=-1 +kerning first=103 second=241 amount=-1 +kerning first=296 second=336 amount=-1 +kerning first=249 second=8221 amount=-1 +kerning first=263 second=328 amount=-1 +kerning first=1039 second=1028 amount=-1 +kerning first=77 second=233 amount=-1 +kerning first=275 second=98 amount=-1 +kerning first=296 second=216 amount=-1 +kerning first=209 second=80 amount=-1 +kerning first=368 second=336 amount=-1 +kerning first=201 second=199 amount=-1 +kerning first=1042 second=1045 amount=-1 +kerning first=85 second=115 amount=-1 +kerning first=1102 second=1093 amount=-1 +kerning first=271 second=114 amount=-1 +kerning first=326 second=233 amount=-1 +kerning first=368 second=216 amount=-1 +kerning first=1043 second=1077 amount=-1 +kerning first=218 second=233 amount=-1 +kerning first=1050 second=1079 amount=-1 +kerning first=267 second=378 amount=-1 +kerning first=8218 second=227 amount=-1 +kerning first=1077 second=1080 amount=-1 +kerning first=330 second=284 amount=-1 +kerning first=67 second=241 amount=-1 +kerning first=231 second=378 amount=-1 +kerning first=1041 second=1080 amount=-1 +kerning first=1067 second=1113 amount=-1 +kerning first=235 second=114 amount=-1 +kerning first=362 second=233 amount=-1 +kerning first=205 second=344 amount=-1 +kerning first=286 second=8222 amount=-1 +kerning first=199 second=114 amount=-1 +kerning first=366 second=284 amount=-1 +kerning first=1033 second=1046 amount=-1 +kerning first=89 second=224 amount=-1 +kerning first=79 second=78 amount=-1 +kerning first=200 second=327 amount=-1 +kerning first=87 second=44 amount=-1 +kerning first=352 second=361 amount=-1 +kerning first=272 second=327 amount=-1 +kerning first=258 second=284 amount=-1 +kerning first=211 second=353 amount=-1 +kerning first=280 second=361 amount=-1 +kerning first=266 second=224 amount=-1 +kerning first=283 second=353 amount=-1 +kerning first=262 second=115 amount=-1 +kerning first=201 second=8222 amount=-1 +kerning first=298 second=115 amount=-1 +kerning first=344 second=81 amount=-1 +kerning first=196 second=250 amount=-1 +kerning first=334 second=115 amount=-1 +kerning first=196 second=8221 amount=-2 +kerning first=45 second=284 amount=-1 +kerning first=351 second=8221 amount=-2 +kerning first=70 second=218 amount=-1 +kerning first=77 second=273 amount=-1 +kerning first=196 second=44 amount=-1 +kerning first=374 second=224 amount=-1 +kerning first=232 second=44 amount=-1 +kerning first=281 second=355 amount=-1 +kerning first=203 second=8249 amount=-1 +kerning first=224 second=235 amount=-1 +kerning first=70 second=78 amount=-1 +kerning first=209 second=355 amount=-1 +kerning first=350 second=282 amount=-1 +kerning first=325 second=227 amount=-1 +kerning first=1049 second=1104 amount=-1 +kerning first=77 second=380 amount=-1 +kerning first=311 second=8249 amount=-1 +kerning first=67 second=267 amount=-1 +kerning first=103 second=267 amount=-1 +kerning first=217 second=102 amount=-1 +kerning first=1043 second=1104 amount=-1 +kerning first=206 second=282 amount=-1 +kerning first=201 second=72 amount=-1 +kerning first=80 second=346 amount=-1 +kerning first=104 second=248 amount=-1 +kerning first=279 second=273 amount=-1 +kerning first=211 second=218 amount=-1 +kerning first=1059 second=1079 amount=-1 +kerning first=209 second=248 amount=-1 +kerning first=1036 second=1089 amount=-1 +kerning first=1052 second=1119 amount=-1 +kerning first=116 second=224 amount=-1 +kerning first=74 second=337 amount=-1 +kerning first=290 second=114 amount=-1 +kerning first=1051 second=1031 amount=-1 +kerning first=1049 second=1086 amount=-1 +kerning first=344 second=288 amount=-1 +kerning first=323 second=230 amount=-1 +kerning first=1051 second=1073 amount=-1 +kerning first=8250 second=324 amount=-1 +kerning first=89 second=279 amount=-1 +kerning first=272 second=206 amount=-1 +kerning first=200 second=274 amount=-1 +kerning first=70 second=337 amount=-1 +kerning first=248 second=291 amount=-1 +kerning first=74 second=230 amount=-1 +kerning first=8222 second=71 amount=-1 +kerning first=219 second=361 amount=-1 +kerning first=200 second=206 amount=-1 +kerning first=207 second=368 amount=-1 +kerning first=107 second=291 amount=-1 +kerning first=66 second=8221 amount=-2 +kerning first=356 second=232 amount=-1 +kerning first=217 second=227 amount=-1 +kerning first=344 second=8218 amount=-1 +kerning first=1027 second=1117 amount=-1 +kerning first=8217 second=275 amount=-1 +kerning first=323 second=337 amount=-1 +kerning first=1030 second=1080 amount=-1 +kerning first=315 second=368 amount=-1 +kerning first=272 second=8218 amount=-1 +kerning first=251 second=337 amount=-1 +kerning first=243 second=8221 amount=-2 +kerning first=66 second=368 amount=-1 +kerning first=279 second=8221 amount=-2 +kerning first=187 second=84 amount=-1 +kerning first=200 second=288 amount=-1 +kerning first=315 second=8221 amount=-1 +kerning first=171 second=368 amount=-1 +kerning first=110 second=337 amount=-1 +kerning first=121 second=187 amount=-1 +kerning first=304 second=211 amount=-1 +kerning first=375 second=107 amount=-1 +kerning first=268 second=211 amount=-1 +kerning first=325 second=200 amount=-1 +kerning first=85 second=187 amount=-2 +kerning first=78 second=99 amount=-1 +kerning first=291 second=99 amount=-1 +kerning first=334 second=187 amount=-1 +kerning first=278 second=270 amount=-1 +kerning first=296 second=362 amount=-1 +kerning first=217 second=200 amount=-1 +kerning first=200 second=8218 amount=-1 +kerning first=226 second=187 amount=-1 +kerning first=8250 second=336 amount=-1 +kerning first=219 second=99 amount=-1 +kerning first=262 second=187 amount=-1 +kerning first=206 second=270 amount=-1 +kerning first=196 second=211 amount=-1 +kerning first=203 second=266 amount=-1 +kerning first=196 second=71 amount=-1 +kerning first=98 second=8222 amount=-1 +kerning first=266 second=279 amount=-1 +kerning first=338 second=371 amount=-1 +kerning first=302 second=279 amount=-1 +kerning first=363 second=99 amount=-1 +kerning first=230 second=279 amount=-1 +kerning first=171 second=218 amount=-1 +kerning first=304 second=71 amount=-1 +kerning first=268 second=71 amount=-1 +kerning first=67 second=202 amount=-1 +kerning first=83 second=362 amount=-1 +kerning first=374 second=279 amount=-1 +kerning first=263 second=367 amount=-1 +kerning first=68 second=80 amount=-1 +kerning first=187 second=209 amount=-1 +kerning first=89 second=371 amount=-1 +kerning first=120 second=108 amount=-1 +kerning first=74 second=364 amount=-1 +kerning first=194 second=371 amount=-1 +kerning first=72 second=350 amount=-1 +kerning first=1030 second=1107 amount=-1 +kerning first=352 second=202 amount=-1 +kerning first=1055 second=1068 amount=-1 +kerning first=314 second=122 amount=-1 +kerning first=218 second=380 amount=-1 +kerning first=347 second=8249 amount=-1 +kerning first=220 second=205 amount=-1 +kerning first=333 second=108 amount=-1 +kerning first=362 second=273 amount=-1 +kerning first=79 second=205 amount=-1 +kerning first=338 second=270 amount=-1 +kerning first=205 second=69 amount=-1 +kerning first=201 second=334 amount=-1 +kerning first=196 second=303 amount=-1 +kerning first=350 second=270 amount=-1 +kerning first=254 second=380 amount=-1 +kerning first=261 second=108 amount=-1 +kerning first=362 second=380 amount=-1 +kerning first=210 second=221 amount=-1 +kerning first=218 second=273 amount=-1 +kerning first=327 second=216 amount=-1 +kerning first=323 second=364 amount=-1 +kerning first=198 second=68 amount=-1 +kerning first=220 second=8221 amount=-1 +kerning first=270 second=68 amount=-1 +kerning first=85 second=229 amount=-1 +kerning first=73 second=82 amount=-1 +kerning first=100 second=263 amount=-1 +kerning first=209 second=286 amount=-1 +kerning first=205 second=263 amount=-1 +kerning first=366 second=365 amount=-1 +kerning first=241 second=263 amount=-1 +kerning first=258 second=365 amount=-1 +kerning first=86 second=194 amount=-1 +kerning first=277 second=263 amount=-1 +kerning first=195 second=214 amount=-1 +kerning first=214 second=82 amount=-1 +kerning first=298 second=229 amount=-1 +kerning first=370 second=229 amount=-1 +kerning first=213 second=298 amount=-1 +kerning first=1054 second=1051 amount=-1 +kerning first=45 second=365 amount=-1 +kerning first=262 second=229 amount=-1 +kerning first=366 second=219 amount=-1 +kerning first=323 second=203 amount=-1 +kerning first=1030 second=1091 amount=-1 +kerning first=1051 second=1100 amount=-1 +kerning first=45 second=77 amount=-1 +kerning first=1027 second=1076 amount=-1 +kerning first=1064 second=1083 amount=-1 +kerning first=81 second=77 amount=-1 +kerning first=356 second=333 amount=-1 +kerning first=279 second=316 amount=-1 +kerning first=73 second=330 amount=-1 +kerning first=243 second=316 amount=-1 +kerning first=202 second=220 amount=-1 +kerning first=351 second=316 amount=-1 +kerning first=328 second=339 amount=-1 +kerning first=209 second=382 amount=-1 +kerning first=326 second=246 amount=-1 +kerning first=1043 second=1090 amount=-1 +kerning first=1056 second=1048 amount=-1 +kerning first=245 second=382 amount=-1 +kerning first=1091 second=1102 amount=-1 +kerning first=281 second=382 amount=-1 +kerning first=1030 second=1079 amount=-1 +kerning first=364 second=339 amount=-1 +kerning first=366 second=77 amount=-1 +kerning first=218 second=246 amount=-1 +kerning first=8216 second=256 amount=-2 +kerning first=314 second=103 amount=-1 +kerning first=286 second=330 amount=-1 +kerning first=1049 second=1034 amount=-1 +kerning first=1049 second=1099 amount=-1 +kerning first=1073 second=1093 amount=-1 +kerning first=213 second=323 amount=-1 +kerning first=8220 second=197 amount=-2 +kerning first=242 second=103 amount=-1 +kerning first=330 second=77 amount=-1 +kerning first=77 second=246 amount=-1 +kerning first=270 second=356 amount=-1 +kerning first=206 second=103 amount=-1 +kerning first=199 second=281 amount=-1 +kerning first=203 second=304 amount=-1 +kerning first=350 second=315 amount=-1 +kerning first=310 second=220 amount=-1 +kerning first=235 second=281 amount=-1 +kerning first=274 second=220 amount=-1 +kerning first=101 second=103 amount=-1 +kerning first=271 second=281 amount=-1 +kerning first=307 second=281 amount=-1 +kerning first=346 second=220 amount=-1 +kerning first=283 second=245 amount=-1 +kerning first=268 second=109 amount=-1 +kerning first=78 second=280 amount=-1 +kerning first=87 second=196 amount=-1 +kerning first=374 second=210 amount=-1 +kerning first=219 second=280 amount=-1 +kerning first=212 second=85 amount=-1 +kerning first=283 second=120 amount=-1 +kerning first=326 second=119 amount=-1 +kerning first=106 second=245 amount=-1 +kerning first=85 second=256 amount=-1 +kerning first=261 second=314 amount=-1 +kerning first=337 second=8217 amount=-2 +kerning first=338 second=210 amount=-1 +kerning first=70 second=245 amount=-1 +kerning first=225 second=314 amount=-1 +kerning first=298 second=216 amount=-1 +kerning first=317 second=221 amount=-1 +kerning first=1059 second=1114 amount=-1 +kerning first=266 second=210 amount=-1 +kerning first=327 second=280 amount=-1 +kerning first=120 second=314 amount=-1 +kerning first=77 second=315 amount=-1 +kerning first=112 second=8222 amount=-1 +kerning first=209 second=313 amount=-1 +kerning first=194 second=210 amount=-1 +kerning first=8250 second=255 amount=-1 +kerning first=310 second=118 amount=-1 +kerning first=333 second=314 amount=-1 +kerning first=223 second=8218 amount=-1 +kerning first=370 second=246 amount=-1 +kerning first=89 second=210 amount=-1 +kerning first=220 second=339 amount=-1 +kerning first=72 second=271 amount=-1 +kerning first=68 second=313 amount=-1 +kerning first=70 second=120 amount=-1 +kerning first=355 second=245 amount=-1 +kerning first=327 second=8250 amount=-1 +kerning first=1059 second=1107 amount=-1 +kerning first=370 second=256 amount=-1 +kerning first=1043 second=1117 amount=-1 +kerning first=255 second=8250 amount=-1 +kerning first=199 second=254 amount=-1 +kerning first=74 second=203 amount=-1 +kerning first=258 second=171 amount=-1 +kerning first=1066 second=1042 amount=-1 +kerning first=219 second=8250 amount=-2 +kerning first=367 second=111 amount=-1 +kerning first=235 second=254 amount=-1 +kerning first=350 second=76 amount=-1 +kerning first=272 second=219 amount=-1 +kerning first=114 second=8250 amount=-1 +kerning first=78 second=8250 amount=-1 +kerning first=278 second=76 amount=-1 +kerning first=200 second=219 amount=-1 +kerning first=205 second=327 amount=-1 +kerning first=192 second=374 amount=-1 +kerning first=243 second=289 amount=-1 +kerning first=1101 second=1084 amount=-1 +kerning first=224 second=101 amount=-1 +kerning first=206 second=76 amount=-1 +kerning first=291 second=305 amount=-1 +kerning first=1058 second=1101 amount=-1 +kerning first=73 second=357 amount=-1 +kerning first=226 second=314 amount=-1 +kerning first=296 second=101 amount=-1 +kerning first=193 second=8217 amount=-2 +kerning first=279 second=289 amount=-1 +kerning first=8217 second=367 amount=-1 +kerning first=261 second=114 amount=-1 +kerning first=229 second=8217 amount=-2 +kerning first=218 second=315 amount=-1 +kerning first=351 second=289 amount=-1 +kerning first=80 second=212 amount=-1 +kerning first=259 second=111 amount=-1 +kerning first=362 second=315 amount=-1 +kerning first=88 second=8217 amount=-1 +kerning first=1040 second=1059 amount=-2 +kerning first=302 second=280 amount=-1 +kerning first=1028 second=1044 amount=-1 +kerning first=266 second=280 amount=-1 +kerning first=264 second=335 amount=-1 +kerning first=8217 second=79 amount=-1 +kerning first=338 second=280 amount=-1 +kerning first=267 second=120 amount=-1 +kerning first=86 second=232 amount=-1 +kerning first=324 second=233 amount=-1 +kerning first=1060 second=1067 amount=-1 +kerning first=45 second=326 amount=-1 +kerning first=1071 second=1099 amount=-1 +kerning first=369 second=263 amount=-1 +kerning first=261 second=287 amount=-1 +kerning first=225 second=287 amount=-1 +kerning first=262 second=46 amount=-1 +kerning first=277 second=8220 amount=-2 +kerning first=82 second=85 amount=-1 +kerning first=104 second=339 amount=-1 +kerning first=241 second=8220 amount=-2 +kerning first=120 second=287 amount=-1 +kerning first=264 second=98 amount=-1 +kerning first=269 second=241 amount=-1 +kerning first=296 second=271 amount=-1 +kerning first=313 second=8220 amount=-1 +kerning first=369 second=287 amount=-1 +kerning first=87 second=335 amount=-1 +kerning first=192 second=98 amount=-1 +kerning first=205 second=302 amount=-1 +kerning first=368 second=271 amount=-1 +kerning first=228 second=335 amount=-1 +kerning first=88 second=67 amount=-1 +kerning first=242 second=378 amount=-1 +kerning first=196 second=219 amount=-1 +kerning first=266 second=83 amount=-1 +kerning first=206 second=378 amount=-1 +kerning first=302 second=83 amount=-1 +kerning first=284 second=298 amount=-1 +kerning first=1065 second=1090 amount=-1 +kerning first=101 second=378 amount=-1 +kerning first=262 second=311 amount=-1 +kerning first=288 second=344 amount=-1 +kerning first=121 second=46 amount=-1 +kerning first=198 second=80 amount=-1 +kerning first=254 second=289 amount=-1 +kerning first=284 second=8250 amount=-1 +kerning first=85 second=46 amount=-2 +kerning first=314 second=378 amount=-1 +kerning first=1042 second=1114 amount=-1 +kerning first=326 second=289 amount=-1 +kerning first=325 second=76 amount=-1 +kerning first=217 second=76 amount=-1 +kerning first=366 second=353 amount=-1 +kerning first=199 second=216 amount=-1 +kerning first=330 second=353 amount=-1 +kerning first=1054 second=1061 amount=-1 +kerning first=70 second=284 amount=-1 +kerning first=1036 second=1105 amount=-1 +kerning first=1059 second=1118 amount=-1 +kerning first=203 second=357 amount=-1 +kerning first=296 second=74 amount=-1 +kerning first=275 second=357 amount=-1 +kerning first=240 second=246 amount=-1 +kerning first=257 second=113 amount=-1 +kerning first=368 second=74 amount=-1 +kerning first=86 second=259 amount=-1 +kerning first=264 second=201 amount=-1 +kerning first=231 second=269 amount=-1 +kerning first=45 second=116 amount=-1 +kerning first=1069 second=1084 amount=-1 +kerning first=1064 second=1071 amount=-1 +kerning first=221 second=113 amount=-1 +kerning first=194 second=253 amount=-1 +kerning first=80 second=113 amount=-1 +kerning first=339 second=269 amount=-1 +kerning first=263 second=259 amount=-1 +kerning first=258 second=116 amount=-1 +kerning first=220 second=204 amount=-1 +kerning first=267 second=269 amount=-1 +kerning first=364 second=310 amount=-1 +kerning first=370 second=302 amount=-1 +kerning first=270 second=317 amount=-1 +kerning first=1058 second=1085 amount=-1 +kerning first=200 second=330 amount=-1 +kerning first=364 second=204 amount=-1 +kerning first=272 second=65 amount=-1 +kerning first=1048 second=1069 amount=-1 +kerning first=212 second=200 amount=-1 +kerning first=259 second=187 amount=-1 +kerning first=200 second=369 amount=-1 +kerning first=362 second=350 amount=-1 +kerning first=193 second=67 amount=-1 +kerning first=101 second=244 amount=-1 +kerning first=365 second=113 amount=-1 +kerning first=323 second=268 amount=-1 +kerning first=374 second=103 amount=-1 +kerning first=278 second=278 amount=-1 +kerning first=75 second=210 amount=-1 +kerning first=86 second=122 amount=-1 +kerning first=1052 second=1094 amount=-1 +kerning first=234 second=107 amount=-1 +kerning first=365 second=277 amount=-1 +kerning first=106 second=113 amount=-1 +kerning first=298 second=225 amount=-1 +kerning first=1042 second=1087 amount=-1 +kerning first=206 second=351 amount=-1 +kerning first=1034 second=1053 amount=-1 +kerning first=85 second=213 amount=-1 +kerning first=74 second=268 amount=-1 +kerning first=280 second=73 amount=-1 +kerning first=101 second=351 amount=-1 +kerning first=200 second=262 amount=-1 +kerning first=330 second=219 amount=-1 +kerning first=198 second=317 amount=-1 +kerning first=352 second=73 amount=-1 +kerning first=298 second=213 amount=-1 +kerning first=116 second=277 amount=-1 +kerning first=258 second=219 amount=-1 +kerning first=262 second=213 amount=-1 +kerning first=80 second=277 amount=-1 +kerning first=286 second=82 amount=-1 +kerning first=201 second=251 amount=-1 +kerning first=366 second=116 amount=-1 +kerning first=344 second=262 amount=-1 +kerning first=335 second=122 amount=-1 +kerning first=330 second=116 amount=-1 +kerning first=344 second=370 amount=-1 +kerning first=283 second=8218 amount=-1 +kerning first=1027 second=1102 amount=-1 +kerning first=81 second=219 amount=-1 +kerning first=263 second=122 amount=-1 +kerning first=257 second=277 amount=-1 +kerning first=1052 second=1076 amount=-1 +kerning first=193 second=311 amount=-1 +kerning first=370 second=213 amount=-1 +kerning first=221 second=277 amount=-1 +kerning first=1065 second=1117 amount=-1 +kerning first=1041 second=1038 amount=-1 +kerning first=45 second=219 amount=-1 +kerning first=227 second=122 amount=-1 +kerning first=204 second=380 amount=-1 +kerning first=217 second=270 amount=-1 +kerning first=8217 second=232 amount=-1 +kerning first=364 second=231 amount=-1 +kerning first=80 second=8221 amount=-1 +kerning first=80 second=218 amount=-1 +kerning first=240 second=380 amount=-1 +kerning first=117 second=283 amount=-1 +kerning first=367 second=248 amount=-1 +kerning first=1058 second=1089 amount=-1 +kerning first=221 second=8221 amount=-1 +kerning first=210 second=75 amount=-1 +kerning first=220 second=231 amount=-1 +kerning first=1030 second=1119 amount=-1 +kerning first=257 second=382 amount=-1 +kerning first=257 second=8221 amount=-2 +kerning first=72 second=242 amount=-1 +kerning first=259 second=248 amount=-1 +kerning first=325 second=270 amount=-1 +kerning first=108 second=242 amount=-1 +kerning first=69 second=75 amount=-1 +kerning first=209 second=209 amount=-1 +kerning first=204 second=66 amount=-1 +kerning first=365 second=8221 amount=-1 +kerning first=199 second=336 amount=-1 +kerning first=249 second=242 amount=-1 +kerning first=68 second=209 amount=-1 +kerning first=330 second=283 amount=-1 +kerning first=356 second=226 amount=-1 +kerning first=366 second=283 amount=-1 +kerning first=8249 second=85 amount=-1 +kerning first=99 second=380 amount=-1 +kerning first=86 second=79 amount=-1 +kerning first=268 second=268 amount=-1 +kerning first=210 second=8220 amount=-2 +kerning first=206 second=244 amount=-1 +kerning first=366 second=102 amount=-1 +kerning first=207 second=233 amount=-1 +kerning first=70 second=327 amount=-1 +kerning first=347 second=8222 amount=-1 +kerning first=80 second=70 amount=-1 +kerning first=270 second=274 amount=-1 +kerning first=311 second=8222 amount=-1 +kerning first=345 second=45 amount=-1 +kerning first=366 second=192 amount=-1 +kerning first=314 second=244 amount=-1 +kerning first=211 second=327 amount=-1 +kerning first=1056 second=1113 amount=-1 +kerning first=203 second=8222 amount=-1 +kerning first=75 second=367 amount=-1 +kerning first=279 second=233 amount=-1 +kerning first=81 second=192 amount=-1 +kerning first=270 second=256 amount=-1 +kerning first=354 second=44 amount=-1 +kerning first=246 second=44 amount=-1 +kerning first=73 second=8249 amount=-1 +kerning first=45 second=192 amount=-1 +kerning first=287 second=115 amount=-1 +kerning first=327 second=337 amount=-1 +kerning first=209 second=205 amount=-1 +kerning first=1028 second=1071 amount=-1 +kerning first=68 second=205 amount=-1 +kerning first=78 second=224 amount=-1 +kerning first=366 second=310 amount=-1 +kerning first=330 second=310 amount=-1 +kerning first=197 second=214 amount=-1 +kerning first=327 second=224 amount=-1 +kerning first=254 second=8218 amount=-1 +kerning first=219 second=224 amount=-1 +kerning first=206 second=332 amount=-1 +kerning first=81 second=353 amount=-1 +kerning first=289 second=248 amount=-1 +kerning first=272 second=84 amount=-1 +kerning first=278 second=369 amount=-1 +kerning first=67 second=277 amount=-1 +kerning first=81 second=310 amount=-1 +kerning first=217 second=243 amount=-1 +kerning first=282 second=71 amount=-1 +kerning first=116 second=243 amount=-1 +kerning first=187 second=252 amount=-1 +kerning first=205 second=275 amount=-1 +kerning first=118 second=252 amount=-1 +kerning first=277 second=275 amount=-1 +kerning first=210 second=362 amount=-1 +kerning first=270 second=80 amount=-1 +kerning first=241 second=275 amount=-1 +kerning first=69 second=71 amount=-1 +kerning first=282 second=362 amount=-1 +kerning first=369 second=242 amount=-1 +kerning first=245 second=106 amount=-1 +kerning first=1052 second=1107 amount=-1 +kerning first=281 second=106 amount=-1 +kerning first=100 second=275 amount=-1 +kerning first=193 second=354 amount=-1 +kerning first=1077 second=1081 amount=-1 +kerning first=221 second=97 amount=-1 +kerning first=1055 second=1097 amount=-1 +kerning first=65 second=217 amount=-1 +kerning first=1091 second=1097 amount=-1 +kerning first=229 second=234 amount=-1 +kerning first=8218 second=98 amount=-1 +kerning first=206 second=217 amount=-1 +kerning first=80 second=97 amount=-1 +kerning first=203 second=223 amount=-1 +kerning first=69 second=362 amount=-1 +kerning first=116 second=97 amount=-1 +kerning first=70 second=257 amount=-1 +kerning first=278 second=217 amount=-1 +kerning first=325 second=243 amount=-1 +kerning first=350 second=217 amount=-1 +kerning first=263 second=232 amount=-1 +kerning first=289 second=243 amount=-1 +kerning first=325 second=266 amount=-1 +kerning first=227 second=232 amount=-1 +kerning first=1046 second=1098 amount=-1 +kerning first=75 second=371 amount=-1 +kerning first=100 second=345 amount=-1 +kerning first=196 second=368 amount=-1 +kerning first=1071 second=1072 amount=-1 +kerning first=217 second=266 amount=-1 +kerning first=330 second=68 amount=-1 +kerning first=205 second=345 amount=-1 +kerning first=244 second=108 amount=-1 +kerning first=241 second=345 amount=-1 +kerning first=78 second=219 amount=-1 +kerning first=199 second=263 amount=-1 +kerning first=220 second=325 amount=-1 +kerning first=1118 second=1098 amount=-1 +kerning first=211 second=8218 amount=-1 +kerning first=80 second=109 amount=-1 +kerning first=194 second=86 amount=-1 +kerning first=366 second=245 amount=-1 +kerning first=270 second=221 amount=-1 +kerning first=106 second=8218 amount=-1 +kerning first=366 second=120 amount=-1 +kerning first=330 second=245 amount=-1 +kerning first=355 second=8218 amount=-1 +kerning first=219 second=197 amount=-1 +kerning first=272 second=370 amount=-1 +kerning first=268 second=368 amount=-1 +kerning first=270 second=313 amount=-1 +kerning first=1065 second=1116 amount=-1 +kerning first=304 second=368 amount=-1 +kerning first=200 second=370 amount=-1 +kerning first=1059 second=1092 amount=-1 +kerning first=221 second=109 amount=-1 +kerning first=117 second=245 amount=-1 +kerning first=1052 second=1037 amount=-1 +kerning first=335 second=378 amount=-1 +kerning first=66 second=288 amount=-1 +kerning first=70 second=108 amount=-1 +kerning first=187 second=199 amount=-1 +kerning first=275 second=249 amount=-1 +kerning first=8218 second=266 amount=-1 +kerning first=45 second=120 amount=-1 +kerning first=71 second=201 amount=-1 +kerning first=198 second=313 amount=-1 +kerning first=350 second=72 amount=-1 +kerning first=1047 second=1101 amount=-1 +kerning first=89 second=361 amount=-1 +kerning first=368 second=275 amount=-1 +kerning first=85 second=45 amount=-2 +kerning first=99 second=105 amount=-1 +kerning first=121 second=45 amount=-1 +kerning first=1038 second=1086 amount=-1 +kerning first=203 second=249 amount=-1 +kerning first=218 second=229 amount=-1 +kerning first=233 second=267 amount=-1 +kerning first=269 second=267 amount=-1 +kerning first=217 second=217 amount=-1 +kerning first=370 second=72 amount=-1 +kerning first=305 second=267 amount=-1 +kerning first=80 second=274 amount=-1 +kerning first=1030 second=1097 amount=-1 +kerning first=1041 second=1042 amount=-1 +kerning first=325 second=217 amount=-1 +kerning first=282 second=212 amount=-1 +kerning first=1053 second=1113 amount=-1 +kerning first=282 second=114 amount=-1 +kerning first=1030 second=1042 amount=-1 +kerning first=268 second=205 amount=-1 +kerning first=264 second=102 amount=-1 +kerning first=69 second=212 amount=-1 +kerning first=228 second=8249 amount=-1 +kerning first=105 second=114 amount=-1 +kerning first=86 second=258 amount=-1 +kerning first=264 second=8249 amount=-1 +kerning first=246 second=114 amount=-1 +kerning first=234 second=111 amount=-1 +kerning first=73 second=262 amount=-1 +kerning first=1118 second=1102 amount=-1 +kerning first=8217 second=193 amount=-2 +kerning first=1071 second=1098 amount=-1 +kerning first=74 second=115 amount=-1 +kerning first=69 second=114 amount=-1 +kerning first=87 second=331 amount=-1 +kerning first=66 second=260 amount=-1 +kerning first=366 second=78 amount=-1 +kerning first=234 second=355 amount=-1 +kerning first=1042 second=1061 amount=-1 +kerning first=198 second=355 amount=-1 +kerning first=277 second=318 amount=-1 +kerning first=80 second=44 amount=-2 +kerning first=1052 second=1064 amount=-1 +kerning first=325 second=209 amount=-1 +kerning first=70 second=288 amount=-1 +kerning first=45 second=218 amount=-1 +kerning first=264 second=331 amount=-1 +kerning first=1031 second=1074 amount=-1 +kerning first=330 second=78 amount=-1 +kerning first=221 second=44 amount=-1 +kerning first=229 second=380 amount=-1 +kerning first=81 second=78 amount=-1 +kerning first=45 second=78 amount=-1 +kerning first=234 second=248 amount=-1 +kerning first=221 second=345 amount=-1 +kerning first=85 second=72 amount=-1 +kerning first=1047 second=1036 amount=-1 +kerning first=1066 second=1055 amount=-1 +kerning first=366 second=218 amount=-1 +kerning first=330 second=218 amount=-1 +kerning first=67 second=332 amount=-1 +kerning first=1039 second=1068 amount=-1 +kerning first=258 second=218 amount=-1 +kerning first=99 second=230 amount=-1 +kerning first=114 second=224 amount=-1 +kerning first=87 second=227 amount=-1 +kerning first=264 second=8222 amount=-1 +kerning first=280 second=332 amount=-1 +kerning first=100 second=279 amount=-1 +kerning first=194 second=361 amount=-1 +kerning first=1067 second=1092 amount=-1 +kerning first=241 second=279 amount=-1 +kerning first=87 second=8222 amount=-2 +kerning first=367 second=291 amount=-1 +kerning first=198 second=274 amount=-1 +kerning first=338 second=361 amount=-1 +kerning first=1048 second=1070 amount=-1 +kerning first=227 second=267 amount=-1 +kerning first=374 second=361 amount=-1 +kerning first=205 second=279 amount=-1 +kerning first=259 second=291 amount=-1 +kerning first=323 second=187 amount=-1 +kerning first=223 second=291 amount=-1 +kerning first=240 second=337 amount=-1 +kerning first=79 second=207 amount=-1 +kerning first=204 second=337 amount=-1 +kerning first=80 second=246 amount=-1 +kerning first=118 second=291 amount=-1 +kerning first=287 second=187 amount=-1 +kerning first=264 second=227 amount=-1 +kerning first=99 second=337 amount=-1 +kerning first=8217 second=283 amount=-1 +kerning first=8222 second=368 amount=-1 +kerning first=258 second=374 amount=-1 +kerning first=274 second=323 amount=-1 +kerning first=336 second=8222 amount=-1 +kerning first=206 second=352 amount=-1 +kerning first=202 second=323 amount=-1 +kerning first=270 second=84 amount=-1 +kerning first=73 second=81 amount=-1 +kerning first=206 second=325 amount=-1 +kerning first=74 second=317 amount=-1 +kerning first=193 second=338 amount=-1 +kerning first=278 second=325 amount=-1 +kerning first=346 second=323 amount=-1 +kerning first=88 second=338 amount=-1 +kerning first=221 second=211 amount=-1 +kerning first=350 second=325 amount=-1 +kerning first=1101 second=1078 amount=-1 +kerning first=105 second=281 amount=-1 +kerning first=80 second=211 amount=-1 +kerning first=103 second=99 amount=-1 +kerning first=325 second=347 amount=-1 +kerning first=316 second=99 amount=-1 +kerning first=255 second=251 amount=-1 +kerning first=352 second=8250 amount=-1 +kerning first=218 second=201 amount=-1 +kerning first=1048 second=1043 amount=-1 +kerning first=8218 second=335 amount=-1 +kerning first=253 second=347 amount=-1 +kerning first=1075 second=1116 amount=-1 +kerning first=282 second=214 amount=-1 +kerning first=289 second=347 amount=-1 +kerning first=280 second=8250 amount=-1 +kerning first=70 second=369 amount=-1 +kerning first=244 second=8250 amount=-1 +kerning first=198 second=290 amount=-1 +kerning first=8218 second=243 amount=-1 +kerning first=217 second=347 amount=-1 +kerning first=208 second=8250 amount=-1 +kerning first=113 second=316 amount=-1 +kerning first=1053 second=1097 amount=-1 +kerning first=283 second=369 amount=-1 +kerning first=254 second=316 amount=-1 +kerning first=204 second=268 amount=-1 +kerning first=103 second=8250 amount=-1 +kerning first=278 second=334 amount=-1 +kerning first=1059 second=1051 amount=-1 +kerning first=103 second=305 amount=-1 +kerning first=67 second=8250 amount=-1 +kerning first=8250 second=379 amount=-1 +kerning first=217 second=351 amount=-1 +kerning first=310 second=117 amount=-1 +kerning first=99 second=8217 amount=-2 +kerning first=274 second=117 amount=-1 +kerning first=233 second=104 amount=-1 +kerning first=282 second=202 amount=-1 +kerning first=269 second=104 amount=-1 +kerning first=325 second=351 amount=-1 +kerning first=289 second=351 amount=-1 +kerning first=82 second=264 amount=-1 +kerning first=364 second=366 amount=-1 +kerning first=197 second=104 amount=-1 +kerning first=224 second=113 amount=-1 +kerning first=203 second=82 amount=-1 +kerning first=1051 second=1030 amount=-1 +kerning first=8218 second=336 amount=-1 +kerning first=72 second=101 amount=-1 +kerning first=86 second=193 amount=-1 +kerning first=1034 second=1049 amount=-1 +kerning first=288 second=69 amount=-1 +kerning first=70 second=121 amount=-1 +kerning first=79 second=296 amount=-1 +kerning first=249 second=101 amount=-1 +kerning first=1054 second=1052 amount=-1 +kerning first=105 second=277 amount=-1 +kerning first=240 second=8217 amount=-2 +kerning first=204 second=364 amount=-1 +kerning first=198 second=286 amount=-1 +kerning first=1065 second=1074 amount=-1 +kerning first=112 second=103 amount=-1 +kerning first=283 second=365 amount=-1 +kerning first=252 second=263 amount=-1 +kerning first=75 second=171 amount=-1 +kerning first=204 second=220 amount=-1 +kerning first=8217 second=366 amount=-1 +kerning first=324 second=263 amount=-1 +kerning first=364 second=296 amount=-1 +kerning first=83 second=298 amount=-1 +kerning first=87 second=8249 amount=-2 +kerning first=1070 second=1049 amount=-1 +kerning first=252 second=171 amount=-1 +kerning first=209 second=68 amount=-1 +kerning first=288 second=171 amount=-1 +kerning first=296 second=298 amount=-1 +kerning first=70 second=365 amount=-1 +kerning first=1067 second=1071 amount=-1 +kerning first=368 second=298 amount=-1 +kerning first=250 second=287 amount=-1 +kerning first=364 second=46 amount=-2 +kerning first=202 second=117 amount=-1 +kerning first=109 second=287 amount=-1 +kerning first=283 second=246 amount=-1 +kerning first=204 second=203 amount=-1 +kerning first=233 second=100 amount=-1 +kerning first=1054 second=1025 amount=-1 +kerning first=78 second=83 amount=-1 +kerning first=367 second=333 amount=-1 +kerning first=269 second=100 amount=-1 +kerning first=219 second=83 amount=-1 +kerning first=1053 second=1083 amount=-1 +kerning first=85 second=278 amount=-1 +kerning first=209 second=339 amount=-1 +kerning first=323 second=229 amount=-1 +kerning first=327 second=83 amount=-1 +kerning first=281 second=339 amount=-1 +kerning first=187 second=356 amount=-1 +kerning first=203 second=330 amount=-1 +kerning first=264 second=304 amount=-1 +kerning first=68 second=68 amount=-1 +kerning first=229 second=246 amount=-1 +kerning first=80 second=267 amount=-1 +kerning first=325 second=103 amount=-1 +kerning first=72 second=74 amount=-1 +kerning first=354 second=281 amount=-1 +kerning first=1051 second=1057 amount=-1 +kerning first=370 second=278 amount=-1 +kerning first=253 second=103 amount=-1 +kerning first=334 second=278 amount=-1 +kerning first=217 second=103 amount=-1 +kerning first=206 second=296 amount=-1 +kerning first=298 second=278 amount=-1 +kerning first=323 second=246 amount=-1 +kerning first=248 second=382 amount=-1 +kerning first=200 second=8222 amount=-1 +kerning first=287 second=246 amount=-1 +kerning first=251 second=246 amount=-1 +kerning first=205 second=100 amount=-1 +kerning first=8222 second=87 amount=-2 +kerning first=199 second=298 amount=-1 +kerning first=228 second=103 amount=-1 +kerning first=356 second=382 amount=-1 +kerning first=220 second=269 amount=-1 +kerning first=272 second=77 amount=-1 +kerning first=277 second=100 amount=-1 +kerning first=205 second=220 amount=-1 +kerning first=110 second=246 amount=-1 +kerning first=313 second=220 amount=-1 +kerning first=198 second=330 amount=-1 +kerning first=74 second=246 amount=-1 +kerning first=200 second=77 amount=-1 +kerning first=79 second=356 amount=-1 +kerning first=364 second=269 amount=-1 +kerning first=212 second=68 amount=-1 +kerning first=1053 second=1062 amount=-1 +kerning first=213 second=194 amount=-1 +kerning first=199 second=211 amount=-1 +kerning first=251 second=333 amount=-1 +kerning first=110 second=333 amount=-1 +kerning first=284 second=68 amount=-1 +kerning first=352 second=365 amount=-1 +kerning first=328 second=269 amount=-1 +kerning first=280 second=365 amount=-1 +kerning first=344 second=8222 amount=-1 +kerning first=1070 second=1048 amount=-1 +kerning first=316 second=365 amount=-1 +kerning first=1034 second=1048 amount=-1 +kerning first=229 second=289 amount=-1 +kerning first=272 second=8222 amount=-1 +kerning first=323 second=333 amount=-1 +kerning first=71 second=68 amount=-1 +kerning first=85 second=335 amount=-1 +kerning first=72 second=281 amount=-1 +kerning first=350 second=313 amount=-1 +kerning first=108 second=281 amount=-1 +kerning first=80 second=315 amount=-1 +kerning first=70 second=202 amount=-1 +kerning first=8217 second=220 amount=-1 +kerning first=214 second=84 amount=-1 +kerning first=206 second=313 amount=-1 +kerning first=85 second=111 amount=-1 +kerning first=214 second=347 amount=-1 +kerning first=278 second=313 amount=-1 +kerning first=65 second=86 amount=-1 +kerning first=1036 second=1087 amount=-1 +kerning first=8222 second=336 amount=-1 +kerning first=1040 second=1057 amount=-1 +kerning first=77 second=364 amount=-1 +kerning first=1040 second=1117 amount=-1 +kerning first=263 second=324 amount=-1 +kerning first=73 second=347 amount=-1 +kerning first=1069 second=1042 amount=-1 +kerning first=230 second=271 amount=-1 +kerning first=211 second=202 amount=-1 +kerning first=209 second=264 amount=-1 +kerning first=1044 second=1088 amount=-1 +kerning first=214 second=325 amount=-1 +kerning first=346 second=69 amount=-1 +kerning first=85 second=251 amount=-1 +kerning first=121 second=251 amount=-1 +kerning first=193 second=214 amount=-1 +kerning first=370 second=251 amount=-1 +kerning first=243 second=8217 amount=-2 +kerning first=207 second=212 amount=-1 +kerning first=1048 second=1118 amount=-1 +kerning first=279 second=8217 amount=-2 +kerning first=315 second=8217 amount=-1 +kerning first=69 second=8221 amount=-1 +kerning first=277 second=345 amount=-1 +kerning first=66 second=8217 amount=-2 +kerning first=105 second=8221 amount=-1 +kerning first=199 second=271 amount=-1 +kerning first=66 second=212 amount=-1 +kerning first=8250 second=367 amount=-1 +kerning first=210 second=8221 amount=-2 +kerning first=226 second=111 amount=-1 +kerning first=270 second=85 amount=-1 +kerning first=261 second=245 amount=-1 +kerning first=298 second=111 amount=-1 +kerning first=198 second=85 amount=-1 +kerning first=97 second=242 amount=-1 +kerning first=354 second=8221 amount=-1 +kerning first=280 second=334 amount=-1 +kerning first=351 second=8217 amount=-2 +kerning first=195 second=221 amount=-1 +kerning first=370 second=111 amount=-1 +kerning first=84 second=245 amount=-1 +kerning first=363 second=263 amount=-1 +kerning first=103 second=365 amount=-1 +kerning first=362 second=8217 amount=-1 +kerning first=85 second=231 amount=-1 +kerning first=337 second=289 amount=-1 +kerning first=1039 second=1024 amount=-1 +kerning first=204 second=67 amount=-1 +kerning first=288 second=366 amount=-1 +kerning first=203 second=288 amount=-1 +kerning first=201 second=203 amount=-1 +kerning first=1069 second=1064 amount=-1 +kerning first=221 second=195 amount=-1 +kerning first=264 second=357 amount=-1 +kerning first=304 second=233 amount=-1 +kerning first=364 second=102 amount=-1 +kerning first=78 second=263 amount=-1 +kerning first=232 second=233 amount=-1 +kerning first=99 second=45 amount=-1 +kerning first=205 second=280 amount=-1 +kerning first=214 second=374 amount=-1 +kerning first=268 second=233 amount=-1 +kerning first=264 second=76 amount=-1 +kerning first=1036 second=1059 amount=-1 +kerning first=192 second=357 amount=-1 +kerning first=291 second=263 amount=-1 +kerning first=1058 second=1084 amount=-1 +kerning first=327 second=263 amount=-1 +kerning first=204 second=267 amount=-1 +kerning first=302 second=122 amount=-1 +kerning first=282 second=363 amount=-1 +kerning first=230 second=122 amount=-1 +kerning first=201 second=317 amount=-1 +kerning first=258 second=375 amount=-1 +kerning first=266 second=122 amount=-1 +kerning first=323 second=213 amount=-1 +kerning first=231 second=107 amount=-1 +kerning first=304 second=207 amount=-1 +kerning first=218 second=250 amount=-1 +kerning first=195 second=107 amount=-1 +kerning first=268 second=207 amount=-1 +kerning first=68 second=204 amount=-1 +kerning first=121 second=311 amount=-1 +kerning first=232 second=8250 amount=-1 +kerning first=1046 second=1072 amount=-1 +kerning first=203 second=201 amount=-1 +kerning first=296 second=232 amount=-1 +kerning first=219 second=116 amount=-1 +kerning first=198 second=282 amount=-1 +kerning first=310 second=216 amount=-1 +kerning first=8218 second=103 amount=-1 +kerning first=209 second=204 amount=-1 +kerning first=304 second=337 amount=-1 +kerning first=75 second=366 amount=-1 +kerning first=1052 second=1081 amount=-1 +kerning first=78 second=116 amount=-1 +kerning first=217 second=244 amount=-1 +kerning first=281 second=378 amount=-1 +kerning first=368 second=259 amount=-1 +kerning first=327 second=116 amount=-1 +kerning first=289 second=244 amount=-1 +kerning first=209 second=378 amount=-1 +kerning first=296 second=259 amount=-1 +kerning first=1058 second=1102 amount=-1 +kerning first=325 second=244 amount=-1 +kerning first=70 second=262 amount=-1 +kerning first=1042 second=1024 amount=-1 +kerning first=1051 second=1096 amount=-1 +kerning first=1058 second=1094 amount=-1 +kerning first=86 second=210 amount=-1 +kerning first=75 second=345 amount=-1 +kerning first=278 second=290 amount=-1 +kerning first=111 second=345 amount=-1 +kerning first=1042 second=1049 amount=-1 +kerning first=346 second=302 amount=-1 +kerning first=275 second=369 amount=-1 +kerning first=339 second=107 amount=-1 +kerning first=274 second=302 amount=-1 +kerning first=74 second=213 amount=-1 +kerning first=252 second=345 amount=-1 +kerning first=203 second=369 amount=-1 +kerning first=267 second=335 amount=-1 +kerning first=267 second=107 amount=-1 +kerning first=288 second=345 amount=-1 +kerning first=73 second=206 amount=-1 +kerning first=231 second=335 amount=-1 +kerning first=202 second=302 amount=-1 +kerning first=324 second=345 amount=-1 +kerning first=286 second=206 amount=-1 +kerning first=339 second=335 amount=-1 +kerning first=78 second=46 amount=-1 +kerning first=197 second=219 amount=-1 +kerning first=214 second=206 amount=-1 +kerning first=209 second=231 amount=-1 +kerning first=218 second=277 amount=-1 +kerning first=77 second=334 amount=-1 +kerning first=270 second=193 amount=-1 +kerning first=277 second=254 amount=-1 +kerning first=281 second=231 amount=-1 +kerning first=209 second=351 amount=-1 +kerning first=78 second=218 amount=-1 +kerning first=80 second=368 amount=-1 +kerning first=362 second=277 amount=-1 +kerning first=205 second=73 amount=-1 +kerning first=326 second=277 amount=-1 +kerning first=347 second=103 amount=-1 +kerning first=201 second=290 amount=-1 +kerning first=370 second=338 amount=-1 +kerning first=1066 second=1067 amount=-1 +kerning first=74 second=345 amount=-1 +kerning first=262 second=338 amount=-1 +kerning first=70 second=82 amount=-1 +kerning first=75 second=79 amount=-1 +kerning first=298 second=338 amount=-1 +kerning first=211 second=82 amount=-1 +kerning first=200 second=8249 amount=-1 +kerning first=283 second=283 amount=-1 +kerning first=278 second=286 amount=-1 +kerning first=77 second=277 amount=-1 +kerning first=1047 second=1097 amount=-1 +kerning first=85 second=338 amount=-1 +kerning first=68 second=351 amount=-1 +kerning first=344 second=8249 amount=-1 +kerning first=70 second=283 amount=-1 +kerning first=1027 second=1086 amount=-1 +kerning first=76 second=217 amount=-1 +kerning first=380 second=8249 amount=-1 +kerning first=106 second=283 amount=-1 +kerning first=1048 second=1031 amount=-1 +kerning first=187 second=274 amount=-1 +kerning first=262 second=45 amount=-1 +kerning first=67 second=171 amount=-1 +kerning first=1033 second=1068 amount=-1 +kerning first=103 second=171 amount=-1 +kerning first=206 second=286 amount=-1 +kerning first=368 second=113 amount=-1 +kerning first=8222 second=233 amount=-1 +kerning first=226 second=45 amount=-1 +kerning first=296 second=113 amount=-1 +kerning first=74 second=333 amount=-1 +kerning first=280 second=171 amount=-1 +kerning first=70 second=235 amount=-1 +kerning first=65 second=286 amount=-1 +kerning first=106 second=235 amount=-1 +kerning first=352 second=171 amount=-1 +kerning first=99 second=101 amount=-1 +kerning first=210 second=70 amount=-1 +kerning first=282 second=70 amount=-1 +kerning first=352 second=280 amount=-1 +kerning first=283 second=235 amount=-1 +kerning first=69 second=363 amount=-1 +kerning first=269 second=240 amount=-1 +kerning first=355 second=235 amount=-1 +kerning first=69 second=70 amount=-1 +kerning first=1051 second=1069 amount=-1 +kerning first=1068 second=1056 amount=-1 +kerning first=8217 second=351 amount=-1 +kerning first=121 second=252 amount=-1 +kerning first=280 second=344 amount=-1 +kerning first=1070 second=1027 amount=-1 +kerning first=85 second=252 amount=-1 +kerning first=327 second=284 amount=-1 +kerning first=1091 second=1085 amount=-1 +kerning first=1034 second=1027 amount=-1 +kerning first=352 second=344 amount=-1 +kerning first=278 second=205 amount=-1 +kerning first=78 second=284 amount=-1 +kerning first=219 second=284 amount=-1 +kerning first=1044 second=1080 amount=-1 +kerning first=314 second=283 amount=-1 +kerning first=338 second=214 amount=-1 +kerning first=302 second=214 amount=-1 +kerning first=266 second=214 amount=-1 +kerning first=290 second=315 amount=-1 +kerning first=192 second=365 amount=-1 +kerning first=234 second=231 amount=-1 +kerning first=192 second=217 amount=-1 +kerning first=366 second=46 amount=-2 +kerning first=187 second=112 amount=-1 +kerning first=1076 second=1113 amount=-1 +kerning first=67 second=344 amount=-1 +kerning first=212 second=89 amount=-1 +kerning first=374 second=214 amount=-1 +kerning first=220 second=243 amount=-1 +kerning first=197 second=332 amount=-1 +kerning first=110 second=45 amount=-1 +kerning first=375 second=287 amount=-1 +kerning first=339 second=122 amount=-1 +kerning first=217 second=65 amount=-1 +kerning first=77 second=71 amount=-1 +kerning first=73 second=353 amount=-1 +kerning first=117 second=235 amount=-1 +kerning first=364 second=243 amount=-1 +kerning first=214 second=353 amount=-1 +kerning first=194 second=214 amount=-1 +kerning first=287 second=45 amount=-1 +kerning first=328 second=243 amount=-1 +kerning first=249 second=275 amount=-1 +kerning first=89 second=214 amount=-1 +kerning first=1049 second=1076 amount=-1 +kerning first=362 second=226 amount=-1 +kerning first=218 second=71 amount=-1 +kerning first=1053 second=1028 amount=-1 +kerning first=251 second=45 amount=-1 +kerning first=370 second=252 amount=-1 +kerning first=8217 second=210 amount=-1 +kerning first=354 second=97 amount=-1 +kerning first=200 second=223 amount=-1 +kerning first=202 second=362 amount=-1 +kerning first=278 second=80 amount=-1 +kerning first=366 second=235 amount=-1 +kerning first=1039 second=1050 amount=-1 +kerning first=72 second=275 amount=-1 +kerning first=310 second=362 amount=-1 +kerning first=323 second=44 amount=-1 +kerning first=1077 second=1093 amount=-1 +kerning first=206 second=80 amount=-1 +kerning first=235 second=367 amount=-1 +kerning first=344 second=223 amount=-1 +kerning first=346 second=362 amount=-1 +kerning first=350 second=80 amount=-1 +kerning first=72 second=302 amount=-1 +kerning first=304 second=234 amount=-1 +kerning first=69 second=336 amount=-1 +kerning first=101 second=107 amount=-1 +kerning first=8218 second=244 amount=-1 +kerning first=78 second=122 amount=-1 +kerning first=65 second=107 amount=-1 +kerning first=363 second=234 amount=-1 +kerning first=211 second=370 amount=-1 +kerning first=196 second=119 amount=-1 +kerning first=229 second=337 amount=-1 +kerning first=1047 second=1079 amount=-1 +kerning first=198 second=199 amount=-1 +kerning first=8250 second=116 amount=-1 +kerning first=282 second=336 amount=-1 +kerning first=289 second=267 amount=-1 +kerning first=262 second=317 amount=-1 +kerning first=209 second=224 amount=-1 +kerning first=269 second=8250 amount=-1 +kerning first=87 second=249 amount=-1 +kerning first=338 second=116 amount=-1 +kerning first=98 second=314 amount=-1 +kerning first=302 second=116 amount=-1 +kerning first=192 second=249 amount=-1 +kerning first=266 second=116 amount=-1 +kerning first=374 second=241 amount=-1 +kerning first=287 second=105 amount=-1 +kerning first=1039 second=1105 amount=-1 +kerning first=327 second=122 amount=-1 +kerning first=1056 second=1071 amount=-1 +kerning first=275 second=314 amount=-1 +kerning first=45 second=327 amount=-1 +kerning first=85 second=110 amount=-1 +kerning first=81 second=327 amount=-1 +kerning first=232 second=234 amount=-1 +kerning first=1052 second=1054 amount=-1 +kerning first=77 second=382 amount=-1 +kerning first=364 second=335 amount=-1 +kerning first=101 second=345 amount=-1 +kerning first=323 second=72 amount=-1 +kerning first=328 second=335 amount=-1 +kerning first=1065 second=1087 amount=-1 +kerning first=89 second=241 amount=-1 +kerning first=262 second=110 amount=-1 +kerning first=1031 second=1049 amount=-1 +kerning first=347 second=314 amount=-1 +kerning first=171 second=374 amount=-1 +kerning first=1067 second=1049 amount=-1 +kerning first=202 second=216 amount=-1 +kerning first=330 second=327 amount=-1 +kerning first=302 second=241 amount=-1 +kerning first=298 second=110 amount=-1 +kerning first=366 second=327 amount=-1 +kerning first=266 second=241 amount=-1 +kerning first=302 second=245 amount=-1 +kerning first=274 second=216 amount=-1 +kerning first=270 second=205 amount=-1 +kerning first=370 second=110 amount=-1 +kerning first=74 second=254 amount=-1 +kerning first=362 second=250 amount=-1 +kerning first=257 second=114 amount=-1 +kerning first=1041 second=1097 amount=-1 +kerning first=99 second=115 amount=-1 +kerning first=118 second=46 amount=-1 +kerning first=75 second=262 amount=-1 +kerning first=82 second=46 amount=-1 +kerning first=1064 second=1045 amount=-1 +kerning first=204 second=115 amount=-1 +kerning first=111 second=318 amount=-1 +kerning first=223 second=46 amount=-1 +kerning first=213 second=302 amount=-1 +kerning first=70 second=370 amount=-1 +kerning first=220 second=335 amount=-1 +kerning first=97 second=101 amount=-1 +kerning first=221 second=114 amount=-1 +kerning first=1047 second=1046 amount=-1 +kerning first=330 second=267 amount=-1 +kerning first=370 second=225 amount=-1 +kerning first=83 second=187 amount=-1 +kerning first=366 second=267 amount=-1 +kerning first=230 second=347 amount=-1 +kerning first=203 second=81 amount=-1 +kerning first=82 second=355 amount=-1 +kerning first=352 second=44 amount=-1 +kerning first=1033 second=1055 amount=-1 +kerning first=204 second=273 amount=-1 +kerning first=209 second=296 amount=-1 +kerning first=99 second=273 amount=-1 +kerning first=8218 second=217 amount=-1 +kerning first=264 second=284 amount=-1 +kerning first=289 second=103 amount=-1 +kerning first=254 second=44 amount=-1 +kerning first=290 second=44 amount=-1 +kerning first=218 second=44 amount=-2 +kerning first=1038 second=1098 amount=-1 +kerning first=98 second=287 amount=-1 +kerning first=82 second=334 amount=-1 +kerning first=257 second=291 amount=-1 +kerning first=201 second=114 amount=-1 +kerning first=8217 second=117 amount=-1 +kerning first=74 second=72 amount=-1 +kerning first=304 second=317 amount=-1 +kerning first=187 second=355 amount=-1 +kerning first=264 second=282 amount=-1 +kerning first=275 second=287 amount=-1 +kerning first=199 second=346 amount=-1 +kerning first=67 second=83 amount=-1 +kerning first=73 second=288 amount=-1 +kerning first=288 second=8250 amount=-1 +kerning first=98 second=8220 amount=-2 +kerning first=258 second=311 amount=-1 +kerning first=80 second=199 amount=-1 +kerning first=347 second=287 amount=-1 +kerning first=1050 second=1089 amount=-1 +kerning first=369 second=245 amount=-1 +kerning first=311 second=287 amount=-1 +kerning first=74 second=278 amount=-1 +kerning first=224 second=8249 amount=-1 +kerning first=1031 second=1118 amount=-1 +kerning first=234 second=291 amount=-1 +kerning first=325 second=352 amount=-1 +kerning first=8222 second=119 amount=-1 +kerning first=347 second=108 amount=-1 +kerning first=78 second=257 amount=-1 +kerning first=120 second=44 amount=-1 +kerning first=1059 second=1091 amount=-1 +kerning first=316 second=279 amount=-1 +kerning first=352 second=371 amount=-1 +kerning first=323 second=278 amount=-1 +kerning first=69 second=211 amount=-1 +kerning first=311 second=108 amount=-1 +kerning first=222 second=8218 amount=-1 +kerning first=356 second=187 amount=-1 +kerning first=268 second=116 amount=-1 +kerning first=366 second=8218 amount=-2 +kerning first=344 second=355 amount=-1 +kerning first=71 second=187 amount=-1 +kerning first=209 second=269 amount=-1 +kerning first=267 second=252 amount=-1 +kerning first=233 second=99 amount=-1 +kerning first=213 second=75 amount=-1 +kerning first=118 second=382 amount=-1 +kerning first=229 second=316 amount=-1 +kerning first=362 second=71 amount=-1 +kerning first=193 second=316 amount=-1 +kerning first=103 second=279 amount=-1 +kerning first=248 second=187 amount=-1 +kerning first=223 second=382 amount=-1 +kerning first=1055 second=1098 amount=-1 +kerning first=45 second=357 amount=-1 +kerning first=284 second=187 amount=-1 +kerning first=259 second=382 amount=-1 +kerning first=282 second=211 amount=-1 +kerning first=269 second=99 amount=-1 +kerning first=81 second=8218 amount=-1 +kerning first=187 second=313 amount=-1 +kerning first=214 second=65 amount=-1 +kerning first=67 second=279 amount=-1 +kerning first=212 second=187 amount=-1 +kerning first=280 second=371 amount=-1 +kerning first=337 second=316 amount=-1 +kerning first=268 second=380 amount=-1 +kerning first=272 second=196 amount=-1 +kerning first=267 second=248 amount=-1 +kerning first=232 second=380 amount=-1 +kerning first=80 second=8218 amount=-2 +kerning first=80 second=260 amount=-1 +kerning first=231 second=248 amount=-1 +kerning first=364 second=270 amount=-1 +kerning first=304 second=380 amount=-1 +kerning first=86 second=117 amount=-1 +kerning first=187 second=334 amount=-1 +kerning first=73 second=261 amount=-1 +kerning first=77 second=44 amount=-1 +kerning first=221 second=260 amount=-1 +kerning first=280 second=202 amount=-1 +kerning first=81 second=202 amount=-1 +kerning first=45 second=202 amount=-1 +kerning first=198 second=264 amount=-1 +kerning first=108 second=8220 amount=-1 +kerning first=72 second=8220 amount=-1 +kerning first=201 second=209 amount=-1 +kerning first=213 second=8220 amount=-2 +kerning first=350 second=205 amount=-1 +kerning first=258 second=121 amount=-1 +kerning first=193 second=364 amount=-1 +kerning first=79 second=270 amount=-1 +kerning first=108 second=367 amount=-1 +kerning first=330 second=202 amount=-1 +kerning first=249 second=8220 amount=-1 +kerning first=248 second=345 amount=-1 +kerning first=88 second=364 amount=-1 +kerning first=98 second=108 amount=-1 +kerning first=207 second=66 amount=-1 +kerning first=327 second=257 amount=-1 +kerning first=220 second=270 amount=-1 +kerning first=217 second=325 amount=-1 +kerning first=45 second=121 amount=-1 +kerning first=366 second=202 amount=-1 +kerning first=326 second=8217 amount=-2 +kerning first=197 second=121 amount=-1 +kerning first=192 second=108 amount=-1 +kerning first=315 second=364 amount=-1 +kerning first=272 second=82 amount=-1 +kerning first=364 second=351 amount=-1 +kerning first=1043 second=1073 amount=-1 +kerning first=1051 second=1047 amount=-1 +kerning first=89 second=193 amount=-1 +kerning first=279 second=277 amount=-1 +kerning first=207 second=364 amount=-1 +kerning first=65 second=104 amount=-1 +kerning first=323 second=338 amount=-1 +kerning first=207 second=277 amount=-1 +kerning first=254 second=8217 amount=-2 +kerning first=287 second=251 amount=-1 +kerning first=8222 second=212 amount=-1 +kerning first=66 second=364 amount=-1 +kerning first=1038 second=1060 amount=-1 +kerning first=370 second=273 amount=-1 +kerning first=201 second=355 amount=-1 +kerning first=76 second=86 amount=-1 +kerning first=374 second=193 amount=-1 +kerning first=79 second=351 amount=-1 +kerning first=298 second=273 amount=-1 +kerning first=199 second=8221 amount=-1 +kerning first=262 second=273 amount=-1 +kerning first=74 second=338 amount=-1 +kerning first=72 second=69 amount=-1 +kerning first=271 second=8221 amount=-1 +kerning first=1055 second=1064 amount=-1 +kerning first=282 second=334 amount=-1 +kerning first=307 second=8221 amount=-1 +kerning first=327 second=78 amount=-1 +kerning first=220 second=351 amount=-1 +kerning first=1048 second=1045 amount=-1 +kerning first=85 second=273 amount=-1 +kerning first=379 second=8221 amount=-1 +kerning first=200 second=82 amount=-1 +kerning first=117 second=99 amount=-1 +kerning first=219 second=78 amount=-1 +kerning first=75 second=117 amount=-1 +kerning first=219 second=171 amount=-2 +kerning first=251 second=8249 amount=-1 +kerning first=255 second=171 amount=-1 +kerning first=67 second=229 amount=-1 +kerning first=255 second=98 amount=-1 +kerning first=311 second=314 amount=-1 +kerning first=263 second=242 amount=-1 +kerning first=269 second=108 amount=-1 +kerning first=214 second=8220 amount=-2 +kerning first=70 second=104 amount=-1 +kerning first=1071 second=1064 amount=-1 +kerning first=363 second=171 amount=-1 +kerning first=226 second=333 amount=-1 +kerning first=286 second=282 amount=-1 +kerning first=85 second=333 amount=-1 +kerning first=78 second=78 amount=-1 +kerning first=214 second=282 amount=-1 +kerning first=302 second=100 amount=-1 +kerning first=221 second=233 amount=-1 +kerning first=266 second=100 amount=-1 +kerning first=80 second=233 amount=-1 +kerning first=77 second=8217 amount=-1 +kerning first=374 second=100 amount=-1 +kerning first=70 second=357 amount=-1 +kerning first=73 second=282 amount=-1 +kerning first=1071 second=1039 amount=-1 +kerning first=283 second=104 amount=-1 +kerning first=365 second=233 amount=-1 +kerning first=78 second=171 amount=-1 +kerning first=264 second=325 amount=-1 +kerning first=257 second=233 amount=-1 +kerning first=315 second=87 amount=-1 +kerning first=282 second=298 amount=-1 +kerning first=217 second=330 amount=-1 +kerning first=194 second=220 amount=-1 +kerning first=264 second=103 amount=-1 +kerning first=302 second=220 amount=-1 +kerning first=68 second=356 amount=-1 +kerning first=266 second=220 amount=-1 +kerning first=298 second=246 amount=-1 +kerning first=311 second=103 amount=-1 +kerning first=262 second=246 amount=-1 +kerning first=89 second=100 amount=-1 +kerning first=79 second=362 amount=-1 +kerning first=89 second=263 amount=-1 +kerning first=226 second=246 amount=-1 +kerning first=230 second=100 amount=-1 +kerning first=218 second=109 amount=-1 +kerning first=1051 second=1074 amount=-1 +kerning first=99 second=289 amount=-1 +kerning first=85 second=246 amount=-1 +kerning first=98 second=103 amount=-1 +kerning first=233 second=365 amount=-1 +kerning first=244 second=8218 amount=-1 +kerning first=269 second=224 amount=-1 +kerning first=269 second=365 amount=-1 +kerning first=298 second=333 amount=-1 +kerning first=362 second=109 amount=-1 +kerning first=187 second=193 amount=-1 +kerning first=334 second=203 amount=-1 +kerning first=1070 second=1113 amount=-1 +kerning first=197 second=365 amount=-1 +kerning first=240 second=289 amount=-1 +kerning first=338 second=220 amount=-1 +kerning first=1069 second=1024 amount=-1 +kerning first=1056 second=1046 amount=-1 +kerning first=352 second=8218 amount=-1 +kerning first=224 second=281 amount=-1 +kerning first=368 second=211 amount=-1 +kerning first=275 second=347 amount=-1 +kerning first=122 second=8220 amount=-1 +kerning first=68 second=85 amount=-1 +kerning first=203 second=371 amount=-1 +kerning first=86 second=8220 amount=-1 +kerning first=296 second=281 amount=-1 +kerning first=268 second=315 amount=-1 +kerning first=242 second=120 amount=-1 +kerning first=196 second=255 amount=-1 +kerning first=304 second=315 amount=-1 +kerning first=368 second=281 amount=-1 +kerning first=302 second=357 amount=-1 +kerning first=8218 second=216 amount=-1 +kerning first=77 second=109 amount=-1 +kerning first=103 second=8218 amount=-1 +kerning first=263 second=8220 amount=-2 +kerning first=296 second=211 amount=-1 +kerning first=67 second=8218 amount=-1 +kerning first=1040 second=1095 amount=-1 +kerning first=368 second=338 amount=-1 +kerning first=335 second=8220 amount=-2 +kerning first=67 second=116 amount=-1 +kerning first=367 second=339 amount=-1 +kerning first=272 second=202 amount=-1 +kerning first=211 second=77 amount=-1 +kerning first=333 second=120 amount=-1 +kerning first=364 second=264 amount=-1 +kerning first=325 second=100 amount=-1 +kerning first=1039 second=1083 amount=-1 +kerning first=259 second=339 amount=-1 +kerning first=233 second=111 amount=-1 +kerning first=1042 second=1088 amount=-1 +kerning first=69 second=298 amount=-1 +kerning first=317 second=356 amount=-1 +kerning first=210 second=298 amount=-1 +kerning first=220 second=264 amount=-1 +kerning first=280 second=219 amount=-1 +kerning first=108 second=232 amount=-1 +kerning first=369 second=8249 amount=-1 +kerning first=210 second=368 amount=-1 +kerning first=1071 second=1060 amount=-1 +kerning first=1050 second=1105 amount=-1 +kerning first=112 second=8250 amount=-1 +kerning first=203 second=76 amount=-1 +kerning first=67 second=219 amount=-1 +kerning first=334 second=89 amount=-1 +kerning first=101 second=335 amount=-1 +kerning first=217 second=357 amount=-1 +kerning first=325 second=357 amount=-1 +kerning first=249 second=232 amount=-1 +kerning first=206 second=335 amount=-1 +kerning first=69 second=368 amount=-1 +kerning first=289 second=357 amount=-1 +kerning first=327 second=241 amount=-1 +kerning first=354 second=271 amount=-1 +kerning first=1064 second=1067 amount=-1 +kerning first=1042 second=1044 amount=-1 +kerning first=291 second=241 amount=-1 +kerning first=1052 second=1086 amount=-1 +kerning first=8217 second=242 amount=-1 +kerning first=317 second=85 amount=-1 +kerning first=84 second=8249 amount=-1 +kerning first=207 second=234 amount=-1 +kerning first=45 second=262 amount=-1 +kerning first=120 second=8249 amount=-1 +kerning first=282 second=368 amount=-1 +kerning first=338 second=344 amount=-1 +kerning first=365 second=8249 amount=-1 +kerning first=302 second=344 amount=-1 +kerning first=209 second=85 amount=-1 +kerning first=225 second=8249 amount=-1 +kerning first=261 second=8249 amount=-1 +kerning first=1059 second=1075 amount=-1 +kerning first=313 second=366 amount=-1 +kerning first=78 second=378 amount=-1 +kerning first=212 second=46 amount=-1 +kerning first=323 second=67 amount=-1 +kerning first=263 second=275 amount=-1 +kerning first=227 second=275 amount=-1 +kerning first=280 second=298 amount=-1 +kerning first=219 second=241 amount=-1 +kerning first=219 second=345 amount=-1 +kerning first=205 second=366 amount=-1 +kerning first=86 second=275 amount=-1 +kerning first=1027 second=1081 amount=-1 +kerning first=78 second=241 amount=-1 +kerning first=187 second=213 amount=-1 +kerning first=74 second=67 amount=-1 +kerning first=362 second=229 amount=-1 +kerning first=210 second=195 amount=-1 +kerning first=288 second=280 amount=-1 +kerning first=345 second=225 amount=-1 +kerning first=72 second=73 amount=-1 +kerning first=1047 second=1084 amount=-1 +kerning first=316 second=267 amount=-1 +kerning first=71 second=46 amount=-1 +kerning first=220 second=80 amount=-1 +kerning first=221 second=363 amount=-1 +kerning first=1046 second=1077 amount=-1 +kerning first=272 second=353 amount=-1 +kerning first=72 second=216 amount=-1 +kerning first=279 second=250 amount=-1 +kerning first=107 second=46 amount=-1 +kerning first=79 second=80 amount=-1 +kerning first=287 second=311 amount=-1 +kerning first=284 second=317 amount=-1 +kerning first=70 second=375 amount=-1 +kerning first=280 second=116 amount=-1 +kerning first=204 second=213 amount=-1 +kerning first=199 second=70 amount=-1 +kerning first=262 second=111 amount=-1 +kerning first=1042 second=1071 amount=-1 +kerning first=286 second=201 amount=-1 +kerning first=87 second=244 amount=-1 +kerning first=1089 second=1093 amount=-1 +kerning first=314 second=171 amount=-1 +kerning first=72 second=259 amount=-1 +kerning first=214 second=201 amount=-1 +kerning first=1055 second=1062 amount=-1 +kerning first=271 second=113 amount=-1 +kerning first=228 second=244 amount=-1 +kerning first=307 second=113 amount=-1 +kerning first=333 second=8222 amount=-1 +kerning first=220 second=378 amount=-1 +kerning first=264 second=244 amount=-1 +kerning first=199 second=113 amount=-1 +kerning first=66 second=207 amount=-1 +kerning first=235 second=113 amount=-1 +kerning first=8218 second=249 amount=-1 +kerning first=73 second=201 amount=-1 +kerning first=8250 second=362 amount=-1 +kerning first=270 second=204 amount=-1 +kerning first=364 second=378 amount=-1 +kerning first=120 second=8222 amount=-1 +kerning first=1034 second=1063 amount=-2 +kerning first=304 second=345 amount=-1 +kerning first=198 second=204 amount=-1 +kerning first=84 second=8222 amount=-1 +kerning first=207 second=207 amount=-1 +kerning first=362 second=256 amount=-1 +kerning first=201 second=268 amount=-1 +kerning first=310 second=210 amount=-1 +kerning first=258 second=262 amount=-1 +kerning first=366 second=262 amount=-1 +kerning first=1064 second=1050 amount=-1 +kerning first=330 second=262 amount=-1 +kerning first=274 second=210 amount=-1 +kerning first=218 second=256 amount=-1 +kerning first=1036 second=1079 amount=-1 +kerning first=83 second=203 amount=-1 +kerning first=202 second=210 amount=-1 +kerning first=1062 second=1096 amount=-1 +kerning first=45 second=332 amount=-1 +kerning first=314 second=335 amount=-1 +kerning first=330 second=332 amount=-1 +kerning first=8222 second=255 amount=-1 +kerning first=205 second=122 amount=-1 +kerning first=330 second=325 amount=-1 +kerning first=219 second=198 amount=-1 +kerning first=8250 second=118 amount=-1 +kerning first=258 second=332 amount=-1 +kerning first=100 second=122 amount=-1 +kerning first=302 second=73 amount=-1 +kerning first=266 second=73 amount=-1 +kerning first=1048 second=1053 amount=-1 +kerning first=352 second=219 amount=-1 +kerning first=338 second=73 amount=-1 +kerning first=366 second=332 amount=-1 +kerning first=83 second=75 amount=-1 +kerning first=193 second=213 amount=-1 +kerning first=89 second=196 amount=-1 +kerning first=206 second=200 amount=-1 +kerning first=327 second=279 amount=-1 +kerning first=221 second=336 amount=-1 +kerning first=88 second=213 amount=-1 +kerning first=201 second=187 amount=-1 +kerning first=363 second=279 amount=-1 +kerning first=72 second=362 amount=-1 +kerning first=213 second=362 amount=-1 +kerning first=258 second=8250 amount=-1 +kerning first=288 second=323 amount=-1 +kerning first=222 second=8250 amount=-1 +kerning first=325 second=344 amount=-1 +kerning first=1039 second=1045 amount=-1 +kerning first=275 second=244 amount=-1 +kerning first=219 second=371 amount=-1 +kerning first=368 second=75 amount=-1 +kerning first=73 second=266 amount=-1 +kerning first=81 second=8250 amount=-1 +kerning first=1031 second=1071 amount=-1 +kerning first=296 second=75 amount=-1 +kerning first=207 second=71 amount=-1 +kerning first=209 second=288 amount=-1 +kerning first=192 second=314 amount=-1 +kerning first=291 second=279 amount=-1 +kerning first=350 second=200 amount=-1 +kerning first=1036 second=1119 amount=-1 +kerning first=278 second=200 amount=-1 +kerning first=205 second=79 amount=-1 +kerning first=218 second=66 amount=-1 +kerning first=1069 second=1036 amount=-1 +kerning first=264 second=314 amount=-1 +kerning first=220 second=248 amount=-1 +kerning first=1033 second=1036 amount=-1 +kerning first=84 second=261 amount=-1 +kerning first=228 second=314 amount=-1 +kerning first=74 second=110 amount=-1 +kerning first=77 second=66 amount=-1 +kerning first=8222 second=228 amount=-1 +kerning first=310 second=367 amount=-1 +kerning first=274 second=367 amount=-1 +kerning first=344 second=218 amount=-1 +kerning first=1055 second=1030 amount=-1 +kerning first=287 second=110 amount=-1 +kerning first=104 second=242 amount=-1 +kerning first=346 second=367 amount=-1 +kerning first=66 second=380 amount=-1 +kerning first=323 second=110 amount=-1 +kerning first=284 second=274 amount=-1 +kerning first=212 second=76 amount=-1 +kerning first=202 second=367 amount=-1 +kerning first=243 second=380 amount=-1 +kerning first=362 second=66 amount=-1 +kerning first=67 second=257 amount=-1 +kerning first=207 second=380 amount=-1 +kerning first=212 second=274 amount=-1 +kerning first=335 second=318 amount=-1 +kerning first=86 second=101 amount=-1 +kerning first=290 second=66 amount=-1 +kerning first=1056 second=1049 amount=-1 +kerning first=279 second=380 amount=-1 +kerning first=201 second=252 amount=-1 +kerning first=327 second=344 amount=-1 +kerning first=1055 second=1042 amount=-1 +kerning first=8218 second=81 amount=-1 +kerning first=263 second=101 amount=-1 +kerning first=250 second=8249 amount=-1 +kerning first=196 second=114 amount=-1 +kerning first=227 second=101 amount=-1 +kerning first=286 second=8249 amount=-1 +kerning first=1049 second=1098 amount=-1 +kerning first=67 second=284 amount=-1 +kerning first=85 second=315 amount=-1 +kerning first=316 second=283 amount=-1 +kerning first=259 second=231 amount=-1 +kerning first=1036 second=1091 amount=-1 +kerning first=118 second=106 amount=-1 +kerning first=112 second=291 amount=-1 +kerning first=78 second=214 amount=-1 +kerning first=203 second=217 amount=-1 +kerning first=1078 second=1077 amount=-1 +kerning first=223 second=106 amount=-1 +kerning first=198 second=296 amount=-1 +kerning first=327 second=214 amount=-1 +kerning first=219 second=344 amount=-1 +kerning first=200 second=310 amount=-1 +kerning first=219 second=214 amount=-1 +kerning first=109 second=8249 amount=-1 +kerning first=366 second=330 amount=-1 +kerning first=339 second=243 amount=-1 +kerning first=289 second=249 amount=-1 +kerning first=233 second=235 amount=-1 +kerning first=363 second=8221 amount=-1 +kerning first=269 second=235 amount=-1 +kerning first=86 second=345 amount=-1 +kerning first=305 second=235 amount=-1 +kerning first=97 second=275 amount=-1 +kerning first=227 second=345 amount=-1 +kerning first=228 second=287 amount=-1 +kerning first=217 second=249 amount=-1 +kerning first=263 second=345 amount=-1 +kerning first=335 second=345 amount=-1 +kerning first=321 second=362 amount=-1 +kerning first=8217 second=103 amount=-1 +kerning first=1033 second=1063 amount=-2 +kerning first=1091 second=1080 amount=-1 +kerning first=1055 second=1080 amount=-1 +kerning first=280 second=284 amount=-1 +kerning first=80 second=66 amount=-1 +kerning first=82 second=219 amount=-1 +kerning first=209 second=226 amount=-1 +kerning first=267 second=243 amount=-1 +kerning first=1069 second=1063 amount=-1 +kerning first=80 second=336 amount=-1 +kerning first=84 second=353 amount=-1 +kerning first=199 second=97 amount=-1 +kerning first=8220 second=198 amount=-2 +kerning first=214 second=304 amount=-1 +kerning first=1058 second=1079 amount=-1 +kerning first=218 second=337 amount=-1 +kerning first=204 second=278 amount=-1 +kerning first=330 second=370 amount=-1 +kerning first=104 second=291 amount=-1 +kerning first=209 second=199 amount=-1 +kerning first=366 second=370 amount=-1 +kerning first=75 second=361 amount=-1 +kerning first=86 second=74 amount=-1 +kerning first=77 second=337 amount=-1 +kerning first=263 second=107 amount=-1 +kerning first=73 second=304 amount=-1 +kerning first=78 second=100 amount=-1 +kerning first=1034 second=1043 amount=-1 +kerning first=364 second=313 amount=-1 +kerning first=211 second=344 amount=-1 +kerning first=275 second=365 amount=-1 +kerning first=257 second=187 amount=-1 +kerning first=234 second=269 amount=-1 +kerning first=79 second=221 amount=-1 +kerning first=305 second=8218 amount=-1 +kerning first=362 second=337 amount=-1 +kerning first=1066 second=1037 amount=-1 +kerning first=280 second=278 amount=-1 +kerning first=269 second=8218 amount=-1 +kerning first=287 second=283 amount=-1 +kerning first=326 second=337 amount=-1 +kerning first=1043 second=1116 amount=-1 +kerning first=233 second=8218 amount=-1 +kerning first=195 second=286 amount=-1 +kerning first=207 second=109 amount=-1 +kerning first=274 second=8220 amount=-1 +kerning first=204 second=72 amount=-1 +kerning first=79 second=313 amount=-1 +kerning first=346 second=8220 amount=-1 +kerning first=262 second=203 amount=-1 +kerning first=70 second=267 amount=-1 +kerning first=364 second=218 amount=-1 +kerning first=310 second=8220 amount=-1 +kerning first=298 second=203 amount=-1 +kerning first=356 second=111 amount=-1 +kerning first=382 second=8220 amount=-1 +kerning first=1060 second=1055 amount=-1 +kerning first=85 second=203 amount=-1 +kerning first=328 second=8220 amount=-2 +kerning first=283 second=267 amount=-1 +kerning first=81 second=370 amount=-1 +kerning first=207 second=315 amount=-1 +kerning first=230 second=263 amount=-1 +kerning first=1055 second=1107 amount=-1 +kerning first=266 second=263 amount=-1 +kerning first=8217 second=101 amount=-1 +kerning first=302 second=263 amount=-1 +kerning first=45 second=370 amount=-1 +kerning first=1104 second=1094 amount=-1 +kerning first=106 second=267 amount=-1 +kerning first=346 second=371 amount=-1 +kerning first=196 second=212 amount=-1 +kerning first=97 second=8220 amount=-2 +kerning first=268 second=114 amount=-1 +kerning first=374 second=263 amount=-1 +kerning first=232 second=114 amount=-1 +kerning first=1052 second=1097 amount=-1 +kerning first=268 second=212 amount=-1 +kerning first=202 second=8220 amount=-1 +kerning first=8218 second=108 amount=-1 +kerning first=304 second=212 amount=-1 +kerning first=1044 second=1085 amount=-1 +kerning first=254 second=46 amount=-1 +kerning first=202 second=69 amount=-1 +kerning first=362 second=364 amount=-1 +kerning first=274 second=69 amount=-1 +kerning first=192 second=81 amount=-1 +kerning first=290 second=364 amount=-1 +kerning first=87 second=81 amount=-1 +kerning first=99 second=251 amount=-1 +kerning first=206 second=227 amount=-1 +kerning first=240 second=44 amount=-1 +kerning first=218 second=364 amount=-1 +kerning first=102 second=44 amount=-1 +kerning first=1030 second=1064 amount=-1 +kerning first=291 second=103 amount=-1 +kerning first=1028 second=1061 amount=-1 +kerning first=352 second=78 amount=-1 +kerning first=200 second=218 amount=-1 +kerning first=66 second=44 amount=-1 +kerning first=1066 second=1064 amount=-1 +kerning first=366 second=302 amount=-1 +kerning first=74 second=273 amount=-1 +kerning first=279 second=44 amount=-1 +kerning first=198 second=334 amount=-1 +kerning first=374 second=351 amount=-1 +kerning first=364 second=248 amount=-1 +kerning first=243 second=44 amount=-1 +kerning first=8217 second=345 amount=-1 +kerning first=280 second=78 amount=-1 +kerning first=197 second=370 amount=-1 +kerning first=67 second=78 amount=-1 +kerning first=330 second=99 amount=-1 +kerning first=252 second=242 amount=-1 +kerning first=370 second=230 amount=-1 +kerning first=366 second=99 amount=-1 +kerning first=82 second=199 amount=-1 +kerning first=262 second=230 amount=-1 +kerning first=203 second=282 amount=-1 +kerning first=1071 second=1092 amount=-1 +kerning first=264 second=352 amount=-1 +kerning first=86 second=367 amount=-1 +kerning first=324 second=242 amount=-1 +kerning first=298 second=230 amount=-1 +kerning first=85 second=230 amount=-1 +kerning first=196 second=87 amount=-1 +kerning first=212 second=84 amount=-1 +kerning first=368 second=346 amount=-1 +kerning first=353 second=291 amount=-1 +kerning first=296 second=346 amount=-1 +kerning first=1034 second=1031 amount=-1 +kerning first=325 second=44 amount=-1 +kerning first=281 second=291 amount=-1 +kerning first=105 second=233 amount=-1 +kerning first=245 second=291 amount=-1 +kerning first=171 second=217 amount=-1 +kerning first=364 second=346 amount=-1 +kerning first=8217 second=214 amount=-1 +kerning first=1049 second=1117 amount=-1 +kerning first=67 second=81 amount=-1 +kerning first=1058 second=1107 amount=-1 +kerning first=73 second=230 amount=-1 +kerning first=220 second=346 amount=-1 +kerning first=204 second=224 amount=-1 +kerning first=277 second=337 amount=-1 +kerning first=117 second=291 amount=-1 +kerning first=241 second=337 amount=-1 +kerning first=99 second=224 amount=-1 +kerning first=228 second=245 amount=-1 +kerning first=205 second=337 amount=-1 +kerning first=199 second=288 amount=-1 +kerning first=195 second=84 amount=-1 +kerning first=1043 second=1098 amount=-1 +kerning first=362 second=334 amount=-1 +kerning first=86 second=227 amount=-1 +kerning first=280 second=81 amount=-1 +kerning first=218 second=187 amount=-2 +kerning first=220 second=99 amount=-1 +kerning first=254 second=187 amount=-1 +kerning first=1078 second=1119 amount=-1 +kerning first=332 second=8221 amount=-2 +kerning first=103 second=328 amount=-1 +kerning first=275 second=245 amount=-1 +kerning first=1056 second=1095 amount=-1 +kerning first=362 second=187 amount=-2 +kerning first=8217 second=281 amount=-1 +kerning first=1057 second=1061 amount=-1 +kerning first=187 second=270 amount=-1 +kerning first=255 second=8218 amount=-1 +kerning first=290 second=187 amount=-1 +kerning first=266 second=352 amount=-1 +kerning first=302 second=352 amount=-1 +kerning first=328 second=99 amount=-1 +kerning first=366 second=241 amount=-1 +kerning first=220 second=279 amount=-1 +kerning first=194 second=105 amount=-1 +kerning first=187 second=198 amount=-1 +kerning first=328 second=279 amount=-1 +kerning first=117 second=101 amount=-1 +kerning first=77 second=187 amount=-1 +kerning first=1071 second=1104 amount=-1 +kerning first=364 second=279 amount=-1 +kerning first=270 second=75 amount=-1 +kerning first=212 second=278 amount=-1 +kerning first=327 second=66 amount=-1 +kerning first=323 second=209 amount=-1 +kerning first=101 second=316 amount=-1 +kerning first=196 second=364 amount=-1 +kerning first=67 second=261 amount=-1 +kerning first=65 second=316 amount=-1 +kerning first=1077 second=1096 amount=-1 +kerning first=195 second=264 amount=-1 +kerning first=219 second=66 amount=-1 +kerning first=76 second=368 amount=-1 +kerning first=353 second=187 amount=-1 +kerning first=235 second=108 amount=-1 +kerning first=350 second=69 amount=-1 +kerning first=207 second=202 amount=-1 +kerning first=242 second=316 amount=-1 +kerning first=1059 second=1073 amount=-1 +kerning first=330 second=275 amount=-1 +kerning first=291 second=367 amount=-1 +kerning first=78 second=66 amount=-1 +kerning first=74 second=209 amount=-1 +kerning first=1059 second=1086 amount=-1 +kerning first=264 second=206 amount=-1 +kerning first=199 second=108 amount=-1 +kerning first=314 second=316 amount=-1 +kerning first=206 second=69 amount=-1 +kerning first=266 second=205 amount=-1 +kerning first=325 second=368 amount=-1 +kerning first=278 second=69 amount=-1 +kerning first=345 second=8218 amount=-1 +kerning first=354 second=273 amount=-1 +kerning first=304 second=364 amount=-1 +kerning first=213 second=197 amount=-1 +kerning first=302 second=205 amount=-1 +kerning first=217 second=368 amount=-1 +kerning first=268 second=364 amount=-1 +kerning first=87 second=193 amount=-1 +kerning first=338 second=205 amount=-1 +kerning first=283 second=252 amount=-1 +kerning first=222 second=44 amount=-1 +kerning first=325 second=355 amount=-1 +kerning first=119 second=316 amount=-1 +kerning first=71 second=218 amount=-1 +kerning first=289 second=355 amount=-1 +kerning first=374 second=249 amount=-1 +kerning first=231 second=8249 amount=-1 +kerning first=370 second=248 amount=-1 +kerning first=366 second=44 amount=-2 +kerning first=267 second=8249 amount=-1 +kerning first=203 second=325 amount=-1 +kerning first=375 second=8249 amount=-1 +kerning first=86 second=214 amount=-1 +kerning first=219 second=120 amount=-1 +kerning first=232 second=117 amount=-1 +kerning first=277 second=279 amount=-1 +kerning first=298 second=248 amount=-1 +kerning first=196 second=117 amount=-1 +kerning first=1044 second=1077 amount=-1 +kerning first=277 second=314 amount=-1 +kerning first=262 second=248 amount=-1 +kerning first=1091 second=1116 amount=-1 +kerning first=235 second=122 amount=-1 +kerning first=207 second=282 amount=-1 +kerning first=80 second=78 amount=-1 +kerning first=304 second=113 amount=-1 +kerning first=284 second=218 amount=-1 +kerning first=81 second=44 amount=-1 +kerning first=8217 second=361 amount=-1 +kerning first=66 second=282 amount=-1 +kerning first=212 second=218 amount=-1 +kerning first=85 second=248 amount=-1 +kerning first=78 second=220 amount=-1 +kerning first=187 second=77 amount=-1 +kerning first=362 second=100 amount=-1 +kerning first=220 second=333 amount=-1 +kerning first=327 second=362 amount=-1 +kerning first=67 second=382 amount=-1 +kerning first=103 second=382 amount=-1 +kerning first=356 second=339 amount=-1 +kerning first=328 second=333 amount=-1 +kerning first=363 second=246 amount=-1 +kerning first=205 second=350 amount=-1 +kerning first=110 second=289 amount=-1 +kerning first=364 second=333 amount=-1 +kerning first=327 second=246 amount=-1 +kerning first=1039 second=1048 amount=-1 +kerning first=244 second=382 amount=-1 +kerning first=251 second=289 amount=-1 +kerning first=277 second=103 amount=-1 +kerning first=241 second=103 amount=-1 +kerning first=1042 second=1065 amount=-1 +kerning first=205 second=103 amount=-1 +kerning first=219 second=246 amount=-1 +kerning first=287 second=289 amount=-1 +kerning first=231 second=171 amount=-1 +kerning first=100 second=103 amount=-1 +kerning first=267 second=171 amount=-1 +kerning first=334 second=194 amount=-1 +kerning first=78 second=246 amount=-1 +kerning first=219 second=220 amount=-1 +kerning first=218 second=100 amount=-1 +kerning first=1047 second=1068 amount=-1 +kerning first=370 second=194 amount=-1 +kerning first=327 second=220 amount=-1 +kerning first=375 second=171 amount=-1 +kerning first=101 second=99 amount=-1 +kerning first=323 second=109 amount=-1 +kerning first=263 second=307 amount=-1 +kerning first=204 second=211 amount=-1 +kerning first=248 second=120 amount=-1 +kerning first=204 second=304 amount=-1 +kerning first=193 second=85 amount=-1 +kerning first=203 second=338 amount=-1 +kerning first=85 second=97 amount=-1 +kerning first=257 second=245 amount=-1 +kerning first=291 second=120 amount=-1 +kerning first=89 second=115 amount=-1 +kerning first=203 second=200 amount=-1 +kerning first=66 second=202 amount=-1 +kerning first=193 second=332 amount=-1 +kerning first=327 second=313 amount=-1 +kerning first=1069 second=1025 amount=-1 +kerning first=1033 second=1025 amount=-1 +kerning first=88 second=332 amount=-1 +kerning first=207 second=218 amount=-1 +kerning first=8217 second=335 amount=-1 +kerning first=266 second=298 amount=-1 +kerning first=1068 second=1059 amount=-2 +kerning first=1078 second=1117 amount=-1 +kerning first=272 second=347 amount=-1 +kerning first=338 second=298 amount=-1 +kerning first=264 second=8250 amount=-1 +kerning first=74 second=109 amount=-1 +kerning first=219 second=313 amount=-1 +kerning first=117 second=45 amount=-1 +kerning first=302 second=298 amount=-1 +kerning first=1038 second=1108 amount=-1 +kerning first=187 second=324 amount=-1 +kerning first=296 second=357 amount=-1 +kerning first=70 second=338 amount=-1 +kerning first=1118 second=1076 amount=-1 +kerning first=229 second=8250 amount=-1 +kerning first=368 second=357 amount=-1 +kerning first=1054 second=1083 amount=-1 +kerning first=282 second=219 amount=-1 +kerning first=330 second=111 amount=-1 +kerning first=193 second=8250 amount=-1 +kerning first=1046 second=1076 amount=-1 +kerning first=275 second=271 amount=-1 +kerning first=78 second=313 amount=-1 +kerning first=310 second=212 amount=-1 +kerning first=214 second=323 amount=-1 +kerning first=210 second=219 amount=-1 +kerning first=214 second=76 amount=-1 +kerning first=88 second=8250 amount=-1 +kerning first=1056 second=1041 amount=-1 +kerning first=1062 second=1118 amount=-1 +kerning first=302 second=268 amount=-1 +kerning first=73 second=323 amount=-1 +kerning first=202 second=212 amount=-1 +kerning first=280 second=315 amount=-1 +kerning first=275 second=8217 amount=-2 +kerning first=69 second=219 amount=-1 +kerning first=73 second=76 amount=-1 +kerning first=286 second=323 amount=-1 +kerning first=65 second=262 amount=-1 +kerning first=347 second=8217 amount=-2 +kerning first=206 second=262 amount=-1 +kerning first=101 second=113 amount=-1 +kerning first=1030 second=1075 amount=-1 +kerning first=98 second=8217 amount=-2 +kerning first=192 second=119 amount=-1 +kerning first=117 second=111 amount=-1 +kerning first=278 second=262 amount=-1 +kerning first=356 second=46 amount=-1 +kerning first=352 second=315 amount=-1 +kerning first=203 second=8217 amount=-1 +kerning first=262 second=68 amount=-1 +kerning first=74 second=263 amount=-1 +kerning first=77 second=280 amount=-1 +kerning first=304 second=204 amount=-1 +kerning first=110 second=263 amount=-1 +kerning first=112 second=314 amount=-1 +kerning first=268 second=204 amount=-1 +kerning first=80 second=366 amount=-1 +kerning first=298 second=68 amount=-1 +kerning first=205 second=368 amount=-1 +kerning first=85 second=68 amount=-1 +kerning first=251 second=263 amount=-1 +kerning first=287 second=263 amount=-1 +kerning first=218 second=280 amount=-1 +kerning first=289 second=314 amount=-1 +kerning first=323 second=263 amount=-1 +kerning first=323 second=330 amount=-1 +kerning first=253 second=314 amount=-1 +kerning first=72 second=110 amount=-1 +kerning first=85 second=194 amount=-1 +kerning first=290 second=280 amount=-1 +kerning first=325 second=67 amount=-1 +kerning first=1065 second=1105 amount=-1 +kerning first=8218 second=232 amount=-1 +kerning first=1065 second=1028 amount=-1 +kerning first=350 second=344 amount=-1 +kerning first=1027 second=1084 amount=-1 +kerning first=1066 second=1101 amount=-1 +kerning first=362 second=280 amount=-1 +kerning first=1069 second=1046 amount=-1 +kerning first=1053 second=1024 amount=-1 +kerning first=370 second=68 amount=-1 +kerning first=1033 second=1101 amount=-1 +kerning first=251 second=103 amount=-1 +kerning first=187 second=378 amount=-1 +kerning first=118 second=378 amount=-1 +kerning first=219 second=192 amount=-1 +kerning first=72 second=357 amount=-1 +kerning first=323 second=70 amount=-1 +kerning first=77 second=46 amount=-1 +kerning first=218 second=46 amount=-2 +kerning first=74 second=70 amount=-1 +kerning first=259 second=378 amount=-1 +kerning first=290 second=46 amount=-1 +kerning first=223 second=378 amount=-1 +kerning first=368 second=195 amount=-1 +kerning first=327 second=274 amount=-1 +kerning first=327 second=46 amount=-1 +kerning first=78 second=207 amount=-1 +kerning first=81 second=65 amount=-1 +kerning first=1055 second=1075 amount=-1 +kerning first=87 second=8217 amount=-1 +kerning first=217 second=262 amount=-1 +kerning first=324 second=101 amount=-1 +kerning first=270 second=201 amount=-1 +kerning first=192 second=8217 amount=-2 +kerning first=1062 second=1101 amount=-1 +kerning first=228 second=8217 amount=-2 +kerning first=198 second=201 amount=-1 +kerning first=1050 second=1072 amount=-1 +kerning first=8218 second=121 amount=-1 +kerning first=198 second=216 amount=-1 +kerning first=1050 second=1087 amount=-1 +kerning first=99 second=250 amount=-1 +kerning first=70 second=345 amount=-1 +kerning first=316 second=369 amount=-1 +kerning first=264 second=267 amount=-1 +kerning first=280 second=369 amount=-1 +kerning first=114 second=259 amount=-1 +kerning first=69 second=366 amount=-1 +kerning first=117 second=246 amount=-1 +kerning first=81 second=198 amount=-1 +kerning first=66 second=256 amount=-1 +kerning first=78 second=259 amount=-1 +kerning first=1048 second=1089 amount=-1 +kerning first=80 second=204 amount=-1 +kerning first=234 second=116 amount=-1 +kerning first=45 second=198 amount=-1 +kerning first=118 second=311 amount=-1 +kerning first=121 second=287 amount=-1 +kerning first=1062 second=1105 amount=-1 +kerning first=283 second=345 amount=-1 +kerning first=327 second=259 amount=-1 +kerning first=287 second=122 amount=-1 +kerning first=70 second=212 amount=-1 +kerning first=1038 second=1054 amount=-1 +kerning first=219 second=259 amount=-1 +kerning first=323 second=122 amount=-1 +kerning first=231 second=235 amount=-1 +kerning first=1065 second=1096 amount=-1 +kerning first=219 second=207 amount=-1 +kerning first=221 second=244 amount=-1 +kerning first=226 second=287 amount=-1 +kerning first=282 second=366 amount=-1 +kerning first=264 second=67 amount=-1 +kerning first=73 second=271 amount=-1 +kerning first=195 second=210 amount=-1 +kerning first=198 second=116 amount=-1 +kerning first=210 second=366 amount=-1 +kerning first=192 second=67 amount=-1 +kerning first=268 second=264 amount=-1 +kerning first=204 second=83 amount=-1 +kerning first=196 second=336 amount=-1 +kerning first=204 second=317 amount=-1 +kerning first=87 second=67 amount=-1 +kerning first=337 second=8250 amount=-1 +kerning first=268 second=336 amount=-1 +kerning first=324 second=281 amount=-1 +kerning first=205 second=244 amount=-1 +kerning first=241 second=244 amount=-1 +kerning first=242 second=46 amount=-1 +kerning first=121 second=8220 amount=-2 +kerning first=104 second=171 amount=-1 +kerning first=277 second=244 amount=-1 +kerning first=1056 second=1056 amount=-1 +kerning first=1062 second=1090 amount=-1 +kerning first=70 second=347 amount=-1 +kerning first=75 second=268 amount=-1 +kerning first=84 second=74 amount=-1 +kerning first=262 second=8220 amount=-1 +kerning first=8218 second=119 amount=-1 +kerning first=231 second=277 amount=-1 +kerning first=344 second=213 amount=-1 +kerning first=70 second=380 amount=-1 +kerning first=366 second=198 amount=-1 +kerning first=85 second=235 amount=-1 +kerning first=334 second=356 amount=-1 +kerning first=284 second=77 amount=-1 +kerning first=73 second=269 amount=-1 +kerning first=339 second=277 amount=-1 +kerning first=212 second=77 amount=-1 +kerning first=272 second=296 amount=-1 +kerning first=226 second=235 amount=-1 +kerning first=71 second=77 amount=-1 +kerning first=267 second=277 amount=-1 +kerning first=262 second=235 amount=-1 +kerning first=1065 second=1081 amount=-1 +kerning first=250 second=269 amount=-1 +kerning first=89 second=79 amount=-1 +kerning first=1089 second=1078 amount=-1 +kerning first=194 second=79 amount=-1 +kerning first=187 second=296 amount=-1 +kerning first=264 second=286 amount=-1 +kerning first=87 second=65 amount=-1 +kerning first=206 second=82 amount=-1 +kerning first=1047 second=1094 amount=-1 +kerning first=1053 second=1065 amount=-1 +kerning first=356 second=231 amount=-1 +kerning first=118 second=363 amount=-1 +kerning first=278 second=82 amount=-1 +kerning first=374 second=79 amount=-1 +kerning first=219 second=274 amount=-1 +kerning first=187 second=363 amount=-1 +kerning first=87 second=286 amount=-1 +kerning first=304 second=351 amount=-1 +kerning first=268 second=351 amount=-1 +kerning first=73 second=338 amount=-1 +kerning first=192 second=286 amount=-1 +kerning first=232 second=351 amount=-1 +kerning first=1050 second=1085 amount=-1 +kerning first=210 second=77 amount=-1 +kerning first=355 second=347 amount=-1 +kerning first=266 second=79 amount=-1 +kerning first=78 second=274 amount=-1 +kerning first=266 second=337 amount=-1 +kerning first=302 second=79 amount=-1 +kerning first=283 second=347 amount=-1 +kerning first=338 second=79 amount=-1 +kerning first=100 second=244 amount=-1 +kerning first=217 second=260 amount=-1 +kerning first=72 second=290 amount=-1 +kerning first=1064 second=1042 amount=-1 +kerning first=282 second=80 amount=-1 +kerning first=250 second=279 amount=-1 +kerning first=234 second=114 amount=-1 +kerning first=219 second=261 amount=-1 +kerning first=8217 second=227 amount=-1 +kerning first=210 second=80 amount=-1 +kerning first=327 second=205 amount=-1 +kerning first=316 second=367 amount=-1 +kerning first=327 second=261 amount=-1 +kerning first=8218 second=67 amount=-1 +kerning first=338 second=66 amount=-1 +kerning first=280 second=367 amount=-1 +kerning first=73 second=217 amount=-1 +kerning first=352 second=70 amount=-1 +kerning first=302 second=66 amount=-1 +kerning first=72 second=344 amount=-1 +kerning first=266 second=66 amount=-1 +kerning first=198 second=114 amount=-1 +kerning first=214 second=217 amount=-1 +kerning first=77 second=115 amount=-1 +kerning first=103 second=367 amount=-1 +kerning first=78 second=205 amount=-1 +kerning first=286 second=217 amount=-1 +kerning first=66 second=362 amount=-1 +kerning first=344 second=357 amount=-1 +kerning first=274 second=251 amount=-1 +kerning first=207 second=310 amount=-1 +kerning first=202 second=251 amount=-1 +kerning first=374 second=284 amount=-1 +kerning first=73 second=284 amount=-1 +kerning first=69 second=80 amount=-1 +kerning first=66 second=310 amount=-1 +kerning first=362 second=209 amount=-1 +kerning first=310 second=251 amount=-1 +kerning first=205 second=333 amount=-1 +kerning first=346 second=251 amount=-1 +kerning first=219 second=205 amount=-1 +kerning first=275 second=106 amount=-1 +kerning first=298 second=235 amount=-1 +kerning first=119 second=249 amount=-1 +kerning first=366 second=252 amount=-1 +kerning first=100 second=242 amount=-1 +kerning first=202 second=266 amount=-1 +kerning first=370 second=235 amount=-1 +kerning first=310 second=266 amount=-1 +kerning first=274 second=266 amount=-1 +kerning first=98 second=106 amount=-1 +kerning first=241 second=242 amount=-1 +kerning first=277 second=242 amount=-1 +kerning first=117 second=267 amount=-1 +kerning first=272 second=200 amount=-1 +kerning first=205 second=242 amount=-1 +kerning first=83 second=249 amount=-1 +kerning first=232 second=263 amount=-1 +kerning first=200 second=200 amount=-1 +kerning first=115 second=45 amount=-1 +kerning first=45 second=252 amount=-1 +kerning first=305 second=8220 amount=-1 +kerning first=72 second=71 amount=-1 +kerning first=99 second=8222 amount=-1 +kerning first=274 second=71 amount=-1 +kerning first=217 second=226 amount=-1 +kerning first=264 second=101 amount=-1 +kerning first=206 second=97 amount=-1 +kerning first=85 second=242 amount=-1 +kerning first=258 second=252 amount=-1 +kerning first=271 second=275 amount=-1 +kerning first=328 second=45 amount=-1 +kerning first=75 second=214 amount=-1 +kerning first=235 second=275 amount=-1 +kerning first=85 second=233 amount=-1 +kerning first=220 second=45 amount=-2 +kerning first=368 second=249 amount=-1 +kerning first=1049 second=1028 amount=-1 +kerning first=256 second=45 amount=-1 +kerning first=355 second=291 amount=-1 +kerning first=304 second=336 amount=-1 +kerning first=226 second=233 amount=-1 +kerning first=274 second=199 amount=-1 +kerning first=1041 second=1114 amount=-1 +kerning first=262 second=233 amount=-1 +kerning first=310 second=199 amount=-1 +kerning first=283 second=291 amount=-1 +kerning first=201 second=315 amount=-1 +kerning first=220 second=363 amount=-1 +kerning first=171 second=87 amount=-1 +kerning first=262 second=302 amount=-1 +kerning first=80 second=258 amount=-1 +kerning first=105 second=234 amount=-1 +kerning first=298 second=302 amount=-1 +kerning first=71 second=85 amount=-1 +kerning first=275 second=99 amount=-1 +kerning first=267 second=223 amount=-1 +kerning first=106 second=291 amount=-1 +kerning first=231 second=223 amount=-1 +kerning first=298 second=233 amount=-1 +kerning first=1105 second=1103 amount=-1 +kerning first=195 second=223 amount=-1 +kerning first=264 second=232 amount=-1 +kerning first=45 second=356 amount=-1 +kerning first=207 second=243 amount=-1 +kerning first=199 second=327 amount=-1 +kerning first=1067 second=1080 amount=-1 +kerning first=228 second=232 amount=-1 +kerning first=1031 second=1080 amount=-1 +kerning first=1041 second=1095 amount=-1 +kerning first=206 second=225 amount=-1 +kerning first=119 second=8221 amount=-2 +kerning first=324 second=337 amount=-1 +kerning first=1033 second=1079 amount=-1 +kerning first=74 second=122 amount=-1 +kerning first=221 second=258 amount=-1 +kerning first=224 second=8221 amount=-2 +kerning first=252 second=337 amount=-1 +kerning first=8217 second=382 amount=-1 +kerning first=260 second=8221 amount=-2 +kerning first=291 second=328 amount=-1 +kerning first=1068 second=1039 amount=-1 +kerning first=220 second=216 amount=-1 +kerning first=231 second=225 amount=-1 +kerning first=314 second=287 amount=-1 +kerning first=8220 second=351 amount=-1 +kerning first=267 second=225 amount=-1 +kerning first=65 second=370 amount=-1 +kerning first=252 second=335 amount=-1 +kerning first=115 second=318 amount=-1 +kerning first=211 second=72 amount=-1 +kerning first=87 second=232 amount=-1 +kerning first=70 second=72 amount=-1 +kerning first=1034 second=1071 amount=-1 +kerning first=324 second=335 amount=-1 +kerning first=291 second=105 amount=-1 +kerning first=1070 second=1071 amount=-1 +kerning first=209 second=8222 amount=-1 +kerning first=1048 second=1096 amount=-1 +kerning first=362 second=46 amount=-2 +kerning first=213 second=344 amount=-1 +kerning first=354 second=234 amount=-1 +kerning first=278 second=370 amount=-1 +kerning first=258 second=98 amount=-1 +kerning first=206 second=370 amount=-1 +kerning first=114 second=97 amount=-1 +kerning first=193 second=89 amount=-1 +kerning first=199 second=44 amount=-1 +kerning first=272 second=310 amount=-1 +kerning first=202 second=199 amount=-1 +kerning first=207 second=241 amount=-1 +kerning first=350 second=370 amount=-1 +kerning first=202 second=361 amount=-1 +kerning first=1030 second=1062 amount=-1 +kerning first=369 second=267 amount=-1 +kerning first=1048 second=1086 amount=-1 +kerning first=67 second=243 amount=-1 +kerning first=346 second=361 amount=-1 +kerning first=1047 second=1070 amount=-1 +kerning first=364 second=114 amount=-1 +kerning first=1043 second=1083 amount=-1 +kerning first=217 second=206 amount=-1 +kerning first=328 second=114 amount=-1 +kerning first=274 second=361 amount=-1 +kerning first=8218 second=365 amount=-1 +kerning first=225 second=267 amount=-1 +kerning first=310 second=361 amount=-1 +kerning first=261 second=267 amount=-1 +kerning first=291 second=8250 amount=-1 +kerning first=325 second=206 amount=-1 +kerning first=1044 second=1079 amount=-1 +kerning first=220 second=114 amount=-1 +kerning first=210 second=258 amount=-1 +kerning first=206 second=368 amount=-1 +kerning first=109 second=245 amount=-1 +kerning first=1058 second=1092 amount=-1 +kerning first=218 second=275 amount=-1 +kerning first=328 second=8249 amount=-1 +kerning first=73 second=245 amount=-1 +kerning first=327 second=315 amount=-1 +kerning first=364 second=8249 amount=-2 +kerning first=207 second=351 amount=-1 +kerning first=278 second=368 amount=-1 +kerning first=268 second=115 amount=-1 +kerning first=86 second=212 amount=-1 +kerning first=205 second=352 amount=-1 +kerning first=364 second=331 amount=-1 +kerning first=235 second=316 amount=-1 +kerning first=283 second=254 amount=-1 +kerning first=305 second=111 amount=-1 +kerning first=65 second=368 amount=-1 +kerning first=1081 second=1095 amount=-1 +kerning first=1045 second=1095 amount=-1 +kerning first=226 second=263 amount=-1 +kerning first=220 second=331 amount=-1 +kerning first=262 second=263 amount=-1 +kerning first=218 second=216 amount=-1 +kerning first=298 second=263 amount=-1 +kerning first=201 second=365 amount=-1 +kerning first=74 second=194 amount=-1 +kerning first=217 second=370 amount=-1 +kerning first=304 second=115 amount=-1 +kerning first=1030 second=1055 amount=-1 +kerning first=115 second=8249 amount=-1 +kerning first=201 second=68 amount=-1 +kerning first=350 second=368 amount=-1 +kerning first=80 second=310 amount=-1 +kerning first=220 second=8249 amount=-2 +kerning first=200 second=72 amount=-1 +kerning first=218 second=102 amount=-1 +kerning first=1067 second=1067 amount=-1 +kerning first=212 second=203 amount=-1 +kerning first=1060 second=1037 amount=-1 +kerning first=325 second=370 amount=-1 +kerning first=284 second=203 amount=-1 +kerning first=1059 second=1088 amount=-1 +kerning first=84 second=267 amount=-1 +kerning first=362 second=102 amount=-1 +kerning first=112 second=106 amount=-1 +kerning first=85 second=263 amount=-1 +kerning first=1055 second=1101 amount=-1 +kerning first=1027 second=1118 amount=-1 +kerning first=272 second=72 amount=-1 +kerning first=71 second=203 amount=-1 +kerning first=1091 second=1101 amount=-1 +kerning first=253 second=106 amount=-1 +kerning first=1064 second=1024 amount=-1 +kerning first=80 second=327 amount=-1 +kerning first=337 second=8222 amount=-1 +kerning first=1038 second=1028 amount=-1 +kerning first=77 second=282 amount=-1 +kerning first=65 second=84 amount=-1 +kerning first=1071 second=1052 amount=-1 +kerning first=209 second=346 amount=-1 +kerning first=193 second=334 amount=-1 +kerning first=88 second=8222 amount=-1 +kerning first=88 second=334 amount=-1 +kerning first=305 second=291 amount=-1 +kerning first=269 second=291 amount=-1 +kerning first=89 second=337 amount=-1 +kerning first=69 second=288 amount=-1 +kerning first=233 second=291 amount=-1 +kerning first=351 second=187 amount=-1 +kerning first=266 second=350 amount=-1 +kerning first=302 second=350 amount=-1 +kerning first=101 second=318 amount=-1 +kerning first=217 second=78 amount=-1 +kerning first=350 second=73 amount=-1 +kerning first=282 second=288 amount=-1 +kerning first=66 second=187 amount=-1 +kerning first=242 second=318 amount=-1 +kerning first=104 second=99 amount=-1 +kerning first=198 second=270 amount=-1 +kerning first=314 second=318 amount=-1 +kerning first=209 second=75 amount=-1 +kerning first=1067 second=1119 amount=-1 +kerning first=243 second=187 amount=-1 +kerning first=8217 second=266 amount=-1 +kerning first=302 second=337 amount=-1 +kerning first=281 second=99 amount=-1 +kerning first=279 second=187 amount=-1 +kerning first=1051 second=1064 amount=-1 +kerning first=1051 second=1027 amount=-1 +kerning first=230 second=337 amount=-1 +kerning first=209 second=99 amount=-1 +kerning first=270 second=270 amount=-1 +kerning first=339 second=279 amount=-1 +kerning first=1048 second=1036 amount=-1 +kerning first=231 second=279 amount=-1 +kerning first=266 second=187 amount=-1 +kerning first=269 second=328 amount=-1 +kerning first=87 second=242 amount=-1 +kerning first=1039 second=1074 amount=-1 +kerning first=218 second=332 amount=-1 +kerning first=116 second=232 amount=-1 +kerning first=352 second=367 amount=-1 +kerning first=323 second=8222 amount=-1 +kerning first=77 second=332 amount=-1 +kerning first=268 second=202 amount=-1 +kerning first=364 second=277 amount=-1 +kerning first=362 second=332 amount=-1 +kerning first=66 second=351 amount=-1 +kerning first=328 second=277 amount=-1 +kerning first=109 second=8217 amount=-2 +kerning first=77 second=8250 amount=-1 +kerning first=304 second=202 amount=-1 +kerning first=278 second=264 amount=-1 +kerning first=279 second=351 amount=-1 +kerning first=274 second=116 amount=-1 +kerning first=206 second=264 amount=-1 +kerning first=283 second=8221 amount=-2 +kerning first=291 second=267 amount=-1 +kerning first=192 second=121 amount=-1 +kerning first=288 second=73 amount=-1 +kerning first=209 second=115 amount=-1 +kerning first=325 second=69 amount=-1 +kerning first=203 second=323 amount=-1 +kerning first=1048 second=1073 amount=-1 +kerning first=65 second=264 amount=-1 +kerning first=219 second=279 amount=-1 +kerning first=119 second=108 amount=-1 +kerning first=1052 second=1030 amount=-1 +kerning first=214 second=8217 amount=-2 +kerning first=264 second=338 amount=-1 +kerning first=220 second=277 amount=-1 +kerning first=250 second=8217 amount=-1 +kerning first=1060 second=1050 amount=-1 +kerning first=171 second=350 amount=-1 +kerning first=1052 second=1060 amount=-1 +kerning first=286 second=8217 amount=-1 +kerning first=192 second=338 amount=-1 +kerning first=194 second=356 amount=-1 +kerning first=310 second=307 amount=-1 +kerning first=1071 second=1076 amount=-1 +kerning first=217 second=69 amount=-1 +kerning first=80 second=364 amount=-1 +kerning first=8217 second=212 amount=-1 +kerning first=255 second=8249 amount=-1 +kerning first=8217 second=347 amount=-1 +kerning first=330 second=113 amount=-1 +kerning first=111 second=103 amount=-1 +kerning first=73 second=325 amount=-1 +kerning first=366 second=113 amount=-1 +kerning first=325 second=286 amount=-1 +kerning first=221 second=273 amount=-1 +kerning first=116 second=242 amount=-1 +kerning first=101 second=355 amount=-1 +kerning first=1067 second=1025 amount=-1 +kerning first=65 second=171 amount=-1 +kerning first=65 second=355 amount=-1 +kerning first=286 second=325 amount=-1 +kerning first=80 second=273 amount=-1 +kerning first=304 second=78 amount=-1 +kerning first=76 second=370 amount=-1 +kerning first=217 second=193 amount=-1 +kerning first=1031 second=1039 amount=-1 +kerning first=217 second=286 amount=-1 +kerning first=101 second=314 amount=-1 +kerning first=1066 second=1063 amount=-2 +kerning first=1067 second=1039 amount=-1 +kerning first=65 second=314 amount=-1 +kerning first=298 second=317 amount=-1 +kerning first=1055 second=1047 amount=-1 +kerning first=334 second=317 amount=-1 +kerning first=1034 second=1056 amount=-1 +kerning first=314 second=314 amount=-1 +kerning first=1027 second=1082 amount=-1 +kerning first=370 second=317 amount=-1 +kerning first=268 second=78 amount=-1 +kerning first=1070 second=1056 amount=-1 +kerning first=217 second=81 amount=-1 +kerning first=362 second=282 amount=-1 +kerning first=242 second=314 amount=-1 +kerning first=368 second=8221 amount=-1 +kerning first=290 second=282 amount=-1 +kerning first=171 second=364 amount=-1 +kerning first=1039 second=1119 amount=-1 +kerning first=278 second=355 amount=-1 +kerning first=221 second=117 amount=-1 +kerning first=218 second=282 amount=-1 +kerning first=112 second=316 amount=-1 +kerning first=270 second=77 amount=-1 +kerning first=279 second=100 amount=-1 +kerning first=198 second=77 amount=-1 +kerning first=121 second=289 amount=-1 +kerning first=367 second=234 amount=-1 +kerning first=1039 second=1100 amount=-1 +kerning first=226 second=289 amount=-1 +kerning first=286 second=76 amount=-1 +kerning first=100 second=101 amount=-1 +kerning first=263 second=305 amount=-1 +kerning first=205 second=101 amount=-1 +kerning first=278 second=171 amount=-1 +kerning first=280 second=220 amount=-1 +kerning first=374 second=246 amount=-1 +kerning first=277 second=101 amount=-1 +kerning first=350 second=171 amount=-1 +kerning first=352 second=220 amount=-1 +kerning first=330 second=330 amount=-1 +kerning first=241 second=101 amount=-1 +kerning first=302 second=246 amount=-1 +kerning first=324 second=103 amount=-1 +kerning first=311 second=8217 amount=-1 +kerning first=266 second=246 amount=-1 +kerning first=231 second=333 amount=-1 +kerning first=291 second=246 amount=-1 +kerning first=230 second=246 amount=-1 +kerning first=67 second=220 amount=-1 +kerning first=267 second=333 amount=-1 +kerning first=1067 second=1065 amount=-1 +kerning first=207 second=100 amount=-1 +kerning first=1104 second=1096 amount=-1 +kerning first=284 second=325 amount=-1 +kerning first=89 second=246 amount=-1 +kerning first=87 second=338 amount=-1 +kerning first=88 second=211 amount=-1 +kerning first=78 second=315 amount=-1 +kerning first=230 second=8218 amount=-1 +kerning first=266 second=120 amount=-1 +kerning first=302 second=296 amount=-1 +kerning first=1046 second=1074 amount=-1 +kerning first=266 second=296 amount=-1 +kerning first=219 second=315 amount=-1 +kerning first=374 second=120 amount=-1 +kerning first=97 second=281 amount=-1 +kerning first=374 second=8218 amount=-2 +kerning first=352 second=313 amount=-1 +kerning first=338 second=8218 amount=-1 +kerning first=1038 second=1084 amount=-1 +kerning first=290 second=207 amount=-1 +kerning first=110 second=287 amount=-1 +kerning first=262 second=225 amount=-1 +kerning first=205 second=298 amount=-1 +kerning first=199 second=290 amount=-1 +kerning first=8250 second=221 amount=-2 +kerning first=253 second=114 amount=-1 +kerning first=362 second=8250 amount=-2 +kerning first=269 second=382 amount=-1 +kerning first=89 second=8218 amount=-2 +kerning first=287 second=287 amount=-1 +kerning first=89 second=120 amount=-1 +kerning first=290 second=8250 amount=-1 +kerning first=262 second=8250 amount=-1 +kerning first=1076 second=1117 amount=-1 +kerning first=213 second=86 amount=-1 +kerning first=67 second=313 amount=-1 +kerning first=254 second=8250 amount=-1 +kerning first=352 second=204 amount=-1 +kerning first=218 second=8250 amount=-2 +kerning first=221 second=234 amount=-1 +kerning first=298 second=339 amount=-1 +kerning first=262 second=339 amount=-1 +kerning first=74 second=302 amount=-1 +kerning first=370 second=339 amount=-1 +kerning first=262 second=107 amount=-1 +kerning first=257 second=234 amount=-1 +kerning first=365 second=234 amount=-1 +kerning first=350 second=365 amount=-1 +kerning first=85 second=339 amount=-1 +kerning first=321 second=354 amount=-1 +kerning first=226 second=339 amount=-1 +kerning first=77 second=278 amount=-1 +kerning first=110 second=8220 amount=-2 +kerning first=362 second=243 amount=-1 +kerning first=370 second=122 amount=-1 +kerning first=290 second=278 amount=-1 +kerning first=262 second=122 amount=-1 +kerning first=211 second=330 amount=-1 +kerning first=1051 second=1118 amount=-1 +kerning first=298 second=122 amount=-1 +kerning first=73 second=74 amount=-1 +kerning first=218 second=278 amount=-1 +kerning first=204 second=280 amount=-1 +kerning first=325 second=232 amount=-1 +kerning first=289 second=232 amount=-1 +kerning first=121 second=107 amount=-1 +kerning first=80 second=219 amount=-1 +kerning first=226 second=122 amount=-1 +kerning first=116 second=234 amount=-1 +kerning first=85 second=122 amount=-1 +kerning first=335 second=103 amount=-1 +kerning first=80 second=234 amount=-1 +kerning first=217 second=232 amount=-1 +kerning first=121 second=122 amount=-1 +kerning first=362 second=278 amount=-1 +kerning first=227 second=335 amount=-1 +kerning first=1066 second=1039 amount=-1 +kerning first=1036 second=1094 amount=-1 +kerning first=268 second=241 amount=-1 +kerning first=304 second=209 amount=-1 +kerning first=263 second=335 amount=-1 +kerning first=8218 second=333 amount=-1 +kerning first=275 second=269 amount=-1 +kerning first=1031 second=1083 amount=-1 +kerning first=198 second=363 amount=-1 +kerning first=323 second=115 amount=-1 +kerning first=234 second=363 amount=-1 +kerning first=288 second=298 amount=-1 +kerning first=323 second=85 amount=-1 +kerning first=368 second=344 amount=-1 +kerning first=251 second=8220 amount=-1 +kerning first=72 second=202 amount=-1 +kerning first=279 second=46 amount=-1 +kerning first=205 second=229 amount=-1 +kerning first=70 second=98 amount=-1 +kerning first=243 second=46 amount=-1 +kerning first=287 second=8220 amount=-2 +kerning first=323 second=302 amount=-1 +kerning first=1040 second=1081 amount=-1 +kerning first=74 second=85 amount=-1 +kerning first=1076 second=1081 amount=-1 +kerning first=283 second=98 amount=-1 +kerning first=291 second=316 amount=-1 +kerning first=86 second=335 amount=-1 +kerning first=1069 second=1038 amount=-1 +kerning first=203 second=67 amount=-1 +kerning first=262 second=284 amount=-1 +kerning first=213 second=195 amount=-1 +kerning first=352 second=274 amount=-1 +kerning first=193 second=250 amount=-1 +kerning first=374 second=192 amount=-1 +kerning first=87 second=262 amount=-1 +kerning first=88 second=250 amount=-1 +kerning first=234 second=378 amount=-1 +kerning first=8250 second=112 amount=-1 +kerning first=204 second=70 amount=-1 +kerning first=192 second=262 amount=-1 +kerning first=289 second=8218 amount=-1 +kerning first=102 second=46 amount=-1 +kerning first=264 second=262 amount=-1 +kerning first=266 second=207 amount=-1 +kerning first=66 second=46 amount=-1 +kerning first=1075 second=1085 amount=-1 +kerning first=86 second=251 amount=-1 +kerning first=310 second=357 amount=-1 +kerning first=1069 second=1053 amount=-1 +kerning first=209 second=216 amount=-1 +kerning first=233 second=8250 amount=-1 +kerning first=1102 second=1078 amount=-1 +kerning first=274 second=357 amount=-1 +kerning first=224 second=171 amount=-1 +kerning first=270 second=278 amount=-1 +kerning first=272 second=76 amount=-1 +kerning first=346 second=200 amount=-1 +kerning first=326 second=243 amount=-1 +kerning first=1033 second=1053 amount=-1 +kerning first=214 second=310 amount=-1 +kerning first=187 second=369 amount=-1 +kerning first=66 second=250 amount=-1 +kerning first=1064 second=1117 amount=-1 +kerning first=8250 second=344 amount=-1 +kerning first=103 second=314 amount=-1 +kerning first=280 second=68 amount=-1 +kerning first=370 second=350 amount=-1 +kerning first=187 second=116 amount=-1 +kerning first=1041 second=1084 amount=-1 +kerning first=73 second=286 amount=-1 +kerning first=68 second=201 amount=-1 +kerning first=70 second=113 amount=-1 +kerning first=82 second=116 amount=-1 +kerning first=115 second=8250 amount=-1 +kerning first=8218 second=316 amount=-1 +kerning first=100 second=8220 amount=-1 +kerning first=210 second=204 amount=-1 +kerning first=1054 second=1044 amount=-1 +kerning first=118 second=351 amount=-1 +kerning first=89 second=242 amount=-1 +kerning first=84 second=271 amount=-1 +kerning first=69 second=204 amount=-1 +kerning first=67 second=259 amount=-1 +kerning first=338 second=207 amount=-1 +kerning first=205 second=268 amount=-1 +kerning first=302 second=207 amount=-1 +kerning first=278 second=210 amount=-1 +kerning first=282 second=204 amount=-1 +kerning first=266 second=80 amount=-1 +kerning first=8216 second=194 amount=-2 +kerning first=199 second=366 amount=-1 +kerning first=206 second=210 amount=-1 +kerning first=291 second=369 amount=-1 +kerning first=374 second=242 amount=-1 +kerning first=255 second=369 amount=-1 +kerning first=1030 second=1047 amount=-1 +kerning first=219 second=369 amount=-1 +kerning first=302 second=242 amount=-1 +kerning first=1076 second=1096 amount=-1 +kerning first=283 second=113 amount=-1 +kerning first=74 second=233 amount=-1 +kerning first=267 second=97 amount=-1 +kerning first=1118 second=1113 amount=-1 +kerning first=324 second=244 amount=-1 +kerning first=110 second=233 amount=-1 +kerning first=206 second=279 amount=-1 +kerning first=199 second=315 amount=-1 +kerning first=69 second=327 amount=-1 +kerning first=101 second=279 amount=-1 +kerning first=251 second=233 amount=-1 +kerning first=298 second=209 amount=-1 +kerning first=314 second=279 amount=-1 +kerning first=287 second=233 amount=-1 +kerning first=76 second=84 amount=-1 +kerning first=253 second=171 amount=-1 +kerning first=210 second=327 amount=-1 +kerning first=231 second=97 amount=-1 +kerning first=1042 second=1080 amount=-1 +kerning first=232 second=187 amount=-1 +kerning first=282 second=327 amount=-1 +kerning first=79 second=75 amount=-1 +kerning first=268 second=187 amount=-1 +kerning first=211 second=200 amount=-1 +kerning first=323 second=233 amount=-1 +kerning first=196 second=187 amount=-1 +kerning first=74 second=371 amount=-1 +kerning first=77 second=224 amount=-1 +kerning first=70 second=200 amount=-1 +kerning first=1052 second=1045 amount=-1 +kerning first=1067 second=1070 amount=-1 +kerning first=70 second=44 amount=-2 +kerning first=277 second=283 amount=-1 +kerning first=209 second=270 amount=-1 +kerning first=364 second=75 amount=-1 +kerning first=195 second=318 amount=-1 +kerning first=205 second=283 amount=-1 +kerning first=231 second=318 amount=-1 +kerning first=362 second=224 amount=-1 +kerning first=267 second=318 amount=-1 +kerning first=251 second=248 amount=-1 +kerning first=107 second=8221 amount=-1 +kerning first=82 second=218 amount=-1 +kerning first=356 second=380 amount=-1 +kerning first=220 second=75 amount=-1 +kerning first=339 second=318 amount=-1 +kerning first=323 second=248 amount=-1 +kerning first=211 second=44 amount=-1 +kerning first=375 second=318 amount=-1 +kerning first=287 second=248 amount=-1 +kerning first=74 second=248 amount=-1 +kerning first=67 second=274 amount=-1 +kerning first=85 second=209 amount=-1 +kerning first=327 second=79 amount=-1 +kerning first=110 second=248 amount=-1 +kerning first=269 second=367 amount=-1 +kerning first=78 second=79 amount=-1 +kerning first=356 second=257 amount=-1 +kerning first=233 second=367 amount=-1 +kerning first=218 second=195 amount=-1 +kerning first=8218 second=354 amount=-1 +kerning first=1067 second=1084 amount=-1 +kerning first=68 second=270 amount=-1 +kerning first=252 second=244 amount=-1 +kerning first=280 second=205 amount=-1 +kerning first=374 second=261 amount=-1 +kerning first=353 second=45 amount=-1 +kerning first=367 second=8217 amount=-1 +kerning first=197 second=367 amount=-1 +kerning first=8250 second=201 amount=-1 +kerning first=83 second=344 amount=-1 +kerning first=66 second=115 amount=-1 +kerning first=245 second=114 amount=-1 +kerning first=8217 second=251 amount=-1 +kerning first=209 second=114 amount=-1 +kerning first=226 second=248 amount=-1 +kerning first=352 second=205 amount=-1 +kerning first=296 second=344 amount=-1 +kerning first=8222 second=364 amount=-1 +kerning first=1056 second=1097 amount=-1 +kerning first=281 second=114 amount=-1 +kerning first=199 second=80 amount=-1 +kerning first=89 second=261 amount=-1 +kerning first=206 second=206 amount=-1 +kerning first=8249 second=218 amount=-1 +kerning first=279 second=115 amount=-1 +kerning first=8220 second=192 amount=-2 +kerning first=45 second=345 amount=-1 +kerning first=275 second=353 amount=-1 +kerning first=214 second=89 amount=-1 +kerning first=1031 second=1048 amount=-1 +kerning first=266 second=261 amount=-1 +kerning first=330 second=109 amount=-1 +kerning first=350 second=206 amount=-1 +kerning first=117 second=345 amount=-1 +kerning first=278 second=206 amount=-1 +kerning first=207 second=115 amount=-1 +kerning first=67 second=205 amount=-1 +kerning first=258 second=345 amount=-1 +kerning first=310 second=71 amount=-1 +kerning first=86 second=266 amount=-1 +kerning first=344 second=362 amount=-1 +kerning first=330 second=345 amount=-1 +kerning first=1046 second=1089 amount=-1 +kerning first=366 second=345 amount=-1 +kerning first=286 second=44 amount=-1 +kerning first=77 second=243 amount=-1 +kerning first=202 second=71 amount=-1 +kerning first=99 second=226 amount=-1 +kerning first=218 second=243 amount=-1 +kerning first=304 second=310 amount=-1 +kerning first=195 second=368 amount=-1 +kerning first=321 second=8221 amount=-1 +kerning first=204 second=226 amount=-1 +kerning first=1071 second=1037 amount=-1 +kerning first=205 second=214 amount=-1 +kerning first=66 second=336 amount=-1 +kerning first=264 second=347 amount=-1 +kerning first=233 second=252 amount=-1 +kerning first=368 second=241 amount=-1 +kerning first=197 second=252 amount=-1 +kerning first=224 second=275 amount=-1 +kerning first=207 second=336 amount=-1 +kerning first=269 second=252 amount=-1 +kerning first=296 second=275 amount=-1 +kerning first=87 second=263 amount=-1 +kerning first=220 second=223 amount=-1 +kerning first=108 second=249 amount=-1 +kerning first=209 second=45 amount=-1 +kerning first=200 second=362 amount=-1 +kerning first=8218 second=262 amount=-1 +kerning first=104 second=45 amount=-1 +kerning first=272 second=362 amount=-1 +kerning first=364 second=223 amount=-1 +kerning first=101 second=353 amount=-1 +kerning first=1056 second=1051 amount=-1 +kerning first=198 second=45 amount=-1 +kerning first=365 second=275 amount=-1 +kerning first=272 second=217 amount=-1 +kerning first=268 second=327 amount=-1 +kerning first=304 second=327 amount=-1 +kerning first=369 second=8217 amount=-1 +kerning first=344 second=217 amount=-1 +kerning first=78 second=350 amount=-1 +kerning first=310 second=249 amount=-1 +kerning first=314 second=106 amount=-1 +kerning first=221 second=275 amount=-1 +kerning first=346 second=249 amount=-1 +kerning first=199 second=71 amount=-1 +kerning first=378 second=45 amount=-1 +kerning first=354 second=243 amount=-1 +kerning first=257 second=275 amount=-1 +kerning first=268 second=80 amount=-1 +kerning first=264 second=223 amount=-1 +kerning first=327 second=350 amount=-1 +kerning first=8250 second=253 amount=-1 +kerning first=1069 second=1062 amount=-1 +kerning first=112 second=318 amount=-1 +kerning first=1031 second=1097 amount=-1 +kerning first=192 second=223 amount=-1 +kerning first=8218 second=210 amount=-1 +kerning first=80 second=275 amount=-1 +kerning first=344 second=284 amount=-1 +kerning first=219 second=350 amount=-1 +kerning first=304 second=80 amount=-1 +kerning first=74 second=226 amount=-1 +kerning first=249 second=234 amount=-1 +kerning first=369 second=232 amount=-1 +kerning first=210 second=87 amount=-1 +kerning first=8250 second=73 amount=-1 +kerning first=73 second=200 amount=-1 +kerning first=231 second=8221 amount=-2 +kerning first=69 second=278 amount=-1 +kerning first=368 second=266 amount=-1 +kerning first=1047 second=1085 amount=-1 +kerning first=87 second=223 amount=-1 +kerning first=323 second=226 amount=-1 +kerning first=203 second=362 amount=-1 +kerning first=207 second=70 amount=-1 +kerning first=84 second=232 amount=-1 +kerning first=202 second=249 amount=-1 +kerning first=291 second=283 amount=-1 +kerning first=8218 second=277 amount=-1 +kerning first=296 second=266 amount=-1 +kerning first=274 second=249 amount=-1 +kerning first=220 second=296 amount=-1 +kerning first=218 second=371 amount=-1 +kerning first=1046 second=1059 amount=-1 +kerning first=108 second=234 amount=-1 +kerning first=261 second=232 amount=-1 +kerning first=78 second=283 amount=-1 +kerning first=66 second=332 amount=-1 +kerning first=72 second=234 amount=-1 +kerning first=225 second=232 amount=-1 +kerning first=286 second=200 amount=-1 +kerning first=375 second=378 amount=-1 +kerning first=1053 second=1055 amount=-1 +kerning first=362 second=371 amount=-1 +kerning first=214 second=200 amount=-1 +kerning first=85 second=8249 amount=-2 +kerning first=187 second=85 amount=-1 +kerning first=374 second=335 amount=-1 +kerning first=207 second=332 amount=-1 +kerning first=1050 second=1063 amount=-1 +kerning first=1034 second=1041 amount=-1 +kerning first=8250 second=211 amount=-1 +kerning first=204 second=241 amount=-1 +kerning first=67 second=345 amount=-1 +kerning first=103 second=345 amount=-1 +kerning first=204 second=350 amount=-1 +kerning first=1104 second=1076 amount=-1 +kerning first=201 second=216 amount=-1 +kerning first=366 second=217 amount=-1 +kerning first=75 second=105 amount=-1 +kerning first=109 second=267 amount=-1 +kerning first=244 second=345 amount=-1 +kerning first=284 second=302 amount=-1 +kerning first=89 second=335 amount=-1 +kerning first=339 second=114 amount=-1 +kerning first=280 second=345 amount=-1 +kerning first=1052 second=1028 amount=-1 +kerning first=316 second=345 amount=-1 +kerning first=212 second=302 amount=-1 +kerning first=80 second=115 amount=-1 +kerning first=1091 second=1079 amount=-1 +kerning first=352 second=345 amount=-1 +kerning first=73 second=171 amount=-1 +kerning first=116 second=115 amount=-1 +kerning first=375 second=114 amount=-1 +kerning first=1055 second=1079 amount=-1 +kerning first=287 second=46 amount=-1 +kerning first=266 second=335 amount=-1 +kerning first=195 second=114 amount=-1 +kerning first=99 second=241 amount=-1 +kerning first=67 second=98 amount=-1 +kerning first=230 second=335 amount=-1 +kerning first=1071 second=1067 amount=-1 +kerning first=1049 second=1050 amount=-1 +kerning first=85 second=266 amount=-1 +kerning first=267 second=114 amount=-1 +kerning first=323 second=46 amount=-1 +kerning first=71 second=302 amount=-1 +kerning first=302 second=335 amount=-1 +kerning first=231 second=114 amount=-1 +kerning first=65 second=119 amount=-1 +kerning first=81 second=207 amount=-1 +kerning first=370 second=378 amount=-1 +kerning first=192 second=370 amount=-1 +kerning first=200 second=284 amount=-1 +kerning first=255 second=103 amount=-1 +kerning first=45 second=207 amount=-1 +kerning first=258 second=81 amount=-1 +kerning first=69 second=310 amount=-1 +kerning first=298 second=378 amount=-1 +kerning first=193 second=336 amount=-1 +kerning first=262 second=378 amount=-1 +kerning first=264 second=323 amount=-1 +kerning first=8217 second=244 amount=-1 +kerning first=366 second=81 amount=-1 +kerning first=221 second=115 amount=-1 +kerning first=330 second=207 amount=-1 +kerning first=264 second=370 amount=-1 +kerning first=201 second=368 amount=-1 +kerning first=330 second=81 amount=-1 +kerning first=79 second=315 amount=-1 +kerning first=231 second=314 amount=-1 +kerning first=1068 second=1063 amount=-2 +kerning first=195 second=314 amount=-1 +kerning first=187 second=264 amount=-1 +kerning first=296 second=199 amount=-1 +kerning first=242 second=106 amount=-1 +kerning first=287 second=107 amount=-1 +kerning first=1049 second=1037 amount=-1 +kerning first=375 second=314 amount=-1 +kerning first=368 second=199 amount=-1 +kerning first=86 second=110 amount=-1 +kerning first=1070 second=1041 amount=-1 +kerning first=282 second=310 amount=-1 +kerning first=211 second=89 amount=-1 +kerning first=8216 second=218 amount=-1 +kerning first=121 second=378 amount=-1 +kerning first=1048 second=1071 amount=-1 +kerning first=210 second=310 amount=-1 +kerning first=101 second=106 amount=-1 +kerning first=72 second=288 amount=-1 +kerning first=263 second=110 amount=-1 +kerning first=204 second=334 amount=-1 +kerning first=8250 second=266 amount=-1 +kerning first=66 second=78 amount=-1 +kerning first=1052 second=1101 amount=-1 +kerning first=80 second=221 amount=-1 +kerning first=1033 second=1042 amount=-1 +kerning first=289 second=122 amount=-1 +kerning first=1077 second=1078 amount=-1 +kerning first=89 second=101 amount=-1 +kerning first=230 second=101 amount=-1 +kerning first=316 second=291 amount=-1 +kerning first=45 second=81 amount=-1 +kerning first=280 second=114 amount=-1 +kerning first=302 second=101 amount=-1 +kerning first=244 second=291 amount=-1 +kerning first=8218 second=370 amount=-1 +kerning first=217 second=362 amount=-1 +kerning first=266 second=101 amount=-1 +kerning first=374 second=101 amount=-1 +kerning first=219 second=296 amount=-1 +kerning first=363 second=337 amount=-1 +kerning first=234 second=279 amount=-1 +kerning first=103 second=291 amount=-1 +kerning first=317 second=84 amount=-1 +kerning first=291 second=337 amount=-1 +kerning first=78 second=296 amount=-1 +kerning first=310 second=303 amount=-1 +kerning first=219 second=337 amount=-1 +kerning first=121 second=8250 amount=-1 +kerning first=327 second=296 amount=-1 +kerning first=365 second=114 amount=-1 +kerning first=78 second=337 amount=-1 +kerning first=212 second=75 amount=-1 +kerning first=351 second=8250 amount=-1 +kerning first=234 second=99 amount=-1 +kerning first=1028 second=1119 amount=-1 +kerning first=325 second=245 amount=-1 +kerning first=279 second=8250 amount=-1 +kerning first=1064 second=1119 amount=-1 +kerning first=71 second=75 amount=-1 +kerning first=243 second=8250 amount=-1 +kerning first=220 second=261 amount=-1 +kerning first=277 second=8218 amount=-1 +kerning first=290 second=274 amount=-1 +kerning first=217 second=245 amount=-1 +kerning first=1065 second=1094 amount=-1 +kerning first=99 second=287 amount=-1 +kerning first=66 second=8250 amount=-1 +kerning first=356 second=8220 amount=-1 +kerning first=323 second=380 amount=-1 +kerning first=80 second=202 amount=-1 +kerning first=338 second=363 amount=-1 +kerning first=287 second=380 amount=-1 +kerning first=282 second=117 amount=-1 +kerning first=1055 second=1025 amount=-1 +kerning first=77 second=83 amount=-1 +kerning first=246 second=46 amount=-1 +kerning first=204 second=246 amount=-1 +kerning first=370 second=218 amount=-1 +kerning first=334 second=218 amount=-1 +kerning first=298 second=218 amount=-1 +kerning first=218 second=83 amount=-1 +kerning first=284 second=75 amount=-1 +kerning first=262 second=218 amount=-1 +kerning first=1041 second=1030 amount=-1 +kerning first=325 second=264 amount=-1 +kerning first=208 second=187 amount=-1 +kerning first=374 second=122 amount=-1 +kerning first=210 second=364 amount=-1 +kerning first=362 second=83 amount=-1 +kerning first=66 second=278 amount=-1 +kerning first=107 second=8220 amount=-1 +kerning first=74 second=380 amount=-1 +kerning first=217 second=264 amount=-1 +kerning first=71 second=8220 amount=-1 +kerning first=201 second=270 amount=-1 +kerning first=69 second=364 amount=-1 +kerning first=209 second=257 amount=-1 +kerning first=235 second=98 amount=-1 +kerning first=264 second=69 amount=-1 +kerning first=284 second=8220 amount=-1 +kerning first=277 second=367 amount=-1 +kerning first=207 second=278 amount=-1 +kerning first=248 second=8220 amount=-2 +kerning first=263 second=103 amount=-1 +kerning first=227 second=103 amount=-1 +kerning first=1056 second=1039 amount=-1 +kerning first=8250 second=199 amount=-1 +kerning first=304 second=273 amount=-1 +kerning first=268 second=273 amount=-1 +kerning first=205 second=227 amount=-1 +kerning first=86 second=103 amount=-1 +kerning first=305 second=171 amount=-1 +kerning first=187 second=278 amount=-1 +kerning first=232 second=273 amount=-1 +kerning first=288 second=205 amount=-1 +kerning first=1070 second=1034 amount=-1 +kerning first=366 second=273 amount=-1 +kerning first=87 second=269 amount=-1 +kerning first=104 second=8220 amount=-2 +kerning first=1034 second=1034 amount=-1 +kerning first=8217 second=110 amount=-1 +kerning first=70 second=258 amount=-1 +kerning first=1065 second=1102 amount=-1 +kerning first=339 second=355 amount=-1 +kerning first=1067 second=1043 amount=-1 +kerning first=192 second=316 amount=-1 +kerning first=85 second=218 amount=-1 +kerning first=67 second=44 amount=-1 +kerning first=1031 second=1043 amount=-1 +kerning first=264 second=269 amount=-1 +kerning first=103 second=44 amount=-1 +kerning first=330 second=261 amount=-1 +kerning first=264 second=316 amount=-1 +kerning first=356 second=248 amount=-1 +kerning first=287 second=382 amount=-1 +kerning first=228 second=316 amount=-1 +kerning first=195 second=355 amount=-1 +kerning first=244 second=44 amount=-1 +kerning first=69 second=117 amount=-1 +kerning first=366 second=261 amount=-1 +kerning first=207 second=78 amount=-1 +kerning first=302 second=229 amount=-1 +kerning first=326 second=263 amount=-1 +kerning first=287 second=8221 amount=-2 +kerning first=362 second=263 amount=-1 +kerning first=1066 second=1030 amount=-1 +kerning first=8217 second=352 amount=-1 +kerning first=338 second=251 amount=-1 +kerning first=316 second=382 amount=-1 +kerning first=353 second=171 amount=-1 +kerning first=1030 second=1030 amount=-1 +kerning first=291 second=8218 amount=-1 +kerning first=235 second=117 amount=-1 +kerning first=1064 second=1100 amount=-1 +kerning first=364 second=203 amount=-1 +kerning first=79 second=203 amount=-1 +kerning first=1104 second=1078 amount=-1 +kerning first=77 second=263 amount=-1 +kerning first=220 second=203 amount=-1 +kerning first=97 second=108 amount=-1 +kerning first=75 second=251 amount=-1 +kerning first=316 second=252 amount=-1 +kerning first=1066 second=1025 amount=-1 +kerning first=218 second=263 amount=-1 +kerning first=1030 second=1025 amount=-1 +kerning first=1047 second=1050 amount=-1 +kerning first=277 second=246 amount=-1 +kerning first=241 second=246 amount=-1 +kerning first=334 second=77 amount=-1 +kerning first=121 second=8222 amount=-1 +kerning first=205 second=246 amount=-1 +kerning first=370 second=77 amount=-1 +kerning first=1069 second=1113 amount=-1 +kerning first=330 second=382 amount=-1 +kerning first=85 second=8222 amount=-2 +kerning first=1055 second=1060 amount=-1 +kerning first=262 second=77 amount=-1 +kerning first=366 second=382 amount=-1 +kerning first=100 second=246 amount=-1 +kerning first=298 second=77 amount=-1 +kerning first=99 second=100 amount=-1 +kerning first=212 second=356 amount=-1 +kerning first=203 second=218 amount=-1 +kerning first=262 second=304 amount=-1 +kerning first=204 second=100 amount=-1 +kerning first=298 second=304 amount=-1 +kerning first=85 second=77 amount=-1 +kerning first=304 second=282 amount=-1 +kerning first=97 second=103 amount=-1 +kerning first=1051 second=1083 amount=-1 +kerning first=98 second=316 amount=-1 +kerning first=8250 second=361 amount=-1 +kerning first=370 second=304 amount=-1 +kerning first=85 second=304 amount=-1 +kerning first=78 second=242 amount=-1 +kerning first=374 second=281 amount=-1 +kerning first=362 second=211 amount=-1 +kerning first=268 second=101 amount=-1 +kerning first=311 second=316 amount=-1 +kerning first=275 second=316 amount=-1 +kerning first=334 second=8222 amount=-1 +kerning first=234 second=333 amount=-1 +kerning first=1042 second=1048 amount=-1 +kerning first=77 second=211 amount=-1 +kerning first=351 second=45 amount=-1 +kerning first=347 second=316 amount=-1 +kerning first=262 second=8222 amount=-1 +kerning first=218 second=211 amount=-1 +kerning first=187 second=194 amount=-1 +kerning first=219 second=242 amount=-1 +kerning first=196 second=223 amount=-1 +kerning first=110 second=339 amount=-1 +kerning first=1031 second=1024 amount=-1 +kerning first=217 second=210 amount=-1 +kerning first=196 second=221 amount=-1 +kerning first=251 second=339 amount=-1 +kerning first=1067 second=1024 amount=-1 +kerning first=254 second=287 amount=-1 +kerning first=327 second=242 amount=-1 +kerning first=210 second=8250 amount=-1 +kerning first=363 second=242 amount=-1 +kerning first=99 second=233 amount=-1 +kerning first=307 second=269 amount=-1 +kerning first=304 second=110 amount=-1 +kerning first=74 second=280 amount=-1 +kerning first=74 second=339 amount=-1 +kerning first=314 second=245 amount=-1 +kerning first=330 second=315 amount=-1 +kerning first=205 second=313 amount=-1 +kerning first=366 second=315 amount=-1 +kerning first=199 second=242 amount=-1 +kerning first=240 second=233 amount=-1 +kerning first=355 second=240 amount=-1 +kerning first=268 second=219 amount=-1 +kerning first=233 second=120 amount=-1 +kerning first=304 second=219 amount=-1 +kerning first=204 second=233 amount=-1 +kerning first=269 second=120 amount=-1 +kerning first=355 second=230 amount=-1 +kerning first=323 second=280 amount=-1 +kerning first=323 second=339 amount=-1 +kerning first=78 second=279 amount=-1 +kerning first=81 second=315 amount=-1 +kerning first=287 second=339 amount=-1 +kerning first=324 second=118 amount=-1 +kerning first=80 second=206 amount=-1 +kerning first=1027 second=1101 amount=-1 +kerning first=1076 second=1118 amount=-1 +kerning first=45 second=315 amount=-1 +kerning first=1040 second=1118 amount=-1 +kerning first=101 second=8217 amount=-2 +kerning first=252 second=231 amount=-1 +kerning first=211 second=76 amount=-1 +kerning first=8217 second=290 amount=-1 +kerning first=70 second=76 amount=-1 +kerning first=242 second=8217 amount=-2 +kerning first=198 second=206 amount=-1 +kerning first=73 second=213 amount=-1 +kerning first=65 second=8217 amount=-2 +kerning first=207 second=224 amount=-1 +kerning first=370 second=85 amount=-1 +kerning first=334 second=85 amount=-1 +kerning first=206 second=245 amount=-1 +kerning first=298 second=85 amount=-1 +kerning first=107 second=289 amount=-1 +kerning first=262 second=85 amount=-1 +kerning first=101 second=245 amount=-1 +kerning first=275 second=254 amount=-1 +kerning first=278 second=8217 amount=-1 +kerning first=8222 second=273 amount=-1 +kerning first=314 second=8217 amount=-1 +kerning first=1041 second=1119 amount=-1 +kerning first=350 second=8217 amount=-1 +kerning first=217 second=331 amount=-1 +kerning first=1071 second=1113 amount=-1 +kerning first=248 second=289 amount=-1 +kerning first=368 second=366 amount=-1 +kerning first=258 second=318 amount=-1 +kerning first=296 second=366 amount=-1 +kerning first=203 second=262 amount=-1 +kerning first=1059 second=1095 amount=-1 +kerning first=250 second=113 amount=-1 +kerning first=280 second=79 amount=-1 +kerning first=194 second=311 amount=-1 +kerning first=73 second=67 amount=-1 +kerning first=1043 second=1096 amount=-1 +kerning first=1095 second=1095 amount=-1 +kerning first=197 second=307 amount=-1 +kerning first=339 second=287 amount=-1 +kerning first=362 second=317 amount=-1 +kerning first=253 second=104 amount=-1 +kerning first=209 second=225 amount=-1 +kerning first=321 second=84 amount=-1 +kerning first=197 second=345 amount=-1 +kerning first=1102 second=1084 amount=-1 +kerning first=1033 second=1048 amount=-1 +kerning first=233 second=345 amount=-1 +kerning first=269 second=345 amount=-1 +kerning first=99 second=46 amount=-1 +kerning first=1030 second=1084 amount=-1 +kerning first=305 second=345 amount=-1 +kerning first=240 second=46 amount=-1 +kerning first=370 second=250 amount=-1 +kerning first=118 second=107 amount=-1 +kerning first=45 second=369 amount=-1 +kerning first=220 second=368 amount=-1 +kerning first=77 second=317 amount=-1 +kerning first=364 second=201 amount=-1 +kerning first=229 second=122 amount=-1 +kerning first=244 second=314 amount=-1 +kerning first=97 second=8221 amount=-2 +kerning first=77 second=336 amount=-1 +kerning first=218 second=317 amount=-1 +kerning first=121 second=250 amount=-1 +kerning first=105 second=335 amount=-1 +kerning first=220 second=201 amount=-1 +kerning first=85 second=250 amount=-1 +kerning first=79 second=368 amount=-1 +kerning first=290 second=317 amount=-1 +kerning first=79 second=201 amount=-1 +kerning first=218 second=336 amount=-1 +kerning first=281 second=311 amount=-1 +kerning first=274 second=8221 amount=-1 +kerning first=73 second=113 amount=-1 +kerning first=221 second=256 amount=-1 +kerning first=310 second=8221 amount=-1 +kerning first=83 second=366 amount=-1 +kerning first=109 second=113 amount=-1 +kerning first=199 second=204 amount=-1 +kerning first=8216 second=197 amount=-2 +kerning first=346 second=8221 amount=-1 +kerning first=220 second=116 amount=-1 +kerning first=1066 second=1038 amount=-2 +kerning first=382 second=8221 amount=-1 +kerning first=362 second=336 amount=-1 +kerning first=287 second=326 amount=-1 +kerning first=1062 second=1086 amount=-1 +kerning first=325 second=210 amount=-1 +kerning first=364 second=368 amount=-1 +kerning first=80 second=256 amount=-1 +kerning first=1047 second=1031 amount=-1 +kerning first=337 second=122 amount=-1 +kerning first=364 second=116 amount=-1 +kerning first=104 second=114 amount=-1 +kerning first=205 second=259 amount=-1 +kerning first=310 second=268 amount=-1 +kerning first=274 second=268 amount=-1 +kerning first=220 second=97 amount=-1 +kerning first=89 second=281 amount=-1 +kerning first=280 second=8220 amount=-1 +kerning first=202 second=268 amount=-1 +kerning first=286 second=304 amount=-1 +kerning first=8222 second=221 amount=-2 +kerning first=1038 second=1116 amount=-1 +kerning first=230 second=281 amount=-1 +kerning first=269 second=347 amount=-1 +kerning first=266 second=281 amount=-1 +kerning first=119 second=187 amount=-1 +kerning first=302 second=281 amount=-1 +kerning first=213 second=73 amount=-1 +kerning first=366 second=369 amount=-1 +kerning first=233 second=347 amount=-1 +kerning first=202 second=8221 amount=-1 +kerning first=258 second=369 amount=-1 +kerning first=356 second=235 amount=-1 +kerning first=262 second=8218 amount=-1 +kerning first=1052 second=1069 amount=-1 +kerning first=364 second=97 amount=-1 +kerning first=107 second=287 amount=-1 +kerning first=67 second=350 amount=-1 +kerning first=313 second=86 amount=-1 +kerning first=272 second=198 amount=-1 +kerning first=89 second=283 amount=-1 +kerning first=8222 second=219 amount=-1 +kerning first=226 second=231 amount=-1 +kerning first=210 second=351 amount=-1 +kerning first=262 second=231 amount=-1 +kerning first=325 second=277 amount=-1 +kerning first=281 second=363 amount=-1 +kerning first=1036 second=1072 amount=-1 +kerning first=289 second=277 amount=-1 +kerning first=86 second=290 amount=-1 +kerning first=289 second=104 amount=-1 +kerning first=354 second=351 amount=-1 +kerning first=217 second=277 amount=-1 +kerning first=344 second=338 amount=-1 +kerning first=86 second=244 amount=-1 +kerning first=1051 second=1081 amount=-1 +kerning first=374 second=283 amount=-1 +kerning first=266 second=355 amount=-1 +kerning first=227 second=244 amount=-1 +kerning first=266 second=283 amount=-1 +kerning first=200 second=338 amount=-1 +kerning first=298 second=231 amount=-1 +kerning first=263 second=244 amount=-1 +kerning first=302 second=283 amount=-1 +kerning first=253 second=8249 amount=-1 +kerning first=289 second=8249 amount=-1 +kerning first=370 second=231 amount=-1 +kerning first=194 second=354 amount=-1 +kerning first=1039 second=1065 amount=-1 +kerning first=325 second=8249 amount=-1 +kerning first=67 second=79 amount=-1 +kerning first=78 second=345 amount=-1 +kerning first=67 second=66 amount=-1 +kerning first=85 second=196 amount=-1 +kerning first=258 second=79 amount=-1 +kerning first=278 second=8220 amount=-1 +kerning first=248 second=46 amount=-1 +kerning first=268 second=332 amount=-1 +kerning first=334 second=196 amount=-1 +kerning first=374 second=367 amount=-1 +kerning first=88 second=371 amount=-1 +kerning first=255 second=345 amount=-1 +kerning first=259 second=235 amount=-1 +kerning first=370 second=196 amount=-1 +kerning first=338 second=367 amount=-1 +kerning first=196 second=332 amount=-1 +kerning first=193 second=371 amount=-1 +kerning first=327 second=345 amount=-1 +kerning first=363 second=345 amount=-1 +kerning first=121 second=380 amount=-1 +kerning first=367 second=235 amount=-1 +kerning first=230 second=367 amount=-1 +kerning first=85 second=380 amount=-1 +kerning first=194 second=367 amount=-1 +kerning first=211 second=274 amount=-1 +kerning first=1042 second=1091 amount=-1 +kerning first=226 second=380 amount=-1 +kerning first=85 second=368 amount=-1 +kerning first=66 second=70 amount=-1 +kerning first=304 second=332 amount=-1 +kerning first=352 second=66 amount=-1 +kerning first=298 second=380 amount=-1 +kerning first=330 second=79 amount=-1 +kerning first=280 second=66 amount=-1 +kerning first=105 second=287 amount=-1 +kerning first=85 second=226 amount=-1 +kerning first=366 second=79 amount=-1 +kerning first=370 second=380 amount=-1 +kerning first=284 second=270 amount=-1 +kerning first=204 second=209 amount=-1 +kerning first=1056 second=1080 amount=-1 +kerning first=204 second=336 amount=-1 +kerning first=89 second=367 amount=-1 +kerning first=86 second=192 amount=-1 +kerning first=217 second=323 amount=-1 +kerning first=327 second=99 amount=-1 +kerning first=269 second=44 amount=-1 +kerning first=200 second=252 amount=-1 +kerning first=110 second=231 amount=-1 +kerning first=1049 second=1045 amount=-1 +kerning first=205 second=205 amount=-1 +kerning first=268 second=355 amount=-1 +kerning first=97 second=244 amount=-1 +kerning first=195 second=119 amount=-1 +kerning first=278 second=201 amount=-1 +kerning first=1070 second=1063 amount=-1 +kerning first=274 second=214 amount=-1 +kerning first=66 second=327 amount=-1 +kerning first=206 second=201 amount=-1 +kerning first=346 second=76 amount=-1 +kerning first=202 second=214 amount=-1 +kerning first=207 second=327 amount=-1 +kerning first=201 second=218 amount=-1 +kerning first=197 second=44 amount=-1 +kerning first=233 second=44 amount=-1 +kerning first=257 second=8217 amount=-2 +kerning first=251 second=231 amount=-1 +kerning first=115 second=314 amount=-1 +kerning first=8217 second=246 amount=-1 +kerning first=310 second=214 amount=-1 +kerning first=339 second=106 amount=-1 +kerning first=289 second=353 amount=-1 +kerning first=375 second=106 amount=-1 +kerning first=1048 second=1049 amount=-1 +kerning first=257 second=243 amount=-1 +kerning first=253 second=353 amount=-1 +kerning first=82 second=45 amount=-1 +kerning first=325 second=223 amount=-1 +kerning first=365 second=243 amount=-1 +kerning first=8249 second=346 amount=-1 +kerning first=289 second=223 amount=-1 +kerning first=325 second=353 amount=-1 +kerning first=80 second=353 amount=-1 +kerning first=231 second=106 amount=-1 +kerning first=259 second=45 amount=-1 +kerning first=267 second=106 amount=-1 +kerning first=75 second=114 amount=-1 +kerning first=263 second=249 amount=-1 +kerning first=118 second=45 amount=-1 +kerning first=105 second=275 amount=-1 +kerning first=80 second=80 amount=-1 +kerning first=1078 second=1097 amount=-1 +kerning first=367 second=45 amount=-1 +kerning first=1091 second=1114 amount=-1 +kerning first=195 second=363 amount=-1 +kerning first=231 second=363 amount=-1 +kerning first=307 second=275 amount=-1 +kerning first=1050 second=1054 amount=-1 +kerning first=78 second=101 amount=-1 +kerning first=217 second=223 amount=-1 +kerning first=80 second=243 amount=-1 +kerning first=203 second=370 amount=-1 +kerning first=339 second=363 amount=-1 +kerning first=217 second=353 amount=-1 +kerning first=280 second=325 amount=-1 +kerning first=363 second=8220 amount=-1 +kerning first=375 second=363 amount=-1 +kerning first=1042 second=1097 amount=-1 +kerning first=212 second=87 amount=-1 +kerning first=73 second=362 amount=-1 +kerning first=219 second=101 amount=-1 +kerning first=368 second=234 amount=-1 +kerning first=250 second=232 amount=-1 +kerning first=214 second=362 amount=-1 +kerning first=327 second=101 amount=-1 +kerning first=298 second=226 amount=-1 +kerning first=291 second=101 amount=-1 +kerning first=286 second=362 amount=-1 +kerning first=370 second=226 amount=-1 +kerning first=363 second=101 amount=-1 +kerning first=268 second=8250 amount=-1 +kerning first=365 second=245 amount=-1 +kerning first=8218 second=245 amount=-1 +kerning first=67 second=296 amount=-1 +kerning first=1068 second=1098 amount=-1 +kerning first=364 second=241 amount=-1 +kerning first=72 second=266 amount=-1 +kerning first=103 second=283 amount=-1 +kerning first=70 second=217 amount=-1 +kerning first=280 second=296 amount=-1 +kerning first=86 second=249 amount=-1 +kerning first=1099 second=1095 amount=-1 +kerning first=67 second=283 amount=-1 +kerning first=211 second=217 amount=-1 +kerning first=218 second=334 amount=-1 +kerning first=109 second=232 amount=-1 +kerning first=224 second=234 amount=-1 +kerning first=73 second=232 amount=-1 +kerning first=296 second=71 amount=-1 +kerning first=230 second=242 amount=-1 +kerning first=296 second=234 amount=-1 +kerning first=106 second=111 amount=-1 +kerning first=229 second=287 amount=-1 +kerning first=201 second=8220 amount=-1 +kerning first=286 second=72 amount=-1 +kerning first=1069 second=1070 amount=-1 +kerning first=214 second=72 amount=-1 +kerning first=1033 second=1070 amount=-1 +kerning first=104 second=283 amount=-1 +kerning first=381 second=8220 amount=-1 +kerning first=283 second=111 amount=-1 +kerning first=75 second=8218 amount=-1 +kerning first=337 second=287 amount=-1 +kerning first=263 second=105 amount=-1 +kerning first=355 second=111 amount=-1 +kerning first=101 second=46 amount=-1 +kerning first=171 second=83 amount=-1 +kerning first=219 second=370 amount=-1 +kerning first=207 second=83 amount=-1 +kerning first=271 second=244 amount=-1 +kerning first=350 second=114 amount=-1 +kerning first=1055 second=1041 amount=-1 +kerning first=187 second=286 amount=-1 +kerning first=275 second=267 amount=-1 +kerning first=8216 second=196 amount=-2 +kerning first=85 second=378 amount=-1 +kerning first=70 second=111 amount=-1 +kerning first=70 second=81 amount=-1 +kerning first=210 second=115 amount=-1 +kerning first=206 second=114 amount=-1 +kerning first=268 second=102 amount=-1 +kerning first=304 second=278 amount=-1 +kerning first=1044 second=1092 amount=-1 +kerning first=87 second=74 amount=-1 +kerning first=268 second=278 amount=-1 +kerning first=278 second=114 amount=-1 +kerning first=83 second=200 amount=-1 +kerning first=8217 second=192 amount=-2 +kerning first=99 second=263 amount=-1 +kerning first=101 second=114 amount=-1 +kerning first=204 second=263 amount=-1 +kerning first=259 second=242 amount=-1 +kerning first=1066 second=1079 amount=-1 +kerning first=65 second=114 amount=-1 +kerning first=240 second=263 amount=-1 +kerning first=1044 second=1116 amount=-1 +kerning first=370 second=117 amount=-1 +kerning first=187 second=365 amount=-1 +kerning first=206 second=331 amount=-1 +kerning first=354 second=115 amount=-1 +kerning first=199 second=310 amount=-1 +kerning first=73 second=72 amount=-1 +kerning first=270 second=203 amount=-1 +kerning first=118 second=365 amount=-1 +kerning first=368 second=361 amount=-1 +kerning first=325 second=269 amount=-1 +kerning first=323 second=68 amount=-1 +kerning first=1070 second=1036 amount=-1 +kerning first=77 second=78 amount=-1 +kerning first=1034 second=1036 amount=-1 +kerning first=323 second=334 amount=-1 +kerning first=218 second=78 amount=-1 +kerning first=367 second=99 amount=-1 +kerning first=1043 second=1071 amount=-1 +kerning first=368 second=288 amount=-1 +kerning first=364 second=355 amount=-1 +kerning first=1041 second=1101 amount=-1 +kerning first=248 second=380 amount=-1 +kerning first=201 second=266 amount=-1 +kerning first=1042 second=1043 amount=-1 +kerning first=296 second=288 amount=-1 +kerning first=1034 second=1070 amount=-1 +kerning first=8250 second=71 amount=-1 +kerning first=79 second=260 amount=-1 +kerning first=194 second=199 amount=-1 +kerning first=228 second=318 amount=-1 +kerning first=84 second=230 amount=-1 +kerning first=220 second=260 amount=-1 +kerning first=1107 second=1082 amount=-1 +kerning first=1105 second=1094 amount=-1 +kerning first=200 second=325 amount=-1 +kerning first=363 second=291 amount=-1 +kerning first=338 second=357 amount=-1 +kerning first=364 second=260 amount=-1 +kerning first=272 second=325 amount=-1 +kerning first=291 second=291 amount=-1 +kerning first=315 second=218 amount=-1 +kerning first=337 second=187 amount=-1 +kerning first=255 second=291 amount=-1 +kerning first=334 second=8220 amount=-2 +kerning first=198 second=367 amount=-1 +kerning first=281 second=279 amount=-1 +kerning first=1036 second=1085 amount=-1 +kerning first=87 second=245 amount=-1 +kerning first=72 second=212 amount=-1 +kerning first=103 second=337 amount=-1 +kerning first=67 second=337 amount=-1 +kerning first=264 second=8217 amount=-1 +kerning first=277 second=251 amount=-1 +kerning first=363 second=114 amount=-1 +kerning first=336 second=8217 amount=-2 +kerning first=104 second=269 amount=-1 +kerning first=220 second=68 amount=-1 +kerning first=334 second=195 amount=-1 +kerning first=103 second=242 amount=-1 +kerning first=187 second=75 amount=-1 +kerning first=209 second=279 amount=-1 +kerning first=193 second=187 amount=-1 +kerning first=1053 second=1119 amount=-1 +kerning first=229 second=187 amount=-1 +kerning first=1071 second=1057 amount=-1 +kerning first=208 second=8218 amount=-1 +kerning first=104 second=279 amount=-1 +kerning first=88 second=187 amount=-1 +kerning first=67 second=242 amount=-1 +kerning first=74 second=334 amount=-1 +kerning first=289 second=316 amount=-1 +kerning first=1067 second=1056 amount=-1 +kerning first=366 second=347 amount=-1 +kerning first=316 second=242 amount=-1 +kerning first=346 second=73 amount=-1 +kerning first=205 second=281 amount=-1 +kerning first=86 second=268 amount=-1 +kerning first=1053 second=1043 amount=-1 +kerning first=241 second=281 amount=-1 +kerning first=370 second=334 amount=-1 +kerning first=330 second=347 amount=-1 +kerning first=277 second=281 amount=-1 +kerning first=8222 second=375 amount=-1 +kerning first=356 second=99 amount=-1 +kerning first=70 second=325 amount=-1 +kerning first=1071 second=1089 amount=-1 +kerning first=89 second=229 amount=-1 +kerning first=310 second=290 amount=-1 +kerning first=211 second=325 amount=-1 +kerning first=213 second=115 amount=-1 +kerning first=81 second=347 amount=-1 +kerning first=218 second=366 amount=-1 +kerning first=313 second=8217 amount=-1 +kerning first=264 second=264 amount=-1 +kerning first=202 second=73 amount=-1 +kerning first=69 second=202 amount=-1 +kerning first=1056 second=1083 amount=-1 +kerning first=274 second=296 amount=-1 +kerning first=192 second=264 amount=-1 +kerning first=229 second=233 amount=-1 +kerning first=274 second=73 amount=-1 +kerning first=100 second=281 amount=-1 +kerning first=217 second=82 amount=-1 +kerning first=87 second=264 amount=-1 +kerning first=289 second=8217 amount=-2 +kerning first=355 second=101 amount=-1 +kerning first=268 second=337 amount=-1 +kerning first=77 second=283 amount=-1 +kerning first=1064 second=1065 amount=-1 +kerning first=1050 second=1117 amount=-1 +kerning first=206 second=277 amount=-1 +kerning first=112 second=8217 amount=-2 +kerning first=335 second=108 amount=-1 +kerning first=8250 second=212 amount=-1 +kerning first=1068 second=1052 amount=-1 +kerning first=202 second=290 amount=-1 +kerning first=203 second=69 amount=-1 +kerning first=227 second=108 amount=-1 +kerning first=101 second=277 amount=-1 +kerning first=198 second=69 amount=-1 +kerning first=217 second=8217 amount=-1 +kerning first=1038 second=1091 amount=-1 +kerning first=263 second=108 amount=-1 +kerning first=274 second=290 amount=-1 +kerning first=253 second=8217 amount=-2 +kerning first=85 second=334 amount=-1 +kerning first=268 second=224 amount=-1 +kerning first=1049 second=1092 amount=-1 +kerning first=220 second=355 amount=-1 +kerning first=116 second=351 amount=-1 +kerning first=1041 second=1053 amount=-1 +kerning first=1060 second=1113 amount=-1 +kerning first=80 second=351 amount=-1 +kerning first=119 second=291 amount=-1 +kerning first=290 second=78 amount=-1 +kerning first=200 second=220 amount=-1 +kerning first=262 second=334 amount=-1 +kerning first=217 second=282 amount=-1 +kerning first=298 second=334 amount=-1 +kerning first=362 second=78 amount=-1 +kerning first=203 second=286 amount=-1 +kerning first=364 second=233 amount=-1 +kerning first=221 second=351 amount=-1 +kerning first=104 second=333 amount=-1 +kerning first=1048 second=1095 amount=-1 +kerning first=114 second=229 amount=-1 +kerning first=328 second=171 amount=-1 +kerning first=8218 second=318 amount=-1 +kerning first=364 second=209 amount=-1 +kerning first=364 second=171 amount=-2 +kerning first=219 second=229 amount=-1 +kerning first=1084 second=1095 amount=-1 +kerning first=281 second=333 amount=-1 +kerning first=68 second=203 amount=-1 +kerning first=291 second=122 amount=-1 +kerning first=209 second=333 amount=-1 +kerning first=78 second=229 amount=-1 +kerning first=344 second=290 amount=-1 +kerning first=83 second=117 amount=-1 +kerning first=1043 second=1074 amount=-1 +kerning first=209 second=203 amount=-1 +kerning first=321 second=374 amount=-1 +kerning first=213 second=374 amount=-1 +kerning first=229 second=263 amount=-1 +kerning first=1053 second=1100 amount=-1 +kerning first=76 second=8217 amount=-1 +kerning first=327 second=229 amount=-1 +kerning first=115 second=171 amount=-1 +kerning first=79 second=206 amount=-1 +kerning first=296 second=212 amount=-1 +kerning first=1034 second=1039 amount=-1 +kerning first=274 second=298 amount=-1 +kerning first=278 second=203 amount=-1 +kerning first=1054 second=1042 amount=-1 +kerning first=278 second=213 amount=-1 +kerning first=220 second=171 amount=-2 +kerning first=225 second=335 amount=-1 +kerning first=368 second=117 amount=-1 +kerning first=262 second=104 amount=-1 +kerning first=256 second=171 amount=-1 +kerning first=1028 second=1097 amount=-1 +kerning first=68 second=368 amount=-1 +kerning first=258 second=220 amount=-1 +kerning first=323 second=304 amount=-1 +kerning first=370 second=109 amount=-1 +kerning first=324 second=246 amount=-1 +kerning first=366 second=220 amount=-1 +kerning first=283 second=382 amount=-1 +kerning first=330 second=220 amount=-1 +kerning first=364 second=206 amount=-1 +kerning first=74 second=304 amount=-1 +kerning first=8218 second=375 amount=-1 +kerning first=1051 second=1086 amount=-1 +kerning first=252 second=246 amount=-1 +kerning first=1043 second=1095 amount=-1 +kerning first=1030 second=1060 amount=-1 +kerning first=81 second=220 amount=-1 +kerning first=86 second=8221 amount=-1 +kerning first=122 second=8221 amount=-1 +kerning first=249 second=103 amount=-1 +kerning first=244 second=120 amount=-1 +kerning first=219 second=46 amount=-2 +kerning first=1067 second=1048 amount=-1 +kerning first=82 second=220 amount=-1 +kerning first=1051 second=1051 amount=-1 +kerning first=216 second=8218 amount=-1 +kerning first=263 second=8221 amount=-2 +kerning first=108 second=103 amount=-1 +kerning first=8250 second=204 amount=-1 +kerning first=207 second=211 amount=-1 +kerning first=85 second=109 amount=-1 +kerning first=111 second=8218 amount=-1 +kerning first=105 second=255 amount=-1 +kerning first=266 second=313 amount=-1 +kerning first=234 second=365 amount=-1 +kerning first=298 second=109 amount=-1 +kerning first=1056 second=1034 amount=-1 +kerning first=302 second=313 amount=-1 +kerning first=338 second=313 amount=-1 +kerning first=66 second=211 amount=-1 +kerning first=70 second=382 amount=-1 +kerning first=221 second=199 amount=-1 +kerning first=198 second=365 amount=-1 +kerning first=262 second=109 amount=-1 +kerning first=317 second=368 amount=-1 +kerning first=201 second=85 amount=-1 +kerning first=278 second=223 amount=-1 +kerning first=8222 second=365 amount=-1 +kerning first=206 second=223 amount=-1 +kerning first=85 second=280 amount=-1 +kerning first=264 second=210 amount=-1 +kerning first=1070 second=1053 amount=-1 +kerning first=288 second=304 amount=-1 +kerning first=269 second=98 amount=-1 +kerning first=192 second=210 amount=-1 +kerning first=1046 second=1057 amount=-1 +kerning first=233 second=98 amount=-1 +kerning first=262 second=280 amount=-1 +kerning first=197 second=98 amount=-1 +kerning first=210 second=256 amount=-1 +kerning first=87 second=210 amount=-1 +kerning first=1078 second=1092 amount=-1 +kerning first=241 second=335 amount=-1 +kerning first=334 second=280 amount=-1 +kerning first=1036 second=1077 amount=-1 +kerning first=99 second=122 amount=-1 +kerning first=205 second=335 amount=-1 +kerning first=72 second=380 amount=-1 +kerning first=201 second=302 amount=-1 +kerning first=277 second=335 amount=-1 +kerning first=370 second=280 amount=-1 +kerning first=268 second=243 amount=-1 +kerning first=282 second=371 amount=-1 +kerning first=315 second=219 amount=-1 +kerning first=232 second=243 amount=-1 +kerning first=65 second=223 amount=-1 +kerning first=99 second=339 amount=-1 +kerning first=8217 second=268 amount=-1 +kerning first=70 second=271 amount=-1 +kerning first=240 second=339 amount=-1 +kerning first=304 second=243 amount=-1 +kerning first=1070 second=1047 amount=-1 +kerning first=204 second=339 amount=-1 +kerning first=346 second=298 amount=-1 +kerning first=8222 second=224 amount=-1 +kerning first=272 second=89 amount=-1 +kerning first=214 second=198 amount=-1 +kerning first=171 second=219 amount=-1 +kerning first=278 second=8249 amount=-1 +kerning first=330 second=76 amount=-1 +kerning first=314 second=8249 amount=-1 +kerning first=66 second=219 amount=-1 +kerning first=75 second=213 amount=-1 +kerning first=210 second=323 amount=-1 +kerning first=364 second=363 amount=-1 +kerning first=1070 second=1039 amount=-1 +kerning first=8218 second=264 amount=-1 +kerning first=275 second=232 amount=-1 +kerning first=344 second=89 amount=-1 +kerning first=45 second=76 amount=-1 +kerning first=100 second=335 amount=-1 +kerning first=81 second=76 amount=-1 +kerning first=235 second=234 amount=-1 +kerning first=8217 second=112 amount=-1 +kerning first=118 second=289 amount=-1 +kerning first=199 second=234 amount=-1 +kerning first=259 second=289 amount=-1 +kerning first=218 second=241 amount=-1 +kerning first=307 second=234 amount=-1 +kerning first=202 second=344 amount=-1 +kerning first=223 second=289 amount=-1 +kerning first=291 second=98 amount=-1 +kerning first=271 second=234 amount=-1 +kerning first=8250 second=355 amount=-1 +kerning first=74 second=120 amount=-1 +kerning first=65 second=8249 amount=-1 +kerning first=274 second=344 amount=-1 +kerning first=313 second=354 amount=-1 +kerning first=1058 second=1075 amount=-1 +kerning first=99 second=228 amount=-1 +kerning first=362 second=241 amount=-1 +kerning first=346 second=344 amount=-1 +kerning first=367 second=289 amount=-1 +kerning first=81 second=274 amount=-1 +kerning first=193 second=46 amount=-1 +kerning first=1071 second=1091 amount=-1 +kerning first=187 second=216 amount=-1 +kerning first=1071 second=1108 amount=-1 +kerning first=45 second=274 amount=-1 +kerning first=296 second=204 amount=-1 +kerning first=213 second=366 amount=-1 +kerning first=369 second=113 amount=-1 +kerning first=72 second=366 amount=-1 +kerning first=337 second=46 amount=-1 +kerning first=80 second=332 amount=-1 +kerning first=1034 second=1038 amount=-2 +kerning first=197 second=79 amount=-1 +kerning first=363 second=283 amount=-1 +kerning first=1091 second=1084 amount=-1 +kerning first=1075 second=1087 amount=-1 +kerning first=364 second=225 amount=-1 +kerning first=1055 second=1084 amount=-1 +kerning first=330 second=274 amount=-1 +kerning first=221 second=332 amount=-1 +kerning first=366 second=274 amount=-1 +kerning first=75 second=357 amount=-1 +kerning first=86 second=195 amount=-1 +kerning first=287 second=250 amount=-1 +kerning first=264 second=104 amount=-1 +kerning first=321 second=366 amount=-1 +kerning first=88 second=46 amount=-1 +kerning first=366 second=76 amount=-1 +kerning first=82 second=216 amount=-1 +kerning first=192 second=104 amount=-1 +kerning first=77 second=70 amount=-1 +kerning first=352 second=207 amount=-1 +kerning first=197 second=369 amount=-1 +kerning first=302 second=259 amount=-1 +kerning first=1051 second=1105 amount=-1 +kerning first=8250 second=345 amount=-1 +kerning first=203 second=213 amount=-1 +kerning first=234 second=311 amount=-1 +kerning first=1047 second=1053 amount=-1 +kerning first=121 second=347 amount=-1 +kerning first=240 second=122 amount=-1 +kerning first=278 second=323 amount=-1 +kerning first=8217 second=122 amount=-1 +kerning first=290 second=70 amount=-1 +kerning first=283 second=271 amount=-1 +kerning first=206 second=323 amount=-1 +kerning first=269 second=369 amount=-1 +kerning first=204 second=122 amount=-1 +kerning first=374 second=259 amount=-1 +kerning first=70 second=198 amount=-1 +kerning first=233 second=369 amount=-1 +kerning first=225 second=113 amount=-1 +kerning first=83 second=204 amount=-1 +kerning first=356 second=378 amount=-1 +kerning first=261 second=113 amount=-1 +kerning first=287 second=8222 amount=-1 +kerning first=350 second=323 amount=-1 +kerning first=80 second=83 amount=-1 +kerning first=67 second=207 amount=-1 +kerning first=248 second=378 amount=-1 +kerning first=1048 second=1041 amount=-1 +kerning first=198 second=75 amount=-1 +kerning first=72 second=46 amount=-1 +kerning first=1038 second=1099 amount=-1 +kerning first=84 second=113 amount=-1 +kerning first=281 second=116 amount=-1 +kerning first=280 second=207 amount=-1 +kerning first=89 second=259 amount=-1 +kerning first=89 second=197 amount=-1 +kerning first=8217 second=249 amount=-1 +kerning first=209 second=116 amount=-1 +kerning first=328 second=119 amount=-1 +kerning first=278 second=116 amount=-1 +kerning first=85 second=201 amount=-1 +kerning first=88 second=366 amount=-1 +kerning first=78 second=113 amount=-1 +kerning first=245 second=314 amount=-1 +kerning first=206 second=116 amount=-1 +kerning first=204 second=204 amount=-1 +kerning first=1057 second=1081 amount=-1 +kerning first=101 second=271 amount=-1 +kerning first=74 second=363 amount=-1 +kerning first=105 second=253 amount=-1 +kerning first=355 second=259 amount=-1 +kerning first=353 second=314 amount=-1 +kerning first=1071 second=1084 amount=-1 +kerning first=281 second=314 amount=-1 +kerning first=268 second=110 amount=-1 +kerning first=287 second=363 amount=-1 +kerning first=332 second=187 amount=-1 +kerning first=327 second=113 amount=-1 +kerning first=209 second=67 amount=-1 +kerning first=368 second=256 amount=-1 +kerning first=363 second=113 amount=-1 +kerning first=69 second=82 amount=-1 +kerning first=101 second=116 amount=-1 +kerning first=75 second=369 amount=-1 +kerning first=70 second=259 amount=-1 +kerning first=65 second=116 amount=-1 +kerning first=291 second=113 amount=-1 +kerning first=268 second=317 amount=-1 +kerning first=193 second=366 amount=-1 +kerning first=8218 second=240 amount=-1 +kerning first=74 second=196 amount=-1 +kerning first=73 second=210 amount=-1 +kerning first=219 second=113 amount=-1 +kerning first=87 second=213 amount=-1 +kerning first=103 second=101 amount=-1 +kerning first=282 second=73 amount=-1 +kerning first=8217 second=234 amount=-1 +kerning first=67 second=101 amount=-1 +kerning first=366 second=271 amount=-1 +kerning first=119 second=254 amount=-1 +kerning first=207 second=302 amount=-1 +kerning first=330 second=271 amount=-1 +kerning first=66 second=302 amount=-1 +kerning first=274 second=219 amount=-1 +kerning first=310 second=219 amount=-1 +kerning first=116 second=8250 amount=-1 +kerning first=199 second=268 amount=-1 +kerning first=202 second=219 amount=-1 +kerning first=243 second=8220 amount=-2 +kerning first=80 second=8250 amount=-1 +kerning first=316 second=101 amount=-1 +kerning first=279 second=122 amount=-1 +kerning first=259 second=277 amount=-1 +kerning first=1038 second=1113 amount=-1 +kerning first=198 second=262 amount=-1 +kerning first=339 second=311 amount=-1 +kerning first=69 second=73 amount=-1 +kerning first=323 second=317 amount=-1 +kerning first=207 second=122 amount=-1 +kerning first=203 second=290 amount=-1 +kerning first=375 second=311 amount=-1 +kerning first=243 second=122 amount=-1 +kerning first=267 second=311 amount=-1 +kerning first=281 second=380 amount=-1 +kerning first=68 second=218 amount=-1 +kerning first=367 second=277 amount=-1 +kerning first=195 second=311 amount=-1 +kerning first=98 second=345 amount=-1 +kerning first=1047 second=1102 amount=-1 +kerning first=231 second=311 amount=-1 +kerning first=210 second=73 amount=-1 +kerning first=66 second=122 amount=-1 +kerning first=234 second=235 amount=-1 +kerning first=296 second=283 amount=-1 +kerning first=268 second=290 amount=-1 +kerning first=8218 second=267 amount=-1 +kerning first=304 second=290 amount=-1 +kerning first=224 second=283 amount=-1 +kerning first=198 second=82 amount=-1 +kerning first=187 second=82 amount=-1 +kerning first=305 second=114 amount=-1 +kerning first=245 second=287 amount=-1 +kerning first=195 second=338 amount=-1 +kerning first=270 second=82 amount=-1 +kerning first=68 second=8222 amount=-1 +kerning first=104 second=287 amount=-1 +kerning first=315 second=8220 amount=-1 +kerning first=204 second=351 amount=-1 +kerning first=353 second=287 amount=-1 +kerning first=1053 second=1031 amount=-1 +kerning first=1044 second=1091 amount=-1 +kerning first=100 second=187 amount=-1 +kerning first=99 second=351 amount=-1 +kerning first=281 second=287 amount=-1 +kerning first=262 second=278 amount=-1 +kerning first=1076 second=1095 amount=-1 +kerning first=327 second=347 amount=-1 +kerning first=304 second=83 amount=-1 +kerning first=70 second=286 amount=-1 +kerning first=219 second=347 amount=-1 +kerning first=368 second=283 amount=-1 +kerning first=196 second=290 amount=-1 +kerning first=255 second=347 amount=-1 +kerning first=8217 second=81 amount=-1 +kerning first=347 second=171 amount=-1 +kerning first=267 second=104 amount=-1 +kerning first=187 second=70 amount=-1 +kerning first=228 second=333 amount=-1 +kerning first=1052 second=1099 amount=-1 +kerning first=87 second=333 amount=-1 +kerning first=195 second=104 amount=-1 +kerning first=117 second=244 amount=-1 +kerning first=80 second=278 amount=-1 +kerning first=231 second=104 amount=-1 +kerning first=272 second=274 amount=-1 +kerning first=1068 second=1101 amount=-1 +kerning first=264 second=333 amount=-1 +kerning first=278 second=280 amount=-1 +kerning first=330 second=244 amount=-1 +kerning first=1030 second=1094 amount=-1 +kerning first=366 second=244 amount=-1 +kerning first=259 second=8217 amount=-2 +kerning first=240 second=231 amount=-1 +kerning first=334 second=201 amount=-1 +kerning first=370 second=201 amount=-1 +kerning first=212 second=195 amount=-1 +kerning first=262 second=201 amount=-1 +kerning first=203 second=171 amount=-1 +kerning first=298 second=201 amount=-1 +kerning first=315 second=89 amount=-1 +kerning first=8250 second=310 amount=-1 +kerning first=339 second=104 amount=-1 +kerning first=99 second=231 amount=-1 +kerning first=311 second=171 amount=-1 +kerning first=354 second=100 amount=-1 +kerning first=287 second=316 amount=-1 +kerning first=374 second=71 amount=-1 +kerning first=305 second=269 amount=-1 +kerning first=1065 second=1088 amount=-1 +kerning first=280 second=362 amount=-1 +kerning first=338 second=71 amount=-1 +kerning first=283 second=106 amount=-1 +kerning first=79 second=65 amount=-1 +kerning first=98 second=318 amount=-1 +kerning first=233 second=269 amount=-1 +kerning first=352 second=362 amount=-1 +kerning first=80 second=120 amount=-1 +kerning first=219 second=266 amount=-1 +kerning first=8217 second=288 amount=-1 +kerning first=368 second=310 amount=-1 +kerning first=327 second=200 amount=-1 +kerning first=89 second=245 amount=-1 +kerning first=220 second=65 amount=-1 +kerning first=296 second=310 amount=-1 +kerning first=275 second=318 amount=-1 +kerning first=78 second=266 amount=-1 +kerning first=311 second=318 amount=-1 +kerning first=347 second=318 amount=-1 +kerning first=223 second=8222 amount=-1 +kerning first=364 second=65 amount=-1 +kerning first=68 second=260 amount=-1 +kerning first=67 second=362 amount=-1 +kerning first=118 second=8222 amount=-1 +kerning first=82 second=370 amount=-1 +kerning first=203 second=45 amount=-1 +kerning first=199 second=214 amount=-1 +kerning first=82 second=8222 amount=-1 +kerning first=207 second=275 amount=-1 +kerning first=194 second=71 amount=-1 +kerning first=103 second=231 amount=-1 +kerning first=69 second=199 amount=-1 +kerning first=279 second=275 amount=-1 +kerning first=311 second=45 amount=-1 +kerning first=89 second=71 amount=-1 +kerning first=347 second=45 amount=-1 +kerning first=196 second=371 amount=-1 +kerning first=354 second=226 amount=-1 +kerning first=235 second=8221 amount=-2 +kerning first=82 second=223 amount=-1 +kerning first=45 second=217 amount=-1 +kerning first=86 second=234 amount=-1 +kerning first=227 second=234 amount=-1 +kerning first=364 second=380 amount=-1 +kerning first=219 second=200 amount=-1 +kerning first=258 second=217 amount=-1 +kerning first=355 second=232 amount=-1 +kerning first=110 second=243 amount=-1 +kerning first=251 second=243 amount=-1 +kerning first=221 second=251 amount=-1 +kerning first=78 second=200 amount=-1 +kerning first=330 second=217 amount=-1 +kerning first=283 second=232 amount=-1 +kerning first=226 second=8220 amount=-2 +kerning first=323 second=243 amount=-1 +kerning first=327 second=266 amount=-1 +kerning first=287 second=243 amount=-1 +kerning first=65 second=89 amount=-1 +kerning first=203 second=345 amount=-1 +kerning first=70 second=232 amount=-1 +kerning first=241 second=8221 amount=-2 +kerning first=103 second=335 amount=-1 +kerning first=214 second=8250 amount=-1 +kerning first=275 second=345 amount=-1 +kerning first=277 second=8221 amount=-2 +kerning first=70 second=352 amount=-1 +kerning first=1054 second=1037 amount=-1 +kerning first=313 second=8221 amount=-1 +kerning first=305 second=242 amount=-1 +kerning first=310 second=105 amount=-1 +kerning first=233 second=242 amount=-1 +kerning first=283 second=99 amount=-1 +kerning first=203 second=72 amount=-1 +kerning first=269 second=242 amount=-1 +kerning first=106 second=232 amount=-1 +kerning first=304 second=344 amount=-1 +kerning first=199 second=241 amount=-1 +kerning first=268 second=344 amount=-1 +kerning first=263 second=234 amount=-1 +kerning first=194 second=98 amount=-1 +kerning first=74 second=336 amount=-1 +kerning first=1046 second=1096 amount=-1 +kerning first=104 second=233 amount=-1 +kerning first=87 second=267 amount=-1 +kerning first=368 second=284 amount=-1 +kerning first=67 second=335 amount=-1 +kerning first=87 second=229 amount=-1 +kerning first=266 second=98 amount=-1 +kerning first=323 second=336 amount=-1 +kerning first=281 second=233 amount=-1 +kerning first=218 second=80 amount=-1 +kerning first=99 second=378 amount=-1 +kerning first=1033 second=1045 amount=-1 +kerning first=298 second=114 amount=-1 +kerning first=209 second=233 amount=-1 +kerning first=210 second=46 amount=-1 +kerning first=282 second=199 amount=-1 +kerning first=77 second=80 amount=-1 +kerning first=323 second=216 amount=-1 +kerning first=1069 second=1045 amount=-1 +kerning first=362 second=80 amount=-1 +kerning first=240 second=378 amount=-1 +kerning first=121 second=114 amount=-1 +kerning first=1040 second=1094 amount=-1 +kerning first=290 second=80 amount=-1 +kerning first=204 second=378 amount=-1 +kerning first=354 second=46 amount=-1 +kerning first=366 second=268 amount=-1 +kerning first=226 second=114 amount=-1 +kerning first=1042 second=1046 amount=-1 +kerning first=8250 second=364 amount=-1 +kerning first=80 second=224 amount=-1 +kerning first=195 second=284 amount=-1 +kerning first=289 second=318 amount=-1 +kerning first=228 second=108 amount=-1 +kerning first=85 second=114 amount=-1 +kerning first=362 second=327 amount=-1 +kerning first=8217 second=261 amount=-1 +kerning first=83 second=310 amount=-1 +kerning first=220 second=353 amount=-1 +kerning first=199 second=115 amount=-1 +kerning first=74 second=216 amount=-1 +kerning first=356 second=115 amount=-1 +kerning first=235 second=115 amount=-1 +kerning first=187 second=250 amount=-1 +kerning first=100 second=8221 amount=-1 +kerning first=85 second=290 amount=-1 +kerning first=118 second=250 amount=-1 +kerning first=221 second=224 amount=-1 +kerning first=364 second=353 amount=-1 +kerning first=274 second=78 amount=-1 +kerning first=277 second=44 amount=-1 +kerning first=86 second=273 amount=-1 +kerning first=80 second=45 amount=-1 +kerning first=346 second=78 amount=-1 +kerning first=71 second=8249 amount=-1 +kerning first=1051 second=1098 amount=-1 +kerning first=107 second=8249 amount=-1 +kerning first=100 second=283 amount=-1 +kerning first=200 second=355 amount=-1 +kerning first=330 second=352 amount=-1 +kerning first=323 second=282 amount=-1 +kerning first=284 second=8249 amount=-1 +kerning first=366 second=352 amount=-1 +kerning first=199 second=8220 amount=-1 +kerning first=264 second=72 amount=-1 +kerning first=362 second=248 amount=-1 +kerning first=1052 second=1104 amount=-1 +kerning first=326 second=248 amount=-1 +kerning first=262 second=102 amount=-1 +kerning first=74 second=282 amount=-1 +kerning first=220 second=218 amount=-1 +kerning first=77 second=248 amount=-1 +kerning first=316 second=337 amount=-1 +kerning first=218 second=248 amount=-1 +kerning first=370 second=102 amount=-1 +kerning first=334 second=87 amount=-1 +kerning first=68 second=75 amount=-1 +kerning first=68 second=206 amount=-1 +kerning first=229 second=101 amount=-1 +kerning first=1042 second=1031 amount=-1 +kerning first=347 second=291 amount=-1 +kerning first=69 second=361 amount=-1 +kerning first=311 second=291 amount=-1 +kerning first=1054 second=1024 amount=-1 +kerning first=282 second=361 amount=-1 +kerning first=275 second=291 amount=-1 +kerning first=271 second=279 amount=-1 +kerning first=119 second=345 amount=-1 +kerning first=206 second=230 amount=-1 +kerning first=209 second=206 amount=-1 +kerning first=86 second=288 amount=-1 +kerning first=335 second=8218 amount=-1 +kerning first=1039 second=1080 amount=-1 +kerning first=75 second=8221 amount=-1 +kerning first=270 second=368 amount=-1 +kerning first=111 second=8221 amount=-2 +kerning first=263 second=8218 amount=-1 +kerning first=262 second=8221 amount=-1 +kerning first=75 second=81 amount=-1 +kerning first=296 second=337 amount=-1 +kerning first=216 second=8221 amount=-2 +kerning first=1064 second=1095 amount=-1 +kerning first=67 second=227 amount=-1 +kerning first=252 second=8221 amount=-1 +kerning first=224 second=337 amount=-1 +kerning first=1054 second=1064 amount=-1 +kerning first=288 second=8221 amount=-1 +kerning first=1052 second=1079 amount=-1 +kerning first=80 second=197 amount=-1 +kerning first=198 second=368 amount=-1 +kerning first=221 second=197 amount=-1 +kerning first=302 second=266 amount=-1 +kerning first=197 second=362 amount=-1 +kerning first=199 second=187 amount=-1 +kerning first=266 second=266 amount=-1 +kerning first=352 second=200 amount=-1 +kerning first=374 second=266 amount=-1 +kerning first=81 second=325 amount=-1 +kerning first=87 second=99 amount=-1 +kerning first=338 second=266 amount=-1 +kerning first=85 second=75 amount=-1 +kerning first=307 second=187 amount=-1 +kerning first=1052 second=1077 amount=-1 +kerning first=89 second=266 amount=-1 +kerning first=235 second=187 amount=-1 +kerning first=228 second=99 amount=-1 +kerning first=86 second=8218 amount=-2 +kerning first=271 second=187 amount=-1 +kerning first=264 second=99 amount=-1 +kerning first=194 second=266 amount=-1 +kerning first=107 second=8222 amount=-1 +kerning first=366 second=325 amount=-1 +kerning first=205 second=71 amount=-1 +kerning first=71 second=8222 amount=-1 +kerning first=275 second=279 amount=-1 +kerning first=296 second=78 amount=-1 +kerning first=231 second=353 amount=-1 +kerning first=199 second=202 amount=-1 +kerning first=326 second=275 amount=-1 +kerning first=370 second=75 amount=-1 +kerning first=334 second=75 amount=-1 +kerning first=298 second=75 amount=-1 +kerning first=266 second=8218 amount=-1 +kerning first=362 second=275 amount=-1 +kerning first=262 second=75 amount=-1 +kerning first=187 second=192 amount=-1 +kerning first=263 second=245 amount=-1 +kerning first=211 second=78 amount=-1 +kerning first=346 second=66 amount=-1 +kerning first=1052 second=1052 amount=-1 +kerning first=274 second=66 amount=-1 +kerning first=221 second=371 amount=-1 +kerning first=69 second=334 amount=-1 +kerning first=286 second=69 amount=-1 +kerning first=111 second=108 amount=-1 +kerning first=202 second=66 amount=-1 +kerning first=366 second=249 amount=-1 +kerning first=187 second=196 amount=-1 +kerning first=1039 second=1107 amount=-1 +kerning first=200 second=367 amount=-1 +kerning first=1064 second=1068 amount=-1 +kerning first=209 second=380 amount=-1 +kerning first=67 second=200 amount=-1 +kerning first=211 second=205 amount=-1 +kerning first=73 second=69 amount=-1 +kerning first=70 second=205 amount=-1 +kerning first=232 second=250 amount=-1 +kerning first=214 second=69 amount=-1 +kerning first=206 second=257 amount=-1 +kerning first=245 second=380 amount=-1 +kerning first=330 second=350 amount=-1 +kerning first=263 second=273 amount=-1 +kerning first=366 second=350 amount=-1 +kerning first=1071 second=1030 amount=-1 +kerning first=70 second=193 amount=-1 +kerning first=368 second=364 amount=-1 +kerning first=211 second=193 amount=-1 +kerning first=86 second=261 amount=-1 +kerning first=268 second=209 amount=-1 +kerning first=296 second=364 amount=-1 +kerning first=218 second=194 amount=-1 +kerning first=344 second=286 amount=-1 +kerning first=207 second=68 amount=-1 +kerning first=339 second=365 amount=-1 +kerning first=200 second=286 amount=-1 +kerning first=8217 second=273 amount=-1 +kerning first=375 second=365 amount=-1 +kerning first=1036 second=1057 amount=-1 +kerning first=267 second=365 amount=-1 +kerning first=81 second=298 amount=-1 +kerning first=109 second=171 amount=-1 +kerning first=268 second=263 amount=-1 +kerning first=66 second=68 amount=-1 +kerning first=45 second=298 amount=-1 +kerning first=304 second=263 amount=-1 +kerning first=195 second=365 amount=-1 +kerning first=350 second=203 amount=-1 +kerning first=231 second=365 amount=-1 +kerning first=323 second=351 amount=-1 +kerning first=69 second=332 amount=-1 +kerning first=99 second=117 amount=-1 +kerning first=351 second=8218 amount=-1 +kerning first=199 second=229 amount=-1 +kerning first=206 second=203 amount=-1 +kerning first=1042 second=1085 amount=-1 +kerning first=1046 second=1108 amount=-1 +kerning first=1040 second=1054 amount=-1 +kerning first=366 second=298 amount=-1 +kerning first=1073 second=1083 amount=-1 +kerning first=210 second=69 amount=-1 +kerning first=234 second=316 amount=-1 +kerning first=219 second=332 amount=-1 +kerning first=267 second=242 amount=-1 +kerning first=81 second=323 amount=-1 +kerning first=8222 second=118 amount=-1 +kerning first=1047 second=1048 amount=-1 +kerning first=1052 second=1025 amount=-1 +kerning first=45 second=323 amount=-1 +kerning first=70 second=220 amount=-1 +kerning first=214 second=66 amount=-1 +kerning first=263 second=246 amount=-1 +kerning first=315 second=356 amount=-1 +kerning first=227 second=246 amount=-1 +kerning first=109 second=45 amount=-1 +kerning first=305 second=103 amount=-1 +kerning first=103 second=281 amount=-1 +kerning first=82 second=211 amount=-1 +kerning first=233 second=103 amount=-1 +kerning first=86 second=246 amount=-1 +kerning first=212 second=304 amount=-1 +kerning first=205 second=330 amount=-1 +kerning first=362 second=194 amount=-1 +kerning first=199 second=100 amount=-1 +kerning first=104 second=119 amount=-1 +kerning first=284 second=304 amount=-1 +kerning first=366 second=323 amount=-1 +kerning first=316 second=281 amount=-1 +kerning first=330 second=323 amount=-1 +kerning first=235 second=100 amount=-1 +kerning first=71 second=304 amount=-1 +kerning first=1058 second=1077 amount=-1 +kerning first=220 second=245 amount=-1 +kerning first=187 second=109 amount=-1 +kerning first=210 second=280 amount=-1 +kerning first=74 second=231 amount=-1 +kerning first=1030 second=1067 amount=-1 +kerning first=282 second=280 amount=-1 +kerning first=364 second=8217 amount=-1 +kerning first=269 second=335 amount=-1 +kerning first=80 second=85 amount=-1 +kerning first=287 second=337 amount=-1 +kerning first=80 second=110 amount=-1 +kerning first=203 second=210 amount=-1 +kerning first=272 second=313 amount=-1 +kerning first=221 second=110 amount=-1 +kerning first=8217 second=369 amount=-1 +kerning first=229 second=339 amount=-1 +kerning first=8218 second=213 amount=-1 +kerning first=287 second=324 amount=-1 +kerning first=354 second=8250 amount=-1 +kerning first=364 second=245 amount=-1 +kerning first=328 second=245 amount=-1 +kerning first=200 second=313 amount=-1 +kerning first=282 second=8250 amount=-1 +kerning first=70 second=118 amount=-1 +kerning first=205 second=357 amount=-1 +kerning first=1077 second=1118 amount=-1 +kerning first=277 second=357 amount=-1 +kerning first=105 second=8250 amount=-1 +kerning first=374 second=212 amount=-1 +kerning first=69 second=8250 amount=-1 +kerning first=255 second=8220 amount=-2 +kerning first=234 second=289 amount=-1 +kerning first=1049 second=1101 amount=-1 +kerning first=314 second=101 amount=-1 +kerning first=269 second=101 amount=-1 +kerning first=8218 second=86 amount=-2 +kerning first=81 second=296 amount=-1 +kerning first=266 second=212 amount=-1 +kerning first=220 second=8217 amount=-1 +kerning first=45 second=296 amount=-1 +kerning first=302 second=212 amount=-1 +kerning first=280 second=200 amount=-1 +kerning first=256 second=8217 amount=-2 +kerning first=73 second=111 amount=-1 +kerning first=338 second=212 amount=-1 +kerning first=89 second=212 amount=-1 +kerning first=67 second=254 amount=-1 +kerning first=69 second=280 amount=-1 +kerning first=79 second=8217 amount=-2 +kerning first=250 second=111 amount=-1 +kerning first=194 second=212 amount=-1 +kerning first=103 second=254 amount=-1 +kerning first=115 second=8217 amount=-2 +kerning first=248 second=287 amount=-1 +kerning first=67 second=347 amount=-1 +kerning first=366 second=296 amount=-1 +kerning first=1088 second=1084 amount=-1 +kerning first=262 second=318 amount=-1 +kerning first=363 second=335 amount=-1 +kerning first=330 second=296 amount=-1 +kerning first=345 second=228 amount=-1 +kerning first=327 second=335 amount=-1 +kerning first=296 second=241 amount=-1 +kerning first=304 second=85 amount=-1 +kerning first=1052 second=1080 amount=-1 +kerning first=268 second=85 amount=-1 +kerning first=275 second=107 amount=-1 +kerning first=196 second=85 amount=-1 +kerning first=1031 second=1056 amount=-1 +kerning first=234 second=287 amount=-1 +kerning first=196 second=8220 amount=-2 +kerning first=192 second=364 amount=-1 +kerning first=219 second=231 amount=-1 +kerning first=235 second=46 amount=-1 +kerning first=268 second=8220 amount=-1 +kerning first=89 second=65 amount=-1 +kerning first=77 second=339 amount=-1 +kerning first=72 second=229 amount=-1 +kerning first=269 second=271 amount=-1 +kerning first=268 second=302 amount=-1 +kerning first=249 second=243 amount=-1 +kerning first=233 second=271 amount=-1 +kerning first=73 second=225 amount=-1 +kerning first=304 second=302 amount=-1 +kerning first=78 second=335 amount=-1 +kerning first=364 second=83 amount=-1 +kerning first=1057 second=1096 amount=-1 +kerning first=219 second=335 amount=-1 +kerning first=245 second=187 amount=-1 +kerning first=364 second=284 amount=-1 +kerning first=204 second=206 amount=-1 +kerning first=66 second=80 amount=-1 +kerning first=104 second=289 amount=-1 +kerning first=245 second=289 amount=-1 +kerning first=321 second=86 amount=-1 +kerning first=8250 second=78 amount=-1 +kerning first=207 second=344 amount=-1 +kerning first=220 second=284 amount=-1 +kerning first=281 second=289 amount=-1 +kerning first=210 second=278 amount=-1 +kerning first=207 second=80 amount=-1 +kerning first=323 second=378 amount=-1 +kerning first=199 second=46 amount=-1 +kerning first=352 second=76 amount=-1 +kerning first=1038 second=1094 amount=-1 +kerning first=202 second=207 amount=-1 +kerning first=287 second=378 amount=-1 +kerning first=353 second=289 amount=-1 +kerning first=280 second=76 amount=-1 +kerning first=193 second=79 amount=-1 +kerning first=267 second=353 amount=-1 +kerning first=85 second=216 amount=-1 +kerning first=375 second=353 amount=-1 +kerning first=195 second=89 amount=-1 +kerning first=339 second=353 amount=-1 +kerning first=370 second=337 amount=-1 +kerning first=282 second=278 amount=-1 +kerning first=74 second=378 amount=-1 +kerning first=230 second=357 amount=-1 +kerning first=240 second=279 amount=-1 +kerning first=8217 second=350 amount=-1 +kerning first=262 second=216 amount=-1 +kerning first=80 second=280 amount=-1 +kerning first=249 second=246 amount=-1 +kerning first=323 second=81 amount=-1 +kerning first=66 second=344 amount=-1 +kerning first=67 second=76 amount=-1 +kerning first=266 second=357 amount=-1 +kerning first=1104 second=1118 amount=-1 +kerning first=266 second=113 amount=-1 +kerning first=302 second=113 amount=-1 +kerning first=1060 second=1084 amount=-1 +kerning first=218 second=114 amount=-1 +kerning first=230 second=113 amount=-1 +kerning first=201 second=201 amount=-1 +kerning first=117 second=269 amount=-1 +kerning first=1055 second=1094 amount=-1 +kerning first=89 second=113 amount=-1 +kerning first=330 second=269 amount=-1 +kerning first=1091 second=1094 amount=-1 +kerning first=73 second=259 amount=-1 +kerning first=366 second=269 amount=-1 +kerning first=195 second=116 amount=-1 +kerning first=296 second=268 amount=-1 +kerning first=274 second=207 amount=-1 +kerning first=1066 second=1045 amount=-1 +kerning first=253 second=8220 amount=-2 +kerning first=346 second=207 amount=-1 +kerning first=213 second=256 amount=-1 +kerning first=313 second=368 amount=-1 +kerning first=364 second=67 amount=-1 +kerning first=101 second=231 amount=-1 +kerning first=368 second=268 amount=-1 +kerning first=333 second=287 amount=-1 +kerning first=374 second=113 amount=-1 +kerning first=86 second=369 amount=-1 +kerning first=77 second=366 amount=-1 +kerning first=220 second=67 amount=-1 +kerning first=279 second=107 amount=-1 +kerning first=77 second=122 amount=-1 +kerning first=1046 second=1102 amount=-1 +kerning first=270 second=260 amount=-1 +kerning first=356 second=277 amount=-1 +kerning first=263 second=250 amount=-1 +kerning first=199 second=73 amount=-1 +kerning first=66 second=317 amount=-1 +kerning first=8250 second=251 amount=-1 +kerning first=209 second=262 amount=-1 +kerning first=207 second=317 amount=-1 +kerning first=74 second=351 amount=-1 +kerning first=321 second=219 amount=-1 +kerning first=69 second=251 amount=-1 +kerning first=217 second=213 amount=-1 +kerning first=339 second=116 amount=-1 +kerning first=65 second=375 amount=-1 +kerning first=362 second=122 amount=-1 +kerning first=1036 second=1102 amount=-1 +kerning first=267 second=326 amount=-1 +kerning first=1043 second=1076 amount=-1 +kerning first=254 second=122 amount=-1 +kerning first=231 second=326 amount=-1 +kerning first=8222 second=356 amount=-1 +kerning first=66 second=218 amount=-1 +kerning first=1056 second=1117 amount=-1 +kerning first=1050 second=1038 amount=-1 +kerning first=282 second=251 amount=-1 +kerning first=72 second=219 amount=-1 +kerning first=218 second=122 amount=-1 +kerning first=1068 second=1061 amount=-1 +kerning first=8250 second=219 amount=-1 +kerning first=350 second=218 amount=-1 +kerning first=262 second=270 amount=-1 +kerning first=304 second=248 amount=-1 +kerning first=89 second=8221 amount=-1 +kerning first=72 second=283 amount=-1 +kerning first=267 second=380 amount=-1 +kerning first=278 second=218 amount=-1 +kerning first=108 second=283 amount=-1 +kerning first=231 second=380 amount=-1 +kerning first=194 second=8221 amount=-2 +kerning first=1049 second=1089 amount=-1 +kerning first=339 second=380 amount=-1 +kerning first=370 second=270 amount=-1 +kerning first=206 second=218 amount=-1 +kerning first=117 second=242 amount=-1 +kerning first=230 second=8221 amount=-2 +kerning first=201 second=75 amount=-1 +kerning first=229 second=231 amount=-1 +kerning first=266 second=8221 amount=-1 +kerning first=85 second=336 amount=-1 +kerning first=298 second=270 amount=-1 +kerning first=1030 second=1065 amount=-1 +kerning first=114 second=44 amount=-1 +kerning first=375 second=380 amount=-1 +kerning first=334 second=270 amount=-1 +kerning first=65 second=218 amount=-1 +kerning first=232 second=248 amount=-1 +kerning first=338 second=8221 amount=-1 +kerning first=200 second=79 amount=-1 +kerning first=218 second=209 amount=-1 +kerning first=374 second=8221 amount=-1 +kerning first=212 second=196 amount=-1 +kerning first=221 second=226 amount=-1 +kerning first=262 second=336 amount=-1 +kerning first=298 second=336 amount=-1 +kerning first=72 second=66 amount=-1 +kerning first=8250 second=241 amount=-1 +kerning first=370 second=336 amount=-1 +kerning first=85 second=270 amount=-1 +kerning first=249 second=283 amount=-1 +kerning first=366 second=242 amount=-1 +kerning first=218 second=227 amount=-1 +kerning first=233 second=244 amount=-1 +kerning first=269 second=244 amount=-1 +kerning first=272 second=205 amount=-1 +kerning first=305 second=244 amount=-1 +kerning first=71 second=70 amount=-1 +kerning first=1038 second=1097 amount=-1 +kerning first=8222 second=275 amount=-1 +kerning first=1101 second=1113 amount=-1 +kerning first=89 second=227 amount=-1 +kerning first=284 second=8222 amount=-1 +kerning first=344 second=79 amount=-1 +kerning first=202 second=327 amount=-1 +kerning first=248 second=8222 amount=-1 +kerning first=212 second=8222 amount=-1 +kerning first=355 second=267 amount=-1 +kerning first=106 second=8220 amount=-1 +kerning first=115 second=8221 amount=-2 +kerning first=213 second=192 amount=-1 +kerning first=327 second=44 amount=-1 +kerning first=346 second=327 amount=-1 +kerning first=261 second=8217 amount=-2 +kerning first=291 second=318 amount=-1 +kerning first=255 second=44 amount=-1 +kerning first=104 second=235 amount=-1 +kerning first=193 second=44 amount=-1 +kerning first=291 second=44 amount=-1 +kerning first=99 second=110 amount=-1 +kerning first=200 second=205 amount=-1 +kerning first=209 second=235 amount=-1 +kerning first=374 second=227 amount=-1 +kerning first=212 second=70 amount=-1 +kerning first=281 second=235 amount=-1 +kerning first=302 second=227 amount=-1 +kerning first=270 second=347 amount=-1 +kerning first=284 second=70 amount=-1 +kerning first=266 second=227 amount=-1 +kerning first=100 second=171 amount=-1 +kerning first=219 second=71 amount=-1 +kerning first=85 second=363 amount=-1 +kerning first=117 second=289 amount=-1 +kerning first=121 second=363 amount=-1 +kerning first=67 second=266 amount=-1 +kerning first=78 second=71 amount=-1 +kerning first=368 second=214 amount=-1 +kerning first=368 second=115 amount=-1 +kerning first=198 second=370 amount=-1 +kerning first=85 second=243 amount=-1 +kerning first=304 second=275 amount=-1 +kerning first=213 second=310 amount=-1 +kerning first=354 second=224 amount=-1 +kerning first=296 second=214 amount=-1 +kerning first=370 second=363 amount=-1 +kerning first=87 second=45 amount=-2 +kerning first=268 second=275 amount=-1 +kerning first=219 second=362 amount=-1 +kerning first=270 second=370 amount=-1 +kerning first=232 second=275 amount=-1 +kerning first=284 second=223 amount=-1 +kerning first=228 second=45 amount=-1 +kerning first=1104 second=1081 amount=-1 +kerning first=264 second=45 amount=-1 +kerning first=277 second=249 amount=-1 +kerning first=192 second=45 amount=-1 +kerning first=8250 second=268 amount=-1 +kerning first=71 second=223 amount=-1 +kerning first=1064 second=1097 amount=-1 +kerning first=97 second=234 amount=-1 +kerning first=241 second=235 amount=-1 +kerning first=220 second=257 amount=-1 +kerning first=1055 second=1028 amount=-1 +kerning first=338 second=216 amount=-1 +kerning first=1056 second=1063 amount=-1 +kerning first=217 second=267 amount=-1 +kerning first=197 second=217 amount=-1 +kerning first=78 second=362 amount=-1 +kerning first=290 second=209 amount=-1 +kerning first=325 second=267 amount=-1 +kerning first=338 second=200 amount=-1 +kerning first=298 second=243 amount=-1 +kerning first=1089 second=1095 amount=-1 +kerning first=82 second=368 amount=-1 +kerning first=302 second=200 amount=-1 +kerning first=262 second=243 amount=-1 +kerning first=1053 second=1095 amount=-1 +kerning first=217 second=8222 amount=-2 +kerning first=266 second=200 amount=-1 +kerning first=66 second=371 amount=-1 +kerning first=109 second=345 amount=-1 +kerning first=45 second=379 amount=-1 +kerning first=1044 second=1072 amount=-1 +kerning first=187 second=368 amount=-1 +kerning first=356 second=97 amount=-1 +kerning first=250 second=345 amount=-1 +kerning first=280 second=266 amount=-1 +kerning first=286 second=345 amount=-1 +kerning first=8218 second=99 amount=-1 +kerning first=1030 second=1049 amount=-1 +kerning first=202 second=8218 amount=-1 +kerning first=339 second=245 amount=-1 +kerning first=315 second=221 amount=-1 +kerning first=8218 second=378 amount=-1 +kerning first=68 second=370 amount=-1 +kerning first=346 second=8218 amount=-1 +kerning first=267 second=245 amount=-1 +kerning first=66 second=221 amount=-1 +kerning first=274 second=315 amount=-1 +kerning first=210 second=197 amount=-1 +kerning first=317 second=370 amount=-1 +kerning first=310 second=8218 amount=-1 +kerning first=231 second=245 amount=-1 +kerning first=209 second=370 amount=-1 +kerning first=274 second=8218 amount=-1 +kerning first=1067 second=1073 amount=-1 +kerning first=171 second=221 amount=-1 +kerning first=202 second=315 amount=-1 +kerning first=84 second=111 amount=-1 +kerning first=362 second=258 amount=-1 +kerning first=1050 second=1092 amount=-1 +kerning first=350 second=46 amount=-1 +kerning first=196 second=199 amount=-1 +kerning first=1038 second=1101 amount=-1 +kerning first=338 second=249 amount=-1 +kerning first=268 second=199 amount=-1 +kerning first=304 second=199 amount=-1 +kerning first=89 second=249 amount=-1 +kerning first=1065 second=1086 amount=-1 +kerning first=267 second=230 amount=-1 +kerning first=1056 second=1024 amount=-1 +kerning first=68 second=354 amount=-1 +kerning first=194 second=249 amount=-1 +kerning first=70 second=350 amount=-1 +kerning first=314 second=267 amount=-1 +kerning first=280 second=217 amount=-1 +kerning first=1053 second=1068 amount=-1 +kerning first=219 second=212 amount=-1 +kerning first=352 second=217 amount=-1 +kerning first=101 second=267 amount=-1 +kerning first=8222 second=226 amount=-1 +kerning first=327 second=212 amount=-1 +kerning first=206 second=267 amount=-1 +kerning first=201 second=8249 amount=-1 +kerning first=72 second=310 amount=-1 +kerning first=245 second=122 amount=-1 +kerning first=78 second=212 amount=-1 +kerning first=225 second=111 amount=-1 +kerning first=296 second=115 amount=-1 +kerning first=346 second=315 amount=-1 +kerning first=8222 second=253 amount=-1 +kerning first=261 second=111 amount=-1 +kerning first=218 second=258 amount=-1 +kerning first=1039 second=1101 amount=-1 +kerning first=345 second=8249 amount=-1 +kerning first=240 second=242 amount=-1 +kerning first=194 second=67 amount=-1 +kerning first=1062 second=1098 amount=-1 +kerning first=369 second=111 amount=-1 +kerning first=119 second=115 amount=-1 +kerning first=255 second=254 amount=-1 +kerning first=291 second=254 amount=-1 +kerning first=194 second=44 amount=-1 +kerning first=195 second=218 amount=-1 +kerning first=1050 second=1119 amount=-1 +kerning first=205 second=81 amount=-1 +kerning first=89 second=44 amount=-1 +kerning first=220 second=380 amount=-1 +kerning first=272 second=193 amount=-1 +kerning first=279 second=248 amount=-1 +kerning first=230 second=44 amount=-1 +kerning first=1068 second=1027 amount=-1 +kerning first=1039 second=1117 amount=-1 +kerning first=266 second=44 amount=-1 +kerning first=1030 second=1028 amount=-1 +kerning first=66 second=209 amount=-1 +kerning first=370 second=282 amount=-1 +kerning first=314 second=337 amount=-1 +kerning first=72 second=78 amount=-1 +kerning first=334 second=282 amount=-1 +kerning first=213 second=78 amount=-1 +kerning first=298 second=282 amount=-1 +kerning first=1067 second=1097 amount=-1 +kerning first=207 second=248 amount=-1 +kerning first=262 second=282 amount=-1 +kerning first=325 second=72 amount=-1 +kerning first=326 second=291 amount=-1 +kerning first=8250 second=214 amount=-1 +kerning first=217 second=72 amount=-1 +kerning first=1055 second=1055 amount=-1 +kerning first=78 second=227 amount=-1 +kerning first=85 second=282 amount=-1 +kerning first=1053 second=1041 amount=-1 +kerning first=73 second=279 amount=-1 +kerning first=109 second=279 amount=-1 +kerning first=218 second=224 amount=-1 +kerning first=231 second=230 amount=-1 +kerning first=221 second=361 amount=-1 +kerning first=199 second=332 amount=-1 +kerning first=1067 second=1054 amount=-1 +kerning first=249 second=337 amount=-1 +kerning first=274 second=288 amount=-1 +kerning first=327 second=330 amount=-1 +kerning first=70 second=323 amount=-1 +kerning first=206 second=278 amount=-1 +kerning first=327 second=227 amount=-1 +kerning first=374 second=44 amount=-1 +kerning first=224 second=187 amount=-1 +kerning first=212 second=270 amount=-1 +kerning first=108 second=337 amount=-1 +kerning first=202 second=288 amount=-1 +kerning first=260 second=187 amount=-1 +kerning first=109 second=291 amount=-1 +kerning first=1041 second=1050 amount=-1 +kerning first=72 second=337 amount=-1 +kerning first=219 second=227 amount=-1 +kerning first=1067 second=1094 amount=-1 +kerning first=1067 second=1057 amount=-1 +kerning first=8249 second=368 amount=-1 +kerning first=310 second=288 amount=-1 +kerning first=368 second=187 amount=-2 +kerning first=211 second=323 amount=-1 +kerning first=345 second=8222 amount=-1 +kerning first=220 second=338 amount=-1 +kerning first=1055 second=1067 amount=-1 +kerning first=8222 second=199 amount=-1 +kerning first=118 second=314 amount=-1 +kerning first=1051 second=1034 amount=-1 +kerning first=194 second=303 amount=-1 +kerning first=84 second=259 amount=-1 +kerning first=217 second=99 amount=-1 +kerning first=78 second=281 amount=-1 +kerning first=325 second=99 amount=-1 +kerning first=66 second=290 amount=-1 +kerning first=225 second=382 amount=-1 +kerning first=202 second=369 amount=-1 +kerning first=72 second=268 amount=-1 +kerning first=296 second=73 amount=-1 +kerning first=1091 second=1082 amount=-1 +kerning first=223 second=314 amount=-1 +kerning first=83 second=202 amount=-1 +kerning first=289 second=99 amount=-1 +kerning first=1046 second=1091 amount=-1 +kerning first=307 second=8250 amount=-1 +kerning first=368 second=73 amount=-1 +kerning first=207 second=290 amount=-1 +kerning first=333 second=382 amount=-1 +kerning first=271 second=8250 amount=-1 +kerning first=235 second=8250 amount=-1 +kerning first=346 second=369 amount=-1 +kerning first=199 second=8250 amount=-1 +kerning first=310 second=369 amount=-1 +kerning first=245 second=316 amount=-1 +kerning first=1067 second=1089 amount=-1 +kerning first=274 second=369 amount=-1 +kerning first=103 second=347 amount=-1 +kerning first=1031 second=1100 amount=-1 +kerning first=286 second=368 amount=-1 +kerning first=80 second=334 amount=-1 +kerning first=121 second=351 amount=-1 +kerning first=296 second=202 amount=-1 +kerning first=72 second=364 amount=-1 +kerning first=85 second=351 amount=-1 +kerning first=83 second=73 amount=-1 +kerning first=368 second=202 amount=-1 +kerning first=90 second=8217 amount=-1 +kerning first=1067 second=1100 amount=-1 +kerning first=187 second=382 amount=-1 +kerning first=221 second=334 amount=-1 +kerning first=334 second=351 amount=-1 +kerning first=298 second=351 amount=-1 +kerning first=262 second=351 amount=-1 +kerning first=73 second=264 amount=-1 +kerning first=212 second=82 amount=-1 +kerning first=339 second=8217 amount=-2 +kerning first=1053 second=1092 amount=-1 +kerning first=284 second=82 amount=-1 +kerning first=375 second=8217 amount=-2 +kerning first=321 second=364 amount=-1 +kerning first=1043 second=1091 amount=-1 +kerning first=364 second=338 amount=-1 +kerning first=70 second=296 amount=-1 +kerning first=366 second=101 amount=-1 +kerning first=231 second=8217 amount=-2 +kerning first=213 second=364 amount=-1 +kerning first=330 second=101 amount=-1 +kerning first=277 second=108 amount=-1 +kerning first=290 second=68 amount=-1 +kerning first=207 second=263 amount=-1 +kerning first=66 second=194 amount=-1 +kerning first=364 second=365 amount=-1 +kerning first=282 second=216 amount=-1 +kerning first=211 second=296 amount=-1 +kerning first=229 second=45 amount=-1 +kerning first=120 second=171 amount=-1 +kerning first=362 second=68 amount=-1 +kerning first=279 second=263 amount=-1 +kerning first=67 second=103 amount=-1 +kerning first=1048 second=1039 amount=-1 +kerning first=338 second=330 amount=-1 +kerning first=1053 second=1076 amount=-1 +kerning first=225 second=171 amount=-1 +kerning first=302 second=330 amount=-1 +kerning first=220 second=365 amount=-1 +kerning first=261 second=171 amount=-1 +kerning first=227 second=281 amount=-1 +kerning first=218 second=68 amount=-1 +kerning first=71 second=82 amount=-1 +kerning first=209 second=97 amount=-1 +kerning first=370 second=351 amount=-1 +kerning first=259 second=287 amount=-1 +kerning first=223 second=287 amount=-1 +kerning first=193 second=117 amount=-1 +kerning first=187 second=66 amount=-1 +kerning first=118 second=287 amount=-1 +kerning first=88 second=117 amount=-1 +kerning first=362 second=339 amount=-1 +kerning first=326 second=339 amount=-1 +kerning first=367 second=287 amount=-1 +kerning first=281 second=316 amount=-1 +kerning first=1031 second=1031 amount=-1 +kerning first=296 second=100 amount=-1 +kerning first=330 second=103 amount=-1 +kerning first=69 second=66 amount=-1 +kerning first=353 second=316 amount=-1 +kerning first=218 second=339 amount=-1 +kerning first=368 second=100 amount=-1 +kerning first=296 second=229 amount=-1 +kerning first=84 second=382 amount=-1 +kerning first=368 second=229 amount=-1 +kerning first=334 second=304 amount=-1 +kerning first=344 second=220 amount=-1 +kerning first=199 second=278 amount=-1 +kerning first=1043 second=1118 amount=-1 +kerning first=219 second=281 amount=-1 +kerning first=77 second=68 amount=-1 +kerning first=266 second=330 amount=-1 +kerning first=291 second=281 amount=-1 +kerning first=74 second=311 amount=-1 +kerning first=73 second=333 amount=-1 +kerning first=1044 second=1060 amount=-1 +kerning first=350 second=77 amount=-1 +kerning first=327 second=281 amount=-1 +kerning first=1067 second=1031 amount=-1 +kerning first=316 second=103 amount=-1 +kerning first=278 second=77 amount=-1 +kerning first=97 second=246 amount=-1 +kerning first=272 second=220 amount=-1 +kerning first=244 second=103 amount=-1 +kerning first=250 second=333 amount=-1 +kerning first=201 second=304 amount=-1 +kerning first=323 second=362 amount=-1 +kerning first=1047 second=1065 amount=-1 +kerning first=70 second=269 amount=-1 +kerning first=67 second=298 amount=-1 +kerning first=296 second=246 amount=-1 +kerning first=1047 second=1063 amount=-1 +kerning first=232 second=100 amount=-1 +kerning first=193 second=356 amount=-1 +kerning first=8218 second=230 amount=-1 +kerning first=8249 second=87 amount=-1 +kerning first=330 second=74 amount=-1 +kerning first=224 second=246 amount=-1 +kerning first=1057 second=1091 amount=-1 +kerning first=366 second=74 amount=-1 +kerning first=219 second=330 amount=-1 +kerning first=214 second=220 amount=-1 +kerning first=241 second=171 amount=-1 +kerning first=268 second=100 amount=-1 +kerning first=1031 second=1117 amount=-1 +kerning first=106 second=269 amount=-1 +kerning first=352 second=298 amount=-1 +kerning first=78 second=103 amount=-1 +kerning first=209 second=77 amount=-1 +kerning first=355 second=269 amount=-1 +kerning first=206 second=333 amount=-1 +kerning first=364 second=109 amount=-1 +kerning first=8222 second=334 amount=-1 +kerning first=209 second=304 amount=-1 +kerning first=298 second=211 amount=-1 +kerning first=283 second=269 amount=-1 +kerning first=101 second=333 amount=-1 +kerning first=262 second=211 amount=-1 +kerning first=86 second=109 amount=-1 +kerning first=1031 second=1096 amount=-1 +kerning first=289 second=365 amount=-1 +kerning first=115 second=289 amount=-1 +kerning first=270 second=65 amount=-1 +kerning first=98 second=382 amount=-1 +kerning first=217 second=365 amount=-1 +kerning first=281 second=8222 amount=-1 +kerning first=68 second=304 amount=-1 +kerning first=85 second=211 amount=-1 +kerning first=80 second=68 amount=-1 +kerning first=253 second=365 amount=-1 +kerning first=314 second=333 amount=-1 +kerning first=187 second=260 amount=-1 +kerning first=207 second=339 amount=-1 +kerning first=117 second=281 amount=-1 +kerning first=298 second=199 amount=-1 +kerning first=197 second=86 amount=-1 +kerning first=279 second=339 amount=-1 +kerning first=370 second=211 amount=-1 +kerning first=277 second=347 amount=-1 +kerning first=338 second=315 amount=-1 +kerning first=220 second=109 amount=-1 +kerning first=1071 second=1074 amount=-1 +kerning first=205 second=347 amount=-1 +kerning first=330 second=281 amount=-1 +kerning first=1043 second=1108 amount=-1 +kerning first=196 second=307 amount=-1 +kerning first=1048 second=1051 amount=-1 +kerning first=366 second=281 amount=-1 +kerning first=77 second=100 amount=-1 +kerning first=346 second=202 amount=-1 +kerning first=1059 second=1083 amount=-1 +kerning first=380 second=8221 amount=-1 +kerning first=282 second=290 amount=-1 +kerning first=1067 second=1117 amount=-1 +kerning first=1049 second=1057 amount=-1 +kerning first=193 second=119 amount=-1 +kerning first=78 second=330 amount=-1 +kerning first=68 second=77 amount=-1 +kerning first=200 second=264 amount=-1 +kerning first=235 second=251 amount=-1 +kerning first=277 second=120 amount=-1 +kerning first=274 second=202 amount=-1 +kerning first=8218 second=242 amount=-1 +kerning first=249 second=248 amount=-1 +kerning first=83 second=219 amount=-1 +kerning first=78 second=76 amount=-1 +kerning first=234 second=8217 amount=-2 +kerning first=228 second=269 amount=-1 +kerning first=264 second=77 amount=-1 +kerning first=1057 second=1118 amount=-1 +kerning first=270 second=8217 amount=-2 +kerning first=78 second=8221 amount=-1 +kerning first=325 second=274 amount=-1 +kerning first=114 second=8221 amount=-1 +kerning first=67 second=271 amount=-1 +kerning first=75 second=212 amount=-1 +kerning first=206 second=345 amount=-1 +kerning first=1056 second=1072 amount=-1 +kerning first=217 second=111 amount=-1 +kerning first=315 second=85 amount=-1 +kerning first=291 second=8221 amount=-2 +kerning first=258 second=254 amount=-1 +kerning first=289 second=111 amount=-1 +kerning first=234 second=245 amount=-1 +kerning first=73 second=103 amount=-1 +kerning first=70 second=242 amount=-1 +kerning first=325 second=111 amount=-1 +kerning first=207 second=85 amount=-1 +kerning first=106 second=242 amount=-1 +kerning first=209 second=331 amount=-1 +kerning first=171 second=85 amount=-1 +kerning first=378 second=8217 amount=-1 +kerning first=355 second=242 amount=-1 +kerning first=70 second=279 amount=-1 +kerning first=66 second=85 amount=-1 +kerning first=283 second=242 amount=-1 +kerning first=354 second=263 amount=-1 +kerning first=89 second=195 amount=-1 +kerning first=1071 second=1101 amount=-1 +kerning first=195 second=67 amount=-1 +kerning first=328 second=289 amount=-1 +kerning first=1048 second=1024 amount=-1 +kerning first=315 second=366 amount=-1 +kerning first=194 second=288 amount=-1 +kerning first=264 second=203 amount=-1 +kerning first=1051 second=1095 amount=-1 +kerning first=89 second=288 amount=-1 +kerning first=1055 second=1036 amount=-1 +kerning first=219 second=357 amount=-1 +kerning first=367 second=233 amount=-1 +kerning first=374 second=195 amount=-1 +kerning first=313 second=374 amount=-1 +kerning first=105 second=263 amount=-1 +kerning first=327 second=357 amount=-1 +kerning first=364 second=99 amount=-1 +kerning first=327 second=76 amount=-1 +kerning first=291 second=345 amount=-1 +kerning first=291 second=357 amount=-1 +kerning first=73 second=220 amount=-1 +kerning first=268 second=280 amount=-1 +kerning first=78 second=357 amount=-1 +kerning first=8222 second=214 amount=-1 +kerning first=304 second=280 amount=-1 +kerning first=1049 second=1084 amount=-1 +kerning first=219 second=76 amount=-1 +kerning first=368 second=246 amount=-1 +kerning first=201 second=363 amount=-1 +kerning first=199 second=224 amount=-1 +kerning first=257 second=122 amount=-1 +kerning first=210 second=317 amount=-1 +kerning first=362 second=378 amount=-1 +kerning first=205 second=207 amount=-1 +kerning first=282 second=317 amount=-1 +kerning first=253 second=311 amount=-1 +kerning first=1030 second=1104 amount=-1 +kerning first=221 second=122 amount=-1 +kerning first=284 second=201 amount=-1 +kerning first=289 second=311 amount=-1 +kerning first=80 second=122 amount=-1 +kerning first=99 second=107 amount=-1 +kerning first=212 second=201 amount=-1 +kerning first=1055 second=1072 amount=-1 +kerning first=199 second=269 amount=-1 +kerning first=171 second=366 amount=-1 +kerning first=1046 second=1118 amount=-1 +kerning first=67 second=244 amount=-1 +kerning first=192 second=116 amount=-1 +kerning first=77 second=378 amount=-1 +kerning first=207 second=366 amount=-1 +kerning first=103 second=244 amount=-1 +kerning first=218 second=204 amount=-1 +kerning first=66 second=366 amount=-1 +kerning first=1043 second=1081 amount=-1 +kerning first=213 second=354 amount=-1 +kerning first=8222 second=100 amount=-1 +kerning first=68 second=78 amount=-1 +kerning first=254 second=378 amount=-1 +kerning first=362 second=204 amount=-1 +kerning first=218 second=378 amount=-1 +kerning first=269 second=259 amount=-1 +kerning first=69 second=317 amount=-1 +kerning first=264 second=116 amount=-1 +kerning first=344 second=210 amount=-1 +kerning first=8222 second=307 amount=-1 +kerning first=1044 second=1102 amount=-1 +kerning first=72 second=75 amount=-1 +kerning first=200 second=210 amount=-1 +kerning first=1078 second=1095 amount=-1 +kerning first=220 second=262 amount=-1 +kerning first=1051 second=1049 amount=-1 +kerning first=268 second=73 amount=-1 +kerning first=117 second=335 amount=-1 +kerning first=364 second=262 amount=-1 +kerning first=187 second=206 amount=-1 +kerning first=225 second=345 amount=-1 +kerning first=65 second=213 amount=-1 +kerning first=230 second=369 amount=-1 +kerning first=261 second=345 amount=-1 +kerning first=368 second=219 amount=-1 +kerning first=1027 second=1040 amount=-1 +kerning first=194 second=369 amount=-1 +kerning first=304 second=73 amount=-1 +kerning first=327 second=207 amount=-1 +kerning first=330 second=335 amount=-1 +kerning first=221 second=268 amount=-1 +kerning first=333 second=345 amount=-1 +kerning first=296 second=219 amount=-1 +kerning first=105 second=244 amount=-1 +kerning first=369 second=345 amount=-1 +kerning first=374 second=369 amount=-1 +kerning first=206 second=213 amount=-1 +kerning first=366 second=335 amount=-1 +kerning first=338 second=369 amount=-1 +kerning first=80 second=268 amount=-1 +kerning first=217 second=198 amount=-1 +kerning first=213 second=88 amount=-1 +kerning first=8249 second=86 amount=-1 +kerning first=218 second=231 amount=-1 +kerning first=284 second=368 amount=-1 +kerning first=218 second=351 amount=-1 +kerning first=209 second=277 amount=-1 +kerning first=1036 second=1060 amount=-1 +kerning first=1030 second=1077 amount=-1 +kerning first=264 second=318 amount=-1 +kerning first=1055 second=1099 amount=-1 +kerning first=326 second=231 amount=-1 +kerning first=71 second=368 amount=-1 +kerning first=69 second=290 amount=-1 +kerning first=362 second=351 amount=-1 +kerning first=1071 second=1047 amount=-1 +kerning first=77 second=231 amount=-1 +kerning first=268 second=226 amount=-1 +kerning first=325 second=338 amount=-1 +kerning first=212 second=368 amount=-1 +kerning first=304 second=226 amount=-1 +kerning first=281 second=277 amount=-1 +kerning first=104 second=8249 amount=-1 +kerning first=217 second=279 amount=-1 +kerning first=334 second=200 amount=-1 +kerning first=220 second=82 amount=-1 +kerning first=209 second=8249 amount=-1 +kerning first=217 second=338 amount=-1 +kerning first=1039 second=1031 amount=-1 +kerning first=77 second=351 amount=-1 +kerning first=362 second=231 amount=-1 +kerning first=67 second=217 amount=-1 +kerning first=97 second=283 amount=-1 +kerning first=353 second=8249 amount=-1 +kerning first=1038 second=1089 amount=-1 +kerning first=240 second=8222 amount=-1 +kerning first=253 second=45 amount=-1 +kerning first=214 second=274 amount=-1 +kerning first=289 second=45 amount=-1 +kerning first=197 second=286 amount=-1 +kerning first=1042 second=1068 amount=-1 +kerning first=73 second=274 amount=-1 +kerning first=217 second=171 amount=-2 +kerning first=217 second=45 amount=-2 +kerning first=305 second=113 amount=-1 +kerning first=289 second=171 amount=-1 +kerning first=325 second=171 amount=-1 +kerning first=325 second=45 amount=-1 +kerning first=269 second=113 amount=-1 +kerning first=281 second=104 amount=-1 +kerning first=201 second=70 amount=-1 +kerning first=220 second=235 amount=-1 +kerning first=1042 second=1030 amount=-1 +kerning first=328 second=235 amount=-1 +kerning first=364 second=235 amount=-1 +kerning first=1060 second=1069 amount=-1 +kerning first=286 second=274 amount=-1 +kerning first=207 second=226 amount=-1 +kerning first=333 second=318 amount=-1 +kerning first=199 second=344 amount=-1 +kerning first=206 second=337 amount=-1 +kerning first=45 second=367 amount=-1 +kerning first=207 second=231 amount=-1 +kerning first=217 second=252 amount=-1 +kerning first=1053 second=1053 amount=-1 +kerning first=87 second=284 amount=-1 +kerning first=1054 second=1059 amount=-1 +kerning first=289 second=252 amount=-1 +kerning first=290 second=8217 amount=-1 +kerning first=192 second=284 amount=-1 +kerning first=253 second=252 amount=-1 +kerning first=1030 second=1108 amount=-1 +kerning first=205 second=261 amount=-1 +kerning first=78 second=217 amount=-1 +kerning first=333 second=106 amount=-1 +kerning first=219 second=204 amount=-1 +kerning first=346 second=310 amount=-1 +kerning first=279 second=231 amount=-1 +kerning first=219 second=217 amount=-1 +kerning first=274 second=310 amount=-1 +kerning first=229 second=243 amount=-1 +kerning first=86 second=71 amount=-1 +kerning first=8218 second=311 amount=-1 +kerning first=118 second=353 amount=-1 +kerning first=1068 second=1034 amount=-1 +kerning first=85 second=81 amount=-1 +kerning first=65 second=45 amount=-1 +kerning first=278 second=45 amount=-1 +kerning first=255 second=249 amount=-1 +kerning first=81 second=221 amount=-1 +kerning first=296 second=332 amount=-1 +kerning first=240 second=275 amount=-1 +kerning first=291 second=249 amount=-1 +kerning first=325 second=330 amount=-1 +kerning first=80 second=214 amount=-1 +kerning first=1040 second=1076 amount=-1 +kerning first=1044 second=1028 amount=-1 +kerning first=267 second=235 amount=-1 +kerning first=99 second=275 amount=-1 +kerning first=1066 second=1050 amount=-1 +kerning first=323 second=80 amount=-1 +kerning first=267 second=240 amount=-1 +kerning first=211 second=362 amount=-1 +kerning first=1058 second=1040 amount=-1 +kerning first=1030 second=1050 amount=-1 +kerning first=221 second=284 amount=-1 +kerning first=204 second=275 amount=-1 +kerning first=368 second=332 amount=-1 +kerning first=8218 second=84 amount=-1 +kerning first=209 second=223 amount=-1 +kerning first=345 second=97 amount=-1 +kerning first=66 second=338 amount=-1 +kerning first=305 second=232 amount=-1 +kerning first=272 second=323 amount=-1 +kerning first=269 second=232 amount=-1 +kerning first=1053 second=1080 amount=-1 +kerning first=74 second=107 amount=-1 +kerning first=233 second=232 amount=-1 +kerning first=66 second=199 amount=-1 +kerning first=200 second=323 amount=-1 +kerning first=187 second=119 amount=-1 +kerning first=66 second=258 amount=-1 +kerning first=199 second=317 amount=-1 +kerning first=201 second=336 amount=-1 +kerning first=89 second=250 amount=-1 +kerning first=207 second=199 amount=-1 +kerning first=1057 second=1044 amount=-1 +kerning first=364 second=370 amount=-1 +kerning first=187 second=326 amount=-1 +kerning first=260 second=8250 amount=-1 +kerning first=334 second=256 amount=-1 +kerning first=116 second=226 amount=-1 +kerning first=107 second=314 amount=-1 +kerning first=264 second=311 amount=-1 +kerning first=100 second=234 amount=-1 +kerning first=201 second=325 amount=-1 +kerning first=275 second=116 amount=-1 +kerning first=119 second=8250 amount=-1 +kerning first=192 second=311 amount=-1 +kerning first=217 second=67 amount=-1 +kerning first=219 second=249 amount=-1 +kerning first=205 second=234 amount=-1 +kerning first=83 second=8250 amount=-1 +kerning first=1048 second=1105 amount=-1 +kerning first=73 second=331 amount=-1 +kerning first=227 second=233 amount=-1 +kerning first=354 second=122 amount=-1 +kerning first=1105 second=1119 amount=-1 +kerning first=277 second=234 amount=-1 +kerning first=1062 second=1088 amount=-1 +kerning first=248 second=314 amount=-1 +kerning first=72 second=327 amount=-1 +kerning first=241 second=234 amount=-1 +kerning first=221 second=241 amount=-1 +kerning first=199 second=110 amount=-1 +kerning first=327 second=217 amount=-1 +kerning first=213 second=327 amount=-1 +kerning first=263 second=98 amount=-1 +kerning first=231 second=267 amount=-1 +kerning first=278 second=72 amount=-1 +kerning first=80 second=241 amount=-1 +kerning first=8218 second=338 amount=-1 +kerning first=193 second=216 amount=-1 +kerning first=1067 second=1036 amount=-1 +kerning first=1044 second=1094 amount=-1 +kerning first=1031 second=1036 amount=-1 +kerning first=72 second=115 amount=-1 +kerning first=284 second=114 amount=-1 +kerning first=1050 second=1097 amount=-1 +kerning first=1036 second=1114 amount=-1 +kerning first=325 second=282 amount=-1 +kerning first=70 second=101 amount=-1 +kerning first=106 second=335 amount=-1 +kerning first=1041 second=1062 amount=-1 +kerning first=374 second=109 amount=-1 +kerning first=217 second=225 amount=-1 +kerning first=70 second=335 amount=-1 +kerning first=267 second=267 amount=-1 +kerning first=204 second=302 amount=-1 +kerning first=325 second=225 amount=-1 +kerning first=79 second=370 amount=-1 +kerning first=196 second=46 amount=-1 +kerning first=106 second=101 amount=-1 +kerning first=71 second=114 amount=-1 +kerning first=8250 second=192 amount=-1 +kerning first=339 second=267 amount=-1 +kerning first=225 second=318 amount=-1 +kerning first=283 second=335 amount=-1 +kerning first=261 second=318 amount=-1 +kerning first=268 second=46 amount=-1 +kerning first=89 second=290 amount=-1 +kerning first=73 second=355 amount=-1 +kerning first=194 second=81 amount=-1 +kerning first=206 second=353 amount=-1 +kerning first=89 second=81 amount=-1 +kerning first=302 second=81 amount=-1 +kerning first=368 second=78 amount=-1 +kerning first=338 second=81 amount=-1 +kerning first=200 second=296 amount=-1 +kerning first=72 second=273 amount=-1 +kerning first=346 second=364 amount=-1 +kerning first=1068 second=1064 amount=-1 +kerning first=266 second=81 amount=-1 +kerning first=263 second=44 amount=-1 +kerning first=269 second=8222 amount=-1 +kerning first=70 second=223 amount=-1 +kerning first=8218 second=284 amount=-1 +kerning first=86 second=281 amount=-1 +kerning first=1065 second=1098 amount=-1 +kerning first=374 second=81 amount=-1 +kerning first=106 second=44 amount=-1 +kerning first=83 second=78 amount=-1 +kerning first=8250 second=332 amount=-1 +kerning first=206 second=72 amount=-1 +kerning first=335 second=44 amount=-1 +kerning first=366 second=227 amount=-1 +kerning first=330 second=227 amount=-1 +kerning first=298 second=346 amount=-1 +kerning first=1048 second=1107 amount=-1 +kerning first=201 second=282 amount=-1 +kerning first=262 second=346 amount=-1 +kerning first=271 second=263 amount=-1 +kerning first=205 second=288 amount=-1 +kerning first=192 second=367 amount=-1 +kerning first=67 second=352 amount=-1 +kerning first=85 second=346 amount=-1 +kerning first=281 second=252 amount=-1 +kerning first=199 second=83 amount=-1 +kerning first=1047 second=1119 amount=-1 +kerning first=97 second=337 amount=-1 +kerning first=83 second=278 amount=-1 +kerning first=369 second=291 amount=-1 +kerning first=333 second=291 amount=-1 +kerning first=264 second=230 amount=-1 +kerning first=261 second=291 amount=-1 +kerning first=225 second=291 amount=-1 +kerning first=370 second=346 amount=-1 +kerning first=120 second=291 amount=-1 +kerning first=87 second=230 amount=-1 +kerning first=87 second=257 amount=-1 +kerning first=81 second=200 amount=-1 +kerning first=1047 second=1055 amount=-1 +kerning first=289 second=279 amount=-1 +kerning first=70 second=74 amount=-1 +kerning first=108 second=246 amount=-1 +kerning first=368 second=278 amount=-1 +kerning first=45 second=200 amount=-1 +kerning first=325 second=279 amount=-1 +kerning first=72 second=246 amount=-1 +kerning first=266 second=108 amount=-1 +kerning first=45 second=220 amount=-1 +kerning first=231 second=369 amount=-1 +kerning first=1104 second=1091 amount=-1 +kerning first=352 second=325 amount=-1 +kerning first=70 second=362 amount=-1 +kerning first=8222 second=361 amount=-1 +kerning first=192 second=84 amount=-1 +kerning first=217 second=231 amount=-1 +kerning first=80 second=187 amount=-1 +kerning first=115 second=316 amount=-1 +kerning first=73 second=382 amount=-1 +kerning first=206 second=99 amount=-1 +kerning first=204 second=75 amount=-1 +kerning first=330 second=200 amount=-1 +kerning first=1076 second=1103 amount=-1 +kerning first=1048 second=1091 amount=-1 +kerning first=213 second=8218 amount=-1 +kerning first=204 second=109 amount=-1 +kerning first=314 second=99 amount=-1 +kerning first=75 second=266 amount=-1 +kerning first=1080 second=1095 amount=-1 +kerning first=187 second=65 amount=-1 +kerning first=72 second=8218 amount=-1 +kerning first=221 second=187 amount=-1 +kerning first=259 second=380 amount=-1 +kerning first=223 second=380 amount=-1 +kerning first=112 second=8220 amount=-2 +kerning first=1041 second=1098 amount=-1 +kerning first=240 second=248 amount=-1 +kerning first=268 second=334 amount=-1 +kerning first=218 second=117 amount=-1 +kerning first=1059 second=1108 amount=-1 +kerning first=213 second=202 amount=-1 +kerning first=196 second=334 amount=-1 +kerning first=86 second=44 amount=-1 +kerning first=270 second=218 amount=-1 +kerning first=212 second=260 amount=-1 +kerning first=362 second=117 amount=-1 +kerning first=323 second=218 amount=-1 +kerning first=1048 second=1099 amount=-1 +kerning first=198 second=218 amount=-1 +kerning first=204 second=248 amount=-1 +kerning first=304 second=334 amount=-1 +kerning first=99 second=8220 amount=-2 +kerning first=310 second=364 amount=-1 +kerning first=282 second=209 amount=-1 +kerning first=1055 second=1092 amount=-1 +kerning first=274 second=364 amount=-1 +kerning first=258 second=367 amount=-1 +kerning first=67 second=325 amount=-1 +kerning first=210 second=209 amount=-1 +kerning first=366 second=367 amount=-1 +kerning first=202 second=364 amount=-1 +kerning first=288 second=66 amount=-1 +kerning first=111 second=120 amount=-1 +kerning first=264 second=257 amount=-1 +kerning first=194 second=108 amount=-1 +kerning first=1068 second=1042 amount=-1 +kerning first=195 second=121 amount=-1 +kerning first=240 second=8220 amount=-2 +kerning first=200 second=69 amount=-1 +kerning first=230 second=108 amount=-1 +kerning first=69 second=209 amount=-1 +kerning first=187 second=380 amount=-1 +kerning first=224 second=232 amount=-1 +kerning first=338 second=68 amount=-1 +kerning first=68 second=196 amount=-1 +kerning first=45 second=212 amount=-1 +kerning first=118 second=380 amount=-1 +kerning first=1053 second=1107 amount=-1 +kerning first=368 second=80 amount=-1 +kerning first=366 second=69 amount=-1 +kerning first=353 second=8217 amount=-2 +kerning first=255 second=108 amount=-1 +kerning first=80 second=290 amount=-1 +kerning first=330 second=69 amount=-1 +kerning first=288 second=364 amount=-1 +kerning first=70 second=264 amount=-1 +kerning first=83 second=251 amount=-1 +kerning first=119 second=251 amount=-1 +kerning first=221 second=290 amount=-1 +kerning first=208 second=8221 amount=-2 +kerning first=278 second=338 amount=-1 +kerning first=1049 second=1039 amount=-1 +kerning first=234 second=277 amount=-1 +kerning first=368 second=251 amount=-1 +kerning first=245 second=8217 amount=-2 +kerning first=231 second=316 amount=-1 +kerning first=206 second=338 amount=-1 +kerning first=195 second=316 amount=-1 +kerning first=1058 second=1072 amount=-1 +kerning first=317 second=8217 amount=-1 +kerning first=192 second=355 amount=-1 +kerning first=103 second=8221 amount=-2 +kerning first=45 second=69 amount=-1 +kerning first=330 second=286 amount=-1 +kerning first=267 second=316 amount=-1 +kerning first=366 second=286 amount=-1 +kerning first=375 second=316 amount=-1 +kerning first=339 second=316 amount=-1 +kerning first=235 second=273 amount=-1 +kerning first=81 second=69 amount=-1 +kerning first=65 second=338 amount=-1 +kerning first=280 second=8221 amount=-1 +kerning first=199 second=273 amount=-1 +kerning first=84 second=225 amount=-1 +kerning first=316 second=8221 amount=-1 +kerning first=68 second=82 amount=-1 +kerning first=231 second=99 amount=-1 +kerning first=374 second=347 amount=-1 +kerning first=209 second=82 amount=-1 +kerning first=8218 second=225 amount=-1 +kerning first=258 second=286 amount=-1 +kerning first=210 second=78 amount=-1 +kerning first=66 second=117 amount=-1 +kerning first=228 second=171 amount=-1 +kerning first=1048 second=1056 amount=-1 +kerning first=264 second=171 amount=-1 +kerning first=282 second=78 amount=-1 +kerning first=1071 second=1069 amount=-1 +kerning first=221 second=212 amount=-1 +kerning first=1044 second=1086 amount=-1 +kerning first=217 second=333 amount=-1 +kerning first=243 second=114 amount=-1 +kerning first=1058 second=1082 amount=-1 +kerning first=264 second=355 amount=-1 +kerning first=69 second=78 amount=-1 +kerning first=187 second=282 amount=-1 +kerning first=290 second=73 amount=-1 +kerning first=68 second=8217 amount=-2 +kerning first=363 second=103 amount=-1 +kerning first=219 second=325 amount=-1 +kerning first=279 second=117 amount=-1 +kerning first=8250 second=278 amount=-1 +kerning first=204 second=346 amount=-1 +kerning first=356 second=233 amount=-1 +kerning first=87 second=171 amount=-2 +kerning first=192 second=171 amount=-1 +kerning first=327 second=325 amount=-1 +kerning first=325 second=362 amount=-1 +kerning first=87 second=382 amount=-1 +kerning first=203 second=220 amount=-1 +kerning first=80 second=100 amount=-1 +kerning first=278 second=216 amount=-1 +kerning first=280 second=330 amount=-1 +kerning first=327 second=298 amount=-1 +kerning first=228 second=382 amount=-1 +kerning first=302 second=103 amount=-1 +kerning first=307 second=246 amount=-1 +kerning first=198 second=304 amount=-1 +kerning first=264 second=382 amount=-1 +kerning first=266 second=103 amount=-1 +kerning first=271 second=246 amount=-1 +kerning first=80 second=263 amount=-1 +kerning first=235 second=246 amount=-1 +kerning first=270 second=304 amount=-1 +kerning first=116 second=263 amount=-1 +kerning first=221 second=100 amount=-1 +kerning first=199 second=246 amount=-1 +kerning first=364 second=77 amount=-1 +kerning first=307 second=8218 amount=-1 +kerning first=74 second=211 amount=-1 +kerning first=230 second=245 amount=-1 +kerning first=65 second=366 amount=-1 +kerning first=89 second=103 amount=-1 +kerning first=368 second=224 amount=-1 +kerning first=304 second=68 amount=-1 +kerning first=235 second=8218 amount=-1 +kerning first=67 second=82 amount=-1 +kerning first=325 second=333 amount=-1 +kerning first=8222 second=366 amount=-1 +kerning first=278 second=365 amount=-1 +kerning first=296 second=224 amount=-1 +kerning first=267 second=289 amount=-1 +kerning first=330 second=313 amount=-1 +kerning first=1043 second=1113 amount=-1 +kerning first=325 second=203 amount=-1 +kerning first=231 second=289 amount=-1 +kerning first=366 second=313 amount=-1 +kerning first=211 second=86 amount=-1 +kerning first=339 second=289 amount=-1 +kerning first=65 second=365 amount=-1 +kerning first=268 second=68 amount=-1 +kerning first=101 second=365 amount=-1 +kerning first=98 second=8250 amount=-1 +kerning first=302 second=347 amount=-1 +kerning first=113 second=8220 amount=-2 +kerning first=233 second=281 amount=-1 +kerning first=1103 second=1095 amount=-1 +kerning first=77 second=85 amount=-1 +kerning first=77 second=8220 amount=-1 +kerning first=269 second=281 amount=-1 +kerning first=87 second=111 amount=-1 +kerning first=218 second=8220 amount=-1 +kerning first=305 second=281 amount=-1 +kerning first=305 second=118 amount=-1 +kerning first=266 second=347 amount=-1 +kerning first=290 second=8220 amount=-1 +kerning first=187 second=255 amount=-1 +kerning first=45 second=313 amount=-1 +kerning first=228 second=111 amount=-1 +kerning first=254 second=8220 amount=-2 +kerning first=289 second=369 amount=-1 +kerning first=81 second=313 amount=-1 +kerning first=323 second=211 amount=-1 +kerning first=264 second=111 amount=-1 +kerning first=362 second=8220 amount=-1 +kerning first=1031 second=1095 amount=-1 +kerning first=89 second=347 amount=-1 +kerning first=326 second=8220 amount=-2 +kerning first=1038 second=1057 amount=-1 +kerning first=1071 second=1042 amount=-1 +kerning first=370 second=233 amount=-1 +kerning first=220 second=77 amount=-1 +kerning first=1049 second=1119 amount=-1 +kerning first=79 second=77 amount=-1 +kerning first=1048 second=1083 amount=-1 +kerning first=78 second=298 amount=-1 +kerning first=205 second=315 amount=-1 +kerning first=219 second=298 amount=-1 +kerning first=304 second=339 amount=-1 +kerning first=71 second=206 amount=-1 +kerning first=268 second=310 amount=-1 +kerning first=268 second=339 amount=-1 +kerning first=197 second=118 amount=-1 +kerning first=284 second=206 amount=-1 +kerning first=78 second=271 amount=-1 +kerning first=266 second=76 amount=-1 +kerning first=87 second=225 amount=-1 +kerning first=65 second=284 amount=-1 +kerning first=117 second=232 amount=-1 +kerning first=1059 second=1105 amount=-1 +kerning first=370 second=209 amount=-1 +kerning first=199 second=219 amount=-1 +kerning first=280 second=357 amount=-1 +kerning first=1118 second=1118 amount=-1 +kerning first=366 second=232 amount=-1 +kerning first=219 second=271 amount=-1 +kerning first=330 second=232 amount=-1 +kerning first=233 second=335 amount=-1 +kerning first=327 second=271 amount=-1 +kerning first=264 second=225 amount=-1 +kerning first=1071 second=1054 amount=-1 +kerning first=362 second=85 amount=-1 +kerning first=1043 second=1086 amount=-1 +kerning first=252 second=234 amount=-1 +kerning first=277 second=98 amount=-1 +kerning first=201 second=213 amount=-1 +kerning first=290 second=85 amount=-1 +kerning first=324 second=234 amount=-1 +kerning first=198 second=8249 amount=-1 +kerning first=218 second=85 amount=-1 +kerning first=330 second=235 amount=-1 +kerning first=86 second=229 amount=-1 +kerning first=375 second=289 amount=-1 +kerning first=368 second=197 amount=-1 +kerning first=221 second=46 amount=-1 +kerning first=1031 second=1068 amount=-1 +kerning first=204 second=216 amount=-1 +kerning first=233 second=101 amount=-1 +kerning first=199 second=68 amount=-1 +kerning first=66 second=280 amount=-1 +kerning first=196 second=366 amount=-1 +kerning first=1049 second=1095 amount=-1 +kerning first=8222 second=314 amount=-1 +kerning first=8218 second=226 amount=-1 +kerning first=80 second=344 amount=-1 +kerning first=206 second=67 amount=-1 +kerning first=103 second=357 amount=-1 +kerning first=65 second=67 amount=-1 +kerning first=234 second=250 amount=-1 +kerning first=67 second=357 amount=-1 +kerning first=1055 second=1077 amount=-1 +kerning first=278 second=284 amount=-1 +kerning first=198 second=250 amount=-1 +kerning first=219 second=195 amount=-1 +kerning first=1042 second=1090 amount=-1 +kerning first=68 second=353 amount=-1 +kerning first=263 second=229 amount=-1 +kerning first=209 second=353 amount=-1 +kerning first=80 second=46 amount=-2 +kerning first=1047 second=1114 amount=-1 +kerning first=330 second=259 amount=-1 +kerning first=259 second=333 amount=-1 +kerning first=281 second=353 amount=-1 +kerning first=364 second=196 amount=-1 +kerning first=302 second=76 amount=-1 +kerning first=206 second=284 amount=-1 +kerning first=338 second=76 amount=-1 +kerning first=288 second=207 amount=-1 +kerning first=370 second=70 amount=-1 +kerning first=366 second=259 amount=-1 +kerning first=325 second=116 amount=-1 +kerning first=289 second=116 amount=-1 +kerning first=195 second=213 amount=-1 +kerning first=65 second=311 amount=-1 +kerning first=1051 second=1071 amount=-1 +kerning first=277 second=369 amount=-1 +kerning first=101 second=311 amount=-1 +kerning first=1064 second=1053 amount=-1 +kerning first=262 second=70 amount=-1 +kerning first=232 second=122 amount=-1 +kerning first=1042 second=1117 amount=-1 +kerning first=78 second=244 amount=-1 +kerning first=298 second=70 amount=-1 +kerning first=268 second=122 amount=-1 +kerning first=334 second=70 amount=-1 +kerning first=187 second=203 amount=-1 +kerning first=229 second=378 amount=-1 +kerning first=219 second=244 amount=-1 +kerning first=316 second=113 amount=-1 +kerning first=66 second=204 amount=-1 +kerning first=8218 second=252 amount=-1 +kerning first=270 second=8222 amount=-1 +kerning first=291 second=244 amount=-1 +kerning first=187 second=201 amount=-1 +kerning first=234 second=8222 amount=-1 +kerning first=327 second=244 amount=-1 +kerning first=103 second=113 amount=-1 +kerning first=212 second=366 amount=-1 +kerning first=217 second=116 amount=-1 +kerning first=198 second=8222 amount=-1 +kerning first=363 second=244 amount=-1 +kerning first=337 second=378 amount=-1 +kerning first=207 second=204 amount=-1 +kerning first=225 second=316 amount=-1 +kerning first=67 second=113 amount=-1 +kerning first=88 second=85 amount=-1 +kerning first=195 second=262 amount=-1 +kerning first=250 second=244 amount=-1 +kerning first=1042 second=1102 amount=-1 +kerning first=108 second=108 amount=-1 +kerning first=362 second=302 amount=-1 +kerning first=1050 second=1102 amount=-1 +kerning first=220 second=71 amount=-1 +kerning first=1055 second=1050 amount=-1 +kerning first=1058 second=1104 amount=-1 +kerning first=290 second=302 amount=-1 +kerning first=1036 second=1038 amount=-1 +kerning first=72 second=332 amount=-1 +kerning first=86 second=256 amount=-1 +kerning first=282 second=268 amount=-1 +kerning first=218 second=302 amount=-1 +kerning first=1071 second=1096 amount=-1 +kerning first=305 second=335 amount=-1 +kerning first=70 second=210 amount=-1 +kerning first=77 second=302 amount=-1 +kerning first=80 second=73 amount=-1 +kerning first=193 second=107 amount=-1 +kerning first=87 second=198 amount=-1 +kerning first=1047 second=1087 amount=-1 +kerning first=8220 second=347 amount=-1 +kerning first=1039 second=1053 amount=-1 +kerning first=69 second=268 amount=-1 +kerning first=206 second=77 amount=-1 +kerning first=45 second=362 amount=-1 +kerning first=74 second=75 amount=-1 +kerning first=211 second=354 amount=-1 +kerning first=1071 second=1070 amount=-1 +kerning first=210 second=187 amount=-1 +kerning first=81 second=362 amount=-1 +kerning first=89 second=244 amount=-1 +kerning first=370 second=97 amount=-1 +kerning first=45 second=75 amount=-1 +kerning first=213 second=8250 amount=-1 +kerning first=1041 second=1067 amount=-1 +kerning first=79 second=44 amount=-1 +kerning first=258 second=362 amount=-1 +kerning first=8250 second=197 amount=-1 +kerning first=220 second=213 amount=-1 +kerning first=266 second=244 amount=-1 +kerning first=1067 second=1041 amount=-1 +kerning first=87 second=279 amount=-1 +kerning first=302 second=244 amount=-1 +kerning first=72 second=8250 amount=-1 +kerning first=1031 second=1041 amount=-1 +kerning first=227 second=283 amount=-1 +kerning first=86 second=283 amount=-1 +kerning first=374 second=244 amount=-1 +kerning first=83 second=327 amount=-1 +kerning first=205 second=266 amount=-1 +kerning first=364 second=213 amount=-1 +kerning first=105 second=187 amount=-1 +kerning first=264 second=279 amount=-1 +kerning first=8217 second=120 amount=-1 +kerning first=187 second=211 amount=-1 +kerning first=69 second=187 amount=-1 +kerning first=228 second=279 amount=-1 +kerning first=1075 second=1102 amount=-1 +kerning first=80 second=209 amount=-1 +kerning first=116 second=113 amount=-1 +kerning first=296 second=327 amount=-1 +kerning first=195 second=288 amount=-1 +kerning first=362 second=115 amount=-1 +kerning first=368 second=327 amount=-1 +kerning first=1042 second=1036 amount=-1 +kerning first=283 second=367 amount=-1 +kerning first=1052 second=1062 amount=-1 +kerning first=270 second=196 amount=-1 +kerning first=73 second=79 amount=-1 +kerning first=263 second=283 amount=-1 +kerning first=317 second=218 amount=-1 +kerning first=296 second=110 amount=-1 +kerning first=70 second=367 amount=-1 +kerning first=330 second=205 amount=-1 +kerning first=85 second=70 amount=-1 +kerning first=204 second=270 amount=-1 +kerning first=368 second=110 amount=-1 +kerning first=325 second=257 amount=-1 +kerning first=203 second=274 amount=-1 +kerning first=234 second=380 amount=-1 +kerning first=85 second=317 amount=-1 +kerning first=366 second=205 amount=-1 +kerning first=338 second=296 amount=-1 +kerning first=219 second=367 amount=-1 +kerning first=82 second=114 amount=-1 +kerning first=192 second=252 amount=-1 +kerning first=296 second=338 amount=-1 +kerning first=1049 second=1047 amount=-1 +kerning first=187 second=114 amount=-1 +kerning first=259 second=8249 amount=-1 +kerning first=217 second=284 amount=-1 +kerning first=1030 second=1072 amount=-1 +kerning first=118 second=114 amount=-1 +kerning first=367 second=8249 amount=-1 +kerning first=1040 second=1098 amount=-1 +kerning first=45 second=205 amount=-1 +kerning first=81 second=205 amount=-1 +kerning first=232 second=231 amount=-1 +kerning first=268 second=231 amount=-1 +kerning first=194 second=217 amount=-1 +kerning first=200 second=217 amount=-1 +kerning first=304 second=231 amount=-1 +kerning first=266 second=217 amount=-1 +kerning first=69 second=214 amount=-1 +kerning first=69 second=344 amount=-1 +kerning first=302 second=217 amount=-1 +kerning first=210 second=344 amount=-1 +kerning first=338 second=217 amount=-1 +kerning first=87 second=252 amount=-1 +kerning first=82 second=8249 amount=-1 +kerning first=118 second=8249 amount=-1 +kerning first=280 second=249 amount=-1 +kerning first=206 second=235 amount=-1 +kerning first=316 second=249 amount=-1 +kerning first=243 second=8218 amount=-1 +kerning first=270 second=353 amount=-1 +kerning first=352 second=249 amount=-1 +kerning first=365 second=248 amount=-1 +kerning first=1052 second=1089 amount=-1 +kerning first=234 second=353 amount=-1 +kerning first=314 second=235 amount=-1 +kerning first=103 second=249 amount=-1 +kerning first=200 second=345 amount=-1 +kerning first=75 second=71 amount=-1 +kerning first=229 second=275 amount=-1 +kerning first=366 second=362 amount=-1 +kerning first=204 second=80 amount=-1 +kerning first=330 second=362 amount=-1 +kerning first=344 second=345 amount=-1 +kerning first=262 second=97 amount=-1 +kerning first=99 second=243 amount=-1 +kerning first=298 second=97 amount=-1 +kerning first=231 second=45 amount=-1 +kerning first=77 second=226 amount=-1 +kerning first=325 second=284 amount=-1 +kerning first=296 second=83 amount=-1 +kerning first=198 second=223 amount=-1 +kerning first=1064 second=1080 amount=-1 +kerning first=72 second=278 amount=-1 +kerning first=8250 second=381 amount=-1 +kerning first=368 second=83 amount=-1 +kerning first=218 second=226 amount=-1 +kerning first=240 second=243 amount=-1 +kerning first=1042 second=1063 amount=-1 +kerning first=77 second=199 amount=-1 +kerning first=104 second=245 amount=-1 +kerning first=1049 second=1079 amount=-1 +kerning first=263 second=337 amount=-1 +kerning first=86 second=120 amount=-1 +kerning first=213 second=278 amount=-1 +kerning first=227 second=337 amount=-1 +kerning first=218 second=199 amount=-1 +kerning first=1078 second=1079 amount=-1 +kerning first=368 second=8218 amount=-2 +kerning first=66 second=361 amount=-1 +kerning first=86 second=337 amount=-1 +kerning first=263 second=120 amount=-1 +kerning first=362 second=199 amount=-1 +kerning first=8250 second=327 amount=-1 +kerning first=282 second=344 amount=-1 +kerning first=119 second=8218 amount=-1 +kerning first=84 second=269 amount=-1 +kerning first=83 second=8218 amount=-1 +kerning first=332 second=8218 amount=-1 +kerning first=211 second=313 amount=-1 +kerning first=98 second=291 amount=-1 +kerning first=80 second=88 amount=-1 +kerning first=261 second=269 amount=-1 +kerning first=209 second=245 amount=-1 +kerning first=193 second=221 amount=-1 +kerning first=1036 second=1092 amount=-1 +kerning first=99 second=324 amount=-1 +kerning first=352 second=330 amount=-1 +kerning first=369 second=269 amount=-1 +kerning first=8250 second=110 amount=-1 +kerning first=258 second=118 amount=-1 +kerning first=217 second=203 amount=-1 +kerning first=70 second=313 amount=-1 +kerning first=275 second=111 amount=-1 +kerning first=337 second=8220 amount=-2 +kerning first=212 second=65 amount=-1 +kerning first=197 second=254 amount=-1 +kerning first=233 second=254 amount=-1 +kerning first=356 second=8222 amount=-1 +kerning first=194 second=374 amount=-1 +kerning first=335 second=120 amount=-1 +kerning first=374 second=337 amount=-1 +kerning first=221 second=263 amount=-1 +kerning first=328 second=267 amount=-1 +kerning first=367 second=114 amount=-1 +kerning first=350 second=8249 amount=-1 +kerning first=257 second=263 amount=-1 +kerning first=364 second=267 amount=-1 +kerning first=1077 second=1094 amount=-1 +kerning first=1064 second=1107 amount=-1 +kerning first=45 second=118 amount=-1 +kerning first=205 second=212 amount=-1 +kerning first=259 second=114 amount=-1 +kerning first=365 second=263 amount=-1 +kerning first=88 second=8220 amount=-1 +kerning first=267 second=314 amount=-1 +kerning first=223 second=114 amount=-1 +kerning first=280 second=264 amount=-1 +kerning first=8217 second=364 amount=-1 +kerning first=220 second=267 amount=-1 +kerning first=288 second=315 amount=-1 +kerning first=193 second=8220 amount=-2 +kerning first=195 second=370 amount=-1 +kerning first=211 second=69 amount=-1 +kerning first=214 second=193 amount=-1 +kerning first=86 second=361 amount=-1 +kerning first=8250 second=354 amount=-1 +kerning first=368 second=273 amount=-1 +kerning first=8220 second=217 amount=-1 +kerning first=8222 second=370 amount=-1 +kerning first=1049 second=1052 amount=-1 +kerning first=219 second=81 amount=-1 +kerning first=296 second=273 amount=-1 +kerning first=78 second=81 amount=-1 +kerning first=108 second=251 amount=-1 +kerning first=70 second=69 amount=-1 +kerning first=218 second=355 amount=-1 +kerning first=327 second=81 amount=-1 +kerning first=75 second=44 amount=-1 +kerning first=84 second=281 amount=-1 +kerning first=66 second=334 amount=-1 +kerning first=111 second=44 amount=-1 +kerning first=209 second=218 amount=-1 +kerning first=8218 second=89 amount=-2 +kerning first=203 second=355 amount=-1 +kerning first=207 second=334 amount=-1 +kerning first=89 second=8217 amount=-1 +kerning first=199 second=78 amount=-1 +kerning first=229 second=248 amount=-1 +kerning first=288 second=44 amount=-1 +kerning first=1054 second=1027 amount=-1 +kerning first=216 second=44 amount=-1 +kerning first=225 second=242 amount=-1 +kerning first=339 second=99 amount=-1 +kerning first=78 second=352 amount=-1 +kerning first=261 second=242 amount=-1 +kerning first=74 second=346 amount=-1 +kerning first=267 second=99 amount=-1 +kerning first=219 second=352 amount=-1 +kerning first=1034 second=1024 amount=-1 +kerning first=217 second=230 amount=-1 +kerning first=1070 second=1024 amount=-1 +kerning first=325 second=230 amount=-1 +kerning first=214 second=187 amount=-1 +kerning first=8222 second=339 amount=-1 +kerning first=71 second=282 amount=-1 +kerning first=323 second=290 amount=-1 +kerning first=327 second=352 amount=-1 +kerning first=78 second=332 amount=-1 +kerning first=323 second=346 amount=-1 +kerning first=82 second=87 amount=-1 +kerning first=1071 second=1094 amount=-1 +kerning first=187 second=87 amount=-2 +kerning first=268 second=366 amount=-1 +kerning first=75 second=288 amount=-1 +kerning first=1031 second=1107 amount=-1 +kerning first=205 second=230 amount=-1 +kerning first=1033 second=1052 amount=-1 +kerning first=264 second=233 amount=-1 +kerning first=262 second=288 amount=-1 +kerning first=298 second=288 amount=-1 +kerning first=8218 second=220 amount=-1 +kerning first=304 second=333 amount=-1 +kerning first=249 second=291 amount=-1 +kerning first=68 second=87 amount=-1 +kerning first=1069 second=1052 amount=-1 +kerning first=199 second=81 amount=-1 +kerning first=1059 second=1046 amount=-1 +kerning first=108 second=291 amount=-1 +kerning first=231 second=224 amount=-1 +kerning first=250 second=337 amount=-1 +kerning first=354 second=8218 amount=-1 +kerning first=86 second=334 amount=-1 +kerning first=1066 second=1061 amount=-1 +kerning first=267 second=283 amount=-1 +kerning first=1034 second=1098 amount=-1 +kerning first=109 second=337 amount=-1 +kerning first=1042 second=1027 amount=-1 +kerning first=73 second=337 amount=-1 +kerning first=85 second=288 amount=-1 +kerning first=81 second=84 amount=-1 +kerning first=267 second=224 amount=-1 +kerning first=45 second=84 amount=-1 +kerning first=1051 second=1119 amount=-1 +kerning first=229 second=99 amount=-1 +kerning first=105 second=8218 amount=-1 +kerning first=269 second=8221 amount=-2 +kerning first=69 second=8218 amount=-1 +kerning first=305 second=8221 amount=-1 +kerning first=1053 second=1064 amount=-1 +kerning first=302 second=111 amount=-1 +kerning first=1047 second=1095 amount=-1 +kerning first=377 second=8221 amount=-1 +kerning first=282 second=8218 amount=-1 +kerning first=246 second=8218 amount=-1 +kerning first=210 second=8218 amount=-1 +kerning first=335 second=187 amount=-1 +kerning first=368 second=196 amount=-1 +kerning first=229 second=279 amount=-1 +kerning first=1044 second=1104 amount=-1 +kerning first=209 second=171 amount=-1 +kerning first=86 second=187 amount=-1 +kerning first=289 second=328 amount=-1 +kerning first=1042 second=1041 amount=-1 +kerning first=296 second=209 amount=-1 +kerning first=205 second=364 amount=-1 +kerning first=258 second=264 amount=-1 +kerning first=264 second=66 amount=-1 +kerning first=195 second=371 amount=-1 +kerning first=199 second=261 amount=-1 +kerning first=197 second=316 amount=-1 +kerning first=67 second=368 amount=-1 +kerning first=323 second=69 amount=-1 +kerning first=226 second=108 amount=-1 +kerning first=262 second=209 amount=-1 +kerning first=269 second=316 amount=-1 +kerning first=83 second=209 amount=-1 +kerning first=262 second=108 amount=-1 +kerning first=1050 second=1073 amount=-1 +kerning first=198 second=202 amount=-1 +kerning first=233 second=316 amount=-1 +kerning first=304 second=257 amount=-1 +kerning first=45 second=264 amount=-1 +kerning first=121 second=108 amount=-1 +kerning first=1052 second=1031 amount=-1 +kerning first=1050 second=1086 amount=-1 +kerning first=268 second=257 amount=-1 +kerning first=270 second=202 amount=-1 +kerning first=201 second=116 amount=-1 +kerning first=280 second=368 amount=-1 +kerning first=264 second=380 amount=-1 +kerning first=1049 second=1027 amount=-1 +kerning first=197 second=303 amount=-1 +kerning first=352 second=368 amount=-1 +kerning first=268 second=270 amount=-1 +kerning first=87 second=367 amount=-1 +kerning first=1031 second=1113 amount=-1 +kerning first=304 second=270 amount=-1 +kerning first=104 second=281 amount=-1 +kerning first=327 second=273 amount=-1 +kerning first=193 second=211 amount=-1 +kerning first=1119 second=1095 amount=-1 +kerning first=313 second=364 amount=-1 +kerning first=74 second=69 amount=-1 +kerning first=368 second=209 amount=-1 +kerning first=1039 second=1034 amount=-1 +kerning first=219 second=273 amount=-1 +kerning first=231 second=44 amount=-1 +kerning first=274 second=252 amount=-1 +kerning first=267 second=44 amount=-1 +kerning first=99 second=8249 amount=-1 +kerning first=280 second=355 amount=-1 +kerning first=346 second=252 amount=-1 +kerning first=78 second=273 amount=-1 +kerning first=362 second=214 amount=-1 +kerning first=310 second=252 amount=-1 +kerning first=375 second=44 amount=-1 +kerning first=212 second=78 amount=-1 +kerning first=87 second=380 amount=-1 +kerning first=80 second=205 amount=-1 +kerning first=228 second=380 amount=-1 +kerning first=284 second=78 amount=-1 +kerning first=67 second=355 amount=-1 +kerning first=362 second=227 amount=-1 +kerning first=213 second=8221 amount=-2 +kerning first=302 second=325 amount=-1 +kerning first=235 second=248 amount=-1 +kerning first=1047 second=1082 amount=-1 +kerning first=266 second=325 amount=-1 +kerning first=77 second=214 amount=-1 +kerning first=199 second=248 amount=-1 +kerning first=187 second=117 amount=-1 +kerning first=8218 second=233 amount=-1 +kerning first=70 second=346 amount=-1 +kerning first=307 second=248 amount=-1 +kerning first=338 second=325 amount=-1 +kerning first=71 second=78 amount=-1 +kerning first=271 second=248 amount=-1 +kerning first=67 second=224 amount=-1 +kerning first=317 second=87 amount=-1 +kerning first=202 second=252 amount=-1 +kerning first=218 second=214 amount=-1 +kerning first=83 second=330 amount=-1 +kerning first=283 second=333 amount=-1 +kerning first=86 second=347 amount=-1 +kerning first=350 second=75 amount=-1 +kerning first=192 second=220 amount=-1 +kerning first=1056 second=1042 amount=-1 +kerning first=1031 second=1092 amount=-1 +kerning first=1044 second=1117 amount=-1 +kerning first=73 second=350 amount=-1 +kerning first=8250 second=317 amount=-1 +kerning first=365 second=339 amount=-1 +kerning first=1066 second=1048 amount=-1 +kerning first=8217 second=334 amount=-1 +kerning first=199 second=382 amount=-1 +kerning first=101 second=289 amount=-1 +kerning first=1030 second=1048 amount=-1 +kerning first=355 second=333 amount=-1 +kerning first=235 second=382 amount=-1 +kerning first=242 second=289 amount=-1 +kerning first=304 second=103 amount=-1 +kerning first=99 second=171 amount=-1 +kerning first=368 second=330 amount=-1 +kerning first=268 second=103 amount=-1 +kerning first=264 second=246 amount=-1 +kerning first=209 second=100 amount=-1 +kerning first=314 second=289 amount=-1 +kerning first=232 second=103 amount=-1 +kerning first=228 second=246 amount=-1 +kerning first=8222 second=332 amount=-1 +kerning first=281 second=100 amount=-1 +kerning first=72 second=270 amount=-1 +kerning first=264 second=220 amount=-1 +kerning first=70 second=333 amount=-1 +kerning first=304 second=77 amount=-1 +kerning first=368 second=201 amount=-1 +kerning first=106 second=333 amount=-1 +kerning first=87 second=246 amount=-1 +kerning first=350 second=82 amount=-1 +kerning first=8222 second=378 amount=-1 +kerning first=1056 second=1068 amount=-1 +kerning first=296 second=330 amount=-1 +kerning first=268 second=77 amount=-1 +kerning first=67 second=273 amount=-1 +kerning first=274 second=85 amount=-1 +kerning first=335 second=8250 amount=-1 +kerning first=275 second=333 amount=-1 +kerning first=266 second=338 amount=-1 +kerning first=202 second=85 amount=-1 +kerning first=213 second=304 amount=-1 +kerning first=194 second=338 amount=-1 +kerning first=271 second=8249 amount=-1 +kerning first=374 second=8217 amount=-1 +kerning first=246 second=120 amount=-1 +kerning first=89 second=338 amount=-1 +kerning first=195 second=211 amount=-1 +kerning first=72 second=304 amount=-1 +kerning first=282 second=313 amount=-1 +kerning first=220 second=332 amount=-1 +kerning first=271 second=382 amount=-1 +kerning first=257 second=339 amount=-1 +kerning first=187 second=364 amount=-1 +kerning first=221 second=339 amount=-1 +kerning first=203 second=298 amount=-1 +kerning first=1042 second=1025 amount=-1 +kerning first=69 second=371 amount=-1 +kerning first=242 second=8221 amount=-2 +kerning first=364 second=332 amount=-1 +kerning first=80 second=339 amount=-1 +kerning first=193 second=86 amount=-1 +kerning first=206 second=109 amount=-1 +kerning first=263 second=347 amount=-1 +kerning first=1030 second=1074 amount=-1 +kerning first=210 second=313 amount=-1 +kerning first=366 second=264 amount=-1 +kerning first=197 second=290 amount=-1 +kerning first=330 second=264 amount=-1 +kerning first=116 second=339 amount=-1 +kerning first=249 second=111 amount=-1 +kerning first=363 second=45 amount=-1 +kerning first=287 second=357 amount=-1 +kerning first=8222 second=231 amount=-1 +kerning first=1027 second=1083 amount=-1 +kerning first=256 second=8250 amount=-1 +kerning first=281 second=254 amount=-1 +kerning first=220 second=8250 amount=-2 +kerning first=69 second=313 amount=-1 +kerning first=323 second=357 amount=-1 +kerning first=73 second=203 amount=-1 +kerning first=187 second=323 amount=-1 +kerning first=79 second=8250 amount=-1 +kerning first=74 second=357 amount=-1 +kerning first=356 second=271 amount=-1 +kerning first=1071 second=1118 amount=-1 +kerning first=205 second=76 amount=-1 +kerning first=201 second=219 amount=-1 +kerning first=230 second=8217 amount=-2 +kerning first=217 second=315 amount=-1 +kerning first=266 second=8217 amount=-1 +kerning first=338 second=8217 amount=-1 +kerning first=74 second=262 amount=-1 +kerning first=72 second=111 amount=-1 +kerning first=108 second=111 amount=-1 +kerning first=235 second=363 amount=-1 +kerning first=346 second=85 amount=-1 +kerning first=99 second=104 amount=-1 +kerning first=194 second=8217 amount=-2 +kerning first=8218 second=367 amount=-1 +kerning first=325 second=315 amount=-1 +kerning first=77 second=330 amount=-1 +kerning first=68 second=280 amount=-1 +kerning first=101 second=263 amount=-1 +kerning first=8222 second=103 amount=-1 +kerning first=71 second=366 amount=-1 +kerning first=67 second=203 amount=-1 +kerning first=206 second=263 amount=-1 +kerning first=205 second=204 amount=-1 +kerning first=67 second=100 amount=-1 +kerning first=45 second=110 amount=-1 +kerning first=204 second=331 amount=-1 +kerning first=85 second=366 amount=-1 +kerning first=209 second=280 amount=-1 +kerning first=304 second=277 amount=-1 +kerning first=314 second=263 amount=-1 +kerning first=262 second=314 amount=-1 +kerning first=220 second=66 amount=-1 +kerning first=221 second=365 amount=-1 +kerning first=99 second=97 amount=-1 +kerning first=286 second=203 amount=-1 +kerning first=1071 second=1055 amount=-1 +kerning first=356 second=8249 amount=-1 +kerning first=327 second=8221 amount=-1 +kerning first=366 second=110 amount=-1 +kerning first=84 second=229 amount=-1 +kerning first=330 second=110 amount=-1 +kerning first=67 second=67 amount=-1 +kerning first=214 second=203 amount=-1 +kerning first=284 second=366 amount=-1 +kerning first=339 second=250 amount=-1 +kerning first=210 second=192 amount=-1 +kerning first=78 second=67 amount=-1 +kerning first=1047 second=1024 amount=-1 +kerning first=278 second=70 amount=-1 +kerning first=84 second=101 amount=-1 +kerning first=267 second=250 amount=-1 +kerning first=76 second=354 amount=-1 +kerning first=231 second=250 amount=-1 +kerning first=8222 second=290 amount=-1 +kerning first=350 second=70 amount=-1 +kerning first=8217 second=115 amount=-1 +kerning first=304 second=378 amount=-1 +kerning first=261 second=101 amount=-1 +kerning first=263 second=46 amount=-1 +kerning first=268 second=378 amount=-1 +kerning first=288 second=76 amount=-1 +kerning first=225 second=101 amount=-1 +kerning first=375 second=250 amount=-1 +kerning first=232 second=378 amount=-1 +kerning first=206 second=70 amount=-1 +kerning first=78 second=8217 amount=-1 +kerning first=114 second=8217 amount=-1 +kerning first=325 second=325 amount=-1 +kerning first=262 second=262 amount=-1 +kerning first=344 second=366 amount=-1 +kerning first=1039 second=1030 amount=-1 +kerning first=369 second=101 amount=-1 +kerning first=219 second=8217 amount=-1 +kerning first=1041 second=1087 amount=-1 +kerning first=195 second=250 amount=-1 +kerning first=304 second=296 amount=-1 +kerning first=1059 second=1072 amount=-1 +kerning first=207 second=201 amount=-1 +kerning first=298 second=262 amount=-1 +kerning first=268 second=296 amount=-1 +kerning first=45 second=375 amount=-1 +kerning first=370 second=262 amount=-1 +kerning first=220 second=280 amount=-1 +kerning first=99 second=249 amount=-1 +kerning first=45 second=354 amount=-1 +kerning first=279 second=116 amount=-1 +kerning first=66 second=201 amount=-1 +kerning first=246 second=291 amount=-1 +kerning first=220 second=345 amount=-1 +kerning first=235 second=369 amount=-1 +kerning first=87 second=259 amount=-1 +kerning first=207 second=116 amount=-1 +kerning first=364 second=280 amount=-1 +kerning first=70 second=207 amount=-1 +kerning first=221 second=8250 amount=-1 +kerning first=1071 second=1105 amount=-1 +kerning first=338 second=204 amount=-1 +kerning first=1043 second=1084 amount=-1 +kerning first=328 second=345 amount=-1 +kerning first=302 second=204 amount=-1 +kerning first=364 second=345 amount=-1 +kerning first=266 second=204 amount=-1 +kerning first=264 second=259 amount=-1 +kerning first=118 second=103 amount=-1 +kerning first=307 second=287 amount=-1 +kerning first=204 second=210 amount=-1 +kerning first=271 second=287 amount=-1 +kerning first=278 second=274 amount=-1 +kerning first=264 second=207 amount=-1 +kerning first=235 second=287 amount=-1 +kerning first=72 second=317 amount=-1 +kerning first=327 second=67 amount=-1 +kerning first=82 second=336 amount=-1 +kerning first=209 second=113 amount=-1 +kerning first=219 second=67 amount=-1 +kerning first=201 second=366 amount=-1 +kerning first=213 second=317 amount=-1 +kerning first=187 second=336 amount=-1 +kerning first=104 second=113 amount=-1 +kerning first=364 second=8250 amount=-2 +kerning first=66 second=116 amount=-1 +kerning first=291 second=335 amount=-1 +kerning first=76 second=8220 amount=-1 +kerning first=218 second=73 amount=-1 +kerning first=232 second=244 amount=-1 +kerning first=369 second=281 amount=-1 +kerning first=1047 second=1056 amount=-1 +kerning first=1089 second=1103 amount=-1 +kerning first=268 second=244 amount=-1 +kerning first=269 second=97 amount=-1 +kerning first=304 second=244 amount=-1 +kerning first=259 second=233 amount=-1 +kerning first=362 second=73 amount=-1 +kerning first=274 second=278 amount=-1 +kerning first=325 second=8220 amount=-1 +kerning first=8217 second=216 amount=-1 +kerning first=86 second=213 amount=-1 +kerning first=289 second=8220 amount=-2 +kerning first=202 second=278 amount=-1 +kerning first=88 second=216 amount=-1 +kerning first=272 second=88 amount=-1 +kerning first=117 second=279 amount=-1 +kerning first=206 second=209 amount=-1 +kerning first=346 second=278 amount=-1 +kerning first=366 second=277 amount=-1 +kerning first=77 second=73 amount=-1 +kerning first=330 second=277 amount=-1 +kerning first=100 second=269 amount=-1 +kerning first=199 second=235 amount=-1 +kerning first=225 second=281 amount=-1 +kerning first=80 second=77 amount=-1 +kerning first=235 second=235 amount=-1 +kerning first=261 second=281 amount=-1 +kerning first=74 second=82 amount=-1 +kerning first=1056 second=1081 amount=-1 +kerning first=241 second=269 amount=-1 +kerning first=305 second=45 amount=-1 +kerning first=277 second=269 amount=-1 +kerning first=279 second=283 amount=-1 +kerning first=203 second=79 amount=-1 +kerning first=205 second=269 amount=-1 +kerning first=344 second=219 amount=-1 +kerning first=257 second=231 amount=-1 +kerning first=207 second=283 amount=-1 +kerning first=205 second=338 amount=-1 +kerning first=193 second=253 amount=-1 +kerning first=330 second=290 amount=-1 +kerning first=323 second=82 amount=-1 +kerning first=1047 second=1038 amount=-2 +kerning first=327 second=286 amount=-1 +kerning first=366 second=290 amount=-1 +kerning first=289 second=113 amount=-1 +kerning first=365 second=231 amount=-1 +kerning first=1053 second=1025 amount=-1 +kerning first=1056 second=1094 amount=-1 +kerning first=210 second=274 amount=-1 +kerning first=78 second=286 amount=-1 +kerning first=45 second=382 amount=-1 +kerning first=277 second=351 amount=-1 +kerning first=330 second=378 amount=-1 +kerning first=204 second=85 amount=-1 +kerning first=219 second=286 amount=-1 +kerning first=1059 second=1085 amount=-1 +kerning first=205 second=351 amount=-1 +kerning first=69 second=274 amount=-1 +kerning first=45 second=290 amount=-1 +kerning first=362 second=382 amount=-1 +kerning first=85 second=275 amount=-1 +kerning first=253 second=367 amount=-1 +kerning first=201 second=310 amount=-1 +kerning first=86 second=115 amount=-1 +kerning first=225 second=114 amount=-1 +kerning first=217 second=367 amount=-1 +kerning first=354 second=261 amount=-1 +kerning first=333 second=114 amount=-1 +kerning first=259 second=345 amount=-1 +kerning first=219 second=80 amount=-1 +kerning first=275 second=104 amount=-1 +kerning first=289 second=367 amount=-1 +kerning first=119 second=8217 amount=-2 +kerning first=205 second=217 amount=-1 +kerning first=203 second=66 amount=-1 +kerning first=213 second=8222 amount=-1 +kerning first=327 second=80 amount=-1 +kerning first=270 second=310 amount=-1 +kerning first=80 second=231 amount=-1 +kerning first=69 second=205 amount=-1 +kerning first=116 second=231 amount=-1 +kerning first=283 second=251 amount=-1 +kerning first=313 second=217 amount=-1 +kerning first=198 second=310 amount=-1 +kerning first=65 second=121 amount=-1 +kerning first=221 second=231 amount=-1 +kerning first=8220 second=220 amount=-1 +kerning first=82 second=284 amount=-1 +kerning first=263 second=115 amount=-1 +kerning first=1071 second=1034 amount=-1 +kerning first=282 second=205 amount=-1 +kerning first=78 second=80 amount=-1 +kerning first=187 second=284 amount=-1 +kerning first=210 second=205 amount=-1 +kerning first=1049 second=1053 amount=-1 +kerning first=270 second=362 amount=-1 +kerning first=271 second=235 amount=-1 +kerning first=323 second=353 amount=-1 +kerning first=73 second=242 amount=-1 +kerning first=207 second=214 amount=-1 +kerning first=366 second=71 amount=-1 +kerning first=330 second=71 amount=-1 +kerning first=88 second=266 amount=-1 +kerning first=1071 second=1027 amount=-1 +kerning first=207 second=75 amount=-1 +kerning first=193 second=266 amount=-1 +kerning first=109 second=242 amount=-1 +kerning first=230 second=106 amount=-1 +kerning first=284 second=46 amount=-1 +kerning first=370 second=275 amount=-1 +kerning first=286 second=310 amount=-1 +kerning first=70 second=45 amount=-2 +kerning first=108 second=252 amount=-1 +kerning first=106 second=45 amount=-1 +kerning first=262 second=275 amount=-1 +kerning first=287 second=249 amount=-1 +kerning first=66 second=214 amount=-1 +kerning first=226 second=275 amount=-1 +kerning first=258 second=71 amount=-1 +kerning first=98 second=8218 amount=-1 +kerning first=355 second=45 amount=-1 +kerning first=198 second=362 amount=-1 +kerning first=8218 second=259 amount=-1 +kerning first=245 second=378 amount=-1 +kerning first=217 second=233 amount=-1 +kerning first=325 second=302 amount=-1 +kerning first=84 second=337 amount=-1 +kerning first=99 second=223 amount=-1 +kerning first=1068 second=1045 amount=-1 +kerning first=204 second=99 amount=-1 +kerning first=78 second=234 amount=-1 +kerning first=218 second=361 amount=-1 +kerning first=219 second=234 amount=-1 +kerning first=281 second=267 amount=-1 +kerning first=193 second=87 amount=-1 +kerning first=1102 second=1113 amount=-1 +kerning first=217 second=302 amount=-1 +kerning first=1034 second=1046 amount=-1 +kerning first=289 second=233 amount=-1 +kerning first=291 second=234 amount=-1 +kerning first=1070 second=1046 amount=-1 +kerning first=97 second=291 amount=-1 +kerning first=325 second=233 amount=-1 +kerning first=366 second=346 amount=-1 +kerning first=85 second=327 amount=-1 +kerning first=118 second=117 amount=-1 +kerning first=362 second=361 amount=-1 +kerning first=206 second=122 amount=-1 +kerning first=8217 second=223 amount=-1 +kerning first=1068 second=1037 amount=-1 +kerning first=242 second=122 amount=-1 +kerning first=324 second=243 amount=-1 +kerning first=369 second=337 amount=-1 +kerning first=1076 second=1080 amount=-1 +kerning first=101 second=122 amount=-1 +kerning first=1040 second=1080 amount=-1 +kerning first=262 second=327 amount=-1 +kerning first=330 second=357 amount=-1 +kerning first=220 second=224 amount=-1 +kerning first=298 second=327 amount=-1 +kerning first=261 second=337 amount=-1 +kerning first=80 second=352 amount=-1 +kerning first=334 second=327 amount=-1 +kerning first=225 second=337 amount=-1 +kerning first=197 second=8221 amount=-2 +kerning first=212 second=258 amount=-1 +kerning first=72 second=298 amount=-1 +kerning first=233 second=8221 amount=-2 +kerning first=364 second=224 amount=-1 +kerning first=8218 second=380 amount=-1 +kerning first=1044 second=1076 amount=-1 +kerning first=1071 second=1036 amount=-1 +kerning first=268 second=107 amount=-1 +kerning first=366 second=225 amount=-1 +kerning first=202 second=72 amount=-1 +kerning first=330 second=225 amount=-1 +kerning first=1068 second=1044 amount=-1 +kerning first=74 second=370 amount=-1 +kerning first=193 second=318 amount=-1 +kerning first=229 second=318 amount=-1 +kerning first=279 second=335 amount=-1 +kerning first=335 second=46 amount=-1 +kerning first=8250 second=209 amount=-1 +kerning first=346 second=72 amount=-1 +kerning first=104 second=267 amount=-1 +kerning first=1058 second=1071 amount=-1 +kerning first=204 second=344 amount=-1 +kerning first=327 second=234 amount=-1 +kerning first=1031 second=1055 amount=-1 +kerning first=337 second=318 amount=-1 +kerning first=192 second=105 amount=-1 +kerning first=274 second=72 amount=-1 +kerning first=209 second=267 amount=-1 +kerning first=1067 second=1055 amount=-1 +kerning first=8222 second=244 amount=-1 +kerning first=70 second=199 amount=-1 +kerning first=369 second=114 amount=-1 +kerning first=323 second=370 amount=-1 +kerning first=366 second=199 amount=-1 +kerning first=193 second=361 amount=-1 +kerning first=368 second=111 amount=-1 +kerning first=344 second=212 amount=-1 +kerning first=269 second=311 amount=-1 +kerning first=66 second=374 amount=-1 +kerning first=8220 second=364 amount=-1 +kerning first=1041 second=1031 amount=-1 +kerning first=1039 second=1086 amount=-1 +kerning first=370 second=264 amount=-1 +kerning first=192 second=118 amount=-1 +kerning first=200 second=212 amount=-1 +kerning first=1052 second=1083 amount=-1 +kerning first=85 second=206 amount=-1 +kerning first=234 second=267 amount=-1 +kerning first=220 second=225 amount=-1 +kerning first=249 second=281 amount=-1 +kerning first=334 second=206 amount=-1 +kerning first=205 second=115 amount=-1 +kerning first=370 second=206 amount=-1 +kerning first=197 second=368 amount=-1 +kerning first=1108 second=1095 amount=-1 +kerning first=262 second=206 amount=-1 +kerning first=283 second=114 amount=-1 +kerning first=277 second=115 amount=-1 +kerning first=298 second=206 amount=-1 +kerning first=224 second=111 amount=-1 +kerning first=8216 second=193 amount=-2 +kerning first=325 second=220 amount=-1 +kerning first=296 second=111 amount=-1 +kerning first=1072 second=1095 amount=-1 +kerning first=362 second=284 amount=-1 +kerning first=70 second=114 amount=-1 +kerning first=1036 second=1095 amount=-1 +kerning first=368 second=81 amount=-1 +kerning first=85 second=370 amount=-1 +kerning first=284 second=310 amount=-1 +kerning first=289 second=263 amount=-1 +kerning first=296 second=81 amount=-1 +kerning first=325 second=263 amount=-1 +kerning first=212 second=310 amount=-1 +kerning first=88 second=8249 amount=-1 +kerning first=210 second=68 amount=-1 +kerning first=262 second=370 amount=-1 +kerning first=193 second=8249 amount=-1 +kerning first=71 second=310 amount=-1 +kerning first=282 second=68 amount=-1 +kerning first=69 second=365 amount=-1 +kerning first=229 second=8249 amount=-1 +kerning first=45 second=199 amount=-1 +kerning first=316 second=106 amount=-1 +kerning first=370 second=370 amount=-1 +kerning first=203 second=203 amount=-1 +kerning first=278 second=330 amount=-1 +kerning first=298 second=370 amount=-1 +kerning first=334 second=370 amount=-1 +kerning first=315 second=374 amount=-1 +kerning first=258 second=199 amount=-1 +kerning first=244 second=106 amount=-1 +kerning first=1118 second=1101 amount=-1 +kerning first=330 second=199 amount=-1 +kerning first=217 second=263 amount=-1 +kerning first=66 second=325 amount=-1 +kerning first=71 second=327 amount=-1 +kerning first=346 second=8222 amount=-1 +kerning first=204 second=223 amount=-1 +kerning first=212 second=327 amount=-1 +kerning first=89 second=230 amount=-1 +kerning first=77 second=204 amount=-1 +kerning first=202 second=8222 amount=-1 +kerning first=8222 second=227 amount=-1 +kerning first=8250 second=382 amount=-1 +kerning first=202 second=334 amount=-1 +kerning first=204 second=279 amount=-1 +kerning first=99 second=279 amount=-1 +kerning first=74 second=361 amount=-1 +kerning first=310 second=334 amount=-1 +kerning first=65 second=210 amount=-1 +kerning first=201 second=288 amount=-1 +kerning first=364 second=44 amount=-2 +kerning first=79 second=87 amount=-1 +kerning first=288 second=187 amount=-1 +kerning first=325 second=213 amount=-1 +kerning first=274 second=334 amount=-1 +kerning first=224 second=291 amount=-1 +kerning first=74 second=318 amount=-1 +kerning first=1052 second=1056 amount=-1 +kerning first=1054 second=1045 amount=-1 +kerning first=197 second=84 amount=-1 +kerning first=197 second=221 amount=-1 +kerning first=272 second=75 amount=-1 +kerning first=75 second=187 amount=-1 +kerning first=207 second=270 amount=-1 +kerning first=287 second=318 amount=-1 +kerning first=77 second=99 amount=-1 +kerning first=365 second=101 amount=-1 +kerning first=86 second=279 amount=-1 +kerning first=8222 second=234 amount=-1 +kerning first=268 second=352 amount=-1 +kerning first=200 second=75 amount=-1 +kerning first=367 second=245 amount=-1 +kerning first=304 second=352 amount=-1 +kerning first=1060 second=1027 amount=-1 +kerning first=216 second=187 amount=-1 +kerning first=1040 second=1119 amount=-1 +kerning first=218 second=99 amount=-1 +kerning first=1042 second=1064 amount=-1 +kerning first=1076 second=1119 amount=-1 +kerning first=211 second=192 amount=-1 +kerning first=259 second=245 amount=-1 +kerning first=111 second=187 amount=-1 +kerning first=275 second=337 amount=-1 +kerning first=1053 second=1067 amount=-1 +kerning first=204 second=230 amount=-1 +kerning first=374 second=230 amount=-1 +kerning first=362 second=99 amount=-1 +kerning first=213 second=196 amount=-1 +kerning first=85 second=8220 amount=-1 +kerning first=326 second=99 amount=-1 +kerning first=326 second=287 amount=-1 +kerning first=209 second=332 amount=-1 +kerning first=302 second=230 amount=-1 +kerning first=266 second=230 amount=-1 +kerning first=101 second=235 amount=-1 +kerning first=66 second=73 amount=-1 +kerning first=355 second=277 amount=-1 +kerning first=244 second=316 amount=-1 +kerning first=100 second=8217 amount=-1 +kerning first=68 second=8250 amount=-1 +kerning first=8218 second=118 amount=-1 +kerning first=283 second=277 amount=-1 +kerning first=316 second=316 amount=-1 +kerning first=74 second=108 amount=-1 +kerning first=363 second=281 amount=-1 +kerning first=207 second=73 amount=-1 +kerning first=234 second=104 amount=-1 +kerning first=1039 second=1073 amount=-1 +kerning first=67 second=290 amount=-1 +kerning first=203 second=116 amount=-1 +kerning first=197 second=264 amount=-1 +kerning first=70 second=277 amount=-1 +kerning first=85 second=193 amount=-1 +kerning first=334 second=69 amount=-1 +kerning first=212 second=323 amount=-1 +kerning first=338 second=364 amount=-1 +kerning first=298 second=69 amount=-1 +kerning first=327 second=338 amount=-1 +kerning first=302 second=364 amount=-1 +kerning first=1052 second=1084 amount=-1 +kerning first=266 second=364 amount=-1 +kerning first=370 second=69 amount=-1 +kerning first=71 second=323 amount=-1 +kerning first=241 second=8217 amount=-2 +kerning first=194 second=364 amount=-1 +kerning first=277 second=8217 amount=-2 +kerning first=262 second=69 amount=-1 +kerning first=374 second=273 amount=-1 +kerning first=106 second=277 amount=-1 +kerning first=219 second=338 amount=-1 +kerning first=233 second=355 amount=-1 +kerning first=280 second=286 amount=-1 +kerning first=302 second=273 amount=-1 +kerning first=197 second=355 amount=-1 +kerning first=370 second=193 amount=-1 +kerning first=266 second=273 amount=-1 +kerning first=205 second=325 amount=-1 +kerning first=231 second=113 amount=-1 +kerning first=85 second=69 amount=-1 +kerning first=230 second=273 amount=-1 +kerning first=267 second=113 amount=-1 +kerning first=1052 second=1091 amount=-1 +kerning first=110 second=171 amount=-1 +kerning first=89 second=273 amount=-1 +kerning first=204 second=82 amount=-1 +kerning first=334 second=193 amount=-1 +kerning first=74 second=314 amount=-1 +kerning first=80 second=116 amount=-1 +kerning first=187 second=78 amount=-1 +kerning first=70 second=110 amount=-1 +kerning first=1064 second=1047 amount=-1 +kerning first=287 second=314 amount=-1 +kerning first=1052 second=1070 amount=-1 +kerning first=1036 second=1082 amount=-1 +kerning first=67 second=286 amount=-1 +kerning first=194 second=84 amount=-1 +kerning first=103 second=316 amount=-1 +kerning first=67 second=316 amount=-1 +kerning first=1047 second=1043 amount=-1 +kerning first=366 second=333 amount=-1 +kerning first=234 second=100 amount=-1 +kerning first=240 second=269 amount=-1 +kerning first=85 second=116 amount=-1 +kerning first=321 second=356 amount=-1 +kerning first=8217 second=213 amount=-1 +kerning first=1030 second=1100 amount=-1 +kerning first=317 second=219 amount=-1 +kerning first=112 second=289 amount=-1 +kerning first=1055 second=1048 amount=-1 +kerning first=330 second=333 amount=-1 +kerning first=253 second=289 amount=-1 +kerning first=8218 second=122 amount=-1 +kerning first=354 second=339 amount=-1 +kerning first=109 second=101 amount=-1 +kerning first=366 second=194 amount=-1 +kerning first=1067 second=1042 amount=-1 +kerning first=73 second=101 amount=-1 +kerning first=66 second=77 amount=-1 +kerning first=289 second=289 amount=-1 +kerning first=213 second=356 amount=-1 +kerning first=69 second=68 amount=-1 +kerning first=251 second=171 amount=-1 +kerning first=1071 second=1049 amount=-1 +kerning first=287 second=171 amount=-1 +kerning first=346 second=304 amount=-1 +kerning first=323 second=171 amount=-1 +kerning first=351 second=103 amount=-1 +kerning first=8249 second=89 amount=-1 +kerning first=355 second=281 amount=-1 +kerning first=275 second=246 amount=-1 +kerning first=74 second=270 amount=-1 +kerning first=279 second=103 amount=-1 +kerning first=76 second=220 amount=-1 +kerning first=72 second=330 amount=-1 +kerning first=202 second=304 amount=-1 +kerning first=243 second=103 amount=-1 +kerning first=80 second=296 amount=-1 +kerning first=217 second=220 amount=-1 +kerning first=213 second=330 amount=-1 +kerning first=207 second=103 amount=-1 +kerning first=79 second=280 amount=-1 +kerning first=230 second=46 amount=-1 +kerning first=274 second=304 amount=-1 +kerning first=78 second=338 amount=-1 +kerning first=333 second=8250 amount=-1 +kerning first=325 second=262 amount=-1 +kerning first=1055 second=1074 amount=-1 +kerning first=231 second=109 amount=-1 +kerning first=321 second=85 amount=-1 +kerning first=221 second=8218 amount=-2 +kerning first=1064 second=1051 amount=-1 +kerning first=73 second=298 amount=-1 +kerning first=70 second=281 amount=-1 +kerning first=264 second=315 amount=-1 +kerning first=267 second=109 amount=-1 +kerning first=74 second=277 amount=-1 +kerning first=105 second=339 amount=-1 +kerning first=72 second=85 amount=-1 +kerning first=119 second=382 amount=-1 +kerning first=214 second=298 amount=-1 +kerning first=258 second=355 amount=-1 +kerning first=364 second=211 amount=-1 +kerning first=199 second=313 amount=-1 +kerning first=224 second=382 amount=-1 +kerning first=353 second=8250 amount=-1 +kerning first=286 second=298 amount=-1 +kerning first=1038 second=1040 amount=-1 +kerning first=280 second=290 amount=-1 +kerning first=116 second=8218 amount=-1 +kerning first=240 second=8221 amount=-2 +kerning first=296 second=382 amount=-1 +kerning first=281 second=8250 amount=-1 +kerning first=228 second=289 amount=-1 +kerning first=1068 second=1079 amount=-1 +kerning first=245 second=8250 amount=-1 +kerning first=368 second=382 amount=-1 +kerning first=209 second=8250 amount=-1 +kerning first=224 second=287 amount=-1 +kerning first=221 second=120 amount=-1 +kerning first=230 second=234 amount=-1 +kerning first=307 second=339 amount=-1 +kerning first=206 second=302 amount=-1 +kerning first=220 second=83 amount=-1 +kerning first=74 second=210 amount=-1 +kerning first=302 second=234 amount=-1 +kerning first=219 second=263 amount=-1 +kerning first=77 second=101 amount=-1 +kerning first=235 second=107 amount=-1 +kerning first=266 second=234 amount=-1 +kerning first=370 second=232 amount=-1 +kerning first=374 second=234 amount=-1 +kerning first=65 second=8220 amount=-2 +kerning first=88 second=223 amount=-1 +kerning first=370 second=362 amount=-1 +kerning first=8250 second=196 amount=-1 +kerning first=1043 second=1114 amount=-1 +kerning first=284 second=219 amount=-1 +kerning first=235 second=339 amount=-1 +kerning first=199 second=339 amount=-1 +kerning first=101 second=8220 amount=-2 +kerning first=83 second=317 amount=-1 +kerning first=212 second=219 amount=-1 +kerning first=73 second=267 amount=-1 +kerning first=323 second=75 amount=-1 +kerning first=8222 second=283 amount=-1 +kerning first=275 second=311 amount=-1 +kerning first=202 second=330 amount=-1 +kerning first=85 second=232 amount=-1 +kerning first=325 second=122 amount=-1 +kerning first=346 second=219 amount=-1 +kerning first=199 second=107 amount=-1 +kerning first=217 second=122 amount=-1 +kerning first=362 second=103 amount=-1 +kerning first=71 second=219 amount=-1 +kerning first=253 second=122 amount=-1 +kerning first=298 second=232 amount=-1 +kerning first=326 second=103 amount=-1 +kerning first=112 second=122 amount=-1 +kerning first=72 second=214 amount=-1 +kerning first=262 second=232 amount=-1 +kerning first=89 second=234 amount=-1 +kerning first=226 second=232 amount=-1 +kerning first=218 second=335 amount=-1 +kerning first=8218 second=79 amount=-1 +kerning first=89 second=269 amount=-1 +kerning first=8250 second=210 amount=-1 +kerning first=1066 second=1065 amount=-1 +kerning first=368 second=85 amount=-1 +kerning first=261 second=8220 amount=-2 +kerning first=266 second=269 amount=-1 +kerning first=326 second=335 amount=-1 +kerning first=302 second=269 amount=-1 +kerning first=193 second=45 amount=-1 +kerning first=296 second=85 amount=-1 +kerning first=85 second=65 amount=-1 +kerning first=230 second=269 amount=-1 +kerning first=216 second=46 amount=-1 +kerning first=242 second=8220 amount=-2 +kerning first=73 second=229 amount=-1 +kerning first=1102 second=1083 amount=-1 +kerning first=288 second=46 amount=-1 +kerning first=314 second=8220 amount=-1 +kerning first=210 second=8217 amount=-2 +kerning first=83 second=85 amount=-1 +kerning first=374 second=269 amount=-1 +kerning first=1031 second=1081 amount=-1 +kerning first=187 second=241 amount=-1 +kerning first=350 second=302 amount=-1 +kerning first=1067 second=1081 amount=-1 +kerning first=334 second=65 amount=-1 +kerning first=370 second=65 amount=-1 +kerning first=269 second=225 amount=-1 +kerning first=278 second=302 amount=-1 +kerning first=77 second=335 amount=-1 +kerning first=220 second=250 amount=-1 +kerning first=1042 second=1038 amount=-2 +kerning first=279 second=378 amount=-1 +kerning first=243 second=378 amount=-1 +kerning first=89 second=67 amount=-1 +kerning first=81 second=195 amount=-1 +kerning first=83 second=46 amount=-1 +kerning first=207 second=378 amount=-1 +kerning first=187 second=72 amount=-1 +kerning first=364 second=250 amount=-1 +kerning first=1071 second=1075 amount=-1 +kerning first=370 second=366 amount=-1 +kerning first=201 second=262 amount=-1 +kerning first=203 second=207 amount=-1 +kerning first=221 second=192 amount=-1 +kerning first=111 second=46 amount=-1 +kerning first=298 second=366 amount=-1 +kerning first=80 second=192 amount=-1 +kerning first=199 second=274 amount=-1 +kerning first=75 second=46 amount=-1 +kerning first=334 second=366 amount=-1 +kerning first=110 second=345 amount=-1 +kerning first=200 second=216 amount=-1 +kerning first=334 second=330 amount=-1 +kerning first=1060 second=1053 amount=-1 +kerning first=325 second=259 amount=-1 +kerning first=354 second=227 amount=-1 +kerning first=1051 second=1076 amount=-1 +kerning first=366 second=195 amount=-1 +kerning first=344 second=216 amount=-1 +kerning first=1091 second=1117 amount=-1 +kerning first=73 second=246 amount=-1 +kerning first=88 second=357 amount=-1 +kerning first=66 second=378 amount=-1 +kerning first=233 second=251 amount=-1 +kerning first=302 second=338 amount=-1 +kerning first=290 second=201 amount=-1 +kerning first=200 second=251 amount=-1 +kerning first=193 second=357 amount=-1 +kerning first=196 second=116 amount=-1 +kerning first=8250 second=356 amount=-1 +kerning first=327 second=332 amount=-1 +kerning first=220 second=113 amount=-1 +kerning first=77 second=201 amount=-1 +kerning first=217 second=259 amount=-1 +kerning first=304 second=116 amount=-1 +kerning first=120 second=103 amount=-1 +kerning first=224 second=108 amount=-1 +kerning first=187 second=375 amount=-1 +kerning first=78 second=204 amount=-1 +kerning first=232 second=116 amount=-1 +kerning first=1058 second=1108 amount=-1 +kerning first=327 second=204 amount=-1 +kerning first=262 second=366 amount=-1 +kerning first=275 second=242 amount=-1 +kerning first=69 second=369 amount=-1 +kerning first=234 second=271 amount=-1 +kerning first=323 second=210 amount=-1 +kerning first=73 second=268 amount=-1 +kerning first=1101 second=1093 amount=-1 +kerning first=1049 second=1096 amount=-1 +kerning first=328 second=113 amount=-1 +kerning first=296 second=317 amount=-1 +kerning first=1039 second=1047 amount=-1 +kerning first=374 second=67 amount=-1 +kerning first=282 second=369 amount=-1 +kerning first=364 second=113 amount=-1 +kerning first=266 second=67 amount=-1 +kerning first=368 second=317 amount=-1 +kerning first=1054 second=1067 amount=-1 +kerning first=302 second=67 amount=-1 +kerning first=8217 second=243 amount=-1 +kerning first=110 second=279 amount=-1 +kerning first=278 second=371 amount=-1 +kerning first=1091 second=1113 amount=-1 +kerning first=279 second=244 amount=-1 +kerning first=101 second=233 amount=-1 +kerning first=350 second=371 amount=-1 +kerning first=330 second=97 amount=-1 +kerning first=74 second=279 amount=-1 +kerning first=366 second=97 amount=-1 +kerning first=287 second=279 amount=-1 +kerning first=80 second=257 amount=-1 +kerning first=1039 second=1079 amount=-1 +kerning first=323 second=279 amount=-1 +kerning first=1051 second=1080 amount=-1 +kerning first=201 second=327 amount=-1 +kerning first=251 second=279 amount=-1 +kerning first=199 second=209 amount=-1 +kerning first=206 second=233 amount=-1 +kerning first=274 second=200 amount=-1 +kerning first=1062 second=1102 amount=-1 +kerning first=70 second=75 amount=-1 +kerning first=362 second=266 amount=-1 +kerning first=277 second=187 amount=-1 +kerning first=202 second=200 amount=-1 +kerning first=314 second=233 amount=-1 +kerning first=1082 second=1095 amount=-1 +kerning first=65 second=371 amount=-1 +kerning first=218 second=266 amount=-1 +kerning first=354 second=235 amount=-1 +kerning first=81 second=8221 amount=-2 +kerning first=304 second=218 amount=-1 +kerning first=98 second=380 amount=-1 +kerning first=290 second=270 amount=-1 +kerning first=232 second=283 amount=-1 +kerning first=99 second=318 amount=-1 +kerning first=211 second=220 amount=-1 +kerning first=368 second=248 amount=-1 +kerning first=268 second=283 amount=-1 +kerning first=218 second=270 amount=-1 +kerning first=354 second=231 amount=-1 +kerning first=196 second=218 amount=-1 +kerning first=8216 second=65 amount=-2 +kerning first=1054 second=1071 amount=-1 +kerning first=284 second=282 amount=-1 +kerning first=275 second=380 amount=-1 +kerning first=105 second=231 amount=-1 +kerning first=220 second=44 amount=-2 +kerning first=224 second=248 amount=-1 +kerning first=256 second=44 amount=-1 +kerning first=307 second=45 amount=-1 +kerning first=362 second=270 amount=-1 +kerning first=211 second=75 amount=-1 +kerning first=115 second=44 amount=-1 +kerning first=296 second=248 amount=-1 +kerning first=286 second=66 amount=-1 +kerning first=1060 second=1071 amount=-1 +kerning first=264 second=79 amount=-1 +kerning first=269 second=269 amount=-1 +kerning first=8218 second=289 amount=-1 +kerning first=87 second=79 amount=-1 +kerning first=278 second=367 amount=-1 +kerning first=8250 second=85 amount=-1 +kerning first=192 second=79 amount=-1 +kerning first=207 second=244 amount=-1 +kerning first=304 second=283 amount=-1 +kerning first=350 second=367 amount=-1 +kerning first=77 second=270 amount=-1 +kerning first=314 second=367 amount=-1 +kerning first=75 second=217 amount=-1 +kerning first=74 second=344 amount=-1 +kerning first=101 second=367 amount=-1 +kerning first=192 second=354 amount=-1 +kerning first=344 second=114 amount=-1 +kerning first=199 second=205 amount=-1 +kerning first=67 second=80 amount=-1 +kerning first=310 second=8222 amount=-1 +kerning first=71 second=8218 amount=-1 +kerning first=288 second=217 amount=-1 +kerning first=280 second=80 amount=-1 +kerning first=74 second=206 amount=-1 +kerning first=200 second=114 amount=-1 +kerning first=380 second=45 amount=-1 +kerning first=323 second=344 amount=-1 +kerning first=119 second=252 amount=-1 +kerning first=1065 second=1097 amount=-1 +kerning first=83 second=252 amount=-1 +kerning first=80 second=261 amount=-1 +kerning first=1025 second=1095 amount=-1 +kerning first=313 second=89 amount=-1 +kerning first=8222 second=218 amount=-1 +kerning first=45 second=368 amount=-1 +kerning first=212 second=353 amount=-1 +kerning first=8250 second=81 amount=-1 +kerning first=81 second=368 amount=-1 +kerning first=1097 second=1095 amount=-1 +kerning first=187 second=379 amount=-1 +kerning first=356 second=353 amount=-1 +kerning first=195 second=345 amount=-1 +kerning first=231 second=345 amount=-1 +kerning first=323 second=206 amount=-1 +kerning first=267 second=345 amount=-1 +kerning first=330 second=368 amount=-1 +kerning first=77 second=266 amount=-1 +kerning first=117 second=8221 amount=-1 +kerning first=366 second=368 amount=-1 +kerning first=339 second=345 amount=-1 +kerning first=1067 second=1077 amount=-1 +kerning first=222 second=8221 amount=-2 +kerning first=255 second=106 amount=-1 +kerning first=375 second=345 amount=-1 +kerning first=334 second=302 amount=-1 +kerning first=1031 second=1077 amount=-1 +kerning first=86 second=243 amount=-1 +kerning first=258 second=8221 amount=-2 +kerning first=304 second=214 amount=-1 +kerning first=72 second=226 amount=-1 +kerning first=227 second=243 amount=-1 +kerning first=268 second=214 amount=-1 +kerning first=258 second=368 amount=-1 +kerning first=218 second=197 amount=-1 +kerning first=196 second=214 amount=-1 +kerning first=187 second=310 amount=-1 +kerning first=263 second=243 amount=-1 +kerning first=287 second=275 amount=-1 +kerning first=68 second=362 amount=-1 +kerning first=286 second=46 amount=-1 +kerning first=251 second=275 amount=-1 +kerning first=198 second=336 amount=-1 +kerning first=362 second=197 amount=-1 +kerning first=67 second=315 amount=-1 +kerning first=193 second=223 amount=-1 +kerning first=323 second=275 amount=-1 +kerning first=352 second=80 amount=-1 +kerning first=110 second=275 amount=-1 +kerning first=370 second=327 amount=-1 +kerning first=368 second=252 amount=-1 +kerning first=200 second=45 amount=-1 +kerning first=70 second=71 amount=-1 +kerning first=209 second=362 amount=-1 +kerning first=220 second=288 amount=-1 +kerning first=317 second=362 amount=-1 +kerning first=232 second=8220 amount=-2 +kerning first=1064 second=1086 amount=-1 +kerning first=67 second=71 amount=-1 +kerning first=1053 second=1094 amount=-1 +kerning first=356 second=275 amount=-1 +kerning first=74 second=353 amount=-1 +kerning first=225 second=45 amount=-1 +kerning first=78 second=243 amount=-1 +kerning first=213 second=69 amount=-1 +kerning first=84 second=45 amount=-1 +kerning first=219 second=243 amount=-1 +kerning first=120 second=45 amount=-1 +kerning first=287 second=353 amount=-1 +kerning first=291 second=243 amount=-1 +kerning first=1068 second=1036 amount=-1 +kerning first=204 second=214 amount=-1 +kerning first=369 second=45 amount=-1 +kerning first=261 second=45 amount=-1 +kerning first=363 second=243 amount=-1 +kerning first=1070 second=1068 amount=-1 +kerning first=213 second=206 amount=-1 +kerning first=205 second=219 amount=-1 +kerning first=327 second=243 amount=-1 +kerning first=1034 second=1068 amount=-1 +kerning first=284 second=362 amount=-1 +kerning first=201 second=223 amount=-1 +kerning first=205 second=80 amount=-1 +kerning first=1060 second=1062 amount=-1 +kerning first=121 second=318 amount=-1 +kerning first=1040 second=1097 amount=-1 +kerning first=327 second=248 amount=-1 +kerning first=282 second=67 amount=-1 +kerning first=226 second=318 amount=-1 +kerning first=224 second=45 amount=-1 +kerning first=1051 second=1060 amount=-1 +kerning first=1038 second=1082 amount=-1 +kerning first=264 second=350 amount=-1 +kerning first=232 second=46 amount=-1 +kerning first=334 second=258 amount=-1 +kerning first=205 second=200 amount=-1 +kerning first=370 second=258 amount=-1 +kerning first=366 second=234 amount=-1 +kerning first=327 second=262 amount=-1 +kerning first=330 second=234 amount=-1 +kerning first=77 second=257 amount=-1 +kerning first=339 second=8250 amount=-1 +kerning first=87 second=110 amount=-1 +kerning first=269 second=103 amount=-1 +kerning first=296 second=226 amount=-1 +kerning first=71 second=362 amount=-1 +kerning first=323 second=266 amount=-1 +kerning first=212 second=362 amount=-1 +kerning first=368 second=226 amount=-1 +kerning first=1059 second=1076 amount=-1 +kerning first=193 second=249 amount=-1 +kerning first=65 second=79 amount=-1 +kerning first=280 second=71 amount=-1 +kerning first=105 second=283 amount=-1 +kerning first=234 second=232 amount=-1 +kerning first=197 second=81 amount=-1 +kerning first=1038 second=1096 amount=-1 +kerning first=88 second=249 amount=-1 +kerning first=267 second=241 amount=-1 +kerning first=1051 second=1089 amount=-1 +kerning first=231 second=241 amount=-1 +kerning first=316 second=244 amount=-1 +kerning first=198 second=332 amount=-1 +kerning first=288 second=72 amount=-1 +kerning first=259 second=267 amount=-1 +kerning first=1041 second=1096 amount=-1 +kerning first=199 second=98 amount=-1 +kerning first=87 second=216 amount=-1 +kerning first=103 second=98 amount=-1 +kerning first=116 second=275 amount=-1 +kerning first=112 second=345 amount=-1 +kerning first=267 second=328 amount=-1 +kerning first=192 second=216 amount=-1 +kerning first=217 second=8249 amount=-2 +kerning first=231 second=328 amount=-1 +kerning first=279 second=243 amount=-1 +kerning first=217 second=345 amount=-1 +kerning first=171 second=352 amount=-1 +kerning first=80 second=335 amount=-1 +kerning first=366 second=114 amount=-1 +kerning first=253 second=345 amount=-1 +kerning first=207 second=352 amount=-1 +kerning first=330 second=114 amount=-1 +kerning first=289 second=345 amount=-1 +kerning first=203 second=302 amount=-1 +kerning first=1118 second=1079 amount=-1 +kerning first=85 second=258 amount=-1 +kerning first=325 second=345 amount=-1 +kerning first=116 second=335 amount=-1 +kerning first=275 second=8222 amount=-1 +kerning first=257 second=335 amount=-1 +kerning first=221 second=335 amount=-1 +kerning first=260 second=46 amount=-1 +kerning first=1059 second=1061 amount=-1 +kerning first=368 second=46 amount=-2 +kerning first=258 second=114 amount=-1 +kerning first=201 second=370 amount=-1 +kerning first=45 second=114 amount=-1 +kerning first=290 second=344 amount=-1 +kerning first=209 second=284 amount=-1 +kerning first=374 second=115 amount=-1 +kerning first=87 second=250 amount=-1 +kerning first=117 second=114 amount=-1 +kerning first=197 second=119 amount=-1 +kerning first=362 second=344 amount=-1 +kerning first=271 second=378 amount=-1 +kerning first=70 second=8221 amount=-1 +kerning first=220 second=336 amount=-1 +kerning first=1046 second=1079 amount=-1 +kerning first=230 second=115 amount=-1 +kerning first=1107 second=1114 amount=-1 +kerning first=266 second=115 amount=-1 +kerning first=302 second=115 amount=-1 +kerning first=192 second=250 amount=-1 +kerning first=305 second=119 amount=-1 +kerning first=197 second=199 amount=-1 +kerning first=264 second=216 amount=-1 +kerning first=233 second=106 amount=-1 +kerning first=99 second=314 amount=-1 +kerning first=269 second=106 amount=-1 +kerning first=235 second=378 amount=-1 +kerning first=199 second=378 amount=-1 +kerning first=1062 second=1054 amount=-1 +kerning first=77 second=344 amount=-1 +kerning first=1038 second=1105 amount=-1 +kerning first=1057 second=1071 amount=-1 +kerning first=218 second=344 amount=-1 +kerning first=187 second=327 amount=-1 +kerning first=1043 second=1088 amount=-1 +kerning first=274 second=282 amount=-1 +kerning first=1043 second=1101 amount=-1 +kerning first=79 second=204 amount=-1 +kerning first=202 second=282 amount=-1 +kerning first=327 second=206 amount=-1 +kerning first=1070 second=1055 amount=-1 +kerning first=1067 second=1096 amount=-1 +kerning first=204 second=288 amount=-1 +kerning first=195 second=87 amount=-1 +kerning first=263 second=230 amount=-1 +kerning first=307 second=291 amount=-1 +kerning first=271 second=291 amount=-1 +kerning first=72 second=81 amount=-1 +kerning first=119 second=106 amount=-1 +kerning first=235 second=291 amount=-1 +kerning first=86 second=230 amount=-1 +kerning first=1055 second=1052 amount=-1 +kerning first=275 second=101 amount=-1 +kerning first=207 second=279 amount=-1 +kerning first=210 second=296 amount=-1 +kerning first=197 second=212 amount=-1 +kerning first=264 second=337 amount=-1 +kerning first=69 second=296 amount=-1 +kerning first=1048 second=1098 amount=-1 +kerning first=228 second=337 amount=-1 +kerning first=8218 second=374 amount=-2 +kerning first=8250 second=120 amount=-1 +kerning first=279 second=279 amount=-1 +kerning first=1031 second=1064 amount=-1 +kerning first=287 second=244 amount=-1 +kerning first=282 second=296 amount=-1 +kerning first=87 second=337 amount=-1 +kerning first=203 second=75 amount=-1 +kerning first=370 second=245 amount=-1 +kerning first=8217 second=217 amount=-1 +kerning first=1067 second=1064 amount=-1 +kerning first=279 second=99 amount=-1 +kerning first=213 second=187 amount=-1 +kerning first=298 second=245 amount=-1 +kerning first=270 second=8250 amount=-1 +kerning first=207 second=99 amount=-1 +kerning first=234 second=8250 amount=-1 +kerning first=226 second=245 amount=-1 +kerning first=268 second=8218 amount=-1 +kerning first=232 second=8218 amount=-1 +kerning first=108 second=287 amount=-1 +kerning first=234 second=233 amount=-1 +kerning first=105 second=375 amount=-1 +kerning first=85 second=245 amount=-1 +kerning first=314 second=380 amount=-1 +kerning first=347 second=8220 amount=-2 +kerning first=71 second=202 amount=-1 +kerning first=116 second=248 amount=-1 +kerning first=70 second=255 amount=-1 +kerning first=311 second=8220 amount=-1 +kerning first=212 second=202 amount=-1 +kerning first=257 second=248 amount=-1 +kerning first=250 second=235 amount=-1 +kerning first=1064 second=1025 amount=-1 +kerning first=221 second=248 amount=-1 +kerning first=201 second=117 amount=-1 +kerning first=249 second=287 amount=-1 +kerning first=205 second=116 amount=-1 +kerning first=209 second=83 amount=-1 +kerning first=72 second=8222 amount=-1 +kerning first=72 second=261 amount=-1 +kerning first=80 second=248 amount=-1 +kerning first=1059 second=1081 amount=-1 +kerning first=350 second=66 amount=-1 +kerning first=327 second=97 amount=-1 +kerning first=346 second=209 amount=-1 +kerning first=219 second=364 amount=-1 +kerning first=69 second=270 amount=-1 +kerning first=99 second=108 amount=-1 +kerning first=278 second=66 amount=-1 +kerning first=1028 second=1073 amount=-1 +kerning first=274 second=209 amount=-1 +kerning first=258 second=307 amount=-1 +kerning first=206 second=66 amount=-1 +kerning first=78 second=364 amount=-1 +kerning first=284 second=202 amount=-1 +kerning first=210 second=270 amount=-1 +kerning first=218 second=257 amount=-1 +kerning first=202 second=209 amount=-1 +kerning first=203 second=8220 amount=-1 +kerning first=1064 second=1073 amount=-1 +kerning first=364 second=257 amount=-1 +kerning first=101 second=380 amount=-1 +kerning first=67 second=264 amount=-1 +kerning first=242 second=380 amount=-1 +kerning first=275 second=8220 amount=-2 +kerning first=206 second=380 amount=-1 +kerning first=8217 second=111 amount=-1 +kerning first=205 second=296 amount=-1 +kerning first=254 second=103 amount=-1 +kerning first=338 second=211 amount=-1 +kerning first=207 second=205 amount=-1 +kerning first=45 second=355 amount=-1 +kerning first=218 second=103 amount=-1 +kerning first=8216 second=366 amount=-1 +kerning first=1058 second=1091 amount=-1 +kerning first=304 second=227 amount=-1 +kerning first=1047 second=1039 amount=-1 +kerning first=268 second=227 amount=-1 +kerning first=201 second=69 amount=-1 +kerning first=288 second=325 amount=-1 +kerning first=77 second=103 amount=-1 +kerning first=277 second=273 amount=-1 +kerning first=74 second=193 amount=-1 +kerning first=274 second=330 amount=-1 +kerning first=356 second=74 amount=-1 +kerning first=75 second=252 amount=-1 +kerning first=205 second=273 amount=-1 +kerning first=346 second=330 amount=-1 +kerning first=78 second=269 amount=-1 +kerning first=291 second=269 amount=-1 +kerning first=366 second=355 amount=-1 +kerning first=199 second=218 amount=-1 +kerning first=270 second=78 amount=-1 +kerning first=327 second=269 amount=-1 +kerning first=330 second=355 amount=-1 +kerning first=119 second=120 amount=-1 +kerning first=1091 second=1078 amount=-1 +kerning first=74 second=65 amount=-1 +kerning first=112 second=44 amount=-1 +kerning first=255 second=316 amount=-1 +kerning first=287 second=112 amount=-1 +kerning first=1042 second=1116 amount=-1 +kerning first=66 second=205 amount=-1 +kerning first=8218 second=250 amount=-1 +kerning first=350 second=8220 amount=-1 +kerning first=363 second=269 amount=-1 +kerning first=253 second=44 amount=-1 +kerning first=198 second=78 amount=-1 +kerning first=346 second=282 amount=-1 +kerning first=289 second=44 amount=-1 +kerning first=218 second=365 amount=-1 +kerning first=218 second=171 amount=-2 +kerning first=121 second=117 amount=-1 +kerning first=45 second=260 amount=-1 +kerning first=85 second=117 amount=-1 +kerning first=81 second=260 amount=-1 +kerning first=290 second=171 amount=-1 +kerning first=205 second=286 amount=-1 +kerning first=326 second=171 amount=-1 +kerning first=1031 second=1051 amount=-1 +kerning first=274 second=68 amount=-1 +kerning first=1067 second=1051 amount=-1 +kerning first=74 second=249 amount=-1 +kerning first=1055 second=1100 amount=-1 +kerning first=84 second=333 amount=-1 +kerning first=346 second=68 amount=-1 +kerning first=269 second=307 amount=-1 +kerning first=70 second=203 amount=-1 +kerning first=1034 second=1042 amount=-1 +kerning first=339 second=100 amount=-1 +kerning first=65 second=220 amount=-1 +kerning first=366 second=260 amount=-1 +kerning first=1070 second=1042 amount=-1 +kerning first=206 second=220 amount=-1 +kerning first=211 second=203 amount=-1 +kerning first=104 second=263 amount=-1 +kerning first=346 second=82 amount=-1 +kerning first=209 second=263 amount=-1 +kerning first=77 second=171 amount=-1 +kerning first=1039 second=1025 amount=-1 +kerning first=8222 second=248 amount=-1 +kerning first=187 second=121 amount=-1 +kerning first=113 second=171 amount=-1 +kerning first=196 second=8250 amount=-1 +kerning first=281 second=263 amount=-1 +kerning first=250 second=246 amount=-1 +kerning first=1064 second=1060 amount=-1 +kerning first=337 second=103 amount=-1 +kerning first=1027 second=1119 amount=-1 +kerning first=8220 second=256 amount=-2 +kerning first=327 second=353 amount=-1 +kerning first=85 second=102 amount=-1 +kerning first=109 second=246 amount=-1 +kerning first=1067 second=1118 amount=-1 +kerning first=229 second=103 amount=-1 +kerning first=199 second=77 amount=-1 +kerning first=231 second=100 amount=-1 +kerning first=278 second=220 amount=-1 +kerning first=350 second=220 amount=-1 +kerning first=267 second=100 amount=-1 +kerning first=1060 second=1083 amount=-1 +kerning first=264 second=109 amount=-1 +kerning first=230 second=316 amount=-1 +kerning first=290 second=310 amount=-1 +kerning first=194 second=316 amount=-1 +kerning first=225 second=333 amount=-1 +kerning first=261 second=333 amount=-1 +kerning first=202 second=68 amount=-1 +kerning first=199 second=304 amount=-1 +kerning first=266 second=316 amount=-1 +kerning first=367 second=267 amount=-1 +kerning first=264 second=242 amount=-1 +kerning first=362 second=365 amount=-1 +kerning first=102 second=8218 amount=-1 +kerning first=369 second=333 amount=-1 +kerning first=235 second=8222 amount=-1 +kerning first=209 second=211 amount=-1 +kerning first=228 second=242 amount=-1 +kerning first=199 second=8222 amount=-1 +kerning first=214 second=194 amount=-1 +kerning first=280 second=45 amount=-1 +kerning first=347 second=289 amount=-1 +kerning first=268 second=313 amount=-1 +kerning first=1051 second=1094 amount=-1 +kerning first=116 second=233 amount=-1 +kerning first=304 second=313 amount=-1 +kerning first=85 second=210 amount=-1 +kerning first=224 second=339 amount=-1 +kerning first=86 second=111 amount=-1 +kerning first=87 second=109 amount=-1 +kerning first=374 second=256 amount=-1 +kerning first=323 second=8220 amount=-1 +kerning first=8222 second=86 amount=-2 +kerning first=323 second=245 amount=-1 +kerning first=227 second=111 amount=-1 +kerning first=287 second=245 amount=-1 +kerning first=263 second=111 amount=-1 +kerning first=206 second=280 amount=-1 +kerning first=1030 second=1057 amount=-1 +kerning first=1041 second=1079 amount=-1 +kerning first=231 second=233 amount=-1 +kerning first=350 second=280 amount=-1 +kerning first=296 second=339 amount=-1 +kerning first=187 second=219 amount=-1 +kerning first=71 second=274 amount=-1 +kerning first=103 second=104 amount=-1 +kerning first=339 second=233 amount=-1 +kerning first=368 second=339 amount=-1 +kerning first=368 second=120 amount=-1 +kerning first=1049 second=1118 amount=-1 +kerning first=103 second=277 amount=-1 +kerning first=200 second=298 amount=-1 +kerning first=280 second=212 amount=-1 +kerning first=197 second=8217 amount=-2 +kerning first=272 second=298 amount=-1 +kerning first=233 second=8217 amount=-2 +kerning first=269 second=8217 amount=-2 +kerning first=266 second=102 amount=-1 +kerning first=67 second=212 amount=-1 +kerning first=212 second=8217 amount=-2 +kerning first=345 second=230 amount=-1 +kerning first=362 second=357 amount=-1 +kerning first=220 second=344 amount=-1 +kerning first=251 second=245 amount=-1 +kerning first=262 second=331 amount=-1 +kerning first=1038 second=1104 amount=-1 +kerning first=8250 second=334 amount=-1 +kerning first=298 second=331 amount=-1 +kerning first=98 second=289 amount=-1 +kerning first=311 second=289 amount=-1 +kerning first=110 second=245 amount=-1 +kerning first=370 second=331 amount=-1 +kerning first=74 second=245 amount=-1 +kerning first=85 second=331 amount=-1 +kerning first=305 second=8217 amount=-1 +kerning first=313 second=221 amount=-1 +kerning first=199 second=85 amount=-1 +kerning first=275 second=289 amount=-1 +kerning first=377 second=8217 amount=-1 +kerning first=244 second=8221 amount=-2 +kerning first=367 second=113 amount=-1 +kerning first=1052 second=1096 amount=-1 +kerning first=1068 second=1049 amount=-1 +kerning first=323 second=366 amount=-1 +kerning first=1050 second=1095 amount=-1 +kerning first=211 second=195 amount=-1 +kerning first=88 second=116 amount=-1 +kerning first=203 second=216 amount=-1 +kerning first=259 second=113 amount=-1 +kerning first=205 second=67 amount=-1 +kerning first=325 second=79 amount=-1 +kerning first=220 second=241 amount=-1 +kerning first=73 second=8218 amount=-1 +kerning first=65 second=345 amount=-1 +kerning first=8222 second=240 amount=-1 +kerning first=70 second=195 amount=-1 +kerning first=289 second=250 amount=-1 +kerning first=253 second=250 amount=-1 +kerning first=121 second=104 amount=-1 +kerning first=1056 second=1119 amount=-1 +kerning first=217 second=250 amount=-1 +kerning first=364 second=70 amount=-1 +kerning first=218 second=357 amount=-1 +kerning first=8218 second=283 amount=-1 +kerning first=79 second=70 amount=-1 +kerning first=368 second=274 amount=-1 +kerning first=374 second=258 amount=-1 +kerning first=314 second=345 amount=-1 +kerning first=296 second=274 amount=-1 +kerning first=77 second=357 amount=-1 +kerning first=298 second=214 amount=-1 +kerning first=220 second=70 amount=-1 +kerning first=213 second=46 amount=-1 +kerning first=274 second=76 amount=-1 +kerning first=211 second=368 amount=-1 +kerning first=206 second=207 amount=-1 +kerning first=1049 second=1105 amount=-1 +kerning first=250 second=291 amount=-1 +kerning first=106 second=8221 amount=-1 +kerning first=278 second=207 amount=-1 +kerning first=67 second=204 amount=-1 +kerning first=211 second=8221 amount=-2 +kerning first=350 second=207 amount=-1 +kerning first=232 second=107 amount=-1 +kerning first=221 second=243 amount=-1 +kerning first=99 second=382 amount=-1 +kerning first=70 second=368 amount=-1 +kerning first=66 second=197 amount=-1 +kerning first=196 second=107 amount=-1 +kerning first=108 second=369 amount=-1 +kerning first=209 second=271 amount=-1 +kerning first=209 second=336 amount=-1 +kerning first=366 second=8250 amount=-2 +kerning first=1053 second=1086 amount=-1 +kerning first=1065 second=1054 amount=-1 +kerning first=74 second=366 amount=-1 +kerning first=281 second=271 amount=-1 +kerning first=8222 second=117 amount=-1 +kerning first=296 second=103 amount=-1 +kerning first=193 second=116 amount=-1 +kerning first=354 second=378 amount=-1 +kerning first=8217 second=252 amount=-1 +kerning first=370 second=210 amount=-1 +kerning first=89 second=256 amount=-1 +kerning first=262 second=210 amount=-1 +kerning first=298 second=200 amount=-1 +kerning first=364 second=122 amount=-1 +kerning first=280 second=204 amount=-1 +kerning first=246 second=378 amount=-1 +kerning first=196 second=86 amount=-1 +kerning first=8218 second=269 amount=-1 +kerning first=302 second=382 amount=-1 +kerning first=202 second=202 amount=-1 +kerning first=209 second=8220 amount=-1 +kerning first=1059 second=1117 amount=-1 +kerning first=1069 second=1083 amount=-1 +kerning first=8250 second=326 amount=-1 +kerning first=1066 second=1044 amount=-1 +kerning first=80 second=235 amount=-1 +kerning first=223 second=187 amount=-1 +kerning first=362 second=207 amount=-1 +kerning first=116 second=235 amount=-1 +kerning first=266 second=209 amount=-1 +kerning first=368 second=347 amount=-1 +kerning first=221 second=235 amount=-1 +kerning first=275 second=281 amount=-1 +kerning first=70 second=97 amount=-1 +kerning first=296 second=347 amount=-1 +kerning first=257 second=235 amount=-1 +kerning first=200 second=290 amount=-1 +kerning first=68 second=198 amount=-1 +kerning first=217 second=350 amount=-1 +kerning first=365 second=235 amount=-1 +kerning first=250 second=277 amount=-1 +kerning first=1033 second=1056 amount=-1 +kerning first=119 second=347 amount=-1 +kerning first=1069 second=1056 amount=-1 +kerning first=205 second=213 amount=-1 +kerning first=1075 second=1090 amount=-1 +kerning first=70 second=268 amount=-1 +kerning first=8218 second=275 amount=-1 +kerning first=1056 second=1077 amount=-1 +kerning first=80 second=283 amount=-1 +kerning first=327 second=351 amount=-1 +kerning first=116 second=283 amount=-1 +kerning first=291 second=351 amount=-1 +kerning first=199 second=231 amount=-1 +kerning first=255 second=351 amount=-1 +kerning first=200 second=363 amount=-1 +kerning first=235 second=231 amount=-1 +kerning first=219 second=351 amount=-1 +kerning first=271 second=231 amount=-1 +kerning first=8249 second=219 amount=-1 +kerning first=325 second=350 amount=-1 +kerning first=1091 second=1087 amount=-1 +kerning first=214 second=88 amount=-1 +kerning first=77 second=244 amount=-1 +kerning first=221 second=257 amount=-1 +kerning first=338 second=67 amount=-1 +kerning first=1054 second=1049 amount=-1 +kerning first=1078 second=1081 amount=-1 +kerning first=121 second=8249 amount=-1 +kerning first=1033 second=1064 amount=-1 +kerning first=365 second=283 amount=-1 +kerning first=217 second=79 amount=-1 +kerning first=218 second=244 amount=-1 +kerning first=257 second=283 amount=-1 +kerning first=201 second=82 amount=-1 +kerning first=226 second=8249 amount=-1 +kerning first=307 second=231 amount=-1 +kerning first=73 second=344 amount=-1 +kerning first=65 second=307 amount=-1 +kerning first=86 second=338 amount=-1 +kerning first=78 second=351 amount=-1 +kerning first=326 second=244 amount=-1 +kerning first=221 second=283 amount=-1 +kerning first=362 second=244 amount=-1 +kerning first=82 second=332 amount=-1 +kerning first=87 second=345 amount=-1 +kerning first=200 second=202 amount=-1 +kerning first=195 second=79 amount=-1 +kerning first=72 second=209 amount=-1 +kerning first=105 second=248 amount=-1 +kerning first=192 second=345 amount=-1 +kerning first=1062 second=1089 amount=-1 +kerning first=228 second=345 amount=-1 +kerning first=271 second=283 amount=-1 +kerning first=1048 second=1076 amount=-1 +kerning first=281 second=243 amount=-1 +kerning first=264 second=345 amount=-1 +kerning first=307 second=283 amount=-1 +kerning first=268 second=235 amount=-1 +kerning first=339 second=369 amount=-1 +kerning first=199 second=283 amount=-1 +kerning first=187 second=332 amount=-1 +kerning first=220 second=371 amount=-1 +kerning first=304 second=235 amount=-1 +kerning first=235 second=283 amount=-1 +kerning first=274 second=274 amount=-1 +kerning first=203 second=367 amount=-1 +kerning first=207 second=257 amount=-1 +kerning first=112 second=380 amount=-1 +kerning first=1051 second=1067 amount=-1 +kerning first=202 second=274 amount=-1 +kerning first=275 second=367 amount=-1 +kerning first=108 second=101 amount=-1 +kerning first=362 second=192 amount=-1 +kerning first=217 second=380 amount=-1 +kerning first=89 second=213 amount=-1 +kerning first=85 second=323 amount=-1 +kerning first=325 second=66 amount=-1 +kerning first=106 second=281 amount=-1 +kerning first=253 second=380 amount=-1 +kerning first=218 second=192 amount=-1 +kerning first=213 second=209 amount=-1 +kerning first=199 second=226 amount=-1 +kerning first=1065 second=1080 amount=-1 +kerning first=195 second=336 amount=-1 +kerning first=1036 second=1054 amount=-1 +kerning first=350 second=44 amount=-1 +kerning first=262 second=323 amount=-1 +kerning first=86 second=252 amount=-1 +kerning first=71 second=330 amount=-1 +kerning first=263 second=252 amount=-1 +kerning first=45 second=119 amount=-1 +kerning first=370 second=323 amount=-1 +kerning first=198 second=70 amount=-1 +kerning first=346 second=274 amount=-1 +kerning first=334 second=323 amount=-1 +kerning first=229 second=244 amount=-1 +kerning first=89 second=171 amount=-2 +kerning first=298 second=323 amount=-1 +kerning first=8250 second=68 amount=-1 +kerning first=296 second=231 amount=-1 +kerning first=354 second=248 amount=-1 +kerning first=258 second=119 amount=-1 +kerning first=328 second=8217 amount=-2 +kerning first=296 second=261 amount=-1 +kerning first=290 second=366 amount=-1 +kerning first=65 second=44 amount=-1 +kerning first=282 second=218 amount=-1 +kerning first=323 second=201 amount=-1 +kerning first=368 second=231 amount=-1 +kerning first=368 second=261 amount=-1 +kerning first=1069 second=1055 amount=-1 +kerning first=210 second=218 amount=-1 +kerning first=198 second=327 amount=-1 +kerning first=1068 second=1071 amount=-1 +kerning first=74 second=229 amount=-1 +kerning first=229 second=314 amount=-1 +kerning first=242 second=44 amount=-1 +kerning first=193 second=314 amount=-1 +kerning first=270 second=327 amount=-1 +kerning first=224 second=231 amount=-1 +kerning first=101 second=44 amount=-1 +kerning first=69 second=218 amount=-1 +kerning first=74 second=201 amount=-1 +kerning first=262 second=353 amount=-1 +kerning first=266 second=243 amount=-1 +kerning first=97 second=8249 amount=-1 +kerning first=362 second=249 amount=-1 +kerning first=1028 second=1081 amount=-1 +kerning first=370 second=223 amount=-1 +kerning first=230 second=243 amount=-1 +kerning first=73 second=45 amount=-1 +kerning first=338 second=80 amount=-1 +kerning first=334 second=353 amount=-1 +kerning first=302 second=80 amount=-1 +kerning first=298 second=353 amount=-1 +kerning first=298 second=223 amount=-1 +kerning first=302 second=243 amount=-1 +kerning first=88 second=214 amount=-1 +kerning first=218 second=249 amount=-1 +kerning first=370 second=353 amount=-1 +kerning first=374 second=243 amount=-1 +kerning first=250 second=45 amount=-1 +kerning first=1064 second=1081 amount=-1 +kerning first=370 second=310 amount=-1 +kerning first=1118 second=1114 amount=-1 +kerning first=85 second=223 amount=-1 +kerning first=218 second=72 amount=-1 +kerning first=119 second=287 amount=-1 +kerning first=286 second=45 amount=-1 +kerning first=1064 second=1036 amount=-1 +kerning first=258 second=363 amount=-1 +kerning first=85 second=353 amount=-1 +kerning first=262 second=223 amount=-1 +kerning first=89 second=243 amount=-1 +kerning first=87 second=101 amount=-1 +kerning first=362 second=201 amount=-1 +kerning first=198 second=284 amount=-1 +kerning first=1046 second=1114 amount=-1 +kerning first=84 second=97 amount=-1 +kerning first=71 second=370 amount=-1 +kerning first=366 second=363 amount=-1 +kerning first=116 second=240 amount=-1 +kerning first=1051 second=1097 amount=-1 +kerning first=1065 second=1082 amount=-1 +kerning first=1059 second=1098 amount=-1 +kerning first=82 second=362 amount=-1 +kerning first=259 second=232 amount=-1 +kerning first=228 second=101 amount=-1 +kerning first=288 second=200 amount=-1 +kerning first=1067 second=1072 amount=-1 +kerning first=187 second=362 amount=-1 +kerning first=8222 second=99 amount=-1 +kerning first=1069 second=1027 amount=-1 +kerning first=204 second=266 amount=-1 +kerning first=199 second=296 amount=-1 +kerning first=78 second=347 amount=-1 +kerning first=74 second=258 amount=-1 +kerning first=367 second=232 amount=-1 +kerning first=259 second=8250 amount=-1 +kerning first=223 second=8250 amount=-1 +kerning first=118 second=8250 amount=-1 +kerning first=364 second=371 amount=-1 +kerning first=197 second=71 amount=-1 +kerning first=202 second=217 amount=-1 +kerning first=269 second=234 amount=-1 +kerning first=233 second=234 amount=-1 +kerning first=274 second=217 amount=-1 +kerning first=1031 second=1072 amount=-1 +kerning first=310 second=217 amount=-1 +kerning first=253 second=351 amount=-1 +kerning first=305 second=234 amount=-1 +kerning first=346 second=217 amount=-1 +kerning first=1036 second=1096 amount=-1 +kerning first=228 second=8220 amount=-2 +kerning first=80 second=313 amount=-1 +kerning first=97 second=111 amount=-1 +kerning first=192 second=8220 amount=-2 +kerning first=221 second=229 amount=-1 +kerning first=97 second=287 amount=-1 +kerning first=252 second=235 amount=-1 +kerning first=264 second=8220 amount=-1 +kerning first=234 second=254 amount=-1 +kerning first=205 second=72 amount=-1 +kerning first=66 second=8218 amount=-1 +kerning first=336 second=8220 amount=-2 +kerning first=1051 second=1024 amount=-1 +kerning first=77 second=352 amount=-1 +kerning first=193 second=374 amount=-1 +kerning first=267 second=263 amount=-1 +kerning first=296 second=69 amount=-1 +kerning first=1030 second=1117 amount=-1 +kerning first=366 second=212 amount=-1 +kerning first=218 second=352 amount=-1 +kerning first=339 second=263 amount=-1 +kerning first=377 second=8220 amount=-1 +kerning first=109 second=118 amount=-1 +kerning first=205 second=278 amount=-1 +kerning first=266 second=259 amount=-1 +kerning first=278 second=315 amount=-1 +kerning first=362 second=352 amount=-1 +kerning first=1038 second=1083 amount=-1 +kerning first=258 second=212 amount=-1 +kerning first=87 second=8220 amount=-1 +kerning first=101 second=104 amount=-1 +kerning first=206 second=315 amount=-1 +kerning first=197 second=114 amount=-1 +kerning first=83 second=68 amount=-1 +kerning first=67 second=199 amount=-1 +kerning first=219 second=115 amount=-1 +kerning first=269 second=114 amount=-1 +kerning first=255 second=115 amount=-1 +kerning first=233 second=114 amount=-1 +kerning first=284 second=370 amount=-1 +kerning first=87 second=194 amount=-1 +kerning first=316 second=250 amount=-1 +kerning first=323 second=331 amount=-1 +kerning first=280 second=199 amount=-1 +kerning first=78 second=115 amount=-1 +kerning first=231 second=263 amount=-1 +kerning first=202 second=81 amount=-1 +kerning first=334 second=310 amount=-1 +kerning first=232 second=365 amount=-1 +kerning first=298 second=310 amount=-1 +kerning first=368 second=68 amount=-1 +kerning first=45 second=106 amount=-1 +kerning first=67 second=269 amount=-1 +kerning first=310 second=81 amount=-1 +kerning first=103 second=269 amount=-1 +kerning first=196 second=365 amount=-1 +kerning first=316 second=269 amount=-1 +kerning first=327 second=115 amount=-1 +kerning first=252 second=243 amount=-1 +kerning first=8222 second=235 amount=-1 +kerning first=85 second=310 amount=-1 +kerning first=195 second=253 amount=-1 +kerning first=296 second=68 amount=-1 +kerning first=74 second=331 amount=-1 +kerning first=73 second=346 amount=-1 +kerning first=266 second=245 amount=-1 +kerning first=206 second=78 amount=-1 +kerning first=209 second=78 amount=-1 +kerning first=330 second=246 amount=-1 +kerning first=8218 second=229 amount=-1 +kerning first=1048 second=1062 amount=-1 +kerning first=213 second=282 amount=-1 +kerning first=1069 second=1043 amount=-1 +kerning first=368 second=334 amount=-1 +kerning first=207 second=219 amount=-1 +kerning first=8222 second=305 amount=-1 +kerning first=323 second=288 amount=-1 +kerning first=1033 second=1043 amount=-1 +kerning first=283 second=355 amount=-1 +kerning first=70 second=260 amount=-1 +kerning first=207 second=227 amount=-1 +kerning first=211 second=84 amount=-1 +kerning first=8218 second=101 amount=-1 +kerning first=1069 second=1041 amount=-1 +kerning first=72 second=282 amount=-1 +kerning first=1066 second=1052 amount=-1 +kerning first=272 second=8217 amount=-2 +kerning first=211 second=260 amount=-1 +kerning first=1030 second=1052 amount=-1 +kerning first=1078 second=1094 amount=-1 +kerning first=74 second=288 amount=-1 +kerning first=1042 second=1094 amount=-1 +kerning first=346 second=187 amount=-1 +kerning first=217 second=337 amount=-1 +kerning first=362 second=279 amount=-1 +kerning first=274 second=187 amount=-1 +kerning first=193 second=108 amount=-1 +kerning first=65 second=87 amount=-1 +kerning first=310 second=187 amount=-1 +kerning first=229 second=108 amount=-1 +kerning first=255 second=8217 amount=-2 +kerning first=105 second=291 amount=-1 +kerning first=291 second=8217 amount=-2 +kerning first=269 second=111 amount=-1 +kerning first=327 second=8217 amount=-1 +kerning first=337 second=108 amount=-1 +kerning first=363 second=8217 amount=-1 +kerning first=286 second=75 amount=-1 +kerning first=77 second=279 amount=-1 +kerning first=1056 second=1064 amount=-1 +kerning first=214 second=75 amount=-1 +kerning first=370 second=216 amount=-1 +kerning first=202 second=187 amount=-1 +kerning first=362 second=70 amount=-1 +kerning first=268 second=99 amount=-1 +kerning first=218 second=279 amount=-1 +kerning first=1062 second=1119 amount=-1 +kerning first=304 second=99 amount=-1 +kerning first=196 second=361 amount=-1 +kerning first=368 second=355 amount=-1 +kerning first=97 second=187 amount=-1 +kerning first=289 second=337 amount=-1 +kerning first=105 second=235 amount=-1 +kerning first=73 second=75 amount=-1 +kerning first=232 second=99 amount=-1 +kerning first=200 second=268 amount=-1 +kerning first=289 second=242 amount=-1 +kerning first=258 second=255 amount=-1 +kerning first=325 second=242 amount=-1 +kerning first=221 second=99 amount=-1 +kerning first=1050 second=1082 amount=-1 +kerning first=217 second=242 amount=-1 +kerning first=250 second=281 amount=-1 +kerning first=257 second=99 amount=-1 +kerning first=1065 second=1104 amount=-1 +kerning first=315 second=86 amount=-1 +kerning first=344 second=268 amount=-1 +kerning first=213 second=347 amount=-1 +kerning first=8249 second=370 amount=-1 +kerning first=45 second=255 amount=-1 +kerning first=365 second=99 amount=-1 +kerning first=213 second=89 amount=-1 +kerning first=171 second=86 amount=-1 +kerning first=72 second=347 amount=-1 +kerning first=305 second=277 amount=-1 +kerning first=69 second=77 amount=-1 +kerning first=269 second=277 amount=-1 +kerning first=196 second=355 amount=-1 +kerning first=274 second=325 amount=-1 +kerning first=233 second=277 amount=-1 +kerning first=364 second=198 amount=-1 +kerning first=219 second=264 amount=-1 +kerning first=346 second=325 amount=-1 +kerning first=1053 second=1073 amount=-1 +kerning first=73 second=281 amount=-1 +kerning first=220 second=233 amount=-1 +kerning first=203 second=296 amount=-1 +kerning first=109 second=281 amount=-1 +kerning first=78 second=264 amount=-1 +kerning first=284 second=69 amount=-1 +kerning first=113 second=108 amount=-1 +kerning first=280 second=8217 amount=-1 +kerning first=8222 second=335 amount=-1 +kerning first=209 second=241 amount=-1 +kerning first=316 second=8217 amount=-1 +kerning first=352 second=364 amount=-1 +kerning first=70 second=290 amount=-1 +kerning first=202 second=250 amount=-1 +kerning first=328 second=233 amount=-1 +kerning first=288 second=282 amount=-1 +kerning first=298 second=82 amount=-1 +kerning first=1055 second=1065 amount=-1 +kerning first=262 second=82 amount=-1 +kerning first=280 second=364 amount=-1 +kerning first=374 second=286 amount=-1 +kerning first=103 second=8217 amount=-2 +kerning first=370 second=82 amount=-1 +kerning first=1041 second=1117 amount=-1 +kerning first=71 second=69 amount=-1 +kerning first=334 second=82 amount=-1 +kerning first=1077 second=1117 amount=-1 +kerning first=212 second=69 amount=-1 +kerning first=208 second=8217 amount=-2 +kerning first=254 second=108 amount=-1 +kerning first=244 second=8217 amount=-2 +kerning first=1047 second=1091 amount=-1 +kerning first=105 second=243 amount=-1 +kerning first=266 second=286 amount=-1 +kerning first=89 second=351 amount=-1 +kerning first=66 second=86 amount=-1 +kerning first=302 second=286 amount=-1 +kerning first=1038 second=1061 amount=-1 +kerning first=338 second=286 amount=-1 +kerning first=302 second=351 amount=-1 +kerning first=70 second=355 amount=-1 +kerning first=89 second=286 amount=-1 +kerning first=266 second=351 amount=-1 +kerning first=75 second=338 amount=-1 +kerning first=230 second=351 amount=-1 +kerning first=1105 second=1078 amount=-1 +kerning first=199 second=334 amount=-1 +kerning first=1064 second=1030 amount=-1 +kerning first=194 second=286 amount=-1 +kerning first=80 second=99 amount=-1 +kerning first=85 second=82 amount=-1 +kerning first=258 second=216 amount=-1 +kerning first=66 second=365 amount=-1 +kerning first=272 second=203 amount=-1 +kerning first=1039 second=1095 amount=-1 +kerning first=1056 second=1043 amount=-1 +kerning first=327 second=103 amount=-1 +kerning first=1041 second=1037 amount=-1 +kerning first=118 second=254 amount=-1 +kerning first=1064 second=1072 amount=-1 +kerning first=74 second=117 amount=-1 +kerning first=200 second=203 amount=-1 +kerning first=1052 second=1074 amount=-1 +kerning first=1055 second=1039 amount=-1 +kerning first=220 second=122 amount=-1 +kerning first=1042 second=1083 amount=-1 +kerning first=287 second=117 amount=-1 +kerning first=220 second=100 amount=-1 +kerning first=288 second=296 amount=-1 +kerning first=220 second=263 amount=-1 +kerning first=88 second=171 amount=-1 +kerning first=70 second=298 amount=-1 +kerning first=67 second=8217 amount=-1 +kerning first=211 second=298 amount=-1 +kerning first=193 second=171 amount=-1 +kerning first=364 second=100 amount=-1 +kerning first=328 second=263 amount=-1 +kerning first=264 second=229 amount=-1 +kerning first=229 second=171 amount=-1 +kerning first=1036 second=1104 amount=-1 +kerning first=364 second=263 amount=-1 +kerning first=369 second=246 amount=-1 +kerning first=1038 second=1118 amount=-1 +kerning first=210 second=356 amount=-1 +kerning first=66 second=75 amount=-1 +kerning first=368 second=369 amount=-1 +kerning first=296 second=304 amount=-1 +kerning first=8217 second=230 amount=-1 +kerning first=261 second=246 amount=-1 +kerning first=368 second=304 amount=-1 +kerning first=73 second=66 amount=-1 +kerning first=225 second=246 amount=-1 +kerning first=83 second=304 amount=-1 +kerning first=1065 second=1118 amount=-1 +kerning first=1039 second=1060 amount=-1 +kerning first=1049 second=1080 amount=-1 +kerning first=199 second=120 amount=-1 +kerning first=1070 second=1031 amount=-1 +kerning first=277 second=316 amount=-1 +kerning first=84 second=246 amount=-1 +kerning first=235 second=120 amount=-1 +kerning first=195 second=220 amount=-1 +kerning first=1078 second=1086 amount=-1 +kerning first=344 second=368 amount=-1 +kerning first=200 second=8221 amount=-1 +kerning first=240 second=103 amount=-1 +kerning first=194 second=221 amount=-1 +kerning first=204 second=103 amount=-1 +kerning first=264 second=217 amount=-1 +kerning first=275 second=382 amount=-1 +kerning first=272 second=8221 amount=-2 +kerning first=272 second=218 amount=-1 +kerning first=198 second=211 amount=-1 +kerning first=99 second=103 amount=-1 +kerning first=200 second=368 amount=-1 +kerning first=289 second=109 amount=-1 +kerning first=344 second=8221 amount=-1 +kerning first=1078 second=1108 amount=-1 +kerning first=288 second=330 amount=-1 +kerning first=8250 second=369 amount=-1 +kerning first=325 second=109 amount=-1 +kerning first=72 second=68 amount=-1 +kerning first=272 second=368 amount=-1 +kerning first=103 second=307 amount=-1 +kerning first=217 second=109 amount=-1 +kerning first=213 second=68 amount=-1 +kerning first=1046 second=1092 amount=-1 +kerning first=279 second=8218 amount=-1 +kerning first=97 second=382 amount=-1 +kerning first=119 second=98 amount=-1 +kerning first=210 second=85 amount=-1 +kerning first=287 second=223 amount=-1 +kerning first=72 second=339 amount=-1 +kerning first=69 second=85 amount=-1 +kerning first=219 second=256 amount=-1 +kerning first=67 second=234 amount=-1 +kerning first=321 second=8220 amount=-1 +kerning first=1053 second=1081 amount=-1 +kerning first=201 second=210 amount=-1 +kerning first=89 second=199 amount=-1 +kerning first=1070 second=1059 amount=-1 +kerning first=264 second=302 amount=-1 +kerning first=323 second=223 amount=-1 +kerning first=103 second=234 amount=-1 +kerning first=100 second=243 amount=-1 +kerning first=325 second=280 amount=-1 +kerning first=268 second=335 amount=-1 +kerning first=1050 second=1090 amount=-1 +kerning first=232 second=335 amount=-1 +kerning first=205 second=243 amount=-1 +kerning first=70 second=363 amount=-1 +kerning first=304 second=335 amount=-1 +kerning first=277 second=243 amount=-1 +kerning first=241 second=243 amount=-1 +kerning first=74 second=223 amount=-1 +kerning first=108 second=339 amount=-1 +kerning first=249 second=339 amount=-1 +kerning first=270 second=219 amount=-1 +kerning first=283 second=363 amount=-1 +kerning first=70 second=225 amount=-1 +kerning first=198 second=219 amount=-1 +kerning first=287 second=8249 amount=-1 +kerning first=323 second=8249 amount=-1 +kerning first=368 second=71 amount=-1 +kerning first=207 second=357 amount=-1 +kerning first=206 second=350 amount=-1 +kerning first=213 second=76 amount=-1 +kerning first=282 second=365 amount=-1 +kerning first=72 second=76 amount=-1 +kerning first=279 second=357 amount=-1 +kerning first=1048 second=1034 amount=-1 +kerning first=214 second=196 amount=-1 +kerning first=109 second=289 amount=-1 +kerning first=250 second=289 amount=-1 +kerning first=267 second=228 amount=-1 +kerning first=316 second=234 amount=-1 +kerning first=214 second=354 amount=-1 +kerning first=1048 second=1068 amount=-1 +kerning first=8250 second=357 amount=-1 +kerning first=1049 second=1075 amount=-1 +kerning first=1078 second=1080 amount=-1 +kerning first=231 second=228 amount=-1 +kerning first=110 second=8249 amount=-1 +kerning first=1049 second=1074 amount=-1 +kerning first=66 second=83 amount=-1 +kerning first=282 second=85 amount=-1 +kerning first=278 second=79 amount=-1 +kerning first=1044 second=1108 amount=-1 +kerning first=72 second=274 amount=-1 +kerning first=73 second=80 amount=-1 +kerning first=204 second=366 amount=-1 +kerning first=350 second=250 amount=-1 +kerning first=346 second=46 amount=-1 +kerning first=310 second=46 amount=-1 +kerning first=45 second=112 amount=-1 +kerning first=354 second=283 amount=-1 +kerning first=1070 second=1045 amount=-1 +kerning first=80 second=378 amount=-1 +kerning first=368 second=8222 amount=-2 +kerning first=1071 second=1062 amount=-1 +kerning first=1054 second=1050 amount=-1 +kerning first=278 second=8218 amount=-1 +kerning first=8216 second=353 amount=-1 +kerning first=101 second=250 amount=-1 +kerning first=209 second=70 amount=-1 +kerning first=65 second=250 amount=-1 +kerning first=66 second=357 amount=-1 +kerning first=75 second=67 amount=-1 +kerning first=364 second=229 amount=-1 +kerning first=73 second=216 amount=-1 +kerning first=314 second=250 amount=-1 +kerning first=278 second=250 amount=-1 +kerning first=8220 second=115 amount=-1 +kerning first=1049 second=1060 amount=-1 +kerning first=272 second=195 amount=-1 +kerning first=66 second=192 amount=-1 +kerning first=72 second=382 amount=-1 +kerning first=68 second=70 amount=-1 +kerning first=213 second=274 amount=-1 +kerning first=266 second=213 amount=-1 +kerning first=202 second=317 amount=-1 +kerning first=74 second=323 amount=-1 +kerning first=375 second=122 amount=-1 +kerning first=119 second=369 amount=-1 +kerning first=325 second=207 amount=-1 +kerning first=83 second=369 amount=-1 +kerning first=274 second=317 amount=-1 +kerning first=362 second=116 amount=-1 +kerning first=220 second=271 amount=-1 +kerning first=346 second=317 amount=-1 +kerning first=231 second=122 amount=-1 +kerning first=374 second=213 amount=-1 +kerning first=267 second=122 amount=-1 +kerning first=338 second=213 amount=-1 +kerning first=302 second=213 amount=-1 +kerning first=79 second=198 amount=-1 +kerning first=364 second=271 amount=-1 +kerning first=332 second=8222 amount=-1 +kerning first=234 second=113 amount=-1 +kerning first=70 second=119 amount=-1 +kerning first=204 second=201 amount=-1 +kerning first=77 second=116 amount=-1 +kerning first=257 second=378 amount=-1 +kerning first=323 second=323 amount=-1 +kerning first=1027 second=1096 amount=-1 +kerning first=221 second=378 amount=-1 +kerning first=1070 second=1051 amount=-1 +kerning first=8249 second=362 amount=-1 +kerning first=217 second=207 amount=-1 +kerning first=119 second=8222 amount=-1 +kerning first=82 second=262 amount=-1 +kerning first=83 second=8222 amount=-1 +kerning first=218 second=116 amount=-1 +kerning first=187 second=262 amount=-1 +kerning first=210 second=315 amount=-1 +kerning first=79 second=366 amount=-1 +kerning first=87 second=113 amount=-1 +kerning first=254 second=314 amount=-1 +kerning first=220 second=259 amount=-1 +kerning first=213 second=204 amount=-1 +kerning first=1048 second=1081 amount=-1 +kerning first=291 second=355 amount=-1 +kerning first=232 second=339 amount=-1 +kerning first=80 second=195 amount=-1 +kerning first=113 second=314 amount=-1 +kerning first=65 second=363 amount=-1 +kerning first=101 second=363 amount=-1 +kerning first=364 second=259 amount=-1 +kerning first=205 second=110 amount=-1 +kerning first=212 second=198 amount=-1 +kerning first=323 second=116 amount=-1 +kerning first=344 second=67 amount=-1 +kerning first=279 second=369 amount=-1 +kerning first=287 second=116 amount=-1 +kerning first=1031 second=1030 amount=-1 +kerning first=278 second=363 amount=-1 +kerning first=67 second=73 amount=-1 +kerning first=200 second=207 amount=-1 +kerning first=200 second=67 amount=-1 +kerning first=350 second=363 amount=-1 +kerning first=214 second=356 amount=-1 +kerning first=205 second=317 amount=-1 +kerning first=230 second=103 amount=-1 +kerning first=272 second=207 amount=-1 +kerning first=66 second=369 amount=-1 +kerning first=264 second=113 amount=-1 +kerning first=187 second=210 amount=-1 +kerning first=8222 second=284 amount=-1 +kerning first=220 second=366 amount=-1 +kerning first=82 second=210 amount=-1 +kerning first=228 second=113 amount=-1 +kerning first=347 second=44 amount=-1 +kerning first=356 second=8250 amount=-1 +kerning first=1104 second=1093 amount=-1 +kerning first=270 second=302 amount=-1 +kerning first=78 second=213 amount=-1 +kerning first=67 second=268 amount=-1 +kerning first=267 second=271 amount=-1 +kerning first=1070 second=1038 amount=-1 +kerning first=253 second=8218 amount=-1 +kerning first=198 second=302 amount=-1 +kerning first=248 second=8250 amount=-1 +kerning first=339 second=271 amount=-1 +kerning first=280 second=268 amount=-1 +kerning first=212 second=8250 amount=-1 +kerning first=72 second=351 amount=-1 +kerning first=217 second=101 amount=-1 +kerning first=272 second=354 amount=-1 +kerning first=219 second=213 amount=-1 +kerning first=269 second=8220 amount=-2 +kerning first=234 second=8220 amount=-2 +kerning first=289 second=101 amount=-1 +kerning first=71 second=8250 amount=-1 +kerning first=198 second=8220 amount=-1 +kerning first=219 second=257 amount=-1 +kerning first=66 second=262 amount=-1 +kerning first=193 second=219 amount=-1 +kerning first=207 second=262 amount=-1 +kerning first=1044 second=1105 amount=-1 +kerning first=327 second=213 amount=-1 +kerning first=83 second=296 amount=-1 +kerning first=234 second=122 amount=-1 +kerning first=254 second=291 amount=-1 +kerning first=1058 second=1098 amount=-1 +kerning first=72 second=204 amount=-1 +kerning first=71 second=345 amount=-1 +kerning first=262 second=72 amount=-1 +kerning first=296 second=296 amount=-1 +kerning first=201 second=73 amount=-1 +kerning first=1078 second=1072 amount=-1 +kerning first=205 second=290 amount=-1 +kerning first=323 second=283 amount=-1 +kerning first=330 second=338 amount=-1 +kerning first=279 second=235 amount=-1 +kerning first=207 second=82 amount=-1 +kerning first=251 second=283 amount=-1 +kerning first=258 second=338 amount=-1 +kerning first=310 second=286 amount=-1 +kerning first=206 second=355 amount=-1 +kerning first=110 second=283 amount=-1 +kerning first=1067 second=1060 amount=-1 +kerning first=73 second=277 amount=-1 +kerning first=83 second=82 amount=-1 +kerning first=45 second=338 amount=-1 +kerning first=74 second=283 amount=-1 +kerning first=202 second=286 amount=-1 +kerning first=78 second=226 amount=-1 +kerning first=270 second=8220 amount=-2 +kerning first=213 second=351 amount=-1 +kerning first=114 second=226 amount=-1 +kerning first=232 second=367 amount=-1 +kerning first=274 second=286 amount=-1 +kerning first=272 second=260 amount=-1 +kerning first=210 second=86 amount=-1 +kerning first=82 second=8250 amount=-1 +kerning first=219 second=226 amount=-1 +kerning first=354 second=347 amount=-1 +kerning first=220 second=79 amount=-1 +kerning first=66 second=82 amount=-1 +kerning first=77 second=275 amount=-1 +kerning first=327 second=226 amount=-1 +kerning first=72 second=244 amount=-1 +kerning first=345 second=240 amount=-1 +kerning first=356 second=171 amount=-1 +kerning first=108 second=244 amount=-1 +kerning first=219 second=333 amount=-1 +kerning first=214 second=70 amount=-1 +kerning first=78 second=333 amount=-1 +kerning first=286 second=70 amount=-1 +kerning first=249 second=244 amount=-1 +kerning first=327 second=333 amount=-1 +kerning first=1064 second=1056 amount=-1 +kerning first=363 second=333 amount=-1 +kerning first=338 second=278 amount=-1 +kerning first=288 second=220 amount=-1 +kerning first=302 second=278 amount=-1 +kerning first=73 second=70 amount=-1 +kerning first=1055 second=1069 amount=-1 +kerning first=291 second=333 amount=-1 +kerning first=266 second=278 amount=-1 +kerning first=1039 second=1094 amount=-1 +kerning first=217 second=74 amount=-1 +kerning first=1052 second=1065 amount=-1 +kerning first=71 second=171 amount=-1 +kerning first=249 second=231 amount=-1 +kerning first=107 second=171 amount=-1 +kerning first=325 second=74 amount=-1 +kerning first=1031 second=1060 amount=-1 +kerning first=8250 second=76 amount=-1 +kerning first=224 second=269 amount=-1 +kerning first=72 second=231 amount=-1 +kerning first=284 second=171 amount=-1 +kerning first=199 second=201 amount=-1 +kerning first=108 second=231 amount=-1 +kerning first=338 second=252 amount=-1 +kerning first=370 second=214 amount=-1 +kerning first=368 second=269 amount=-1 +kerning first=279 second=249 amount=-1 +kerning first=107 second=318 amount=-1 +kerning first=296 second=269 amount=-1 +kerning first=374 second=252 amount=-1 +kerning first=262 second=214 amount=-1 +kerning first=171 second=370 amount=-1 +kerning first=323 second=310 amount=-1 +kerning first=66 second=249 amount=-1 +kerning first=8250 second=90 amount=-1 +kerning first=248 second=318 amount=-1 +kerning first=282 second=200 amount=-1 +kerning first=69 second=266 amount=-1 +kerning first=268 second=8222 amount=-1 +kerning first=212 second=209 amount=-1 +kerning first=117 second=287 amount=-1 +kerning first=232 second=8222 amount=-1 +kerning first=266 second=45 amount=-1 +kerning first=196 second=370 amount=-1 +kerning first=89 second=252 amount=-1 +kerning first=73 second=97 amount=-1 +kerning first=76 second=362 amount=-1 +kerning first=194 second=45 amount=-1 +kerning first=194 second=252 amount=-1 +kerning first=203 second=71 amount=-1 +kerning first=1062 second=1097 amount=-1 +kerning first=374 second=45 amount=-2 +kerning first=304 second=370 amount=-1 +kerning first=78 second=199 amount=-1 +kerning first=234 second=275 amount=-1 +kerning first=230 second=252 amount=-1 +kerning first=338 second=45 amount=-1 +kerning first=85 second=214 amount=-1 +kerning first=268 second=370 amount=-1 +kerning first=288 second=209 amount=-1 +kerning first=1105 second=1081 amount=-1 +kerning first=270 second=73 amount=-1 +kerning first=194 second=251 amount=-1 +kerning first=72 second=217 amount=-1 +kerning first=8250 second=296 amount=-1 +kerning first=304 second=223 amount=-1 +kerning first=77 second=338 amount=-1 +kerning first=268 second=223 amount=-1 +kerning first=364 second=232 amount=-1 +kerning first=213 second=217 amount=-1 +kerning first=1030 second=1027 amount=-1 +kerning first=219 second=201 amount=-1 +kerning first=328 second=232 amount=-1 +kerning first=67 second=108 amount=-1 +kerning first=230 second=251 amount=-1 +kerning first=224 second=243 amount=-1 +kerning first=321 second=217 amount=-1 +kerning first=1066 second=1027 amount=-1 +kerning first=296 second=243 amount=-1 +kerning first=282 second=266 amount=-1 +kerning first=374 second=251 amount=-1 +kerning first=368 second=243 amount=-1 +kerning first=83 second=274 amount=-1 +kerning first=259 second=171 amount=-1 +kerning first=101 second=242 amount=-1 +kerning first=214 second=8221 amount=-2 +kerning first=89 second=225 amount=-1 +kerning first=250 second=8221 amount=-1 +kerning first=284 second=345 amount=-1 +kerning first=235 second=335 amount=-1 +kerning first=286 second=8221 amount=-1 +kerning first=199 second=335 amount=-1 +kerning first=302 second=225 amount=-1 +kerning first=220 second=232 amount=-1 +kerning first=266 second=72 amount=-1 +kerning first=307 second=335 amount=-1 +kerning first=1048 second=1054 amount=-1 +kerning first=266 second=225 amount=-1 +kerning first=302 second=72 amount=-1 +kerning first=271 second=335 amount=-1 +kerning first=197 second=89 amount=-1 +kerning first=374 second=225 amount=-1 +kerning first=8249 second=83 amount=-1 +kerning first=206 second=242 amount=-1 +kerning first=1043 second=1105 amount=-1 +kerning first=1039 second=1052 amount=-1 +kerning first=1065 second=1089 amount=-1 +kerning first=1054 second=1063 amount=-1 +kerning first=65 second=336 amount=-1 +kerning first=204 second=243 amount=-1 +kerning first=262 second=114 amount=-1 +kerning first=1028 second=1117 amount=-1 +kerning first=338 second=72 amount=-1 +kerning first=272 second=344 amount=-1 +kerning first=85 second=241 amount=-1 +kerning first=1055 second=1096 amount=-1 +kerning first=206 second=336 amount=-1 +kerning first=217 second=269 amount=-1 +kerning first=370 second=241 amount=-1 +kerning first=8250 second=270 amount=-1 +kerning first=278 second=336 amount=-1 +kerning first=298 second=241 amount=-1 +kerning first=262 second=241 amount=-1 +kerning first=325 second=114 amount=-1 +kerning first=1060 second=1045 amount=-1 +kerning first=72 second=378 amount=-1 +kerning first=289 second=114 amount=-1 +kerning first=219 second=199 amount=-1 +kerning first=67 second=115 amount=-1 +kerning first=1071 second=1056 amount=-1 +kerning first=103 second=115 amount=-1 +kerning first=114 second=46 amount=-1 +kerning first=255 second=46 amount=-1 +kerning first=327 second=199 amount=-1 +kerning first=187 second=344 amount=-1 +kerning first=77 second=81 amount=-1 +kerning first=112 second=114 amount=-1 +kerning first=77 second=327 amount=-1 +kerning first=1049 second=1113 amount=-1 +kerning first=85 second=361 amount=-1 +kerning first=217 second=114 amount=-1 +kerning first=108 second=378 amount=-1 +kerning first=206 second=79 amount=-1 +kerning first=204 second=284 amount=-1 +kerning first=218 second=327 amount=-1 +kerning first=1053 second=1045 amount=-1 +kerning first=65 second=216 amount=-1 +kerning first=290 second=327 amount=-1 +kerning first=74 second=310 amount=-1 +kerning first=218 second=81 amount=-1 +kerning first=262 second=44 amount=-1 +kerning first=73 second=8221 amount=-1 +kerning first=370 second=361 amount=-1 +kerning first=109 second=8221 amount=-2 +kerning first=206 second=216 amount=-1 +kerning first=362 second=81 amount=-1 +kerning first=88 second=218 amount=-1 +kerning first=333 second=8221 amount=-2 +kerning first=369 second=8221 amount=-1 +kerning first=214 second=44 amount=-1 +kerning first=80 second=8249 amount=-1 +kerning first=356 second=224 amount=-1 +kerning first=1042 second=1098 amount=-1 +kerning first=116 second=8249 amount=-1 +kerning first=78 second=72 amount=-1 +kerning first=221 second=369 amount=-1 +kerning first=221 second=8249 amount=-2 +kerning first=368 second=282 amount=-1 +kerning first=257 second=8249 amount=-1 +kerning first=1069 second=1068 amount=-1 +kerning first=221 second=331 amount=-1 +kerning first=296 second=282 amount=-1 +kerning first=209 second=352 amount=-1 +kerning first=199 second=102 amount=-1 +kerning first=85 second=267 amount=-1 +kerning first=1055 second=1070 amount=-1 +kerning first=326 second=45 amount=-1 +kerning first=219 second=72 amount=-1 +kerning first=1039 second=1055 amount=-1 +kerning first=1055 second=1089 amount=-1 +kerning first=83 second=282 amount=-1 +kerning first=86 second=248 amount=-1 +kerning first=193 second=218 amount=-1 +kerning first=227 second=248 amount=-1 +kerning first=8250 second=217 amount=-1 +kerning first=73 second=44 amount=-1 +kerning first=302 second=199 amount=-1 +kerning first=269 second=230 amount=-1 +kerning first=77 second=206 amount=-1 +kerning first=1067 second=1086 amount=-1 +kerning first=76 second=87 amount=-1 +kerning first=1033 second=1031 amount=-1 +kerning first=1031 second=1086 amount=-1 +kerning first=374 second=199 amount=-1 +kerning first=362 second=288 amount=-1 +kerning first=290 second=206 amount=-1 +kerning first=230 second=291 amount=-1 +kerning first=201 second=361 amount=-1 +kerning first=218 second=206 amount=-1 +kerning first=77 second=288 amount=-1 +kerning first=1048 second=1080 amount=-1 +kerning first=199 second=227 amount=-1 +kerning first=305 second=337 amount=-1 +kerning first=84 second=8221 amount=-1 +kerning first=313 second=84 amount=-1 +kerning first=66 second=81 amount=-1 +kerning first=269 second=337 amount=-1 +kerning first=362 second=206 amount=-1 +kerning first=120 second=8221 amount=-1 +kerning first=1091 second=1095 amount=-1 +kerning first=233 second=337 amount=-1 +kerning first=1055 second=1095 amount=-1 +kerning first=225 second=8221 amount=-2 +kerning first=207 second=81 amount=-1 +kerning first=187 second=197 amount=-1 +kerning first=261 second=8221 amount=-2 +kerning first=1043 second=1079 amount=-1 +kerning first=257 second=267 amount=-1 +kerning first=218 second=288 amount=-1 +kerning first=72 second=352 amount=-1 +kerning first=8249 second=221 amount=-1 +kerning first=206 second=362 amount=-1 +kerning first=212 second=197 amount=-1 +kerning first=103 second=187 amount=-1 +kerning first=83 second=270 amount=-1 +kerning first=217 second=75 amount=-1 +kerning first=195 second=219 amount=-1 +kerning first=278 second=362 amount=-1 +kerning first=1055 second=1117 amount=-1 +kerning first=72 second=325 amount=-1 +kerning first=67 second=187 amount=-1 +kerning first=350 second=362 amount=-1 +kerning first=218 second=8218 amount=-2 +kerning first=213 second=325 amount=-1 +kerning first=280 second=187 amount=-1 +kerning first=199 second=200 amount=-1 +kerning first=296 second=270 amount=-1 +kerning first=1075 second=1082 amount=-1 +kerning first=77 second=8218 amount=-1 +kerning first=221 second=266 amount=-1 +kerning first=244 second=187 amount=-1 +kerning first=70 second=66 amount=-1 +kerning first=65 second=255 amount=-1 +kerning first=335 second=382 amount=-1 +kerning first=80 second=8222 amount=-2 +kerning first=85 second=202 amount=-1 +kerning first=80 second=266 amount=-1 +kerning first=1036 second=1116 amount=-1 +kerning first=73 second=71 amount=-1 +kerning first=374 second=264 amount=-1 +kerning first=233 second=107 amount=-1 +kerning first=1055 second=1043 amount=-1 +kerning first=338 second=264 amount=-1 +kerning first=88 second=252 amount=-1 +kerning first=217 second=77 amount=-1 +kerning first=281 second=275 amount=-1 +kerning first=325 second=75 amount=-1 +kerning first=302 second=264 amount=-1 +kerning first=65 second=362 amount=-1 +kerning first=266 second=264 amount=-1 +kerning first=356 second=279 amount=-1 +kerning first=218 second=261 amount=-1 +kerning first=205 second=209 amount=-1 +kerning first=194 second=264 amount=-1 +kerning first=281 second=367 amount=-1 +kerning first=81 second=218 amount=-1 +kerning first=197 second=364 amount=-1 +kerning first=375 second=117 amount=-1 +kerning first=89 second=264 amount=-1 +kerning first=362 second=261 amount=-1 +kerning first=78 second=334 amount=-1 +kerning first=298 second=202 amount=-1 +kerning first=211 second=66 amount=-1 +kerning first=262 second=202 amount=-1 +kerning first=370 second=202 amount=-1 +kerning first=323 second=257 amount=-1 +kerning first=334 second=202 amount=-1 +kerning first=1027 second=1091 amount=-1 +kerning first=351 second=108 amount=-1 +kerning first=74 second=257 amount=-1 +kerning first=202 second=205 amount=-1 +kerning first=364 second=193 amount=-1 +kerning first=243 second=108 amount=-1 +kerning first=279 second=108 amount=-1 +kerning first=219 second=334 amount=-1 +kerning first=368 second=270 amount=-1 +kerning first=79 second=193 amount=-1 +kerning first=346 second=205 amount=-1 +kerning first=220 second=193 amount=-1 +kerning first=286 second=171 amount=-1 +kerning first=327 second=334 amount=-1 +kerning first=77 second=261 amount=-1 +kerning first=274 second=205 amount=-1 +kerning first=201 second=323 amount=-1 +kerning first=291 second=307 amount=-1 +kerning first=8218 second=113 amount=-1 +kerning first=68 second=194 amount=-1 +kerning first=8217 second=231 amount=-1 +kerning first=228 second=267 amount=-1 +kerning first=268 second=82 amount=-1 +kerning first=259 second=263 amount=-1 +kerning first=82 second=171 amount=-1 +kerning first=118 second=171 amount=-1 +kerning first=195 second=117 amount=-1 +kerning first=280 second=8218 amount=-1 +kerning first=368 second=351 amount=-1 +kerning first=220 second=46 amount=-2 +kerning first=86 second=286 amount=-1 +kerning first=296 second=351 amount=-1 +kerning first=99 second=365 amount=-1 +kerning first=339 second=117 amount=-1 +kerning first=1058 second=1074 amount=-1 +kerning first=288 second=68 amount=-1 +kerning first=8222 second=111 amount=-1 +kerning first=1055 second=1108 amount=-1 +kerning first=1108 second=1078 amount=-1 +kerning first=267 second=117 amount=-1 +kerning first=231 second=117 amount=-1 +kerning first=8250 second=282 amount=-1 +kerning first=192 second=8249 amount=-1 +kerning first=1031 second=1119 amount=-1 +kerning first=302 second=333 amount=-1 +kerning first=210 second=347 amount=-1 +kerning first=298 second=100 amount=-1 +kerning first=120 second=316 amount=-1 +kerning first=1118 second=1083 amount=-1 +kerning first=86 second=382 amount=-1 +kerning first=230 second=333 amount=-1 +kerning first=261 second=316 amount=-1 +kerning first=220 second=220 amount=-1 +kerning first=266 second=333 amount=-1 +kerning first=333 second=316 amount=-1 +kerning first=227 second=382 amount=-1 +kerning first=79 second=220 amount=-1 +kerning first=263 second=382 amount=-1 +kerning first=374 second=333 amount=-1 +kerning first=1067 second=1034 amount=-1 +kerning first=368 second=103 amount=-1 +kerning first=99 second=234 amount=-1 +kerning first=304 second=330 amount=-1 +kerning first=1031 second=1034 amount=-1 +kerning first=1031 second=1099 amount=-1 +kerning first=73 second=211 amount=-1 +kerning first=85 second=100 amount=-1 +kerning first=1065 second=1076 amount=-1 +kerning first=224 second=103 amount=-1 +kerning first=217 second=281 amount=-1 +kerning first=367 second=171 amount=-1 +kerning first=1067 second=1099 amount=-1 +kerning first=119 second=103 amount=-1 +kerning first=262 second=100 amount=-1 +kerning first=8250 second=378 amount=-1 +kerning first=364 second=220 amount=-1 +kerning first=204 second=77 amount=-1 +kerning first=89 second=333 amount=-1 +kerning first=338 second=85 amount=-1 +kerning first=339 second=113 amount=-1 +kerning first=235 second=252 amount=-1 +kerning first=1044 second=1057 amount=-1 +kerning first=302 second=85 amount=-1 +kerning first=80 second=304 amount=-1 +kerning first=266 second=85 amount=-1 +kerning first=1052 second=1092 amount=-1 +kerning first=201 second=280 amount=-1 +kerning first=279 second=314 amount=-1 +kerning first=194 second=85 amount=-1 +kerning first=337 second=120 amount=-1 +kerning first=243 second=314 amount=-1 +kerning first=200 second=315 amount=-1 +kerning first=355 second=8217 amount=-1 +kerning first=88 second=44 amount=-1 +kerning first=89 second=110 amount=-1 +kerning first=351 second=314 amount=-1 +kerning first=328 second=118 amount=-1 +kerning first=253 second=254 amount=-1 +kerning first=302 second=110 amount=-1 +kerning first=66 second=8220 amount=-2 +kerning first=345 second=8250 amount=-1 +kerning first=266 second=110 amount=-1 +kerning first=97 second=339 amount=-1 +kerning first=374 second=110 amount=-1 +kerning first=362 second=219 amount=-1 +kerning first=232 second=357 amount=-1 +kerning first=290 second=219 amount=-1 +kerning first=1048 second=1042 amount=-1 +kerning first=201 second=8250 amount=-1 +kerning first=196 second=357 amount=-1 +kerning first=310 second=85 amount=-1 +kerning first=8217 second=248 amount=-1 +kerning first=304 second=357 amount=-1 +kerning first=368 second=76 amount=-1 +kerning first=218 second=219 amount=-1 +kerning first=268 second=357 amount=-1 +kerning first=289 second=254 amount=-1 +kerning first=205 second=332 amount=-1 +kerning first=210 second=374 amount=-1 +kerning first=101 second=101 amount=-1 +kerning first=296 second=76 amount=-1 +kerning first=334 second=46 amount=-1 +kerning first=120 second=289 amount=-1 +kerning first=206 second=101 amount=-1 +kerning first=261 second=289 amount=-1 +kerning first=225 second=289 amount=-1 +kerning first=77 second=219 amount=-1 +kerning first=72 second=296 amount=-1 +kerning first=333 second=289 amount=-1 +kerning first=203 second=212 amount=-1 +kerning first=211 second=8217 amount=-2 +kerning first=100 second=111 amount=-1 +kerning first=272 second=315 amount=-1 +kerning first=83 second=76 amount=-1 +kerning first=369 second=289 amount=-1 +kerning first=213 second=296 amount=-1 +kerning first=205 second=111 amount=-1 +kerning first=241 second=111 amount=-1 +kerning first=70 second=8217 amount=-1 +kerning first=277 second=111 amount=-1 +kerning first=106 second=8217 amount=-1 +kerning first=284 second=280 amount=-1 +kerning first=323 second=241 amount=-1 +kerning first=354 second=335 amount=-1 +kerning first=287 second=241 amount=-1 +kerning first=81 second=89 amount=-1 +kerning first=313 second=85 amount=-1 +kerning first=1053 second=1099 amount=-1 +kerning first=205 second=85 amount=-1 +kerning first=74 second=241 amount=-1 +kerning first=243 second=287 amount=-1 +kerning first=219 second=8249 amount=-2 +kerning first=244 second=46 amount=-1 +kerning first=118 second=8220 amount=-2 +kerning first=206 second=271 amount=-1 +kerning first=352 second=46 amount=-1 +kerning first=259 second=8220 amount=-2 +kerning first=86 second=339 amount=-1 +kerning first=223 second=8220 amount=-2 +kerning first=262 second=259 amount=-1 +kerning first=114 second=171 amount=-1 +kerning first=351 second=287 amount=-1 +kerning first=187 second=302 amount=-1 +kerning first=8217 second=286 amount=-1 +kerning first=205 second=225 amount=-1 +kerning first=194 second=118 amount=-1 +kerning first=279 second=287 amount=-1 +kerning first=219 second=269 amount=-1 +kerning first=367 second=8220 amount=-1 +kerning first=275 second=250 amount=-1 +kerning first=366 second=229 amount=-1 +kerning first=355 second=225 amount=-1 +kerning first=224 second=378 amount=-1 +kerning first=330 second=229 amount=-1 +kerning first=214 second=195 amount=-1 +kerning first=203 second=250 amount=-1 +kerning first=1047 second=1090 amount=-1 +kerning first=72 second=8221 amount=-1 +kerning first=70 second=67 amount=-1 +kerning first=119 second=378 amount=-1 +kerning first=80 second=357 amount=-1 +kerning first=219 second=278 amount=-1 +kerning first=103 second=46 amount=-1 +kerning first=218 second=8217 amount=-1 +kerning first=193 second=284 amount=-1 +kerning first=368 second=378 amount=-1 +kerning first=67 second=46 amount=-1 +kerning first=270 second=344 amount=-1 +kerning first=1039 second=1043 amount=-1 +kerning first=208 second=46 amount=-1 +kerning first=211 second=207 amount=-1 +kerning first=78 second=278 amount=-1 +kerning first=296 second=378 amount=-1 +kerning first=1027 second=1075 amount=-1 +kerning first=258 second=89 amount=-1 +kerning first=67 second=288 amount=-1 +kerning first=198 second=220 amount=-1 +kerning first=327 second=278 amount=-1 +kerning first=199 second=76 amount=-1 +kerning first=270 second=220 amount=-1 +kerning first=88 second=284 amount=-1 +kerning first=366 second=246 amount=-1 +kerning first=1039 second=1064 amount=-1 +kerning first=206 second=74 amount=-1 +kerning first=71 second=280 amount=-1 +kerning first=1041 second=1118 amount=-1 +kerning first=212 second=280 amount=-1 +kerning first=204 second=114 amount=-1 +kerning first=325 second=216 amount=-1 +kerning first=282 second=201 amount=-1 +kerning first=275 second=113 amount=-1 +kerning first=362 second=369 amount=-1 +kerning first=118 second=104 amount=-1 +kerning first=234 second=339 amount=-1 +kerning first=1051 second=1084 amount=-1 +kerning first=72 second=269 amount=-1 +kerning first=210 second=201 amount=-1 +kerning first=72 second=213 amount=-1 +kerning first=108 second=269 amount=-1 +kerning first=69 second=201 amount=-1 +kerning first=274 second=204 amount=-1 +kerning first=1028 second=1094 amount=-1 +kerning first=8222 second=249 amount=-1 +kerning first=1064 second=1094 amount=-1 +kerning first=209 second=259 amount=-1 +kerning first=204 second=116 amount=-1 +kerning first=202 second=204 amount=-1 +kerning first=249 second=269 amount=-1 +kerning first=267 second=233 amount=-1 +kerning first=1031 second=1042 amount=-1 +kerning first=218 second=65 amount=-1 +kerning first=74 second=104 amount=-1 +kerning first=235 second=271 amount=-1 +kerning first=317 second=366 amount=-1 +kerning first=99 second=229 amount=-1 +kerning first=74 second=250 amount=-1 +kerning first=346 second=204 amount=-1 +kerning first=197 second=268 amount=-1 +kerning first=288 second=317 amount=-1 +kerning first=1030 second=1069 amount=-1 +kerning first=362 second=65 amount=-1 +kerning first=218 second=369 amount=-1 +kerning first=198 second=210 amount=-1 +kerning first=45 second=256 amount=-1 +kerning first=68 second=366 amount=-1 +kerning first=81 second=256 amount=-1 +kerning first=87 second=283 amount=-1 +kerning first=281 second=113 amount=-1 +kerning first=370 second=382 amount=-1 +kerning first=8218 second=255 amount=-1 +kerning first=262 second=73 amount=-1 +kerning first=77 second=262 amount=-1 +kerning first=334 second=73 amount=-1 +kerning first=298 second=73 amount=-1 +kerning first=8218 second=362 amount=-1 +kerning first=67 second=213 amount=-1 +kerning first=366 second=256 amount=-1 +kerning first=119 second=351 amount=-1 +kerning first=1031 second=1070 amount=-1 +kerning first=283 second=311 amount=-1 +kerning first=99 second=326 amount=-1 +kerning first=280 second=213 amount=-1 +kerning first=218 second=262 amount=-1 +kerning first=219 second=251 amount=-1 +kerning first=204 second=219 amount=-1 +kerning first=1052 second=1053 amount=-1 +kerning first=1046 second=1105 amount=-1 +kerning first=281 second=122 amount=-1 +kerning first=275 second=277 amount=-1 +kerning first=278 second=282 amount=-1 +kerning first=209 second=122 amount=-1 +kerning first=85 second=73 amount=-1 +kerning first=195 second=81 amount=-1 +kerning first=1058 second=1051 amount=-1 +kerning first=70 second=311 amount=-1 +kerning first=291 second=251 amount=-1 +kerning first=1059 second=1054 amount=-1 +kerning first=362 second=235 amount=-1 +kerning first=98 second=8221 amount=-2 +kerning first=367 second=345 amount=-1 +kerning first=204 second=283 amount=-1 +kerning first=203 second=8221 amount=-1 +kerning first=264 second=75 amount=-1 +kerning first=199 second=270 amount=-1 +kerning first=99 second=283 amount=-1 +kerning first=330 second=380 amount=-1 +kerning first=275 second=8221 amount=-2 +kerning first=100 second=248 amount=-1 +kerning first=197 second=187 amount=-1 +kerning first=311 second=8221 amount=-1 +kerning first=241 second=248 amount=-1 +kerning first=1048 second=1119 amount=-1 +kerning first=89 second=226 amount=-1 +kerning first=347 second=8221 amount=-2 +kerning first=205 second=248 amount=-1 +kerning first=366 second=380 amount=-1 +kerning first=74 second=218 amount=-1 +kerning first=367 second=279 amount=-1 +kerning first=221 second=196 amount=-1 +kerning first=206 second=243 amount=-1 +kerning first=217 second=336 amount=-1 +kerning first=339 second=242 amount=-1 +kerning first=80 second=196 amount=-1 +kerning first=241 second=232 amount=-1 +kerning first=231 second=242 amount=-1 +kerning first=81 second=66 amount=-1 +kerning first=78 second=223 amount=-1 +kerning first=302 second=226 amount=-1 +kerning first=45 second=66 amount=-1 +kerning first=325 second=336 amount=-1 +kerning first=374 second=226 amount=-1 +kerning first=327 second=277 amount=-1 +kerning first=240 second=283 amount=-1 +kerning first=258 second=370 amount=-1 +kerning first=8218 second=228 amount=-1 +kerning first=45 second=380 amount=-1 +kerning first=217 second=194 amount=-1 +kerning first=224 second=244 amount=-1 +kerning first=288 second=274 amount=-1 +kerning first=296 second=244 amount=-1 +kerning first=70 second=230 amount=-1 +kerning first=327 second=45 amount=-1 +kerning first=84 second=233 amount=-1 +kerning first=80 second=227 amount=-1 +kerning first=234 second=367 amount=-1 +kerning first=366 second=66 amount=-1 +kerning first=368 second=244 amount=-1 +kerning first=330 second=66 amount=-1 +kerning first=221 second=8222 amount=-2 +kerning first=225 second=233 amount=-1 +kerning first=219 second=8221 amount=-1 +kerning first=261 second=233 amount=-1 +kerning first=116 second=8222 amount=-1 +kerning first=266 second=71 amount=-1 +kerning first=77 second=235 amount=-1 +kerning first=283 second=279 amount=-1 +kerning first=336 second=44 amount=-1 +kerning first=369 second=233 amount=-1 +kerning first=97 second=231 amount=-1 +kerning first=264 second=44 amount=-1 +kerning first=218 second=235 amount=-1 +kerning first=203 second=70 amount=-1 +kerning first=288 second=82 amount=-1 +kerning first=1071 second=1045 amount=-1 +kerning first=326 second=235 amount=-1 +kerning first=118 second=318 amount=-1 +kerning first=1058 second=1116 amount=-1 +kerning first=192 second=71 amount=-1 +kerning first=74 second=214 amount=-1 +kerning first=87 second=71 amount=-1 +kerning first=196 second=249 amount=-1 +kerning first=367 second=275 amount=-1 +kerning first=219 second=206 amount=-1 +kerning first=364 second=258 amount=-1 +kerning first=217 second=363 amount=-1 +kerning first=323 second=214 amount=-1 +kerning first=204 second=310 amount=-1 +kerning first=99 second=353 amount=-1 +kerning first=253 second=363 amount=-1 +kerning first=1050 second=1104 amount=-1 +kerning first=235 second=243 amount=-1 +kerning first=289 second=363 amount=-1 +kerning first=264 second=71 amount=-1 +kerning first=66 second=370 amount=-1 +kerning first=204 second=353 amount=-1 +kerning first=78 second=45 amount=-1 +kerning first=80 second=298 amount=-1 +kerning first=70 second=77 amount=-1 +kerning first=315 second=370 amount=-1 +kerning first=114 second=45 amount=-1 +kerning first=207 second=370 amount=-1 +kerning first=103 second=369 amount=-1 +kerning first=259 second=275 amount=-1 +kerning first=192 second=362 amount=-1 +kerning first=288 second=80 amount=-1 +kerning first=232 second=249 amount=-1 +kerning first=255 second=45 amount=-1 +kerning first=263 second=106 amount=-1 +kerning first=88 second=336 amount=-1 +kerning first=277 second=252 amount=-1 +kerning first=291 second=45 amount=-1 +kerning first=198 second=8250 amount=-1 +kerning first=227 second=242 amount=-1 +kerning first=335 second=106 amount=-1 +kerning first=219 second=45 amount=-2 +kerning first=106 second=234 amount=-1 +kerning first=370 second=267 amount=-1 +kerning first=45 second=250 amount=-1 +kerning first=70 second=234 amount=-1 +kerning first=83 second=217 amount=-1 +kerning first=1046 second=1028 amount=-1 +kerning first=221 second=223 amount=-1 +kerning first=283 second=234 amount=-1 +kerning first=226 second=267 amount=-1 +kerning first=262 second=267 amount=-1 +kerning first=355 second=234 amount=-1 +kerning first=67 second=281 amount=-1 +kerning first=82 second=8220 amount=-1 +kerning first=296 second=217 amount=-1 +kerning first=80 second=223 amount=-1 +kerning first=66 second=206 amount=-1 +kerning first=1064 second=1098 amount=-1 +kerning first=73 second=368 amount=-1 +kerning first=220 second=258 amount=-1 +kerning first=368 second=217 amount=-1 +kerning first=209 second=232 amount=-1 +kerning first=271 second=243 amount=-1 +kerning first=1044 second=1095 amount=-1 +kerning first=82 second=345 amount=-1 +kerning first=207 second=206 amount=-1 +kerning first=104 second=232 amount=-1 +kerning first=45 second=325 amount=-1 +kerning first=118 second=345 amount=-1 +kerning first=214 second=368 amount=-1 +kerning first=1116 second=1095 amount=-1 +kerning first=198 second=371 amount=-1 +kerning first=187 second=345 amount=-1 +kerning first=199 second=266 amount=-1 +kerning first=223 second=345 amount=-1 +kerning first=79 second=258 amount=-1 +kerning first=206 second=259 amount=-1 +kerning first=1060 second=1042 amount=-1 +kerning first=1031 second=1091 amount=-1 +kerning first=80 second=200 amount=-1 +kerning first=354 second=277 amount=-1 +kerning first=8218 second=281 amount=-1 +kerning first=70 second=315 amount=-1 +kerning first=77 second=370 amount=-1 +kerning first=88 second=8218 amount=-1 +kerning first=362 second=290 amount=-1 +kerning first=290 second=370 amount=-1 +kerning first=366 second=337 amount=-1 +kerning first=240 second=245 amount=-1 +kerning first=337 second=8218 amount=-1 +kerning first=288 second=313 amount=-1 +kerning first=330 second=337 amount=-1 +kerning first=204 second=245 amount=-1 +kerning first=1047 second=1116 amount=-1 +kerning first=218 second=370 amount=-1 +kerning first=284 second=323 amount=-1 +kerning first=1070 second=1037 amount=-1 +kerning first=221 second=249 amount=-1 +kerning first=205 second=199 amount=-1 +kerning first=258 second=105 amount=-1 +kerning first=362 second=370 amount=-1 +kerning first=337 second=106 amount=-1 +kerning first=99 second=120 amount=-1 +kerning first=67 second=45 amount=-1 +kerning first=362 second=257 amount=-1 +kerning first=103 second=45 amount=-1 +kerning first=1056 second=1086 amount=-1 +kerning first=366 second=230 amount=-1 +kerning first=330 second=230 amount=-1 +kerning first=251 second=267 amount=-1 +kerning first=1038 second=1076 amount=-1 +kerning first=192 second=318 amount=-1 +kerning first=287 second=267 amount=-1 +kerning first=199 second=217 amount=-1 +kerning first=352 second=72 amount=-1 +kerning first=323 second=267 amount=-1 +kerning first=74 second=267 amount=-1 +kerning first=104 second=118 amount=-1 +kerning first=278 second=345 amount=-1 +kerning first=110 second=267 amount=-1 +kerning first=264 second=212 amount=-1 +kerning first=264 second=114 amount=-1 +kerning first=8222 second=108 amount=-1 +kerning first=68 second=258 amount=-1 +kerning first=99 second=245 amount=-1 +kerning first=233 second=115 amount=-1 +kerning first=364 second=350 amount=-1 +kerning first=269 second=115 amount=-1 +kerning first=87 second=114 amount=-1 +kerning first=282 second=8249 amount=-1 +kerning first=228 second=114 amount=-1 +kerning first=252 second=111 amount=-1 +kerning first=192 second=212 amount=-1 +kerning first=1053 second=1054 amount=-1 +kerning first=192 second=114 amount=-1 +kerning first=220 second=350 amount=-1 +kerning first=354 second=8249 amount=-1 +kerning first=192 second=254 amount=-1 +kerning first=324 second=111 amount=-1 +kerning first=246 second=8221 amount=-2 +kerning first=304 second=81 amount=-1 +kerning first=204 second=218 amount=-1 +kerning first=86 second=231 amount=-1 +kerning first=223 second=318 amount=-1 +kerning first=1059 second=1119 amount=-1 +kerning first=1070 second=1064 amount=-1 +kerning first=259 second=318 amount=-1 +kerning first=98 second=44 amount=-1 +kerning first=1034 second=1064 amount=-1 +kerning first=268 second=81 amount=-1 +kerning first=368 second=352 amount=-1 +kerning first=311 second=44 amount=-1 +kerning first=70 second=273 amount=-1 +kerning first=75 second=355 amount=-1 +kerning first=345 second=187 amount=-1 +kerning first=283 second=380 amount=-1 +kerning first=275 second=44 amount=-1 +kerning first=1041 second=1027 amount=-1 +kerning first=108 second=275 amount=-1 +kerning first=1056 second=1059 amount=-1 +kerning first=368 second=258 amount=-1 +kerning first=204 second=78 amount=-1 +kerning first=252 second=248 amount=-1 +kerning first=249 second=289 amount=-1 +kerning first=67 second=72 amount=-1 +kerning first=280 second=72 amount=-1 +kerning first=231 second=98 amount=-1 +kerning first=105 second=113 amount=-1 +kerning first=199 second=282 amount=-1 +kerning first=85 second=332 amount=-1 +kerning first=1064 second=1055 amount=-1 +kerning first=282 second=8222 amount=-1 +kerning first=298 second=332 amount=-1 +kerning first=246 second=8222 amount=-1 +kerning first=262 second=332 amount=-1 +kerning first=210 second=8222 amount=-1 +kerning first=81 second=330 amount=-1 +kerning first=105 second=8222 amount=-1 +kerning first=264 second=346 amount=-1 +kerning first=259 second=279 amount=-1 +kerning first=69 second=8222 amount=-1 +kerning first=1066 second=1070 amount=-1 +kerning first=192 second=87 amount=-1 +kerning first=1030 second=1070 amount=-1 +kerning first=1060 second=1063 amount=-1 +kerning first=370 second=332 amount=-1 +kerning first=277 second=291 amount=-1 +kerning first=368 second=8250 amount=-2 +kerning first=241 second=291 amount=-1 +kerning first=305 second=187 amount=-1 +kerning first=339 second=235 amount=-1 +kerning first=368 second=263 amount=-1 +kerning first=79 second=323 amount=-1 +kerning first=193 second=288 amount=-1 +kerning first=233 second=187 amount=-1 +kerning first=117 second=337 amount=-1 +kerning first=100 second=291 amount=-1 +kerning first=269 second=187 amount=-1 +kerning first=204 second=231 amount=-1 +kerning first=196 second=81 amount=-1 +kerning first=296 second=352 amount=-1 +kerning first=354 second=8222 amount=-1 +kerning first=220 second=323 amount=-1 +kerning first=1068 second=1050 amount=-1 +kerning first=203 second=211 amount=-1 +kerning first=264 second=336 amount=-1 +kerning first=80 second=86 amount=-1 +kerning first=80 second=270 amount=-1 +kerning first=307 second=46 amount=-1 +kerning first=270 second=198 amount=-1 +kerning first=330 second=268 amount=-1 +kerning first=1067 second=1083 amount=-1 +kerning first=291 second=287 amount=-1 +kerning first=1042 second=1034 amount=-1 +kerning first=296 second=325 amount=-1 +kerning first=87 second=281 amount=-1 +kerning first=368 second=325 amount=-1 +kerning first=85 second=99 amount=-1 +kerning first=1066 second=1043 amount=-1 +kerning first=1041 second=1069 amount=-1 +kerning first=323 second=73 amount=-1 +kerning first=298 second=99 amount=-1 +kerning first=75 second=290 amount=-1 +kerning first=268 second=314 amount=-1 +kerning first=1052 second=1057 amount=-1 +kerning first=193 second=369 amount=-1 +kerning first=74 second=202 amount=-1 +kerning first=1066 second=1036 amount=-1 +kerning first=232 second=314 amount=-1 +kerning first=45 second=268 amount=-1 +kerning first=235 second=347 amount=-1 +kerning first=78 second=110 amount=-1 +kerning first=226 second=99 amount=-1 +kerning first=196 second=314 amount=-1 +kerning first=88 second=369 amount=-1 +kerning first=211 second=221 amount=-1 +kerning first=258 second=268 amount=-1 +kerning first=199 second=347 amount=-1 +kerning first=226 second=8250 amount=-1 +kerning first=370 second=99 amount=-1 +kerning first=8217 second=339 amount=-1 +kerning first=219 second=110 amount=-1 +kerning first=323 second=202 amount=-1 +kerning first=199 second=351 amount=-1 +kerning first=85 second=8250 amount=-2 +kerning first=89 second=334 amount=-1 +kerning first=81 second=364 amount=-1 +kerning first=1107 second=1087 amount=-1 +kerning first=264 second=277 amount=-1 +kerning first=45 second=364 amount=-1 +kerning first=79 second=218 amount=-1 +kerning first=74 second=73 amount=-1 +kerning first=228 second=277 amount=-1 +kerning first=81 second=8217 amount=-2 +kerning first=85 second=171 amount=-2 +kerning first=266 second=334 amount=-1 +kerning first=205 second=264 amount=-1 +kerning first=287 second=104 amount=-1 +kerning first=194 second=334 amount=-1 +kerning first=235 second=351 amount=-1 +kerning first=374 second=334 amount=-1 +kerning first=1033 second=1030 amount=-1 +kerning first=270 second=69 amount=-1 +kerning first=193 second=121 amount=-1 +kerning first=1069 second=1030 amount=-1 +kerning first=196 second=108 amount=-1 +kerning first=366 second=8217 amount=-1 +kerning first=302 second=334 amount=-1 +kerning first=366 second=364 amount=-1 +kerning first=231 second=101 amount=-1 +kerning first=338 second=334 amount=-1 +kerning first=330 second=364 amount=-1 +kerning first=1041 second=1065 amount=-1 +kerning first=117 second=8217 amount=-1 +kerning first=1060 second=1070 amount=-1 +kerning first=1052 second=1050 amount=-1 +kerning first=258 second=364 amount=-1 +kerning first=267 second=101 amount=-1 +kerning first=1036 second=1117 amount=-1 +kerning first=87 second=277 amount=-1 +kerning first=222 second=8217 amount=-2 +kerning first=83 second=325 amount=-1 +kerning first=68 second=193 amount=-1 +kerning first=232 second=108 amount=-1 +kerning first=258 second=8217 amount=-2 +kerning first=339 second=101 amount=-1 +kerning first=283 second=273 amount=-1 +kerning first=268 second=108 amount=-1 +kerning first=1047 second=1051 amount=-1 +kerning first=199 second=103 amount=-1 +kerning first=234 second=263 amount=-1 +kerning first=220 second=282 amount=-1 +kerning first=1053 second=1089 amount=-1 +kerning first=198 second=171 amount=-1 +kerning first=193 second=365 amount=-1 +kerning first=1039 second=1039 amount=-1 +kerning first=366 second=203 amount=-1 +kerning first=75 second=286 amount=-1 +kerning first=69 second=8249 amount=-1 +kerning first=1052 second=1049 amount=-1 +kerning first=80 second=82 amount=-1 +kerning first=105 second=8249 amount=-1 +kerning first=346 second=296 amount=-1 +kerning first=206 second=298 amount=-1 +kerning first=1067 second=1068 amount=-1 +kerning first=278 second=298 amount=-1 +kerning first=304 second=241 amount=-1 +kerning first=269 second=229 amount=-1 +kerning first=314 second=363 amount=-1 +kerning first=350 second=298 amount=-1 +kerning first=330 second=203 amount=-1 +kerning first=220 second=117 amount=-1 +kerning first=45 second=203 amount=-1 +kerning first=232 second=287 amount=-1 +kerning first=81 second=203 amount=-1 +kerning first=208 second=44 amount=-1 +kerning first=364 second=369 amount=-1 +kerning first=266 second=99 amount=-1 +kerning first=68 second=220 amount=-1 +kerning first=1071 second=1083 amount=-1 +kerning first=67 second=278 amount=-1 +kerning first=227 second=339 amount=-1 +kerning first=313 second=356 amount=-1 +kerning first=74 second=77 amount=-1 +kerning first=323 second=100 amount=-1 +kerning first=197 second=218 amount=-1 +kerning first=111 second=382 amount=-1 +kerning first=263 second=339 amount=-1 +kerning first=8218 second=87 amount=-2 +kerning first=355 second=246 amount=-1 +kerning first=1052 second=1118 amount=-1 +kerning first=228 second=281 amount=-1 +kerning first=317 second=220 amount=-1 +kerning first=378 second=171 amount=-1 +kerning first=282 second=304 amount=-1 +kerning first=264 second=281 amount=-1 +kerning first=100 second=333 amount=-1 +kerning first=1067 second=1076 amount=-1 +kerning first=194 second=307 amount=-1 +kerning first=209 second=220 amount=-1 +kerning first=1053 second=1060 amount=-1 +kerning first=69 second=304 amount=-1 +kerning first=1039 second=1092 amount=-1 +kerning first=352 second=278 amount=-1 +kerning first=270 second=194 amount=-1 +kerning first=307 second=103 amount=-1 +kerning first=241 second=333 amount=-1 +kerning first=106 second=246 amount=-1 +kerning first=271 second=103 amount=-1 +kerning first=277 second=333 amount=-1 +kerning first=80 second=330 amount=-1 +kerning first=323 second=77 amount=-1 +kerning first=70 second=246 amount=-1 +kerning first=210 second=304 amount=-1 +kerning first=235 second=103 amount=-1 +kerning first=305 second=246 amount=-1 +kerning first=230 second=382 amount=-1 +kerning first=218 second=8222 amount=-2 +kerning first=269 second=246 amount=-1 +kerning first=266 second=382 amount=-1 +kerning first=202 second=223 amount=-1 +kerning first=233 second=246 amount=-1 +kerning first=217 second=298 amount=-1 +kerning first=362 second=77 amount=-1 +kerning first=77 second=8222 amount=-1 +kerning first=374 second=382 amount=-1 +kerning first=210 second=330 amount=-1 +kerning first=105 second=103 amount=-1 +kerning first=290 second=77 amount=-1 +kerning first=362 second=304 amount=-1 +kerning first=282 second=330 amount=-1 +kerning first=97 second=269 amount=-1 +kerning first=218 second=77 amount=-1 +kerning first=1038 second=1075 amount=-1 +kerning first=325 second=298 amount=-1 +kerning first=233 second=333 amount=-1 +kerning first=66 second=65 amount=-1 +kerning first=217 second=211 amount=-1 +kerning first=269 second=333 amount=-1 +kerning first=218 second=304 amount=-1 +kerning first=302 second=68 amount=-1 +kerning first=370 second=365 amount=-1 +kerning first=266 second=68 amount=-1 +kerning first=290 second=304 amount=-1 +kerning first=106 second=289 amount=-1 +kerning first=362 second=8222 amount=-2 +kerning first=228 second=283 amount=-1 +kerning first=305 second=333 amount=-1 +kerning first=87 second=103 amount=-1 +kerning first=290 second=8222 amount=-1 +kerning first=77 second=304 amount=-1 +kerning first=1052 second=1048 amount=-1 +kerning first=254 second=8222 amount=-1 +kerning first=203 second=315 amount=-1 +kerning first=214 second=260 amount=-1 +kerning first=368 second=313 amount=-1 +kerning first=70 second=109 amount=-1 +kerning first=1070 second=1044 amount=-1 +kerning first=252 second=339 amount=-1 +kerning first=231 second=281 amount=-1 +kerning first=266 second=107 amount=-1 +kerning first=268 second=347 amount=-1 +kerning first=267 second=281 amount=-1 +kerning first=67 second=111 amount=-1 +kerning first=325 second=211 amount=-1 +kerning first=304 second=347 amount=-1 +kerning first=1052 second=1108 amount=-1 +kerning first=103 second=111 amount=-1 +kerning first=1039 second=1051 amount=-1 +kerning first=210 second=196 amount=-1 +kerning first=339 second=281 amount=-1 +kerning first=296 second=313 amount=-1 +kerning first=232 second=347 amount=-1 +kerning first=77 second=77 amount=-1 +kerning first=8216 second=198 amount=-2 +kerning first=327 second=290 amount=-1 +kerning first=1058 second=1117 amount=-1 +kerning first=83 second=313 amount=-1 +kerning first=1051 second=1042 amount=-1 +kerning first=69 second=330 amount=-1 +kerning first=364 second=69 amount=-1 +kerning first=1047 second=1025 amount=-1 +kerning first=232 second=120 amount=-1 +kerning first=324 second=339 amount=-1 +kerning first=268 second=120 amount=-1 +kerning first=86 second=264 amount=-1 +kerning first=354 second=103 amount=-1 +kerning first=103 second=251 amount=-1 +kerning first=316 second=251 amount=-1 +kerning first=69 second=76 amount=-1 +kerning first=352 second=251 amount=-1 +kerning first=8217 second=264 amount=-1 +kerning first=280 second=251 amount=-1 +kerning first=333 second=8217 amount=-2 +kerning first=226 second=378 amount=-1 +kerning first=84 second=8217 amount=-1 +kerning first=298 second=76 amount=-1 +kerning first=192 second=8221 amount=-2 +kerning first=218 second=225 amount=-1 +kerning first=120 second=8217 amount=-1 +kerning first=228 second=8221 amount=-2 +kerning first=288 second=85 amount=-1 +kerning first=264 second=8221 amount=-1 +kerning first=231 second=254 amount=-1 +kerning first=217 second=271 amount=-1 +kerning first=220 second=242 amount=-1 +kerning first=279 second=245 amount=-1 +kerning first=362 second=331 amount=-1 +kerning first=267 second=254 amount=-1 +kerning first=325 second=271 amount=-1 +kerning first=336 second=8221 amount=-2 +kerning first=87 second=212 amount=-1 +kerning first=207 second=245 amount=-1 +kerning first=339 second=254 amount=-1 +kerning first=213 second=221 amount=-1 +kerning first=328 second=242 amount=-1 +kerning first=375 second=254 amount=-1 +kerning first=75 second=85 amount=-1 +kerning first=364 second=242 amount=-1 +kerning first=218 second=331 amount=-1 +kerning first=321 second=221 amount=-1 +kerning first=283 second=289 amount=-1 +kerning first=327 second=203 amount=-1 +kerning first=121 second=365 amount=-1 +kerning first=258 second=67 amount=-1 +kerning first=1027 second=1113 amount=-1 +kerning first=8216 second=351 amount=-1 +kerning first=355 second=289 amount=-1 +kerning first=1052 second=1075 amount=-1 +kerning first=77 second=331 amount=-1 +kerning first=85 second=365 amount=-1 +kerning first=70 second=229 amount=-1 +kerning first=219 second=203 amount=-1 +kerning first=221 second=288 amount=-1 +kerning first=1046 second=1104 amount=-1 +kerning first=73 second=233 amount=-1 +kerning first=45 second=67 amount=-1 +kerning first=270 second=366 amount=-1 +kerning first=109 second=233 amount=-1 +kerning first=195 second=254 amount=-1 +kerning first=244 second=8220 amount=-2 +kerning first=8250 second=252 amount=-1 +kerning first=78 second=203 amount=-1 +kerning first=187 second=280 amount=-1 +kerning first=250 second=233 amount=-1 +kerning first=263 second=248 amount=-1 +kerning first=339 second=8222 amount=-1 +kerning first=282 second=357 amount=-1 +kerning first=196 second=374 amount=-1 +kerning first=69 second=357 amount=-1 +kerning first=355 second=229 amount=-1 +kerning first=282 second=76 amount=-1 +kerning first=1076 second=1084 amount=-1 +kerning first=1030 second=1118 amount=-1 +kerning first=210 second=76 amount=-1 +kerning first=192 second=363 amount=-1 +kerning first=356 second=122 amount=-1 +kerning first=248 second=122 amount=-1 +kerning first=219 second=317 amount=-1 +kerning first=85 second=224 amount=-1 +kerning first=287 second=114 amount=-1 +kerning first=1053 second=1117 amount=-1 +kerning first=214 second=207 amount=-1 +kerning first=298 second=224 amount=-1 +kerning first=327 second=317 amount=-1 +kerning first=1039 second=1104 amount=-1 +kerning first=200 second=250 amount=-1 +kerning first=1027 second=1087 amount=-1 +kerning first=286 second=207 amount=-1 +kerning first=262 second=224 amount=-1 +kerning first=8250 second=200 amount=-1 +kerning first=67 second=311 amount=-1 +kerning first=86 second=378 amount=-1 +kerning first=1118 second=1093 amount=-1 +kerning first=206 second=113 amount=-1 +kerning first=80 second=201 amount=-1 +kerning first=103 second=311 amount=-1 +kerning first=198 second=366 amount=-1 +kerning first=370 second=224 amount=-1 +kerning first=81 second=354 amount=-1 +kerning first=364 second=216 amount=-1 +kerning first=70 second=256 amount=-1 +kerning first=199 second=244 amount=-1 +kerning first=263 second=378 amount=-1 +kerning first=235 second=244 amount=-1 +kerning first=227 second=378 amount=-1 +kerning first=330 second=67 amount=-1 +kerning first=258 second=354 amount=-1 +kerning first=231 second=251 amount=-1 +kerning first=78 second=317 amount=-1 +kerning first=366 second=67 amount=-1 +kerning first=307 second=244 amount=-1 +kerning first=310 second=8249 amount=-1 +kerning first=374 second=268 amount=-1 +kerning first=88 second=262 amount=-1 +kerning first=199 second=275 amount=-1 +kerning first=1065 second=1095 amount=-1 +kerning first=338 second=268 amount=-1 +kerning first=370 second=198 amount=-1 +kerning first=1105 second=1096 amount=-1 +kerning first=232 second=115 amount=-1 +kerning first=193 second=262 amount=-1 +kerning first=334 second=198 amount=-1 +kerning first=266 second=268 amount=-1 +kerning first=101 second=117 amount=-1 +kerning first=209 second=210 amount=-1 +kerning first=1060 second=1049 amount=-1 +kerning first=364 second=302 amount=-1 +kerning first=1105 second=1095 amount=-1 +kerning first=8218 second=97 amount=-1 +kerning first=211 second=256 amount=-1 +kerning first=279 second=98 amount=-1 +kerning first=220 second=302 amount=-1 +kerning first=198 second=345 amount=-1 +kerning first=1051 second=1101 amount=-1 +kerning first=108 second=335 amount=-1 +kerning first=234 second=345 amount=-1 +kerning first=249 second=335 amount=-1 +kerning first=323 second=219 amount=-1 +kerning first=199 second=199 amount=-1 +kerning first=362 second=262 amount=-1 +kerning first=268 second=206 amount=-1 +kerning first=304 second=206 amount=-1 +kerning first=85 second=198 amount=-1 +kerning first=79 second=302 amount=-1 +kerning first=194 second=268 amount=-1 +kerning first=204 second=259 amount=-1 +kerning first=197 second=213 amount=-1 +kerning first=89 second=268 amount=-1 +kerning first=8250 second=313 amount=-1 +kerning first=1055 second=1053 amount=-1 +kerning first=263 second=351 amount=-1 +kerning first=227 second=231 amount=-1 +kerning first=316 second=335 amount=-1 +kerning first=263 second=231 amount=-1 +kerning first=8222 second=374 amount=-2 +kerning first=1064 second=1099 amount=-1 +kerning first=78 second=290 amount=-1 +kerning first=45 second=381 amount=-1 +kerning first=369 second=171 amount=-1 +kerning first=1118 second=1091 amount=-1 +kerning first=205 second=226 amount=-1 +kerning first=81 second=88 amount=-1 +kerning first=187 second=73 amount=-1 +kerning first=219 second=290 amount=-1 +kerning first=203 second=368 amount=-1 +kerning first=85 second=197 amount=-1 +kerning first=280 second=338 amount=-1 +kerning first=113 second=8249 amount=-1 +kerning first=1056 second=1038 amount=-1 +kerning first=79 second=82 amount=-1 +kerning first=221 second=214 amount=-1 +kerning first=218 second=8249 amount=-2 +kerning first=337 second=314 amount=-1 +kerning first=1030 second=1031 amount=-1 +kerning first=86 second=351 amount=-1 +kerning first=296 second=286 amount=-1 +kerning first=290 second=8249 amount=-1 +kerning first=199 second=8218 amount=-1 +kerning first=370 second=197 amount=-1 +kerning first=229 second=283 amount=-1 +kerning first=326 second=8249 amount=-1 +kerning first=334 second=197 amount=-1 +kerning first=368 second=286 amount=-1 +kerning first=362 second=8249 amount=-2 +kerning first=1066 second=1031 amount=-1 +kerning first=67 second=338 amount=-1 +kerning first=1051 second=1068 amount=-1 +kerning first=121 second=171 amount=-1 +kerning first=205 second=274 amount=-1 +kerning first=226 second=171 amount=-1 +kerning first=198 second=79 amount=-1 +kerning first=314 second=113 amount=-1 +kerning first=316 second=45 amount=-1 +kerning first=352 second=45 amount=-1 +kerning first=77 second=8249 amount=-1 +kerning first=250 second=242 amount=-1 +kerning first=229 second=235 amount=-1 +kerning first=264 second=70 amount=-1 +kerning first=8222 second=81 amount=-1 +kerning first=1059 second=1074 amount=-1 +kerning first=255 second=378 amount=-1 +kerning first=366 second=8221 amount=-1 +kerning first=74 second=192 amount=-1 +kerning first=1039 second=1077 amount=-1 +kerning first=87 second=363 amount=-1 +kerning first=1058 second=1090 amount=-1 +kerning first=1069 second=1069 amount=-1 +kerning first=271 second=380 amount=-1 +kerning first=196 second=286 amount=-1 +kerning first=1052 second=1027 amount=-1 +kerning first=103 second=252 amount=-1 +kerning first=298 second=344 amount=-1 +kerning first=83 second=205 amount=-1 +kerning first=84 second=335 amount=-1 +kerning first=296 second=205 amount=-1 +kerning first=370 second=344 amount=-1 +kerning first=334 second=344 amount=-1 +kerning first=330 second=115 amount=-1 +kerning first=83 second=80 amount=-1 +kerning first=280 second=252 amount=-1 +kerning first=201 second=284 amount=-1 +kerning first=366 second=115 amount=-1 +kerning first=194 second=89 amount=-1 +kerning first=1031 second=1076 amount=-1 +kerning first=323 second=368 amount=-1 +kerning first=304 second=261 amount=-1 +kerning first=268 second=261 amount=-1 +kerning first=298 second=205 amount=-1 +kerning first=8218 second=111 amount=-1 +kerning first=1104 second=1097 amount=-1 +kerning first=111 second=106 amount=-1 +kerning first=210 second=217 amount=-1 +kerning first=290 second=204 amount=-1 +kerning first=324 second=231 amount=-1 +kerning first=282 second=217 amount=-1 +kerning first=85 second=344 amount=-1 +kerning first=1038 second=1044 amount=-1 +kerning first=87 second=97 amount=-1 +kerning first=74 second=332 amount=-1 +kerning first=261 second=103 amount=-1 +kerning first=362 second=223 amount=-1 +kerning first=99 second=235 amount=-1 +kerning first=269 second=45 amount=-1 +kerning first=84 second=347 amount=-1 +kerning first=232 second=353 amount=-1 +kerning first=280 second=210 amount=-1 +kerning first=267 second=275 amount=-1 +kerning first=204 second=235 amount=-1 +kerning first=197 second=45 amount=-1 +kerning first=304 second=353 amount=-1 +kerning first=240 second=235 amount=-1 +kerning first=200 second=71 amount=-1 +kerning first=1071 second=1028 amount=-1 +kerning first=339 second=275 amount=-1 +kerning first=268 second=353 amount=-1 +kerning first=1067 second=1028 amount=-1 +kerning first=370 second=263 amount=-1 +kerning first=220 second=362 amount=-1 +kerning first=352 second=252 amount=-1 +kerning first=296 second=80 amount=-1 +kerning first=207 second=111 amount=-1 +kerning first=77 second=223 amount=-1 +kerning first=364 second=362 amount=-1 +kerning first=8218 second=271 amount=-1 +kerning first=264 second=97 amount=-1 +kerning first=290 second=223 amount=-1 +kerning first=99 second=240 amount=-1 +kerning first=68 second=323 amount=-1 +kerning first=97 second=243 amount=-1 +kerning first=218 second=223 amount=-1 +kerning first=8222 second=288 amount=-1 +kerning first=270 second=258 amount=-1 +kerning first=119 second=107 amount=-1 +kerning first=314 second=232 amount=-1 +kerning first=1105 second=1093 amount=-1 +kerning first=87 second=336 amount=-1 +kerning first=1062 second=1080 amount=-1 +kerning first=209 second=323 amount=-1 +kerning first=75 second=199 amount=-1 +kerning first=67 second=317 amount=-1 +kerning first=192 second=336 amount=-1 +kerning first=283 second=337 amount=-1 +kerning first=109 second=119 amount=-1 +kerning first=1065 second=1079 amount=-1 +kerning first=291 second=311 amount=-1 +kerning first=8218 second=211 amount=-1 +kerning first=323 second=8250 amount=-1 +kerning first=67 second=225 amount=-1 +kerning first=69 second=249 amount=-1 +kerning first=287 second=8250 amount=-1 +kerning first=213 second=205 amount=-1 +kerning first=337 second=382 amount=-1 +kerning first=187 second=328 amount=-1 +kerning first=109 second=234 amount=-1 +kerning first=220 second=226 amount=-1 +kerning first=73 second=234 amount=-1 +kerning first=1051 second=1041 amount=-1 +kerning first=269 second=105 amount=-1 +kerning first=206 second=232 amount=-1 +kerning first=257 second=314 amount=-1 +kerning first=67 second=110 amount=-1 +kerning first=1091 second=1091 amount=-1 +kerning first=210 second=72 amount=-1 +kerning first=187 second=361 amount=-1 +kerning first=101 second=232 amount=-1 +kerning first=250 second=234 amount=-1 +kerning first=1038 second=1071 amount=-1 +kerning first=1107 second=1088 amount=-1 +kerning first=99 second=267 amount=-1 +kerning first=103 second=110 amount=-1 +kerning first=204 second=327 amount=-1 +kerning first=8250 second=288 amount=-1 +kerning first=220 second=198 amount=-1 +kerning first=197 second=105 amount=-1 +kerning first=1049 second=1049 amount=-1 +kerning first=8222 second=261 amount=-1 +kerning first=8250 second=286 amount=-1 +kerning first=209 second=368 amount=-1 +kerning first=283 second=8222 amount=-1 +kerning first=81 second=115 amount=-1 +kerning first=287 second=305 amount=-1 +kerning first=275 second=114 amount=-1 +kerning first=1044 second=1096 amount=-1 +kerning first=1059 second=1097 amount=-1 +kerning first=1027 second=1114 amount=-1 +kerning first=97 second=335 amount=-1 +kerning first=88 second=370 amount=-1 +kerning first=258 second=187 amount=-1 +kerning first=98 second=114 amount=-1 +kerning first=274 second=81 amount=-1 +kerning first=234 second=318 amount=-1 +kerning first=203 second=114 amount=-1 +kerning first=1057 second=1046 amount=-1 +kerning first=277 second=46 amount=-1 +kerning first=221 second=242 amount=-1 +kerning first=68 second=69 amount=-1 +kerning first=328 second=101 amount=-1 +kerning first=275 second=117 amount=-1 +kerning first=356 second=269 amount=-1 +kerning first=8250 second=80 amount=-1 +kerning first=330 second=273 amount=-1 +kerning first=116 second=228 amount=-1 +kerning first=68 second=84 amount=-1 +kerning first=80 second=81 amount=-1 +kerning first=364 second=101 amount=-1 +kerning first=72 second=227 amount=-1 +kerning first=221 second=81 amount=-1 +kerning first=202 second=363 amount=-1 +kerning first=71 second=73 amount=-1 +kerning first=363 second=111 amount=-1 +kerning first=207 second=331 amount=-1 +kerning first=272 second=44 amount=-1 +kerning first=323 second=78 amount=-1 +kerning first=8250 second=205 amount=-1 +kerning first=74 second=78 amount=-1 +kerning first=116 second=287 amount=-1 +kerning first=277 second=355 amount=-1 +kerning first=325 second=296 amount=-1 +kerning first=210 second=44 amount=-1 +kerning first=205 second=355 amount=-1 +kerning first=282 second=282 amount=-1 +kerning first=344 second=44 amount=-1 +kerning first=210 second=282 amount=-1 +kerning first=257 second=287 amount=-1 +kerning first=196 second=288 amount=-1 +kerning first=217 second=346 amount=-1 +kerning first=69 second=282 amount=-1 +kerning first=85 second=83 amount=-1 +kerning first=304 second=288 amount=-1 +kerning first=365 second=287 amount=-1 +kerning first=268 second=288 amount=-1 +kerning first=262 second=83 amount=-1 +kerning first=106 second=337 amount=-1 +kerning first=298 second=83 amount=-1 +kerning first=219 second=230 amount=-1 +kerning first=324 second=291 amount=-1 +kerning first=327 second=230 amount=-1 +kerning first=199 second=352 amount=-1 +kerning first=370 second=83 amount=-1 +kerning first=252 second=291 amount=-1 +kerning first=78 second=230 amount=-1 +kerning first=370 second=243 amount=-1 +kerning first=282 second=274 amount=-1 +kerning first=325 second=346 amount=-1 +kerning first=111 second=291 amount=-1 +kerning first=114 second=230 amount=-1 +kerning first=192 second=303 amount=-1 +kerning first=1053 second=1034 amount=-1 +kerning first=298 second=279 amount=-1 +kerning first=370 second=371 amount=-1 +kerning first=72 second=200 amount=-1 +kerning first=338 second=187 amount=-1 +kerning first=87 second=211 amount=-1 +kerning first=257 second=108 amount=-1 +kerning first=226 second=279 amount=-1 +kerning first=374 second=187 amount=-1 +kerning first=220 second=74 amount=-1 +kerning first=364 second=290 amount=-1 +kerning first=240 second=8218 amount=-1 +kerning first=262 second=279 amount=-1 +kerning first=86 second=269 amount=-1 +kerning first=70 second=316 amount=-1 +kerning first=370 second=279 amount=-1 +kerning first=364 second=74 amount=-1 +kerning first=290 second=323 amount=-1 +kerning first=327 second=209 amount=-1 +kerning first=89 second=187 amount=-1 +kerning first=85 second=371 amount=-1 +kerning first=227 second=269 amount=-1 +kerning first=263 second=269 amount=-1 +kerning first=100 second=382 amount=-1 +kerning first=74 second=99 amount=-1 +kerning first=344 second=71 amount=-1 +kerning first=110 second=99 amount=-1 +kerning first=192 second=255 amount=-1 +kerning first=205 second=382 amount=-1 +kerning first=192 second=211 amount=-1 +kerning first=323 second=99 amount=-1 +kerning first=283 second=316 amount=-1 +kerning first=221 second=250 amount=-1 +kerning first=194 second=187 amount=-1 +kerning first=277 second=382 amount=-1 +kerning first=264 second=211 amount=-1 +kerning first=213 second=200 amount=-1 +kerning first=99 second=8218 amount=-1 +kerning first=207 second=266 amount=-1 +kerning first=230 second=187 amount=-1 +kerning first=287 second=99 amount=-1 +kerning first=85 second=279 amount=-1 +kerning first=205 second=334 amount=-1 +kerning first=218 second=281 amount=-1 +kerning first=204 second=202 amount=-1 +kerning first=73 second=8217 amount=-1 +kerning first=375 second=8220 amount=-2 +kerning first=346 second=270 amount=-1 +kerning first=1050 second=1116 amount=-1 +kerning first=218 second=196 amount=-1 +kerning first=72 second=248 amount=-1 +kerning first=66 second=352 amount=-1 +kerning first=375 second=367 amount=-1 +kerning first=1041 second=1043 amount=-1 +kerning first=45 second=214 amount=-1 +kerning first=231 second=8250 amount=-1 +kerning first=108 second=248 amount=-1 +kerning first=281 second=117 amount=-1 +kerning first=362 second=196 amount=-1 +kerning first=73 second=345 amount=-1 +kerning first=267 second=367 amount=-1 +kerning first=90 second=8220 amount=-1 +kerning first=231 second=367 amount=-1 +kerning first=1047 second=1052 amount=-1 +kerning first=368 second=205 amount=-1 +kerning first=339 second=367 amount=-1 +kerning first=219 second=209 amount=-1 +kerning first=211 second=364 amount=-1 +kerning first=75 second=264 amount=-1 +kerning first=274 second=270 amount=-1 +kerning first=73 second=380 amount=-1 +kerning first=267 second=8220 amount=-2 +kerning first=231 second=8220 amount=-2 +kerning first=195 second=367 amount=-1 +kerning first=202 second=270 amount=-1 +kerning first=1048 second=1097 amount=-1 +kerning first=199 second=325 amount=-1 +kerning first=84 second=277 amount=-1 +kerning first=344 second=8217 amount=-1 +kerning first=290 second=82 amount=-1 +kerning first=197 second=251 amount=-1 +kerning first=323 second=284 amount=-1 +kerning first=246 second=108 amount=-1 +kerning first=380 second=8217 amount=-1 +kerning first=1069 second=1047 amount=-1 +kerning first=194 second=262 amount=-1 +kerning first=362 second=82 amount=-1 +kerning first=1064 second=1034 amount=-1 +kerning first=194 second=290 amount=-1 +kerning first=187 second=217 amount=-1 +kerning first=261 second=277 amount=-1 +kerning first=105 second=242 amount=-1 +kerning first=362 second=202 amount=-1 +kerning first=225 second=277 amount=-1 +kerning first=266 second=290 amount=-1 +kerning first=197 second=338 amount=-1 +kerning first=302 second=290 amount=-1 +kerning first=269 second=251 amount=-1 +kerning first=338 second=290 amount=-1 +kerning first=76 second=8221 amount=-1 +kerning first=258 second=316 amount=-1 +kerning first=84 second=8250 amount=-1 +kerning first=78 second=355 amount=-1 +kerning first=217 second=8221 amount=-1 +kerning first=212 second=193 amount=-1 +kerning first=230 second=311 amount=-1 +kerning first=209 second=242 amount=-1 +kerning first=253 second=8221 amount=-2 +kerning first=240 second=99 amount=-1 +kerning first=289 second=8221 amount=-2 +kerning first=77 second=82 amount=-1 +kerning first=99 second=99 amount=-1 +kerning first=325 second=8221 amount=-1 +kerning first=218 second=82 amount=-1 +kerning first=1052 second=1043 amount=-1 +kerning first=1039 second=1056 amount=-1 +kerning first=67 second=333 amount=-1 +kerning first=201 second=78 amount=-1 +kerning first=281 second=242 amount=-1 +kerning first=72 second=286 amount=-1 +kerning first=345 second=171 amount=-1 +kerning first=1047 second=1030 amount=-1 +kerning first=327 second=355 amount=-1 +kerning first=69 second=325 amount=-1 +kerning first=103 second=333 amount=-1 +kerning first=198 second=117 amount=-1 +kerning first=219 second=355 amount=-1 +kerning first=314 second=114 amount=-1 +kerning first=210 second=325 amount=-1 +kerning first=356 second=100 amount=-1 +kerning first=8217 second=199 amount=-1 +kerning first=282 second=325 amount=-1 +kerning first=193 second=104 amount=-1 +kerning first=275 second=233 amount=-1 +kerning first=281 second=250 amount=-1 +kerning first=201 second=171 amount=-1 +kerning first=1053 second=1039 amount=-1 +kerning first=1064 second=1043 amount=-1 +kerning first=78 second=382 amount=-1 +kerning first=212 second=220 amount=-1 +kerning first=1064 second=1104 amount=-1 +kerning first=199 second=330 amount=-1 +kerning first=364 second=194 amount=-1 +kerning first=365 second=103 amount=-1 +kerning first=284 second=220 amount=-1 +kerning first=219 second=382 amount=-1 +kerning first=71 second=220 amount=-1 +kerning first=255 second=382 amount=-1 +kerning first=316 second=246 amount=-1 +kerning first=66 second=120 amount=-1 +kerning first=257 second=103 amount=-1 +kerning first=207 second=304 amount=-1 +kerning first=291 second=382 amount=-1 +kerning first=220 second=194 amount=-1 +kerning first=221 second=103 amount=-1 +kerning first=327 second=382 amount=-1 +kerning first=74 second=224 amount=-1 +kerning first=65 second=211 amount=-1 +kerning first=116 second=103 amount=-1 +kerning first=323 second=224 amount=-1 +kerning first=1050 second=1057 amount=-1 +kerning first=80 second=103 amount=-1 +kerning first=8217 second=99 amount=-1 +kerning first=66 second=304 amount=-1 +kerning first=67 second=246 amount=-1 +kerning first=79 second=194 amount=-1 +kerning first=287 second=365 amount=-1 +kerning first=316 second=333 amount=-1 +kerning first=8249 second=366 amount=-1 +kerning first=8222 second=369 amount=-1 +kerning first=205 second=68 amount=-1 +kerning first=230 second=283 amount=-1 +kerning first=1052 second=1113 amount=-1 +kerning first=99 second=333 amount=-1 +kerning first=74 second=365 amount=-1 +kerning first=67 second=120 amount=-1 +kerning first=334 second=8218 amount=-1 +kerning first=75 second=307 amount=-1 +kerning first=213 second=313 amount=-1 +kerning first=78 second=111 amount=-1 +kerning first=221 second=347 amount=-1 +kerning first=245 second=8220 amount=-2 +kerning first=314 second=281 amount=-1 +kerning first=231 second=243 amount=-1 +kerning first=286 second=315 amount=-1 +kerning first=100 second=339 amount=-1 +kerning first=116 second=347 amount=-1 +kerning first=121 second=8218 amount=-1 +kerning first=317 second=8220 amount=-1 +kerning first=219 second=111 amount=-1 +kerning first=206 second=211 amount=-1 +kerning first=85 second=8218 amount=-2 +kerning first=281 second=8220 amount=-2 +kerning first=72 second=313 amount=-1 +kerning first=291 second=111 amount=-1 +kerning first=278 second=211 amount=-1 +kerning first=80 second=347 amount=-1 +kerning first=353 second=8220 amount=-2 +kerning first=327 second=111 amount=-1 +kerning first=217 second=257 amount=-1 +kerning first=218 second=202 amount=-1 +kerning first=243 second=120 amount=-1 +kerning first=279 second=120 amount=-1 +kerning first=74 second=113 amount=-1 +kerning first=290 second=202 amount=-1 +kerning first=8250 second=72 amount=-1 +kerning first=310 second=264 amount=-1 +kerning first=210 second=260 amount=-1 +kerning first=241 second=339 amount=-1 +kerning first=193 second=254 amount=-1 +kerning first=274 second=264 amount=-1 +kerning first=101 second=281 amount=-1 +kerning first=214 second=315 amount=-1 +kerning first=205 second=339 amount=-1 +kerning first=68 second=8220 amount=-2 +kerning first=73 second=315 amount=-1 +kerning first=202 second=264 amount=-1 +kerning first=206 second=281 amount=-1 +kerning first=77 second=202 amount=-1 +kerning first=277 second=339 amount=-1 +kerning first=231 second=232 amount=-1 +kerning first=87 second=271 amount=-1 +kerning first=262 second=219 amount=-1 +kerning first=351 second=8249 amount=-1 +kerning first=192 second=368 amount=-1 +kerning first=1055 second=1118 amount=-1 +kerning first=74 second=284 amount=-1 +kerning first=282 second=338 amount=-1 +kerning first=78 second=225 amount=-1 +kerning first=80 second=76 amount=-1 +kerning first=264 second=271 amount=-1 +kerning first=1091 second=1118 amount=-1 +kerning first=235 second=357 amount=-1 +kerning first=85 second=219 amount=-1 +kerning first=114 second=225 amount=-1 +kerning first=1043 second=1040 amount=-1 +kerning first=267 second=232 amount=-1 +kerning first=219 second=225 amount=-1 +kerning first=1055 second=1031 amount=-1 +kerning first=74 second=197 amount=-1 +kerning first=1060 second=1044 amount=-1 +kerning first=261 second=234 amount=-1 +kerning first=66 second=8249 amount=-1 +kerning first=225 second=234 amount=-1 +kerning first=268 second=98 amount=-1 +kerning first=212 second=344 amount=-1 +kerning first=339 second=314 amount=-1 +kerning first=102 second=8249 amount=-1 +kerning first=264 second=368 amount=-1 +kerning first=284 second=344 amount=-1 +kerning first=323 second=332 amount=-1 +kerning first=369 second=234 amount=-1 +kerning first=1039 second=1099 amount=-1 +kerning first=346 second=80 amount=-1 +kerning first=266 second=46 amount=-1 +kerning first=104 second=275 amount=-1 +kerning first=356 second=229 amount=-1 +kerning first=274 second=80 amount=-1 +kerning first=362 second=353 amount=-1 +kerning first=195 second=216 amount=-1 +kerning first=270 second=197 amount=-1 +kerning first=1034 second=1055 amount=-1 +kerning first=209 second=275 amount=-1 +kerning first=1077 second=1097 amount=-1 +kerning first=97 second=378 amount=-1 +kerning first=187 second=366 amount=-1 +kerning first=87 second=195 amount=-1 +kerning first=374 second=46 amount=-1 +kerning first=71 second=344 amount=-1 +kerning first=198 second=280 amount=-1 +kerning first=79 second=86 amount=-1 +kerning first=82 second=366 amount=-1 +kerning first=1058 second=1114 amount=-1 +kerning first=197 second=67 amount=-1 +kerning first=270 second=280 amount=-1 +kerning first=327 second=225 amount=-1 +kerning first=1064 second=1077 amount=-1 +kerning first=77 second=353 amount=-1 +kerning first=199 second=357 amount=-1 +kerning first=202 second=80 amount=-1 +kerning first=203 second=363 amount=-1 +kerning first=89 second=46 amount=-1 +kerning first=275 second=363 amount=-1 +kerning first=194 second=46 amount=-1 +kerning first=218 second=353 amount=-1 +kerning first=330 second=213 amount=-1 +kerning first=66 second=8222 amount=-1 +kerning first=266 second=317 amount=-1 +kerning first=193 second=375 amount=-1 +kerning first=370 second=116 amount=-1 +kerning first=69 second=217 amount=-1 +kerning first=302 second=317 amount=-1 +kerning first=85 second=192 amount=-1 +kerning first=327 second=201 amount=-1 +kerning first=338 second=317 amount=-1 +kerning first=197 second=311 amount=-1 +kerning first=298 second=116 amount=-1 +kerning first=267 second=259 amount=-1 +kerning first=233 second=311 amount=-1 +kerning first=1051 second=1117 amount=-1 +kerning first=1028 second=1046 amount=-1 +kerning first=217 second=70 amount=-1 +kerning first=1105 second=1117 amount=-1 +kerning first=232 second=369 amount=-1 +kerning first=368 second=362 amount=-1 +kerning first=196 second=369 amount=-1 +kerning first=1034 second=1059 amount=-2 +kerning first=304 second=201 amount=-1 +kerning first=223 second=122 amount=-1 +kerning first=366 second=213 amount=-1 +kerning first=325 second=70 amount=-1 +kerning first=259 second=122 amount=-1 +kerning first=282 second=66 amount=-1 +kerning first=231 second=271 amount=-1 +kerning first=325 second=113 amount=-1 +kerning first=351 second=8222 amount=-1 +kerning first=268 second=201 amount=-1 +kerning first=217 second=113 amount=-1 +kerning first=235 second=99 amount=-1 +kerning first=279 second=8222 amount=-1 +kerning first=262 second=116 amount=-1 +kerning first=243 second=8222 amount=-1 +kerning first=231 second=259 amount=-1 +kerning first=288 second=204 amount=-1 +kerning first=192 second=89 amount=-1 +kerning first=354 second=244 amount=-1 +kerning first=1086 second=1078 amount=-1 +kerning first=102 second=8222 amount=-1 +kerning first=364 second=210 amount=-1 +kerning first=219 second=268 amount=-1 +kerning first=204 second=262 amount=-1 +kerning first=1054 second=1062 amount=-1 +kerning first=1069 second=1048 amount=-1 +kerning first=1027 second=1108 amount=-1 +kerning first=272 second=256 amount=-1 +kerning first=1059 second=1102 amount=-1 +kerning first=232 second=98 amount=-1 +kerning first=204 second=332 amount=-1 +kerning first=220 second=210 amount=-1 +kerning first=196 second=98 amount=-1 +kerning first=8217 second=85 amount=-1 +kerning first=327 second=268 amount=-1 +kerning first=1049 second=1025 amount=-1 +kerning first=209 second=302 amount=-1 +kerning first=68 second=302 amount=-1 +kerning first=104 second=8217 amount=-2 +kerning first=118 second=122 amount=-1 +kerning first=369 second=277 amount=-1 +kerning first=187 second=122 amount=-1 +kerning first=296 second=335 amount=-1 +kerning first=1038 second=1087 amount=-1 +kerning first=212 second=73 amount=-1 +kerning first=287 second=231 amount=-1 +kerning first=368 second=335 amount=-1 +kerning first=1030 second=1053 amount=-1 +kerning first=78 second=268 amount=-1 +kerning first=370 second=219 amount=-1 +kerning first=284 second=73 amount=-1 +kerning first=1066 second=1053 amount=-1 +kerning first=255 second=122 amount=-1 +kerning first=298 second=219 amount=-1 +kerning first=45 second=213 amount=-1 +kerning first=334 second=219 amount=-1 +kerning first=291 second=187 amount=-1 +kerning first=198 second=323 amount=-1 +kerning first=327 second=187 amount=-1 +kerning first=203 second=336 amount=-1 +kerning first=80 second=244 amount=-1 +kerning first=219 second=187 amount=-2 +kerning first=70 second=213 amount=-1 +kerning first=116 second=244 amount=-1 +kerning first=255 second=187 amount=-1 +kerning first=311 second=46 amount=-1 +kerning first=8218 second=368 amount=-1 +kerning first=304 second=266 amount=-1 +kerning first=370 second=114 amount=-1 +kerning first=268 second=266 amount=-1 +kerning first=195 second=362 amount=-1 +kerning first=257 second=244 amount=-1 +kerning first=270 second=323 amount=-1 +kerning first=218 second=283 amount=-1 +kerning first=1049 second=1071 amount=-1 +kerning first=201 second=371 amount=-1 +kerning first=365 second=244 amount=-1 +kerning first=8216 second=219 amount=-1 +kerning first=72 second=77 amount=-1 +kerning first=101 second=369 amount=-1 +kerning first=74 second=327 amount=-1 +kerning first=196 second=266 amount=-1 +kerning first=278 second=75 amount=-1 +kerning first=114 second=187 amount=-1 +kerning first=206 second=75 amount=-1 +kerning first=368 second=200 amount=-1 +kerning first=220 second=101 amount=-1 +kerning first=78 second=187 amount=-1 +kerning first=74 second=235 amount=-1 +kerning first=296 second=200 amount=-1 +kerning first=97 second=248 amount=-1 +kerning first=323 second=327 amount=-1 +kerning first=323 second=262 amount=-1 +kerning first=200 second=66 amount=-1 +kerning first=333 second=380 amount=-1 +kerning first=1051 second=1036 amount=-1 +kerning first=246 second=314 amount=-1 +kerning first=66 second=196 amount=-1 +kerning first=362 second=283 amount=-1 +kerning first=207 second=261 amount=-1 +kerning first=362 second=218 amount=-1 +kerning first=82 second=79 amount=-1 +kerning first=269 second=110 amount=-1 +kerning first=364 second=367 amount=-1 +kerning first=326 second=283 amount=-1 +kerning first=374 second=371 amount=-1 +kerning first=290 second=218 amount=-1 +kerning first=187 second=79 amount=-1 +kerning first=1064 second=1091 amount=-1 +kerning first=338 second=274 amount=-1 +kerning first=370 second=192 amount=-1 +kerning first=298 second=257 amount=-1 +kerning first=99 second=305 amount=-1 +kerning first=262 second=257 amount=-1 +kerning first=266 second=274 amount=-1 +kerning first=220 second=367 amount=-1 +kerning first=370 second=257 amount=-1 +kerning first=338 second=209 amount=-1 +kerning first=302 second=274 amount=-1 +kerning first=213 second=270 amount=-1 +kerning first=245 second=318 amount=-1 +kerning first=334 second=192 amount=-1 +kerning first=302 second=209 amount=-1 +kerning first=1056 second=1050 amount=-1 +kerning first=281 second=318 amount=-1 +kerning first=249 second=8217 amount=-1 +kerning first=225 second=380 amount=-1 +kerning first=85 second=257 amount=-1 +kerning first=353 second=318 amount=-1 +kerning first=272 second=66 amount=-1 +kerning first=261 second=380 amount=-1 +kerning first=268 second=44 amount=-1 +kerning first=219 second=252 amount=-1 +kerning first=77 second=310 amount=-1 +kerning first=109 second=114 amount=-1 +kerning first=104 second=101 amount=-1 +kerning first=196 second=8249 amount=-1 +kerning first=73 second=114 amount=-1 +kerning first=85 second=284 amount=-1 +kerning first=283 second=115 amount=-1 +kerning first=291 second=252 amount=-1 +kerning first=201 second=211 amount=-1 +kerning first=209 second=101 amount=-1 +kerning first=268 second=8249 amount=-1 +kerning first=1039 second=1072 amount=-1 +kerning first=355 second=115 amount=-1 +kerning first=73 second=109 amount=-1 +kerning first=70 second=115 amount=-1 +kerning first=281 second=101 amount=-1 +kerning first=8216 second=192 amount=-2 +kerning first=72 second=335 amount=-1 +kerning first=1067 second=1098 amount=-1 +kerning first=1031 second=1098 amount=-1 +kerning first=80 second=217 amount=-1 +kerning first=211 second=115 amount=-1 +kerning first=241 second=231 amount=-1 +kerning first=197 second=354 amount=-1 +kerning first=201 second=214 amount=-1 +kerning first=362 second=310 amount=-1 +kerning first=277 second=231 amount=-1 +kerning first=45 second=89 amount=-2 +kerning first=201 second=344 amount=-1 +kerning first=100 second=337 amount=-1 +kerning first=218 second=310 amount=-1 +kerning first=100 second=231 amount=-1 +kerning first=205 second=231 amount=-1 +kerning first=262 second=99 amount=-1 +kerning first=110 second=235 amount=-1 +kerning first=71 second=317 amount=-1 +kerning first=279 second=353 amount=-1 +kerning first=364 second=275 amount=-1 +kerning first=328 second=275 amount=-1 +kerning first=104 second=345 amount=-1 +kerning first=287 second=235 amount=-1 +kerning first=246 second=287 amount=-1 +kerning first=277 second=106 amount=-1 +kerning first=209 second=345 amount=-1 +kerning first=84 second=234 amount=-1 +kerning first=220 second=275 amount=-1 +kerning first=245 second=345 amount=-1 +kerning first=74 second=83 amount=-1 +kerning first=235 second=249 amount=-1 +kerning first=281 second=345 amount=-1 +kerning first=8222 second=380 amount=-1 +kerning first=352 second=296 amount=-1 +kerning first=325 second=97 amount=-1 +kerning first=72 second=80 amount=-1 +kerning first=86 second=226 amount=-1 +kerning first=72 second=243 amount=-1 +kerning first=258 second=45 amount=-1 +kerning first=207 second=223 amount=-1 +kerning first=298 second=284 amount=-1 +kerning first=323 second=83 amount=-1 +kerning first=81 second=278 amount=-1 +kerning first=366 second=45 amount=-2 +kerning first=370 second=284 amount=-1 +kerning first=289 second=335 amount=-1 +kerning first=66 second=353 amount=-1 +kerning first=263 second=226 amount=-1 +kerning first=217 second=97 amount=-1 +kerning first=66 second=223 amount=-1 +kerning first=227 second=291 amount=-1 +kerning first=86 second=199 amount=-1 +kerning first=1049 second=1081 amount=-1 +kerning first=187 second=253 amount=-1 +kerning first=73 second=212 amount=-1 +kerning first=77 second=245 amount=-1 +kerning first=268 second=304 amount=-1 +kerning first=325 second=380 amount=-1 +kerning first=1054 second=1046 amount=-1 +kerning first=304 second=304 amount=-1 +kerning first=267 second=324 amount=-1 +kerning first=218 second=120 amount=-1 +kerning first=254 second=120 amount=-1 +kerning first=8218 second=212 amount=-1 +kerning first=366 second=278 amount=-1 +kerning first=330 second=278 amount=-1 +kerning first=346 second=313 amount=-1 +kerning first=212 second=72 amount=-1 +kerning first=1042 second=1056 amount=-1 +kerning first=362 second=245 amount=-1 +kerning first=234 second=103 amount=-1 +kerning first=198 second=361 amount=-1 +kerning first=116 second=111 amount=-1 +kerning first=326 second=245 amount=-1 +kerning first=323 second=8218 amount=-1 +kerning first=202 second=313 amount=-1 +kerning first=1118 second=1088 amount=-1 +kerning first=338 second=338 amount=-1 +kerning first=287 second=8218 amount=-1 +kerning first=8222 second=266 amount=-1 +kerning first=274 second=313 amount=-1 +kerning first=218 second=245 amount=-1 +kerning first=1048 second=1037 amount=-1 +kerning first=1027 second=1092 amount=-1 +kerning first=82 second=187 amount=-1 +kerning first=89 second=192 amount=-1 +kerning first=80 second=65 amount=-1 +kerning first=65 second=254 amount=-1 +kerning first=230 second=111 amount=-1 +kerning first=324 second=269 amount=-1 +kerning first=1046 second=1088 amount=-1 +kerning first=280 second=203 amount=-1 +kerning first=81 second=72 amount=-1 +kerning first=101 second=254 amount=-1 +kerning first=266 second=111 amount=-1 +kerning first=195 second=118 amount=-1 +kerning first=221 second=65 amount=-1 +kerning first=103 second=105 amount=-1 +kerning first=330 second=72 amount=-1 +kerning first=352 second=304 amount=-1 +kerning first=1042 second=1055 amount=-1 +kerning first=366 second=72 amount=-1 +kerning first=87 second=260 amount=-1 +kerning first=374 second=111 amount=-1 +kerning first=362 second=120 amount=-1 +kerning first=286 second=219 amount=-1 +kerning first=80 second=374 amount=-1 +kerning first=115 second=8220 amount=-2 +kerning first=286 second=114 amount=-1 +kerning first=356 second=263 amount=-1 +kerning first=79 second=8220 amount=-2 +kerning first=1050 second=1094 amount=-1 +kerning first=250 second=114 amount=-1 +kerning first=1049 second=1073 amount=-1 +kerning first=220 second=8220 amount=-1 +kerning first=89 second=111 amount=-1 +kerning first=368 second=70 amount=-1 +kerning first=204 second=370 amount=-1 +kerning first=45 second=251 amount=-1 +kerning first=220 second=69 amount=-1 +kerning first=368 second=102 amount=-1 +kerning first=368 second=227 amount=-1 +kerning first=333 second=44 amount=-1 +kerning first=344 second=364 amount=-1 +kerning first=296 second=227 amount=-1 +kerning first=268 second=331 amount=-1 +kerning first=258 second=251 amount=-1 +kerning first=305 second=101 amount=-1 +kerning first=272 second=364 amount=-1 +kerning first=304 second=331 amount=-1 +kerning first=269 second=273 amount=-1 +kerning first=69 second=81 amount=-1 +kerning first=233 second=273 amount=-1 +kerning first=79 second=69 amount=-1 +kerning first=200 second=364 amount=-1 +kerning first=370 second=78 amount=-1 +kerning first=366 second=251 amount=-1 +kerning first=302 second=355 amount=-1 +kerning first=1048 second=1064 amount=-1 +kerning first=334 second=78 amount=-1 +kerning first=218 second=218 amount=-1 +kerning first=75 second=334 amount=-1 +kerning first=230 second=355 amount=-1 +kerning first=194 second=355 amount=-1 +kerning first=282 second=81 amount=-1 +kerning first=77 second=218 amount=-1 +kerning first=45 second=72 amount=-1 +kerning first=298 second=78 amount=-1 +kerning first=1062 second=1085 amount=-1 +kerning first=262 second=78 amount=-1 +kerning first=277 second=113 amount=-1 +kerning first=66 second=88 amount=-1 +kerning first=111 second=8250 amount=-1 +kerning first=234 second=242 amount=-1 +kerning first=207 second=288 amount=-1 +kerning first=1056 second=1076 amount=-1 +kerning first=85 second=78 amount=-1 +kerning first=279 second=234 amount=-1 +kerning first=335 second=8221 amount=-2 +kerning first=217 second=313 amount=-1 +kerning first=80 second=282 amount=-1 +kerning first=338 second=355 amount=-1 +kerning first=67 second=230 amount=-1 +kerning first=280 second=274 amount=-1 +kerning first=262 second=79 amount=-1 +kerning first=214 second=87 amount=-1 +kerning first=1036 second=1073 amount=-1 +kerning first=335 second=291 amount=-1 +kerning first=228 second=233 amount=-1 +kerning first=87 second=233 amount=-1 +kerning first=8249 second=220 amount=-1 +kerning first=263 second=291 amount=-1 +kerning first=206 second=346 amount=-1 +kerning first=8222 second=217 amount=-1 +kerning first=1042 second=1052 amount=-1 +kerning first=363 second=233 amount=-1 +kerning first=268 second=230 amount=-1 +kerning first=272 second=87 amount=-1 +kerning first=291 second=233 amount=-1 +kerning first=327 second=233 amount=-1 +kerning first=325 second=288 amount=-1 +kerning first=232 second=235 amount=-1 +kerning first=240 second=291 amount=-1 +kerning first=200 second=334 amount=-1 +kerning first=73 second=202 amount=-1 +kerning first=1068 second=1046 amount=-1 +kerning first=1086 second=1113 amount=-1 +kerning first=99 second=291 amount=-1 +kerning first=354 second=257 amount=-1 +kerning first=209 second=227 amount=-1 +kerning first=213 second=84 amount=-1 +kerning first=330 second=224 amount=-1 +kerning first=217 second=288 amount=-1 +kerning first=344 second=334 amount=-1 +kerning first=1055 second=1049 amount=-1 +kerning first=366 second=224 amount=-1 +kerning first=370 second=81 amount=-1 +kerning first=262 second=81 amount=-1 +kerning first=298 second=81 amount=-1 +kerning first=200 second=187 amount=-1 +kerning first=278 second=8221 amount=-1 +kerning first=314 second=8221 amount=-1 +kerning first=97 second=99 amount=-1 +kerning first=105 second=171 amount=-1 +kerning first=1038 second=1095 amount=-1 +kerning first=221 second=245 amount=-1 +kerning first=344 second=187 amount=-1 +kerning first=205 second=270 amount=-1 +kerning first=116 second=245 amount=-1 +kerning first=272 second=187 amount=-1 +kerning first=80 second=245 amount=-1 +kerning first=103 second=363 amount=-1 +kerning first=201 second=8218 amount=-1 +kerning first=367 second=337 amount=-1 +kerning first=1054 second=1070 amount=-1 +kerning first=73 second=223 amount=-1 +kerning first=76 second=221 amount=-1 +kerning first=97 second=279 amount=-1 +kerning first=281 second=269 amount=-1 +kerning first=1053 second=1104 amount=-1 +kerning first=204 second=277 amount=-1 +kerning first=304 second=230 amount=-1 +kerning first=288 second=75 amount=-1 +kerning first=302 second=331 amount=-1 +kerning first=283 second=44 amount=-1 +kerning first=256 second=8249 amount=-1 +kerning first=214 second=364 amount=-1 +kerning first=85 second=261 amount=-1 +kerning first=210 second=206 amount=-1 +kerning first=69 second=206 amount=-1 +kerning first=114 second=228 amount=-1 +kerning first=73 second=364 amount=-1 +kerning first=201 second=66 amount=-1 +kerning first=298 second=261 amount=-1 +kerning first=262 second=261 amount=-1 +kerning first=258 second=371 amount=-1 +kerning first=201 second=367 amount=-1 +kerning first=205 second=257 amount=-1 +kerning first=370 second=261 amount=-1 +kerning first=81 second=217 amount=-1 +kerning first=72 second=264 amount=-1 +kerning first=112 second=108 amount=-1 +kerning first=368 second=69 amount=-1 +kerning first=282 second=206 amount=-1 +kerning first=302 second=366 amount=-1 +kerning first=291 second=380 amount=-1 +kerning first=1030 second=1034 amount=-1 +kerning first=284 second=205 amount=-1 +kerning first=255 second=380 amount=-1 +kerning first=77 second=200 amount=-1 +kerning first=210 second=193 amount=-1 +kerning first=289 second=108 amount=-1 +kerning first=212 second=205 amount=-1 +kerning first=327 second=380 amount=-1 +kerning first=65 second=303 amount=-1 +kerning first=364 second=266 amount=-1 +kerning first=264 second=273 amount=-1 +kerning first=199 second=368 amount=-1 +kerning first=286 second=364 amount=-1 +kerning first=193 second=370 amount=-1 +kerning first=1066 second=1034 amount=-1 +kerning first=8217 second=114 amount=-1 +kerning first=203 second=8218 amount=-1 +kerning first=253 second=318 amount=-1 +kerning first=72 second=8249 amount=-1 +kerning first=1036 second=1063 amount=-1 +kerning first=108 second=8249 amount=-1 +kerning first=284 second=8221 amount=-1 +kerning first=99 second=44 amount=-1 +kerning first=1041 second=1116 amount=-1 +kerning first=235 second=355 amount=-1 +kerning first=71 second=205 amount=-1 +kerning first=203 second=78 amount=-1 +kerning first=249 second=8249 amount=-1 +kerning first=199 second=355 amount=-1 +kerning first=78 second=380 amount=-1 +kerning first=80 second=325 amount=-1 +kerning first=219 second=380 amount=-1 +kerning first=8250 second=370 amount=-1 +kerning first=1077 second=1103 amount=-1 +kerning first=1062 second=1077 amount=-1 +kerning first=316 second=248 amount=-1 +kerning first=1060 second=1039 amount=-1 +kerning first=338 second=218 amount=-1 +kerning first=344 second=87 amount=-1 +kerning first=302 second=218 amount=-1 +kerning first=67 second=248 amount=-1 +kerning first=266 second=218 amount=-1 +kerning first=202 second=76 amount=-1 +kerning first=209 second=214 amount=-1 +kerning first=194 second=218 amount=-1 +kerning first=103 second=248 amount=-1 +kerning first=1069 second=1039 amount=-1 +kerning first=77 second=347 amount=-1 +kerning first=74 second=330 amount=-1 +kerning first=205 second=77 amount=-1 +kerning first=201 second=220 amount=-1 +kerning first=1041 second=1081 amount=-1 +kerning first=1050 second=1059 amount=-1 +kerning first=255 second=107 amount=-1 +kerning first=85 second=382 amount=-1 +kerning first=1091 second=1103 amount=-1 +kerning first=374 second=339 amount=-1 +kerning first=121 second=382 amount=-1 +kerning first=367 second=103 amount=-1 +kerning first=226 second=382 amount=-1 +kerning first=108 second=171 amount=-1 +kerning first=269 second=289 amount=-1 +kerning first=1076 second=1094 amount=-1 +kerning first=233 second=289 amount=-1 +kerning first=259 second=103 amount=-1 +kerning first=8222 second=230 amount=-1 +kerning first=288 second=8218 amount=-1 +kerning first=223 second=103 amount=-1 +kerning first=249 second=171 amount=-1 +kerning first=305 second=289 amount=-1 +kerning first=86 second=242 amount=-1 +kerning first=281 second=281 amount=-1 +kerning first=70 second=261 amount=-1 +kerning first=1053 second=1091 amount=-1 +kerning first=330 second=304 amount=-1 +kerning first=97 second=333 amount=-1 +kerning first=366 second=304 amount=-1 +kerning first=258 second=211 amount=-1 +kerning first=1053 second=1051 amount=-1 +kerning first=221 second=338 amount=-1 +kerning first=240 second=187 amount=-1 +kerning first=1053 second=1050 amount=-1 +kerning first=330 second=211 amount=-1 +kerning first=1060 second=1052 amount=-1 +kerning first=269 second=109 amount=-1 +kerning first=204 second=242 amount=-1 +kerning first=282 second=332 amount=-1 +kerning first=80 second=114 amount=-1 +kerning first=80 second=338 amount=-1 +kerning first=70 second=85 amount=-1 +kerning first=370 second=203 amount=-1 +kerning first=81 second=304 amount=-1 +kerning first=266 second=339 amount=-1 +kerning first=262 second=382 amount=-1 +kerning first=71 second=298 amount=-1 +kerning first=230 second=339 amount=-1 +kerning first=298 second=382 amount=-1 +kerning first=339 second=339 amount=-1 +kerning first=302 second=339 amount=-1 +kerning first=362 second=347 amount=-1 +kerning first=1051 second=1025 amount=-1 +kerning first=70 second=332 amount=-1 +kerning first=65 second=290 amount=-1 +kerning first=89 second=339 amount=-1 +kerning first=366 second=211 amount=-1 +kerning first=212 second=298 amount=-1 +kerning first=201 second=313 amount=-1 +kerning first=206 second=290 amount=-1 +kerning first=302 second=275 amount=-1 +kerning first=218 second=347 amount=-1 +kerning first=83 second=364 amount=-1 +kerning first=234 second=382 amount=-1 +kerning first=1043 second=1085 amount=-1 +kerning first=221 second=271 amount=-1 +kerning first=240 second=111 amount=-1 +kerning first=278 second=357 amount=-1 +kerning first=317 second=374 amount=-1 +kerning first=283 second=8250 amount=-1 +kerning first=8222 second=243 amount=-1 +kerning first=304 second=76 amount=-1 +kerning first=1118 second=1094 amount=-1 +kerning first=211 second=8250 amount=-1 +kerning first=101 second=357 amount=-1 +kerning first=264 second=219 amount=-1 +kerning first=268 second=76 amount=-1 +kerning first=106 second=8250 amount=-1 +kerning first=65 second=357 amount=-1 +kerning first=364 second=212 amount=-1 +kerning first=206 second=357 amount=-1 +kerning first=68 second=374 amount=-1 +kerning first=1044 second=1118 amount=-1 +kerning first=192 second=219 amount=-1 +kerning first=208 second=8222 amount=-1 +kerning first=364 second=82 amount=-1 +kerning first=330 second=317 amount=-1 +kerning first=262 second=315 amount=-1 +kerning first=304 second=323 amount=-1 +kerning first=105 second=119 amount=-1 +kerning first=220 second=212 amount=-1 +kerning first=268 second=323 amount=-1 +kerning first=1048 second=1075 amount=-1 +kerning first=86 second=263 amount=-1 +kerning first=365 second=8217 amount=-1 +kerning first=370 second=315 amount=-1 +kerning first=80 second=8217 amount=-1 +kerning first=8250 second=69 amount=-1 +kerning first=99 second=111 amount=-1 +kerning first=116 second=8217 amount=-1 +kerning first=296 second=262 amount=-1 +kerning first=298 second=315 amount=-1 +kerning first=302 second=261 amount=-1 +kerning first=334 second=315 amount=-1 +kerning first=221 second=8217 amount=-1 +kerning first=199 second=314 amount=-1 +kerning first=203 second=366 amount=-1 +kerning first=286 second=204 amount=-1 +kerning first=338 second=365 amount=-1 +kerning first=374 second=365 amount=-1 +kerning first=214 second=204 amount=-1 +kerning first=233 second=263 amount=-1 +kerning first=67 second=68 amount=-1 +kerning first=269 second=263 amount=-1 +kerning first=200 second=280 amount=-1 +kerning first=1051 second=1092 amount=-1 +kerning first=8218 second=273 amount=-1 +kerning first=305 second=263 amount=-1 +kerning first=194 second=365 amount=-1 +kerning first=70 second=254 amount=-1 +kerning first=272 second=280 amount=-1 +kerning first=235 second=314 amount=-1 +kerning first=230 second=365 amount=-1 +kerning first=1031 second=1067 amount=-1 +kerning first=89 second=365 amount=-1 +kerning first=231 second=110 amount=-1 +kerning first=8249 second=350 amount=-1 +kerning first=1048 second=1101 amount=-1 +kerning first=72 second=331 amount=-1 +kerning first=8222 second=104 amount=-1 +kerning first=199 second=67 amount=-1 +kerning first=1071 second=1024 amount=-1 +kerning first=267 second=110 amount=-1 +kerning first=352 second=68 amount=-1 +kerning first=205 second=203 amount=-1 +kerning first=80 second=271 amount=-1 +kerning first=217 second=195 amount=-1 +kerning first=100 second=378 amount=-1 +kerning first=258 second=250 amount=-1 +kerning first=195 second=357 amount=-1 +kerning first=264 second=274 amount=-1 +kerning first=277 second=378 amount=-1 +kerning first=272 second=46 amount=-1 +kerning first=234 second=101 amount=-1 +kerning first=205 second=378 amount=-1 +kerning first=234 second=347 amount=-1 +kerning first=69 second=8217 amount=-1 +kerning first=199 second=262 amount=-1 +kerning first=1068 second=1067 amount=-1 +kerning first=207 second=76 amount=-1 +kerning first=105 second=8217 amount=-1 +kerning first=255 second=8221 amount=-2 +kerning first=334 second=354 amount=-1 +kerning first=217 second=261 amount=-1 +kerning first=334 second=209 amount=-1 +kerning first=75 second=216 amount=-1 +kerning first=89 second=267 amount=-1 +kerning first=8222 second=257 amount=-1 +kerning first=66 second=76 amount=-1 +kerning first=339 second=357 amount=-1 +kerning first=88 second=345 amount=-1 +kerning first=211 second=280 amount=-1 +kerning first=203 second=204 amount=-1 +kerning first=77 second=113 amount=-1 +kerning first=366 second=317 amount=-1 +kerning first=193 second=345 amount=-1 +kerning first=229 second=345 amount=-1 +kerning first=1070 second=1084 amount=-1 +kerning first=345 second=259 amount=-1 +kerning first=354 second=187 amount=-1 +kerning first=203 second=270 amount=-1 +kerning first=103 second=287 amount=-1 +kerning first=1033 second=1038 amount=-2 +kerning first=337 second=345 amount=-1 +kerning first=1086 second=1083 amount=-1 +kerning first=370 second=369 amount=-1 +kerning first=8217 second=240 amount=-1 +kerning first=362 second=113 amount=-1 +kerning first=201 second=207 amount=-1 +kerning first=316 second=287 amount=-1 +kerning first=370 second=100 amount=-1 +kerning first=45 second=317 amount=-1 +kerning first=1047 second=1096 amount=-1 +kerning first=264 second=366 amount=-1 +kerning first=81 second=317 amount=-1 +kerning first=244 second=287 amount=-1 +kerning first=73 second=336 amount=-1 +kerning first=326 second=113 amount=-1 +kerning first=192 second=366 amount=-1 +kerning first=199 second=72 amount=-1 +kerning first=232 second=271 amount=-1 +kerning first=121 second=369 amount=-1 +kerning first=72 second=210 amount=-1 +kerning first=75 second=116 amount=-1 +kerning first=85 second=369 amount=-1 +kerning first=304 second=271 amount=-1 +kerning first=355 second=8250 amount=-1 +kerning first=268 second=271 amount=-1 +kerning first=67 second=8220 amount=-1 +kerning first=202 second=371 amount=-1 +kerning first=70 second=278 amount=-1 +kerning first=209 second=73 amount=-1 +kerning first=330 second=83 amount=-1 +kerning first=366 second=83 amount=-1 +kerning first=103 second=8220 amount=-2 +kerning first=8218 second=221 amount=-2 +kerning first=259 second=244 amount=-1 +kerning first=218 second=213 amount=-1 +kerning first=317 second=86 amount=-1 +kerning first=198 second=268 amount=-1 +kerning first=97 second=289 amount=-1 +kerning first=296 second=97 amount=-1 +kerning first=73 second=351 amount=-1 +kerning first=211 second=278 amount=-1 +kerning first=316 second=8220 amount=-1 +kerning first=367 second=244 amount=-1 +kerning first=368 second=97 amount=-1 +kerning first=77 second=213 amount=-1 +kerning first=368 second=114 amount=-1 +kerning first=1044 second=1090 amount=-1 +kerning first=302 second=77 amount=-1 +kerning first=1059 second=1099 amount=-1 +kerning first=338 second=77 amount=-1 +kerning first=368 second=82 amount=-1 +kerning first=108 second=277 amount=-1 +kerning first=1059 second=1060 amount=-1 +kerning first=207 second=74 amount=-1 +kerning first=266 second=77 amount=-1 +kerning first=72 second=277 amount=-1 +kerning first=67 second=235 amount=-1 +kerning first=68 second=88 amount=-1 +kerning first=68 second=73 amount=-1 +kerning first=103 second=235 amount=-1 +kerning first=8218 second=219 amount=-1 +kerning first=74 second=251 amount=-1 +kerning first=249 second=277 amount=-1 +kerning first=8218 second=234 amount=-1 +kerning first=1047 second=1081 amount=-1 +kerning first=268 second=269 amount=-1 +kerning first=195 second=290 amount=-1 +kerning first=304 second=269 amount=-1 +kerning first=218 second=113 amount=-1 +kerning first=304 second=338 amount=-1 +kerning first=232 second=269 amount=-1 +kerning first=234 second=283 amount=-1 +kerning first=266 second=231 amount=-1 +kerning first=282 second=286 amount=-1 +kerning first=1048 second=1117 amount=-1 +kerning first=268 second=338 amount=-1 +kerning first=302 second=231 amount=-1 +kerning first=210 second=65 amount=-1 +kerning first=72 second=171 amount=-1 +kerning first=296 second=82 amount=-1 +kerning first=196 second=338 amount=-1 +kerning first=374 second=231 amount=-1 +kerning first=69 second=286 amount=-1 +kerning first=201 second=274 amount=-1 +kerning first=352 second=8220 amount=-1 +kerning first=214 second=351 amount=-1 +kerning first=198 second=203 amount=-1 +kerning first=68 second=86 amount=-1 +kerning first=1050 second=1074 amount=-1 +kerning first=277 second=363 amount=-1 +kerning first=212 second=194 amount=-1 +kerning first=263 second=240 amount=-1 +kerning first=264 second=108 amount=-1 +kerning first=252 second=114 amount=-1 +kerning first=354 second=353 amount=-1 +kerning first=264 second=80 amount=-1 +kerning first=1027 second=1097 amount=-1 +kerning first=296 second=278 amount=-1 +kerning first=382 second=45 amount=-1 +kerning first=324 second=114 amount=-1 +kerning first=1068 second=1025 amount=-1 +kerning first=366 second=8222 amount=-2 +kerning first=288 second=114 amount=-1 +kerning first=87 second=347 amount=-1 +kerning first=284 second=66 amount=-1 +kerning first=45 second=196 amount=-1 +kerning first=85 second=367 amount=-1 +kerning first=266 second=344 amount=-1 +kerning first=81 second=196 amount=-1 +kerning first=196 second=217 amount=-1 +kerning first=212 second=66 amount=-1 +kerning first=272 second=317 amount=-1 +kerning first=222 second=8222 amount=-1 +kerning first=111 second=114 amount=-1 +kerning first=268 second=217 amount=-1 +kerning first=268 second=284 amount=-1 +kerning first=89 second=231 amount=-1 +kerning first=220 second=251 amount=-1 +kerning first=304 second=217 amount=-1 +kerning first=1047 second=1027 amount=-1 +kerning first=304 second=284 amount=-1 +kerning first=230 second=231 amount=-1 +kerning first=202 second=357 amount=-1 +kerning first=272 second=115 amount=-1 +kerning first=210 second=353 amount=-1 +kerning first=1034 second=1101 amount=-1 +kerning first=196 second=284 amount=-1 +kerning first=1064 second=1028 amount=-1 +kerning first=201 second=205 amount=-1 +kerning first=101 second=249 amount=-1 +kerning first=220 second=266 amount=-1 +kerning first=316 second=235 amount=-1 +kerning first=362 second=200 amount=-1 +kerning first=1064 second=1037 amount=-1 +kerning first=315 second=362 amount=-1 +kerning first=198 second=214 amount=-1 +kerning first=84 second=243 amount=-1 +kerning first=290 second=200 amount=-1 +kerning first=204 second=111 amount=-1 +kerning first=1058 second=1076 amount=-1 +kerning first=218 second=200 amount=-1 +kerning first=8218 second=288 amount=-1 +kerning first=65 second=249 amount=-1 +kerning first=70 second=226 amount=-1 +kerning first=8222 second=271 amount=-1 +kerning first=220 second=370 amount=-1 +kerning first=367 second=242 amount=-1 +kerning first=202 second=45 amount=-1 +kerning first=204 second=97 amount=-1 +kerning first=81 second=8222 amount=-1 +kerning first=97 second=45 amount=-1 +kerning first=99 second=252 amount=-1 +kerning first=278 second=249 amount=-1 +kerning first=310 second=45 amount=-1 +kerning first=314 second=249 amount=-1 +kerning first=67 second=233 amount=-1 +kerning first=8222 second=98 amount=-1 +kerning first=346 second=45 amount=-1 +kerning first=217 second=275 amount=-1 +kerning first=350 second=249 amount=-1 +kerning first=355 second=226 amount=-1 +kerning first=207 second=362 amount=-1 +kerning first=195 second=71 amount=-1 +kerning first=325 second=275 amount=-1 +kerning first=171 second=362 amount=-1 +kerning first=274 second=45 amount=-1 +kerning first=289 second=275 amount=-1 +kerning first=337 second=291 amount=-1 +kerning first=72 second=223 amount=-1 +kerning first=352 second=302 amount=-1 +kerning first=291 second=326 amount=-1 +kerning first=103 second=233 amount=-1 +kerning first=280 second=302 amount=-1 +kerning first=364 second=199 amount=-1 +kerning first=229 second=291 amount=-1 +kerning first=87 second=234 amount=-1 +kerning first=1030 second=1083 amount=-1 +kerning first=228 second=234 amount=-1 +kerning first=8250 second=84 amount=-1 +kerning first=99 second=98 amount=-1 +kerning first=270 second=46 amount=-1 +kerning first=326 second=267 amount=-1 +kerning first=67 second=302 amount=-1 +kerning first=362 second=267 amount=-1 +kerning first=316 second=233 amount=-1 +kerning first=1039 second=1113 amount=-1 +kerning first=281 second=248 amount=-1 +kerning first=8222 second=269 amount=-1 +kerning first=233 second=122 amount=-1 +kerning first=225 second=243 amount=-1 +kerning first=70 second=224 amount=-1 +kerning first=217 second=327 amount=-1 +kerning first=77 second=220 amount=-1 +kerning first=65 second=8221 amount=-2 +kerning first=1062 second=1094 amount=-1 +kerning first=262 second=333 amount=-1 +kerning first=101 second=8221 amount=-2 +kerning first=291 second=107 amount=-1 +kerning first=369 second=243 amount=-1 +kerning first=325 second=327 amount=-1 +kerning first=234 second=337 amount=-1 +kerning first=225 second=269 amount=-1 +kerning first=1038 second=1119 amount=-1 +kerning first=277 second=311 amount=-1 +kerning first=354 second=232 amount=-1 +kerning first=171 second=89 amount=-1 +kerning first=355 second=224 amount=-1 +kerning first=66 second=89 amount=-1 +kerning first=234 second=335 amount=-1 +kerning first=97 second=318 amount=-1 +kerning first=8220 second=218 amount=-1 +kerning first=83 second=370 amount=-1 +kerning first=1052 second=1071 amount=-1 +kerning first=344 second=46 amount=-1 +kerning first=1078 second=1104 amount=-1 +kerning first=218 second=267 amount=-1 +kerning first=368 second=370 amount=-1 +kerning first=8222 second=338 amount=-1 +kerning first=330 second=212 amount=-1 +kerning first=296 second=370 amount=-1 +kerning first=8250 second=82 amount=-1 +kerning first=72 second=225 amount=-1 +kerning first=220 second=199 amount=-1 +kerning first=77 second=267 amount=-1 +kerning first=220 second=361 amount=-1 +kerning first=291 second=277 amount=-1 +kerning first=1068 second=1031 amount=-1 +kerning first=302 second=71 amount=-1 +kerning first=1030 second=1086 amount=-1 +kerning first=364 second=361 amount=-1 +kerning first=199 second=206 amount=-1 +kerning first=207 second=267 amount=-1 +kerning first=209 second=212 amount=-1 +kerning first=346 second=114 amount=-1 +kerning first=68 second=296 amount=-1 +kerning first=279 second=267 amount=-1 +kerning first=1104 second=1117 amount=-1 +kerning first=1062 second=1079 amount=-1 +kerning first=274 second=8249 amount=-1 +kerning first=214 second=115 amount=-1 +kerning first=202 second=114 amount=-1 +kerning first=110 second=111 amount=-1 +kerning first=310 second=114 amount=-1 +kerning first=346 second=8249 amount=-1 +kerning first=274 second=114 amount=-1 +kerning first=382 second=8249 amount=-1 +kerning first=1027 second=1095 amount=-1 +kerning first=251 second=111 amount=-1 +kerning first=350 second=45 amount=-1 +kerning first=287 second=111 amount=-1 +kerning first=73 second=115 amount=-1 +kerning first=323 second=111 amount=-1 +kerning first=83 second=368 amount=-1 +kerning first=97 second=114 amount=-1 +kerning first=87 second=258 amount=-1 +kerning first=291 second=365 amount=-1 +kerning first=79 second=197 amount=-1 +kerning first=327 second=68 amount=-1 +kerning first=219 second=365 amount=-1 +kerning first=220 second=197 amount=-1 +kerning first=316 second=263 amount=-1 +kerning first=255 second=365 amount=-1 +kerning first=203 second=310 amount=-1 +kerning first=199 second=370 amount=-1 +kerning first=302 second=203 amount=-1 +kerning first=77 second=72 amount=-1 +kerning first=338 second=203 amount=-1 +kerning first=368 second=368 amount=-1 +kerning first=234 second=249 amount=-1 +kerning first=364 second=197 amount=-1 +kerning first=98 second=46 amount=-1 +kerning first=202 second=8249 amount=-1 +kerning first=1042 second=1037 amount=-1 +kerning first=8217 second=346 amount=-1 +kerning first=199 second=364 amount=-1 +kerning first=1041 second=1088 amount=-1 +kerning first=195 second=199 amount=-1 +kerning first=246 second=8220 amount=-2 +kerning first=266 second=203 amount=-1 +kerning first=368 second=290 amount=-1 +kerning first=362 second=72 amount=-1 +kerning first=67 second=263 amount=-1 +kerning first=270 second=374 amount=-1 +kerning first=103 second=263 amount=-1 +kerning first=235 second=106 amount=-1 +kerning first=290 second=72 amount=-1 +kerning first=1054 second=1055 amount=-1 +kerning first=355 second=8222 amount=-1 +kerning first=8216 second=220 amount=-1 +kerning first=116 second=230 amount=-1 +kerning first=203 second=327 amount=-1 +kerning first=80 second=230 amount=-1 +kerning first=1053 second=1052 amount=-1 +kerning first=211 second=8222 amount=-1 +kerning first=211 second=87 amount=-1 +kerning first=1055 second=1104 amount=-1 +kerning first=88 second=288 amount=-1 +kerning first=1030 second=1036 amount=-1 +kerning first=72 second=279 amount=-1 +kerning first=70 second=8222 amount=-2 +kerning first=235 second=333 amount=-1 +kerning first=108 second=279 amount=-1 +kerning first=192 second=288 amount=-1 +kerning first=74 second=81 amount=-1 +kerning first=287 second=291 amount=-1 +kerning first=251 second=291 amount=-1 +kerning first=87 second=288 amount=-1 +kerning first=364 second=227 amount=-1 +kerning first=8217 second=363 amount=-1 +kerning first=337 second=44 amount=-1 +kerning first=206 second=274 amount=-1 +kerning first=333 second=187 amount=-1 +kerning first=255 second=252 amount=-1 +kerning first=196 second=89 amount=-1 +kerning first=110 second=291 amount=-1 +kerning first=71 second=209 amount=-1 +kerning first=263 second=281 amount=-1 +kerning first=119 second=318 amount=-1 +kerning first=264 second=288 amount=-1 +kerning first=220 second=227 amount=-1 +kerning first=224 second=318 amount=-1 +kerning first=1059 second=1090 amount=-1 +kerning first=86 second=99 amount=-1 +kerning first=84 second=187 amount=-1 +kerning first=1042 second=1050 amount=-1 +kerning first=1067 second=1095 amount=-1 +kerning first=356 second=337 amount=-1 +kerning first=227 second=99 amount=-1 +kerning first=225 second=187 amount=-1 +kerning first=290 second=8218 amount=-1 +kerning first=1033 second=1027 amount=-1 +kerning first=263 second=99 amount=-1 +kerning first=261 second=187 amount=-1 +kerning first=268 second=245 amount=-1 +kerning first=65 second=221 amount=-1 +kerning first=232 second=245 amount=-1 +kerning first=1047 second=1113 amount=-1 +kerning first=288 second=270 amount=-1 +kerning first=287 second=328 amount=-1 +kerning first=1031 second=1073 amount=-1 +kerning first=71 second=66 amount=-1 +kerning first=264 second=330 amount=-1 +kerning first=249 second=279 amount=-1 +kerning first=221 second=230 amount=-1 +kerning first=366 second=196 amount=-1 +kerning first=200 second=332 amount=-1 +kerning first=370 second=367 amount=-1 +kerning first=344 second=332 amount=-1 +kerning first=214 second=202 amount=-1 +kerning first=84 second=351 amount=-1 +kerning first=198 second=73 amount=-1 +kerning first=368 second=264 amount=-1 +kerning first=196 second=8217 amount=-2 +kerning first=286 second=202 amount=-1 +kerning first=65 second=108 amount=-1 +kerning first=296 second=264 amount=-1 +kerning first=101 second=108 amount=-1 +kerning first=1030 second=1073 amount=-1 +kerning first=279 second=104 amount=-1 +kerning first=339 second=248 amount=-1 +kerning first=242 second=108 amount=-1 +kerning first=105 second=121 amount=-1 +kerning first=213 second=82 amount=-1 +kerning first=1034 second=1030 amount=-1 +kerning first=8249 second=352 amount=-1 +kerning first=80 second=323 amount=-1 +kerning first=1041 second=1034 amount=-1 +kerning first=8250 second=368 amount=-1 +kerning first=232 second=8217 amount=-2 +kerning first=1089 second=1076 amount=-1 +kerning first=203 second=364 amount=-1 +kerning first=1040 second=1038 amount=-2 +kerning first=268 second=8217 amount=-1 +kerning first=314 second=108 amount=-1 +kerning first=199 second=69 amount=-1 +kerning first=97 second=277 amount=-1 +kerning first=375 second=8218 amount=-1 +kerning first=1078 second=1091 amount=-1 +kerning first=275 second=273 amount=-1 +kerning first=8218 second=366 amount=-1 +kerning first=240 second=113 amount=-1 +kerning first=1056 second=1067 amount=-1 +kerning first=1039 second=1067 amount=-1 +kerning first=230 second=116 amount=-1 +kerning first=224 second=314 amount=-1 +kerning first=72 second=82 amount=-1 +kerning first=268 second=325 amount=-1 +kerning first=83 second=171 amount=-1 +kerning first=286 second=78 amount=-1 +kerning first=204 second=113 amount=-1 +kerning first=82 second=44 amount=-1 +kerning first=199 second=286 amount=-1 +kerning first=119 second=314 amount=-1 +kerning first=1118 second=1078 amount=-1 +kerning first=304 second=325 amount=-1 +kerning first=99 second=113 amount=-1 +kerning first=280 second=317 amount=-1 +kerning first=1031 second=1069 amount=-1 +kerning first=267 second=112 amount=-1 +kerning first=1067 second=1069 amount=-1 +kerning first=327 second=264 amount=-1 +kerning first=231 second=112 amount=-1 +kerning first=352 second=317 amount=-1 +kerning first=214 second=78 amount=-1 +kerning first=109 second=339 amount=-1 +kerning first=220 second=110 amount=-1 +kerning first=1038 second=1077 amount=-1 +kerning first=272 second=282 amount=-1 +kerning first=73 second=78 amount=-1 +kerning first=199 second=316 amount=-1 +kerning first=99 second=109 amount=-1 +kerning first=291 second=242 amount=-1 +kerning first=8217 second=256 amount=-2 +kerning first=200 second=282 amount=-1 +kerning first=364 second=110 amount=-1 +kerning first=288 second=77 amount=-1 +kerning first=217 second=8220 amount=-1 +kerning first=103 second=289 amount=-1 +kerning first=1031 second=1094 amount=-1 +kerning first=291 second=339 amount=-1 +kerning first=258 second=356 amount=-1 +kerning first=244 second=289 amount=-1 +kerning first=363 second=339 amount=-1 +kerning first=255 second=311 amount=-1 +kerning first=316 second=289 amount=-1 +kerning first=327 second=339 amount=-1 +kerning first=74 second=382 amount=-1 +kerning first=72 second=333 amount=-1 +kerning first=81 second=356 amount=-1 +kerning first=260 second=171 amount=-1 +kerning first=262 second=220 amount=-1 +kerning first=108 second=333 amount=-1 +kerning first=328 second=281 amount=-1 +kerning first=356 second=246 amount=-1 +kerning first=334 second=220 amount=-1 +kerning first=364 second=281 amount=-1 +kerning first=259 second=101 amount=-1 +kerning first=368 second=171 amount=-2 +kerning first=298 second=220 amount=-1 +kerning first=249 second=333 amount=-1 +kerning first=274 second=212 amount=-1 +kerning first=367 second=101 amount=-1 +kerning first=85 second=220 amount=-1 +kerning first=84 second=100 amount=-1 +kerning first=1049 second=1065 amount=-1 +kerning first=204 second=330 amount=-1 +kerning first=71 second=296 amount=-1 +kerning first=211 second=304 amount=-1 +kerning first=70 second=280 amount=-1 +kerning first=1030 second=1045 amount=-1 +kerning first=284 second=8218 amount=-1 +kerning first=69 second=338 amount=-1 +kerning first=284 second=296 amount=-1 +kerning first=366 second=85 amount=-1 +kerning first=248 second=8218 amount=-1 +kerning first=195 second=86 amount=-1 +kerning first=1064 second=1074 amount=-1 +kerning first=330 second=85 amount=-1 +kerning first=212 second=8218 amount=-1 +kerning first=212 second=296 amount=-1 +kerning first=70 second=304 amount=-1 +kerning first=89 second=382 amount=-1 +kerning first=298 second=313 amount=-1 +kerning first=258 second=85 amount=-1 +kerning first=334 second=313 amount=-1 +kerning first=366 second=109 amount=-1 +kerning first=370 second=220 amount=-1 +kerning first=370 second=313 amount=-1 +kerning first=187 second=298 amount=-1 +kerning first=356 second=8218 amount=-1 +kerning first=220 second=281 amount=-1 +kerning first=81 second=85 amount=-1 +kerning first=78 second=339 amount=-1 +kerning first=45 second=85 amount=-1 +kerning first=279 second=347 amount=-1 +kerning first=219 second=339 amount=-1 +kerning first=262 second=313 amount=-1 +kerning first=344 second=8250 amount=-1 +kerning first=217 second=290 amount=-1 +kerning first=207 second=347 amount=-1 +kerning first=66 second=347 amount=-1 +kerning first=107 second=8218 amount=-1 +kerning first=1051 second=1037 amount=-1 +kerning first=272 second=8250 amount=-1 +kerning first=45 second=109 amount=-1 +kerning first=323 second=382 amount=-1 +kerning first=305 second=287 amount=-1 +kerning first=70 second=83 amount=-1 +kerning first=325 second=290 amount=-1 +kerning first=269 second=287 amount=-1 +kerning first=85 second=313 amount=-1 +kerning first=200 second=8250 amount=-1 +kerning first=233 second=287 amount=-1 +kerning first=200 second=371 amount=-1 +kerning first=67 second=122 amount=-1 +kerning first=67 second=282 amount=-1 +kerning first=1091 second=1090 amount=-1 +kerning first=291 second=289 amount=-1 +kerning first=275 second=234 amount=-1 +kerning first=255 second=289 amount=-1 +kerning first=316 second=339 amount=-1 +kerning first=76 second=374 amount=-1 +kerning first=363 second=289 amount=-1 +kerning first=209 second=66 amount=-1 +kerning first=197 second=8220 amount=-2 +kerning first=206 second=330 amount=-1 +kerning first=1055 second=1105 amount=-1 +kerning first=45 second=280 amount=-1 +kerning first=199 second=232 amount=-1 +kerning first=203 second=219 amount=-1 +kerning first=272 second=278 amount=-1 +kerning first=1039 second=1070 amount=-1 +kerning first=266 second=311 amount=-1 +kerning first=316 second=122 amount=-1 +kerning first=200 second=278 amount=-1 +kerning first=81 second=280 amount=-1 +kerning first=338 second=199 amount=-1 +kerning first=1046 second=1082 amount=-1 +kerning first=8250 second=264 amount=-1 +kerning first=244 second=122 amount=-1 +kerning first=307 second=232 amount=-1 +kerning first=103 second=107 amount=-1 +kerning first=103 second=122 amount=-1 +kerning first=271 second=232 amount=-1 +kerning first=67 second=107 amount=-1 +kerning first=281 second=103 amount=-1 +kerning first=235 second=232 amount=-1 +kerning first=209 second=335 amount=-1 +kerning first=368 second=225 amount=-1 +kerning first=80 second=269 amount=-1 +kerning first=116 second=269 amount=-1 +kerning first=281 second=335 amount=-1 +kerning first=1031 second=1062 amount=-1 +kerning first=75 second=363 amount=-1 +kerning first=89 second=45 amount=-2 +kerning first=199 second=311 amount=-1 +kerning first=281 second=8217 amount=-2 +kerning first=257 second=269 amount=-1 +kerning first=198 second=298 amount=-1 +kerning first=86 second=216 amount=-1 +kerning first=270 second=298 amount=-1 +kerning first=221 second=269 amount=-1 +kerning first=193 second=98 amount=-1 +kerning first=197 second=85 amount=-1 +kerning first=233 second=8220 amount=-2 +kerning first=323 second=101 amount=-1 +kerning first=171 second=346 amount=-1 +kerning first=365 second=269 amount=-1 +kerning first=1058 second=1081 amount=-1 +kerning first=333 second=46 amount=-1 +kerning first=104 second=335 amount=-1 +kerning first=73 second=241 amount=-1 +kerning first=296 second=225 amount=-1 +kerning first=370 second=274 amount=-1 +kerning first=81 second=70 amount=-1 +kerning first=1043 second=1087 amount=-1 +kerning first=221 second=67 amount=-1 +kerning first=298 second=274 amount=-1 +kerning first=71 second=207 amount=-1 +kerning first=268 second=104 amount=-1 +kerning first=80 second=67 amount=-1 +kerning first=334 second=274 amount=-1 +kerning first=70 second=250 amount=-1 +kerning first=196 second=104 amount=-1 +kerning first=262 second=274 amount=-1 +kerning first=232 second=104 amount=-1 +kerning first=283 second=250 amount=-1 +kerning first=120 second=46 amount=-1 +kerning first=212 second=207 amount=-1 +kerning first=325 second=366 amount=-1 +kerning first=368 second=260 amount=-1 +kerning first=45 second=70 amount=-1 +kerning first=370 second=259 amount=-1 +kerning first=282 second=262 amount=-1 +kerning first=204 second=200 amount=-1 +kerning first=267 second=187 amount=-1 +kerning first=362 second=76 amount=-1 +kerning first=298 second=259 amount=-1 +kerning first=375 second=8250 amount=-1 +kerning first=109 second=269 amount=-1 +kerning first=364 second=357 amount=-1 +kerning first=1051 second=1053 amount=-1 +kerning first=1038 second=1074 amount=-1 +kerning first=290 second=76 amount=-1 +kerning first=200 second=357 amount=-1 +kerning first=1118 second=1117 amount=-1 +kerning first=111 second=378 amount=-1 +kerning first=218 second=76 amount=-1 +kerning first=77 second=76 amount=-1 +kerning first=220 second=357 amount=-1 +kerning first=366 second=70 amount=-1 +kerning first=366 second=280 amount=-1 +kerning first=1059 second=1084 amount=-1 +kerning first=229 second=113 amount=-1 +kerning first=330 second=280 amount=-1 +kerning first=352 second=187 amount=-1 +kerning first=277 second=116 amount=-1 +kerning first=1088 second=1083 amount=-1 +kerning first=85 second=259 amount=-1 +kerning first=280 second=75 amount=-1 +kerning first=196 second=375 amount=-1 +kerning first=217 second=366 amount=-1 +kerning first=207 second=271 amount=-1 +kerning first=1067 second=1108 amount=-1 +kerning first=284 second=207 amount=-1 +kerning first=187 second=268 amount=-1 +kerning first=368 second=210 amount=-1 +kerning first=279 second=271 amount=-1 +kerning first=264 second=204 amount=-1 +kerning first=82 second=268 amount=-1 +kerning first=296 second=210 amount=-1 +kerning first=1031 second=1108 amount=-1 +kerning first=214 second=256 amount=-1 +kerning first=1058 second=1096 amount=-1 +kerning first=1048 second=1047 amount=-1 +kerning first=76 second=366 amount=-1 +kerning first=356 second=242 amount=-1 +kerning first=201 second=369 amount=-1 +kerning first=266 second=257 amount=-1 +kerning first=117 second=333 amount=-1 +kerning first=352 second=209 amount=-1 +kerning first=8217 second=324 amount=-1 +kerning first=302 second=257 amount=-1 +kerning first=1064 second=1113 amount=-1 +kerning first=233 second=233 amount=-1 +kerning first=280 second=209 amount=-1 +kerning first=296 second=279 amount=-1 +kerning first=89 second=257 amount=-1 +kerning first=269 second=233 amount=-1 +kerning first=263 second=316 amount=-1 +kerning first=224 second=279 amount=-1 +kerning first=1107 second=1102 amount=-1 +kerning first=264 second=327 amount=-1 +kerning first=78 second=235 amount=-1 +kerning first=207 second=213 amount=-1 +kerning first=286 second=187 amount=-1 +kerning first=374 second=380 amount=-1 +kerning first=305 second=233 amount=-1 +kerning first=219 second=235 amount=-1 +kerning first=66 second=213 amount=-1 +kerning first=291 second=235 amount=-1 +kerning first=197 second=371 amount=-1 +kerning first=8222 second=245 amount=-1 +kerning first=327 second=235 amount=-1 +kerning first=1034 second=1045 amount=-1 +kerning first=90 second=8221 amount=-1 +kerning first=363 second=235 amount=-1 +kerning first=313 second=218 amount=-1 +kerning first=89 second=380 amount=-1 +kerning first=200 second=336 amount=-1 +kerning first=291 second=231 amount=-1 +kerning first=108 second=318 amount=-1 +kerning first=116 second=281 amount=-1 +kerning first=259 second=283 amount=-1 +kerning first=8222 second=89 amount=-2 +kerning first=327 second=231 amount=-1 +kerning first=1027 second=1071 amount=-1 +kerning first=363 second=231 amount=-1 +kerning first=205 second=218 amount=-1 +kerning first=73 second=187 amount=-1 +kerning first=1067 second=1104 amount=-1 +kerning first=233 second=248 amount=-1 +kerning first=266 second=380 amount=-1 +kerning first=270 second=88 amount=-1 +kerning first=230 second=380 amount=-1 +kerning first=282 second=8221 amount=-1 +kerning first=305 second=248 amount=-1 +kerning first=202 second=75 amount=-1 +kerning first=1031 second=1104 amount=-1 +kerning first=269 second=248 amount=-1 +kerning first=302 second=380 amount=-1 +kerning first=282 second=220 amount=-1 +kerning first=70 second=196 amount=-1 +kerning first=85 second=274 amount=-1 +kerning first=67 second=209 amount=-1 +kerning first=8250 second=260 amount=-1 +kerning first=114 second=8218 amount=-1 +kerning first=83 second=69 amount=-1 +kerning first=368 second=279 amount=-1 +kerning first=367 second=283 amount=-1 +kerning first=374 second=257 amount=-1 +kerning first=287 second=367 amount=-1 +kerning first=201 second=79 amount=-1 +kerning first=211 second=196 amount=-1 +kerning first=234 second=244 amount=-1 +kerning first=74 second=367 amount=-1 +kerning first=66 second=217 amount=-1 +kerning first=252 second=103 amount=-1 +kerning first=356 second=261 amount=-1 +kerning first=335 second=114 amount=-1 +kerning first=263 second=45 amount=-1 +kerning first=1051 second=1107 amount=-1 +kerning first=207 second=217 amount=-1 +kerning first=84 second=115 amount=-1 +kerning first=74 second=252 amount=-1 +kerning first=227 second=114 amount=-1 +kerning first=206 second=344 amount=-1 +kerning first=315 second=217 amount=-1 +kerning first=69 second=67 amount=-1 +kerning first=334 second=205 amount=-1 +kerning first=225 second=8217 amount=-2 +kerning first=1046 second=1063 amount=-1 +kerning first=370 second=205 amount=-1 +kerning first=263 second=114 amount=-1 +kerning first=278 second=344 amount=-1 +kerning first=1043 second=1072 amount=-1 +kerning first=80 second=284 amount=-1 +kerning first=73 second=310 amount=-1 +kerning first=221 second=353 amount=-1 +kerning first=264 second=351 amount=-1 +kerning first=83 second=206 amount=-1 +kerning first=72 second=368 amount=-1 +kerning first=86 second=114 amount=-1 +kerning first=78 second=231 amount=-1 +kerning first=1052 second=1095 amount=-1 +kerning first=99 second=345 amount=-1 +kerning first=85 second=205 amount=-1 +kerning first=197 second=220 amount=-1 +kerning first=368 second=206 amount=-1 +kerning first=367 second=8221 amount=-1 +kerning first=204 second=345 amount=-1 +kerning first=261 second=8250 amount=-1 +kerning first=296 second=206 amount=-1 +kerning first=240 second=345 amount=-1 +kerning first=1036 second=1098 amount=-1 +kerning first=321 second=368 amount=-1 +kerning first=362 second=362 amount=-1 +kerning first=77 second=110 amount=-1 +kerning first=316 second=111 amount=-1 +kerning first=209 second=266 amount=-1 +kerning first=267 second=8221 amount=-2 +kerning first=246 second=106 amount=-1 +kerning first=234 second=281 amount=-1 +kerning first=1053 second=1037 amount=-1 +kerning first=339 second=8221 amount=-2 +kerning first=213 second=368 amount=-1 +kerning first=364 second=71 amount=-1 +kerning first=187 second=214 amount=-1 +kerning first=116 second=353 amount=-1 +kerning first=77 second=362 amount=-1 +kerning first=310 second=223 amount=-1 +kerning first=274 second=223 amount=-1 +kerning first=1031 second=1052 amount=-1 +kerning first=339 second=249 amount=-1 +kerning first=45 second=286 amount=-1 +kerning first=375 second=249 amount=-1 +kerning first=330 second=226 amount=-1 +kerning first=287 second=252 amount=-1 +kerning first=314 second=275 amount=-1 +kerning first=72 second=97 amount=-1 +kerning first=325 second=80 amount=-1 +kerning first=1039 second=1089 amount=-1 +kerning first=366 second=226 amount=-1 +kerning first=101 second=275 amount=-1 +kerning first=218 second=362 amount=-1 +kerning first=310 second=8217 amount=-1 +kerning first=206 second=275 amount=-1 +kerning first=231 second=249 amount=-1 +kerning first=86 second=45 amount=-2 +kerning first=290 second=362 amount=-1 +kerning first=346 second=223 amount=-1 +kerning first=1055 second=1086 amount=-1 +kerning first=267 second=249 amount=-1 +kerning first=122 second=45 amount=-1 +kerning first=119 second=353 amount=-1 +kerning first=87 second=243 amount=-1 +kerning first=290 second=217 amount=-1 +kerning first=345 second=224 amount=-1 +kerning first=286 second=327 amount=-1 +kerning first=228 second=243 amount=-1 +kerning first=75 second=45 amount=-1 +kerning first=362 second=217 amount=-1 +kerning first=86 second=97 amount=-1 +kerning first=324 second=45 amount=-1 +kerning first=296 second=353 amount=-1 +kerning first=264 second=243 amount=-1 +kerning first=364 second=249 amount=-1 +kerning first=217 second=71 amount=-1 +kerning first=252 second=45 amount=-1 +kerning first=262 second=344 amount=-1 +kerning first=368 second=353 amount=-1 +kerning first=288 second=45 amount=-1 +kerning first=275 second=275 amount=-1 +kerning first=219 second=68 amount=-1 +kerning first=279 second=252 amount=-1 +kerning first=214 second=80 amount=-1 +kerning first=1056 second=1045 amount=-1 +kerning first=1062 second=1114 amount=-1 +kerning first=1051 second=1062 amount=-1 +kerning first=240 second=267 amount=-1 +kerning first=1049 second=1097 amount=-1 +kerning first=199 second=318 amount=-1 +kerning first=8222 second=67 amount=-1 +kerning first=235 second=318 amount=-1 +kerning first=86 second=336 amount=-1 +kerning first=69 second=370 amount=-1 +kerning first=45 second=310 amount=-1 +kerning first=286 second=80 amount=-1 +kerning first=282 second=223 amount=-1 +kerning first=263 second=97 amount=-1 +kerning first=72 second=116 amount=-1 +kerning first=267 second=234 amount=-1 +kerning first=231 second=234 amount=-1 +kerning first=212 second=88 amount=-1 +kerning first=86 second=257 amount=-1 +kerning first=339 second=234 amount=-1 +kerning first=1065 second=1085 amount=-1 +kerning first=69 second=223 amount=-1 +kerning first=217 second=258 amount=-1 +kerning first=269 second=226 amount=-1 +kerning first=80 second=362 amount=-1 +kerning first=1054 second=1053 amount=-1 +kerning first=262 second=330 amount=-1 +kerning first=1050 second=1076 amount=-1 +kerning first=206 second=266 amount=-1 +kerning first=220 second=249 amount=-1 +kerning first=207 second=235 amount=-1 +kerning first=1118 second=1084 amount=-1 +kerning first=278 second=266 amount=-1 +kerning first=325 second=71 amount=-1 +kerning first=77 second=217 amount=-1 +kerning first=279 second=232 amount=-1 +kerning first=304 second=200 amount=-1 +kerning first=207 second=232 amount=-1 +kerning first=268 second=200 amount=-1 +kerning first=218 second=217 amount=-1 +kerning first=65 second=266 amount=-1 +kerning first=262 second=98 amount=-1 +kerning first=232 second=267 amount=-1 +kerning first=268 second=267 amount=-1 +kerning first=1052 second=1041 amount=-1 +kerning first=1050 second=1096 amount=-1 +kerning first=304 second=267 amount=-1 +kerning first=121 second=98 amount=-1 +kerning first=192 second=213 amount=-1 +kerning first=85 second=345 amount=-1 +kerning first=121 second=345 amount=-1 +kerning first=330 second=241 amount=-1 +kerning first=8250 second=206 amount=-1 +kerning first=1078 second=1089 amount=-1 +kerning first=226 second=345 amount=-1 +kerning first=69 second=323 amount=-1 +kerning first=262 second=345 amount=-1 +kerning first=302 second=302 amount=-1 +kerning first=298 second=345 amount=-1 +kerning first=338 second=302 amount=-1 +kerning first=233 second=46 amount=-1 +kerning first=8250 second=193 amount=-1 +kerning first=370 second=345 amount=-1 +kerning first=266 second=302 amount=-1 +kerning first=310 second=363 amount=-1 +kerning first=1027 second=1080 amount=-1 +kerning first=45 second=241 amount=-1 +kerning first=269 second=46 amount=-1 +kerning first=1067 second=1050 amount=-1 +kerning first=1053 second=1069 amount=-1 +kerning first=356 second=335 amount=-1 +kerning first=249 second=114 amount=-1 +kerning first=1031 second=1050 amount=-1 +kerning first=8218 second=364 amount=-1 +kerning first=210 second=370 amount=-1 +kerning first=73 second=110 amount=-1 +kerning first=70 second=336 amount=-1 +kerning first=370 second=200 amount=-1 +kerning first=108 second=114 amount=-1 +kerning first=316 second=378 amount=-1 +kerning first=72 second=114 amount=-1 +kerning first=204 second=81 amount=-1 +kerning first=282 second=323 amount=-1 +kerning first=291 second=250 amount=-1 +kerning first=65 second=199 amount=-1 +kerning first=204 second=207 amount=-1 +kerning first=219 second=250 amount=-1 +kerning first=282 second=370 amount=-1 +kerning first=77 second=284 amount=-1 +kerning first=275 second=115 amount=-1 +kerning first=206 second=199 amount=-1 +kerning first=67 second=378 amount=-1 +kerning first=66 second=72 amount=-1 +kerning first=219 second=216 amount=-1 +kerning first=278 second=199 amount=-1 +kerning first=258 second=44 amount=-1 +kerning first=108 second=314 amount=-1 +kerning first=207 second=72 amount=-1 +kerning first=1031 second=1037 amount=-1 +kerning first=68 second=344 amount=-1 +kerning first=325 second=281 amount=-1 +kerning first=1067 second=1037 amount=-1 +kerning first=209 second=344 amount=-1 +kerning first=1066 second=1071 amount=-1 +kerning first=264 second=310 amount=-1 +kerning first=103 second=378 amount=-1 +kerning first=214 second=327 amount=-1 +kerning first=209 second=110 amount=-1 +kerning first=108 second=117 amount=-1 +kerning first=45 second=334 amount=-1 +kerning first=86 second=8222 amount=-2 +kerning first=211 second=282 amount=-1 +kerning first=330 second=334 amount=-1 +kerning first=70 second=282 amount=-1 +kerning first=374 second=232 amount=-1 +kerning first=258 second=334 amount=-1 +kerning first=362 second=230 amount=-1 +kerning first=267 second=45 amount=-1 +kerning first=65 second=81 amount=-1 +kerning first=366 second=334 amount=-1 +kerning first=258 second=87 amount=-1 +kerning first=218 second=230 amount=-1 +kerning first=72 second=205 amount=-1 +kerning first=323 second=313 amount=-1 +kerning first=86 second=197 amount=-1 +kerning first=121 second=115 amount=-1 +kerning first=229 second=242 amount=-1 +kerning first=77 second=230 amount=-1 +kerning first=1064 second=1052 amount=-1 +kerning first=81 second=87 amount=-1 +kerning first=226 second=291 amount=-1 +kerning first=45 second=87 amount=-2 +kerning first=201 second=296 amount=-1 +kerning first=121 second=291 amount=-1 +kerning first=252 second=279 amount=-1 +kerning first=356 second=101 amount=-1 +kerning first=206 second=212 amount=-1 +kerning first=339 second=108 amount=-1 +kerning first=375 second=108 amount=-1 +kerning first=194 second=8220 amount=-2 +kerning first=1039 second=1098 amount=-1 +kerning first=1046 second=1117 amount=-1 +kerning first=8217 second=257 amount=-1 +kerning first=65 second=212 amount=-1 +kerning first=324 second=279 amount=-1 +kerning first=82 second=8218 amount=-1 +kerning first=268 second=254 amount=-1 +kerning first=252 second=99 amount=-1 +kerning first=66 second=323 amount=-1 +kerning first=222 second=187 amount=-1 +kerning first=1046 second=1119 amount=-1 +kerning first=81 second=187 amount=-1 +kerning first=307 second=245 amount=-1 +kerning first=99 second=328 amount=-1 +kerning first=225 second=8250 amount=-1 +kerning first=1118 second=1119 amount=-1 +kerning first=271 second=245 amount=-1 +kerning first=225 second=245 amount=-1 +kerning first=235 second=245 amount=-1 +kerning first=366 second=187 amount=-2 +kerning first=199 second=245 amount=-1 +kerning first=230 second=107 amount=-1 +kerning first=242 second=345 amount=-1 +kerning first=81 second=206 amount=-1 +kerning first=324 second=99 amount=-1 +kerning first=224 second=335 amount=-1 +kerning first=118 second=8218 amount=-1 +kerning first=8222 second=254 amount=-1 +kerning first=338 second=8220 amount=-1 +kerning first=269 second=380 amount=-1 +kerning first=203 second=202 amount=-1 +kerning first=266 second=248 amount=-1 +kerning first=230 second=248 amount=-1 +kerning first=260 second=8249 amount=-1 +kerning first=192 second=117 amount=-1 +kerning first=327 second=270 amount=-1 +kerning first=352 second=218 amount=-1 +kerning first=338 second=75 amount=-1 +kerning first=302 second=75 amount=-1 +kerning first=280 second=218 amount=-1 +kerning first=89 second=248 amount=-1 +kerning first=266 second=75 amount=-1 +kerning first=8218 second=305 amount=-1 +kerning first=367 second=231 amount=-1 +kerning first=283 second=357 amount=-1 +kerning first=350 second=201 amount=-1 +kerning first=314 second=242 amount=-1 +kerning first=231 second=307 amount=-1 +kerning first=323 second=66 amount=-1 +kerning first=78 second=270 amount=-1 +kerning first=195 second=307 amount=-1 +kerning first=199 second=264 amount=-1 +kerning first=89 second=8220 amount=-1 +kerning first=1055 second=1073 amount=-1 +kerning first=362 second=171 amount=-2 +kerning first=267 second=307 amount=-1 +kerning first=267 second=108 amount=-1 +kerning first=211 second=209 amount=-1 +kerning first=219 second=270 amount=-1 +kerning first=118 second=367 amount=-1 +kerning first=187 second=202 amount=-1 +kerning first=274 second=362 amount=-1 +kerning first=219 second=196 amount=-1 +kerning first=282 second=69 amount=-1 +kerning first=195 second=108 amount=-1 +kerning first=80 second=74 amount=-1 +kerning first=304 second=205 amount=-1 +kerning first=266 second=8220 amount=-1 +kerning first=233 second=380 amount=-1 +kerning first=231 second=108 amount=-1 +kerning first=74 second=66 amount=-1 +kerning first=70 second=209 amount=-1 +kerning first=230 second=8220 amount=-2 +kerning first=245 second=103 amount=-1 +kerning first=198 second=205 amount=-1 +kerning first=209 second=103 amount=-1 +kerning first=221 second=74 amount=-1 +kerning first=207 second=325 amount=-1 +kerning first=66 second=252 amount=-1 +kerning first=1067 second=1091 amount=-1 +kerning first=104 second=103 amount=-1 +kerning first=70 second=334 amount=-1 +kerning first=279 second=8220 amount=-2 +kerning first=1049 second=1030 amount=-1 +kerning first=105 second=269 amount=-1 +kerning first=106 second=279 amount=-1 +kerning first=1052 second=1034 amount=-1 +kerning first=118 second=187 amount=-1 +kerning first=69 second=69 amount=-1 +kerning first=264 second=364 amount=-1 +kerning first=73 second=273 amount=-1 +kerning first=85 second=44 amount=-2 +kerning first=200 second=304 amount=-1 +kerning first=67 second=218 amount=-1 +kerning first=121 second=44 amount=-1 +kerning first=204 second=261 amount=-1 +kerning first=334 second=44 amount=-1 +kerning first=246 second=316 amount=-1 +kerning first=325 second=337 amount=-1 +kerning first=368 second=193 amount=-1 +kerning first=302 second=248 amount=-1 +kerning first=87 second=117 amount=-1 +kerning first=74 second=275 amount=-1 +kerning first=354 second=269 amount=-1 +kerning first=374 second=248 amount=-1 +kerning first=1071 second=1048 amount=-1 +kerning first=122 second=171 amount=-1 +kerning first=263 second=365 amount=-1 +kerning first=217 second=216 amount=-1 +kerning first=8222 second=101 amount=-1 +kerning first=368 second=65 amount=-1 +kerning first=1030 second=1101 amount=-1 +kerning first=1048 second=1030 amount=-1 +kerning first=1036 second=1074 amount=-1 +kerning first=263 second=171 amount=-1 +kerning first=1038 second=1088 amount=-1 +kerning first=112 second=8221 amount=-2 +kerning first=86 second=365 amount=-1 +kerning first=289 second=117 amount=-1 +kerning first=274 second=203 amount=-1 +kerning first=1027 second=1079 amount=-1 +kerning first=213 second=260 amount=-1 +kerning first=253 second=117 amount=-1 +kerning first=217 second=117 amount=-1 +kerning first=346 second=203 amount=-1 +kerning first=366 second=100 amount=-1 +kerning first=1057 second=1117 amount=-1 +kerning first=74 second=220 amount=-1 +kerning first=330 second=100 amount=-1 +kerning first=202 second=203 amount=-1 +kerning first=367 second=246 amount=-1 +kerning first=115 second=108 amount=-1 +kerning first=196 second=121 amount=-1 +kerning first=1048 second=1025 amount=-1 +kerning first=366 second=65 amount=-1 +kerning first=86 second=171 amount=-2 +kerning first=68 second=298 amount=-1 +kerning first=290 second=330 amount=-1 +kerning first=352 second=77 amount=-1 +kerning first=103 second=8222 amount=-1 +kerning first=362 second=325 amount=-1 +kerning first=364 second=103 amount=-1 +kerning first=67 second=8222 amount=-1 +kerning first=198 second=251 amount=-1 +kerning first=328 second=103 amount=-1 +kerning first=280 second=77 amount=-1 +kerning first=8216 second=364 amount=-1 +kerning first=234 second=251 amount=-1 +kerning first=364 second=325 amount=-1 +kerning first=280 second=304 amount=-1 +kerning first=220 second=103 amount=-1 +kerning first=291 second=324 amount=-1 +kerning first=212 second=317 amount=-1 +kerning first=218 second=330 amount=-1 +kerning first=282 second=75 amount=-1 +kerning first=235 second=277 amount=-1 +kerning first=115 second=103 amount=-1 +kerning first=323 second=220 amount=-1 +kerning first=67 second=304 amount=-1 +kerning first=267 second=369 amount=-1 +kerning first=291 second=109 amount=-1 +kerning first=221 second=227 amount=-1 +kerning first=356 second=281 amount=-1 +kerning first=324 second=333 amount=-1 +kerning first=1041 second=1091 amount=-1 +kerning first=327 second=109 amount=-1 +kerning first=70 second=68 amount=-1 +kerning first=1048 second=1092 amount=-1 +kerning first=344 second=211 amount=-1 +kerning first=219 second=109 amount=-1 +kerning first=211 second=68 amount=-1 +kerning first=352 second=8222 amount=-1 +kerning first=252 second=333 amount=-1 +kerning first=257 second=316 amount=-1 +kerning first=362 second=205 amount=-1 +kerning first=1060 second=1048 amount=-1 +kerning first=280 second=8222 amount=-1 +kerning first=8222 second=113 amount=-1 +kerning first=204 second=382 amount=-1 +kerning first=244 second=8222 amount=-1 +kerning first=1047 second=1064 amount=-1 +kerning first=200 second=211 amount=-1 +kerning first=240 second=382 amount=-1 +kerning first=289 second=112 amount=-1 +kerning first=325 second=323 amount=-1 +kerning first=199 second=210 amount=-1 +kerning first=1049 second=1024 amount=-1 +kerning first=204 second=315 amount=-1 +kerning first=281 second=251 amount=-1 +kerning first=233 second=339 amount=-1 +kerning first=214 second=221 amount=-1 +kerning first=77 second=111 amount=-1 +kerning first=266 second=229 amount=-1 +kerning first=368 second=245 amount=-1 +kerning first=117 second=233 amount=-1 +kerning first=218 second=111 amount=-1 +kerning first=296 second=245 amount=-1 +kerning first=78 second=109 amount=-1 +kerning first=1039 second=1057 amount=-1 +kerning first=84 second=44 amount=-1 +kerning first=8222 second=213 amount=-1 +kerning first=287 second=120 amount=-1 +kerning first=305 second=339 amount=-1 +kerning first=82 second=290 amount=-1 +kerning first=214 second=219 amount=-1 +kerning first=269 second=339 amount=-1 +kerning first=73 second=219 amount=-1 +kerning first=330 second=233 amount=-1 +kerning first=8218 second=71 amount=-1 +kerning first=1058 second=1118 amount=-1 +kerning first=366 second=233 amount=-1 +kerning first=65 second=374 amount=-1 +kerning first=201 second=332 amount=-1 +kerning first=209 second=298 amount=-1 +kerning first=84 second=224 amount=-1 +kerning first=325 second=212 amount=-1 +kerning first=117 second=277 amount=-1 +kerning first=224 second=8217 amount=-2 +kerning first=364 second=283 amount=-1 +kerning first=1056 second=1104 amount=-1 +kerning first=260 second=8217 amount=-2 +kerning first=8222 second=121 amount=-1 +kerning first=355 second=228 amount=-1 +kerning first=352 second=369 amount=-1 +kerning first=281 second=357 amount=-1 +kerning first=283 second=8217 amount=-2 +kerning first=217 second=212 amount=-1 +kerning first=83 second=8217 amount=-1 +kerning first=352 second=85 amount=-1 +kerning first=325 second=101 amount=-1 +kerning first=8250 second=65 amount=-1 +kerning first=224 second=245 amount=-1 +kerning first=326 second=111 amount=-1 +kerning first=280 second=85 amount=-1 +kerning first=362 second=111 amount=-1 +kerning first=1051 second=1054 amount=-1 +kerning first=332 second=8217 amount=-2 +kerning first=368 second=8217 amount=-1 +kerning first=199 second=331 amount=-1 +kerning first=67 second=85 amount=-1 +kerning first=230 second=289 amount=-1 +kerning first=89 second=216 amount=-1 +kerning first=304 second=67 amount=-1 +kerning first=70 second=241 amount=-1 +kerning first=1051 second=1075 amount=-1 +kerning first=194 second=216 amount=-1 +kerning first=77 second=209 amount=-1 +kerning first=350 second=366 amount=-1 +kerning first=221 second=262 amount=-1 +kerning first=268 second=67 amount=-1 +kerning first=220 second=195 amount=-1 +kerning first=74 second=274 amount=-1 +kerning first=266 second=216 amount=-1 +kerning first=232 second=113 amount=-1 +kerning first=298 second=79 amount=-1 +kerning first=1041 second=1049 amount=-1 +kerning first=8222 second=286 amount=-1 +kerning first=278 second=366 amount=-1 +kerning first=268 second=113 amount=-1 +kerning first=196 second=67 amount=-1 +kerning first=70 second=216 amount=-1 +kerning first=370 second=79 amount=-1 +kerning first=79 second=195 amount=-1 +kerning first=302 second=216 amount=-1 +kerning first=364 second=195 amount=-1 +kerning first=1041 second=1113 amount=-1 +kerning first=235 second=104 amount=-1 +kerning first=263 second=225 amount=-1 +kerning first=8217 second=365 amount=-1 +kerning first=72 second=206 amount=-1 +kerning first=280 second=250 amount=-1 +kerning first=1069 second=1071 amount=-1 +kerning first=81 second=46 amount=-1 +kerning first=65 second=253 amount=-1 +kerning first=221 second=261 amount=-1 +kerning first=199 second=104 amount=-1 +kerning first=209 second=357 amount=-1 +kerning first=70 second=70 amount=-1 +kerning first=8218 second=257 amount=-1 +kerning first=251 second=345 amount=-1 +kerning first=1048 second=1084 amount=-1 +kerning first=287 second=345 amount=-1 +kerning first=365 second=335 amount=-1 +kerning first=323 second=274 amount=-1 +kerning first=323 second=345 amount=-1 +kerning first=258 second=46 amount=-1 +kerning first=352 second=250 amount=-1 +kerning first=222 second=46 amount=-1 +kerning first=202 second=368 amount=-1 +kerning first=346 second=201 amount=-1 +kerning first=283 second=122 amount=-1 +kerning first=77 second=271 amount=-1 +kerning first=79 second=8221 amount=-2 +kerning first=274 second=368 amount=-1 +kerning first=304 second=213 amount=-1 +kerning first=323 second=207 amount=-1 +kerning first=245 second=46 amount=-1 +kerning first=274 second=201 amount=-1 +kerning first=310 second=368 amount=-1 +kerning first=268 second=213 amount=-1 +kerning first=277 second=107 amount=-1 +kerning first=8222 second=281 amount=-1 +kerning first=70 second=122 amount=-1 +kerning first=202 second=201 amount=-1 +kerning first=103 second=250 amount=-1 +kerning first=99 second=369 amount=-1 +kerning first=256 second=8221 amount=-2 +kerning first=103 second=275 amount=-1 +kerning first=263 second=311 amount=-1 +kerning first=209 second=187 amount=-1 +kerning first=328 second=8221 amount=-2 +kerning first=269 second=326 amount=-1 +kerning first=217 second=204 amount=-1 +kerning first=203 second=252 amount=-1 +kerning first=364 second=8221 amount=-1 +kerning first=374 second=216 amount=-1 +kerning first=198 second=8217 amount=-1 +kerning first=323 second=45 amount=-1 +kerning first=344 second=336 amount=-1 +kerning first=202 second=116 amount=-1 +kerning first=362 second=271 amount=-1 +kerning first=346 second=368 amount=-1 +kerning first=74 second=207 amount=-1 +kerning first=327 second=378 amount=-1 +kerning first=1054 second=1041 amount=-1 +kerning first=325 second=204 amount=-1 +kerning first=291 second=378 amount=-1 +kerning first=80 second=262 amount=-1 +kerning first=362 second=198 amount=-1 +kerning first=87 second=8218 amount=-2 +kerning first=220 second=268 amount=-1 +kerning first=1068 second=1068 amount=-1 +kerning first=187 second=86 amount=-2 +kerning first=89 second=235 amount=-1 +kerning first=339 second=103 amount=-1 +kerning first=323 second=347 amount=-1 +kerning first=82 second=86 amount=-1 +kerning first=364 second=268 amount=-1 +kerning first=230 second=235 amount=-1 +kerning first=287 second=347 amount=-1 +kerning first=266 second=235 amount=-1 +kerning first=302 second=235 amount=-1 +kerning first=209 second=290 amount=-1 +kerning first=67 second=77 amount=-1 +kerning first=74 second=347 amount=-1 +kerning first=262 second=350 amount=-1 +kerning first=374 second=235 amount=-1 +kerning first=218 second=198 amount=-1 +kerning first=1060 second=1056 amount=-1 +kerning first=196 second=213 amount=-1 +kerning first=281 second=245 amount=-1 +kerning first=85 second=350 amount=-1 +kerning first=1065 second=1077 amount=-1 +kerning first=86 second=363 amount=-1 +kerning first=199 second=277 amount=-1 +kerning first=1058 second=1073 amount=-1 +kerning first=8217 second=225 amount=-1 +kerning first=8217 second=378 amount=-1 +kerning first=263 second=363 amount=-1 +kerning first=362 second=213 amount=-1 +kerning first=1033 second=1062 amount=-1 +kerning first=298 second=350 amount=-1 +kerning first=307 second=277 amount=-1 +kerning first=271 second=277 amount=-1 +kerning first=362 second=366 amount=-1 +kerning first=1118 second=1087 amount=-1 +kerning first=67 second=231 amount=-1 +kerning first=85 second=79 amount=-1 +kerning first=104 second=244 amount=-1 +kerning first=362 second=338 amount=-1 +kerning first=209 second=244 amount=-1 +kerning first=8222 second=267 amount=-1 +kerning first=356 second=283 amount=-1 +kerning first=199 second=8249 amount=-1 +kerning first=281 second=244 amount=-1 +kerning first=210 second=82 amount=-1 +kerning first=316 second=231 amount=-1 +kerning first=268 second=286 amount=-1 +kerning first=218 second=338 amount=-1 +kerning first=212 second=354 amount=-1 +kerning first=304 second=286 amount=-1 +kerning first=87 second=351 amount=-1 +kerning first=282 second=82 amount=-1 +kerning first=307 second=8249 amount=-1 +kerning first=8222 second=289 amount=-1 +kerning first=258 second=8249 amount=-1 +kerning first=100 second=235 amount=-1 +kerning first=204 second=79 amount=-1 +kerning first=85 second=66 amount=-1 +kerning first=370 second=283 amount=-1 +kerning first=81 second=209 amount=-1 +kerning first=205 second=235 amount=-1 +kerning first=45 second=209 amount=-1 +kerning first=78 second=248 amount=-1 +kerning first=304 second=366 amount=-1 +kerning first=298 second=283 amount=-1 +kerning first=277 second=235 amount=-1 +kerning first=70 second=371 amount=-1 +kerning first=325 second=331 amount=-1 +kerning first=74 second=261 amount=-1 +kerning first=226 second=283 amount=-1 +kerning first=262 second=283 amount=-1 +kerning first=1039 second=1076 amount=-1 +kerning first=1042 second=1067 amount=-1 +kerning first=1038 second=1080 amount=-1 +kerning first=103 second=380 amount=-1 +kerning first=244 second=380 amount=-1 +kerning first=45 second=374 amount=-2 +kerning first=1062 second=1076 amount=-1 +kerning first=370 second=66 amount=-1 +kerning first=366 second=209 amount=-1 +kerning first=334 second=66 amount=-1 +kerning first=73 second=46 amount=-1 +kerning first=80 second=213 amount=-1 +kerning first=330 second=209 amount=-1 +kerning first=298 second=66 amount=-1 +kerning first=262 second=66 amount=-1 +kerning first=266 second=270 amount=-1 +kerning first=302 second=270 amount=-1 +kerning first=258 second=336 amount=-1 +kerning first=199 second=323 amount=-1 +kerning first=287 second=242 amount=-1 +kerning first=287 second=44 amount=-1 +kerning first=218 second=252 amount=-1 +kerning first=330 second=336 amount=-1 +kerning first=68 second=192 amount=-1 +kerning first=366 second=336 amount=-1 +kerning first=1067 second=1045 amount=-1 +kerning first=1031 second=1045 amount=-1 +kerning first=67 second=380 amount=-1 +kerning first=362 second=252 amount=-1 +kerning first=286 second=220 amount=-1 +kerning first=116 second=187 amount=-1 +kerning first=187 second=205 amount=-1 +kerning first=220 second=244 amount=-1 +kerning first=305 second=231 amount=-1 +kerning first=296 second=201 amount=-1 +kerning first=327 second=218 amount=-1 +kerning first=363 second=248 amount=-1 +kerning first=220 second=214 amount=-1 +kerning first=366 second=371 amount=-1 +kerning first=212 second=115 amount=-1 +kerning first=258 second=290 amount=-1 +kerning first=375 second=104 amount=-1 +kerning first=328 second=244 amount=-1 +kerning first=1041 second=1071 amount=-1 +kerning first=1042 second=1039 amount=-1 +kerning first=364 second=244 amount=-1 +kerning first=1055 second=1045 amount=-1 +kerning first=219 second=218 amount=-1 +kerning first=219 second=248 amount=-1 +kerning first=364 second=214 amount=-1 +kerning first=233 second=231 amount=-1 +kerning first=1055 second=1083 amount=-1 +kerning first=291 second=248 amount=-1 +kerning first=269 second=231 amount=-1 +kerning first=83 second=201 amount=-1 +kerning first=1041 second=1041 amount=-1 +kerning first=97 second=314 amount=-1 +kerning first=255 second=353 amount=-1 +kerning first=228 second=275 amount=-1 +kerning first=275 second=243 amount=-1 +kerning first=235 second=353 amount=-1 +kerning first=1066 second=1049 amount=-1 +kerning first=221 second=8220 amount=-1 +kerning first=307 second=279 amount=-1 +kerning first=264 second=275 amount=-1 +kerning first=74 second=68 amount=-1 +kerning first=241 second=45 amount=-1 +kerning first=65 second=71 amount=-1 +kerning first=1055 second=1081 amount=-1 +kerning first=100 second=45 amount=-1 +kerning first=1091 second=1081 amount=-1 +kerning first=281 second=249 amount=-1 +kerning first=87 second=275 amount=-1 +kerning first=85 second=302 amount=-1 +kerning first=108 second=363 amount=-1 +kerning first=207 second=284 amount=-1 +kerning first=1042 second=1119 amount=-1 +kerning first=199 second=353 amount=-1 +kerning first=80 second=370 amount=-1 +kerning first=199 second=223 amount=-1 +kerning first=203 second=80 amount=-1 +kerning first=267 second=347 amount=-1 +kerning first=74 second=116 amount=-1 +kerning first=268 second=232 amount=-1 +kerning first=345 second=44 amount=-1 +kerning first=1050 second=1098 amount=-1 +kerning first=232 second=232 amount=-1 +kerning first=196 second=362 amount=-1 +kerning first=207 second=200 amount=-1 +kerning first=268 second=362 amount=-1 +kerning first=86 second=225 amount=-1 +kerning first=67 second=226 amount=-1 +kerning first=195 second=266 amount=-1 +kerning first=66 second=200 amount=-1 +kerning first=286 second=8250 amount=-1 +kerning first=304 second=232 amount=-1 +kerning first=304 second=362 amount=-1 +kerning first=85 second=296 amount=-1 +kerning first=101 second=234 amount=-1 +kerning first=278 second=71 amount=-1 +kerning first=278 second=209 amount=-1 +kerning first=8222 second=262 amount=-1 +kerning first=334 second=296 amount=-1 +kerning first=327 second=71 amount=-1 +kerning first=8217 second=279 amount=-1 +kerning first=1054 second=1031 amount=-1 +kerning first=75 second=223 amount=-1 +kerning first=230 second=318 amount=-1 +kerning first=206 second=71 amount=-1 +kerning first=298 second=296 amount=-1 +kerning first=85 second=283 amount=-1 +kerning first=262 second=296 amount=-1 +kerning first=314 second=234 amount=-1 +kerning first=74 second=219 amount=-1 +kerning first=201 second=206 amount=-1 +kerning first=1056 second=1037 amount=-1 +kerning first=219 second=8220 amount=-1 +kerning first=268 second=72 amount=-1 +kerning first=1043 second=1089 amount=-1 +kerning first=323 second=315 amount=-1 +kerning first=106 second=287 amount=-1 +kerning first=212 second=313 amount=-1 +kerning first=291 second=8220 amount=-2 +kerning first=229 second=111 amount=-1 +kerning first=116 second=267 amount=-1 +kerning first=355 second=287 amount=-1 +kerning first=279 second=254 amount=-1 +kerning first=194 second=213 amount=-1 +kerning first=327 second=8220 amount=-1 +kerning first=304 second=72 amount=-1 +kerning first=283 second=287 amount=-1 +kerning first=334 second=88 amount=-1 +kerning first=1060 second=1024 amount=-1 +kerning first=202 second=298 amount=-1 +kerning first=71 second=313 amount=-1 +kerning first=74 second=315 amount=-1 +kerning first=262 second=120 amount=-1 +kerning first=213 second=85 amount=-1 +kerning first=365 second=267 amount=-1 +kerning first=330 second=263 amount=-1 +kerning first=366 second=263 amount=-1 +kerning first=370 second=120 amount=-1 +kerning first=1059 second=1028 amount=-1 +kerning first=214 second=278 amount=-1 +kerning first=187 second=118 amount=-1 +kerning first=221 second=267 amount=-1 +kerning first=296 second=114 amount=-1 +kerning first=1047 second=1083 amount=-1 +kerning first=217 second=278 amount=-1 +kerning first=195 second=212 amount=-1 +kerning first=114 second=8220 amount=-1 +kerning first=73 second=278 amount=-1 +kerning first=72 second=334 amount=-1 +kerning first=88 second=81 amount=-1 +kerning first=119 second=114 amount=-1 +kerning first=354 second=45 amount=-1 +kerning first=264 second=115 amount=-1 +kerning first=286 second=278 amount=-1 +kerning first=1062 second=1092 amount=-1 +kerning first=224 second=114 amount=-1 +kerning first=296 second=331 amount=-1 +kerning first=255 second=367 amount=-1 +kerning first=217 second=199 amount=-1 +kerning first=117 second=263 amount=-1 +kerning first=368 second=331 amount=-1 +kerning first=87 second=115 amount=-1 +kerning first=83 second=114 amount=-1 +kerning first=193 second=81 amount=-1 +kerning first=219 second=194 amount=-1 +kerning first=325 second=199 amount=-1 +kerning first=1062 second=1116 amount=-1 +kerning first=368 second=363 amount=-1 +kerning first=277 second=365 amount=-1 +kerning first=354 second=74 amount=-1 +kerning first=325 second=310 amount=-1 +kerning first=65 second=361 amount=-1 +kerning first=1042 second=1095 amount=-1 +kerning first=108 second=106 amount=-1 +kerning first=288 second=203 amount=-1 +kerning first=217 second=310 amount=-1 +kerning first=350 second=361 amount=-1 +kerning first=364 second=251 amount=-1 +kerning first=235 second=269 amount=-1 +kerning first=271 second=269 amount=-1 +kerning first=83 second=8221 amount=-1 +kerning first=206 second=288 amount=-1 +kerning first=1052 second=1036 amount=-1 +kerning first=213 second=65 amount=-1 +kerning first=197 second=334 amount=-1 +kerning first=366 second=282 amount=-1 +kerning first=330 second=282 amount=-1 +kerning first=200 second=78 amount=-1 +kerning first=207 second=230 amount=-1 +kerning first=259 second=246 amount=-1 +kerning first=278 second=288 amount=-1 +kerning first=310 second=355 amount=-1 +kerning first=1059 second=1101 amount=-1 +kerning first=1060 second=1043 amount=-1 +kerning first=203 second=284 amount=-1 +kerning first=77 second=325 amount=-1 +kerning first=1068 second=1055 amount=-1 +kerning first=81 second=282 amount=-1 +kerning first=246 second=318 amount=-1 +kerning first=84 second=242 amount=-1 +kerning first=263 second=187 amount=-1 +kerning first=199 second=75 amount=-1 +kerning first=8217 second=333 amount=-1 +kerning first=205 second=346 amount=-1 +kerning first=65 second=288 amount=-1 +kerning first=197 second=87 amount=-1 +kerning first=290 second=325 amount=-1 +kerning first=267 second=291 amount=-1 +kerning first=315 second=220 amount=-1 +kerning first=226 second=337 amount=-1 +kerning first=355 second=187 amount=-1 +kerning first=118 second=251 amount=-1 +kerning first=1055 second=1051 amount=-1 +kerning first=187 second=251 amount=-1 +kerning first=251 second=287 amount=-1 +kerning first=263 second=279 amount=-1 +kerning first=283 second=187 amount=-1 +kerning first=105 second=245 amount=-1 +kerning first=85 second=337 amount=-1 +kerning first=246 second=8217 amount=-2 +kerning first=282 second=8217 amount=-1 +kerning first=354 second=8217 amount=-1 +kerning first=250 second=171 amount=-1 +kerning first=100 second=99 amount=-1 +kerning first=8222 second=232 amount=-1 +kerning first=67 second=99 amount=-1 +kerning first=192 second=221 amount=-1 +kerning first=205 second=75 amount=-1 +kerning first=277 second=99 amount=-1 +kerning first=211 second=187 amount=-1 +kerning first=354 second=245 amount=-1 +kerning first=1071 second=1119 amount=-1 +kerning first=227 second=279 amount=-1 +kerning first=45 second=68 amount=-1 +kerning first=298 second=337 amount=-1 +kerning first=205 second=99 amount=-1 +kerning first=106 second=187 amount=-1 +kerning first=262 second=337 amount=-1 +kerning first=241 second=99 amount=-1 +kerning first=364 second=261 amount=-1 +kerning first=262 second=242 amount=-1 +kerning first=364 second=73 amount=-1 +kerning first=1071 second=1043 amount=-1 +kerning first=1070 second=1043 amount=-1 +kerning first=298 second=242 amount=-1 +kerning first=302 second=99 amount=-1 +kerning first=1059 second=1082 amount=-1 +kerning first=209 second=281 amount=-1 +kerning first=270 second=86 amount=-1 +kerning first=259 second=281 amount=-1 +kerning first=226 second=242 amount=-1 +kerning first=204 second=347 amount=-1 +kerning first=367 second=281 amount=-1 +kerning first=261 second=382 amount=-1 +kerning first=99 second=347 amount=-1 +kerning first=370 second=242 amount=-1 +kerning first=209 second=268 amount=-1 +kerning first=374 second=99 amount=-1 +kerning first=106 second=233 amount=-1 +kerning first=76 second=364 amount=-1 +kerning first=220 second=120 amount=-1 +kerning first=264 second=202 amount=-1 +kerning first=219 second=77 amount=-1 +kerning first=296 second=277 amount=-1 +kerning first=78 second=77 amount=-1 +kerning first=8218 second=199 amount=-1 +kerning first=282 second=264 amount=-1 +kerning first=70 second=233 amount=-1 +kerning first=224 second=277 amount=-1 +kerning first=79 second=73 amount=-1 +kerning first=283 second=233 amount=-1 +kerning first=220 second=73 amount=-1 +kerning first=1049 second=1056 amount=-1 +kerning first=368 second=277 amount=-1 +kerning first=69 second=264 amount=-1 +kerning first=271 second=8217 amount=-1 +kerning first=199 second=82 amount=-1 +kerning first=307 second=8217 amount=-1 +kerning first=355 second=233 amount=-1 +kerning first=325 second=364 amount=-1 +kerning first=213 second=193 amount=-1 +kerning first=379 second=8217 amount=-1 +kerning first=73 second=224 amount=-1 +kerning first=281 second=108 amount=-1 +kerning first=220 second=290 amount=-1 +kerning first=80 second=69 amount=-1 +kerning first=217 second=364 amount=-1 +kerning first=8250 second=114 amount=-1 +kerning first=199 second=8217 amount=-1 +kerning first=252 second=283 amount=-1 +kerning first=235 second=8217 amount=-2 +kerning first=1056 second=1091 amount=-1 +kerning first=245 second=108 amount=-1 +kerning first=207 second=338 amount=-1 +kerning first=202 second=355 amount=-1 +kerning first=195 second=255 amount=-1 +kerning first=1042 second=1113 amount=-1 +kerning first=353 second=108 amount=-1 +kerning first=1047 second=1061 amount=-1 +kerning first=67 second=334 amount=-1 +kerning first=84 second=273 amount=-1 +kerning first=80 second=286 amount=-1 +kerning first=89 second=99 amount=-1 +kerning first=211 second=347 amount=-1 +kerning first=275 second=351 amount=-1 +kerning first=272 second=78 amount=-1 +kerning first=364 second=8220 amount=-1 +kerning first=1064 second=1070 amount=-1 +kerning first=221 second=286 amount=-1 +kerning first=213 second=87 amount=-1 +kerning first=310 second=171 amount=-1 +kerning first=86 second=333 amount=-1 +kerning first=263 second=112 amount=-1 +kerning first=346 second=171 amount=-1 +kerning first=1030 second=1095 amount=-1 +kerning first=75 second=365 amount=-1 +kerning first=382 second=171 amount=-1 +kerning first=289 second=307 amount=-1 +kerning first=263 second=333 amount=-1 +kerning first=196 second=254 amount=-1 +kerning first=66 second=71 amount=-1 +kerning first=232 second=254 amount=-1 +kerning first=252 second=269 amount=-1 +kerning first=227 second=333 amount=-1 +kerning first=65 second=117 amount=-1 +kerning first=106 second=263 amount=-1 +kerning first=350 second=117 amount=-1 +kerning first=314 second=117 amount=-1 +kerning first=195 second=374 amount=-1 +kerning first=1071 second=1100 amount=-1 +kerning first=79 second=298 amount=-1 +kerning first=278 second=117 amount=-1 +kerning first=1070 second=1067 amount=-1 +kerning first=97 second=171 amount=-1 +kerning first=1058 second=1083 amount=-1 +kerning first=283 second=100 amount=-1 +kerning first=278 second=212 amount=-1 +kerning first=283 second=263 amount=-1 +kerning first=202 second=171 amount=-1 +kerning first=1052 second=1039 amount=-1 +kerning first=355 second=263 amount=-1 +kerning first=1071 second=1117 amount=-1 +kerning first=274 second=171 amount=-1 +kerning first=345 second=229 amount=-1 +kerning first=1047 second=1118 amount=-1 +kerning first=274 second=206 amount=-1 +kerning first=45 second=82 amount=-1 +kerning first=229 second=382 amount=-1 +kerning first=202 second=206 amount=-1 +kerning first=207 second=330 amount=-1 +kerning first=79 second=353 amount=-1 +kerning first=232 second=316 amount=-1 +kerning first=234 second=246 amount=-1 +kerning first=327 second=77 amount=-1 +kerning first=70 second=100 amount=-1 +kerning first=375 second=103 amount=-1 +kerning first=1048 second=1060 amount=-1 +kerning first=196 second=316 amount=-1 +kerning first=121 second=120 amount=-1 +kerning first=1071 second=1077 amount=-1 +kerning first=68 second=8221 amount=-2 +kerning first=66 second=330 amount=-1 +kerning first=268 second=316 amount=-1 +kerning first=70 second=263 amount=-1 +kerning first=346 second=206 amount=-1 +kerning first=104 second=8221 amount=-2 +kerning first=267 second=103 amount=-1 +kerning first=103 second=109 amount=-1 +kerning first=1049 second=1048 amount=-1 +kerning first=234 second=8218 amount=-1 +kerning first=89 second=194 amount=-1 +kerning first=231 second=103 amount=-1 +kerning first=198 second=8218 amount=-1 +kerning first=209 second=8221 amount=-1 +kerning first=304 second=74 amount=-1 +kerning first=366 second=68 amount=-1 +kerning first=245 second=8221 amount=-2 +kerning first=67 second=109 amount=-1 +kerning first=241 second=113 amount=-1 +kerning first=193 second=217 amount=-1 +kerning first=281 second=8221 amount=-2 +kerning first=284 second=313 amount=-1 +kerning first=81 second=68 amount=-1 +kerning first=353 second=8221 amount=-2 +kerning first=270 second=8218 amount=-1 +kerning first=364 second=205 amount=-1 +kerning first=219 second=85 amount=-1 +kerning first=296 second=223 amount=-1 +kerning first=74 second=98 amount=-1 +kerning first=67 second=280 amount=-1 +kerning first=282 second=210 amount=-1 +kerning first=103 second=326 amount=-1 +kerning first=78 second=85 amount=-1 +kerning first=350 second=8250 amount=-1 +kerning first=1064 second=1057 amount=-1 +kerning first=205 second=66 amount=-1 +kerning first=287 second=98 amount=-1 +kerning first=327 second=302 amount=-1 +kerning first=1044 second=1081 amount=-1 +kerning first=219 second=302 amount=-1 +kerning first=69 second=210 amount=-1 +kerning first=368 second=223 amount=-1 +kerning first=330 second=339 amount=-1 +kerning first=73 second=243 amount=-1 +kerning first=259 second=335 amount=-1 +kerning first=355 second=99 amount=-1 +kerning first=280 second=280 amount=-1 +kerning first=365 second=232 amount=-1 +kerning first=74 second=350 amount=-1 +kerning first=78 second=302 amount=-1 +kerning first=366 second=339 amount=-1 +kerning first=194 second=107 amount=-1 +kerning first=109 second=243 amount=-1 +kerning first=250 second=243 amount=-1 +kerning first=117 second=339 amount=-1 +kerning first=367 second=335 amount=-1 +kerning first=83 second=223 amount=-1 +kerning first=1056 second=1055 amount=-1 +kerning first=8222 second=316 amount=-1 +kerning first=274 second=363 amount=-1 +kerning first=323 second=350 amount=-1 +kerning first=66 second=284 amount=-1 +kerning first=80 second=232 amount=-1 +kerning first=364 second=344 amount=-1 +kerning first=346 second=363 amount=-1 +kerning first=364 second=298 amount=-1 +kerning first=296 second=355 amount=-1 +kerning first=368 second=8249 amount=-2 +kerning first=198 second=357 amount=-1 +kerning first=332 second=46 amount=-1 +kerning first=257 second=232 amount=-1 +kerning first=204 second=76 amount=-1 +kerning first=221 second=232 amount=-1 +kerning first=1065 second=1072 amount=-1 +kerning first=100 second=289 amount=-1 +kerning first=234 second=357 amount=-1 +kerning first=352 second=323 amount=-1 +kerning first=79 second=344 amount=-1 +kerning first=217 second=234 amount=-1 +kerning first=1050 second=1114 amount=-1 +kerning first=1055 second=1027 amount=-1 +kerning first=325 second=234 amount=-1 +kerning first=277 second=289 amount=-1 +kerning first=187 second=354 amount=-1 +kerning first=289 second=234 amount=-1 +kerning first=241 second=289 amount=-1 +kerning first=1049 second=1054 amount=-1 +kerning first=83 second=8249 amount=-1 +kerning first=327 second=85 amount=-1 +kerning first=119 second=8249 amount=-1 +kerning first=1053 second=1108 amount=-1 +kerning first=304 second=262 amount=-1 +kerning first=106 second=46 amount=-1 +kerning first=202 second=280 amount=-1 +kerning first=350 second=204 amount=-1 +kerning first=323 second=79 amount=-1 +kerning first=205 second=216 amount=-1 +kerning first=8250 second=377 amount=-1 +kerning first=195 second=366 amount=-1 +kerning first=211 second=46 amount=-1 +kerning first=278 second=204 amount=-1 +kerning first=355 second=113 amount=-1 +kerning first=283 second=46 amount=-1 +kerning first=109 second=103 amount=-1 +kerning first=279 second=113 amount=-1 +kerning first=89 second=378 amount=-1 +kerning first=207 second=67 amount=-1 +kerning first=1073 second=1084 amount=-1 +kerning first=296 second=345 amount=-1 +kerning first=66 second=67 amount=-1 +kerning first=200 second=70 amount=-1 +kerning first=220 second=102 amount=-1 +kerning first=270 second=192 amount=-1 +kerning first=66 second=87 amount=-1 +kerning first=269 second=250 amount=-1 +kerning first=70 second=46 amount=-2 +kerning first=233 second=250 amount=-1 +kerning first=1056 second=1065 amount=-1 +kerning first=204 second=274 amount=-1 +kerning first=197 second=250 amount=-1 +kerning first=211 second=317 amount=-1 +kerning first=366 second=122 amount=-1 +kerning first=370 second=207 amount=-1 +kerning first=83 second=323 amount=-1 +kerning first=221 second=213 amount=-1 +kerning first=334 second=207 amount=-1 +kerning first=74 second=369 amount=-1 +kerning first=8250 second=106 amount=-1 +kerning first=330 second=122 amount=-1 +kerning first=272 second=70 amount=-1 +kerning first=1088 second=1093 amount=-1 +kerning first=287 second=369 amount=-1 +kerning first=291 second=108 amount=-1 +kerning first=8217 second=368 amount=-1 +kerning first=213 second=201 amount=-1 +kerning first=356 second=259 amount=-1 +kerning first=200 second=8217 amount=-1 +kerning first=207 second=113 amount=-1 +kerning first=305 second=8222 amount=-1 +kerning first=87 second=256 amount=-1 +kerning first=302 second=378 amount=-1 +kerning first=368 second=323 amount=-1 +kerning first=1066 second=1041 amount=-1 +kerning first=109 second=111 amount=-1 +kerning first=233 second=8222 amount=-1 +kerning first=1030 second=1041 amount=-1 +kerning first=72 second=201 amount=-1 +kerning first=85 second=207 amount=-1 +kerning first=230 second=378 amount=-1 +kerning first=296 second=323 amount=-1 +kerning first=104 second=231 amount=-1 +kerning first=8220 second=194 amount=-2 +kerning first=8222 second=362 amount=-1 +kerning first=70 second=317 amount=-1 +kerning first=206 second=204 amount=-1 +kerning first=298 second=207 amount=-1 +kerning first=310 second=119 amount=-1 +kerning first=196 second=262 amount=-1 +kerning first=262 second=207 amount=-1 +kerning first=374 second=378 amount=-1 +kerning first=263 second=314 amount=-1 +kerning first=197 second=284 amount=-1 +kerning first=227 second=314 amount=-1 +kerning first=234 second=369 amount=-1 +kerning first=1039 second=1081 amount=-1 +kerning first=366 second=111 amount=-1 +kerning first=198 second=369 amount=-1 +kerning first=362 second=355 amount=-1 +kerning first=67 second=201 amount=-1 +kerning first=70 second=366 amount=-1 +kerning first=368 second=116 amount=-1 +kerning first=366 second=204 amount=-1 +kerning first=80 second=198 amount=-1 +kerning first=1058 second=1105 amount=-1 +kerning first=335 second=314 amount=-1 +kerning first=1053 second=1084 amount=-1 +kerning first=330 second=204 amount=-1 +kerning first=221 second=198 amount=-1 +kerning first=296 second=116 amount=-1 +kerning first=197 second=363 amount=-1 +kerning first=73 second=317 amount=-1 +kerning first=268 second=210 amount=-1 +kerning first=233 second=363 amount=-1 +kerning first=68 second=207 amount=-1 +kerning first=304 second=210 amount=-1 +kerning first=366 second=378 amount=-1 +kerning first=269 second=363 amount=-1 +kerning first=209 second=207 amount=-1 +kerning first=196 second=210 amount=-1 +kerning first=325 second=268 amount=-1 +kerning first=214 second=317 amount=-1 +kerning first=1088 second=1078 amount=-1 +kerning first=286 second=317 amount=-1 +kerning first=211 second=366 amount=-1 +kerning first=86 second=67 amount=-1 +kerning first=85 second=101 amount=-1 +kerning first=69 second=213 amount=-1 +kerning first=347 second=8250 amount=-1 +kerning first=264 second=73 amount=-1 +kerning first=364 second=219 amount=-1 +kerning first=84 second=8220 amount=-1 +kerning first=275 second=8250 amount=-1 +kerning first=282 second=213 amount=-1 +kerning first=262 second=101 amount=-1 +kerning first=74 second=296 amount=-1 +kerning first=226 second=101 amount=-1 +kerning first=120 second=8220 amount=-1 +kerning first=203 second=8250 amount=-1 +kerning first=1062 second=1081 amount=-1 +kerning first=217 second=268 amount=-1 +kerning first=8216 second=362 amount=-1 +kerning first=220 second=219 amount=-1 +kerning first=317 second=354 amount=-1 +kerning first=268 second=298 amount=-1 +kerning first=298 second=101 amount=-1 +kerning first=225 second=8220 amount=-2 +kerning first=277 second=277 amount=-1 +kerning first=370 second=101 amount=-1 +kerning first=241 second=277 amount=-1 +kerning first=225 second=122 amount=-1 +kerning first=205 second=277 amount=-1 +kerning first=232 second=318 amount=-1 +kerning first=79 second=219 amount=-1 +kerning first=261 second=122 amount=-1 +kerning first=8222 second=264 amount=-1 +kerning first=81 second=204 amount=-1 +kerning first=45 second=204 amount=-1 +kerning first=80 second=345 amount=-1 +kerning first=323 second=296 amount=-1 +kerning first=1051 second=1072 amount=-1 +kerning first=84 second=122 amount=-1 +kerning first=207 second=273 amount=-1 +kerning first=88 second=79 amount=-1 +kerning first=324 second=235 amount=-1 +kerning first=227 second=287 amount=-1 +kerning first=100 second=277 amount=-1 +kerning first=206 second=283 amount=-1 +kerning first=366 second=231 amount=-1 +kerning first=101 second=283 amount=-1 +kerning first=72 second=338 amount=-1 +kerning first=333 second=8220 amount=-2 +kerning first=193 second=286 amount=-1 +kerning first=335 second=287 amount=-1 +kerning first=87 second=226 amount=-1 +kerning first=73 second=83 amount=-1 +kerning first=1039 second=1108 amount=-1 +kerning first=77 second=274 amount=-1 +kerning first=81 second=351 amount=-1 +kerning first=263 second=287 amount=-1 +kerning first=369 second=8220 amount=-1 +kerning first=366 second=351 amount=-1 +kerning first=330 second=351 amount=-1 +kerning first=264 second=226 amount=-1 +kerning first=73 second=290 amount=-1 +kerning first=1060 second=1065 amount=-1 +kerning first=1067 second=1047 amount=-1 +kerning first=88 second=286 amount=-1 +kerning first=364 second=192 amount=-1 +kerning first=1031 second=1047 amount=-1 +kerning first=365 second=171 amount=-1 +kerning first=219 second=44 amount=-2 +kerning first=99 second=244 amount=-1 +kerning first=205 second=70 amount=-1 +kerning first=1027 second=1090 amount=-1 +kerning first=362 second=274 amount=-1 +kerning first=1108 second=1103 amount=-1 +kerning first=220 second=192 amount=-1 +kerning first=8217 second=67 amount=-1 +kerning first=204 second=244 amount=-1 +kerning first=105 second=333 amount=-1 +kerning first=79 second=192 amount=-1 +kerning first=240 second=244 amount=-1 +kerning first=1055 second=1056 amount=-1 +kerning first=354 second=333 amount=-1 +kerning first=218 second=274 amount=-1 +kerning first=8250 second=203 amount=-1 +kerning first=85 second=74 amount=-1 +kerning first=1064 second=1069 amount=-1 +kerning first=80 second=171 amount=-1 +kerning first=116 second=171 amount=-1 +kerning first=264 second=100 amount=-1 +kerning first=1051 second=1099 amount=-1 +kerning first=352 second=201 amount=-1 +kerning first=1040 second=1060 amount=-1 +kerning first=193 second=252 amount=-1 +kerning first=298 second=74 amount=-1 +kerning first=221 second=171 amount=-2 +kerning first=280 second=201 amount=-1 +kerning first=257 second=171 amount=-1 +kerning first=370 second=74 amount=-1 +kerning first=74 second=269 amount=-1 +kerning first=110 second=269 amount=-1 +kerning first=117 second=231 amount=-1 +kerning first=267 second=8218 amount=-1 +kerning first=264 second=245 amount=-1 +kerning first=218 second=70 amount=-1 +kerning first=323 second=269 amount=-1 +kerning first=1047 second=1088 amount=-1 +kerning first=1078 second=1118 amount=-1 +kerning first=339 second=333 amount=-1 +kerning first=8218 second=253 amount=-1 +kerning first=251 second=269 amount=-1 +kerning first=8222 second=85 amount=-1 +kerning first=209 second=69 amount=-1 +kerning first=287 second=269 amount=-1 +kerning first=350 second=310 amount=-1 +kerning first=1036 second=1090 amount=-1 +kerning first=248 second=114 amount=-1 +kerning first=278 second=310 amount=-1 +kerning first=257 second=318 amount=-1 +kerning first=213 second=66 amount=-1 +kerning first=255 second=120 amount=-1 +kerning first=221 second=45 amount=-2 +kerning first=205 second=370 amount=-1 +kerning first=257 second=45 amount=-1 +kerning first=116 second=45 amount=-1 +kerning first=86 second=260 amount=-1 +kerning first=313 second=370 amount=-1 +kerning first=365 second=45 amount=-1 +kerning first=217 second=214 amount=-1 +kerning first=1071 second=1097 amount=-1 +kerning first=1056 second=1062 amount=-1 +kerning first=66 second=382 amount=-1 +kerning first=262 second=362 amount=-1 +kerning first=87 second=199 amount=-1 +kerning first=261 second=275 amount=-1 +kerning first=221 second=252 amount=-1 +kerning first=225 second=275 amount=-1 +kerning first=205 second=223 amount=-1 +kerning first=1048 second=1028 amount=-1 +kerning first=8222 second=210 amount=-1 +kerning first=81 second=258 amount=-1 +kerning first=1062 second=1060 amount=-1 +kerning first=8222 second=84 amount=-1 +kerning first=205 second=97 amount=-1 +kerning first=354 second=267 amount=-1 +kerning first=104 second=234 amount=-1 +kerning first=203 second=251 amount=-1 +kerning first=209 second=234 amount=-1 +kerning first=45 second=79 amount=-1 +kerning first=8250 second=298 amount=-1 +kerning first=204 second=217 amount=-1 +kerning first=366 second=258 amount=-1 +kerning first=1039 second=1027 amount=-1 +kerning first=201 second=200 amount=-1 +kerning first=269 second=243 amount=-1 +kerning first=72 second=257 amount=-1 +kerning first=233 second=243 amount=-1 +kerning first=275 second=251 amount=-1 +kerning first=305 second=243 amount=-1 +kerning first=1068 second=1053 amount=-1 +kerning first=223 second=8221 amount=-2 +kerning first=116 second=225 amount=-1 +kerning first=203 second=206 amount=-1 +kerning first=80 second=72 amount=-1 +kerning first=110 second=242 amount=-1 +kerning first=259 second=8221 amount=-2 +kerning first=80 second=225 amount=-1 +kerning first=257 second=345 amount=-1 +kerning first=72 second=187 amount=-1 +kerning first=226 second=335 amount=-1 +kerning first=74 second=242 amount=-1 +kerning first=229 second=232 amount=-1 +kerning first=298 second=335 amount=-1 +kerning first=365 second=345 amount=-1 +kerning first=1039 second=1054 amount=-1 +kerning first=262 second=335 amount=-1 +kerning first=323 second=242 amount=-1 +kerning first=370 second=335 amount=-1 +kerning first=74 second=100 amount=-1 +kerning first=1052 second=1105 amount=-1 +kerning first=117 second=8249 amount=-1 +kerning first=251 second=242 amount=-1 +kerning first=281 second=234 amount=-1 +kerning first=217 second=241 amount=-1 +kerning first=286 second=344 amount=-1 +kerning first=1064 second=1096 amount=-1 +kerning first=282 second=249 amount=-1 +kerning first=113 second=8217 amount=-2 +kerning first=1028 second=1096 amount=-1 +kerning first=272 second=351 amount=-1 +kerning first=197 second=336 amount=-1 +kerning first=325 second=241 amount=-1 +kerning first=355 second=335 amount=-1 +kerning first=86 second=233 amount=-1 +kerning first=289 second=241 amount=-1 +kerning first=1051 second=1045 amount=-1 +kerning first=87 second=46 amount=-1 +kerning first=192 second=199 amount=-1 +kerning first=316 second=114 amount=-1 +kerning first=200 second=80 amount=-1 +kerning first=45 second=378 amount=-1 +kerning first=366 second=200 amount=-1 +kerning first=192 second=46 amount=-1 +kerning first=264 second=199 amount=-1 +kerning first=84 second=275 amount=-1 +kerning first=263 second=233 amount=-1 +kerning first=277 second=250 amount=-1 +kerning first=352 second=114 amount=-1 +kerning first=264 second=46 amount=-1 +kerning first=68 second=327 amount=-1 +kerning first=103 second=114 amount=-1 +kerning first=1058 second=1113 amount=-1 +kerning first=336 second=46 amount=-1 +kerning first=244 second=114 amount=-1 +kerning first=1060 second=1046 amount=-1 +kerning first=272 second=80 amount=-1 +kerning first=277 second=8222 amount=-1 +kerning first=214 second=344 amount=-1 +kerning first=206 second=310 amount=-1 +kerning first=209 second=327 amount=-1 +kerning first=220 second=327 amount=-1 +kerning first=364 second=336 amount=-1 +kerning first=1064 second=1062 amount=-1 +kerning first=217 second=361 amount=-1 +kerning first=67 second=114 amount=-1 +kerning first=120 second=8218 amount=-1 +kerning first=1104 second=1080 amount=-1 +kerning first=209 second=81 amount=-1 +kerning first=217 second=115 amount=-1 +kerning first=82 second=8221 amount=-1 +kerning first=253 second=115 amount=-1 +kerning first=118 second=8221 amount=-2 +kerning first=289 second=115 amount=-1 +kerning first=72 second=284 amount=-1 +kerning first=325 second=115 amount=-1 +kerning first=197 second=216 amount=-1 +kerning first=8250 second=284 amount=-1 +kerning first=266 second=331 amount=-1 +kerning first=378 second=8221 amount=-1 +kerning first=223 second=44 amount=-1 +kerning first=1033 second=1098 amount=-1 +kerning first=364 second=78 amount=-1 +kerning first=89 second=8249 amount=-2 +kerning first=204 second=352 amount=-1 +kerning first=187 second=204 amount=-1 +kerning first=194 second=8249 amount=-1 +kerning first=89 second=331 amount=-1 +kerning first=370 second=227 amount=-1 +kerning first=103 second=116 amount=-1 +kerning first=220 second=78 amount=-1 +kerning first=266 second=8249 amount=-1 +kerning first=86 second=380 amount=-1 +kerning first=69 second=72 amount=-1 +kerning first=298 second=227 amount=-1 +kerning first=8217 second=260 amount=-2 +kerning first=266 second=346 amount=-1 +kerning first=282 second=72 amount=-1 +kerning first=346 second=218 amount=-1 +kerning first=310 second=218 amount=-1 +kerning first=199 second=267 amount=-1 +kerning first=204 second=290 amount=-1 +kerning first=274 second=218 amount=-1 +kerning first=1048 second=1055 amount=-1 +kerning first=118 second=44 amount=-1 +kerning first=202 second=218 amount=-1 +kerning first=1043 second=1119 amount=-1 +kerning first=1069 second=1061 amount=-1 +kerning first=74 second=79 amount=-1 +kerning first=334 second=72 amount=-1 +kerning first=1060 second=1031 amount=-1 +kerning first=1058 second=1086 amount=-1 +kerning first=192 second=361 amount=-1 +kerning first=365 second=291 amount=-1 +kerning first=296 second=230 amount=-1 +kerning first=87 second=361 amount=-1 +kerning first=80 second=279 amount=-1 +kerning first=116 second=279 amount=-1 +kerning first=8217 second=235 amount=-1 +kerning first=302 second=346 amount=-1 +kerning first=1030 second=1056 amount=-1 +kerning first=116 second=291 amount=-1 +kerning first=262 second=227 amount=-1 +kerning first=353 second=8218 amount=-1 +kerning first=1057 second=1080 amount=-1 +kerning first=288 second=368 amount=-1 +kerning first=101 second=187 amount=-1 +kerning first=281 second=8218 amount=-1 +kerning first=1077 second=1095 amount=-1 +kerning first=85 second=227 amount=-1 +kerning first=198 second=8221 amount=-1 +kerning first=75 second=368 amount=-1 +kerning first=1046 second=1095 amount=-1 +kerning first=234 second=8221 amount=-2 +kerning first=196 second=84 amount=-1 +kerning first=289 second=269 amount=-1 +kerning first=87 second=8221 amount=-1 +kerning first=198 second=81 amount=-1 +kerning first=270 second=8221 amount=-2 +kerning first=101 second=337 amount=-1 +kerning first=1034 second=1079 amount=-1 +kerning first=1118 second=1095 amount=-1 +kerning first=68 second=8218 amount=-1 +kerning first=112 second=187 amount=-1 +kerning first=105 second=99 amount=-1 +kerning first=109 second=8220 amount=-2 +kerning first=262 second=200 amount=-1 +kerning first=67 second=75 amount=-1 +kerning first=362 second=44 amount=-2 +kerning first=245 second=8218 amount=-1 +kerning first=204 second=325 amount=-1 +kerning first=289 second=187 amount=-1 +kerning first=197 second=255 amount=-1 +kerning first=209 second=8218 amount=-1 +kerning first=325 second=187 amount=-1 +kerning first=217 second=187 amount=-2 +kerning first=85 second=200 amount=-1 +kerning first=205 second=211 amount=-1 +kerning first=187 second=71 amount=-1 +kerning first=89 second=8222 amount=-2 +kerning first=257 second=279 amount=-1 +kerning first=82 second=71 amount=-1 +kerning first=217 second=202 amount=-1 +kerning first=211 second=85 amount=-1 +kerning first=8217 second=233 amount=-1 +kerning first=221 second=279 amount=-1 +kerning first=259 second=337 amount=-1 +kerning first=352 second=75 amount=-1 +kerning first=327 second=211 amount=-1 +kerning first=111 second=316 amount=-1 +kerning first=45 second=90 amount=-1 +kerning first=74 second=362 amount=-1 +kerning first=8218 second=361 amount=-1 +kerning first=365 second=279 amount=-1 +kerning first=209 second=261 amount=-1 +kerning first=278 second=364 amount=-1 +kerning first=364 second=66 amount=-1 +kerning first=1070 second=1052 amount=-1 +kerning first=221 second=264 amount=-1 +kerning first=214 second=209 amount=-1 +kerning first=1034 second=1052 amount=-1 +kerning first=206 second=364 amount=-1 +kerning first=362 second=367 amount=-1 +kerning first=296 second=257 amount=-1 +kerning first=268 second=69 amount=-1 +kerning first=80 second=264 amount=-1 +kerning first=73 second=209 amount=-1 +kerning first=65 second=364 amount=-1 +kerning first=368 second=257 amount=-1 +kerning first=304 second=69 amount=-1 +kerning first=304 second=114 amount=-1 +kerning first=325 second=202 amount=-1 +kerning first=218 second=367 amount=-1 +kerning first=227 second=380 amount=-1 +kerning first=77 second=355 amount=-1 +kerning first=338 second=8249 amount=-1 +kerning first=264 second=334 amount=-1 +kerning first=374 second=8249 amount=-2 +kerning first=234 second=108 amount=-1 +kerning first=192 second=334 amount=-1 +kerning first=281 second=273 amount=-1 +kerning first=263 second=380 amount=-1 +kerning first=1064 second=1041 amount=-1 +kerning first=272 second=330 amount=-1 +kerning first=209 second=366 amount=-1 +kerning first=323 second=235 amount=-1 +kerning first=209 second=273 amount=-1 +kerning first=335 second=380 amount=-1 +kerning first=1053 second=1030 amount=-1 +kerning first=350 second=364 amount=-1 +kerning first=374 second=290 amount=-1 +kerning first=266 second=226 amount=-1 +kerning first=286 second=209 amount=-1 +kerning first=82 second=89 amount=-1 +kerning first=1034 second=1050 amount=-1 +kerning first=362 second=286 amount=-1 +kerning first=73 second=263 amount=-1 +kerning first=253 second=249 amount=-1 +kerning first=272 second=194 amount=-1 +kerning first=109 second=263 amount=-1 +kerning first=1027 second=1051 amount=-1 +kerning first=1070 second=1050 amount=-1 +kerning first=87 second=334 amount=-1 +kerning first=45 second=117 amount=-1 +kerning first=218 second=286 amount=-1 +kerning first=101 second=339 amount=-1 +kerning first=250 second=263 amount=-1 +kerning first=205 second=82 amount=-1 +kerning first=1041 second=1094 amount=-1 +kerning first=116 second=8221 amount=-1 +kerning first=1041 second=1039 amount=-1 +kerning first=368 second=203 amount=-1 +kerning first=325 second=229 amount=-1 +kerning first=87 second=332 amount=-1 +kerning first=8222 second=225 amount=-1 +kerning first=77 second=286 amount=-1 +kerning first=278 second=67 amount=-1 +kerning first=108 second=365 amount=-1 +kerning first=204 second=298 amount=-1 +kerning first=269 second=351 amount=-1 +kerning first=1067 second=1074 amount=-1 +kerning first=366 second=117 amount=-1 +kerning first=1064 second=1108 amount=-1 +kerning first=264 second=332 amount=-1 +kerning first=296 second=203 amount=-1 +kerning first=291 second=46 amount=-1 +kerning first=78 second=261 amount=-1 +kerning first=192 second=332 amount=-1 +kerning first=217 second=229 amount=-1 +kerning first=258 second=117 amount=-1 +kerning first=193 second=220 amount=-1 +kerning first=370 second=281 amount=-1 +kerning first=365 second=333 amount=-1 +kerning first=1091 second=1083 amount=-1 +kerning first=1036 second=1076 amount=-1 +kerning first=257 second=333 amount=-1 +kerning first=1070 second=1025 amount=-1 +kerning first=355 second=339 amount=-1 +kerning first=1036 second=1118 amount=-1 +kerning first=1034 second=1025 amount=-1 +kerning first=218 second=382 amount=-1 +kerning first=206 second=229 amount=-1 +kerning first=281 second=246 amount=-1 +kerning first=88 second=220 amount=-1 +kerning first=254 second=382 amount=-1 +kerning first=209 second=246 amount=-1 +kerning first=196 second=171 amount=-1 +kerning first=85 second=281 amount=-1 +kerning first=323 second=103 amount=-1 +kerning first=104 second=246 amount=-1 +kerning first=287 second=103 amount=-1 +kerning first=204 second=323 amount=-1 +kerning first=263 second=369 amount=-1 +kerning first=195 second=364 amount=-1 +kerning first=217 second=100 amount=-1 +kerning first=192 second=307 amount=-1 +kerning first=226 second=281 amount=-1 +kerning first=85 second=262 amount=-1 +kerning first=221 second=333 amount=-1 +kerning first=262 second=281 amount=-1 +kerning first=266 second=304 amount=-1 +kerning first=80 second=333 amount=-1 +kerning first=284 second=209 amount=-1 +kerning first=298 second=281 amount=-1 +kerning first=302 second=304 amount=-1 +kerning first=110 second=103 amount=-1 +kerning first=116 second=333 amount=-1 +kerning first=338 second=304 amount=-1 +kerning first=264 second=81 amount=-1 +kerning first=213 second=77 amount=-1 +kerning first=111 second=314 amount=-1 +kerning first=1108 second=1076 amount=-1 +kerning first=1053 second=1057 amount=-1 +kerning first=1043 second=1092 amount=-1 +kerning first=8217 second=229 amount=-1 +kerning first=217 second=256 amount=-1 +kerning first=362 second=313 amount=-1 +kerning first=97 second=245 amount=-1 +kerning first=203 second=85 amount=-1 +kerning first=264 second=280 amount=-1 +kerning first=346 second=8217 amount=-1 +kerning first=272 second=221 amount=-1 +kerning first=1048 second=1067 amount=-1 +kerning first=364 second=120 amount=-1 +kerning first=356 second=267 amount=-1 +kerning first=382 second=8217 amount=-1 +kerning first=221 second=210 amount=-1 +kerning first=344 second=221 amount=-1 +kerning first=68 second=315 amount=-1 +kerning first=218 second=313 amount=-1 +kerning first=1067 second=1101 amount=-1 +kerning first=290 second=313 amount=-1 +kerning first=283 second=339 amount=-1 +kerning first=192 second=44 amount=-1 +kerning first=80 second=210 amount=-1 +kerning first=99 second=248 amount=-1 +kerning first=368 second=230 amount=-1 +kerning first=77 second=313 amount=-1 +kerning first=336 second=8250 amount=-1 +kerning first=99 second=271 amount=-1 +kerning first=106 second=339 amount=-1 +kerning first=269 second=324 amount=-1 +kerning first=70 second=339 amount=-1 +kerning first=204 second=271 amount=-1 +kerning first=1039 second=1042 amount=-1 +kerning first=228 second=8250 amount=-1 +kerning first=304 second=111 amount=-1 +kerning first=8218 second=334 amount=-1 +kerning first=88 second=118 amount=-1 +kerning first=192 second=8250 amount=-1 +kerning first=187 second=357 amount=-1 +kerning first=1052 second=1117 amount=-1 +kerning first=262 second=254 amount=-1 +kerning first=87 second=8250 amount=-1 +kerning first=270 second=195 amount=-1 +kerning first=110 second=101 amount=-1 +kerning first=214 second=258 amount=-1 +kerning first=209 second=219 amount=-1 +kerning first=74 second=101 amount=-1 +kerning first=323 second=76 amount=-1 +kerning first=370 second=73 amount=-1 +kerning first=68 second=219 amount=-1 +kerning first=252 second=289 amount=-1 +kerning first=82 second=357 amount=-1 +kerning first=1031 second=1101 amount=-1 +kerning first=287 second=101 amount=-1 +kerning first=324 second=289 amount=-1 +kerning first=202 second=8217 amount=-1 +kerning first=1033 second=1065 amount=-1 +kerning first=251 second=101 amount=-1 +kerning first=339 second=111 amount=-1 +kerning first=274 second=8217 amount=-1 +kerning first=224 second=380 amount=-1 +kerning first=74 second=76 amount=-1 +kerning first=374 second=331 amount=-1 +kerning first=204 second=296 amount=-1 +kerning first=232 second=111 amount=-1 +kerning first=97 second=8217 amount=-2 +kerning first=268 second=111 amount=-1 +kerning first=121 second=254 amount=-1 +kerning first=269 second=228 amount=-1 +kerning first=268 second=225 amount=-1 +kerning first=70 second=187 amount=-2 +kerning first=106 second=99 amount=-1 +kerning first=77 second=232 amount=-1 +kerning first=8218 second=332 amount=-1 +kerning first=286 second=85 amount=-1 +kerning first=214 second=85 amount=-1 +kerning first=304 second=203 amount=-1 +kerning first=73 second=332 amount=-1 +kerning first=252 second=287 amount=-1 +kerning first=289 second=46 amount=-1 +kerning first=74 second=271 amount=-1 +kerning first=253 second=46 amount=-1 +kerning first=214 second=330 amount=-1 +kerning first=73 second=85 amount=-1 +kerning first=250 second=8220 amount=-1 +kerning first=111 second=287 amount=-1 +kerning first=325 second=46 amount=-1 +kerning first=109 second=277 amount=-1 +kerning first=286 second=302 amount=-1 +kerning first=206 second=241 amount=-1 +kerning first=286 second=8220 amount=-1 +kerning first=370 second=368 amount=-1 +kerning first=324 second=287 amount=-1 +kerning first=214 second=302 amount=-1 +kerning first=323 second=271 amount=-1 +kerning first=246 second=103 amount=-1 +kerning first=1039 second=1096 amount=-1 +kerning first=74 second=243 amount=-1 +kerning first=233 second=378 amount=-1 +kerning first=8250 second=223 amount=-1 +kerning first=230 second=250 amount=-1 +kerning first=227 second=289 amount=-1 +kerning first=194 second=250 amount=-1 +kerning first=231 second=229 amount=-1 +kerning first=112 second=46 amount=-1 +kerning first=202 second=284 amount=-1 +kerning first=274 second=75 amount=-1 +kerning first=263 second=289 amount=-1 +kerning first=87 second=273 amount=-1 +kerning first=374 second=250 amount=-1 +kerning first=45 second=336 amount=-1 +kerning first=217 second=46 amount=-2 +kerning first=274 second=284 amount=-1 +kerning first=334 second=76 amount=-1 +kerning first=335 second=289 amount=-1 +kerning first=267 second=229 amount=-1 +kerning first=269 second=378 amount=-1 +kerning first=370 second=76 amount=-1 +kerning first=207 second=220 amount=-1 +kerning first=262 second=76 amount=-1 +kerning first=351 second=46 amount=-1 +kerning first=171 second=220 amount=-1 +kerning first=74 second=74 amount=-1 +kerning first=8250 second=218 amount=-1 +kerning first=362 second=259 amount=-1 +kerning first=264 second=278 amount=-1 +kerning first=1027 second=1105 amount=-1 +kerning first=201 second=45 amount=-1 +kerning first=280 second=216 amount=-1 +kerning first=339 second=246 amount=-1 +kerning first=85 second=76 amount=-1 +kerning first=1050 second=1118 amount=-1 +kerning first=203 second=280 amount=-1 +kerning first=267 second=246 amount=-1 +kerning first=321 second=89 amount=-1 +kerning first=231 second=246 amount=-1 +kerning first=66 second=220 amount=-1 +kerning first=323 second=74 amount=-1 +kerning first=204 second=269 amount=-1 +kerning first=262 second=245 amount=-1 +kerning first=209 second=74 amount=-1 +kerning first=77 second=259 amount=-1 +kerning first=70 second=204 amount=-1 +kerning first=99 second=269 amount=-1 +kerning first=1042 second=1084 amount=-1 +kerning first=281 second=369 amount=-1 +kerning first=78 second=201 amount=-1 +kerning first=86 second=65 amount=-1 +kerning first=218 second=259 amount=-1 +kerning first=211 second=204 amount=-1 +kerning first=272 second=366 amount=-1 +kerning first=278 second=268 amount=-1 +kerning first=220 second=207 amount=-1 +kerning first=119 second=104 amount=-1 +kerning first=78 second=8220 amount=-1 +kerning first=200 second=366 amount=-1 +kerning first=206 second=268 amount=-1 +kerning first=1039 second=1069 amount=-1 +kerning first=280 second=67 amount=-1 +kerning first=274 second=67 amount=-1 +kerning first=218 second=110 amount=-1 +kerning first=8217 second=289 amount=-1 +kerning first=364 second=207 amount=-1 +kerning first=310 second=67 amount=-1 +kerning first=74 second=244 amount=-1 +kerning first=207 second=210 amount=-1 +kerning first=1067 second=1062 amount=-1 +kerning first=110 second=244 amount=-1 +kerning first=75 second=303 amount=-1 +kerning first=356 second=113 amount=-1 +kerning first=374 second=277 amount=-1 +kerning first=8216 second=347 amount=-1 +kerning first=217 second=73 amount=-1 +kerning first=1054 second=1068 amount=-1 +kerning first=73 second=302 amount=-1 +kerning first=325 second=73 amount=-1 +kerning first=86 second=262 amount=-1 +kerning first=233 second=351 amount=-1 +kerning first=65 second=268 amount=-1 +kerning first=287 second=108 amount=-1 +kerning first=1038 second=1117 amount=-1 +kerning first=89 second=277 amount=-1 +kerning first=192 second=251 amount=-1 +kerning first=199 second=213 amount=-1 +kerning first=87 second=251 amount=-1 +kerning first=302 second=277 amount=-1 +kerning first=266 second=277 amount=-1 +kerning first=230 second=277 amount=-1 +kerning first=368 second=218 amount=-1 +kerning first=187 second=370 amount=-1 +kerning first=71 second=8221 amount=-1 +kerning first=355 second=231 amount=-1 +kerning first=270 second=354 amount=-1 +kerning first=327 second=75 amount=-1 +kerning first=108 second=380 amount=-1 +kerning first=280 second=270 amount=-1 +kerning first=296 second=218 amount=-1 +kerning first=374 second=196 amount=-1 +kerning first=245 second=8222 amount=-1 +kerning first=212 second=8221 amount=-2 +kerning first=262 second=8249 amount=-1 +kerning first=248 second=8221 amount=-2 +kerning first=219 second=75 amount=-1 +kerning first=78 second=216 amount=-1 +kerning first=109 second=248 amount=-1 +kerning first=67 second=336 amount=-1 +kerning first=1031 second=1089 amount=-1 +kerning first=65 second=187 amount=-1 +kerning first=250 second=248 amount=-1 +kerning first=1057 second=1119 amount=-1 +kerning first=283 second=231 amount=-1 +kerning first=83 second=218 amount=-1 +kerning first=99 second=242 amount=-1 +kerning first=356 second=8221 amount=-1 +kerning first=78 second=75 amount=-1 +kerning first=352 second=270 amount=-1 +kerning first=200 second=209 amount=-1 +kerning first=218 second=79 amount=-1 +kerning first=73 second=248 amount=-1 +kerning first=304 second=279 amount=-1 +kerning first=280 second=336 amount=-1 +kerning first=204 second=234 amount=-1 +kerning first=258 second=84 amount=-1 +kerning first=67 second=270 amount=-1 +kerning first=279 second=367 amount=-1 +kerning first=339 second=283 amount=-1 +kerning first=77 second=79 amount=-1 +kerning first=231 second=283 amount=-1 +kerning first=109 second=333 amount=-1 +kerning first=89 second=369 amount=-1 +kerning first=1043 second=1080 amount=-1 +kerning first=374 second=8222 amount=-2 +kerning first=251 second=244 amount=-1 +kerning first=79 second=327 amount=-1 +kerning first=338 second=8222 amount=-1 +kerning first=8218 second=369 amount=-1 +kerning first=290 second=205 amount=-1 +kerning first=323 second=244 amount=-1 +kerning first=266 second=8222 amount=-1 +kerning first=362 second=79 amount=-1 +kerning first=207 second=274 amount=-1 +kerning first=230 second=8222 amount=-1 +kerning first=66 second=367 amount=-1 +kerning first=66 second=274 amount=-1 +kerning first=1031 second=1028 amount=-1 +kerning first=252 second=233 amount=-1 +kerning first=338 second=70 amount=-1 +kerning first=364 second=327 amount=-1 +kerning first=70 second=231 amount=-1 +kerning first=86 second=235 amount=-1 +kerning first=106 second=231 amount=-1 +kerning first=1066 second=1062 amount=-1 +kerning first=1055 second=1071 amount=-1 +kerning first=356 second=227 amount=-1 +kerning first=218 second=205 amount=-1 +kerning first=227 second=235 amount=-1 +kerning first=258 second=108 amount=-1 +kerning first=77 second=205 amount=-1 +kerning first=263 second=235 amount=-1 +kerning first=266 second=70 amount=-1 +kerning first=87 second=224 amount=-1 +kerning first=302 second=70 amount=-1 +kerning first=8217 second=65 amount=-2 +kerning first=206 second=214 amount=-1 +kerning first=201 second=71 amount=-1 +kerning first=72 second=353 amount=-1 +kerning first=118 second=249 amount=-1 +kerning first=210 second=202 amount=-1 +kerning first=264 second=224 amount=-1 +kerning first=187 second=249 amount=-1 +kerning first=330 second=70 amount=-1 +kerning first=1038 second=1090 amount=-1 +kerning first=103 second=243 amount=-1 +kerning first=1058 second=1088 amount=-1 +kerning first=1059 second=1104 amount=-1 +kerning first=280 second=363 amount=-1 +kerning first=213 second=353 amount=-1 +kerning first=316 second=363 amount=-1 +kerning first=278 second=214 amount=-1 +kerning first=75 second=370 amount=-1 +kerning first=374 second=223 amount=-1 +kerning first=69 second=45 amount=-1 +kerning first=288 second=370 amount=-1 +kerning first=338 second=223 amount=-1 +kerning first=105 second=45 amount=-1 +kerning first=302 second=223 amount=-1 +kerning first=232 second=252 amount=-1 +kerning first=250 second=275 amount=-1 +kerning first=266 second=223 amount=-1 +kerning first=196 second=252 amount=-1 +kerning first=325 second=8218 amount=-1 +kerning first=65 second=214 amount=-1 +kerning first=1043 second=1107 amount=-1 +kerning first=79 second=354 amount=-1 +kerning first=203 second=199 amount=-1 +kerning first=282 second=45 amount=-1 +kerning first=254 second=106 amount=-1 +kerning first=109 second=275 amount=-1 +kerning first=1050 second=1081 amount=-1 +kerning first=73 second=275 amount=-1 +kerning first=375 second=8221 amount=-2 +kerning first=8217 second=262 amount=-1 +kerning first=1046 second=1097 amount=-1 +kerning first=74 second=217 amount=-1 +kerning first=266 second=97 amount=-1 +kerning first=220 second=234 amount=-1 +kerning first=302 second=97 amount=-1 +kerning first=370 second=288 amount=-1 +kerning first=235 second=267 amount=-1 +kerning first=271 second=267 amount=-1 +kerning first=307 second=267 amount=-1 +kerning first=272 second=209 amount=-1 +kerning first=89 second=97 amount=-1 +kerning first=73 second=8220 amount=-1 +kerning first=364 second=234 amount=-1 +kerning first=89 second=223 amount=-1 +kerning first=8218 second=251 amount=-1 +kerning first=328 second=234 amount=-1 +kerning first=316 second=243 amount=-1 +kerning first=323 second=217 amount=-1 +kerning first=211 second=258 amount=-1 +kerning first=1091 second=1098 amount=-1 +kerning first=288 second=201 amount=-1 +kerning first=288 second=206 amount=-1 +kerning first=1071 second=1095 amount=-1 +kerning first=298 second=266 amount=-1 +kerning first=218 second=232 amount=-1 +kerning first=284 second=200 amount=-1 +kerning first=350 second=345 amount=-1 +kerning first=1062 second=1072 amount=-1 +kerning first=370 second=266 amount=-1 +kerning first=119 second=46 amount=-1 +kerning first=196 second=345 amount=-1 +kerning first=324 second=113 amount=-1 +kerning first=232 second=345 amount=-1 +kerning first=8222 second=279 amount=-1 +kerning first=374 second=97 amount=-1 +kerning first=362 second=232 amount=-1 +kerning first=268 second=345 amount=-1 +kerning first=262 second=266 amount=-1 +kerning first=326 second=232 amount=-1 +kerning first=364 second=79 amount=-1 +kerning first=219 second=283 amount=-1 +kerning first=71 second=200 amount=-1 +kerning first=211 second=198 amount=-1 +kerning first=89 second=109 amount=-1 +kerning first=1059 second=1077 amount=-1 +kerning first=220 second=8218 amount=-2 +kerning first=339 second=120 amount=-1 +kerning first=375 second=120 amount=-1 +kerning first=115 second=8218 amount=-1 +kerning first=87 second=197 amount=-1 +kerning first=79 second=8218 amount=-1 +kerning first=266 second=109 amount=-1 +kerning first=364 second=8218 amount=-2 +kerning first=249 second=245 amount=-1 +kerning first=105 second=111 amount=-1 +kerning first=302 second=109 amount=-1 +kerning first=272 second=258 amount=-1 +kerning first=220 second=315 amount=-1 +kerning first=339 second=337 amount=-1 +kerning first=73 second=199 amount=-1 +kerning first=187 second=367 amount=-1 +kerning first=325 second=214 amount=-1 +kerning first=108 second=245 amount=-1 +kerning first=66 second=313 amount=-1 +kerning first=267 second=105 amount=-1 +kerning first=207 second=313 amount=-1 +kerning first=231 second=120 amount=-1 +kerning first=195 second=105 amount=-1 +kerning first=374 second=229 amount=-1 +kerning first=296 second=267 amount=-1 +kerning first=262 second=217 amount=-1 +kerning first=263 second=318 amount=-1 +kerning first=368 second=267 amount=-1 +kerning first=298 second=217 amount=-1 +kerning first=1071 second=1068 amount=-1 +kerning first=334 second=217 amount=-1 +kerning first=291 second=114 amount=-1 +kerning first=1057 second=1097 amount=-1 +kerning first=370 second=217 amount=-1 +kerning first=255 second=114 amount=-1 +kerning first=326 second=279 amount=-1 +kerning first=219 second=102 amount=-1 +kerning first=1030 second=1037 amount=-1 +kerning first=224 second=267 amount=-1 +kerning first=327 second=114 amount=-1 +kerning first=8220 second=196 amount=-2 +kerning first=72 second=245 amount=-1 +kerning first=78 second=114 amount=-1 +kerning first=317 second=8221 amount=-1 +kerning first=364 second=315 amount=-1 +kerning first=219 second=114 amount=-1 +kerning first=291 second=8249 amount=-1 +kerning first=8222 second=318 amount=-1 +kerning first=201 second=212 amount=-1 +kerning first=70 second=103 amount=-1 +kerning first=279 second=111 amount=-1 +kerning first=274 second=8222 amount=-1 +kerning first=327 second=8249 amount=-1 +kerning first=363 second=8249 amount=-1 +kerning first=101 second=115 amount=-1 +kerning first=1044 second=1098 amount=-1 +kerning first=327 second=331 amount=-1 +kerning first=206 second=115 amount=-1 +kerning first=220 second=273 amount=-1 +kerning first=279 second=355 amount=-1 +kerning first=339 second=8220 amount=-2 +kerning first=196 second=318 amount=-1 +kerning first=213 second=218 amount=-1 +kerning first=201 second=77 amount=-1 +kerning first=323 second=352 amount=-1 +kerning first=231 second=105 amount=-1 +kerning first=1033 second=1061 amount=-1 +kerning first=97 second=380 amount=-1 +kerning first=8250 second=89 amount=-2 +kerning first=207 second=355 amount=-1 +kerning first=268 second=318 amount=-1 +kerning first=71 second=44 amount=-1 +kerning first=80 second=288 amount=-1 +kerning first=8220 second=85 amount=-1 +kerning first=284 second=44 amount=-1 +kerning first=261 second=248 amount=-1 +kerning first=66 second=355 amount=-1 +kerning first=369 second=248 amount=-1 +kerning first=212 second=44 amount=-1 +kerning first=8222 second=333 amount=-1 +kerning first=362 second=193 amount=-1 +kerning first=248 second=44 amount=-1 +kerning first=354 second=275 amount=-1 +kerning first=1047 second=1059 amount=-2 +kerning first=78 second=346 amount=-1 +kerning first=84 second=248 amount=-1 +kerning first=352 second=282 amount=-1 +kerning first=225 second=248 amount=-1 +kerning first=8216 second=217 amount=-1 +kerning first=280 second=282 amount=-1 +kerning first=321 second=218 amount=-1 +kerning first=325 second=332 amount=-1 +kerning first=291 second=8222 amount=-1 +kerning first=72 second=230 amount=-1 +kerning first=219 second=8222 amount=-2 +kerning first=327 second=346 amount=-1 +kerning first=203 second=361 amount=-1 +kerning first=203 second=117 amount=-1 +kerning first=217 second=332 amount=-1 +kerning first=1071 second=1041 amount=-1 +kerning first=204 second=229 amount=-1 +kerning first=114 second=8222 amount=-1 +kerning first=232 second=279 amount=-1 +kerning first=78 second=8222 amount=-1 +kerning first=268 second=279 amount=-1 +kerning first=219 second=346 amount=-1 +kerning first=8250 second=77 amount=-1 +kerning first=74 second=352 amount=-1 +kerning first=298 second=267 amount=-1 +kerning first=267 second=337 amount=-1 +kerning first=350 second=187 amount=-1 +kerning first=232 second=291 amount=-1 +kerning first=231 second=337 amount=-1 +kerning first=356 second=44 amount=-1 +kerning first=278 second=187 amount=-1 +kerning first=99 second=187 amount=-1 +kerning first=103 second=355 amount=-1 +kerning first=187 second=81 amount=-1 +kerning first=209 second=109 amount=-1 +kerning first=315 second=84 amount=-1 +kerning first=75 second=119 amount=-1 +kerning first=82 second=81 amount=-1 +kerning first=327 second=8222 amount=-1 +kerning first=364 second=288 amount=-1 +kerning first=194 second=211 amount=-1 +kerning first=71 second=204 amount=-1 +kerning first=202 second=338 amount=-1 +kerning first=266 second=211 amount=-1 +kerning first=264 second=362 amount=-1 +kerning first=324 second=119 amount=-1 +kerning first=323 second=325 amount=-1 +kerning first=199 second=99 amount=-1 +kerning first=1033 second=1034 amount=-1 +kerning first=89 second=211 amount=-1 +kerning first=220 second=369 amount=-1 +kerning first=334 second=347 amount=-1 +kerning first=207 second=382 amount=-1 +kerning first=262 second=269 amount=-1 +kerning first=370 second=347 amount=-1 +kerning first=243 second=382 amount=-1 +kerning first=370 second=333 amount=-1 +kerning first=325 second=8250 amount=-1 +kerning first=262 second=347 amount=-1 +kerning first=279 second=382 amount=-1 +kerning first=289 second=8250 amount=-1 +kerning first=298 second=347 amount=-1 +kerning first=271 second=99 amount=-1 +kerning first=253 second=8250 amount=-1 +kerning first=212 second=86 amount=-1 +kerning first=66 second=198 amount=-1 +kerning first=101 second=248 amount=-1 +kerning first=217 second=8250 amount=-2 +kerning first=72 second=224 amount=-1 +kerning first=314 second=365 amount=-1 +kerning first=85 second=347 amount=-1 +kerning first=67 second=330 amount=-1 +kerning first=374 second=211 amount=-1 +kerning first=195 second=268 amount=-1 +kerning first=227 second=316 amount=-1 +kerning first=1049 second=1100 amount=-1 +kerning first=1062 second=1087 amount=-1 +kerning first=264 second=110 amount=-1 +kerning first=278 second=202 amount=-1 +kerning first=283 second=117 amount=-1 +kerning first=103 second=351 amount=-1 +kerning first=304 second=264 amount=-1 +kerning first=72 second=8217 amount=-1 +kerning first=219 second=277 amount=-1 +kerning first=67 second=351 amount=-1 +kerning first=350 second=202 amount=-1 +kerning first=108 second=8217 amount=-1 +kerning first=206 second=73 amount=-1 +kerning first=350 second=369 amount=-1 +kerning first=289 second=305 amount=-1 +kerning first=196 second=264 amount=-1 +kerning first=278 second=73 amount=-1 +kerning first=1031 second=1065 amount=-1 +kerning first=363 second=277 amount=-1 +kerning first=203 second=334 amount=-1 +kerning first=206 second=202 amount=-1 +kerning first=240 second=8250 amount=-1 +kerning first=321 second=8217 amount=-1 +kerning first=207 second=69 amount=-1 +kerning first=223 second=108 amount=-1 +kerning first=233 second=245 amount=-1 +kerning first=368 second=232 amount=-1 +kerning first=240 second=101 amount=-1 +kerning first=118 second=108 amount=-1 +kerning first=218 second=193 amount=-1 +kerning first=204 second=101 amount=-1 +kerning first=66 second=69 amount=-1 +kerning first=364 second=273 amount=-1 +kerning first=1068 second=1065 amount=-1 +kerning first=8217 second=370 amount=-1 +kerning first=338 second=82 amount=-1 +kerning first=310 second=338 amount=-1 +kerning first=75 second=364 amount=-1 +kerning first=302 second=82 amount=-1 +kerning first=213 second=8217 amount=-2 +kerning first=78 second=277 amount=-1 +kerning first=259 second=108 amount=-1 +kerning first=74 second=325 amount=-1 +kerning first=274 second=338 amount=-1 +kerning first=269 second=254 amount=-1 +kerning first=346 second=365 amount=-1 +kerning first=1056 second=1074 amount=-1 +kerning first=1038 second=1051 amount=-1 +kerning first=121 second=103 amount=-1 +kerning first=272 second=68 amount=-1 +kerning first=225 second=263 amount=-1 +kerning first=85 second=103 amount=-1 +kerning first=274 second=365 amount=-1 +kerning first=74 second=298 amount=-1 +kerning first=66 second=171 amount=-1 +kerning first=1039 second=1097 amount=-1 +kerning first=261 second=263 amount=-1 +kerning first=1075 second=1114 amount=-1 +kerning first=310 second=365 amount=-1 +kerning first=102 second=171 amount=-1 +kerning first=202 second=365 amount=-1 +kerning first=1030 second=1039 amount=-1 +kerning first=66 second=286 amount=-1 +kerning first=78 second=8249 amount=-1 +kerning first=114 second=8249 amount=-1 +kerning first=200 second=68 amount=-1 +kerning first=323 second=298 amount=-1 +kerning first=374 second=194 amount=-1 +kerning first=213 second=203 amount=-1 +kerning first=100 second=287 amount=-1 +kerning first=8222 second=211 amount=-1 +kerning first=277 second=287 amount=-1 +kerning first=334 second=374 amount=-1 +kerning first=72 second=203 amount=-1 +kerning first=241 second=287 amount=-1 +kerning first=66 second=270 amount=-1 +kerning first=84 second=263 amount=-1 +kerning first=70 second=117 amount=-1 +kerning first=206 second=100 amount=-1 +kerning first=1054 second=1048 amount=-1 +kerning first=8250 second=202 amount=-1 +kerning first=264 second=83 amount=-1 +kerning first=103 second=324 amount=-1 +kerning first=83 second=77 amount=-1 +kerning first=212 second=330 amount=-1 +kerning first=219 second=304 amount=-1 +kerning first=364 second=246 amount=-1 +kerning first=351 second=171 amount=-1 +kerning first=328 second=246 amount=-1 +kerning first=290 second=220 amount=-1 +kerning first=284 second=330 amount=-1 +kerning first=103 second=339 amount=-1 +kerning first=370 second=103 amount=-1 +kerning first=327 second=304 amount=-1 +kerning first=268 second=218 amount=-1 +kerning first=362 second=220 amount=-1 +kerning first=8250 second=375 amount=-1 +kerning first=368 second=77 amount=-1 +kerning first=220 second=246 amount=-1 +kerning first=298 second=103 amount=-1 +kerning first=78 second=304 amount=-1 +kerning first=1049 second=1031 amount=-1 +kerning first=374 second=197 amount=-1 +kerning first=262 second=103 amount=-1 +kerning first=232 second=333 amount=-1 +kerning first=325 second=278 amount=-1 +kerning first=296 second=77 amount=-1 +kerning first=101 second=100 amount=-1 +kerning first=226 second=103 amount=-1 +kerning first=204 second=74 amount=-1 +kerning first=246 second=187 amount=-1 +kerning first=218 second=220 amount=-1 +kerning first=221 second=382 amount=-1 +kerning first=314 second=246 amount=-1 +kerning first=8217 second=97 amount=-1 +kerning first=85 second=298 amount=-1 +kerning first=73 second=100 amount=-1 +kerning first=211 second=356 amount=-1 +kerning first=339 second=232 amount=-1 +kerning first=1070 second=1030 amount=-1 +kerning first=206 second=246 amount=-1 +kerning first=298 second=298 amount=-1 +kerning first=333 second=103 amount=-1 +kerning first=262 second=298 amount=-1 +kerning first=201 second=330 amount=-1 +kerning first=196 second=220 amount=-1 +kerning first=1039 second=1091 amount=-1 +kerning first=229 second=269 amount=-1 +kerning first=370 second=298 amount=-1 +kerning first=304 second=220 amount=-1 +kerning first=334 second=298 amount=-1 +kerning first=268 second=220 amount=-1 +kerning first=224 second=333 amount=-1 +kerning first=271 second=339 amount=-1 +kerning first=203 second=68 amount=-1 +kerning first=1044 second=1074 amount=-1 +kerning first=1059 second=1040 amount=-1 +kerning first=280 second=211 amount=-1 +kerning first=368 second=333 amount=-1 +kerning first=80 second=382 amount=-1 +kerning first=335 second=8222 amount=-1 +kerning first=45 second=194 amount=-1 +kerning first=235 second=365 amount=-1 +kerning first=296 second=333 amount=-1 +kerning first=81 second=194 amount=-1 +kerning first=263 second=8222 amount=-1 +kerning first=67 second=211 amount=-1 +kerning first=212 second=315 amount=-1 +kerning first=194 second=255 amount=-1 +kerning first=225 second=339 amount=-1 +kerning first=99 second=281 amount=-1 +kerning first=83 second=361 amount=-1 +kerning first=204 second=281 amount=-1 +kerning first=79 second=202 amount=-1 +kerning first=1052 second=1047 amount=-1 +kerning first=261 second=339 amount=-1 +kerning first=240 second=281 amount=-1 +kerning first=8250 second=213 amount=-1 +kerning first=1053 second=1074 amount=-1 +kerning first=284 second=315 amount=-1 +kerning first=198 second=344 amount=-1 +kerning first=1030 second=1051 amount=-1 +kerning first=362 second=264 amount=-1 +kerning first=199 second=111 amount=-1 +kerning first=84 second=339 amount=-1 +kerning first=364 second=202 amount=-1 +kerning first=118 second=347 amount=-1 +kerning first=1031 second=1057 amount=-1 +kerning first=118 second=120 amount=-1 +kerning first=68 second=364 amount=-1 +kerning first=74 second=313 amount=-1 +kerning first=187 second=120 amount=-1 +kerning first=218 second=264 amount=-1 +kerning first=314 second=277 amount=-1 +kerning first=223 second=120 amount=-1 +kerning first=220 second=202 amount=-1 +kerning first=1056 second=1025 amount=-1 +kerning first=369 second=339 amount=-1 +kerning first=71 second=315 amount=-1 +kerning first=217 second=251 amount=-1 +kerning first=298 second=275 amount=-1 +kerning first=77 second=264 amount=-1 +kerning first=198 second=212 amount=-1 +kerning first=8218 second=290 amount=-1 +kerning first=216 second=8217 amount=-2 +kerning first=252 second=8217 amount=-1 +kerning first=330 second=223 amount=-1 +kerning first=288 second=8217 amount=-1 +kerning first=253 second=251 amount=-1 +kerning first=324 second=8217 amount=-2 +kerning first=289 second=251 amount=-1 +kerning first=353 second=8222 amount=-1 +kerning first=85 second=271 amount=-1 +kerning first=82 second=221 amount=-1 +kerning first=75 second=8217 amount=-1 +kerning first=370 second=269 amount=-1 +kerning first=111 second=8217 amount=-2 +kerning first=1043 second=1094 amount=-1 +kerning first=201 second=8221 amount=-1 +kerning first=324 second=245 amount=-1 +kerning first=262 second=271 amount=-1 +kerning first=235 second=111 amount=-1 +kerning first=271 second=111 amount=-1 +kerning first=252 second=245 amount=-1 +kerning first=307 second=111 amount=-1 +kerning first=298 second=271 amount=-1 +kerning first=345 second=8221 amount=-1 +kerning first=207 second=353 amount=-1 +kerning first=381 second=8221 amount=-1 +kerning first=370 second=271 amount=-1 +kerning first=1065 second=1092 amount=-1 +kerning first=209 second=334 amount=-1 +kerning first=258 second=221 amount=-1 +kerning first=1053 second=1101 amount=-1 +kerning first=220 second=229 amount=-1 +kerning first=86 second=331 amount=-1 +kerning first=1030 second=1024 amount=-1 +kerning first=1043 second=1075 amount=-1 +kerning first=72 second=67 amount=-1 +kerning first=205 second=233 amount=-1 +kerning first=210 second=203 amount=-1 +kerning first=99 second=254 amount=-1 +kerning first=1056 second=1044 amount=-1 +kerning first=229 second=277 amount=-1 +kerning first=100 second=233 amount=-1 +kerning first=282 second=203 amount=-1 +kerning first=323 second=8221 amount=-1 +kerning first=73 second=280 amount=-1 +kerning first=201 second=357 amount=-1 +kerning first=241 second=233 amount=-1 +kerning first=214 second=280 amount=-1 +kerning first=234 second=117 amount=-1 +kerning first=69 second=203 amount=-1 +kerning first=277 second=233 amount=-1 +kerning first=187 second=374 amount=-2 +kerning first=1066 second=1024 amount=-1 +kerning first=286 second=280 amount=-1 +kerning first=228 second=263 amount=-1 +kerning first=74 second=111 amount=-1 +kerning first=264 second=263 amount=-1 +kerning first=1104 second=1119 amount=-1 +kerning first=82 second=374 amount=-1 +kerning first=1031 second=1084 amount=-1 +kerning first=219 second=363 amount=-1 +kerning first=187 second=207 amount=-1 +kerning first=198 second=288 amount=-1 +kerning first=255 second=363 amount=-1 +kerning first=302 second=201 amount=-1 +kerning first=291 second=363 amount=-1 +kerning first=368 second=213 amount=-1 +kerning first=338 second=201 amount=-1 +kerning first=275 second=122 amount=-1 +kerning first=327 second=70 amount=-1 +kerning first=235 second=311 amount=-1 +kerning first=374 second=245 amount=-1 +kerning first=264 second=317 amount=-1 +kerning first=266 second=201 amount=-1 +kerning first=325 second=224 amount=-1 +kerning first=1048 second=1104 amount=-1 +kerning first=217 second=224 amount=-1 +kerning first=219 second=103 amount=-1 +kerning first=86 second=250 amount=-1 +kerning first=98 second=122 amount=-1 +kerning first=110 second=113 amount=-1 +kerning first=272 second=204 amount=-1 +kerning first=1091 second=1093 amount=-1 +kerning first=85 second=244 amount=-1 +kerning first=79 second=256 amount=-1 +kerning first=200 second=204 amount=-1 +kerning first=74 second=259 amount=-1 +kerning first=327 second=8218 amount=-1 +kerning first=195 second=354 amount=-1 +kerning first=323 second=259 amount=-1 +kerning first=226 second=244 amount=-1 +kerning first=70 second=79 amount=-1 +kerning first=262 second=244 amount=-1 +kerning first=282 second=116 amount=-1 +kerning first=362 second=210 amount=-1 +kerning first=298 second=244 amount=-1 +kerning first=1042 second=1096 amount=-1 +kerning first=364 second=256 amount=-1 +kerning first=218 second=210 amount=-1 +kerning first=1078 second=1096 amount=-1 +kerning first=77 second=210 amount=-1 +kerning first=99 second=363 amount=-1 +kerning first=327 second=283 amount=-1 +kerning first=1096 second=1095 amount=-1 +kerning first=202 second=262 amount=-1 +kerning first=310 second=262 amount=-1 +kerning first=66 second=345 amount=-1 +kerning first=274 second=262 amount=-1 +kerning first=217 second=355 amount=-1 +kerning first=1033 second=1049 amount=-1 +kerning first=234 second=98 amount=-1 +kerning first=264 second=298 amount=-1 +kerning first=1043 second=1102 amount=-1 +kerning first=211 second=302 amount=-1 +kerning first=286 second=73 amount=-1 +kerning first=277 second=248 amount=-1 +kerning first=204 second=335 amount=-1 +kerning first=207 second=345 amount=-1 +kerning first=243 second=345 amount=-1 +kerning first=1024 second=1095 amount=-1 +kerning first=258 second=107 amount=-1 +kerning first=279 second=345 amount=-1 +kerning first=350 second=219 amount=-1 +kerning first=240 second=335 amount=-1 +kerning first=296 second=213 amount=-1 +kerning first=70 second=302 amount=-1 +kerning first=203 second=268 amount=-1 +kerning first=278 second=219 amount=-1 +kerning first=205 second=206 amount=-1 +kerning first=1068 second=1070 amount=-1 +kerning first=206 second=219 amount=-1 +kerning first=263 second=277 amount=-1 +kerning first=266 second=368 amount=-1 +kerning first=352 second=8221 amount=-1 +kerning first=227 second=277 amount=-1 +kerning first=8249 second=374 amount=-1 +kerning first=302 second=368 amount=-1 +kerning first=338 second=368 amount=-1 +kerning first=73 second=226 amount=-1 +kerning first=86 second=81 amount=-1 +kerning first=325 second=82 amount=-1 +kerning first=87 second=290 amount=-1 +kerning first=85 second=217 amount=-1 +kerning first=73 second=73 amount=-1 +kerning first=1053 second=1047 amount=-1 +kerning first=192 second=290 amount=-1 +kerning first=214 second=73 amount=-1 +kerning first=194 second=368 amount=-1 +kerning first=328 second=283 amount=-1 +kerning first=122 second=8249 amount=-1 +kerning first=217 second=197 amount=-1 +kerning first=1056 second=1092 amount=-1 +kerning first=66 second=79 amount=-1 +kerning first=199 second=338 amount=-1 +kerning first=1054 second=1084 amount=-1 +kerning first=202 second=82 amount=-1 +kerning first=8222 second=246 amount=-1 +kerning first=289 second=245 amount=-1 +kerning first=263 second=8249 amount=-1 +kerning first=86 second=277 amount=-1 +kerning first=1062 second=1057 amount=-1 +kerning first=274 second=82 amount=-1 +kerning first=323 second=286 amount=-1 +kerning first=230 second=120 amount=-1 +kerning first=212 second=282 amount=-1 +kerning first=220 second=283 amount=-1 +kerning first=1036 second=1086 amount=-1 +kerning first=1118 second=1097 amount=-1 +kerning first=251 second=99 amount=-1 +kerning first=70 second=251 amount=-1 +kerning first=271 second=45 amount=-1 +kerning first=1060 second=1068 amount=-1 +kerning first=370 second=244 amount=-1 +kerning first=199 second=45 amount=-1 +kerning first=199 second=171 amount=-1 +kerning first=69 second=116 amount=-1 +kerning first=287 second=113 amount=-1 +kerning first=207 second=79 amount=-1 +kerning first=323 second=113 amount=-1 +kerning first=97 second=235 amount=-1 +kerning first=307 second=171 amount=-1 +kerning first=1053 second=1048 amount=-1 +kerning first=74 second=286 amount=-1 +kerning first=251 second=113 amount=-1 +kerning first=86 second=8249 amount=-2 +kerning first=218 second=350 amount=-1 +kerning first=219 second=70 amount=-1 +kerning first=246 second=8250 amount=-1 +kerning first=263 second=104 amount=-1 +kerning first=304 second=274 amount=-1 +kerning first=205 second=109 amount=-1 +kerning first=77 second=350 amount=-1 +kerning first=1041 second=1056 amount=-1 +kerning first=1048 second=1077 amount=-1 +kerning first=78 second=70 amount=-1 +kerning first=262 second=226 amount=-1 +kerning first=268 second=274 amount=-1 +kerning first=217 second=344 amount=-1 +kerning first=1118 second=1085 amount=-1 +kerning first=282 second=284 amount=-1 +kerning first=375 second=115 amount=-1 +kerning first=84 second=231 amount=-1 +kerning first=220 second=310 amount=-1 +kerning first=351 second=318 amount=-1 +kerning first=1046 second=1085 amount=-1 +kerning first=8217 second=250 amount=-1 +kerning first=74 second=205 amount=-1 +kerning first=8218 second=85 amount=-1 +kerning first=1071 second=1053 amount=-1 +kerning first=79 second=310 amount=-1 +kerning first=231 second=115 amount=-1 +kerning first=8250 second=274 amount=-1 +kerning first=323 second=205 amount=-1 +kerning first=213 second=219 amount=-1 +kerning first=69 second=284 amount=-1 +kerning first=267 second=115 amount=-1 +kerning first=339 second=115 amount=-1 +kerning first=243 second=106 amount=-1 +kerning first=369 second=231 amount=-1 +kerning first=279 second=106 amount=-1 +kerning first=1054 second=1036 amount=-1 +kerning first=1105 second=1091 amount=-1 +kerning first=80 second=89 amount=-1 +kerning first=203 second=214 amount=-1 +kerning first=225 second=231 amount=-1 +kerning first=261 second=231 amount=-1 +kerning first=201 second=217 amount=-1 +kerning first=1047 second=1044 amount=-1 +kerning first=83 second=45 amount=-1 +kerning first=119 second=45 amount=-1 +kerning first=78 second=97 amount=-1 +kerning first=88 second=365 amount=-1 +kerning first=72 second=235 amount=-1 +kerning first=287 second=333 amount=-1 +kerning first=310 second=116 amount=-1 +kerning first=283 second=243 amount=-1 +kerning first=65 second=332 amount=-1 +kerning first=108 second=235 amount=-1 +kerning first=260 second=45 amount=-1 +kerning first=355 second=243 amount=-1 +kerning first=205 second=353 amount=-1 +kerning first=278 second=332 amount=-1 +kerning first=366 second=275 amount=-1 +kerning first=1062 second=1028 amount=-1 +kerning first=270 second=70 amount=-1 +kerning first=277 second=353 amount=-1 +kerning first=209 second=71 amount=-1 +kerning first=117 second=275 amount=-1 +kerning first=1048 second=1050 amount=-1 +kerning first=8220 second=368 amount=-1 +kerning first=193 second=362 amount=-1 +kerning first=1034 second=1067 amount=-1 +kerning first=86 second=223 amount=-1 +kerning first=8250 second=67 amount=-1 +kerning first=368 second=45 amount=-2 +kerning first=1030 second=1096 amount=-1 +kerning first=219 second=97 amount=-1 +kerning first=85 second=225 amount=-1 +kerning first=77 second=323 amount=-1 +kerning first=263 second=223 amount=-1 +kerning first=106 second=243 amount=-1 +kerning first=84 second=226 amount=-1 +kerning first=70 second=243 amount=-1 +kerning first=274 second=370 amount=-1 +kerning first=197 second=107 amount=-1 +kerning first=45 second=302 amount=-1 +kerning first=228 second=122 amount=-1 +kerning first=1071 second=1080 amount=-1 +kerning first=310 second=370 amount=-1 +kerning first=323 second=232 amount=-1 +kerning first=81 second=302 amount=-1 +kerning first=87 second=122 amount=-1 +kerning first=202 second=370 amount=-1 +kerning first=364 second=337 amount=-1 +kerning first=287 second=232 amount=-1 +kerning first=78 second=336 amount=-1 +kerning first=218 second=323 amount=-1 +kerning first=328 second=337 amount=-1 +kerning first=251 second=232 amount=-1 +kerning first=117 second=234 amount=-1 +kerning first=219 second=336 amount=-1 +kerning first=346 second=370 amount=-1 +kerning first=220 second=337 amount=-1 +kerning first=217 second=317 amount=-1 +kerning first=218 second=75 amount=-1 +kerning first=362 second=323 amount=-1 +kerning first=241 second=119 amount=-1 +kerning first=8217 second=277 amount=-1 +kerning first=327 second=336 amount=-1 +kerning first=242 second=8250 amount=-1 +kerning first=201 second=249 amount=-1 +kerning first=8222 second=122 amount=-1 +kerning first=1030 second=1105 amount=-1 +kerning first=1060 second=1041 amount=-1 +kerning first=101 second=8250 amount=-1 +kerning first=65 second=8250 amount=-1 +kerning first=266 second=314 amount=-1 +kerning first=264 second=122 amount=-1 +kerning first=259 second=234 amount=-1 +kerning first=110 second=232 amount=-1 +kerning first=230 second=314 amount=-1 +kerning first=1047 second=1071 amount=-1 +kerning first=344 second=45 amount=-1 +kerning first=74 second=232 amount=-1 +kerning first=194 second=314 amount=-1 +kerning first=296 second=72 amount=-1 +kerning first=72 second=267 amount=-1 +kerning first=108 second=267 amount=-1 +kerning first=65 second=105 amount=-1 +kerning first=281 second=98 amount=-1 +kerning first=217 second=110 amount=-1 +kerning first=325 second=110 amount=-1 +kerning first=289 second=110 amount=-1 +kerning first=368 second=72 amount=-1 +kerning first=368 second=296 amount=-1 +kerning first=1049 second=1036 amount=-1 +kerning first=302 second=114 amount=-1 +kerning first=1048 second=1079 amount=-1 +kerning first=199 second=225 amount=-1 +kerning first=72 second=323 amount=-1 +kerning first=266 second=114 amount=-1 +kerning first=72 second=103 amount=-1 +kerning first=264 second=290 amount=-1 +kerning first=374 second=114 amount=-1 +kerning first=1068 second=1062 amount=-1 +kerning first=302 second=211 amount=-1 +kerning first=338 second=114 amount=-1 +kerning first=330 second=302 amount=-1 +kerning first=330 second=231 amount=-1 +kerning first=249 second=267 amount=-1 +kerning first=89 second=114 amount=-1 +kerning first=214 second=46 amount=-1 +kerning first=218 second=115 amount=-1 +kerning first=230 second=114 amount=-1 +kerning first=1038 second=1046 amount=-1 +kerning first=243 second=318 amount=-1 +kerning first=229 second=335 amount=-1 +kerning first=194 second=114 amount=-1 +kerning first=99 second=8250 amount=-1 +kerning first=279 second=318 amount=-1 +kerning first=77 second=69 amount=-1 +kerning first=327 second=219 amount=-1 +kerning first=339 second=273 amount=-1 +kerning first=77 second=296 amount=-1 +kerning first=204 second=227 amount=-1 +kerning first=267 second=273 amount=-1 +kerning first=231 second=273 amount=-1 +kerning first=290 second=296 amount=-1 +kerning first=350 second=78 amount=-1 +kerning first=1059 second=1096 amount=-1 +kerning first=225 second=108 amount=-1 +kerning first=346 second=117 amount=-1 +kerning first=218 second=296 amount=-1 +kerning first=364 second=364 amount=-1 +kerning first=245 second=44 amount=-1 +kerning first=354 second=111 amount=-1 +kerning first=75 second=218 amount=-1 +kerning first=281 second=44 amount=-1 +kerning first=362 second=296 amount=-1 +kerning first=278 second=78 amount=-1 +kerning first=209 second=44 amount=-1 +kerning first=1047 second=1098 amount=-1 +kerning first=304 second=355 amount=-1 +kerning first=366 second=248 amount=-1 +kerning first=73 second=334 amount=-1 +kerning first=327 second=282 amount=-1 +kerning first=232 second=355 amount=-1 +kerning first=83 second=72 amount=-1 +kerning first=353 second=44 amount=-1 +kerning first=1041 second=1024 amount=-1 +kerning first=219 second=282 amount=-1 +kerning first=230 second=287 amount=-1 +kerning first=187 second=288 amount=-1 +kerning first=45 second=221 amount=-2 +kerning first=1076 second=1091 amount=-1 +kerning first=82 second=288 amount=-1 +kerning first=78 second=282 amount=-1 +kerning first=85 second=352 amount=-1 +kerning first=354 second=230 amount=-1 +kerning first=67 second=346 amount=-1 +kerning first=8222 second=382 amount=-1 +kerning first=1059 second=1089 amount=-1 +kerning first=217 second=83 amount=-1 +kerning first=219 second=331 amount=-1 +kerning first=1038 second=1073 amount=-1 +kerning first=351 second=291 amount=-1 +kerning first=262 second=352 amount=-1 +kerning first=194 second=87 amount=-1 +kerning first=325 second=83 amount=-1 +kerning first=279 second=291 amount=-1 +kerning first=243 second=291 amount=-1 +kerning first=370 second=352 amount=-1 +kerning first=307 second=99 amount=-1 +kerning first=298 second=352 amount=-1 +kerning first=200 second=76 amount=-1 +kerning first=268 second=282 amount=-1 +kerning first=1050 second=1091 amount=-1 +kerning first=334 second=325 amount=-1 +kerning first=298 second=325 amount=-1 +kerning first=199 second=279 amount=-1 +kerning first=347 second=187 amount=-1 +kerning first=350 second=278 amount=-1 +kerning first=248 second=108 amount=-1 +kerning first=231 second=8218 amount=-1 +kerning first=370 second=325 amount=-1 +kerning first=78 second=211 amount=-1 +kerning first=1077 second=1119 amount=-1 +kerning first=70 second=211 amount=-1 +kerning first=78 second=68 amount=-1 +kerning first=77 second=269 amount=-1 +kerning first=210 second=84 amount=-1 +kerning first=219 second=323 amount=-1 +kerning first=8217 second=226 amount=-1 +kerning first=221 second=71 amount=-1 +kerning first=88 second=362 amount=-1 +kerning first=98 second=187 amount=-1 +kerning first=218 second=269 amount=-1 +kerning first=224 second=99 amount=-1 +kerning first=97 second=316 amount=-1 +kerning first=275 second=187 amount=-1 +kerning first=362 second=269 amount=-1 +kerning first=81 second=75 amount=-1 +kerning first=232 second=382 amount=-1 +kerning first=217 second=371 amount=-1 +kerning first=368 second=99 amount=-1 +kerning first=1044 second=1082 amount=-1 +kerning first=268 second=382 amount=-1 +kerning first=203 second=187 amount=-1 +kerning first=198 second=266 amount=-1 +kerning first=304 second=382 amount=-1 +kerning first=1062 second=1082 amount=-1 +kerning first=296 second=99 amount=-1 +kerning first=326 second=269 amount=-1 +kerning first=8250 second=86 amount=-2 +kerning first=89 second=260 amount=-1 +kerning first=200 second=117 amount=-1 +kerning first=1076 second=1083 amount=-1 +kerning first=366 second=8220 amount=-1 +kerning first=205 second=380 amount=-1 +kerning first=330 second=248 amount=-1 +kerning first=1059 second=1116 amount=-1 +kerning first=277 second=380 amount=-1 +kerning first=66 second=350 amount=-1 +kerning first=288 second=218 amount=-1 +kerning first=1067 second=1030 amount=-1 +kerning first=275 second=103 amount=-1 +kerning first=1068 second=1043 amount=-1 +kerning first=1038 second=1100 amount=-1 +kerning first=366 second=75 amount=-1 +kerning first=330 second=75 amount=-1 +kerning first=117 second=248 amount=-1 +kerning first=207 second=264 amount=-1 +kerning first=374 second=260 amount=-1 +kerning first=264 second=209 amount=-1 +kerning first=81 second=8220 amount=-2 +kerning first=362 second=69 amount=-1 +kerning first=85 second=325 amount=-1 +kerning first=66 second=193 amount=-1 +kerning first=220 second=364 amount=-1 +kerning first=66 second=264 amount=-1 +kerning first=70 second=270 amount=-1 +kerning first=270 second=66 amount=-1 +kerning first=99 second=367 amount=-1 +kerning first=86 second=196 amount=-1 +kerning first=258 second=8220 amount=-2 +kerning first=65 second=251 amount=-1 +kerning first=222 second=8220 amount=-2 +kerning first=218 second=69 amount=-1 +kerning first=79 second=364 amount=-1 +kerning first=198 second=66 amount=-1 +kerning first=262 second=325 amount=-1 +kerning first=211 second=270 amount=-1 +kerning first=100 second=380 amount=-1 +kerning first=107 second=108 amount=-1 +kerning first=1052 second=1073 amount=-1 +kerning first=335 second=8217 amount=-2 +kerning first=193 second=264 amount=-1 +kerning first=350 second=8221 amount=-1 +kerning first=355 second=351 amount=-1 +kerning first=101 second=251 amount=-1 +kerning first=103 second=103 amount=-1 +kerning first=270 second=364 amount=-1 +kerning first=88 second=264 amount=-1 +kerning first=269 second=122 amount=-1 +kerning first=1055 second=1034 amount=-1 +kerning first=283 second=351 amount=-1 +kerning first=80 second=193 amount=-1 +kerning first=350 second=251 amount=-1 +kerning first=204 second=69 amount=-1 +kerning first=198 second=364 amount=-1 +kerning first=252 second=277 amount=-1 +kerning first=108 second=316 amount=-1 +kerning first=278 second=251 amount=-1 +kerning first=263 second=8217 amount=-2 +kerning first=275 second=355 amount=-1 +kerning first=8218 second=254 amount=-1 +kerning first=314 second=251 amount=-1 +kerning first=1065 second=1060 amount=-1 +kerning first=252 second=232 amount=-1 +kerning first=325 second=273 amount=-1 +kerning first=70 second=351 amount=-1 +kerning first=85 second=8221 amount=-1 +kerning first=72 second=99 amount=-1 +kerning first=374 second=65 amount=-1 +kerning first=121 second=8221 amount=-2 +kerning first=69 second=355 amount=-1 +kerning first=1041 second=1051 amount=-1 +kerning first=226 second=8221 amount=-2 +kerning first=1064 second=1064 amount=-1 +kerning first=221 second=193 amount=-1 +kerning first=249 second=99 amount=-1 +kerning first=211 second=351 amount=-1 +kerning first=204 second=286 amount=-1 +kerning first=218 second=242 amount=-1 +kerning first=108 second=99 amount=-1 +kerning first=77 second=242 amount=-1 +kerning first=356 second=347 amount=-1 +kerning first=326 second=242 amount=-1 +kerning first=8250 second=365 amount=-1 +kerning first=1056 second=1030 amount=-1 +kerning first=282 second=171 amount=-1 +kerning first=362 second=242 amount=-1 +kerning first=1066 second=1056 amount=-1 +kerning first=354 second=171 amount=-1 +kerning first=264 second=78 amount=-1 +kerning first=199 second=333 amount=-1 +kerning first=370 second=113 amount=-1 +kerning first=70 second=8250 amount=-2 +kerning first=65 second=118 amount=-1 +kerning first=78 second=44 amount=-1 +kerning first=205 second=282 amount=-1 +kerning first=330 second=346 amount=-1 +kerning first=275 second=100 amount=-1 +kerning first=230 second=233 amount=-1 +kerning first=8218 second=117 amount=-1 +kerning first=86 second=8217 amount=-1 +kerning first=89 second=233 amount=-1 +kerning first=122 second=8217 amount=-1 +kerning first=1049 second=1091 amount=-1 +kerning first=69 second=171 amount=-1 +kerning first=211 second=310 amount=-1 +kerning first=374 second=233 amount=-1 +kerning first=89 second=117 amount=-1 +kerning first=266 second=233 amount=-1 +kerning first=302 second=233 amount=-1 +kerning first=74 second=71 amount=-1 +kerning first=1056 second=1108 amount=-1 +kerning first=298 second=330 amount=-1 +kerning first=1069 second=1034 amount=-1 +kerning first=325 second=246 amount=-1 +kerning first=73 second=68 amount=-1 +kerning first=356 second=103 amount=-1 +kerning first=289 second=246 amount=-1 +kerning first=80 second=220 amount=-1 +kerning first=246 second=382 amount=-1 +kerning first=206 second=224 amount=-1 +kerning first=211 second=194 amount=-1 +kerning first=217 second=246 amount=-1 +kerning first=248 second=103 amount=-1 +kerning first=368 second=365 amount=-1 +kerning first=346 second=77 amount=-1 +kerning first=375 second=45 amount=-1 +kerning first=354 second=382 amount=-1 +kerning first=85 second=330 amount=-1 +kerning first=108 second=289 amount=-1 +kerning first=253 second=316 amount=-1 +kerning first=107 second=103 amount=-1 +kerning first=263 second=109 amount=-1 +kerning first=1078 second=1074 amount=-1 +kerning first=271 second=333 amount=-1 +kerning first=70 second=194 amount=-1 +kerning first=1068 second=1048 amount=-1 +kerning first=307 second=333 amount=-1 +kerning first=214 second=68 amount=-1 +kerning first=370 second=330 amount=-1 +kerning first=119 second=365 amount=-1 +kerning first=8220 second=260 amount=-2 +kerning first=271 second=171 amount=-1 +kerning first=286 second=68 amount=-1 +kerning first=83 second=365 amount=-1 +kerning first=296 second=334 amount=-1 +kerning first=73 second=339 amount=-1 +kerning first=204 second=313 amount=-1 +kerning first=251 second=281 amount=-1 +kerning first=1085 second=1095 amount=-1 +kerning first=287 second=281 amount=-1 +kerning first=334 second=86 amount=-1 +kerning first=212 second=347 amount=-1 +kerning first=72 second=355 amount=-1 +kerning first=323 second=281 amount=-1 +kerning first=1033 second=1041 amount=-1 +kerning first=272 second=8220 amount=-2 +kerning first=112 second=8218 amount=-1 +kerning first=197 second=211 amount=-1 +kerning first=87 second=353 amount=-1 +kerning first=380 second=8220 amount=-1 +kerning first=323 second=270 amount=-1 +kerning first=344 second=8220 amount=-1 +kerning first=1031 second=1025 amount=-1 +kerning first=316 second=277 amount=-1 +kerning first=274 second=77 amount=-1 +kerning first=234 second=120 amount=-1 +kerning first=202 second=77 amount=-1 +kerning first=187 second=315 amount=-1 +kerning first=250 second=339 amount=-1 +kerning first=8218 second=105 amount=-1 +kerning first=8217 second=326 amount=-1 +kerning first=74 second=281 amount=-1 +kerning first=1052 second=1100 amount=-1 +kerning first=1070 second=1070 amount=-1 +kerning first=110 second=281 amount=-1 +kerning first=110 second=118 amount=-1 +kerning first=201 second=298 amount=-1 +kerning first=272 second=356 amount=-1 +kerning first=68 second=202 amount=-1 +kerning first=1053 second=1042 amount=-1 +kerning first=288 second=8249 amount=-1 +kerning first=78 second=368 amount=-1 +kerning first=204 second=232 amount=-1 +kerning first=302 second=206 amount=-1 +kerning first=105 second=232 amount=-1 +kerning first=324 second=8249 amount=-1 +kerning first=284 second=76 amount=-1 +kerning first=338 second=206 amount=-1 +kerning first=370 second=357 amount=-1 +kerning first=99 second=232 amount=-1 +kerning first=74 second=335 amount=-1 +kerning first=1028 second=1118 amount=-1 +kerning first=219 second=368 amount=-1 +kerning first=217 second=219 amount=-1 +kerning first=266 second=206 amount=-1 +kerning first=101 second=111 amount=-1 +kerning first=76 second=219 amount=-1 +kerning first=262 second=357 amount=-1 +kerning first=8250 second=121 amount=-1 +kerning first=110 second=335 amount=-1 +kerning first=1064 second=1118 amount=-1 +kerning first=251 second=335 amount=-1 +kerning first=240 second=232 amount=-1 +kerning first=298 second=357 amount=-1 +kerning first=203 second=344 amount=-1 +kerning first=1033 second=1044 amount=-1 +kerning first=344 second=85 amount=-1 +kerning first=45 second=71 amount=-1 +kerning first=234 second=234 amount=-1 +kerning first=264 second=241 amount=-1 +kerning first=272 second=85 amount=-1 +kerning first=8250 second=338 amount=-1 +kerning first=67 second=102 amount=-1 +kerning first=72 second=262 amount=-1 +kerning first=200 second=85 amount=-1 +kerning first=327 second=368 amount=-1 +kerning first=1069 second=1044 amount=-1 +kerning first=252 second=8249 amount=-1 +kerning first=368 second=67 amount=-1 +kerning first=1042 second=1042 amount=-1 +kerning first=296 second=67 amount=-1 +kerning first=275 second=46 amount=-1 +kerning first=286 second=366 amount=-1 +kerning first=330 second=216 amount=-1 +kerning first=70 second=378 amount=-1 +kerning first=347 second=46 amount=-1 +kerning first=258 second=213 amount=-1 +kerning first=214 second=366 amount=-1 +kerning first=73 second=366 amount=-1 +kerning first=1036 second=1081 amount=-1 +kerning first=366 second=216 amount=-1 +kerning first=87 second=241 amount=-1 +kerning first=85 second=357 amount=-1 +kerning first=296 second=284 amount=-1 +kerning first=86 second=353 amount=-1 +kerning first=89 second=363 amount=-1 +kerning first=202 second=325 amount=-1 +kerning first=212 second=370 amount=-1 +kerning first=74 second=103 amount=-1 +kerning first=195 second=252 amount=-1 +kerning first=354 second=225 amount=-1 +kerning first=207 second=350 amount=-1 +kerning first=194 second=363 amount=-1 +kerning first=211 second=80 amount=-1 +kerning first=230 second=363 amount=-1 +kerning first=209 second=229 amount=-1 +kerning first=263 second=353 amount=-1 +kerning first=1065 second=1114 amount=-1 +kerning first=45 second=216 amount=-1 +kerning first=70 second=80 amount=-1 +kerning first=75 second=8222 amount=-1 +kerning first=117 second=113 amount=-1 +kerning first=270 second=207 amount=-1 +kerning first=204 second=73 amount=-1 +kerning first=70 second=107 amount=-1 +kerning first=75 second=250 amount=-1 +kerning first=1033 second=1071 amount=-1 +kerning first=256 second=8220 amount=-2 +kerning first=119 second=311 amount=-1 +kerning first=8217 second=353 amount=-1 +kerning first=280 second=70 amount=-1 +kerning first=118 second=369 amount=-1 +kerning first=283 second=378 amount=-1 +kerning first=298 second=113 amount=-1 +kerning first=205 second=201 amount=-1 +kerning first=1041 second=1070 amount=-1 +kerning first=310 second=44 amount=-1 +kerning first=226 second=113 amount=-1 +kerning first=288 second=8222 amount=-1 +kerning first=262 second=113 amount=-1 +kerning first=235 second=116 amount=-1 +kerning first=216 second=8222 amount=-1 +kerning first=1049 second=1068 amount=-1 +kerning first=199 second=116 amount=-1 +kerning first=326 second=118 amount=-1 +kerning first=203 second=317 amount=-1 +kerning first=111 second=8222 amount=-1 +kerning first=85 second=113 amount=-1 +kerning first=198 second=207 amount=-1 +kerning first=99 second=259 amount=-1 +kerning first=264 second=268 amount=-1 +kerning first=8217 second=109 amount=-1 +kerning first=192 second=268 amount=-1 +kerning first=1036 second=1108 amount=-1 +kerning first=195 second=332 amount=-1 +kerning first=8217 second=194 amount=-2 +kerning first=338 second=284 amount=-1 +kerning first=1054 second=1038 amount=-1 +kerning first=68 second=256 amount=-1 +kerning first=118 second=98 amount=-1 +kerning first=200 second=302 amount=-1 +kerning first=1053 second=1096 amount=-1 +kerning first=193 second=210 amount=-1 +kerning first=323 second=335 amount=-1 +kerning first=287 second=335 amount=-1 +kerning first=88 second=210 amount=-1 +kerning first=210 second=198 amount=-1 +kerning first=203 second=73 amount=-1 +kerning first=324 second=277 amount=-1 +kerning first=73 second=122 amount=-1 +kerning first=264 second=234 amount=-1 +kerning first=1044 second=1114 amount=-1 +kerning first=87 second=268 amount=-1 +kerning first=325 second=219 amount=-1 +kerning first=283 second=107 amount=-1 +kerning first=202 second=213 amount=-1 +kerning first=264 second=187 amount=-1 +kerning first=194 second=336 amount=-1 +kerning first=66 second=66 amount=-1 +kerning first=79 second=88 amount=-1 +kerning first=192 second=187 amount=-1 +kerning first=1028 second=1080 amount=-1 +kerning first=354 second=279 amount=-1 +kerning first=266 second=336 amount=-1 +kerning first=228 second=187 amount=-1 +kerning first=263 second=117 amount=-1 +kerning first=302 second=336 amount=-1 +kerning first=74 second=200 amount=-1 +kerning first=81 second=270 amount=-1 +kerning first=204 second=362 amount=-1 +kerning first=241 second=118 amount=-1 +kerning first=338 second=336 amount=-1 +kerning first=310 second=213 amount=-1 +kerning first=8217 second=245 amount=-1 +kerning first=267 second=8250 amount=-1 +kerning first=374 second=336 amount=-1 +kerning first=274 second=213 amount=-1 +kerning first=336 second=187 amount=-1 +kerning first=45 second=270 amount=-1 +kerning first=207 second=323 amount=-1 +kerning first=209 second=283 amount=-1 +kerning first=194 second=119 amount=-1 +kerning first=105 second=279 amount=-1 +kerning first=356 second=244 amount=-1 +kerning first=192 second=371 amount=-1 +kerning first=82 second=266 amount=-1 +kerning first=121 second=314 amount=-1 +kerning first=187 second=266 amount=-1 +kerning first=87 second=187 amount=-1 +kerning first=206 second=327 amount=-1 +kerning first=323 second=200 amount=-1 +kerning first=73 second=204 amount=-1 +kerning first=278 second=327 amount=-1 +kerning first=368 second=262 amount=-1 +kerning first=106 second=248 amount=-1 +kerning first=291 second=314 amount=-1 +kerning first=268 second=79 amount=-1 +kerning first=350 second=327 amount=-1 +kerning first=70 second=248 amount=-1 +kerning first=255 second=314 amount=-1 +kerning first=304 second=79 amount=-1 +kerning first=1060 second=1036 amount=-1 +kerning first=327 second=171 amount=-1 +kerning first=1056 second=1052 amount=-1 +kerning first=206 second=110 amount=-1 +kerning first=274 second=327 amount=-1 +kerning first=68 second=66 amount=-1 +kerning first=1070 second=1062 amount=-1 +kerning first=281 second=283 amount=-1 +kerning first=120 second=318 amount=-1 +kerning first=196 second=79 amount=-1 +kerning first=87 second=371 amount=-1 +kerning first=113 second=318 amount=-1 +kerning first=229 second=245 amount=-1 +kerning first=67 second=70 amount=-1 +kerning first=88 second=367 amount=-1 +kerning first=111 second=380 amount=-1 +kerning first=254 second=318 amount=-1 +kerning first=193 second=367 amount=-1 +kerning first=217 second=192 amount=-1 +kerning first=267 second=305 amount=-1 +kerning first=328 second=231 amount=-1 +kerning first=339 second=44 amount=-1 +kerning first=231 second=305 amount=-1 +kerning first=330 second=270 amount=-1 +kerning first=203 second=209 amount=-1 +kerning first=1064 second=1089 amount=-1 +kerning first=378 second=8249 amount=-1 +kerning first=1047 second=1049 amount=-1 +kerning first=366 second=270 amount=-1 +kerning first=197 second=356 amount=-1 +kerning first=1048 second=1072 amount=-1 +kerning first=100 second=114 amount=-1 +kerning first=8217 second=218 amount=-1 +kerning first=374 second=363 amount=-1 +kerning first=68 second=310 amount=-1 +kerning first=205 second=114 amount=-1 +kerning first=282 second=252 amount=-1 +kerning first=241 second=8249 amount=-1 +kerning first=218 second=101 amount=-1 +kerning first=219 second=79 amount=-1 +kerning first=199 second=284 amount=-1 +kerning first=364 second=115 amount=-1 +kerning first=326 second=101 amount=-1 +kerning first=79 second=115 amount=-1 +kerning first=242 second=114 amount=-1 +kerning first=204 second=205 amount=-1 +kerning first=66 second=296 amount=-1 +kerning first=65 second=354 amount=-1 +kerning first=99 second=335 amount=-1 +kerning first=71 second=217 amount=-1 +kerning first=362 second=101 amount=-1 +kerning first=220 second=115 amount=-1 +kerning first=192 second=214 amount=-1 +kerning first=250 second=231 amount=-1 +kerning first=1056 second=1036 amount=-1 +kerning first=212 second=217 amount=-1 +kerning first=87 second=214 amount=-1 +kerning first=232 second=106 amount=-1 +kerning first=207 second=296 amount=-1 +kerning first=284 second=217 amount=-1 +kerning first=210 second=89 amount=-1 +kerning first=229 second=8220 amount=-2 +kerning first=73 second=231 amount=-1 +kerning first=109 second=231 amount=-1 +kerning first=264 second=214 amount=-1 +kerning first=264 second=344 amount=-1 +kerning first=209 second=310 amount=-1 +kerning first=69 second=252 amount=-1 +kerning first=100 second=8249 amount=-1 +kerning first=242 second=187 amount=-1 +kerning first=330 second=243 amount=-1 +kerning first=283 second=275 amount=-1 +kerning first=77 second=345 amount=-1 +kerning first=288 second=223 amount=-1 +kerning first=370 second=249 amount=-1 +kerning first=1041 second=1046 amount=-1 +kerning first=355 second=275 amount=-1 +kerning first=366 second=243 amount=-1 +kerning first=85 second=249 amount=-1 +kerning first=108 second=45 amount=-1 +kerning first=198 second=71 amount=-1 +kerning first=1049 second=1043 amount=-1 +kerning first=296 second=235 amount=-1 +kerning first=121 second=249 amount=-1 +kerning first=255 second=287 amount=-1 +kerning first=106 second=275 amount=-1 +kerning first=218 second=345 amount=-1 +kerning first=187 second=223 amount=-1 +kerning first=254 second=345 amount=-1 +kerning first=368 second=235 amount=-1 +kerning first=72 second=45 amount=-1 +kerning first=290 second=345 amount=-1 +kerning first=8218 second=268 amount=-1 +kerning first=326 second=345 amount=-1 +kerning first=362 second=345 amount=-1 +kerning first=200 second=213 amount=-1 +kerning first=81 second=80 amount=-1 +kerning first=363 second=287 amount=-1 +kerning first=70 second=275 amount=-1 +kerning first=206 second=83 amount=-1 +kerning first=45 second=80 amount=-1 +kerning first=249 second=45 amount=-1 +kerning first=67 second=97 amount=-1 +kerning first=330 second=80 amount=-1 +kerning first=1118 second=1080 amount=-1 +kerning first=117 second=243 amount=-1 +kerning first=1046 second=1080 amount=-1 +kerning first=89 second=336 amount=-1 +kerning first=1049 second=1083 amount=-1 +kerning first=107 second=44 amount=-1 +kerning first=281 second=337 amount=-1 +kerning first=68 second=195 amount=-1 +kerning first=205 second=304 amount=-1 +kerning first=82 second=213 amount=-1 +kerning first=86 second=245 amount=-1 +kerning first=1031 second=1079 amount=-1 +kerning first=209 second=337 amount=-1 +kerning first=200 second=199 amount=-1 +kerning first=82 second=212 amount=-1 +kerning first=350 second=8218 amount=-1 +kerning first=104 second=337 amount=-1 +kerning first=77 second=74 amount=-1 +kerning first=245 second=120 amount=-1 +kerning first=282 second=364 amount=-1 +kerning first=87 second=100 amount=-1 +kerning first=344 second=199 amount=-1 +kerning first=281 second=120 amount=-1 +kerning first=218 second=74 amount=-1 +kerning first=302 second=315 amount=-1 +kerning first=45 second=324 amount=-1 +kerning first=101 second=8218 amount=-1 +kerning first=75 second=220 amount=-1 +kerning first=362 second=74 amount=-1 +kerning first=1042 second=1082 amount=-1 +kerning first=279 second=269 amount=-1 +kerning first=242 second=8218 amount=-1 +kerning first=227 second=245 amount=-1 +kerning first=1039 second=1037 amount=-1 +kerning first=119 second=250 amount=-1 +kerning first=207 second=269 amount=-1 +kerning first=199 second=203 amount=-1 +kerning first=283 second=8220 amount=-2 +kerning first=221 second=111 amount=-1 +kerning first=213 second=72 amount=-1 +kerning first=1034 second=1037 amount=-1 +kerning first=257 second=111 amount=-1 +kerning first=72 second=72 amount=-1 +kerning first=355 second=8220 amount=-1 +kerning first=1042 second=1101 amount=-1 +kerning first=1091 second=1088 amount=-1 +kerning first=289 second=105 amount=-1 +kerning first=1078 second=1101 amount=-1 +kerning first=365 second=111 amount=-1 +kerning first=287 second=254 amount=-1 +kerning first=230 second=249 amount=-1 +kerning first=72 second=370 amount=-1 +kerning first=212 second=374 amount=-1 +kerning first=219 second=260 amount=-1 +kerning first=198 second=315 amount=-1 +kerning first=275 second=263 amount=-1 +kerning first=277 second=114 amount=-1 +kerning first=187 second=212 amount=-1 +kerning first=97 second=267 amount=-1 +kerning first=1059 second=1094 amount=-1 +kerning first=241 second=114 amount=-1 +kerning first=1043 second=1097 amount=-1 +kerning first=70 second=8220 amount=-1 +kerning first=80 second=111 amount=-1 +kerning first=211 second=8220 amount=-2 +kerning first=258 second=253 amount=-1 +kerning first=213 second=370 amount=-1 +kerning first=270 second=315 amount=-1 +kerning first=224 second=316 amount=-1 +kerning first=323 second=227 amount=-1 +kerning first=1067 second=1052 amount=-1 +kerning first=317 second=364 amount=-1 +kerning first=232 second=337 amount=-1 +kerning first=267 second=251 amount=-1 +kerning first=201 second=81 amount=-1 +kerning first=195 second=251 amount=-1 +kerning first=1064 second=1105 amount=-1 +kerning first=209 second=364 amount=-1 +kerning first=375 second=251 amount=-1 +kerning first=206 second=273 amount=-1 +kerning first=101 second=273 amount=-1 +kerning first=205 second=331 amount=-1 +kerning first=339 second=251 amount=-1 +kerning first=270 second=44 amount=-1 +kerning first=283 second=248 amount=-1 +kerning first=204 second=357 amount=-1 +kerning first=80 second=355 amount=-1 +kerning first=325 second=78 amount=-1 +kerning first=355 second=248 amount=-1 +kerning first=234 second=44 amount=-1 +kerning first=290 second=69 amount=-1 +kerning first=1107 second=1085 amount=-1 +kerning first=207 second=242 amount=-1 +kerning first=338 second=282 amount=-1 +kerning first=302 second=282 amount=-1 +kerning first=266 second=282 amount=-1 +kerning first=1049 second=1067 amount=-1 +kerning first=1052 second=1024 amount=-1 +kerning first=8218 second=214 amount=-1 +kerning first=279 second=242 amount=-1 +kerning first=200 second=8220 amount=-1 +kerning first=74 second=227 amount=-1 +kerning first=78 second=233 amount=-1 +kerning first=313 second=87 amount=-1 +kerning first=199 second=230 amount=-1 +kerning first=305 second=99 amount=-1 +kerning first=219 second=233 amount=-1 +kerning first=1027 second=1073 amount=-1 +kerning first=8222 second=220 amount=-1 diff --git a/jme3-examples/src/main/resources/jme3test/font/FT-FreeSerif16I.png b/jme3-examples/src/main/resources/jme3test/font/FT-FreeSerif16I.png new file mode 100644 index 000000000..a9cf3d830 Binary files /dev/null and b/jme3-examples/src/main/resources/jme3test/font/FT-FreeSerif16I.png differ diff --git a/jme3-examples/src/main/resources/jme3test/font/FreeSerif.ttf b/jme3-examples/src/main/resources/jme3test/font/FreeSerif.ttf new file mode 100644 index 000000000..b8906f505 Binary files /dev/null and b/jme3-examples/src/main/resources/jme3test/font/FreeSerif.ttf differ diff --git a/jme3-examples/src/main/resources/jme3test/font/FreeSerif16I.fnt b/jme3-examples/src/main/resources/jme3test/font/FreeSerif16I.fnt new file mode 100644 index 000000000..4ff598269 --- /dev/null +++ b/jme3-examples/src/main/resources/jme3test/font/FreeSerif16I.fnt @@ -0,0 +1,8029 @@ +info face="Free Serif" size=16 bold=0 italic=1 charset="" unicode=0 stretchH=100 smooth=1 aa=1 padding=1,1,1,1 spacing=-2,-2 +common lineHeight=22 base=16 scaleW=512 scaleH=512 pages=1 packed=0 +page id=0 file="FreeSerif16I.png" +chars count=821 +char id=0 x=138 y=177 width=13 height=13 xoffset=0 yoffset=4 xadvance=11 page=0 chnl=0 +char id=13 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=0 page=0 chnl=0 +char id=32 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=4 page=0 chnl=0 +char id=33 x=294 y=106 width=6 height=14 xoffset=1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=34 x=252 y=278 width=7 height=7 xoffset=1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=35 x=151 y=177 width=13 height=13 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=36 x=282 y=57 width=11 height=16 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=37 x=300 y=106 width=14 height=14 xoffset=1 yoffset=4 xadvance=13 page=0 chnl=0 +char id=38 x=314 y=106 width=14 height=14 xoffset=0 yoffset=4 xadvance=12 page=0 chnl=0 +char id=39 x=505 y=256 width=4 height=7 xoffset=1 yoffset=4 xadvance=3 page=0 chnl=0 +char id=40 x=293 y=57 width=9 height=16 xoffset=0 yoffset=4 xadvance=5 page=0 chnl=0 +char id=41 x=302 y=57 width=9 height=16 xoffset=-2 yoffset=4 xadvance=5 page=0 chnl=0 +char id=42 x=144 y=278 width=9 height=9 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=43 x=0 y=256 width=11 height=11 xoffset=0 yoffset=6 xadvance=9 page=0 chnl=0 +char id=44 x=505 y=135 width=6 height=7 xoffset=-1 yoffset=13 xadvance=4 page=0 chnl=0 +char id=45 x=34 y=288 width=7 height=4 xoffset=0 yoffset=10 xadvance=5 page=0 chnl=0 +char id=46 x=451 y=278 width=5 height=5 xoffset=0 yoffset=13 xadvance=4 page=0 chnl=0 +char id=47 x=328 y=106 width=12 height=14 xoffset=-2 yoffset=4 xadvance=4 page=0 chnl=0 +char id=48 x=340 y=106 width=10 height=14 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=49 x=164 y=177 width=8 height=13 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=50 x=172 y=177 width=11 height=13 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=51 x=350 y=106 width=10 height=14 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=52 x=183 y=177 width=11 height=13 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=53 x=360 y=106 width=11 height=14 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=54 x=371 y=106 width=12 height=14 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=55 x=383 y=106 width=12 height=14 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=56 x=395 y=106 width=10 height=14 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=57 x=405 y=106 width=11 height=14 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=58 x=504 y=230 width=6 height=11 xoffset=0 yoffset=7 xadvance=4 page=0 chnl=0 +char id=59 x=194 y=177 width=7 height=13 xoffset=-1 yoffset=7 xadvance=4 page=0 chnl=0 +char id=60 x=129 y=243 width=13 height=12 xoffset=0 yoffset=6 xadvance=9 page=0 chnl=0 +char id=61 x=222 y=278 width=12 height=8 xoffset=-1 yoffset=8 xadvance=9 page=0 chnl=0 +char id=62 x=142 y=243 width=12 height=12 xoffset=-1 yoffset=6 xadvance=9 page=0 chnl=0 +char id=63 x=416 y=106 width=10 height=14 xoffset=1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=64 x=426 y=106 width=15 height=14 xoffset=1 yoffset=4 xadvance=15 page=0 chnl=0 +char id=65 x=201 y=177 width=14 height=13 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=66 x=215 y=177 width=13 height=13 xoffset=-1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=67 x=441 y=106 width=13 height=14 xoffset=0 yoffset=4 xadvance=11 page=0 chnl=0 +char id=68 x=228 y=177 width=14 height=13 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=69 x=242 y=177 width=13 height=13 xoffset=-1 yoffset=4 xadvance=10 page=0 chnl=0 +char id=70 x=255 y=177 width=14 height=13 xoffset=-1 yoffset=4 xadvance=9 page=0 chnl=0 +char id=71 x=454 y=106 width=14 height=14 xoffset=0 yoffset=4 xadvance=12 page=0 chnl=0 +char id=72 x=269 y=177 width=17 height=13 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=73 x=286 y=177 width=10 height=13 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=74 x=468 y=106 width=11 height=14 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=75 x=296 y=177 width=15 height=13 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=76 x=311 y=177 width=12 height=13 xoffset=-1 yoffset=4 xadvance=10 page=0 chnl=0 +char id=77 x=323 y=177 width=19 height=13 xoffset=-1 yoffset=4 xadvance=14 page=0 chnl=0 +char id=78 x=479 y=106 width=17 height=14 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=79 x=496 y=106 width=14 height=14 xoffset=0 yoffset=4 xadvance=12 page=0 chnl=0 +char id=80 x=342 y=177 width=14 height=13 xoffset=-1 yoffset=4 xadvance=9 page=0 chnl=0 +char id=81 x=311 y=57 width=14 height=16 xoffset=0 yoffset=4 xadvance=12 page=0 chnl=0 +char id=82 x=356 y=177 width=13 height=13 xoffset=-1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=83 x=0 y=121 width=11 height=14 xoffset=0 yoffset=4 xadvance=9 page=0 chnl=0 +char id=84 x=369 y=177 width=14 height=13 xoffset=0 yoffset=4 xadvance=10 page=0 chnl=0 +char id=85 x=11 y=121 width=15 height=14 xoffset=1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=86 x=26 y=121 width=14 height=14 xoffset=1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=87 x=40 y=121 width=19 height=14 xoffset=0 yoffset=4 xadvance=15 page=0 chnl=0 +char id=88 x=383 y=177 width=16 height=13 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=89 x=399 y=177 width=15 height=13 xoffset=1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=90 x=414 y=177 width=15 height=13 xoffset=-1 yoffset=4 xadvance=10 page=0 chnl=0 +char id=91 x=325 y=57 width=9 height=16 xoffset=0 yoffset=4 xadvance=5 page=0 chnl=0 +char id=92 x=59 y=121 width=6 height=14 xoffset=0 yoffset=4 xadvance=5 page=0 chnl=0 +char id=93 x=334 y=57 width=9 height=16 xoffset=-2 yoffset=4 xadvance=5 page=0 chnl=0 +char id=94 x=153 y=278 width=9 height=9 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=95 x=108 y=288 width=11 height=3 xoffset=-2 yoffset=16 xadvance=8 page=0 chnl=0 +char id=96 x=456 y=278 width=6 height=5 xoffset=1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=97 x=11 y=256 width=10 height=11 xoffset=-1 yoffset=7 xadvance=7 page=0 chnl=0 +char id=98 x=65 y=121 width=10 height=14 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=99 x=21 y=256 width=10 height=11 xoffset=-1 yoffset=7 xadvance=7 page=0 chnl=0 +char id=100 x=75 y=121 width=11 height=14 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=101 x=31 y=256 width=10 height=11 xoffset=-1 yoffset=7 xadvance=7 page=0 chnl=0 +char id=102 x=429 y=177 width=12 height=13 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=103 x=86 y=121 width=11 height=14 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=0 +char id=104 x=441 y=177 width=10 height=13 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=105 x=451 y=177 width=7 height=13 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=106 x=120 y=22 width=10 height=17 xoffset=-3 yoffset=4 xadvance=4 page=0 chnl=0 +char id=107 x=458 y=177 width=11 height=13 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=108 x=469 y=177 width=7 height=13 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=109 x=182 y=267 width=15 height=10 xoffset=-1 yoffset=7 xadvance=12 page=0 chnl=0 +char id=110 x=197 y=267 width=10 height=10 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=0 +char id=111 x=41 y=256 width=10 height=11 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=0 +char id=112 x=97 y=121 width=12 height=14 xoffset=-2 yoffset=7 xadvance=8 page=0 chnl=0 +char id=113 x=109 y=121 width=11 height=14 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=0 +char id=114 x=207 y=267 width=10 height=10 xoffset=-1 yoffset=7 xadvance=5 page=0 chnl=0 +char id=115 x=51 y=256 width=9 height=11 xoffset=-1 yoffset=7 xadvance=6 page=0 chnl=0 +char id=116 x=476 y=177 width=8 height=13 xoffset=0 yoffset=5 xadvance=4 page=0 chnl=0 +char id=117 x=60 y=256 width=9 height=11 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=0 +char id=118 x=69 y=256 width=10 height=11 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=0 +char id=119 x=79 y=256 width=14 height=11 xoffset=0 yoffset=7 xadvance=12 page=0 chnl=0 +char id=120 x=217 y=267 width=11 height=10 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=0 +char id=121 x=120 y=121 width=11 height=14 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=0 +char id=122 x=228 y=267 width=10 height=10 xoffset=-1 yoffset=7 xadvance=7 page=0 chnl=0 +char id=123 x=503 y=40 width=8 height=16 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=124 x=131 y=121 width=6 height=14 xoffset=0 yoffset=4 xadvance=3 page=0 chnl=0 +char id=125 x=343 y=57 width=8 height=16 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=126 x=381 y=278 width=10 height=6 xoffset=0 yoffset=9 xadvance=9 page=0 chnl=0 +char id=160 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=4 page=0 chnl=0 +char id=161 x=137 y=121 width=7 height=14 xoffset=-1 yoffset=7 xadvance=5 page=0 chnl=0 +char id=162 x=446 y=90 width=10 height=15 xoffset=0 yoffset=5 xadvance=8 page=0 chnl=0 +char id=163 x=144 y=121 width=11 height=14 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=164 x=93 y=256 width=13 height=11 xoffset=-1 yoffset=5 xadvance=8 page=0 chnl=0 +char id=165 x=484 y=177 width=15 height=13 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=166 x=155 y=121 width=6 height=14 xoffset=0 yoffset=4 xadvance=3 page=0 chnl=0 +char id=167 x=351 y=57 width=9 height=16 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=168 x=41 y=288 width=9 height=4 xoffset=0 yoffset=5 xadvance=5 page=0 chnl=0 +char id=169 x=456 y=90 width=15 height=15 xoffset=0 yoffset=3 xadvance=13 page=0 chnl=0 +char id=170 x=259 y=278 width=8 height=7 xoffset=0 yoffset=4 xadvance=4 page=0 chnl=0 +char id=171 x=162 y=278 width=10 height=9 xoffset=-1 yoffset=8 xadvance=7 page=0 chnl=0 +char id=172 x=234 y=278 width=11 height=8 xoffset=0 yoffset=8 xadvance=9 page=0 chnl=0 +char id=173 x=50 y=288 width=7 height=4 xoffset=0 yoffset=10 xadvance=5 page=0 chnl=0 +char id=174 x=471 y=90 width=15 height=15 xoffset=0 yoffset=3 xadvance=13 page=0 chnl=0 +char id=175 x=57 y=288 width=9 height=4 xoffset=0 yoffset=5 xadvance=5 page=0 chnl=0 +char id=176 x=267 y=278 width=9 height=7 xoffset=1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=177 x=499 y=177 width=12 height=13 xoffset=-1 yoffset=4 xadvance=9 page=0 chnl=0 +char id=178 x=172 y=278 width=9 height=9 xoffset=0 yoffset=4 xadvance=5 page=0 chnl=0 +char id=179 x=181 y=278 width=9 height=9 xoffset=0 yoffset=4 xadvance=5 page=0 chnl=0 +char id=180 x=462 y=278 width=8 height=5 xoffset=1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=181 x=161 y=121 width=11 height=14 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=0 +char id=182 x=360 y=57 width=12 height=16 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=183 x=470 y=278 width=5 height=5 xoffset=0 yoffset=10 xadvance=4 page=0 chnl=0 +char id=184 x=276 y=278 width=6 height=7 xoffset=-1 yoffset=14 xadvance=5 page=0 chnl=0 +char id=185 x=190 y=278 width=7 height=9 xoffset=0 yoffset=4 xadvance=5 page=0 chnl=0 +char id=186 x=282 y=278 width=9 height=7 xoffset=0 yoffset=4 xadvance=5 page=0 chnl=0 +char id=187 x=197 y=278 width=11 height=9 xoffset=-1 yoffset=8 xadvance=7 page=0 chnl=0 +char id=188 x=172 y=121 width=13 height=14 xoffset=0 yoffset=4 xadvance=12 page=0 chnl=0 +char id=189 x=185 y=121 width=14 height=14 xoffset=0 yoffset=4 xadvance=12 page=0 chnl=0 +char id=190 x=199 y=121 width=13 height=14 xoffset=0 yoffset=4 xadvance=12 page=0 chnl=0 +char id=191 x=212 y=121 width=8 height=14 xoffset=-1 yoffset=7 xadvance=7 page=0 chnl=0 +char id=192 x=130 y=22 width=14 height=17 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=193 x=144 y=22 width=15 height=17 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=194 x=159 y=22 width=14 height=17 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=195 x=372 y=57 width=14 height=16 xoffset=-1 yoffset=1 xadvance=12 page=0 chnl=0 +char id=196 x=386 y=57 width=14 height=16 xoffset=-1 yoffset=1 xadvance=12 page=0 chnl=0 +char id=197 x=173 y=22 width=14 height=17 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=198 x=0 y=191 width=17 height=13 xoffset=-1 yoffset=4 xadvance=14 page=0 chnl=0 +char id=199 x=187 y=22 width=13 height=17 xoffset=0 yoffset=4 xadvance=11 page=0 chnl=0 +char id=200 x=200 y=22 width=13 height=17 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=201 x=213 y=22 width=15 height=17 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=202 x=228 y=22 width=13 height=17 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=203 x=400 y=57 width=15 height=16 xoffset=-1 yoffset=1 xadvance=10 page=0 chnl=0 +char id=204 x=241 y=22 width=12 height=17 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=205 x=253 y=22 width=16 height=17 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=206 x=269 y=22 width=12 height=17 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=207 x=415 y=57 width=14 height=16 xoffset=-1 yoffset=1 xadvance=5 page=0 chnl=0 +char id=208 x=17 y=191 width=14 height=13 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=209 x=281 y=22 width=17 height=17 xoffset=-1 yoffset=1 xadvance=12 page=0 chnl=0 +char id=210 x=121 y=0 width=14 height=18 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=211 x=135 y=0 width=14 height=18 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=212 x=149 y=0 width=14 height=18 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=213 x=298 y=22 width=14 height=17 xoffset=0 yoffset=1 xadvance=12 page=0 chnl=0 +char id=214 x=312 y=22 width=14 height=17 xoffset=0 yoffset=1 xadvance=12 page=0 chnl=0 +char id=215 x=238 y=267 width=12 height=10 xoffset=-1 yoffset=7 xadvance=9 page=0 chnl=0 +char id=216 x=429 y=57 width=15 height=16 xoffset=-1 yoffset=3 xadvance=12 page=0 chnl=0 +char id=217 x=163 y=0 width=15 height=18 xoffset=1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=218 x=178 y=0 width=15 height=18 xoffset=1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=219 x=193 y=0 width=15 height=18 xoffset=1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=220 x=326 y=22 width=15 height=17 xoffset=1 yoffset=1 xadvance=12 page=0 chnl=0 +char id=221 x=341 y=22 width=15 height=17 xoffset=1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=222 x=31 y=191 width=12 height=13 xoffset=-1 yoffset=4 xadvance=9 page=0 chnl=0 +char id=223 x=220 y=121 width=11 height=14 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=224 x=231 y=121 width=10 height=14 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=225 x=241 y=121 width=14 height=14 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=226 x=255 y=121 width=10 height=14 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=227 x=265 y=121 width=10 height=14 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=228 x=43 y=191 width=14 height=13 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=229 x=486 y=90 width=10 height=15 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=230 x=106 y=256 width=13 height=11 xoffset=-1 yoffset=7 xadvance=10 page=0 chnl=0 +char id=231 x=275 y=121 width=10 height=14 xoffset=-1 yoffset=7 xadvance=7 page=0 chnl=0 +char id=232 x=285 y=121 width=10 height=14 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=233 x=295 y=121 width=14 height=14 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=234 x=309 y=121 width=10 height=14 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=235 x=57 y=191 width=14 height=13 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=236 x=71 y=191 width=11 height=13 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=237 x=82 y=191 width=15 height=13 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=238 x=97 y=191 width=11 height=13 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=239 x=154 y=243 width=11 height=12 xoffset=-1 yoffset=5 xadvance=4 page=0 chnl=0 +char id=240 x=319 y=121 width=11 height=14 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=241 x=108 y=191 width=11 height=13 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=242 x=330 y=121 width=10 height=14 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=243 x=340 y=121 width=14 height=14 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=244 x=354 y=121 width=10 height=14 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=245 x=364 y=121 width=10 height=14 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=246 x=119 y=191 width=12 height=13 xoffset=0 yoffset=5 xadvance=8 page=0 chnl=0 +char id=247 x=165 y=243 width=11 height=12 xoffset=0 yoffset=6 xadvance=9 page=0 chnl=0 +char id=248 x=131 y=191 width=11 height=13 xoffset=-1 yoffset=6 xadvance=8 page=0 chnl=0 +char id=249 x=374 y=121 width=9 height=14 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=250 x=383 y=121 width=14 height=14 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=251 x=397 y=121 width=9 height=14 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=252 x=142 y=191 width=12 height=13 xoffset=0 yoffset=5 xadvance=8 page=0 chnl=0 +char id=253 x=356 y=22 width=15 height=17 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=254 x=371 y=22 width=12 height=17 xoffset=-2 yoffset=4 xadvance=8 page=0 chnl=0 +char id=255 x=383 y=22 width=13 height=17 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=256 x=496 y=90 width=15 height=15 xoffset=-1 yoffset=2 xadvance=12 page=0 chnl=0 +char id=257 x=154 y=191 width=14 height=13 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=258 x=396 y=22 width=14 height=17 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=259 x=406 y=121 width=10 height=14 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=260 x=444 y=57 width=15 height=16 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=261 x=168 y=191 width=10 height=13 xoffset=-1 yoffset=7 xadvance=7 page=0 chnl=0 +char id=262 x=208 y=0 width=16 height=18 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=0 +char id=263 x=416 y=121 width=15 height=14 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=264 x=224 y=0 width=13 height=18 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=0 +char id=265 x=431 y=121 width=10 height=14 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=266 x=410 y=22 width=13 height=17 xoffset=0 yoffset=1 xadvance=11 page=0 chnl=0 +char id=267 x=178 y=191 width=10 height=13 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=268 x=237 y=0 width=13 height=18 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=0 +char id=269 x=441 y=121 width=12 height=14 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=270 x=423 y=22 width=14 height=17 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=271 x=453 y=121 width=19 height=14 xoffset=-1 yoffset=4 xadvance=10 page=0 chnl=0 +char id=272 x=188 y=191 width=14 height=13 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=273 x=472 y=121 width=13 height=14 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=274 x=0 y=106 width=13 height=15 xoffset=-1 yoffset=2 xadvance=10 page=0 chnl=0 +char id=275 x=202 y=191 width=14 height=13 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=276 x=437 y=22 width=13 height=17 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=277 x=485 y=121 width=10 height=14 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=278 x=459 y=57 width=13 height=16 xoffset=-1 yoffset=1 xadvance=10 page=0 chnl=0 +char id=279 x=216 y=191 width=10 height=13 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=280 x=472 y=57 width=13 height=16 xoffset=-1 yoffset=4 xadvance=10 page=0 chnl=0 +char id=281 x=226 y=191 width=10 height=13 xoffset=-1 yoffset=7 xadvance=7 page=0 chnl=0 +char id=282 x=450 y=22 width=13 height=17 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=283 x=495 y=121 width=10 height=14 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=284 x=250 y=0 width=14 height=18 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=285 x=463 y=22 width=11 height=17 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=286 x=264 y=0 width=14 height=18 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=287 x=474 y=22 width=11 height=17 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=288 x=485 y=22 width=14 height=17 xoffset=0 yoffset=1 xadvance=12 page=0 chnl=0 +char id=289 x=485 y=57 width=11 height=16 xoffset=-1 yoffset=5 xadvance=8 page=0 chnl=0 +char id=290 x=278 y=0 width=14 height=18 xoffset=0 yoffset=4 xadvance=12 page=0 chnl=0 +char id=291 x=51 y=0 width=11 height=19 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 +char id=292 x=0 y=40 width=17 height=17 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=293 x=499 y=22 width=11 height=17 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=294 x=236 y=191 width=17 height=13 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=295 x=253 y=191 width=10 height=13 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=296 x=496 y=57 width=12 height=16 xoffset=-1 yoffset=1 xadvance=5 page=0 chnl=0 +char id=297 x=176 y=243 width=11 height=12 xoffset=-1 yoffset=5 xadvance=4 page=0 chnl=0 +char id=298 x=13 y=106 width=16 height=15 xoffset=-1 yoffset=2 xadvance=5 page=0 chnl=0 +char id=299 x=187 y=243 width=14 height=12 xoffset=-1 yoffset=5 xadvance=4 page=0 chnl=0 +char id=300 x=17 y=40 width=12 height=17 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=301 x=263 y=191 width=11 height=13 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=302 x=0 y=74 width=10 height=16 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=303 x=10 y=74 width=7 height=16 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=304 x=17 y=74 width=10 height=16 xoffset=-1 yoffset=1 xadvance=5 page=0 chnl=0 +char id=305 x=250 y=267 width=7 height=10 xoffset=-1 yoffset=7 xadvance=4 page=0 chnl=0 +char id=306 x=0 y=135 width=16 height=14 xoffset=-1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=307 x=29 y=40 width=11 height=17 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=308 x=292 y=0 width=13 height=18 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=309 x=40 y=40 width=14 height=17 xoffset=-3 yoffset=4 xadvance=4 page=0 chnl=0 +char id=310 x=305 y=0 width=15 height=18 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=311 x=320 y=0 width=11 height=18 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=312 x=257 y=267 width=11 height=10 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=0 +char id=313 x=54 y=40 width=12 height=17 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=314 x=66 y=40 width=16 height=17 xoffset=-1 yoffset=0 xadvance=4 page=0 chnl=0 +char id=315 x=331 y=0 width=12 height=18 xoffset=-1 yoffset=4 xadvance=10 page=0 chnl=0 +char id=316 x=343 y=0 width=7 height=18 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=317 x=274 y=191 width=15 height=13 xoffset=-1 yoffset=4 xadvance=10 page=0 chnl=0 +char id=318 x=289 y=191 width=15 height=13 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=319 x=304 y=191 width=12 height=13 xoffset=-1 yoffset=4 xadvance=10 page=0 chnl=0 +char id=320 x=316 y=191 width=9 height=13 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=321 x=325 y=191 width=12 height=13 xoffset=-1 yoffset=4 xadvance=10 page=0 chnl=0 +char id=322 x=337 y=191 width=9 height=13 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=323 x=350 y=0 width=17 height=18 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=324 x=346 y=191 width=15 height=13 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=325 x=367 y=0 width=17 height=18 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=326 x=29 y=106 width=10 height=15 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=0 +char id=327 x=384 y=0 width=17 height=18 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=328 x=361 y=191 width=11 height=13 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=329 x=372 y=191 width=10 height=13 xoffset=0 yoffset=4 xadvance=9 page=0 chnl=0 +char id=330 x=16 y=135 width=14 height=14 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=331 x=30 y=135 width=10 height=14 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=0 +char id=332 x=27 y=74 width=14 height=16 xoffset=0 yoffset=2 xadvance=12 page=0 chnl=0 +char id=333 x=382 y=191 width=12 height=13 xoffset=0 yoffset=5 xadvance=8 page=0 chnl=0 +char id=334 x=401 y=0 width=14 height=18 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=335 x=40 y=135 width=10 height=14 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=336 x=415 y=0 width=21 height=18 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=337 x=50 y=135 width=19 height=14 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=338 x=69 y=135 width=18 height=14 xoffset=0 yoffset=4 xadvance=14 page=0 chnl=0 +char id=339 x=119 y=256 width=13 height=11 xoffset=0 yoffset=7 xadvance=11 page=0 chnl=0 +char id=340 x=82 y=40 width=13 height=17 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=341 x=394 y=191 width=14 height=13 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=342 x=436 y=0 width=13 height=18 xoffset=-1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=343 x=39 y=106 width=10 height=15 xoffset=-1 yoffset=7 xadvance=5 page=0 chnl=0 +char id=344 x=95 y=40 width=13 height=17 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=345 x=408 y=191 width=11 height=13 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=346 x=449 y=0 width=15 height=18 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=347 x=87 y=135 width=15 height=14 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=348 x=464 y=0 width=11 height=18 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=349 x=102 y=135 width=10 height=14 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=350 x=108 y=40 width=11 height=17 xoffset=0 yoffset=4 xadvance=9 page=0 chnl=0 +char id=351 x=112 y=135 width=9 height=14 xoffset=-1 yoffset=7 xadvance=6 page=0 chnl=0 +char id=352 x=475 y=0 width=11 height=18 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=353 x=121 y=135 width=11 height=14 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=354 x=119 y=40 width=14 height=17 xoffset=0 yoffset=4 xadvance=10 page=0 chnl=0 +char id=355 x=41 y=74 width=9 height=16 xoffset=-1 yoffset=5 xadvance=4 page=0 chnl=0 +char id=356 x=133 y=40 width=14 height=17 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=0 +char id=357 x=132 y=135 width=15 height=14 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=0 +char id=358 x=419 y=191 width=14 height=13 xoffset=0 yoffset=4 xadvance=10 page=0 chnl=0 +char id=359 x=433 y=191 width=9 height=13 xoffset=-1 yoffset=5 xadvance=4 page=0 chnl=0 +char id=360 x=147 y=40 width=15 height=17 xoffset=1 yoffset=1 xadvance=12 page=0 chnl=0 +char id=361 x=442 y=191 width=10 height=13 xoffset=0 yoffset=5 xadvance=8 page=0 chnl=0 +char id=362 x=50 y=74 width=15 height=16 xoffset=1 yoffset=2 xadvance=12 page=0 chnl=0 +char id=363 x=452 y=191 width=12 height=13 xoffset=0 yoffset=5 xadvance=8 page=0 chnl=0 +char id=364 x=486 y=0 width=15 height=18 xoffset=1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=365 x=147 y=135 width=10 height=14 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=366 x=0 y=22 width=15 height=18 xoffset=1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=367 x=49 y=106 width=9 height=15 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0 +char id=368 x=15 y=22 width=20 height=18 xoffset=1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=369 x=157 y=135 width=19 height=14 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=370 x=65 y=74 width=15 height=16 xoffset=1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=371 x=464 y=191 width=9 height=13 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=0 +char id=372 x=35 y=22 width=19 height=18 xoffset=0 yoffset=0 xadvance=15 page=0 chnl=0 +char id=373 x=176 y=135 width=14 height=14 xoffset=0 yoffset=4 xadvance=12 page=0 chnl=0 +char id=374 x=162 y=40 width=15 height=17 xoffset=1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=375 x=177 y=40 width=11 height=17 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=376 x=80 y=74 width=15 height=16 xoffset=1 yoffset=1 xadvance=12 page=0 chnl=0 +char id=377 x=188 y=40 width=15 height=17 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=378 x=473 y=191 width=14 height=13 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=379 x=95 y=74 width=15 height=16 xoffset=-1 yoffset=1 xadvance=10 page=0 chnl=0 +char id=380 x=201 y=243 width=10 height=12 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=381 x=203 y=40 width=15 height=17 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=382 x=487 y=191 width=10 height=13 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=383 x=497 y=191 width=12 height=13 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=884 x=291 y=278 width=7 height=7 xoffset=0 yoffset=2 xadvance=3 page=0 chnl=0 +char id=885 x=391 y=278 width=6 height=6 xoffset=-1 yoffset=15 xadvance=3 page=0 chnl=0 +char id=890 x=397 y=278 width=6 height=6 xoffset=0 yoffset=15 xadvance=5 page=0 chnl=0 +char id=894 x=0 y=204 width=9 height=13 xoffset=-1 yoffset=7 xadvance=4 page=0 chnl=0 +char id=900 x=298 y=278 width=7 height=7 xoffset=1 yoffset=2 xadvance=4 page=0 chnl=0 +char id=901 x=403 y=278 width=9 height=6 xoffset=0 yoffset=3 xadvance=5 page=0 chnl=0 +char id=902 x=190 y=135 width=14 height=14 xoffset=-1 yoffset=3 xadvance=12 page=0 chnl=0 +char id=903 x=475 y=278 width=5 height=5 xoffset=1 yoffset=7 xadvance=4 page=0 chnl=0 +char id=904 x=204 y=135 width=19 height=14 xoffset=0 yoffset=3 xadvance=13 page=0 chnl=0 +char id=905 x=223 y=135 width=22 height=14 xoffset=0 yoffset=3 xadvance=14 page=0 chnl=0 +char id=906 x=245 y=135 width=16 height=14 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0 +char id=908 x=58 y=106 width=18 height=15 xoffset=0 yoffset=3 xadvance=13 page=0 chnl=0 +char id=910 x=261 y=135 width=18 height=14 xoffset=0 yoffset=3 xadvance=14 page=0 chnl=0 +char id=911 x=279 y=135 width=16 height=14 xoffset=0 yoffset=3 xadvance=14 page=0 chnl=0 +char id=912 x=110 y=74 width=8 height=16 xoffset=-1 yoffset=2 xadvance=5 page=0 chnl=0 +char id=913 x=9 y=204 width=14 height=13 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=914 x=23 y=204 width=13 height=13 xoffset=-1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=915 x=36 y=204 width=14 height=13 xoffset=-1 yoffset=4 xadvance=9 page=0 chnl=0 +char id=916 x=50 y=204 width=13 height=13 xoffset=-1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=917 x=63 y=204 width=13 height=13 xoffset=-1 yoffset=4 xadvance=10 page=0 chnl=0 +char id=918 x=76 y=204 width=15 height=13 xoffset=-1 yoffset=4 xadvance=10 page=0 chnl=0 +char id=919 x=91 y=204 width=17 height=13 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=920 x=295 y=135 width=14 height=14 xoffset=0 yoffset=4 xadvance=12 page=0 chnl=0 +char id=921 x=108 y=204 width=10 height=13 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=922 x=118 y=204 width=15 height=13 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=923 x=133 y=204 width=14 height=13 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=924 x=147 y=204 width=19 height=13 xoffset=-1 yoffset=4 xadvance=14 page=0 chnl=0 +char id=925 x=309 y=135 width=17 height=14 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=926 x=166 y=204 width=13 height=13 xoffset=0 yoffset=4 xadvance=10 page=0 chnl=0 +char id=927 x=326 y=135 width=14 height=14 xoffset=0 yoffset=4 xadvance=12 page=0 chnl=0 +char id=928 x=179 y=204 width=17 height=13 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=929 x=196 y=204 width=14 height=13 xoffset=-1 yoffset=4 xadvance=9 page=0 chnl=0 +char id=931 x=210 y=204 width=13 height=13 xoffset=-1 yoffset=4 xadvance=10 page=0 chnl=0 +char id=932 x=223 y=204 width=14 height=13 xoffset=0 yoffset=4 xadvance=10 page=0 chnl=0 +char id=933 x=237 y=204 width=14 height=13 xoffset=1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=934 x=251 y=204 width=14 height=13 xoffset=0 yoffset=4 xadvance=12 page=0 chnl=0 +char id=935 x=265 y=204 width=16 height=13 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=936 x=281 y=204 width=17 height=13 xoffset=0 yoffset=4 xadvance=13 page=0 chnl=0 +char id=937 x=298 y=204 width=15 height=13 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=938 x=118 y=74 width=14 height=16 xoffset=-1 yoffset=1 xadvance=5 page=0 chnl=0 +char id=939 x=132 y=74 width=14 height=16 xoffset=1 yoffset=1 xadvance=11 page=0 chnl=0 +char id=940 x=146 y=74 width=11 height=16 xoffset=0 yoffset=2 xadvance=9 page=0 chnl=0 +char id=941 x=157 y=74 width=10 height=16 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=942 x=62 y=0 width=10 height=19 xoffset=0 yoffset=2 xadvance=9 page=0 chnl=0 +char id=943 x=167 y=74 width=7 height=16 xoffset=0 yoffset=2 xadvance=5 page=0 chnl=0 +char id=944 x=76 y=106 width=10 height=15 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0 +char id=945 x=132 y=256 width=11 height=11 xoffset=0 yoffset=7 xadvance=9 page=0 chnl=0 +char id=946 x=218 y=40 width=11 height=17 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=947 x=340 y=135 width=10 height=14 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=0 +char id=948 x=350 y=135 width=10 height=14 xoffset=0 yoffset=4 xadvance=9 page=0 chnl=0 +char id=949 x=143 y=256 width=10 height=11 xoffset=-1 yoffset=7 xadvance=7 page=0 chnl=0 +char id=950 x=501 y=0 width=10 height=18 xoffset=0 yoffset=3 xadvance=7 page=0 chnl=0 +char id=951 x=360 y=135 width=10 height=14 xoffset=0 yoffset=7 xadvance=9 page=0 chnl=0 +char id=952 x=370 y=135 width=10 height=14 xoffset=0 yoffset=4 xadvance=9 page=0 chnl=0 +char id=953 x=505 y=121 width=6 height=11 xoffset=0 yoffset=7 xadvance=5 page=0 chnl=0 +char id=954 x=268 y=267 width=11 height=10 xoffset=0 yoffset=7 xadvance=9 page=0 chnl=0 +char id=955 x=380 y=135 width=10 height=14 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=956 x=390 y=135 width=11 height=14 xoffset=-1 yoffset=7 xadvance=9 page=0 chnl=0 +char id=957 x=279 y=267 width=10 height=10 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=0 +char id=958 x=229 y=40 width=11 height=17 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=959 x=153 y=256 width=10 height=11 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=0 +char id=960 x=163 y=256 width=14 height=11 xoffset=-1 yoffset=7 xadvance=9 page=0 chnl=0 +char id=961 x=401 y=135 width=11 height=14 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=0 +char id=962 x=412 y=135 width=9 height=14 xoffset=0 yoffset=7 xadvance=7 page=0 chnl=0 +char id=963 x=177 y=256 width=11 height=11 xoffset=0 yoffset=7 xadvance=9 page=0 chnl=0 +char id=964 x=188 y=256 width=9 height=11 xoffset=0 yoffset=7 xadvance=7 page=0 chnl=0 +char id=965 x=197 y=256 width=10 height=11 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=0 +char id=966 x=421 y=135 width=12 height=14 xoffset=0 yoffset=7 xadvance=10 page=0 chnl=0 +char id=967 x=433 y=135 width=12 height=14 xoffset=-2 yoffset=7 xadvance=8 page=0 chnl=0 +char id=968 x=174 y=74 width=13 height=16 xoffset=0 yoffset=5 xadvance=11 page=0 chnl=0 +char id=969 x=207 y=256 width=13 height=11 xoffset=0 yoffset=7 xadvance=11 page=0 chnl=0 +char id=970 x=445 y=135 width=11 height=14 xoffset=0 yoffset=4 xadvance=5 page=0 chnl=0 +char id=971 x=456 y=135 width=12 height=14 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=972 x=187 y=74 width=12 height=16 xoffset=0 yoffset=2 xadvance=8 page=0 chnl=0 +char id=973 x=86 y=106 width=10 height=15 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0 +char id=974 x=96 y=106 width=13 height=15 xoffset=0 yoffset=3 xadvance=11 page=0 chnl=0 +char id=976 x=109 y=106 width=10 height=15 xoffset=0 yoffset=3 xadvance=9 page=0 chnl=0 +char id=977 x=119 y=106 width=13 height=15 xoffset=0 yoffset=3 xadvance=9 page=0 chnl=0 +char id=978 x=313 y=204 width=14 height=13 xoffset=0 yoffset=4 xadvance=10 page=0 chnl=0 +char id=979 x=468 y=135 width=17 height=14 xoffset=0 yoffset=3 xadvance=13 page=0 chnl=0 +char id=980 x=199 y=74 width=14 height=16 xoffset=0 yoffset=1 xadvance=10 page=0 chnl=0 +char id=981 x=213 y=74 width=12 height=16 xoffset=0 yoffset=5 xadvance=10 page=0 chnl=0 +char id=982 x=211 y=243 width=13 height=12 xoffset=0 yoffset=6 xadvance=11 page=0 chnl=0 +char id=983 x=327 y=204 width=10 height=13 xoffset=0 yoffset=7 xadvance=9 page=0 chnl=0 +char id=984 x=337 y=204 width=13 height=13 xoffset=0 yoffset=4 xadvance=9 page=0 chnl=0 +char id=985 x=485 y=135 width=10 height=14 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=0 +char id=986 x=350 y=204 width=12 height=13 xoffset=0 yoffset=4 xadvance=10 page=0 chnl=0 +char id=987 x=495 y=135 width=10 height=14 xoffset=-1 yoffset=7 xadvance=7 page=0 chnl=0 +char id=988 x=362 y=204 width=14 height=13 xoffset=-1 yoffset=4 xadvance=9 page=0 chnl=0 +char id=989 x=0 y=149 width=13 height=14 xoffset=-2 yoffset=7 xadvance=7 page=0 chnl=0 +char id=990 x=13 y=149 width=12 height=14 xoffset=0 yoffset=4 xadvance=11 page=0 chnl=0 +char id=991 x=240 y=40 width=8 height=17 xoffset=0 yoffset=3 xadvance=6 page=0 chnl=0 +char id=992 x=376 y=204 width=14 height=13 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=993 x=248 y=40 width=12 height=17 xoffset=-1 yoffset=3 xadvance=9 page=0 chnl=0 +char id=994 x=260 y=40 width=19 height=17 xoffset=-1 yoffset=4 xadvance=15 page=0 chnl=0 +char id=995 x=25 y=149 width=14 height=14 xoffset=-1 yoffset=7 xadvance=11 page=0 chnl=0 +char id=996 x=225 y=74 width=13 height=16 xoffset=0 yoffset=4 xadvance=9 page=0 chnl=0 +char id=997 x=39 y=149 width=11 height=14 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=0 +char id=998 x=238 y=74 width=12 height=16 xoffset=-1 yoffset=4 xadvance=9 page=0 chnl=0 +char id=999 x=224 y=243 width=10 height=12 xoffset=-1 yoffset=6 xadvance=7 page=0 chnl=0 +char id=1000 x=132 y=106 width=12 height=15 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=1001 x=234 y=243 width=10 height=12 xoffset=-1 yoffset=7 xadvance=5 page=0 chnl=0 +char id=1002 x=50 y=149 width=15 height=14 xoffset=-1 yoffset=4 xadvance=13 page=0 chnl=0 +char id=1003 x=220 y=256 width=12 height=11 xoffset=-1 yoffset=7 xadvance=9 page=0 chnl=0 +char id=1004 x=250 y=74 width=15 height=16 xoffset=0 yoffset=2 xadvance=9 page=0 chnl=0 +char id=1005 x=244 y=243 width=12 height=12 xoffset=-1 yoffset=6 xadvance=7 page=0 chnl=0 +char id=1006 x=54 y=22 width=12 height=18 xoffset=0 yoffset=2 xadvance=10 page=0 chnl=0 +char id=1007 x=265 y=74 width=9 height=16 xoffset=0 yoffset=5 xadvance=7 page=0 chnl=0 +char id=1008 x=232 y=256 width=10 height=11 xoffset=0 yoffset=7 xadvance=9 page=0 chnl=0 +char id=1009 x=65 y=149 width=11 height=14 xoffset=-1 yoffset=7 xadvance=9 page=0 chnl=0 +char id=1010 x=242 y=256 width=9 height=11 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=0 +char id=1011 x=279 y=40 width=10 height=17 xoffset=-3 yoffset=4 xadvance=4 page=0 chnl=0 +char id=1012 x=76 y=149 width=14 height=14 xoffset=0 yoffset=4 xadvance=12 page=0 chnl=0 +char id=1013 x=251 y=256 width=8 height=11 xoffset=0 yoffset=7 xadvance=6 page=0 chnl=0 +char id=1014 x=259 y=256 width=9 height=11 xoffset=-1 yoffset=7 xadvance=6 page=0 chnl=0 +char id=1015 x=390 y=204 width=12 height=13 xoffset=-1 yoffset=4 xadvance=9 page=0 chnl=0 +char id=1016 x=289 y=40 width=10 height=17 xoffset=0 yoffset=4 xadvance=9 page=0 chnl=0 +char id=1017 x=90 y=149 width=13 height=14 xoffset=0 yoffset=4 xadvance=11 page=0 chnl=0 +char id=1018 x=402 y=204 width=19 height=13 xoffset=-1 yoffset=4 xadvance=14 page=0 chnl=0 +char id=1019 x=103 y=149 width=14 height=14 xoffset=-1 yoffset=7 xadvance=11 page=0 chnl=0 +char id=1020 x=117 y=149 width=14 height=14 xoffset=-3 yoffset=7 xadvance=9 page=0 chnl=0 +char id=1021 x=131 y=149 width=14 height=14 xoffset=-1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=1022 x=145 y=149 width=13 height=14 xoffset=0 yoffset=4 xadvance=16 page=0 chnl=0 +char id=1023 x=158 y=149 width=14 height=14 xoffset=-1 yoffset=4 xadvance=16 page=0 chnl=0 +char id=1024 x=299 y=40 width=17 height=17 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1025 x=274 y=74 width=17 height=16 xoffset=-1 yoffset=1 xadvance=10 page=0 chnl=0 +char id=1026 x=172 y=149 width=14 height=14 xoffset=0 yoffset=4 xadvance=12 page=0 chnl=0 +char id=1027 x=316 y=40 width=16 height=17 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1028 x=186 y=149 width=13 height=14 xoffset=0 yoffset=4 xadvance=11 page=0 chnl=0 +char id=1029 x=199 y=149 width=11 height=14 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=1030 x=421 y=204 width=10 height=13 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=1031 x=291 y=74 width=15 height=16 xoffset=-1 yoffset=1 xadvance=5 page=0 chnl=0 +char id=1032 x=210 y=149 width=11 height=14 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=1033 x=221 y=149 width=18 height=14 xoffset=-1 yoffset=4 xadvance=15 page=0 chnl=0 +char id=1034 x=431 y=204 width=18 height=13 xoffset=-1 yoffset=4 xadvance=16 page=0 chnl=0 +char id=1035 x=239 y=149 width=14 height=14 xoffset=0 yoffset=4 xadvance=13 page=0 chnl=0 +char id=1036 x=332 y=40 width=16 height=17 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1037 x=348 y=40 width=17 height=17 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1038 x=365 y=40 width=17 height=17 xoffset=0 yoffset=1 xadvance=11 page=0 chnl=0 +char id=1039 x=306 y=74 width=17 height=16 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=1040 x=449 y=204 width=14 height=13 xoffset=-1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=1041 x=463 y=204 width=14 height=13 xoffset=-1 yoffset=4 xadvance=9 page=0 chnl=0 +char id=1042 x=477 y=204 width=13 height=13 xoffset=-1 yoffset=4 xadvance=10 page=0 chnl=0 +char id=1043 x=490 y=204 width=14 height=13 xoffset=-1 yoffset=4 xadvance=9 page=0 chnl=0 +char id=1044 x=323 y=74 width=16 height=16 xoffset=-2 yoffset=4 xadvance=10 page=0 chnl=0 +char id=1045 x=0 y=217 width=13 height=13 xoffset=-1 yoffset=4 xadvance=10 page=0 chnl=0 +char id=1046 x=13 y=217 width=18 height=13 xoffset=-1 yoffset=4 xadvance=15 page=0 chnl=0 +char id=1047 x=253 y=149 width=13 height=14 xoffset=-1 yoffset=4 xadvance=9 page=0 chnl=0 +char id=1048 x=31 y=217 width=17 height=13 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=1049 x=339 y=74 width=17 height=16 xoffset=-1 yoffset=1 xadvance=12 page=0 chnl=0 +char id=1050 x=48 y=217 width=14 height=13 xoffset=-1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=1051 x=266 y=149 width=16 height=14 xoffset=-1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=1052 x=62 y=217 width=19 height=13 xoffset=-1 yoffset=4 xadvance=14 page=0 chnl=0 +char id=1053 x=81 y=217 width=17 height=13 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=1054 x=282 y=149 width=14 height=14 xoffset=0 yoffset=4 xadvance=12 page=0 chnl=0 +char id=1055 x=98 y=217 width=17 height=13 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=1056 x=115 y=217 width=14 height=13 xoffset=-1 yoffset=4 xadvance=9 page=0 chnl=0 +char id=1057 x=296 y=149 width=13 height=14 xoffset=0 yoffset=4 xadvance=11 page=0 chnl=0 +char id=1058 x=129 y=217 width=14 height=13 xoffset=0 yoffset=4 xadvance=10 page=0 chnl=0 +char id=1059 x=309 y=149 width=17 height=14 xoffset=0 yoffset=4 xadvance=11 page=0 chnl=0 +char id=1060 x=143 y=217 width=14 height=13 xoffset=0 yoffset=4 xadvance=12 page=0 chnl=0 +char id=1061 x=157 y=217 width=17 height=13 xoffset=-1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=1062 x=356 y=74 width=17 height=16 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=1063 x=174 y=217 width=14 height=13 xoffset=1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=1064 x=188 y=217 width=21 height=13 xoffset=-1 yoffset=4 xadvance=16 page=0 chnl=0 +char id=1065 x=373 y=74 width=21 height=16 xoffset=-1 yoffset=4 xadvance=16 page=0 chnl=0 +char id=1066 x=209 y=217 width=13 height=13 xoffset=0 yoffset=4 xadvance=12 page=0 chnl=0 +char id=1067 x=222 y=217 width=21 height=13 xoffset=-1 yoffset=4 xadvance=14 page=0 chnl=0 +char id=1068 x=243 y=217 width=12 height=13 xoffset=-1 yoffset=4 xadvance=9 page=0 chnl=0 +char id=1069 x=326 y=149 width=14 height=14 xoffset=-1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=1070 x=340 y=149 width=19 height=14 xoffset=-1 yoffset=4 xadvance=15 page=0 chnl=0 +char id=1071 x=255 y=217 width=15 height=13 xoffset=-1 yoffset=4 xadvance=10 page=0 chnl=0 +char id=1072 x=268 y=256 width=10 height=11 xoffset=-1 yoffset=7 xadvance=7 page=0 chnl=0 +char id=1073 x=144 y=106 width=10 height=15 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0 +char id=1074 x=289 y=267 width=10 height=10 xoffset=-1 yoffset=7 xadvance=7 page=0 chnl=0 +char id=1075 x=299 y=267 width=11 height=10 xoffset=-1 yoffset=7 xadvance=6 page=0 chnl=0 +char id=1076 x=256 y=243 width=12 height=12 xoffset=-2 yoffset=7 xadvance=8 page=0 chnl=0 +char id=1077 x=278 y=256 width=10 height=11 xoffset=-1 yoffset=7 xadvance=7 page=0 chnl=0 +char id=1078 x=310 y=267 width=14 height=10 xoffset=-1 yoffset=7 xadvance=11 page=0 chnl=0 +char id=1079 x=288 y=256 width=9 height=11 xoffset=-1 yoffset=7 xadvance=7 page=0 chnl=0 +char id=1080 x=324 y=267 width=13 height=10 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=0 +char id=1081 x=270 y=217 width=13 height=13 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=1082 x=337 y=267 width=11 height=10 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=0 +char id=1083 x=297 y=256 width=11 height=11 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=0 +char id=1084 x=308 y=256 width=15 height=11 xoffset=-1 yoffset=7 xadvance=10 page=0 chnl=0 +char id=1085 x=348 y=267 width=13 height=10 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=0 +char id=1086 x=323 y=256 width=10 height=11 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=0 +char id=1087 x=361 y=267 width=13 height=10 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=0 +char id=1088 x=359 y=149 width=12 height=14 xoffset=-2 yoffset=7 xadvance=8 page=0 chnl=0 +char id=1089 x=333 y=256 width=10 height=11 xoffset=-1 yoffset=7 xadvance=7 page=0 chnl=0 +char id=1090 x=374 y=267 width=9 height=10 xoffset=0 yoffset=7 xadvance=7 page=0 chnl=0 +char id=1091 x=371 y=149 width=11 height=14 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=0 +char id=1092 x=382 y=40 width=14 height=17 xoffset=-1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=1093 x=383 y=267 width=11 height=10 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=0 +char id=1094 x=268 y=243 width=13 height=12 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=0 +char id=1095 x=394 y=267 width=12 height=10 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=0 +char id=1096 x=406 y=267 width=17 height=10 xoffset=-1 yoffset=7 xadvance=12 page=0 chnl=0 +char id=1097 x=281 y=243 width=17 height=12 xoffset=-1 yoffset=7 xadvance=12 page=0 chnl=0 +char id=1098 x=423 y=267 width=10 height=10 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=0 +char id=1099 x=433 y=267 width=15 height=10 xoffset=-1 yoffset=7 xadvance=10 page=0 chnl=0 +char id=1100 x=448 y=267 width=9 height=10 xoffset=-1 yoffset=7 xadvance=7 page=0 chnl=0 +char id=1101 x=343 y=256 width=10 height=11 xoffset=-1 yoffset=7 xadvance=7 page=0 chnl=0 +char id=1102 x=353 y=256 width=13 height=11 xoffset=-1 yoffset=7 xadvance=11 page=0 chnl=0 +char id=1103 x=457 y=267 width=11 height=10 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=0 +char id=1104 x=382 y=149 width=11 height=14 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=0 +char id=1105 x=393 y=149 width=13 height=14 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=0 +char id=1106 x=396 y=40 width=10 height=17 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=1107 x=283 y=217 width=15 height=13 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=1108 x=366 y=256 width=10 height=11 xoffset=-1 yoffset=7 xadvance=7 page=0 chnl=0 +char id=1109 x=376 y=256 width=8 height=11 xoffset=-1 yoffset=7 xadvance=6 page=0 chnl=0 +char id=1110 x=504 y=204 width=7 height=13 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=1111 x=298 y=217 width=14 height=13 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=1112 x=406 y=40 width=10 height=17 xoffset=-3 yoffset=4 xadvance=4 page=0 chnl=0 +char id=1113 x=384 y=256 width=13 height=11 xoffset=-1 yoffset=7 xadvance=11 page=0 chnl=0 +char id=1114 x=468 y=267 width=14 height=10 xoffset=-1 yoffset=7 xadvance=11 page=0 chnl=0 +char id=1115 x=312 y=217 width=11 height=13 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=1116 x=323 y=217 width=13 height=13 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=1117 x=336 y=217 width=13 height=13 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=1118 x=416 y=40 width=16 height=17 xoffset=-2 yoffset=4 xadvance=8 page=0 chnl=0 +char id=1119 x=349 y=217 width=13 height=13 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=0 +char id=1120 x=406 y=149 width=18 height=14 xoffset=0 yoffset=4 xadvance=16 page=0 chnl=0 +char id=1121 x=397 y=256 width=13 height=11 xoffset=-1 yoffset=7 xadvance=11 page=0 chnl=0 +char id=1122 x=362 y=217 width=13 height=13 xoffset=0 yoffset=4 xadvance=11 page=0 chnl=0 +char id=1123 x=375 y=217 width=10 height=13 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=1124 x=424 y=149 width=20 height=14 xoffset=-1 yoffset=4 xadvance=15 page=0 chnl=0 +char id=1125 x=410 y=256 width=14 height=11 xoffset=-1 yoffset=7 xadvance=10 page=0 chnl=0 +char id=1126 x=385 y=217 width=17 height=13 xoffset=-1 yoffset=4 xadvance=14 page=0 chnl=0 +char id=1127 x=482 y=267 width=13 height=10 xoffset=-1 yoffset=7 xadvance=10 page=0 chnl=0 +char id=1128 x=402 y=217 width=22 height=13 xoffset=-1 yoffset=4 xadvance=20 page=0 chnl=0 +char id=1129 x=0 y=278 width=17 height=10 xoffset=-1 yoffset=7 xadvance=14 page=0 chnl=0 +char id=1130 x=424 y=217 width=17 height=13 xoffset=-1 yoffset=4 xadvance=15 page=0 chnl=0 +char id=1131 x=495 y=267 width=13 height=10 xoffset=-1 yoffset=7 xadvance=10 page=0 chnl=0 +char id=1132 x=441 y=217 width=23 height=13 xoffset=-1 yoffset=4 xadvance=20 page=0 chnl=0 +char id=1133 x=17 y=278 width=17 height=10 xoffset=-1 yoffset=7 xadvance=15 page=0 chnl=0 +char id=1134 x=38 y=0 width=13 height=20 xoffset=-1 yoffset=1 xadvance=8 page=0 chnl=0 +char id=1135 x=154 y=106 width=11 height=15 xoffset=-1 yoffset=5 xadvance=6 page=0 chnl=0 +char id=1136 x=464 y=217 width=18 height=13 xoffset=0 yoffset=4 xadvance=14 page=0 chnl=0 +char id=1137 x=432 y=40 width=13 height=17 xoffset=0 yoffset=4 xadvance=11 page=0 chnl=0 +char id=1138 x=444 y=149 width=14 height=14 xoffset=0 yoffset=4 xadvance=12 page=0 chnl=0 +char id=1139 x=424 y=256 width=11 height=11 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=0 +char id=1140 x=458 y=149 width=15 height=14 xoffset=1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=1141 x=435 y=256 width=11 height=11 xoffset=0 yoffset=7 xadvance=9 page=0 chnl=0 +char id=1142 x=445 y=40 width=17 height=17 xoffset=1 yoffset=1 xadvance=12 page=0 chnl=0 +char id=1143 x=473 y=149 width=15 height=14 xoffset=0 yoffset=4 xadvance=9 page=0 chnl=0 +char id=1144 x=462 y=40 width=23 height=17 xoffset=0 yoffset=4 xadvance=19 page=0 chnl=0 +char id=1145 x=488 y=149 width=20 height=14 xoffset=-1 yoffset=7 xadvance=15 page=0 chnl=0 +char id=1146 x=394 y=74 width=16 height=16 xoffset=0 yoffset=3 xadvance=14 page=0 chnl=0 +char id=1147 x=446 y=256 width=13 height=11 xoffset=-1 yoffset=7 xadvance=10 page=0 chnl=0 +char id=1148 x=66 y=22 width=18 height=18 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=0 +char id=1149 x=165 y=106 width=16 height=15 xoffset=-1 yoffset=3 xadvance=11 page=0 chnl=0 +char id=1150 x=485 y=40 width=18 height=17 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=0 +char id=1151 x=482 y=217 width=13 height=13 xoffset=-1 yoffset=5 xadvance=11 page=0 chnl=0 +char id=1152 x=495 y=217 width=12 height=13 xoffset=0 yoffset=4 xadvance=10 page=0 chnl=0 +char id=1153 x=0 y=230 width=10 height=13 xoffset=-1 yoffset=7 xadvance=7 page=0 chnl=0 +char id=1154 x=245 y=278 width=7 height=8 xoffset=-2 yoffset=13 xadvance=4 page=0 chnl=0 +char id=1155 x=480 y=278 width=12 height=5 xoffset=-5 yoffset=4 xadvance=0 page=0 chnl=0 +char id=1156 x=492 y=278 width=16 height=5 xoffset=-7 yoffset=4 xadvance=0 page=0 chnl=0 +char id=1157 x=0 y=288 width=10 height=5 xoffset=-4 yoffset=4 xadvance=0 page=0 chnl=0 +char id=1158 x=10 y=288 width=10 height=5 xoffset=-4 yoffset=4 xadvance=0 page=0 chnl=0 +char id=1159 x=412 y=278 width=18 height=6 xoffset=-7 yoffset=1 xadvance=0 page=0 chnl=0 +char id=1160 x=72 y=0 width=33 height=19 xoffset=-12 yoffset=1 xadvance=0 page=0 chnl=0 +char id=1161 x=0 y=0 width=38 height=22 xoffset=-13 yoffset=0 xadvance=0 page=0 chnl=0 +char id=1162 x=105 y=0 width=16 height=19 xoffset=-1 yoffset=1 xadvance=11 page=0 chnl=0 +char id=1163 x=410 y=74 width=13 height=16 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=1164 x=10 y=230 width=12 height=13 xoffset=-1 yoffset=4 xadvance=9 page=0 chnl=0 +char id=1165 x=34 y=278 width=9 height=10 xoffset=-1 yoffset=7 xadvance=7 page=0 chnl=0 +char id=1166 x=22 y=230 width=14 height=13 xoffset=-1 yoffset=4 xadvance=9 page=0 chnl=0 +char id=1167 x=0 y=163 width=12 height=14 xoffset=-2 yoffset=7 xadvance=8 page=0 chnl=0 +char id=1168 x=181 y=106 width=14 height=15 xoffset=-1 yoffset=2 xadvance=9 page=0 chnl=0 +char id=1169 x=459 y=256 width=11 height=11 xoffset=-1 yoffset=6 xadvance=6 page=0 chnl=0 +char id=1170 x=36 y=230 width=14 height=13 xoffset=-1 yoffset=4 xadvance=9 page=0 chnl=0 +char id=1171 x=43 y=278 width=11 height=10 xoffset=-1 yoffset=7 xadvance=6 page=0 chnl=0 +char id=1172 x=0 y=57 width=13 height=17 xoffset=-1 yoffset=4 xadvance=10 page=0 chnl=0 +char id=1173 x=12 y=163 width=10 height=14 xoffset=-1 yoffset=7 xadvance=7 page=0 chnl=0 +char id=1174 x=423 y=74 width=18 height=16 xoffset=-1 yoffset=4 xadvance=16 page=0 chnl=0 +char id=1175 x=298 y=243 width=14 height=12 xoffset=-1 yoffset=7 xadvance=11 page=0 chnl=0 +char id=1176 x=13 y=57 width=13 height=17 xoffset=-1 yoffset=4 xadvance=9 page=0 chnl=0 +char id=1177 x=50 y=230 width=9 height=13 xoffset=-1 yoffset=7 xadvance=6 page=0 chnl=0 +char id=1178 x=441 y=74 width=14 height=16 xoffset=-1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=1179 x=312 y=243 width=11 height=12 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=0 +char id=1180 x=59 y=230 width=15 height=13 xoffset=-1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=1181 x=54 y=278 width=11 height=10 xoffset=-1 yoffset=7 xadvance=9 page=0 chnl=0 +char id=1182 x=74 y=230 width=14 height=13 xoffset=-1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=1183 x=65 y=278 width=11 height=10 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=0 +char id=1184 x=88 y=230 width=15 height=13 xoffset=0 yoffset=4 xadvance=13 page=0 chnl=0 +char id=1185 x=76 y=278 width=11 height=10 xoffset=0 yoffset=7 xadvance=9 page=0 chnl=0 +char id=1186 x=455 y=74 width=17 height=16 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=1187 x=323 y=243 width=13 height=12 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=0 +char id=1188 x=103 y=230 width=20 height=13 xoffset=-1 yoffset=4 xadvance=15 page=0 chnl=0 +char id=1189 x=87 y=278 width=15 height=10 xoffset=-1 yoffset=7 xadvance=10 page=0 chnl=0 +char id=1190 x=26 y=57 width=19 height=17 xoffset=-1 yoffset=4 xadvance=16 page=0 chnl=0 +char id=1191 x=22 y=163 width=14 height=14 xoffset=-1 yoffset=7 xadvance=12 page=0 chnl=0 +char id=1192 x=36 y=163 width=14 height=14 xoffset=0 yoffset=4 xadvance=12 page=0 chnl=0 +char id=1193 x=470 y=256 width=11 height=11 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=0 +char id=1194 x=45 y=57 width=13 height=17 xoffset=0 yoffset=4 xadvance=11 page=0 chnl=0 +char id=1195 x=123 y=230 width=10 height=13 xoffset=-1 yoffset=7 xadvance=7 page=0 chnl=0 +char id=1196 x=472 y=74 width=14 height=16 xoffset=0 yoffset=4 xadvance=10 page=0 chnl=0 +char id=1197 x=336 y=243 width=11 height=12 xoffset=0 yoffset=7 xadvance=7 page=0 chnl=0 +char id=1198 x=133 y=230 width=15 height=13 xoffset=1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=1199 x=50 y=163 width=13 height=14 xoffset=0 yoffset=7 xadvance=9 page=0 chnl=0 +char id=1200 x=148 y=230 width=15 height=13 xoffset=1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=1201 x=63 y=163 width=13 height=14 xoffset=0 yoffset=7 xadvance=9 page=0 chnl=0 +char id=1202 x=486 y=74 width=16 height=16 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=1203 x=347 y=243 width=11 height=12 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=0 +char id=1204 x=0 y=90 width=19 height=16 xoffset=0 yoffset=4 xadvance=16 page=0 chnl=0 +char id=1205 x=358 y=243 width=15 height=12 xoffset=0 yoffset=7 xadvance=11 page=0 chnl=0 +char id=1206 x=19 y=90 width=14 height=16 xoffset=1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=1207 x=373 y=243 width=12 height=12 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=0 +char id=1208 x=163 y=230 width=15 height=13 xoffset=1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=1209 x=102 y=278 width=11 height=10 xoffset=0 yoffset=7 xadvance=9 page=0 chnl=0 +char id=1210 x=178 y=230 width=13 height=13 xoffset=-1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=1211 x=191 y=230 width=10 height=13 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=1212 x=76 y=163 width=16 height=14 xoffset=0 yoffset=4 xadvance=14 page=0 chnl=0 +char id=1213 x=481 y=256 width=11 height=11 xoffset=0 yoffset=7 xadvance=9 page=0 chnl=0 +char id=1214 x=33 y=90 width=16 height=16 xoffset=0 yoffset=4 xadvance=14 page=0 chnl=0 +char id=1215 x=201 y=230 width=11 height=13 xoffset=0 yoffset=7 xadvance=9 page=0 chnl=0 +char id=1216 x=212 y=230 width=10 height=13 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=1217 x=49 y=90 width=18 height=16 xoffset=-1 yoffset=1 xadvance=15 page=0 chnl=0 +char id=1218 x=222 y=230 width=14 height=13 xoffset=-1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=1219 x=58 y=57 width=15 height=17 xoffset=-1 yoffset=4 xadvance=10 page=0 chnl=0 +char id=1220 x=92 y=163 width=12 height=14 xoffset=-1 yoffset=7 xadvance=7 page=0 chnl=0 +char id=1221 x=67 y=90 width=16 height=16 xoffset=-1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=1222 x=236 y=230 width=11 height=13 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=0 +char id=1223 x=83 y=90 width=17 height=16 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=1224 x=104 y=163 width=12 height=14 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=0 +char id=1225 x=100 y=90 width=17 height=16 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=1226 x=247 y=230 width=12 height=13 xoffset=-1 yoffset=7 xadvance=9 page=0 chnl=0 +char id=1227 x=117 y=90 width=14 height=16 xoffset=1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=1228 x=385 y=243 width=12 height=12 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=0 +char id=1229 x=131 y=90 width=19 height=16 xoffset=-1 yoffset=4 xadvance=14 page=0 chnl=0 +char id=1230 x=259 y=230 width=15 height=13 xoffset=-1 yoffset=7 xadvance=10 page=0 chnl=0 +char id=1231 x=274 y=230 width=14 height=13 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=1232 x=150 y=90 width=14 height=16 xoffset=-1 yoffset=1 xadvance=11 page=0 chnl=0 +char id=1233 x=116 y=163 width=11 height=14 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=0 +char id=1234 x=164 y=90 width=16 height=16 xoffset=-1 yoffset=1 xadvance=11 page=0 chnl=0 +char id=1235 x=288 y=230 width=13 height=13 xoffset=0 yoffset=5 xadvance=7 page=0 chnl=0 +char id=1236 x=301 y=230 width=19 height=13 xoffset=-1 yoffset=4 xadvance=14 page=0 chnl=0 +char id=1237 x=492 y=256 width=13 height=11 xoffset=-1 yoffset=7 xadvance=10 page=0 chnl=0 +char id=1238 x=180 y=90 width=17 height=16 xoffset=-1 yoffset=1 xadvance=10 page=0 chnl=0 +char id=1239 x=127 y=163 width=12 height=14 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=1240 x=139 y=163 width=14 height=14 xoffset=0 yoffset=4 xadvance=11 page=0 chnl=0 +char id=1241 x=0 y=267 width=9 height=11 xoffset=-1 yoffset=7 xadvance=7 page=0 chnl=0 +char id=1242 x=73 y=57 width=14 height=17 xoffset=0 yoffset=1 xadvance=11 page=0 chnl=0 +char id=1243 x=320 y=230 width=14 height=13 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=1244 x=197 y=90 width=18 height=16 xoffset=-1 yoffset=1 xadvance=15 page=0 chnl=0 +char id=1245 x=397 y=243 width=14 height=12 xoffset=-1 yoffset=5 xadvance=11 page=0 chnl=0 +char id=1246 x=87 y=57 width=15 height=17 xoffset=-1 yoffset=1 xadvance=9 page=0 chnl=0 +char id=1247 x=334 y=230 width=14 height=13 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=1248 x=153 y=163 width=13 height=14 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=1249 x=9 y=267 width=9 height=11 xoffset=-1 yoffset=7 xadvance=6 page=0 chnl=0 +char id=1250 x=195 y=106 width=17 height=15 xoffset=-1 yoffset=2 xadvance=12 page=0 chnl=0 +char id=1251 x=411 y=243 width=15 height=12 xoffset=-1 yoffset=5 xadvance=8 page=0 chnl=0 +char id=1252 x=212 y=106 width=17 height=15 xoffset=-1 yoffset=2 xadvance=12 page=0 chnl=0 +char id=1253 x=426 y=243 width=15 height=12 xoffset=-1 yoffset=5 xadvance=8 page=0 chnl=0 +char id=1254 x=102 y=57 width=16 height=17 xoffset=0 yoffset=1 xadvance=12 page=0 chnl=0 +char id=1255 x=348 y=230 width=12 height=13 xoffset=0 yoffset=5 xadvance=8 page=0 chnl=0 +char id=1256 x=166 y=163 width=14 height=14 xoffset=0 yoffset=4 xadvance=12 page=0 chnl=0 +char id=1257 x=18 y=267 width=11 height=11 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=0 +char id=1258 x=118 y=57 width=14 height=17 xoffset=0 yoffset=1 xadvance=12 page=0 chnl=0 +char id=1259 x=360 y=230 width=13 height=13 xoffset=-1 yoffset=5 xadvance=8 page=0 chnl=0 +char id=1260 x=132 y=57 width=14 height=17 xoffset=-1 yoffset=1 xadvance=11 page=0 chnl=0 +char id=1261 x=373 y=230 width=14 height=13 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=1262 x=215 y=90 width=17 height=16 xoffset=0 yoffset=2 xadvance=11 page=0 chnl=0 +char id=1263 x=232 y=90 width=16 height=16 xoffset=-2 yoffset=5 xadvance=8 page=0 chnl=0 +char id=1264 x=146 y=57 width=17 height=17 xoffset=0 yoffset=1 xadvance=11 page=0 chnl=0 +char id=1265 x=248 y=90 width=16 height=16 xoffset=-2 yoffset=5 xadvance=8 page=0 chnl=0 +char id=1266 x=84 y=22 width=23 height=18 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1267 x=163 y=57 width=22 height=17 xoffset=-2 yoffset=4 xadvance=8 page=0 chnl=0 +char id=1268 x=229 y=106 width=14 height=15 xoffset=1 yoffset=2 xadvance=11 page=0 chnl=0 +char id=1269 x=441 y=243 width=12 height=12 xoffset=0 yoffset=5 xadvance=8 page=0 chnl=0 +char id=1270 x=264 y=90 width=14 height=16 xoffset=-1 yoffset=4 xadvance=9 page=0 chnl=0 +char id=1271 x=453 y=243 width=11 height=12 xoffset=-1 yoffset=7 xadvance=6 page=0 chnl=0 +char id=1272 x=278 y=90 width=25 height=16 xoffset=-1 yoffset=1 xadvance=14 page=0 chnl=0 +char id=1273 x=464 y=243 width=15 height=12 xoffset=-1 yoffset=5 xadvance=10 page=0 chnl=0 +char id=1274 x=185 y=57 width=14 height=17 xoffset=-1 yoffset=4 xadvance=9 page=0 chnl=0 +char id=1275 x=180 y=163 width=11 height=14 xoffset=-1 yoffset=7 xadvance=6 page=0 chnl=0 +char id=1276 x=303 y=90 width=16 height=16 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=1277 x=191 y=163 width=12 height=14 xoffset=-1 yoffset=7 xadvance=7 page=0 chnl=0 +char id=1278 x=387 y=230 width=16 height=13 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=1279 x=113 y=278 width=11 height=10 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=0 +char id=1280 x=403 y=230 width=14 height=13 xoffset=-1 yoffset=4 xadvance=9 page=0 chnl=0 +char id=1281 x=203 y=163 width=11 height=14 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=1282 x=417 y=230 width=19 height=13 xoffset=-1 yoffset=4 xadvance=14 page=0 chnl=0 +char id=1283 x=214 y=163 width=13 height=14 xoffset=-1 yoffset=4 xadvance=10 page=0 chnl=0 +char id=1284 x=227 y=163 width=15 height=14 xoffset=0 yoffset=4 xadvance=13 page=0 chnl=0 +char id=1285 x=29 y=267 width=10 height=11 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=0 +char id=1286 x=319 y=90 width=10 height=16 xoffset=0 yoffset=4 xadvance=9 page=0 chnl=0 +char id=1287 x=436 y=230 width=9 height=13 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=0 +char id=1288 x=242 y=163 width=20 height=14 xoffset=-1 yoffset=4 xadvance=15 page=0 chnl=0 +char id=1289 x=39 y=267 width=13 height=11 xoffset=-1 yoffset=7 xadvance=10 page=0 chnl=0 +char id=1290 x=262 y=163 width=20 height=14 xoffset=-1 yoffset=4 xadvance=15 page=0 chnl=0 +char id=1291 x=52 y=267 width=14 height=11 xoffset=-1 yoffset=7 xadvance=11 page=0 chnl=0 +char id=1292 x=282 y=163 width=14 height=14 xoffset=0 yoffset=4 xadvance=12 page=0 chnl=0 +char id=1293 x=66 y=267 width=10 height=11 xoffset=-1 yoffset=7 xadvance=7 page=0 chnl=0 +char id=1294 x=296 y=163 width=15 height=14 xoffset=0 yoffset=4 xadvance=11 page=0 chnl=0 +char id=1295 x=76 y=267 width=10 height=11 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=0 +char id=1296 x=311 y=163 width=11 height=14 xoffset=0 yoffset=4 xadvance=9 page=0 chnl=0 +char id=1297 x=86 y=267 width=10 height=11 xoffset=-1 yoffset=7 xadvance=7 page=0 chnl=0 +char id=1298 x=329 y=90 width=16 height=16 xoffset=-1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=1299 x=322 y=163 width=11 height=14 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=0 +char id=1300 x=333 y=163 width=20 height=14 xoffset=-1 yoffset=4 xadvance=15 page=0 chnl=0 +char id=1301 x=96 y=267 width=13 height=11 xoffset=-1 yoffset=7 xadvance=10 page=0 chnl=0 +char id=1302 x=445 y=230 width=18 height=13 xoffset=-1 yoffset=4 xadvance=13 page=0 chnl=0 +char id=1303 x=353 y=163 width=15 height=14 xoffset=-2 yoffset=7 xadvance=11 page=0 chnl=0 +char id=1304 x=463 y=230 width=20 height=13 xoffset=-1 yoffset=4 xadvance=15 page=0 chnl=0 +char id=1305 x=109 y=267 width=15 height=11 xoffset=-1 yoffset=7 xadvance=12 page=0 chnl=0 +char id=1306 x=345 y=90 width=14 height=16 xoffset=0 yoffset=4 xadvance=12 page=0 chnl=0 +char id=1307 x=368 y=163 width=11 height=14 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=0 +char id=1308 x=379 y=163 width=19 height=14 xoffset=0 yoffset=4 xadvance=15 page=0 chnl=0 +char id=1309 x=124 y=267 width=15 height=11 xoffset=0 yoffset=7 xadvance=11 page=0 chnl=0 +char id=1310 x=483 y=230 width=14 height=13 xoffset=-1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=1311 x=124 y=278 width=11 height=10 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=0 +char id=1312 x=199 y=57 width=18 height=17 xoffset=-1 yoffset=4 xadvance=16 page=0 chnl=0 +char id=1313 x=398 y=163 width=14 height=14 xoffset=-1 yoffset=7 xadvance=11 page=0 chnl=0 +char id=1314 x=217 y=57 width=19 height=17 xoffset=-1 yoffset=4 xadvance=16 page=0 chnl=0 +char id=1315 x=412 y=163 width=14 height=14 xoffset=-1 yoffset=7 xadvance=12 page=0 chnl=0 +char id=8192 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=8193 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=16 page=0 chnl=0 +char id=8194 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=8195 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=16 page=0 chnl=0 +char id=8196 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=8197 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=4 page=0 chnl=0 +char id=8198 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=3 page=0 chnl=0 +char id=8199 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=8200 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=4 page=0 chnl=0 +char id=8201 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=3 page=0 chnl=0 +char id=8202 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=2 page=0 chnl=0 +char id=8203 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=0 page=0 chnl=0 +char id=8204 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=0 page=0 chnl=0 +char id=8210 x=66 y=288 width=11 height=4 xoffset=-1 yoffset=10 xadvance=8 page=0 chnl=0 +char id=8211 x=66 y=288 width=11 height=4 xoffset=-1 yoffset=10 xadvance=8 page=0 chnl=0 +char id=8212 x=77 y=288 width=19 height=4 xoffset=-1 yoffset=10 xadvance=16 page=0 chnl=0 +char id=8213 x=77 y=288 width=19 height=4 xoffset=-1 yoffset=10 xadvance=16 page=0 chnl=0 +char id=8214 x=497 y=230 width=7 height=13 xoffset=-1 yoffset=6 xadvance=5 page=0 chnl=0 +char id=8215 x=430 y=278 width=8 height=6 xoffset=0 yoffset=15 xadvance=8 page=0 chnl=0 +char id=8216 x=506 y=163 width=5 height=7 xoffset=1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=8217 x=438 y=278 width=5 height=6 xoffset=1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=8218 x=305 y=278 width=6 height=7 xoffset=-1 yoffset=13 xadvance=4 page=0 chnl=0 +char id=8219 x=311 y=278 width=5 height=7 xoffset=1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=8220 x=316 y=278 width=8 height=7 xoffset=1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=8221 x=443 y=278 width=8 height=6 xoffset=1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=8222 x=324 y=278 width=9 height=7 xoffset=-1 yoffset=13 xadvance=7 page=0 chnl=0 +char id=8223 x=333 y=278 width=8 height=7 xoffset=1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=8224 x=502 y=74 width=9 height=16 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=8225 x=359 y=90 width=10 height=16 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=8226 x=341 y=278 width=7 height=7 xoffset=0 yoffset=7 xadvance=6 page=0 chnl=0 +char id=8230 x=20 y=288 width=14 height=5 xoffset=1 yoffset=13 xadvance=16 page=0 chnl=0 +char id=8239 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=4 page=0 chnl=0 +char id=8240 x=243 y=106 width=18 height=15 xoffset=0 yoffset=3 xadvance=16 page=0 chnl=0 +char id=8242 x=348 y=278 width=8 height=7 xoffset=0 yoffset=3 xadvance=4 page=0 chnl=0 +char id=8243 x=356 y=278 width=11 height=7 xoffset=0 yoffset=3 xadvance=7 page=0 chnl=0 +char id=8244 x=367 y=278 width=14 height=7 xoffset=0 yoffset=3 xadvance=10 page=0 chnl=0 +char id=8249 x=208 y=278 width=7 height=9 xoffset=-1 yoffset=8 xadvance=4 page=0 chnl=0 +char id=8250 x=215 y=278 width=7 height=9 xoffset=-1 yoffset=8 xadvance=4 page=0 chnl=0 +char id=8252 x=426 y=163 width=11 height=14 xoffset=1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=8254 x=96 y=288 width=12 height=4 xoffset=0 yoffset=5 xadvance=8 page=0 chnl=0 +char id=8260 x=437 y=163 width=19 height=14 xoffset=-4 yoffset=4 xadvance=3 page=0 chnl=0 +char id=8286 x=369 y=90 width=6 height=16 xoffset=-1 yoffset=2 xadvance=3 page=0 chnl=0 +char id=8352 x=456 y=163 width=11 height=14 xoffset=1 yoffset=3 xadvance=11 page=0 chnl=0 +char id=8353 x=107 y=22 width=13 height=18 xoffset=0 yoffset=2 xadvance=11 page=0 chnl=0 +char id=8354 x=467 y=163 width=13 height=14 xoffset=0 yoffset=4 xadvance=11 page=0 chnl=0 +char id=8355 x=0 y=243 width=14 height=13 xoffset=-1 yoffset=4 xadvance=9 page=0 chnl=0 +char id=8356 x=480 y=163 width=11 height=14 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=8357 x=491 y=163 width=15 height=14 xoffset=-1 yoffset=5 xadvance=12 page=0 chnl=0 +char id=8358 x=0 y=177 width=17 height=14 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=8359 x=17 y=177 width=18 height=14 xoffset=-1 yoffset=4 xadvance=15 page=0 chnl=0 +char id=8360 x=35 y=177 width=19 height=14 xoffset=-1 yoffset=4 xadvance=16 page=0 chnl=0 +char id=8361 x=54 y=177 width=17 height=14 xoffset=0 yoffset=4 xadvance=13 page=0 chnl=0 +char id=8363 x=375 y=90 width=12 height=16 xoffset=0 yoffset=2 xadvance=8 page=0 chnl=0 +char id=8364 x=71 y=177 width=14 height=14 xoffset=0 yoffset=4 xadvance=12 page=0 chnl=0 +char id=8365 x=14 y=243 width=15 height=13 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=8366 x=29 y=243 width=14 height=13 xoffset=0 yoffset=4 xadvance=10 page=0 chnl=0 +char id=8367 x=236 y=57 width=24 height=17 xoffset=-1 yoffset=4 xadvance=21 page=0 chnl=0 +char id=8368 x=260 y=57 width=10 height=17 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=8369 x=43 y=243 width=13 height=13 xoffset=-1 yoffset=4 xadvance=10 page=0 chnl=0 +char id=8370 x=261 y=106 width=12 height=15 xoffset=0 yoffset=3 xadvance=10 page=0 chnl=0 +char id=8371 x=56 y=243 width=14 height=13 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=8372 x=85 y=177 width=11 height=14 xoffset=0 yoffset=4 xadvance=9 page=0 chnl=0 +char id=8373 x=387 y=90 width=12 height=16 xoffset=0 yoffset=3 xadvance=10 page=0 chnl=0 +char id=11360 x=70 y=243 width=12 height=13 xoffset=-1 yoffset=4 xadvance=10 page=0 chnl=0 +char id=11361 x=82 y=243 width=8 height=13 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=11362 x=90 y=243 width=13 height=13 xoffset=-1 yoffset=4 xadvance=10 page=0 chnl=0 +char id=11363 x=103 y=243 width=14 height=13 xoffset=-1 yoffset=4 xadvance=9 page=0 chnl=0 +char id=11364 x=270 y=57 width=12 height=17 xoffset=0 yoffset=4 xadvance=11 page=0 chnl=0 +char id=11365 x=479 y=243 width=12 height=12 xoffset=-1 yoffset=6 xadvance=7 page=0 chnl=0 +char id=11366 x=96 y=177 width=8 height=14 xoffset=-1 yoffset=5 xadvance=5 page=0 chnl=0 +char id=11367 x=399 y=90 width=17 height=16 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=11368 x=273 y=106 width=10 height=15 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=11369 x=416 y=90 width=15 height=16 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=11370 x=283 y=106 width=11 height=15 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=11371 x=431 y=90 width=15 height=16 xoffset=-1 yoffset=4 xadvance=10 page=0 chnl=0 +char id=11372 x=491 y=243 width=10 height=12 xoffset=-1 yoffset=7 xadvance=7 page=0 chnl=0 +char id=11373 x=104 y=177 width=13 height=14 xoffset=0 yoffset=4 xadvance=11 page=0 chnl=0 +char id=11377 x=139 y=267 width=14 height=11 xoffset=0 yoffset=7 xadvance=10 page=0 chnl=0 +char id=11378 x=117 y=177 width=21 height=14 xoffset=0 yoffset=4 xadvance=17 page=0 chnl=0 +char id=11379 x=153 y=267 width=17 height=11 xoffset=0 yoffset=7 xadvance=14 page=0 chnl=0 +char id=11380 x=501 y=243 width=10 height=12 xoffset=0 yoffset=6 xadvance=8 page=0 chnl=0 +char id=11381 x=117 y=243 width=12 height=13 xoffset=-1 yoffset=4 xadvance=9 page=0 chnl=0 +char id=11382 x=135 y=278 width=9 height=10 xoffset=-1 yoffset=7 xadvance=6 page=0 chnl=0 +char id=11383 x=170 y=267 width=12 height=11 xoffset=0 yoffset=7 xadvance=10 page=0 chnl=0 +kernings count=7203 +kerning first=221 second=171 amount=-1 +kerning first=279 second=311 amount=-1 +kerning first=256 second=87 amount=-2 +kerning first=264 second=201 amount=-1 +kerning first=88 second=253 amount=-1 +kerning first=234 second=44 amount=-1 +kerning first=272 second=46 amount=-1 +kerning first=193 second=253 amount=-1 +kerning first=102 second=311 amount=1 +kerning first=206 second=259 amount=-1 +kerning first=229 second=253 amount=-1 +kerning first=337 second=253 amount=-1 +kerning first=83 second=65 amount=-1 +kerning first=67 second=66 amount=-1 +kerning first=75 second=67 amount=-1 +kerning first=268 second=68 amount=-1 +kerning first=262 second=69 amount=-1 +kerning first=352 second=70 amount=-1 +kerning first=376 second=71 amount=-1 +kerning first=350 second=72 amount=-1 +kerning first=66 second=73 amount=-1 +kerning first=354 second=74 amount=-1 +kerning first=262 second=75 amount=-1 +kerning first=66 second=77 amount=-1 +kerning first=262 second=78 amount=-1 +kerning first=192 second=79 amount=-1 +kerning first=266 second=80 amount=-1 +kerning first=75 second=81 amount=-1 +kerning first=67 second=82 amount=-1 +kerning first=290 second=84 amount=-1 +kerning first=82 second=85 amount=-1 +kerning first=321 second=86 amount=-1 +kerning first=350 second=87 amount=-1 +kerning first=8250 second=89 amount=-1 +kerning first=313 second=90 amount=-1 +kerning first=1046 second=1086 amount=-1 +kerning first=84 second=100 amount=-1 +kerning first=255 second=101 amount=-1 +kerning first=350 second=102 amount=-1 +kerning first=89 second=103 amount=-1 +kerning first=352 second=105 amount=-1 +kerning first=371 second=106 amount=1 +kerning first=277 second=107 amount=-1 +kerning first=102 second=108 amount=1 +kerning first=84 second=109 amount=-1 +kerning first=354 second=110 amount=-1 +kerning first=118 second=111 amount=-1 +kerning first=268 second=112 amount=-1 +kerning first=66 second=114 amount=-1 +kerning first=89 second=115 amount=-1 +kerning first=82 second=116 amount=-1 +kerning first=110 second=119 amount=-1 +kerning first=112 second=120 amount=-1 +kerning first=98 second=121 amount=-1 +kerning first=253 second=122 amount=-1 +kerning first=195 second=219 amount=-1 +kerning first=199 second=171 amount=-1 +kerning first=121 second=235 amount=-1 +kerning first=84 second=187 amount=-1 +kerning first=82 second=45 amount=-1 +kerning first=374 second=192 amount=-2 +kerning first=83 second=193 amount=-1 +kerning first=366 second=194 amount=-1 +kerning first=45 second=195 amount=-1 +kerning first=87 second=196 amount=-2 +kerning first=8216 second=197 amount=-2 +kerning first=89 second=198 amount=-2 +kerning first=199 second=199 amount=-1 +kerning first=45 second=200 amount=-1 +kerning first=266 second=201 amount=-1 +kerning first=268 second=204 amount=-1 +kerning first=66 second=205 amount=-1 +kerning first=346 second=206 amount=-1 +kerning first=350 second=207 amount=-1 +kerning first=66 second=209 amount=-1 +kerning first=82 second=210 amount=-1 +kerning first=376 second=211 amount=-1 +kerning first=192 second=212 amount=-1 +kerning first=264 second=213 amount=-1 +kerning first=193 second=214 amount=-1 +kerning first=67 second=216 amount=-1 +kerning first=258 second=219 amount=-1 +kerning first=195 second=220 amount=-1 +kerning first=223 second=46 amount=-1 +kerning first=356 second=223 amount=-1 +kerning first=99 second=224 amount=-1 +kerning first=375 second=225 amount=-1 +kerning first=207 second=226 amount=-1 +kerning first=376 second=227 amount=-1 +kerning first=370 second=228 amount=-1 +kerning first=8216 second=229 amount=-1 +kerning first=205 second=230 amount=-1 +kerning first=371 second=231 amount=-1 +kerning first=356 second=232 amount=-1 +kerning first=350 second=120 amount=-1 +kerning first=354 second=234 amount=-1 +kerning first=371 second=235 amount=-1 +kerning first=263 second=237 amount=-1 +kerning first=118 second=240 amount=-1 +kerning first=221 second=241 amount=-1 +kerning first=87 second=242 amount=-1 +kerning first=356 second=243 amount=-1 +kerning first=303 second=244 amount=-1 +kerning first=86 second=245 amount=-1 +kerning first=374 second=246 amount=-1 +kerning first=88 second=250 amount=-1 +kerning first=82 second=248 amount=-1 +kerning first=8220 second=277 amount=-1 +kerning first=274 second=103 amount=-1 +kerning first=307 second=171 amount=-1 +kerning first=90 second=252 amount=-1 +kerning first=376 second=253 amount=-1 +kerning first=66 second=254 amount=-1 +kerning first=272 second=256 amount=-1 +kerning first=72 second=257 amount=-1 +kerning first=269 second=259 amount=-1 +kerning first=199 second=260 amount=-1 +kerning first=75 second=262 amount=-1 +kerning first=8220 second=263 amount=-1 +kerning first=67 second=264 amount=-1 +kerning first=356 second=266 amount=-1 +kerning first=107 second=267 amount=-1 +kerning first=65 second=268 amount=-1 +kerning first=346 second=270 amount=-1 +kerning first=311 second=271 amount=-1 +kerning first=119 second=273 amount=-1 +kerning first=66 second=274 amount=-1 +kerning first=356 second=275 amount=-1 +kerning first=262 second=278 amount=-1 +kerning first=221 second=279 amount=-1 +kerning first=66 second=280 amount=-1 +kerning first=84 second=281 amount=-1 +kerning first=66 second=282 amount=-1 +kerning first=354 second=284 amount=-1 +kerning first=194 second=286 amount=-1 +kerning first=365 second=287 amount=-1 +kerning first=258 second=288 amount=-1 +kerning first=187 second=289 amount=-1 +kerning first=8250 second=291 amount=-1 +kerning first=66 second=296 amount=-1 +kerning first=67 second=298 amount=-1 +kerning first=268 second=304 amount=-1 +kerning first=66 second=305 amount=-1 +kerning first=267 second=307 amount=-1 +kerning first=354 second=99 amount=-1 +kerning first=262 second=310 amount=-1 +kerning first=376 second=352 amount=-1 +kerning first=365 second=314 amount=-1 +kerning first=8250 second=315 amount=-1 +kerning first=333 second=316 amount=-1 +kerning first=283 second=318 amount=-1 +kerning first=268 second=330 amount=-1 +kerning first=266 second=323 amount=-1 +kerning first=264 second=325 amount=-1 +kerning first=66 second=327 amount=-1 +kerning first=84 second=328 amount=-1 +kerning first=346 second=330 amount=-1 +kerning first=76 second=220 amount=-1 +kerning first=87 second=332 amount=-1 +kerning first=303 second=333 amount=-1 +kerning first=221 second=334 amount=-1 +kerning first=82 second=335 amount=-1 +kerning first=195 second=336 amount=-1 +kerning first=194 second=338 amount=-1 +kerning first=66 second=345 amount=-1 +kerning first=220 second=346 amount=-1 +kerning first=354 second=347 amount=-1 +kerning first=87 second=350 amount=-1 +kerning first=255 second=351 amount=-1 +kerning first=65 second=352 amount=-1 +kerning first=192 second=353 amount=-1 +kerning first=344 second=355 amount=-1 +kerning first=8218 second=356 amount=-2 +kerning first=251 second=103 amount=-1 +kerning first=196 second=350 amount=-1 +kerning first=194 second=361 amount=-1 +kerning first=8222 second=362 amount=-1 +kerning first=66 second=364 amount=-1 +kerning first=310 second=365 amount=-1 +kerning first=65 second=366 amount=-1 +kerning first=204 second=367 amount=-1 +kerning first=268 second=350 amount=-1 +kerning first=204 second=369 amount=-1 +kerning first=315 second=370 amount=-1 +kerning first=120 second=371 amount=-1 +kerning first=101 second=318 amount=-1 +kerning first=65 second=374 amount=-2 +kerning first=256 second=375 amount=-1 +kerning first=317 second=377 amount=-1 +kerning first=313 second=378 amount=-1 +kerning first=376 second=379 amount=-1 +kerning first=219 second=380 amount=-1 +kerning first=66 second=381 amount=-1 +kerning first=220 second=382 amount=-1 +kerning first=242 second=318 amount=-1 +kerning first=256 second=199 amount=-1 +kerning first=307 second=118 amount=-1 +kerning first=315 second=368 amount=-1 +kerning first=1059 second=1078 amount=-1 +kerning first=75 second=365 amount=-1 +kerning first=230 second=121 amount=-1 +kerning first=221 second=231 amount=-1 +kerning first=8216 second=194 amount=-2 +kerning first=193 second=332 amount=-1 +kerning first=350 second=204 amount=-1 +kerning first=72 second=117 amount=-1 +kerning first=8220 second=225 amount=-1 +kerning first=88 second=332 amount=-1 +kerning first=217 second=378 amount=-1 +kerning first=234 second=316 amount=-1 +kerning first=196 second=252 amount=-1 +kerning first=86 second=267 amount=-1 +kerning first=76 second=378 amount=-1 +kerning first=1040 second=1095 amount=-1 +kerning first=337 second=46 amount=-1 +kerning first=194 second=364 amount=-1 +kerning first=8250 second=77 amount=-1 +kerning first=197 second=264 amount=-1 +kerning first=105 second=119 amount=-1 +kerning first=45 second=362 amount=-1 +kerning first=258 second=362 amount=-1 +kerning first=289 second=378 amount=-1 +kerning first=253 second=378 amount=-1 +kerning first=317 second=218 amount=-1 +kerning first=8220 second=226 amount=-1 +kerning first=101 second=375 amount=-1 +kerning first=354 second=119 amount=-1 +kerning first=350 second=200 amount=-1 +kerning first=82 second=217 amount=-1 +kerning first=121 second=314 amount=-1 +kerning first=196 second=364 amount=-1 +kerning first=187 second=217 amount=-1 +kerning first=371 second=267 amount=-1 +kerning first=224 second=8220 amount=-1 +kerning first=192 second=375 amount=-1 +kerning first=379 second=250 amount=-1 +kerning first=356 second=216 amount=-1 +kerning first=264 second=378 amount=-1 +kerning first=80 second=192 amount=-1 +kerning first=65 second=290 amount=-1 +kerning first=255 second=245 amount=-1 +kerning first=87 second=378 amount=-1 +kerning first=362 second=193 amount=-1 +kerning first=45 second=204 amount=-1 +kerning first=290 second=193 amount=-1 +kerning first=266 second=325 amount=-1 +kerning first=192 second=221 amount=-2 +kerning first=187 second=296 amount=-1 +kerning first=262 second=274 amount=-1 +kerning first=346 second=366 amount=-1 +kerning first=8250 second=327 amount=-1 +kerning first=376 second=291 amount=-1 +kerning first=8220 second=74 amount=-1 +kerning first=187 second=256 amount=-1 +kerning first=304 second=291 amount=-1 +kerning first=78 second=226 amount=-1 +kerning first=260 second=210 amount=-1 +kerning first=232 second=291 amount=-1 +kerning first=86 second=326 amount=-1 +kerning first=196 second=291 amount=-1 +kerning first=255 second=226 amount=-1 +kerning first=71 second=197 amount=-1 +kerning first=219 second=226 amount=-1 +kerning first=346 second=327 amount=-1 +kerning first=327 second=226 amount=-1 +kerning first=291 second=226 amount=-1 +kerning first=350 second=68 amount=-1 +kerning first=284 second=197 amount=-1 +kerning first=266 second=344 amount=-1 +kerning first=212 second=197 amount=-1 +kerning first=99 second=108 amount=-1 +kerning first=356 second=197 amount=-2 +kerning first=89 second=187 amount=-1 +kerning first=205 second=365 amount=-1 +kerning first=65 second=8249 amount=-1 +kerning first=197 second=284 amount=-1 +kerning first=206 second=8249 amount=-1 +kerning first=84 second=262 amount=-1 +kerning first=375 second=337 amount=-1 +kerning first=73 second=261 amount=-1 +kerning first=303 second=337 amount=-1 +kerning first=350 second=8249 amount=-1 +kerning first=314 second=8249 amount=-1 +kerning first=112 second=108 amount=-1 +kerning first=253 second=108 amount=-1 +kerning first=68 second=198 amount=-1 +kerning first=269 second=303 amount=-1 +kerning first=263 second=228 amount=-1 +kerning first=339 second=318 amount=-1 +kerning first=375 second=318 amount=-1 +kerning first=217 second=260 amount=-1 +kerning first=86 second=228 amount=-1 +kerning first=72 second=367 amount=-1 +kerning first=258 second=45 amount=-1 +kerning first=289 second=108 amount=-1 +kerning first=253 second=279 amount=-1 +kerning first=45 second=73 amount=-1 +kerning first=76 second=89 amount=-1 +kerning first=1036 second=1104 amount=-1 +kerning first=82 second=231 amount=-1 +kerning first=121 second=353 amount=-1 +kerning first=311 second=339 amount=-1 +kerning first=119 second=229 amount=-1 +kerning first=8222 second=119 amount=-1 +kerning first=252 second=8217 amount=-1 +kerning first=324 second=8217 amount=-1 +kerning first=71 second=45 amount=-1 +kerning first=352 second=304 amount=-1 +kerning first=87 second=240 amount=-1 +kerning first=72 second=97 amount=-1 +kerning first=193 second=352 amount=-1 +kerning first=284 second=45 amount=-1 +kerning first=368 second=229 amount=-1 +kerning first=356 second=45 amount=-1 +kerning first=296 second=229 amount=-1 +kerning first=107 second=45 amount=-1 +kerning first=268 second=310 amount=-1 +kerning first=67 second=304 amount=-1 +kerning first=346 second=77 amount=-1 +kerning first=263 second=307 amount=-1 +kerning first=344 second=111 amount=-1 +kerning first=226 second=255 amount=-1 +kerning first=87 second=109 amount=-1 +kerning first=221 second=211 amount=-1 +kerning first=1038 second=1033 amount=-1 +kerning first=1036 second=1038 amount=-1 +kerning first=1038 second=1040 amount=-2 +kerning first=118 second=46 amount=-1 +kerning first=8249 second=84 amount=-1 +kerning first=1038 second=1047 amount=-1 +kerning first=1058 second=1051 amount=-1 +kerning first=350 second=69 amount=-1 +kerning first=8250 second=346 amount=-1 +kerning first=218 second=193 amount=-1 +kerning first=119 second=289 amount=-1 +kerning first=1040 second=1057 amount=-1 +kerning first=1061 second=1058 amount=-1 +kerning first=1050 second=1059 amount=-1 +kerning first=1040 second=1060 amount=-1 +kerning first=1061 second=1063 amount=-1 +kerning first=83 second=289 amount=-1 +kerning first=354 second=79 amount=-1 +kerning first=296 second=289 amount=-1 +kerning first=1038 second=1072 amount=-1 +kerning first=1038 second=1073 amount=-1 +kerning first=1038 second=1074 amount=-1 +kerning first=1038 second=1076 amount=-1 +kerning first=1038 second=1077 amount=-1 +kerning first=1038 second=1078 amount=-1 +kerning first=1038 second=1079 amount=-1 +kerning first=1038 second=1080 amount=-1 +kerning first=1038 second=1081 amount=-1 +kerning first=1038 second=1082 amount=-1 +kerning first=260 second=289 amount=-1 +kerning first=1038 second=1084 amount=-1 +kerning first=1038 second=1085 amount=-1 +kerning first=1038 second=1086 amount=-1 +kerning first=1038 second=1087 amount=-1 +kerning first=1038 second=1088 amount=-1 +kerning first=1038 second=1089 amount=-1 +kerning first=103 second=225 amount=-1 +kerning first=1040 second=1091 amount=-1 +kerning first=1043 second=1092 amount=-1 +kerning first=1038 second=1093 amount=-1 +kerning first=1059 second=1094 amount=-1 +kerning first=1044 second=1095 amount=-1 +kerning first=1038 second=1096 amount=-1 +kerning first=1038 second=1097 amount=-1 +kerning first=1050 second=1098 amount=-1 +kerning first=1038 second=1099 amount=-1 +kerning first=1038 second=1100 amount=-1 +kerning first=45 second=375 amount=-1 +kerning first=67 second=206 amount=-1 +kerning first=1038 second=1103 amount=-1 +kerning first=258 second=264 amount=-1 +kerning first=1038 second=1105 amount=-1 +kerning first=1038 second=1107 amount=-1 +kerning first=1038 second=1108 amount=-1 +kerning first=291 second=225 amount=-1 +kerning first=1043 second=1113 amount=-1 +kerning first=1038 second=1114 amount=-1 +kerning first=327 second=225 amount=-1 +kerning first=1038 second=1116 amount=-1 +kerning first=83 second=368 amount=-1 +kerning first=1040 second=1118 amount=-1 +kerning first=1038 second=1119 amount=-1 +kerning first=313 second=364 amount=-1 +kerning first=286 second=287 amount=-1 +kerning first=221 second=46 amount=-1 +kerning first=260 second=368 amount=-1 +kerning first=288 second=287 amount=-1 +kerning first=75 second=268 amount=-1 +kerning first=252 second=287 amount=-1 +kerning first=352 second=206 amount=-1 +kerning first=352 second=69 amount=-1 +kerning first=260 second=347 amount=-1 +kerning first=344 second=71 amount=-1 +kerning first=194 second=8217 amount=-1 +kerning first=119 second=347 amount=-1 +kerning first=8220 second=244 amount=-1 +kerning first=78 second=225 amount=-1 +kerning first=87 second=241 amount=-1 +kerning first=85 second=45 amount=-1 +kerning first=317 second=87 amount=-1 +kerning first=248 second=46 amount=-1 +kerning first=75 second=266 amount=-1 +kerning first=219 second=225 amount=-1 +kerning first=255 second=225 amount=-1 +kerning first=356 second=46 amount=-1 +kerning first=376 second=332 amount=-1 +kerning first=82 second=86 amount=-1 +kerning first=231 second=259 amount=-1 +kerning first=1038 second=1090 amount=-1 +kerning first=201 second=287 amount=-1 +kerning first=354 second=230 amount=-1 +kerning first=304 second=369 amount=-1 +kerning first=367 second=375 amount=-1 +kerning first=196 second=81 amount=-1 +kerning first=1027 second=1105 amount=-1 +kerning first=375 second=259 amount=-1 +kerning first=69 second=289 amount=-1 +kerning first=187 second=375 amount=-1 +kerning first=105 second=289 amount=-1 +kerning first=223 second=375 amount=-1 +kerning first=221 second=350 amount=-1 +kerning first=259 second=375 amount=-1 +kerning first=267 second=259 amount=-1 +kerning first=376 second=81 amount=-1 +kerning first=121 second=382 amount=-1 +kerning first=256 second=219 amount=-1 +kerning first=8250 second=209 amount=-1 +kerning first=354 second=289 amount=-1 +kerning first=103 second=46 amount=-1 +kerning first=196 second=369 amount=-1 +kerning first=260 second=288 amount=-1 +kerning first=1065 second=1095 amount=-1 +kerning first=281 second=316 amount=-1 +kerning first=105 second=171 amount=-1 +kerning first=337 second=121 amount=-1 +kerning first=310 second=117 amount=-1 +kerning first=286 second=221 amount=-1 +kerning first=262 second=196 amount=-1 +kerning first=193 second=121 amount=-1 +kerning first=370 second=196 amount=-1 +kerning first=334 second=196 amount=-1 +kerning first=88 second=121 amount=-1 +kerning first=256 second=8221 amount=-1 +kerning first=354 second=231 amount=-1 +kerning first=307 second=119 amount=-1 +kerning first=45 second=302 amount=-1 +kerning first=82 second=375 amount=-1 +kerning first=193 second=351 amount=-1 +kerning first=235 second=119 amount=-1 +kerning first=1059 second=1098 amount=-1 +kerning first=336 second=196 amount=-1 +kerning first=89 second=214 amount=-1 +kerning first=350 second=298 amount=-1 +kerning first=1059 second=1097 amount=-1 +kerning first=101 second=107 amount=-1 +kerning first=287 second=314 amount=-1 +kerning first=109 second=45 amount=-1 +kerning first=1038 second=1098 amount=-1 +kerning first=251 second=314 amount=-1 +kerning first=66 second=213 amount=-1 +kerning first=243 second=120 amount=-1 +kerning first=99 second=253 amount=-1 +kerning first=256 second=8249 amount=-1 +kerning first=240 second=253 amount=-1 +kerning first=220 second=8249 amount=-1 +kerning first=187 second=315 amount=-1 +kerning first=328 second=8249 amount=-1 +kerning first=204 second=291 amount=-1 +kerning first=197 second=363 amount=-1 +kerning first=364 second=8249 amount=-1 +kerning first=255 second=246 amount=-1 +kerning first=88 second=214 amount=-1 +kerning first=344 second=263 amount=-1 +kerning first=370 second=103 amount=-1 +kerning first=1060 second=1033 amount=-1 +kerning first=192 second=220 amount=-1 +kerning first=298 second=103 amount=-1 +kerning first=377 second=363 amount=-1 +kerning first=356 second=334 amount=-1 +kerning first=352 second=344 amount=-1 +kerning first=376 second=101 amount=-1 +kerning first=8217 second=226 amount=-1 +kerning first=311 second=281 amount=-1 +kerning first=44 second=8221 amount=-1 +kerning first=224 second=118 amount=-1 +kerning first=85 second=103 amount=-1 +kerning first=83 second=118 amount=-1 +kerning first=67 second=382 amount=-1 +kerning first=245 second=316 amount=-1 +kerning first=103 second=382 amount=-1 +kerning first=66 second=120 amount=-1 +kerning first=258 second=86 amount=-2 +kerning first=193 second=83 amount=-1 +kerning first=370 second=44 amount=-1 +kerning first=334 second=44 amount=-1 +kerning first=194 second=374 amount=-2 +kerning first=121 second=44 amount=-1 +kerning first=85 second=44 amount=-1 +kerning first=251 second=255 amount=-1 +kerning first=296 second=97 amount=-1 +kerning first=365 second=8221 amount=-1 +kerning first=196 second=211 amount=-1 +kerning first=344 second=262 amount=-1 +kerning first=257 second=8221 amount=-1 +kerning first=368 second=97 amount=-1 +kerning first=250 second=118 amount=-1 +kerning first=90 second=8249 amount=-1 +kerning first=268 second=211 amount=-1 +kerning first=221 second=79 amount=-1 +kerning first=346 second=209 amount=-1 +kerning first=108 second=118 amount=-1 +kerning first=85 second=65 amount=-1 +kerning first=321 second=118 amount=-1 +kerning first=187 second=85 amount=-1 +kerning first=262 second=65 amount=-1 +kerning first=218 second=83 amount=-1 +kerning first=209 second=257 amount=-1 +kerning first=221 second=232 amount=-1 +kerning first=334 second=65 amount=-1 +kerning first=121 second=234 amount=-1 +kerning first=354 second=192 amount=-2 +kerning first=249 second=118 amount=-1 +kerning first=254 second=120 amount=-1 +kerning first=8220 second=246 amount=-1 +kerning first=370 second=65 amount=-1 +kerning first=350 second=260 amount=-1 +kerning first=296 second=250 amount=-1 +kerning first=210 second=192 amount=-1 +kerning first=260 second=250 amount=-1 +kerning first=339 second=107 amount=-1 +kerning first=376 second=331 amount=-1 +kerning first=195 second=199 amount=-1 +kerning first=79 second=198 amount=-1 +kerning first=8250 second=302 amount=-1 +kerning first=284 second=84 amount=-1 +kerning first=365 second=291 amount=-1 +kerning first=84 second=381 amount=-1 +kerning first=244 second=253 amount=-1 +kerning first=82 second=216 amount=-1 +kerning first=71 second=84 amount=-1 +kerning first=221 second=291 amount=-1 +kerning first=80 second=291 amount=-1 +kerning first=311 second=242 amount=-1 +kerning first=192 second=334 amount=-1 +kerning first=256 second=67 amount=-1 +kerning first=8250 second=78 amount=-1 +kerning first=107 second=335 amount=-1 +kerning first=356 second=335 amount=-1 +kerning first=381 second=45 amount=-1 +kerning first=258 second=112 amount=-1 +kerning first=253 second=339 amount=-1 +kerning first=8220 second=245 amount=-1 +kerning first=84 second=261 amount=-1 +kerning first=253 second=240 amount=-1 +kerning first=86 second=268 amount=-1 +kerning first=87 second=110 amount=-1 +kerning first=82 second=374 amount=-1 +kerning first=66 second=370 amount=-1 +kerning first=8217 second=227 amount=-1 +kerning first=101 second=108 amount=-1 +kerning first=220 second=198 amount=-1 +kerning first=307 second=289 amount=-1 +kerning first=87 second=279 amount=-1 +kerning first=199 second=289 amount=-1 +kerning first=235 second=289 amount=-1 +kerning first=89 second=286 amount=-1 +kerning first=65 second=218 amount=-1 +kerning first=78 second=97 amount=-1 +kerning first=266 second=286 amount=-1 +kerning first=1061 second=1104 amount=-1 +kerning first=242 second=108 amount=-1 +kerning first=352 second=305 amount=-1 +kerning first=333 second=108 amount=-1 +kerning first=89 second=324 amount=-1 +kerning first=66 second=310 amount=-1 +kerning first=374 second=324 amount=-1 +kerning first=277 second=287 amount=-1 +kerning first=205 second=287 amount=-1 +kerning first=86 second=352 amount=-1 +kerning first=86 second=115 amount=-1 +kerning first=287 second=353 amount=-1 +kerning first=256 second=356 amount=-2 +kerning first=8220 second=283 amount=-1 +kerning first=354 second=290 amount=-1 +kerning first=84 second=223 amount=-1 +kerning first=119 second=97 amount=-1 +kerning first=268 second=80 amount=-1 +kerning first=313 second=287 amount=-1 +kerning first=89 second=226 amount=-1 +kerning first=303 second=279 amount=-1 +kerning first=302 second=226 amount=-1 +kerning first=321 second=368 amount=-1 +kerning first=107 second=275 amount=-1 +kerning first=45 second=74 amount=-1 +kerning first=216 second=198 amount=-1 +kerning first=287 second=45 amount=-1 +kerning first=288 second=194 amount=-1 +kerning first=323 second=45 amount=-1 +kerning first=366 second=74 amount=-1 +kerning first=74 second=45 amount=-1 +kerning first=354 second=350 amount=-1 +kerning first=356 second=353 amount=-1 +kerning first=303 second=240 amount=-1 +kerning first=376 second=65 amount=-2 +kerning first=80 second=289 amount=-1 +kerning first=381 second=255 amount=-1 +kerning first=82 second=356 amount=-1 +kerning first=1059 second=1116 amount=-1 +kerning first=187 second=356 amount=-1 +kerning first=352 second=112 amount=-1 +kerning first=1054 second=1033 amount=-1 +kerning first=354 second=214 amount=-1 +kerning first=367 second=255 amount=-1 +kerning first=221 second=289 amount=-1 +kerning first=83 second=77 amount=-1 +kerning first=259 second=255 amount=-1 +kerning first=376 second=261 amount=-1 +kerning first=66 second=194 amount=-1 +kerning first=253 second=227 amount=-1 +kerning first=187 second=255 amount=-1 +kerning first=67 second=112 amount=-1 +kerning first=82 second=255 amount=-1 +kerning first=375 second=240 amount=-1 +kerning first=260 second=211 amount=-1 +kerning first=199 second=80 amount=-1 +kerning first=304 second=97 amount=-1 +kerning first=66 second=290 amount=-1 +kerning first=221 second=193 amount=-2 +kerning first=374 second=241 amount=-1 +kerning first=379 second=251 amount=-1 +kerning first=362 second=192 amount=-1 +kerning first=365 second=8220 amount=-1 +kerning first=8217 second=346 amount=-1 +kerning first=356 second=257 amount=-1 +kerning first=218 second=192 amount=-1 +kerning first=256 second=338 amount=-1 +kerning first=290 second=192 amount=-1 +kerning first=195 second=268 amount=-1 +kerning first=44 second=8220 amount=-1 +kerning first=83 second=119 amount=-1 +kerning first=249 second=103 amount=-1 +kerning first=224 second=119 amount=-1 +kerning first=260 second=119 amount=-1 +kerning first=376 second=233 amount=-1 +kerning first=1046 second=1073 amount=-1 +kerning first=89 second=225 amount=-1 +kerning first=119 second=44 amount=-1 +kerning first=240 second=314 amount=-1 +kerning first=374 second=225 amount=-1 +kerning first=199 second=209 amount=-1 +kerning first=8217 second=263 amount=-1 +kerning first=302 second=363 amount=-1 +kerning first=302 second=225 amount=-1 +kerning first=99 second=314 amount=-1 +kerning first=376 second=213 amount=-1 +kerning first=356 second=375 amount=-1 +kerning first=1043 second=1072 amount=-1 +kerning first=76 second=375 amount=-1 +kerning first=268 second=213 amount=-1 +kerning first=364 second=259 amount=-1 +kerning first=248 second=375 amount=-1 +kerning first=1040 second=1054 amount=-1 +kerning first=220 second=259 amount=-1 +kerning first=221 second=101 amount=-1 +kerning first=8217 second=287 amount=-1 +kerning first=311 second=246 amount=-1 +kerning first=66 second=369 amount=-1 +kerning first=199 second=288 amount=-1 +kerning first=107 second=235 amount=-1 +kerning first=350 second=317 amount=-1 +kerning first=1043 second=1033 amount=-1 +kerning first=65 second=87 amount=-2 +kerning first=8217 second=267 amount=-1 +kerning first=195 second=218 amount=-1 +kerning first=356 second=235 amount=-1 +kerning first=82 second=104 amount=-1 +kerning first=207 second=369 amount=-1 +kerning first=346 second=76 amount=-1 +kerning first=80 second=171 amount=-1 +kerning first=44 second=171 amount=-1 +kerning first=354 second=212 amount=-1 +kerning first=1091 second=1113 amount=-1 +kerning first=85 second=352 amount=-1 +kerning first=66 second=82 amount=-1 +kerning first=85 second=197 amount=-1 +kerning first=88 second=252 amount=-1 +kerning first=82 second=262 amount=-1 +kerning first=76 second=219 amount=-1 +kerning first=118 second=277 amount=-1 +kerning first=362 second=83 amount=-1 +kerning first=82 second=277 amount=-1 +kerning first=262 second=197 amount=-1 +kerning first=77 second=287 amount=-1 +kerning first=240 second=121 amount=-1 +kerning first=278 second=103 amount=-1 +kerning first=99 second=121 amount=-1 +kerning first=370 second=197 amount=-1 +kerning first=262 second=352 amount=-1 +kerning first=334 second=197 amount=-1 +kerning first=263 second=229 amount=-1 +kerning first=370 second=122 amount=-1 +kerning first=121 second=122 amount=-1 +kerning first=268 second=270 amount=-1 +kerning first=354 second=100 amount=-1 +kerning first=279 second=108 amount=-1 +kerning first=221 second=192 amount=-2 +kerning first=324 second=8220 amount=-1 +kerning first=196 second=213 amount=-1 +kerning first=82 second=334 amount=-1 +kerning first=74 second=65 amount=-1 +kerning first=119 second=99 amount=-1 +kerning first=251 second=253 amount=-1 +kerning first=291 second=115 amount=-1 +kerning first=363 second=8217 amount=-1 +kerning first=1101 second=1076 amount=-1 +kerning first=255 second=115 amount=-1 +kerning first=107 second=333 amount=-1 +kerning first=196 second=171 amount=-1 +kerning first=8250 second=76 amount=-1 +kerning first=304 second=171 amount=-1 +kerning first=268 second=171 amount=-1 +kerning first=65 second=199 amount=-1 +kerning first=195 second=86 amount=-2 +kerning first=268 second=82 amount=-1 +kerning first=381 second=103 amount=-1 +kerning first=66 second=214 amount=-1 +kerning first=196 second=8221 amount=-1 +kerning first=201 second=103 amount=-1 +kerning first=258 second=361 amount=-1 +kerning first=67 second=266 amount=-1 +kerning first=226 second=121 amount=-1 +kerning first=330 second=361 amount=-1 +kerning first=287 second=351 amount=-1 +kerning first=310 second=249 amount=-1 +kerning first=8220 second=243 amount=-1 +kerning first=264 second=71 amount=-1 +kerning first=192 second=71 amount=-1 +kerning first=87 second=71 amount=-1 +kerning first=1059 second=1096 amount=-1 +kerning first=260 second=86 amount=-2 +kerning first=195 second=67 amount=-1 +kerning first=354 second=232 amount=-1 +kerning first=310 second=118 amount=-1 +kerning first=280 second=287 amount=-1 +kerning first=45 second=380 amount=-1 +kerning first=264 second=202 amount=-1 +kerning first=107 second=171 amount=-1 +kerning first=366 second=380 amount=-1 +kerning first=8250 second=207 amount=-1 +kerning first=120 second=224 amount=-1 +kerning first=84 second=379 amount=-1 +kerning first=8217 second=225 amount=-1 +kerning first=317 second=217 amount=-1 +kerning first=346 second=69 amount=-1 +kerning first=1070 second=1040 amount=-1 +kerning first=84 second=224 amount=-1 +kerning first=350 second=218 amount=-1 +kerning first=82 second=354 amount=-1 +kerning first=352 second=364 amount=-1 +kerning first=1050 second=1104 amount=-1 +kerning first=187 second=354 amount=-1 +kerning first=337 second=120 amount=-1 +kerning first=234 second=104 amount=-1 +kerning first=254 second=46 amount=-1 +kerning first=97 second=118 amount=-1 +kerning first=8218 second=218 amount=-1 +kerning first=376 second=193 amount=-2 +kerning first=193 second=71 amount=-1 +kerning first=72 second=250 amount=-1 +kerning first=221 second=331 amount=-1 +kerning first=65 second=221 amount=-2 +kerning first=375 second=108 amount=-1 +kerning first=339 second=108 amount=-1 +kerning first=83 second=206 amount=-1 +kerning first=89 second=287 amount=-1 +kerning first=199 second=78 amount=-1 +kerning first=260 second=79 amount=-1 +kerning first=234 second=107 amount=-1 +kerning first=66 second=192 amount=-1 +kerning first=45 second=206 amount=-1 +kerning first=346 second=368 amount=-1 +kerning first=302 second=287 amount=-1 +kerning first=1061 second=1089 amount=-1 +kerning first=205 second=226 amount=-1 +kerning first=230 second=287 amount=-1 +kerning first=337 second=44 amount=-1 +kerning first=374 second=113 amount=-1 +kerning first=266 second=287 amount=-1 +kerning first=87 second=90 amount=-1 +kerning first=187 second=84 amount=-1 +kerning first=194 second=287 amount=-1 +kerning first=82 second=84 amount=-1 +kerning first=362 second=291 amount=-1 +kerning first=290 second=291 amount=-1 +kerning first=70 second=74 amount=-1 +kerning first=370 second=45 amount=-1 +kerning first=86 second=269 amount=-1 +kerning first=354 second=210 amount=-1 +kerning first=77 second=291 amount=-1 +kerning first=78 second=365 amount=-1 +kerning first=199 second=350 amount=-1 +kerning first=262 second=45 amount=-1 +kerning first=195 second=89 amount=-2 +kerning first=264 second=68 amount=-1 +kerning first=83 second=327 amount=-1 +kerning first=371 second=269 amount=-1 +kerning first=66 second=204 amount=-1 +kerning first=197 second=112 amount=-1 +kerning first=87 second=8249 amount=-1 +kerning first=311 second=279 amount=-1 +kerning first=344 second=286 amount=-1 +kerning first=192 second=8249 amount=-1 +kerning first=252 second=375 amount=-1 +kerning first=264 second=8249 amount=-1 +kerning first=350 second=221 amount=-1 +kerning first=267 second=108 amount=-1 +kerning first=72 second=228 amount=-1 +kerning first=195 second=338 amount=-1 +kerning first=268 second=332 amount=-1 +kerning first=296 second=251 amount=-1 +kerning first=245 second=108 amount=-1 +kerning first=260 second=251 amount=-1 +kerning first=196 second=332 amount=-1 +kerning first=65 second=219 amount=-1 +kerning first=281 second=108 amount=-1 +kerning first=45 second=381 amount=-1 +kerning first=310 second=375 amount=-1 +kerning first=86 second=226 amount=-1 +kerning first=221 second=212 amount=-1 +kerning first=263 second=226 amount=-1 +kerning first=1045 second=1098 amount=-1 +kerning first=1118 second=1113 amount=-1 +kerning first=75 second=367 amount=-1 +kerning first=108 second=119 amount=-1 +kerning first=321 second=119 amount=-1 +kerning first=356 second=109 amount=-1 +kerning first=194 second=115 amount=-1 +kerning first=368 second=230 amount=-1 +kerning first=249 second=119 amount=-1 +kerning first=374 second=115 amount=-1 +kerning first=78 second=363 amount=-1 +kerning first=221 second=233 amount=-1 +kerning first=263 second=97 amount=-1 +kerning first=327 second=363 amount=-1 +kerning first=337 second=314 amount=-1 +kerning first=199 second=211 amount=-1 +kerning first=8216 second=196 amount=-2 +kerning first=362 second=194 amount=-1 +kerning first=356 second=255 amount=-1 +kerning first=86 second=97 amount=-1 +kerning first=248 second=255 amount=-1 +kerning first=1046 second=1092 amount=-1 +kerning first=89 second=244 amount=-1 +kerning first=8220 second=227 amount=-1 +kerning first=121 second=275 amount=-1 +kerning first=354 second=101 amount=-1 +kerning first=290 second=194 amount=-1 +kerning first=8250 second=368 amount=-1 +kerning first=374 second=244 amount=-1 +kerning first=316 second=8221 amount=-1 +kerning first=197 second=121 amount=-1 +kerning first=262 second=296 amount=-1 +kerning first=346 second=325 amount=-1 +kerning first=1043 second=1095 amount=-1 +kerning first=334 second=46 amount=-1 +kerning first=370 second=46 amount=-1 +kerning first=66 second=83 amount=-1 +kerning first=264 second=69 amount=-1 +kerning first=74 second=197 amount=-1 +kerning first=194 second=266 amount=-1 +kerning first=89 second=266 amount=-1 +kerning first=374 second=266 amount=-1 +kerning first=256 second=336 amount=-1 +kerning first=375 second=339 amount=-1 +kerning first=205 second=225 amount=-1 +kerning first=264 second=70 amount=-1 +kerning first=266 second=266 amount=-1 +kerning first=226 second=253 amount=-1 +kerning first=230 second=318 amount=-1 +kerning first=39 second=1111 amount=1 +kerning first=194 second=334 amount=-1 +kerning first=317 second=86 amount=-1 +kerning first=8250 second=118 amount=-1 +kerning first=85 second=46 amount=-1 +kerning first=121 second=46 amount=-1 +kerning first=316 second=8217 amount=-1 +kerning first=119 second=230 amount=-1 +kerning first=371 second=8220 amount=-1 +kerning first=261 second=8221 amount=-1 +kerning first=381 second=375 amount=-1 +kerning first=316 second=45 amount=-1 +kerning first=374 second=333 amount=-1 +kerning first=232 second=311 amount=-1 +kerning first=193 second=370 amount=-1 +kerning first=221 second=213 amount=-1 +kerning first=262 second=8249 amount=-1 +kerning first=84 second=8250 amount=-1 +kerning first=232 second=289 amount=-1 +kerning first=268 second=289 amount=-1 +kerning first=364 second=260 amount=-1 +kerning first=310 second=210 amount=-1 +kerning first=112 second=318 amount=-1 +kerning first=209 second=259 amount=-1 +kerning first=196 second=289 amount=-1 +kerning first=376 second=289 amount=-1 +kerning first=66 second=270 amount=-1 +kerning first=269 second=255 amount=-1 +kerning first=287 second=122 amount=-1 +kerning first=253 second=318 amount=-1 +kerning first=220 second=260 amount=-1 +kerning first=304 second=289 amount=-1 +kerning first=8250 second=85 amount=-1 +kerning first=195 second=87 amount=-2 +kerning first=346 second=194 amount=-1 +kerning first=113 second=8221 amount=-1 +kerning first=346 second=207 amount=-1 +kerning first=354 second=288 amount=-1 +kerning first=256 second=218 amount=-1 +kerning first=107 second=277 amount=-1 +kerning first=77 second=369 amount=-1 +kerning first=350 second=219 amount=-1 +kerning first=315 second=122 amount=-1 +kerning first=371 second=248 amount=-1 +kerning first=354 second=81 amount=-1 +kerning first=356 second=277 amount=-1 +kerning first=119 second=231 amount=-1 +kerning first=66 second=291 amount=-1 +kerning first=199 second=210 amount=-1 +kerning first=217 second=346 amount=-1 +kerning first=253 second=242 amount=-1 +kerning first=194 second=365 amount=-1 +kerning first=350 second=89 amount=-1 +kerning first=302 second=365 amount=-1 +kerning first=350 second=80 amount=-1 +kerning first=121 second=351 amount=-1 +kerning first=258 second=284 amount=-1 +kerning first=284 second=256 amount=-1 +kerning first=256 second=217 amount=-1 +kerning first=251 second=121 amount=-1 +kerning first=356 second=256 amount=-2 +kerning first=375 second=101 amount=-1 +kerning first=119 second=259 amount=-1 +kerning first=264 second=298 amount=-1 +kerning first=73 second=224 amount=-1 +kerning first=254 second=375 amount=-1 +kerning first=193 second=369 amount=-1 +kerning first=199 second=206 amount=-1 +kerning first=193 second=112 amount=-1 +kerning first=88 second=369 amount=-1 +kerning first=8216 second=248 amount=-1 +kerning first=71 second=354 amount=-1 +kerning first=65 second=89 amount=-2 +kerning first=8218 second=219 amount=-1 +kerning first=256 second=86 amount=-2 +kerning first=284 second=354 amount=-1 +kerning first=45 second=382 amount=-1 +kerning first=82 second=333 amount=-1 +kerning first=344 second=281 amount=-1 +kerning first=376 second=214 amount=-1 +kerning first=118 second=333 amount=-1 +kerning first=352 second=362 amount=-1 +kerning first=256 second=354 amount=-2 +kerning first=366 second=382 amount=-1 +kerning first=8220 second=111 amount=-1 +kerning first=264 second=280 amount=-1 +kerning first=1059 second=1040 amount=-2 +kerning first=255 second=287 amount=-1 +kerning first=82 second=235 amount=-1 +kerning first=315 second=8221 amount=-1 +kerning first=356 second=103 amount=-1 +kerning first=84 second=333 amount=-1 +kerning first=118 second=235 amount=-1 +kerning first=1075 second=1083 amount=-1 +kerning first=231 second=316 amount=-1 +kerning first=284 second=103 amount=-1 +kerning first=375 second=316 amount=-1 +kerning first=268 second=214 amount=-1 +kerning first=350 second=220 amount=-1 +kerning first=339 second=316 amount=-1 +kerning first=196 second=214 amount=-1 +kerning first=267 second=316 amount=-1 +kerning first=71 second=103 amount=-1 +kerning first=8216 second=65 amount=-2 +kerning first=102 second=8221 amount=1 +kerning first=1036 second=1086 amount=-1 +kerning first=264 second=200 amount=-1 +kerning first=196 second=212 amount=-1 +kerning first=363 second=287 amount=-1 +kerning first=199 second=330 amount=-1 +kerning first=66 second=8221 amount=-1 +kerning first=87 second=8250 amount=-1 +kerning first=258 second=262 amount=-1 +kerning first=371 second=118 amount=-1 +kerning first=227 second=118 amount=-1 +kerning first=263 second=118 amount=-1 +kerning first=354 second=211 amount=-1 +kerning first=268 second=290 amount=-1 +kerning first=217 second=8249 amount=-1 +kerning first=313 second=366 amount=-1 +kerning first=325 second=8249 amount=-1 +kerning first=65 second=67 amount=-1 +kerning first=289 second=8249 amount=-1 +kerning first=66 second=313 amount=-1 +kerning first=84 second=230 amount=-1 +kerning first=376 second=290 amount=-1 +kerning first=240 second=44 amount=-1 +kerning first=338 second=287 amount=-1 +kerning first=374 second=267 amount=-1 +kerning first=107 second=234 amount=-1 +kerning first=66 second=193 amount=-1 +kerning first=199 second=79 amount=-1 +kerning first=240 second=120 amount=-1 +kerning first=86 second=118 amount=-1 +kerning first=317 second=85 amount=-1 +kerning first=260 second=350 amount=-1 +kerning first=255 second=244 amount=-1 +kerning first=83 second=209 amount=-1 +kerning first=368 second=350 amount=-1 +kerning first=118 second=257 amount=-1 +kerning first=356 second=234 amount=-1 +kerning first=89 second=267 amount=-1 +kerning first=376 second=192 amount=-2 +kerning first=8250 second=75 amount=-1 +kerning first=45 second=282 amount=-1 +kerning first=268 second=192 amount=-1 +kerning first=72 second=251 amount=-1 +kerning first=374 second=245 amount=-1 +kerning first=82 second=355 amount=-1 +kerning first=310 second=250 amount=-1 +kerning first=8249 second=374 amount=-1 +kerning first=83 second=78 amount=-1 +kerning first=350 second=198 amount=-1 +kerning first=221 second=332 amount=-1 +kerning first=89 second=245 amount=-1 +kerning first=76 second=221 amount=-1 +kerning first=197 second=361 amount=-1 +kerning first=84 second=378 amount=-1 +kerning first=75 second=338 amount=-1 +kerning first=212 second=256 amount=-1 +kerning first=1107 second=1113 amount=-1 +kerning first=381 second=102 amount=-1 +kerning first=76 second=90 amount=-1 +kerning first=377 second=361 amount=-1 +kerning first=86 second=227 amount=-1 +kerning first=255 second=113 amount=-1 +kerning first=71 second=256 amount=-1 +kerning first=351 second=291 amount=-1 +kerning first=315 second=291 amount=-1 +kerning first=1024 second=1090 amount=-1 +kerning first=97 second=119 amount=-1 +kerning first=279 second=291 amount=-1 +kerning first=310 second=119 amount=-1 +kerning first=346 second=119 amount=-1 +kerning first=207 second=291 amount=-1 +kerning first=254 second=314 amount=-1 +kerning first=8250 second=270 amount=-1 +kerning first=315 second=8217 amount=-1 +kerning first=85 second=198 amount=-1 +kerning first=354 second=233 amount=-1 +kerning first=84 second=113 amount=-1 +kerning first=334 second=198 amount=-1 +kerning first=344 second=79 amount=-1 +kerning first=370 second=198 amount=-1 +kerning first=264 second=67 amount=-1 +kerning first=262 second=198 amount=-1 +kerning first=251 second=291 amount=-1 +kerning first=77 second=250 amount=-1 +kerning first=8217 second=233 amount=-1 +kerning first=87 second=67 amount=-1 +kerning first=260 second=117 amount=-1 +kerning first=74 second=291 amount=-1 +kerning first=192 second=67 amount=-1 +kerning first=82 second=87 amount=-1 +kerning first=221 second=268 amount=-1 +kerning first=66 second=210 amount=-1 +kerning first=270 second=44 amount=-1 +kerning first=187 second=377 amount=-1 +kerning first=356 second=171 amount=-1 +kerning first=66 second=212 amount=-1 +kerning first=356 second=337 amount=-1 +kerning first=264 second=72 amount=-1 +kerning first=317 second=378 amount=-1 +kerning first=67 second=203 amount=-1 +kerning first=231 second=261 amount=-1 +kerning first=266 second=210 amount=-1 +kerning first=354 second=228 amount=-1 +kerning first=327 second=361 amount=-1 +kerning first=375 second=261 amount=-1 +kerning first=78 second=361 amount=-1 +kerning first=75 second=284 amount=-1 +kerning first=267 second=261 amount=-1 +kerning first=344 second=89 amount=-1 +kerning first=196 second=83 amount=-1 +kerning first=196 second=367 amount=-1 +kerning first=268 second=83 amount=-1 +kerning first=234 second=108 amount=-1 +kerning first=304 second=367 amount=-1 +kerning first=376 second=83 amount=-1 +kerning first=1098 second=1118 amount=-1 +kerning first=344 second=245 amount=-1 +kerning first=67 second=262 amount=-1 +kerning first=275 second=107 amount=-1 +kerning first=260 second=286 amount=-1 +kerning first=354 second=67 amount=-1 +kerning first=109 second=8249 amount=-1 +kerning first=260 second=262 amount=-1 +kerning first=73 second=8249 amount=-1 +kerning first=286 second=8249 amount=-1 +kerning first=8216 second=111 amount=-1 +kerning first=192 second=356 amount=-2 +kerning first=66 second=289 amount=-1 +kerning first=356 second=194 amount=-2 +kerning first=207 second=289 amount=-1 +kerning first=351 second=289 amount=-1 +kerning first=279 second=289 amount=-1 +kerning first=315 second=289 amount=-1 +kerning first=68 second=260 amount=-1 +kerning first=71 second=194 amount=-1 +kerning first=212 second=194 amount=-1 +kerning first=193 second=45 amount=-1 +kerning first=374 second=97 amount=-1 +kerning first=310 second=211 amount=-1 +kerning first=66 second=353 amount=-1 +kerning first=317 second=255 amount=-1 +kerning first=266 second=112 amount=-1 +kerning first=353 second=255 amount=-1 +kerning first=245 second=255 amount=-1 +kerning first=194 second=112 amount=-1 +kerning first=281 second=255 amount=-1 +kerning first=8250 second=119 amount=-1 +kerning first=89 second=97 amount=-1 +kerning first=87 second=243 amount=-1 +kerning first=302 second=97 amount=-1 +kerning first=121 second=113 amount=-1 +kerning first=351 second=353 amount=-1 +kerning first=8218 second=217 amount=-1 +kerning first=310 second=290 amount=-1 +kerning first=242 second=46 amount=-1 +kerning first=86 second=79 amount=-1 +kerning first=101 second=46 amount=-1 +kerning first=350 second=46 amount=-1 +kerning first=266 second=209 amount=-1 +kerning first=83 second=76 amount=-1 +kerning first=84 second=338 amount=-1 +kerning first=217 second=257 amount=-1 +kerning first=89 second=288 amount=-1 +kerning first=45 second=207 amount=-1 +kerning first=194 second=288 amount=-1 +kerning first=325 second=257 amount=-1 +kerning first=253 second=257 amount=-1 +kerning first=289 second=257 amount=-1 +kerning first=120 second=225 amount=-1 +kerning first=253 second=111 amount=-1 +kerning first=84 second=225 amount=-1 +kerning first=8216 second=279 amount=-1 +kerning first=107 second=273 amount=-1 +kerning first=118 second=101 amount=-1 +kerning first=1050 second=1105 amount=-1 +kerning first=199 second=193 amount=-1 +kerning first=194 second=8221 amount=-1 +kerning first=268 second=78 amount=-1 +kerning first=226 second=375 amount=-1 +kerning first=231 second=46 amount=-1 +kerning first=339 second=46 amount=-1 +kerning first=352 second=282 amount=-1 +kerning first=72 second=369 amount=-1 +kerning first=354 second=213 amount=-1 +kerning first=67 second=282 amount=-1 +kerning first=192 second=87 amount=-2 +kerning first=101 second=316 amount=-1 +kerning first=207 second=230 amount=-1 +kerning first=73 second=259 amount=-1 +kerning first=242 second=316 amount=-1 +kerning first=330 second=369 amount=-1 +kerning first=1061 second=1086 amount=-1 +kerning first=376 second=122 amount=-1 +kerning first=352 second=287 amount=-1 +kerning first=1061 second=1059 amount=-1 +kerning first=268 second=122 amount=-1 +kerning first=219 second=346 amount=-1 +kerning first=316 second=287 amount=-1 +kerning first=199 second=81 amount=-1 +kerning first=65 second=220 amount=-1 +kerning first=356 second=352 amount=-1 +kerning first=76 second=356 amount=-1 +kerning first=224 second=8217 amount=-1 +kerning first=45 second=75 amount=-1 +kerning first=84 second=74 amount=-1 +kerning first=231 second=105 amount=-1 +kerning first=102 second=254 amount=1 +kerning first=354 second=351 amount=-1 +kerning first=221 second=223 amount=-1 +kerning first=8217 second=244 amount=-1 +kerning first=267 second=105 amount=-1 +kerning first=68 second=196 amount=-1 +kerning first=65 second=332 amount=-1 +kerning first=266 second=75 amount=-1 +kerning first=90 second=289 amount=-1 +kerning first=67 second=352 amount=-1 +kerning first=253 second=277 amount=-1 +kerning first=381 second=253 amount=-1 +kerning first=102 second=104 amount=1 +kerning first=267 second=225 amount=-1 +kerning first=192 second=199 amount=-1 +kerning first=256 second=85 amount=-1 +kerning first=221 second=347 amount=-1 +kerning first=356 second=214 amount=-1 +kerning first=250 second=318 amount=-1 +kerning first=264 second=199 amount=-1 +kerning first=45 second=119 amount=-1 +kerning first=8217 second=97 amount=-1 +kerning first=197 second=71 amount=-1 +kerning first=66 second=67 amount=-1 +kerning first=310 second=251 amount=-1 +kerning first=86 second=229 amount=-1 +kerning first=84 second=382 amount=-1 +kerning first=83 second=120 amount=-1 +kerning first=187 second=68 amount=-1 +kerning first=371 second=8221 amount=-1 +kerning first=112 second=316 amount=-1 +kerning first=354 second=332 amount=-1 +kerning first=367 second=103 amount=-1 +kerning first=317 second=220 amount=-1 +kerning first=354 second=90 amount=-1 +kerning first=260 second=365 amount=-1 +kerning first=75 second=249 amount=-1 +kerning first=122 second=171 amount=-1 +kerning first=352 second=203 amount=-1 +kerning first=187 second=103 amount=-1 +kerning first=67 second=291 amount=-1 +kerning first=296 second=365 amount=-1 +kerning first=82 second=103 amount=-1 +kerning first=118 second=103 amount=-1 +kerning first=227 second=119 amount=-1 +kerning first=83 second=330 amount=-1 +kerning first=197 second=262 amount=-1 +kerning first=279 second=314 amount=-1 +kerning first=243 second=314 amount=-1 +kerning first=371 second=119 amount=-1 +kerning first=279 second=118 amount=-1 +kerning first=187 second=313 amount=-1 +kerning first=263 second=119 amount=-1 +kerning first=315 second=118 amount=-1 +kerning first=76 second=380 amount=-1 +kerning first=102 second=314 amount=1 +kerning first=66 second=118 amount=-1 +kerning first=66 second=314 amount=-1 +kerning first=289 second=380 amount=-1 +kerning first=253 second=380 amount=-1 +kerning first=187 second=362 amount=-1 +kerning first=195 second=217 amount=-1 +kerning first=88 second=216 amount=-1 +kerning first=194 second=366 amount=-1 +kerning first=8222 second=380 amount=-1 +kerning first=351 second=118 amount=-1 +kerning first=193 second=216 amount=-1 +kerning first=354 second=248 amount=-1 +kerning first=315 second=8220 amount=-1 +kerning first=75 second=363 amount=-1 +kerning first=8220 second=287 amount=-1 +kerning first=255 second=267 amount=-1 +kerning first=258 second=364 amount=-1 +kerning first=220 second=226 amount=-1 +kerning first=119 second=101 amount=-1 +kerning first=66 second=8220 amount=-1 +kerning first=350 second=202 amount=-1 +kerning first=87 second=199 amount=-1 +kerning first=196 second=118 amount=-1 +kerning first=249 second=8221 amount=-1 +kerning first=350 second=85 amount=-1 +kerning first=310 second=79 amount=-1 +kerning first=210 second=193 amount=-1 +kerning first=302 second=361 amount=-1 +kerning first=376 second=118 amount=-1 +kerning first=65 second=336 amount=-1 +kerning first=68 second=44 amount=-1 +kerning first=344 second=338 amount=-1 +kerning first=232 second=118 amount=-1 +kerning first=356 second=377 amount=-1 +kerning first=65 second=85 amount=-1 +kerning first=221 second=83 amount=-1 +kerning first=45 second=78 amount=-1 +kerning first=1059 second=1060 amount=-1 +kerning first=311 second=8249 amount=-1 +kerning first=194 second=249 amount=-1 +kerning first=350 second=315 amount=-1 +kerning first=207 second=250 amount=-1 +kerning first=87 second=257 amount=-1 +kerning first=354 second=193 amount=-2 +kerning first=353 second=103 amount=-1 +kerning first=281 second=103 amount=-1 +kerning first=317 second=103 amount=-1 +kerning first=8218 second=374 amount=-2 +kerning first=8218 second=380 amount=-1 +kerning first=98 second=318 amount=-1 +kerning first=376 second=210 amount=-1 +kerning first=118 second=337 amount=-1 +kerning first=65 second=250 amount=-1 +kerning first=45 second=221 amount=-1 +kerning first=275 second=318 amount=-1 +kerning first=82 second=337 amount=-1 +kerning first=66 second=250 amount=-1 +kerning first=196 second=210 amount=-1 +kerning first=218 second=65 amount=-1 +kerning first=74 second=256 amount=-1 +kerning first=268 second=210 amount=-1 +kerning first=290 second=65 amount=-1 +kerning first=199 second=286 amount=-1 +kerning first=362 second=65 amount=-1 +kerning first=256 second=118 amount=-1 +kerning first=264 second=204 amount=-1 +kerning first=252 second=253 amount=-1 +kerning first=364 second=378 amount=-1 +kerning first=260 second=221 amount=-2 +kerning first=366 second=227 amount=-1 +kerning first=281 second=44 amount=-1 +kerning first=220 second=378 amount=-1 +kerning first=330 second=227 amount=-1 +kerning first=354 second=171 amount=-1 +kerning first=266 second=73 amount=-1 +kerning first=354 second=268 amount=-1 +kerning first=45 second=280 amount=-1 +kerning first=352 second=366 amount=-1 +kerning first=119 second=269 amount=-1 +kerning first=317 second=356 amount=-1 +kerning first=192 second=219 amount=-1 +kerning first=72 second=226 amount=-1 +kerning first=262 second=212 amount=-1 +kerning first=262 second=66 amount=-1 +kerning first=375 second=242 amount=-1 +kerning first=367 second=108 amount=-1 +kerning first=86 second=328 amount=-1 +kerning first=214 second=44 amount=-1 +kerning first=118 second=108 amount=-1 +kerning first=8216 second=291 amount=-1 +kerning first=82 second=108 amount=-1 +kerning first=280 second=103 amount=-1 +kerning first=223 second=108 amount=-1 +kerning first=262 second=317 amount=-1 +kerning first=303 second=242 amount=-1 +kerning first=83 second=310 amount=-1 +kerning first=258 second=252 amount=-1 +kerning first=291 second=45 amount=-1 +kerning first=8220 second=248 amount=-1 +kerning first=354 second=122 amount=-1 +kerning first=87 second=224 amount=-1 +kerning first=1061 second=1105 amount=-1 +kerning first=8250 second=375 amount=-1 +kerning first=206 second=261 amount=-1 +kerning first=267 second=237 amount=-1 +kerning first=103 second=115 amount=-1 +kerning first=209 second=225 amount=-1 +kerning first=8218 second=368 amount=-1 +kerning first=303 second=275 amount=-1 +kerning first=376 second=353 amount=-1 +kerning first=66 second=202 amount=-1 +kerning first=194 second=119 amount=-1 +kerning first=1058 second=1103 amount=-1 +kerning first=77 second=45 amount=-1 +kerning first=187 second=194 amount=-1 +kerning first=87 second=111 amount=-1 +kerning first=218 second=45 amount=-1 +kerning first=307 second=287 amount=-1 +kerning first=83 second=325 amount=-1 +kerning first=89 second=121 amount=-1 +kerning first=119 second=281 amount=-1 +kerning first=1050 second=1086 amount=-1 +kerning first=268 second=291 amount=-1 +kerning first=290 second=45 amount=-1 +kerning first=326 second=45 amount=-1 +kerning first=362 second=45 amount=-1 +kerning first=317 second=354 amount=-1 +kerning first=350 second=374 amount=-1 +kerning first=311 second=243 amount=-1 +kerning first=205 second=97 amount=-1 +kerning first=233 second=287 amount=-1 +kerning first=8216 second=100 amount=-1 +kerning first=269 second=287 amount=-1 +kerning first=217 second=193 amount=-1 +kerning first=197 second=287 amount=-1 +kerning first=196 second=353 amount=-1 +kerning first=88 second=45 amount=-1 +kerning first=108 second=8217 amount=-1 +kerning first=84 second=283 amount=-1 +kerning first=1061 second=1108 amount=-1 +kerning first=291 second=228 amount=-1 +kerning first=278 second=287 amount=-1 +kerning first=377 second=287 amount=-1 +kerning first=249 second=8217 amount=-1 +kerning first=321 second=8217 amount=-1 +kerning first=199 second=76 amount=-1 +kerning first=313 second=368 amount=-1 +kerning first=199 second=327 amount=-1 +kerning first=311 second=111 amount=-1 +kerning first=374 second=264 amount=-1 +kerning first=266 second=264 amount=-1 +kerning first=194 second=264 amount=-1 +kerning first=89 second=264 amount=-1 +kerning first=221 second=248 amount=-1 +kerning first=248 second=253 amount=-1 +kerning first=89 second=269 amount=-1 +kerning first=356 second=253 amount=-1 +kerning first=197 second=364 amount=-1 +kerning first=314 second=118 amount=-1 +kerning first=374 second=269 amount=-1 +kerning first=256 second=334 amount=-1 +kerning first=67 second=207 amount=-1 +kerning first=266 second=346 amount=-1 +kerning first=75 second=288 amount=-1 +kerning first=8216 second=232 amount=-1 +kerning first=218 second=289 amount=-1 +kerning first=77 second=289 amount=-1 +kerning first=89 second=346 amount=-1 +kerning first=79 second=46 amount=-1 +kerning first=362 second=289 amount=-1 +kerning first=86 second=99 amount=-1 +kerning first=290 second=289 amount=-1 +kerning first=220 second=46 amount=-1 +kerning first=296 second=369 amount=-1 +kerning first=352 second=207 amount=-1 +kerning first=260 second=369 amount=-1 +kerning first=364 second=46 amount=-1 +kerning first=366 second=192 amount=-1 +kerning first=102 second=98 amount=1 +kerning first=66 second=98 amount=-1 +kerning first=350 second=70 amount=-1 +kerning first=371 second=99 amount=-1 +kerning first=362 second=230 amount=-1 +kerning first=8220 second=267 amount=-1 +kerning first=76 second=87 amount=-1 +kerning first=199 second=332 amount=-1 +kerning first=82 second=352 amount=-1 +kerning first=77 second=230 amount=-1 +kerning first=260 second=81 amount=-1 +kerning first=218 second=230 amount=-1 +kerning first=251 second=375 amount=-1 +kerning first=374 second=346 amount=-1 +kerning first=221 second=122 amount=-1 +kerning first=119 second=233 amount=-1 +kerning first=65 second=217 amount=-1 +kerning first=86 second=284 amount=-1 +kerning first=221 second=351 amount=-1 +kerning first=83 second=102 amount=-1 +kerning first=334 second=256 amount=-1 +kerning first=221 second=210 amount=-1 +kerning first=66 second=171 amount=-1 +kerning first=324 second=119 amount=-1 +kerning first=350 second=217 amount=-1 +kerning first=302 second=117 amount=-1 +kerning first=262 second=256 amount=-1 +kerning first=194 second=117 amount=-1 +kerning first=45 second=379 amount=-1 +kerning first=85 second=256 amount=-1 +kerning first=232 second=314 amount=-1 +kerning first=1046 second=1095 amount=-1 +kerning first=87 second=263 amount=-1 +kerning first=381 second=121 amount=-1 +kerning first=84 second=245 amount=-1 +kerning first=326 second=8220 amount=-1 +kerning first=205 second=363 amount=-1 +kerning first=262 second=82 amount=-1 +kerning first=113 second=8220 amount=-1 +kerning first=266 second=302 amount=-1 +kerning first=258 second=221 amount=-2 +kerning first=296 second=228 amount=-1 +kerning first=368 second=228 amount=-1 +kerning first=376 second=347 amount=-1 +kerning first=119 second=228 amount=-1 +kerning first=375 second=281 amount=-1 +kerning first=196 second=347 amount=-1 +kerning first=1040 second=1059 amount=-1 +kerning first=97 second=8221 amount=-1 +kerning first=195 second=85 amount=-1 +kerning first=187 second=200 amount=-1 +kerning first=193 second=361 amount=-1 +kerning first=67 second=288 amount=-1 +kerning first=260 second=266 amount=-1 +kerning first=8216 second=335 amount=-1 +kerning first=289 second=316 amount=-1 +kerning first=229 second=8220 amount=-1 +kerning first=218 second=197 amount=-1 +kerning first=371 second=246 amount=-1 +kerning first=354 second=83 amount=-1 +kerning first=356 second=90 amount=-1 +kerning first=346 second=171 amount=-1 +kerning first=362 second=197 amount=-1 +kerning first=379 second=365 amount=-1 +kerning first=310 second=171 amount=-1 +kerning first=352 second=325 amount=-1 +kerning first=86 second=246 amount=-1 +kerning first=290 second=197 amount=-1 +kerning first=382 second=171 amount=-1 +kerning first=258 second=87 amount=-2 +kerning first=1027 second=1051 amount=-1 +kerning first=234 second=103 amount=-1 +kerning first=8250 second=350 amount=-1 +kerning first=1043 second=1077 amount=-1 +kerning first=67 second=71 amount=-1 +kerning first=303 second=281 amount=-1 +kerning first=198 second=103 amount=-1 +kerning first=364 second=103 amount=-1 +kerning first=220 second=103 amount=-1 +kerning first=256 second=103 amount=-1 +kerning first=86 second=266 amount=-1 +kerning first=84 second=263 amount=-1 +kerning first=256 second=364 amount=-1 +kerning first=66 second=65 amount=-1 +kerning first=119 second=333 amount=-1 +kerning first=187 second=370 amount=-1 +kerning first=284 second=196 amount=-1 +kerning first=246 second=120 amount=-1 +kerning first=260 second=334 amount=-1 +kerning first=262 second=214 amount=-1 +kerning first=266 second=284 amount=-1 +kerning first=232 second=255 amount=-1 +kerning first=84 second=199 amount=-1 +kerning first=83 second=207 amount=-1 +kerning first=286 second=89 amount=-1 +kerning first=374 second=284 amount=-1 +kerning first=87 second=382 amount=-1 +kerning first=45 second=203 amount=-1 +kerning first=367 second=121 amount=-1 +kerning first=205 second=361 amount=-1 +kerning first=121 second=45 amount=-1 +kerning first=344 second=362 amount=-1 +kerning first=259 second=121 amount=-1 +kerning first=264 second=382 amount=-1 +kerning first=223 second=121 amount=-1 +kerning first=310 second=264 amount=-1 +kerning first=187 second=121 amount=-1 +kerning first=89 second=284 amount=-1 +kerning first=303 second=339 amount=-1 +kerning first=224 second=8221 amount=-1 +kerning first=66 second=102 amount=-1 +kerning first=260 second=8221 amount=-1 +kerning first=98 second=316 amount=-1 +kerning first=257 second=118 amount=-1 +kerning first=303 second=235 amount=-1 +kerning first=216 second=44 amount=-1 +kerning first=375 second=235 amount=-1 +kerning first=365 second=118 amount=-1 +kerning first=119 second=248 amount=-1 +kerning first=90 second=378 amount=-1 +kerning first=253 second=283 amount=-1 +kerning first=82 second=218 amount=-1 +kerning first=76 second=85 amount=-1 +kerning first=87 second=281 amount=-1 +kerning first=221 second=118 amount=-1 +kerning first=45 second=69 amount=-1 +kerning first=284 second=86 amount=-1 +kerning first=196 second=250 amount=-1 +kerning first=8216 second=289 amount=-1 +kerning first=262 second=315 amount=-1 +kerning first=264 second=323 amount=-1 +kerning first=45 second=346 amount=-1 +kerning first=71 second=86 amount=-1 +kerning first=192 second=217 amount=-1 +kerning first=67 second=75 amount=-1 +kerning first=304 second=250 amount=-1 +kerning first=86 second=83 amount=-1 +kerning first=217 second=224 amount=-1 +kerning first=356 second=198 amount=-2 +kerning first=289 second=224 amount=-1 +kerning first=327 second=227 amount=-1 +kerning first=85 second=192 amount=-1 +kerning first=284 second=198 amount=-1 +kerning first=291 second=227 amount=-1 +kerning first=255 second=227 amount=-1 +kerning first=192 second=89 amount=-2 +kerning first=236 second=8249 amount=-1 +kerning first=78 second=227 amount=-1 +kerning first=72 second=363 amount=-1 +kerning first=86 second=244 amount=-1 +kerning first=381 second=291 amount=-1 +kerning first=199 second=325 amount=-1 +kerning first=325 second=97 amount=-1 +kerning first=371 second=244 amount=-1 +kerning first=317 second=90 amount=-1 +kerning first=87 second=121 amount=-1 +kerning first=201 second=291 amount=-1 +kerning first=86 second=187 amount=-1 +kerning first=193 second=210 amount=-1 +kerning first=375 second=378 amount=-1 +kerning first=117 second=287 amount=-1 +kerning first=248 second=44 amount=-1 +kerning first=290 second=256 amount=-1 +kerning first=212 second=44 amount=-1 +kerning first=199 second=268 amount=-1 +kerning first=88 second=210 amount=-1 +kerning first=362 second=256 amount=-1 +kerning first=121 second=337 amount=-1 +kerning first=284 second=44 amount=-1 +kerning first=71 second=44 amount=-1 +kerning first=197 second=366 amount=-1 +kerning first=212 second=198 amount=-1 +kerning first=71 second=198 amount=-1 +kerning first=218 second=256 amount=-1 +kerning first=310 second=286 amount=-1 +kerning first=89 second=326 amount=-1 +kerning first=315 second=379 amount=-1 +kerning first=366 second=287 amount=-1 +kerning first=330 second=287 amount=-1 +kerning first=266 second=205 amount=-1 +kerning first=258 second=287 amount=-1 +kerning first=376 second=228 amount=-1 +kerning first=260 second=8220 amount=-1 +kerning first=368 second=260 amount=-1 +kerning first=194 second=368 amount=-1 +kerning first=374 second=326 amount=-1 +kerning first=304 second=228 amount=-1 +kerning first=194 second=262 amount=-1 +kerning first=86 second=350 amount=-1 +kerning first=283 second=107 amount=-1 +kerning first=374 second=262 amount=-1 +kerning first=248 second=108 amount=-1 +kerning first=266 second=262 amount=-1 +kerning first=344 second=8249 amount=-1 +kerning first=217 second=261 amount=-1 +kerning first=380 second=8249 amount=-1 +kerning first=255 second=269 amount=-1 +kerning first=325 second=261 amount=-1 +kerning first=289 second=261 amount=-1 +kerning first=8220 second=97 amount=-1 +kerning first=253 second=261 amount=-1 +kerning first=327 second=229 amount=-1 +kerning first=187 second=310 amount=-1 +kerning first=291 second=229 amount=-1 +kerning first=87 second=338 amount=-1 +kerning first=1038 second=1113 amount=-1 +kerning first=220 second=257 amount=-1 +kerning first=1036 second=1059 amount=-1 +kerning first=78 second=229 amount=-1 +kerning first=194 second=346 amount=-1 +kerning first=75 second=251 amount=-1 +kerning first=66 second=45 amount=-1 +kerning first=255 second=229 amount=-1 +kerning first=219 second=229 amount=-1 +kerning first=84 second=243 amount=-1 +kerning first=103 second=97 amount=-1 +kerning first=260 second=332 amount=-1 +kerning first=1070 second=1038 amount=-1 +kerning first=199 second=290 amount=-1 +kerning first=121 second=271 amount=-1 +kerning first=8216 second=333 amount=-1 +kerning first=102 second=45 amount=-1 +kerning first=195 second=356 amount=-2 +kerning first=87 second=261 amount=-1 +kerning first=75 second=211 amount=-1 +kerning first=118 second=275 amount=-1 +kerning first=313 second=381 amount=-1 +kerning first=266 second=304 amount=-1 +kerning first=82 second=275 amount=-1 +kerning first=339 second=255 amount=-1 +kerning first=82 second=240 amount=-1 +kerning first=231 second=255 amount=-1 +kerning first=119 second=226 amount=-1 +kerning first=8218 second=378 amount=-1 +kerning first=267 second=255 amount=-1 +kerning first=195 second=255 amount=-1 +kerning first=374 second=227 amount=-1 +kerning first=241 second=119 amount=-1 +kerning first=296 second=226 amount=-1 +kerning first=277 second=119 amount=-1 +kerning first=90 second=255 amount=-1 +kerning first=302 second=227 amount=-1 +kerning first=345 second=44 amount=-1 +kerning first=368 second=226 amount=-1 +kerning first=374 second=259 amount=-1 +kerning first=313 second=119 amount=-1 +kerning first=89 second=227 amount=-1 +kerning first=330 second=225 amount=-1 +kerning first=366 second=225 amount=-1 +kerning first=310 second=363 amount=-1 +kerning first=233 second=289 amount=-1 +kerning first=1113 second=1091 amount=-1 +kerning first=103 second=230 amount=-1 +kerning first=84 second=241 amount=-1 +kerning first=364 second=257 amount=-1 +kerning first=334 second=192 amount=-1 +kerning first=370 second=192 amount=-1 +kerning first=193 second=289 amount=-1 +kerning first=213 second=193 amount=-1 +kerning first=192 second=338 amount=-1 +kerning first=193 second=8220 amount=-1 +kerning first=264 second=338 amount=-1 +kerning first=362 second=122 amount=-1 +kerning first=245 second=44 amount=-1 +kerning first=218 second=122 amount=-1 +kerning first=84 second=375 amount=-1 +kerning first=86 second=288 amount=-1 +kerning first=65 second=354 amount=-2 +kerning first=68 second=46 amount=-1 +kerning first=260 second=213 amount=-1 +kerning first=195 second=361 amount=-1 +kerning first=221 second=230 amount=-1 +kerning first=344 second=364 amount=-1 +kerning first=379 second=369 amount=-1 +kerning first=245 second=46 amount=-1 +kerning first=281 second=46 amount=-1 +kerning first=266 second=282 amount=-1 +kerning first=66 second=197 amount=-1 +kerning first=118 second=318 amount=-1 +kerning first=199 second=83 amount=-1 +kerning first=197 second=346 amount=-1 +kerning first=45 second=201 amount=-1 +kerning first=240 second=375 amount=-1 +kerning first=286 second=87 amount=-1 +kerning first=99 second=375 amount=-1 +kerning first=87 second=259 amount=-1 +kerning first=76 second=217 amount=-1 +kerning first=375 second=277 amount=-1 +kerning first=209 second=103 amount=-1 +kerning first=89 second=328 amount=-1 +kerning first=354 second=243 amount=-1 +kerning first=303 second=277 amount=-1 +kerning first=376 second=351 amount=-1 +kerning first=352 second=75 amount=-1 +kerning first=74 second=194 amount=-1 +kerning first=196 second=351 amount=-1 +kerning first=97 second=8217 amount=-1 +kerning first=78 second=117 amount=-1 +kerning first=199 second=103 amount=-1 +kerning first=69 second=287 amount=-1 +kerning first=204 second=289 amount=-1 +kerning first=82 second=253 amount=-1 +kerning first=1100 second=1118 amount=-1 +kerning first=66 second=80 amount=-1 +kerning first=187 second=253 amount=-1 +kerning first=72 second=171 amount=-1 +kerning first=268 second=65 amount=-1 +kerning first=223 second=253 amount=-1 +kerning first=327 second=117 amount=-1 +kerning first=212 second=260 amount=-1 +kerning first=367 second=253 amount=-1 +kerning first=356 second=121 amount=-1 +kerning first=71 second=260 amount=-1 +kerning first=195 second=334 amount=-1 +kerning first=374 second=328 amount=-1 +kerning first=86 second=231 amount=-1 +kerning first=216 second=197 amount=-1 +kerning first=284 second=260 amount=-1 +kerning first=344 second=318 amount=-1 +kerning first=83 second=270 amount=-1 +kerning first=356 second=260 amount=-2 +kerning first=234 second=121 amount=-1 +kerning first=356 second=196 amount=-2 +kerning first=71 second=196 amount=-1 +kerning first=250 second=316 amount=-1 +kerning first=212 second=196 amount=-1 +kerning first=351 second=351 amount=-1 +kerning first=281 second=118 amount=-1 +kerning first=221 second=228 amount=-1 +kerning first=218 second=44 amount=-1 +kerning first=89 second=99 amount=-1 +kerning first=119 second=171 amount=-1 +kerning first=83 second=171 amount=-1 +kerning first=374 second=99 amount=-1 +kerning first=310 second=213 amount=-1 +kerning first=344 second=221 amount=-1 +kerning first=67 second=302 amount=-1 +kerning first=82 second=220 amount=-1 +kerning first=187 second=82 amount=-1 +kerning first=66 second=351 amount=-1 +kerning first=1027 second=1093 amount=-1 +kerning first=199 second=270 amount=-1 +kerning first=258 second=71 amount=-1 +kerning first=374 second=8250 amount=-1 +kerning first=206 second=224 amount=-1 +kerning first=339 second=103 amount=-1 +kerning first=119 second=246 amount=-1 +kerning first=375 second=103 amount=-1 +kerning first=267 second=103 amount=-1 +kerning first=84 second=8249 amount=-1 +kerning first=195 second=103 amount=-1 +kerning first=325 second=224 amount=-1 +kerning first=231 second=103 amount=-1 +kerning first=90 second=103 amount=-1 +kerning first=281 second=253 amount=-1 +kerning first=245 second=253 amount=-1 +kerning first=187 second=220 amount=-1 +kerning first=353 second=253 amount=-1 +kerning first=195 second=354 amount=-2 +kerning first=317 second=253 amount=-1 +kerning first=45 second=344 amount=-1 +kerning first=260 second=171 amount=-1 +kerning first=197 second=117 amount=-1 +kerning first=368 second=171 amount=-1 +kerning first=234 second=255 amount=-1 +kerning first=253 second=281 amount=-1 +kerning first=87 second=283 amount=-1 +kerning first=354 second=118 amount=-1 +kerning first=72 second=365 amount=-1 +kerning first=377 second=117 amount=-1 +kerning first=45 second=253 amount=-1 +kerning first=266 second=45 amount=-1 +kerning first=262 second=313 amount=-1 +kerning first=86 second=264 amount=-1 +kerning first=283 second=287 amount=-1 +kerning first=75 second=79 amount=-1 +kerning first=70 second=287 amount=-1 +kerning first=262 second=216 amount=-1 +kerning first=106 second=287 amount=-1 +kerning first=105 second=118 amount=-1 +kerning first=206 second=257 amount=-1 +kerning first=192 second=85 amount=-1 +kerning first=87 second=74 amount=-1 +kerning first=268 second=274 amount=-1 +kerning first=118 second=273 amount=-1 +kerning first=120 second=8249 amount=-1 +kerning first=374 second=46 amount=-1 +kerning first=332 second=193 amount=-1 +kerning first=74 second=192 amount=-1 +kerning first=74 second=193 amount=-1 +kerning first=375 second=279 amount=-1 +kerning first=268 second=327 amount=-1 +kerning first=344 second=113 amount=-1 +kerning first=103 second=227 amount=-1 +kerning first=66 second=78 amount=-1 +kerning first=260 second=268 amount=-1 +kerning first=313 second=8217 amount=-1 +kerning first=1027 second=1113 amount=-1 +kerning first=121 second=333 amount=-1 +kerning first=370 second=291 amount=-1 +kerning first=298 second=291 amount=-1 +kerning first=262 second=291 amount=-1 +kerning first=121 second=291 amount=-1 +kerning first=85 second=291 amount=-1 +kerning first=75 second=361 amount=-1 +kerning first=8220 second=196 amount=-2 +kerning first=67 second=73 amount=-1 +kerning first=232 second=121 amount=-1 +kerning first=8249 second=86 amount=-1 +kerning first=344 second=199 amount=-1 +kerning first=84 second=67 amount=-1 +kerning first=187 second=198 amount=-1 +kerning first=374 second=210 amount=-1 +kerning first=258 second=366 amount=-1 +kerning first=379 second=367 amount=-1 +kerning first=89 second=277 amount=-1 +kerning first=223 second=44 amount=-1 +kerning first=352 second=73 amount=-1 +kerning first=45 second=366 amount=-1 +kerning first=192 second=253 amount=-1 +kerning first=85 second=194 amount=-1 +kerning first=122 second=112 amount=-1 +kerning first=89 second=119 amount=-1 +kerning first=262 second=194 amount=-1 +kerning first=350 second=105 amount=-1 +kerning first=230 second=119 amount=-1 +kerning first=356 second=240 amount=-1 +kerning first=121 second=335 amount=-1 +kerning first=374 second=119 amount=-1 +kerning first=8217 second=99 amount=-1 +kerning first=1045 second=1038 amount=-1 +kerning first=8250 second=282 amount=-1 +kerning first=317 second=374 amount=-1 +kerning first=281 second=107 amount=-1 +kerning first=193 second=353 amount=-1 +kerning first=187 second=66 amount=-1 +kerning first=295 second=45 amount=-1 +kerning first=246 second=314 amount=-1 +kerning first=296 second=367 amount=-1 +kerning first=88 second=212 amount=-1 +kerning first=260 second=367 amount=-1 +kerning first=99 second=289 amount=-1 +kerning first=193 second=212 amount=-1 +kerning first=86 second=101 amount=-1 +kerning first=67 second=205 amount=-1 +kerning first=8216 second=234 amount=-1 +kerning first=75 second=286 amount=-1 +kerning first=231 second=257 amount=-1 +kerning first=346 second=310 amount=-1 +kerning first=371 second=101 amount=-1 +kerning first=375 second=257 amount=-1 +kerning first=267 second=257 amount=-1 +kerning first=352 second=205 amount=-1 +kerning first=258 second=115 amount=-1 +kerning first=89 second=229 amount=-1 +kerning first=374 second=229 amount=-1 +kerning first=118 second=339 amount=-1 +kerning first=1036 second=1108 amount=-1 +kerning first=302 second=229 amount=-1 +kerning first=82 second=339 amount=-1 +kerning first=344 second=214 amount=-1 +kerning first=255 second=97 amount=-1 +kerning first=219 second=97 amount=-1 +kerning first=196 second=45 amount=-1 +kerning first=327 second=97 amount=-1 +kerning first=107 second=240 amount=-1 +kerning first=291 second=97 amount=-1 +kerning first=86 second=211 amount=-1 +kerning first=267 second=318 amount=-1 +kerning first=350 second=356 amount=-1 +kerning first=218 second=287 amount=-1 +kerning first=260 second=290 amount=-1 +kerning first=253 second=316 amount=-1 +kerning first=260 second=83 amount=-1 +kerning first=370 second=194 amount=-1 +kerning first=268 second=45 amount=-1 +kerning first=268 second=197 amount=-1 +kerning first=304 second=45 amount=-1 +kerning first=256 second=255 amount=-1 +kerning first=115 second=255 amount=-1 +kerning first=368 second=83 amount=-1 +kerning first=65 second=356 amount=-2 +kerning first=376 second=197 amount=-2 +kerning first=87 second=336 amount=-1 +kerning first=264 second=380 amount=-1 +kerning first=192 second=336 amount=-1 +kerning first=332 second=44 amount=-1 +kerning first=264 second=336 amount=-1 +kerning first=67 second=280 amount=-1 +kerning first=65 second=334 amount=-1 +kerning first=352 second=120 amount=-1 +kerning first=234 second=253 amount=-1 +kerning first=310 second=81 amount=-1 +kerning first=270 second=46 amount=-1 +kerning first=80 second=65 amount=-1 +kerning first=221 second=65 amount=-2 +kerning first=171 second=84 amount=-1 +kerning first=231 second=289 amount=-1 +kerning first=234 second=46 amount=-1 +kerning first=344 second=243 amount=-1 +kerning first=75 second=264 amount=-1 +kerning first=1054 second=1059 amount=-1 +kerning first=87 second=380 amount=-1 +kerning first=84 second=111 amount=-1 +kerning first=82 second=121 amount=-1 +kerning first=310 second=288 amount=-1 +kerning first=333 second=318 amount=-1 +kerning first=369 second=318 amount=-1 +kerning first=187 second=317 amount=-1 +kerning first=66 second=122 amount=-1 +kerning first=8216 second=256 amount=-2 +kerning first=325 second=259 amount=-1 +kerning first=345 second=46 amount=-1 +kerning first=289 second=259 amount=-1 +kerning first=253 second=259 amount=-1 +kerning first=376 second=230 amount=-1 +kerning first=199 second=69 amount=-1 +kerning first=304 second=230 amount=-1 +kerning first=371 second=8217 amount=-1 +kerning first=337 second=375 amount=-1 +kerning first=187 second=381 amount=-1 +kerning first=88 second=375 amount=-1 +kerning first=217 second=259 amount=-1 +kerning first=193 second=375 amount=-1 +kerning first=229 second=375 amount=-1 +kerning first=67 second=346 amount=-1 +kerning first=266 second=207 amount=-1 +kerning first=350 second=323 amount=-1 +kerning first=374 second=381 amount=-1 +kerning first=234 second=311 amount=-1 +kerning first=323 second=259 amount=-1 +kerning first=287 second=259 amount=-1 +kerning first=115 second=253 amount=-1 +kerning first=325 second=363 amount=-1 +kerning first=256 second=253 amount=-1 +kerning first=74 second=259 amount=-1 +kerning first=267 second=224 amount=-1 +kerning first=344 second=346 amount=-1 +kerning first=354 second=334 amount=-1 +kerning first=321 second=122 amount=-1 +kerning first=375 second=224 amount=-1 +kerning first=279 second=375 amount=-1 +kerning first=315 second=375 amount=-1 +kerning first=351 second=375 amount=-1 +kerning first=72 second=230 amount=-1 +kerning first=231 second=224 amount=-1 +kerning first=8217 second=261 amount=-1 +kerning first=8220 second=279 amount=-1 +kerning first=192 second=8220 amount=-1 +kerning first=102 second=316 amount=1 +kerning first=66 second=316 amount=-1 +kerning first=268 second=207 amount=-1 +kerning first=66 second=76 amount=-1 +kerning first=264 second=206 amount=-1 +kerning first=335 second=121 amount=-1 +kerning first=263 second=121 amount=-1 +kerning first=346 second=82 amount=-1 +kerning first=227 second=121 amount=-1 +kerning first=376 second=335 amount=-1 +kerning first=352 second=368 amount=-1 +kerning first=86 second=121 amount=-1 +kerning first=121 second=171 amount=-1 +kerning first=85 second=171 amount=-1 +kerning first=118 second=271 amount=-1 +kerning first=374 second=231 amount=-1 +kerning first=362 second=287 amount=-1 +kerning first=262 second=171 amount=-1 +kerning first=376 second=212 amount=-1 +kerning first=370 second=171 amount=-1 +kerning first=334 second=194 amount=-1 +kerning first=290 second=287 amount=-1 +kerning first=75 second=252 amount=-1 +kerning first=109 second=8217 amount=-1 +kerning first=86 second=213 amount=-1 +kerning first=243 second=375 amount=-1 +kerning first=8249 second=89 amount=-1 +kerning first=66 second=237 amount=-1 +kerning first=250 second=8217 amount=-1 +kerning first=66 second=375 amount=-1 +kerning first=266 second=310 amount=-1 +kerning first=377 second=171 amount=-1 +kerning first=204 second=229 amount=-1 +kerning first=350 second=237 amount=-1 +kerning first=353 second=351 amount=-1 +kerning first=8218 second=382 amount=-1 +kerning first=354 second=333 amount=-1 +kerning first=187 second=330 amount=-1 +kerning first=187 second=120 amount=-1 +kerning first=377 second=249 amount=-1 +kerning first=223 second=120 amount=-1 +kerning first=374 second=379 amount=-1 +kerning first=195 second=214 amount=-1 +kerning first=368 second=103 amount=-1 +kerning first=260 second=103 amount=-1 +kerning first=219 second=230 amount=-1 +kerning first=296 second=103 amount=-1 +kerning first=207 second=365 amount=-1 +kerning first=83 second=103 amount=-1 +kerning first=197 second=249 amount=-1 +kerning first=233 second=318 amount=-1 +kerning first=316 second=118 amount=-1 +kerning first=352 second=118 amount=-1 +kerning first=66 second=365 amount=-1 +kerning first=321 second=362 amount=-1 +kerning first=89 second=231 amount=-1 +kerning first=101 second=44 amount=-1 +kerning first=310 second=332 amount=-1 +kerning first=204 second=117 amount=-1 +kerning first=83 second=313 amount=-1 +kerning first=279 second=316 amount=-1 +kerning first=243 second=316 amount=-1 +kerning first=354 second=216 amount=-1 +kerning first=121 second=378 amount=-1 +kerning first=85 second=378 amount=-1 +kerning first=66 second=86 amount=-1 +kerning first=256 second=264 amount=-1 +kerning first=260 second=264 amount=-1 +kerning first=381 second=250 amount=-1 +kerning first=316 second=8220 amount=-1 +kerning first=82 second=281 amount=-1 +kerning first=187 second=202 amount=-1 +kerning first=118 second=281 amount=-1 +kerning first=347 second=375 amount=-1 +kerning first=1061 second=1098 amount=-1 +kerning first=1025 second=1098 amount=-1 +kerning first=370 second=378 amount=-1 +kerning first=363 second=8221 amount=-1 +kerning first=344 second=218 amount=-1 +kerning first=262 second=378 amount=-1 +kerning first=266 second=70 amount=-1 +kerning first=235 second=314 amount=-1 +kerning first=67 second=69 amount=-1 +kerning first=86 second=331 amount=-1 +kerning first=344 second=267 amount=-1 +kerning first=315 second=86 amount=-1 +kerning first=171 second=86 amount=-1 +kerning first=89 second=379 amount=-1 +kerning first=192 second=354 amount=-2 +kerning first=284 second=192 amount=-1 +kerning first=356 second=192 amount=-2 +kerning first=298 second=250 amount=-1 +kerning first=71 second=192 amount=-1 +kerning first=253 second=224 amount=-1 +kerning first=212 second=192 amount=-1 +kerning first=268 second=296 amount=-1 +kerning first=375 second=244 amount=-1 +kerning first=350 second=303 amount=-1 +kerning first=87 second=245 amount=-1 +kerning first=187 second=90 amount=-1 +kerning first=199 second=274 amount=-1 +kerning first=381 second=378 amount=-1 +kerning first=268 second=256 amount=-1 +kerning first=120 second=227 amount=-1 +kerning first=84 second=227 amount=-1 +kerning first=376 second=256 amount=-2 +kerning first=193 second=366 amount=-1 +kerning first=84 second=103 amount=-1 +kerning first=313 second=291 amount=-1 +kerning first=90 second=102 amount=-1 +kerning first=277 second=291 amount=-1 +kerning first=84 second=336 amount=-1 +kerning first=87 second=226 amount=-1 +kerning first=205 second=291 amount=-1 +kerning first=351 second=112 amount=-1 +kerning first=221 second=216 amount=-1 +kerning first=303 second=263 amount=-1 +kerning first=88 second=268 amount=-1 +kerning first=375 second=263 amount=-1 +kerning first=382 second=112 amount=-1 +kerning first=304 second=365 amount=-1 +kerning first=249 second=255 amount=-1 +kerning first=110 second=8249 amount=-1 +kerning first=196 second=365 amount=-1 +kerning first=74 second=8249 amount=-1 +kerning first=255 second=240 amount=-1 +kerning first=287 second=8249 amount=-1 +kerning first=192 second=84 amount=-2 +kerning first=323 second=8249 amount=-1 +kerning first=193 second=268 amount=-1 +kerning first=121 second=108 amount=-1 +kerning first=117 second=318 amount=-1 +kerning first=1025 second=1059 amount=-1 +kerning first=362 second=228 amount=-1 +kerning first=65 second=284 amount=-1 +kerning first=290 second=198 amount=-1 +kerning first=350 second=205 amount=-1 +kerning first=218 second=198 amount=-1 +kerning first=210 second=65 amount=-1 +kerning first=218 second=228 amount=-1 +kerning first=268 second=286 amount=-1 +kerning first=77 second=228 amount=-1 +kerning first=362 second=198 amount=-1 +kerning first=262 second=260 amount=-1 +kerning first=354 second=65 amount=-2 +kerning first=330 second=367 amount=-1 +kerning first=8250 second=194 amount=-1 +kerning first=1043 second=1078 amount=-1 +kerning first=258 second=367 amount=-1 +kerning first=85 second=260 amount=-1 +kerning first=74 second=229 amount=-1 +kerning first=107 second=339 amount=-1 +kerning first=8250 second=82 amount=-1 +kerning first=287 second=229 amount=-1 +kerning first=370 second=260 amount=-1 +kerning first=85 second=350 amount=-1 +kerning first=334 second=260 amount=-1 +kerning first=1040 second=1090 amount=-1 +kerning first=196 second=286 amount=-1 +kerning first=107 second=271 amount=-1 +kerning first=84 second=115 amount=-1 +kerning first=290 second=356 amount=-1 +kerning first=261 second=8217 amount=-1 +kerning first=118 second=242 amount=-1 +kerning first=1050 second=1058 amount=-1 +kerning first=205 second=261 amount=-1 +kerning first=369 second=8217 amount=-1 +kerning first=82 second=242 amount=-1 +kerning first=311 second=45 amount=-1 +kerning first=323 second=229 amount=-1 +kerning first=356 second=339 amount=-1 +kerning first=8217 second=231 amount=-1 +kerning first=199 second=304 amount=-1 +kerning first=119 second=339 amount=-1 +kerning first=356 second=211 amount=-1 +kerning first=242 second=44 amount=-1 +kerning first=8217 second=100 amount=-1 +kerning first=379 second=255 amount=-1 +kerning first=199 second=203 amount=-1 +kerning first=307 second=255 amount=-1 +kerning first=235 second=255 amount=-1 +kerning first=220 second=224 amount=-1 +kerning first=89 second=110 amount=-1 +kerning first=374 second=110 amount=-1 +kerning first=366 second=97 amount=-1 +kerning first=356 second=290 amount=-1 +kerning first=330 second=97 amount=-1 +kerning first=350 second=44 amount=-1 +kerning first=68 second=193 amount=-1 +kerning first=268 second=76 amount=-1 +kerning first=232 second=46 amount=-1 +kerning first=74 second=289 amount=-1 +kerning first=84 second=257 amount=-1 +kerning first=119 second=242 amount=-1 +kerning first=356 second=241 amount=-1 +kerning first=323 second=289 amount=-1 +kerning first=45 second=209 amount=-1 +kerning first=313 second=370 amount=-1 +kerning first=354 second=225 amount=-1 +kerning first=66 second=287 amount=-1 +kerning first=365 second=255 amount=-1 +kerning first=197 second=368 amount=-1 +kerning first=351 second=287 amount=-1 +kerning first=260 second=352 amount=-1 +kerning first=315 second=287 amount=-1 +kerning first=218 second=261 amount=-1 +kerning first=107 second=281 amount=-1 +kerning first=207 second=287 amount=-1 +kerning first=119 second=283 amount=-1 +kerning first=235 second=118 amount=-1 +kerning first=70 second=346 amount=-1 +kerning first=287 second=347 amount=-1 +kerning first=368 second=352 amount=-1 +kerning first=80 second=46 amount=-1 +kerning first=313 second=380 amount=-1 +kerning first=1050 second=1057 amount=-1 +kerning first=196 second=86 amount=-2 +kerning first=344 second=87 amount=-1 +kerning first=84 second=266 amount=-1 +kerning first=90 second=253 amount=-1 +kerning first=262 second=201 amount=-1 +kerning first=356 second=333 amount=-1 +kerning first=266 second=350 amount=-1 +kerning first=204 second=259 amount=-1 +kerning first=368 second=74 amount=-1 +kerning first=374 second=350 amount=-1 +kerning first=281 second=311 amount=-1 +kerning first=82 second=81 amount=-1 +kerning first=376 second=375 amount=-1 +kerning first=78 second=230 amount=-1 +kerning first=89 second=350 amount=-1 +kerning first=291 second=230 amount=-1 +kerning first=196 second=375 amount=-1 +kerning first=194 second=350 amount=-1 +kerning first=232 second=375 amount=-1 +kerning first=255 second=230 amount=-1 +kerning first=66 second=207 amount=-1 +kerning first=201 second=289 amount=-1 +kerning first=235 second=104 amount=-1 +kerning first=381 second=289 amount=-1 +kerning first=193 second=219 amount=-1 +kerning first=86 second=332 amount=-1 +kerning first=1038 second=1075 amount=-1 +kerning first=197 second=288 amount=-1 +kerning first=259 second=253 amount=-1 +kerning first=71 second=65 amount=-1 +kerning first=1024 second=1098 amount=-1 +kerning first=376 second=326 amount=-1 +kerning first=381 second=251 amount=-1 +kerning first=368 second=259 amount=-1 +kerning first=218 second=291 amount=-1 +kerning first=313 second=221 amount=-1 +kerning first=1059 second=1033 amount=-1 +kerning first=97 second=121 amount=-1 +kerning first=295 second=8217 amount=-1 +kerning first=255 second=231 amount=-1 +kerning first=381 second=171 amount=-1 +kerning first=217 second=196 amount=-1 +kerning first=207 second=228 amount=-1 +kerning first=266 second=270 amount=-1 +kerning first=374 second=100 amount=-1 +kerning first=316 second=119 amount=-1 +kerning first=256 second=351 amount=-1 +kerning first=119 second=314 amount=-1 +kerning first=1059 second=1082 amount=-1 +kerning first=317 second=381 amount=-1 +kerning first=269 second=318 amount=-1 +kerning first=256 second=214 amount=-1 +kerning first=8250 second=204 amount=-1 +kerning first=352 second=119 amount=-1 +kerning first=197 second=336 amount=-1 +kerning first=66 second=228 amount=-1 +kerning first=65 second=338 amount=-1 +kerning first=313 second=379 amount=-1 +kerning first=221 second=44 amount=-1 +kerning first=45 second=90 amount=-1 +kerning first=1059 second=1113 amount=-1 +kerning first=75 second=213 amount=-1 +kerning first=195 second=253 amount=-1 +kerning first=289 second=382 amount=-1 +kerning first=119 second=234 amount=-1 +kerning first=88 second=8249 amount=-1 +kerning first=267 second=253 amount=-1 +kerning first=231 second=253 amount=-1 +kerning first=258 second=249 amount=-1 +kerning first=193 second=8249 amount=-1 +kerning first=339 second=253 amount=-1 +kerning first=65 second=363 amount=-1 +kerning first=206 second=363 amount=-1 +kerning first=354 second=246 amount=-1 +kerning first=1027 second=1083 amount=-1 +kerning first=8220 second=240 amount=-1 +kerning first=379 second=103 amount=-1 +kerning first=199 second=344 amount=-1 +kerning first=307 second=103 amount=-1 +kerning first=235 second=103 amount=-1 +kerning first=89 second=100 amount=-1 +kerning first=82 second=232 amount=-1 +kerning first=192 second=284 amount=-1 +kerning first=118 second=232 amount=-1 +kerning first=197 second=118 amount=-1 +kerning first=346 second=203 amount=-1 +kerning first=233 second=118 amount=-1 +kerning first=87 second=284 amount=-1 +kerning first=269 second=118 amount=-1 +kerning first=45 second=377 amount=-1 +kerning first=71 second=89 amount=-1 +kerning first=77 second=365 amount=-1 +kerning first=264 second=284 amount=-1 +kerning first=346 second=362 amount=-1 +kerning first=87 second=235 amount=-1 +kerning first=88 second=117 amount=-1 +kerning first=8216 second=269 amount=-1 +kerning first=76 second=382 amount=-1 +kerning first=253 second=382 amount=-1 +kerning first=305 second=118 amount=-1 +kerning first=254 second=316 amount=-1 +kerning first=217 second=382 amount=-1 +kerning first=353 second=120 amount=-1 +kerning first=289 second=44 amount=-1 +kerning first=87 second=197 amount=-2 +kerning first=253 second=44 amount=-1 +kerning first=187 second=86 amount=-1 +kerning first=260 second=255 amount=-1 +kerning first=88 second=67 amount=-1 +kerning first=112 second=44 amount=-1 +kerning first=379 second=252 amount=-1 +kerning first=84 second=267 amount=-1 +kerning first=217 second=44 amount=-1 +kerning first=269 second=97 amount=-1 +kerning first=336 second=197 amount=-1 +kerning first=346 second=313 amount=-1 +kerning first=73 second=227 amount=-1 +kerning first=1059 second=1081 amount=-1 +kerning first=220 second=193 amount=-1 +kerning first=266 second=79 amount=-1 +kerning first=45 second=118 amount=-1 +kerning first=79 second=193 amount=-1 +kerning first=374 second=79 amount=-1 +kerning first=364 second=193 amount=-1 +kerning first=196 second=85 amount=-1 +kerning first=371 second=273 amount=-1 +kerning first=199 second=65 amount=-1 +kerning first=262 second=338 amount=-1 +kerning first=74 second=260 amount=-1 +kerning first=117 second=118 amount=-1 +kerning first=245 second=120 amount=-1 +kerning first=107 second=232 amount=-1 +kerning first=89 second=79 amount=-1 +kerning first=258 second=118 amount=-1 +kerning first=194 second=79 amount=-1 +kerning first=323 second=250 amount=-1 +kerning first=253 second=245 amount=-1 +kerning first=356 second=378 amount=-1 +kerning first=8220 second=275 amount=-1 +kerning first=267 second=303 amount=-1 +kerning first=263 second=46 amount=-1 +kerning first=279 second=44 amount=-1 +kerning first=231 second=303 amount=-1 +kerning first=194 second=221 amount=-2 +kerning first=258 second=199 amount=-1 +kerning first=1070 second=1059 amount=-1 +kerning first=374 second=83 amount=-1 +kerning first=374 second=291 amount=-1 +kerning first=310 second=361 amount=-1 +kerning first=338 second=291 amount=-1 +kerning first=107 second=242 amount=-1 +kerning first=119 second=113 amount=-1 +kerning first=266 second=291 amount=-1 +kerning first=230 second=291 amount=-1 +kerning first=194 second=291 amount=-1 +kerning first=89 second=291 amount=-1 +kerning first=356 second=242 amount=-1 +kerning first=268 second=216 amount=-1 +kerning first=66 second=326 amount=-1 +kerning first=196 second=216 amount=-1 +kerning first=193 second=67 amount=-1 +kerning first=346 second=204 amount=-1 +kerning first=376 second=216 amount=-1 +kerning first=87 second=187 amount=-1 +kerning first=264 second=196 amount=-1 +kerning first=8216 second=259 amount=-1 +kerning first=221 second=335 amount=-1 +kerning first=8217 second=101 amount=-1 +kerning first=346 second=323 amount=-1 +kerning first=67 second=287 amount=-1 +kerning first=362 second=378 amount=-1 +kerning first=346 second=73 amount=-1 +kerning first=1038 second=1095 amount=-1 +kerning first=196 second=374 amount=-2 +kerning first=364 second=44 amount=-1 +kerning first=366 second=346 amount=-1 +kerning first=85 second=289 amount=-1 +kerning first=121 second=289 amount=-1 +kerning first=255 second=279 amount=-1 +kerning first=75 second=212 amount=-1 +kerning first=262 second=289 amount=-1 +kerning first=298 second=289 amount=-1 +kerning first=1059 second=1051 amount=-1 +kerning first=209 second=224 amount=-1 +kerning first=370 second=289 amount=-1 +kerning first=187 second=195 amount=-1 +kerning first=8250 second=203 amount=-1 +kerning first=287 second=108 amount=-1 +kerning first=251 second=108 amount=-1 +kerning first=66 second=200 amount=-1 +kerning first=8250 second=83 amount=-1 +kerning first=8250 second=198 amount=-1 +kerning first=121 second=229 amount=-1 +kerning first=76 second=354 amount=-1 +kerning first=370 second=229 amount=-1 +kerning first=268 second=325 amount=-1 +kerning first=298 second=229 amount=-1 +kerning first=264 second=197 amount=-1 +kerning first=232 second=287 amount=-1 +kerning first=87 second=171 amount=-1 +kerning first=268 second=287 amount=-1 +kerning first=350 second=206 amount=-1 +kerning first=119 second=353 amount=-1 +kerning first=196 second=287 amount=-1 +kerning first=85 second=229 amount=-1 +kerning first=1036 second=1089 amount=-1 +kerning first=260 second=353 amount=-1 +kerning first=311 second=275 amount=-1 +kerning first=83 second=304 amount=-1 +kerning first=193 second=356 amount=-2 +kerning first=1059 second=1054 amount=-1 +kerning first=82 second=211 amount=-1 +kerning first=376 second=287 amount=-1 +kerning first=86 second=248 amount=-1 +kerning first=304 second=287 amount=-1 +kerning first=268 second=81 amount=-1 +kerning first=192 second=45 amount=-1 +kerning first=1059 second=1103 amount=-1 +kerning first=258 second=368 amount=-1 +kerning first=264 second=45 amount=-1 +kerning first=213 second=194 amount=-1 +kerning first=87 second=45 amount=-1 +kerning first=206 second=45 amount=-1 +kerning first=121 second=339 amount=-1 +kerning first=221 second=353 amount=-1 +kerning first=219 second=350 amount=-1 +kerning first=120 second=97 amount=-1 +kerning first=314 second=45 amount=-1 +kerning first=119 second=243 amount=-1 +kerning first=65 second=45 amount=-1 +kerning first=71 second=289 amount=-1 +kerning first=216 second=194 amount=-1 +kerning first=255 second=318 amount=-1 +kerning first=8220 second=231 amount=-1 +kerning first=291 second=318 amount=-1 +kerning first=196 second=356 amount=-2 +kerning first=350 second=45 amount=-1 +kerning first=363 second=318 amount=-1 +kerning first=284 second=289 amount=-1 +kerning first=376 second=255 amount=-1 +kerning first=354 second=46 amount=-1 +kerning first=346 second=370 amount=-1 +kerning first=196 second=255 amount=-1 +kerning first=199 second=112 amount=-1 +kerning first=75 second=332 amount=-1 +kerning first=262 second=80 amount=-1 +kerning first=303 second=101 amount=-1 +kerning first=8250 second=323 amount=-1 +kerning first=67 second=209 amount=-1 +kerning first=284 second=193 amount=-1 +kerning first=212 second=193 amount=-1 +kerning first=298 second=251 amount=-1 +kerning first=356 second=193 amount=-2 +kerning first=8216 second=198 amount=-2 +kerning first=220 second=44 amount=-1 +kerning first=71 second=193 amount=-1 +kerning first=194 second=8220 amount=-1 +kerning first=84 second=226 amount=-1 +kerning first=79 second=44 amount=-1 +kerning first=258 second=79 amount=-1 +kerning first=82 second=233 amount=-1 +kerning first=1046 second=1105 amount=-1 +kerning first=120 second=226 amount=-1 +kerning first=197 second=119 amount=-1 +kerning first=193 second=338 amount=-1 +kerning first=305 second=119 amount=-1 +kerning first=8250 second=313 amount=-1 +kerning first=45 second=84 amount=-1 +kerning first=233 second=119 amount=-1 +kerning first=269 second=119 amount=-1 +kerning first=303 second=111 amount=-1 +kerning first=210 second=46 amount=-1 +kerning first=221 second=225 amount=-1 +kerning first=118 second=314 amount=-1 +kerning first=249 second=314 amount=-1 +kerning first=375 second=111 amount=-1 +kerning first=352 second=209 amount=-1 +kerning first=346 second=274 amount=-1 +kerning first=246 second=46 amount=-1 +kerning first=374 second=8249 amount=-1 +kerning first=376 second=334 amount=-1 +kerning first=365 second=375 amount=-1 +kerning first=196 second=334 amount=-1 +kerning first=268 second=334 amount=-1 +kerning first=253 second=115 amount=-1 +kerning first=89 second=101 amount=-1 +kerning first=197 second=87 amount=-2 +kerning first=187 second=201 amount=-1 +kerning first=221 second=375 amount=-1 +kerning first=257 second=375 amount=-1 +kerning first=195 second=291 amount=-1 +kerning first=356 second=122 amount=-1 +kerning first=376 second=277 amount=-1 +kerning first=356 second=81 amount=-1 +kerning first=374 second=101 amount=-1 +kerning first=1070 second=1033 amount=-1 +kerning first=258 second=218 amount=-1 +kerning first=350 second=196 amount=-1 +kerning first=196 second=8220 amount=-1 +kerning first=311 second=235 amount=-1 +kerning first=45 second=205 amount=-1 +kerning first=286 second=193 amount=-1 +kerning first=337 second=316 amount=-1 +kerning first=84 second=248 amount=-1 +kerning first=232 second=104 amount=-1 +kerning first=71 second=171 amount=-1 +kerning first=281 second=119 amount=-1 +kerning first=8250 second=73 amount=-1 +kerning first=356 second=281 amount=-1 +kerning first=310 second=252 amount=-1 +kerning first=321 second=121 amount=-1 +kerning first=217 second=197 amount=-1 +kerning first=249 second=121 amount=-1 +kerning first=87 second=333 amount=-1 +kerning first=108 second=121 amount=-1 +kerning first=66 second=278 amount=-1 +kerning first=255 second=100 amount=-1 +kerning first=375 second=351 amount=-1 +kerning first=352 second=310 amount=-1 +kerning first=258 second=336 amount=-1 +kerning first=379 second=122 amount=-1 +kerning first=218 second=229 amount=-1 +kerning first=195 second=351 amount=-1 +kerning first=67 second=310 amount=-1 +kerning first=199 second=122 amount=-1 +kerning first=362 second=229 amount=-1 +kerning first=330 second=230 amount=-1 +kerning first=366 second=230 amount=-1 +kerning first=65 second=253 amount=-1 +kerning first=228 second=8217 amount=-1 +kerning first=195 second=366 amount=-1 +kerning first=266 second=72 amount=-1 +kerning first=84 second=198 amount=-2 +kerning first=87 second=115 amount=-1 +kerning first=101 second=253 amount=-1 +kerning first=242 second=253 amount=-1 +kerning first=1092 second=1076 amount=-1 +kerning first=332 second=65 amount=-1 +kerning first=295 second=171 amount=-1 +kerning first=368 second=65 amount=-1 +kerning first=266 second=200 amount=-1 +kerning first=351 second=347 amount=-1 +kerning first=368 second=289 amount=-1 +kerning first=331 second=171 amount=-1 +kerning first=72 second=45 amount=-1 +kerning first=197 second=199 amount=-1 +kerning first=72 second=361 amount=-1 +kerning first=187 second=280 amount=-1 +kerning first=364 second=382 amount=-1 +kerning first=354 second=103 amount=-1 +kerning first=66 second=347 amount=-1 +kerning first=311 second=333 amount=-1 +kerning first=218 second=194 amount=-1 +kerning first=282 second=103 amount=-1 +kerning first=224 second=255 amount=-1 +kerning first=1038 second=1101 amount=-1 +kerning first=356 second=8250 amount=-1 +kerning first=266 second=82 amount=-1 +kerning first=313 second=8221 amount=-1 +kerning first=220 second=256 amount=-1 +kerning first=105 second=103 amount=-1 +kerning first=241 second=8221 amount=-1 +kerning first=69 second=103 amount=-1 +kerning first=77 second=117 amount=-1 +kerning first=258 second=346 amount=-1 +kerning first=46 second=171 amount=-1 +kerning first=118 second=171 amount=-1 +kerning first=82 second=171 amount=-1 +kerning first=66 second=104 amount=-1 +kerning first=76 second=364 amount=-1 +kerning first=86 second=283 amount=-1 +kerning first=354 second=266 amount=-1 +kerning first=354 second=264 amount=-1 +kerning first=8250 second=370 amount=-1 +kerning first=269 second=121 amount=-1 +kerning first=321 second=380 amount=-1 +kerning first=315 second=366 amount=-1 +kerning first=83 second=305 amount=-1 +kerning first=88 second=211 amount=-1 +kerning first=344 second=217 amount=-1 +kerning first=67 second=70 amount=-1 +kerning first=266 second=69 amount=-1 +kerning first=115 second=120 amount=-1 +kerning first=262 second=298 amount=-1 +kerning first=1059 second=1104 amount=-1 +kerning first=374 second=331 amount=-1 +kerning first=315 second=85 amount=-1 +kerning first=283 second=118 amount=-1 +kerning first=286 second=354 amount=-1 +kerning first=279 second=104 amount=-1 +kerning first=197 second=218 amount=-1 +kerning first=244 second=318 amount=-1 +kerning first=371 second=283 amount=-1 +kerning first=106 second=118 amount=-1 +kerning first=66 second=85 amount=-1 +kerning first=89 second=331 amount=-1 +kerning first=204 second=250 amount=-1 +kerning first=8217 second=235 amount=-1 +kerning first=197 second=221 amount=-2 +kerning first=80 second=287 amount=-1 +kerning first=252 second=119 amount=-1 +kerning first=197 second=79 amount=-1 +kerning first=279 second=107 amount=-1 +kerning first=352 second=78 amount=-1 +kerning first=66 second=216 amount=-1 +kerning first=66 second=366 amount=-1 +kerning first=73 second=226 amount=-1 +kerning first=286 second=84 amount=-1 +kerning first=194 second=347 amount=-1 +kerning first=99 second=307 amount=-1 +kerning first=221 second=287 amount=-1 +kerning first=1091 second=1083 amount=-1 +kerning first=221 second=113 amount=-1 +kerning first=197 second=115 amount=-1 +kerning first=1027 second=1108 amount=-1 +kerning first=187 second=378 amount=-1 +kerning first=118 second=378 amount=-1 +kerning first=67 second=210 amount=-1 +kerning first=263 second=291 amount=-1 +kerning first=325 second=45 amount=-1 +kerning first=256 second=284 amount=-1 +kerning first=67 second=350 amount=-1 +kerning first=86 second=291 amount=-1 +kerning first=86 second=261 amount=-1 +kerning first=217 second=45 amount=-1 +kerning first=8216 second=260 amount=-2 +kerning first=344 second=337 amount=-1 +kerning first=289 second=45 amount=-1 +kerning first=256 second=262 amount=-1 +kerning first=263 second=261 amount=-1 +kerning first=66 second=268 amount=-1 +kerning first=210 second=256 amount=-1 +kerning first=260 second=112 amount=-1 +kerning first=266 second=203 amount=-1 +kerning first=374 second=279 amount=-1 +kerning first=83 second=112 amount=-1 +kerning first=354 second=286 amount=-1 +kerning first=66 second=344 amount=-1 +kerning first=253 second=263 amount=-1 +kerning first=240 second=108 amount=-1 +kerning first=187 second=302 amount=-1 +kerning first=253 second=244 amount=-1 +kerning first=99 second=228 amount=-1 +kerning first=8222 second=122 amount=-1 +kerning first=66 second=325 amount=-1 +kerning first=204 second=228 amount=-1 +kerning first=254 second=108 amount=-1 +kerning first=323 second=251 amount=-1 +kerning first=374 second=212 amount=-1 +kerning first=369 second=253 amount=-1 +kerning first=45 second=66 amount=-1 +kerning first=89 second=212 amount=-1 +kerning first=8250 second=379 amount=-1 +kerning first=194 second=212 amount=-1 +kerning first=266 second=212 amount=-1 +kerning first=171 second=356 amount=-1 +kerning first=1036 second=1098 amount=-1 +kerning first=350 second=364 amount=-1 +kerning first=119 second=122 amount=-1 +kerning first=241 second=8220 amount=-1 +kerning first=117 second=119 amount=-1 +kerning first=120 second=367 amount=-1 +kerning first=278 second=291 amount=-1 +kerning first=379 second=171 amount=-1 +kerning first=258 second=119 amount=-1 +kerning first=356 second=233 amount=-1 +kerning first=347 second=115 amount=-1 +kerning first=107 second=233 amount=-1 +kerning first=192 second=363 amount=-1 +kerning first=90 second=45 amount=-1 +kerning first=195 second=45 amount=-1 +kerning first=262 second=211 amount=-1 +kerning first=375 second=45 amount=-1 +kerning first=253 second=275 amount=-1 +kerning first=354 second=353 amount=-1 +kerning first=315 second=356 amount=-1 +kerning first=115 second=103 amount=-1 +kerning first=66 second=356 amount=-1 +kerning first=346 second=304 amount=-1 +kerning first=221 second=255 amount=-1 +kerning first=257 second=255 amount=-1 +kerning first=193 second=291 amount=-1 +kerning first=199 second=296 amount=-1 +kerning first=8220 second=100 amount=-1 +kerning first=86 second=194 amount=-2 +kerning first=1050 second=1092 amount=-1 +kerning first=311 second=244 amount=-1 +kerning first=84 second=324 amount=-1 +kerning first=84 second=377 amount=-1 +kerning first=67 second=200 amount=-1 +kerning first=8250 second=74 amount=-1 +kerning first=192 second=364 amount=-1 +kerning first=235 second=46 amount=-1 +kerning first=361 second=8217 amount=-1 +kerning first=83 second=362 amount=-1 +kerning first=374 second=228 amount=-1 +kerning first=260 second=362 amount=-1 +kerning first=268 second=212 amount=-1 +kerning first=199 second=264 amount=-1 +kerning first=8217 second=279 amount=-1 +kerning first=354 second=352 amount=-1 +kerning first=193 second=347 amount=-1 +kerning first=350 second=197 amount=-1 +kerning first=362 second=259 amount=-1 +kerning first=268 second=278 amount=-1 +kerning first=82 second=71 amount=-1 +kerning first=352 second=200 amount=-1 +kerning first=112 second=253 amount=-1 +kerning first=376 second=225 amount=-1 +kerning first=76 second=253 amount=-1 +kerning first=76 second=8217 amount=-1 +kerning first=304 second=225 amount=-1 +kerning first=290 second=86 amount=-1 +kerning first=66 second=334 amount=-1 +kerning first=346 second=282 amount=-1 +kerning first=82 second=311 amount=-1 +kerning first=213 second=65 amount=-1 +kerning first=374 second=213 amount=-1 +kerning first=354 second=375 amount=-1 +kerning first=266 second=213 amount=-1 +kerning first=82 second=289 amount=-1 +kerning first=194 second=213 amount=-1 +kerning first=246 second=375 amount=-1 +kerning first=269 second=230 amount=-1 +kerning first=262 second=103 amount=-1 +kerning first=1059 second=1117 amount=-1 +kerning first=103 second=318 amount=-1 +kerning first=65 second=351 amount=-1 +kerning first=118 second=289 amount=-1 +kerning first=260 second=118 amount=-1 +kerning first=105 second=375 amount=-1 +kerning first=84 second=346 amount=-1 +kerning first=367 second=289 amount=-1 +kerning first=86 second=380 amount=-1 +kerning first=77 second=259 amount=-1 +kerning first=75 second=336 amount=-1 +kerning first=368 second=122 amount=-1 +kerning first=1042 second=1063 amount=-1 +kerning first=221 second=277 amount=-1 +kerning first=321 second=370 amount=-1 +kerning first=234 second=314 amount=-1 +kerning first=121 second=242 amount=-1 +kerning first=1059 second=1072 amount=-1 +kerning first=344 second=248 amount=-1 +kerning first=8222 second=382 amount=-1 +kerning first=207 second=117 amount=-1 +kerning first=268 second=344 amount=-1 +kerning first=217 second=122 amount=-1 +kerning first=66 second=117 amount=-1 +kerning first=1059 second=1102 amount=-1 +kerning first=66 second=259 amount=-1 +kerning first=253 second=351 amount=-1 +kerning first=289 second=351 amount=-1 +kerning first=368 second=44 amount=-1 +kerning first=262 second=68 amount=-1 +kerning first=323 second=171 amount=-1 +kerning first=260 second=121 amount=-1 +kerning first=195 second=284 amount=-1 +kerning first=224 second=121 amount=-1 +kerning first=220 second=196 amount=-1 +kerning first=1045 second=1059 amount=-1 +kerning first=374 second=288 amount=-1 +kerning first=256 second=369 amount=-1 +kerning first=118 second=224 amount=-1 +kerning first=266 second=288 amount=-1 +kerning first=86 second=379 amount=-1 +kerning first=79 second=196 amount=-1 +kerning first=89 second=213 amount=-1 +kerning first=354 second=277 amount=-1 +kerning first=364 second=196 amount=-1 +kerning first=8217 second=229 amount=-1 +kerning first=210 second=197 amount=-1 +kerning first=204 second=103 amount=-1 +kerning first=45 second=327 amount=-1 +kerning first=378 second=171 amount=-1 +kerning first=260 second=252 amount=-1 +kerning first=8216 second=261 amount=-1 +kerning first=90 second=382 amount=-1 +kerning first=261 second=106 amount=1 +kerning first=193 second=86 amount=-2 +kerning first=375 second=382 amount=-1 +kerning first=8217 second=259 amount=-1 +kerning first=376 second=246 amount=-1 +kerning first=87 second=266 amount=-1 +kerning first=282 second=287 amount=-1 +kerning first=252 second=8221 amount=-1 +kerning first=365 second=103 amount=-1 +kerning first=240 second=316 amount=-1 +kerning first=264 second=266 amount=-1 +kerning first=344 second=368 amount=-1 +kerning first=105 second=287 amount=-1 +kerning first=192 second=266 amount=-1 +kerning first=99 second=316 amount=-1 +kerning first=221 second=103 amount=-1 +kerning first=80 second=103 amount=-1 +kerning first=344 second=336 amount=-1 +kerning first=82 second=214 amount=-1 +kerning first=262 second=330 amount=-1 +kerning first=356 second=71 amount=-1 +kerning first=187 second=352 amount=-1 +kerning first=344 second=118 amount=-1 +kerning first=195 second=262 amount=-1 +kerning first=121 second=232 amount=-1 +kerning first=82 second=290 amount=-1 +kerning first=86 second=74 amount=-1 +kerning first=236 second=118 amount=-1 +kerning first=339 second=44 amount=-1 +kerning first=354 second=255 amount=-1 +kerning first=246 second=255 amount=-1 +kerning first=375 second=44 amount=-1 +kerning first=370 second=8249 amount=-1 +kerning first=267 second=44 amount=-1 +kerning first=196 second=366 amount=-1 +kerning first=105 second=255 amount=-1 +kerning first=311 second=267 amount=-1 +kerning first=85 second=8249 amount=-1 +kerning first=187 second=72 amount=-1 +kerning first=87 second=244 amount=-1 +kerning first=121 second=8249 amount=-1 +kerning first=1046 second=1057 amount=-1 +kerning first=197 second=350 amount=-1 +kerning first=221 second=234 amount=-1 +kerning first=73 second=257 amount=-1 +kerning first=89 second=332 amount=-1 +kerning first=337 second=108 amount=-1 +kerning first=67 second=199 amount=-1 +kerning first=204 second=251 amount=-1 +kerning first=352 second=221 amount=-1 +kerning first=74 second=198 amount=-1 +kerning first=354 second=328 amount=-1 +kerning first=260 second=361 amount=-1 +kerning first=296 second=361 amount=-1 +kerning first=311 second=245 amount=-1 +kerning first=374 second=332 amount=-1 +kerning first=8250 second=380 amount=-1 +kerning first=267 second=46 amount=-1 +kerning first=187 second=192 amount=-1 +kerning first=193 second=250 amount=-1 +kerning first=266 second=332 amount=-1 +kerning first=83 second=274 amount=-1 +kerning first=194 second=332 amount=-1 +kerning first=376 second=268 amount=-1 +kerning first=264 second=82 amount=-1 +kerning first=1059 second=1073 amount=-1 +kerning first=221 second=256 amount=-2 +kerning first=352 second=76 amount=-1 +kerning first=268 second=268 amount=-1 +kerning first=196 second=268 amount=-1 +kerning first=80 second=256 amount=-1 +kerning first=288 second=291 amount=-1 +kerning first=106 second=119 amount=-1 +kerning first=252 second=291 amount=-1 +kerning first=1046 second=1038 amount=-1 +kerning first=262 second=210 amount=-1 +kerning first=283 second=119 amount=-1 +kerning first=213 second=256 amount=-1 +kerning first=335 second=314 amount=-1 +kerning first=266 second=204 amount=-1 +kerning first=84 second=279 amount=-1 +kerning first=199 second=198 amount=-1 +kerning first=263 second=314 amount=-1 +kerning first=368 second=291 amount=-1 +kerning first=209 second=250 amount=-1 +kerning first=260 second=291 amount=-1 +kerning first=8216 second=195 amount=-2 +kerning first=119 second=291 amount=-1 +kerning first=83 second=291 amount=-1 +kerning first=194 second=363 amount=-1 +kerning first=268 second=73 amount=-1 +kerning first=84 second=44 amount=-1 +kerning first=89 second=381 amount=-1 +kerning first=317 second=84 amount=-1 +kerning first=1059 second=1095 amount=-1 +kerning first=311 second=337 amount=-1 +kerning first=356 second=268 amount=-1 +kerning first=333 second=44 amount=-1 +kerning first=206 second=227 amount=-1 +kerning first=67 second=278 amount=-1 +kerning first=83 second=296 amount=-1 +kerning first=350 second=66 amount=-1 +kerning first=66 second=108 amount=-1 +kerning first=374 second=199 amount=-1 +kerning first=366 second=261 amount=-1 +kerning first=67 second=336 amount=-1 +kerning first=330 second=261 amount=-1 +kerning first=84 second=284 amount=-1 +kerning first=8249 second=356 amount=-1 +kerning first=317 second=89 amount=-1 +kerning first=205 second=367 amount=-1 +kerning first=243 second=108 amount=-1 +kerning first=252 second=121 amount=-1 +kerning first=331 second=8249 amount=-1 +kerning first=66 second=220 amount=-1 +kerning first=356 second=263 amount=-1 +kerning first=346 second=344 amount=-1 +kerning first=264 second=302 amount=-1 +kerning first=118 second=8249 amount=-1 +kerning first=82 second=8249 amount=-1 +kerning first=295 second=8249 amount=-1 +kerning first=187 second=270 amount=-1 +kerning first=99 second=229 amount=-1 +kerning first=284 second=194 amount=-1 +kerning first=83 second=370 amount=-1 +kerning first=266 second=327 amount=-1 +kerning first=198 second=289 amount=-1 +kerning first=234 second=289 amount=-1 +kerning first=118 second=335 amount=-1 +kerning first=1040 second=1038 amount=-1 +kerning first=220 second=45 amount=-1 +kerning first=290 second=260 amount=-1 +kerning first=256 second=45 amount=-1 +kerning first=346 second=65 amount=-1 +kerning first=304 second=229 amount=-1 +kerning first=362 second=260 amount=-1 +kerning first=328 second=45 amount=-1 +kerning first=82 second=254 amount=-1 +kerning first=86 second=346 amount=-1 +kerning first=121 second=103 amount=-1 +kerning first=80 second=194 amount=-1 +kerning first=121 second=111 amount=-1 +kerning first=260 second=370 amount=-1 +kerning first=221 second=194 amount=-2 +kerning first=376 second=229 amount=-1 +kerning first=8217 second=234 amount=-1 +kerning first=364 second=45 amount=-1 +kerning first=254 second=255 amount=-1 +kerning first=87 second=223 amount=-1 +kerning first=260 second=212 amount=-1 +kerning first=253 second=225 amount=-1 +kerning first=193 second=211 amount=-1 +kerning first=8217 second=283 amount=-1 +kerning first=344 second=240 amount=-1 +kerning first=8216 second=246 amount=-1 +kerning first=85 second=193 amount=-1 +kerning first=287 second=46 amount=-1 +kerning first=283 second=44 amount=-1 +kerning first=103 second=257 amount=-1 +kerning first=8216 second=101 amount=-1 +kerning first=8220 second=101 amount=-1 +kerning first=1059 second=1090 amount=-1 +kerning first=1038 second=1057 amount=-1 +kerning first=334 second=193 amount=-1 +kerning first=88 second=290 amount=-1 +kerning first=262 second=193 amount=-1 +kerning first=193 second=290 amount=-1 +kerning first=85 second=122 amount=-1 +kerning first=370 second=193 amount=-1 +kerning first=87 second=346 amount=-1 +kerning first=235 second=375 amount=-1 +kerning first=307 second=375 amount=-1 +kerning first=367 second=314 amount=-1 +kerning first=356 second=224 amount=-1 +kerning first=88 second=361 amount=-1 +kerning first=240 second=46 amount=-1 +kerning first=99 second=46 amount=-1 +kerning first=194 second=289 amount=-1 +kerning first=82 second=98 amount=-1 +kerning first=45 second=70 amount=-1 +kerning first=103 second=259 amount=-1 +kerning first=84 second=235 amount=-1 +kerning first=199 second=282 amount=-1 +kerning first=1043 second=1051 amount=-1 +kerning first=263 second=225 amount=-1 +kerning first=118 second=259 amount=-1 +kerning first=287 second=316 amount=-1 +kerning first=251 second=316 amount=-1 +kerning first=101 second=311 amount=-1 +kerning first=8250 second=221 amount=-1 +kerning first=262 second=81 amount=-1 +kerning first=379 second=287 amount=-1 +kerning first=264 second=346 amount=-1 +kerning first=379 second=375 amount=-1 +kerning first=199 second=287 amount=-1 +kerning first=192 second=346 amount=-1 +kerning first=235 second=287 amount=-1 +kerning first=313 second=122 amount=-1 +kerning first=197 second=8217 amount=-1 +kerning first=8250 second=65 amount=-1 +kerning first=346 second=305 amount=-1 +kerning first=375 second=271 amount=-1 +kerning first=303 second=271 amount=-1 +kerning first=221 second=352 amount=-1 +kerning first=354 second=194 amount=-2 +kerning first=88 second=81 amount=-1 +kerning first=304 second=117 amount=-1 +kerning first=379 second=121 amount=-1 +kerning first=119 second=335 amount=-1 +kerning first=196 second=117 amount=-1 +kerning first=376 second=269 amount=-1 +kerning first=307 second=121 amount=-1 +kerning first=366 second=350 amount=-1 +kerning first=65 second=115 amount=-1 +kerning first=86 second=353 amount=-1 +kerning first=351 second=103 amount=-1 +kerning first=8217 second=83 amount=-1 +kerning first=87 second=253 amount=-1 +kerning first=193 second=374 amount=-2 +kerning first=45 second=350 amount=-1 +kerning first=228 second=253 amount=-1 +kerning first=84 second=97 amount=-1 +kerning first=121 second=277 amount=-1 +kerning first=258 second=350 amount=-1 +kerning first=272 second=196 amount=-1 +kerning first=258 second=266 amount=-1 +kerning first=88 second=251 amount=-1 +kerning first=193 second=85 amount=-1 +kerning first=364 second=289 amount=-1 +kerning first=298 second=228 amount=-1 +kerning first=85 second=228 amount=-1 +kerning first=121 second=228 amount=-1 +kerning first=379 second=361 amount=-1 +kerning first=193 second=251 amount=-1 +kerning first=107 second=263 amount=-1 +kerning first=89 second=246 amount=-1 +kerning first=344 second=8221 amount=-1 +kerning first=8220 second=257 amount=-1 +kerning first=376 second=103 amount=-1 +kerning first=77 second=171 amount=-1 +kerning first=65 second=262 amount=-1 +kerning first=65 second=71 amount=-1 +kerning first=218 second=171 amount=-1 +kerning first=304 second=103 amount=-1 +kerning first=196 second=103 amount=-1 +kerning first=290 second=171 amount=-1 +kerning first=87 second=381 amount=-1 +kerning first=232 second=103 amount=-1 +kerning first=120 second=249 amount=-1 +kerning first=362 second=171 amount=-1 +kerning first=236 second=119 amount=-1 +kerning first=313 second=362 amount=-1 +kerning first=326 second=171 amount=-1 +kerning first=344 second=119 amount=-1 +kerning first=266 second=256 amount=-1 +kerning first=252 second=118 amount=-1 +kerning first=103 second=380 amount=-1 +kerning first=324 second=118 amount=-1 +kerning first=268 second=313 amount=-1 +kerning first=121 second=233 amount=-1 +kerning first=192 second=218 amount=-1 +kerning first=111 second=314 amount=-1 +kerning first=75 second=118 amount=-1 +kerning first=255 second=248 amount=-1 +kerning first=258 second=217 amount=-1 +kerning first=72 second=229 amount=-1 +kerning first=262 second=67 amount=-1 +kerning first=296 second=230 amount=-1 +kerning first=87 second=267 amount=-1 +kerning first=376 second=264 amount=-1 +kerning first=199 second=352 amount=-1 +kerning first=268 second=264 amount=-1 +kerning first=196 second=264 amount=-1 +kerning first=120 second=363 amount=-1 +kerning first=252 second=8220 amount=-1 +kerning first=195 second=364 amount=-1 +kerning first=313 second=217 amount=-1 +kerning first=67 second=380 amount=-1 +kerning first=356 second=347 amount=-1 +kerning first=8216 second=339 amount=-1 +kerning first=1042 second=1059 amount=-1 +kerning first=260 second=249 amount=-1 +kerning first=264 second=209 amount=-1 +kerning first=258 second=8221 amount=-1 +kerning first=117 second=8221 amount=-1 +kerning first=291 second=257 amount=-1 +kerning first=375 second=232 amount=-1 +kerning first=327 second=257 amount=-1 +kerning first=219 second=257 amount=-1 +kerning first=303 second=232 amount=-1 +kerning first=255 second=257 amount=-1 +kerning first=241 second=118 amount=-1 +kerning first=89 second=83 amount=-1 +kerning first=277 second=118 amount=-1 +kerning first=364 second=192 amount=-1 +kerning first=313 second=118 amount=-1 +kerning first=194 second=83 amount=-1 +kerning first=1046 second=1108 amount=-1 +kerning first=220 second=197 amount=-1 +kerning first=1086 second=1076 amount=-1 +kerning first=266 second=83 amount=-1 +kerning first=266 second=78 amount=-1 +kerning first=87 second=262 amount=-1 +kerning first=220 second=192 amount=-1 +kerning first=284 second=8249 amount=-1 +kerning first=79 second=197 amount=-1 +kerning first=72 second=259 amount=-1 +kerning first=364 second=197 amount=-1 +kerning first=356 second=8249 amount=-1 +kerning first=264 second=262 amount=-1 +kerning first=196 second=370 amount=-1 +kerning first=327 second=230 amount=-1 +kerning first=83 second=194 amount=-1 +kerning first=79 second=192 amount=-1 +kerning first=192 second=262 amount=-1 +kerning first=78 second=257 amount=-1 +kerning first=71 second=8249 amount=-1 +kerning first=8217 second=248 amount=-1 +kerning first=362 second=103 amount=-1 +kerning first=290 second=103 amount=-1 +kerning first=107 second=8249 amount=-1 +kerning first=332 second=256 amount=-1 +kerning first=210 second=198 amount=-1 +kerning first=264 second=317 amount=-1 +kerning first=368 second=256 amount=-1 +kerning first=321 second=291 amount=-1 +kerning first=86 second=65 amount=-2 +kerning first=354 second=198 amount=-2 +kerning first=352 second=217 amount=-1 +kerning first=249 second=291 amount=-1 +kerning first=108 second=291 amount=-1 +kerning first=72 second=291 amount=-1 +kerning first=83 second=256 amount=-1 +kerning first=344 second=283 amount=-1 +kerning first=82 second=107 amount=-1 +kerning first=344 second=279 amount=-1 +kerning first=356 second=67 amount=-1 +kerning first=1056 second=1040 amount=-1 +kerning first=304 second=259 amount=-1 +kerning first=272 second=44 amount=-1 +kerning first=262 second=72 amount=-1 +kerning first=267 second=227 amount=-1 +kerning first=231 second=227 amount=-1 +kerning first=108 second=171 amount=-1 +kerning first=256 second=84 amount=-2 +kerning first=76 second=381 amount=-1 +kerning first=8217 second=113 amount=-1 +kerning first=199 second=212 amount=-1 +kerning first=269 second=261 amount=-1 +kerning first=311 second=171 amount=-1 +kerning first=232 second=108 amount=-1 +kerning first=366 second=226 amount=-1 +kerning first=330 second=226 amount=-1 +kerning first=199 second=317 amount=-1 +kerning first=302 second=367 amount=-1 +kerning first=194 second=367 amount=-1 +kerning first=207 second=229 amount=-1 +kerning first=66 second=229 amount=-1 +kerning first=291 second=122 amount=-1 +kerning first=1043 second=1083 amount=-1 +kerning first=255 second=122 amount=-1 +kerning first=327 second=365 amount=-1 +kerning first=219 second=122 amount=-1 +kerning first=8217 second=195 amount=-2 +kerning first=284 second=356 amount=-1 +kerning first=99 second=237 amount=-1 +kerning first=187 second=196 amount=-1 +kerning first=73 second=97 amount=-1 +kerning first=104 second=45 amount=-1 +kerning first=71 second=356 amount=-1 +kerning first=209 second=45 amount=-1 +kerning first=268 second=194 amount=-1 +kerning first=119 second=103 amount=-1 +kerning first=199 second=77 amount=-1 +kerning first=66 second=304 amount=-1 +kerning first=86 second=225 amount=-1 +kerning first=351 second=255 amount=-1 +kerning first=67 second=286 amount=-1 +kerning first=310 second=266 amount=-1 +kerning first=1059 second=1086 amount=-1 +kerning first=315 second=255 amount=-1 +kerning first=89 second=243 amount=-1 +kerning first=344 second=354 amount=-1 +kerning first=243 second=255 amount=-1 +kerning first=296 second=287 amount=-1 +kerning first=375 second=275 amount=-1 +kerning first=84 second=240 amount=-1 +kerning first=66 second=255 amount=-1 +kerning first=86 second=109 amount=-1 +kerning first=119 second=287 amount=-1 +kerning first=196 second=112 amount=-1 +kerning first=8218 second=364 amount=-1 +kerning first=374 second=243 amount=-1 +kerning first=83 second=287 amount=-1 +kerning first=284 second=171 amount=-1 +kerning first=117 second=8217 amount=-1 +kerning first=76 second=218 amount=-1 +kerning first=268 second=352 amount=-1 +kerning first=8250 second=274 amount=-1 +kerning first=368 second=287 amount=-1 +kerning first=67 second=327 amount=-1 +kerning first=107 second=111 amount=-1 +kerning first=377 second=380 amount=-1 +kerning first=374 second=248 amount=-1 +kerning first=354 second=260 amount=-2 +kerning first=262 second=76 amount=-1 +kerning first=356 second=111 amount=-1 +kerning first=352 second=327 amount=-1 +kerning first=317 second=382 amount=-1 +kerning first=221 second=264 amount=-1 +kerning first=221 second=269 amount=-1 +kerning first=88 second=334 amount=-1 +kerning first=89 second=248 amount=-1 +kerning first=193 second=334 amount=-1 +kerning first=275 second=253 amount=-1 +kerning first=347 second=253 amount=-1 +kerning first=354 second=245 amount=-1 +kerning first=262 second=202 amount=-1 +kerning first=65 second=364 amount=-1 +kerning first=70 second=350 amount=-1 +kerning first=1059 second=1080 amount=-1 +kerning first=209 second=289 amount=-1 +kerning first=84 second=288 amount=-1 +kerning first=67 second=213 amount=-1 +kerning first=353 second=289 amount=-1 +kerning first=281 second=289 amount=-1 +kerning first=199 second=207 amount=-1 +kerning first=317 second=289 amount=-1 +kerning first=352 second=87 amount=-1 +kerning first=323 second=369 amount=-1 +kerning first=67 second=332 amount=-1 +kerning first=8222 second=366 amount=-1 +kerning first=83 second=282 amount=-1 +kerning first=77 second=251 amount=-1 +kerning first=374 second=122 amount=-1 +kerning first=196 second=266 amount=-1 +kerning first=266 second=122 amount=-1 +kerning first=86 second=230 amount=-1 +kerning first=196 second=352 amount=-1 +kerning first=356 second=259 amount=-1 +kerning first=89 second=122 amount=-1 +kerning first=224 second=375 amount=-1 +kerning first=260 second=375 amount=-1 +kerning first=256 second=89 amount=-2 +kerning first=225 second=119 amount=-1 +kerning first=356 second=210 amount=-1 +kerning first=261 second=119 amount=-1 +kerning first=350 second=75 amount=-1 +kerning first=274 second=291 amount=-1 +kerning first=120 second=119 amount=-1 +kerning first=202 second=291 amount=-1 +kerning first=197 second=217 amount=-1 +kerning first=187 second=298 amount=-1 +kerning first=196 second=251 amount=-1 +kerning first=84 second=337 amount=-1 +kerning first=199 second=256 amount=-1 +kerning first=321 second=379 amount=-1 +kerning first=45 second=364 amount=-1 +kerning first=277 second=314 amount=-1 +kerning first=8217 second=243 amount=-1 +kerning first=277 second=289 amount=-1 +kerning first=356 second=351 amount=-1 +kerning first=256 second=362 amount=-1 +kerning first=354 second=121 amount=-1 +kerning first=8220 second=261 amount=-1 +kerning first=246 second=121 amount=-1 +kerning first=87 second=275 amount=-1 +kerning first=277 second=318 amount=-1 +kerning first=73 second=363 amount=-1 +kerning first=105 second=121 amount=-1 +kerning first=45 second=270 amount=-1 +kerning first=321 second=221 amount=-1 +kerning first=89 second=199 amount=-1 +kerning first=199 second=82 amount=-1 +kerning first=287 second=228 amount=-1 +kerning first=84 second=196 amount=-2 +kerning first=194 second=199 amount=-1 +kerning first=323 second=228 amount=-1 +kerning first=266 second=199 amount=-1 +kerning first=346 second=296 amount=-1 +kerning first=264 second=214 amount=-1 +kerning first=192 second=214 amount=-1 +kerning first=87 second=214 amount=-1 +kerning first=253 second=267 amount=-1 +kerning first=8217 second=74 amount=-1 +kerning first=66 second=230 amount=-1 +kerning first=118 second=347 amount=-1 +kerning first=321 second=8221 amount=-1 +kerning first=121 second=316 amount=-1 +kerning first=83 second=86 amount=-1 +kerning first=197 second=266 amount=-1 +kerning first=344 second=235 amount=-1 +kerning first=219 second=83 amount=-1 +kerning first=88 second=171 amount=-1 +kerning first=193 second=171 amount=-1 +kerning first=66 second=260 amount=-1 +kerning first=315 second=103 amount=-1 +kerning first=344 second=284 amount=-1 +kerning first=1107 second=1083 amount=-1 +kerning first=199 second=278 amount=-1 +kerning first=1054 second=1051 amount=-1 +kerning first=279 second=103 amount=-1 +kerning first=194 second=362 amount=-1 +kerning first=187 second=87 amount=-1 +kerning first=207 second=103 amount=-1 +kerning first=298 second=365 amount=-1 +kerning first=381 second=382 amount=-1 +kerning first=86 second=100 amount=-1 +kerning first=193 second=103 amount=-1 +kerning first=83 second=344 amount=-1 +kerning first=121 second=246 amount=-1 +kerning first=303 second=106 amount=1 +kerning first=45 second=121 amount=-1 +kerning first=371 second=100 amount=-1 +kerning first=1045 second=1090 amount=-1 +kerning first=346 second=78 amount=-1 +kerning first=216 second=65 amount=-1 +kerning first=86 second=234 amount=-1 +kerning first=376 second=260 amount=-2 +kerning first=75 second=199 amount=-1 +kerning first=374 second=118 amount=-1 +kerning first=88 second=365 amount=-1 +kerning first=194 second=252 amount=-1 +kerning first=193 second=365 amount=-1 +kerning first=196 second=361 amount=-1 +kerning first=376 second=121 amount=-1 +kerning first=1036 second=1058 amount=-1 +kerning first=304 second=361 amount=-1 +kerning first=84 second=231 amount=-1 +kerning first=196 second=121 amount=-1 +kerning first=379 second=117 amount=-1 +kerning first=66 second=107 amount=-1 +kerning first=303 second=267 amount=-1 +kerning first=193 second=264 amount=-1 +kerning first=375 second=267 amount=-1 +kerning first=197 second=8221 amount=-1 +kerning first=88 second=264 amount=-1 +kerning first=374 second=380 amount=-1 +kerning first=230 second=118 amount=-1 +kerning first=287 second=44 amount=-1 +kerning first=248 second=316 amount=-1 +kerning first=260 second=216 amount=-1 +kerning first=89 second=118 amount=-1 +kerning first=194 second=118 amount=-1 +kerning first=371 second=234 amount=-1 +kerning first=352 second=77 amount=-1 +kerning first=84 second=212 amount=-1 +kerning first=326 second=8217 amount=-1 +kerning first=195 second=346 amount=-1 +kerning first=1050 second=1089 amount=-1 +kerning first=350 second=201 amount=-1 +kerning first=192 second=249 amount=-1 +kerning first=268 second=282 amount=-1 +kerning first=8250 second=296 amount=-1 +kerning first=344 second=266 amount=-1 +kerning first=288 second=87 amount=-1 +kerning first=89 second=380 amount=-1 +kerning first=121 second=347 amount=-1 +kerning first=1069 second=1040 amount=-1 +kerning first=344 second=231 amount=-1 +kerning first=266 second=380 amount=-1 +kerning first=67 second=204 amount=-1 +kerning first=193 second=117 amount=-1 +kerning first=1038 second=1083 amount=-1 +kerning first=1056 second=1103 amount=-1 +kerning first=298 second=224 amount=-1 +kerning first=83 second=366 amount=-1 +kerning first=8222 second=374 amount=-2 +kerning first=195 second=84 amount=-2 +kerning first=85 second=224 amount=-1 +kerning first=121 second=224 amount=-1 +kerning first=288 second=171 amount=-1 +kerning first=209 second=8249 amount=-1 +kerning first=87 second=227 amount=-1 +kerning first=352 second=204 amount=-1 +kerning first=262 second=325 amount=-1 +kerning first=370 second=224 amount=-1 +kerning first=99 second=259 amount=-1 +kerning first=258 second=363 amount=-1 +kerning first=354 second=291 amount=-1 +kerning first=344 second=244 amount=-1 +kerning first=330 second=363 amount=-1 +kerning first=282 second=291 amount=-1 +kerning first=8217 second=230 amount=-1 +kerning first=105 second=291 amount=-1 +kerning first=69 second=291 amount=-1 +kerning first=82 second=67 amount=-1 +kerning first=256 second=210 amount=-1 +kerning first=253 second=337 amount=-1 +kerning first=275 second=44 amount=-1 +kerning first=262 second=268 amount=-1 +kerning first=72 second=287 amount=-1 +kerning first=108 second=287 amount=-1 +kerning first=98 second=44 amount=-1 +kerning first=356 second=338 amount=-1 +kerning first=86 second=256 amount=-2 +kerning first=221 second=198 amount=-2 +kerning first=80 second=198 amount=-1 +kerning first=260 second=366 amount=-1 +kerning first=187 second=206 amount=-1 +kerning first=66 second=112 amount=-1 +kerning first=103 second=378 amount=-1 +kerning first=75 second=117 amount=-1 +kerning first=90 second=361 amount=-1 +kerning first=321 second=287 amount=-1 +kerning first=327 second=367 amount=-1 +kerning first=249 second=287 amount=-1 +kerning first=221 second=326 amount=-1 +kerning first=264 second=66 amount=-1 +kerning first=82 second=89 amount=-1 +kerning first=331 second=8220 amount=-1 +kerning first=78 second=367 amount=-1 +kerning first=193 second=286 amount=-1 +kerning first=89 second=74 amount=-1 +kerning first=350 second=302 amount=-1 +kerning first=248 second=121 amount=-1 +kerning first=118 second=228 amount=-1 +kerning first=90 second=249 amount=-1 +kerning first=288 second=221 amount=-1 +kerning first=365 second=108 amount=-1 +kerning first=374 second=74 amount=-1 +kerning first=344 second=350 amount=-1 +kerning first=101 second=289 amount=-1 +kerning first=375 second=245 amount=-1 +kerning first=354 second=269 amount=-1 +kerning first=103 second=261 amount=-1 +kerning first=303 second=245 amount=-1 +kerning first=354 second=229 amount=-1 +kerning first=256 second=289 amount=-1 +kerning first=264 second=205 amount=-1 +kerning first=66 second=251 amount=-1 +kerning first=256 second=115 amount=-1 +kerning first=66 second=211 amount=-1 +kerning first=217 second=97 amount=-1 +kerning first=378 second=45 amount=-1 +kerning first=197 second=332 amount=-1 +kerning first=289 second=97 amount=-1 +kerning first=262 second=290 amount=-1 +kerning first=207 second=251 amount=-1 +kerning first=253 second=97 amount=-1 +kerning first=78 second=261 amount=-1 +kerning first=327 second=261 amount=-1 +kerning first=291 second=261 amount=-1 +kerning first=255 second=261 amount=-1 +kerning first=253 second=271 amount=-1 +kerning first=219 second=261 amount=-1 +kerning first=332 second=194 amount=-1 +kerning first=66 second=352 amount=-1 +kerning first=368 second=194 amount=-1 +kerning first=240 second=255 amount=-1 +kerning first=99 second=255 amount=-1 +kerning first=269 second=226 amount=-1 +kerning first=72 second=225 amount=-1 +kerning first=364 second=198 amount=-1 +kerning first=250 second=119 amount=-1 +kerning first=109 second=119 amount=-1 +kerning first=336 second=44 amount=-1 +kerning first=230 second=314 amount=-1 +kerning first=1036 second=1095 amount=-1 +kerning first=1062 second=1095 amount=-1 +kerning first=8250 second=362 amount=-1 +kerning first=266 second=274 amount=-1 +kerning first=78 second=8249 amount=-1 +kerning first=362 second=46 amount=-1 +kerning first=87 second=44 amount=-1 +kerning first=317 second=366 amount=-1 +kerning first=220 second=289 amount=-1 +kerning first=97 second=8220 amount=-1 +kerning first=217 second=192 amount=-1 +kerning first=231 second=44 amount=-1 +kerning first=115 second=289 amount=-1 +kerning first=8250 second=256 amount=-1 +kerning first=376 second=234 amount=-1 +kerning first=366 second=8249 amount=-1 +kerning first=258 second=347 amount=-1 +kerning first=302 second=230 amount=-1 +kerning first=197 second=354 amount=-2 +kerning first=86 second=122 amount=-1 +kerning first=197 second=213 amount=-1 +kerning first=8218 second=84 amount=-2 +kerning first=298 second=369 amount=-1 +kerning first=317 second=364 amount=-1 +kerning first=76 second=377 amount=-1 +kerning first=290 second=46 amount=-1 +kerning first=284 second=374 amount=-1 +kerning first=374 second=230 amount=-1 +kerning first=1059 second=1077 amount=-1 +kerning first=67 second=83 amount=-1 +kerning first=89 second=230 amount=-1 +kerning first=249 second=375 amount=-1 +kerning first=68 second=192 amount=-1 +kerning first=321 second=375 amount=-1 +kerning first=65 second=346 amount=-1 +kerning first=84 second=119 amount=-1 +kerning first=66 second=317 amount=-1 +kerning first=83 second=278 amount=-1 +kerning first=108 second=375 amount=-1 +kerning first=313 second=87 amount=-1 +kerning first=89 second=336 amount=-1 +kerning first=218 second=103 amount=-1 +kerning first=194 second=336 amount=-1 +kerning first=1058 second=1093 amount=-1 +kerning first=266 second=336 amount=-1 +kerning first=214 second=196 amount=-1 +kerning first=77 second=103 amount=-1 +kerning first=286 second=196 amount=-1 +kerning first=354 second=335 amount=-1 +kerning first=1059 second=1099 amount=-1 +kerning first=304 second=251 amount=-1 +kerning first=315 second=374 amount=-1 +kerning first=250 second=253 amount=-1 +kerning first=171 second=374 amount=-1 +kerning first=221 second=260 amount=-2 +kerning first=66 second=374 amount=-1 +kerning first=80 second=260 amount=-1 +kerning first=365 second=121 amount=-1 +kerning first=118 second=351 amount=-1 +kerning first=257 second=121 amount=-1 +kerning first=83 second=82 amount=-1 +kerning first=221 second=121 amount=-1 +kerning first=263 second=318 amount=-1 +kerning first=335 second=318 amount=-1 +kerning first=86 second=212 amount=-1 +kerning first=118 second=316 amount=-1 +kerning first=243 second=121 amount=-1 +kerning first=82 second=316 amount=-1 +kerning first=8216 second=233 amount=-1 +kerning first=66 second=121 amount=-1 +kerning first=83 second=203 amount=-1 +kerning first=356 second=228 amount=-1 +kerning first=223 second=316 amount=-1 +kerning first=67 second=323 amount=-1 +kerning first=367 second=316 amount=-1 +kerning first=264 second=75 amount=-1 +kerning first=110 second=171 amount=-1 +kerning first=74 second=171 amount=-1 +kerning first=354 second=326 amount=-1 +kerning first=263 second=375 amount=-1 +kerning first=350 second=77 amount=-1 +kerning first=335 second=375 amount=-1 +kerning first=67 second=270 amount=-1 +kerning first=86 second=375 amount=-1 +kerning first=78 second=228 amount=-1 +kerning first=221 second=99 amount=-1 +kerning first=227 second=375 amount=-1 +kerning first=187 second=278 amount=-1 +kerning first=1058 second=1040 amount=-1 +kerning first=194 second=217 amount=-1 +kerning first=323 second=365 amount=-1 +kerning first=352 second=270 amount=-1 +kerning first=120 second=230 amount=-1 +kerning first=258 second=250 amount=-1 +kerning first=65 second=214 amount=-1 +kerning first=84 second=110 amount=-1 +kerning first=195 second=71 amount=-1 +kerning first=45 second=354 amount=-1 +kerning first=248 second=120 amount=-1 +kerning first=314 second=106 amount=-1 +kerning first=82 second=263 amount=-1 +kerning first=262 second=334 amount=-1 +kerning first=264 second=315 amount=-1 +kerning first=196 second=220 amount=-1 +kerning first=236 second=253 amount=-1 +kerning first=344 second=253 amount=-1 +kerning first=287 second=224 amount=-1 +kerning first=323 second=224 amount=-1 +kerning first=258 second=354 amount=-2 +kerning first=287 second=171 amount=-1 +kerning first=121 second=281 amount=-1 +kerning first=255 second=283 amount=-1 +kerning first=363 second=118 amount=-1 +kerning first=66 second=68 amount=-1 +kerning first=376 second=339 amount=-1 +kerning first=204 second=365 amount=-1 +kerning first=86 second=119 amount=-1 +kerning first=356 second=382 amount=-1 +kerning first=296 second=117 amount=-1 +kerning first=199 second=313 amount=-1 +kerning first=315 second=121 amount=-1 +kerning first=279 second=121 amount=-1 +kerning first=375 second=333 amount=-1 +kerning first=88 second=255 amount=-1 +kerning first=346 second=287 amount=-1 +kerning first=199 second=216 amount=-1 +kerning first=274 second=287 amount=-1 +kerning first=202 second=287 amount=-1 +kerning first=84 second=79 amount=-1 +kerning first=267 second=230 amount=-1 +kerning first=8217 second=65 amount=-2 +kerning first=82 second=338 amount=-1 +kerning first=287 second=378 amount=-1 +kerning first=192 second=368 amount=-1 +kerning first=80 second=8249 amount=-1 +kerning first=219 second=74 amount=-1 +kerning first=84 second=350 amount=-1 +kerning first=350 second=192 amount=-1 +kerning first=344 second=275 amount=-1 +kerning first=289 second=347 amount=-1 +kerning first=378 second=8249 amount=-1 +kerning first=354 second=379 amount=-1 +kerning first=217 second=227 amount=-1 +kerning first=371 second=113 amount=-1 +kerning first=376 second=198 amount=-2 +kerning first=8250 second=69 amount=-1 +kerning first=86 second=113 amount=-1 +kerning first=199 second=71 amount=-1 +kerning first=86 second=347 amount=-1 +kerning first=65 second=84 amount=-2 +kerning first=379 second=291 amount=-1 +kerning first=315 second=90 amount=-1 +kerning first=307 second=291 amount=-1 +kerning first=66 second=90 amount=-1 +kerning first=235 second=291 amount=-1 +kerning first=199 second=291 amount=-1 +kerning first=86 second=199 amount=-1 +kerning first=66 second=361 amount=-1 +kerning first=321 second=366 amount=-1 +kerning first=8222 second=86 amount=-2 +kerning first=199 second=73 amount=-1 +kerning first=86 second=287 amount=-1 +kerning first=87 second=337 amount=-1 +kerning first=325 second=227 amount=-1 +kerning first=258 second=332 amount=-1 +kerning first=346 second=256 amount=-1 +kerning first=268 second=198 amount=-1 +kerning first=84 second=275 amount=-1 +kerning first=187 second=218 amount=-1 +kerning first=199 second=194 amount=-1 +kerning first=311 second=240 amount=-1 +kerning first=275 second=119 amount=-1 +kerning first=269 second=105 amount=-1 +kerning first=8250 second=310 amount=-1 +kerning first=8216 second=103 amount=-1 +kerning first=82 second=219 amount=-1 +kerning first=76 second=84 amount=-1 +kerning first=268 second=103 amount=-1 +kerning first=187 second=219 amount=-1 +kerning first=1054 second=1038 amount=-1 +kerning first=347 second=119 amount=-1 +kerning first=290 second=374 amount=-1 +kerning first=310 second=212 amount=-1 +kerning first=221 second=281 amount=-1 +kerning first=363 second=314 amount=-1 +kerning first=291 second=314 amount=-1 +kerning first=246 second=108 amount=-1 +kerning first=195 second=115 amount=-1 +kerning first=66 second=198 amount=-1 +kerning first=83 second=73 amount=-1 +kerning first=195 second=289 amount=-1 +kerning first=249 second=8220 amount=-1 +kerning first=339 second=289 amount=-1 +kerning first=321 second=8220 amount=-1 +kerning first=233 second=44 amount=-1 +kerning first=377 second=367 amount=-1 +kerning first=267 second=289 amount=-1 +kerning first=255 second=314 amount=-1 +kerning first=8250 second=205 amount=-1 +kerning first=66 second=286 amount=-1 +kerning first=366 second=257 amount=-1 +kerning first=197 second=367 amount=-1 +kerning first=8250 second=287 amount=-1 +kerning first=330 second=257 amount=-1 +kerning first=344 second=101 amount=-1 +kerning first=221 second=229 amount=-1 +kerning first=86 second=243 amount=-1 +kerning first=256 second=220 amount=-1 +kerning first=374 second=287 amount=-1 +kerning first=375 second=115 amount=-1 +kerning first=118 second=45 amount=-1 +kerning first=89 second=261 amount=-1 +kerning first=1038 second=1102 amount=-1 +kerning first=302 second=261 amount=-1 +kerning first=374 second=109 amount=-1 +kerning first=46 second=45 amount=-1 +kerning first=1024 second=1059 amount=-1 +kerning first=374 second=261 amount=-1 +kerning first=197 second=83 amount=-1 +kerning first=229 second=255 amount=-1 +kerning first=87 second=97 amount=-1 +kerning first=103 second=226 amount=-1 +kerning first=331 second=45 amount=-1 +kerning first=217 second=289 amount=-1 +kerning first=187 second=197 amount=-1 +kerning first=193 second=255 amount=-1 +kerning first=193 second=81 amount=-1 +kerning first=119 second=225 amount=-1 +kerning first=291 second=380 amount=-1 +kerning first=255 second=380 amount=-1 +kerning first=8220 second=269 amount=-1 +kerning first=1027 second=1092 amount=-1 +kerning first=296 second=225 amount=-1 +kerning first=120 second=253 amount=-1 +kerning first=368 second=225 amount=-1 +kerning first=66 second=252 amount=-1 +kerning first=84 second=253 amount=-1 +kerning first=315 second=220 amount=-1 +kerning first=289 second=227 amount=-1 +kerning first=225 second=253 amount=-1 +kerning first=89 second=109 amount=-1 +kerning first=243 second=46 amount=-1 +kerning first=374 second=283 amount=-1 +kerning first=279 second=46 amount=-1 +kerning first=333 second=253 amount=-1 +kerning first=371 second=243 amount=-1 +kerning first=118 second=382 amount=-1 +kerning first=187 second=382 amount=-1 +kerning first=266 second=65 amount=-1 +kerning first=374 second=65 amount=-2 +kerning first=241 second=8217 amount=-1 +kerning first=315 second=381 amount=-1 +kerning first=66 second=264 amount=-1 +kerning first=89 second=283 amount=-1 +kerning first=111 second=318 amount=-1 +kerning first=210 second=260 amount=-1 +kerning first=187 second=80 amount=-1 +kerning first=252 second=318 amount=-1 +kerning first=260 second=287 amount=-1 +kerning first=264 second=264 amount=-1 +kerning first=375 second=289 amount=-1 +kerning first=370 second=259 amount=-1 +kerning first=268 second=317 amount=-1 +kerning first=298 second=259 amount=-1 +kerning first=339 second=311 amount=-1 +kerning first=8220 second=194 amount=-2 +kerning first=66 second=46 amount=-1 +kerning first=381 second=369 amount=-1 +kerning first=8216 second=277 amount=-1 +kerning first=344 second=8217 amount=-1 +kerning first=376 second=99 amount=-1 +kerning first=258 second=213 amount=-1 +kerning first=8250 second=325 amount=-1 +kerning first=362 second=352 amount=-1 +kerning first=97 second=375 amount=-1 +kerning first=121 second=259 amount=-1 +kerning first=85 second=259 amount=-1 +kerning first=218 second=352 amount=-1 +kerning first=194 second=87 amount=-2 +kerning first=1050 second=1063 amount=-1 +kerning first=1047 second=1093 amount=-1 +kerning first=289 second=230 amount=-1 +kerning first=325 second=230 amount=-1 +kerning first=106 second=253 amount=-1 +kerning first=217 second=230 amount=-1 +kerning first=253 second=230 amount=-1 +kerning first=283 second=253 amount=-1 +kerning first=346 second=87 amount=-1 +kerning first=298 second=363 amount=-1 +kerning first=366 second=122 amount=-1 +kerning first=204 second=224 amount=-1 +kerning first=82 second=101 amount=-1 +kerning first=84 second=81 amount=-1 +kerning first=45 second=217 amount=-1 +kerning first=195 second=288 amount=-1 +kerning first=8217 second=197 amount=-2 +kerning first=321 second=219 amount=-1 +kerning first=187 second=207 amount=-1 +kerning first=111 second=316 amount=-1 +kerning first=346 second=317 amount=-1 +kerning first=1043 second=1103 amount=-1 +kerning first=86 second=277 amount=-1 +kerning first=209 second=287 amount=-1 +kerning first=316 second=121 amount=-1 +kerning first=344 second=121 amount=-1 +kerning first=219 second=196 amount=-1 +kerning first=236 second=121 amount=-1 +kerning first=118 second=115 amount=-1 +kerning first=99 second=103 amount=-1 +kerning first=371 second=277 amount=-1 +kerning first=311 second=231 amount=-1 +kerning first=217 second=171 amount=-1 +kerning first=353 second=287 amount=-1 +kerning first=289 second=171 amount=-1 +kerning first=253 second=171 amount=-1 +kerning first=281 second=287 amount=-1 +kerning first=120 second=252 amount=-1 +kerning first=76 second=368 amount=-1 +kerning first=317 second=287 amount=-1 +kerning first=325 second=171 amount=-1 +kerning first=111 second=375 amount=-1 +kerning first=366 second=352 amount=-1 +kerning first=46 second=8217 amount=-1 +kerning first=45 second=122 amount=-1 +kerning first=264 second=270 amount=-1 +kerning first=87 second=99 amount=-1 +kerning first=8222 second=89 amount=-2 +kerning first=259 second=8217 amount=-1 +kerning first=258 second=352 amount=-1 +kerning first=331 second=8217 amount=-1 +kerning first=85 second=74 amount=-1 +kerning first=75 second=375 amount=-1 +kerning first=86 second=286 amount=-1 +kerning first=267 second=229 amount=-1 +kerning first=367 second=8217 amount=-1 +kerning first=231 second=229 amount=-1 +kerning first=370 second=74 amount=-1 +kerning first=344 second=213 amount=-1 +kerning first=375 second=229 amount=-1 +kerning first=204 second=225 amount=-1 +kerning first=287 second=382 amount=-1 +kerning first=377 second=103 amount=-1 +kerning first=266 second=315 amount=-1 +kerning first=258 second=214 amount=-1 +kerning first=233 second=103 amount=-1 +kerning first=65 second=249 amount=-1 +kerning first=356 second=246 amount=-1 +kerning first=197 second=103 amount=-1 +kerning first=119 second=318 amount=-1 +kerning first=107 second=246 amount=-1 +kerning first=310 second=199 amount=-1 +kerning first=8250 second=356 amount=-1 +kerning first=84 second=232 amount=-1 +kerning first=374 second=337 amount=-1 +kerning first=77 second=361 amount=-1 +kerning first=121 second=99 amount=-1 +kerning first=195 second=117 amount=-1 +kerning first=8217 second=335 amount=-1 +kerning first=117 second=255 amount=-1 +kerning first=90 second=117 amount=-1 +kerning first=361 second=8220 amount=-1 +kerning first=252 second=316 amount=-1 +kerning first=199 second=378 amount=-1 +kerning first=8216 second=224 amount=-1 +kerning first=87 second=119 amount=-1 +kerning first=192 second=8221 amount=-1 +kerning first=76 second=8220 amount=-1 +kerning first=76 second=118 amount=-1 +kerning first=379 second=378 amount=-1 +kerning first=192 second=119 amount=-1 +kerning first=376 second=281 amount=-1 +kerning first=268 second=202 amount=-1 +kerning first=228 second=119 amount=-1 +kerning first=344 second=233 amount=-1 +kerning first=66 second=380 amount=-1 +kerning first=375 second=347 amount=-1 +kerning first=8216 second=242 amount=-1 +kerning first=244 second=314 amount=-1 +kerning first=315 second=380 amount=-1 +kerning first=194 second=85 amount=-1 +kerning first=103 second=314 amount=-1 +kerning first=195 second=347 amount=-1 +kerning first=288 second=86 amount=-1 +kerning first=8217 second=256 amount=-2 +kerning first=221 second=379 amount=-1 +kerning first=192 second=250 amount=-1 +kerning first=83 second=200 amount=-1 +kerning first=8249 second=221 amount=-1 +kerning first=82 second=266 amount=-1 +kerning first=354 second=378 amount=-1 +kerning first=84 second=101 amount=-1 +kerning first=374 second=216 amount=-1 +kerning first=325 second=250 amount=-1 +kerning first=314 second=8220 amount=-1 +kerning first=65 second=8220 amount=-1 +kerning first=326 second=119 amount=-1 +kerning first=84 second=331 amount=-1 +kerning first=272 second=193 amount=-1 +kerning first=352 second=274 amount=-1 +kerning first=310 second=216 amount=-1 +kerning first=219 second=197 amount=-1 +kerning first=8220 second=195 amount=-2 +kerning first=376 second=90 amount=-1 +kerning first=286 second=291 amount=-1 +kerning first=1061 second=1054 amount=-1 +kerning first=250 second=291 amount=-1 +kerning first=194 second=216 amount=-1 +kerning first=321 second=377 amount=-1 +kerning first=89 second=216 amount=-1 +kerning first=45 second=83 amount=-1 +kerning first=73 second=291 amount=-1 +kerning first=86 second=67 amount=-1 +kerning first=89 second=197 amount=-2 +kerning first=258 second=121 amount=-1 +kerning first=258 second=83 amount=-1 +kerning first=266 second=216 amount=-1 +kerning first=266 second=197 amount=-1 +kerning first=8217 second=257 amount=-1 +kerning first=376 second=110 amount=-1 +kerning first=65 second=210 amount=-1 +kerning first=366 second=83 amount=-1 +kerning first=374 second=197 amount=-2 +kerning first=119 second=8249 amount=-1 +kerning first=66 second=262 amount=-1 +kerning first=83 second=302 amount=-1 +kerning first=8250 second=87 amount=-1 +kerning first=356 second=187 amount=-1 +kerning first=260 second=8249 amount=-1 +kerning first=354 second=240 amount=-1 +kerning first=368 second=8249 amount=-1 +kerning first=256 second=268 amount=-1 +kerning first=83 second=68 amount=-1 +kerning first=346 second=278 amount=-1 +kerning first=8220 second=333 amount=-1 +kerning first=86 second=198 amount=-2 +kerning first=83 second=45 amount=-1 +kerning first=66 second=203 amount=-1 +kerning first=235 second=108 amount=-1 +kerning first=249 second=318 amount=-1 +kerning first=222 second=46 amount=-1 +kerning first=209 second=228 amount=-1 +kerning first=219 second=65 amount=-1 +kerning first=195 second=367 amount=-1 +kerning first=268 second=193 amount=-1 +kerning first=351 second=120 amount=-1 +kerning first=8220 second=235 amount=-1 +kerning first=90 second=367 amount=-1 +kerning first=298 second=361 amount=-1 +kerning first=82 second=286 amount=-1 +kerning first=206 second=229 amount=-1 +kerning first=221 second=339 amount=-1 +kerning first=103 second=353 amount=-1 +kerning first=1061 second=1073 amount=-1 +kerning first=8222 second=220 amount=-1 +kerning first=211 second=194 amount=-1 +kerning first=262 second=304 amount=-1 +kerning first=354 second=109 amount=-1 +kerning first=89 second=45 amount=-1 +kerning first=70 second=352 amount=-1 +kerning first=255 second=275 amount=-1 +kerning first=8250 second=195 amount=-1 +kerning first=374 second=45 amount=-1 +kerning first=8216 second=263 amount=-1 +kerning first=194 second=45 amount=-1 +kerning first=8216 second=244 amount=-1 +kerning first=70 second=194 amount=-1 +kerning first=376 second=242 amount=-1 +kerning first=316 second=255 amount=-1 +kerning first=370 second=225 amount=-1 +kerning first=244 second=255 amount=-1 +kerning first=298 second=225 amount=-1 +kerning first=75 second=334 amount=-1 +kerning first=376 second=286 amount=-1 +kerning first=221 second=110 amount=-1 +kerning first=344 second=81 amount=-1 +kerning first=231 second=97 amount=-1 +kerning first=267 second=97 amount=-1 +kerning first=269 second=44 amount=-1 +kerning first=375 second=97 amount=-1 +kerning first=87 second=79 amount=-1 +kerning first=288 second=65 amount=-1 +kerning first=350 second=84 amount=-1 +kerning first=67 second=274 amount=-1 +kerning first=197 second=252 amount=-1 +kerning first=264 second=79 amount=-1 +kerning first=187 second=76 amount=-1 +kerning first=277 second=46 amount=-1 +kerning first=65 second=289 amount=-1 +kerning first=8222 second=378 amount=-1 +kerning first=278 second=289 amount=-1 +kerning first=314 second=289 amount=-1 +kerning first=206 second=289 amount=-1 +kerning first=1059 second=1088 amount=-1 +kerning first=85 second=225 amount=-1 +kerning first=350 second=289 amount=-1 +kerning first=65 second=368 amount=-1 +kerning first=303 second=248 amount=-1 +kerning first=354 second=241 amount=-1 +kerning first=263 second=230 amount=-1 +kerning first=1059 second=1108 amount=-1 +kerning first=197 second=352 amount=-1 +kerning first=83 second=69 amount=-1 +kerning first=82 second=364 amount=-1 +kerning first=1059 second=1084 amount=-1 +kerning first=198 second=287 amount=-1 +kerning first=262 second=206 amount=-1 +kerning first=234 second=287 amount=-1 +kerning first=89 second=44 amount=-1 +kerning first=195 second=374 amount=-2 +kerning first=313 second=86 amount=-1 +kerning first=8218 second=118 amount=-1 +kerning first=89 second=46 amount=-1 +kerning first=88 second=286 amount=-1 +kerning first=350 second=368 amount=-1 +kerning first=67 second=45 amount=-1 +kerning first=268 second=380 amount=-1 +kerning first=230 second=46 amount=-1 +kerning first=370 second=256 amount=-1 +kerning first=103 second=45 amount=-1 +kerning first=199 second=201 amount=-1 +kerning first=8216 second=273 amount=-1 +kerning first=98 second=253 amount=-1 +kerning first=268 second=70 amount=-1 +kerning first=376 second=380 amount=-1 +kerning first=303 second=269 amount=-1 +kerning first=375 second=269 amount=-1 +kerning first=255 second=353 amount=-1 +kerning first=229 second=121 amount=-1 +kerning first=344 second=311 amount=-1 +kerning first=87 second=230 amount=-1 +kerning first=313 second=375 amount=-1 +kerning first=364 second=346 amount=-1 +kerning first=87 second=289 amount=-1 +kerning first=256 second=346 amount=-1 +kerning first=277 second=375 amount=-1 +kerning first=264 second=289 amount=-1 +kerning first=346 second=219 amount=-1 +kerning first=192 second=289 amount=-1 +kerning first=65 second=288 amount=-1 +kerning first=375 second=248 amount=-1 +kerning first=73 second=369 amount=-1 +kerning first=1059 second=1087 amount=-1 +kerning first=344 second=370 amount=-1 +kerning first=192 second=251 amount=-1 +kerning first=356 second=289 amount=-1 +kerning first=67 second=196 amount=-1 +kerning first=8216 second=243 amount=-1 +kerning first=344 second=220 amount=-1 +kerning first=344 second=332 amount=-1 +kerning first=192 second=171 amount=-1 +kerning first=256 second=117 amount=-1 +kerning first=264 second=171 amount=-1 +kerning first=87 second=231 amount=-1 +kerning first=228 second=8220 amount=-1 +kerning first=106 second=121 amount=-1 +kerning first=352 second=196 amount=-1 +kerning first=208 second=196 amount=-1 +kerning first=76 second=119 amount=-1 +kerning first=311 second=100 amount=-1 +kerning first=84 second=233 amount=-1 +kerning first=83 second=298 amount=-1 +kerning first=196 second=221 amount=-2 +kerning first=8250 second=219 amount=-1 +kerning first=253 second=99 amount=-1 +kerning first=269 second=314 amount=-1 +kerning first=233 second=314 amount=-1 +kerning first=84 second=213 amount=-1 +kerning first=262 second=382 amount=-1 +kerning first=195 second=249 amount=-1 +kerning first=258 second=253 amount=-1 +kerning first=333 second=120 amount=-1 +kerning first=266 second=334 amount=-1 +kerning first=310 second=8249 amount=-1 +kerning first=382 second=8249 amount=-1 +kerning first=346 second=291 amount=-1 +kerning first=89 second=334 amount=-1 +kerning first=346 second=8249 amount=-1 +kerning first=262 second=344 amount=-1 +kerning first=1090 second=1083 amount=-1 +kerning first=323 second=363 amount=-1 +kerning first=316 second=103 amount=-1 +kerning first=352 second=103 amount=-1 +kerning first=374 second=334 amount=-1 +kerning first=67 second=78 amount=-1 +kerning first=101 second=118 amount=-1 +kerning first=45 second=313 amount=-1 +kerning first=67 second=103 amount=-1 +kerning first=196 second=8217 amount=-1 +kerning first=209 second=365 amount=-1 +kerning first=266 second=296 amount=-1 +kerning first=65 second=118 amount=-1 +kerning first=346 second=68 amount=-1 +kerning first=8217 second=275 amount=-1 +kerning first=263 second=316 amount=-1 +kerning first=85 second=382 amount=-1 +kerning first=255 second=235 amount=-1 +kerning first=70 second=83 amount=-1 +kerning first=377 second=255 amount=-1 +kerning first=244 second=44 amount=-1 +kerning first=352 second=44 amount=-1 +kerning first=197 second=255 amount=-1 +kerning first=103 second=44 amount=-1 +kerning first=233 second=255 amount=-1 +kerning first=228 second=8221 amount=-1 +kerning first=208 second=44 amount=-1 +kerning first=8250 second=317 amount=-1 +kerning first=87 second=100 amount=-1 +kerning first=108 second=8249 amount=-1 +kerning first=87 second=290 amount=-1 +kerning first=118 second=227 amount=-1 +kerning first=192 second=290 amount=-1 +kerning first=120 second=115 amount=-1 +kerning first=86 second=110 amount=-1 +kerning first=211 second=193 amount=-1 +kerning first=70 second=193 amount=-1 +kerning first=8250 second=122 amount=-1 +kerning first=313 second=85 amount=-1 +kerning first=67 second=65 amount=-1 +kerning first=8250 second=121 amount=-1 +kerning first=303 second=118 amount=-1 +kerning first=339 second=118 amount=-1 +kerning first=311 second=232 amount=-1 +kerning first=199 second=338 amount=-1 +kerning first=263 second=257 amount=-1 +kerning first=1027 second=1078 amount=-1 +kerning first=208 second=65 amount=-1 +kerning first=83 second=260 amount=-1 +kerning first=264 second=192 amount=-1 +kerning first=195 second=118 amount=-1 +kerning first=102 second=171 amount=-1 +kerning first=231 second=118 amount=-1 +kerning first=336 second=192 amount=-1 +kerning first=352 second=65 amount=-1 +kerning first=87 second=192 amount=-2 +kerning first=332 second=260 amount=-1 +kerning first=206 second=250 amount=-1 +kerning first=1105 second=1076 amount=-1 +kerning first=121 second=245 amount=-1 +kerning first=221 second=378 amount=-1 +kerning first=1036 second=1073 amount=-1 +kerning first=194 second=84 amount=-2 +kerning first=347 second=291 amount=-1 +kerning first=275 second=291 amount=-1 +kerning first=288 second=256 amount=-1 +kerning first=119 second=337 amount=-1 +kerning first=203 second=291 amount=-1 +kerning first=221 second=90 amount=-1 +kerning first=195 second=210 amount=-1 +kerning first=8218 second=354 amount=-2 +kerning first=377 second=102 amount=-1 +kerning first=216 second=256 amount=-1 +kerning first=221 second=242 amount=-1 +kerning first=310 second=67 amount=-1 +kerning first=119 second=100 amount=-1 +kerning first=310 second=338 amount=-1 +kerning first=89 second=335 amount=-1 +kerning first=327 second=45 amount=-1 +kerning first=352 second=280 amount=-1 +kerning first=313 second=374 amount=-1 +kerning first=66 second=261 amount=-1 +kerning first=374 second=335 amount=-1 +kerning first=118 second=44 amount=-1 +kerning first=77 second=224 amount=-1 +kerning first=207 second=261 amount=-1 +kerning first=256 second=367 amount=-1 +kerning first=362 second=224 amount=-1 +kerning first=76 second=289 amount=-1 +kerning first=99 second=303 amount=-1 +kerning first=325 second=289 amount=-1 +kerning first=8220 second=103 amount=-1 +kerning first=1027 second=1040 amount=-1 +kerning first=218 second=224 amount=-1 +kerning first=253 second=289 amount=-1 +kerning first=8250 second=377 amount=-1 +kerning first=87 second=328 amount=-1 +kerning first=354 second=279 amount=-1 +kerning first=1043 second=1104 amount=-1 +kerning first=119 second=108 amount=-1 +kerning first=354 second=381 amount=-1 +kerning first=356 second=286 amount=-1 +kerning first=253 second=229 amount=-1 +kerning first=187 second=325 amount=-1 +kerning first=217 second=229 amount=-1 +kerning first=353 second=115 amount=-1 +kerning first=86 second=257 amount=-1 +kerning first=8218 second=221 amount=-2 +kerning first=325 second=229 amount=-1 +kerning first=289 second=229 amount=-1 +kerning first=197 second=353 amount=-1 +kerning first=352 second=354 amount=-1 +kerning first=356 second=324 amount=-1 +kerning first=118 second=287 amount=-1 +kerning first=187 second=287 amount=-1 +kerning first=82 second=287 amount=-1 +kerning first=346 second=356 amount=-1 +kerning first=102 second=107 amount=1 +kerning first=110 second=45 amount=-1 +kerning first=264 second=290 amount=-1 +kerning first=66 second=223 amount=-1 +kerning first=1050 second=1054 amount=-1 +kerning first=367 second=287 amount=-1 +kerning first=73 second=171 amount=-1 +kerning first=206 second=97 amount=-1 +kerning first=374 second=275 amount=-1 +kerning first=376 second=245 amount=-1 +kerning first=354 second=339 amount=-1 +kerning first=1027 second=1089 amount=-1 +kerning first=195 second=368 amount=-1 +kerning first=219 second=45 amount=-1 +kerning first=255 second=45 amount=-1 +kerning first=81 second=194 amount=-1 +kerning first=222 second=194 amount=-1 +kerning first=89 second=275 amount=-1 +kerning first=78 second=45 amount=-1 +kerning first=8220 second=234 amount=-1 +kerning first=197 second=45 amount=-1 +kerning first=192 second=350 amount=-1 +kerning first=194 second=353 amount=-1 +kerning first=305 second=45 amount=-1 +kerning first=264 second=350 amount=-1 +kerning first=65 second=211 amount=-1 +kerning first=313 second=356 amount=-1 +kerning first=374 second=353 amount=-1 +kerning first=246 second=318 amount=-1 +kerning first=8217 second=277 amount=-1 +kerning first=377 second=45 amount=-1 +kerning first=275 second=289 amount=-1 +kerning first=203 second=289 amount=-1 +kerning first=277 second=255 amount=-1 +kerning first=313 second=255 amount=-1 +kerning first=262 second=112 amount=-1 +kerning first=347 second=289 amount=-1 +kerning first=187 second=193 amount=-1 +kerning first=84 second=194 amount=-2 +kerning first=84 second=332 amount=-1 +kerning first=376 second=223 amount=-1 +kerning first=352 second=374 amount=-1 +kerning first=89 second=353 amount=-1 +kerning first=120 second=259 amount=-1 +kerning first=8249 second=354 amount=-1 +kerning first=84 second=290 amount=-1 +kerning first=325 second=251 amount=-1 +kerning first=211 second=44 amount=-1 +kerning first=374 second=257 amount=-1 +kerning first=195 second=79 amount=-1 +kerning first=1100 second=1091 amount=-1 +kerning first=272 second=192 amount=-1 +kerning first=70 second=44 amount=-1 +kerning first=101 second=119 amount=-1 +kerning first=74 second=103 amount=-1 +kerning first=89 second=257 amount=-1 +kerning first=65 second=119 amount=-1 +kerning first=302 second=257 amount=-1 +kerning first=264 second=78 amount=-1 +kerning first=314 second=119 amount=-1 +kerning first=315 second=221 amount=-1 +kerning first=114 second=46 amount=-1 +kerning first=350 second=119 amount=-1 +kerning first=356 second=225 amount=-1 +kerning first=291 second=46 amount=-1 +kerning first=219 second=46 amount=-1 +kerning first=255 second=46 amount=-1 +kerning first=8250 second=66 amount=-1 +kerning first=269 second=253 amount=-1 +kerning first=377 second=253 amount=-1 +kerning first=187 second=346 amount=-1 +kerning first=231 second=230 amount=-1 +kerning first=374 second=375 amount=-1 +kerning first=82 second=346 amount=-1 +kerning first=199 second=70 amount=-1 +kerning first=194 second=375 amount=-1 +kerning first=230 second=375 amount=-1 +kerning first=83 second=87 amount=-1 +kerning first=268 second=201 amount=-1 +kerning first=311 second=101 amount=-1 +kerning first=260 second=87 amount=-2 +kerning first=8220 second=273 amount=-1 +kerning first=89 second=375 amount=-1 +kerning first=74 second=196 amount=-1 +kerning first=8250 second=70 amount=-1 +kerning first=217 second=380 amount=-1 +kerning first=89 second=235 amount=-1 +kerning first=321 second=218 amount=-1 +kerning first=288 second=354 amount=-1 +kerning first=277 second=104 amount=-1 +kerning first=374 second=235 amount=-1 +kerning first=8216 second=74 amount=-1 +kerning first=106 second=171 amount=-1 +kerning first=86 second=377 amount=-1 +kerning first=120 second=369 amount=-1 +kerning first=263 second=105 amount=-1 +kerning first=264 second=212 amount=-1 +kerning first=67 second=197 amount=-1 +kerning first=1059 second=1083 amount=-1 +kerning first=344 second=83 amount=-1 +kerning first=255 second=333 amount=-1 +kerning first=208 second=197 amount=-1 +kerning first=83 second=317 amount=-1 +kerning first=253 second=231 amount=-1 +kerning first=352 second=197 amount=-1 +kerning first=323 second=291 amount=-1 +kerning first=258 second=351 amount=-1 +kerning first=209 second=229 amount=-1 +kerning first=86 second=335 amount=-1 +kerning first=346 second=237 amount=-1 +kerning first=103 second=122 amount=-1 +kerning first=275 second=311 amount=-1 +kerning first=375 second=230 amount=-1 +kerning first=67 second=122 amount=-1 +kerning first=233 second=253 amount=-1 +kerning first=197 second=253 amount=-1 +kerning first=371 second=335 amount=-1 +kerning first=89 second=333 amount=-1 +kerning first=213 second=260 amount=-1 +kerning first=286 second=171 amount=-1 +kerning first=256 second=249 amount=-1 +kerning first=262 second=266 amount=-1 +kerning first=283 second=121 amount=-1 +kerning first=346 second=200 amount=-1 +kerning first=260 second=199 amount=-1 +kerning first=204 second=361 amount=-1 +kerning first=81 second=196 amount=-1 +kerning first=45 second=196 amount=-1 +kerning first=67 second=79 amount=-1 +kerning first=363 second=103 amount=-1 +kerning first=197 second=171 amount=-1 +kerning first=268 second=280 amount=-1 +kerning first=84 second=214 amount=-1 +kerning first=109 second=8221 amount=-1 +kerning first=327 second=103 amount=-1 +kerning first=219 second=103 amount=-1 +kerning first=8218 second=119 amount=-1 +kerning first=255 second=103 amount=-1 +kerning first=253 second=100 amount=-1 +kerning first=221 second=267 amount=-1 +kerning first=78 second=103 amount=-1 +kerning first=250 second=8221 amount=-1 +kerning first=354 second=71 amount=-1 +kerning first=264 second=330 amount=-1 +kerning first=381 second=365 amount=-1 +kerning first=45 second=103 amount=-1 +kerning first=321 second=220 amount=-1 +kerning first=221 second=8250 amount=-1 +kerning first=109 second=171 amount=-1 +kerning first=8216 second=192 amount=-2 +kerning first=354 second=242 amount=-1 +kerning first=220 second=97 amount=-1 +kerning first=328 second=118 amount=-1 +kerning first=66 second=72 amount=-1 +kerning first=207 second=224 amount=-1 +kerning first=199 second=298 amount=-1 +kerning first=118 second=248 amount=-1 +kerning first=193 second=252 amount=-1 +kerning first=296 second=259 amount=-1 +kerning first=66 second=224 amount=-1 +kerning first=66 second=379 amount=-1 +kerning first=87 second=232 amount=-1 +kerning first=118 second=267 amount=-1 +kerning first=260 second=218 amount=-1 +kerning first=82 second=267 amount=-1 +kerning first=66 second=330 amount=-1 +kerning first=313 second=354 amount=-1 +kerning first=255 second=234 amount=-1 +kerning first=83 second=218 amount=-1 +kerning first=115 second=118 amount=-1 +kerning first=195 second=250 amount=-1 +kerning first=90 second=250 amount=-1 +kerning first=1050 second=1090 amount=-1 +kerning first=83 second=221 amount=-1 +kerning first=8220 second=197 amount=-2 +kerning first=376 second=378 amount=-1 +kerning first=45 second=274 amount=-1 +kerning first=71 second=287 amount=-1 +kerning first=363 second=108 amount=-1 +kerning first=84 second=192 amount=-2 +kerning first=214 second=193 amount=-1 +kerning first=1113 second=1118 amount=-1 +kerning first=213 second=198 amount=-1 +kerning first=75 second=216 amount=-1 +kerning first=118 second=226 amount=-1 +kerning first=313 second=84 amount=-1 +kerning first=364 second=227 amount=-1 +kerning first=356 second=287 amount=-1 +kerning first=356 second=113 amount=-1 +kerning first=352 second=102 amount=-1 +kerning first=284 second=287 amount=-1 +kerning first=1118 second=1083 amount=-1 +kerning first=220 second=227 amount=-1 +kerning first=231 second=307 amount=-1 +kerning first=268 second=378 amount=-1 +kerning first=344 second=291 amount=-1 +kerning first=107 second=113 amount=-1 +kerning first=256 second=368 amount=-1 +kerning first=254 second=121 amount=-1 +kerning first=264 second=210 amount=-1 +kerning first=236 second=291 amount=-1 +kerning first=352 second=45 amount=-1 +kerning first=193 second=262 amount=-1 +kerning first=321 second=89 amount=-1 +kerning first=310 second=268 amount=-1 +kerning first=193 second=284 amount=-1 +kerning first=88 second=262 amount=-1 +kerning first=87 second=210 amount=-1 +kerning first=77 second=261 amount=-1 +kerning first=217 second=350 amount=-1 +kerning first=192 second=210 amount=-1 +kerning first=371 second=337 amount=-1 +kerning first=354 second=8249 amount=-1 +kerning first=86 second=337 amount=-1 +kerning first=88 second=284 amount=-1 +kerning first=119 second=240 amount=-1 +kerning first=219 second=256 amount=-1 +kerning first=8218 second=87 amount=-2 +kerning first=209 second=367 amount=-1 +kerning first=118 second=245 amount=-1 +kerning first=350 second=327 amount=-1 +kerning first=82 second=245 amount=-1 +kerning first=105 second=8249 amount=-1 +kerning first=121 second=263 amount=-1 +kerning first=1038 second=1092 amount=-1 +kerning first=267 second=228 amount=-1 +kerning first=346 second=66 amount=-1 +kerning first=375 second=228 amount=-1 +kerning first=121 second=244 amount=-1 +kerning first=249 second=108 amount=-1 +kerning first=347 second=120 amount=-1 +kerning first=231 second=228 amount=-1 +kerning first=268 second=302 amount=-1 +kerning first=263 second=108 amount=-1 +kerning first=335 second=108 amount=-1 +kerning first=66 second=303 amount=-1 +kerning first=83 second=219 amount=-1 +kerning first=206 second=251 amount=-1 +kerning first=374 second=226 amount=-1 +kerning first=109 second=8220 amount=-1 +kerning first=364 second=229 amount=-1 +kerning first=250 second=8220 amount=-1 +kerning first=262 second=286 amount=-1 +kerning first=66 second=311 amount=-1 +kerning first=195 second=119 amount=-1 +kerning first=376 second=279 amount=-1 +kerning first=264 second=310 amount=-1 +kerning first=303 second=119 amount=-1 +kerning first=339 second=119 amount=-1 +kerning first=8217 second=333 amount=-1 +kerning first=231 second=119 amount=-1 +kerning first=267 second=119 amount=-1 +kerning first=356 second=115 amount=-1 +kerning first=220 second=229 amount=-1 +kerning first=209 second=97 amount=-1 +kerning first=381 second=363 amount=-1 +kerning first=291 second=353 amount=-1 +kerning first=8222 second=221 amount=-2 +kerning first=283 second=314 amount=-1 +kerning first=288 second=356 amount=-1 +kerning first=366 second=45 amount=-1 +kerning first=374 second=255 amount=-1 +kerning first=1046 second=1060 amount=-1 +kerning first=8217 second=246 amount=-1 +kerning first=230 second=255 amount=-1 +kerning first=330 second=45 amount=-1 +kerning first=87 second=101 amount=-1 +kerning first=194 second=255 amount=-1 +kerning first=107 second=244 amount=-1 +kerning first=67 second=296 amount=-1 +kerning first=89 second=255 amount=-1 +kerning first=272 second=194 amount=-1 +kerning first=65 second=79 amount=-1 +kerning first=356 second=244 amount=-1 +kerning first=350 second=280 amount=-1 +kerning first=264 second=80 amount=-1 +kerning first=352 second=296 amount=-1 +kerning first=1114 second=1091 amount=-1 +kerning first=121 second=243 amount=-1 +kerning first=8217 second=103 amount=-1 +kerning first=1061 second=1095 amount=-1 +kerning first=352 second=46 amount=-1 +kerning first=310 second=121 amount=-1 +kerning first=244 second=46 amount=-1 +kerning first=219 second=352 amount=-1 +kerning first=264 second=203 amount=-1 +kerning first=84 second=83 amount=-1 +kerning first=187 second=77 amount=-1 +kerning first=262 second=264 amount=-1 +kerning first=352 second=330 amount=-1 +kerning first=115 second=347 amount=-1 +kerning first=256 second=347 amount=-1 +kerning first=218 second=380 amount=-1 +kerning first=268 second=71 amount=-1 +kerning first=196 second=71 amount=-1 +kerning first=362 second=380 amount=-1 +kerning first=118 second=225 amount=-1 +kerning first=45 second=65 amount=-1 +kerning first=199 second=200 amount=-1 +kerning first=208 second=46 amount=-1 +kerning first=85 second=230 amount=-1 +kerning first=226 second=8217 amount=-1 +kerning first=81 second=65 amount=-1 +kerning first=316 second=253 amount=-1 +kerning first=222 second=65 amount=-1 +kerning first=363 second=375 amount=-1 +kerning first=206 second=230 amount=-1 +kerning first=321 second=87 amount=-1 +kerning first=366 second=65 amount=-1 +kerning first=303 second=99 amount=-1 +kerning first=73 second=289 amount=-1 +kerning first=375 second=99 amount=-1 +kerning first=89 second=65 amount=-2 +kerning first=263 second=259 amount=-1 +kerning first=197 second=351 amount=-1 +kerning first=1043 second=1076 amount=-1 +kerning first=250 second=289 amount=-1 +kerning first=258 second=370 amount=-1 +kerning first=86 second=259 amount=-1 +kerning first=235 second=318 amount=-1 +kerning first=346 second=260 amount=-1 +kerning first=286 second=289 amount=-1 +kerning first=377 second=122 amount=-1 +kerning first=264 second=288 amount=-1 +kerning first=346 second=218 amount=-1 +kerning first=87 second=81 amount=-1 +kerning first=366 second=196 amount=-1 +kerning first=192 second=81 amount=-1 +kerning first=87 second=288 amount=-1 +kerning first=192 second=288 amount=-1 +kerning first=222 second=196 amount=-1 +kerning first=230 second=104 amount=-1 +kerning first=264 second=81 amount=-1 +kerning first=374 second=277 amount=-1 +kerning first=260 second=219 amount=-1 +kerning first=66 second=323 amount=-1 +kerning first=260 second=89 amount=-2 +kerning first=374 second=286 amount=-1 +kerning first=268 second=203 amount=-1 +kerning first=1036 second=1054 amount=-1 +kerning first=377 second=121 amount=-1 +kerning first=374 second=256 amount=-2 +kerning first=346 second=217 amount=-1 +kerning first=103 second=351 amount=-1 +kerning first=211 second=196 amount=-1 +kerning first=311 second=283 amount=-1 +kerning first=45 second=370 amount=-1 +kerning first=364 second=228 amount=-1 +kerning first=70 second=196 amount=-1 +kerning first=346 second=75 amount=-1 +kerning first=376 second=224 amount=-1 +kerning first=376 second=194 amount=-2 +kerning first=83 second=89 amount=-1 +kerning first=220 second=228 amount=-1 +kerning first=82 second=111 amount=-1 +kerning first=255 second=277 amount=-1 +kerning first=194 second=354 amount=-2 +kerning first=304 second=224 amount=-1 +kerning first=346 second=86 amount=-1 +kerning first=377 second=252 amount=-1 +kerning first=83 second=220 amount=-1 +kerning first=353 second=347 amount=-1 +kerning first=221 second=71 amount=-1 +kerning first=225 second=8221 amount=-1 +kerning first=118 second=246 amount=-1 +kerning first=338 second=103 amount=-1 +kerning first=317 second=368 amount=-1 +kerning first=374 second=103 amount=-1 +kerning first=86 second=336 amount=-1 +kerning first=192 second=8217 amount=-1 +kerning first=266 second=103 amount=-1 +kerning first=82 second=246 amount=-1 +kerning first=302 second=103 amount=-1 +kerning first=369 second=8221 amount=-1 +kerning first=354 second=8250 amount=-1 +kerning first=194 second=103 amount=-1 +kerning first=230 second=103 amount=-1 +kerning first=350 second=291 amount=-1 +kerning first=120 second=171 amount=-1 +kerning first=260 second=220 amount=-1 +kerning first=249 second=316 amount=-1 +kerning first=84 second=171 amount=-1 +kerning first=381 second=287 amount=-1 +kerning first=264 second=211 amount=-1 +kerning first=353 second=118 amount=-1 +kerning first=8250 second=260 amount=-1 +kerning first=192 second=211 amount=-1 +kerning first=364 second=97 amount=-1 +kerning first=253 second=232 amount=-1 +kerning first=8250 second=86 amount=-1 +kerning first=346 second=315 amount=-1 +kerning first=65 second=350 amount=-1 +kerning first=218 second=74 amount=-1 +kerning first=260 second=67 amount=-1 +kerning first=317 second=118 amount=-1 +kerning first=363 second=255 amount=-1 +kerning first=362 second=74 amount=-1 +kerning first=366 second=44 amount=-1 +kerning first=87 second=211 amount=-1 +kerning first=82 second=366 amount=-1 +kerning first=379 second=8249 amount=-1 +kerning first=86 second=216 amount=-1 +kerning first=8216 second=283 amount=-1 +kerning first=187 second=366 amount=-1 +kerning first=222 second=44 amount=-1 +kerning first=205 second=257 amount=-1 +kerning first=45 second=120 amount=-1 +kerning first=72 second=8249 amount=-1 +kerning first=84 second=193 amount=-2 +kerning first=356 second=267 amount=-1 +kerning first=89 second=234 amount=-1 +kerning first=350 second=209 amount=-1 +kerning first=268 second=72 amount=-1 +kerning first=104 second=118 amount=-1 +kerning first=374 second=234 amount=-1 +kerning first=1043 second=1108 amount=-1 +kerning first=195 second=251 amount=-1 +kerning first=350 second=78 amount=-1 +kerning first=286 second=192 amount=-1 +kerning first=83 second=198 amount=-1 +kerning first=87 second=331 amount=-1 +kerning first=66 second=302 amount=-1 +kerning first=90 second=251 amount=-1 +kerning first=356 second=245 amount=-1 +kerning first=268 second=315 amount=-1 +kerning first=323 second=361 amount=-1 +kerning first=231 second=318 amount=-1 +kerning first=214 second=192 amount=-1 +kerning first=256 second=250 amount=-1 +kerning first=368 second=198 amount=-1 +kerning first=107 second=245 amount=-1 +kerning first=332 second=198 amount=-1 +kerning first=1059 second=1074 amount=-1 +kerning first=66 second=378 amount=-1 +kerning first=1090 second=1113 amount=-1 +kerning first=1050 second=1073 amount=-1 +kerning first=209 second=227 amount=-1 +kerning first=82 second=268 amount=-1 +kerning first=89 second=256 amount=-2 +kerning first=369 second=291 amount=-1 +kerning first=87 second=233 amount=-1 +kerning first=115 second=119 amount=-1 +kerning first=78 second=287 amount=-1 +kerning first=328 second=119 amount=-1 +kerning first=315 second=378 amount=-1 +kerning first=256 second=119 amount=-1 +kerning first=84 second=291 amount=-1 +kerning first=222 second=256 amount=-1 +kerning first=67 second=198 amount=-1 +kerning first=74 second=227 amount=-1 +kerning first=344 second=314 amount=-1 +kerning first=89 second=337 amount=-1 +kerning first=45 second=256 amount=-1 +kerning first=208 second=198 amount=-1 +kerning first=81 second=256 amount=-1 +kerning first=377 second=291 amount=-1 +kerning first=321 second=90 amount=-1 +kerning first=352 second=198 amount=-1 +kerning first=269 second=291 amount=-1 +kerning first=233 second=291 amount=-1 +kerning first=197 second=291 amount=-1 +kerning first=82 second=244 amount=-1 +kerning first=8250 second=278 amount=-1 +kerning first=118 second=244 amount=-1 +kerning first=288 second=44 amount=-1 +kerning first=84 second=210 amount=-1 +kerning first=346 second=354 amount=-1 +kerning first=86 second=378 amount=-1 +kerning first=111 second=44 amount=-1 +kerning first=253 second=101 amount=-1 +kerning first=344 second=84 amount=-1 +kerning first=289 second=318 amount=-1 +kerning first=1050 second=1095 amount=-1 +kerning first=323 second=227 amount=-1 +kerning first=366 second=256 amount=-1 +kerning first=287 second=227 amount=-1 +kerning first=86 second=8250 amount=-1 +kerning first=111 second=108 amount=-1 +kerning first=262 second=203 amount=-1 +kerning first=8222 second=356 amount=-2 +kerning first=199 second=336 amount=-1 +kerning first=87 second=228 amount=-1 +kerning first=187 second=73 amount=-1 +kerning first=290 second=89 amount=-1 +kerning first=252 second=108 amount=-1 +kerning first=381 second=361 amount=-1 +kerning first=81 second=197 amount=-1 +kerning first=45 second=197 amount=-1 +kerning first=221 second=263 amount=-1 +kerning first=266 second=278 amount=-1 +kerning first=65 second=286 amount=-1 +kerning first=222 second=197 amount=-1 +kerning first=1088 second=1076 amount=-1 +kerning first=73 second=367 amount=-1 +kerning first=316 second=106 amount=-1 +kerning first=8250 second=196 amount=-1 +kerning first=366 second=197 amount=-1 +kerning first=262 second=262 amount=-1 +kerning first=193 second=221 amount=-2 +kerning first=375 second=246 amount=-1 +kerning first=72 second=261 amount=-1 +kerning first=303 second=246 amount=-1 +kerning first=196 second=8249 amount=-1 +kerning first=304 second=8249 amount=-1 +kerning first=268 second=8249 amount=-1 +kerning first=8220 second=230 amount=-1 +kerning first=70 second=65 amount=-1 +kerning first=84 second=289 amount=-1 +kerning first=266 second=194 amount=-1 +kerning first=374 second=194 amount=-2 +kerning first=211 second=65 amount=-1 +kerning first=83 second=237 amount=-1 +kerning first=313 second=8220 amount=-1 +kerning first=369 second=289 amount=-1 +kerning first=86 second=260 amount=-2 +kerning first=70 second=45 amount=-1 +kerning first=88 second=338 amount=-1 +kerning first=89 second=194 amount=-2 +kerning first=89 second=8249 amount=-1 +kerning first=356 second=97 amount=-1 +kerning first=256 second=211 amount=-1 +kerning first=45 second=287 amount=-1 +kerning first=84 second=353 amount=-1 +kerning first=120 second=353 amount=-1 +kerning first=335 second=255 amount=-1 +kerning first=321 second=374 amount=-1 +kerning first=263 second=255 amount=-1 +kerning first=86 second=240 amount=-1 +kerning first=227 second=255 amount=-1 +kerning first=86 second=255 amount=-1 +kerning first=71 second=374 amount=-1 +kerning first=104 second=8221 amount=-1 +kerning first=371 second=240 amount=-1 +kerning first=8220 second=198 amount=-2 +kerning first=350 second=76 amount=-1 +kerning first=83 second=46 amount=-1 +kerning first=121 second=225 amount=-1 +kerning first=119 second=46 amount=-1 +kerning first=258 second=8217 amount=-1 +kerning first=332 second=46 amount=-1 +kerning first=368 second=46 amount=-1 +kerning first=8220 second=232 amount=-1 +kerning first=351 second=121 amount=-1 +kerning first=354 second=44 amount=-1 +kerning first=268 second=323 amount=-1 +kerning first=45 second=310 amount=-1 +kerning first=364 second=226 amount=-1 +kerning first=1046 second=1104 amount=-1 +kerning first=207 second=225 amount=-1 +kerning first=66 second=225 amount=-1 +kerning first=222 second=192 amount=-1 +kerning first=207 second=259 amount=-1 +kerning first=379 second=289 amount=-1 +kerning first=45 second=192 amount=-1 +kerning first=221 second=224 amount=-1 +kerning first=81 second=192 amount=-1 +kerning first=330 second=224 amount=-1 +kerning first=256 second=290 amount=-1 +kerning first=244 second=375 amount=-1 +kerning first=192 second=213 amount=-1 +kerning first=316 second=375 amount=-1 +kerning first=87 second=213 amount=-1 +kerning first=213 second=46 amount=-1 +kerning first=187 second=204 amount=-1 +kerning first=8217 second=337 amount=-1 +kerning first=266 second=317 amount=-1 +kerning first=195 second=369 amount=-1 +kerning first=90 second=369 amount=-1 +kerning first=262 second=282 amount=-1 +kerning first=82 second=288 amount=-1 +kerning first=346 second=221 amount=-1 +kerning first=354 second=111 amount=-1 +kerning first=85 second=287 amount=-1 +kerning first=1070 second=1051 amount=-1 +kerning first=121 second=287 amount=-1 +kerning first=233 second=311 amount=-1 +kerning first=119 second=316 amount=-1 +kerning first=218 second=225 amount=-1 +kerning first=362 second=225 amount=-1 +kerning first=1043 second=1086 amount=-1 +kerning first=370 second=287 amount=-1 +kerning first=262 second=287 amount=-1 +kerning first=298 second=287 amount=-1 +kerning first=376 second=259 amount=-1 +kerning first=266 second=352 amount=-1 +kerning first=192 second=351 amount=-1 +kerning first=219 second=194 amount=-1 +kerning first=374 second=352 amount=-1 +kerning first=87 second=351 amount=-1 +kerning first=89 second=352 amount=-1 +kerning first=314 second=8217 amount=-1 +kerning first=66 second=74 amount=-1 +kerning first=194 second=352 amount=-1 +kerning first=303 second=231 amount=-1 +kerning first=264 second=327 amount=-1 +kerning first=1050 second=1038 amount=-1 +kerning first=120 second=254 amount=-1 +kerning first=118 second=269 amount=-1 +kerning first=82 second=269 amount=-1 +kerning first=120 second=261 amount=-1 +kerning first=315 second=84 amount=-1 +kerning first=8250 second=255 amount=-1 +kerning first=244 second=121 amount=-1 +kerning first=346 second=374 amount=-1 +kerning first=86 second=196 amount=-2 +kerning first=118 second=229 amount=-1 +kerning first=1059 second=1085 amount=-1 +kerning first=287 second=115 amount=-1 +kerning first=375 second=231 amount=-1 +kerning first=363 second=253 amount=-1 +kerning first=258 second=212 amount=-1 +kerning first=195 second=350 amount=-1 +kerning first=86 second=334 amount=-1 +kerning first=65 second=347 amount=-1 +kerning first=65 second=8217 amount=-1 +kerning first=253 second=228 amount=-1 +kerning first=217 second=228 amount=-1 +kerning first=232 second=318 amount=-1 +kerning first=325 second=228 amount=-1 +kerning first=374 second=214 amount=-1 +kerning first=195 second=266 amount=-1 +kerning first=289 second=228 amount=-1 +kerning first=354 second=199 amount=-1 +kerning first=219 second=287 amount=-1 +kerning first=266 second=214 amount=-1 +kerning first=264 second=332 amount=-1 +kerning first=192 second=332 amount=-1 +kerning first=67 second=344 amount=-1 +kerning first=66 second=382 amount=-1 +kerning first=256 second=251 amount=-1 +kerning first=313 second=103 amount=-1 +kerning first=104 second=171 amount=-1 +kerning first=350 second=330 amount=-1 +kerning first=82 second=8217 amount=-1 +kerning first=196 second=362 amount=-1 +kerning first=209 second=171 amount=-1 +kerning first=277 second=103 amount=-1 +kerning first=194 second=214 amount=-1 +kerning first=205 second=103 amount=-1 +kerning first=317 second=8221 amount=-1 +kerning first=65 second=365 amount=-1 +kerning first=104 second=119 amount=-1 +kerning first=353 second=119 amount=-1 +kerning first=225 second=118 amount=-1 +kerning first=199 second=380 amount=-1 +kerning first=261 second=118 amount=-1 +kerning first=379 second=45 amount=-1 +kerning first=1040 second=1063 amount=-1 +kerning first=317 second=119 amount=-1 +kerning first=379 second=380 amount=-1 +kerning first=83 second=202 amount=-1 +kerning first=84 second=118 amount=-1 +kerning first=283 second=104 amount=-1 +kerning first=221 second=246 amount=-1 +kerning first=253 second=233 amount=-1 +kerning first=199 second=67 amount=-1 +kerning first=354 second=113 amount=-1 +kerning first=321 second=217 amount=-1 +kerning first=8250 second=354 amount=-1 +kerning first=369 second=118 amount=-1 +kerning first=369 second=314 amount=-1 +kerning first=333 second=314 amount=-1 +kerning first=45 second=315 amount=-1 +kerning first=369 second=8220 amount=-1 +kerning first=315 second=382 amount=-1 +kerning first=242 second=120 amount=-1 +kerning first=87 second=248 amount=-1 +kerning first=225 second=8220 amount=-1 +kerning first=82 second=264 amount=-1 +kerning first=376 second=283 amount=-1 +kerning first=261 second=8220 amount=-1 +kerning first=89 second=377 amount=-1 +kerning first=66 second=69 amount=-1 +kerning first=45 second=296 amount=-1 +kerning first=347 second=347 amount=-1 +kerning first=346 second=85 amount=-1 +kerning first=87 second=193 amount=-2 +kerning first=109 second=118 amount=-1 +kerning first=260 second=8217 amount=-1 +kerning first=66 second=332 amount=-1 +kerning first=264 second=193 amount=-1 +kerning first=1038 second=1117 amount=-1 +kerning first=260 second=85 amount=-1 +kerning first=195 second=8221 amount=-1 +kerning first=231 second=237 amount=-1 +kerning first=354 second=257 amount=-1 +kerning first=258 second=216 amount=-1 +kerning first=83 second=85 amount=-1 +kerning first=86 second=44 amount=-1 +kerning first=374 second=377 amount=-1 +kerning first=255 second=273 amount=-1 +kerning first=211 second=197 amount=-1 +kerning first=221 second=8249 amount=-1 +kerning first=211 second=192 amount=-1 +kerning first=70 second=197 amount=-1 +kerning first=279 second=287 amount=-1 +kerning first=120 second=250 amount=-1 +kerning first=70 second=192 amount=-1 +kerning first=321 second=289 amount=-1 +kerning first=1036 second=1077 amount=-1 +kerning first=336 second=193 amount=-1 +kerning first=44 second=8249 amount=-1 +kerning first=86 second=279 amount=-1 +kerning first=219 second=198 amount=-1 +kerning first=86 second=338 amount=-1 +kerning first=66 second=298 amount=-1 +kerning first=366 second=291 amount=-1 +kerning first=1024 second=1038 amount=-1 +kerning first=330 second=291 amount=-1 +kerning first=1060 second=1038 amount=-1 +kerning first=258 second=291 amount=-1 +kerning first=117 second=291 amount=-1 +kerning first=365 second=318 amount=-1 +kerning first=232 second=107 amount=-1 +kerning first=216 second=260 amount=-1 +kerning first=272 second=65 amount=-1 +kerning first=213 second=197 amount=-1 +kerning first=371 second=279 amount=-1 +kerning first=87 second=268 amount=-1 +kerning first=335 second=44 amount=-1 +kerning first=8220 second=271 amount=-1 +kerning first=221 second=67 amount=-1 +kerning first=288 second=260 amount=-1 +kerning first=263 second=44 amount=-1 +kerning first=199 second=72 amount=-1 +kerning first=196 second=199 amount=-1 +kerning first=376 second=113 amount=-1 +kerning first=204 second=227 amount=-1 +kerning first=268 second=199 amount=-1 +kerning first=264 second=268 amount=-1 +kerning first=8222 second=87 amount=-2 +kerning first=99 second=227 amount=-1 +kerning first=192 second=268 amount=-1 +kerning first=376 second=199 amount=-1 +kerning first=368 second=261 amount=-1 +kerning first=346 second=105 amount=-1 +kerning first=83 second=374 amount=-1 +kerning first=67 second=212 amount=-1 +kerning first=296 second=261 amount=-1 +kerning first=352 second=66 amount=-1 +kerning first=1043 second=1105 amount=-1 +kerning first=231 second=226 amount=-1 +kerning first=277 second=108 amount=-1 +kerning first=195 second=286 amount=-1 +kerning first=267 second=226 amount=-1 +kerning first=296 second=291 amount=-1 +kerning first=375 second=226 amount=-1 +kerning first=67 second=317 amount=-1 +kerning first=8216 second=271 amount=-1 +kerning first=344 second=98 amount=-1 +kerning first=356 second=44 amount=-1 +kerning first=205 second=229 amount=-1 +kerning first=264 second=122 amount=-1 +kerning first=8218 second=85 amount=-1 +kerning first=187 second=205 amount=-1 +kerning first=8250 second=220 amount=-1 +kerning first=87 second=122 amount=-1 +kerning first=119 second=261 amount=-1 +kerning first=121 second=115 amount=-1 +kerning first=8216 second=227 amount=-1 +kerning first=354 second=224 amount=-1 +kerning first=260 second=356 amount=-2 +kerning first=118 second=97 amount=-1 +kerning first=262 second=77 amount=-1 +kerning first=8250 second=378 amount=-1 +kerning first=350 second=310 amount=-1 +kerning first=371 second=339 amount=-1 +kerning first=77 second=225 amount=-1 +kerning first=380 second=45 amount=-1 +kerning first=66 second=206 amount=-1 +kerning first=236 second=45 amount=-1 +kerning first=252 second=255 amount=-1 +kerning first=221 second=243 amount=-1 +kerning first=82 second=368 amount=-1 +kerning first=350 second=325 amount=-1 +kerning first=187 second=89 amount=-1 +kerning first=344 second=45 amount=-1 +kerning first=187 second=368 amount=-1 +kerning first=75 second=255 amount=-1 +kerning first=195 second=211 amount=-1 +kerning first=323 second=287 amount=-1 +kerning first=111 second=255 amount=-1 +kerning first=8222 second=118 amount=-1 +kerning first=251 second=287 amount=-1 +kerning first=260 second=374 amount=-2 +kerning first=74 second=287 amount=-1 +kerning first=344 second=104 amount=-1 +kerning first=235 second=121 amount=-1 +kerning first=195 second=8217 amount=-1 +kerning first=199 second=202 amount=-1 +kerning first=284 second=46 amount=-1 +kerning first=66 second=109 amount=-1 +kerning first=119 second=380 amount=-1 +kerning first=368 second=380 amount=-1 +kerning first=221 second=111 amount=-1 +kerning first=311 second=248 amount=-1 +kerning first=356 second=264 amount=-1 +kerning first=311 second=233 amount=-1 +kerning first=89 second=253 amount=-1 +kerning first=220 second=350 amount=-1 +kerning first=362 second=382 amount=-1 +kerning first=256 second=350 amount=-1 +kerning first=194 second=253 amount=-1 +kerning first=268 second=69 amount=-1 +kerning first=376 second=74 amount=-1 +kerning first=364 second=350 amount=-1 +kerning first=230 second=253 amount=-1 +kerning first=86 second=339 amount=-1 +kerning first=187 second=374 amount=-1 +kerning first=107 second=269 amount=-1 +kerning first=1036 second=1057 amount=-1 +kerning first=374 second=253 amount=-1 +kerning first=376 second=243 amount=-1 +kerning first=352 second=218 amount=-1 +kerning first=356 second=269 amount=-1 +kerning first=310 second=334 amount=-1 +kerning first=260 second=338 amount=-1 +kerning first=200 second=289 amount=-1 +kerning first=236 second=289 amount=-1 +kerning first=197 second=375 amount=-1 +kerning first=344 second=289 amount=-1 +kerning first=262 second=207 amount=-1 +kerning first=197 second=212 amount=-1 +kerning first=209 second=251 amount=-1 +kerning first=83 second=70 amount=-1 +kerning first=8220 second=65 amount=-2 +kerning first=263 second=289 amount=-1 +kerning first=206 second=369 amount=-1 +kerning first=8220 second=256 amount=-2 +kerning first=65 second=369 amount=-1 +kerning first=120 second=98 amount=-1 +kerning first=352 second=370 amount=-1 +kerning first=346 second=46 amount=-1 +kerning first=66 second=201 amount=-1 +kerning first=377 second=375 amount=-1 +kerning first=311 second=263 amount=-1 +kerning first=117 second=121 amount=-1 +kerning first=257 second=8220 amount=-1 +kerning first=363 second=119 amount=-1 +kerning first=233 second=375 amount=-1 +kerning first=356 second=346 amount=-1 +kerning first=269 second=375 amount=-1 +kerning first=65 second=81 amount=-1 +kerning first=221 second=259 amount=-1 +kerning first=234 second=119 amount=-1 +kerning first=193 second=89 amount=-2 +kerning first=83 second=217 amount=-1 +kerning first=283 second=291 amount=-1 +kerning first=352 second=256 amount=-1 +kerning first=260 second=217 amount=-1 +kerning first=106 second=291 amount=-1 +kerning first=1042 second=1093 amount=-1 +kerning first=70 second=291 amount=-1 +kerning first=268 second=298 amount=-1 +kerning first=208 second=256 amount=-1 +kerning first=354 second=187 amount=-1 +kerning first=250 second=314 amount=-1 +kerning first=347 second=351 amount=-1 +kerning first=67 second=256 amount=-1 +kerning first=363 second=121 amount=-1 +kerning first=84 second=326 amount=-1 +kerning first=187 second=344 amount=-1 +kerning first=344 second=8220 amount=-1 +kerning first=354 second=263 amount=-1 +kerning first=216 second=196 amount=-1 +kerning first=119 second=277 amount=-1 +kerning first=288 second=196 amount=-1 +kerning first=221 second=199 amount=-1 +kerning first=8217 second=352 amount=-1 +kerning first=352 second=82 amount=-1 +kerning first=288 second=84 amount=-1 +kerning first=206 second=228 amount=-1 +kerning first=321 second=85 amount=-1 +kerning first=344 second=333 amount=-1 +kerning first=197 second=86 amount=-2 +kerning first=86 second=235 amount=-1 +kerning first=84 second=234 amount=-1 +kerning first=218 second=382 amount=-1 +kerning first=75 second=119 amount=-1 +kerning first=87 second=83 amount=-1 +kerning first=346 second=220 amount=-1 +kerning first=235 second=316 amount=-1 +kerning first=192 second=83 amount=-1 +kerning first=266 second=68 amount=-1 +kerning first=264 second=83 amount=-1 +kerning first=256 second=171 amount=-1 +kerning first=220 second=171 amount=-1 +kerning first=328 second=171 amount=-1 +kerning first=352 second=278 amount=-1 +kerning first=266 second=313 amount=-1 +kerning first=262 second=71 amount=-1 +kerning first=192 second=252 amount=-1 +kerning first=364 second=171 amount=-1 +kerning first=272 second=197 amount=-1 +kerning first=252 second=103 amount=-1 +kerning first=1038 second=1051 amount=-1 +kerning first=1061 second=1077 amount=-1 +kerning first=288 second=103 amount=-1 +kerning first=328 second=8221 amount=-1 +kerning first=325 second=365 amount=-1 +kerning first=88 second=71 amount=-1 +kerning first=346 second=103 amount=-1 +kerning first=67 second=214 amount=-1 +kerning first=253 second=246 amount=-1 +kerning first=344 second=100 amount=-1 +kerning first=202 second=103 amount=-1 +kerning first=8216 second=225 amount=-1 +kerning first=84 second=65 amount=-2 +kerning first=67 second=315 amount=-1 +kerning first=1036 second=1090 amount=-1 +kerning first=1102 second=1076 amount=-1 +kerning first=381 second=249 amount=-1 +kerning first=210 second=194 amount=-1 +kerning first=194 second=220 amount=-1 +kerning first=356 second=284 amount=-1 +kerning first=298 second=117 amount=-1 +kerning first=90 second=171 amount=-1 +kerning first=256 second=365 amount=-1 +kerning first=1036 second=1063 amount=-1 +kerning first=66 second=199 amount=-1 +kerning first=195 second=171 amount=-1 +kerning first=354 second=281 amount=-1 +kerning first=1059 second=1047 amount=-1 +kerning first=375 second=171 amount=-1 +kerning first=196 second=89 amount=-2 +kerning first=313 second=121 amount=-1 +kerning first=277 second=121 amount=-1 +kerning first=354 second=382 amount=-1 +kerning first=197 second=216 amount=-1 +kerning first=314 second=8221 amount=-1 +kerning first=313 second=218 amount=-1 +kerning first=275 second=118 amount=-1 +kerning first=315 second=364 amount=-1 +kerning first=79 second=260 amount=-1 +kerning first=347 second=118 amount=-1 +kerning first=269 second=228 amount=-1 +kerning first=65 second=8221 amount=-1 +kerning first=365 second=316 amount=-1 +kerning first=233 second=104 amount=-1 +kerning first=352 second=315 amount=-1 +kerning first=68 second=197 amount=-1 +kerning first=344 second=234 amount=-1 +kerning first=1059 second=1089 amount=-1 +kerning first=73 second=250 amount=-1 +kerning first=221 second=290 amount=-1 +kerning first=194 second=86 amount=-2 +kerning first=8220 second=335 amount=-1 +kerning first=315 second=87 amount=-1 +kerning first=253 second=347 amount=-1 +kerning first=8220 second=337 amount=-1 +kerning first=1060 second=1040 amount=-1 +kerning first=8217 second=240 amount=-1 +kerning first=284 second=65 amount=-1 +kerning first=221 second=380 amount=-1 +kerning first=86 second=90 amount=-1 +kerning first=258 second=84 amount=-2 +kerning first=266 second=198 amount=-1 +kerning first=67 second=192 amount=-1 +kerning first=374 second=44 amount=-1 +kerning first=8216 second=193 amount=-2 +kerning first=374 second=198 amount=-2 +kerning first=218 second=8249 amount=-1 +kerning first=90 second=363 amount=-1 +kerning first=195 second=363 amount=-1 +kerning first=199 second=204 amount=-1 +kerning first=376 second=67 amount=-1 +kerning first=363 second=291 amount=-1 +kerning first=327 second=291 amount=-1 +kerning first=268 second=67 amount=-1 +kerning first=302 second=250 amount=-1 +kerning first=255 second=291 amount=-1 +kerning first=219 second=291 amount=-1 +kerning first=8250 second=200 amount=-1 +kerning first=78 second=291 amount=-1 +kerning first=321 second=378 amount=-1 +kerning first=8222 second=364 amount=-1 +kerning first=196 second=67 amount=-1 +kerning first=89 second=113 amount=-1 +kerning first=8222 second=217 amount=-1 +kerning first=230 second=44 amount=-1 +kerning first=83 second=72 amount=-1 +kerning first=204 second=287 amount=-1 +kerning first=99 second=287 amount=-1 +kerning first=381 second=8249 amount=-1 +kerning first=192 second=367 amount=-1 +kerning first=8250 second=103 amount=-1 +kerning first=230 second=108 amount=-1 +kerning first=8217 second=260 amount=-2 +kerning first=356 second=326 amount=-1 +kerning first=256 second=286 amount=-1 +kerning first=80 second=74 amount=-1 +kerning first=221 second=74 amount=-1 +kerning first=66 second=221 amount=-1 +kerning first=171 second=221 amount=-1 +kerning first=73 second=228 amount=-1 +kerning first=356 second=262 amount=-1 +kerning first=89 second=262 amount=-1 +kerning first=326 second=8249 amount=-1 +kerning first=290 second=8249 amount=-1 +kerning first=205 second=289 amount=-1 +kerning first=362 second=8249 amount=-1 +kerning first=235 second=107 amount=-1 +kerning first=8250 second=68 amount=-1 +kerning first=108 second=8221 amount=-1 +kerning first=195 second=264 amount=-1 +kerning first=283 second=289 amount=-1 +kerning first=325 second=367 amount=-1 +kerning first=193 second=115 amount=-1 +kerning first=352 second=86 amount=-1 +kerning first=266 second=66 amount=-1 +kerning first=85 second=97 amount=-1 +kerning first=321 second=356 amount=-1 +kerning first=121 second=97 amount=-1 +kerning first=84 second=45 amount=-1 +kerning first=120 second=45 amount=-1 +kerning first=298 second=97 amount=-1 +kerning first=354 second=261 amount=-1 +kerning first=378 second=112 amount=-1 +kerning first=115 second=121 amount=-1 +kerning first=362 second=257 amount=-1 +kerning first=8250 second=202 amount=-1 +kerning first=8217 second=196 amount=-2 +kerning first=321 second=255 amount=-1 +kerning first=82 second=119 amount=-1 +kerning first=108 second=255 amount=-1 +kerning first=206 second=226 amount=-1 +kerning first=291 second=44 amount=-1 +kerning first=195 second=81 amount=-1 +kerning first=255 second=44 amount=-1 +kerning first=356 second=227 amount=-1 +kerning first=259 second=119 amount=-1 +kerning first=187 second=119 amount=-1 +kerning first=367 second=119 amount=-1 +kerning first=370 second=97 amount=-1 +kerning first=275 second=314 amount=-1 +kerning first=376 second=109 amount=-1 +kerning first=376 second=111 amount=-1 +kerning first=295 second=119 amount=-1 +kerning first=331 second=119 amount=-1 +kerning first=98 second=314 amount=-1 +kerning first=302 second=291 amount=-1 +kerning first=303 second=233 amount=-1 +kerning first=264 second=76 amount=-1 +kerning first=256 second=363 amount=-1 +kerning first=1025 second=1038 amount=-1 +kerning first=1061 second=1057 amount=-1 +kerning first=335 second=46 amount=-1 +kerning first=205 second=251 amount=-1 +kerning first=66 second=241 amount=-1 +kerning first=114 second=44 amount=-1 +kerning first=354 second=338 amount=-1 +kerning first=82 second=79 amount=-1 +kerning first=219 second=44 amount=-1 +kerning first=352 second=192 amount=-1 +kerning first=8216 second=287 amount=-1 +kerning first=70 second=289 amount=-1 +kerning first=208 second=192 amount=-1 +kerning first=106 second=289 amount=-1 +kerning first=8250 second=90 amount=-1 +kerning first=83 second=354 amount=-1 +kerning first=86 second=46 amount=-1 +kerning first=283 second=311 amount=-1 +kerning first=260 second=354 amount=-2 +kerning first=325 second=369 amount=-1 +kerning first=354 second=283 amount=-1 +kerning first=375 second=46 amount=-1 +kerning first=65 second=213 amount=-1 +kerning first=246 second=316 amount=-1 +kerning first=1050 second=1077 amount=-1 +kerning first=99 second=291 amount=-1 +kerning first=84 second=197 amount=-2 +kerning first=8217 second=198 amount=-2 +kerning first=217 second=83 amount=-1 +kerning first=354 second=259 amount=-1 +kerning first=259 second=8220 amount=-1 +kerning first=258 second=375 amount=-1 +kerning first=225 second=8217 amount=-1 +kerning first=117 second=375 amount=-1 +kerning first=196 second=87 amount=-2 +kerning first=206 second=225 amount=-1 +kerning first=263 second=103 amount=-1 +kerning first=221 second=336 amount=-1 +kerning first=8220 second=192 amount=-2 +kerning first=233 second=121 amount=-1 +kerning first=86 second=103 amount=-1 +kerning first=350 second=270 amount=-1 +kerning first=1061 second=1092 amount=-1 +kerning first=255 second=335 amount=-1 +kerning first=256 second=8217 amount=-1 +kerning first=288 second=374 amount=-1 +kerning first=328 second=8217 amount=-1 +kerning first=214 second=65 amount=-1 +kerning first=315 second=219 amount=-1 +kerning first=286 second=65 amount=-1 +kerning first=66 second=219 amount=-1 +kerning first=8216 second=113 amount=-1 +kerning first=313 second=253 amount=-1 +kerning first=258 second=353 amount=-1 +kerning first=277 second=253 amount=-1 +kerning first=67 second=284 amount=-1 +kerning first=344 second=212 amount=-1 +kerning first=374 second=121 amount=-1 +kerning first=89 second=260 amount=-2 +kerning first=1047 second=1059 amount=-1 +kerning first=194 second=121 amount=-1 +kerning first=356 second=328 amount=-1 +kerning first=254 second=318 amount=-1 +kerning first=374 second=260 amount=-2 +kerning first=266 second=196 amount=-1 +kerning first=119 second=235 amount=-1 +kerning first=111 second=121 amount=-1 +kerning first=89 second=196 amount=-2 +kerning first=232 second=316 amount=-1 +kerning first=315 second=89 amount=-1 +kerning first=86 second=242 amount=-1 +kerning first=65 second=171 amount=-1 +kerning first=107 second=99 amount=-1 +kerning first=89 second=382 amount=-1 +kerning first=205 second=117 amount=-1 +kerning first=171 second=89 amount=-1 +kerning first=374 second=196 amount=-2 +kerning first=66 second=89 amount=-1 +kerning first=206 second=171 amount=-1 +kerning first=262 second=302 amount=-1 +kerning first=356 second=99 amount=-1 +kerning first=376 second=263 amount=-1 +kerning first=256 second=213 amount=-1 +kerning first=344 second=375 amount=-1 +kerning first=290 second=221 amount=-1 +kerning first=199 second=323 amount=-1 +kerning first=371 second=242 amount=-1 +kerning first=8250 second=374 amount=-1 +kerning first=84 second=351 amount=-1 +kerning first=120 second=351 amount=-1 +kerning first=45 second=82 amount=-1 +kerning first=87 second=347 amount=-1 +kerning first=119 second=224 amount=-1 +kerning first=192 second=347 amount=-1 +kerning first=321 second=103 amount=-1 +kerning first=98 second=120 amount=-1 +kerning first=102 second=8249 amount=-1 +kerning first=256 second=266 amount=-1 +kerning first=86 second=253 amount=-1 +kerning first=66 second=8249 amount=-1 +kerning first=227 second=253 amount=-1 +kerning first=313 second=220 amount=-1 +kerning first=199 second=334 amount=-1 +kerning first=72 second=103 amount=-1 +kerning first=263 second=253 amount=-1 +kerning first=108 second=103 amount=-1 +kerning first=197 second=214 amount=-1 +kerning first=335 second=253 amount=-1 +kerning first=296 second=224 amount=-1 +kerning first=321 second=354 amount=-1 +kerning first=368 second=224 amount=-1 +kerning first=344 second=232 amount=-1 +kerning first=352 second=313 amount=-1 +kerning first=118 second=231 amount=-1 +kerning first=350 second=171 amount=-1 +kerning first=346 second=202 amount=-1 +kerning first=66 second=362 amount=-1 +kerning first=221 second=382 amount=-1 +kerning first=90 second=365 amount=-1 +kerning first=315 second=362 amount=-1 +kerning first=67 second=313 amount=-1 +kerning first=219 second=227 amount=-1 +kerning first=195 second=365 amount=-1 +kerning first=323 second=117 amount=-1 +kerning first=368 second=257 amount=-1 +kerning first=97 second=255 amount=-1 +kerning first=296 second=257 amount=-1 +kerning first=376 second=338 amount=-1 +kerning first=193 second=287 amount=-1 +kerning first=196 second=338 amount=-1 +kerning first=268 second=338 amount=-1 +kerning first=87 second=118 amount=-1 +kerning first=76 second=8221 amount=-1 +kerning first=368 second=378 amount=-1 +kerning first=192 second=118 amount=-1 +kerning first=187 second=209 amount=-1 +kerning first=228 second=118 amount=-1 +kerning first=8217 second=339 amount=-1 +kerning first=119 second=257 amount=-1 +kerning first=195 second=290 amount=-1 +kerning first=371 second=275 amount=-1 +kerning first=377 second=382 amount=-1 +kerning first=350 second=193 amount=-1 +kerning first=121 second=269 amount=-1 +kerning first=364 second=380 amount=-1 +kerning first=249 second=253 amount=-1 +kerning first=121 second=227 amount=-1 +kerning first=85 second=227 amount=-1 +kerning first=197 second=84 amount=-2 +kerning first=1061 second=1090 amount=-1 +kerning first=1025 second=1090 amount=-1 +kerning first=121 second=273 amount=-1 +kerning first=352 second=291 amount=-1 +kerning first=344 second=210 amount=-1 +kerning first=83 second=204 amount=-1 +kerning first=316 second=291 amount=-1 +kerning first=280 second=291 amount=-1 +kerning first=195 second=332 amount=-1 +kerning first=211 second=198 amount=-1 +kerning first=221 second=81 amount=-1 +kerning first=1069 second=1051 amount=-1 +kerning first=262 second=280 amount=-1 +kerning first=8250 second=352 amount=-1 +kerning first=99 second=44 amount=-1 +kerning first=262 second=73 amount=-1 +kerning first=255 second=337 amount=-1 +kerning first=211 second=256 amount=-1 +kerning first=370 second=227 amount=-1 +kerning first=119 second=378 amount=-1 +kerning first=298 second=227 amount=-1 +kerning first=277 second=44 amount=-1 +kerning first=253 second=226 amount=-1 +kerning first=217 second=226 amount=-1 +kerning first=8216 second=245 amount=-1 +kerning first=67 second=194 amount=-1 +kerning first=289 second=226 amount=-1 +kerning first=8217 second=350 amount=-1 +kerning first=352 second=84 amount=-1 +kerning first=208 second=194 amount=-1 +kerning first=374 second=240 amount=-1 +kerning first=344 second=254 amount=-1 +kerning first=356 second=119 amount=-1 +kerning first=196 second=219 amount=-1 +kerning first=291 second=108 amount=-1 +kerning first=209 second=363 amount=-1 +kerning first=8220 second=291 amount=-1 +kerning first=255 second=108 amount=-1 +kerning first=83 second=105 amount=-1 +kerning first=288 second=198 amount=-1 +kerning first=117 second=289 amount=-1 +kerning first=45 second=289 amount=-1 +kerning first=194 second=370 amount=-1 +kerning first=258 second=8220 amount=-1 +kerning first=330 second=289 amount=-1 +kerning first=119 second=279 amount=-1 +kerning first=258 second=289 amount=-1 +kerning first=275 second=104 amount=-1 +kerning first=117 second=8220 amount=-1 +kerning first=221 second=338 amount=-1 +kerning first=206 second=367 amount=-1 +kerning first=65 second=367 amount=-1 +kerning first=192 second=115 amount=-1 +kerning first=356 second=229 amount=-1 +kerning first=262 second=205 amount=-1 +kerning first=288 second=289 amount=-1 +kerning first=89 second=240 amount=-1 +kerning first=8222 second=85 amount=-1 +kerning first=65 second=83 amount=-1 +kerning first=221 second=261 amount=-1 +kerning first=73 second=45 amount=-1 +kerning first=1038 second=1060 amount=-1 +kerning first=310 second=255 amount=-1 +kerning first=352 second=194 amount=-1 +kerning first=45 second=278 amount=-1 +kerning first=286 second=45 amount=-1 +kerning first=214 second=197 amount=-1 +kerning first=353 second=112 amount=-1 +kerning first=83 second=356 amount=-1 +kerning first=74 second=225 amount=-1 +kerning first=354 second=380 amount=-1 +kerning first=256 second=81 amount=-1 +kerning first=1036 second=1092 amount=-1 +kerning first=287 second=225 amount=-1 +kerning first=194 second=218 amount=-1 +kerning first=84 second=244 amount=-1 +kerning first=221 second=109 amount=-1 +kerning first=354 second=336 amount=-1 +kerning first=323 second=225 amount=-1 +kerning first=111 second=253 amount=-1 +kerning first=104 second=8217 amount=-1 +kerning first=8216 second=267 amount=-1 +kerning first=75 second=253 amount=-1 +kerning first=253 second=248 amount=-1 +kerning first=317 second=8217 amount=-1 +kerning first=288 second=46 amount=-1 +kerning first=8217 second=245 amount=-1 +kerning first=216 second=46 amount=-1 +kerning first=193 second=364 amount=-1 +kerning first=221 second=283 amount=-1 +kerning first=268 second=382 amount=-1 +kerning first=376 second=382 amount=-1 +kerning first=66 second=71 amount=-1 +kerning first=376 second=241 amount=-1 +kerning first=66 second=318 amount=-1 +kerning first=102 second=318 amount=1 +kerning first=243 second=318 amount=-1 +kerning first=219 second=260 amount=-1 +kerning first=279 second=318 amount=-1 +kerning first=192 second=369 amount=-1 +kerning first=366 second=289 amount=-1 +kerning first=84 second=122 amount=-1 +kerning first=256 second=288 amount=-1 +kerning first=346 second=70 amount=-1 +kerning first=1038 second=1104 amount=-1 +kerning first=122 second=8249 amount=-1 +kerning first=1091 second=1076 amount=-1 +kerning first=111 second=46 amount=-1 +kerning first=118 second=99 amount=-1 +kerning first=82 second=99 amount=-1 +kerning first=73 second=230 amount=-1 +kerning first=83 second=323 amount=-1 +kerning first=283 second=375 amount=-1 +kerning first=370 second=346 amount=-1 +kerning first=255 second=271 amount=-1 +kerning first=106 second=375 amount=-1 +kerning first=262 second=346 amount=-1 +kerning first=8217 second=273 amount=-1 +kerning first=356 second=381 amount=-1 +kerning first=85 second=346 amount=-1 +kerning first=298 second=230 amount=-1 +kerning first=97 second=253 amount=-1 +kerning first=87 second=334 amount=-1 +kerning first=45 second=352 amount=-1 +kerning first=193 second=87 amount=-2 +kerning first=302 second=369 amount=-1 +kerning first=194 second=369 amount=-1 +kerning first=370 second=230 amount=-1 +kerning first=8250 second=72 amount=-1 +kerning first=362 second=346 amount=-1 +kerning first=310 second=253 amount=-1 +kerning first=379 second=363 amount=-1 +kerning first=375 second=122 amount=-1 +kerning first=72 second=224 amount=-1 +kerning first=218 second=346 amount=-1 +kerning first=333 second=375 amount=-1 +kerning first=369 second=375 amount=-1 +kerning first=264 second=334 amount=-1 +kerning first=8217 second=192 amount=-2 +kerning first=344 second=116 amount=-1 +kerning first=368 second=193 amount=-1 +kerning first=45 second=219 amount=-1 +kerning first=1069 second=1059 amount=-1 +kerning first=200 second=287 amount=-1 +kerning first=327 second=287 amount=-1 +kerning first=236 second=287 amount=-1 +kerning first=210 second=196 amount=-1 +kerning first=317 second=121 amount=-1 +kerning first=281 second=121 amount=-1 +kerning first=245 second=121 amount=-1 +kerning first=103 second=171 amount=-1 +kerning first=67 second=171 amount=-1 +kerning first=344 second=277 amount=-1 +kerning first=356 second=231 amount=-1 +kerning first=344 second=287 amount=-1 +kerning first=352 second=171 amount=-1 +kerning first=354 second=196 amount=-2 +kerning first=316 second=171 amount=-1 +kerning first=120 second=375 amount=-1 +kerning first=255 second=99 amount=-1 +kerning first=379 second=102 amount=-1 +kerning first=90 second=122 amount=-1 +kerning first=225 second=375 amount=-1 +kerning first=366 second=224 amount=-1 +kerning first=195 second=352 amount=-1 +kerning first=82 second=212 amount=-1 +kerning first=217 second=74 amount=-1 +kerning first=376 second=115 amount=-1 +kerning first=366 second=229 amount=-1 +kerning first=330 second=229 amount=-1 +kerning first=346 second=197 amount=-1 +kerning first=119 second=382 amount=-1 +kerning first=1047 second=1063 amount=-1 +kerning first=199 second=310 amount=-1 +kerning first=352 second=220 amount=-1 +kerning first=356 second=379 amount=-1 +kerning first=264 second=344 amount=-1 +kerning first=368 second=382 amount=-1 +kerning first=82 second=350 amount=-1 +kerning first=314 second=103 amount=-1 +kerning first=303 second=234 amount=-1 +kerning first=350 second=103 amount=-1 +kerning first=187 second=350 amount=-1 +kerning first=118 second=100 amount=-1 +kerning first=8217 second=271 amount=-1 +kerning first=82 second=100 amount=-1 +kerning first=75 second=71 amount=-1 +kerning first=45 second=68 amount=-1 +kerning first=88 second=199 amount=-1 +kerning first=196 second=290 amount=-1 +kerning first=120 second=365 amount=-1 +kerning first=206 second=103 amount=-1 +kerning first=193 second=199 amount=-1 +kerning first=65 second=103 amount=-1 +kerning first=113 second=106 amount=1 +kerning first=193 second=362 amount=-1 +kerning first=101 second=103 amount=-1 +kerning first=381 second=117 amount=-1 +kerning first=251 second=318 amount=-1 +kerning first=287 second=318 amount=-1 +kerning first=194 second=251 amount=-1 +kerning first=107 second=231 amount=-1 +kerning first=350 second=313 amount=-1 +kerning first=199 second=284 amount=-1 +kerning first=199 second=68 amount=-1 +kerning first=226 second=118 amount=-1 +kerning first=120 second=257 amount=-1 +kerning first=330 second=117 amount=-1 +kerning first=258 second=117 amount=-1 +kerning first=256 second=332 amount=-1 +kerning first=302 second=251 amount=-1 +kerning first=346 second=102 amount=-1 +kerning first=375 second=283 amount=-1 +kerning first=323 second=257 amount=-1 +kerning first=264 second=216 amount=-1 +kerning first=8218 second=89 amount=-2 +kerning first=369 second=316 amount=-1 +kerning first=45 second=291 amount=-1 +kerning first=303 second=283 amount=-1 +kerning first=327 second=250 amount=-1 +kerning first=65 second=264 amount=-1 +kerning first=86 second=233 amount=-1 +kerning first=1059 second=1076 amount=-1 +kerning first=346 second=72 amount=-1 +kerning first=45 second=194 amount=-1 +kerning first=195 second=362 amount=-1 +kerning first=371 second=233 amount=-1 +kerning first=376 second=266 amount=-1 +kerning first=289 second=314 amount=-1 +kerning first=253 second=314 amount=-1 +kerning first=8220 second=289 amount=-1 +kerning first=363 second=8220 amount=-1 +kerning first=268 second=266 amount=-1 +kerning first=112 second=314 amount=-1 +kerning first=45 second=298 amount=-1 +kerning first=196 second=217 amount=-1 +kerning first=8216 second=337 amount=-1 +kerning first=263 second=227 amount=-1 +kerning first=78 second=250 amount=-1 +kerning first=192 second=216 amount=-1 +kerning first=87 second=216 amount=-1 +kerning first=266 second=192 amount=-1 +kerning first=251 second=8220 amount=-1 +kerning first=291 second=378 amount=-1 +kerning first=255 second=378 amount=-1 +kerning first=78 second=224 amount=-1 +kerning first=89 second=192 amount=-2 +kerning first=219 second=378 amount=-1 +kerning first=110 second=8220 amount=-1 +kerning first=70 second=256 amount=-1 +kerning first=374 second=187 amount=-1 +kerning first=1046 second=1077 amount=-1 +kerning first=99 second=225 amount=-1 +kerning first=286 second=256 amount=-1 +kerning first=207 second=227 amount=-1 +kerning first=350 second=354 amount=-1 +kerning first=66 second=227 amount=-1 +kerning first=344 second=67 amount=-1 +kerning first=367 second=291 amount=-1 +kerning first=214 second=256 amount=-1 +kerning first=66 second=336 amount=-1 +kerning first=187 second=291 amount=-1 +kerning first=118 second=291 amount=-1 +kerning first=195 second=83 amount=-1 +kerning first=82 second=291 amount=-1 +kerning first=80 second=197 amount=-1 +kerning first=197 second=210 amount=-1 +kerning first=221 second=187 amount=-1 +kerning first=377 second=8249 amount=-1 +kerning first=221 second=197 amount=-2 +kerning first=1036 second=1060 amount=-1 +kerning first=221 second=100 amount=-1 +kerning first=8250 second=253 amount=-1 +kerning first=1038 second=1094 amount=-1 +kerning first=256 second=112 amount=-1 +kerning first=260 second=284 amount=-1 +kerning first=115 second=112 amount=-1 +kerning first=197 second=8249 amount=-1 +kerning first=118 second=261 amount=-1 +kerning first=218 second=378 amount=-1 +kerning first=73 second=365 amount=-1 +kerning first=305 second=8249 amount=-1 +kerning first=83 second=303 amount=-1 +kerning first=99 second=318 amount=-1 +kerning first=103 second=108 amount=-1 +kerning first=121 second=279 amount=-1 +kerning first=244 second=108 amount=-1 +kerning first=240 second=318 amount=-1 +kerning first=272 second=198 amount=-1 +kerning first=87 second=65 amount=-2 +kerning first=268 second=206 amount=-1 +kerning first=8218 second=122 amount=-1 +kerning first=8216 second=97 amount=-1 +kerning first=352 second=89 amount=-1 +kerning first=208 second=260 amount=-1 +kerning first=264 second=65 amount=-1 +kerning first=66 second=66 amount=-1 +kerning first=310 second=336 amount=-1 +kerning first=336 second=65 amount=-1 +kerning first=8250 second=218 amount=-1 +kerning first=67 second=260 amount=-1 +kerning first=1027 second=1104 amount=-1 +kerning first=89 second=339 amount=-1 +kerning first=269 second=229 amount=-1 +kerning first=352 second=260 amount=-1 +kerning first=351 second=115 amount=-1 +kerning first=8250 second=381 amount=-1 +kerning first=253 second=353 amount=-1 +kerning first=289 second=353 amount=-1 +kerning first=209 second=369 amount=-1 +kerning first=354 second=275 amount=-1 +kerning first=83 second=205 amount=-1 +kerning first=66 second=81 amount=-1 +kerning first=344 second=356 amount=-1 +kerning first=66 second=115 amount=-1 +kerning first=220 second=352 amount=-1 +kerning first=220 second=194 amount=-1 +kerning first=256 second=352 amount=-1 +kerning first=374 second=290 amount=-1 +kerning first=44 second=45 amount=-1 +kerning first=80 second=45 amount=-1 +kerning first=364 second=194 amount=-1 +kerning first=121 second=267 amount=-1 +kerning first=234 second=375 amount=-1 +kerning first=354 second=287 amount=-1 +kerning first=86 second=223 amount=-1 +kerning first=256 second=366 amount=-1 +kerning first=369 second=119 amount=-1 +kerning first=374 second=339 amount=-1 +kerning first=364 second=352 amount=-1 +kerning first=221 second=45 amount=-1 +kerning first=79 second=194 amount=-1 +kerning first=217 second=225 amount=-1 +kerning first=354 second=226 amount=-1 +kerning first=8250 second=366 amount=-1 +kerning first=374 second=211 amount=-1 +kerning first=371 second=111 amount=-1 +kerning first=86 second=81 amount=-1 +kerning first=8218 second=362 amount=-1 +kerning first=289 second=225 amount=-1 +kerning first=66 second=338 amount=-1 +kerning first=325 second=225 amount=-1 +kerning first=89 second=290 amount=-1 +kerning first=89 second=211 amount=-1 +kerning first=99 second=97 amount=-1 +kerning first=76 second=255 amount=-1 +kerning first=194 second=290 amount=-1 +kerning first=112 second=255 amount=-1 +kerning first=204 second=97 amount=-1 +kerning first=266 second=290 amount=-1 +kerning first=266 second=211 amount=-1 +kerning first=356 second=110 amount=-1 +kerning first=87 second=212 amount=-1 +kerning first=194 second=211 amount=-1 +kerning first=8222 second=84 amount=-2 +kerning first=375 second=273 amount=-1 +kerning first=286 second=46 amount=-1 +kerning first=197 second=338 amount=-1 +kerning first=354 second=324 amount=-1 +kerning first=214 second=46 amount=-1 +kerning first=86 second=193 amount=-2 +kerning first=87 second=324 amount=-1 +kerning first=66 second=257 amount=-1 +kerning first=102 second=8220 amount=1 +kerning first=269 second=289 amount=-1 +kerning first=86 second=111 amount=-1 +kerning first=82 second=370 amount=-1 +kerning first=377 second=289 amount=-1 +kerning first=89 second=241 amount=-1 +kerning first=223 second=255 amount=-1 +kerning first=84 second=287 amount=-1 +kerning first=369 second=287 amount=-1 +kerning first=1050 second=1108 amount=-1 +kerning first=89 second=281 amount=-1 +kerning first=315 second=218 amount=-1 +kerning first=376 second=232 amount=-1 +kerning first=1059 second=1092 amount=-1 +kerning first=206 second=365 amount=-1 +kerning first=193 second=346 amount=-1 +kerning first=364 second=224 amount=-1 +kerning first=44 second=8217 amount=-1 +kerning first=8217 second=232 amount=-1 +kerning first=187 second=380 amount=-1 +kerning first=98 second=46 amount=-1 +kerning first=286 second=86 amount=-1 +kerning first=118 second=380 amount=-1 +kerning first=352 second=201 amount=-1 +kerning first=275 second=46 amount=-1 +kerning first=87 second=225 amount=-1 +kerning first=257 second=8217 amount=-1 +kerning first=365 second=8217 amount=-1 +kerning first=66 second=266 amount=-1 +kerning first=104 second=8220 amount=-1 +kerning first=197 second=347 amount=-1 +kerning first=8220 second=260 amount=-2 +kerning first=187 second=70 amount=-1 +kerning first=67 second=201 amount=-1 +kerning first=356 second=350 amount=-1 +kerning first=364 second=122 amount=-1 +kerning first=290 second=87 amount=-1 +kerning first=356 second=226 amount=-1 +kerning first=220 second=122 amount=-1 +kerning first=78 second=289 amount=-1 +kerning first=366 second=259 amount=-1 +kerning first=330 second=259 amount=-1 +kerning first=250 second=375 amount=-1 +kerning first=255 second=289 amount=-1 +kerning first=187 second=75 amount=-1 +kerning first=66 second=218 amount=-1 +kerning first=268 second=75 amount=-1 +kerning first=317 second=370 amount=-1 +kerning first=219 second=289 amount=-1 +kerning first=8217 second=242 amount=-1 +kerning first=327 second=289 amount=-1 +kerning first=363 second=289 amount=-1 +kerning first=205 second=369 amount=-1 +kerning first=327 second=251 amount=-1 +kerning first=78 second=251 amount=-1 +kerning first=337 second=255 amount=-1 +kerning first=82 second=284 amount=-1 +kerning first=221 second=286 amount=-1 +kerning first=344 second=316 amount=-1 +kerning first=1027 second=1072 amount=-1 +kerning first=119 second=245 amount=-1 +kerning first=78 second=171 amount=-1 +kerning first=256 second=121 amount=-1 +kerning first=255 second=171 amount=-1 +kerning first=219 second=171 amount=-1 +kerning first=327 second=171 amount=-1 +kerning first=45 second=80 amount=-1 +kerning first=291 second=171 amount=-1 +kerning first=84 second=277 amount=-1 +kerning first=209 second=117 amount=-1 +kerning first=8220 second=229 amount=-1 +kerning first=352 second=323 amount=-1 +kerning first=8250 second=330 amount=-1 +kerning first=199 second=196 amount=-1 +kerning first=66 second=217 amount=-1 +kerning first=356 second=100 amount=-1 +kerning first=120 second=228 amount=-1 +kerning first=101 second=314 amount=-1 +kerning first=310 second=214 amount=-1 +kerning first=226 second=119 amount=-1 +kerning first=1059 second=1093 amount=-1 +kerning first=82 second=221 amount=-1 +kerning first=84 second=228 amount=-1 +kerning first=315 second=217 amount=-1 +kerning first=187 second=221 amount=-1 +kerning first=8220 second=259 amount=-1 +kerning first=187 second=379 amount=-1 +kerning first=8222 second=354 amount=-2 +kerning first=242 second=314 amount=-1 +kerning first=106 second=8249 amount=-1 +kerning first=108 second=253 amount=-1 +kerning first=86 second=263 amount=-1 +kerning first=379 second=382 amount=-1 +kerning first=266 second=330 amount=-1 +kerning first=321 second=253 amount=-1 +kerning first=260 second=363 amount=-1 +kerning first=371 second=263 amount=-1 +kerning first=296 second=363 amount=-1 +kerning first=86 second=71 amount=-1 +kerning first=87 second=246 amount=-1 +kerning first=325 second=103 amount=-1 +kerning first=70 second=8249 amount=-1 +kerning first=217 second=103 amount=-1 +kerning first=107 second=100 amount=-1 +kerning first=253 second=103 amount=-1 +kerning first=110 second=118 amount=-1 +kerning first=374 second=281 amount=-1 +kerning first=251 second=118 amount=-1 +kerning first=76 second=103 amount=-1 +kerning first=194 second=89 amount=-2 +kerning first=8250 second=193 amount=-1 +kerning first=111 second=120 amount=-1 +kerning first=199 second=382 amount=-1 +kerning first=354 second=235 amount=-1 +kerning first=220 second=83 amount=-1 +kerning first=335 second=120 amount=-1 +kerning first=258 second=8249 amount=-1 +kerning first=304 second=261 amount=-1 +kerning first=376 second=336 amount=-1 +kerning first=253 second=234 amount=-1 +kerning first=256 second=83 amount=-1 +kerning first=330 second=8249 amount=-1 +kerning first=314 second=255 amount=-1 +kerning first=364 second=83 amount=-1 +kerning first=8217 second=281 amount=-1 +kerning first=66 second=315 amount=-1 +kerning first=235 second=44 amount=-1 +kerning first=101 second=255 amount=-1 +kerning first=374 second=232 amount=-1 +kerning first=86 second=262 amount=-1 +kerning first=287 second=97 amount=-1 +kerning first=65 second=255 amount=-1 +kerning first=304 second=227 amount=-1 +kerning first=354 second=197 amount=-2 +kerning first=323 second=97 amount=-1 +kerning first=344 second=366 amount=-1 +kerning first=279 second=255 amount=-1 +kerning first=356 second=79 amount=-1 +kerning first=99 second=118 amount=-1 +kerning first=346 second=193 amount=-1 +kerning first=337 second=318 amount=-1 +kerning first=218 second=257 amount=-1 +kerning first=217 second=65 amount=-1 +kerning first=89 second=232 amount=-1 +kerning first=67 second=338 amount=-1 +kerning first=119 second=244 amount=-1 +kerning first=197 second=250 amount=-1 +kerning first=374 second=378 amount=-1 +kerning first=219 second=192 amount=-1 +kerning first=376 second=350 amount=-1 +kerning first=346 second=302 amount=-1 +kerning first=266 second=378 amount=-1 +kerning first=89 second=90 amount=-1 +kerning first=70 second=198 amount=-1 +kerning first=264 second=274 amount=-1 +kerning first=284 second=221 amount=-1 +kerning first=377 second=250 amount=-1 +kerning first=266 second=298 amount=-1 +kerning first=89 second=242 amount=-1 +kerning first=266 second=280 amount=-1 +kerning first=356 second=291 amount=-1 +kerning first=374 second=90 amount=-1 +kerning first=284 second=291 amount=-1 +kerning first=199 second=213 amount=-1 +kerning first=71 second=221 amount=-1 +kerning first=256 second=361 amount=-1 +kerning first=119 second=267 amount=-1 +kerning first=84 second=256 amount=-2 +kerning first=8217 second=194 amount=-2 +kerning first=71 second=291 amount=-1 +kerning first=89 second=378 amount=-1 +kerning first=258 second=210 amount=-1 +kerning first=374 second=242 amount=-1 +kerning first=375 second=233 amount=-1 +kerning first=335 second=316 amount=-1 +kerning first=311 second=335 amount=-1 +kerning first=207 second=257 amount=-1 +kerning first=171 second=87 amount=-1 +kerning first=354 second=45 amount=-1 +kerning first=66 second=87 amount=-1 +kerning first=286 second=374 amount=-1 +kerning first=344 second=268 amount=-1 +kerning first=195 second=112 amount=-1 +kerning first=86 second=224 amount=-1 +kerning first=121 second=240 amount=-1 +kerning first=344 second=219 amount=-1 +kerning first=67 second=289 amount=-1 +kerning first=280 second=289 amount=-1 +kerning first=316 second=289 amount=-1 +kerning first=263 second=224 amount=-1 +kerning first=1054 second=1040 amount=-1 +kerning first=352 second=289 amount=-1 +kerning first=193 second=367 amount=-1 +kerning first=269 second=108 amount=-1 +kerning first=88 second=367 amount=-1 +kerning first=233 second=108 amount=-1 +kerning first=83 second=8249 amount=-1 +kerning first=103 second=229 amount=-1 +kerning first=77 second=257 amount=-1 +kerning first=375 second=243 amount=-1 +kerning first=250 second=287 amount=-1 +kerning first=65 second=353 amount=-1 +kerning first=303 second=243 amount=-1 +kerning first=221 second=324 amount=-1 +kerning first=73 second=287 amount=-1 +kerning first=221 second=275 amount=-1 +kerning first=74 second=97 amount=-1 +kerning first=350 second=304 amount=-1 +kerning first=236 second=375 amount=-1 +kerning first=221 second=226 amount=-1 +kerning first=255 second=339 amount=-1 +kerning first=196 second=336 amount=-1 +kerning first=268 second=336 amount=-1 +kerning first=105 second=45 amount=-1 +kerning first=314 second=253 amount=-1 +kerning first=260 second=45 amount=-1 +kerning first=66 second=97 amount=-1 +kerning first=207 second=97 amount=-1 +kerning first=286 second=356 amount=-1 +kerning first=352 second=80 amount=-1 +kerning first=347 second=353 amount=-1 +kerning first=119 second=45 amount=-1 +kerning first=119 second=275 amount=-1 +kerning first=89 second=289 amount=-1 +kerning first=230 second=289 amount=-1 +kerning first=368 second=45 amount=-1 +kerning first=266 second=289 amount=-1 +kerning first=84 second=380 amount=-1 +kerning first=376 second=324 amount=-1 +kerning first=374 second=289 amount=-1 +kerning first=302 second=289 amount=-1 +kerning first=275 second=316 amount=-1 +kerning first=250 second=255 amount=-1 +kerning first=212 second=46 amount=-1 +kerning first=8250 second=120 amount=-1 +kerning first=256 second=370 amount=-1 +kerning first=197 second=211 amount=-1 +kerning first=67 second=80 amount=-1 +kerning first=1036 second=1105 amount=-1 +kerning first=266 second=193 amount=-1 +kerning first=75 second=290 amount=-1 +kerning first=8216 second=230 amount=-1 +kerning first=1027 second=1095 amount=-1 +kerning first=374 second=193 amount=-2 +kerning first=193 second=220 amount=-1 +kerning first=67 second=378 amount=-1 +kerning first=253 second=273 amount=-1 +kerning first=89 second=193 amount=-2 +kerning first=66 second=226 amount=-1 +kerning first=8217 second=291 amount=-1 +kerning first=86 second=192 amount=-2 +kerning first=269 second=307 amount=-1 +kerning first=221 second=257 amount=-1 +kerning first=251 second=119 amount=-1 +kerning first=375 second=314 amount=-1 +kerning first=339 second=314 amount=-1 +kerning first=87 second=46 amount=-1 +kerning first=267 second=314 amount=-1 +kerning first=262 second=284 amount=-1 +kerning first=262 second=209 amount=-1 +kerning first=231 second=314 amount=-1 +kerning first=336 second=46 amount=-1 +kerning first=376 second=346 amount=-1 +kerning first=260 second=253 amount=-1 +kerning first=268 second=346 amount=-1 +kerning first=204 second=230 amount=-1 +kerning first=196 second=346 amount=-1 +kerning first=99 second=230 amount=-1 +kerning first=107 second=101 amount=-1 +kerning first=262 second=70 amount=-1 +kerning first=275 second=375 amount=-1 +kerning first=220 second=380 amount=-1 +kerning first=98 second=375 amount=-1 +kerning first=266 second=81 amount=-1 +kerning first=75 second=369 amount=-1 +kerning first=356 second=101 amount=-1 +kerning first=264 second=296 amount=-1 +kerning first=332 second=196 amount=-1 +kerning first=89 second=81 amount=-1 +kerning first=66 second=354 amount=-1 +kerning first=194 second=81 amount=-1 +kerning first=221 second=235 amount=-1 +kerning first=368 second=196 amount=-1 +kerning first=171 second=354 amount=-1 +kerning first=66 second=75 amount=-1 +kerning first=315 second=354 amount=-1 +kerning first=262 second=288 amount=-1 +kerning first=352 second=219 amount=-1 +kerning first=374 second=81 amount=-1 +kerning first=283 second=316 amount=-1 +kerning first=89 second=171 amount=-1 +kerning first=194 second=171 amount=-1 +kerning first=266 second=171 amount=-1 +kerning first=76 second=374 amount=-1 +kerning first=1060 second=1051 amount=-1 +kerning first=339 second=121 amount=-1 +kerning first=371 second=271 amount=-1 +kerning first=374 second=171 amount=-1 +kerning first=267 second=121 amount=-1 +kerning first=256 second=252 amount=-1 +kerning first=196 second=115 amount=-1 +kerning first=231 second=121 amount=-1 +kerning first=199 second=197 amount=-1 +kerning first=195 second=121 amount=-1 +kerning first=121 second=231 amount=-1 +kerning first=217 second=352 amount=-1 +kerning first=83 second=196 amount=-1 +kerning first=90 second=121 amount=-1 +kerning first=362 second=261 amount=-1 +kerning first=354 second=115 amount=-1 +kerning first=289 second=122 amount=-1 +kerning first=86 second=214 amount=-1 +kerning first=76 second=122 amount=-1 +kerning first=82 second=213 amount=-1 +kerning first=344 second=335 amount=-1 +kerning first=224 second=253 amount=-1 +kerning first=230 second=311 amount=-1 +kerning first=195 second=252 amount=-1 +kerning first=350 second=65 amount=-1 +kerning first=241 second=171 amount=-1 +kerning first=192 second=362 amount=-1 +kerning first=222 second=260 amount=-1 +kerning first=221 second=333 amount=-1 +kerning first=88 second=249 amount=-1 +kerning first=81 second=260 amount=-1 +kerning first=45 second=220 amount=-1 +kerning first=45 second=260 amount=-1 +kerning first=193 second=249 amount=-1 +kerning first=45 second=86 amount=-1 +kerning first=199 second=266 amount=-1 +kerning first=366 second=260 amount=-1 +kerning first=197 second=362 amount=-1 +kerning first=120 second=347 amount=-1 +kerning first=84 second=347 amount=-1 +kerning first=75 second=214 amount=-1 +kerning first=46 second=8221 amount=-1 +kerning first=264 second=103 amount=-1 +kerning first=82 second=8221 amount=-1 +kerning first=295 second=8221 amount=-1 +kerning first=192 second=103 amount=-1 +kerning first=331 second=8221 amount=-1 +kerning first=84 second=246 amount=-1 +kerning first=260 second=351 amount=-1 +kerning first=361 second=8221 amount=-1 +kerning first=259 second=8221 amount=-1 +kerning first=121 second=100 amount=-1 +kerning first=259 second=118 amount=-1 +kerning first=255 second=242 amount=-1 +kerning first=89 second=8250 amount=-1 +kerning first=258 second=220 amount=-1 +kerning first=256 second=79 amount=-1 +kerning first=258 second=67 amount=-1 +kerning first=90 second=380 amount=-1 +kerning first=8220 second=339 amount=-1 +kerning first=8250 second=382 amount=-1 +kerning first=1046 second=1089 amount=-1 +kerning first=233 second=107 amount=-1 +kerning first=255 second=232 amount=-1 +kerning first=1038 second=1054 amount=-1 +kerning first=367 second=8221 amount=-1 +kerning first=1046 second=1058 amount=-1 +kerning first=8217 second=193 amount=-2 +kerning first=375 second=380 amount=-1 +kerning first=284 second=89 amount=-1 +kerning first=192 second=264 amount=-1 +kerning first=1027 second=1033 amount=-1 +kerning first=87 second=264 amount=-1 +kerning first=1043 second=1040 amount=-1 +kerning first=352 second=317 amount=-1 +kerning first=352 second=298 amount=-1 +kerning first=376 second=248 amount=-1 +kerning first=193 second=118 amount=-1 +kerning first=87 second=234 amount=-1 +kerning first=229 second=118 amount=-1 +kerning first=350 second=305 amount=-1 +kerning first=196 second=354 amount=-2 +kerning first=346 second=120 amount=-1 +kerning first=88 second=118 amount=-1 +kerning first=1040 second=1098 amount=-1 +kerning first=356 second=331 amount=-1 +kerning first=45 second=198 amount=-1 +kerning first=216 second=192 amount=-1 +kerning first=81 second=198 amount=-1 +kerning first=288 second=192 amount=-1 +kerning first=107 second=279 amount=-1 +kerning first=117 second=314 amount=-1 +kerning first=222 second=198 amount=-1 +kerning first=330 second=250 amount=-1 +kerning first=346 second=303 amount=-1 +kerning first=84 second=216 amount=-1 +kerning first=350 second=370 amount=-1 +kerning first=347 second=287 amount=-1 +kerning first=87 second=256 amount=-2 +kerning first=346 second=44 amount=-1 +kerning first=275 second=287 amount=-1 +kerning first=196 second=84 amount=-2 +kerning first=304 second=226 amount=-1 +kerning first=203 second=287 amount=-1 +kerning first=376 second=226 amount=-1 +kerning first=193 second=368 amount=-1 +kerning first=353 second=291 amount=-1 +kerning first=317 second=291 amount=-1 +kerning first=45 second=368 amount=-1 +kerning first=281 second=291 amount=-1 +kerning first=209 second=291 amount=-1 +kerning first=65 second=266 amount=-1 +kerning first=192 second=365 amount=-1 +kerning first=220 second=74 amount=-1 +kerning first=258 second=89 amount=-2 +kerning first=199 second=45 amount=-1 +kerning first=310 second=262 amount=-1 +kerning first=364 second=74 amount=-1 +kerning first=262 second=350 amount=-1 +kerning first=1047 second=1078 amount=-1 +kerning first=218 second=260 amount=-1 +kerning first=8216 second=99 amount=-1 +kerning first=344 second=269 amount=-1 +kerning first=336 second=256 amount=-1 +kerning first=209 second=261 amount=-1 +kerning first=84 second=268 amount=-1 +kerning first=350 second=112 amount=-1 +kerning first=264 second=256 amount=-1 +kerning first=366 second=198 amount=-1 +kerning first=65 second=112 amount=-1 +kerning first=264 second=286 amount=-1 +kerning first=356 second=279 amount=-1 +kerning first=346 second=205 amount=-1 +kerning first=255 second=8249 amount=-1 +kerning first=219 second=8249 amount=-1 +kerning first=269 second=257 amount=-1 +kerning first=8220 second=99 amount=-1 +kerning first=327 second=8249 amount=-1 +kerning first=291 second=8249 amount=-1 +kerning first=197 second=289 amount=-1 +kerning first=45 second=89 amount=-1 +kerning first=370 second=350 amount=-1 +kerning first=366 second=228 amount=-1 +kerning first=330 second=228 amount=-1 +kerning first=87 second=286 amount=-1 +kerning first=77 second=367 amount=-1 +kerning first=117 second=108 amount=-1 +kerning first=192 second=286 amount=-1 +kerning first=65 second=251 amount=-1 +kerning first=66 second=105 amount=-1 +kerning first=356 second=212 amount=-1 +kerning first=377 second=251 amount=-1 +kerning first=192 second=374 amount=-2 +kerning first=82 second=332 amount=-1 +kerning first=220 second=261 amount=-1 +kerning first=353 second=121 amount=-1 +kerning first=197 second=251 amount=-1 +kerning first=269 second=227 amount=-1 +kerning first=364 second=261 amount=-1 +kerning first=77 second=226 amount=-1 +kerning first=321 second=381 amount=-1 +kerning first=295 second=8220 amount=-1 +kerning first=344 second=108 amount=-1 +kerning first=367 second=8220 amount=-1 +kerning first=218 second=226 amount=-1 +kerning first=66 second=367 amount=-1 +kerning first=362 second=226 amount=-1 +kerning first=262 second=192 amount=-1 +kerning first=207 second=367 amount=-1 +kerning first=46 second=8220 amount=-1 +kerning first=99 second=119 amount=-1 +kerning first=82 second=8220 amount=-1 +kerning first=221 second=115 amount=-1 +kerning first=84 second=335 amount=-1 +kerning first=374 second=233 amount=-1 +kerning first=89 second=233 amount=-1 +kerning first=277 second=311 amount=-1 +kerning first=282 second=289 amount=-1 +kerning first=67 second=211 amount=-1 +kerning first=108 second=45 amount=-1 +kerning first=218 second=97 amount=-1 +kerning first=87 second=353 amount=-1 +kerning first=374 second=223 amount=-1 +kerning first=362 second=97 amount=-1 +kerning first=45 second=77 amount=-1 +kerning first=347 second=255 amount=-1 +kerning first=77 second=97 amount=-1 +kerning first=275 second=255 amount=-1 +kerning first=68 second=194 amount=-1 +kerning first=264 second=112 amount=-1 +kerning first=98 second=255 amount=-1 +kerning first=221 second=244 amount=-1 +kerning first=192 second=112 amount=-1 +kerning first=89 second=223 amount=-1 +kerning first=253 second=243 amount=-1 +kerning first=8222 second=219 amount=-1 +kerning first=66 second=377 amount=-1 +kerning first=346 second=198 amount=-1 +kerning first=192 second=352 amount=-1 +kerning first=226 second=8220 amount=-1 +kerning first=266 second=202 amount=-1 +kerning first=253 second=46 amount=-1 +kerning first=264 second=352 amount=-1 +kerning first=289 second=46 amount=-1 +kerning first=65 second=362 amount=-1 +kerning first=45 second=76 amount=-1 +kerning first=87 second=352 amount=-1 +kerning first=370 second=382 amount=-1 +kerning first=83 second=197 amount=-1 +kerning first=332 second=197 amount=-1 +kerning first=350 second=362 amount=-1 +kerning first=1046 second=1059 amount=-1 +kerning first=88 second=336 amount=-1 +kerning first=221 second=266 amount=-1 +kerning first=119 second=111 amount=-1 +kerning first=368 second=197 amount=-1 +kerning first=193 second=336 amount=-1 +kerning first=73 second=225 amount=-1 +kerning first=317 second=380 amount=-1 +kerning first=84 second=334 amount=-1 +kerning first=1027 second=1076 amount=-1 +kerning first=235 second=253 amount=-1 +kerning first=262 second=200 amount=-1 +kerning first=307 second=253 amount=-1 +kerning first=108 second=8220 amount=-1 +kerning first=217 second=46 amount=-1 +kerning first=379 second=253 amount=-1 +kerning first=344 second=86 amount=-1 +kerning first=269 second=225 amount=-1 +kerning first=112 second=46 amount=-1 +kerning first=70 second=260 amount=-1 +kerning first=356 second=213 amount=-1 +kerning first=74 second=230 amount=-1 +kerning first=323 second=230 amount=-1 +kerning first=87 second=103 amount=-1 +kerning first=228 second=375 amount=-1 +kerning first=287 second=230 amount=-1 +kerning first=195 second=370 amount=-1 +kerning first=266 second=76 amount=-1 +kerning first=193 second=84 amount=-2 +kerning first=344 second=288 amount=-1 +kerning first=121 second=318 amount=-1 +kerning first=87 second=375 amount=-1 +kerning first=66 second=346 amount=-1 +kerning first=119 second=351 amount=-1 +kerning first=338 second=289 amount=-1 +kerning first=211 second=260 amount=-1 +kerning first=313 second=289 amount=-1 +kerning first=311 second=277 amount=-1 +kerning first=45 second=317 amount=-1 +kerning first=213 second=196 amount=-1 +kerning first=193 second=218 amount=-1 +kerning first=197 second=219 amount=-1 +kerning first=1075 second=1113 amount=-1 +kerning first=85 second=196 amount=-1 +kerning first=120 second=117 amount=-1 +kerning first=352 second=68 amount=-1 +kerning first=8217 second=289 amount=-1 +kerning first=187 second=203 amount=-1 +kerning first=84 second=259 amount=-1 +kerning first=67 second=68 amount=-1 +kerning first=193 second=217 amount=-1 +kerning first=314 second=121 amount=-1 +kerning first=242 second=121 amount=-1 +kerning first=118 second=263 amount=-1 +kerning first=101 second=121 amount=-1 +kerning first=87 second=277 amount=-1 +kerning first=65 second=121 amount=-1 +kerning first=310 second=369 amount=-1 +kerning first=317 second=379 amount=-1 +kerning first=356 second=288 amount=-1 +kerning first=197 second=89 amount=-2 +kerning first=119 second=263 amount=-1 +kerning first=346 second=196 amount=-1 +kerning first=205 second=224 amount=-1 +kerning first=76 second=362 amount=-1 +kerning first=86 second=281 amount=-1 +kerning first=324 second=171 amount=-1 +kerning first=66 second=106 amount=-1 +kerning first=197 second=220 amount=-1 +kerning first=371 second=281 amount=-1 +kerning first=321 second=382 amount=-1 +kerning first=376 second=333 amount=-1 +kerning first=352 second=302 amount=-1 +kerning first=8216 second=240 amount=-1 +kerning first=194 second=71 amount=-1 +kerning first=264 second=287 amount=-1 +kerning first=1091 second=1103 amount=-1 +kerning first=347 second=103 amount=-1 +kerning first=89 second=71 amount=-1 +kerning first=192 second=287 amount=-1 +kerning first=275 second=103 amount=-1 +kerning first=87 second=287 amount=-1 +kerning first=203 second=103 amount=-1 +kerning first=117 second=316 amount=-1 +kerning first=376 second=235 amount=-1 +kerning first=258 second=365 amount=-1 +kerning first=67 second=330 amount=-1 +kerning first=118 second=353 amount=-1 +kerning first=75 second=171 amount=-1 +kerning first=1027 second=1086 amount=-1 +kerning first=374 second=71 amount=-1 +kerning first=65 second=252 amount=-1 +kerning first=266 second=71 amount=-1 +kerning first=1058 second=1078 amount=-1 +kerning first=326 second=118 amount=-1 +kerning first=80 second=193 amount=-1 +kerning first=197 second=67 amount=-1 +kerning first=1043 second=1093 amount=-1 +kerning first=352 second=8249 amount=-1 +kerning first=228 second=255 amount=-1 +kerning first=316 second=8249 amount=-1 +kerning first=192 second=255 amount=-1 +kerning first=84 second=269 amount=-1 +kerning first=362 second=227 amount=-1 +kerning first=87 second=255 amount=-1 +kerning first=213 second=44 amount=-1 +kerning first=258 second=338 amount=-1 +kerning first=304 second=257 amount=-1 +kerning first=103 second=8249 amount=-1 +kerning first=67 second=8249 amount=-1 +kerning first=376 second=257 amount=-1 +kerning first=77 second=229 amount=-1 +kerning first=8220 second=242 amount=-1 +kerning first=344 second=85 amount=-1 +kerning first=113 second=118 amount=-1 +kerning first=354 second=244 amount=-1 +kerning first=311 second=234 amount=-1 +kerning first=258 second=251 amount=-1 +kerning first=303 second=273 amount=-1 +kerning first=263 second=303 amount=-1 +kerning first=346 second=118 amount=-1 +kerning first=350 second=274 amount=-1 +kerning first=262 second=199 amount=-1 +kerning first=283 second=108 amount=-1 +kerning first=118 second=279 amount=-1 +kerning first=216 second=193 amount=-1 +kerning first=262 second=79 amount=-1 +kerning first=356 second=332 amount=-1 +kerning first=197 second=8220 amount=-1 +kerning first=221 second=245 amount=-1 +kerning first=65 second=361 amount=-1 +kerning first=330 second=251 amount=-1 +kerning first=344 second=107 amount=-1 +kerning first=288 second=193 amount=-1 +kerning first=82 second=279 amount=-1 +kerning first=206 second=361 amount=-1 +kerning first=376 second=267 amount=-1 +kerning first=375 second=8249 amount=-1 +kerning first=8217 second=224 amount=-1 +kerning first=218 second=227 amount=-1 +kerning first=77 second=227 amount=-1 +kerning first=118 second=233 amount=-1 +kerning first=344 second=216 amount=-1 +kerning first=193 second=119 amount=-1 +kerning first=229 second=119 amount=-1 +kerning first=88 second=119 amount=-1 +kerning first=255 second=233 amount=-1 +kerning first=87 second=113 amount=-1 +kerning first=234 second=291 amount=-1 +kerning first=66 second=84 amount=-1 +kerning first=198 second=291 amount=-1 +kerning first=119 second=227 amount=-1 +kerning first=307 second=8249 amount=-1 +kerning first=281 second=314 amount=-1 +kerning first=245 second=314 amount=-1 +kerning first=217 second=198 amount=-1 +kerning first=192 second=366 amount=-1 +kerning first=8222 second=218 amount=-1 +kerning first=314 second=291 amount=-1 +kerning first=86 second=351 amount=-1 +kerning first=8250 second=206 amount=-1 +kerning first=206 second=291 amount=-1 +kerning first=101 second=291 amount=-1 +kerning first=65 second=291 amount=-1 +kerning first=193 second=354 amount=-2 +kerning first=243 second=44 amount=-1 +kerning first=121 second=101 amount=-1 +kerning first=263 second=287 amount=-1 +kerning first=194 second=268 amount=-1 +kerning first=45 second=325 amount=-1 +kerning first=75 second=210 amount=-1 +kerning first=89 second=268 amount=-1 +kerning first=66 second=44 amount=-1 +kerning first=8250 second=201 amount=-1 +kerning first=376 second=244 amount=-1 +kerning first=350 second=296 amount=-1 +kerning first=368 second=227 amount=-1 +kerning first=296 second=227 amount=-1 +kerning first=374 second=268 amount=-1 +kerning first=221 second=337 amount=-1 +kerning first=85 second=257 amount=-1 +kerning first=266 second=268 amount=-1 +kerning first=204 second=261 amount=-1 +kerning first=356 second=199 amount=-1 +kerning first=99 second=261 amount=-1 +kerning first=255 second=228 amount=-1 +kerning first=219 second=228 amount=-1 +kerning first=66 second=324 amount=-1 +kerning first=327 second=228 amount=-1 +kerning first=83 second=66 amount=-1 +kerning first=66 second=284 amount=-1 +kerning first=192 second=361 amount=-1 +kerning first=82 second=83 amount=-1 +kerning first=369 second=108 amount=-1 +kerning first=187 second=83 amount=-1 +kerning first=376 second=377 amount=-1 +kerning first=262 second=336 amount=-1 +kerning first=1042 second=1078 amount=-1 +kerning first=371 second=245 amount=-1 +kerning first=67 second=77 amount=-1 +kerning first=374 second=263 amount=-1 +kerning first=197 second=286 amount=-1 +kerning first=230 second=107 amount=-1 +kerning first=199 second=262 amount=-1 +kerning first=256 second=221 amount=-2 +kerning first=107 second=337 amount=-1 +kerning first=82 second=318 amount=-1 +kerning first=241 second=8249 amount=-1 +kerning first=354 second=223 amount=-1 +kerning first=8216 second=231 amount=-1 +kerning first=269 second=237 amount=-1 +kerning first=79 second=65 amount=-1 +kerning first=65 second=370 amount=-1 +kerning first=220 second=65 amount=-1 +kerning first=252 second=289 amount=-1 +kerning first=364 second=65 amount=-1 +kerning first=272 second=260 amount=-1 +kerning first=310 second=45 amount=-1 +kerning first=346 second=45 amount=-1 +kerning first=264 second=77 amount=-1 +kerning first=307 second=45 amount=-1 +kerning first=365 second=289 amount=-1 +kerning first=347 second=112 amount=-1 +kerning first=382 second=45 amount=-1 +kerning first=344 second=255 amount=-1 +kerning first=236 second=255 amount=-1 +kerning first=258 second=374 amount=-2 +kerning first=374 second=351 amount=-1 +kerning first=86 second=324 amount=-1 +kerning first=45 second=374 amount=-1 +kerning first=1040 second=1058 amount=-1 +kerning first=221 second=97 amount=-1 +kerning first=187 second=323 amount=-1 +kerning first=233 second=46 amount=-1 +kerning first=75 second=8249 amount=-1 +kerning first=269 second=46 amount=-1 +kerning first=67 second=193 amount=-1 +kerning first=121 second=257 amount=-1 +kerning first=221 second=288 amount=-1 +kerning first=370 second=257 amount=-1 +kerning first=298 second=257 amount=-1 +kerning first=187 second=260 amount=-1 +kerning first=311 second=273 amount=-1 +kerning first=213 second=192 amount=-1 +kerning first=1059 second=1105 amount=-1 +kerning first=208 second=193 amount=-1 +kerning first=302 second=224 amount=-1 +kerning first=352 second=193 amount=-1 +kerning first=89 second=224 amount=-1 +kerning first=187 second=78 amount=-1 +kerning first=8250 second=280 amount=-1 +kerning first=260 second=71 amount=-1 +kerning first=81 second=46 amount=-1 +kerning first=187 second=122 amount=-1 +kerning first=118 second=122 amount=-1 +kerning first=8250 second=84 amount=-1 +kerning first=1046 second=1090 amount=-1 +kerning first=374 second=224 amount=-1 +kerning first=112 second=375 amount=-1 +kerning first=366 second=46 amount=-1 +kerning first=268 second=288 amount=-1 +kerning first=46 second=8249 amount=-1 +kerning first=374 second=336 amount=-1 +kerning first=323 second=103 amount=-1 +kerning first=196 second=288 amount=-1 +kerning first=1059 second=1075 amount=-1 +kerning first=66 second=368 amount=-1 +kerning first=67 second=81 amount=-1 +kerning first=76 second=287 amount=-1 +kerning first=205 second=259 amount=-1 +kerning first=269 second=316 amount=-1 +kerning first=233 second=316 amount=-1 +kerning first=251 second=289 amount=-1 +kerning first=354 second=346 amount=-1 +kerning first=370 second=352 amount=-1 +kerning first=325 second=287 amount=-1 +kerning first=217 second=287 amount=-1 +kerning first=253 second=287 amount=-1 +kerning first=73 second=117 amount=-1 +kerning first=87 second=194 amount=-2 +kerning first=110 second=8217 amount=-1 +kerning first=251 second=8217 amount=-1 +kerning first=197 second=370 amount=-1 +kerning first=264 second=194 amount=-1 +kerning first=336 second=194 amount=-1 +kerning first=344 second=242 amount=-1 +kerning first=66 second=328 amount=-1 +kerning first=194 second=219 amount=-1 +kerning first=86 second=290 amount=-1 +kerning first=99 second=105 amount=-1 +kerning first=291 second=351 amount=-1 +kerning first=81 second=44 amount=-1 +kerning first=346 second=80 amount=-1 +kerning first=119 second=115 amount=-1 +kerning first=376 second=288 amount=-1 +kerning first=105 second=253 amount=-1 +kerning first=260 second=115 amount=-1 +kerning first=242 second=255 amount=-1 +kerning first=112 second=121 amount=-1 +kerning first=258 second=369 amount=-1 +kerning first=76 second=121 amount=-1 +kerning first=73 second=229 amount=-1 +kerning first=362 second=196 amount=-1 +kerning first=246 second=253 amount=-1 +kerning first=314 second=171 amount=-1 +kerning first=354 second=253 amount=-1 +kerning first=344 second=334 amount=-1 +kerning first=353 second=353 amount=-1 +kerning first=195 second=212 amount=-1 +kerning first=218 second=196 amount=-1 +kerning first=290 second=196 amount=-1 +kerning first=1059 second=1100 amount=-1 +kerning first=223 second=318 amount=-1 +kerning first=375 second=100 amount=-1 +kerning first=103 second=228 amount=-1 +kerning first=89 second=347 amount=-1 +kerning first=367 second=318 amount=-1 +kerning first=221 second=214 amount=-1 +kerning first=354 second=267 amount=-1 +kerning first=8250 second=344 amount=-1 +kerning first=89 second=263 amount=-1 +kerning first=326 second=8221 amount=-1 +kerning first=260 second=336 amount=-1 +kerning first=377 second=365 amount=-1 +kerning first=311 second=113 amount=-1 +kerning first=250 second=103 amount=-1 +kerning first=66 second=249 amount=-1 +kerning first=286 second=103 amount=-1 +kerning first=236 second=171 amount=-1 +kerning first=82 second=362 amount=-1 +kerning first=344 second=171 amount=-1 +kerning first=303 second=100 amount=-1 +kerning first=73 second=103 amount=-1 +kerning first=197 second=365 amount=-1 +kerning first=380 second=171 amount=-1 +kerning first=113 second=119 amount=-1 +kerning first=8220 second=113 amount=-1 +kerning first=119 second=232 amount=-1 +kerning first=8218 second=370 amount=-1 +kerning first=234 second=118 amount=-1 +kerning first=121 second=380 amount=-1 +kerning first=85 second=380 amount=-1 +kerning first=370 second=380 amount=-1 +kerning first=262 second=380 amount=-1 +kerning first=121 second=230 amount=-1 +kerning first=315 second=377 amount=-1 +kerning first=45 second=323 amount=-1 +kerning first=256 second=216 amount=-1 +kerning first=67 second=67 amount=-1 +kerning first=82 second=234 amount=-1 +kerning first=76 second=86 amount=-1 +kerning first=66 second=363 amount=-1 +kerning first=321 second=364 amount=-1 +kerning first=207 second=363 amount=-1 +kerning first=118 second=234 amount=-1 +kerning first=118 second=283 amount=-1 +kerning first=1058 second=1033 amount=-1 +kerning first=374 second=347 amount=-1 +kerning first=82 second=283 amount=-1 +kerning first=8250 second=217 amount=-1 +kerning first=1060 second=1059 amount=-1 +kerning first=82 second=118 amount=-1 +kerning first=193 second=79 amount=-1 +kerning first=77 second=8249 amount=-1 +kerning first=187 second=118 amount=-1 +kerning first=352 second=72 amount=-1 +kerning first=344 second=290 amount=-1 +kerning first=219 second=193 amount=-1 +kerning first=367 second=118 amount=-1 +kerning first=197 second=85 amount=-1 +kerning first=195 second=216 amount=-1 +kerning first=221 second=377 amount=-1 +kerning first=207 second=361 amount=-1 +kerning first=313 second=377 amount=-1 +kerning first=346 second=192 amount=-1 +kerning first=8218 second=86 amount=-2 +kerning first=1098 second=1091 amount=-1 +kerning first=295 second=118 amount=-1 +kerning first=331 second=118 amount=-1 +kerning first=88 second=79 amount=-1 +kerning first=1104 second=1076 amount=-1 +kerning first=194 second=8249 amount=-1 +kerning first=356 second=83 amount=-1 +kerning first=1050 second=1060 amount=-1 +kerning first=266 second=8249 amount=-1 +kerning first=75 second=121 amount=-1 +kerning first=8217 second=269 amount=-1 +kerning first=83 second=315 amount=-1 +kerning first=354 second=262 amount=-1 +kerning first=1027 second=1077 amount=-1 +kerning first=264 second=278 amount=-1 +kerning first=344 second=103 amount=-1 +kerning first=45 second=218 amount=-1 +kerning first=350 second=256 amount=-1 +kerning first=82 second=113 amount=-1 +kerning first=87 second=198 amount=-2 +kerning first=375 second=291 amount=-1 +kerning first=68 second=65 amount=-1 +kerning first=336 second=198 amount=-1 +kerning first=339 second=291 amount=-1 +kerning first=1069 second=1038 amount=-1 +kerning first=248 second=318 amount=-1 +kerning first=264 second=198 amount=-1 +kerning first=267 second=291 amount=-1 +kerning first=76 second=366 amount=-1 +kerning first=231 second=291 amount=-1 +kerning first=75 second=250 amount=-1 +kerning first=84 second=260 amount=-2 +kerning first=1059 second=1119 amount=-1 +kerning first=90 second=291 amount=-1 +kerning first=266 second=67 amount=-1 +kerning first=374 second=67 amount=-1 +kerning first=317 second=219 amount=-1 +kerning first=362 second=44 amount=-1 +kerning first=89 second=67 amount=-1 +kerning first=84 second=71 amount=-1 +kerning first=8249 second=87 amount=-1 +kerning first=194 second=67 amount=-1 +kerning first=290 second=44 amount=-1 +kerning first=82 second=199 amount=-1 +kerning first=254 second=44 amount=-1 +kerning first=86 second=275 amount=-1 +kerning first=8220 second=233 amount=-1 +kerning first=346 second=84 amount=-1 +kerning first=118 second=113 amount=-1 +kerning first=72 second=227 amount=-1 +kerning first=67 second=72 amount=-1 +kerning first=376 second=337 amount=-1 +kerning first=323 second=261 amount=-1 +kerning first=287 second=261 amount=-1 +kerning first=346 second=112 amount=-1 +kerning first=99 second=226 amount=-1 +kerning first=204 second=226 amount=-1 +kerning first=199 second=66 amount=-1 +kerning first=250 second=108 amount=-1 +kerning first=258 second=286 amount=-1 +kerning first=252 second=314 amount=-1 +kerning first=120 second=229 amount=-1 +kerning first=84 second=229 amount=-1 +kerning first=381 second=122 amount=-1 +kerning first=220 second=230 amount=-1 +kerning first=262 second=122 amount=-1 +kerning first=268 second=205 amount=-1 +kerning first=364 second=230 amount=-1 +kerning first=74 second=261 amount=-1 +kerning first=219 second=224 amount=-1 +kerning first=255 second=224 amount=-1 +kerning first=291 second=224 amount=-1 +kerning first=327 second=224 amount=-1 +kerning first=194 second=356 amount=-2 +kerning first=86 second=45 amount=-1 +kerning first=122 second=45 amount=-1 +kerning first=214 second=194 amount=-1 +kerning first=286 second=194 amount=-1 +kerning first=255 second=111 amount=-1 +kerning first=195 second=8249 amount=-1 +kerning first=344 second=339 amount=-1 +kerning first=333 second=255 amount=-1 +kerning first=375 second=234 amount=-1 +kerning first=369 second=255 amount=-1 +kerning first=8250 second=197 amount=-1 +kerning first=107 second=243 amount=-1 +kerning first=225 second=255 amount=-1 +kerning first=196 second=368 amount=-1 +kerning first=84 second=255 amount=-1 +kerning first=346 second=280 amount=-1 +kerning first=120 second=255 amount=-1 +kerning first=314 second=287 amount=-1 +kerning first=206 second=287 amount=-1 +kerning first=83 second=80 amount=-1 +kerning first=101 second=287 amount=-1 +kerning first=376 second=97 amount=-1 +kerning first=258 second=211 amount=-1 +kerning first=65 second=287 amount=-1 +kerning first=197 second=374 amount=-2 +kerning first=67 second=202 amount=-1 +kerning first=253 second=113 amount=-1 +kerning first=281 second=104 amount=-1 +kerning first=89 second=111 amount=-1 +kerning first=350 second=287 amount=-1 +kerning first=287 second=380 amount=-1 +kerning first=356 second=248 amount=-1 +kerning first=262 second=327 amount=-1 +kerning first=187 second=74 amount=-1 +kerning first=67 second=76 amount=-1 +kerning first=374 second=111 amount=-1 +kerning first=220 second=225 amount=-1 +kerning first=118 second=243 amount=-1 +kerning first=107 second=248 amount=-1 +kerning first=82 second=243 amount=-1 +kerning first=311 second=269 amount=-1 +kerning first=257 second=253 amount=-1 +kerning first=221 second=253 amount=-1 +kerning first=260 second=364 amount=-1 +kerning first=365 second=253 amount=-1 +kerning first=352 second=202 amount=-1 +kerning first=83 second=364 amount=-1 +kerning first=187 second=69 amount=-1 +kerning first=193 second=350 amount=-1 +kerning first=65 second=375 amount=-1 +kerning first=221 second=346 amount=-1 +kerning first=66 second=288 amount=-1 +kerning first=65 second=212 amount=-1 +kerning first=86 second=289 amount=-1 +kerning first=70 second=46 amount=-1 +kerning first=76 second=370 amount=-1 +kerning first=350 second=282 amount=-1 +kerning first=211 second=46 amount=-1 +kerning first=86 second=241 amount=-1 +kerning first=344 second=99 amount=-1 +kerning first=262 second=213 amount=-1 +kerning first=197 second=369 amount=-1 +kerning first=283 second=46 amount=-1 +kerning first=364 second=225 amount=-1 +kerning first=89 second=259 amount=-1 +kerning first=375 second=335 amount=-1 +kerning first=8250 second=192 amount=-1 +kerning first=262 second=332 amount=-1 +kerning first=235 second=311 amount=-1 +kerning first=303 second=335 amount=-1 +kerning first=286 second=44 amount=-1 +kerning first=8218 second=220 amount=-1 +kerning first=197 second=81 amount=-1 +kerning first=119 second=271 amount=-1 +kerning first=209 second=230 amount=-1 +kerning first=242 second=375 amount=-1 +kerning first=302 second=259 amount=-1 +kerning first=66 second=119 amount=-1 +kerning first=314 second=375 amount=-1 +kerning first=364 second=291 amount=-1 +kerning first=194 second=351 amount=-1 +kerning first=256 second=291 amount=-1 +kerning first=89 second=351 amount=-1 +kerning first=220 second=291 amount=-1 +kerning first=351 second=119 amount=-1 +kerning first=1069 second=1033 amount=-1 +kerning first=115 second=291 amount=-1 +kerning first=279 second=119 amount=-1 +kerning first=315 second=119 amount=-1 +kerning first=83 second=75 amount=-1 +kerning first=8216 second=275 amount=-1 +kerning first=89 second=210 amount=-1 +kerning first=217 second=256 amount=-1 +kerning first=194 second=210 amount=-1 +kerning first=194 second=284 amount=-1 +kerning first=223 second=314 amount=-1 +kerning first=255 second=263 amount=-1 +kerning first=317 second=8220 amount=-1 +kerning first=377 second=369 amount=-1 +kerning first=228 second=121 amount=-1 +kerning first=192 second=121 amount=-1 +kerning first=196 second=363 amount=-1 +kerning first=1059 second=1114 amount=-1 +kerning first=195 second=221 amount=-2 +kerning first=104 second=8249 amount=-1 +kerning first=66 second=196 amount=-1 +kerning first=304 second=363 amount=-1 +kerning first=354 second=377 amount=-1 +kerning first=8216 second=226 amount=-1 +kerning first=371 second=333 amount=-1 +kerning first=350 second=86 amount=-1 +kerning first=258 second=85 amount=-1 +kerning first=268 second=200 amount=-1 +kerning first=45 second=85 amount=-1 +kerning first=86 second=382 amount=-1 +kerning first=65 second=86 amount=-2 +kerning first=103 second=316 amount=-1 +kerning first=244 second=120 amount=-1 +kerning first=115 second=351 amount=-1 +kerning first=70 second=171 amount=-1 +kerning first=45 second=330 amount=-1 +kerning first=244 second=316 amount=-1 +kerning first=253 second=235 amount=-1 +kerning first=344 second=246 amount=-1 +kerning first=86 second=197 amount=-2 +kerning first=369 second=103 amount=-1 +kerning first=193 second=8221 amount=-1 +kerning first=229 second=8221 amount=-1 +kerning first=381 second=252 amount=-1 +kerning first=196 second=249 amount=-1 +kerning first=86 second=333 amount=-1 +kerning first=199 second=214 amount=-1 +kerning first=8217 second=111 amount=-1 +kerning first=283 second=103 amount=-1 +kerning first=209 second=226 amount=-1 +kerning first=106 second=103 amount=-1 +kerning first=76 second=379 amount=-1 +kerning first=70 second=103 amount=-1 +kerning first=8216 second=257 amount=-1 +kerning first=310 second=71 amount=-1 +kerning first=286 second=260 amount=-1 +kerning first=325 second=117 amount=-1 +kerning first=258 second=171 amount=-1 +kerning first=255 second=281 amount=-1 +kerning first=121 second=283 amount=-1 +kerning first=313 second=89 amount=-1 +kerning first=330 second=171 amount=-1 +kerning first=83 second=280 amount=-1 +kerning first=354 second=256 amount=-2 +kerning first=214 second=260 amount=-1 +kerning first=366 second=171 amount=-1 +kerning first=264 second=313 amount=-1 +kerning first=219 second=382 amount=-1 +kerning first=250 second=121 amount=-1 +kerning first=221 second=284 amount=-1 +kerning first=255 second=382 amount=-1 +kerning first=291 second=382 amount=-1 +kerning first=1059 second=1079 amount=-1 +kerning first=73 second=361 amount=-1 +kerning first=65 second=216 amount=-1 +kerning first=251 second=8221 amount=-1 +kerning first=110 second=8221 amount=-1 +kerning first=350 second=118 amount=-1 +kerning first=66 second=70 amount=-1 +kerning first=317 second=362 amount=-1 +kerning first=352 second=85 amount=-1 +kerning first=230 second=316 amount=-1 +kerning first=196 second=218 amount=-1 +kerning first=356 second=118 amount=-1 +kerning first=45 second=378 amount=-1 +kerning first=205 second=250 amount=-1 +kerning first=268 second=260 amount=-1 +kerning first=199 second=315 amount=-1 +kerning first=103 second=347 amount=-1 +kerning first=356 second=380 amount=-1 +kerning first=83 second=201 amount=-1 +kerning first=8216 second=235 amount=-1 +kerning first=321 second=84 amount=-1 +kerning first=354 second=227 amount=-1 +kerning first=86 second=8249 amount=-1 +kerning first=103 second=224 amount=-1 +kerning first=67 second=325 amount=-1 +kerning first=86 second=381 amount=-1 +kerning first=204 second=363 amount=-1 +kerning first=262 second=204 amount=-1 +kerning first=286 second=197 amount=-1 +kerning first=264 second=291 amount=-1 +kerning first=192 second=291 amount=-1 +kerning first=366 second=378 amount=-1 +kerning first=87 second=291 amount=-1 +kerning first=1046 second=1063 amount=-1 +kerning first=195 second=287 amount=-1 +kerning first=350 second=366 amount=-1 +kerning first=90 second=287 amount=-1 +kerning first=264 second=73 amount=-1 +kerning first=68 second=256 amount=-1 +kerning first=80 second=44 amount=-1 +kerning first=67 second=268 amount=-1 +kerning first=374 second=338 amount=-1 +kerning first=120 second=112 amount=-1 +kerning first=375 second=287 amount=-1 +kerning first=310 second=367 amount=-1 +kerning first=339 second=287 amount=-1 +kerning first=231 second=287 amount=-1 +kerning first=267 second=287 amount=-1 +kerning first=381 second=367 amount=-1 +kerning first=98 second=108 amount=-1 +kerning first=1059 second=1101 amount=-1 +kerning first=205 second=228 amount=-1 +kerning first=87 second=269 amount=-1 +kerning first=221 second=262 amount=-1 +kerning first=1061 second=1060 amount=-1 +kerning first=350 second=344 amount=-1 +kerning first=83 second=44 amount=-1 +kerning first=218 second=350 amount=-1 +kerning first=356 second=74 amount=-1 +kerning first=275 second=108 amount=-1 +kerning first=108 second=106 amount=-1 +kerning first=121 second=261 amount=-1 +kerning first=85 second=261 amount=-1 +kerning first=370 second=261 amount=-1 +kerning first=298 second=261 amount=-1 +kerning first=346 second=289 amount=-1 +kerning first=82 second=314 amount=-1 +kerning first=274 second=289 amount=-1 +kerning first=298 second=367 amount=-1 +kerning first=192 second=370 amount=-1 +kerning first=362 second=350 amount=-1 +kerning first=187 second=282 amount=-1 +kerning first=84 second=339 amount=-1 +kerning first=120 second=251 amount=-1 +kerning first=195 second=353 amount=-1 +kerning first=87 second=229 amount=-1 +kerning first=288 second=45 amount=-1 +kerning first=376 second=275 amount=-1 +kerning first=324 second=45 amount=-1 +kerning first=1061 second=1038 amount=-1 +kerning first=75 second=45 amount=-1 +kerning first=376 second=240 amount=-1 +kerning first=84 second=211 amount=-1 +kerning first=258 second=356 amount=-2 +kerning first=45 second=356 amount=-1 +kerning first=82 second=336 amount=-1 +kerning first=86 second=171 amount=-1 +kerning first=376 second=381 amount=-1 +kerning first=8220 second=224 amount=-1 +kerning first=84 second=352 amount=-1 +kerning first=350 second=194 amount=-1 +kerning first=74 second=226 amount=-1 +kerning first=258 second=255 amount=-1 +kerning first=232 second=119 amount=-1 +kerning first=287 second=226 amount=-1 +kerning first=45 second=255 amount=-1 +kerning first=375 second=113 amount=-1 +kerning first=246 second=44 amount=-1 +kerning first=258 second=81 amount=-1 +kerning first=196 second=119 amount=-1 +kerning first=323 second=226 amount=-1 +kerning first=376 second=119 amount=-1 +kerning first=221 second=227 amount=-1 +kerning first=117 second=253 amount=-1 +kerning first=248 second=314 amount=-1 +kerning first=303 second=113 amount=-1 +kerning first=231 second=225 amount=-1 +kerning first=88 second=363 amount=-1 +kerning first=255 second=243 amount=-1 +kerning first=67 second=290 amount=-1 +kerning first=193 second=363 amount=-1 +kerning first=354 second=331 amount=-1 +kerning first=376 second=79 amount=-1 +kerning first=366 second=193 amount=-1 +kerning first=66 second=103 amount=-1 +kerning first=256 second=8220 amount=-1 +kerning first=45 second=193 amount=-1 +kerning first=328 second=8220 amount=-1 +kerning first=210 second=44 amount=-1 +kerning first=196 second=79 amount=-1 +kerning first=222 second=193 amount=-1 +kerning first=268 second=79 amount=-1 +kerning first=202 second=289 amount=-1 +kerning first=81 second=193 amount=-1 +kerning first=199 second=192 amount=-1 +kerning first=253 second=8249 amount=-1 +kerning first=290 second=354 amount=-1 +kerning first=218 second=259 amount=-1 +kerning first=264 second=207 amount=-1 +kerning first=84 second=99 amount=-1 +kerning first=66 second=256 amount=-1 +kerning first=317 second=122 amount=-1 +kerning first=1043 second=1089 amount=-1 +kerning first=87 second=377 amount=-1 +kerning first=291 second=316 amount=-1 +kerning first=255 second=316 amount=-1 +kerning first=356 second=230 amount=-1 +kerning first=192 second=117 amount=-1 +kerning first=368 second=346 amount=-1 +kerning first=363 second=316 amount=-1 +kerning first=101 second=104 amount=-1 +kerning first=260 second=346 amount=-1 +kerning first=85 second=83 amount=-1 +kerning first=231 second=375 amount=-1 +kerning first=327 second=259 amount=-1 +kerning first=267 second=375 amount=-1 +kerning first=291 second=259 amount=-1 +kerning first=262 second=83 amount=-1 +kerning first=255 second=259 amount=-1 +kerning first=370 second=83 amount=-1 +kerning first=339 second=375 amount=-1 +kerning first=219 second=259 amount=-1 +kerning first=1059 second=1107 amount=-1 +kerning first=90 second=375 amount=-1 +kerning first=78 second=259 amount=-1 +kerning first=8250 second=289 amount=-1 +kerning first=195 second=375 amount=-1 +kerning first=288 second=197 amount=-1 +kerning first=236 second=103 amount=-1 +kerning first=66 second=331 amount=-1 +kerning first=376 second=196 amount=-2 +kerning first=350 second=82 amount=-1 +kerning first=200 second=103 amount=-1 +kerning first=268 second=196 amount=-1 +kerning first=268 second=77 amount=-1 +kerning first=356 second=336 amount=-1 +kerning first=87 second=335 amount=-1 +kerning first=350 second=278 amount=-1 +kerning first=229 second=8217 amount=-1 +kerning first=193 second=8217 amount=-1 +kerning first=199 second=75 amount=-1 +kerning first=1118 second=1103 amount=-1 +kerning first=209 second=361 amount=-1 +kerning first=187 second=65 amount=-1 +kerning first=232 second=253 amount=-1 +kerning first=258 second=334 amount=-1 +kerning first=375 second=353 amount=-1 +kerning first=196 second=253 amount=-1 +kerning first=289 second=115 amount=-1 +kerning first=347 second=121 amount=-1 +kerning first=256 second=374 amount=-2 +kerning first=275 second=121 amount=-1 +kerning first=87 second=339 amount=-1 +kerning first=245 second=318 amount=-1 +kerning first=281 second=318 amount=-1 +kerning first=8216 second=281 amount=-1 +kerning first=221 second=328 amount=-1 +kerning first=225 second=121 amount=-1 +kerning first=8250 second=80 amount=-1 +kerning first=120 second=121 amount=-1 +kerning first=87 second=326 amount=-1 +kerning first=277 second=316 amount=-1 +kerning first=84 second=121 amount=-1 +kerning first=80 second=196 amount=-1 +kerning first=221 second=196 amount=-2 +kerning first=288 second=89 amount=-1 +kerning first=376 second=231 amount=-1 +kerning first=302 second=228 amount=-1 +kerning first=89 second=228 amount=-1 +kerning first=281 second=375 amount=-1 +kerning first=253 second=333 amount=-1 +kerning first=317 second=375 amount=-1 +kerning first=353 second=375 amount=-1 +kerning first=317 second=221 amount=-1 +kerning first=266 second=260 amount=-1 +kerning first=193 second=213 amount=-1 +kerning first=262 second=323 amount=-1 +kerning first=88 second=213 amount=-1 +kerning first=311 second=99 amount=-1 +kerning first=199 second=302 amount=-1 +kerning first=245 second=375 amount=-1 +kerning first=267 second=118 amount=-1 +kerning first=205 second=227 amount=-1 +kerning first=87 second=379 amount=-1 +kerning first=262 second=270 amount=-1 +kerning first=310 second=284 amount=-1 +kerning first=193 second=266 amount=-1 +kerning first=1027 second=1103 amount=-1 +kerning first=200 second=291 amount=-1 +kerning first=66 second=110 amount=-1 +kerning first=88 second=266 amount=-1 +kerning first=330 second=103 amount=-1 +kerning first=366 second=103 amount=-1 +kerning first=258 second=103 amount=-1 +kerning first=1042 second=1038 amount=-1 +kerning first=120 second=118 amount=-1 +kerning first=260 second=214 amount=-1 +kerning first=254 second=253 amount=-1 +kerning first=117 second=103 amount=-1 +kerning first=199 second=8249 amount=-1 +kerning first=66 second=8217 amount=-1 +kerning first=269 second=224 amount=-1 +kerning first=67 second=334 amount=-1 +kerning first=232 second=44 amount=-1 +kerning first=379 second=249 amount=-1 +kerning first=102 second=8217 amount=1 +kerning first=371 second=232 amount=-1 +kerning first=305 second=171 amount=-1 +kerning first=71 second=46 amount=-1 +kerning first=206 second=117 amount=-1 +kerning first=65 second=117 amount=-1 +kerning first=376 second=284 amount=-1 +kerning first=8222 second=370 amount=-1 +kerning first=330 second=365 amount=-1 +kerning first=196 second=284 amount=-1 +kerning first=344 second=264 amount=-1 +kerning first=266 second=382 amount=-1 +kerning first=1046 second=1054 amount=-1 +kerning first=374 second=382 amount=-1 +kerning first=350 second=203 amount=-1 +kerning first=369 second=121 amount=-1 +kerning first=268 second=284 amount=-1 +kerning first=333 second=121 amount=-1 +kerning first=256 second=71 amount=-1 +kerning first=106 second=255 amount=-1 +kerning first=364 second=287 amount=-1 +kerning first=256 second=287 amount=-1 +kerning first=287 second=257 amount=-1 +kerning first=66 second=79 amount=-1 +kerning first=266 second=206 amount=-1 +kerning first=220 second=287 amount=-1 +kerning first=268 second=209 amount=-1 +kerning first=115 second=287 amount=-1 +kerning first=377 second=378 amount=-1 +kerning first=86 second=232 amount=-1 +kerning first=195 second=213 amount=-1 +kerning first=45 second=87 amount=-1 +kerning first=196 second=262 amount=-1 +kerning first=226 second=8221 amount=-1 +kerning first=74 second=257 amount=-1 +kerning first=8220 second=281 amount=-1 +kerning first=376 second=262 amount=-1 +kerning first=268 second=262 amount=-1 +kerning first=375 second=227 amount=-1 +kerning first=66 second=350 amount=-1 +kerning first=332 second=192 amount=-1 +kerning first=368 second=192 amount=-1 +kerning first=352 second=356 amount=-1 +kerning first=253 second=269 amount=-1 +kerning first=288 second=8249 amount=-1 +kerning first=258 second=290 amount=-1 +kerning first=187 second=274 amount=-1 +kerning first=324 second=8249 amount=-1 +kerning first=1114 second=1118 amount=-1 +kerning first=194 second=250 amount=-1 +kerning first=187 second=327 amount=-1 +kerning first=83 second=192 amount=-1 +kerning first=79 second=256 amount=-1 +kerning first=346 second=298 amount=-1 +kerning first=260 second=84 amount=-2 +kerning first=197 second=268 amount=-1 +kerning first=115 second=115 amount=-1 +kerning first=187 second=364 amount=-1 +kerning first=83 second=84 amount=-1 +kerning first=231 second=108 amount=-1 +kerning first=325 second=291 amount=-1 +kerning first=1047 second=1038 amount=-1 +kerning first=253 second=291 amount=-1 +kerning first=84 second=90 amount=-1 +kerning first=217 second=291 amount=-1 +kerning first=76 second=291 amount=-1 +kerning first=199 second=280 amount=-1 +kerning first=73 second=251 amount=-1 +kerning first=218 second=46 amount=-1 +kerning first=86 second=210 amount=-1 +kerning first=364 second=256 amount=-1 +kerning first=354 second=337 amount=-1 +kerning first=45 second=72 amount=-1 +kerning first=286 second=198 amount=-1 +kerning first=120 second=361 amount=-1 +kerning first=214 second=198 amount=-1 +kerning first=269 second=103 amount=-1 +kerning first=258 second=268 amount=-1 +kerning first=350 second=73 amount=-1 +kerning first=298 second=226 amount=-1 +kerning first=89 second=279 amount=-1 +kerning first=370 second=226 amount=-1 +kerning first=217 second=194 amount=-1 +kerning first=257 second=119 amount=-1 +kerning first=313 second=219 amount=-1 +kerning first=221 second=119 amount=-1 +kerning first=325 second=361 amount=-1 +kerning first=253 second=335 amount=-1 +kerning first=344 second=374 amount=-1 +kerning first=77 second=363 amount=-1 +kerning first=365 second=119 amount=-1 +kerning first=268 second=66 amount=-1 +kerning first=256 second=353 amount=-1 +kerning first=115 second=353 amount=-1 +kerning first=352 second=303 amount=-1 +kerning first=323 second=367 amount=-1 +kerning first=72 second=289 amount=-1 +kerning first=108 second=289 amount=-1 +kerning first=376 second=328 amount=-1 +kerning first=249 second=289 amount=-1 +kerning first=346 second=89 amount=-1 +kerning first=256 second=212 amount=-1 +kerning first=1046 second=1098 amount=-1 +kerning first=204 second=257 amount=-1 +kerning first=325 second=226 amount=-1 +kerning first=84 second=286 amount=-1 +kerning first=266 second=338 amount=-1 +kerning first=99 second=257 amount=-1 +kerning first=352 second=237 amount=-1 +kerning first=195 second=8220 amount=-1 +kerning first=89 second=338 amount=-1 +kerning first=8222 second=368 amount=-1 +kerning first=199 second=205 amount=-1 +kerning first=106 second=45 amount=-1 +kerning first=241 second=45 amount=-1 +kerning first=344 second=211 amount=-1 +kerning first=354 second=97 amount=-1 +kerning first=221 second=240 amount=-1 +kerning first=8250 second=364 amount=-1 +kerning first=197 second=290 amount=-1 +kerning first=197 second=356 amount=-2 +kerning first=8250 second=298 amount=-1 +kerning first=356 second=261 amount=-1 +kerning first=85 second=226 amount=-1 +kerning first=283 second=255 amount=-1 +kerning first=264 second=304 amount=-1 +kerning first=324 second=8221 amount=-1 +kerning first=121 second=226 amount=-1 +kerning first=380 second=112 amount=-1 +kerning first=266 second=77 amount=-1 +kerning first=339 second=104 amount=-1 +kerning first=8220 second=193 amount=-2 +kerning first=381 second=380 amount=-1 +kerning first=66 second=253 amount=-1 +kerning first=121 second=248 amount=-1 +kerning first=113 second=8217 amount=-1 +kerning first=243 second=253 amount=-1 +kerning first=315 second=253 amount=-1 +kerning first=279 second=253 amount=-1 +kerning first=1059 second=1057 amount=-1 +kerning first=356 second=283 amount=-1 +kerning first=351 second=253 amount=-1 +kerning first=192 second=86 amount=-2 +kerning first=212 second=65 amount=-1 +kerning first=87 second=260 amount=-2 +kerning first=197 second=334 amount=-1 +kerning first=356 second=65 amount=-2 +kerning first=333 second=46 amount=-1 +kerning first=313 second=382 amount=-1 +kerning first=336 second=260 amount=-1 +kerning first=45 second=202 amount=-1 +kerning first=107 second=283 amount=-1 +kerning first=84 second=264 amount=-1 +kerning first=255 second=347 amount=-1 +kerning first=234 second=318 amount=-1 +kerning first=264 second=260 amount=-1 +kerning first=291 second=347 amount=-1 +kerning first=8218 second=366 amount=-1 +kerning first=253 second=45 amount=-1 +kerning first=193 second=288 amount=-1 +kerning first=78 second=369 amount=-1 +kerning first=1118 second=1076 amount=-1 +kerning first=84 second=242 amount=-1 +kerning first=84 second=46 amount=-1 +kerning first=327 second=369 amount=-1 +kerning first=346 second=364 amount=-1 +kerning first=264 second=282 amount=-1 +kerning first=284 second=87 amount=-1 +kerning first=118 second=230 amount=-1 +kerning first=346 second=201 amount=-1 +kerning first=376 second=100 amount=-1 +kerning first=115 second=375 amount=-1 +kerning first=199 second=346 amount=-1 +kerning first=88 second=288 amount=-1 +kerning first=221 second=381 amount=-1 +kerning first=344 second=352 amount=-1 +kerning first=71 second=87 amount=-1 diff --git a/jme3-examples/src/main/resources/jme3test/font/FreeSerif16I.png b/jme3-examples/src/main/resources/jme3test/font/FreeSerif16I.png new file mode 100644 index 000000000..b6f222302 Binary files /dev/null and b/jme3-examples/src/main/resources/jme3test/font/FreeSerif16I.png differ diff --git a/jme3-examples/src/main/resources/jme3test/font/FreeSerif16Ipad5555.fnt b/jme3-examples/src/main/resources/jme3test/font/FreeSerif16Ipad5555.fnt new file mode 100644 index 000000000..4c7d888a2 --- /dev/null +++ b/jme3-examples/src/main/resources/jme3test/font/FreeSerif16Ipad5555.fnt @@ -0,0 +1,8030 @@ +info face="Free Serif" size=16 bold=0 italic=1 charset="" unicode=0 stretchH=100 smooth=1 aa=1 padding=5,5,5,5 spacing=-2,-2 +common lineHeight=30 base=16 scaleW=512 scaleH=512 pages=2 packed=0 +page id=0 file="FreeSerif16Ipad55551.png" +page id=1 file="FreeSerif16Ipad55552.png" +chars count=821 +char id=0 x=488 y=407 width=21 height=21 xoffset=-4 yoffset=0 xadvance=19 page=0 chnl=0 +char id=13 x=0 y=0 width=0 height=0 xoffset=-5 yoffset=0 xadvance=8 page=0 chnl=0 +char id=32 x=0 y=0 width=0 height=0 xoffset=-5 yoffset=0 xadvance=12 page=0 chnl=0 +char id=33 x=220 y=252 width=14 height=22 xoffset=-3 yoffset=0 xadvance=13 page=0 chnl=0 +char id=35 x=29 y=429 width=21 height=21 xoffset=-5 yoffset=0 xadvance=16 page=0 chnl=0 +char id=36 x=291 y=131 width=19 height=24 xoffset=-5 yoffset=-1 xadvance=16 page=0 chnl=0 +char id=37 x=234 y=252 width=22 height=22 xoffset=-3 yoffset=0 xadvance=21 page=0 chnl=0 +char id=38 x=256 y=252 width=22 height=22 xoffset=-4 yoffset=0 xadvance=20 page=0 chnl=0 +char id=39 x=498 y=429 width=12 height=15 xoffset=-3 yoffset=0 xadvance=11 page=0 chnl=0 +char id=40 x=310 y=131 width=17 height=24 xoffset=-4 yoffset=0 xadvance=13 page=0 chnl=0 +char id=41 x=327 y=131 width=17 height=24 xoffset=-6 yoffset=0 xadvance=13 page=0 chnl=0 +char id=47 x=278 y=252 width=20 height=22 xoffset=-6 yoffset=0 xadvance=12 page=0 chnl=0 +char id=48 x=298 y=252 width=18 height=22 xoffset=-4 yoffset=0 xadvance=16 page=0 chnl=0 +char id=49 x=50 y=429 width=16 height=21 xoffset=-4 yoffset=0 xadvance=16 page=0 chnl=0 +char id=50 x=66 y=429 width=19 height=21 xoffset=-5 yoffset=0 xadvance=16 page=0 chnl=0 +char id=51 x=316 y=252 width=18 height=22 xoffset=-5 yoffset=0 xadvance=16 page=0 chnl=0 +char id=52 x=85 y=429 width=19 height=21 xoffset=-5 yoffset=0 xadvance=16 page=0 chnl=0 +char id=53 x=334 y=252 width=19 height=22 xoffset=-5 yoffset=0 xadvance=16 page=0 chnl=0 +char id=54 x=353 y=252 width=20 height=22 xoffset=-4 yoffset=0 xadvance=16 page=0 chnl=0 +char id=55 x=373 y=252 width=20 height=22 xoffset=-4 yoffset=0 xadvance=16 page=0 chnl=0 +char id=56 x=393 y=252 width=18 height=22 xoffset=-4 yoffset=0 xadvance=16 page=0 chnl=0 +char id=57 x=411 y=252 width=19 height=22 xoffset=-5 yoffset=0 xadvance=16 page=0 chnl=0 +char id=59 x=496 y=319 width=15 height=21 xoffset=-5 yoffset=3 xadvance=12 page=0 chnl=0 +char id=63 x=430 y=252 width=18 height=22 xoffset=-3 yoffset=0 xadvance=15 page=0 chnl=0 +char id=64 x=448 y=252 width=23 height=22 xoffset=-3 yoffset=0 xadvance=23 page=0 chnl=0 +char id=65 x=104 y=429 width=22 height=21 xoffset=-5 yoffset=0 xadvance=20 page=0 chnl=0 +char id=66 x=126 y=429 width=21 height=21 xoffset=-5 yoffset=0 xadvance=19 page=0 chnl=0 +char id=67 x=471 y=252 width=21 height=22 xoffset=-4 yoffset=0 xadvance=19 page=0 chnl=0 +char id=68 x=147 y=429 width=22 height=21 xoffset=-5 yoffset=0 xadvance=20 page=0 chnl=0 +char id=69 x=169 y=429 width=21 height=21 xoffset=-5 yoffset=0 xadvance=18 page=0 chnl=0 +char id=70 x=190 y=429 width=22 height=21 xoffset=-5 yoffset=0 xadvance=17 page=0 chnl=0 +char id=71 x=0 y=275 width=22 height=22 xoffset=-4 yoffset=0 xadvance=20 page=0 chnl=0 +char id=72 x=212 y=429 width=25 height=21 xoffset=-5 yoffset=0 xadvance=20 page=0 chnl=0 +char id=73 x=237 y=429 width=18 height=21 xoffset=-5 yoffset=0 xadvance=13 page=0 chnl=0 +char id=74 x=492 y=252 width=19 height=22 xoffset=-5 yoffset=0 xadvance=14 page=0 chnl=0 +char id=75 x=255 y=429 width=23 height=21 xoffset=-5 yoffset=0 xadvance=20 page=0 chnl=0 +char id=76 x=278 y=429 width=20 height=21 xoffset=-5 yoffset=0 xadvance=18 page=0 chnl=0 +char id=77 x=298 y=429 width=27 height=21 xoffset=-5 yoffset=0 xadvance=22 page=0 chnl=0 +char id=78 x=22 y=275 width=25 height=22 xoffset=-5 yoffset=0 xadvance=20 page=0 chnl=0 +char id=79 x=47 y=275 width=22 height=22 xoffset=-4 yoffset=0 xadvance=20 page=0 chnl=0 +char id=80 x=325 y=429 width=22 height=21 xoffset=-5 yoffset=0 xadvance=17 page=0 chnl=0 +char id=81 x=344 y=131 width=22 height=24 xoffset=-4 yoffset=0 xadvance=20 page=0 chnl=0 +char id=82 x=347 y=429 width=21 height=21 xoffset=-5 yoffset=0 xadvance=19 page=0 chnl=0 +char id=83 x=69 y=275 width=19 height=22 xoffset=-4 yoffset=0 xadvance=17 page=0 chnl=0 +char id=84 x=368 y=429 width=22 height=21 xoffset=-4 yoffset=0 xadvance=18 page=0 chnl=0 +char id=85 x=88 y=275 width=23 height=22 xoffset=-3 yoffset=0 xadvance=20 page=0 chnl=0 +char id=86 x=111 y=275 width=22 height=22 xoffset=-3 yoffset=0 xadvance=20 page=0 chnl=0 +char id=87 x=133 y=275 width=27 height=22 xoffset=-4 yoffset=0 xadvance=23 page=0 chnl=0 +char id=88 x=390 y=429 width=24 height=21 xoffset=-5 yoffset=0 xadvance=20 page=0 chnl=0 +char id=89 x=414 y=429 width=23 height=21 xoffset=-3 yoffset=0 xadvance=20 page=0 chnl=0 +char id=90 x=437 y=429 width=23 height=21 xoffset=-5 yoffset=0 xadvance=18 page=0 chnl=0 +char id=91 x=366 y=131 width=17 height=24 xoffset=-4 yoffset=0 xadvance=13 page=0 chnl=0 +char id=92 x=160 y=275 width=14 height=22 xoffset=-4 yoffset=0 xadvance=13 page=0 chnl=0 +char id=93 x=383 y=131 width=17 height=24 xoffset=-6 yoffset=0 xadvance=13 page=0 chnl=0 +char id=98 x=174 y=275 width=18 height=22 xoffset=-4 yoffset=0 xadvance=16 page=0 chnl=0 +char id=100 x=192 y=275 width=19 height=22 xoffset=-5 yoffset=0 xadvance=16 page=0 chnl=0 +char id=102 x=460 y=429 width=20 height=21 xoffset=-5 yoffset=0 xadvance=13 page=0 chnl=0 +char id=103 x=211 y=275 width=19 height=22 xoffset=-5 yoffset=3 xadvance=16 page=0 chnl=0 +char id=104 x=480 y=429 width=18 height=21 xoffset=-5 yoffset=0 xadvance=16 page=0 chnl=0 +char id=105 x=0 y=451 width=15 height=21 xoffset=-5 yoffset=0 xadvance=12 page=0 chnl=0 +char id=106 x=460 y=30 width=18 height=25 xoffset=-7 yoffset=0 xadvance=12 page=0 chnl=0 +char id=107 x=15 y=451 width=19 height=21 xoffset=-5 yoffset=0 xadvance=16 page=0 chnl=0 +char id=108 x=34 y=451 width=15 height=21 xoffset=-5 yoffset=0 xadvance=12 page=0 chnl=0 +char id=109 x=0 y=493 width=23 height=18 xoffset=-5 yoffset=3 xadvance=20 page=0 chnl=0 +char id=110 x=23 y=493 width=18 height=18 xoffset=-5 yoffset=3 xadvance=16 page=0 chnl=0 +char id=112 x=230 y=275 width=20 height=22 xoffset=-6 yoffset=3 xadvance=16 page=0 chnl=0 +char id=113 x=250 y=275 width=19 height=22 xoffset=-5 yoffset=3 xadvance=16 page=0 chnl=0 +char id=114 x=41 y=493 width=18 height=18 xoffset=-5 yoffset=3 xadvance=13 page=0 chnl=0 +char id=116 x=49 y=451 width=16 height=21 xoffset=-4 yoffset=1 xadvance=12 page=0 chnl=0 +char id=120 x=59 y=493 width=19 height=18 xoffset=-5 yoffset=3 xadvance=16 page=0 chnl=0 +char id=121 x=269 y=275 width=19 height=22 xoffset=-5 yoffset=3 xadvance=16 page=0 chnl=0 +char id=122 x=78 y=493 width=18 height=18 xoffset=-5 yoffset=3 xadvance=15 page=0 chnl=0 +char id=123 x=400 y=131 width=16 height=24 xoffset=-3 yoffset=0 xadvance=16 page=0 chnl=0 +char id=124 x=288 y=275 width=14 height=22 xoffset=-4 yoffset=0 xadvance=11 page=0 chnl=0 +char id=125 x=416 y=131 width=16 height=24 xoffset=-4 yoffset=0 xadvance=16 page=0 chnl=0 +char id=160 x=0 y=0 width=0 height=0 xoffset=-5 yoffset=0 xadvance=12 page=0 chnl=0 +char id=161 x=302 y=275 width=15 height=22 xoffset=-5 yoffset=3 xadvance=13 page=0 chnl=0 +char id=162 x=143 y=228 width=18 height=23 xoffset=-4 yoffset=1 xadvance=16 page=0 chnl=0 +char id=163 x=317 y=275 width=19 height=22 xoffset=-5 yoffset=0 xadvance=16 page=0 chnl=0 +char id=165 x=65 y=451 width=23 height=21 xoffset=-5 yoffset=0 xadvance=16 page=0 chnl=0 +char id=166 x=336 y=275 width=14 height=22 xoffset=-4 yoffset=0 xadvance=11 page=0 chnl=0 +char id=167 x=432 y=131 width=17 height=24 xoffset=-4 yoffset=0 xadvance=16 page=0 chnl=0 +char id=169 x=161 y=228 width=23 height=23 xoffset=-4 yoffset=-1 xadvance=21 page=0 chnl=0 +char id=174 x=184 y=228 width=23 height=23 xoffset=-4 yoffset=-1 xadvance=21 page=0 chnl=0 +char id=177 x=88 y=451 width=20 height=21 xoffset=-5 yoffset=0 xadvance=17 page=0 chnl=0 +char id=181 x=350 y=275 width=19 height=22 xoffset=-5 yoffset=3 xadvance=16 page=0 chnl=0 +char id=182 x=449 y=131 width=20 height=24 xoffset=-4 yoffset=0 xadvance=16 page=0 chnl=0 +char id=188 x=369 y=275 width=21 height=22 xoffset=-4 yoffset=0 xadvance=20 page=0 chnl=0 +char id=189 x=390 y=275 width=22 height=22 xoffset=-4 yoffset=0 xadvance=20 page=0 chnl=0 +char id=190 x=412 y=275 width=21 height=22 xoffset=-4 yoffset=0 xadvance=20 page=0 chnl=0 +char id=191 x=433 y=275 width=16 height=22 xoffset=-5 yoffset=3 xadvance=15 page=0 chnl=0 +char id=192 x=478 y=30 width=22 height=25 xoffset=-5 yoffset=-4 xadvance=20 page=0 chnl=0 +char id=193 x=0 y=56 width=23 height=25 xoffset=-5 yoffset=-4 xadvance=20 page=0 chnl=0 +char id=194 x=23 y=56 width=22 height=25 xoffset=-5 yoffset=-4 xadvance=20 page=0 chnl=0 +char id=195 x=469 y=131 width=22 height=24 xoffset=-5 yoffset=-3 xadvance=20 page=0 chnl=0 +char id=196 x=0 y=156 width=22 height=24 xoffset=-5 yoffset=-3 xadvance=20 page=0 chnl=0 +char id=197 x=45 y=56 width=22 height=25 xoffset=-5 yoffset=-4 xadvance=20 page=0 chnl=0 +char id=198 x=108 y=451 width=25 height=21 xoffset=-5 yoffset=0 xadvance=22 page=0 chnl=0 +char id=199 x=67 y=56 width=21 height=25 xoffset=-4 yoffset=0 xadvance=19 page=0 chnl=0 +char id=200 x=88 y=56 width=21 height=25 xoffset=-5 yoffset=-4 xadvance=18 page=0 chnl=0 +char id=201 x=109 y=56 width=23 height=25 xoffset=-5 yoffset=-4 xadvance=18 page=0 chnl=0 +char id=202 x=132 y=56 width=21 height=25 xoffset=-5 yoffset=-4 xadvance=18 page=0 chnl=0 +char id=203 x=22 y=156 width=23 height=24 xoffset=-5 yoffset=-3 xadvance=18 page=0 chnl=0 +char id=204 x=153 y=56 width=20 height=25 xoffset=-5 yoffset=-4 xadvance=13 page=0 chnl=0 +char id=205 x=173 y=56 width=24 height=25 xoffset=-5 yoffset=-4 xadvance=13 page=0 chnl=0 +char id=206 x=197 y=56 width=20 height=25 xoffset=-5 yoffset=-4 xadvance=13 page=0 chnl=0 +char id=207 x=45 y=156 width=22 height=24 xoffset=-5 yoffset=-3 xadvance=13 page=0 chnl=0 +char id=208 x=133 y=451 width=22 height=21 xoffset=-5 yoffset=0 xadvance=20 page=0 chnl=0 +char id=209 x=217 y=56 width=25 height=25 xoffset=-5 yoffset=-3 xadvance=20 page=0 chnl=0 +char id=210 x=169 y=0 width=22 height=26 xoffset=-4 yoffset=-4 xadvance=20 page=0 chnl=0 +char id=211 x=191 y=0 width=22 height=26 xoffset=-4 yoffset=-4 xadvance=20 page=0 chnl=0 +char id=212 x=213 y=0 width=22 height=26 xoffset=-4 yoffset=-4 xadvance=20 page=0 chnl=0 +char id=213 x=242 y=56 width=22 height=25 xoffset=-4 yoffset=-3 xadvance=20 page=0 chnl=0 +char id=214 x=264 y=56 width=22 height=25 xoffset=-4 yoffset=-3 xadvance=20 page=0 chnl=0 +char id=215 x=96 y=493 width=20 height=18 xoffset=-5 yoffset=3 xadvance=17 page=0 chnl=0 +char id=216 x=67 y=156 width=23 height=24 xoffset=-5 yoffset=-1 xadvance=20 page=0 chnl=0 +char id=217 x=235 y=0 width=23 height=26 xoffset=-3 yoffset=-4 xadvance=20 page=0 chnl=0 +char id=218 x=258 y=0 width=23 height=26 xoffset=-3 yoffset=-4 xadvance=20 page=0 chnl=0 +char id=219 x=281 y=0 width=23 height=26 xoffset=-3 yoffset=-4 xadvance=20 page=0 chnl=0 +char id=220 x=286 y=56 width=23 height=25 xoffset=-3 yoffset=-3 xadvance=20 page=0 chnl=0 +char id=221 x=309 y=56 width=23 height=25 xoffset=-3 yoffset=-4 xadvance=20 page=0 chnl=0 +char id=222 x=155 y=451 width=20 height=21 xoffset=-5 yoffset=0 xadvance=17 page=0 chnl=0 +char id=223 x=449 y=275 width=19 height=22 xoffset=-5 yoffset=0 xadvance=16 page=0 chnl=0 +char id=224 x=468 y=275 width=18 height=22 xoffset=-5 yoffset=0 xadvance=15 page=0 chnl=0 +char id=225 x=486 y=275 width=22 height=22 xoffset=-5 yoffset=0 xadvance=15 page=0 chnl=0 +char id=226 x=0 y=297 width=18 height=22 xoffset=-5 yoffset=0 xadvance=15 page=0 chnl=0 +char id=227 x=18 y=297 width=18 height=22 xoffset=-5 yoffset=0 xadvance=15 page=0 chnl=0 +char id=228 x=175 y=451 width=22 height=21 xoffset=-5 yoffset=1 xadvance=15 page=0 chnl=0 +char id=229 x=207 y=228 width=18 height=23 xoffset=-5 yoffset=-1 xadvance=15 page=0 chnl=0 +char id=231 x=36 y=297 width=18 height=22 xoffset=-5 yoffset=3 xadvance=15 page=0 chnl=0 +char id=232 x=54 y=297 width=18 height=22 xoffset=-5 yoffset=0 xadvance=15 page=0 chnl=0 +char id=233 x=72 y=297 width=22 height=22 xoffset=-5 yoffset=0 xadvance=15 page=0 chnl=0 +char id=234 x=94 y=297 width=18 height=22 xoffset=-5 yoffset=0 xadvance=15 page=0 chnl=0 +char id=235 x=197 y=451 width=22 height=21 xoffset=-5 yoffset=1 xadvance=15 page=0 chnl=0 +char id=236 x=219 y=451 width=19 height=21 xoffset=-5 yoffset=0 xadvance=12 page=0 chnl=0 +char id=237 x=238 y=451 width=23 height=21 xoffset=-5 yoffset=0 xadvance=12 page=0 chnl=0 +char id=238 x=261 y=451 width=19 height=21 xoffset=-5 yoffset=0 xadvance=12 page=0 chnl=0 +char id=240 x=112 y=297 width=19 height=22 xoffset=-5 yoffset=0 xadvance=16 page=0 chnl=0 +char id=241 x=280 y=451 width=19 height=21 xoffset=-5 yoffset=0 xadvance=16 page=0 chnl=0 +char id=242 x=131 y=297 width=18 height=22 xoffset=-4 yoffset=0 xadvance=16 page=0 chnl=0 +char id=243 x=149 y=297 width=22 height=22 xoffset=-4 yoffset=0 xadvance=16 page=0 chnl=0 +char id=244 x=171 y=297 width=18 height=22 xoffset=-4 yoffset=0 xadvance=16 page=0 chnl=0 +char id=245 x=189 y=297 width=18 height=22 xoffset=-4 yoffset=0 xadvance=16 page=0 chnl=0 +char id=246 x=299 y=451 width=20 height=21 xoffset=-4 yoffset=1 xadvance=16 page=0 chnl=0 +char id=248 x=319 y=451 width=19 height=21 xoffset=-5 yoffset=2 xadvance=16 page=0 chnl=0 +char id=249 x=207 y=297 width=17 height=22 xoffset=-4 yoffset=0 xadvance=16 page=0 chnl=0 +char id=250 x=224 y=297 width=22 height=22 xoffset=-4 yoffset=0 xadvance=16 page=0 chnl=0 +char id=251 x=246 y=297 width=17 height=22 xoffset=-4 yoffset=0 xadvance=16 page=0 chnl=0 +char id=252 x=338 y=451 width=20 height=21 xoffset=-4 yoffset=1 xadvance=16 page=0 chnl=0 +char id=253 x=332 y=56 width=23 height=25 xoffset=-5 yoffset=0 xadvance=16 page=0 chnl=0 +char id=254 x=355 y=56 width=20 height=25 xoffset=-6 yoffset=0 xadvance=16 page=0 chnl=0 +char id=255 x=375 y=56 width=21 height=25 xoffset=-5 yoffset=0 xadvance=16 page=0 chnl=0 +char id=256 x=225 y=228 width=23 height=23 xoffset=-5 yoffset=-2 xadvance=20 page=0 chnl=0 +char id=257 x=358 y=451 width=22 height=21 xoffset=-5 yoffset=1 xadvance=15 page=0 chnl=0 +char id=258 x=396 y=56 width=22 height=25 xoffset=-5 yoffset=-4 xadvance=20 page=0 chnl=0 +char id=259 x=263 y=297 width=18 height=22 xoffset=-5 yoffset=0 xadvance=15 page=0 chnl=0 +char id=260 x=90 y=156 width=23 height=24 xoffset=-5 yoffset=0 xadvance=20 page=0 chnl=0 +char id=261 x=380 y=451 width=18 height=21 xoffset=-5 yoffset=3 xadvance=15 page=0 chnl=0 +char id=262 x=304 y=0 width=24 height=26 xoffset=-4 yoffset=-4 xadvance=19 page=0 chnl=0 +char id=263 x=281 y=297 width=23 height=22 xoffset=-5 yoffset=0 xadvance=15 page=0 chnl=0 +char id=264 x=328 y=0 width=21 height=26 xoffset=-4 yoffset=-4 xadvance=19 page=0 chnl=0 +char id=265 x=304 y=297 width=18 height=22 xoffset=-5 yoffset=0 xadvance=15 page=0 chnl=0 +char id=266 x=418 y=56 width=21 height=25 xoffset=-4 yoffset=-3 xadvance=19 page=0 chnl=0 +char id=267 x=398 y=451 width=18 height=21 xoffset=-5 yoffset=1 xadvance=15 page=0 chnl=0 +char id=268 x=349 y=0 width=21 height=26 xoffset=-4 yoffset=-4 xadvance=19 page=0 chnl=0 +char id=269 x=322 y=297 width=20 height=22 xoffset=-5 yoffset=0 xadvance=15 page=0 chnl=0 +char id=270 x=439 y=56 width=22 height=25 xoffset=-5 yoffset=-4 xadvance=20 page=0 chnl=0 +char id=271 x=342 y=297 width=27 height=22 xoffset=-5 yoffset=0 xadvance=18 page=0 chnl=0 +char id=272 x=416 y=451 width=22 height=21 xoffset=-5 yoffset=0 xadvance=20 page=0 chnl=0 +char id=273 x=369 y=297 width=21 height=22 xoffset=-5 yoffset=0 xadvance=16 page=0 chnl=0 +char id=274 x=248 y=228 width=21 height=23 xoffset=-5 yoffset=-2 xadvance=18 page=0 chnl=0 +char id=275 x=438 y=451 width=22 height=21 xoffset=-5 yoffset=1 xadvance=15 page=0 chnl=0 +char id=276 x=461 y=56 width=21 height=25 xoffset=-5 yoffset=-4 xadvance=18 page=0 chnl=0 +char id=277 x=390 y=297 width=18 height=22 xoffset=-5 yoffset=0 xadvance=15 page=0 chnl=0 +char id=278 x=113 y=156 width=21 height=24 xoffset=-5 yoffset=-3 xadvance=18 page=0 chnl=0 +char id=279 x=460 y=451 width=18 height=21 xoffset=-5 yoffset=1 xadvance=15 page=0 chnl=0 +char id=280 x=134 y=156 width=21 height=24 xoffset=-5 yoffset=0 xadvance=18 page=0 chnl=0 +char id=281 x=478 y=451 width=18 height=21 xoffset=-5 yoffset=3 xadvance=15 page=0 chnl=0 +char id=282 x=482 y=56 width=21 height=25 xoffset=-5 yoffset=-4 xadvance=18 page=0 chnl=0 +char id=283 x=408 y=297 width=18 height=22 xoffset=-5 yoffset=0 xadvance=15 page=0 chnl=0 +char id=284 x=370 y=0 width=22 height=26 xoffset=-4 yoffset=-4 xadvance=20 page=0 chnl=0 +char id=285 x=0 y=81 width=19 height=25 xoffset=-5 yoffset=0 xadvance=16 page=0 chnl=0 +char id=286 x=392 y=0 width=22 height=26 xoffset=-4 yoffset=-4 xadvance=20 page=0 chnl=0 +char id=287 x=19 y=81 width=19 height=25 xoffset=-5 yoffset=0 xadvance=16 page=0 chnl=0 +char id=288 x=38 y=81 width=22 height=25 xoffset=-4 yoffset=-3 xadvance=20 page=0 chnl=0 +char id=289 x=491 y=131 width=19 height=24 xoffset=-5 yoffset=1 xadvance=16 page=0 chnl=0 +char id=290 x=414 y=0 width=22 height=26 xoffset=-4 yoffset=0 xadvance=20 page=0 chnl=0 +char id=291 x=67 y=0 width=19 height=27 xoffset=-5 yoffset=-2 xadvance=16 page=0 chnl=0 +char id=292 x=60 y=81 width=25 height=25 xoffset=-5 yoffset=-4 xadvance=20 page=0 chnl=0 +char id=293 x=85 y=81 width=19 height=25 xoffset=-5 yoffset=-4 xadvance=16 page=0 chnl=0 +char id=294 x=0 y=472 width=25 height=21 xoffset=-5 yoffset=0 xadvance=20 page=0 chnl=0 +char id=295 x=25 y=472 width=18 height=21 xoffset=-5 yoffset=0 xadvance=16 page=0 chnl=0 +char id=296 x=155 y=156 width=20 height=24 xoffset=-5 yoffset=-3 xadvance=13 page=0 chnl=0 +char id=298 x=269 y=228 width=24 height=23 xoffset=-5 yoffset=-2 xadvance=13 page=0 chnl=0 +char id=300 x=104 y=81 width=20 height=25 xoffset=-5 yoffset=-4 xadvance=13 page=0 chnl=0 +char id=301 x=43 y=472 width=19 height=21 xoffset=-5 yoffset=0 xadvance=12 page=0 chnl=0 +char id=302 x=175 y=156 width=18 height=24 xoffset=-5 yoffset=0 xadvance=13 page=0 chnl=0 +char id=303 x=193 y=156 width=15 height=24 xoffset=-5 yoffset=0 xadvance=12 page=0 chnl=0 +char id=304 x=208 y=156 width=18 height=24 xoffset=-5 yoffset=-3 xadvance=13 page=0 chnl=0 +char id=305 x=116 y=493 width=15 height=18 xoffset=-5 yoffset=3 xadvance=12 page=0 chnl=0 +char id=306 x=426 y=297 width=24 height=22 xoffset=-5 yoffset=0 xadvance=19 page=0 chnl=0 +char id=307 x=124 y=81 width=19 height=25 xoffset=-5 yoffset=0 xadvance=16 page=0 chnl=0 +char id=308 x=436 y=0 width=21 height=26 xoffset=-5 yoffset=-4 xadvance=14 page=0 chnl=0 +char id=309 x=143 y=81 width=22 height=25 xoffset=-7 yoffset=0 xadvance=12 page=0 chnl=0 +char id=310 x=457 y=0 width=23 height=26 xoffset=-5 yoffset=0 xadvance=20 page=0 chnl=0 +char id=311 x=480 y=0 width=19 height=26 xoffset=-5 yoffset=0 xadvance=16 page=0 chnl=0 +char id=312 x=131 y=493 width=19 height=18 xoffset=-5 yoffset=3 xadvance=16 page=0 chnl=0 +char id=313 x=165 y=81 width=20 height=25 xoffset=-5 yoffset=-4 xadvance=18 page=0 chnl=0 +char id=314 x=185 y=81 width=24 height=25 xoffset=-5 yoffset=-4 xadvance=12 page=0 chnl=0 +char id=315 x=0 y=30 width=20 height=26 xoffset=-5 yoffset=0 xadvance=18 page=0 chnl=0 +char id=316 x=20 y=30 width=15 height=26 xoffset=-5 yoffset=0 xadvance=12 page=0 chnl=0 +char id=317 x=62 y=472 width=23 height=21 xoffset=-5 yoffset=0 xadvance=18 page=0 chnl=0 +char id=318 x=85 y=472 width=23 height=21 xoffset=-5 yoffset=0 xadvance=14 page=0 chnl=0 +char id=319 x=108 y=472 width=20 height=21 xoffset=-5 yoffset=0 xadvance=18 page=0 chnl=0 +char id=320 x=128 y=472 width=17 height=21 xoffset=-5 yoffset=0 xadvance=15 page=0 chnl=0 +char id=321 x=145 y=472 width=20 height=21 xoffset=-5 yoffset=0 xadvance=18 page=0 chnl=0 +char id=322 x=165 y=472 width=17 height=21 xoffset=-5 yoffset=0 xadvance=12 page=0 chnl=0 +char id=323 x=35 y=30 width=25 height=26 xoffset=-5 yoffset=-4 xadvance=20 page=0 chnl=0 +char id=324 x=182 y=472 width=23 height=21 xoffset=-5 yoffset=0 xadvance=16 page=0 chnl=0 +char id=325 x=60 y=30 width=25 height=26 xoffset=-5 yoffset=0 xadvance=20 page=0 chnl=0 +char id=326 x=293 y=228 width=18 height=23 xoffset=-5 yoffset=3 xadvance=16 page=0 chnl=0 +char id=327 x=85 y=30 width=25 height=26 xoffset=-5 yoffset=-4 xadvance=20 page=0 chnl=0 +char id=328 x=205 y=472 width=19 height=21 xoffset=-5 yoffset=0 xadvance=16 page=0 chnl=0 +char id=329 x=224 y=472 width=18 height=21 xoffset=-4 yoffset=0 xadvance=17 page=0 chnl=0 +char id=330 x=450 y=297 width=22 height=22 xoffset=-5 yoffset=0 xadvance=20 page=0 chnl=0 +char id=331 x=472 y=297 width=18 height=22 xoffset=-5 yoffset=3 xadvance=16 page=0 chnl=0 +char id=332 x=226 y=156 width=22 height=24 xoffset=-4 yoffset=-2 xadvance=20 page=0 chnl=0 +char id=333 x=242 y=472 width=20 height=21 xoffset=-4 yoffset=1 xadvance=16 page=0 chnl=0 +char id=334 x=110 y=30 width=22 height=26 xoffset=-4 yoffset=-4 xadvance=20 page=0 chnl=0 +char id=335 x=490 y=297 width=18 height=22 xoffset=-4 yoffset=0 xadvance=16 page=0 chnl=0 +char id=336 x=132 y=30 width=29 height=26 xoffset=-4 yoffset=-4 xadvance=20 page=0 chnl=0 +char id=337 x=0 y=319 width=27 height=22 xoffset=-4 yoffset=0 xadvance=16 page=0 chnl=0 +char id=338 x=27 y=319 width=26 height=22 xoffset=-4 yoffset=0 xadvance=22 page=0 chnl=0 +char id=340 x=209 y=81 width=21 height=25 xoffset=-5 yoffset=-4 xadvance=19 page=0 chnl=0 +char id=341 x=262 y=472 width=22 height=21 xoffset=-5 yoffset=0 xadvance=13 page=0 chnl=0 +char id=342 x=161 y=30 width=21 height=26 xoffset=-5 yoffset=0 xadvance=19 page=0 chnl=0 +char id=343 x=311 y=228 width=18 height=23 xoffset=-5 yoffset=3 xadvance=13 page=0 chnl=0 +char id=344 x=230 y=81 width=21 height=25 xoffset=-5 yoffset=-4 xadvance=19 page=0 chnl=0 +char id=345 x=284 y=472 width=19 height=21 xoffset=-5 yoffset=0 xadvance=13 page=0 chnl=0 +char id=346 x=182 y=30 width=23 height=26 xoffset=-4 yoffset=-4 xadvance=17 page=0 chnl=0 +char id=347 x=53 y=319 width=23 height=22 xoffset=-5 yoffset=0 xadvance=14 page=0 chnl=0 +char id=348 x=205 y=30 width=19 height=26 xoffset=-4 yoffset=-4 xadvance=17 page=0 chnl=0 +char id=349 x=76 y=319 width=18 height=22 xoffset=-5 yoffset=0 xadvance=14 page=0 chnl=0 +char id=350 x=251 y=81 width=19 height=25 xoffset=-4 yoffset=0 xadvance=17 page=0 chnl=0 +char id=351 x=94 y=319 width=17 height=22 xoffset=-5 yoffset=3 xadvance=14 page=0 chnl=0 +char id=352 x=224 y=30 width=19 height=26 xoffset=-4 yoffset=-4 xadvance=17 page=0 chnl=0 +char id=353 x=111 y=319 width=19 height=22 xoffset=-5 yoffset=0 xadvance=14 page=0 chnl=0 +char id=354 x=270 y=81 width=22 height=25 xoffset=-4 yoffset=0 xadvance=18 page=0 chnl=0 +char id=355 x=248 y=156 width=17 height=24 xoffset=-5 yoffset=1 xadvance=12 page=0 chnl=0 +char id=356 x=292 y=81 width=22 height=25 xoffset=-4 yoffset=-4 xadvance=18 page=0 chnl=0 +char id=357 x=130 y=319 width=23 height=22 xoffset=-4 yoffset=0 xadvance=15 page=0 chnl=0 +char id=358 x=303 y=472 width=22 height=21 xoffset=-4 yoffset=0 xadvance=18 page=0 chnl=0 +char id=359 x=325 y=472 width=17 height=21 xoffset=-5 yoffset=1 xadvance=12 page=0 chnl=0 +char id=360 x=314 y=81 width=23 height=25 xoffset=-3 yoffset=-3 xadvance=20 page=0 chnl=0 +char id=361 x=342 y=472 width=18 height=21 xoffset=-4 yoffset=1 xadvance=16 page=0 chnl=0 +char id=362 x=265 y=156 width=23 height=24 xoffset=-3 yoffset=-2 xadvance=20 page=0 chnl=0 +char id=363 x=360 y=472 width=20 height=21 xoffset=-4 yoffset=1 xadvance=16 page=0 chnl=0 +char id=364 x=243 y=30 width=23 height=26 xoffset=-3 yoffset=-4 xadvance=20 page=0 chnl=0 +char id=365 x=153 y=319 width=18 height=22 xoffset=-4 yoffset=0 xadvance=16 page=0 chnl=0 +char id=366 x=266 y=30 width=23 height=26 xoffset=-3 yoffset=-4 xadvance=20 page=0 chnl=0 +char id=367 x=329 y=228 width=17 height=23 xoffset=-4 yoffset=-1 xadvance=16 page=0 chnl=0 +char id=368 x=289 y=30 width=28 height=26 xoffset=-3 yoffset=-4 xadvance=20 page=0 chnl=0 +char id=369 x=171 y=319 width=27 height=22 xoffset=-4 yoffset=0 xadvance=16 page=0 chnl=0 +char id=370 x=288 y=156 width=23 height=24 xoffset=-3 yoffset=0 xadvance=20 page=0 chnl=0 +char id=371 x=380 y=472 width=17 height=21 xoffset=-4 yoffset=3 xadvance=16 page=0 chnl=0 +char id=372 x=317 y=30 width=27 height=26 xoffset=-4 yoffset=-4 xadvance=23 page=0 chnl=0 +char id=373 x=198 y=319 width=22 height=22 xoffset=-4 yoffset=0 xadvance=20 page=0 chnl=0 +char id=374 x=337 y=81 width=23 height=25 xoffset=-3 yoffset=-4 xadvance=20 page=0 chnl=0 +char id=375 x=360 y=81 width=19 height=25 xoffset=-5 yoffset=0 xadvance=16 page=0 chnl=0 +char id=376 x=311 y=156 width=23 height=24 xoffset=-3 yoffset=-3 xadvance=20 page=0 chnl=0 +char id=377 x=379 y=81 width=23 height=25 xoffset=-5 yoffset=-4 xadvance=18 page=0 chnl=0 +char id=378 x=397 y=472 width=22 height=21 xoffset=-5 yoffset=0 xadvance=15 page=0 chnl=0 +char id=379 x=334 y=156 width=23 height=24 xoffset=-5 yoffset=-3 xadvance=18 page=0 chnl=0 +char id=381 x=402 y=81 width=23 height=25 xoffset=-5 yoffset=-4 xadvance=18 page=0 chnl=0 +char id=382 x=419 y=472 width=18 height=21 xoffset=-5 yoffset=0 xadvance=15 page=0 chnl=0 +char id=383 x=437 y=472 width=20 height=21 xoffset=-5 yoffset=0 xadvance=13 page=0 chnl=0 +char id=894 x=457 y=472 width=17 height=21 xoffset=-5 yoffset=3 xadvance=12 page=0 chnl=0 +char id=902 x=220 y=319 width=22 height=22 xoffset=-5 yoffset=-1 xadvance=20 page=0 chnl=0 +char id=904 x=242 y=319 width=27 height=22 xoffset=-4 yoffset=-1 xadvance=21 page=0 chnl=0 +char id=905 x=269 y=319 width=30 height=22 xoffset=-4 yoffset=-1 xadvance=22 page=0 chnl=0 +char id=906 x=299 y=319 width=24 height=22 xoffset=-4 yoffset=-1 xadvance=16 page=0 chnl=0 +char id=908 x=346 y=228 width=26 height=23 xoffset=-4 yoffset=-1 xadvance=21 page=0 chnl=0 +char id=910 x=323 y=319 width=26 height=22 xoffset=-4 yoffset=-1 xadvance=22 page=0 chnl=0 +char id=911 x=349 y=319 width=24 height=22 xoffset=-4 yoffset=-1 xadvance=22 page=0 chnl=0 +char id=912 x=357 y=156 width=16 height=24 xoffset=-5 yoffset=-2 xadvance=13 page=0 chnl=0 +char id=913 x=474 y=472 width=22 height=21 xoffset=-5 yoffset=0 xadvance=20 page=0 chnl=0 +char id=920 x=373 y=319 width=22 height=22 xoffset=-4 yoffset=0 xadvance=20 page=0 chnl=0 +char id=925 x=395 y=319 width=25 height=22 xoffset=-5 yoffset=0 xadvance=20 page=0 chnl=0 +char id=927 x=420 y=319 width=22 height=22 xoffset=-4 yoffset=0 xadvance=20 page=0 chnl=0 +char id=938 x=373 y=156 width=22 height=24 xoffset=-5 yoffset=-3 xadvance=13 page=0 chnl=0 +char id=939 x=395 y=156 width=22 height=24 xoffset=-3 yoffset=-3 xadvance=19 page=0 chnl=0 +char id=940 x=417 y=156 width=19 height=24 xoffset=-4 yoffset=-2 xadvance=17 page=0 chnl=0 +char id=941 x=436 y=156 width=18 height=24 xoffset=-5 yoffset=-2 xadvance=15 page=0 chnl=0 +char id=942 x=86 y=0 width=18 height=27 xoffset=-4 yoffset=-2 xadvance=17 page=0 chnl=0 +char id=943 x=454 y=156 width=15 height=24 xoffset=-4 yoffset=-2 xadvance=13 page=0 chnl=0 +char id=944 x=372 y=228 width=18 height=23 xoffset=-4 yoffset=-1 xadvance=16 page=0 chnl=0 +char id=946 x=425 y=81 width=19 height=25 xoffset=-5 yoffset=0 xadvance=16 page=0 chnl=0 +char id=947 x=442 y=319 width=18 height=22 xoffset=-4 yoffset=3 xadvance=16 page=0 chnl=0 +char id=948 x=460 y=319 width=18 height=22 xoffset=-4 yoffset=0 xadvance=17 page=0 chnl=0 +char id=950 x=344 y=30 width=18 height=26 xoffset=-4 yoffset=-1 xadvance=15 page=0 chnl=0 +char id=951 x=478 y=319 width=18 height=22 xoffset=-4 yoffset=3 xadvance=17 page=0 chnl=0 +char id=952 x=0 y=341 width=18 height=22 xoffset=-4 yoffset=0 xadvance=17 page=0 chnl=0 +char id=954 x=150 y=493 width=19 height=18 xoffset=-4 yoffset=3 xadvance=17 page=0 chnl=0 +char id=955 x=18 y=341 width=18 height=22 xoffset=-5 yoffset=0 xadvance=16 page=0 chnl=0 +char id=956 x=36 y=341 width=19 height=22 xoffset=-5 yoffset=3 xadvance=17 page=0 chnl=0 +char id=957 x=169 y=493 width=18 height=18 xoffset=-4 yoffset=3 xadvance=16 page=0 chnl=0 +char id=958 x=444 y=81 width=19 height=25 xoffset=-5 yoffset=-1 xadvance=16 page=0 chnl=0 +char id=961 x=55 y=341 width=19 height=22 xoffset=-5 yoffset=3 xadvance=16 page=0 chnl=0 +char id=962 x=74 y=341 width=17 height=22 xoffset=-4 yoffset=3 xadvance=15 page=0 chnl=0 +char id=966 x=91 y=341 width=20 height=22 xoffset=-4 yoffset=3 xadvance=18 page=0 chnl=0 +char id=967 x=111 y=341 width=20 height=22 xoffset=-6 yoffset=3 xadvance=16 page=0 chnl=0 +char id=968 x=469 y=156 width=21 height=24 xoffset=-4 yoffset=1 xadvance=19 page=0 chnl=0 +char id=970 x=131 y=341 width=19 height=22 xoffset=-4 yoffset=0 xadvance=13 page=0 chnl=0 +char id=971 x=150 y=341 width=20 height=22 xoffset=-4 yoffset=0 xadvance=16 page=0 chnl=0 +char id=972 x=490 y=156 width=20 height=24 xoffset=-4 yoffset=-2 xadvance=16 page=0 chnl=0 +char id=973 x=390 y=228 width=18 height=23 xoffset=-4 yoffset=-1 xadvance=16 page=0 chnl=0 +char id=974 x=408 y=228 width=21 height=23 xoffset=-4 yoffset=-1 xadvance=19 page=0 chnl=0 +char id=976 x=429 y=228 width=18 height=23 xoffset=-4 yoffset=-1 xadvance=17 page=0 chnl=0 +char id=977 x=447 y=228 width=21 height=23 xoffset=-4 yoffset=-1 xadvance=17 page=0 chnl=0 +char id=979 x=170 y=341 width=25 height=22 xoffset=-4 yoffset=-1 xadvance=21 page=0 chnl=0 +char id=980 x=0 y=180 width=22 height=24 xoffset=-4 yoffset=-3 xadvance=18 page=0 chnl=0 +char id=981 x=22 y=180 width=20 height=24 xoffset=-4 yoffset=1 xadvance=18 page=0 chnl=0 +char id=985 x=195 y=341 width=18 height=22 xoffset=-4 yoffset=3 xadvance=16 page=0 chnl=0 +char id=987 x=213 y=341 width=18 height=22 xoffset=-5 yoffset=3 xadvance=15 page=0 chnl=0 +char id=989 x=231 y=341 width=21 height=22 xoffset=-6 yoffset=3 xadvance=15 page=0 chnl=0 +char id=990 x=252 y=341 width=20 height=22 xoffset=-4 yoffset=0 xadvance=19 page=0 chnl=0 +char id=991 x=463 y=81 width=16 height=25 xoffset=-4 yoffset=-1 xadvance=14 page=0 chnl=0 +char id=993 x=479 y=81 width=20 height=25 xoffset=-5 yoffset=-1 xadvance=17 page=0 chnl=0 +char id=994 x=0 y=106 width=27 height=25 xoffset=-5 yoffset=0 xadvance=23 page=0 chnl=0 +char id=995 x=272 y=341 width=22 height=22 xoffset=-5 yoffset=3 xadvance=19 page=0 chnl=0 +char id=996 x=42 y=180 width=21 height=24 xoffset=-4 yoffset=0 xadvance=17 page=0 chnl=0 +char id=997 x=294 y=341 width=19 height=22 xoffset=-5 yoffset=3 xadvance=16 page=0 chnl=0 +char id=998 x=63 y=180 width=20 height=24 xoffset=-5 yoffset=0 xadvance=17 page=0 chnl=0 +char id=1000 x=468 y=228 width=20 height=23 xoffset=-5 yoffset=0 xadvance=16 page=0 chnl=0 +char id=1002 x=313 y=341 width=23 height=22 xoffset=-5 yoffset=0 xadvance=21 page=0 chnl=0 +char id=1004 x=83 y=180 width=23 height=24 xoffset=-4 yoffset=-2 xadvance=17 page=0 chnl=0 +char id=1006 x=362 y=30 width=20 height=26 xoffset=-4 yoffset=-2 xadvance=18 page=0 chnl=0 +char id=1007 x=106 y=180 width=17 height=24 xoffset=-4 yoffset=1 xadvance=15 page=0 chnl=0 +char id=1009 x=336 y=341 width=19 height=22 xoffset=-5 yoffset=3 xadvance=17 page=0 chnl=0 +char id=1011 x=27 y=106 width=18 height=25 xoffset=-7 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1012 x=355 y=341 width=22 height=22 xoffset=-4 yoffset=0 xadvance=20 page=0 chnl=0 +char id=1016 x=45 y=106 width=18 height=25 xoffset=-4 yoffset=0 xadvance=17 page=0 chnl=0 +char id=1017 x=377 y=341 width=21 height=22 xoffset=-4 yoffset=0 xadvance=19 page=0 chnl=0 +char id=1019 x=398 y=341 width=22 height=22 xoffset=-5 yoffset=3 xadvance=19 page=0 chnl=0 +char id=1020 x=420 y=341 width=22 height=22 xoffset=-7 yoffset=3 xadvance=17 page=0 chnl=0 +char id=1021 x=442 y=341 width=22 height=22 xoffset=-5 yoffset=0 xadvance=19 page=0 chnl=0 +char id=1022 x=464 y=341 width=21 height=22 xoffset=-4 yoffset=0 xadvance=24 page=0 chnl=0 +char id=1023 x=485 y=341 width=22 height=22 xoffset=-5 yoffset=0 xadvance=24 page=0 chnl=0 +char id=1024 x=63 y=106 width=25 height=25 xoffset=-5 yoffset=-4 xadvance=18 page=0 chnl=0 +char id=1025 x=123 y=180 width=25 height=24 xoffset=-5 yoffset=-3 xadvance=18 page=0 chnl=0 +char id=1026 x=0 y=363 width=22 height=22 xoffset=-4 yoffset=0 xadvance=20 page=0 chnl=0 +char id=1027 x=88 y=106 width=24 height=25 xoffset=-5 yoffset=-4 xadvance=17 page=0 chnl=0 +char id=1028 x=22 y=363 width=21 height=22 xoffset=-4 yoffset=0 xadvance=19 page=0 chnl=0 +char id=1029 x=43 y=363 width=19 height=22 xoffset=-5 yoffset=0 xadvance=16 page=0 chnl=0 +char id=1031 x=148 y=180 width=23 height=24 xoffset=-5 yoffset=-3 xadvance=13 page=0 chnl=0 +char id=1032 x=62 y=363 width=19 height=22 xoffset=-5 yoffset=0 xadvance=14 page=0 chnl=0 +char id=1033 x=81 y=363 width=26 height=22 xoffset=-5 yoffset=0 xadvance=23 page=0 chnl=0 +char id=1035 x=107 y=363 width=22 height=22 xoffset=-4 yoffset=0 xadvance=21 page=0 chnl=0 +char id=1036 x=112 y=106 width=24 height=25 xoffset=-5 yoffset=-4 xadvance=19 page=0 chnl=0 +char id=1037 x=136 y=106 width=25 height=25 xoffset=-5 yoffset=-4 xadvance=20 page=0 chnl=0 +char id=1038 x=161 y=106 width=25 height=25 xoffset=-4 yoffset=-3 xadvance=19 page=0 chnl=0 +char id=1039 x=171 y=180 width=25 height=24 xoffset=-5 yoffset=0 xadvance=20 page=0 chnl=0 +char id=1044 x=196 y=180 width=24 height=24 xoffset=-6 yoffset=0 xadvance=18 page=0 chnl=0 +char id=1047 x=129 y=363 width=21 height=22 xoffset=-5 yoffset=0 xadvance=17 page=0 chnl=0 +char id=1049 x=220 y=180 width=25 height=24 xoffset=-5 yoffset=-3 xadvance=20 page=0 chnl=0 +char id=1051 x=150 y=363 width=24 height=22 xoffset=-5 yoffset=0 xadvance=19 page=0 chnl=0 +char id=1054 x=174 y=363 width=22 height=22 xoffset=-4 yoffset=0 xadvance=20 page=0 chnl=0 +char id=1057 x=196 y=363 width=21 height=22 xoffset=-4 yoffset=0 xadvance=19 page=0 chnl=0 +char id=1059 x=217 y=363 width=25 height=22 xoffset=-4 yoffset=0 xadvance=19 page=0 chnl=0 +char id=1062 x=245 y=180 width=25 height=24 xoffset=-5 yoffset=0 xadvance=20 page=0 chnl=0 +char id=1065 x=270 y=180 width=29 height=24 xoffset=-5 yoffset=0 xadvance=24 page=0 chnl=0 +char id=1069 x=242 y=363 width=22 height=22 xoffset=-5 yoffset=0 xadvance=19 page=0 chnl=0 +char id=1070 x=264 y=363 width=27 height=22 xoffset=-5 yoffset=0 xadvance=23 page=0 chnl=0 +char id=1073 x=488 y=228 width=18 height=23 xoffset=-4 yoffset=-1 xadvance=16 page=0 chnl=0 +char id=1074 x=187 y=493 width=18 height=18 xoffset=-5 yoffset=3 xadvance=15 page=0 chnl=0 +char id=1075 x=205 y=493 width=19 height=18 xoffset=-5 yoffset=3 xadvance=14 page=0 chnl=0 +char id=1078 x=224 y=493 width=22 height=18 xoffset=-5 yoffset=3 xadvance=19 page=0 chnl=0 +char id=1080 x=246 y=493 width=21 height=18 xoffset=-5 yoffset=3 xadvance=16 page=0 chnl=0 +char id=1082 x=267 y=493 width=19 height=18 xoffset=-5 yoffset=3 xadvance=16 page=0 chnl=0 +char id=1085 x=286 y=493 width=21 height=18 xoffset=-5 yoffset=3 xadvance=16 page=0 chnl=0 +char id=1087 x=307 y=493 width=21 height=18 xoffset=-5 yoffset=3 xadvance=16 page=0 chnl=0 +char id=1088 x=291 y=363 width=20 height=22 xoffset=-6 yoffset=3 xadvance=16 page=0 chnl=0 +char id=1090 x=328 y=493 width=17 height=18 xoffset=-4 yoffset=3 xadvance=15 page=0 chnl=0 +char id=1091 x=311 y=363 width=19 height=22 xoffset=-5 yoffset=3 xadvance=16 page=0 chnl=0 +char id=1092 x=186 y=106 width=22 height=25 xoffset=-5 yoffset=0 xadvance=19 page=0 chnl=0 +char id=1093 x=345 y=493 width=19 height=18 xoffset=-5 yoffset=3 xadvance=16 page=0 chnl=0 +char id=1095 x=364 y=493 width=20 height=18 xoffset=-4 yoffset=3 xadvance=16 page=0 chnl=0 +char id=1096 x=384 y=493 width=25 height=18 xoffset=-5 yoffset=3 xadvance=20 page=0 chnl=0 +char id=1098 x=409 y=493 width=18 height=18 xoffset=-4 yoffset=3 xadvance=16 page=0 chnl=0 +char id=1099 x=427 y=493 width=23 height=18 xoffset=-5 yoffset=3 xadvance=18 page=0 chnl=0 +char id=1100 x=450 y=493 width=17 height=18 xoffset=-5 yoffset=3 xadvance=15 page=0 chnl=0 +char id=1103 x=467 y=493 width=19 height=18 xoffset=-5 yoffset=3 xadvance=16 page=0 chnl=0 +char id=1104 x=330 y=363 width=19 height=22 xoffset=-4 yoffset=0 xadvance=15 page=0 chnl=0 +char id=1105 x=349 y=363 width=21 height=22 xoffset=-4 yoffset=0 xadvance=15 page=0 chnl=0 +char id=1106 x=208 y=106 width=18 height=25 xoffset=-5 yoffset=0 xadvance=16 page=0 chnl=0 +char id=1110 x=496 y=451 width=15 height=21 xoffset=-5 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1112 x=226 y=106 width=18 height=25 xoffset=-7 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1114 x=486 y=493 width=22 height=18 xoffset=-5 yoffset=3 xadvance=19 page=0 chnl=0 +char id=1118 x=244 y=106 width=24 height=25 xoffset=-6 yoffset=0 xadvance=16 page=0 chnl=0 +char id=1120 x=370 y=363 width=26 height=22 xoffset=-4 yoffset=0 xadvance=24 page=0 chnl=0 +char id=1124 x=396 y=363 width=28 height=22 xoffset=-5 yoffset=0 xadvance=23 page=0 chnl=0 +char id=1134 x=46 y=0 width=21 height=28 xoffset=-5 yoffset=-3 xadvance=16 page=0 chnl=0 +char id=1135 x=0 y=252 width=19 height=23 xoffset=-5 yoffset=1 xadvance=14 page=0 chnl=0 +char id=1137 x=268 y=106 width=21 height=25 xoffset=-4 yoffset=0 xadvance=19 page=0 chnl=0 +char id=1138 x=424 y=363 width=22 height=22 xoffset=-4 yoffset=0 xadvance=20 page=0 chnl=0 +char id=1140 x=446 y=363 width=23 height=22 xoffset=-3 yoffset=0 xadvance=20 page=0 chnl=0 +char id=1142 x=289 y=106 width=25 height=25 xoffset=-3 yoffset=-3 xadvance=20 page=0 chnl=0 +char id=1143 x=469 y=363 width=23 height=22 xoffset=-4 yoffset=0 xadvance=17 page=0 chnl=0 +char id=1144 x=314 y=106 width=31 height=25 xoffset=-4 yoffset=0 xadvance=27 page=0 chnl=0 +char id=1145 x=0 y=385 width=28 height=22 xoffset=-5 yoffset=3 xadvance=23 page=0 chnl=0 +char id=1146 x=299 y=180 width=24 height=24 xoffset=-4 yoffset=-1 xadvance=22 page=0 chnl=0 +char id=1148 x=382 y=30 width=26 height=26 xoffset=-4 yoffset=-4 xadvance=24 page=0 chnl=0 +char id=1149 x=19 y=252 width=24 height=23 xoffset=-5 yoffset=-1 xadvance=19 page=0 chnl=0 +char id=1150 x=345 y=106 width=26 height=25 xoffset=-4 yoffset=-3 xadvance=24 page=0 chnl=0 +char id=1160 x=104 y=0 width=41 height=27 xoffset=-16 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=1161 x=0 y=0 width=46 height=30 xoffset=-17 yoffset=-4 xadvance=8 page=0 chnl=0 +char id=1162 x=145 y=0 width=24 height=27 xoffset=-5 yoffset=-3 xadvance=19 page=0 chnl=0 +char id=1163 x=323 y=180 width=21 height=24 xoffset=-5 yoffset=0 xadvance=16 page=0 chnl=0 +char id=1167 x=28 y=385 width=20 height=22 xoffset=-6 yoffset=3 xadvance=16 page=0 chnl=0 +char id=1168 x=43 y=252 width=22 height=23 xoffset=-5 yoffset=-2 xadvance=17 page=0 chnl=0 +char id=1172 x=371 y=106 width=21 height=25 xoffset=-5 yoffset=0 xadvance=18 page=0 chnl=0 +char id=1173 x=492 y=363 width=18 height=22 xoffset=-5 yoffset=3 xadvance=15 page=0 chnl=0 +char id=1174 x=344 y=180 width=26 height=24 xoffset=-5 yoffset=0 xadvance=24 page=0 chnl=0 +char id=1176 x=392 y=106 width=21 height=25 xoffset=-5 yoffset=0 xadvance=17 page=0 chnl=0 +char id=1178 x=370 y=180 width=22 height=24 xoffset=-5 yoffset=0 xadvance=19 page=0 chnl=0 +char id=1186 x=392 y=180 width=25 height=24 xoffset=-5 yoffset=0 xadvance=20 page=0 chnl=0 +char id=1190 x=413 y=106 width=27 height=25 xoffset=-5 yoffset=0 xadvance=24 page=0 chnl=0 +char id=1191 x=48 y=385 width=22 height=22 xoffset=-5 yoffset=3 xadvance=20 page=0 chnl=0 +char id=1192 x=70 y=385 width=22 height=22 xoffset=-4 yoffset=0 xadvance=20 page=0 chnl=0 +char id=1194 x=440 y=106 width=21 height=25 xoffset=-4 yoffset=0 xadvance=19 page=0 chnl=0 +char id=1196 x=417 y=180 width=22 height=24 xoffset=-4 yoffset=0 xadvance=18 page=0 chnl=0 +char id=1199 x=92 y=385 width=21 height=22 xoffset=-4 yoffset=3 xadvance=17 page=0 chnl=0 +char id=1201 x=113 y=385 width=21 height=22 xoffset=-4 yoffset=3 xadvance=17 page=0 chnl=0 +char id=1202 x=439 y=180 width=24 height=24 xoffset=-5 yoffset=0 xadvance=20 page=0 chnl=0 +char id=1204 x=463 y=180 width=27 height=24 xoffset=-4 yoffset=0 xadvance=24 page=0 chnl=0 +char id=1206 x=0 y=204 width=22 height=24 xoffset=-3 yoffset=0 xadvance=19 page=0 chnl=0 +char id=1212 x=134 y=385 width=24 height=22 xoffset=-4 yoffset=0 xadvance=22 page=0 chnl=0 +char id=1214 x=22 y=204 width=24 height=24 xoffset=-4 yoffset=0 xadvance=22 page=0 chnl=0 +char id=1217 x=46 y=204 width=26 height=24 xoffset=-5 yoffset=-3 xadvance=23 page=0 chnl=0 +char id=1219 x=461 y=106 width=23 height=25 xoffset=-5 yoffset=0 xadvance=18 page=0 chnl=0 +char id=1220 x=158 y=385 width=20 height=22 xoffset=-5 yoffset=3 xadvance=15 page=0 chnl=0 +char id=1221 x=72 y=204 width=24 height=24 xoffset=-5 yoffset=0 xadvance=19 page=0 chnl=0 +char id=1223 x=96 y=204 width=25 height=24 xoffset=-5 yoffset=0 xadvance=20 page=0 chnl=0 +char id=1224 x=178 y=385 width=20 height=22 xoffset=-5 yoffset=3 xadvance=16 page=0 chnl=0 +char id=1225 x=121 y=204 width=25 height=24 xoffset=-5 yoffset=0 xadvance=20 page=0 chnl=0 +char id=1227 x=146 y=204 width=22 height=24 xoffset=-3 yoffset=0 xadvance=19 page=0 chnl=0 +char id=1229 x=168 y=204 width=27 height=24 xoffset=-5 yoffset=0 xadvance=22 page=0 chnl=0 +char id=1232 x=195 y=204 width=22 height=24 xoffset=-5 yoffset=-3 xadvance=19 page=0 chnl=0 +char id=1233 x=198 y=385 width=19 height=22 xoffset=-4 yoffset=0 xadvance=15 page=0 chnl=0 +char id=1234 x=217 y=204 width=24 height=24 xoffset=-5 yoffset=-3 xadvance=19 page=0 chnl=0 +char id=1238 x=241 y=204 width=25 height=24 xoffset=-5 yoffset=-3 xadvance=18 page=0 chnl=0 +char id=1239 x=217 y=385 width=20 height=22 xoffset=-5 yoffset=0 xadvance=15 page=0 chnl=0 +char id=1240 x=237 y=385 width=22 height=22 xoffset=-4 yoffset=0 xadvance=19 page=0 chnl=0 +char id=1242 x=484 y=106 width=22 height=25 xoffset=-4 yoffset=-3 xadvance=19 page=0 chnl=0 +char id=1244 x=266 y=204 width=26 height=24 xoffset=-5 yoffset=-3 xadvance=23 page=0 chnl=0 +char id=1246 x=0 y=131 width=23 height=25 xoffset=-5 yoffset=-3 xadvance=17 page=0 chnl=0 +char id=1248 x=259 y=385 width=21 height=22 xoffset=-5 yoffset=0 xadvance=16 page=0 chnl=0 +char id=1250 x=65 y=252 width=25 height=23 xoffset=-5 yoffset=-2 xadvance=20 page=0 chnl=0 +char id=1252 x=90 y=252 width=25 height=23 xoffset=-5 yoffset=-2 xadvance=20 page=0 chnl=0 +char id=1254 x=23 y=131 width=24 height=25 xoffset=-4 yoffset=-3 xadvance=20 page=0 chnl=0 +char id=1256 x=280 y=385 width=22 height=22 xoffset=-4 yoffset=0 xadvance=20 page=0 chnl=0 +char id=1258 x=47 y=131 width=22 height=25 xoffset=-4 yoffset=-3 xadvance=20 page=0 chnl=0 +char id=1260 x=69 y=131 width=22 height=25 xoffset=-5 yoffset=-3 xadvance=19 page=0 chnl=0 +char id=1262 x=292 y=204 width=25 height=24 xoffset=-4 yoffset=-2 xadvance=19 page=0 chnl=0 +char id=1263 x=317 y=204 width=24 height=24 xoffset=-6 yoffset=1 xadvance=16 page=0 chnl=0 +char id=1264 x=91 y=131 width=25 height=25 xoffset=-4 yoffset=-3 xadvance=19 page=0 chnl=0 +char id=1265 x=341 y=204 width=24 height=24 xoffset=-6 yoffset=1 xadvance=16 page=0 chnl=0 +char id=1266 x=408 y=30 width=31 height=26 xoffset=-4 yoffset=-4 xadvance=19 page=0 chnl=0 +char id=1267 x=116 y=131 width=30 height=25 xoffset=-6 yoffset=0 xadvance=16 page=0 chnl=0 +char id=1268 x=115 y=252 width=22 height=23 xoffset=-3 yoffset=-2 xadvance=19 page=0 chnl=0 +char id=1270 x=365 y=204 width=22 height=24 xoffset=-5 yoffset=0 xadvance=17 page=0 chnl=0 +char id=1272 x=387 y=204 width=33 height=24 xoffset=-5 yoffset=-3 xadvance=22 page=0 chnl=0 +char id=1274 x=146 y=131 width=22 height=25 xoffset=-5 yoffset=0 xadvance=17 page=0 chnl=0 +char id=1275 x=302 y=385 width=19 height=22 xoffset=-5 yoffset=3 xadvance=14 page=0 chnl=0 +char id=1276 x=420 y=204 width=24 height=24 xoffset=-5 yoffset=0 xadvance=20 page=0 chnl=0 +char id=1277 x=321 y=385 width=20 height=22 xoffset=-5 yoffset=3 xadvance=15 page=0 chnl=0 +char id=1281 x=341 y=385 width=19 height=22 xoffset=-5 yoffset=0 xadvance=16 page=0 chnl=0 +char id=1283 x=360 y=385 width=21 height=22 xoffset=-5 yoffset=0 xadvance=18 page=0 chnl=0 +char id=1284 x=381 y=385 width=23 height=22 xoffset=-4 yoffset=0 xadvance=21 page=0 chnl=0 +char id=1286 x=490 y=180 width=18 height=24 xoffset=-4 yoffset=0 xadvance=17 page=0 chnl=0 +char id=1288 x=404 y=385 width=28 height=22 xoffset=-5 yoffset=0 xadvance=23 page=0 chnl=0 +char id=1290 x=432 y=385 width=28 height=22 xoffset=-5 yoffset=0 xadvance=23 page=0 chnl=0 +char id=1292 x=460 y=385 width=22 height=22 xoffset=-4 yoffset=0 xadvance=20 page=0 chnl=0 +char id=1294 x=482 y=385 width=23 height=22 xoffset=-4 yoffset=0 xadvance=19 page=0 chnl=0 +char id=1296 x=0 y=407 width=19 height=22 xoffset=-4 yoffset=0 xadvance=17 page=0 chnl=0 +char id=1298 x=444 y=204 width=24 height=24 xoffset=-5 yoffset=0 xadvance=19 page=0 chnl=0 +char id=1299 x=19 y=407 width=19 height=22 xoffset=-5 yoffset=3 xadvance=16 page=0 chnl=0 +char id=1300 x=38 y=407 width=28 height=22 xoffset=-5 yoffset=0 xadvance=23 page=0 chnl=0 +char id=1303 x=66 y=407 width=23 height=22 xoffset=-6 yoffset=3 xadvance=19 page=0 chnl=0 +char id=1306 x=468 y=204 width=22 height=24 xoffset=-4 yoffset=0 xadvance=20 page=0 chnl=0 +char id=1307 x=89 y=407 width=19 height=22 xoffset=-5 yoffset=3 xadvance=16 page=0 chnl=0 +char id=1308 x=108 y=407 width=27 height=22 xoffset=-4 yoffset=0 xadvance=23 page=0 chnl=0 +char id=1312 x=168 y=131 width=26 height=25 xoffset=-5 yoffset=0 xadvance=24 page=0 chnl=0 +char id=1313 x=135 y=407 width=22 height=22 xoffset=-5 yoffset=3 xadvance=19 page=0 chnl=0 +char id=1314 x=194 y=131 width=27 height=25 xoffset=-5 yoffset=0 xadvance=24 page=0 chnl=0 +char id=1315 x=157 y=407 width=22 height=22 xoffset=-5 yoffset=3 xadvance=20 page=0 chnl=0 +char id=8192 x=0 y=0 width=0 height=0 xoffset=-5 yoffset=0 xadvance=16 page=0 chnl=0 +char id=8193 x=0 y=0 width=0 height=0 xoffset=-5 yoffset=0 xadvance=24 page=0 chnl=0 +char id=8194 x=0 y=0 width=0 height=0 xoffset=-5 yoffset=0 xadvance=16 page=0 chnl=0 +char id=8195 x=0 y=0 width=0 height=0 xoffset=-5 yoffset=0 xadvance=24 page=0 chnl=0 +char id=8196 x=0 y=0 width=0 height=0 xoffset=-5 yoffset=0 xadvance=13 page=0 chnl=0 +char id=8197 x=0 y=0 width=0 height=0 xoffset=-5 yoffset=0 xadvance=12 page=0 chnl=0 +char id=8198 x=0 y=0 width=0 height=0 xoffset=-5 yoffset=0 xadvance=11 page=0 chnl=0 +char id=8199 x=0 y=0 width=0 height=0 xoffset=-5 yoffset=0 xadvance=16 page=0 chnl=0 +char id=8200 x=0 y=0 width=0 height=0 xoffset=-5 yoffset=0 xadvance=12 page=0 chnl=0 +char id=8201 x=0 y=0 width=0 height=0 xoffset=-5 yoffset=0 xadvance=11 page=0 chnl=0 +char id=8202 x=0 y=0 width=0 height=0 xoffset=-5 yoffset=0 xadvance=10 page=0 chnl=0 +char id=8203 x=0 y=0 width=0 height=0 xoffset=-5 yoffset=0 xadvance=8 page=0 chnl=0 +char id=8204 x=0 y=0 width=0 height=0 xoffset=-5 yoffset=0 xadvance=8 page=0 chnl=0 +char id=8214 x=496 y=472 width=15 height=21 xoffset=-5 yoffset=2 xadvance=13 page=0 chnl=0 +char id=8224 x=490 y=204 width=17 height=24 xoffset=-3 yoffset=0 xadvance=16 page=0 chnl=0 +char id=8225 x=0 y=228 width=18 height=24 xoffset=-4 yoffset=0 xadvance=16 page=0 chnl=0 +char id=8239 x=0 y=0 width=0 height=0 xoffset=-5 yoffset=0 xadvance=12 page=0 chnl=0 +char id=8240 x=137 y=252 width=26 height=23 xoffset=-4 yoffset=-1 xadvance=24 page=0 chnl=0 +char id=8252 x=179 y=407 width=19 height=22 xoffset=-3 yoffset=0 xadvance=19 page=0 chnl=0 +char id=8260 x=198 y=407 width=27 height=22 xoffset=-8 yoffset=0 xadvance=11 page=0 chnl=0 +char id=8286 x=18 y=228 width=14 height=24 xoffset=-5 yoffset=-2 xadvance=11 page=0 chnl=0 +char id=8352 x=225 y=407 width=19 height=22 xoffset=-3 yoffset=-1 xadvance=19 page=0 chnl=0 +char id=8353 x=439 y=30 width=21 height=26 xoffset=-4 yoffset=-2 xadvance=19 page=0 chnl=0 +char id=8354 x=244 y=407 width=21 height=22 xoffset=-4 yoffset=0 xadvance=19 page=0 chnl=0 +char id=8356 x=265 y=407 width=19 height=22 xoffset=-5 yoffset=0 xadvance=16 page=0 chnl=0 +char id=8357 x=284 y=407 width=23 height=22 xoffset=-5 yoffset=1 xadvance=20 page=0 chnl=0 +char id=8358 x=307 y=407 width=25 height=22 xoffset=-5 yoffset=0 xadvance=20 page=0 chnl=0 +char id=8359 x=332 y=407 width=26 height=22 xoffset=-5 yoffset=0 xadvance=23 page=0 chnl=0 +char id=8360 x=358 y=407 width=27 height=22 xoffset=-5 yoffset=0 xadvance=24 page=0 chnl=0 +char id=8361 x=385 y=407 width=25 height=22 xoffset=-4 yoffset=0 xadvance=21 page=0 chnl=0 +char id=8363 x=32 y=228 width=20 height=24 xoffset=-4 yoffset=-2 xadvance=16 page=0 chnl=0 +char id=8364 x=410 y=407 width=22 height=22 xoffset=-4 yoffset=0 xadvance=20 page=0 chnl=0 +char id=8367 x=221 y=131 width=32 height=25 xoffset=-5 yoffset=0 xadvance=29 page=0 chnl=0 +char id=8368 x=253 y=131 width=18 height=25 xoffset=-5 yoffset=0 xadvance=16 page=0 chnl=0 +char id=8370 x=163 y=252 width=20 height=23 xoffset=-4 yoffset=-1 xadvance=18 page=0 chnl=0 +char id=8372 x=432 y=407 width=19 height=22 xoffset=-4 yoffset=0 xadvance=17 page=0 chnl=0 +char id=8373 x=52 y=228 width=20 height=24 xoffset=-4 yoffset=-1 xadvance=18 page=0 chnl=0 +char id=11364 x=271 y=131 width=20 height=25 xoffset=-4 yoffset=0 xadvance=19 page=0 chnl=0 +char id=11366 x=451 y=407 width=16 height=22 xoffset=-5 yoffset=1 xadvance=13 page=0 chnl=0 +char id=11367 x=72 y=228 width=25 height=24 xoffset=-5 yoffset=0 xadvance=20 page=0 chnl=0 +char id=11368 x=183 y=252 width=18 height=23 xoffset=-5 yoffset=0 xadvance=16 page=0 chnl=0 +char id=11369 x=97 y=228 width=23 height=24 xoffset=-5 yoffset=0 xadvance=20 page=0 chnl=0 +char id=11370 x=201 y=252 width=19 height=23 xoffset=-5 yoffset=0 xadvance=16 page=0 chnl=0 +char id=11371 x=120 y=228 width=23 height=24 xoffset=-5 yoffset=0 xadvance=18 page=0 chnl=0 +char id=11373 x=467 y=407 width=21 height=22 xoffset=-4 yoffset=0 xadvance=19 page=0 chnl=0 +char id=11378 x=0 y=429 width=29 height=22 xoffset=-4 yoffset=0 xadvance=25 page=0 chnl=0 +char id=34 x=261 y=183 width=15 height=15 xoffset=-3 yoffset=0 xadvance=15 page=1 chnl=0 +char id=42 x=57 y=183 width=17 height=17 xoffset=-3 yoffset=0 xadvance=16 page=1 chnl=0 +char id=43 x=98 y=125 width=19 height=19 xoffset=-4 yoffset=2 xadvance=17 page=1 chnl=0 +char id=44 x=276 y=183 width=14 height=15 xoffset=-5 yoffset=9 xadvance=12 page=1 chnl=0 +char id=45 x=346 y=201 width=15 height=12 xoffset=-4 yoffset=6 xadvance=13 page=1 chnl=0 +char id=46 x=175 y=201 width=13 height=13 xoffset=-4 yoffset=9 xadvance=12 page=1 chnl=0 +char id=58 x=117 y=125 width=14 height=19 xoffset=-4 yoffset=3 xadvance=12 page=1 chnl=0 +char id=60 x=487 y=84 width=21 height=20 xoffset=-4 yoffset=2 xadvance=17 page=1 chnl=0 +char id=61 x=207 y=183 width=20 height=16 xoffset=-5 yoffset=4 xadvance=17 page=1 chnl=0 +char id=62 x=0 y=105 width=20 height=20 xoffset=-5 yoffset=2 xadvance=17 page=1 chnl=0 +char id=94 x=74 y=183 width=17 height=17 xoffset=-4 yoffset=0 xadvance=16 page=1 chnl=0 +char id=95 x=476 y=201 width=19 height=11 xoffset=-6 yoffset=12 xadvance=16 page=1 chnl=0 +char id=96 x=188 y=201 width=14 height=13 xoffset=-3 yoffset=0 xadvance=13 page=1 chnl=0 +char id=97 x=131 y=125 width=18 height=19 xoffset=-5 yoffset=3 xadvance=15 page=1 chnl=0 +char id=99 x=149 y=125 width=18 height=19 xoffset=-5 yoffset=3 xadvance=15 page=1 chnl=0 +char id=101 x=167 y=125 width=18 height=19 xoffset=-5 yoffset=3 xadvance=15 page=1 chnl=0 +char id=111 x=185 y=125 width=18 height=19 xoffset=-4 yoffset=3 xadvance=16 page=1 chnl=0 +char id=115 x=203 y=125 width=17 height=19 xoffset=-5 yoffset=3 xadvance=14 page=1 chnl=0 +char id=117 x=220 y=125 width=17 height=19 xoffset=-4 yoffset=3 xadvance=16 page=1 chnl=0 +char id=118 x=237 y=125 width=18 height=19 xoffset=-4 yoffset=3 xadvance=16 page=1 chnl=0 +char id=119 x=255 y=125 width=22 height=19 xoffset=-4 yoffset=3 xadvance=20 page=1 chnl=0 +char id=126 x=41 y=201 width=18 height=14 xoffset=-4 yoffset=5 xadvance=17 page=1 chnl=0 +char id=164 x=277 y=125 width=21 height=19 xoffset=-5 yoffset=1 xadvance=16 page=1 chnl=0 +char id=168 x=361 y=201 width=17 height=12 xoffset=-4 yoffset=1 xadvance=13 page=1 chnl=0 +char id=170 x=290 y=183 width=16 height=15 xoffset=-4 yoffset=0 xadvance=12 page=1 chnl=0 +char id=171 x=91 y=183 width=18 height=17 xoffset=-5 yoffset=4 xadvance=15 page=1 chnl=0 +char id=172 x=227 y=183 width=19 height=16 xoffset=-4 yoffset=4 xadvance=17 page=1 chnl=0 +char id=173 x=378 y=201 width=15 height=12 xoffset=-4 yoffset=6 xadvance=13 page=1 chnl=0 +char id=175 x=393 y=201 width=17 height=12 xoffset=-4 yoffset=1 xadvance=13 page=1 chnl=0 +char id=176 x=306 y=183 width=17 height=15 xoffset=-3 yoffset=0 xadvance=14 page=1 chnl=0 +char id=178 x=109 y=183 width=17 height=17 xoffset=-4 yoffset=0 xadvance=13 page=1 chnl=0 +char id=179 x=126 y=183 width=17 height=17 xoffset=-4 yoffset=0 xadvance=13 page=1 chnl=0 +char id=180 x=202 y=201 width=16 height=13 xoffset=-3 yoffset=0 xadvance=13 page=1 chnl=0 +char id=183 x=218 y=201 width=13 height=13 xoffset=-4 yoffset=6 xadvance=12 page=1 chnl=0 +char id=184 x=323 y=183 width=14 height=15 xoffset=-5 yoffset=10 xadvance=13 page=1 chnl=0 +char id=185 x=143 y=183 width=15 height=17 xoffset=-4 yoffset=0 xadvance=13 page=1 chnl=0 +char id=186 x=337 y=183 width=17 height=15 xoffset=-4 yoffset=0 xadvance=13 page=1 chnl=0 +char id=187 x=158 y=183 width=19 height=17 xoffset=-5 yoffset=4 xadvance=15 page=1 chnl=0 +char id=230 x=298 y=125 width=21 height=19 xoffset=-5 yoffset=3 xadvance=18 page=1 chnl=0 +char id=239 x=20 y=105 width=19 height=20 xoffset=-5 yoffset=1 xadvance=12 page=1 chnl=0 +char id=247 x=39 y=105 width=19 height=20 xoffset=-4 yoffset=2 xadvance=17 page=1 chnl=0 +char id=297 x=58 y=105 width=19 height=20 xoffset=-5 yoffset=1 xadvance=12 page=1 chnl=0 +char id=299 x=77 y=105 width=22 height=20 xoffset=-5 yoffset=1 xadvance=12 page=1 chnl=0 +char id=339 x=319 y=125 width=21 height=19 xoffset=-4 yoffset=3 xadvance=19 page=1 chnl=0 +char id=380 x=99 y=105 width=18 height=20 xoffset=-5 yoffset=1 xadvance=15 page=1 chnl=0 +char id=884 x=354 y=183 width=15 height=15 xoffset=-4 yoffset=-2 xadvance=11 page=1 chnl=0 +char id=885 x=59 y=201 width=14 height=14 xoffset=-5 yoffset=11 xadvance=11 page=1 chnl=0 +char id=890 x=73 y=201 width=14 height=14 xoffset=-4 yoffset=11 xadvance=13 page=1 chnl=0 +char id=900 x=369 y=183 width=15 height=15 xoffset=-3 yoffset=-2 xadvance=12 page=1 chnl=0 +char id=901 x=87 y=201 width=17 height=14 xoffset=-4 yoffset=-1 xadvance=13 page=1 chnl=0 +char id=903 x=231 y=201 width=13 height=13 xoffset=-3 yoffset=3 xadvance=12 page=1 chnl=0 +char id=914 x=0 y=0 width=21 height=21 xoffset=-5 yoffset=0 xadvance=19 page=1 chnl=0 +char id=915 x=21 y=0 width=22 height=21 xoffset=-5 yoffset=0 xadvance=17 page=1 chnl=0 +char id=916 x=43 y=0 width=21 height=21 xoffset=-5 yoffset=0 xadvance=19 page=1 chnl=0 +char id=917 x=64 y=0 width=21 height=21 xoffset=-5 yoffset=0 xadvance=18 page=1 chnl=0 +char id=918 x=85 y=0 width=23 height=21 xoffset=-5 yoffset=0 xadvance=18 page=1 chnl=0 +char id=919 x=108 y=0 width=25 height=21 xoffset=-5 yoffset=0 xadvance=20 page=1 chnl=0 +char id=921 x=133 y=0 width=18 height=21 xoffset=-5 yoffset=0 xadvance=13 page=1 chnl=0 +char id=922 x=151 y=0 width=23 height=21 xoffset=-5 yoffset=0 xadvance=20 page=1 chnl=0 +char id=923 x=174 y=0 width=22 height=21 xoffset=-5 yoffset=0 xadvance=20 page=1 chnl=0 +char id=924 x=196 y=0 width=27 height=21 xoffset=-5 yoffset=0 xadvance=22 page=1 chnl=0 +char id=926 x=223 y=0 width=21 height=21 xoffset=-4 yoffset=0 xadvance=18 page=1 chnl=0 +char id=928 x=244 y=0 width=25 height=21 xoffset=-5 yoffset=0 xadvance=20 page=1 chnl=0 +char id=929 x=269 y=0 width=22 height=21 xoffset=-5 yoffset=0 xadvance=17 page=1 chnl=0 +char id=931 x=291 y=0 width=21 height=21 xoffset=-5 yoffset=0 xadvance=18 page=1 chnl=0 +char id=932 x=312 y=0 width=22 height=21 xoffset=-4 yoffset=0 xadvance=18 page=1 chnl=0 +char id=933 x=334 y=0 width=22 height=21 xoffset=-3 yoffset=0 xadvance=19 page=1 chnl=0 +char id=934 x=356 y=0 width=22 height=21 xoffset=-4 yoffset=0 xadvance=20 page=1 chnl=0 +char id=935 x=378 y=0 width=24 height=21 xoffset=-5 yoffset=0 xadvance=20 page=1 chnl=0 +char id=936 x=402 y=0 width=25 height=21 xoffset=-4 yoffset=0 xadvance=21 page=1 chnl=0 +char id=937 x=427 y=0 width=23 height=21 xoffset=-5 yoffset=0 xadvance=20 page=1 chnl=0 +char id=945 x=340 y=125 width=19 height=19 xoffset=-4 yoffset=3 xadvance=17 page=1 chnl=0 +char id=949 x=359 y=125 width=18 height=19 xoffset=-5 yoffset=3 xadvance=15 page=1 chnl=0 +char id=953 x=377 y=125 width=14 height=19 xoffset=-4 yoffset=3 xadvance=13 page=1 chnl=0 +char id=959 x=391 y=125 width=18 height=19 xoffset=-4 yoffset=3 xadvance=16 page=1 chnl=0 +char id=960 x=409 y=125 width=22 height=19 xoffset=-5 yoffset=3 xadvance=17 page=1 chnl=0 +char id=963 x=431 y=125 width=19 height=19 xoffset=-4 yoffset=3 xadvance=17 page=1 chnl=0 +char id=964 x=450 y=125 width=17 height=19 xoffset=-4 yoffset=3 xadvance=15 page=1 chnl=0 +char id=965 x=467 y=125 width=18 height=19 xoffset=-4 yoffset=3 xadvance=16 page=1 chnl=0 +char id=969 x=485 y=125 width=21 height=19 xoffset=-4 yoffset=3 xadvance=19 page=1 chnl=0 +char id=978 x=450 y=0 width=22 height=21 xoffset=-4 yoffset=0 xadvance=18 page=1 chnl=0 +char id=982 x=117 y=105 width=21 height=20 xoffset=-4 yoffset=2 xadvance=19 page=1 chnl=0 +char id=983 x=472 y=0 width=18 height=21 xoffset=-4 yoffset=3 xadvance=17 page=1 chnl=0 +char id=984 x=490 y=0 width=21 height=21 xoffset=-4 yoffset=0 xadvance=17 page=1 chnl=0 +char id=986 x=0 y=21 width=20 height=21 xoffset=-4 yoffset=0 xadvance=18 page=1 chnl=0 +char id=988 x=20 y=21 width=22 height=21 xoffset=-5 yoffset=0 xadvance=17 page=1 chnl=0 +char id=992 x=42 y=21 width=22 height=21 xoffset=-5 yoffset=0 xadvance=20 page=1 chnl=0 +char id=999 x=138 y=105 width=18 height=20 xoffset=-5 yoffset=2 xadvance=15 page=1 chnl=0 +char id=1001 x=156 y=105 width=18 height=20 xoffset=-5 yoffset=3 xadvance=13 page=1 chnl=0 +char id=1003 x=0 y=145 width=20 height=19 xoffset=-5 yoffset=3 xadvance=17 page=1 chnl=0 +char id=1005 x=174 y=105 width=20 height=20 xoffset=-5 yoffset=2 xadvance=15 page=1 chnl=0 +char id=1008 x=20 y=145 width=18 height=19 xoffset=-4 yoffset=3 xadvance=17 page=1 chnl=0 +char id=1010 x=38 y=145 width=17 height=19 xoffset=-4 yoffset=3 xadvance=16 page=1 chnl=0 +char id=1013 x=55 y=145 width=16 height=19 xoffset=-4 yoffset=3 xadvance=14 page=1 chnl=0 +char id=1014 x=71 y=145 width=17 height=19 xoffset=-5 yoffset=3 xadvance=14 page=1 chnl=0 +char id=1015 x=64 y=21 width=20 height=21 xoffset=-5 yoffset=0 xadvance=17 page=1 chnl=0 +char id=1018 x=84 y=21 width=27 height=21 xoffset=-5 yoffset=0 xadvance=22 page=1 chnl=0 +char id=1030 x=111 y=21 width=18 height=21 xoffset=-5 yoffset=0 xadvance=13 page=1 chnl=0 +char id=1034 x=129 y=21 width=26 height=21 xoffset=-5 yoffset=0 xadvance=24 page=1 chnl=0 +char id=1040 x=155 y=21 width=22 height=21 xoffset=-5 yoffset=0 xadvance=19 page=1 chnl=0 +char id=1041 x=177 y=21 width=22 height=21 xoffset=-5 yoffset=0 xadvance=17 page=1 chnl=0 +char id=1042 x=199 y=21 width=21 height=21 xoffset=-5 yoffset=0 xadvance=18 page=1 chnl=0 +char id=1043 x=220 y=21 width=22 height=21 xoffset=-5 yoffset=0 xadvance=17 page=1 chnl=0 +char id=1045 x=242 y=21 width=21 height=21 xoffset=-5 yoffset=0 xadvance=18 page=1 chnl=0 +char id=1046 x=263 y=21 width=26 height=21 xoffset=-5 yoffset=0 xadvance=23 page=1 chnl=0 +char id=1048 x=289 y=21 width=25 height=21 xoffset=-5 yoffset=0 xadvance=20 page=1 chnl=0 +char id=1050 x=314 y=21 width=22 height=21 xoffset=-5 yoffset=0 xadvance=19 page=1 chnl=0 +char id=1052 x=336 y=21 width=27 height=21 xoffset=-5 yoffset=0 xadvance=22 page=1 chnl=0 +char id=1053 x=363 y=21 width=25 height=21 xoffset=-5 yoffset=0 xadvance=20 page=1 chnl=0 +char id=1055 x=388 y=21 width=25 height=21 xoffset=-5 yoffset=0 xadvance=20 page=1 chnl=0 +char id=1056 x=413 y=21 width=22 height=21 xoffset=-5 yoffset=0 xadvance=17 page=1 chnl=0 +char id=1058 x=435 y=21 width=22 height=21 xoffset=-4 yoffset=0 xadvance=18 page=1 chnl=0 +char id=1060 x=457 y=21 width=22 height=21 xoffset=-4 yoffset=0 xadvance=20 page=1 chnl=0 +char id=1061 x=479 y=21 width=25 height=21 xoffset=-5 yoffset=0 xadvance=19 page=1 chnl=0 +char id=1063 x=0 y=42 width=22 height=21 xoffset=-3 yoffset=0 xadvance=19 page=1 chnl=0 +char id=1064 x=22 y=42 width=29 height=21 xoffset=-5 yoffset=0 xadvance=24 page=1 chnl=0 +char id=1066 x=51 y=42 width=21 height=21 xoffset=-4 yoffset=0 xadvance=20 page=1 chnl=0 +char id=1067 x=72 y=42 width=29 height=21 xoffset=-5 yoffset=0 xadvance=22 page=1 chnl=0 +char id=1068 x=101 y=42 width=20 height=21 xoffset=-5 yoffset=0 xadvance=17 page=1 chnl=0 +char id=1071 x=121 y=42 width=23 height=21 xoffset=-5 yoffset=0 xadvance=18 page=1 chnl=0 +char id=1072 x=88 y=145 width=18 height=19 xoffset=-5 yoffset=3 xadvance=15 page=1 chnl=0 +char id=1076 x=194 y=105 width=20 height=20 xoffset=-6 yoffset=3 xadvance=16 page=1 chnl=0 +char id=1077 x=106 y=145 width=18 height=19 xoffset=-5 yoffset=3 xadvance=15 page=1 chnl=0 +char id=1079 x=124 y=145 width=17 height=19 xoffset=-5 yoffset=3 xadvance=15 page=1 chnl=0 +char id=1081 x=144 y=42 width=21 height=21 xoffset=-5 yoffset=0 xadvance=16 page=1 chnl=0 +char id=1083 x=141 y=145 width=19 height=19 xoffset=-5 yoffset=3 xadvance=16 page=1 chnl=0 +char id=1084 x=160 y=145 width=23 height=19 xoffset=-5 yoffset=3 xadvance=18 page=1 chnl=0 +char id=1086 x=183 y=145 width=18 height=19 xoffset=-4 yoffset=3 xadvance=16 page=1 chnl=0 +char id=1089 x=201 y=145 width=18 height=19 xoffset=-5 yoffset=3 xadvance=15 page=1 chnl=0 +char id=1094 x=214 y=105 width=21 height=20 xoffset=-5 yoffset=3 xadvance=16 page=1 chnl=0 +char id=1097 x=235 y=105 width=25 height=20 xoffset=-5 yoffset=3 xadvance=20 page=1 chnl=0 +char id=1101 x=219 y=145 width=18 height=19 xoffset=-5 yoffset=3 xadvance=15 page=1 chnl=0 +char id=1102 x=237 y=145 width=21 height=19 xoffset=-5 yoffset=3 xadvance=19 page=1 chnl=0 +char id=1107 x=165 y=42 width=23 height=21 xoffset=-5 yoffset=0 xadvance=14 page=1 chnl=0 +char id=1108 x=258 y=145 width=18 height=19 xoffset=-5 yoffset=3 xadvance=15 page=1 chnl=0 +char id=1109 x=276 y=145 width=16 height=19 xoffset=-5 yoffset=3 xadvance=14 page=1 chnl=0 +char id=1111 x=188 y=42 width=22 height=21 xoffset=-5 yoffset=0 xadvance=12 page=1 chnl=0 +char id=1113 x=292 y=145 width=21 height=19 xoffset=-5 yoffset=3 xadvance=19 page=1 chnl=0 +char id=1115 x=210 y=42 width=19 height=21 xoffset=-5 yoffset=0 xadvance=16 page=1 chnl=0 +char id=1116 x=229 y=42 width=21 height=21 xoffset=-5 yoffset=0 xadvance=16 page=1 chnl=0 +char id=1117 x=250 y=42 width=21 height=21 xoffset=-5 yoffset=0 xadvance=16 page=1 chnl=0 +char id=1119 x=271 y=42 width=21 height=21 xoffset=-5 yoffset=3 xadvance=16 page=1 chnl=0 +char id=1121 x=313 y=145 width=21 height=19 xoffset=-5 yoffset=3 xadvance=19 page=1 chnl=0 +char id=1122 x=292 y=42 width=21 height=21 xoffset=-4 yoffset=0 xadvance=19 page=1 chnl=0 +char id=1123 x=313 y=42 width=18 height=21 xoffset=-4 yoffset=0 xadvance=16 page=1 chnl=0 +char id=1125 x=334 y=145 width=22 height=19 xoffset=-5 yoffset=3 xadvance=18 page=1 chnl=0 +char id=1126 x=331 y=42 width=25 height=21 xoffset=-5 yoffset=0 xadvance=22 page=1 chnl=0 +char id=1127 x=285 y=164 width=21 height=18 xoffset=-5 yoffset=3 xadvance=18 page=1 chnl=0 +char id=1128 x=356 y=42 width=30 height=21 xoffset=-5 yoffset=0 xadvance=28 page=1 chnl=0 +char id=1129 x=306 y=164 width=25 height=18 xoffset=-5 yoffset=3 xadvance=22 page=1 chnl=0 +char id=1130 x=386 y=42 width=25 height=21 xoffset=-5 yoffset=0 xadvance=23 page=1 chnl=0 +char id=1131 x=331 y=164 width=21 height=18 xoffset=-5 yoffset=3 xadvance=18 page=1 chnl=0 +char id=1132 x=411 y=42 width=31 height=21 xoffset=-5 yoffset=0 xadvance=28 page=1 chnl=0 +char id=1133 x=352 y=164 width=25 height=18 xoffset=-5 yoffset=3 xadvance=23 page=1 chnl=0 +char id=1136 x=442 y=42 width=26 height=21 xoffset=-4 yoffset=0 xadvance=22 page=1 chnl=0 +char id=1139 x=356 y=145 width=19 height=19 xoffset=-5 yoffset=3 xadvance=16 page=1 chnl=0 +char id=1141 x=375 y=145 width=19 height=19 xoffset=-4 yoffset=3 xadvance=17 page=1 chnl=0 +char id=1147 x=394 y=145 width=21 height=19 xoffset=-5 yoffset=3 xadvance=18 page=1 chnl=0 +char id=1151 x=468 y=42 width=21 height=21 xoffset=-5 yoffset=1 xadvance=19 page=1 chnl=0 +char id=1152 x=489 y=42 width=20 height=21 xoffset=-4 yoffset=0 xadvance=18 page=1 chnl=0 +char id=1153 x=0 y=63 width=18 height=21 xoffset=-5 yoffset=3 xadvance=15 page=1 chnl=0 +char id=1154 x=246 y=183 width=15 height=16 xoffset=-6 yoffset=9 xadvance=12 page=1 chnl=0 +char id=1155 x=244 y=201 width=20 height=13 xoffset=-9 yoffset=0 xadvance=8 page=1 chnl=0 +char id=1156 x=264 y=201 width=24 height=13 xoffset=-11 yoffset=0 xadvance=8 page=1 chnl=0 +char id=1157 x=288 y=201 width=18 height=13 xoffset=-8 yoffset=0 xadvance=8 page=1 chnl=0 +char id=1158 x=306 y=201 width=18 height=13 xoffset=-8 yoffset=0 xadvance=8 page=1 chnl=0 +char id=1159 x=104 y=201 width=26 height=14 xoffset=-11 yoffset=-3 xadvance=8 page=1 chnl=0 +char id=1164 x=18 y=63 width=20 height=21 xoffset=-5 yoffset=0 xadvance=17 page=1 chnl=0 +char id=1165 x=377 y=164 width=17 height=18 xoffset=-5 yoffset=3 xadvance=15 page=1 chnl=0 +char id=1166 x=38 y=63 width=22 height=21 xoffset=-5 yoffset=0 xadvance=17 page=1 chnl=0 +char id=1169 x=415 y=145 width=19 height=19 xoffset=-5 yoffset=2 xadvance=14 page=1 chnl=0 +char id=1170 x=60 y=63 width=22 height=21 xoffset=-5 yoffset=0 xadvance=17 page=1 chnl=0 +char id=1171 x=394 y=164 width=19 height=18 xoffset=-5 yoffset=3 xadvance=14 page=1 chnl=0 +char id=1175 x=260 y=105 width=22 height=20 xoffset=-5 yoffset=3 xadvance=19 page=1 chnl=0 +char id=1177 x=82 y=63 width=17 height=21 xoffset=-5 yoffset=3 xadvance=14 page=1 chnl=0 +char id=1179 x=282 y=105 width=19 height=20 xoffset=-5 yoffset=3 xadvance=16 page=1 chnl=0 +char id=1180 x=99 y=63 width=23 height=21 xoffset=-5 yoffset=0 xadvance=19 page=1 chnl=0 +char id=1181 x=413 y=164 width=19 height=18 xoffset=-5 yoffset=3 xadvance=17 page=1 chnl=0 +char id=1182 x=122 y=63 width=22 height=21 xoffset=-5 yoffset=0 xadvance=19 page=1 chnl=0 +char id=1183 x=432 y=164 width=19 height=18 xoffset=-5 yoffset=3 xadvance=16 page=1 chnl=0 +char id=1184 x=144 y=63 width=23 height=21 xoffset=-4 yoffset=0 xadvance=21 page=1 chnl=0 +char id=1185 x=451 y=164 width=19 height=18 xoffset=-4 yoffset=3 xadvance=17 page=1 chnl=0 +char id=1187 x=301 y=105 width=21 height=20 xoffset=-5 yoffset=3 xadvance=16 page=1 chnl=0 +char id=1188 x=167 y=63 width=28 height=21 xoffset=-5 yoffset=0 xadvance=23 page=1 chnl=0 +char id=1189 x=470 y=164 width=23 height=18 xoffset=-5 yoffset=3 xadvance=18 page=1 chnl=0 +char id=1193 x=434 y=145 width=19 height=19 xoffset=-5 yoffset=3 xadvance=16 page=1 chnl=0 +char id=1195 x=195 y=63 width=18 height=21 xoffset=-5 yoffset=3 xadvance=15 page=1 chnl=0 +char id=1197 x=322 y=105 width=19 height=20 xoffset=-4 yoffset=3 xadvance=15 page=1 chnl=0 +char id=1198 x=213 y=63 width=23 height=21 xoffset=-3 yoffset=0 xadvance=20 page=1 chnl=0 +char id=1200 x=236 y=63 width=23 height=21 xoffset=-3 yoffset=0 xadvance=20 page=1 chnl=0 +char id=1203 x=341 y=105 width=19 height=20 xoffset=-5 yoffset=3 xadvance=16 page=1 chnl=0 +char id=1205 x=360 y=105 width=23 height=20 xoffset=-4 yoffset=3 xadvance=19 page=1 chnl=0 +char id=1207 x=383 y=105 width=20 height=20 xoffset=-4 yoffset=3 xadvance=16 page=1 chnl=0 +char id=1208 x=259 y=63 width=23 height=21 xoffset=-3 yoffset=0 xadvance=20 page=1 chnl=0 +char id=1209 x=0 y=183 width=19 height=18 xoffset=-4 yoffset=3 xadvance=17 page=1 chnl=0 +char id=1210 x=282 y=63 width=21 height=21 xoffset=-5 yoffset=0 xadvance=19 page=1 chnl=0 +char id=1211 x=303 y=63 width=18 height=21 xoffset=-5 yoffset=0 xadvance=16 page=1 chnl=0 +char id=1213 x=453 y=145 width=19 height=19 xoffset=-4 yoffset=3 xadvance=17 page=1 chnl=0 +char id=1215 x=321 y=63 width=19 height=21 xoffset=-4 yoffset=3 xadvance=17 page=1 chnl=0 +char id=1216 x=340 y=63 width=18 height=21 xoffset=-5 yoffset=0 xadvance=13 page=1 chnl=0 +char id=1218 x=358 y=63 width=22 height=21 xoffset=-5 yoffset=0 xadvance=19 page=1 chnl=0 +char id=1222 x=380 y=63 width=19 height=21 xoffset=-5 yoffset=3 xadvance=16 page=1 chnl=0 +char id=1226 x=399 y=63 width=20 height=21 xoffset=-5 yoffset=3 xadvance=17 page=1 chnl=0 +char id=1228 x=403 y=105 width=20 height=20 xoffset=-4 yoffset=3 xadvance=16 page=1 chnl=0 +char id=1230 x=419 y=63 width=23 height=21 xoffset=-5 yoffset=3 xadvance=18 page=1 chnl=0 +char id=1231 x=442 y=63 width=22 height=21 xoffset=-5 yoffset=0 xadvance=13 page=1 chnl=0 +char id=1235 x=464 y=63 width=21 height=21 xoffset=-4 yoffset=1 xadvance=15 page=1 chnl=0 +char id=1236 x=0 y=84 width=27 height=21 xoffset=-5 yoffset=0 xadvance=22 page=1 chnl=0 +char id=1237 x=472 y=145 width=21 height=19 xoffset=-5 yoffset=3 xadvance=18 page=1 chnl=0 +char id=1241 x=493 y=145 width=17 height=19 xoffset=-5 yoffset=3 xadvance=15 page=1 chnl=0 +char id=1243 x=485 y=63 width=22 height=21 xoffset=-5 yoffset=1 xadvance=15 page=1 chnl=0 +char id=1245 x=423 y=105 width=22 height=20 xoffset=-5 yoffset=1 xadvance=19 page=1 chnl=0 +char id=1247 x=27 y=84 width=22 height=21 xoffset=-5 yoffset=1 xadvance=15 page=1 chnl=0 +char id=1249 x=0 y=164 width=17 height=19 xoffset=-5 yoffset=3 xadvance=14 page=1 chnl=0 +char id=1251 x=445 y=105 width=23 height=20 xoffset=-5 yoffset=1 xadvance=16 page=1 chnl=0 +char id=1253 x=468 y=105 width=23 height=20 xoffset=-5 yoffset=1 xadvance=16 page=1 chnl=0 +char id=1255 x=49 y=84 width=20 height=21 xoffset=-4 yoffset=1 xadvance=16 page=1 chnl=0 +char id=1257 x=17 y=164 width=19 height=19 xoffset=-5 yoffset=3 xadvance=16 page=1 chnl=0 +char id=1259 x=69 y=84 width=21 height=21 xoffset=-5 yoffset=1 xadvance=16 page=1 chnl=0 +char id=1261 x=90 y=84 width=22 height=21 xoffset=-5 yoffset=1 xadvance=15 page=1 chnl=0 +char id=1269 x=491 y=105 width=20 height=20 xoffset=-4 yoffset=1 xadvance=16 page=1 chnl=0 +char id=1271 x=0 y=125 width=19 height=20 xoffset=-5 yoffset=3 xadvance=14 page=1 chnl=0 +char id=1273 x=19 y=125 width=23 height=20 xoffset=-5 yoffset=1 xadvance=18 page=1 chnl=0 +char id=1278 x=112 y=84 width=24 height=21 xoffset=-5 yoffset=0 xadvance=20 page=1 chnl=0 +char id=1279 x=19 y=183 width=19 height=18 xoffset=-5 yoffset=3 xadvance=16 page=1 chnl=0 +char id=1280 x=136 y=84 width=22 height=21 xoffset=-5 yoffset=0 xadvance=17 page=1 chnl=0 +char id=1282 x=158 y=84 width=27 height=21 xoffset=-5 yoffset=0 xadvance=22 page=1 chnl=0 +char id=1285 x=36 y=164 width=18 height=19 xoffset=-4 yoffset=3 xadvance=16 page=1 chnl=0 +char id=1287 x=185 y=84 width=17 height=21 xoffset=-4 yoffset=3 xadvance=16 page=1 chnl=0 +char id=1289 x=54 y=164 width=21 height=19 xoffset=-5 yoffset=3 xadvance=18 page=1 chnl=0 +char id=1291 x=75 y=164 width=22 height=19 xoffset=-5 yoffset=3 xadvance=19 page=1 chnl=0 +char id=1293 x=97 y=164 width=18 height=19 xoffset=-5 yoffset=3 xadvance=15 page=1 chnl=0 +char id=1295 x=115 y=164 width=18 height=19 xoffset=-4 yoffset=3 xadvance=16 page=1 chnl=0 +char id=1297 x=133 y=164 width=18 height=19 xoffset=-5 yoffset=3 xadvance=15 page=1 chnl=0 +char id=1301 x=151 y=164 width=21 height=19 xoffset=-5 yoffset=3 xadvance=18 page=1 chnl=0 +char id=1302 x=202 y=84 width=26 height=21 xoffset=-5 yoffset=0 xadvance=21 page=1 chnl=0 +char id=1304 x=228 y=84 width=28 height=21 xoffset=-5 yoffset=0 xadvance=23 page=1 chnl=0 +char id=1305 x=172 y=164 width=23 height=19 xoffset=-5 yoffset=3 xadvance=20 page=1 chnl=0 +char id=1309 x=195 y=164 width=23 height=19 xoffset=-4 yoffset=3 xadvance=19 page=1 chnl=0 +char id=1310 x=256 y=84 width=22 height=21 xoffset=-5 yoffset=0 xadvance=19 page=1 chnl=0 +char id=1311 x=38 y=183 width=19 height=18 xoffset=-5 yoffset=3 xadvance=16 page=1 chnl=0 +char id=8210 x=410 y=201 width=19 height=12 xoffset=-5 yoffset=6 xadvance=16 page=1 chnl=0 +char id=8211 x=410 y=201 width=19 height=12 xoffset=-5 yoffset=6 xadvance=16 page=1 chnl=0 +char id=8212 x=429 y=201 width=27 height=12 xoffset=-5 yoffset=6 xadvance=24 page=1 chnl=0 +char id=8213 x=429 y=201 width=27 height=12 xoffset=-5 yoffset=6 xadvance=24 page=1 chnl=0 +char id=8215 x=130 y=201 width=16 height=14 xoffset=-4 yoffset=11 xadvance=16 page=1 chnl=0 +char id=8216 x=384 y=183 width=13 height=15 xoffset=-3 yoffset=0 xadvance=12 page=1 chnl=0 +char id=8217 x=146 y=201 width=13 height=14 xoffset=-3 yoffset=0 xadvance=12 page=1 chnl=0 +char id=8218 x=397 y=183 width=14 height=15 xoffset=-5 yoffset=9 xadvance=12 page=1 chnl=0 +char id=8219 x=411 y=183 width=13 height=15 xoffset=-3 yoffset=0 xadvance=12 page=1 chnl=0 +char id=8220 x=424 y=183 width=16 height=15 xoffset=-3 yoffset=0 xadvance=15 page=1 chnl=0 +char id=8221 x=159 y=201 width=16 height=14 xoffset=-3 yoffset=0 xadvance=15 page=1 chnl=0 +char id=8222 x=440 y=183 width=17 height=15 xoffset=-5 yoffset=9 xadvance=15 page=1 chnl=0 +char id=8223 x=457 y=183 width=16 height=15 xoffset=-3 yoffset=0 xadvance=15 page=1 chnl=0 +char id=8226 x=473 y=183 width=15 height=15 xoffset=-4 yoffset=3 xadvance=14 page=1 chnl=0 +char id=8230 x=324 y=201 width=22 height=13 xoffset=-3 yoffset=9 xadvance=24 page=1 chnl=0 +char id=8242 x=488 y=183 width=16 height=15 xoffset=-4 yoffset=-1 xadvance=12 page=1 chnl=0 +char id=8243 x=0 y=201 width=19 height=15 xoffset=-4 yoffset=-1 xadvance=15 page=1 chnl=0 +char id=8244 x=19 y=201 width=22 height=15 xoffset=-4 yoffset=-1 xadvance=18 page=1 chnl=0 +char id=8249 x=177 y=183 width=15 height=17 xoffset=-5 yoffset=4 xadvance=12 page=1 chnl=0 +char id=8250 x=192 y=183 width=15 height=17 xoffset=-5 yoffset=4 xadvance=12 page=1 chnl=0 +char id=8254 x=456 y=201 width=20 height=12 xoffset=-4 yoffset=1 xadvance=16 page=1 chnl=0 +char id=8355 x=278 y=84 width=22 height=21 xoffset=-5 yoffset=0 xadvance=17 page=1 chnl=0 +char id=8365 x=300 y=84 width=23 height=21 xoffset=-5 yoffset=0 xadvance=20 page=1 chnl=0 +char id=8366 x=323 y=84 width=22 height=21 xoffset=-4 yoffset=0 xadvance=18 page=1 chnl=0 +char id=8369 x=345 y=84 width=21 height=21 xoffset=-5 yoffset=0 xadvance=18 page=1 chnl=0 +char id=8371 x=366 y=84 width=22 height=21 xoffset=-5 yoffset=0 xadvance=20 page=1 chnl=0 +char id=11360 x=388 y=84 width=20 height=21 xoffset=-5 yoffset=0 xadvance=18 page=1 chnl=0 +char id=11361 x=408 y=84 width=16 height=21 xoffset=-5 yoffset=0 xadvance=13 page=1 chnl=0 +char id=11362 x=424 y=84 width=21 height=21 xoffset=-5 yoffset=0 xadvance=18 page=1 chnl=0 +char id=11363 x=445 y=84 width=22 height=21 xoffset=-5 yoffset=0 xadvance=17 page=1 chnl=0 +char id=11365 x=42 y=125 width=20 height=20 xoffset=-5 yoffset=2 xadvance=15 page=1 chnl=0 +char id=11372 x=62 y=125 width=18 height=20 xoffset=-5 yoffset=3 xadvance=15 page=1 chnl=0 +char id=11377 x=218 y=164 width=22 height=19 xoffset=-4 yoffset=3 xadvance=18 page=1 chnl=0 +char id=11379 x=240 y=164 width=25 height=19 xoffset=-4 yoffset=3 xadvance=22 page=1 chnl=0 +char id=11380 x=80 y=125 width=18 height=20 xoffset=-4 yoffset=2 xadvance=16 page=1 chnl=0 +char id=11381 x=467 y=84 width=20 height=21 xoffset=-5 yoffset=0 xadvance=17 page=1 chnl=0 +char id=11382 x=493 y=164 width=17 height=18 xoffset=-5 yoffset=3 xadvance=14 page=1 chnl=0 +char id=11383 x=265 y=164 width=20 height=19 xoffset=-4 yoffset=3 xadvance=18 page=1 chnl=0 +kernings count=7203 +kerning first=1036 second=1098 amount=-1 +kerning first=279 second=311 amount=-1 +kerning first=256 second=87 amount=-2 +kerning first=264 second=201 amount=-1 +kerning first=88 second=253 amount=-1 +kerning first=234 second=44 amount=-1 +kerning first=77 second=45 amount=-1 +kerning first=277 second=46 amount=-1 +kerning first=193 second=253 amount=-1 +kerning first=206 second=259 amount=-1 +kerning first=229 second=253 amount=-1 +kerning first=337 second=253 amount=-1 +kerning first=83 second=66 amount=-1 +kerning first=256 second=67 amount=-1 +kerning first=268 second=68 amount=-1 +kerning first=262 second=69 amount=-1 +kerning first=352 second=70 amount=-1 +kerning first=87 second=71 amount=-1 +kerning first=266 second=72 amount=-1 +kerning first=264 second=73 amount=-1 +kerning first=368 second=74 amount=-1 +kerning first=262 second=75 amount=-1 +kerning first=264 second=76 amount=-1 +kerning first=66 second=77 amount=-1 +kerning first=262 second=78 amount=-1 +kerning first=66 second=81 amount=-1 +kerning first=268 second=80 amount=-1 +kerning first=75 second=81 amount=-1 +kerning first=350 second=82 amount=-1 +kerning first=193 second=84 amount=-2 +kerning first=196 second=85 amount=-1 +kerning first=350 second=86 amount=-1 +kerning first=66 second=90 amount=-1 +kerning first=72 second=97 amount=-1 +kerning first=375 second=99 amount=-1 +kerning first=84 second=100 amount=-1 +kerning first=356 second=101 amount=-1 +kerning first=379 second=102 amount=-1 +kerning first=249 second=103 amount=-1 +kerning first=275 second=104 amount=-1 +kerning first=269 second=105 amount=-1 +kerning first=277 second=107 amount=-1 +kerning first=119 second=108 amount=-1 +kerning first=66 second=110 amount=-1 +kerning first=118 second=111 amount=-1 +kerning first=268 second=112 amount=-1 +kerning first=356 second=113 amount=-1 +kerning first=66 second=114 amount=-1 +kerning first=196 second=115 amount=-1 +kerning first=82 second=116 amount=-1 +kerning first=377 second=117 amount=-1 +kerning first=120 second=118 amount=-1 +kerning first=260 second=119 amount=-1 +kerning first=350 second=120 amount=-1 +kerning first=226 second=121 amount=-1 +kerning first=315 second=122 amount=-1 +kerning first=195 second=219 amount=-1 +kerning first=307 second=171 amount=-1 +kerning first=121 second=235 amount=-1 +kerning first=84 second=187 amount=-1 +kerning first=82 second=45 amount=-1 +kerning first=374 second=192 amount=-2 +kerning first=67 second=193 amount=-1 +kerning first=45 second=195 amount=-1 +kerning first=86 second=196 amount=-2 +kerning first=8220 second=197 amount=-2 +kerning first=86 second=287 amount=-1 +kerning first=199 second=199 amount=-1 +kerning first=45 second=200 amount=-1 +kerning first=352 second=201 amount=-1 +kerning first=187 second=203 amount=-1 +kerning first=83 second=204 amount=-1 +kerning first=268 second=205 amount=-1 +kerning first=350 second=206 amount=-1 +kerning first=350 second=207 amount=-1 +kerning first=352 second=209 amount=-1 +kerning first=256 second=210 amount=-1 +kerning first=310 second=211 amount=-1 +kerning first=67 second=213 amount=-1 +kerning first=260 second=214 amount=-1 +kerning first=197 second=216 amount=-1 +kerning first=260 second=217 amount=-1 +kerning first=8218 second=218 amount=-1 +kerning first=352 second=219 amount=-1 +kerning first=344 second=220 amount=-1 +kerning first=223 second=46 amount=-1 +kerning first=374 second=223 amount=-1 +kerning first=99 second=224 amount=-1 +kerning first=209 second=225 amount=-1 +kerning first=8220 second=226 amount=-1 +kerning first=364 second=227 amount=-1 +kerning first=376 second=228 amount=-1 +kerning first=66 second=229 amount=-1 +kerning first=118 second=230 amount=-1 +kerning first=199 second=171 amount=-1 +kerning first=221 second=232 amount=-1 +kerning first=371 second=233 amount=-1 +kerning first=354 second=234 amount=-1 +kerning first=231 second=237 amount=-1 +kerning first=82 second=240 amount=-1 +kerning first=66 second=241 amount=-1 +kerning first=84 second=242 amount=-1 +kerning first=303 second=244 amount=-1 +kerning first=8216 second=245 amount=-1 +kerning first=374 second=246 amount=-1 +kerning first=88 second=250 amount=-1 +kerning first=344 second=248 amount=-1 +kerning first=195 second=249 amount=-1 +kerning first=298 second=250 amount=-1 +kerning first=72 second=251 amount=-1 +kerning first=258 second=252 amount=-1 +kerning first=254 second=253 amount=-1 +kerning first=66 second=254 amount=-1 +kerning first=8250 second=255 amount=-1 +kerning first=219 second=256 amount=-1 +kerning first=119 second=257 amount=-1 +kerning first=118 second=259 amount=-1 +kerning first=362 second=260 amount=-1 +kerning first=310 second=262 amount=-1 +kerning first=8220 second=263 amount=-1 +kerning first=86 second=266 amount=-1 +kerning first=255 second=267 amount=-1 +kerning first=66 second=268 amount=-1 +kerning first=346 second=270 amount=-1 +kerning first=375 second=271 amount=-1 +kerning first=78 second=117 amount=-1 +kerning first=268 second=274 amount=-1 +kerning first=303 second=275 amount=-1 +kerning first=8220 second=277 amount=-1 +kerning first=352 second=278 amount=-1 +kerning first=84 second=279 amount=-1 +kerning first=268 second=280 amount=-1 +kerning first=344 second=281 amount=-1 +kerning first=66 second=282 amount=-1 +kerning first=344 second=283 amount=-1 +kerning first=75 second=284 amount=-1 +kerning first=82 second=286 amount=-1 +kerning first=260 second=287 amount=-1 +kerning first=82 second=288 amount=-1 +kerning first=233 second=289 amount=-1 +kerning first=268 second=291 amount=-1 +kerning first=266 second=296 amount=-1 +kerning first=66 second=298 amount=-1 +kerning first=199 second=302 amount=-1 +kerning first=99 second=303 amount=-1 +kerning first=83 second=305 amount=-1 +kerning first=354 second=99 amount=-1 +kerning first=264 second=310 amount=-1 +kerning first=102 second=311 amount=1 +kerning first=376 second=352 amount=-1 +kerning first=346 second=313 amount=-1 +kerning first=121 second=314 amount=-1 +kerning first=8250 second=315 amount=-1 +kerning first=253 second=316 amount=-1 +kerning first=82 second=335 amount=-1 +kerning first=283 second=318 amount=-1 +kerning first=268 second=330 amount=-1 +kerning first=262 second=323 amount=-1 +kerning first=264 second=325 amount=-1 +kerning first=66 second=327 amount=-1 +kerning first=66 second=330 amount=-1 +kerning first=87 second=332 amount=-1 +kerning first=107 second=333 amount=-1 +kerning first=221 second=334 amount=-1 +kerning first=344 second=335 amount=-1 +kerning first=256 second=336 amount=-1 +kerning first=107 second=337 amount=-1 +kerning first=66 second=338 amount=-1 +kerning first=344 second=339 amount=-1 +kerning first=187 second=344 amount=-1 +kerning first=66 second=345 amount=-1 +kerning first=66 second=346 amount=-1 +kerning first=354 second=347 amount=-1 +kerning first=356 second=350 amount=-1 +kerning first=103 second=351 amount=-1 +kerning first=65 second=352 amount=-1 +kerning first=192 second=353 amount=-1 +kerning first=344 second=355 amount=-1 +kerning first=284 second=356 amount=-1 +kerning first=251 second=103 amount=-1 +kerning first=196 second=350 amount=-1 +kerning first=120 second=361 amount=-1 +kerning first=258 second=362 amount=-1 +kerning first=296 second=363 amount=-1 +kerning first=66 second=364 amount=-1 +kerning first=253 second=122 amount=-1 +kerning first=8250 second=366 amount=-1 +kerning first=120 second=367 amount=-1 +kerning first=346 second=368 amount=-1 +kerning first=204 second=369 amount=-1 +kerning first=120 second=371 amount=-1 +kerning first=101 second=318 amount=-1 +kerning first=256 second=374 amount=-2 +kerning first=256 second=375 amount=-1 +kerning first=313 second=378 amount=-1 +kerning first=376 second=379 amount=-1 +kerning first=219 second=380 amount=-1 +kerning first=321 second=382 amount=-1 +kerning first=242 second=318 amount=-1 +kerning first=256 second=199 amount=-1 +kerning first=307 second=118 amount=-1 +kerning first=315 second=368 amount=-1 +kerning first=1059 second=1078 amount=-1 +kerning first=75 second=365 amount=-1 +kerning first=230 second=121 amount=-1 +kerning first=221 second=231 amount=-1 +kerning first=8216 second=194 amount=-2 +kerning first=193 second=332 amount=-1 +kerning first=350 second=204 amount=-1 +kerning first=376 second=291 amount=-1 +kerning first=72 second=117 amount=-1 +kerning first=8220 second=225 amount=-1 +kerning first=88 second=332 amount=-1 +kerning first=217 second=378 amount=-1 +kerning first=234 second=316 amount=-1 +kerning first=196 second=252 amount=-1 +kerning first=86 second=267 amount=-1 +kerning first=76 second=378 amount=-1 +kerning first=1040 second=1095 amount=-1 +kerning first=337 second=46 amount=-1 +kerning first=194 second=364 amount=-1 +kerning first=8250 second=77 amount=-1 +kerning first=197 second=264 amount=-1 +kerning first=105 second=119 amount=-1 +kerning first=45 second=362 amount=-1 +kerning first=289 second=378 amount=-1 +kerning first=253 second=378 amount=-1 +kerning first=317 second=218 amount=-1 +kerning first=84 second=380 amount=-1 +kerning first=101 second=375 amount=-1 +kerning first=354 second=119 amount=-1 +kerning first=350 second=200 amount=-1 +kerning first=82 second=217 amount=-1 +kerning first=196 second=364 amount=-1 +kerning first=187 second=217 amount=-1 +kerning first=371 second=267 amount=-1 +kerning first=192 second=212 amount=-1 +kerning first=224 second=8220 amount=-1 +kerning first=192 second=375 amount=-1 +kerning first=379 second=250 amount=-1 +kerning first=356 second=216 amount=-1 +kerning first=264 second=378 amount=-1 +kerning first=80 second=192 amount=-1 +kerning first=65 second=290 amount=-1 +kerning first=87 second=378 amount=-1 +kerning first=66 second=331 amount=-1 +kerning first=45 second=204 amount=-1 +kerning first=290 second=193 amount=-1 +kerning first=266 second=325 amount=-1 +kerning first=192 second=221 amount=-2 +kerning first=187 second=296 amount=-1 +kerning first=262 second=274 amount=-1 +kerning first=346 second=366 amount=-1 +kerning first=1061 second=1058 amount=-1 +kerning first=8220 second=74 amount=-1 +kerning first=187 second=256 amount=-1 +kerning first=304 second=291 amount=-1 +kerning first=78 second=226 amount=-1 +kerning first=260 second=210 amount=-1 +kerning first=232 second=291 amount=-1 +kerning first=86 second=326 amount=-1 +kerning first=196 second=291 amount=-1 +kerning first=255 second=226 amount=-1 +kerning first=71 second=197 amount=-1 +kerning first=219 second=226 amount=-1 +kerning first=346 second=327 amount=-1 +kerning first=327 second=226 amount=-1 +kerning first=291 second=226 amount=-1 +kerning first=350 second=68 amount=-1 +kerning first=284 second=197 amount=-1 +kerning first=266 second=344 amount=-1 +kerning first=212 second=197 amount=-1 +kerning first=99 second=108 amount=-1 +kerning first=356 second=197 amount=-2 +kerning first=89 second=187 amount=-1 +kerning first=205 second=365 amount=-1 +kerning first=197 second=284 amount=-1 +kerning first=206 second=8249 amount=-1 +kerning first=84 second=262 amount=-1 +kerning first=375 second=337 amount=-1 +kerning first=310 second=268 amount=-1 +kerning first=73 second=261 amount=-1 +kerning first=303 second=337 amount=-1 +kerning first=350 second=8249 amount=-1 +kerning first=314 second=8249 amount=-1 +kerning first=112 second=108 amount=-1 +kerning first=253 second=108 amount=-1 +kerning first=68 second=198 amount=-1 +kerning first=269 second=303 amount=-1 +kerning first=263 second=228 amount=-1 +kerning first=339 second=318 amount=-1 +kerning first=375 second=318 amount=-1 +kerning first=217 second=260 amount=-1 +kerning first=86 second=228 amount=-1 +kerning first=72 second=367 amount=-1 +kerning first=258 second=45 amount=-1 +kerning first=289 second=108 amount=-1 +kerning first=253 second=279 amount=-1 +kerning first=268 second=290 amount=-1 +kerning first=76 second=89 amount=-1 +kerning first=1036 second=1104 amount=-1 +kerning first=82 second=231 amount=-1 +kerning first=193 second=8217 amount=-1 +kerning first=121 second=353 amount=-1 +kerning first=311 second=339 amount=-1 +kerning first=119 second=229 amount=-1 +kerning first=8222 second=119 amount=-1 +kerning first=252 second=8217 amount=-1 +kerning first=324 second=8217 amount=-1 +kerning first=71 second=45 amount=-1 +kerning first=352 second=304 amount=-1 +kerning first=87 second=240 amount=-1 +kerning first=193 second=352 amount=-1 +kerning first=284 second=45 amount=-1 +kerning first=368 second=229 amount=-1 +kerning first=356 second=45 amount=-1 +kerning first=296 second=229 amount=-1 +kerning first=107 second=45 amount=-1 +kerning first=268 second=310 amount=-1 +kerning first=67 second=304 amount=-1 +kerning first=346 second=77 amount=-1 +kerning first=263 second=307 amount=-1 +kerning first=344 second=111 amount=-1 +kerning first=226 second=255 amount=-1 +kerning first=87 second=109 amount=-1 +kerning first=221 second=211 amount=-1 +kerning first=1038 second=1033 amount=-1 +kerning first=1040 second=1038 amount=-1 +kerning first=1038 second=1040 amount=-2 +kerning first=118 second=46 amount=-1 +kerning first=8249 second=84 amount=-1 +kerning first=1038 second=1047 amount=-1 +kerning first=1038 second=1051 amount=-1 +kerning first=350 second=69 amount=-1 +kerning first=8250 second=346 amount=-1 +kerning first=218 second=193 amount=-1 +kerning first=119 second=289 amount=-1 +kerning first=1040 second=1057 amount=-1 +kerning first=1040 second=1058 amount=-1 +kerning first=1040 second=1059 amount=-1 +kerning first=1040 second=1060 amount=-1 +kerning first=1061 second=1063 amount=-1 +kerning first=83 second=289 amount=-1 +kerning first=354 second=79 amount=-1 +kerning first=296 second=289 amount=-1 +kerning first=1038 second=1072 amount=-1 +kerning first=1038 second=1073 amount=-1 +kerning first=1038 second=1074 amount=-1 +kerning first=1038 second=1076 amount=-1 +kerning first=1038 second=1077 amount=-1 +kerning first=1038 second=1078 amount=-1 +kerning first=1038 second=1079 amount=-1 +kerning first=1038 second=1080 amount=-1 +kerning first=1038 second=1081 amount=-1 +kerning first=1038 second=1082 amount=-1 +kerning first=1091 second=1083 amount=-1 +kerning first=1059 second=1084 amount=-1 +kerning first=1038 second=1085 amount=-1 +kerning first=1046 second=1086 amount=-1 +kerning first=1038 second=1087 amount=-1 +kerning first=1038 second=1088 amount=-1 +kerning first=1038 second=1089 amount=-1 +kerning first=103 second=225 amount=-1 +kerning first=1040 second=1091 amount=-1 +kerning first=1038 second=1092 amount=-1 +kerning first=1038 second=1093 amount=-1 +kerning first=1038 second=1094 amount=-1 +kerning first=1050 second=1095 amount=-1 +kerning first=1059 second=1096 amount=-1 +kerning first=1038 second=1097 amount=-1 +kerning first=1050 second=1098 amount=-1 +kerning first=1038 second=1099 amount=-1 +kerning first=1038 second=1100 amount=-1 +kerning first=45 second=375 amount=-1 +kerning first=67 second=206 amount=-1 +kerning first=1038 second=1103 amount=-1 +kerning first=258 second=264 amount=-1 +kerning first=1038 second=1105 amount=-1 +kerning first=1038 second=1107 amount=-1 +kerning first=1043 second=1108 amount=-1 +kerning first=291 second=225 amount=-1 +kerning first=1043 second=1113 amount=-1 +kerning first=1038 second=1114 amount=-1 +kerning first=327 second=225 amount=-1 +kerning first=1038 second=1116 amount=-1 +kerning first=83 second=368 amount=-1 +kerning first=1040 second=1118 amount=-1 +kerning first=1038 second=1119 amount=-1 +kerning first=313 second=364 amount=-1 +kerning first=286 second=287 amount=-1 +kerning first=221 second=46 amount=-1 +kerning first=260 second=368 amount=-1 +kerning first=288 second=287 amount=-1 +kerning first=75 second=268 amount=-1 +kerning first=252 second=287 amount=-1 +kerning first=352 second=206 amount=-1 +kerning first=352 second=69 amount=-1 +kerning first=260 second=347 amount=-1 +kerning first=344 second=71 amount=-1 +kerning first=71 second=46 amount=-1 +kerning first=119 second=347 amount=-1 +kerning first=8220 second=244 amount=-1 +kerning first=78 second=225 amount=-1 +kerning first=187 second=86 amount=-1 +kerning first=87 second=241 amount=-1 +kerning first=85 second=45 amount=-1 +kerning first=317 second=87 amount=-1 +kerning first=248 second=46 amount=-1 +kerning first=75 second=266 amount=-1 +kerning first=219 second=225 amount=-1 +kerning first=255 second=225 amount=-1 +kerning first=356 second=46 amount=-1 +kerning first=376 second=332 amount=-1 +kerning first=82 second=86 amount=-1 +kerning first=231 second=259 amount=-1 +kerning first=1038 second=1090 amount=-1 +kerning first=201 second=287 amount=-1 +kerning first=354 second=230 amount=-1 +kerning first=262 second=332 amount=-1 +kerning first=304 second=369 amount=-1 +kerning first=367 second=375 amount=-1 +kerning first=196 second=81 amount=-1 +kerning first=1027 second=1105 amount=-1 +kerning first=375 second=259 amount=-1 +kerning first=69 second=289 amount=-1 +kerning first=187 second=375 amount=-1 +kerning first=105 second=289 amount=-1 +kerning first=223 second=375 amount=-1 +kerning first=221 second=350 amount=-1 +kerning first=259 second=375 amount=-1 +kerning first=267 second=259 amount=-1 +kerning first=376 second=81 amount=-1 +kerning first=317 second=368 amount=-1 +kerning first=121 second=382 amount=-1 +kerning first=8216 second=196 amount=-2 +kerning first=268 second=81 amount=-1 +kerning first=8250 second=209 amount=-1 +kerning first=354 second=289 amount=-1 +kerning first=103 second=46 amount=-1 +kerning first=196 second=369 amount=-1 +kerning first=260 second=288 amount=-1 +kerning first=1065 second=1095 amount=-1 +kerning first=281 second=316 amount=-1 +kerning first=105 second=171 amount=-1 +kerning first=337 second=121 amount=-1 +kerning first=310 second=117 amount=-1 +kerning first=229 second=121 amount=-1 +kerning first=262 second=196 amount=-1 +kerning first=193 second=121 amount=-1 +kerning first=370 second=196 amount=-1 +kerning first=334 second=196 amount=-1 +kerning first=88 second=121 amount=-1 +kerning first=85 second=196 amount=-1 +kerning first=354 second=231 amount=-1 +kerning first=307 second=119 amount=-1 +kerning first=45 second=302 amount=-1 +kerning first=82 second=375 amount=-1 +kerning first=193 second=351 amount=-1 +kerning first=235 second=119 amount=-1 +kerning first=1059 second=1098 amount=-1 +kerning first=197 second=112 amount=-1 +kerning first=193 second=214 amount=-1 +kerning first=89 second=214 amount=-1 +kerning first=350 second=298 amount=-1 +kerning first=1059 second=1097 amount=-1 +kerning first=101 second=107 amount=-1 +kerning first=287 second=314 amount=-1 +kerning first=109 second=45 amount=-1 +kerning first=1038 second=1098 amount=-1 +kerning first=251 second=314 amount=-1 +kerning first=66 second=213 amount=-1 +kerning first=243 second=120 amount=-1 +kerning first=99 second=253 amount=-1 +kerning first=256 second=8249 amount=-1 +kerning first=240 second=253 amount=-1 +kerning first=220 second=8249 amount=-1 +kerning first=187 second=315 amount=-1 +kerning first=328 second=8249 amount=-1 +kerning first=204 second=291 amount=-1 +kerning first=197 second=363 amount=-1 +kerning first=364 second=8249 amount=-1 +kerning first=255 second=246 amount=-1 +kerning first=88 second=214 amount=-1 +kerning first=344 second=263 amount=-1 +kerning first=370 second=103 amount=-1 +kerning first=1060 second=1033 amount=-1 +kerning first=192 second=220 amount=-1 +kerning first=298 second=103 amount=-1 +kerning first=377 second=363 amount=-1 +kerning first=356 second=334 amount=-1 +kerning first=352 second=344 amount=-1 +kerning first=376 second=101 amount=-1 +kerning first=8217 second=226 amount=-1 +kerning first=311 second=281 amount=-1 +kerning first=44 second=8221 amount=-1 +kerning first=224 second=118 amount=-1 +kerning first=260 second=118 amount=-1 +kerning first=83 second=118 amount=-1 +kerning first=67 second=382 amount=-1 +kerning first=245 second=316 amount=-1 +kerning first=103 second=382 amount=-1 +kerning first=66 second=120 amount=-1 +kerning first=258 second=86 amount=-2 +kerning first=193 second=83 amount=-1 +kerning first=370 second=44 amount=-1 +kerning first=334 second=44 amount=-1 +kerning first=194 second=374 amount=-2 +kerning first=121 second=44 amount=-1 +kerning first=85 second=44 amount=-1 +kerning first=251 second=255 amount=-1 +kerning first=296 second=97 amount=-1 +kerning first=365 second=8221 amount=-1 +kerning first=196 second=211 amount=-1 +kerning first=344 second=262 amount=-1 +kerning first=257 second=8221 amount=-1 +kerning first=368 second=97 amount=-1 +kerning first=376 second=211 amount=-1 +kerning first=90 second=8249 amount=-1 +kerning first=268 second=211 amount=-1 +kerning first=221 second=79 amount=-1 +kerning first=346 second=209 amount=-1 +kerning first=108 second=118 amount=-1 +kerning first=85 second=65 amount=-1 +kerning first=321 second=118 amount=-1 +kerning first=187 second=85 amount=-1 +kerning first=262 second=65 amount=-1 +kerning first=218 second=83 amount=-1 +kerning first=209 second=257 amount=-1 +kerning first=82 second=85 amount=-1 +kerning first=334 second=65 amount=-1 +kerning first=121 second=234 amount=-1 +kerning first=354 second=192 amount=-2 +kerning first=249 second=118 amount=-1 +kerning first=254 second=120 amount=-1 +kerning first=8220 second=246 amount=-1 +kerning first=370 second=65 amount=-1 +kerning first=350 second=260 amount=-1 +kerning first=296 second=250 amount=-1 +kerning first=210 second=192 amount=-1 +kerning first=260 second=250 amount=-1 +kerning first=339 second=107 amount=-1 +kerning first=376 second=331 amount=-1 +kerning first=195 second=199 amount=-1 +kerning first=79 second=198 amount=-1 +kerning first=8250 second=302 amount=-1 +kerning first=284 second=84 amount=-1 +kerning first=365 second=291 amount=-1 +kerning first=84 second=381 amount=-1 +kerning first=244 second=253 amount=-1 +kerning first=82 second=216 amount=-1 +kerning first=71 second=84 amount=-1 +kerning first=221 second=291 amount=-1 +kerning first=80 second=291 amount=-1 +kerning first=311 second=242 amount=-1 +kerning first=192 second=334 amount=-1 +kerning first=8250 second=78 amount=-1 +kerning first=107 second=335 amount=-1 +kerning first=356 second=335 amount=-1 +kerning first=381 second=45 amount=-1 +kerning first=258 second=112 amount=-1 +kerning first=253 second=339 amount=-1 +kerning first=8220 second=245 amount=-1 +kerning first=84 second=261 amount=-1 +kerning first=253 second=240 amount=-1 +kerning first=86 second=268 amount=-1 +kerning first=87 second=110 amount=-1 +kerning first=82 second=374 amount=-1 +kerning first=66 second=370 amount=-1 +kerning first=8217 second=227 amount=-1 +kerning first=101 second=108 amount=-1 +kerning first=220 second=198 amount=-1 +kerning first=307 second=289 amount=-1 +kerning first=87 second=279 amount=-1 +kerning first=199 second=289 amount=-1 +kerning first=235 second=289 amount=-1 +kerning first=89 second=286 amount=-1 +kerning first=65 second=218 amount=-1 +kerning first=194 second=286 amount=-1 +kerning first=379 second=289 amount=-1 +kerning first=266 second=286 amount=-1 +kerning first=315 second=370 amount=-1 +kerning first=1061 second=1104 amount=-1 +kerning first=242 second=108 amount=-1 +kerning first=352 second=305 amount=-1 +kerning first=333 second=108 amount=-1 +kerning first=89 second=324 amount=-1 +kerning first=66 second=310 amount=-1 +kerning first=87 second=339 amount=-1 +kerning first=374 second=324 amount=-1 +kerning first=277 second=287 amount=-1 +kerning first=205 second=287 amount=-1 +kerning first=86 second=115 amount=-1 +kerning first=287 second=353 amount=-1 +kerning first=256 second=356 amount=-2 +kerning first=8220 second=283 amount=-1 +kerning first=354 second=290 amount=-1 +kerning first=84 second=223 amount=-1 +kerning first=119 second=97 amount=-1 +kerning first=356 second=275 amount=-1 +kerning first=313 second=287 amount=-1 +kerning first=89 second=226 amount=-1 +kerning first=303 second=279 amount=-1 +kerning first=302 second=226 amount=-1 +kerning first=321 second=368 amount=-1 +kerning first=107 second=275 amount=-1 +kerning first=45 second=74 amount=-1 +kerning first=216 second=198 amount=-1 +kerning first=287 second=45 amount=-1 +kerning first=288 second=194 amount=-1 +kerning first=323 second=45 amount=-1 +kerning first=366 second=74 amount=-1 +kerning first=74 second=45 amount=-1 +kerning first=354 second=350 amount=-1 +kerning first=356 second=353 amount=-1 +kerning first=303 second=240 amount=-1 +kerning first=80 second=289 amount=-1 +kerning first=82 second=356 amount=-1 +kerning first=1059 second=1116 amount=-1 +kerning first=187 second=356 amount=-1 +kerning first=352 second=112 amount=-1 +kerning first=1054 second=1033 amount=-1 +kerning first=354 second=214 amount=-1 +kerning first=367 second=255 amount=-1 +kerning first=221 second=289 amount=-1 +kerning first=83 second=77 amount=-1 +kerning first=259 second=255 amount=-1 +kerning first=376 second=261 amount=-1 +kerning first=66 second=194 amount=-1 +kerning first=253 second=227 amount=-1 +kerning first=187 second=255 amount=-1 +kerning first=67 second=112 amount=-1 +kerning first=82 second=255 amount=-1 +kerning first=375 second=240 amount=-1 +kerning first=260 second=211 amount=-1 +kerning first=199 second=80 amount=-1 +kerning first=304 second=97 amount=-1 +kerning first=66 second=290 amount=-1 +kerning first=221 second=193 amount=-2 +kerning first=374 second=241 amount=-1 +kerning first=379 second=251 amount=-1 +kerning first=362 second=192 amount=-1 +kerning first=365 second=8220 amount=-1 +kerning first=8217 second=346 amount=-1 +kerning first=356 second=257 amount=-1 +kerning first=218 second=192 amount=-1 +kerning first=256 second=338 amount=-1 +kerning first=290 second=192 amount=-1 +kerning first=66 second=326 amount=-1 +kerning first=195 second=268 amount=-1 +kerning first=44 second=8220 amount=-1 +kerning first=83 second=119 amount=-1 +kerning first=224 second=119 amount=-1 +kerning first=376 second=233 amount=-1 +kerning first=263 second=224 amount=-1 +kerning first=1046 second=1073 amount=-1 +kerning first=89 second=225 amount=-1 +kerning first=119 second=44 amount=-1 +kerning first=240 second=314 amount=-1 +kerning first=374 second=225 amount=-1 +kerning first=199 second=209 amount=-1 +kerning first=8217 second=263 amount=-1 +kerning first=302 second=363 amount=-1 +kerning first=302 second=225 amount=-1 +kerning first=99 second=314 amount=-1 +kerning first=376 second=213 amount=-1 +kerning first=356 second=375 amount=-1 +kerning first=1043 second=1072 amount=-1 +kerning first=76 second=375 amount=-1 +kerning first=268 second=213 amount=-1 +kerning first=364 second=259 amount=-1 +kerning first=248 second=375 amount=-1 +kerning first=350 second=87 amount=-1 +kerning first=1040 second=1054 amount=-1 +kerning first=220 second=259 amount=-1 +kerning first=221 second=101 amount=-1 +kerning first=8217 second=287 amount=-1 +kerning first=311 second=246 amount=-1 +kerning first=66 second=369 amount=-1 +kerning first=199 second=288 amount=-1 +kerning first=107 second=235 amount=-1 +kerning first=350 second=317 amount=-1 +kerning first=1043 second=1033 amount=-1 +kerning first=65 second=87 amount=-2 +kerning first=8217 second=267 amount=-1 +kerning first=195 second=218 amount=-1 +kerning first=356 second=235 amount=-1 +kerning first=82 second=104 amount=-1 +kerning first=207 second=369 amount=-1 +kerning first=346 second=76 amount=-1 +kerning first=80 second=171 amount=-1 +kerning first=44 second=171 amount=-1 +kerning first=354 second=212 amount=-1 +kerning first=1091 second=1113 amount=-1 +kerning first=85 second=352 amount=-1 +kerning first=66 second=82 amount=-1 +kerning first=221 second=171 amount=-1 +kerning first=88 second=252 amount=-1 +kerning first=82 second=262 amount=-1 +kerning first=76 second=219 amount=-1 +kerning first=118 second=277 amount=-1 +kerning first=362 second=83 amount=-1 +kerning first=82 second=277 amount=-1 +kerning first=262 second=197 amount=-1 +kerning first=77 second=287 amount=-1 +kerning first=240 second=121 amount=-1 +kerning first=278 second=103 amount=-1 +kerning first=99 second=121 amount=-1 +kerning first=370 second=197 amount=-1 +kerning first=195 second=336 amount=-1 +kerning first=262 second=352 amount=-1 +kerning first=334 second=197 amount=-1 +kerning first=263 second=229 amount=-1 +kerning first=370 second=122 amount=-1 +kerning first=121 second=122 amount=-1 +kerning first=268 second=270 amount=-1 +kerning first=85 second=122 amount=-1 +kerning first=354 second=100 amount=-1 +kerning first=279 second=108 amount=-1 +kerning first=221 second=192 amount=-2 +kerning first=324 second=8220 amount=-1 +kerning first=196 second=213 amount=-1 +kerning first=82 second=334 amount=-1 +kerning first=74 second=65 amount=-1 +kerning first=119 second=99 amount=-1 +kerning first=86 second=229 amount=-1 +kerning first=291 second=115 amount=-1 +kerning first=363 second=8217 amount=-1 +kerning first=1101 second=1076 amount=-1 +kerning first=255 second=115 amount=-1 +kerning first=196 second=171 amount=-1 +kerning first=8250 second=76 amount=-1 +kerning first=304 second=171 amount=-1 +kerning first=268 second=171 amount=-1 +kerning first=339 second=46 amount=-1 +kerning first=65 second=199 amount=-1 +kerning first=195 second=86 amount=-2 +kerning first=268 second=82 amount=-1 +kerning first=381 second=103 amount=-1 +kerning first=66 second=214 amount=-1 +kerning first=196 second=8221 amount=-1 +kerning first=201 second=103 amount=-1 +kerning first=258 second=361 amount=-1 +kerning first=67 second=266 amount=-1 +kerning first=330 second=361 amount=-1 +kerning first=287 second=351 amount=-1 +kerning first=310 second=249 amount=-1 +kerning first=195 second=220 amount=-1 +kerning first=365 second=287 amount=-1 +kerning first=192 second=71 amount=-1 +kerning first=87 second=242 amount=-1 +kerning first=260 second=86 amount=-2 +kerning first=195 second=67 amount=-1 +kerning first=354 second=232 amount=-1 +kerning first=71 second=8249 amount=-1 +kerning first=280 second=287 amount=-1 +kerning first=45 second=380 amount=-1 +kerning first=264 second=202 amount=-1 +kerning first=107 second=171 amount=-1 +kerning first=366 second=380 amount=-1 +kerning first=8250 second=207 amount=-1 +kerning first=120 second=224 amount=-1 +kerning first=84 second=379 amount=-1 +kerning first=8217 second=225 amount=-1 +kerning first=317 second=217 amount=-1 +kerning first=346 second=69 amount=-1 +kerning first=192 second=211 amount=-1 +kerning first=1070 second=1040 amount=-1 +kerning first=84 second=224 amount=-1 +kerning first=350 second=218 amount=-1 +kerning first=82 second=354 amount=-1 +kerning first=352 second=364 amount=-1 +kerning first=1050 second=1104 amount=-1 +kerning first=187 second=354 amount=-1 +kerning first=337 second=120 amount=-1 +kerning first=234 second=104 amount=-1 +kerning first=254 second=46 amount=-1 +kerning first=97 second=118 amount=-1 +kerning first=376 second=193 amount=-2 +kerning first=256 second=117 amount=-1 +kerning first=193 second=71 amount=-1 +kerning first=72 second=250 amount=-1 +kerning first=221 second=331 amount=-1 +kerning first=1027 second=1033 amount=-1 +kerning first=375 second=108 amount=-1 +kerning first=339 second=108 amount=-1 +kerning first=83 second=206 amount=-1 +kerning first=89 second=287 amount=-1 +kerning first=199 second=78 amount=-1 +kerning first=260 second=79 amount=-1 +kerning first=234 second=107 amount=-1 +kerning first=66 second=192 amount=-1 +kerning first=45 second=206 amount=-1 +kerning first=374 second=287 amount=-1 +kerning first=302 second=287 amount=-1 +kerning first=1061 second=1089 amount=-1 +kerning first=205 second=226 amount=-1 +kerning first=230 second=287 amount=-1 +kerning first=337 second=44 amount=-1 +kerning first=374 second=113 amount=-1 +kerning first=266 second=287 amount=-1 +kerning first=87 second=90 amount=-1 +kerning first=187 second=84 amount=-1 +kerning first=194 second=287 amount=-1 +kerning first=82 second=84 amount=-1 +kerning first=362 second=291 amount=-1 +kerning first=290 second=291 amount=-1 +kerning first=70 second=74 amount=-1 +kerning first=370 second=45 amount=-1 +kerning first=86 second=269 amount=-1 +kerning first=354 second=210 amount=-1 +kerning first=77 second=291 amount=-1 +kerning first=78 second=365 amount=-1 +kerning first=199 second=350 amount=-1 +kerning first=262 second=45 amount=-1 +kerning first=1038 second=1108 amount=-1 +kerning first=264 second=68 amount=-1 +kerning first=83 second=327 amount=-1 +kerning first=371 second=269 amount=-1 +kerning first=87 second=8249 amount=-1 +kerning first=311 second=279 amount=-1 +kerning first=344 second=286 amount=-1 +kerning first=192 second=8249 amount=-1 +kerning first=252 second=375 amount=-1 +kerning first=264 second=8249 amount=-1 +kerning first=350 second=221 amount=-1 +kerning first=267 second=108 amount=-1 +kerning first=220 second=196 amount=-1 +kerning first=72 second=228 amount=-1 +kerning first=195 second=338 amount=-1 +kerning first=268 second=332 amount=-1 +kerning first=296 second=251 amount=-1 +kerning first=8218 second=220 amount=-1 +kerning first=260 second=251 amount=-1 +kerning first=196 second=332 amount=-1 +kerning first=65 second=219 amount=-1 +kerning first=281 second=108 amount=-1 +kerning first=371 second=245 amount=-1 +kerning first=45 second=381 amount=-1 +kerning first=310 second=375 amount=-1 +kerning first=89 second=115 amount=-1 +kerning first=86 second=226 amount=-1 +kerning first=221 second=212 amount=-1 +kerning first=263 second=226 amount=-1 +kerning first=1045 second=1098 amount=-1 +kerning first=1118 second=1113 amount=-1 +kerning first=75 second=367 amount=-1 +kerning first=108 second=119 amount=-1 +kerning first=321 second=119 amount=-1 +kerning first=356 second=109 amount=-1 +kerning first=194 second=115 amount=-1 +kerning first=368 second=230 amount=-1 +kerning first=249 second=119 amount=-1 +kerning first=374 second=115 amount=-1 +kerning first=78 second=363 amount=-1 +kerning first=221 second=233 amount=-1 +kerning first=263 second=97 amount=-1 +kerning first=327 second=363 amount=-1 +kerning first=337 second=314 amount=-1 +kerning first=199 second=211 amount=-1 +kerning first=225 second=375 amount=-1 +kerning first=362 second=194 amount=-1 +kerning first=356 second=255 amount=-1 +kerning first=86 second=97 amount=-1 +kerning first=248 second=255 amount=-1 +kerning first=1046 second=1092 amount=-1 +kerning first=89 second=244 amount=-1 +kerning first=8220 second=227 amount=-1 +kerning first=121 second=275 amount=-1 +kerning first=354 second=101 amount=-1 +kerning first=290 second=194 amount=-1 +kerning first=8250 second=368 amount=-1 +kerning first=374 second=244 amount=-1 +kerning first=316 second=8221 amount=-1 +kerning first=197 second=121 amount=-1 +kerning first=262 second=296 amount=-1 +kerning first=346 second=325 amount=-1 +kerning first=1043 second=1095 amount=-1 +kerning first=334 second=46 amount=-1 +kerning first=370 second=46 amount=-1 +kerning first=84 second=281 amount=-1 +kerning first=66 second=83 amount=-1 +kerning first=264 second=69 amount=-1 +kerning first=74 second=197 amount=-1 +kerning first=67 second=264 amount=-1 +kerning first=194 second=266 amount=-1 +kerning first=89 second=266 amount=-1 +kerning first=374 second=266 amount=-1 +kerning first=375 second=339 amount=-1 +kerning first=205 second=225 amount=-1 +kerning first=264 second=70 amount=-1 +kerning first=266 second=266 amount=-1 +kerning first=226 second=253 amount=-1 +kerning first=230 second=318 amount=-1 +kerning first=39 second=1111 amount=1 +kerning first=194 second=334 amount=-1 +kerning first=317 second=86 amount=-1 +kerning first=8250 second=118 amount=-1 +kerning first=85 second=46 amount=-1 +kerning first=121 second=46 amount=-1 +kerning first=249 second=8217 amount=-1 +kerning first=119 second=230 amount=-1 +kerning first=260 second=8220 amount=-1 +kerning first=369 second=8221 amount=-1 +kerning first=381 second=375 amount=-1 +kerning first=316 second=45 amount=-1 +kerning first=374 second=333 amount=-1 +kerning first=232 second=311 amount=-1 +kerning first=193 second=370 amount=-1 +kerning first=221 second=213 amount=-1 +kerning first=241 second=8249 amount=-1 +kerning first=84 second=8250 amount=-1 +kerning first=232 second=289 amount=-1 +kerning first=268 second=289 amount=-1 +kerning first=364 second=260 amount=-1 +kerning first=310 second=210 amount=-1 +kerning first=112 second=318 amount=-1 +kerning first=209 second=259 amount=-1 +kerning first=196 second=289 amount=-1 +kerning first=376 second=289 amount=-1 +kerning first=66 second=270 amount=-1 +kerning first=287 second=122 amount=-1 +kerning first=253 second=318 amount=-1 +kerning first=220 second=260 amount=-1 +kerning first=304 second=289 amount=-1 +kerning first=8250 second=85 amount=-1 +kerning first=195 second=87 amount=-2 +kerning first=346 second=194 amount=-1 +kerning first=113 second=8221 amount=-1 +kerning first=346 second=207 amount=-1 +kerning first=354 second=288 amount=-1 +kerning first=256 second=218 amount=-1 +kerning first=107 second=277 amount=-1 +kerning first=77 second=369 amount=-1 +kerning first=350 second=219 amount=-1 +kerning first=264 second=65 amount=-1 +kerning first=371 second=248 amount=-1 +kerning first=356 second=277 amount=-1 +kerning first=119 second=231 amount=-1 +kerning first=66 second=291 amount=-1 +kerning first=199 second=210 amount=-1 +kerning first=217 second=346 amount=-1 +kerning first=253 second=242 amount=-1 +kerning first=194 second=365 amount=-1 +kerning first=350 second=89 amount=-1 +kerning first=302 second=365 amount=-1 +kerning first=350 second=80 amount=-1 +kerning first=121 second=351 amount=-1 +kerning first=258 second=284 amount=-1 +kerning first=284 second=256 amount=-1 +kerning first=256 second=217 amount=-1 +kerning first=251 second=121 amount=-1 +kerning first=356 second=256 amount=-2 +kerning first=375 second=101 amount=-1 +kerning first=119 second=259 amount=-1 +kerning first=264 second=298 amount=-1 +kerning first=73 second=224 amount=-1 +kerning first=254 second=375 amount=-1 +kerning first=193 second=369 amount=-1 +kerning first=199 second=206 amount=-1 +kerning first=193 second=112 amount=-1 +kerning first=88 second=369 amount=-1 +kerning first=8216 second=248 amount=-1 +kerning first=346 second=75 amount=-1 +kerning first=65 second=89 amount=-2 +kerning first=8218 second=219 amount=-1 +kerning first=256 second=86 amount=-2 +kerning first=284 second=354 amount=-1 +kerning first=45 second=382 amount=-1 +kerning first=82 second=333 amount=-1 +kerning first=376 second=214 amount=-1 +kerning first=118 second=333 amount=-1 +kerning first=352 second=362 amount=-1 +kerning first=256 second=354 amount=-2 +kerning first=366 second=382 amount=-1 +kerning first=8220 second=111 amount=-1 +kerning first=264 second=280 amount=-1 +kerning first=1059 second=1040 amount=-2 +kerning first=255 second=287 amount=-1 +kerning first=82 second=235 amount=-1 +kerning first=315 second=8221 amount=-1 +kerning first=86 second=347 amount=-1 +kerning first=84 second=333 amount=-1 +kerning first=118 second=235 amount=-1 +kerning first=1075 second=1083 amount=-1 +kerning first=231 second=316 amount=-1 +kerning first=119 second=100 amount=-1 +kerning first=375 second=316 amount=-1 +kerning first=268 second=214 amount=-1 +kerning first=350 second=220 amount=-1 +kerning first=339 second=316 amount=-1 +kerning first=196 second=214 amount=-1 +kerning first=267 second=316 amount=-1 +kerning first=71 second=103 amount=-1 +kerning first=8216 second=65 amount=-2 +kerning first=102 second=8221 amount=1 +kerning first=1036 second=1086 amount=-1 +kerning first=264 second=200 amount=-1 +kerning first=196 second=212 amount=-1 +kerning first=363 second=287 amount=-1 +kerning first=199 second=330 amount=-1 +kerning first=66 second=8221 amount=-1 +kerning first=87 second=8250 amount=-1 +kerning first=258 second=262 amount=-1 +kerning first=371 second=118 amount=-1 +kerning first=350 second=366 amount=-1 +kerning first=227 second=118 amount=-1 +kerning first=381 second=255 amount=-1 +kerning first=354 second=211 amount=-1 +kerning first=253 second=8249 amount=-1 +kerning first=217 second=8249 amount=-1 +kerning first=313 second=366 amount=-1 +kerning first=325 second=8249 amount=-1 +kerning first=65 second=67 amount=-1 +kerning first=289 second=8249 amount=-1 +kerning first=66 second=313 amount=-1 +kerning first=84 second=230 amount=-1 +kerning first=376 second=290 amount=-1 +kerning first=240 second=44 amount=-1 +kerning first=338 second=287 amount=-1 +kerning first=374 second=267 amount=-1 +kerning first=107 second=234 amount=-1 +kerning first=66 second=193 amount=-1 +kerning first=199 second=79 amount=-1 +kerning first=86 second=118 amount=-1 +kerning first=354 second=331 amount=-1 +kerning first=260 second=350 amount=-1 +kerning first=255 second=244 amount=-1 +kerning first=83 second=209 amount=-1 +kerning first=368 second=350 amount=-1 +kerning first=118 second=257 amount=-1 +kerning first=356 second=234 amount=-1 +kerning first=89 second=267 amount=-1 +kerning first=376 second=192 amount=-2 +kerning first=8250 second=75 amount=-1 +kerning first=45 second=282 amount=-1 +kerning first=268 second=192 amount=-1 +kerning first=374 second=245 amount=-1 +kerning first=82 second=355 amount=-1 +kerning first=310 second=250 amount=-1 +kerning first=8249 second=374 amount=-1 +kerning first=83 second=78 amount=-1 +kerning first=350 second=198 amount=-1 +kerning first=221 second=332 amount=-1 +kerning first=89 second=245 amount=-1 +kerning first=76 second=221 amount=-1 +kerning first=197 second=361 amount=-1 +kerning first=84 second=378 amount=-1 +kerning first=212 second=256 amount=-1 +kerning first=1107 second=1113 amount=-1 +kerning first=381 second=102 amount=-1 +kerning first=76 second=90 amount=-1 +kerning first=377 second=361 amount=-1 +kerning first=86 second=227 amount=-1 +kerning first=255 second=113 amount=-1 +kerning first=71 second=256 amount=-1 +kerning first=351 second=291 amount=-1 +kerning first=315 second=291 amount=-1 +kerning first=1024 second=1090 amount=-1 +kerning first=97 second=119 amount=-1 +kerning first=279 second=291 amount=-1 +kerning first=310 second=119 amount=-1 +kerning first=346 second=119 amount=-1 +kerning first=207 second=291 amount=-1 +kerning first=254 second=314 amount=-1 +kerning first=8250 second=270 amount=-1 +kerning first=85 second=198 amount=-1 +kerning first=354 second=233 amount=-1 +kerning first=84 second=113 amount=-1 +kerning first=334 second=198 amount=-1 +kerning first=344 second=79 amount=-1 +kerning first=370 second=198 amount=-1 +kerning first=264 second=67 amount=-1 +kerning first=262 second=198 amount=-1 +kerning first=251 second=291 amount=-1 +kerning first=77 second=250 amount=-1 +kerning first=8217 second=233 amount=-1 +kerning first=87 second=67 amount=-1 +kerning first=74 second=291 amount=-1 +kerning first=192 second=67 amount=-1 +kerning first=82 second=87 amount=-1 +kerning first=221 second=268 amount=-1 +kerning first=66 second=210 amount=-1 +kerning first=270 second=44 amount=-1 +kerning first=187 second=377 amount=-1 +kerning first=356 second=171 amount=-1 +kerning first=66 second=212 amount=-1 +kerning first=290 second=84 amount=-1 +kerning first=356 second=337 amount=-1 +kerning first=264 second=72 amount=-1 +kerning first=317 second=378 amount=-1 +kerning first=67 second=203 amount=-1 +kerning first=231 second=261 amount=-1 +kerning first=266 second=210 amount=-1 +kerning first=354 second=228 amount=-1 +kerning first=327 second=361 amount=-1 +kerning first=375 second=261 amount=-1 +kerning first=78 second=361 amount=-1 +kerning first=267 second=261 amount=-1 +kerning first=344 second=89 amount=-1 +kerning first=196 second=83 amount=-1 +kerning first=268 second=197 amount=-1 +kerning first=268 second=83 amount=-1 +kerning first=234 second=108 amount=-1 +kerning first=304 second=367 amount=-1 +kerning first=376 second=83 amount=-1 +kerning first=1098 second=1118 amount=-1 +kerning first=344 second=245 amount=-1 +kerning first=67 second=262 amount=-1 +kerning first=275 second=107 amount=-1 +kerning first=260 second=286 amount=-1 +kerning first=109 second=8249 amount=-1 +kerning first=260 second=262 amount=-1 +kerning first=73 second=8249 amount=-1 +kerning first=286 second=8249 amount=-1 +kerning first=8216 second=111 amount=-1 +kerning first=192 second=356 amount=-2 +kerning first=66 second=289 amount=-1 +kerning first=356 second=194 amount=-2 +kerning first=207 second=289 amount=-1 +kerning first=351 second=289 amount=-1 +kerning first=279 second=289 amount=-1 +kerning first=288 second=196 amount=-1 +kerning first=315 second=289 amount=-1 +kerning first=68 second=260 amount=-1 +kerning first=71 second=194 amount=-1 +kerning first=212 second=194 amount=-1 +kerning first=193 second=45 amount=-1 +kerning first=374 second=97 amount=-1 +kerning first=66 second=353 amount=-1 +kerning first=317 second=255 amount=-1 +kerning first=266 second=112 amount=-1 +kerning first=353 second=255 amount=-1 +kerning first=245 second=255 amount=-1 +kerning first=194 second=112 amount=-1 +kerning first=281 second=255 amount=-1 +kerning first=8250 second=119 amount=-1 +kerning first=89 second=97 amount=-1 +kerning first=87 second=243 amount=-1 +kerning first=302 second=97 amount=-1 +kerning first=351 second=353 amount=-1 +kerning first=8218 second=217 amount=-1 +kerning first=310 second=290 amount=-1 +kerning first=242 second=46 amount=-1 +kerning first=86 second=79 amount=-1 +kerning first=101 second=46 amount=-1 +kerning first=350 second=46 amount=-1 +kerning first=266 second=209 amount=-1 +kerning first=83 second=76 amount=-1 +kerning first=84 second=338 amount=-1 +kerning first=217 second=257 amount=-1 +kerning first=89 second=288 amount=-1 +kerning first=45 second=207 amount=-1 +kerning first=194 second=288 amount=-1 +kerning first=325 second=257 amount=-1 +kerning first=253 second=257 amount=-1 +kerning first=289 second=257 amount=-1 +kerning first=120 second=225 amount=-1 +kerning first=253 second=111 amount=-1 +kerning first=84 second=225 amount=-1 +kerning first=8216 second=279 amount=-1 +kerning first=107 second=273 amount=-1 +kerning first=118 second=101 amount=-1 +kerning first=1050 second=1105 amount=-1 +kerning first=199 second=193 amount=-1 +kerning first=66 second=274 amount=-1 +kerning first=226 second=375 amount=-1 +kerning first=231 second=46 amount=-1 +kerning first=8216 second=197 amount=-2 +kerning first=352 second=282 amount=-1 +kerning first=72 second=369 amount=-1 +kerning first=354 second=213 amount=-1 +kerning first=67 second=282 amount=-1 +kerning first=192 second=87 amount=-2 +kerning first=101 second=316 amount=-1 +kerning first=207 second=230 amount=-1 +kerning first=73 second=259 amount=-1 +kerning first=242 second=316 amount=-1 +kerning first=330 second=369 amount=-1 +kerning first=281 second=253 amount=-1 +kerning first=376 second=122 amount=-1 +kerning first=352 second=287 amount=-1 +kerning first=1061 second=1059 amount=-1 +kerning first=268 second=122 amount=-1 +kerning first=219 second=346 amount=-1 +kerning first=316 second=287 amount=-1 +kerning first=199 second=81 amount=-1 +kerning first=65 second=220 amount=-1 +kerning first=356 second=352 amount=-1 +kerning first=76 second=356 amount=-1 +kerning first=224 second=8217 amount=-1 +kerning first=45 second=75 amount=-1 +kerning first=84 second=74 amount=-1 +kerning first=231 second=105 amount=-1 +kerning first=102 second=254 amount=1 +kerning first=354 second=351 amount=-1 +kerning first=221 second=223 amount=-1 +kerning first=8217 second=244 amount=-1 +kerning first=205 second=117 amount=-1 +kerning first=68 second=196 amount=-1 +kerning first=65 second=332 amount=-1 +kerning first=266 second=75 amount=-1 +kerning first=90 second=289 amount=-1 +kerning first=67 second=352 amount=-1 +kerning first=253 second=277 amount=-1 +kerning first=381 second=253 amount=-1 +kerning first=102 second=104 amount=1 +kerning first=267 second=225 amount=-1 +kerning first=192 second=199 amount=-1 +kerning first=256 second=85 amount=-1 +kerning first=221 second=347 amount=-1 +kerning first=379 second=252 amount=-1 +kerning first=250 second=318 amount=-1 +kerning first=264 second=199 amount=-1 +kerning first=45 second=119 amount=-1 +kerning first=8217 second=97 amount=-1 +kerning first=197 second=71 amount=-1 +kerning first=258 second=84 amount=-2 +kerning first=310 second=251 amount=-1 +kerning first=84 second=382 amount=-1 +kerning first=83 second=120 amount=-1 +kerning first=187 second=68 amount=-1 +kerning first=371 second=8221 amount=-1 +kerning first=112 second=316 amount=-1 +kerning first=354 second=332 amount=-1 +kerning first=367 second=103 amount=-1 +kerning first=317 second=220 amount=-1 +kerning first=354 second=90 amount=-1 +kerning first=260 second=365 amount=-1 +kerning first=75 second=249 amount=-1 +kerning first=122 second=171 amount=-1 +kerning first=352 second=203 amount=-1 +kerning first=187 second=103 amount=-1 +kerning first=67 second=291 amount=-1 +kerning first=296 second=365 amount=-1 +kerning first=82 second=103 amount=-1 +kerning first=118 second=103 amount=-1 +kerning first=227 second=119 amount=-1 +kerning first=83 second=330 amount=-1 +kerning first=197 second=262 amount=-1 +kerning first=279 second=314 amount=-1 +kerning first=243 second=314 amount=-1 +kerning first=371 second=119 amount=-1 +kerning first=279 second=118 amount=-1 +kerning first=187 second=313 amount=-1 +kerning first=263 second=119 amount=-1 +kerning first=315 second=118 amount=-1 +kerning first=76 second=380 amount=-1 +kerning first=102 second=314 amount=1 +kerning first=66 second=118 amount=-1 +kerning first=66 second=314 amount=-1 +kerning first=289 second=380 amount=-1 +kerning first=253 second=380 amount=-1 +kerning first=187 second=362 amount=-1 +kerning first=195 second=217 amount=-1 +kerning first=88 second=216 amount=-1 +kerning first=194 second=366 amount=-1 +kerning first=8222 second=380 amount=-1 +kerning first=351 second=118 amount=-1 +kerning first=193 second=216 amount=-1 +kerning first=354 second=248 amount=-1 +kerning first=315 second=8220 amount=-1 +kerning first=75 second=363 amount=-1 +kerning first=8220 second=287 amount=-1 +kerning first=310 second=365 amount=-1 +kerning first=258 second=364 amount=-1 +kerning first=119 second=101 amount=-1 +kerning first=66 second=8220 amount=-1 +kerning first=350 second=202 amount=-1 +kerning first=87 second=199 amount=-1 +kerning first=196 second=118 amount=-1 +kerning first=249 second=8221 amount=-1 +kerning first=350 second=85 amount=-1 +kerning first=310 second=79 amount=-1 +kerning first=210 second=193 amount=-1 +kerning first=302 second=361 amount=-1 +kerning first=376 second=118 amount=-1 +kerning first=65 second=336 amount=-1 +kerning first=68 second=44 amount=-1 +kerning first=344 second=338 amount=-1 +kerning first=232 second=118 amount=-1 +kerning first=356 second=377 amount=-1 +kerning first=65 second=85 amount=-1 +kerning first=221 second=83 amount=-1 +kerning first=45 second=78 amount=-1 +kerning first=1059 second=1060 amount=-1 +kerning first=311 second=8249 amount=-1 +kerning first=67 second=77 amount=-1 +kerning first=207 second=250 amount=-1 +kerning first=87 second=257 amount=-1 +kerning first=354 second=193 amount=-2 +kerning first=353 second=103 amount=-1 +kerning first=281 second=103 amount=-1 +kerning first=317 second=103 amount=-1 +kerning first=8218 second=374 amount=-2 +kerning first=8218 second=380 amount=-1 +kerning first=98 second=318 amount=-1 +kerning first=376 second=210 amount=-1 +kerning first=118 second=337 amount=-1 +kerning first=65 second=250 amount=-1 +kerning first=275 second=318 amount=-1 +kerning first=82 second=337 amount=-1 +kerning first=66 second=250 amount=-1 +kerning first=196 second=210 amount=-1 +kerning first=218 second=65 amount=-1 +kerning first=74 second=256 amount=-1 +kerning first=1044 second=1095 amount=-1 +kerning first=268 second=210 amount=-1 +kerning first=290 second=65 amount=-1 +kerning first=199 second=286 amount=-1 +kerning first=362 second=65 amount=-1 +kerning first=264 second=204 amount=-1 +kerning first=364 second=378 amount=-1 +kerning first=366 second=227 amount=-1 +kerning first=281 second=44 amount=-1 +kerning first=220 second=378 amount=-1 +kerning first=330 second=227 amount=-1 +kerning first=354 second=171 amount=-1 +kerning first=266 second=73 amount=-1 +kerning first=354 second=268 amount=-1 +kerning first=45 second=280 amount=-1 +kerning first=352 second=366 amount=-1 +kerning first=119 second=269 amount=-1 +kerning first=317 second=356 amount=-1 +kerning first=192 second=219 amount=-1 +kerning first=72 second=226 amount=-1 +kerning first=262 second=212 amount=-1 +kerning first=262 second=66 amount=-1 +kerning first=375 second=242 amount=-1 +kerning first=367 second=108 amount=-1 +kerning first=86 second=328 amount=-1 +kerning first=118 second=108 amount=-1 +kerning first=8216 second=291 amount=-1 +kerning first=82 second=108 amount=-1 +kerning first=280 second=103 amount=-1 +kerning first=223 second=108 amount=-1 +kerning first=262 second=317 amount=-1 +kerning first=303 second=242 amount=-1 +kerning first=83 second=310 amount=-1 +kerning first=291 second=45 amount=-1 +kerning first=8220 second=248 amount=-1 +kerning first=354 second=122 amount=-1 +kerning first=87 second=224 amount=-1 +kerning first=1061 second=1105 amount=-1 +kerning first=8250 second=375 amount=-1 +kerning first=206 second=261 amount=-1 +kerning first=267 second=237 amount=-1 +kerning first=103 second=115 amount=-1 +kerning first=375 second=275 amount=-1 +kerning first=8218 second=368 amount=-1 +kerning first=376 second=353 amount=-1 +kerning first=66 second=202 amount=-1 +kerning first=194 second=119 amount=-1 +kerning first=1058 second=1103 amount=-1 +kerning first=187 second=194 amount=-1 +kerning first=352 second=77 amount=-1 +kerning first=218 second=45 amount=-1 +kerning first=307 second=287 amount=-1 +kerning first=83 second=325 amount=-1 +kerning first=89 second=121 amount=-1 +kerning first=119 second=281 amount=-1 +kerning first=1050 second=1086 amount=-1 +kerning first=290 second=45 amount=-1 +kerning first=326 second=45 amount=-1 +kerning first=362 second=45 amount=-1 +kerning first=317 second=354 amount=-1 +kerning first=350 second=374 amount=-1 +kerning first=311 second=243 amount=-1 +kerning first=205 second=97 amount=-1 +kerning first=233 second=287 amount=-1 +kerning first=8216 second=100 amount=-1 +kerning first=269 second=287 amount=-1 +kerning first=197 second=287 amount=-1 +kerning first=196 second=353 amount=-1 +kerning first=88 second=45 amount=-1 +kerning first=108 second=8217 amount=-1 +kerning first=84 second=283 amount=-1 +kerning first=1061 second=1108 amount=-1 +kerning first=291 second=228 amount=-1 +kerning first=377 second=287 amount=-1 +kerning first=84 second=109 amount=-1 +kerning first=321 second=8217 amount=-1 +kerning first=199 second=76 amount=-1 +kerning first=313 second=368 amount=-1 +kerning first=199 second=327 amount=-1 +kerning first=311 second=111 amount=-1 +kerning first=374 second=264 amount=-1 +kerning first=266 second=264 amount=-1 +kerning first=194 second=264 amount=-1 +kerning first=89 second=264 amount=-1 +kerning first=221 second=248 amount=-1 +kerning first=272 second=44 amount=-1 +kerning first=89 second=269 amount=-1 +kerning first=356 second=253 amount=-1 +kerning first=197 second=364 amount=-1 +kerning first=314 second=118 amount=-1 +kerning first=374 second=269 amount=-1 +kerning first=256 second=334 amount=-1 +kerning first=67 second=207 amount=-1 +kerning first=266 second=346 amount=-1 +kerning first=75 second=288 amount=-1 +kerning first=255 second=245 amount=-1 +kerning first=8216 second=232 amount=-1 +kerning first=218 second=289 amount=-1 +kerning first=77 second=289 amount=-1 +kerning first=89 second=346 amount=-1 +kerning first=79 second=46 amount=-1 +kerning first=362 second=289 amount=-1 +kerning first=86 second=99 amount=-1 +kerning first=290 second=289 amount=-1 +kerning first=220 second=46 amount=-1 +kerning first=296 second=369 amount=-1 +kerning first=352 second=207 amount=-1 +kerning first=260 second=369 amount=-1 +kerning first=364 second=46 amount=-1 +kerning first=366 second=192 amount=-1 +kerning first=102 second=98 amount=1 +kerning first=66 second=98 amount=-1 +kerning first=350 second=70 amount=-1 +kerning first=371 second=99 amount=-1 +kerning first=362 second=230 amount=-1 +kerning first=8220 second=267 amount=-1 +kerning first=76 second=87 amount=-1 +kerning first=199 second=332 amount=-1 +kerning first=82 second=352 amount=-1 +kerning first=77 second=230 amount=-1 +kerning first=260 second=81 amount=-1 +kerning first=218 second=230 amount=-1 +kerning first=75 second=119 amount=-1 +kerning first=374 second=346 amount=-1 +kerning first=221 second=122 amount=-1 +kerning first=119 second=233 amount=-1 +kerning first=65 second=217 amount=-1 +kerning first=86 second=284 amount=-1 +kerning first=221 second=351 amount=-1 +kerning first=83 second=102 amount=-1 +kerning first=334 second=256 amount=-1 +kerning first=370 second=256 amount=-1 +kerning first=66 second=171 amount=-1 +kerning first=324 second=119 amount=-1 +kerning first=350 second=217 amount=-1 +kerning first=302 second=117 amount=-1 +kerning first=262 second=256 amount=-1 +kerning first=194 second=117 amount=-1 +kerning first=45 second=379 amount=-1 +kerning first=85 second=256 amount=-1 +kerning first=232 second=314 amount=-1 +kerning first=1046 second=1095 amount=-1 +kerning first=87 second=263 amount=-1 +kerning first=381 second=121 amount=-1 +kerning first=84 second=245 amount=-1 +kerning first=326 second=8220 amount=-1 +kerning first=205 second=363 amount=-1 +kerning first=262 second=82 amount=-1 +kerning first=113 second=8220 amount=-1 +kerning first=266 second=302 amount=-1 +kerning first=258 second=221 amount=-2 +kerning first=296 second=228 amount=-1 +kerning first=368 second=228 amount=-1 +kerning first=376 second=347 amount=-1 +kerning first=119 second=228 amount=-1 +kerning first=375 second=281 amount=-1 +kerning first=291 second=259 amount=-1 +kerning first=196 second=347 amount=-1 +kerning first=97 second=8221 amount=-1 +kerning first=195 second=85 amount=-1 +kerning first=187 second=200 amount=-1 +kerning first=67 second=288 amount=-1 +kerning first=260 second=266 amount=-1 +kerning first=8216 second=335 amount=-1 +kerning first=289 second=316 amount=-1 +kerning first=229 second=8220 amount=-1 +kerning first=218 second=197 amount=-1 +kerning first=371 second=246 amount=-1 +kerning first=354 second=83 amount=-1 +kerning first=356 second=90 amount=-1 +kerning first=346 second=171 amount=-1 +kerning first=362 second=197 amount=-1 +kerning first=310 second=171 amount=-1 +kerning first=352 second=325 amount=-1 +kerning first=86 second=246 amount=-1 +kerning first=290 second=197 amount=-1 +kerning first=382 second=171 amount=-1 +kerning first=258 second=87 amount=-2 +kerning first=1027 second=1051 amount=-1 +kerning first=234 second=103 amount=-1 +kerning first=8250 second=350 amount=-1 +kerning first=1043 second=1077 amount=-1 +kerning first=262 second=278 amount=-1 +kerning first=303 second=281 amount=-1 +kerning first=198 second=103 amount=-1 +kerning first=364 second=103 amount=-1 +kerning first=346 second=274 amount=-1 +kerning first=220 second=103 amount=-1 +kerning first=256 second=103 amount=-1 +kerning first=84 second=263 amount=-1 +kerning first=66 second=65 amount=-1 +kerning first=119 second=333 amount=-1 +kerning first=187 second=370 amount=-1 +kerning first=284 second=196 amount=-1 +kerning first=246 second=120 amount=-1 +kerning first=260 second=334 amount=-1 +kerning first=262 second=214 amount=-1 +kerning first=266 second=284 amount=-1 +kerning first=232 second=255 amount=-1 +kerning first=84 second=199 amount=-1 +kerning first=83 second=207 amount=-1 +kerning first=286 second=89 amount=-1 +kerning first=374 second=284 amount=-1 +kerning first=87 second=382 amount=-1 +kerning first=45 second=203 amount=-1 +kerning first=367 second=121 amount=-1 +kerning first=205 second=361 amount=-1 +kerning first=121 second=45 amount=-1 +kerning first=344 second=362 amount=-1 +kerning first=259 second=121 amount=-1 +kerning first=8218 second=356 amount=-2 +kerning first=223 second=121 amount=-1 +kerning first=310 second=264 amount=-1 +kerning first=187 second=121 amount=-1 +kerning first=89 second=284 amount=-1 +kerning first=303 second=339 amount=-1 +kerning first=224 second=8221 amount=-1 +kerning first=66 second=102 amount=-1 +kerning first=260 second=8221 amount=-1 +kerning first=98 second=316 amount=-1 +kerning first=350 second=72 amount=-1 +kerning first=257 second=118 amount=-1 +kerning first=303 second=235 amount=-1 +kerning first=375 second=235 amount=-1 +kerning first=365 second=118 amount=-1 +kerning first=119 second=248 amount=-1 +kerning first=90 second=378 amount=-1 +kerning first=253 second=283 amount=-1 +kerning first=82 second=218 amount=-1 +kerning first=76 second=85 amount=-1 +kerning first=87 second=281 amount=-1 +kerning first=221 second=118 amount=-1 +kerning first=45 second=69 amount=-1 +kerning first=284 second=86 amount=-1 +kerning first=266 second=352 amount=-1 +kerning first=196 second=250 amount=-1 +kerning first=8216 second=289 amount=-1 +kerning first=262 second=315 amount=-1 +kerning first=240 second=120 amount=-1 +kerning first=264 second=323 amount=-1 +kerning first=45 second=346 amount=-1 +kerning first=71 second=86 amount=-1 +kerning first=192 second=217 amount=-1 +kerning first=67 second=75 amount=-1 +kerning first=304 second=250 amount=-1 +kerning first=86 second=83 amount=-1 +kerning first=217 second=224 amount=-1 +kerning first=356 second=198 amount=-2 +kerning first=289 second=224 amount=-1 +kerning first=327 second=227 amount=-1 +kerning first=85 second=192 amount=-1 +kerning first=284 second=198 amount=-1 +kerning first=291 second=227 amount=-1 +kerning first=255 second=227 amount=-1 +kerning first=66 second=284 amount=-1 +kerning first=192 second=89 amount=-2 +kerning first=236 second=8249 amount=-1 +kerning first=78 second=227 amount=-1 +kerning first=72 second=363 amount=-1 +kerning first=86 second=244 amount=-1 +kerning first=381 second=291 amount=-1 +kerning first=199 second=325 amount=-1 +kerning first=325 second=97 amount=-1 +kerning first=371 second=244 amount=-1 +kerning first=317 second=90 amount=-1 +kerning first=87 second=121 amount=-1 +kerning first=201 second=291 amount=-1 +kerning first=86 second=187 amount=-1 +kerning first=193 second=210 amount=-1 +kerning first=375 second=378 amount=-1 +kerning first=117 second=287 amount=-1 +kerning first=248 second=44 amount=-1 +kerning first=290 second=256 amount=-1 +kerning first=212 second=44 amount=-1 +kerning first=199 second=268 amount=-1 +kerning first=88 second=210 amount=-1 +kerning first=362 second=256 amount=-1 +kerning first=121 second=337 amount=-1 +kerning first=284 second=44 amount=-1 +kerning first=71 second=44 amount=-1 +kerning first=197 second=366 amount=-1 +kerning first=212 second=198 amount=-1 +kerning first=71 second=198 amount=-1 +kerning first=218 second=256 amount=-1 +kerning first=310 second=286 amount=-1 +kerning first=89 second=326 amount=-1 +kerning first=366 second=287 amount=-1 +kerning first=330 second=287 amount=-1 +kerning first=266 second=205 amount=-1 +kerning first=258 second=287 amount=-1 +kerning first=272 second=197 amount=-1 +kerning first=194 second=368 amount=-1 +kerning first=374 second=326 amount=-1 +kerning first=304 second=228 amount=-1 +kerning first=194 second=262 amount=-1 +kerning first=86 second=350 amount=-1 +kerning first=374 second=262 amount=-1 +kerning first=248 second=108 amount=-1 +kerning first=266 second=262 amount=-1 +kerning first=344 second=8249 amount=-1 +kerning first=217 second=261 amount=-1 +kerning first=380 second=8249 amount=-1 +kerning first=255 second=269 amount=-1 +kerning first=325 second=261 amount=-1 +kerning first=289 second=261 amount=-1 +kerning first=8220 second=97 amount=-1 +kerning first=253 second=261 amount=-1 +kerning first=327 second=229 amount=-1 +kerning first=187 second=310 amount=-1 +kerning first=291 second=229 amount=-1 +kerning first=87 second=338 amount=-1 +kerning first=1038 second=1113 amount=-1 +kerning first=220 second=257 amount=-1 +kerning first=1036 second=1059 amount=-1 +kerning first=78 second=229 amount=-1 +kerning first=194 second=346 amount=-1 +kerning first=75 second=251 amount=-1 +kerning first=66 second=45 amount=-1 +kerning first=255 second=229 amount=-1 +kerning first=219 second=229 amount=-1 +kerning first=86 second=286 amount=-1 +kerning first=84 second=243 amount=-1 +kerning first=103 second=97 amount=-1 +kerning first=118 second=240 amount=-1 +kerning first=260 second=332 amount=-1 +kerning first=1070 second=1038 amount=-1 +kerning first=199 second=290 amount=-1 +kerning first=121 second=271 amount=-1 +kerning first=8216 second=333 amount=-1 +kerning first=102 second=45 amount=-1 +kerning first=195 second=356 amount=-2 +kerning first=87 second=261 amount=-1 +kerning first=75 second=211 amount=-1 +kerning first=313 second=381 amount=-1 +kerning first=266 second=304 amount=-1 +kerning first=82 second=275 amount=-1 +kerning first=339 second=255 amount=-1 +kerning first=231 second=255 amount=-1 +kerning first=119 second=226 amount=-1 +kerning first=8218 second=378 amount=-1 +kerning first=267 second=255 amount=-1 +kerning first=195 second=255 amount=-1 +kerning first=374 second=227 amount=-1 +kerning first=241 second=119 amount=-1 +kerning first=296 second=226 amount=-1 +kerning first=277 second=119 amount=-1 +kerning first=90 second=255 amount=-1 +kerning first=302 second=227 amount=-1 +kerning first=345 second=44 amount=-1 +kerning first=368 second=226 amount=-1 +kerning first=67 second=71 amount=-1 +kerning first=374 second=259 amount=-1 +kerning first=313 second=119 amount=-1 +kerning first=89 second=227 amount=-1 +kerning first=330 second=225 amount=-1 +kerning first=366 second=225 amount=-1 +kerning first=310 second=363 amount=-1 +kerning first=1113 second=1091 amount=-1 +kerning first=365 second=314 amount=-1 +kerning first=103 second=230 amount=-1 +kerning first=84 second=241 amount=-1 +kerning first=364 second=257 amount=-1 +kerning first=334 second=192 amount=-1 +kerning first=370 second=192 amount=-1 +kerning first=193 second=289 amount=-1 +kerning first=213 second=193 amount=-1 +kerning first=192 second=338 amount=-1 +kerning first=193 second=8220 amount=-1 +kerning first=264 second=338 amount=-1 +kerning first=362 second=122 amount=-1 +kerning first=233 second=46 amount=-1 +kerning first=245 second=44 amount=-1 +kerning first=218 second=122 amount=-1 +kerning first=84 second=375 amount=-1 +kerning first=86 second=288 amount=-1 +kerning first=65 second=354 amount=-2 +kerning first=68 second=46 amount=-1 +kerning first=260 second=213 amount=-1 +kerning first=195 second=361 amount=-1 +kerning first=221 second=230 amount=-1 +kerning first=344 second=364 amount=-1 +kerning first=379 second=369 amount=-1 +kerning first=245 second=46 amount=-1 +kerning first=281 second=46 amount=-1 +kerning first=266 second=282 amount=-1 +kerning first=66 second=197 amount=-1 +kerning first=199 second=83 amount=-1 +kerning first=197 second=346 amount=-1 +kerning first=45 second=201 amount=-1 +kerning first=240 second=375 amount=-1 +kerning first=286 second=87 amount=-1 +kerning first=99 second=375 amount=-1 +kerning first=87 second=259 amount=-1 +kerning first=76 second=217 amount=-1 +kerning first=375 second=277 amount=-1 +kerning first=209 second=103 amount=-1 +kerning first=89 second=328 amount=-1 +kerning first=354 second=243 amount=-1 +kerning first=303 second=277 amount=-1 +kerning first=376 second=351 amount=-1 +kerning first=352 second=75 amount=-1 +kerning first=74 second=194 amount=-1 +kerning first=196 second=351 amount=-1 +kerning first=97 second=8217 amount=-1 +kerning first=346 second=330 amount=-1 +kerning first=199 second=103 amount=-1 +kerning first=69 second=287 amount=-1 +kerning first=195 second=286 amount=-1 +kerning first=82 second=253 amount=-1 +kerning first=1100 second=1118 amount=-1 +kerning first=66 second=80 amount=-1 +kerning first=187 second=253 amount=-1 +kerning first=72 second=171 amount=-1 +kerning first=259 second=253 amount=-1 +kerning first=371 second=231 amount=-1 +kerning first=223 second=253 amount=-1 +kerning first=327 second=117 amount=-1 +kerning first=284 second=103 amount=-1 +kerning first=212 second=260 amount=-1 +kerning first=376 second=65 amount=-2 +kerning first=356 second=121 amount=-1 +kerning first=71 second=260 amount=-1 +kerning first=195 second=334 amount=-1 +kerning first=374 second=328 amount=-1 +kerning first=86 second=231 amount=-1 +kerning first=216 second=197 amount=-1 +kerning first=284 second=260 amount=-1 +kerning first=344 second=318 amount=-1 +kerning first=83 second=270 amount=-1 +kerning first=356 second=260 amount=-2 +kerning first=234 second=121 amount=-1 +kerning first=356 second=196 amount=-2 +kerning first=71 second=196 amount=-1 +kerning first=250 second=316 amount=-1 +kerning first=212 second=196 amount=-1 +kerning first=351 second=351 amount=-1 +kerning first=281 second=118 amount=-1 +kerning first=221 second=228 amount=-1 +kerning first=218 second=44 amount=-1 +kerning first=89 second=99 amount=-1 +kerning first=119 second=171 amount=-1 +kerning first=83 second=171 amount=-1 +kerning first=264 second=382 amount=-1 +kerning first=374 second=99 amount=-1 +kerning first=310 second=213 amount=-1 +kerning first=344 second=221 amount=-1 +kerning first=67 second=302 amount=-1 +kerning first=82 second=220 amount=-1 +kerning first=187 second=82 amount=-1 +kerning first=66 second=351 amount=-1 +kerning first=1027 second=1093 amount=-1 +kerning first=199 second=270 amount=-1 +kerning first=258 second=71 amount=-1 +kerning first=374 second=8250 amount=-1 +kerning first=206 second=224 amount=-1 +kerning first=310 second=266 amount=-1 +kerning first=119 second=246 amount=-1 +kerning first=375 second=103 amount=-1 +kerning first=267 second=103 amount=-1 +kerning first=84 second=8249 amount=-1 +kerning first=195 second=103 amount=-1 +kerning first=325 second=224 amount=-1 +kerning first=231 second=103 amount=-1 +kerning first=90 second=103 amount=-1 +kerning first=1043 second=1092 amount=-1 +kerning first=245 second=253 amount=-1 +kerning first=187 second=220 amount=-1 +kerning first=353 second=253 amount=-1 +kerning first=195 second=354 amount=-2 +kerning first=317 second=253 amount=-1 +kerning first=45 second=344 amount=-1 +kerning first=260 second=171 amount=-1 +kerning first=197 second=117 amount=-1 +kerning first=368 second=171 amount=-1 +kerning first=234 second=255 amount=-1 +kerning first=253 second=281 amount=-1 +kerning first=87 second=283 amount=-1 +kerning first=354 second=118 amount=-1 +kerning first=72 second=365 amount=-1 +kerning first=45 second=253 amount=-1 +kerning first=266 second=45 amount=-1 +kerning first=262 second=313 amount=-1 +kerning first=86 second=264 amount=-1 +kerning first=283 second=287 amount=-1 +kerning first=75 second=79 amount=-1 +kerning first=70 second=287 amount=-1 +kerning first=262 second=216 amount=-1 +kerning first=106 second=287 amount=-1 +kerning first=105 second=118 amount=-1 +kerning first=206 second=257 amount=-1 +kerning first=192 second=85 amount=-1 +kerning first=87 second=74 amount=-1 +kerning first=118 second=273 amount=-1 +kerning first=120 second=8249 amount=-1 +kerning first=83 second=193 amount=-1 +kerning first=374 second=46 amount=-1 +kerning first=332 second=193 amount=-1 +kerning first=310 second=118 amount=-1 +kerning first=74 second=192 amount=-1 +kerning first=375 second=279 amount=-1 +kerning first=268 second=327 amount=-1 +kerning first=344 second=113 amount=-1 +kerning first=103 second=227 amount=-1 +kerning first=66 second=78 amount=-1 +kerning first=260 second=268 amount=-1 +kerning first=313 second=8217 amount=-1 +kerning first=1027 second=1113 amount=-1 +kerning first=121 second=333 amount=-1 +kerning first=370 second=291 amount=-1 +kerning first=298 second=291 amount=-1 +kerning first=262 second=291 amount=-1 +kerning first=121 second=291 amount=-1 +kerning first=85 second=291 amount=-1 +kerning first=75 second=361 amount=-1 +kerning first=8220 second=196 amount=-2 +kerning first=67 second=73 amount=-1 +kerning first=8249 second=86 amount=-1 +kerning first=344 second=199 amount=-1 +kerning first=84 second=67 amount=-1 +kerning first=187 second=198 amount=-1 +kerning first=260 second=289 amount=-1 +kerning first=374 second=210 amount=-1 +kerning first=258 second=366 amount=-1 +kerning first=379 second=367 amount=-1 +kerning first=89 second=277 amount=-1 +kerning first=223 second=44 amount=-1 +kerning first=352 second=73 amount=-1 +kerning first=45 second=366 amount=-1 +kerning first=192 second=253 amount=-1 +kerning first=85 second=194 amount=-1 +kerning first=122 second=112 amount=-1 +kerning first=262 second=194 amount=-1 +kerning first=350 second=105 amount=-1 +kerning first=230 second=119 amount=-1 +kerning first=356 second=240 amount=-1 +kerning first=121 second=335 amount=-1 +kerning first=374 second=119 amount=-1 +kerning first=8217 second=99 amount=-1 +kerning first=1045 second=1038 amount=-1 +kerning first=8250 second=282 amount=-1 +kerning first=317 second=374 amount=-1 +kerning first=281 second=107 amount=-1 +kerning first=193 second=353 amount=-1 +kerning first=187 second=66 amount=-1 +kerning first=295 second=45 amount=-1 +kerning first=246 second=314 amount=-1 +kerning first=296 second=367 amount=-1 +kerning first=204 second=289 amount=-1 +kerning first=88 second=212 amount=-1 +kerning first=260 second=367 amount=-1 +kerning first=99 second=289 amount=-1 +kerning first=193 second=212 amount=-1 +kerning first=1061 second=1086 amount=-1 +kerning first=86 second=101 amount=-1 +kerning first=67 second=205 amount=-1 +kerning first=8216 second=234 amount=-1 +kerning first=75 second=286 amount=-1 +kerning first=231 second=257 amount=-1 +kerning first=66 second=296 amount=-1 +kerning first=346 second=310 amount=-1 +kerning first=371 second=101 amount=-1 +kerning first=375 second=257 amount=-1 +kerning first=267 second=257 amount=-1 +kerning first=352 second=205 amount=-1 +kerning first=258 second=115 amount=-1 +kerning first=89 second=229 amount=-1 +kerning first=374 second=229 amount=-1 +kerning first=118 second=339 amount=-1 +kerning first=1036 second=1108 amount=-1 +kerning first=101 second=253 amount=-1 +kerning first=302 second=229 amount=-1 +kerning first=82 second=339 amount=-1 +kerning first=344 second=214 amount=-1 +kerning first=362 second=193 amount=-1 +kerning first=219 second=97 amount=-1 +kerning first=196 second=45 amount=-1 +kerning first=327 second=97 amount=-1 +kerning first=107 second=240 amount=-1 +kerning first=291 second=97 amount=-1 +kerning first=86 second=211 amount=-1 +kerning first=267 second=318 amount=-1 +kerning first=350 second=356 amount=-1 +kerning first=218 second=287 amount=-1 +kerning first=260 second=290 amount=-1 +kerning first=334 second=194 amount=-1 +kerning first=260 second=83 amount=-1 +kerning first=370 second=194 amount=-1 +kerning first=268 second=45 amount=-1 +kerning first=78 second=97 amount=-1 +kerning first=304 second=45 amount=-1 +kerning first=256 second=255 amount=-1 +kerning first=115 second=255 amount=-1 +kerning first=368 second=83 amount=-1 +kerning first=65 second=356 amount=-2 +kerning first=376 second=197 amount=-2 +kerning first=87 second=336 amount=-1 +kerning first=264 second=380 amount=-1 +kerning first=192 second=336 amount=-1 +kerning first=65 second=8249 amount=-1 +kerning first=264 second=336 amount=-1 +kerning first=67 second=280 amount=-1 +kerning first=65 second=334 amount=-1 +kerning first=352 second=120 amount=-1 +kerning first=333 second=253 amount=-1 +kerning first=310 second=81 amount=-1 +kerning first=270 second=46 amount=-1 +kerning first=80 second=65 amount=-1 +kerning first=221 second=65 amount=-2 +kerning first=171 second=84 amount=-1 +kerning first=234 second=46 amount=-1 +kerning first=344 second=243 amount=-1 +kerning first=75 second=264 amount=-1 +kerning first=1054 second=1059 amount=-1 +kerning first=87 second=380 amount=-1 +kerning first=84 second=111 amount=-1 +kerning first=82 second=121 amount=-1 +kerning first=310 second=288 amount=-1 +kerning first=333 second=318 amount=-1 +kerning first=369 second=318 amount=-1 +kerning first=187 second=317 amount=-1 +kerning first=66 second=122 amount=-1 +kerning first=8216 second=256 amount=-2 +kerning first=325 second=259 amount=-1 +kerning first=345 second=46 amount=-1 +kerning first=289 second=259 amount=-1 +kerning first=253 second=259 amount=-1 +kerning first=376 second=230 amount=-1 +kerning first=199 second=69 amount=-1 +kerning first=371 second=8217 amount=-1 +kerning first=248 second=253 amount=-1 +kerning first=337 second=375 amount=-1 +kerning first=187 second=381 amount=-1 +kerning first=88 second=375 amount=-1 +kerning first=217 second=259 amount=-1 +kerning first=193 second=375 amount=-1 +kerning first=229 second=375 amount=-1 +kerning first=67 second=346 amount=-1 +kerning first=266 second=207 amount=-1 +kerning first=350 second=323 amount=-1 +kerning first=374 second=381 amount=-1 +kerning first=234 second=311 amount=-1 +kerning first=323 second=259 amount=-1 +kerning first=287 second=259 amount=-1 +kerning first=115 second=253 amount=-1 +kerning first=325 second=363 amount=-1 +kerning first=256 second=253 amount=-1 +kerning first=74 second=259 amount=-1 +kerning first=267 second=224 amount=-1 +kerning first=344 second=346 amount=-1 +kerning first=354 second=334 amount=-1 +kerning first=321 second=122 amount=-1 +kerning first=375 second=224 amount=-1 +kerning first=279 second=375 amount=-1 +kerning first=315 second=375 amount=-1 +kerning first=351 second=375 amount=-1 +kerning first=72 second=230 amount=-1 +kerning first=231 second=224 amount=-1 +kerning first=8217 second=261 amount=-1 +kerning first=8220 second=279 amount=-1 +kerning first=218 second=225 amount=-1 +kerning first=192 second=8220 amount=-1 +kerning first=102 second=316 amount=1 +kerning first=66 second=316 amount=-1 +kerning first=268 second=207 amount=-1 +kerning first=66 second=76 amount=-1 +kerning first=87 second=196 amount=-2 +kerning first=335 second=121 amount=-1 +kerning first=263 second=121 amount=-1 +kerning first=346 second=82 amount=-1 +kerning first=227 second=121 amount=-1 +kerning first=376 second=335 amount=-1 +kerning first=283 second=104 amount=-1 +kerning first=86 second=121 amount=-1 +kerning first=121 second=171 amount=-1 +kerning first=85 second=171 amount=-1 +kerning first=118 second=271 amount=-1 +kerning first=374 second=231 amount=-1 +kerning first=362 second=287 amount=-1 +kerning first=262 second=171 amount=-1 +kerning first=376 second=212 amount=-1 +kerning first=370 second=171 amount=-1 +kerning first=336 second=196 amount=-1 +kerning first=290 second=287 amount=-1 +kerning first=75 second=252 amount=-1 +kerning first=109 second=8217 amount=-1 +kerning first=86 second=213 amount=-1 +kerning first=243 second=375 amount=-1 +kerning first=8249 second=89 amount=-1 +kerning first=66 second=237 amount=-1 +kerning first=250 second=8217 amount=-1 +kerning first=66 second=375 amount=-1 +kerning first=266 second=310 amount=-1 +kerning first=377 second=171 amount=-1 +kerning first=204 second=229 amount=-1 +kerning first=350 second=237 amount=-1 +kerning first=353 second=351 amount=-1 +kerning first=8218 second=382 amount=-1 +kerning first=354 second=333 amount=-1 +kerning first=272 second=256 amount=-1 +kerning first=187 second=330 amount=-1 +kerning first=187 second=120 amount=-1 +kerning first=377 second=249 amount=-1 +kerning first=223 second=120 amount=-1 +kerning first=374 second=379 amount=-1 +kerning first=195 second=214 amount=-1 +kerning first=368 second=103 amount=-1 +kerning first=260 second=103 amount=-1 +kerning first=219 second=230 amount=-1 +kerning first=296 second=103 amount=-1 +kerning first=207 second=365 amount=-1 +kerning first=83 second=103 amount=-1 +kerning first=197 second=249 amount=-1 +kerning first=233 second=318 amount=-1 +kerning first=316 second=118 amount=-1 +kerning first=352 second=118 amount=-1 +kerning first=66 second=365 amount=-1 +kerning first=321 second=362 amount=-1 +kerning first=89 second=231 amount=-1 +kerning first=101 second=44 amount=-1 +kerning first=310 second=332 amount=-1 +kerning first=204 second=117 amount=-1 +kerning first=83 second=313 amount=-1 +kerning first=279 second=316 amount=-1 +kerning first=243 second=316 amount=-1 +kerning first=354 second=216 amount=-1 +kerning first=121 second=378 amount=-1 +kerning first=85 second=378 amount=-1 +kerning first=66 second=86 amount=-1 +kerning first=256 second=264 amount=-1 +kerning first=260 second=264 amount=-1 +kerning first=381 second=250 amount=-1 +kerning first=316 second=8220 amount=-1 +kerning first=82 second=281 amount=-1 +kerning first=187 second=202 amount=-1 +kerning first=118 second=281 amount=-1 +kerning first=347 second=375 amount=-1 +kerning first=1061 second=1098 amount=-1 +kerning first=1025 second=1098 amount=-1 +kerning first=118 second=283 amount=-1 +kerning first=304 second=230 amount=-1 +kerning first=363 second=8221 amount=-1 +kerning first=344 second=218 amount=-1 +kerning first=262 second=378 amount=-1 +kerning first=8222 second=218 amount=-1 +kerning first=235 second=314 amount=-1 +kerning first=67 second=69 amount=-1 +kerning first=256 second=119 amount=-1 +kerning first=86 second=331 amount=-1 +kerning first=344 second=267 amount=-1 +kerning first=315 second=86 amount=-1 +kerning first=171 second=86 amount=-1 +kerning first=89 second=379 amount=-1 +kerning first=192 second=354 amount=-2 +kerning first=284 second=192 amount=-1 +kerning first=356 second=192 amount=-2 +kerning first=71 second=192 amount=-1 +kerning first=253 second=224 amount=-1 +kerning first=212 second=192 amount=-1 +kerning first=268 second=296 amount=-1 +kerning first=375 second=244 amount=-1 +kerning first=350 second=303 amount=-1 +kerning first=87 second=245 amount=-1 +kerning first=187 second=90 amount=-1 +kerning first=199 second=274 amount=-1 +kerning first=381 second=378 amount=-1 +kerning first=268 second=256 amount=-1 +kerning first=120 second=227 amount=-1 +kerning first=84 second=227 amount=-1 +kerning first=376 second=256 amount=-2 +kerning first=193 second=366 amount=-1 +kerning first=84 second=103 amount=-1 +kerning first=313 second=291 amount=-1 +kerning first=90 second=102 amount=-1 +kerning first=277 second=291 amount=-1 +kerning first=84 second=336 amount=-1 +kerning first=87 second=226 amount=-1 +kerning first=205 second=291 amount=-1 +kerning first=351 second=112 amount=-1 +kerning first=221 second=216 amount=-1 +kerning first=1038 second=1084 amount=-1 +kerning first=303 second=263 amount=-1 +kerning first=88 second=268 amount=-1 +kerning first=375 second=263 amount=-1 +kerning first=382 second=112 amount=-1 +kerning first=304 second=365 amount=-1 +kerning first=249 second=255 amount=-1 +kerning first=110 second=8249 amount=-1 +kerning first=196 second=365 amount=-1 +kerning first=74 second=8249 amount=-1 +kerning first=255 second=240 amount=-1 +kerning first=287 second=8249 amount=-1 +kerning first=192 second=84 amount=-2 +kerning first=323 second=8249 amount=-1 +kerning first=193 second=268 amount=-1 +kerning first=121 second=108 amount=-1 +kerning first=117 second=318 amount=-1 +kerning first=1025 second=1059 amount=-1 +kerning first=362 second=228 amount=-1 +kerning first=65 second=284 amount=-1 +kerning first=290 second=198 amount=-1 +kerning first=350 second=205 amount=-1 +kerning first=218 second=198 amount=-1 +kerning first=210 second=65 amount=-1 +kerning first=218 second=228 amount=-1 +kerning first=268 second=286 amount=-1 +kerning first=77 second=228 amount=-1 +kerning first=362 second=198 amount=-1 +kerning first=262 second=260 amount=-1 +kerning first=354 second=65 amount=-2 +kerning first=330 second=367 amount=-1 +kerning first=8250 second=194 amount=-1 +kerning first=1043 second=1078 amount=-1 +kerning first=258 second=367 amount=-1 +kerning first=85 second=260 amount=-1 +kerning first=120 second=115 amount=-1 +kerning first=107 second=339 amount=-1 +kerning first=8250 second=82 amount=-1 +kerning first=287 second=229 amount=-1 +kerning first=370 second=260 amount=-1 +kerning first=85 second=350 amount=-1 +kerning first=334 second=260 amount=-1 +kerning first=1040 second=1090 amount=-1 +kerning first=196 second=286 amount=-1 +kerning first=107 second=271 amount=-1 +kerning first=84 second=115 amount=-1 +kerning first=290 second=356 amount=-1 +kerning first=261 second=8217 amount=-1 +kerning first=118 second=242 amount=-1 +kerning first=1050 second=1058 amount=-1 +kerning first=205 second=261 amount=-1 +kerning first=369 second=8217 amount=-1 +kerning first=82 second=242 amount=-1 +kerning first=311 second=45 amount=-1 +kerning first=323 second=229 amount=-1 +kerning first=356 second=339 amount=-1 +kerning first=8217 second=74 amount=-1 +kerning first=8217 second=231 amount=-1 +kerning first=199 second=304 amount=-1 +kerning first=119 second=339 amount=-1 +kerning first=356 second=211 amount=-1 +kerning first=242 second=44 amount=-1 +kerning first=8217 second=100 amount=-1 +kerning first=379 second=255 amount=-1 +kerning first=199 second=203 amount=-1 +kerning first=307 second=255 amount=-1 +kerning first=235 second=255 amount=-1 +kerning first=220 second=224 amount=-1 +kerning first=89 second=110 amount=-1 +kerning first=374 second=110 amount=-1 +kerning first=366 second=97 amount=-1 +kerning first=356 second=290 amount=-1 +kerning first=330 second=97 amount=-1 +kerning first=350 second=44 amount=-1 +kerning first=68 second=193 amount=-1 +kerning first=364 second=224 amount=-1 +kerning first=232 second=46 amount=-1 +kerning first=74 second=289 amount=-1 +kerning first=84 second=257 amount=-1 +kerning first=356 second=241 amount=-1 +kerning first=323 second=289 amount=-1 +kerning first=45 second=209 amount=-1 +kerning first=313 second=370 amount=-1 +kerning first=354 second=225 amount=-1 +kerning first=66 second=287 amount=-1 +kerning first=365 second=255 amount=-1 +kerning first=197 second=368 amount=-1 +kerning first=351 second=287 amount=-1 +kerning first=260 second=352 amount=-1 +kerning first=315 second=287 amount=-1 +kerning first=207 second=287 amount=-1 +kerning first=65 second=112 amount=-1 +kerning first=119 second=283 amount=-1 +kerning first=235 second=118 amount=-1 +kerning first=70 second=346 amount=-1 +kerning first=287 second=347 amount=-1 +kerning first=368 second=352 amount=-1 +kerning first=80 second=46 amount=-1 +kerning first=313 second=380 amount=-1 +kerning first=1050 second=1057 amount=-1 +kerning first=71 second=291 amount=-1 +kerning first=344 second=87 amount=-1 +kerning first=84 second=266 amount=-1 +kerning first=90 second=253 amount=-1 +kerning first=262 second=201 amount=-1 +kerning first=356 second=333 amount=-1 +kerning first=266 second=350 amount=-1 +kerning first=204 second=259 amount=-1 +kerning first=99 second=259 amount=-1 +kerning first=281 second=311 amount=-1 +kerning first=260 second=370 amount=-1 +kerning first=82 second=81 amount=-1 +kerning first=376 second=375 amount=-1 +kerning first=78 second=230 amount=-1 +kerning first=89 second=350 amount=-1 +kerning first=291 second=230 amount=-1 +kerning first=196 second=375 amount=-1 +kerning first=194 second=350 amount=-1 +kerning first=232 second=375 amount=-1 +kerning first=255 second=230 amount=-1 +kerning first=66 second=207 amount=-1 +kerning first=201 second=289 amount=-1 +kerning first=235 second=104 amount=-1 +kerning first=381 second=289 amount=-1 +kerning first=193 second=219 amount=-1 +kerning first=86 second=332 amount=-1 +kerning first=1038 second=1075 amount=-1 +kerning first=219 second=378 amount=-1 +kerning first=197 second=288 amount=-1 +kerning first=71 second=65 amount=-1 +kerning first=1024 second=1098 amount=-1 +kerning first=376 second=326 amount=-1 +kerning first=310 second=121 amount=-1 +kerning first=218 second=291 amount=-1 +kerning first=313 second=221 amount=-1 +kerning first=1059 second=1033 amount=-1 +kerning first=97 second=121 amount=-1 +kerning first=295 second=8217 amount=-1 +kerning first=255 second=231 amount=-1 +kerning first=381 second=171 amount=-1 +kerning first=217 second=196 amount=-1 +kerning first=207 second=228 amount=-1 +kerning first=266 second=270 amount=-1 +kerning first=374 second=100 amount=-1 +kerning first=316 second=119 amount=-1 +kerning first=256 second=351 amount=-1 +kerning first=119 second=314 amount=-1 +kerning first=121 second=99 amount=-1 +kerning first=317 second=381 amount=-1 +kerning first=269 second=318 amount=-1 +kerning first=256 second=214 amount=-1 +kerning first=8250 second=204 amount=-1 +kerning first=352 second=119 amount=-1 +kerning first=197 second=336 amount=-1 +kerning first=66 second=228 amount=-1 +kerning first=65 second=338 amount=-1 +kerning first=313 second=379 amount=-1 +kerning first=1059 second=1113 amount=-1 +kerning first=75 second=213 amount=-1 +kerning first=195 second=253 amount=-1 +kerning first=289 second=382 amount=-1 +kerning first=119 second=234 amount=-1 +kerning first=88 second=8249 amount=-1 +kerning first=267 second=253 amount=-1 +kerning first=231 second=253 amount=-1 +kerning first=258 second=249 amount=-1 +kerning first=193 second=8249 amount=-1 +kerning first=339 second=253 amount=-1 +kerning first=194 second=89 amount=-2 +kerning first=65 second=363 amount=-1 +kerning first=206 second=363 amount=-1 +kerning first=354 second=246 amount=-1 +kerning first=1027 second=1083 amount=-1 +kerning first=8220 second=240 amount=-1 +kerning first=379 second=103 amount=-1 +kerning first=199 second=344 amount=-1 +kerning first=307 second=103 amount=-1 +kerning first=235 second=103 amount=-1 +kerning first=89 second=100 amount=-1 +kerning first=82 second=232 amount=-1 +kerning first=192 second=284 amount=-1 +kerning first=118 second=232 amount=-1 +kerning first=197 second=118 amount=-1 +kerning first=346 second=203 amount=-1 +kerning first=233 second=118 amount=-1 +kerning first=87 second=284 amount=-1 +kerning first=269 second=118 amount=-1 +kerning first=45 second=377 amount=-1 +kerning first=194 second=8221 amount=-1 +kerning first=71 second=89 amount=-1 +kerning first=77 second=365 amount=-1 +kerning first=264 second=284 amount=-1 +kerning first=346 second=362 amount=-1 +kerning first=87 second=235 amount=-1 +kerning first=88 second=117 amount=-1 +kerning first=8216 second=269 amount=-1 +kerning first=76 second=382 amount=-1 +kerning first=253 second=382 amount=-1 +kerning first=305 second=118 amount=-1 +kerning first=254 second=316 amount=-1 +kerning first=217 second=382 amount=-1 +kerning first=353 second=120 amount=-1 +kerning first=289 second=44 amount=-1 +kerning first=87 second=197 amount=-2 +kerning first=253 second=44 amount=-1 +kerning first=260 second=255 amount=-1 +kerning first=88 second=67 amount=-1 +kerning first=112 second=44 amount=-1 +kerning first=264 second=197 amount=-1 +kerning first=84 second=267 amount=-1 +kerning first=217 second=44 amount=-1 +kerning first=356 second=232 amount=-1 +kerning first=269 second=97 amount=-1 +kerning first=336 second=197 amount=-1 +kerning first=73 second=227 amount=-1 +kerning first=1059 second=1081 amount=-1 +kerning first=220 second=193 amount=-1 +kerning first=266 second=79 amount=-1 +kerning first=45 second=118 amount=-1 +kerning first=79 second=193 amount=-1 +kerning first=374 second=79 amount=-1 +kerning first=364 second=193 amount=-1 +kerning first=1050 second=1059 amount=-1 +kerning first=371 second=273 amount=-1 +kerning first=199 second=65 amount=-1 +kerning first=262 second=338 amount=-1 +kerning first=74 second=260 amount=-1 +kerning first=117 second=118 amount=-1 +kerning first=245 second=120 amount=-1 +kerning first=107 second=232 amount=-1 +kerning first=89 second=79 amount=-1 +kerning first=258 second=118 amount=-1 +kerning first=194 second=79 amount=-1 +kerning first=323 second=250 amount=-1 +kerning first=253 second=245 amount=-1 +kerning first=356 second=378 amount=-1 +kerning first=8220 second=275 amount=-1 +kerning first=267 second=303 amount=-1 +kerning first=263 second=46 amount=-1 +kerning first=279 second=44 amount=-1 +kerning first=231 second=303 amount=-1 +kerning first=194 second=221 amount=-2 +kerning first=258 second=199 amount=-1 +kerning first=1070 second=1059 amount=-1 +kerning first=374 second=83 amount=-1 +kerning first=374 second=291 amount=-1 +kerning first=310 second=361 amount=-1 +kerning first=338 second=291 amount=-1 +kerning first=107 second=242 amount=-1 +kerning first=302 second=291 amount=-1 +kerning first=119 second=113 amount=-1 +kerning first=266 second=291 amount=-1 +kerning first=230 second=291 amount=-1 +kerning first=194 second=291 amount=-1 +kerning first=89 second=291 amount=-1 +kerning first=356 second=242 amount=-1 +kerning first=268 second=216 amount=-1 +kerning first=350 second=102 amount=-1 +kerning first=196 second=216 amount=-1 +kerning first=193 second=67 amount=-1 +kerning first=346 second=204 amount=-1 +kerning first=376 second=216 amount=-1 +kerning first=87 second=187 amount=-1 +kerning first=264 second=196 amount=-1 +kerning first=8216 second=259 amount=-1 +kerning first=221 second=335 amount=-1 +kerning first=8217 second=101 amount=-1 +kerning first=346 second=323 amount=-1 +kerning first=67 second=287 amount=-1 +kerning first=362 second=378 amount=-1 +kerning first=346 second=73 amount=-1 +kerning first=1038 second=1095 amount=-1 +kerning first=196 second=374 amount=-2 +kerning first=364 second=44 amount=-1 +kerning first=366 second=346 amount=-1 +kerning first=85 second=289 amount=-1 +kerning first=121 second=289 amount=-1 +kerning first=255 second=279 amount=-1 +kerning first=75 second=212 amount=-1 +kerning first=262 second=289 amount=-1 +kerning first=298 second=289 amount=-1 +kerning first=230 second=253 amount=-1 +kerning first=1059 second=1051 amount=-1 +kerning first=209 second=224 amount=-1 +kerning first=370 second=289 amount=-1 +kerning first=187 second=195 amount=-1 +kerning first=8250 second=203 amount=-1 +kerning first=287 second=108 amount=-1 +kerning first=251 second=108 amount=-1 +kerning first=66 second=200 amount=-1 +kerning first=8250 second=83 amount=-1 +kerning first=121 second=229 amount=-1 +kerning first=76 second=354 amount=-1 +kerning first=370 second=229 amount=-1 +kerning first=268 second=325 amount=-1 +kerning first=298 second=229 amount=-1 +kerning first=232 second=287 amount=-1 +kerning first=87 second=171 amount=-1 +kerning first=268 second=287 amount=-1 +kerning first=119 second=353 amount=-1 +kerning first=196 second=287 amount=-1 +kerning first=85 second=229 amount=-1 +kerning first=1036 second=1089 amount=-1 +kerning first=260 second=353 amount=-1 +kerning first=311 second=275 amount=-1 +kerning first=83 second=304 amount=-1 +kerning first=193 second=356 amount=-2 +kerning first=1059 second=1054 amount=-1 +kerning first=82 second=211 amount=-1 +kerning first=376 second=287 amount=-1 +kerning first=86 second=248 amount=-1 +kerning first=304 second=287 amount=-1 +kerning first=187 second=80 amount=-1 +kerning first=192 second=45 amount=-1 +kerning first=1059 second=1103 amount=-1 +kerning first=258 second=368 amount=-1 +kerning first=264 second=45 amount=-1 +kerning first=213 second=194 amount=-1 +kerning first=87 second=45 amount=-1 +kerning first=206 second=45 amount=-1 +kerning first=121 second=339 amount=-1 +kerning first=221 second=353 amount=-1 +kerning first=219 second=350 amount=-1 +kerning first=120 second=97 amount=-1 +kerning first=314 second=45 amount=-1 +kerning first=119 second=243 amount=-1 +kerning first=65 second=45 amount=-1 +kerning first=71 second=289 amount=-1 +kerning first=74 second=229 amount=-1 +kerning first=255 second=318 amount=-1 +kerning first=8220 second=231 amount=-1 +kerning first=291 second=318 amount=-1 +kerning first=196 second=356 amount=-2 +kerning first=350 second=45 amount=-1 +kerning first=363 second=318 amount=-1 +kerning first=284 second=289 amount=-1 +kerning first=376 second=255 amount=-1 +kerning first=346 second=370 amount=-1 +kerning first=196 second=255 amount=-1 +kerning first=199 second=112 amount=-1 +kerning first=75 second=332 amount=-1 +kerning first=262 second=80 amount=-1 +kerning first=8250 second=323 amount=-1 +kerning first=67 second=209 amount=-1 +kerning first=284 second=193 amount=-1 +kerning first=212 second=193 amount=-1 +kerning first=298 second=251 amount=-1 +kerning first=118 second=267 amount=-1 +kerning first=356 second=193 amount=-2 +kerning first=8216 second=198 amount=-2 +kerning first=220 second=44 amount=-1 +kerning first=71 second=193 amount=-1 +kerning first=194 second=8220 amount=-1 +kerning first=84 second=226 amount=-1 +kerning first=79 second=44 amount=-1 +kerning first=258 second=79 amount=-1 +kerning first=82 second=233 amount=-1 +kerning first=1046 second=1105 amount=-1 +kerning first=118 second=233 amount=-1 +kerning first=197 second=119 amount=-1 +kerning first=193 second=338 amount=-1 +kerning first=305 second=119 amount=-1 +kerning first=8250 second=313 amount=-1 +kerning first=45 second=84 amount=-1 +kerning first=233 second=119 amount=-1 +kerning first=269 second=119 amount=-1 +kerning first=303 second=111 amount=-1 +kerning first=210 second=46 amount=-1 +kerning first=221 second=225 amount=-1 +kerning first=118 second=314 amount=-1 +kerning first=249 second=314 amount=-1 +kerning first=375 second=111 amount=-1 +kerning first=354 second=46 amount=-1 +kerning first=246 second=46 amount=-1 +kerning first=374 second=8249 amount=-1 +kerning first=376 second=334 amount=-1 +kerning first=365 second=375 amount=-1 +kerning first=196 second=334 amount=-1 +kerning first=268 second=334 amount=-1 +kerning first=89 second=101 amount=-1 +kerning first=197 second=87 amount=-2 +kerning first=187 second=201 amount=-1 +kerning first=221 second=375 amount=-1 +kerning first=257 second=375 amount=-1 +kerning first=195 second=291 amount=-1 +kerning first=376 second=277 amount=-1 +kerning first=356 second=81 amount=-1 +kerning first=374 second=101 amount=-1 +kerning first=1070 second=1033 amount=-1 +kerning first=258 second=218 amount=-1 +kerning first=350 second=196 amount=-1 +kerning first=196 second=8220 amount=-1 +kerning first=311 second=235 amount=-1 +kerning first=45 second=205 amount=-1 +kerning first=286 second=193 amount=-1 +kerning first=337 second=316 amount=-1 +kerning first=84 second=248 amount=-1 +kerning first=232 second=104 amount=-1 +kerning first=71 second=171 amount=-1 +kerning first=281 second=119 amount=-1 +kerning first=8250 second=73 amount=-1 +kerning first=356 second=281 amount=-1 +kerning first=310 second=252 amount=-1 +kerning first=321 second=121 amount=-1 +kerning first=217 second=197 amount=-1 +kerning first=249 second=121 amount=-1 +kerning first=87 second=333 amount=-1 +kerning first=108 second=121 amount=-1 +kerning first=66 second=278 amount=-1 +kerning first=255 second=100 amount=-1 +kerning first=375 second=351 amount=-1 +kerning first=352 second=310 amount=-1 +kerning first=258 second=336 amount=-1 +kerning first=379 second=122 amount=-1 +kerning first=218 second=229 amount=-1 +kerning first=195 second=351 amount=-1 +kerning first=67 second=310 amount=-1 +kerning first=199 second=122 amount=-1 +kerning first=362 second=229 amount=-1 +kerning first=330 second=230 amount=-1 +kerning first=366 second=230 amount=-1 +kerning first=83 second=65 amount=-1 +kerning first=65 second=253 amount=-1 +kerning first=228 second=8217 amount=-1 +kerning first=195 second=366 amount=-1 +kerning first=84 second=198 amount=-2 +kerning first=87 second=115 amount=-1 +kerning first=8250 second=89 amount=-1 +kerning first=242 second=253 amount=-1 +kerning first=1092 second=1076 amount=-1 +kerning first=332 second=65 amount=-1 +kerning first=295 second=171 amount=-1 +kerning first=368 second=65 amount=-1 +kerning first=266 second=200 amount=-1 +kerning first=351 second=347 amount=-1 +kerning first=368 second=289 amount=-1 +kerning first=331 second=171 amount=-1 +kerning first=72 second=45 amount=-1 +kerning first=197 second=199 amount=-1 +kerning first=72 second=361 amount=-1 +kerning first=187 second=280 amount=-1 +kerning first=220 second=382 amount=-1 +kerning first=364 second=382 amount=-1 +kerning first=256 second=219 amount=-1 +kerning first=66 second=347 amount=-1 +kerning first=311 second=333 amount=-1 +kerning first=218 second=194 amount=-1 +kerning first=282 second=103 amount=-1 +kerning first=224 second=255 amount=-1 +kerning first=1038 second=1101 amount=-1 +kerning first=356 second=8250 amount=-1 +kerning first=313 second=8221 amount=-1 +kerning first=105 second=103 amount=-1 +kerning first=241 second=8221 amount=-1 +kerning first=69 second=103 amount=-1 +kerning first=77 second=117 amount=-1 +kerning first=258 second=346 amount=-1 +kerning first=46 second=171 amount=-1 +kerning first=118 second=171 amount=-1 +kerning first=82 second=171 amount=-1 +kerning first=76 second=364 amount=-1 +kerning first=86 second=283 amount=-1 +kerning first=354 second=264 amount=-1 +kerning first=8250 second=370 amount=-1 +kerning first=269 second=121 amount=-1 +kerning first=321 second=380 amount=-1 +kerning first=315 second=366 amount=-1 +kerning first=1059 second=1072 amount=-1 +kerning first=344 second=217 amount=-1 +kerning first=67 second=70 amount=-1 +kerning first=266 second=69 amount=-1 +kerning first=115 second=120 amount=-1 +kerning first=262 second=298 amount=-1 +kerning first=1059 second=1104 amount=-1 +kerning first=374 second=331 amount=-1 +kerning first=194 second=220 amount=-1 +kerning first=283 second=118 amount=-1 +kerning first=286 second=354 amount=-1 +kerning first=279 second=104 amount=-1 +kerning first=197 second=218 amount=-1 +kerning first=244 second=318 amount=-1 +kerning first=371 second=283 amount=-1 +kerning first=106 second=118 amount=-1 +kerning first=66 second=85 amount=-1 +kerning first=102 second=107 amount=1 +kerning first=204 second=250 amount=-1 +kerning first=66 second=107 amount=-1 +kerning first=8217 second=235 amount=-1 +kerning first=197 second=221 amount=-2 +kerning first=80 second=287 amount=-1 +kerning first=119 second=273 amount=-1 +kerning first=252 second=119 amount=-1 +kerning first=197 second=79 amount=-1 +kerning first=279 second=107 amount=-1 +kerning first=352 second=78 amount=-1 +kerning first=66 second=216 amount=-1 +kerning first=66 second=366 amount=-1 +kerning first=73 second=226 amount=-1 +kerning first=240 second=46 amount=-1 +kerning first=194 second=347 amount=-1 +kerning first=99 second=307 amount=-1 +kerning first=221 second=287 amount=-1 +kerning first=67 second=78 amount=-1 +kerning first=221 second=113 amount=-1 +kerning first=197 second=115 amount=-1 +kerning first=1027 second=1108 amount=-1 +kerning first=187 second=378 amount=-1 +kerning first=118 second=378 amount=-1 +kerning first=76 second=220 amount=-1 +kerning first=67 second=210 amount=-1 +kerning first=263 second=291 amount=-1 +kerning first=325 second=45 amount=-1 +kerning first=256 second=284 amount=-1 +kerning first=67 second=350 amount=-1 +kerning first=86 second=291 amount=-1 +kerning first=86 second=261 amount=-1 +kerning first=217 second=45 amount=-1 +kerning first=8216 second=260 amount=-2 +kerning first=344 second=337 amount=-1 +kerning first=289 second=45 amount=-1 +kerning first=256 second=262 amount=-1 +kerning first=381 second=8249 amount=-1 +kerning first=210 second=256 amount=-1 +kerning first=260 second=112 amount=-1 +kerning first=266 second=203 amount=-1 +kerning first=374 second=279 amount=-1 +kerning first=83 second=112 amount=-1 +kerning first=354 second=286 amount=-1 +kerning first=66 second=344 amount=-1 +kerning first=253 second=263 amount=-1 +kerning first=240 second=108 amount=-1 +kerning first=187 second=302 amount=-1 +kerning first=253 second=244 amount=-1 +kerning first=99 second=228 amount=-1 +kerning first=8222 second=122 amount=-1 +kerning first=66 second=325 amount=-1 +kerning first=204 second=228 amount=-1 +kerning first=254 second=108 amount=-1 +kerning first=323 second=251 amount=-1 +kerning first=374 second=212 amount=-1 +kerning first=369 second=253 amount=-1 +kerning first=45 second=66 amount=-1 +kerning first=89 second=212 amount=-1 +kerning first=8250 second=379 amount=-1 +kerning first=194 second=212 amount=-1 +kerning first=266 second=212 amount=-1 +kerning first=171 second=356 amount=-1 +kerning first=87 second=192 amount=-2 +kerning first=350 second=364 amount=-1 +kerning first=119 second=122 amount=-1 +kerning first=241 second=8220 amount=-1 +kerning first=117 second=119 amount=-1 +kerning first=379 second=171 amount=-1 +kerning first=258 second=119 amount=-1 +kerning first=356 second=233 amount=-1 +kerning first=347 second=115 amount=-1 +kerning first=107 second=233 amount=-1 +kerning first=192 second=363 amount=-1 +kerning first=90 second=45 amount=-1 +kerning first=195 second=45 amount=-1 +kerning first=356 second=223 amount=-1 +kerning first=262 second=211 amount=-1 +kerning first=375 second=45 amount=-1 +kerning first=253 second=275 amount=-1 +kerning first=354 second=353 amount=-1 +kerning first=315 second=356 amount=-1 +kerning first=115 second=103 amount=-1 +kerning first=66 second=356 amount=-1 +kerning first=346 second=304 amount=-1 +kerning first=84 second=346 amount=-1 +kerning first=221 second=255 amount=-1 +kerning first=257 second=255 amount=-1 +kerning first=193 second=291 amount=-1 +kerning first=199 second=296 amount=-1 +kerning first=8220 second=100 amount=-1 +kerning first=86 second=194 amount=-2 +kerning first=255 second=101 amount=-1 +kerning first=1050 second=1092 amount=-1 +kerning first=311 second=244 amount=-1 +kerning first=84 second=324 amount=-1 +kerning first=8216 second=99 amount=-1 +kerning first=67 second=200 amount=-1 +kerning first=8250 second=74 amount=-1 +kerning first=192 second=364 amount=-1 +kerning first=235 second=46 amount=-1 +kerning first=361 second=8217 amount=-1 +kerning first=83 second=362 amount=-1 +kerning first=374 second=228 amount=-1 +kerning first=260 second=362 amount=-1 +kerning first=268 second=212 amount=-1 +kerning first=199 second=264 amount=-1 +kerning first=8217 second=279 amount=-1 +kerning first=354 second=352 amount=-1 +kerning first=193 second=347 amount=-1 +kerning first=350 second=197 amount=-1 +kerning first=362 second=259 amount=-1 +kerning first=268 second=278 amount=-1 +kerning first=82 second=71 amount=-1 +kerning first=352 second=200 amount=-1 +kerning first=112 second=253 amount=-1 +kerning first=376 second=225 amount=-1 +kerning first=76 second=253 amount=-1 +kerning first=76 second=8217 amount=-1 +kerning first=304 second=225 amount=-1 +kerning first=290 second=86 amount=-1 +kerning first=66 second=334 amount=-1 +kerning first=346 second=282 amount=-1 +kerning first=82 second=311 amount=-1 +kerning first=213 second=65 amount=-1 +kerning first=374 second=213 amount=-1 +kerning first=354 second=375 amount=-1 +kerning first=266 second=213 amount=-1 +kerning first=82 second=289 amount=-1 +kerning first=194 second=213 amount=-1 +kerning first=246 second=375 amount=-1 +kerning first=269 second=230 amount=-1 +kerning first=262 second=103 amount=-1 +kerning first=1059 second=1117 amount=-1 +kerning first=65 second=351 amount=-1 +kerning first=118 second=289 amount=-1 +kerning first=105 second=375 amount=-1 +kerning first=187 second=289 amount=-1 +kerning first=367 second=289 amount=-1 +kerning first=86 second=380 amount=-1 +kerning first=77 second=259 amount=-1 +kerning first=75 second=336 amount=-1 +kerning first=368 second=122 amount=-1 +kerning first=1042 second=1063 amount=-1 +kerning first=1042 second=1078 amount=-1 +kerning first=321 second=370 amount=-1 +kerning first=234 second=314 amount=-1 +kerning first=121 second=242 amount=-1 +kerning first=8222 second=382 amount=-1 +kerning first=207 second=117 amount=-1 +kerning first=268 second=344 amount=-1 +kerning first=217 second=122 amount=-1 +kerning first=66 second=117 amount=-1 +kerning first=8216 second=229 amount=-1 +kerning first=1059 second=1102 amount=-1 +kerning first=66 second=259 amount=-1 +kerning first=253 second=351 amount=-1 +kerning first=289 second=351 amount=-1 +kerning first=368 second=44 amount=-1 +kerning first=262 second=68 amount=-1 +kerning first=323 second=171 amount=-1 +kerning first=260 second=121 amount=-1 +kerning first=195 second=284 amount=-1 +kerning first=224 second=121 amount=-1 +kerning first=266 second=82 amount=-1 +kerning first=374 second=288 amount=-1 +kerning first=256 second=369 amount=-1 +kerning first=118 second=224 amount=-1 +kerning first=266 second=288 amount=-1 +kerning first=86 second=379 amount=-1 +kerning first=79 second=196 amount=-1 +kerning first=89 second=213 amount=-1 +kerning first=354 second=277 amount=-1 +kerning first=364 second=196 amount=-1 +kerning first=8217 second=229 amount=-1 +kerning first=210 second=197 amount=-1 +kerning first=204 second=103 amount=-1 +kerning first=45 second=327 amount=-1 +kerning first=378 second=171 amount=-1 +kerning first=260 second=252 amount=-1 +kerning first=8216 second=261 amount=-1 +kerning first=90 second=382 amount=-1 +kerning first=261 second=106 amount=1 +kerning first=193 second=86 amount=-2 +kerning first=375 second=382 amount=-1 +kerning first=376 second=246 amount=-1 +kerning first=87 second=266 amount=-1 +kerning first=282 second=287 amount=-1 +kerning first=252 second=8221 amount=-1 +kerning first=365 second=103 amount=-1 +kerning first=240 second=316 amount=-1 +kerning first=264 second=266 amount=-1 +kerning first=344 second=368 amount=-1 +kerning first=105 second=287 amount=-1 +kerning first=192 second=266 amount=-1 +kerning first=99 second=316 amount=-1 +kerning first=221 second=103 amount=-1 +kerning first=80 second=103 amount=-1 +kerning first=344 second=336 amount=-1 +kerning first=82 second=214 amount=-1 +kerning first=262 second=330 amount=-1 +kerning first=356 second=71 amount=-1 +kerning first=187 second=352 amount=-1 +kerning first=344 second=118 amount=-1 +kerning first=195 second=262 amount=-1 +kerning first=121 second=232 amount=-1 +kerning first=82 second=290 amount=-1 +kerning first=86 second=74 amount=-1 +kerning first=236 second=118 amount=-1 +kerning first=339 second=44 amount=-1 +kerning first=262 second=8249 amount=-1 +kerning first=354 second=255 amount=-1 +kerning first=246 second=255 amount=-1 +kerning first=375 second=44 amount=-1 +kerning first=370 second=8249 amount=-1 +kerning first=267 second=44 amount=-1 +kerning first=196 second=366 amount=-1 +kerning first=105 second=255 amount=-1 +kerning first=99 second=105 amount=-1 +kerning first=311 second=267 amount=-1 +kerning first=85 second=8249 amount=-1 +kerning first=187 second=72 amount=-1 +kerning first=87 second=244 amount=-1 +kerning first=121 second=8249 amount=-1 +kerning first=1046 second=1057 amount=-1 +kerning first=197 second=350 amount=-1 +kerning first=221 second=234 amount=-1 +kerning first=73 second=257 amount=-1 +kerning first=89 second=332 amount=-1 +kerning first=337 second=108 amount=-1 +kerning first=67 second=199 amount=-1 +kerning first=204 second=251 amount=-1 +kerning first=352 second=221 amount=-1 +kerning first=74 second=198 amount=-1 +kerning first=354 second=328 amount=-1 +kerning first=260 second=361 amount=-1 +kerning first=296 second=361 amount=-1 +kerning first=311 second=245 amount=-1 +kerning first=374 second=332 amount=-1 +kerning first=8250 second=380 amount=-1 +kerning first=267 second=46 amount=-1 +kerning first=187 second=192 amount=-1 +kerning first=193 second=250 amount=-1 +kerning first=266 second=332 amount=-1 +kerning first=83 second=274 amount=-1 +kerning first=194 second=332 amount=-1 +kerning first=376 second=268 amount=-1 +kerning first=264 second=82 amount=-1 +kerning first=1059 second=1073 amount=-1 +kerning first=221 second=256 amount=-2 +kerning first=352 second=76 amount=-1 +kerning first=268 second=268 amount=-1 +kerning first=196 second=268 amount=-1 +kerning first=80 second=256 amount=-1 +kerning first=288 second=291 amount=-1 +kerning first=106 second=119 amount=-1 +kerning first=252 second=291 amount=-1 +kerning first=1046 second=1038 amount=-1 +kerning first=262 second=210 amount=-1 +kerning first=283 second=119 amount=-1 +kerning first=213 second=256 amount=-1 +kerning first=335 second=314 amount=-1 +kerning first=266 second=204 amount=-1 +kerning first=199 second=198 amount=-1 +kerning first=263 second=314 amount=-1 +kerning first=368 second=291 amount=-1 +kerning first=209 second=250 amount=-1 +kerning first=296 second=291 amount=-1 +kerning first=260 second=291 amount=-1 +kerning first=8216 second=195 amount=-2 +kerning first=119 second=291 amount=-1 +kerning first=83 second=291 amount=-1 +kerning first=194 second=363 amount=-1 +kerning first=268 second=73 amount=-1 +kerning first=84 second=44 amount=-1 +kerning first=89 second=381 amount=-1 +kerning first=317 second=84 amount=-1 +kerning first=1059 second=1095 amount=-1 +kerning first=311 second=337 amount=-1 +kerning first=356 second=268 amount=-1 +kerning first=333 second=44 amount=-1 +kerning first=206 second=227 amount=-1 +kerning first=67 second=278 amount=-1 +kerning first=83 second=296 amount=-1 +kerning first=102 second=108 amount=1 +kerning first=350 second=66 amount=-1 +kerning first=66 second=108 amount=-1 +kerning first=374 second=199 amount=-1 +kerning first=366 second=261 amount=-1 +kerning first=67 second=336 amount=-1 +kerning first=330 second=261 amount=-1 +kerning first=84 second=284 amount=-1 +kerning first=8249 second=356 amount=-1 +kerning first=107 second=281 amount=-1 +kerning first=317 second=89 amount=-1 +kerning first=205 second=367 amount=-1 +kerning first=243 second=108 amount=-1 +kerning first=252 second=121 amount=-1 +kerning first=331 second=8249 amount=-1 +kerning first=66 second=220 amount=-1 +kerning first=356 second=263 amount=-1 +kerning first=346 second=344 amount=-1 +kerning first=264 second=302 amount=-1 +kerning first=118 second=8249 amount=-1 +kerning first=82 second=8249 amount=-1 +kerning first=295 second=8249 amount=-1 +kerning first=99 second=229 amount=-1 +kerning first=284 second=194 amount=-1 +kerning first=83 second=370 amount=-1 +kerning first=266 second=327 amount=-1 +kerning first=198 second=289 amount=-1 +kerning first=234 second=289 amount=-1 +kerning first=118 second=335 amount=-1 +kerning first=220 second=45 amount=-1 +kerning first=290 second=260 amount=-1 +kerning first=256 second=45 amount=-1 +kerning first=346 second=65 amount=-1 +kerning first=328 second=45 amount=-1 +kerning first=82 second=254 amount=-1 +kerning first=86 second=346 amount=-1 +kerning first=121 second=103 amount=-1 +kerning first=80 second=194 amount=-1 +kerning first=121 second=111 amount=-1 +kerning first=218 second=260 amount=-1 +kerning first=221 second=194 amount=-2 +kerning first=376 second=229 amount=-1 +kerning first=8217 second=234 amount=-1 +kerning first=364 second=45 amount=-1 +kerning first=254 second=255 amount=-1 +kerning first=87 second=223 amount=-1 +kerning first=260 second=212 amount=-1 +kerning first=253 second=225 amount=-1 +kerning first=193 second=211 amount=-1 +kerning first=8217 second=283 amount=-1 +kerning first=88 second=211 amount=-1 +kerning first=255 second=243 amount=-1 +kerning first=8216 second=246 amount=-1 +kerning first=85 second=193 amount=-1 +kerning first=287 second=46 amount=-1 +kerning first=283 second=44 amount=-1 +kerning first=103 second=257 amount=-1 +kerning first=8216 second=101 amount=-1 +kerning first=8220 second=101 amount=-1 +kerning first=1059 second=1090 amount=-1 +kerning first=1038 second=1057 amount=-1 +kerning first=334 second=193 amount=-1 +kerning first=88 second=290 amount=-1 +kerning first=262 second=193 amount=-1 +kerning first=193 second=290 amount=-1 +kerning first=370 second=193 amount=-1 +kerning first=87 second=346 amount=-1 +kerning first=235 second=375 amount=-1 +kerning first=307 second=375 amount=-1 +kerning first=367 second=314 amount=-1 +kerning first=356 second=224 amount=-1 +kerning first=88 second=361 amount=-1 +kerning first=346 second=305 amount=-1 +kerning first=99 second=46 amount=-1 +kerning first=194 second=289 amount=-1 +kerning first=82 second=98 amount=-1 +kerning first=45 second=70 amount=-1 +kerning first=103 second=259 amount=-1 +kerning first=84 second=235 amount=-1 +kerning first=199 second=282 amount=-1 +kerning first=1043 second=1051 amount=-1 +kerning first=263 second=225 amount=-1 +kerning first=287 second=316 amount=-1 +kerning first=251 second=316 amount=-1 +kerning first=101 second=311 amount=-1 +kerning first=8250 second=221 amount=-1 +kerning first=262 second=81 amount=-1 +kerning first=379 second=287 amount=-1 +kerning first=264 second=346 amount=-1 +kerning first=379 second=375 amount=-1 +kerning first=199 second=287 amount=-1 +kerning first=192 second=346 amount=-1 +kerning first=235 second=287 amount=-1 +kerning first=313 second=122 amount=-1 +kerning first=197 second=8217 amount=-1 +kerning first=8250 second=65 amount=-1 +kerning first=303 second=271 amount=-1 +kerning first=221 second=352 amount=-1 +kerning first=354 second=194 amount=-2 +kerning first=88 second=81 amount=-1 +kerning first=84 second=328 amount=-1 +kerning first=304 second=117 amount=-1 +kerning first=379 second=121 amount=-1 +kerning first=119 second=335 amount=-1 +kerning first=196 second=117 amount=-1 +kerning first=376 second=269 amount=-1 +kerning first=307 second=121 amount=-1 +kerning first=366 second=350 amount=-1 +kerning first=65 second=115 amount=-1 +kerning first=86 second=353 amount=-1 +kerning first=351 second=103 amount=-1 +kerning first=8217 second=83 amount=-1 +kerning first=87 second=253 amount=-1 +kerning first=193 second=374 amount=-2 +kerning first=45 second=350 amount=-1 +kerning first=228 second=253 amount=-1 +kerning first=84 second=97 amount=-1 +kerning first=121 second=277 amount=-1 +kerning first=258 second=350 amount=-1 +kerning first=272 second=196 amount=-1 +kerning first=258 second=266 amount=-1 +kerning first=88 second=251 amount=-1 +kerning first=193 second=85 amount=-1 +kerning first=364 second=289 amount=-1 +kerning first=298 second=228 amount=-1 +kerning first=85 second=228 amount=-1 +kerning first=121 second=228 amount=-1 +kerning first=379 second=361 amount=-1 +kerning first=279 second=121 amount=-1 +kerning first=193 second=251 amount=-1 +kerning first=107 second=263 amount=-1 +kerning first=89 second=246 amount=-1 +kerning first=344 second=8221 amount=-1 +kerning first=8220 second=257 amount=-1 +kerning first=376 second=103 amount=-1 +kerning first=77 second=171 amount=-1 +kerning first=65 second=262 amount=-1 +kerning first=65 second=71 amount=-1 +kerning first=218 second=171 amount=-1 +kerning first=304 second=103 amount=-1 +kerning first=196 second=103 amount=-1 +kerning first=290 second=171 amount=-1 +kerning first=87 second=381 amount=-1 +kerning first=232 second=103 amount=-1 +kerning first=120 second=249 amount=-1 +kerning first=362 second=171 amount=-1 +kerning first=236 second=119 amount=-1 +kerning first=313 second=362 amount=-1 +kerning first=326 second=171 amount=-1 +kerning first=344 second=119 amount=-1 +kerning first=266 second=256 amount=-1 +kerning first=252 second=118 amount=-1 +kerning first=103 second=380 amount=-1 +kerning first=324 second=118 amount=-1 +kerning first=268 second=313 amount=-1 +kerning first=121 second=233 amount=-1 +kerning first=192 second=218 amount=-1 +kerning first=258 second=288 amount=-1 +kerning first=75 second=118 amount=-1 +kerning first=255 second=248 amount=-1 +kerning first=258 second=217 amount=-1 +kerning first=72 second=229 amount=-1 +kerning first=262 second=67 amount=-1 +kerning first=296 second=230 amount=-1 +kerning first=87 second=267 amount=-1 +kerning first=376 second=264 amount=-1 +kerning first=199 second=352 amount=-1 +kerning first=268 second=264 amount=-1 +kerning first=196 second=264 amount=-1 +kerning first=120 second=363 amount=-1 +kerning first=252 second=8220 amount=-1 +kerning first=195 second=364 amount=-1 +kerning first=313 second=217 amount=-1 +kerning first=67 second=380 amount=-1 +kerning first=356 second=347 amount=-1 +kerning first=8216 second=339 amount=-1 +kerning first=1042 second=1059 amount=-1 +kerning first=260 second=249 amount=-1 +kerning first=264 second=209 amount=-1 +kerning first=258 second=8221 amount=-1 +kerning first=250 second=289 amount=-1 +kerning first=117 second=8221 amount=-1 +kerning first=304 second=229 amount=-1 +kerning first=291 second=257 amount=-1 +kerning first=375 second=232 amount=-1 +kerning first=327 second=257 amount=-1 +kerning first=219 second=257 amount=-1 +kerning first=303 second=232 amount=-1 +kerning first=255 second=257 amount=-1 +kerning first=241 second=118 amount=-1 +kerning first=89 second=83 amount=-1 +kerning first=277 second=118 amount=-1 +kerning first=364 second=192 amount=-1 +kerning first=313 second=118 amount=-1 +kerning first=194 second=83 amount=-1 +kerning first=1046 second=1108 amount=-1 +kerning first=220 second=197 amount=-1 +kerning first=1086 second=1076 amount=-1 +kerning first=266 second=83 amount=-1 +kerning first=266 second=78 amount=-1 +kerning first=87 second=262 amount=-1 +kerning first=220 second=192 amount=-1 +kerning first=284 second=8249 amount=-1 +kerning first=79 second=197 amount=-1 +kerning first=72 second=259 amount=-1 +kerning first=364 second=197 amount=-1 +kerning first=356 second=8249 amount=-1 +kerning first=264 second=262 amount=-1 +kerning first=196 second=370 amount=-1 +kerning first=327 second=230 amount=-1 +kerning first=83 second=194 amount=-1 +kerning first=79 second=192 amount=-1 +kerning first=192 second=262 amount=-1 +kerning first=78 second=257 amount=-1 +kerning first=350 second=315 amount=-1 +kerning first=8217 second=248 amount=-1 +kerning first=362 second=103 amount=-1 +kerning first=290 second=103 amount=-1 +kerning first=107 second=8249 amount=-1 +kerning first=332 second=256 amount=-1 +kerning first=210 second=198 amount=-1 +kerning first=264 second=317 amount=-1 +kerning first=368 second=256 amount=-1 +kerning first=1038 second=1096 amount=-1 +kerning first=321 second=291 amount=-1 +kerning first=86 second=65 amount=-2 +kerning first=354 second=198 amount=-2 +kerning first=352 second=217 amount=-1 +kerning first=249 second=291 amount=-1 +kerning first=108 second=291 amount=-1 +kerning first=72 second=291 amount=-1 +kerning first=83 second=256 amount=-1 +kerning first=82 second=210 amount=-1 +kerning first=82 second=107 amount=-1 +kerning first=344 second=279 amount=-1 +kerning first=356 second=67 amount=-1 +kerning first=1056 second=1040 amount=-1 +kerning first=304 second=259 amount=-1 +kerning first=375 second=227 amount=-1 +kerning first=262 second=72 amount=-1 +kerning first=8250 second=90 amount=-1 +kerning first=267 second=227 amount=-1 +kerning first=268 second=65 amount=-1 +kerning first=231 second=227 amount=-1 +kerning first=108 second=171 amount=-1 +kerning first=370 second=228 amount=-1 +kerning first=256 second=84 amount=-2 +kerning first=76 second=381 amount=-1 +kerning first=8217 second=113 amount=-1 +kerning first=199 second=212 amount=-1 +kerning first=311 second=171 amount=-1 +kerning first=232 second=108 amount=-1 +kerning first=366 second=226 amount=-1 +kerning first=330 second=226 amount=-1 +kerning first=266 second=323 amount=-1 +kerning first=199 second=317 amount=-1 +kerning first=302 second=367 amount=-1 +kerning first=194 second=367 amount=-1 +kerning first=253 second=115 amount=-1 +kerning first=289 second=115 amount=-1 +kerning first=291 second=122 amount=-1 +kerning first=1043 second=1083 amount=-1 +kerning first=255 second=122 amount=-1 +kerning first=327 second=365 amount=-1 +kerning first=219 second=122 amount=-1 +kerning first=8217 second=195 amount=-2 +kerning first=376 second=194 amount=-2 +kerning first=99 second=237 amount=-1 +kerning first=187 second=196 amount=-1 +kerning first=73 second=97 amount=-1 +kerning first=104 second=45 amount=-1 +kerning first=356 second=214 amount=-1 +kerning first=209 second=45 amount=-1 +kerning first=268 second=194 amount=-1 +kerning first=119 second=103 amount=-1 +kerning first=199 second=77 amount=-1 +kerning first=66 second=304 amount=-1 +kerning first=86 second=225 amount=-1 +kerning first=351 second=255 amount=-1 +kerning first=67 second=286 amount=-1 +kerning first=279 second=255 amount=-1 +kerning first=1059 second=1086 amount=-1 +kerning first=315 second=255 amount=-1 +kerning first=89 second=243 amount=-1 +kerning first=344 second=354 amount=-1 +kerning first=243 second=255 amount=-1 +kerning first=296 second=287 amount=-1 +kerning first=84 second=240 amount=-1 +kerning first=66 second=255 amount=-1 +kerning first=86 second=109 amount=-1 +kerning first=119 second=287 amount=-1 +kerning first=196 second=112 amount=-1 +kerning first=8218 second=364 amount=-1 +kerning first=374 second=243 amount=-1 +kerning first=83 second=287 amount=-1 +kerning first=284 second=171 amount=-1 +kerning first=117 second=8217 amount=-1 +kerning first=76 second=218 amount=-1 +kerning first=268 second=352 amount=-1 +kerning first=8250 second=274 amount=-1 +kerning first=368 second=287 amount=-1 +kerning first=258 second=8217 amount=-1 +kerning first=107 second=111 amount=-1 +kerning first=377 second=380 amount=-1 +kerning first=374 second=248 amount=-1 +kerning first=354 second=260 amount=-2 +kerning first=262 second=76 amount=-1 +kerning first=356 second=111 amount=-1 +kerning first=352 second=327 amount=-1 +kerning first=317 second=382 amount=-1 +kerning first=221 second=264 amount=-1 +kerning first=221 second=269 amount=-1 +kerning first=88 second=334 amount=-1 +kerning first=89 second=248 amount=-1 +kerning first=193 second=334 amount=-1 +kerning first=275 second=253 amount=-1 +kerning first=347 second=253 amount=-1 +kerning first=354 second=245 amount=-1 +kerning first=262 second=202 amount=-1 +kerning first=65 second=364 amount=-1 +kerning first=70 second=350 amount=-1 +kerning first=1059 second=1080 amount=-1 +kerning first=209 second=289 amount=-1 +kerning first=84 second=288 amount=-1 +kerning first=353 second=289 amount=-1 +kerning first=281 second=289 amount=-1 +kerning first=199 second=207 amount=-1 +kerning first=317 second=289 amount=-1 +kerning first=352 second=87 amount=-1 +kerning first=323 second=369 amount=-1 +kerning first=67 second=332 amount=-1 +kerning first=8222 second=366 amount=-1 +kerning first=83 second=282 amount=-1 +kerning first=77 second=251 amount=-1 +kerning first=374 second=122 amount=-1 +kerning first=196 second=266 amount=-1 +kerning first=266 second=122 amount=-1 +kerning first=86 second=230 amount=-1 +kerning first=196 second=352 amount=-1 +kerning first=356 second=259 amount=-1 +kerning first=89 second=122 amount=-1 +kerning first=224 second=375 amount=-1 +kerning first=84 second=119 amount=-1 +kerning first=260 second=375 amount=-1 +kerning first=256 second=89 amount=-2 +kerning first=225 second=119 amount=-1 +kerning first=356 second=210 amount=-1 +kerning first=261 second=119 amount=-1 +kerning first=350 second=75 amount=-1 +kerning first=274 second=291 amount=-1 +kerning first=120 second=119 amount=-1 +kerning first=202 second=291 amount=-1 +kerning first=197 second=217 amount=-1 +kerning first=187 second=298 amount=-1 +kerning first=196 second=251 amount=-1 +kerning first=84 second=337 amount=-1 +kerning first=199 second=256 amount=-1 +kerning first=321 second=379 amount=-1 +kerning first=45 second=364 amount=-1 +kerning first=277 second=314 amount=-1 +kerning first=8217 second=243 amount=-1 +kerning first=356 second=351 amount=-1 +kerning first=256 second=362 amount=-1 +kerning first=354 second=121 amount=-1 +kerning first=8220 second=261 amount=-1 +kerning first=246 second=121 amount=-1 +kerning first=87 second=275 amount=-1 +kerning first=277 second=318 amount=-1 +kerning first=371 second=8220 amount=-1 +kerning first=105 second=121 amount=-1 +kerning first=45 second=270 amount=-1 +kerning first=321 second=221 amount=-1 +kerning first=89 second=199 amount=-1 +kerning first=199 second=82 amount=-1 +kerning first=287 second=228 amount=-1 +kerning first=84 second=196 amount=-2 +kerning first=194 second=199 amount=-1 +kerning first=323 second=228 amount=-1 +kerning first=266 second=199 amount=-1 +kerning first=346 second=296 amount=-1 +kerning first=264 second=214 amount=-1 +kerning first=192 second=214 amount=-1 +kerning first=87 second=214 amount=-1 +kerning first=253 second=267 amount=-1 +kerning first=82 second=89 amount=-1 +kerning first=66 second=230 amount=-1 +kerning first=118 second=347 amount=-1 +kerning first=321 second=8221 amount=-1 +kerning first=121 second=316 amount=-1 +kerning first=83 second=86 amount=-1 +kerning first=197 second=266 amount=-1 +kerning first=344 second=235 amount=-1 +kerning first=219 second=83 amount=-1 +kerning first=88 second=171 amount=-1 +kerning first=193 second=171 amount=-1 +kerning first=66 second=260 amount=-1 +kerning first=315 second=103 amount=-1 +kerning first=344 second=284 amount=-1 +kerning first=1107 second=1083 amount=-1 +kerning first=199 second=278 amount=-1 +kerning first=1054 second=1051 amount=-1 +kerning first=279 second=103 amount=-1 +kerning first=194 second=362 amount=-1 +kerning first=193 second=220 amount=-1 +kerning first=207 second=103 amount=-1 +kerning first=298 second=365 amount=-1 +kerning first=381 second=382 amount=-1 +kerning first=86 second=100 amount=-1 +kerning first=193 second=103 amount=-1 +kerning first=83 second=344 amount=-1 +kerning first=121 second=246 amount=-1 +kerning first=303 second=106 amount=1 +kerning first=45 second=121 amount=-1 +kerning first=371 second=100 amount=-1 +kerning first=1045 second=1090 amount=-1 +kerning first=346 second=78 amount=-1 +kerning first=216 second=65 amount=-1 +kerning first=86 second=234 amount=-1 +kerning first=376 second=260 amount=-2 +kerning first=75 second=199 amount=-1 +kerning first=374 second=118 amount=-1 +kerning first=88 second=365 amount=-1 +kerning first=194 second=252 amount=-1 +kerning first=193 second=365 amount=-1 +kerning first=196 second=361 amount=-1 +kerning first=376 second=121 amount=-1 +kerning first=1036 second=1058 amount=-1 +kerning first=304 second=361 amount=-1 +kerning first=84 second=231 amount=-1 +kerning first=232 second=121 amount=-1 +kerning first=196 second=121 amount=-1 +kerning first=379 second=117 amount=-1 +kerning first=303 second=267 amount=-1 +kerning first=193 second=264 amount=-1 +kerning first=375 second=267 amount=-1 +kerning first=197 second=8221 amount=-1 +kerning first=88 second=264 amount=-1 +kerning first=374 second=380 amount=-1 +kerning first=230 second=118 amount=-1 +kerning first=287 second=44 amount=-1 +kerning first=248 second=316 amount=-1 +kerning first=260 second=216 amount=-1 +kerning first=89 second=118 amount=-1 +kerning first=194 second=118 amount=-1 +kerning first=371 second=234 amount=-1 +kerning first=84 second=212 amount=-1 +kerning first=326 second=8217 amount=-1 +kerning first=195 second=346 amount=-1 +kerning first=1050 second=1089 amount=-1 +kerning first=350 second=201 amount=-1 +kerning first=192 second=249 amount=-1 +kerning first=268 second=282 amount=-1 +kerning first=8250 second=296 amount=-1 +kerning first=344 second=266 amount=-1 +kerning first=288 second=87 amount=-1 +kerning first=89 second=380 amount=-1 +kerning first=121 second=347 amount=-1 +kerning first=1069 second=1040 amount=-1 +kerning first=344 second=231 amount=-1 +kerning first=266 second=380 amount=-1 +kerning first=67 second=204 amount=-1 +kerning first=193 second=117 amount=-1 +kerning first=1038 second=1083 amount=-1 +kerning first=1056 second=1103 amount=-1 +kerning first=298 second=224 amount=-1 +kerning first=83 second=366 amount=-1 +kerning first=8222 second=374 amount=-2 +kerning first=195 second=84 amount=-2 +kerning first=85 second=224 amount=-1 +kerning first=121 second=224 amount=-1 +kerning first=288 second=171 amount=-1 +kerning first=209 second=8249 amount=-1 +kerning first=87 second=227 amount=-1 +kerning first=352 second=204 amount=-1 +kerning first=262 second=325 amount=-1 +kerning first=370 second=224 amount=-1 +kerning first=258 second=363 amount=-1 +kerning first=354 second=291 amount=-1 +kerning first=344 second=244 amount=-1 +kerning first=330 second=363 amount=-1 +kerning first=282 second=291 amount=-1 +kerning first=8217 second=230 amount=-1 +kerning first=105 second=291 amount=-1 +kerning first=69 second=291 amount=-1 +kerning first=82 second=67 amount=-1 +kerning first=253 second=337 amount=-1 +kerning first=275 second=44 amount=-1 +kerning first=72 second=287 amount=-1 +kerning first=108 second=287 amount=-1 +kerning first=98 second=44 amount=-1 +kerning first=356 second=338 amount=-1 +kerning first=86 second=256 amount=-2 +kerning first=221 second=198 amount=-2 +kerning first=80 second=198 amount=-1 +kerning first=260 second=366 amount=-1 +kerning first=187 second=206 amount=-1 +kerning first=66 second=112 amount=-1 +kerning first=103 second=378 amount=-1 +kerning first=103 second=318 amount=-1 +kerning first=75 second=117 amount=-1 +kerning first=90 second=361 amount=-1 +kerning first=321 second=287 amount=-1 +kerning first=327 second=367 amount=-1 +kerning first=249 second=287 amount=-1 +kerning first=221 second=326 amount=-1 +kerning first=264 second=66 amount=-1 +kerning first=88 second=286 amount=-1 +kerning first=331 second=8220 amount=-1 +kerning first=78 second=367 amount=-1 +kerning first=193 second=286 amount=-1 +kerning first=89 second=74 amount=-1 +kerning first=350 second=302 amount=-1 +kerning first=248 second=121 amount=-1 +kerning first=118 second=228 amount=-1 +kerning first=288 second=221 amount=-1 +kerning first=365 second=108 amount=-1 +kerning first=374 second=74 amount=-1 +kerning first=344 second=350 amount=-1 +kerning first=101 second=289 amount=-1 +kerning first=375 second=245 amount=-1 +kerning first=354 second=269 amount=-1 +kerning first=103 second=261 amount=-1 +kerning first=303 second=245 amount=-1 +kerning first=377 second=253 amount=-1 +kerning first=256 second=289 amount=-1 +kerning first=264 second=205 amount=-1 +kerning first=66 second=251 amount=-1 +kerning first=256 second=115 amount=-1 +kerning first=66 second=211 amount=-1 +kerning first=217 second=97 amount=-1 +kerning first=378 second=45 amount=-1 +kerning first=197 second=332 amount=-1 +kerning first=289 second=97 amount=-1 +kerning first=262 second=290 amount=-1 +kerning first=207 second=251 amount=-1 +kerning first=253 second=97 amount=-1 +kerning first=78 second=261 amount=-1 +kerning first=327 second=261 amount=-1 +kerning first=291 second=261 amount=-1 +kerning first=67 second=211 amount=-1 +kerning first=255 second=261 amount=-1 +kerning first=253 second=271 amount=-1 +kerning first=219 second=261 amount=-1 +kerning first=332 second=194 amount=-1 +kerning first=66 second=352 amount=-1 +kerning first=368 second=194 amount=-1 +kerning first=240 second=255 amount=-1 +kerning first=99 second=255 amount=-1 +kerning first=269 second=226 amount=-1 +kerning first=72 second=225 amount=-1 +kerning first=364 second=198 amount=-1 +kerning first=250 second=119 amount=-1 +kerning first=109 second=119 amount=-1 +kerning first=336 second=44 amount=-1 +kerning first=230 second=314 amount=-1 +kerning first=1036 second=1095 amount=-1 +kerning first=1062 second=1095 amount=-1 +kerning first=8250 second=362 amount=-1 +kerning first=266 second=274 amount=-1 +kerning first=362 second=46 amount=-1 +kerning first=87 second=44 amount=-1 +kerning first=317 second=366 amount=-1 +kerning first=220 second=289 amount=-1 +kerning first=97 second=8220 amount=-1 +kerning first=217 second=192 amount=-1 +kerning first=231 second=44 amount=-1 +kerning first=115 second=289 amount=-1 +kerning first=8250 second=256 amount=-1 +kerning first=376 second=234 amount=-1 +kerning first=366 second=8249 amount=-1 +kerning first=258 second=347 amount=-1 +kerning first=302 second=230 amount=-1 +kerning first=197 second=354 amount=-2 +kerning first=86 second=122 amount=-1 +kerning first=197 second=213 amount=-1 +kerning first=8218 second=84 amount=-2 +kerning first=344 second=288 amount=-1 +kerning first=317 second=364 amount=-1 +kerning first=76 second=377 amount=-1 +kerning first=290 second=46 amount=-1 +kerning first=284 second=374 amount=-1 +kerning first=374 second=230 amount=-1 +kerning first=1059 second=1077 amount=-1 +kerning first=67 second=83 amount=-1 +kerning first=203 second=291 amount=-1 +kerning first=89 second=230 amount=-1 +kerning first=249 second=375 amount=-1 +kerning first=68 second=192 amount=-1 +kerning first=321 second=375 amount=-1 +kerning first=65 second=346 amount=-1 +kerning first=8222 second=370 amount=-1 +kerning first=66 second=317 amount=-1 +kerning first=83 second=278 amount=-1 +kerning first=108 second=375 amount=-1 +kerning first=313 second=87 amount=-1 +kerning first=89 second=336 amount=-1 +kerning first=218 second=103 amount=-1 +kerning first=194 second=336 amount=-1 +kerning first=1058 second=1093 amount=-1 +kerning first=266 second=336 amount=-1 +kerning first=214 second=196 amount=-1 +kerning first=77 second=103 amount=-1 +kerning first=219 second=46 amount=-1 +kerning first=286 second=196 amount=-1 +kerning first=354 second=335 amount=-1 +kerning first=1059 second=1099 amount=-1 +kerning first=304 second=251 amount=-1 +kerning first=315 second=374 amount=-1 +kerning first=250 second=253 amount=-1 +kerning first=171 second=374 amount=-1 +kerning first=221 second=260 amount=-2 +kerning first=66 second=374 amount=-1 +kerning first=352 second=105 amount=-1 +kerning first=80 second=260 amount=-1 +kerning first=365 second=121 amount=-1 +kerning first=118 second=351 amount=-1 +kerning first=257 second=121 amount=-1 +kerning first=83 second=82 amount=-1 +kerning first=221 second=121 amount=-1 +kerning first=263 second=318 amount=-1 +kerning first=335 second=318 amount=-1 +kerning first=86 second=212 amount=-1 +kerning first=118 second=316 amount=-1 +kerning first=243 second=121 amount=-1 +kerning first=8216 second=233 amount=-1 +kerning first=66 second=121 amount=-1 +kerning first=83 second=203 amount=-1 +kerning first=356 second=228 amount=-1 +kerning first=223 second=316 amount=-1 +kerning first=67 second=323 amount=-1 +kerning first=367 second=316 amount=-1 +kerning first=264 second=75 amount=-1 +kerning first=110 second=171 amount=-1 +kerning first=74 second=171 amount=-1 +kerning first=354 second=326 amount=-1 +kerning first=263 second=375 amount=-1 +kerning first=350 second=77 amount=-1 +kerning first=335 second=375 amount=-1 +kerning first=67 second=270 amount=-1 +kerning first=86 second=375 amount=-1 +kerning first=78 second=228 amount=-1 +kerning first=234 second=253 amount=-1 +kerning first=221 second=99 amount=-1 +kerning first=227 second=375 amount=-1 +kerning first=187 second=278 amount=-1 +kerning first=1058 second=1040 amount=-1 +kerning first=194 second=217 amount=-1 +kerning first=323 second=365 amount=-1 +kerning first=352 second=270 amount=-1 +kerning first=120 second=230 amount=-1 +kerning first=258 second=250 amount=-1 +kerning first=65 second=214 amount=-1 +kerning first=84 second=110 amount=-1 +kerning first=195 second=71 amount=-1 +kerning first=45 second=354 amount=-1 +kerning first=248 second=120 amount=-1 +kerning first=314 second=106 amount=-1 +kerning first=82 second=263 amount=-1 +kerning first=262 second=334 amount=-1 +kerning first=264 second=315 amount=-1 +kerning first=196 second=220 amount=-1 +kerning first=236 second=253 amount=-1 +kerning first=344 second=253 amount=-1 +kerning first=287 second=224 amount=-1 +kerning first=323 second=224 amount=-1 +kerning first=258 second=354 amount=-2 +kerning first=287 second=171 amount=-1 +kerning first=121 second=281 amount=-1 +kerning first=255 second=283 amount=-1 +kerning first=363 second=118 amount=-1 +kerning first=66 second=68 amount=-1 +kerning first=376 second=339 amount=-1 +kerning first=204 second=365 amount=-1 +kerning first=86 second=119 amount=-1 +kerning first=356 second=382 amount=-1 +kerning first=296 second=117 amount=-1 +kerning first=351 second=121 amount=-1 +kerning first=303 second=333 amount=-1 +kerning first=315 second=121 amount=-1 +kerning first=260 second=117 amount=-1 +kerning first=375 second=333 amount=-1 +kerning first=88 second=255 amount=-1 +kerning first=346 second=287 amount=-1 +kerning first=199 second=216 amount=-1 +kerning first=118 second=275 amount=-1 +kerning first=274 second=287 amount=-1 +kerning first=202 second=287 amount=-1 +kerning first=84 second=79 amount=-1 +kerning first=267 second=230 amount=-1 +kerning first=8217 second=65 amount=-2 +kerning first=82 second=338 amount=-1 +kerning first=287 second=378 amount=-1 +kerning first=192 second=368 amount=-1 +kerning first=80 second=8249 amount=-1 +kerning first=219 second=74 amount=-1 +kerning first=84 second=350 amount=-1 +kerning first=350 second=192 amount=-1 +kerning first=344 second=275 amount=-1 +kerning first=74 second=193 amount=-1 +kerning first=289 second=347 amount=-1 +kerning first=378 second=8249 amount=-1 +kerning first=354 second=379 amount=-1 +kerning first=217 second=227 amount=-1 +kerning first=371 second=113 amount=-1 +kerning first=376 second=198 amount=-2 +kerning first=8250 second=69 amount=-1 +kerning first=86 second=113 amount=-1 +kerning first=199 second=71 amount=-1 +kerning first=65 second=84 amount=-2 +kerning first=379 second=291 amount=-1 +kerning first=315 second=90 amount=-1 +kerning first=307 second=291 amount=-1 +kerning first=235 second=291 amount=-1 +kerning first=199 second=291 amount=-1 +kerning first=86 second=199 amount=-1 +kerning first=66 second=361 amount=-1 +kerning first=321 second=366 amount=-1 +kerning first=8222 second=86 amount=-2 +kerning first=199 second=73 amount=-1 +kerning first=84 second=377 amount=-1 +kerning first=214 second=44 amount=-1 +kerning first=87 second=337 amount=-1 +kerning first=325 second=227 amount=-1 +kerning first=258 second=332 amount=-1 +kerning first=346 second=256 amount=-1 +kerning first=268 second=198 amount=-1 +kerning first=45 second=221 amount=-1 +kerning first=84 second=275 amount=-1 +kerning first=187 second=218 amount=-1 +kerning first=199 second=194 amount=-1 +kerning first=311 second=240 amount=-1 +kerning first=275 second=119 amount=-1 +kerning first=8250 second=310 amount=-1 +kerning first=379 second=365 amount=-1 +kerning first=8216 second=103 amount=-1 +kerning first=82 second=219 amount=-1 +kerning first=76 second=84 amount=-1 +kerning first=268 second=103 amount=-1 +kerning first=187 second=219 amount=-1 +kerning first=1054 second=1038 amount=-1 +kerning first=347 second=119 amount=-1 +kerning first=290 second=374 amount=-1 +kerning first=310 second=212 amount=-1 +kerning first=221 second=281 amount=-1 +kerning first=363 second=314 amount=-1 +kerning first=291 second=314 amount=-1 +kerning first=246 second=108 amount=-1 +kerning first=195 second=115 amount=-1 +kerning first=66 second=198 amount=-1 +kerning first=83 second=73 amount=-1 +kerning first=195 second=289 amount=-1 +kerning first=249 second=8220 amount=-1 +kerning first=339 second=289 amount=-1 +kerning first=321 second=8220 amount=-1 +kerning first=231 second=289 amount=-1 +kerning first=377 second=367 amount=-1 +kerning first=267 second=289 amount=-1 +kerning first=255 second=314 amount=-1 +kerning first=8250 second=205 amount=-1 +kerning first=66 second=286 amount=-1 +kerning first=366 second=257 amount=-1 +kerning first=197 second=367 amount=-1 +kerning first=8250 second=287 amount=-1 +kerning first=330 second=257 amount=-1 +kerning first=344 second=101 amount=-1 +kerning first=221 second=229 amount=-1 +kerning first=86 second=243 amount=-1 +kerning first=256 second=220 amount=-1 +kerning first=375 second=115 amount=-1 +kerning first=118 second=45 amount=-1 +kerning first=89 second=261 amount=-1 +kerning first=1038 second=1102 amount=-1 +kerning first=302 second=261 amount=-1 +kerning first=374 second=109 amount=-1 +kerning first=46 second=45 amount=-1 +kerning first=1024 second=1059 amount=-1 +kerning first=374 second=261 amount=-1 +kerning first=197 second=83 amount=-1 +kerning first=229 second=255 amount=-1 +kerning first=87 second=97 amount=-1 +kerning first=103 second=226 amount=-1 +kerning first=331 second=45 amount=-1 +kerning first=217 second=289 amount=-1 +kerning first=187 second=197 amount=-1 +kerning first=193 second=255 amount=-1 +kerning first=193 second=81 amount=-1 +kerning first=119 second=225 amount=-1 +kerning first=291 second=380 amount=-1 +kerning first=255 second=380 amount=-1 +kerning first=8220 second=269 amount=-1 +kerning first=1027 second=1092 amount=-1 +kerning first=296 second=225 amount=-1 +kerning first=120 second=253 amount=-1 +kerning first=368 second=225 amount=-1 +kerning first=66 second=252 amount=-1 +kerning first=84 second=253 amount=-1 +kerning first=315 second=220 amount=-1 +kerning first=289 second=227 amount=-1 +kerning first=225 second=253 amount=-1 +kerning first=89 second=109 amount=-1 +kerning first=243 second=46 amount=-1 +kerning first=374 second=283 amount=-1 +kerning first=279 second=46 amount=-1 +kerning first=256 second=364 amount=-1 +kerning first=371 second=243 amount=-1 +kerning first=118 second=382 amount=-1 +kerning first=187 second=382 amount=-1 +kerning first=266 second=65 amount=-1 +kerning first=374 second=65 amount=-2 +kerning first=241 second=8217 amount=-1 +kerning first=315 second=381 amount=-1 +kerning first=66 second=264 amount=-1 +kerning first=89 second=283 amount=-1 +kerning first=111 second=318 amount=-1 +kerning first=210 second=260 amount=-1 +kerning first=1045 second=1059 amount=-1 +kerning first=252 second=318 amount=-1 +kerning first=264 second=264 amount=-1 +kerning first=375 second=289 amount=-1 +kerning first=370 second=259 amount=-1 +kerning first=268 second=317 amount=-1 +kerning first=298 second=259 amount=-1 +kerning first=339 second=311 amount=-1 +kerning first=8220 second=194 amount=-2 +kerning first=66 second=46 amount=-1 +kerning first=381 second=369 amount=-1 +kerning first=8216 second=277 amount=-1 +kerning first=344 second=8217 amount=-1 +kerning first=376 second=99 amount=-1 +kerning first=258 second=213 amount=-1 +kerning first=8250 second=325 amount=-1 +kerning first=205 second=230 amount=-1 +kerning first=362 second=352 amount=-1 +kerning first=97 second=375 amount=-1 +kerning first=121 second=259 amount=-1 +kerning first=85 second=259 amount=-1 +kerning first=218 second=352 amount=-1 +kerning first=194 second=87 amount=-2 +kerning first=1050 second=1063 amount=-1 +kerning first=1047 second=1093 amount=-1 +kerning first=368 second=259 amount=-1 +kerning first=289 second=230 amount=-1 +kerning first=325 second=230 amount=-1 +kerning first=106 second=253 amount=-1 +kerning first=217 second=230 amount=-1 +kerning first=253 second=230 amount=-1 +kerning first=283 second=253 amount=-1 +kerning first=346 second=87 amount=-1 +kerning first=298 second=363 amount=-1 +kerning first=366 second=122 amount=-1 +kerning first=376 second=110 amount=-1 +kerning first=82 second=101 amount=-1 +kerning first=84 second=81 amount=-1 +kerning first=45 second=217 amount=-1 +kerning first=195 second=288 amount=-1 +kerning first=8217 second=197 amount=-2 +kerning first=321 second=219 amount=-1 +kerning first=187 second=207 amount=-1 +kerning first=111 second=316 amount=-1 +kerning first=193 second=87 amount=-2 +kerning first=346 second=317 amount=-1 +kerning first=1043 second=1103 amount=-1 +kerning first=86 second=277 amount=-1 +kerning first=209 second=287 amount=-1 +kerning first=344 second=121 amount=-1 +kerning first=219 second=196 amount=-1 +kerning first=236 second=121 amount=-1 +kerning first=118 second=115 amount=-1 +kerning first=99 second=103 amount=-1 +kerning first=371 second=277 amount=-1 +kerning first=311 second=231 amount=-1 +kerning first=217 second=171 amount=-1 +kerning first=353 second=287 amount=-1 +kerning first=289 second=171 amount=-1 +kerning first=253 second=171 amount=-1 +kerning first=281 second=287 amount=-1 +kerning first=120 second=252 amount=-1 +kerning first=76 second=368 amount=-1 +kerning first=317 second=287 amount=-1 +kerning first=325 second=171 amount=-1 +kerning first=111 second=375 amount=-1 +kerning first=366 second=352 amount=-1 +kerning first=46 second=8217 amount=-1 +kerning first=45 second=122 amount=-1 +kerning first=264 second=270 amount=-1 +kerning first=87 second=99 amount=-1 +kerning first=8222 second=89 amount=-2 +kerning first=259 second=8217 amount=-1 +kerning first=258 second=352 amount=-1 +kerning first=331 second=8217 amount=-1 +kerning first=85 second=74 amount=-1 +kerning first=75 second=375 amount=-1 +kerning first=267 second=229 amount=-1 +kerning first=367 second=8217 amount=-1 +kerning first=231 second=229 amount=-1 +kerning first=370 second=74 amount=-1 +kerning first=344 second=213 amount=-1 +kerning first=356 second=381 amount=-1 +kerning first=204 second=225 amount=-1 +kerning first=287 second=382 amount=-1 +kerning first=371 second=106 amount=1 +kerning first=377 second=103 amount=-1 +kerning first=266 second=315 amount=-1 +kerning first=258 second=214 amount=-1 +kerning first=233 second=103 amount=-1 +kerning first=65 second=249 amount=-1 +kerning first=356 second=246 amount=-1 +kerning first=197 second=103 amount=-1 +kerning first=119 second=318 amount=-1 +kerning first=107 second=246 amount=-1 +kerning first=310 second=199 amount=-1 +kerning first=194 second=8217 amount=-1 +kerning first=8250 second=356 amount=-1 +kerning first=84 second=232 amount=-1 +kerning first=77 second=361 amount=-1 +kerning first=195 second=117 amount=-1 +kerning first=8217 second=335 amount=-1 +kerning first=117 second=255 amount=-1 +kerning first=90 second=117 amount=-1 +kerning first=361 second=8220 amount=-1 +kerning first=252 second=316 amount=-1 +kerning first=199 second=378 amount=-1 +kerning first=8216 second=224 amount=-1 +kerning first=87 second=119 amount=-1 +kerning first=192 second=8221 amount=-1 +kerning first=76 second=8220 amount=-1 +kerning first=76 second=118 amount=-1 +kerning first=379 second=378 amount=-1 +kerning first=192 second=119 amount=-1 +kerning first=376 second=281 amount=-1 +kerning first=268 second=202 amount=-1 +kerning first=228 second=119 amount=-1 +kerning first=344 second=233 amount=-1 +kerning first=66 second=380 amount=-1 +kerning first=375 second=347 amount=-1 +kerning first=8216 second=242 amount=-1 +kerning first=244 second=314 amount=-1 +kerning first=315 second=380 amount=-1 +kerning first=194 second=85 amount=-1 +kerning first=103 second=314 amount=-1 +kerning first=195 second=347 amount=-1 +kerning first=288 second=86 amount=-1 +kerning first=8217 second=256 amount=-2 +kerning first=221 second=379 amount=-1 +kerning first=192 second=250 amount=-1 +kerning first=83 second=200 amount=-1 +kerning first=8249 second=221 amount=-1 +kerning first=82 second=266 amount=-1 +kerning first=354 second=378 amount=-1 +kerning first=84 second=101 amount=-1 +kerning first=374 second=216 amount=-1 +kerning first=325 second=250 amount=-1 +kerning first=314 second=8220 amount=-1 +kerning first=65 second=8220 amount=-1 +kerning first=326 second=119 amount=-1 +kerning first=84 second=331 amount=-1 +kerning first=272 second=193 amount=-1 +kerning first=352 second=274 amount=-1 +kerning first=310 second=216 amount=-1 +kerning first=219 second=197 amount=-1 +kerning first=8220 second=195 amount=-2 +kerning first=376 second=90 amount=-1 +kerning first=286 second=291 amount=-1 +kerning first=121 second=113 amount=-1 +kerning first=250 second=291 amount=-1 +kerning first=194 second=216 amount=-1 +kerning first=321 second=377 amount=-1 +kerning first=89 second=216 amount=-1 +kerning first=45 second=83 amount=-1 +kerning first=73 second=291 amount=-1 +kerning first=86 second=67 amount=-1 +kerning first=89 second=197 amount=-2 +kerning first=1059 second=1094 amount=-1 +kerning first=258 second=83 amount=-1 +kerning first=266 second=216 amount=-1 +kerning first=266 second=197 amount=-1 +kerning first=8217 second=257 amount=-1 +kerning first=65 second=210 amount=-1 +kerning first=366 second=83 amount=-1 +kerning first=374 second=197 amount=-2 +kerning first=317 second=85 amount=-1 +kerning first=119 second=8249 amount=-1 +kerning first=66 second=262 amount=-1 +kerning first=83 second=302 amount=-1 +kerning first=8250 second=87 amount=-1 +kerning first=356 second=187 amount=-1 +kerning first=260 second=8249 amount=-1 +kerning first=354 second=240 amount=-1 +kerning first=368 second=8249 amount=-1 +kerning first=256 second=268 amount=-1 +kerning first=83 second=68 amount=-1 +kerning first=346 second=278 amount=-1 +kerning first=8220 second=333 amount=-1 +kerning first=86 second=198 amount=-2 +kerning first=83 second=45 amount=-1 +kerning first=66 second=203 amount=-1 +kerning first=235 second=108 amount=-1 +kerning first=249 second=318 amount=-1 +kerning first=222 second=46 amount=-1 +kerning first=209 second=228 amount=-1 +kerning first=219 second=65 amount=-1 +kerning first=199 second=260 amount=-1 +kerning first=195 second=367 amount=-1 +kerning first=268 second=193 amount=-1 +kerning first=351 second=120 amount=-1 +kerning first=8220 second=235 amount=-1 +kerning first=90 second=367 amount=-1 +kerning first=298 second=361 amount=-1 +kerning first=206 second=229 amount=-1 +kerning first=221 second=339 amount=-1 +kerning first=103 second=353 amount=-1 +kerning first=1061 second=1073 amount=-1 +kerning first=8222 second=220 amount=-1 +kerning first=211 second=194 amount=-1 +kerning first=262 second=304 amount=-1 +kerning first=354 second=109 amount=-1 +kerning first=311 second=271 amount=-1 +kerning first=89 second=45 amount=-1 +kerning first=70 second=352 amount=-1 +kerning first=255 second=275 amount=-1 +kerning first=8250 second=195 amount=-1 +kerning first=374 second=45 amount=-1 +kerning first=8216 second=263 amount=-1 +kerning first=194 second=45 amount=-1 +kerning first=8216 second=244 amount=-1 +kerning first=70 second=194 amount=-1 +kerning first=376 second=242 amount=-1 +kerning first=233 second=44 amount=-1 +kerning first=316 second=255 amount=-1 +kerning first=370 second=225 amount=-1 +kerning first=244 second=255 amount=-1 +kerning first=298 second=225 amount=-1 +kerning first=75 second=334 amount=-1 +kerning first=376 second=286 amount=-1 +kerning first=221 second=110 amount=-1 +kerning first=344 second=81 amount=-1 +kerning first=231 second=97 amount=-1 +kerning first=267 second=97 amount=-1 +kerning first=269 second=44 amount=-1 +kerning first=375 second=97 amount=-1 +kerning first=87 second=79 amount=-1 +kerning first=288 second=65 amount=-1 +kerning first=350 second=84 amount=-1 +kerning first=67 second=274 amount=-1 +kerning first=192 second=79 amount=-1 +kerning first=197 second=252 amount=-1 +kerning first=264 second=79 amount=-1 +kerning first=187 second=76 amount=-1 +kerning first=66 second=104 amount=-1 +kerning first=65 second=289 amount=-1 +kerning first=8222 second=378 amount=-1 +kerning first=278 second=289 amount=-1 +kerning first=314 second=289 amount=-1 +kerning first=206 second=289 amount=-1 +kerning first=1059 second=1088 amount=-1 +kerning first=221 second=241 amount=-1 +kerning first=85 second=225 amount=-1 +kerning first=350 second=289 amount=-1 +kerning first=65 second=368 amount=-1 +kerning first=303 second=248 amount=-1 +kerning first=354 second=241 amount=-1 +kerning first=263 second=230 amount=-1 +kerning first=8250 second=278 amount=-1 +kerning first=1059 second=1108 amount=-1 +kerning first=197 second=352 amount=-1 +kerning first=83 second=69 amount=-1 +kerning first=82 second=364 amount=-1 +kerning first=8250 second=198 amount=-1 +kerning first=198 second=287 amount=-1 +kerning first=262 second=206 amount=-1 +kerning first=234 second=287 amount=-1 +kerning first=89 second=44 amount=-1 +kerning first=195 second=374 amount=-2 +kerning first=313 second=86 amount=-1 +kerning first=8218 second=118 amount=-1 +kerning first=89 second=46 amount=-1 +kerning first=350 second=368 amount=-1 +kerning first=67 second=45 amount=-1 +kerning first=268 second=380 amount=-1 +kerning first=230 second=46 amount=-1 +kerning first=103 second=45 amount=-1 +kerning first=199 second=201 amount=-1 +kerning first=8216 second=273 amount=-1 +kerning first=65 second=347 amount=-1 +kerning first=98 second=253 amount=-1 +kerning first=268 second=70 amount=-1 +kerning first=376 second=380 amount=-1 +kerning first=303 second=269 amount=-1 +kerning first=375 second=269 amount=-1 +kerning first=255 second=353 amount=-1 +kerning first=354 second=229 amount=-1 +kerning first=344 second=311 amount=-1 +kerning first=87 second=230 amount=-1 +kerning first=313 second=375 amount=-1 +kerning first=364 second=346 amount=-1 +kerning first=87 second=289 amount=-1 +kerning first=256 second=346 amount=-1 +kerning first=220 second=346 amount=-1 +kerning first=277 second=375 amount=-1 +kerning first=264 second=289 amount=-1 +kerning first=346 second=219 amount=-1 +kerning first=192 second=289 amount=-1 +kerning first=65 second=288 amount=-1 +kerning first=375 second=248 amount=-1 +kerning first=73 second=369 amount=-1 +kerning first=1059 second=1087 amount=-1 +kerning first=344 second=370 amount=-1 +kerning first=192 second=251 amount=-1 +kerning first=356 second=289 amount=-1 +kerning first=67 second=196 amount=-1 +kerning first=8216 second=243 amount=-1 +kerning first=70 second=83 amount=-1 +kerning first=344 second=332 amount=-1 +kerning first=192 second=171 amount=-1 +kerning first=283 second=121 amount=-1 +kerning first=264 second=171 amount=-1 +kerning first=87 second=231 amount=-1 +kerning first=228 second=8220 amount=-1 +kerning first=106 second=121 amount=-1 +kerning first=352 second=196 amount=-1 +kerning first=208 second=196 amount=-1 +kerning first=76 second=119 amount=-1 +kerning first=311 second=100 amount=-1 +kerning first=84 second=233 amount=-1 +kerning first=83 second=298 amount=-1 +kerning first=196 second=221 amount=-2 +kerning first=8250 second=219 amount=-1 +kerning first=253 second=99 amount=-1 +kerning first=269 second=314 amount=-1 +kerning first=233 second=314 amount=-1 +kerning first=84 second=213 amount=-1 +kerning first=262 second=382 amount=-1 +kerning first=117 second=253 amount=-1 +kerning first=258 second=253 amount=-1 +kerning first=333 second=120 amount=-1 +kerning first=266 second=334 amount=-1 +kerning first=310 second=8249 amount=-1 +kerning first=382 second=8249 amount=-1 +kerning first=346 second=291 amount=-1 +kerning first=89 second=334 amount=-1 +kerning first=346 second=8249 amount=-1 +kerning first=262 second=344 amount=-1 +kerning first=1090 second=1083 amount=-1 +kerning first=323 second=363 amount=-1 +kerning first=316 second=103 amount=-1 +kerning first=352 second=103 amount=-1 +kerning first=374 second=334 amount=-1 +kerning first=90 second=249 amount=-1 +kerning first=101 second=118 amount=-1 +kerning first=45 second=313 amount=-1 +kerning first=67 second=103 amount=-1 +kerning first=193 second=362 amount=-1 +kerning first=209 second=365 amount=-1 +kerning first=65 second=118 amount=-1 +kerning first=346 second=68 amount=-1 +kerning first=8217 second=275 amount=-1 +kerning first=263 second=316 amount=-1 +kerning first=85 second=382 amount=-1 +kerning first=255 second=235 amount=-1 +kerning first=269 second=259 amount=-1 +kerning first=377 second=255 amount=-1 +kerning first=244 second=44 amount=-1 +kerning first=269 second=255 amount=-1 +kerning first=352 second=44 amount=-1 +kerning first=197 second=255 amount=-1 +kerning first=103 second=44 amount=-1 +kerning first=233 second=255 amount=-1 +kerning first=228 second=8221 amount=-1 +kerning first=208 second=44 amount=-1 +kerning first=315 second=85 amount=-1 +kerning first=8250 second=317 amount=-1 +kerning first=87 second=100 amount=-1 +kerning first=108 second=8249 amount=-1 +kerning first=87 second=290 amount=-1 +kerning first=118 second=227 amount=-1 +kerning first=192 second=290 amount=-1 +kerning first=86 second=110 amount=-1 +kerning first=211 second=193 amount=-1 +kerning first=70 second=193 amount=-1 +kerning first=8250 second=122 amount=-1 +kerning first=313 second=85 amount=-1 +kerning first=67 second=65 amount=-1 +kerning first=8250 second=121 amount=-1 +kerning first=303 second=118 amount=-1 +kerning first=339 second=118 amount=-1 +kerning first=311 second=232 amount=-1 +kerning first=199 second=338 amount=-1 +kerning first=263 second=257 amount=-1 +kerning first=1027 second=1078 amount=-1 +kerning first=208 second=65 amount=-1 +kerning first=83 second=260 amount=-1 +kerning first=264 second=192 amount=-1 +kerning first=195 second=118 amount=-1 +kerning first=102 second=171 amount=-1 +kerning first=231 second=118 amount=-1 +kerning first=336 second=192 amount=-1 +kerning first=352 second=65 amount=-1 +kerning first=368 second=260 amount=-1 +kerning first=332 second=260 amount=-1 +kerning first=206 second=250 amount=-1 +kerning first=1105 second=1076 amount=-1 +kerning first=121 second=245 amount=-1 +kerning first=221 second=378 amount=-1 +kerning first=1036 second=1073 amount=-1 +kerning first=66 second=381 amount=-1 +kerning first=194 second=84 amount=-2 +kerning first=347 second=291 amount=-1 +kerning first=275 second=291 amount=-1 +kerning first=288 second=256 amount=-1 +kerning first=119 second=337 amount=-1 +kerning first=193 second=361 amount=-1 +kerning first=221 second=90 amount=-1 +kerning first=195 second=210 amount=-1 +kerning first=8218 second=354 amount=-2 +kerning first=377 second=102 amount=-1 +kerning first=216 second=256 amount=-1 +kerning first=221 second=242 amount=-1 +kerning first=310 second=67 amount=-1 +kerning first=310 second=338 amount=-1 +kerning first=89 second=335 amount=-1 +kerning first=327 second=45 amount=-1 +kerning first=352 second=280 amount=-1 +kerning first=313 second=374 amount=-1 +kerning first=66 second=261 amount=-1 +kerning first=374 second=335 amount=-1 +kerning first=118 second=44 amount=-1 +kerning first=77 second=224 amount=-1 +kerning first=207 second=261 amount=-1 +kerning first=354 second=110 amount=-1 +kerning first=256 second=367 amount=-1 +kerning first=362 second=224 amount=-1 +kerning first=76 second=289 amount=-1 +kerning first=325 second=289 amount=-1 +kerning first=8220 second=103 amount=-1 +kerning first=1027 second=1040 amount=-1 +kerning first=218 second=224 amount=-1 +kerning first=253 second=289 amount=-1 +kerning first=8250 second=377 amount=-1 +kerning first=87 second=328 amount=-1 +kerning first=354 second=279 amount=-1 +kerning first=1043 second=1104 amount=-1 +kerning first=354 second=381 amount=-1 +kerning first=356 second=286 amount=-1 +kerning first=253 second=229 amount=-1 +kerning first=187 second=325 amount=-1 +kerning first=217 second=229 amount=-1 +kerning first=353 second=115 amount=-1 +kerning first=86 second=257 amount=-1 +kerning first=8218 second=221 amount=-2 +kerning first=325 second=229 amount=-1 +kerning first=289 second=229 amount=-1 +kerning first=197 second=353 amount=-1 +kerning first=352 second=354 amount=-1 +kerning first=356 second=324 amount=-1 +kerning first=118 second=287 amount=-1 +kerning first=187 second=287 amount=-1 +kerning first=82 second=287 amount=-1 +kerning first=346 second=356 amount=-1 +kerning first=110 second=45 amount=-1 +kerning first=366 second=194 amount=-1 +kerning first=264 second=290 amount=-1 +kerning first=66 second=223 amount=-1 +kerning first=1050 second=1054 amount=-1 +kerning first=367 second=287 amount=-1 +kerning first=73 second=171 amount=-1 +kerning first=206 second=97 amount=-1 +kerning first=374 second=275 amount=-1 +kerning first=376 second=245 amount=-1 +kerning first=354 second=339 amount=-1 +kerning first=1027 second=1089 amount=-1 +kerning first=195 second=368 amount=-1 +kerning first=219 second=45 amount=-1 +kerning first=89 second=331 amount=-1 +kerning first=255 second=45 amount=-1 +kerning first=81 second=194 amount=-1 +kerning first=222 second=194 amount=-1 +kerning first=89 second=275 amount=-1 +kerning first=78 second=45 amount=-1 +kerning first=8220 second=234 amount=-1 +kerning first=197 second=45 amount=-1 +kerning first=268 second=78 amount=-1 +kerning first=192 second=350 amount=-1 +kerning first=194 second=353 amount=-1 +kerning first=305 second=45 amount=-1 +kerning first=264 second=350 amount=-1 +kerning first=65 second=211 amount=-1 +kerning first=313 second=356 amount=-1 +kerning first=374 second=353 amount=-1 +kerning first=246 second=318 amount=-1 +kerning first=8217 second=277 amount=-1 +kerning first=377 second=45 amount=-1 +kerning first=275 second=289 amount=-1 +kerning first=87 second=350 amount=-1 +kerning first=277 second=255 amount=-1 +kerning first=313 second=255 amount=-1 +kerning first=262 second=112 amount=-1 +kerning first=347 second=289 amount=-1 +kerning first=187 second=193 amount=-1 +kerning first=84 second=194 amount=-2 +kerning first=84 second=332 amount=-1 +kerning first=376 second=223 amount=-1 +kerning first=352 second=374 amount=-1 +kerning first=89 second=353 amount=-1 +kerning first=8249 second=354 amount=-1 +kerning first=84 second=290 amount=-1 +kerning first=325 second=251 amount=-1 +kerning first=211 second=44 amount=-1 +kerning first=374 second=257 amount=-1 +kerning first=195 second=79 amount=-1 +kerning first=1100 second=1091 amount=-1 +kerning first=272 second=192 amount=-1 +kerning first=70 second=44 amount=-1 +kerning first=101 second=119 amount=-1 +kerning first=74 second=103 amount=-1 +kerning first=89 second=257 amount=-1 +kerning first=65 second=119 amount=-1 +kerning first=302 second=257 amount=-1 +kerning first=264 second=78 amount=-1 +kerning first=314 second=119 amount=-1 +kerning first=315 second=221 amount=-1 +kerning first=114 second=46 amount=-1 +kerning first=350 second=119 amount=-1 +kerning first=356 second=225 amount=-1 +kerning first=291 second=46 amount=-1 +kerning first=117 second=314 amount=-1 +kerning first=255 second=46 amount=-1 +kerning first=8250 second=66 amount=-1 +kerning first=269 second=253 amount=-1 +kerning first=251 second=375 amount=-1 +kerning first=187 second=346 amount=-1 +kerning first=231 second=230 amount=-1 +kerning first=374 second=375 amount=-1 +kerning first=82 second=346 amount=-1 +kerning first=199 second=70 amount=-1 +kerning first=370 second=378 amount=-1 +kerning first=194 second=375 amount=-1 +kerning first=230 second=375 amount=-1 +kerning first=83 second=87 amount=-1 +kerning first=268 second=201 amount=-1 +kerning first=311 second=101 amount=-1 +kerning first=260 second=87 amount=-2 +kerning first=8220 second=273 amount=-1 +kerning first=89 second=375 amount=-1 +kerning first=74 second=196 amount=-1 +kerning first=8250 second=70 amount=-1 +kerning first=217 second=380 amount=-1 +kerning first=89 second=235 amount=-1 +kerning first=321 second=218 amount=-1 +kerning first=288 second=354 amount=-1 +kerning first=277 second=104 amount=-1 +kerning first=374 second=235 amount=-1 +kerning first=258 second=81 amount=-1 +kerning first=106 second=171 amount=-1 +kerning first=86 second=377 amount=-1 +kerning first=120 second=369 amount=-1 +kerning first=263 second=105 amount=-1 +kerning first=264 second=212 amount=-1 +kerning first=209 second=117 amount=-1 +kerning first=67 second=197 amount=-1 +kerning first=1059 second=1083 amount=-1 +kerning first=344 second=83 amount=-1 +kerning first=255 second=333 amount=-1 +kerning first=258 second=121 amount=-1 +kerning first=208 second=197 amount=-1 +kerning first=83 second=317 amount=-1 +kerning first=253 second=231 amount=-1 +kerning first=352 second=197 amount=-1 +kerning first=207 second=229 amount=-1 +kerning first=323 second=291 amount=-1 +kerning first=199 second=313 amount=-1 +kerning first=209 second=229 amount=-1 +kerning first=86 second=335 amount=-1 +kerning first=346 second=237 amount=-1 +kerning first=103 second=122 amount=-1 +kerning first=275 second=311 amount=-1 +kerning first=375 second=230 amount=-1 +kerning first=67 second=122 amount=-1 +kerning first=233 second=253 amount=-1 +kerning first=197 second=253 amount=-1 +kerning first=371 second=335 amount=-1 +kerning first=89 second=333 amount=-1 +kerning first=213 second=260 amount=-1 +kerning first=286 second=171 amount=-1 +kerning first=256 second=249 amount=-1 +kerning first=321 second=86 amount=-1 +kerning first=262 second=266 amount=-1 +kerning first=260 second=199 amount=-1 +kerning first=204 second=361 amount=-1 +kerning first=81 second=196 amount=-1 +kerning first=45 second=196 amount=-1 +kerning first=67 second=79 amount=-1 +kerning first=363 second=103 amount=-1 +kerning first=197 second=171 amount=-1 +kerning first=84 second=214 amount=-1 +kerning first=109 second=8221 amount=-1 +kerning first=327 second=103 amount=-1 +kerning first=219 second=103 amount=-1 +kerning first=8218 second=119 amount=-1 +kerning first=255 second=103 amount=-1 +kerning first=253 second=100 amount=-1 +kerning first=221 second=267 amount=-1 +kerning first=78 second=103 amount=-1 +kerning first=250 second=8221 amount=-1 +kerning first=354 second=71 amount=-1 +kerning first=264 second=330 amount=-1 +kerning first=381 second=365 amount=-1 +kerning first=45 second=103 amount=-1 +kerning first=321 second=220 amount=-1 +kerning first=221 second=8250 amount=-1 +kerning first=109 second=171 amount=-1 +kerning first=8216 second=192 amount=-2 +kerning first=263 second=261 amount=-1 +kerning first=220 second=97 amount=-1 +kerning first=328 second=118 amount=-1 +kerning first=66 second=72 amount=-1 +kerning first=207 second=224 amount=-1 +kerning first=199 second=298 amount=-1 +kerning first=118 second=248 amount=-1 +kerning first=193 second=252 amount=-1 +kerning first=296 second=259 amount=-1 +kerning first=66 second=224 amount=-1 +kerning first=66 second=379 amount=-1 +kerning first=87 second=232 amount=-1 +kerning first=256 second=118 amount=-1 +kerning first=260 second=218 amount=-1 +kerning first=82 second=267 amount=-1 +kerning first=315 second=379 amount=-1 +kerning first=255 second=234 amount=-1 +kerning first=83 second=218 amount=-1 +kerning first=115 second=118 amount=-1 +kerning first=195 second=250 amount=-1 +kerning first=90 second=250 amount=-1 +kerning first=1050 second=1090 amount=-1 +kerning first=83 second=221 amount=-1 +kerning first=260 second=221 amount=-2 +kerning first=376 second=378 amount=-1 +kerning first=45 second=274 amount=-1 +kerning first=71 second=287 amount=-1 +kerning first=84 second=192 amount=-2 +kerning first=214 second=193 amount=-1 +kerning first=1113 second=1118 amount=-1 +kerning first=213 second=198 amount=-1 +kerning first=75 second=216 amount=-1 +kerning first=118 second=226 amount=-1 +kerning first=313 second=84 amount=-1 +kerning first=356 second=287 amount=-1 +kerning first=352 second=102 amount=-1 +kerning first=284 second=287 amount=-1 +kerning first=1118 second=1083 amount=-1 +kerning first=220 second=227 amount=-1 +kerning first=267 second=307 amount=-1 +kerning first=231 second=307 amount=-1 +kerning first=268 second=378 amount=-1 +kerning first=344 second=291 amount=-1 +kerning first=286 second=221 amount=-1 +kerning first=107 second=113 amount=-1 +kerning first=256 second=368 amount=-1 +kerning first=254 second=121 amount=-1 +kerning first=264 second=210 amount=-1 +kerning first=236 second=291 amount=-1 +kerning first=352 second=45 amount=-1 +kerning first=193 second=262 amount=-1 +kerning first=321 second=89 amount=-1 +kerning first=193 second=284 amount=-1 +kerning first=88 second=262 amount=-1 +kerning first=87 second=210 amount=-1 +kerning first=77 second=261 amount=-1 +kerning first=217 second=350 amount=-1 +kerning first=192 second=210 amount=-1 +kerning first=371 second=337 amount=-1 +kerning first=354 second=8249 amount=-1 +kerning first=218 second=261 amount=-1 +kerning first=86 second=337 amount=-1 +kerning first=88 second=284 amount=-1 +kerning first=119 second=240 amount=-1 +kerning first=8218 second=87 amount=-2 +kerning first=209 second=367 amount=-1 +kerning first=118 second=245 amount=-1 +kerning first=350 second=327 amount=-1 +kerning first=82 second=245 amount=-1 +kerning first=105 second=8249 amount=-1 +kerning first=194 second=370 amount=-1 +kerning first=221 second=279 amount=-1 +kerning first=121 second=263 amount=-1 +kerning first=267 second=228 amount=-1 +kerning first=346 second=66 amount=-1 +kerning first=375 second=228 amount=-1 +kerning first=121 second=244 amount=-1 +kerning first=249 second=108 amount=-1 +kerning first=347 second=120 amount=-1 +kerning first=231 second=228 amount=-1 +kerning first=268 second=302 amount=-1 +kerning first=263 second=108 amount=-1 +kerning first=335 second=108 amount=-1 +kerning first=66 second=303 amount=-1 +kerning first=362 second=8249 amount=-1 +kerning first=86 second=224 amount=-1 +kerning first=206 second=251 amount=-1 +kerning first=101 second=103 amount=-1 +kerning first=66 second=73 amount=-1 +kerning first=374 second=226 amount=-1 +kerning first=109 second=8220 amount=-1 +kerning first=364 second=229 amount=-1 +kerning first=250 second=8220 amount=-1 +kerning first=262 second=286 amount=-1 +kerning first=66 second=311 amount=-1 +kerning first=195 second=119 amount=-1 +kerning first=376 second=279 amount=-1 +kerning first=263 second=237 amount=-1 +kerning first=303 second=119 amount=-1 +kerning first=339 second=119 amount=-1 +kerning first=8217 second=333 amount=-1 +kerning first=231 second=119 amount=-1 +kerning first=267 second=119 amount=-1 +kerning first=356 second=115 amount=-1 +kerning first=209 second=97 amount=-1 +kerning first=381 second=363 amount=-1 +kerning first=291 second=353 amount=-1 +kerning first=8222 second=221 amount=-2 +kerning first=283 second=314 amount=-1 +kerning first=288 second=356 amount=-1 +kerning first=366 second=45 amount=-1 +kerning first=1046 second=1060 amount=-1 +kerning first=8217 second=246 amount=-1 +kerning first=230 second=255 amount=-1 +kerning first=330 second=45 amount=-1 +kerning first=87 second=101 amount=-1 +kerning first=194 second=255 amount=-1 +kerning first=107 second=244 amount=-1 +kerning first=67 second=296 amount=-1 +kerning first=89 second=255 amount=-1 +kerning first=272 second=194 amount=-1 +kerning first=65 second=79 amount=-1 +kerning first=356 second=244 amount=-1 +kerning first=350 second=280 amount=-1 +kerning first=264 second=80 amount=-1 +kerning first=352 second=296 amount=-1 +kerning first=1114 second=1091 amount=-1 +kerning first=121 second=243 amount=-1 +kerning first=8217 second=103 amount=-1 +kerning first=1061 second=1095 amount=-1 +kerning first=352 second=46 amount=-1 +kerning first=244 second=46 amount=-1 +kerning first=219 second=352 amount=-1 +kerning first=264 second=203 amount=-1 +kerning first=84 second=83 amount=-1 +kerning first=187 second=77 amount=-1 +kerning first=262 second=264 amount=-1 +kerning first=352 second=330 amount=-1 +kerning first=115 second=347 amount=-1 +kerning first=256 second=347 amount=-1 +kerning first=218 second=380 amount=-1 +kerning first=268 second=71 amount=-1 +kerning first=356 second=266 amount=-1 +kerning first=196 second=71 amount=-1 +kerning first=362 second=380 amount=-1 +kerning first=118 second=225 amount=-1 +kerning first=45 second=65 amount=-1 +kerning first=199 second=200 amount=-1 +kerning first=208 second=46 amount=-1 +kerning first=85 second=230 amount=-1 +kerning first=376 second=71 amount=-1 +kerning first=226 second=8217 amount=-1 +kerning first=81 second=65 amount=-1 +kerning first=316 second=253 amount=-1 +kerning first=222 second=65 amount=-1 +kerning first=363 second=375 amount=-1 +kerning first=206 second=230 amount=-1 +kerning first=321 second=87 amount=-1 +kerning first=366 second=65 amount=-1 +kerning first=303 second=99 amount=-1 +kerning first=73 second=289 amount=-1 +kerning first=89 second=65 amount=-2 +kerning first=263 second=259 amount=-1 +kerning first=197 second=351 amount=-1 +kerning first=1043 second=1076 amount=-1 +kerning first=258 second=370 amount=-1 +kerning first=86 second=259 amount=-1 +kerning first=235 second=318 amount=-1 +kerning first=346 second=260 amount=-1 +kerning first=286 second=289 amount=-1 +kerning first=377 second=122 amount=-1 +kerning first=264 second=288 amount=-1 +kerning first=346 second=218 amount=-1 +kerning first=87 second=81 amount=-1 +kerning first=366 second=196 amount=-1 +kerning first=192 second=81 amount=-1 +kerning first=87 second=288 amount=-1 +kerning first=192 second=288 amount=-1 +kerning first=222 second=196 amount=-1 +kerning first=204 second=224 amount=-1 +kerning first=230 second=104 amount=-1 +kerning first=264 second=81 amount=-1 +kerning first=374 second=277 amount=-1 +kerning first=260 second=219 amount=-1 +kerning first=66 second=323 amount=-1 +kerning first=260 second=89 amount=-2 +kerning first=374 second=286 amount=-1 +kerning first=268 second=203 amount=-1 +kerning first=1036 second=1054 amount=-1 +kerning first=377 second=121 amount=-1 +kerning first=374 second=256 amount=-2 +kerning first=346 second=217 amount=-1 +kerning first=233 second=121 amount=-1 +kerning first=211 second=196 amount=-1 +kerning first=311 second=283 amount=-1 +kerning first=45 second=370 amount=-1 +kerning first=364 second=228 amount=-1 +kerning first=70 second=196 amount=-1 +kerning first=376 second=224 amount=-1 +kerning first=83 second=89 amount=-1 +kerning first=220 second=228 amount=-1 +kerning first=82 second=111 amount=-1 +kerning first=255 second=277 amount=-1 +kerning first=194 second=354 amount=-2 +kerning first=275 second=103 amount=-1 +kerning first=346 second=86 amount=-1 +kerning first=377 second=252 amount=-1 +kerning first=83 second=220 amount=-1 +kerning first=353 second=347 amount=-1 +kerning first=221 second=71 amount=-1 +kerning first=225 second=8221 amount=-1 +kerning first=118 second=246 amount=-1 +kerning first=338 second=103 amount=-1 +kerning first=261 second=8221 amount=-1 +kerning first=374 second=103 amount=-1 +kerning first=86 second=336 amount=-1 +kerning first=192 second=8217 amount=-1 +kerning first=266 second=103 amount=-1 +kerning first=82 second=246 amount=-1 +kerning first=302 second=103 amount=-1 +kerning first=313 second=354 amount=-1 +kerning first=354 second=8250 amount=-1 +kerning first=194 second=103 amount=-1 +kerning first=230 second=103 amount=-1 +kerning first=89 second=103 amount=-1 +kerning first=120 second=171 amount=-1 +kerning first=260 second=220 amount=-1 +kerning first=249 second=316 amount=-1 +kerning first=84 second=171 amount=-1 +kerning first=381 second=287 amount=-1 +kerning first=264 second=211 amount=-1 +kerning first=353 second=118 amount=-1 +kerning first=8250 second=260 amount=-1 +kerning first=81 second=44 amount=-1 +kerning first=364 second=97 amount=-1 +kerning first=253 second=232 amount=-1 +kerning first=8250 second=86 amount=-1 +kerning first=346 second=315 amount=-1 +kerning first=65 second=350 amount=-1 +kerning first=218 second=74 amount=-1 +kerning first=260 second=67 amount=-1 +kerning first=317 second=118 amount=-1 +kerning first=363 second=255 amount=-1 +kerning first=362 second=74 amount=-1 +kerning first=366 second=44 amount=-1 +kerning first=87 second=211 amount=-1 +kerning first=82 second=366 amount=-1 +kerning first=379 second=8249 amount=-1 +kerning first=86 second=216 amount=-1 +kerning first=8216 second=283 amount=-1 +kerning first=187 second=366 amount=-1 +kerning first=222 second=44 amount=-1 +kerning first=205 second=257 amount=-1 +kerning first=45 second=120 amount=-1 +kerning first=72 second=8249 amount=-1 +kerning first=84 second=193 amount=-2 +kerning first=356 second=267 amount=-1 +kerning first=89 second=234 amount=-1 +kerning first=350 second=209 amount=-1 +kerning first=268 second=72 amount=-1 +kerning first=104 second=118 amount=-1 +kerning first=374 second=234 amount=-1 +kerning first=107 second=267 amount=-1 +kerning first=350 second=78 amount=-1 +kerning first=286 second=192 amount=-1 +kerning first=83 second=198 amount=-1 +kerning first=87 second=331 amount=-1 +kerning first=66 second=302 amount=-1 +kerning first=90 second=251 amount=-1 +kerning first=66 second=280 amount=-1 +kerning first=356 second=245 amount=-1 +kerning first=268 second=315 amount=-1 +kerning first=323 second=361 amount=-1 +kerning first=231 second=318 amount=-1 +kerning first=214 second=192 amount=-1 +kerning first=256 second=250 amount=-1 +kerning first=368 second=198 amount=-1 +kerning first=107 second=245 amount=-1 +kerning first=332 second=198 amount=-1 +kerning first=1059 second=1074 amount=-1 +kerning first=66 second=378 amount=-1 +kerning first=1090 second=1113 amount=-1 +kerning first=1050 second=1073 amount=-1 +kerning first=209 second=227 amount=-1 +kerning first=82 second=268 amount=-1 +kerning first=369 second=291 amount=-1 +kerning first=87 second=233 amount=-1 +kerning first=115 second=119 amount=-1 +kerning first=78 second=287 amount=-1 +kerning first=328 second=119 amount=-1 +kerning first=315 second=378 amount=-1 +kerning first=66 second=204 amount=-1 +kerning first=84 second=291 amount=-1 +kerning first=222 second=256 amount=-1 +kerning first=67 second=198 amount=-1 +kerning first=74 second=227 amount=-1 +kerning first=344 second=314 amount=-1 +kerning first=89 second=337 amount=-1 +kerning first=45 second=256 amount=-1 +kerning first=208 second=198 amount=-1 +kerning first=81 second=256 amount=-1 +kerning first=377 second=291 amount=-1 +kerning first=321 second=90 amount=-1 +kerning first=352 second=198 amount=-1 +kerning first=269 second=291 amount=-1 +kerning first=233 second=291 amount=-1 +kerning first=354 second=67 amount=-1 +kerning first=197 second=291 amount=-1 +kerning first=82 second=244 amount=-1 +kerning first=216 second=44 amount=-1 +kerning first=118 second=244 amount=-1 +kerning first=288 second=44 amount=-1 +kerning first=84 second=210 amount=-1 +kerning first=346 second=354 amount=-1 +kerning first=86 second=378 amount=-1 +kerning first=111 second=44 amount=-1 +kerning first=253 second=101 amount=-1 +kerning first=344 second=84 amount=-1 +kerning first=289 second=318 amount=-1 +kerning first=374 second=337 amount=-1 +kerning first=323 second=227 amount=-1 +kerning first=366 second=256 amount=-1 +kerning first=287 second=227 amount=-1 +kerning first=86 second=8250 amount=-1 +kerning first=111 second=108 amount=-1 +kerning first=262 second=203 amount=-1 +kerning first=8222 second=356 amount=-2 +kerning first=199 second=336 amount=-1 +kerning first=87 second=198 amount=-2 +kerning first=187 second=73 amount=-1 +kerning first=290 second=89 amount=-1 +kerning first=252 second=108 amount=-1 +kerning first=381 second=361 amount=-1 +kerning first=81 second=197 amount=-1 +kerning first=45 second=197 amount=-1 +kerning first=221 second=263 amount=-1 +kerning first=266 second=278 amount=-1 +kerning first=65 second=286 amount=-1 +kerning first=222 second=197 amount=-1 +kerning first=1088 second=1076 amount=-1 +kerning first=73 second=367 amount=-1 +kerning first=316 second=106 amount=-1 +kerning first=8250 second=196 amount=-1 +kerning first=366 second=197 amount=-1 +kerning first=262 second=262 amount=-1 +kerning first=193 second=221 amount=-2 +kerning first=375 second=246 amount=-1 +kerning first=72 second=261 amount=-1 +kerning first=303 second=246 amount=-1 +kerning first=196 second=8249 amount=-1 +kerning first=304 second=8249 amount=-1 +kerning first=268 second=8249 amount=-1 +kerning first=8220 second=230 amount=-1 +kerning first=70 second=65 amount=-1 +kerning first=84 second=289 amount=-1 +kerning first=266 second=194 amount=-1 +kerning first=374 second=194 amount=-2 +kerning first=211 second=65 amount=-1 +kerning first=83 second=237 amount=-1 +kerning first=313 second=8220 amount=-1 +kerning first=369 second=289 amount=-1 +kerning first=86 second=260 amount=-2 +kerning first=70 second=45 amount=-1 +kerning first=88 second=338 amount=-1 +kerning first=89 second=194 amount=-2 +kerning first=89 second=8249 amount=-1 +kerning first=356 second=97 amount=-1 +kerning first=256 second=211 amount=-1 +kerning first=45 second=287 amount=-1 +kerning first=84 second=353 amount=-1 +kerning first=120 second=353 amount=-1 +kerning first=335 second=255 amount=-1 +kerning first=321 second=374 amount=-1 +kerning first=263 second=255 amount=-1 +kerning first=86 second=240 amount=-1 +kerning first=227 second=255 amount=-1 +kerning first=86 second=255 amount=-1 +kerning first=71 second=374 amount=-1 +kerning first=104 second=8221 amount=-1 +kerning first=371 second=240 amount=-1 +kerning first=8220 second=198 amount=-2 +kerning first=350 second=76 amount=-1 +kerning first=83 second=46 amount=-1 +kerning first=121 second=225 amount=-1 +kerning first=119 second=46 amount=-1 +kerning first=332 second=46 amount=-1 +kerning first=368 second=46 amount=-1 +kerning first=209 second=363 amount=-1 +kerning first=8220 second=232 amount=-1 +kerning first=119 second=242 amount=-1 +kerning first=220 second=226 amount=-1 +kerning first=268 second=323 amount=-1 +kerning first=45 second=310 amount=-1 +kerning first=364 second=226 amount=-1 +kerning first=1046 second=1104 amount=-1 +kerning first=207 second=225 amount=-1 +kerning first=66 second=225 amount=-1 +kerning first=222 second=192 amount=-1 +kerning first=207 second=259 amount=-1 +kerning first=45 second=192 amount=-1 +kerning first=221 second=224 amount=-1 +kerning first=217 second=193 amount=-1 +kerning first=330 second=224 amount=-1 +kerning first=256 second=290 amount=-1 +kerning first=264 second=213 amount=-1 +kerning first=244 second=375 amount=-1 +kerning first=192 second=213 amount=-1 +kerning first=316 second=375 amount=-1 +kerning first=87 second=213 amount=-1 +kerning first=213 second=46 amount=-1 +kerning first=187 second=204 amount=-1 +kerning first=8217 second=337 amount=-1 +kerning first=266 second=317 amount=-1 +kerning first=195 second=369 amount=-1 +kerning first=90 second=369 amount=-1 +kerning first=262 second=282 amount=-1 +kerning first=346 second=221 amount=-1 +kerning first=354 second=111 amount=-1 +kerning first=85 second=287 amount=-1 +kerning first=1070 second=1051 amount=-1 +kerning first=121 second=287 amount=-1 +kerning first=233 second=311 amount=-1 +kerning first=119 second=316 amount=-1 +kerning first=362 second=225 amount=-1 +kerning first=1043 second=1086 amount=-1 +kerning first=370 second=287 amount=-1 +kerning first=262 second=287 amount=-1 +kerning first=298 second=287 amount=-1 +kerning first=376 second=259 amount=-1 +kerning first=86 second=275 amount=-1 +kerning first=192 second=351 amount=-1 +kerning first=219 second=194 amount=-1 +kerning first=374 second=352 amount=-1 +kerning first=87 second=351 amount=-1 +kerning first=89 second=352 amount=-1 +kerning first=314 second=8217 amount=-1 +kerning first=66 second=74 amount=-1 +kerning first=194 second=352 amount=-1 +kerning first=286 second=46 amount=-1 +kerning first=303 second=231 amount=-1 +kerning first=264 second=327 amount=-1 +kerning first=1050 second=1038 amount=-1 +kerning first=120 second=254 amount=-1 +kerning first=118 second=269 amount=-1 +kerning first=82 second=269 amount=-1 +kerning first=120 second=261 amount=-1 +kerning first=316 second=121 amount=-1 +kerning first=244 second=121 amount=-1 +kerning first=346 second=374 amount=-1 +kerning first=118 second=229 amount=-1 +kerning first=1059 second=1085 amount=-1 +kerning first=287 second=115 amount=-1 +kerning first=375 second=231 amount=-1 +kerning first=363 second=253 amount=-1 +kerning first=258 second=212 amount=-1 +kerning first=195 second=350 amount=-1 +kerning first=86 second=334 amount=-1 +kerning first=65 second=8217 amount=-1 +kerning first=253 second=228 amount=-1 +kerning first=217 second=228 amount=-1 +kerning first=232 second=318 amount=-1 +kerning first=325 second=228 amount=-1 +kerning first=374 second=214 amount=-1 +kerning first=195 second=266 amount=-1 +kerning first=289 second=228 amount=-1 +kerning first=354 second=199 amount=-1 +kerning first=219 second=287 amount=-1 +kerning first=266 second=214 amount=-1 +kerning first=264 second=332 amount=-1 +kerning first=192 second=332 amount=-1 +kerning first=67 second=344 amount=-1 +kerning first=45 second=73 amount=-1 +kerning first=66 second=382 amount=-1 +kerning first=256 second=251 amount=-1 +kerning first=313 second=103 amount=-1 +kerning first=104 second=171 amount=-1 +kerning first=350 second=330 amount=-1 +kerning first=82 second=8217 amount=-1 +kerning first=196 second=362 amount=-1 +kerning first=209 second=171 amount=-1 +kerning first=277 second=103 amount=-1 +kerning first=194 second=214 amount=-1 +kerning first=317 second=8221 amount=-1 +kerning first=65 second=365 amount=-1 +kerning first=104 second=119 amount=-1 +kerning first=353 second=119 amount=-1 +kerning first=225 second=118 amount=-1 +kerning first=199 second=380 amount=-1 +kerning first=261 second=118 amount=-1 +kerning first=379 second=45 amount=-1 +kerning first=1040 second=1063 amount=-1 +kerning first=317 second=119 amount=-1 +kerning first=367 second=253 amount=-1 +kerning first=379 second=380 amount=-1 +kerning first=83 second=202 amount=-1 +kerning first=84 second=118 amount=-1 +kerning first=268 second=204 amount=-1 +kerning first=221 second=246 amount=-1 +kerning first=253 second=233 amount=-1 +kerning first=199 second=67 amount=-1 +kerning first=354 second=113 amount=-1 +kerning first=321 second=217 amount=-1 +kerning first=8250 second=354 amount=-1 +kerning first=369 second=118 amount=-1 +kerning first=369 second=314 amount=-1 +kerning first=333 second=314 amount=-1 +kerning first=45 second=315 amount=-1 +kerning first=369 second=8220 amount=-1 +kerning first=315 second=382 amount=-1 +kerning first=242 second=120 amount=-1 +kerning first=87 second=248 amount=-1 +kerning first=225 second=8220 amount=-1 +kerning first=82 second=264 amount=-1 +kerning first=376 second=283 amount=-1 +kerning first=261 second=8220 amount=-1 +kerning first=89 second=377 amount=-1 +kerning first=66 second=69 amount=-1 +kerning first=45 second=296 amount=-1 +kerning first=347 second=347 amount=-1 +kerning first=346 second=85 amount=-1 +kerning first=87 second=193 amount=-2 +kerning first=109 second=118 amount=-1 +kerning first=260 second=8217 amount=-1 +kerning first=66 second=332 amount=-1 +kerning first=264 second=193 amount=-1 +kerning first=1038 second=1117 amount=-1 +kerning first=260 second=85 amount=-1 +kerning first=1069 second=1059 amount=-1 +kerning first=195 second=8221 amount=-1 +kerning first=354 second=257 amount=-1 +kerning first=258 second=216 amount=-1 +kerning first=83 second=85 amount=-1 +kerning first=375 second=229 amount=-1 +kerning first=86 second=44 amount=-1 +kerning first=250 second=118 amount=-1 +kerning first=374 second=377 amount=-1 +kerning first=255 second=273 amount=-1 +kerning first=211 second=197 amount=-1 +kerning first=221 second=8249 amount=-1 +kerning first=211 second=192 amount=-1 +kerning first=70 second=197 amount=-1 +kerning first=279 second=287 amount=-1 +kerning first=120 second=250 amount=-1 +kerning first=70 second=192 amount=-1 +kerning first=321 second=289 amount=-1 +kerning first=1036 second=1077 amount=-1 +kerning first=336 second=193 amount=-1 +kerning first=44 second=8249 amount=-1 +kerning first=86 second=279 amount=-1 +kerning first=219 second=198 amount=-1 +kerning first=86 second=338 amount=-1 +kerning first=366 second=291 amount=-1 +kerning first=1024 second=1038 amount=-1 +kerning first=330 second=291 amount=-1 +kerning first=1060 second=1038 amount=-1 +kerning first=258 second=291 amount=-1 +kerning first=117 second=291 amount=-1 +kerning first=365 second=318 amount=-1 +kerning first=232 second=107 amount=-1 +kerning first=216 second=260 amount=-1 +kerning first=272 second=65 amount=-1 +kerning first=371 second=279 amount=-1 +kerning first=87 second=268 amount=-1 +kerning first=335 second=44 amount=-1 +kerning first=8220 second=271 amount=-1 +kerning first=221 second=67 amount=-1 +kerning first=288 second=260 amount=-1 +kerning first=263 second=44 amount=-1 +kerning first=199 second=72 amount=-1 +kerning first=196 second=199 amount=-1 +kerning first=376 second=113 amount=-1 +kerning first=204 second=227 amount=-1 +kerning first=268 second=199 amount=-1 +kerning first=264 second=268 amount=-1 +kerning first=8222 second=87 amount=-2 +kerning first=99 second=227 amount=-1 +kerning first=192 second=268 amount=-1 +kerning first=376 second=199 amount=-1 +kerning first=368 second=261 amount=-1 +kerning first=346 second=105 amount=-1 +kerning first=83 second=374 amount=-1 +kerning first=67 second=212 amount=-1 +kerning first=296 second=261 amount=-1 +kerning first=352 second=66 amount=-1 +kerning first=1043 second=1105 amount=-1 +kerning first=231 second=226 amount=-1 +kerning first=277 second=108 amount=-1 +kerning first=267 second=226 amount=-1 +kerning first=67 second=66 amount=-1 +kerning first=375 second=226 amount=-1 +kerning first=67 second=317 amount=-1 +kerning first=8216 second=271 amount=-1 +kerning first=344 second=98 amount=-1 +kerning first=356 second=44 amount=-1 +kerning first=205 second=229 amount=-1 +kerning first=264 second=122 amount=-1 +kerning first=8218 second=85 amount=-1 +kerning first=187 second=205 amount=-1 +kerning first=8250 second=220 amount=-1 +kerning first=87 second=122 amount=-1 +kerning first=119 second=261 amount=-1 +kerning first=121 second=115 amount=-1 +kerning first=8216 second=227 amount=-1 +kerning first=354 second=224 amount=-1 +kerning first=260 second=356 amount=-2 +kerning first=118 second=97 amount=-1 +kerning first=262 second=77 amount=-1 +kerning first=8250 second=378 amount=-1 +kerning first=350 second=310 amount=-1 +kerning first=371 second=339 amount=-1 +kerning first=77 second=225 amount=-1 +kerning first=380 second=45 amount=-1 +kerning first=66 second=206 amount=-1 +kerning first=236 second=45 amount=-1 +kerning first=252 second=255 amount=-1 +kerning first=221 second=243 amount=-1 +kerning first=82 second=368 amount=-1 +kerning first=350 second=325 amount=-1 +kerning first=187 second=89 amount=-1 +kerning first=344 second=45 amount=-1 +kerning first=187 second=368 amount=-1 +kerning first=75 second=255 amount=-1 +kerning first=195 second=211 amount=-1 +kerning first=323 second=287 amount=-1 +kerning first=111 second=255 amount=-1 +kerning first=8222 second=118 amount=-1 +kerning first=251 second=287 amount=-1 +kerning first=260 second=374 amount=-2 +kerning first=74 second=287 amount=-1 +kerning first=251 second=253 amount=-1 +kerning first=344 second=104 amount=-1 +kerning first=235 second=121 amount=-1 +kerning first=195 second=8217 amount=-1 +kerning first=199 second=202 amount=-1 +kerning first=284 second=46 amount=-1 +kerning first=66 second=109 amount=-1 +kerning first=119 second=380 amount=-1 +kerning first=368 second=380 amount=-1 +kerning first=381 second=251 amount=-1 +kerning first=221 second=111 amount=-1 +kerning first=311 second=248 amount=-1 +kerning first=356 second=264 amount=-1 +kerning first=311 second=233 amount=-1 +kerning first=89 second=253 amount=-1 +kerning first=220 second=350 amount=-1 +kerning first=362 second=382 amount=-1 +kerning first=256 second=350 amount=-1 +kerning first=194 second=253 amount=-1 +kerning first=268 second=69 amount=-1 +kerning first=376 second=74 amount=-1 +kerning first=364 second=350 amount=-1 +kerning first=316 second=8217 amount=-1 +kerning first=86 second=339 amount=-1 +kerning first=187 second=374 amount=-1 +kerning first=107 second=269 amount=-1 +kerning first=1036 second=1057 amount=-1 +kerning first=374 second=253 amount=-1 +kerning first=376 second=243 amount=-1 +kerning first=352 second=218 amount=-1 +kerning first=356 second=269 amount=-1 +kerning first=310 second=334 amount=-1 +kerning first=260 second=338 amount=-1 +kerning first=200 second=289 amount=-1 +kerning first=236 second=289 amount=-1 +kerning first=197 second=375 amount=-1 +kerning first=344 second=289 amount=-1 +kerning first=262 second=207 amount=-1 +kerning first=197 second=212 amount=-1 +kerning first=209 second=251 amount=-1 +kerning first=83 second=70 amount=-1 +kerning first=8220 second=65 amount=-2 +kerning first=263 second=289 amount=-1 +kerning first=206 second=369 amount=-1 +kerning first=8220 second=256 amount=-2 +kerning first=65 second=369 amount=-1 +kerning first=120 second=98 amount=-1 +kerning first=352 second=370 amount=-1 +kerning first=346 second=46 amount=-1 +kerning first=216 second=194 amount=-1 +kerning first=66 second=201 amount=-1 +kerning first=377 second=375 amount=-1 +kerning first=311 second=263 amount=-1 +kerning first=117 second=121 amount=-1 +kerning first=257 second=8220 amount=-1 +kerning first=363 second=119 amount=-1 +kerning first=233 second=375 amount=-1 +kerning first=356 second=346 amount=-1 +kerning first=269 second=375 amount=-1 +kerning first=65 second=81 amount=-1 +kerning first=221 second=259 amount=-1 +kerning first=234 second=119 amount=-1 +kerning first=193 second=89 amount=-2 +kerning first=83 second=217 amount=-1 +kerning first=283 second=291 amount=-1 +kerning first=352 second=256 amount=-1 +kerning first=269 second=261 amount=-1 +kerning first=106 second=291 amount=-1 +kerning first=1042 second=1093 amount=-1 +kerning first=70 second=291 amount=-1 +kerning first=268 second=298 amount=-1 +kerning first=208 second=256 amount=-1 +kerning first=354 second=187 amount=-1 +kerning first=250 second=314 amount=-1 +kerning first=347 second=351 amount=-1 +kerning first=67 second=256 amount=-1 +kerning first=363 second=121 amount=-1 +kerning first=1059 second=1082 amount=-1 +kerning first=344 second=8220 amount=-1 +kerning first=67 second=82 amount=-1 +kerning first=354 second=263 amount=-1 +kerning first=216 second=196 amount=-1 +kerning first=119 second=277 amount=-1 +kerning first=221 second=199 amount=-1 +kerning first=8217 second=352 amount=-1 +kerning first=303 second=101 amount=-1 +kerning first=288 second=84 amount=-1 +kerning first=206 second=228 amount=-1 +kerning first=321 second=85 amount=-1 +kerning first=344 second=333 amount=-1 +kerning first=197 second=86 amount=-2 +kerning first=86 second=235 amount=-1 +kerning first=112 second=120 amount=-1 +kerning first=84 second=234 amount=-1 +kerning first=218 second=382 amount=-1 +kerning first=371 second=235 amount=-1 +kerning first=87 second=83 amount=-1 +kerning first=346 second=220 amount=-1 +kerning first=235 second=316 amount=-1 +kerning first=192 second=83 amount=-1 +kerning first=71 second=354 amount=-1 +kerning first=266 second=68 amount=-1 +kerning first=264 second=83 amount=-1 +kerning first=256 second=171 amount=-1 +kerning first=220 second=171 amount=-1 +kerning first=328 second=171 amount=-1 +kerning first=256 second=8221 amount=-1 +kerning first=266 second=313 amount=-1 +kerning first=262 second=71 amount=-1 +kerning first=192 second=252 amount=-1 +kerning first=364 second=171 amount=-1 +kerning first=82 second=316 amount=-1 +kerning first=252 second=103 amount=-1 +kerning first=1061 second=1077 amount=-1 +kerning first=288 second=103 amount=-1 +kerning first=328 second=8221 amount=-1 +kerning first=325 second=365 amount=-1 +kerning first=88 second=71 amount=-1 +kerning first=346 second=103 amount=-1 +kerning first=67 second=214 amount=-1 +kerning first=274 second=103 amount=-1 +kerning first=253 second=246 amount=-1 +kerning first=344 second=100 amount=-1 +kerning first=202 second=103 amount=-1 +kerning first=8216 second=225 amount=-1 +kerning first=84 second=65 amount=-2 +kerning first=67 second=315 amount=-1 +kerning first=1036 second=1090 amount=-1 +kerning first=1102 second=1076 amount=-1 +kerning first=381 second=249 amount=-1 +kerning first=210 second=194 amount=-1 +kerning first=346 second=200 amount=-1 +kerning first=356 second=284 amount=-1 +kerning first=344 second=240 amount=-1 +kerning first=298 second=117 amount=-1 +kerning first=90 second=171 amount=-1 +kerning first=256 second=365 amount=-1 +kerning first=1036 second=1063 amount=-1 +kerning first=66 second=199 amount=-1 +kerning first=195 second=171 amount=-1 +kerning first=354 second=281 amount=-1 +kerning first=1059 second=1047 amount=-1 +kerning first=375 second=171 amount=-1 +kerning first=374 second=255 amount=-1 +kerning first=196 second=89 amount=-2 +kerning first=313 second=121 amount=-1 +kerning first=277 second=121 amount=-1 +kerning first=354 second=382 amount=-1 +kerning first=314 second=8221 amount=-1 +kerning first=313 second=218 amount=-1 +kerning first=275 second=118 amount=-1 +kerning first=315 second=364 amount=-1 +kerning first=79 second=260 amount=-1 +kerning first=347 second=118 amount=-1 +kerning first=269 second=228 amount=-1 +kerning first=65 second=8221 amount=-1 +kerning first=365 second=316 amount=-1 +kerning first=233 second=104 amount=-1 +kerning first=352 second=315 amount=-1 +kerning first=68 second=197 amount=-1 +kerning first=344 second=234 amount=-1 +kerning first=1059 second=1089 amount=-1 +kerning first=73 second=250 amount=-1 +kerning first=221 second=290 amount=-1 +kerning first=194 second=86 amount=-2 +kerning first=8220 second=335 amount=-1 +kerning first=315 second=87 amount=-1 +kerning first=82 second=248 amount=-1 +kerning first=253 second=347 amount=-1 +kerning first=8220 second=337 amount=-1 +kerning first=1060 second=1040 amount=-1 +kerning first=8217 second=240 amount=-1 +kerning first=284 second=65 amount=-1 +kerning first=221 second=380 amount=-1 +kerning first=86 second=90 amount=-1 +kerning first=77 second=8249 amount=-1 +kerning first=66 second=305 amount=-1 +kerning first=266 second=198 amount=-1 +kerning first=67 second=192 amount=-1 +kerning first=374 second=44 amount=-1 +kerning first=8216 second=193 amount=-2 +kerning first=374 second=198 amount=-2 +kerning first=218 second=8249 amount=-1 +kerning first=90 second=363 amount=-1 +kerning first=195 second=363 amount=-1 +kerning first=199 second=204 amount=-1 +kerning first=376 second=67 amount=-1 +kerning first=363 second=291 amount=-1 +kerning first=327 second=291 amount=-1 +kerning first=268 second=67 amount=-1 +kerning first=302 second=250 amount=-1 +kerning first=255 second=291 amount=-1 +kerning first=219 second=291 amount=-1 +kerning first=8250 second=200 amount=-1 +kerning first=78 second=291 amount=-1 +kerning first=321 second=378 amount=-1 +kerning first=196 second=67 amount=-1 +kerning first=89 second=113 amount=-1 +kerning first=8222 second=217 amount=-1 +kerning first=230 second=44 amount=-1 +kerning first=83 second=72 amount=-1 +kerning first=204 second=287 amount=-1 +kerning first=194 second=361 amount=-1 +kerning first=99 second=287 amount=-1 +kerning first=89 second=198 amount=-2 +kerning first=192 second=367 amount=-1 +kerning first=8250 second=327 amount=-1 +kerning first=8250 second=103 amount=-1 +kerning first=230 second=108 amount=-1 +kerning first=8217 second=260 amount=-2 +kerning first=356 second=326 amount=-1 +kerning first=256 second=286 amount=-1 +kerning first=80 second=74 amount=-1 +kerning first=221 second=74 amount=-1 +kerning first=66 second=221 amount=-1 +kerning first=194 second=249 amount=-1 +kerning first=171 second=221 amount=-1 +kerning first=73 second=228 amount=-1 +kerning first=356 second=262 amount=-1 +kerning first=89 second=262 amount=-1 +kerning first=264 second=206 amount=-1 +kerning first=326 second=8249 amount=-1 +kerning first=290 second=8249 amount=-1 +kerning first=235 second=107 amount=-1 +kerning first=8250 second=68 amount=-1 +kerning first=108 second=8221 amount=-1 +kerning first=195 second=264 amount=-1 +kerning first=283 second=289 amount=-1 +kerning first=325 second=367 amount=-1 +kerning first=193 second=115 amount=-1 +kerning first=352 second=86 amount=-1 +kerning first=266 second=66 amount=-1 +kerning first=85 second=97 amount=-1 +kerning first=321 second=356 amount=-1 +kerning first=121 second=97 amount=-1 +kerning first=84 second=45 amount=-1 +kerning first=120 second=45 amount=-1 +kerning first=298 second=97 amount=-1 +kerning first=354 second=261 amount=-1 +kerning first=378 second=112 amount=-1 +kerning first=115 second=121 amount=-1 +kerning first=362 second=257 amount=-1 +kerning first=8250 second=202 amount=-1 +kerning first=8217 second=196 amount=-2 +kerning first=321 second=255 amount=-1 +kerning first=82 second=119 amount=-1 +kerning first=108 second=255 amount=-1 +kerning first=206 second=226 amount=-1 +kerning first=291 second=44 amount=-1 +kerning first=195 second=81 amount=-1 +kerning first=255 second=44 amount=-1 +kerning first=356 second=227 amount=-1 +kerning first=259 second=119 amount=-1 +kerning first=187 second=119 amount=-1 +kerning first=367 second=119 amount=-1 +kerning first=370 second=97 amount=-1 +kerning first=275 second=314 amount=-1 +kerning first=376 second=109 amount=-1 +kerning first=376 second=111 amount=-1 +kerning first=295 second=119 amount=-1 +kerning first=331 second=119 amount=-1 +kerning first=98 second=314 amount=-1 +kerning first=303 second=233 amount=-1 +kerning first=256 second=363 amount=-1 +kerning first=1025 second=1038 amount=-1 +kerning first=1061 second=1057 amount=-1 +kerning first=335 second=46 amount=-1 +kerning first=205 second=251 amount=-1 +kerning first=114 second=44 amount=-1 +kerning first=354 second=338 amount=-1 +kerning first=347 second=121 amount=-1 +kerning first=82 second=79 amount=-1 +kerning first=219 second=44 amount=-1 +kerning first=352 second=192 amount=-1 +kerning first=8216 second=287 amount=-1 +kerning first=70 second=289 amount=-1 +kerning first=208 second=192 amount=-1 +kerning first=106 second=289 amount=-1 +kerning first=83 second=354 amount=-1 +kerning first=86 second=46 amount=-1 +kerning first=283 second=311 amount=-1 +kerning first=260 second=354 amount=-2 +kerning first=325 second=369 amount=-1 +kerning first=354 second=283 amount=-1 +kerning first=375 second=46 amount=-1 +kerning first=65 second=213 amount=-1 +kerning first=246 second=316 amount=-1 +kerning first=1050 second=1077 amount=-1 +kerning first=99 second=291 amount=-1 +kerning first=84 second=197 amount=-2 +kerning first=8217 second=198 amount=-2 +kerning first=217 second=83 amount=-1 +kerning first=354 second=259 amount=-1 +kerning first=259 second=8220 amount=-1 +kerning first=258 second=375 amount=-1 +kerning first=225 second=8217 amount=-1 +kerning first=117 second=375 amount=-1 +kerning first=196 second=87 amount=-2 +kerning first=206 second=225 amount=-1 +kerning first=263 second=103 amount=-1 +kerning first=221 second=336 amount=-1 +kerning first=8220 second=192 amount=-2 +kerning first=86 second=103 amount=-1 +kerning first=350 second=270 amount=-1 +kerning first=1061 second=1092 amount=-1 +kerning first=255 second=335 amount=-1 +kerning first=256 second=8217 amount=-1 +kerning first=288 second=374 amount=-1 +kerning first=328 second=8217 amount=-1 +kerning first=214 second=65 amount=-1 +kerning first=315 second=219 amount=-1 +kerning first=286 second=65 amount=-1 +kerning first=66 second=219 amount=-1 +kerning first=266 second=260 amount=-1 +kerning first=313 second=253 amount=-1 +kerning first=258 second=353 amount=-1 +kerning first=277 second=253 amount=-1 +kerning first=67 second=284 amount=-1 +kerning first=344 second=212 amount=-1 +kerning first=374 second=121 amount=-1 +kerning first=89 second=260 amount=-2 +kerning first=1047 second=1059 amount=-1 +kerning first=194 second=121 amount=-1 +kerning first=356 second=328 amount=-1 +kerning first=254 second=318 amount=-1 +kerning first=374 second=260 amount=-2 +kerning first=266 second=196 amount=-1 +kerning first=119 second=235 amount=-1 +kerning first=286 second=84 amount=-1 +kerning first=111 second=121 amount=-1 +kerning first=89 second=196 amount=-2 +kerning first=232 second=316 amount=-1 +kerning first=315 second=89 amount=-1 +kerning first=86 second=242 amount=-1 +kerning first=65 second=171 amount=-1 +kerning first=107 second=99 amount=-1 +kerning first=89 second=382 amount=-1 +kerning first=171 second=89 amount=-1 +kerning first=374 second=196 amount=-2 +kerning first=66 second=89 amount=-1 +kerning first=206 second=171 amount=-1 +kerning first=262 second=302 amount=-1 +kerning first=356 second=99 amount=-1 +kerning first=376 second=263 amount=-1 +kerning first=256 second=213 amount=-1 +kerning first=344 second=375 amount=-1 +kerning first=317 second=375 amount=-1 +kerning first=290 second=221 amount=-1 +kerning first=199 second=323 amount=-1 +kerning first=371 second=242 amount=-1 +kerning first=8250 second=374 amount=-1 +kerning first=84 second=351 amount=-1 +kerning first=120 second=351 amount=-1 +kerning first=45 second=82 amount=-1 +kerning first=87 second=347 amount=-1 +kerning first=119 second=224 amount=-1 +kerning first=192 second=347 amount=-1 +kerning first=321 second=103 amount=-1 +kerning first=98 second=120 amount=-1 +kerning first=102 second=8249 amount=-1 +kerning first=256 second=266 amount=-1 +kerning first=86 second=253 amount=-1 +kerning first=66 second=8249 amount=-1 +kerning first=227 second=253 amount=-1 +kerning first=313 second=220 amount=-1 +kerning first=199 second=334 amount=-1 +kerning first=72 second=103 amount=-1 +kerning first=263 second=253 amount=-1 +kerning first=108 second=103 amount=-1 +kerning first=197 second=214 amount=-1 +kerning first=335 second=253 amount=-1 +kerning first=296 second=224 amount=-1 +kerning first=321 second=354 amount=-1 +kerning first=368 second=224 amount=-1 +kerning first=344 second=232 amount=-1 +kerning first=352 second=313 amount=-1 +kerning first=118 second=231 amount=-1 +kerning first=350 second=171 amount=-1 +kerning first=346 second=202 amount=-1 +kerning first=66 second=362 amount=-1 +kerning first=221 second=382 amount=-1 +kerning first=90 second=365 amount=-1 +kerning first=315 second=362 amount=-1 +kerning first=67 second=313 amount=-1 +kerning first=219 second=227 amount=-1 +kerning first=82 second=284 amount=-1 +kerning first=195 second=365 amount=-1 +kerning first=323 second=117 amount=-1 +kerning first=368 second=257 amount=-1 +kerning first=97 second=255 amount=-1 +kerning first=67 second=216 amount=-1 +kerning first=296 second=257 amount=-1 +kerning first=376 second=338 amount=-1 +kerning first=193 second=287 amount=-1 +kerning first=196 second=338 amount=-1 +kerning first=268 second=338 amount=-1 +kerning first=87 second=118 amount=-1 +kerning first=76 second=8221 amount=-1 +kerning first=368 second=378 amount=-1 +kerning first=192 second=118 amount=-1 +kerning first=187 second=209 amount=-1 +kerning first=228 second=118 amount=-1 +kerning first=8217 second=339 amount=-1 +kerning first=245 second=108 amount=-1 +kerning first=354 second=74 amount=-1 +kerning first=195 second=290 amount=-1 +kerning first=371 second=275 amount=-1 +kerning first=377 second=382 amount=-1 +kerning first=350 second=193 amount=-1 +kerning first=121 second=269 amount=-1 +kerning first=364 second=380 amount=-1 +kerning first=249 second=253 amount=-1 +kerning first=121 second=227 amount=-1 +kerning first=85 second=227 amount=-1 +kerning first=197 second=84 amount=-2 +kerning first=1061 second=1090 amount=-1 +kerning first=1025 second=1090 amount=-1 +kerning first=121 second=273 amount=-1 +kerning first=352 second=291 amount=-1 +kerning first=344 second=210 amount=-1 +kerning first=316 second=291 amount=-1 +kerning first=280 second=291 amount=-1 +kerning first=195 second=332 amount=-1 +kerning first=211 second=198 amount=-1 +kerning first=221 second=81 amount=-1 +kerning first=1069 second=1051 amount=-1 +kerning first=262 second=280 amount=-1 +kerning first=8250 second=352 amount=-1 +kerning first=99 second=44 amount=-1 +kerning first=262 second=73 amount=-1 +kerning first=66 second=67 amount=-1 +kerning first=65 second=268 amount=-1 +kerning first=255 second=337 amount=-1 +kerning first=211 second=256 amount=-1 +kerning first=370 second=227 amount=-1 +kerning first=119 second=378 amount=-1 +kerning first=298 second=227 amount=-1 +kerning first=277 second=44 amount=-1 +kerning first=253 second=226 amount=-1 +kerning first=217 second=226 amount=-1 +kerning first=325 second=226 amount=-1 +kerning first=67 second=194 amount=-1 +kerning first=289 second=226 amount=-1 +kerning first=8217 second=350 amount=-1 +kerning first=352 second=84 amount=-1 +kerning first=208 second=194 amount=-1 +kerning first=374 second=240 amount=-1 +kerning first=344 second=254 amount=-1 +kerning first=356 second=119 amount=-1 +kerning first=339 second=103 amount=-1 +kerning first=196 second=219 amount=-1 +kerning first=291 second=108 amount=-1 +kerning first=363 second=108 amount=-1 +kerning first=8220 second=291 amount=-1 +kerning first=255 second=108 amount=-1 +kerning first=83 second=105 amount=-1 +kerning first=288 second=198 amount=-1 +kerning first=117 second=289 amount=-1 +kerning first=45 second=289 amount=-1 +kerning first=203 second=289 amount=-1 +kerning first=258 second=8220 amount=-1 +kerning first=330 second=289 amount=-1 +kerning first=119 second=279 amount=-1 +kerning first=258 second=289 amount=-1 +kerning first=117 second=8220 amount=-1 +kerning first=221 second=338 amount=-1 +kerning first=206 second=367 amount=-1 +kerning first=65 second=367 amount=-1 +kerning first=192 second=115 amount=-1 +kerning first=356 second=229 amount=-1 +kerning first=72 second=257 amount=-1 +kerning first=81 second=192 amount=-1 +kerning first=262 second=205 amount=-1 +kerning first=288 second=289 amount=-1 +kerning first=89 second=240 amount=-1 +kerning first=8222 second=85 amount=-1 +kerning first=65 second=83 amount=-1 +kerning first=221 second=261 amount=-1 +kerning first=73 second=45 amount=-1 +kerning first=1038 second=1060 amount=-1 +kerning first=310 second=255 amount=-1 +kerning first=352 second=194 amount=-1 +kerning first=45 second=278 amount=-1 +kerning first=286 second=45 amount=-1 +kerning first=214 second=197 amount=-1 +kerning first=353 second=112 amount=-1 +kerning first=83 second=356 amount=-1 +kerning first=74 second=225 amount=-1 +kerning first=354 second=380 amount=-1 +kerning first=256 second=81 amount=-1 +kerning first=1036 second=1092 amount=-1 +kerning first=287 second=225 amount=-1 +kerning first=231 second=121 amount=-1 +kerning first=194 second=218 amount=-1 +kerning first=267 second=105 amount=-1 +kerning first=84 second=244 amount=-1 +kerning first=221 second=109 amount=-1 +kerning first=354 second=336 amount=-1 +kerning first=323 second=225 amount=-1 +kerning first=111 second=253 amount=-1 +kerning first=104 second=8217 amount=-1 +kerning first=8216 second=267 amount=-1 +kerning first=75 second=253 amount=-1 +kerning first=253 second=248 amount=-1 +kerning first=317 second=8217 amount=-1 +kerning first=252 second=253 amount=-1 +kerning first=288 second=46 amount=-1 +kerning first=8217 second=245 amount=-1 +kerning first=216 second=46 amount=-1 +kerning first=193 second=364 amount=-1 +kerning first=221 second=283 amount=-1 +kerning first=268 second=382 amount=-1 +kerning first=376 second=382 amount=-1 +kerning first=66 second=71 amount=-1 +kerning first=376 second=241 amount=-1 +kerning first=66 second=318 amount=-1 +kerning first=102 second=318 amount=1 +kerning first=243 second=318 amount=-1 +kerning first=219 second=260 amount=-1 +kerning first=279 second=318 amount=-1 +kerning first=192 second=369 amount=-1 +kerning first=366 second=289 amount=-1 +kerning first=84 second=122 amount=-1 +kerning first=256 second=288 amount=-1 +kerning first=346 second=70 amount=-1 +kerning first=1038 second=1104 amount=-1 +kerning first=122 second=8249 amount=-1 +kerning first=1091 second=1076 amount=-1 +kerning first=111 second=46 amount=-1 +kerning first=118 second=99 amount=-1 +kerning first=82 second=99 amount=-1 +kerning first=73 second=230 amount=-1 +kerning first=86 second=352 amount=-1 +kerning first=83 second=323 amount=-1 +kerning first=283 second=375 amount=-1 +kerning first=370 second=346 amount=-1 +kerning first=255 second=271 amount=-1 +kerning first=106 second=375 amount=-1 +kerning first=262 second=346 amount=-1 +kerning first=8217 second=273 amount=-1 +kerning first=65 second=374 amount=-2 +kerning first=85 second=346 amount=-1 +kerning first=298 second=230 amount=-1 +kerning first=97 second=253 amount=-1 +kerning first=87 second=334 amount=-1 +kerning first=45 second=352 amount=-1 +kerning first=120 second=112 amount=-1 +kerning first=85 second=103 amount=-1 +kerning first=302 second=369 amount=-1 +kerning first=194 second=369 amount=-1 +kerning first=370 second=230 amount=-1 +kerning first=8250 second=72 amount=-1 +kerning first=362 second=346 amount=-1 +kerning first=310 second=253 amount=-1 +kerning first=379 second=363 amount=-1 +kerning first=375 second=122 amount=-1 +kerning first=121 second=230 amount=-1 +kerning first=218 second=346 amount=-1 +kerning first=333 second=375 amount=-1 +kerning first=369 second=375 amount=-1 +kerning first=264 second=334 amount=-1 +kerning first=8217 second=192 amount=-2 +kerning first=344 second=116 amount=-1 +kerning first=65 second=216 amount=-1 +kerning first=368 second=193 amount=-1 +kerning first=258 second=219 amount=-1 +kerning first=45 second=219 amount=-1 +kerning first=200 second=287 amount=-1 +kerning first=327 second=287 amount=-1 +kerning first=236 second=287 amount=-1 +kerning first=210 second=196 amount=-1 +kerning first=317 second=121 amount=-1 +kerning first=281 second=121 amount=-1 +kerning first=245 second=121 amount=-1 +kerning first=103 second=171 amount=-1 +kerning first=67 second=171 amount=-1 +kerning first=344 second=277 amount=-1 +kerning first=356 second=231 amount=-1 +kerning first=344 second=287 amount=-1 +kerning first=352 second=171 amount=-1 +kerning first=354 second=196 amount=-2 +kerning first=316 second=171 amount=-1 +kerning first=120 second=375 amount=-1 +kerning first=255 second=99 amount=-1 +kerning first=86 second=351 amount=-1 +kerning first=90 second=122 amount=-1 +kerning first=196 second=8217 amount=-1 +kerning first=366 second=224 amount=-1 +kerning first=195 second=352 amount=-1 +kerning first=82 second=212 amount=-1 +kerning first=217 second=74 amount=-1 +kerning first=376 second=115 amount=-1 +kerning first=366 second=229 amount=-1 +kerning first=330 second=229 amount=-1 +kerning first=346 second=197 amount=-1 +kerning first=119 second=382 amount=-1 +kerning first=1047 second=1063 amount=-1 +kerning first=199 second=310 amount=-1 +kerning first=352 second=220 amount=-1 +kerning first=356 second=379 amount=-1 +kerning first=264 second=344 amount=-1 +kerning first=368 second=382 amount=-1 +kerning first=82 second=350 amount=-1 +kerning first=314 second=103 amount=-1 +kerning first=303 second=234 amount=-1 +kerning first=350 second=103 amount=-1 +kerning first=187 second=350 amount=-1 +kerning first=118 second=100 amount=-1 +kerning first=8217 second=271 amount=-1 +kerning first=82 second=100 amount=-1 +kerning first=75 second=71 amount=-1 +kerning first=45 second=68 amount=-1 +kerning first=88 second=199 amount=-1 +kerning first=196 second=290 amount=-1 +kerning first=120 second=365 amount=-1 +kerning first=206 second=103 amount=-1 +kerning first=193 second=199 amount=-1 +kerning first=65 second=103 amount=-1 +kerning first=113 second=106 amount=1 +kerning first=268 second=76 amount=-1 +kerning first=381 second=117 amount=-1 +kerning first=287 second=318 amount=-1 +kerning first=194 second=251 amount=-1 +kerning first=107 second=231 amount=-1 +kerning first=350 second=313 amount=-1 +kerning first=199 second=284 amount=-1 +kerning first=199 second=68 amount=-1 +kerning first=226 second=118 amount=-1 +kerning first=120 second=257 amount=-1 +kerning first=330 second=117 amount=-1 +kerning first=258 second=117 amount=-1 +kerning first=256 second=332 amount=-1 +kerning first=302 second=251 amount=-1 +kerning first=346 second=102 amount=-1 +kerning first=375 second=283 amount=-1 +kerning first=323 second=257 amount=-1 +kerning first=354 second=81 amount=-1 +kerning first=264 second=216 amount=-1 +kerning first=67 second=378 amount=-1 +kerning first=8218 second=89 amount=-2 +kerning first=369 second=316 amount=-1 +kerning first=45 second=291 amount=-1 +kerning first=333 second=316 amount=-1 +kerning first=303 second=283 amount=-1 +kerning first=327 second=250 amount=-1 +kerning first=65 second=264 amount=-1 +kerning first=86 second=233 amount=-1 +kerning first=1059 second=1076 amount=-1 +kerning first=346 second=72 amount=-1 +kerning first=98 second=121 amount=-1 +kerning first=45 second=194 amount=-1 +kerning first=195 second=362 amount=-1 +kerning first=376 second=266 amount=-1 +kerning first=289 second=314 amount=-1 +kerning first=253 second=314 amount=-1 +kerning first=8220 second=289 amount=-1 +kerning first=363 second=8220 amount=-1 +kerning first=268 second=266 amount=-1 +kerning first=112 second=314 amount=-1 +kerning first=45 second=298 amount=-1 +kerning first=196 second=217 amount=-1 +kerning first=8216 second=337 amount=-1 +kerning first=263 second=227 amount=-1 +kerning first=78 second=250 amount=-1 +kerning first=192 second=216 amount=-1 +kerning first=87 second=216 amount=-1 +kerning first=266 second=192 amount=-1 +kerning first=251 second=8220 amount=-1 +kerning first=291 second=378 amount=-1 +kerning first=283 second=107 amount=-1 +kerning first=255 second=378 amount=-1 +kerning first=78 second=224 amount=-1 +kerning first=89 second=192 amount=-2 +kerning first=374 second=350 amount=-1 +kerning first=110 second=8220 amount=-1 +kerning first=70 second=256 amount=-1 +kerning first=374 second=187 amount=-1 +kerning first=1046 second=1077 amount=-1 +kerning first=99 second=225 amount=-1 +kerning first=286 second=256 amount=-1 +kerning first=207 second=227 amount=-1 +kerning first=350 second=354 amount=-1 +kerning first=66 second=227 amount=-1 +kerning first=313 second=90 amount=-1 +kerning first=344 second=67 amount=-1 +kerning first=367 second=291 amount=-1 +kerning first=214 second=256 amount=-1 +kerning first=66 second=336 amount=-1 +kerning first=187 second=291 amount=-1 +kerning first=118 second=291 amount=-1 +kerning first=195 second=83 amount=-1 +kerning first=82 second=291 amount=-1 +kerning first=80 second=197 amount=-1 +kerning first=197 second=210 amount=-1 +kerning first=221 second=187 amount=-1 +kerning first=377 second=8249 amount=-1 +kerning first=221 second=197 amount=-2 +kerning first=1036 second=1060 amount=-1 +kerning first=221 second=100 amount=-1 +kerning first=8250 second=253 amount=-1 +kerning first=256 second=112 amount=-1 +kerning first=260 second=284 amount=-1 +kerning first=115 second=112 amount=-1 +kerning first=75 second=262 amount=-1 +kerning first=197 second=8249 amount=-1 +kerning first=118 second=261 amount=-1 +kerning first=218 second=378 amount=-1 +kerning first=73 second=365 amount=-1 +kerning first=305 second=8249 amount=-1 +kerning first=83 second=303 amount=-1 +kerning first=99 second=318 amount=-1 +kerning first=103 second=108 amount=-1 +kerning first=121 second=279 amount=-1 +kerning first=244 second=108 amount=-1 +kerning first=240 second=318 amount=-1 +kerning first=272 second=198 amount=-1 +kerning first=87 second=65 amount=-2 +kerning first=268 second=206 amount=-1 +kerning first=8218 second=122 amount=-1 +kerning first=8216 second=97 amount=-1 +kerning first=352 second=89 amount=-1 +kerning first=208 second=260 amount=-1 +kerning first=204 second=367 amount=-1 +kerning first=66 second=66 amount=-1 +kerning first=310 second=336 amount=-1 +kerning first=336 second=65 amount=-1 +kerning first=8250 second=218 amount=-1 +kerning first=67 second=260 amount=-1 +kerning first=1027 second=1104 amount=-1 +kerning first=89 second=339 amount=-1 +kerning first=269 second=229 amount=-1 +kerning first=352 second=260 amount=-1 +kerning first=351 second=115 amount=-1 +kerning first=8250 second=381 amount=-1 +kerning first=253 second=353 amount=-1 +kerning first=289 second=353 amount=-1 +kerning first=209 second=369 amount=-1 +kerning first=354 second=275 amount=-1 +kerning first=83 second=205 amount=-1 +kerning first=65 second=221 amount=-2 +kerning first=344 second=356 amount=-1 +kerning first=66 second=115 amount=-1 +kerning first=220 second=352 amount=-1 +kerning first=220 second=194 amount=-1 +kerning first=256 second=352 amount=-1 +kerning first=374 second=290 amount=-1 +kerning first=266 second=80 amount=-1 +kerning first=44 second=45 amount=-1 +kerning first=315 second=8217 amount=-1 +kerning first=80 second=45 amount=-1 +kerning first=364 second=194 amount=-1 +kerning first=121 second=267 amount=-1 +kerning first=234 second=375 amount=-1 +kerning first=354 second=287 amount=-1 +kerning first=86 second=223 amount=-1 +kerning first=256 second=366 amount=-1 +kerning first=369 second=119 amount=-1 +kerning first=263 second=118 amount=-1 +kerning first=374 second=339 amount=-1 +kerning first=364 second=352 amount=-1 +kerning first=221 second=45 amount=-1 +kerning first=79 second=194 amount=-1 +kerning first=217 second=225 amount=-1 +kerning first=354 second=226 amount=-1 +kerning first=374 second=211 amount=-1 +kerning first=371 second=111 amount=-1 +kerning first=86 second=81 amount=-1 +kerning first=8218 second=362 amount=-1 +kerning first=289 second=225 amount=-1 +kerning first=325 second=225 amount=-1 +kerning first=89 second=290 amount=-1 +kerning first=89 second=211 amount=-1 +kerning first=99 second=97 amount=-1 +kerning first=76 second=255 amount=-1 +kerning first=194 second=290 amount=-1 +kerning first=112 second=255 amount=-1 +kerning first=204 second=97 amount=-1 +kerning first=266 second=290 amount=-1 +kerning first=266 second=211 amount=-1 +kerning first=356 second=110 amount=-1 +kerning first=87 second=212 amount=-1 +kerning first=194 second=211 amount=-1 +kerning first=332 second=44 amount=-1 +kerning first=8222 second=84 amount=-2 +kerning first=375 second=273 amount=-1 +kerning first=195 second=89 amount=-2 +kerning first=197 second=338 amount=-1 +kerning first=354 second=324 amount=-1 +kerning first=214 second=46 amount=-1 +kerning first=86 second=193 amount=-2 +kerning first=87 second=324 amount=-1 +kerning first=66 second=257 amount=-1 +kerning first=102 second=8220 amount=1 +kerning first=269 second=289 amount=-1 +kerning first=86 second=111 amount=-1 +kerning first=82 second=370 amount=-1 +kerning first=377 second=289 amount=-1 +kerning first=89 second=241 amount=-1 +kerning first=223 second=255 amount=-1 +kerning first=84 second=287 amount=-1 +kerning first=369 second=287 amount=-1 +kerning first=1050 second=1108 amount=-1 +kerning first=89 second=281 amount=-1 +kerning first=315 second=218 amount=-1 +kerning first=376 second=232 amount=-1 +kerning first=1059 second=1092 amount=-1 +kerning first=206 second=365 amount=-1 +kerning first=193 second=346 amount=-1 +kerning first=44 second=8217 amount=-1 +kerning first=8217 second=232 amount=-1 +kerning first=187 second=380 amount=-1 +kerning first=98 second=46 amount=-1 +kerning first=286 second=86 amount=-1 +kerning first=118 second=380 amount=-1 +kerning first=275 second=46 amount=-1 +kerning first=87 second=225 amount=-1 +kerning first=257 second=8217 amount=-1 +kerning first=365 second=8217 amount=-1 +kerning first=66 second=266 amount=-1 +kerning first=104 second=8220 amount=-1 +kerning first=197 second=347 amount=-1 +kerning first=8220 second=260 amount=-2 +kerning first=187 second=70 amount=-1 +kerning first=67 second=201 amount=-1 +kerning first=364 second=122 amount=-1 +kerning first=290 second=87 amount=-1 +kerning first=356 second=226 amount=-1 +kerning first=220 second=122 amount=-1 +kerning first=78 second=289 amount=-1 +kerning first=366 second=259 amount=-1 +kerning first=330 second=259 amount=-1 +kerning first=250 second=375 amount=-1 +kerning first=255 second=289 amount=-1 +kerning first=187 second=75 amount=-1 +kerning first=66 second=218 amount=-1 +kerning first=268 second=75 amount=-1 +kerning first=317 second=370 amount=-1 +kerning first=219 second=289 amount=-1 +kerning first=8217 second=242 amount=-1 +kerning first=327 second=289 amount=-1 +kerning first=363 second=289 amount=-1 +kerning first=205 second=369 amount=-1 +kerning first=327 second=251 amount=-1 +kerning first=78 second=251 amount=-1 +kerning first=337 second=255 amount=-1 +kerning first=221 second=286 amount=-1 +kerning first=344 second=316 amount=-1 +kerning first=1027 second=1072 amount=-1 +kerning first=119 second=245 amount=-1 +kerning first=78 second=171 amount=-1 +kerning first=256 second=121 amount=-1 +kerning first=255 second=171 amount=-1 +kerning first=219 second=171 amount=-1 +kerning first=327 second=171 amount=-1 +kerning first=45 second=80 amount=-1 +kerning first=291 second=171 amount=-1 +kerning first=84 second=277 amount=-1 +kerning first=86 second=381 amount=-1 +kerning first=8220 second=229 amount=-1 +kerning first=352 second=323 amount=-1 +kerning first=8250 second=330 amount=-1 +kerning first=199 second=196 amount=-1 +kerning first=66 second=217 amount=-1 +kerning first=356 second=100 amount=-1 +kerning first=120 second=228 amount=-1 +kerning first=101 second=314 amount=-1 +kerning first=310 second=214 amount=-1 +kerning first=226 second=119 amount=-1 +kerning first=1059 second=1093 amount=-1 +kerning first=82 second=221 amount=-1 +kerning first=84 second=228 amount=-1 +kerning first=315 second=217 amount=-1 +kerning first=187 second=221 amount=-1 +kerning first=8220 second=259 amount=-1 +kerning first=187 second=379 amount=-1 +kerning first=8222 second=354 amount=-2 +kerning first=242 second=314 amount=-1 +kerning first=106 second=8249 amount=-1 +kerning first=108 second=253 amount=-1 +kerning first=86 second=263 amount=-1 +kerning first=379 second=382 amount=-1 +kerning first=266 second=330 amount=-1 +kerning first=321 second=253 amount=-1 +kerning first=260 second=363 amount=-1 +kerning first=371 second=263 amount=-1 +kerning first=86 second=71 amount=-1 +kerning first=87 second=246 amount=-1 +kerning first=325 second=103 amount=-1 +kerning first=70 second=8249 amount=-1 +kerning first=217 second=103 amount=-1 +kerning first=107 second=100 amount=-1 +kerning first=253 second=103 amount=-1 +kerning first=110 second=118 amount=-1 +kerning first=374 second=281 amount=-1 +kerning first=251 second=118 amount=-1 +kerning first=76 second=103 amount=-1 +kerning first=354 second=284 amount=-1 +kerning first=8250 second=193 amount=-1 +kerning first=111 second=120 amount=-1 +kerning first=199 second=382 amount=-1 +kerning first=354 second=235 amount=-1 +kerning first=220 second=83 amount=-1 +kerning first=335 second=120 amount=-1 +kerning first=258 second=8249 amount=-1 +kerning first=304 second=261 amount=-1 +kerning first=376 second=336 amount=-1 +kerning first=253 second=234 amount=-1 +kerning first=256 second=83 amount=-1 +kerning first=330 second=8249 amount=-1 +kerning first=314 second=255 amount=-1 +kerning first=364 second=83 amount=-1 +kerning first=8217 second=281 amount=-1 +kerning first=66 second=315 amount=-1 +kerning first=235 second=44 amount=-1 +kerning first=101 second=255 amount=-1 +kerning first=374 second=232 amount=-1 +kerning first=86 second=262 amount=-1 +kerning first=287 second=97 amount=-1 +kerning first=376 second=227 amount=-1 +kerning first=65 second=255 amount=-1 +kerning first=304 second=227 amount=-1 +kerning first=354 second=197 amount=-2 +kerning first=323 second=97 amount=-1 +kerning first=344 second=366 amount=-1 +kerning first=356 second=79 amount=-1 +kerning first=99 second=118 amount=-1 +kerning first=346 second=193 amount=-1 +kerning first=337 second=318 amount=-1 +kerning first=218 second=257 amount=-1 +kerning first=217 second=65 amount=-1 +kerning first=89 second=232 amount=-1 +kerning first=67 second=338 amount=-1 +kerning first=119 second=244 amount=-1 +kerning first=197 second=250 amount=-1 +kerning first=374 second=378 amount=-1 +kerning first=219 second=192 amount=-1 +kerning first=376 second=350 amount=-1 +kerning first=346 second=302 amount=-1 +kerning first=266 second=378 amount=-1 +kerning first=89 second=90 amount=-1 +kerning first=8216 second=74 amount=-1 +kerning first=70 second=198 amount=-1 +kerning first=264 second=274 amount=-1 +kerning first=284 second=221 amount=-1 +kerning first=377 second=250 amount=-1 +kerning first=266 second=298 amount=-1 +kerning first=89 second=242 amount=-1 +kerning first=266 second=280 amount=-1 +kerning first=356 second=291 amount=-1 +kerning first=374 second=90 amount=-1 +kerning first=284 second=291 amount=-1 +kerning first=199 second=213 amount=-1 +kerning first=71 second=221 amount=-1 +kerning first=256 second=361 amount=-1 +kerning first=119 second=267 amount=-1 +kerning first=84 second=256 amount=-2 +kerning first=8217 second=194 amount=-2 +kerning first=84 second=326 amount=-1 +kerning first=89 second=378 amount=-1 +kerning first=258 second=210 amount=-1 +kerning first=374 second=242 amount=-1 +kerning first=375 second=233 amount=-1 +kerning first=335 second=316 amount=-1 +kerning first=311 second=335 amount=-1 +kerning first=207 second=257 amount=-1 +kerning first=171 second=87 amount=-1 +kerning first=354 second=45 amount=-1 +kerning first=66 second=87 amount=-1 +kerning first=286 second=374 amount=-1 +kerning first=344 second=268 amount=-1 +kerning first=195 second=112 amount=-1 +kerning first=121 second=240 amount=-1 +kerning first=286 second=103 amount=-1 +kerning first=344 second=219 amount=-1 +kerning first=67 second=289 amount=-1 +kerning first=280 second=289 amount=-1 +kerning first=316 second=289 amount=-1 +kerning first=1054 second=1040 amount=-1 +kerning first=352 second=289 amount=-1 +kerning first=193 second=367 amount=-1 +kerning first=269 second=108 amount=-1 +kerning first=88 second=367 amount=-1 +kerning first=233 second=108 amount=-1 +kerning first=83 second=8249 amount=-1 +kerning first=103 second=229 amount=-1 +kerning first=77 second=257 amount=-1 +kerning first=375 second=243 amount=-1 +kerning first=250 second=287 amount=-1 +kerning first=65 second=353 amount=-1 +kerning first=303 second=243 amount=-1 +kerning first=221 second=324 amount=-1 +kerning first=73 second=287 amount=-1 +kerning first=221 second=275 amount=-1 +kerning first=74 second=97 amount=-1 +kerning first=350 second=304 amount=-1 +kerning first=236 second=375 amount=-1 +kerning first=221 second=226 amount=-1 +kerning first=255 second=339 amount=-1 +kerning first=196 second=336 amount=-1 +kerning first=268 second=336 amount=-1 +kerning first=105 second=45 amount=-1 +kerning first=314 second=253 amount=-1 +kerning first=260 second=45 amount=-1 +kerning first=66 second=97 amount=-1 +kerning first=207 second=97 amount=-1 +kerning first=286 second=356 amount=-1 +kerning first=354 second=242 amount=-1 +kerning first=352 second=80 amount=-1 +kerning first=347 second=353 amount=-1 +kerning first=119 second=45 amount=-1 +kerning first=119 second=275 amount=-1 +kerning first=89 second=289 amount=-1 +kerning first=230 second=289 amount=-1 +kerning first=368 second=45 amount=-1 +kerning first=266 second=289 amount=-1 +kerning first=376 second=324 amount=-1 +kerning first=374 second=289 amount=-1 +kerning first=302 second=289 amount=-1 +kerning first=275 second=316 amount=-1 +kerning first=250 second=255 amount=-1 +kerning first=212 second=46 amount=-1 +kerning first=8250 second=120 amount=-1 +kerning first=256 second=370 amount=-1 +kerning first=197 second=211 amount=-1 +kerning first=352 second=82 amount=-1 +kerning first=67 second=80 amount=-1 +kerning first=1036 second=1105 amount=-1 +kerning first=266 second=193 amount=-1 +kerning first=75 second=290 amount=-1 +kerning first=8216 second=230 amount=-1 +kerning first=225 second=255 amount=-1 +kerning first=1027 second=1095 amount=-1 +kerning first=87 second=228 amount=-1 +kerning first=374 second=193 amount=-2 +kerning first=253 second=273 amount=-1 +kerning first=89 second=193 amount=-2 +kerning first=66 second=226 amount=-1 +kerning first=207 second=226 amount=-1 +kerning first=110 second=119 amount=-1 +kerning first=8217 second=291 amount=-1 +kerning first=86 second=192 amount=-2 +kerning first=269 second=307 amount=-1 +kerning first=266 second=268 amount=-1 +kerning first=221 second=257 amount=-1 +kerning first=251 second=119 amount=-1 +kerning first=375 second=314 amount=-1 +kerning first=339 second=314 amount=-1 +kerning first=87 second=46 amount=-1 +kerning first=267 second=314 amount=-1 +kerning first=262 second=284 amount=-1 +kerning first=262 second=209 amount=-1 +kerning first=231 second=314 amount=-1 +kerning first=336 second=46 amount=-1 +kerning first=376 second=346 amount=-1 +kerning first=260 second=253 amount=-1 +kerning first=268 second=346 amount=-1 +kerning first=204 second=230 amount=-1 +kerning first=196 second=346 amount=-1 +kerning first=99 second=230 amount=-1 +kerning first=107 second=101 amount=-1 +kerning first=262 second=70 amount=-1 +kerning first=187 second=270 amount=-1 +kerning first=275 second=375 amount=-1 +kerning first=220 second=380 amount=-1 +kerning first=98 second=375 amount=-1 +kerning first=266 second=81 amount=-1 +kerning first=75 second=369 amount=-1 +kerning first=264 second=296 amount=-1 +kerning first=332 second=196 amount=-1 +kerning first=89 second=81 amount=-1 +kerning first=66 second=354 amount=-1 +kerning first=194 second=81 amount=-1 +kerning first=221 second=235 amount=-1 +kerning first=368 second=196 amount=-1 +kerning first=171 second=354 amount=-1 +kerning first=66 second=75 amount=-1 +kerning first=315 second=354 amount=-1 +kerning first=262 second=288 amount=-1 +kerning first=374 second=81 amount=-1 +kerning first=283 second=316 amount=-1 +kerning first=89 second=171 amount=-1 +kerning first=194 second=171 amount=-1 +kerning first=266 second=171 amount=-1 +kerning first=76 second=374 amount=-1 +kerning first=1060 second=1051 amount=-1 +kerning first=73 second=363 amount=-1 +kerning first=339 second=121 amount=-1 +kerning first=371 second=271 amount=-1 +kerning first=374 second=171 amount=-1 +kerning first=267 second=121 amount=-1 +kerning first=256 second=252 amount=-1 +kerning first=108 second=289 amount=-1 +kerning first=199 second=197 amount=-1 +kerning first=121 second=231 amount=-1 +kerning first=217 second=352 amount=-1 +kerning first=83 second=196 amount=-1 +kerning first=90 second=121 amount=-1 +kerning first=362 second=261 amount=-1 +kerning first=354 second=115 amount=-1 +kerning first=289 second=122 amount=-1 +kerning first=262 second=310 amount=-1 +kerning first=86 second=214 amount=-1 +kerning first=76 second=122 amount=-1 +kerning first=82 second=213 amount=-1 +kerning first=224 second=253 amount=-1 +kerning first=230 second=311 amount=-1 +kerning first=195 second=252 amount=-1 +kerning first=350 second=65 amount=-1 +kerning first=241 second=171 amount=-1 +kerning first=192 second=362 amount=-1 +kerning first=222 second=260 amount=-1 +kerning first=221 second=333 amount=-1 +kerning first=90 second=252 amount=-1 +kerning first=88 second=249 amount=-1 +kerning first=81 second=260 amount=-1 +kerning first=45 second=220 amount=-1 +kerning first=45 second=260 amount=-1 +kerning first=193 second=249 amount=-1 +kerning first=45 second=86 amount=-1 +kerning first=199 second=266 amount=-1 +kerning first=366 second=260 amount=-1 +kerning first=197 second=362 amount=-1 +kerning first=120 second=347 amount=-1 +kerning first=84 second=347 amount=-1 +kerning first=75 second=214 amount=-1 +kerning first=46 second=8221 amount=-1 +kerning first=264 second=103 amount=-1 +kerning first=82 second=8221 amount=-1 +kerning first=295 second=8221 amount=-1 +kerning first=192 second=103 amount=-1 +kerning first=331 second=8221 amount=-1 +kerning first=84 second=246 amount=-1 +kerning first=260 second=351 amount=-1 +kerning first=361 second=8221 amount=-1 +kerning first=259 second=8221 amount=-1 +kerning first=121 second=100 amount=-1 +kerning first=259 second=118 amount=-1 +kerning first=255 second=242 amount=-1 +kerning first=89 second=8250 amount=-1 +kerning first=258 second=220 amount=-1 +kerning first=298 second=369 amount=-1 +kerning first=1038 second=1086 amount=-1 +kerning first=256 second=79 amount=-1 +kerning first=258 second=67 amount=-1 +kerning first=90 second=380 amount=-1 +kerning first=8220 second=339 amount=-1 +kerning first=8250 second=382 amount=-1 +kerning first=1046 second=1089 amount=-1 +kerning first=233 second=107 amount=-1 +kerning first=255 second=232 amount=-1 +kerning first=1038 second=1054 amount=-1 +kerning first=367 second=8221 amount=-1 +kerning first=1046 second=1058 amount=-1 +kerning first=8217 second=193 amount=-2 +kerning first=375 second=380 amount=-1 +kerning first=284 second=89 amount=-1 +kerning first=192 second=264 amount=-1 +kerning first=376 second=267 amount=-1 +kerning first=87 second=264 amount=-1 +kerning first=286 second=198 amount=-1 +kerning first=1043 second=1040 amount=-1 +kerning first=67 second=298 amount=-1 +kerning first=352 second=317 amount=-1 +kerning first=352 second=298 amount=-1 +kerning first=376 second=248 amount=-1 +kerning first=193 second=118 amount=-1 +kerning first=87 second=234 amount=-1 +kerning first=229 second=118 amount=-1 +kerning first=350 second=305 amount=-1 +kerning first=196 second=354 amount=-2 +kerning first=346 second=120 amount=-1 +kerning first=88 second=118 amount=-1 +kerning first=1040 second=1098 amount=-1 +kerning first=264 second=71 amount=-1 +kerning first=356 second=331 amount=-1 +kerning first=45 second=198 amount=-1 +kerning first=216 second=192 amount=-1 +kerning first=81 second=198 amount=-1 +kerning first=288 second=192 amount=-1 +kerning first=107 second=279 amount=-1 +kerning first=222 second=198 amount=-1 +kerning first=330 second=250 amount=-1 +kerning first=346 second=303 amount=-1 +kerning first=84 second=216 amount=-1 +kerning first=350 second=370 amount=-1 +kerning first=347 second=287 amount=-1 +kerning first=87 second=256 amount=-2 +kerning first=346 second=44 amount=-1 +kerning first=275 second=287 amount=-1 +kerning first=196 second=84 amount=-2 +kerning first=304 second=226 amount=-1 +kerning first=203 second=287 amount=-1 +kerning first=376 second=226 amount=-1 +kerning first=193 second=368 amount=-1 +kerning first=353 second=291 amount=-1 +kerning first=317 second=291 amount=-1 +kerning first=45 second=368 amount=-1 +kerning first=281 second=291 amount=-1 +kerning first=209 second=291 amount=-1 +kerning first=65 second=266 amount=-1 +kerning first=192 second=365 amount=-1 +kerning first=220 second=74 amount=-1 +kerning first=258 second=89 amount=-2 +kerning first=199 second=45 amount=-1 +kerning first=364 second=74 amount=-1 +kerning first=262 second=350 amount=-1 +kerning first=1047 second=1078 amount=-1 +kerning first=310 second=284 amount=-1 +kerning first=307 second=45 amount=-1 +kerning first=344 second=269 amount=-1 +kerning first=336 second=256 amount=-1 +kerning first=209 second=261 amount=-1 +kerning first=84 second=268 amount=-1 +kerning first=350 second=112 amount=-1 +kerning first=264 second=256 amount=-1 +kerning first=366 second=198 amount=-1 +kerning first=78 second=8249 amount=-1 +kerning first=264 second=286 amount=-1 +kerning first=356 second=279 amount=-1 +kerning first=346 second=205 amount=-1 +kerning first=255 second=8249 amount=-1 +kerning first=219 second=8249 amount=-1 +kerning first=269 second=257 amount=-1 +kerning first=8220 second=99 amount=-1 +kerning first=327 second=8249 amount=-1 +kerning first=291 second=8249 amount=-1 +kerning first=197 second=289 amount=-1 +kerning first=45 second=89 amount=-1 +kerning first=370 second=350 amount=-1 +kerning first=366 second=228 amount=-1 +kerning first=330 second=228 amount=-1 +kerning first=87 second=286 amount=-1 +kerning first=77 second=367 amount=-1 +kerning first=117 second=108 amount=-1 +kerning first=192 second=286 amount=-1 +kerning first=65 second=251 amount=-1 +kerning first=66 second=105 amount=-1 +kerning first=356 second=212 amount=-1 +kerning first=377 second=251 amount=-1 +kerning first=192 second=374 amount=-2 +kerning first=82 second=332 amount=-1 +kerning first=220 second=261 amount=-1 +kerning first=353 second=121 amount=-1 +kerning first=197 second=251 amount=-1 +kerning first=269 second=227 amount=-1 +kerning first=364 second=261 amount=-1 +kerning first=77 second=226 amount=-1 +kerning first=321 second=381 amount=-1 +kerning first=295 second=8220 amount=-1 +kerning first=344 second=108 amount=-1 +kerning first=205 second=103 amount=-1 +kerning first=218 second=226 amount=-1 +kerning first=66 second=367 amount=-1 +kerning first=362 second=226 amount=-1 +kerning first=262 second=192 amount=-1 +kerning first=207 second=367 amount=-1 +kerning first=46 second=8220 amount=-1 +kerning first=99 second=119 amount=-1 +kerning first=82 second=8220 amount=-1 +kerning first=221 second=115 amount=-1 +kerning first=84 second=335 amount=-1 +kerning first=374 second=233 amount=-1 +kerning first=89 second=233 amount=-1 +kerning first=277 second=311 amount=-1 +kerning first=282 second=289 amount=-1 +kerning first=72 second=224 amount=-1 +kerning first=108 second=45 amount=-1 +kerning first=218 second=97 amount=-1 +kerning first=87 second=353 amount=-1 +kerning first=8222 second=364 amount=-1 +kerning first=362 second=97 amount=-1 +kerning first=45 second=77 amount=-1 +kerning first=347 second=255 amount=-1 +kerning first=77 second=97 amount=-1 +kerning first=275 second=255 amount=-1 +kerning first=68 second=194 amount=-1 +kerning first=264 second=112 amount=-1 +kerning first=98 second=255 amount=-1 +kerning first=221 second=244 amount=-1 +kerning first=192 second=112 amount=-1 +kerning first=89 second=223 amount=-1 +kerning first=66 second=324 amount=-1 +kerning first=253 second=243 amount=-1 +kerning first=8222 second=219 amount=-1 +kerning first=66 second=377 amount=-1 +kerning first=346 second=198 amount=-1 +kerning first=192 second=352 amount=-1 +kerning first=226 second=8220 amount=-1 +kerning first=266 second=202 amount=-1 +kerning first=253 second=46 amount=-1 +kerning first=264 second=352 amount=-1 +kerning first=289 second=46 amount=-1 +kerning first=65 second=362 amount=-1 +kerning first=45 second=76 amount=-1 +kerning first=87 second=352 amount=-1 +kerning first=370 second=382 amount=-1 +kerning first=83 second=197 amount=-1 +kerning first=332 second=197 amount=-1 +kerning first=350 second=362 amount=-1 +kerning first=1046 second=1059 amount=-1 +kerning first=88 second=336 amount=-1 +kerning first=221 second=266 amount=-1 +kerning first=119 second=111 amount=-1 +kerning first=368 second=197 amount=-1 +kerning first=193 second=336 amount=-1 +kerning first=73 second=225 amount=-1 +kerning first=317 second=380 amount=-1 +kerning first=84 second=334 amount=-1 +kerning first=1027 second=1076 amount=-1 +kerning first=235 second=253 amount=-1 +kerning first=262 second=200 amount=-1 +kerning first=307 second=253 amount=-1 +kerning first=108 second=8220 amount=-1 +kerning first=217 second=46 amount=-1 +kerning first=379 second=253 amount=-1 +kerning first=344 second=86 amount=-1 +kerning first=269 second=225 amount=-1 +kerning first=112 second=46 amount=-1 +kerning first=70 second=260 amount=-1 +kerning first=356 second=213 amount=-1 +kerning first=74 second=230 amount=-1 +kerning first=323 second=230 amount=-1 +kerning first=87 second=103 amount=-1 +kerning first=228 second=375 amount=-1 +kerning first=266 second=201 amount=-1 +kerning first=287 second=230 amount=-1 +kerning first=195 second=370 amount=-1 +kerning first=266 second=76 amount=-1 +kerning first=277 second=289 amount=-1 +kerning first=121 second=318 amount=-1 +kerning first=87 second=375 amount=-1 +kerning first=205 second=289 amount=-1 +kerning first=119 second=351 amount=-1 +kerning first=338 second=289 amount=-1 +kerning first=211 second=260 amount=-1 +kerning first=313 second=289 amount=-1 +kerning first=311 second=277 amount=-1 +kerning first=45 second=317 amount=-1 +kerning first=213 second=196 amount=-1 +kerning first=193 second=218 amount=-1 +kerning first=197 second=219 amount=-1 +kerning first=1075 second=1113 amount=-1 +kerning first=120 second=117 amount=-1 +kerning first=352 second=68 amount=-1 +kerning first=8217 second=289 amount=-1 +kerning first=120 second=259 amount=-1 +kerning first=84 second=259 amount=-1 +kerning first=67 second=68 amount=-1 +kerning first=193 second=217 amount=-1 +kerning first=314 second=121 amount=-1 +kerning first=242 second=121 amount=-1 +kerning first=118 second=263 amount=-1 +kerning first=101 second=121 amount=-1 +kerning first=87 second=277 amount=-1 +kerning first=65 second=121 amount=-1 +kerning first=310 second=369 amount=-1 +kerning first=317 second=379 amount=-1 +kerning first=356 second=288 amount=-1 +kerning first=197 second=89 amount=-2 +kerning first=119 second=263 amount=-1 +kerning first=346 second=196 amount=-1 +kerning first=205 second=224 amount=-1 +kerning first=76 second=362 amount=-1 +kerning first=86 second=281 amount=-1 +kerning first=324 second=171 amount=-1 +kerning first=66 second=106 amount=-1 +kerning first=197 second=220 amount=-1 +kerning first=371 second=281 amount=-1 +kerning first=354 second=266 amount=-1 +kerning first=376 second=333 amount=-1 +kerning first=352 second=302 amount=-1 +kerning first=8216 second=240 amount=-1 +kerning first=194 second=71 amount=-1 +kerning first=264 second=287 amount=-1 +kerning first=346 second=206 amount=-1 +kerning first=1091 second=1103 amount=-1 +kerning first=347 second=103 amount=-1 +kerning first=89 second=71 amount=-1 +kerning first=192 second=287 amount=-1 +kerning first=367 second=8220 amount=-1 +kerning first=87 second=287 amount=-1 +kerning first=203 second=103 amount=-1 +kerning first=117 second=316 amount=-1 +kerning first=376 second=235 amount=-1 +kerning first=67 second=330 amount=-1 +kerning first=118 second=353 amount=-1 +kerning first=75 second=171 amount=-1 +kerning first=1027 second=1086 amount=-1 +kerning first=374 second=71 amount=-1 +kerning first=65 second=252 amount=-1 +kerning first=266 second=71 amount=-1 +kerning first=1058 second=1078 amount=-1 +kerning first=326 second=118 amount=-1 +kerning first=80 second=193 amount=-1 +kerning first=304 second=224 amount=-1 +kerning first=197 second=67 amount=-1 +kerning first=1043 second=1093 amount=-1 +kerning first=352 second=8249 amount=-1 +kerning first=228 second=255 amount=-1 +kerning first=316 second=8249 amount=-1 +kerning first=192 second=255 amount=-1 +kerning first=84 second=269 amount=-1 +kerning first=362 second=227 amount=-1 +kerning first=87 second=255 amount=-1 +kerning first=213 second=44 amount=-1 +kerning first=258 second=338 amount=-1 +kerning first=304 second=257 amount=-1 +kerning first=103 second=8249 amount=-1 +kerning first=67 second=8249 amount=-1 +kerning first=376 second=257 amount=-1 +kerning first=77 second=229 amount=-1 +kerning first=8220 second=242 amount=-1 +kerning first=344 second=85 amount=-1 +kerning first=113 second=118 amount=-1 +kerning first=354 second=244 amount=-1 +kerning first=311 second=234 amount=-1 +kerning first=258 second=251 amount=-1 +kerning first=303 second=273 amount=-1 +kerning first=263 second=303 amount=-1 +kerning first=346 second=118 amount=-1 +kerning first=350 second=274 amount=-1 +kerning first=262 second=199 amount=-1 +kerning first=283 second=108 amount=-1 +kerning first=118 second=279 amount=-1 +kerning first=216 second=193 amount=-1 +kerning first=262 second=79 amount=-1 +kerning first=356 second=332 amount=-1 +kerning first=197 second=8220 amount=-1 +kerning first=221 second=245 amount=-1 +kerning first=65 second=361 amount=-1 +kerning first=330 second=251 amount=-1 +kerning first=344 second=107 amount=-1 +kerning first=288 second=193 amount=-1 +kerning first=82 second=279 amount=-1 +kerning first=206 second=361 amount=-1 +kerning first=375 second=8249 amount=-1 +kerning first=8217 second=224 amount=-1 +kerning first=218 second=227 amount=-1 +kerning first=77 second=227 amount=-1 +kerning first=315 second=84 amount=-1 +kerning first=344 second=216 amount=-1 +kerning first=193 second=119 amount=-1 +kerning first=229 second=119 amount=-1 +kerning first=88 second=119 amount=-1 +kerning first=255 second=233 amount=-1 +kerning first=87 second=113 amount=-1 +kerning first=234 second=291 amount=-1 +kerning first=66 second=84 amount=-1 +kerning first=198 second=291 amount=-1 +kerning first=119 second=227 amount=-1 +kerning first=307 second=8249 amount=-1 +kerning first=281 second=314 amount=-1 +kerning first=245 second=314 amount=-1 +kerning first=217 second=198 amount=-1 +kerning first=192 second=366 amount=-1 +kerning first=350 second=291 amount=-1 +kerning first=314 second=291 amount=-1 +kerning first=278 second=291 amount=-1 +kerning first=8250 second=206 amount=-1 +kerning first=206 second=291 amount=-1 +kerning first=101 second=291 amount=-1 +kerning first=65 second=291 amount=-1 +kerning first=193 second=354 amount=-2 +kerning first=243 second=44 amount=-1 +kerning first=121 second=101 amount=-1 +kerning first=263 second=287 amount=-1 +kerning first=194 second=268 amount=-1 +kerning first=45 second=325 amount=-1 +kerning first=75 second=210 amount=-1 +kerning first=89 second=268 amount=-1 +kerning first=66 second=44 amount=-1 +kerning first=8250 second=201 amount=-1 +kerning first=376 second=244 amount=-1 +kerning first=350 second=296 amount=-1 +kerning first=368 second=227 amount=-1 +kerning first=296 second=227 amount=-1 +kerning first=374 second=268 amount=-1 +kerning first=195 second=121 amount=-1 +kerning first=221 second=337 amount=-1 +kerning first=85 second=257 amount=-1 +kerning first=8222 second=362 amount=-1 +kerning first=204 second=261 amount=-1 +kerning first=356 second=199 amount=-1 +kerning first=99 second=261 amount=-1 +kerning first=255 second=228 amount=-1 +kerning first=219 second=228 amount=-1 +kerning first=327 second=228 amount=-1 +kerning first=346 second=280 amount=-1 +kerning first=1061 second=1054 amount=-1 +kerning first=192 second=361 amount=-1 +kerning first=82 second=83 amount=-1 +kerning first=369 second=108 amount=-1 +kerning first=187 second=83 amount=-1 +kerning first=376 second=377 amount=-1 +kerning first=262 second=336 amount=-1 +kerning first=213 second=197 amount=-1 +kerning first=66 second=205 amount=-1 +kerning first=374 second=263 amount=-1 +kerning first=197 second=286 amount=-1 +kerning first=230 second=107 amount=-1 +kerning first=86 second=245 amount=-1 +kerning first=45 second=90 amount=-1 +kerning first=199 second=262 amount=-1 +kerning first=256 second=221 amount=-2 +kerning first=82 second=318 amount=-1 +kerning first=118 second=318 amount=-1 +kerning first=354 second=223 amount=-1 +kerning first=8216 second=231 amount=-1 +kerning first=269 second=237 amount=-1 +kerning first=79 second=65 amount=-1 +kerning first=65 second=370 amount=-1 +kerning first=220 second=65 amount=-1 +kerning first=252 second=289 amount=-1 +kerning first=364 second=65 amount=-1 +kerning first=272 second=260 amount=-1 +kerning first=310 second=45 amount=-1 +kerning first=346 second=45 amount=-1 +kerning first=264 second=77 amount=-1 +kerning first=365 second=289 amount=-1 +kerning first=347 second=112 amount=-1 +kerning first=382 second=45 amount=-1 +kerning first=344 second=255 amount=-1 +kerning first=236 second=255 amount=-1 +kerning first=258 second=374 amount=-2 +kerning first=86 second=324 amount=-1 +kerning first=45 second=374 amount=-1 +kerning first=221 second=97 amount=-1 +kerning first=187 second=323 amount=-1 +kerning first=83 second=219 amount=-1 +kerning first=75 second=8249 amount=-1 +kerning first=269 second=46 amount=-1 +kerning first=121 second=257 amount=-1 +kerning first=221 second=288 amount=-1 +kerning first=370 second=257 amount=-1 +kerning first=75 second=338 amount=-1 +kerning first=298 second=257 amount=-1 +kerning first=187 second=260 amount=-1 +kerning first=311 second=273 amount=-1 +kerning first=213 second=192 amount=-1 +kerning first=1059 second=1105 amount=-1 +kerning first=208 second=193 amount=-1 +kerning first=302 second=224 amount=-1 +kerning first=352 second=193 amount=-1 +kerning first=89 second=224 amount=-1 +kerning first=187 second=78 amount=-1 +kerning first=8250 second=280 amount=-1 +kerning first=260 second=71 amount=-1 +kerning first=81 second=46 amount=-1 +kerning first=187 second=122 amount=-1 +kerning first=118 second=122 amount=-1 +kerning first=8250 second=84 amount=-1 +kerning first=1046 second=1090 amount=-1 +kerning first=1036 second=1038 amount=-1 +kerning first=374 second=224 amount=-1 +kerning first=112 second=375 amount=-1 +kerning first=366 second=46 amount=-1 +kerning first=268 second=288 amount=-1 +kerning first=46 second=8249 amount=-1 +kerning first=374 second=336 amount=-1 +kerning first=323 second=103 amount=-1 +kerning first=196 second=288 amount=-1 +kerning first=1059 second=1075 amount=-1 +kerning first=66 second=368 amount=-1 +kerning first=67 second=81 amount=-1 +kerning first=76 second=287 amount=-1 +kerning first=205 second=259 amount=-1 +kerning first=269 second=316 amount=-1 +kerning first=233 second=316 amount=-1 +kerning first=251 second=289 amount=-1 +kerning first=354 second=346 amount=-1 +kerning first=370 second=352 amount=-1 +kerning first=325 second=287 amount=-1 +kerning first=217 second=287 amount=-1 +kerning first=253 second=287 amount=-1 +kerning first=73 second=117 amount=-1 +kerning first=87 second=194 amount=-2 +kerning first=110 second=8217 amount=-1 +kerning first=251 second=8217 amount=-1 +kerning first=197 second=370 amount=-1 +kerning first=264 second=194 amount=-1 +kerning first=336 second=194 amount=-1 +kerning first=344 second=242 amount=-1 +kerning first=66 second=328 amount=-1 +kerning first=194 second=219 amount=-1 +kerning first=86 second=290 amount=-1 +kerning first=291 second=351 amount=-1 +kerning first=346 second=80 amount=-1 +kerning first=255 second=351 amount=-1 +kerning first=119 second=115 amount=-1 +kerning first=376 second=288 amount=-1 +kerning first=105 second=253 amount=-1 +kerning first=260 second=115 amount=-1 +kerning first=242 second=255 amount=-1 +kerning first=112 second=121 amount=-1 +kerning first=258 second=369 amount=-1 +kerning first=76 second=121 amount=-1 +kerning first=73 second=229 amount=-1 +kerning first=362 second=196 amount=-1 +kerning first=246 second=253 amount=-1 +kerning first=314 second=171 amount=-1 +kerning first=354 second=253 amount=-1 +kerning first=344 second=334 amount=-1 +kerning first=353 second=353 amount=-1 +kerning first=195 second=212 amount=-1 +kerning first=218 second=196 amount=-1 +kerning first=290 second=196 amount=-1 +kerning first=1059 second=1100 amount=-1 +kerning first=223 second=318 amount=-1 +kerning first=375 second=100 amount=-1 +kerning first=103 second=228 amount=-1 +kerning first=89 second=347 amount=-1 +kerning first=367 second=318 amount=-1 +kerning first=221 second=214 amount=-1 +kerning first=354 second=267 amount=-1 +kerning first=8250 second=344 amount=-1 +kerning first=89 second=263 amount=-1 +kerning first=326 second=8221 amount=-1 +kerning first=260 second=336 amount=-1 +kerning first=377 second=365 amount=-1 +kerning first=311 second=113 amount=-1 +kerning first=250 second=103 amount=-1 +kerning first=66 second=249 amount=-1 +kerning first=8250 second=291 amount=-1 +kerning first=236 second=171 amount=-1 +kerning first=272 second=46 amount=-1 +kerning first=82 second=362 amount=-1 +kerning first=344 second=171 amount=-1 +kerning first=303 second=100 amount=-1 +kerning first=73 second=103 amount=-1 +kerning first=197 second=365 amount=-1 +kerning first=380 second=171 amount=-1 +kerning first=113 second=119 amount=-1 +kerning first=8220 second=113 amount=-1 +kerning first=119 second=232 amount=-1 +kerning first=8218 second=370 amount=-1 +kerning first=234 second=118 amount=-1 +kerning first=121 second=380 amount=-1 +kerning first=85 second=380 amount=-1 +kerning first=370 second=380 amount=-1 +kerning first=262 second=380 amount=-1 +kerning first=315 second=377 amount=-1 +kerning first=45 second=323 amount=-1 +kerning first=256 second=216 amount=-1 +kerning first=67 second=67 amount=-1 +kerning first=82 second=234 amount=-1 +kerning first=76 second=86 amount=-1 +kerning first=66 second=363 amount=-1 +kerning first=321 second=364 amount=-1 +kerning first=207 second=363 amount=-1 +kerning first=118 second=234 amount=-1 +kerning first=268 second=304 amount=-1 +kerning first=1058 second=1033 amount=-1 +kerning first=374 second=347 amount=-1 +kerning first=82 second=283 amount=-1 +kerning first=8250 second=217 amount=-1 +kerning first=1060 second=1059 amount=-1 +kerning first=82 second=118 amount=-1 +kerning first=193 second=79 amount=-1 +kerning first=187 second=118 amount=-1 +kerning first=352 second=72 amount=-1 +kerning first=344 second=290 amount=-1 +kerning first=219 second=193 amount=-1 +kerning first=367 second=118 amount=-1 +kerning first=197 second=85 amount=-1 +kerning first=195 second=216 amount=-1 +kerning first=221 second=377 amount=-1 +kerning first=207 second=361 amount=-1 +kerning first=313 second=377 amount=-1 +kerning first=346 second=192 amount=-1 +kerning first=8218 second=86 amount=-2 +kerning first=1098 second=1091 amount=-1 +kerning first=295 second=118 amount=-1 +kerning first=331 second=118 amount=-1 +kerning first=88 second=79 amount=-1 +kerning first=1104 second=1076 amount=-1 +kerning first=194 second=8249 amount=-1 +kerning first=356 second=83 amount=-1 +kerning first=1050 second=1060 amount=-1 +kerning first=266 second=8249 amount=-1 +kerning first=75 second=121 amount=-1 +kerning first=8217 second=269 amount=-1 +kerning first=83 second=315 amount=-1 +kerning first=354 second=262 amount=-1 +kerning first=1027 second=1077 amount=-1 +kerning first=264 second=278 amount=-1 +kerning first=344 second=103 amount=-1 +kerning first=45 second=218 amount=-1 +kerning first=350 second=256 amount=-1 +kerning first=82 second=113 amount=-1 +kerning first=375 second=291 amount=-1 +kerning first=68 second=65 amount=-1 +kerning first=336 second=198 amount=-1 +kerning first=339 second=291 amount=-1 +kerning first=1069 second=1038 amount=-1 +kerning first=248 second=318 amount=-1 +kerning first=264 second=198 amount=-1 +kerning first=267 second=291 amount=-1 +kerning first=76 second=366 amount=-1 +kerning first=231 second=291 amount=-1 +kerning first=75 second=250 amount=-1 +kerning first=84 second=260 amount=-2 +kerning first=1059 second=1119 amount=-1 +kerning first=90 second=291 amount=-1 +kerning first=266 second=67 amount=-1 +kerning first=374 second=67 amount=-1 +kerning first=317 second=219 amount=-1 +kerning first=362 second=44 amount=-1 +kerning first=89 second=67 amount=-1 +kerning first=84 second=71 amount=-1 +kerning first=8249 second=87 amount=-1 +kerning first=194 second=67 amount=-1 +kerning first=290 second=44 amount=-1 +kerning first=82 second=199 amount=-1 +kerning first=254 second=44 amount=-1 +kerning first=8217 second=259 amount=-1 +kerning first=8220 second=233 amount=-1 +kerning first=346 second=84 amount=-1 +kerning first=118 second=113 amount=-1 +kerning first=72 second=227 amount=-1 +kerning first=67 second=72 amount=-1 +kerning first=376 second=337 amount=-1 +kerning first=323 second=261 amount=-1 +kerning first=287 second=261 amount=-1 +kerning first=346 second=112 amount=-1 +kerning first=99 second=226 amount=-1 +kerning first=204 second=226 amount=-1 +kerning first=199 second=66 amount=-1 +kerning first=250 second=108 amount=-1 +kerning first=71 second=356 amount=-1 +kerning first=258 second=286 amount=-1 +kerning first=252 second=314 amount=-1 +kerning first=120 second=229 amount=-1 +kerning first=84 second=229 amount=-1 +kerning first=381 second=122 amount=-1 +kerning first=195 second=251 amount=-1 +kerning first=220 second=230 amount=-1 +kerning first=262 second=122 amount=-1 +kerning first=268 second=350 amount=-1 +kerning first=364 second=230 amount=-1 +kerning first=74 second=261 amount=-1 +kerning first=219 second=224 amount=-1 +kerning first=255 second=224 amount=-1 +kerning first=291 second=224 amount=-1 +kerning first=327 second=224 amount=-1 +kerning first=194 second=356 amount=-2 +kerning first=86 second=45 amount=-1 +kerning first=122 second=45 amount=-1 +kerning first=214 second=194 amount=-1 +kerning first=286 second=194 amount=-1 +kerning first=255 second=111 amount=-1 +kerning first=195 second=8249 amount=-1 +kerning first=333 second=255 amount=-1 +kerning first=375 second=234 amount=-1 +kerning first=369 second=255 amount=-1 +kerning first=8250 second=197 amount=-1 +kerning first=107 second=243 amount=-1 +kerning first=290 second=354 amount=-1 +kerning first=196 second=368 amount=-1 +kerning first=84 second=255 amount=-1 +kerning first=278 second=287 amount=-1 +kerning first=356 second=243 amount=-1 +kerning first=120 second=255 amount=-1 +kerning first=314 second=287 amount=-1 +kerning first=206 second=287 amount=-1 +kerning first=83 second=80 amount=-1 +kerning first=352 second=368 amount=-1 +kerning first=101 second=287 amount=-1 +kerning first=376 second=97 amount=-1 +kerning first=258 second=211 amount=-1 +kerning first=65 second=287 amount=-1 +kerning first=197 second=374 amount=-2 +kerning first=67 second=202 amount=-1 +kerning first=253 second=113 amount=-1 +kerning first=281 second=104 amount=-1 +kerning first=89 second=111 amount=-1 +kerning first=350 second=287 amount=-1 +kerning first=89 second=119 amount=-1 +kerning first=287 second=380 amount=-1 +kerning first=356 second=248 amount=-1 +kerning first=262 second=327 amount=-1 +kerning first=187 second=74 amount=-1 +kerning first=67 second=76 amount=-1 +kerning first=374 second=111 amount=-1 +kerning first=220 second=225 amount=-1 +kerning first=118 second=243 amount=-1 +kerning first=107 second=248 amount=-1 +kerning first=82 second=243 amount=-1 +kerning first=311 second=269 amount=-1 +kerning first=257 second=253 amount=-1 +kerning first=221 second=253 amount=-1 +kerning first=260 second=364 amount=-1 +kerning first=365 second=253 amount=-1 +kerning first=352 second=202 amount=-1 +kerning first=83 second=364 amount=-1 +kerning first=187 second=69 amount=-1 +kerning first=193 second=350 amount=-1 +kerning first=65 second=375 amount=-1 +kerning first=221 second=346 amount=-1 +kerning first=66 second=288 amount=-1 +kerning first=65 second=212 amount=-1 +kerning first=86 second=289 amount=-1 +kerning first=220 second=229 amount=-1 +kerning first=70 second=46 amount=-1 +kerning first=76 second=370 amount=-1 +kerning first=350 second=282 amount=-1 +kerning first=223 second=314 amount=-1 +kerning first=211 second=46 amount=-1 +kerning first=86 second=241 amount=-1 +kerning first=344 second=99 amount=-1 +kerning first=262 second=213 amount=-1 +kerning first=197 second=369 amount=-1 +kerning first=283 second=46 amount=-1 +kerning first=364 second=225 amount=-1 +kerning first=89 second=259 amount=-1 +kerning first=375 second=335 amount=-1 +kerning first=8250 second=192 amount=-1 +kerning first=235 second=311 amount=-1 +kerning first=303 second=335 amount=-1 +kerning first=286 second=44 amount=-1 +kerning first=356 second=122 amount=-1 +kerning first=197 second=81 amount=-1 +kerning first=119 second=271 amount=-1 +kerning first=209 second=230 amount=-1 +kerning first=242 second=375 amount=-1 +kerning first=302 second=259 amount=-1 +kerning first=66 second=119 amount=-1 +kerning first=314 second=375 amount=-1 +kerning first=364 second=291 amount=-1 +kerning first=82 second=314 amount=-1 +kerning first=194 second=351 amount=-1 +kerning first=266 second=70 amount=-1 +kerning first=256 second=291 amount=-1 +kerning first=89 second=351 amount=-1 +kerning first=220 second=291 amount=-1 +kerning first=351 second=119 amount=-1 +kerning first=1069 second=1033 amount=-1 +kerning first=115 second=291 amount=-1 +kerning first=279 second=119 amount=-1 +kerning first=315 second=119 amount=-1 +kerning first=83 second=75 amount=-1 +kerning first=8216 second=275 amount=-1 +kerning first=89 second=210 amount=-1 +kerning first=217 second=256 amount=-1 +kerning first=194 second=210 amount=-1 +kerning first=194 second=284 amount=-1 +kerning first=346 second=89 amount=-1 +kerning first=374 second=351 amount=-1 +kerning first=255 second=263 amount=-1 +kerning first=317 second=8220 amount=-1 +kerning first=377 second=369 amount=-1 +kerning first=228 second=121 amount=-1 +kerning first=192 second=121 amount=-1 +kerning first=196 second=363 amount=-1 +kerning first=1059 second=1114 amount=-1 +kerning first=195 second=221 amount=-2 +kerning first=104 second=8249 amount=-1 +kerning first=89 second=256 amount=-2 +kerning first=304 second=363 amount=-1 +kerning first=354 second=377 amount=-1 +kerning first=8216 second=226 amount=-1 +kerning first=371 second=333 amount=-1 +kerning first=258 second=85 amount=-1 +kerning first=268 second=200 amount=-1 +kerning first=45 second=85 amount=-1 +kerning first=86 second=382 amount=-1 +kerning first=65 second=86 amount=-2 +kerning first=103 second=316 amount=-1 +kerning first=244 second=120 amount=-1 +kerning first=115 second=351 amount=-1 +kerning first=70 second=171 amount=-1 +kerning first=45 second=330 amount=-1 +kerning first=244 second=316 amount=-1 +kerning first=253 second=235 amount=-1 +kerning first=344 second=246 amount=-1 +kerning first=86 second=197 amount=-2 +kerning first=369 second=103 amount=-1 +kerning first=193 second=8221 amount=-1 +kerning first=229 second=8221 amount=-1 +kerning first=381 second=252 amount=-1 +kerning first=196 second=249 amount=-1 +kerning first=86 second=333 amount=-1 +kerning first=199 second=214 amount=-1 +kerning first=8217 second=111 amount=-1 +kerning first=283 second=103 amount=-1 +kerning first=209 second=226 amount=-1 +kerning first=106 second=103 amount=-1 +kerning first=76 second=379 amount=-1 +kerning first=70 second=103 amount=-1 +kerning first=8216 second=257 amount=-1 +kerning first=310 second=71 amount=-1 +kerning first=286 second=260 amount=-1 +kerning first=325 second=117 amount=-1 +kerning first=258 second=171 amount=-1 +kerning first=255 second=281 amount=-1 +kerning first=121 second=283 amount=-1 +kerning first=313 second=89 amount=-1 +kerning first=330 second=171 amount=-1 +kerning first=83 second=280 amount=-1 +kerning first=354 second=256 amount=-2 +kerning first=214 second=260 amount=-1 +kerning first=366 second=171 amount=-1 +kerning first=264 second=313 amount=-1 +kerning first=219 second=382 amount=-1 +kerning first=250 second=121 amount=-1 +kerning first=221 second=284 amount=-1 +kerning first=255 second=382 amount=-1 +kerning first=291 second=382 amount=-1 +kerning first=1059 second=1079 amount=-1 +kerning first=73 second=361 amount=-1 +kerning first=8216 second=113 amount=-1 +kerning first=251 second=8221 amount=-1 +kerning first=110 second=8221 amount=-1 +kerning first=350 second=118 amount=-1 +kerning first=66 second=70 amount=-1 +kerning first=317 second=362 amount=-1 +kerning first=352 second=85 amount=-1 +kerning first=230 second=316 amount=-1 +kerning first=196 second=218 amount=-1 +kerning first=356 second=118 amount=-1 +kerning first=111 second=314 amount=-1 +kerning first=45 second=378 amount=-1 +kerning first=205 second=250 amount=-1 +kerning first=268 second=260 amount=-1 +kerning first=199 second=315 amount=-1 +kerning first=103 second=347 amount=-1 +kerning first=356 second=380 amount=-1 +kerning first=83 second=201 amount=-1 +kerning first=8216 second=235 amount=-1 +kerning first=321 second=84 amount=-1 +kerning first=354 second=227 amount=-1 +kerning first=86 second=8249 amount=-1 +kerning first=65 second=366 amount=-1 +kerning first=103 second=224 amount=-1 +kerning first=67 second=325 amount=-1 +kerning first=204 second=363 amount=-1 +kerning first=262 second=204 amount=-1 +kerning first=87 second=111 amount=-1 +kerning first=286 second=197 amount=-1 +kerning first=66 second=209 amount=-1 +kerning first=264 second=291 amount=-1 +kerning first=192 second=291 amount=-1 +kerning first=366 second=378 amount=-1 +kerning first=87 second=291 amount=-1 +kerning first=1046 second=1063 amount=-1 +kerning first=195 second=287 amount=-1 +kerning first=221 second=44 amount=-1 +kerning first=90 second=287 amount=-1 +kerning first=68 second=256 amount=-1 +kerning first=80 second=44 amount=-1 +kerning first=67 second=268 amount=-1 +kerning first=374 second=338 amount=-1 +kerning first=67 second=327 amount=-1 +kerning first=356 second=103 amount=-1 +kerning first=375 second=287 amount=-1 +kerning first=310 second=367 amount=-1 +kerning first=339 second=287 amount=-1 +kerning first=231 second=287 amount=-1 +kerning first=267 second=287 amount=-1 +kerning first=381 second=367 amount=-1 +kerning first=98 second=108 amount=-1 +kerning first=1059 second=1101 amount=-1 +kerning first=205 second=228 amount=-1 +kerning first=87 second=269 amount=-1 +kerning first=221 second=262 amount=-1 +kerning first=1061 second=1060 amount=-1 +kerning first=350 second=344 amount=-1 +kerning first=83 second=44 amount=-1 +kerning first=218 second=350 amount=-1 +kerning first=356 second=74 amount=-1 +kerning first=275 second=108 amount=-1 +kerning first=108 second=106 amount=-1 +kerning first=121 second=261 amount=-1 +kerning first=85 second=261 amount=-1 +kerning first=370 second=261 amount=-1 +kerning first=298 second=261 amount=-1 +kerning first=346 second=289 amount=-1 +kerning first=274 second=289 amount=-1 +kerning first=298 second=367 amount=-1 +kerning first=192 second=370 amount=-1 +kerning first=362 second=350 amount=-1 +kerning first=187 second=282 amount=-1 +kerning first=84 second=339 amount=-1 +kerning first=120 second=251 amount=-1 +kerning first=195 second=353 amount=-1 +kerning first=221 second=210 amount=-1 +kerning first=87 second=229 amount=-1 +kerning first=288 second=45 amount=-1 +kerning first=376 second=275 amount=-1 +kerning first=324 second=45 amount=-1 +kerning first=1061 second=1038 amount=-1 +kerning first=75 second=45 amount=-1 +kerning first=376 second=240 amount=-1 +kerning first=84 second=211 amount=-1 +kerning first=258 second=356 amount=-2 +kerning first=45 second=356 amount=-1 +kerning first=82 second=336 amount=-1 +kerning first=86 second=171 amount=-1 +kerning first=376 second=381 amount=-1 +kerning first=8220 second=224 amount=-1 +kerning first=84 second=352 amount=-1 +kerning first=350 second=194 amount=-1 +kerning first=74 second=226 amount=-1 +kerning first=258 second=255 amount=-1 +kerning first=232 second=119 amount=-1 +kerning first=287 second=226 amount=-1 +kerning first=45 second=255 amount=-1 +kerning first=375 second=113 amount=-1 +kerning first=246 second=44 amount=-1 +kerning first=354 second=44 amount=-1 +kerning first=196 second=119 amount=-1 +kerning first=323 second=226 amount=-1 +kerning first=196 second=367 amount=-1 +kerning first=376 second=119 amount=-1 +kerning first=221 second=227 amount=-1 +kerning first=248 second=314 amount=-1 +kerning first=303 second=113 amount=-1 +kerning first=231 second=225 amount=-1 +kerning first=88 second=363 amount=-1 +kerning first=67 second=290 amount=-1 +kerning first=193 second=363 amount=-1 +kerning first=375 second=225 amount=-1 +kerning first=251 second=318 amount=-1 +kerning first=376 second=79 amount=-1 +kerning first=196 second=86 amount=-2 +kerning first=366 second=193 amount=-1 +kerning first=66 second=103 amount=-1 +kerning first=120 second=226 amount=-1 +kerning first=256 second=8220 amount=-1 +kerning first=45 second=193 amount=-1 +kerning first=328 second=8220 amount=-1 +kerning first=210 second=44 amount=-1 +kerning first=196 second=79 amount=-1 +kerning first=222 second=193 amount=-1 +kerning first=268 second=79 amount=-1 +kerning first=202 second=289 amount=-1 +kerning first=81 second=193 amount=-1 +kerning first=199 second=192 amount=-1 +kerning first=218 second=259 amount=-1 +kerning first=264 second=207 amount=-1 +kerning first=84 second=99 amount=-1 +kerning first=66 second=256 amount=-1 +kerning first=317 second=122 amount=-1 +kerning first=1043 second=1089 amount=-1 +kerning first=87 second=377 amount=-1 +kerning first=291 second=316 amount=-1 +kerning first=66 second=196 amount=-1 +kerning first=255 second=316 amount=-1 +kerning first=356 second=230 amount=-1 +kerning first=368 second=346 amount=-1 +kerning first=363 second=316 amount=-1 +kerning first=101 second=104 amount=-1 +kerning first=260 second=346 amount=-1 +kerning first=85 second=83 amount=-1 +kerning first=231 second=375 amount=-1 +kerning first=327 second=259 amount=-1 +kerning first=267 second=375 amount=-1 +kerning first=187 second=87 amount=-1 +kerning first=262 second=83 amount=-1 +kerning first=255 second=259 amount=-1 +kerning first=370 second=83 amount=-1 +kerning first=339 second=375 amount=-1 +kerning first=219 second=259 amount=-1 +kerning first=1059 second=1107 amount=-1 +kerning first=90 second=375 amount=-1 +kerning first=78 second=259 amount=-1 +kerning first=8250 second=289 amount=-1 +kerning first=195 second=375 amount=-1 +kerning first=288 second=197 amount=-1 +kerning first=236 second=103 amount=-1 +kerning first=376 second=196 amount=-2 +kerning first=200 second=103 amount=-1 +kerning first=268 second=196 amount=-1 +kerning first=268 second=77 amount=-1 +kerning first=356 second=336 amount=-1 +kerning first=87 second=335 amount=-1 +kerning first=350 second=278 amount=-1 +kerning first=229 second=8217 amount=-1 +kerning first=8220 second=243 amount=-1 +kerning first=199 second=75 amount=-1 +kerning first=1118 second=1103 amount=-1 +kerning first=209 second=361 amount=-1 +kerning first=187 second=65 amount=-1 +kerning first=232 second=253 amount=-1 +kerning first=258 second=334 amount=-1 +kerning first=375 second=353 amount=-1 +kerning first=196 second=253 amount=-1 +kerning first=192 second=117 amount=-1 +kerning first=275 second=121 amount=-1 +kerning first=245 second=318 amount=-1 +kerning first=281 second=318 amount=-1 +kerning first=8216 second=281 amount=-1 +kerning first=255 second=97 amount=-1 +kerning first=221 second=328 amount=-1 +kerning first=225 second=121 amount=-1 +kerning first=8250 second=80 amount=-1 +kerning first=354 second=103 amount=-1 +kerning first=120 second=121 amount=-1 +kerning first=87 second=326 amount=-1 +kerning first=277 second=316 amount=-1 +kerning first=84 second=121 amount=-1 +kerning first=80 second=196 amount=-1 +kerning first=221 second=196 amount=-2 +kerning first=221 second=277 amount=-1 +kerning first=288 second=89 amount=-1 +kerning first=376 second=231 amount=-1 +kerning first=302 second=228 amount=-1 +kerning first=89 second=228 amount=-1 +kerning first=281 second=375 amount=-1 +kerning first=253 second=333 amount=-1 +kerning first=376 second=253 amount=-1 +kerning first=353 second=375 amount=-1 +kerning first=317 second=221 amount=-1 +kerning first=193 second=213 amount=-1 +kerning first=88 second=213 amount=-1 +kerning first=311 second=99 amount=-1 +kerning first=245 second=375 amount=-1 +kerning first=267 second=118 amount=-1 +kerning first=205 second=227 amount=-1 +kerning first=87 second=379 amount=-1 +kerning first=262 second=270 amount=-1 +kerning first=193 second=266 amount=-1 +kerning first=1027 second=1103 amount=-1 +kerning first=200 second=291 amount=-1 +kerning first=88 second=266 amount=-1 +kerning first=330 second=103 amount=-1 +kerning first=366 second=103 amount=-1 +kerning first=258 second=103 amount=-1 +kerning first=1042 second=1038 amount=-1 +kerning first=1058 second=1051 amount=-1 +kerning first=117 second=103 amount=-1 +kerning first=199 second=8249 amount=-1 +kerning first=66 second=8217 amount=-1 +kerning first=269 second=224 amount=-1 +kerning first=67 second=334 amount=-1 +kerning first=232 second=44 amount=-1 +kerning first=379 second=249 amount=-1 +kerning first=102 second=8217 amount=1 +kerning first=371 second=232 amount=-1 +kerning first=305 second=171 amount=-1 +kerning first=206 second=117 amount=-1 +kerning first=65 second=117 amount=-1 +kerning first=376 second=284 amount=-1 +kerning first=258 second=365 amount=-1 +kerning first=330 second=365 amount=-1 +kerning first=196 second=284 amount=-1 +kerning first=344 second=264 amount=-1 +kerning first=266 second=382 amount=-1 +kerning first=1046 second=1054 amount=-1 +kerning first=374 second=382 amount=-1 +kerning first=350 second=203 amount=-1 +kerning first=369 second=121 amount=-1 +kerning first=268 second=284 amount=-1 +kerning first=333 second=121 amount=-1 +kerning first=256 second=71 amount=-1 +kerning first=106 second=255 amount=-1 +kerning first=364 second=287 amount=-1 +kerning first=256 second=287 amount=-1 +kerning first=287 second=257 amount=-1 +kerning first=66 second=79 amount=-1 +kerning first=266 second=206 amount=-1 +kerning first=220 second=287 amount=-1 +kerning first=268 second=209 amount=-1 +kerning first=115 second=287 amount=-1 +kerning first=377 second=378 amount=-1 +kerning first=86 second=232 amount=-1 +kerning first=195 second=213 amount=-1 +kerning first=45 second=87 amount=-1 +kerning first=196 second=262 amount=-1 +kerning first=226 second=8221 amount=-1 +kerning first=74 second=257 amount=-1 +kerning first=8220 second=281 amount=-1 +kerning first=376 second=262 amount=-1 +kerning first=268 second=262 amount=-1 +kerning first=66 second=350 amount=-1 +kerning first=332 second=192 amount=-1 +kerning first=368 second=192 amount=-1 +kerning first=352 second=356 amount=-1 +kerning first=253 second=269 amount=-1 +kerning first=288 second=8249 amount=-1 +kerning first=258 second=290 amount=-1 +kerning first=187 second=274 amount=-1 +kerning first=324 second=8249 amount=-1 +kerning first=1114 second=1118 amount=-1 +kerning first=194 second=250 amount=-1 +kerning first=187 second=327 amount=-1 +kerning first=83 second=192 amount=-1 +kerning first=79 second=256 amount=-1 +kerning first=346 second=298 amount=-1 +kerning first=260 second=84 amount=-2 +kerning first=197 second=268 amount=-1 +kerning first=115 second=115 amount=-1 +kerning first=187 second=364 amount=-1 +kerning first=83 second=84 amount=-1 +kerning first=231 second=108 amount=-1 +kerning first=325 second=291 amount=-1 +kerning first=1047 second=1038 amount=-1 +kerning first=253 second=291 amount=-1 +kerning first=84 second=90 amount=-1 +kerning first=217 second=291 amount=-1 +kerning first=76 second=291 amount=-1 +kerning first=199 second=280 amount=-1 +kerning first=73 second=251 amount=-1 +kerning first=218 second=46 amount=-1 +kerning first=86 second=210 amount=-1 +kerning first=75 second=67 amount=-1 +kerning first=364 second=256 amount=-1 +kerning first=354 second=337 amount=-1 +kerning first=45 second=72 amount=-1 +kerning first=220 second=256 amount=-1 +kerning first=214 second=198 amount=-1 +kerning first=269 second=103 amount=-1 +kerning first=258 second=268 amount=-1 +kerning first=350 second=73 amount=-1 +kerning first=298 second=226 amount=-1 +kerning first=89 second=279 amount=-1 +kerning first=370 second=226 amount=-1 +kerning first=217 second=194 amount=-1 +kerning first=257 second=119 amount=-1 +kerning first=313 second=219 amount=-1 +kerning first=221 second=119 amount=-1 +kerning first=325 second=361 amount=-1 +kerning first=253 second=335 amount=-1 +kerning first=344 second=374 amount=-1 +kerning first=77 second=363 amount=-1 +kerning first=365 second=119 amount=-1 +kerning first=268 second=66 amount=-1 +kerning first=256 second=353 amount=-1 +kerning first=115 second=353 amount=-1 +kerning first=352 second=303 amount=-1 +kerning first=323 second=367 amount=-1 +kerning first=72 second=289 amount=-1 +kerning first=376 second=328 amount=-1 +kerning first=249 second=289 amount=-1 +kerning first=256 second=212 amount=-1 +kerning first=1046 second=1098 amount=-1 +kerning first=194 second=338 amount=-1 +kerning first=204 second=257 amount=-1 +kerning first=84 second=286 amount=-1 +kerning first=266 second=338 amount=-1 +kerning first=99 second=257 amount=-1 +kerning first=352 second=237 amount=-1 +kerning first=195 second=8220 amount=-1 +kerning first=85 second=197 amount=-1 +kerning first=89 second=338 amount=-1 +kerning first=8222 second=368 amount=-1 +kerning first=199 second=205 amount=-1 +kerning first=106 second=45 amount=-1 +kerning first=241 second=45 amount=-1 +kerning first=344 second=211 amount=-1 +kerning first=354 second=97 amount=-1 +kerning first=221 second=240 amount=-1 +kerning first=8250 second=364 amount=-1 +kerning first=197 second=290 amount=-1 +kerning first=197 second=356 amount=-2 +kerning first=8250 second=298 amount=-1 +kerning first=356 second=261 amount=-1 +kerning first=85 second=226 amount=-1 +kerning first=283 second=255 amount=-1 +kerning first=264 second=304 amount=-1 +kerning first=324 second=8221 amount=-1 +kerning first=121 second=226 amount=-1 +kerning first=380 second=112 amount=-1 +kerning first=266 second=77 amount=-1 +kerning first=339 second=104 amount=-1 +kerning first=8220 second=193 amount=-2 +kerning first=381 second=380 amount=-1 +kerning first=66 second=253 amount=-1 +kerning first=317 second=377 amount=-1 +kerning first=121 second=248 amount=-1 +kerning first=113 second=8217 amount=-1 +kerning first=243 second=253 amount=-1 +kerning first=315 second=253 amount=-1 +kerning first=279 second=253 amount=-1 +kerning first=1059 second=1057 amount=-1 +kerning first=356 second=283 amount=-1 +kerning first=351 second=253 amount=-1 +kerning first=192 second=86 amount=-2 +kerning first=212 second=65 amount=-1 +kerning first=87 second=260 amount=-2 +kerning first=197 second=334 amount=-1 +kerning first=356 second=65 amount=-2 +kerning first=333 second=46 amount=-1 +kerning first=313 second=382 amount=-1 +kerning first=336 second=260 amount=-1 +kerning first=45 second=202 amount=-1 +kerning first=107 second=283 amount=-1 +kerning first=84 second=264 amount=-1 +kerning first=255 second=347 amount=-1 +kerning first=234 second=318 amount=-1 +kerning first=264 second=260 amount=-1 +kerning first=291 second=347 amount=-1 +kerning first=8218 second=366 amount=-1 +kerning first=253 second=45 amount=-1 +kerning first=193 second=288 amount=-1 +kerning first=78 second=369 amount=-1 +kerning first=1118 second=1076 amount=-1 +kerning first=84 second=46 amount=-1 +kerning first=327 second=369 amount=-1 +kerning first=346 second=364 amount=-1 +kerning first=264 second=282 amount=-1 +kerning first=284 second=87 amount=-1 +kerning first=346 second=201 amount=-1 +kerning first=262 second=268 amount=-1 +kerning first=376 second=100 amount=-1 +kerning first=115 second=375 amount=-1 +kerning first=199 second=346 amount=-1 +kerning first=88 second=288 amount=-1 +kerning first=221 second=381 amount=-1 +kerning first=258 second=351 amount=-1 +kerning first=344 second=352 amount=-1 +kerning first=71 second=87 amount=-1 diff --git a/jme3-examples/src/main/resources/jme3test/font/FreeSerif16Ipad55551.png b/jme3-examples/src/main/resources/jme3test/font/FreeSerif16Ipad55551.png new file mode 100644 index 000000000..36232b22b Binary files /dev/null and b/jme3-examples/src/main/resources/jme3test/font/FreeSerif16Ipad55551.png differ diff --git a/jme3-examples/src/main/resources/jme3test/font/FreeSerif16Ipad55552.png b/jme3-examples/src/main/resources/jme3test/font/FreeSerif16Ipad55552.png new file mode 100644 index 000000000..d4911cfc7 Binary files /dev/null and b/jme3-examples/src/main/resources/jme3test/font/FreeSerif16Ipad55552.png differ diff --git a/jme3-examples/src/main/resources/jme3test/font/FreeSerif32.fnt b/jme3-examples/src/main/resources/jme3test/font/FreeSerif32.fnt new file mode 100644 index 000000000..022adf6de --- /dev/null +++ b/jme3-examples/src/main/resources/jme3test/font/FreeSerif32.fnt @@ -0,0 +1,23475 @@ +info face="Free Serif" size=32 bold=0 italic=0 charset="" unicode=0 stretchH=100 smooth=1 aa=1 padding=1,1,1,1 spacing=-2,-2 +common lineHeight=42 base=31 scaleW=512 scaleH=512 pages=2 packed=0 +page id=0 file="FreeSerif321.png" +page id=1 file="FreeSerif322.png" +chars count=821 +char id=0 x=195 y=465 width=20 height=24 xoffset=1 yoffset=8 xadvance=22 page=0 chnl=0 +char id=13 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=0 page=0 chnl=0 +char id=32 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=33 x=503 y=285 width=6 height=25 xoffset=3 yoffset=8 xadvance=11 page=0 chnl=0 +char id=35 x=215 y=465 width=18 height=24 xoffset=-1 yoffset=8 xadvance=16 page=0 chnl=0 +char id=36 x=46 y=226 width=16 height=29 xoffset=0 yoffset=6 xadvance=16 page=0 chnl=0 +char id=37 x=206 y=314 width=26 height=25 xoffset=0 yoffset=8 xadvance=27 page=0 chnl=0 +char id=38 x=232 y=314 width=25 height=25 xoffset=0 yoffset=8 xadvance=25 page=0 chnl=0 +char id=39 x=505 y=440 width=6 height=11 xoffset=0 yoffset=8 xadvance=6 page=0 chnl=0 +char id=40 x=453 y=135 width=11 height=30 xoffset=0 yoffset=8 xadvance=11 page=0 chnl=0 +char id=41 x=464 y=135 width=11 height=30 xoffset=0 yoffset=8 xadvance=11 page=0 chnl=0 +char id=43 x=482 y=490 width=20 height=19 xoffset=-1 yoffset=13 xadvance=18 page=0 chnl=0 +char id=47 x=257 y=314 width=13 height=25 xoffset=-2 yoffset=8 xadvance=9 page=0 chnl=0 +char id=48 x=270 y=314 width=18 height=25 xoffset=-1 yoffset=8 xadvance=16 page=0 chnl=0 +char id=49 x=233 y=465 width=12 height=24 xoffset=2 yoffset=8 xadvance=16 page=0 chnl=0 +char id=50 x=245 y=465 width=18 height=24 xoffset=-1 yoffset=8 xadvance=16 page=0 chnl=0 +char id=51 x=288 y=314 width=15 height=25 xoffset=0 yoffset=8 xadvance=16 page=0 chnl=0 +char id=52 x=263 y=465 width=18 height=24 xoffset=-1 yoffset=8 xadvance=16 page=0 chnl=0 +char id=53 x=303 y=314 width=15 height=25 xoffset=0 yoffset=8 xadvance=16 page=0 chnl=0 +char id=54 x=318 y=314 width=16 height=25 xoffset=0 yoffset=8 xadvance=16 page=0 chnl=0 +char id=55 x=334 y=314 width=17 height=25 xoffset=-1 yoffset=8 xadvance=16 page=0 chnl=0 +char id=56 x=351 y=314 width=16 height=25 xoffset=0 yoffset=8 xadvance=16 page=0 chnl=0 +char id=57 x=367 y=314 width=17 height=25 xoffset=-1 yoffset=8 xadvance=16 page=0 chnl=0 +char id=58 x=505 y=365 width=6 height=18 xoffset=1 yoffset=15 xadvance=9 page=0 chnl=0 +char id=60 x=316 y=490 width=20 height=20 xoffset=-1 yoffset=13 xadvance=18 page=0 chnl=0 +char id=62 x=336 y=490 width=20 height=20 xoffset=-1 yoffset=13 xadvance=18 page=0 chnl=0 +char id=63 x=384 y=314 width=14 height=25 xoffset=1 yoffset=8 xadvance=14 page=0 chnl=0 +char id=64 x=398 y=314 width=25 height=25 xoffset=2 yoffset=8 xadvance=29 page=0 chnl=0 +char id=65 x=281 y=465 width=25 height=24 xoffset=-1 yoffset=8 xadvance=23 page=0 chnl=0 +char id=66 x=306 y=465 width=21 height=24 xoffset=-1 yoffset=8 xadvance=21 page=0 chnl=0 +char id=67 x=423 y=314 width=23 height=25 xoffset=-1 yoffset=8 xadvance=21 page=0 chnl=0 +char id=68 x=327 y=465 width=24 height=24 xoffset=-1 yoffset=8 xadvance=23 page=0 chnl=0 +char id=69 x=351 y=465 width=22 height=24 xoffset=-1 yoffset=8 xadvance=20 page=0 chnl=0 +char id=70 x=373 y=465 width=20 height=24 xoffset=-1 yoffset=8 xadvance=18 page=0 chnl=0 +char id=71 x=446 y=314 width=24 height=25 xoffset=0 yoffset=8 xadvance=23 page=0 chnl=0 +char id=72 x=393 y=465 width=25 height=24 xoffset=-1 yoffset=8 xadvance=23 page=0 chnl=0 +char id=73 x=418 y=465 width=13 height=24 xoffset=-1 yoffset=8 xadvance=11 page=0 chnl=0 +char id=74 x=470 y=314 width=14 height=25 xoffset=-1 yoffset=8 xadvance=12 page=0 chnl=0 +char id=75 x=431 y=465 width=25 height=24 xoffset=0 yoffset=8 xadvance=23 page=0 chnl=0 +char id=76 x=456 y=465 width=22 height=24 xoffset=-1 yoffset=8 xadvance=20 page=0 chnl=0 +char id=77 x=478 y=465 width=30 height=24 xoffset=-1 yoffset=8 xadvance=28 page=0 chnl=0 +char id=78 x=484 y=314 width=25 height=25 xoffset=-1 yoffset=8 xadvance=23 page=0 chnl=0 +char id=79 x=0 y=340 width=24 height=25 xoffset=0 yoffset=8 xadvance=23 page=0 chnl=0 +char id=81 x=475 y=135 width=24 height=30 xoffset=0 yoffset=8 xadvance=23 page=0 chnl=0 +char id=83 x=24 y=340 width=17 height=25 xoffset=0 yoffset=8 xadvance=18 page=0 chnl=0 +char id=85 x=41 y=340 width=25 height=25 xoffset=-1 yoffset=8 xadvance=23 page=0 chnl=0 +char id=86 x=66 y=340 width=25 height=25 xoffset=-1 yoffset=8 xadvance=23 page=0 chnl=0 +char id=87 x=91 y=340 width=32 height=25 xoffset=-1 yoffset=8 xadvance=30 page=0 chnl=0 +char id=91 x=62 y=226 width=10 height=29 xoffset=1 yoffset=8 xadvance=11 page=0 chnl=0 +char id=92 x=123 y=340 width=12 height=25 xoffset=-1 yoffset=8 xadvance=9 page=0 chnl=0 +char id=93 x=72 y=226 width=10 height=29 xoffset=0 yoffset=9 xadvance=11 page=0 chnl=0 +char id=98 x=135 y=340 width=17 height=25 xoffset=-1 yoffset=8 xadvance=16 page=0 chnl=0 +char id=100 x=152 y=340 width=18 height=25 xoffset=-1 yoffset=8 xadvance=16 page=0 chnl=0 +char id=106 x=109 y=72 width=14 height=31 xoffset=-4 yoffset=8 xadvance=9 page=0 chnl=0 +char id=123 x=499 y=135 width=11 height=30 xoffset=2 yoffset=8 xadvance=15 page=0 chnl=0 +char id=124 x=506 y=226 width=5 height=25 xoffset=1 yoffset=8 xadvance=6 page=0 chnl=0 +char id=125 x=0 y=166 width=11 height=30 xoffset=2 yoffset=8 xadvance=15 page=0 chnl=0 +char id=160 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=161 x=504 y=72 width=6 height=25 xoffset=2 yoffset=14 xadvance=11 page=0 chnl=0 +char id=162 x=470 y=285 width=16 height=26 xoffset=0 yoffset=11 xadvance=16 page=0 chnl=0 +char id=163 x=170 y=340 width=18 height=25 xoffset=-1 yoffset=8 xadvance=16 page=0 chnl=0 +char id=164 x=0 y=490 width=20 height=21 xoffset=-2 yoffset=10 xadvance=16 page=0 chnl=0 +char id=166 x=504 y=0 width=5 height=25 xoffset=1 yoffset=8 xadvance=6 page=0 chnl=0 +char id=167 x=82 y=226 width=14 height=29 xoffset=1 yoffset=8 xadvance=16 page=0 chnl=0 +char id=169 x=0 y=314 width=27 height=26 xoffset=-1 yoffset=7 xadvance=25 page=0 chnl=0 +char id=174 x=27 y=314 width=27 height=26 xoffset=-1 yoffset=7 xadvance=25 page=0 chnl=0 +char id=182 x=96 y=226 width=18 height=29 xoffset=-1 yoffset=8 xadvance=15 page=0 chnl=0 +char id=188 x=188 y=340 width=24 height=25 xoffset=0 yoffset=8 xadvance=24 page=0 chnl=0 +char id=189 x=212 y=340 width=26 height=25 xoffset=-1 yoffset=8 xadvance=24 page=0 chnl=0 +char id=190 x=238 y=340 width=25 height=25 xoffset=-1 yoffset=8 xadvance=24 page=0 chnl=0 +char id=191 x=263 y=340 width=14 height=25 xoffset=-1 yoffset=14 xadvance=14 page=0 chnl=0 +char id=192 x=123 y=72 width=25 height=31 xoffset=-1 yoffset=1 xadvance=23 page=0 chnl=0 +char id=193 x=148 y=72 width=25 height=31 xoffset=-1 yoffset=1 xadvance=23 page=0 chnl=0 +char id=194 x=173 y=72 width=25 height=31 xoffset=-1 yoffset=1 xadvance=23 page=0 chnl=0 +char id=195 x=114 y=226 width=25 height=29 xoffset=-1 yoffset=3 xadvance=23 page=0 chnl=0 +char id=196 x=139 y=226 width=25 height=29 xoffset=-1 yoffset=3 xadvance=23 page=0 chnl=0 +char id=197 x=198 y=72 width=25 height=31 xoffset=-1 yoffset=1 xadvance=23 page=0 chnl=0 +char id=199 x=223 y=72 width=23 height=31 xoffset=-1 yoffset=8 xadvance=21 page=0 chnl=0 +char id=200 x=246 y=72 width=22 height=31 xoffset=-1 yoffset=1 xadvance=20 page=0 chnl=0 +char id=201 x=268 y=72 width=22 height=31 xoffset=-1 yoffset=1 xadvance=20 page=0 chnl=0 +char id=202 x=290 y=72 width=22 height=31 xoffset=-1 yoffset=1 xadvance=20 page=0 chnl=0 +char id=203 x=164 y=226 width=22 height=29 xoffset=-1 yoffset=3 xadvance=20 page=0 chnl=0 +char id=204 x=312 y=72 width=13 height=31 xoffset=-1 yoffset=1 xadvance=11 page=0 chnl=0 +char id=205 x=325 y=72 width=13 height=31 xoffset=-1 yoffset=1 xadvance=11 page=0 chnl=0 +char id=206 x=338 y=72 width=13 height=31 xoffset=-1 yoffset=1 xadvance=11 page=0 chnl=0 +char id=207 x=186 y=226 width=13 height=29 xoffset=-1 yoffset=3 xadvance=11 page=0 chnl=0 +char id=209 x=11 y=166 width=25 height=30 xoffset=-1 yoffset=3 xadvance=23 page=0 chnl=0 +char id=210 x=417 y=0 width=24 height=32 xoffset=0 yoffset=1 xadvance=23 page=0 chnl=0 +char id=211 x=441 y=0 width=24 height=32 xoffset=0 yoffset=1 xadvance=23 page=0 chnl=0 +char id=212 x=465 y=0 width=24 height=32 xoffset=0 yoffset=1 xadvance=23 page=0 chnl=0 +char id=213 x=36 y=166 width=24 height=30 xoffset=0 yoffset=3 xadvance=23 page=0 chnl=0 +char id=214 x=60 y=166 width=24 height=30 xoffset=0 yoffset=3 xadvance=23 page=0 chnl=0 +char id=216 x=199 y=226 width=24 height=29 xoffset=0 yoffset=6 xadvance=23 page=0 chnl=0 +char id=217 x=0 y=40 width=25 height=32 xoffset=-1 yoffset=1 xadvance=23 page=0 chnl=0 +char id=218 x=25 y=40 width=25 height=32 xoffset=-1 yoffset=1 xadvance=23 page=0 chnl=0 +char id=219 x=50 y=40 width=25 height=32 xoffset=-1 yoffset=1 xadvance=23 page=0 chnl=0 +char id=220 x=84 y=166 width=25 height=30 xoffset=-1 yoffset=3 xadvance=23 page=0 chnl=0 +char id=221 x=351 y=72 width=25 height=31 xoffset=-1 yoffset=1 xadvance=23 page=0 chnl=0 +char id=223 x=277 y=340 width=17 height=25 xoffset=-1 yoffset=8 xadvance=16 page=0 chnl=0 +char id=224 x=294 y=340 width=16 height=25 xoffset=0 yoffset=8 xadvance=14 page=0 chnl=0 +char id=225 x=310 y=340 width=16 height=25 xoffset=0 yoffset=8 xadvance=14 page=0 chnl=0 +char id=226 x=326 y=340 width=16 height=25 xoffset=0 yoffset=8 xadvance=14 page=0 chnl=0 +char id=229 x=308 y=285 width=16 height=27 xoffset=0 yoffset=6 xadvance=14 page=0 chnl=0 +char id=232 x=342 y=340 width=16 height=25 xoffset=-1 yoffset=8 xadvance=14 page=0 chnl=0 +char id=233 x=358 y=340 width=16 height=25 xoffset=-1 yoffset=8 xadvance=14 page=0 chnl=0 +char id=234 x=374 y=340 width=16 height=25 xoffset=-1 yoffset=8 xadvance=14 page=0 chnl=0 +char id=240 x=390 y=340 width=18 height=25 xoffset=-1 yoffset=8 xadvance=16 page=0 chnl=0 +char id=242 x=408 y=340 width=18 height=25 xoffset=-1 yoffset=8 xadvance=16 page=0 chnl=0 +char id=243 x=426 y=340 width=18 height=25 xoffset=-1 yoffset=8 xadvance=16 page=0 chnl=0 +char id=244 x=444 y=340 width=18 height=25 xoffset=-1 yoffset=8 xadvance=16 page=0 chnl=0 +char id=247 x=356 y=490 width=20 height=20 xoffset=-1 yoffset=13 xadvance=18 page=0 chnl=0 +char id=249 x=462 y=340 width=18 height=25 xoffset=-1 yoffset=8 xadvance=16 page=0 chnl=0 +char id=250 x=480 y=340 width=18 height=25 xoffset=-1 yoffset=8 xadvance=16 page=0 chnl=0 +char id=251 x=0 y=365 width=18 height=25 xoffset=-1 yoffset=8 xadvance=16 page=0 chnl=0 +char id=253 x=376 y=72 width=18 height=31 xoffset=-1 yoffset=8 xadvance=16 page=0 chnl=0 +char id=254 x=394 y=72 width=17 height=31 xoffset=-1 yoffset=8 xadvance=16 page=0 chnl=0 +char id=255 x=223 y=226 width=18 height=29 xoffset=-1 yoffset=10 xadvance=16 page=0 chnl=0 +char id=256 x=69 y=285 width=25 height=28 xoffset=-1 yoffset=4 xadvance=23 page=0 chnl=0 +char id=258 x=411 y=72 width=25 height=31 xoffset=-1 yoffset=1 xadvance=23 page=0 chnl=0 +char id=259 x=18 y=365 width=16 height=25 xoffset=0 yoffset=8 xadvance=14 page=0 chnl=0 +char id=260 x=109 y=166 width=30 height=30 xoffset=-1 yoffset=8 xadvance=23 page=0 chnl=0 +char id=262 x=75 y=40 width=23 height=32 xoffset=-1 yoffset=1 xadvance=21 page=0 chnl=0 +char id=263 x=34 y=365 width=16 height=25 xoffset=-1 yoffset=8 xadvance=14 page=0 chnl=0 +char id=264 x=98 y=40 width=23 height=32 xoffset=-1 yoffset=1 xadvance=21 page=0 chnl=0 +char id=265 x=50 y=365 width=16 height=25 xoffset=-1 yoffset=8 xadvance=14 page=0 chnl=0 +char id=266 x=139 y=166 width=23 height=30 xoffset=-1 yoffset=3 xadvance=21 page=0 chnl=0 +char id=268 x=121 y=40 width=23 height=32 xoffset=-1 yoffset=1 xadvance=21 page=0 chnl=0 +char id=269 x=66 y=365 width=16 height=25 xoffset=-1 yoffset=8 xadvance=14 page=0 chnl=0 +char id=270 x=436 y=72 width=24 height=31 xoffset=-1 yoffset=1 xadvance=23 page=0 chnl=0 +char id=271 x=82 y=365 width=22 height=25 xoffset=-1 yoffset=8 xadvance=20 page=0 chnl=0 +char id=273 x=104 y=365 width=19 height=25 xoffset=-1 yoffset=8 xadvance=16 page=0 chnl=0 +char id=274 x=94 y=285 width=22 height=28 xoffset=-1 yoffset=4 xadvance=20 page=0 chnl=0 +char id=276 x=460 y=72 width=22 height=31 xoffset=-1 yoffset=1 xadvance=20 page=0 chnl=0 +char id=277 x=123 y=365 width=16 height=25 xoffset=-1 yoffset=8 xadvance=14 page=0 chnl=0 +char id=278 x=241 y=226 width=22 height=29 xoffset=-1 yoffset=3 xadvance=20 page=0 chnl=0 +char id=280 x=162 y=166 width=22 height=30 xoffset=-1 yoffset=8 xadvance=20 page=0 chnl=0 +char id=282 x=482 y=72 width=22 height=31 xoffset=-1 yoffset=1 xadvance=20 page=0 chnl=0 +char id=283 x=139 y=365 width=16 height=25 xoffset=-1 yoffset=8 xadvance=14 page=0 chnl=0 +char id=284 x=144 y=40 width=24 height=32 xoffset=0 yoffset=1 xadvance=23 page=0 chnl=0 +char id=285 x=0 y=104 width=18 height=31 xoffset=-1 yoffset=8 xadvance=16 page=0 chnl=0 +char id=286 x=168 y=40 width=24 height=32 xoffset=0 yoffset=1 xadvance=23 page=0 chnl=0 +char id=287 x=18 y=104 width=18 height=31 xoffset=-1 yoffset=8 xadvance=16 page=0 chnl=0 +char id=288 x=184 y=166 width=24 height=30 xoffset=0 yoffset=3 xadvance=23 page=0 chnl=0 +char id=289 x=263 y=226 width=18 height=29 xoffset=-1 yoffset=10 xadvance=16 page=0 chnl=0 +char id=290 x=137 y=0 width=24 height=34 xoffset=0 yoffset=8 xadvance=23 page=0 chnl=0 +char id=291 x=161 y=0 width=18 height=34 xoffset=-1 yoffset=5 xadvance=16 page=0 chnl=0 +char id=292 x=36 y=104 width=25 height=31 xoffset=-1 yoffset=1 xadvance=23 page=0 chnl=0 +char id=293 x=61 y=104 width=18 height=31 xoffset=-1 yoffset=1 xadvance=16 page=0 chnl=0 +char id=296 x=281 y=226 width=13 height=29 xoffset=-1 yoffset=3 xadvance=11 page=0 chnl=0 +char id=298 x=116 y=285 width=13 height=28 xoffset=-1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=299 x=20 y=490 width=13 height=21 xoffset=-2 yoffset=11 xadvance=9 page=0 chnl=0 +char id=300 x=79 y=104 width=13 height=31 xoffset=-1 yoffset=1 xadvance=11 page=0 chnl=0 +char id=302 x=208 y=166 width=16 height=30 xoffset=-1 yoffset=8 xadvance=11 page=0 chnl=0 +char id=303 x=224 y=166 width=11 height=30 xoffset=-1 yoffset=8 xadvance=9 page=0 chnl=0 +char id=304 x=294 y=226 width=13 height=29 xoffset=-1 yoffset=3 xadvance=11 page=0 chnl=0 +char id=306 x=155 y=365 width=24 height=25 xoffset=-1 yoffset=8 xadvance=23 page=0 chnl=0 +char id=307 x=92 y=104 width=17 height=31 xoffset=-1 yoffset=8 xadvance=17 page=0 chnl=0 +char id=308 x=489 y=0 width=15 height=32 xoffset=-1 yoffset=1 xadvance=12 page=0 chnl=0 +char id=309 x=109 y=104 width=17 height=31 xoffset=-4 yoffset=8 xadvance=9 page=0 chnl=0 +char id=310 x=179 y=0 width=25 height=34 xoffset=0 yoffset=8 xadvance=23 page=0 chnl=0 +char id=311 x=204 y=0 width=19 height=34 xoffset=-1 yoffset=8 xadvance=16 page=0 chnl=0 +char id=313 x=126 y=104 width=22 height=31 xoffset=-1 yoffset=1 xadvance=20 page=0 chnl=0 +char id=314 x=148 y=104 width=12 height=31 xoffset=-1 yoffset=1 xadvance=9 page=0 chnl=0 +char id=315 x=223 y=0 width=22 height=34 xoffset=-1 yoffset=8 xadvance=20 page=0 chnl=0 +char id=316 x=245 y=0 width=11 height=34 xoffset=-1 yoffset=8 xadvance=9 page=0 chnl=0 +char id=323 x=192 y=40 width=25 height=32 xoffset=-1 yoffset=1 xadvance=23 page=0 chnl=0 +char id=325 x=256 y=0 width=25 height=34 xoffset=-1 yoffset=8 xadvance=23 page=0 chnl=0 +char id=326 x=324 y=285 width=18 height=27 xoffset=-1 yoffset=15 xadvance=16 page=0 chnl=0 +char id=327 x=217 y=40 width=25 height=32 xoffset=-1 yoffset=1 xadvance=23 page=0 chnl=0 +char id=330 x=179 y=365 width=24 height=25 xoffset=-1 yoffset=8 xadvance=23 page=0 chnl=0 +char id=332 x=307 y=226 width=24 height=29 xoffset=0 yoffset=4 xadvance=23 page=0 chnl=0 +char id=334 x=242 y=40 width=24 height=32 xoffset=0 yoffset=1 xadvance=23 page=0 chnl=0 +char id=335 x=203 y=365 width=18 height=25 xoffset=-1 yoffset=8 xadvance=16 page=0 chnl=0 +char id=336 x=266 y=40 width=24 height=32 xoffset=0 yoffset=1 xadvance=23 page=0 chnl=0 +char id=337 x=221 y=365 width=18 height=25 xoffset=-1 yoffset=8 xadvance=16 page=0 chnl=0 +char id=338 x=239 y=365 width=31 height=25 xoffset=-1 yoffset=8 xadvance=28 page=0 chnl=0 +char id=340 x=160 y=104 width=24 height=31 xoffset=-1 yoffset=1 xadvance=21 page=0 chnl=0 +char id=342 x=281 y=0 width=24 height=34 xoffset=-1 yoffset=8 xadvance=21 page=0 chnl=0 +char id=343 x=342 y=285 width=13 height=27 xoffset=-1 yoffset=15 xadvance=11 page=0 chnl=0 +char id=344 x=184 y=104 width=24 height=31 xoffset=-1 yoffset=1 xadvance=21 page=0 chnl=0 +char id=346 x=290 y=40 width=17 height=32 xoffset=0 yoffset=1 xadvance=18 page=0 chnl=0 +char id=347 x=498 y=340 width=13 height=25 xoffset=0 yoffset=8 xadvance=12 page=0 chnl=0 +char id=348 x=307 y=40 width=17 height=32 xoffset=0 yoffset=1 xadvance=18 page=0 chnl=0 +char id=349 x=270 y=365 width=13 height=25 xoffset=0 yoffset=8 xadvance=12 page=0 chnl=0 +char id=350 x=208 y=104 width=17 height=31 xoffset=0 yoffset=8 xadvance=18 page=0 chnl=0 +char id=352 x=324 y=40 width=17 height=32 xoffset=0 yoffset=1 xadvance=18 page=0 chnl=0 +char id=353 x=283 y=365 width=13 height=25 xoffset=0 yoffset=8 xadvance=12 page=0 chnl=0 +char id=354 x=225 y=104 width=21 height=31 xoffset=-1 yoffset=8 xadvance=20 page=0 chnl=0 +char id=355 x=129 y=285 width=11 height=28 xoffset=-1 yoffset=11 xadvance=9 page=0 chnl=0 +char id=356 x=246 y=104 width=21 height=31 xoffset=-1 yoffset=1 xadvance=20 page=0 chnl=0 +char id=360 x=235 y=166 width=25 height=30 xoffset=-1 yoffset=3 xadvance=23 page=0 chnl=0 +char id=362 x=331 y=226 width=25 height=29 xoffset=-1 yoffset=4 xadvance=23 page=0 chnl=0 +char id=364 x=341 y=40 width=25 height=32 xoffset=-1 yoffset=1 xadvance=23 page=0 chnl=0 +char id=365 x=296 y=365 width=18 height=25 xoffset=-1 yoffset=8 xadvance=16 page=0 chnl=0 +char id=366 x=366 y=40 width=25 height=32 xoffset=-1 yoffset=1 xadvance=23 page=0 chnl=0 +char id=367 x=355 y=285 width=18 height=27 xoffset=-1 yoffset=6 xadvance=16 page=0 chnl=0 +char id=368 x=391 y=40 width=25 height=32 xoffset=-1 yoffset=1 xadvance=23 page=0 chnl=0 +char id=369 x=314 y=365 width=18 height=25 xoffset=-1 yoffset=8 xadvance=16 page=0 chnl=0 +char id=370 x=260 y=166 width=25 height=30 xoffset=-1 yoffset=8 xadvance=23 page=0 chnl=0 +char id=372 x=416 y=40 width=32 height=32 xoffset=-1 yoffset=1 xadvance=30 page=0 chnl=0 +char id=373 x=332 y=365 width=25 height=25 xoffset=-1 yoffset=8 xadvance=23 page=0 chnl=0 +char id=374 x=267 y=104 width=25 height=31 xoffset=-1 yoffset=1 xadvance=23 page=0 chnl=0 +char id=375 x=292 y=104 width=18 height=31 xoffset=-1 yoffset=8 xadvance=16 page=0 chnl=0 +char id=376 x=356 y=226 width=25 height=29 xoffset=-1 yoffset=3 xadvance=23 page=0 chnl=0 +char id=377 x=310 y=104 width=22 height=31 xoffset=-1 yoffset=1 xadvance=20 page=0 chnl=0 +char id=379 x=381 y=226 width=22 height=29 xoffset=-1 yoffset=3 xadvance=20 page=0 chnl=0 +char id=381 x=332 y=104 width=22 height=31 xoffset=-1 yoffset=1 xadvance=20 page=0 chnl=0 +char id=902 x=357 y=365 width=25 height=25 xoffset=-1 yoffset=7 xadvance=23 page=0 chnl=0 +char id=904 x=382 y=365 width=27 height=25 xoffset=-1 yoffset=7 xadvance=26 page=0 chnl=0 +char id=905 x=409 y=365 width=31 height=25 xoffset=-1 yoffset=7 xadvance=29 page=0 chnl=0 +char id=906 x=440 y=365 width=18 height=25 xoffset=-1 yoffset=7 xadvance=16 page=0 chnl=0 +char id=908 x=54 y=314 width=28 height=26 xoffset=-1 yoffset=7 xadvance=26 page=0 chnl=0 +char id=910 x=458 y=365 width=30 height=25 xoffset=-1 yoffset=7 xadvance=28 page=0 chnl=0 +char id=911 x=0 y=390 width=29 height=25 xoffset=-1 yoffset=7 xadvance=28 page=0 chnl=0 +char id=912 x=140 y=285 width=14 height=28 xoffset=-3 yoffset=5 xadvance=9 page=0 chnl=0 +char id=920 x=29 y=390 width=25 height=25 xoffset=-1 yoffset=8 xadvance=23 page=0 chnl=0 +char id=925 x=54 y=390 width=25 height=25 xoffset=-1 yoffset=8 xadvance=23 page=0 chnl=0 +char id=927 x=79 y=390 width=24 height=25 xoffset=0 yoffset=8 xadvance=23 page=0 chnl=0 +char id=938 x=403 y=226 width=13 height=29 xoffset=-1 yoffset=3 xadvance=11 page=0 chnl=0 +char id=939 x=416 y=226 width=23 height=29 xoffset=0 yoffset=3 xadvance=23 page=0 chnl=0 +char id=940 x=154 y=285 width=19 height=28 xoffset=0 yoffset=5 xadvance=19 page=0 chnl=0 +char id=941 x=173 y=285 width=14 height=28 xoffset=0 yoffset=5 xadvance=14 page=0 chnl=0 +char id=942 x=94 y=0 width=18 height=35 xoffset=-1 yoffset=5 xadvance=17 page=0 chnl=0 +char id=943 x=187 y=285 width=9 height=28 xoffset=1 yoffset=5 xadvance=9 page=0 chnl=0 +char id=944 x=373 y=285 width=17 height=27 xoffset=-1 yoffset=6 xadvance=16 page=0 chnl=0 +char id=946 x=354 y=104 width=16 height=31 xoffset=1 yoffset=8 xadvance=17 page=0 chnl=0 +char id=947 x=488 y=365 width=17 height=25 xoffset=-1 yoffset=15 xadvance=15 page=0 chnl=0 +char id=948 x=103 y=390 width=17 height=25 xoffset=0 yoffset=8 xadvance=17 page=0 chnl=0 +char id=950 x=448 y=40 width=16 height=32 xoffset=0 yoffset=7 xadvance=15 page=0 chnl=0 +char id=951 x=120 y=390 width=18 height=25 xoffset=-1 yoffset=15 xadvance=17 page=0 chnl=0 +char id=952 x=138 y=390 width=17 height=25 xoffset=0 yoffset=8 xadvance=17 page=0 chnl=0 +char id=953 x=502 y=490 width=9 height=18 xoffset=1 yoffset=15 xadvance=9 page=0 chnl=0 +char id=955 x=155 y=390 width=17 height=25 xoffset=-1 yoffset=8 xadvance=15 page=0 chnl=0 +char id=956 x=172 y=390 width=17 height=25 xoffset=1 yoffset=15 xadvance=17 page=0 chnl=0 +char id=958 x=464 y=40 width=18 height=32 xoffset=-1 yoffset=6 xadvance=16 page=0 chnl=0 +char id=961 x=189 y=390 width=17 height=25 xoffset=0 yoffset=15 xadvance=17 page=0 chnl=0 +char id=962 x=206 y=390 width=16 height=25 xoffset=0 yoffset=15 xadvance=14 page=0 chnl=0 +char id=966 x=222 y=390 width=21 height=25 xoffset=0 yoffset=15 xadvance=21 page=0 chnl=0 +char id=968 x=439 y=226 width=23 height=29 xoffset=-1 yoffset=11 xadvance=22 page=0 chnl=0 +char id=972 x=196 y=285 width=18 height=28 xoffset=-1 yoffset=5 xadvance=16 page=0 chnl=0 +char id=973 x=390 y=285 width=17 height=27 xoffset=-1 yoffset=6 xadvance=16 page=0 chnl=0 +char id=974 x=407 y=285 width=22 height=27 xoffset=0 yoffset=6 xadvance=22 page=0 chnl=0 +char id=976 x=486 y=285 width=17 height=26 xoffset=0 yoffset=7 xadvance=17 page=0 chnl=0 +char id=977 x=82 y=314 width=21 height=26 xoffset=-1 yoffset=7 xadvance=19 page=0 chnl=0 +char id=979 x=243 y=390 width=28 height=25 xoffset=-1 yoffset=7 xadvance=26 page=0 chnl=0 +char id=980 x=462 y=226 width=23 height=29 xoffset=-2 yoffset=3 xadvance=20 page=0 chnl=0 +char id=981 x=485 y=226 width=21 height=29 xoffset=0 yoffset=11 xadvance=20 page=0 chnl=0 +char id=982 x=376 y=490 width=23 height=20 xoffset=-1 yoffset=13 xadvance=22 page=0 chnl=0 +char id=985 x=271 y=390 width=18 height=25 xoffset=-1 yoffset=15 xadvance=16 page=0 chnl=0 +char id=990 x=289 y=390 width=23 height=25 xoffset=-1 yoffset=8 xadvance=21 page=0 chnl=0 +char id=991 x=370 y=104 width=13 height=31 xoffset=0 yoffset=7 xadvance=13 page=0 chnl=0 +char id=993 x=383 y=104 width=20 height=31 xoffset=-1 yoffset=7 xadvance=18 page=0 chnl=0 +char id=994 x=0 y=72 width=31 height=32 xoffset=0 yoffset=8 xadvance=31 page=0 chnl=0 +char id=995 x=312 y=390 width=23 height=25 xoffset=-1 yoffset=15 xadvance=22 page=0 chnl=0 +char id=996 x=285 y=166 width=18 height=30 xoffset=0 yoffset=8 xadvance=19 page=0 chnl=0 +char id=998 x=303 y=166 width=19 height=30 xoffset=0 yoffset=8 xadvance=19 page=0 chnl=0 +char id=999 x=399 y=490 width=16 height=20 xoffset=-1 yoffset=13 xadvance=15 page=0 chnl=0 +char id=1000 x=214 y=285 width=18 height=28 xoffset=0 yoffset=8 xadvance=16 page=0 chnl=0 +char id=1001 x=415 y=490 width=13 height=20 xoffset=-1 yoffset=15 xadvance=11 page=0 chnl=0 +char id=1002 x=103 y=314 width=27 height=26 xoffset=0 yoffset=8 xadvance=27 page=0 chnl=0 +char id=1004 x=0 y=256 width=20 height=29 xoffset=0 yoffset=4 xadvance=18 page=0 chnl=0 +char id=1005 x=33 y=490 width=16 height=21 xoffset=-1 yoffset=12 xadvance=13 page=0 chnl=0 +char id=1006 x=305 y=0 width=21 height=34 xoffset=0 yoffset=4 xadvance=20 page=0 chnl=0 +char id=1007 x=20 y=256 width=16 height=29 xoffset=-1 yoffset=11 xadvance=14 page=0 chnl=0 +char id=1009 x=335 y=390 width=17 height=25 xoffset=0 yoffset=15 xadvance=17 page=0 chnl=0 +char id=1011 x=403 y=104 width=14 height=31 xoffset=-4 yoffset=8 xadvance=9 page=0 chnl=0 +char id=1012 x=352 y=390 width=24 height=25 xoffset=0 yoffset=8 xadvance=23 page=0 chnl=0 +char id=1016 x=322 y=166 width=19 height=30 xoffset=-1 yoffset=9 xadvance=17 page=0 chnl=0 +char id=1017 x=376 y=390 width=23 height=25 xoffset=-1 yoffset=8 xadvance=21 page=0 chnl=0 +char id=1021 x=399 y=390 width=23 height=25 xoffset=-1 yoffset=8 xadvance=21 page=0 chnl=0 +char id=1022 x=422 y=390 width=23 height=25 xoffset=-1 yoffset=8 xadvance=32 page=0 chnl=0 +char id=1023 x=445 y=390 width=23 height=25 xoffset=-1 yoffset=8 xadvance=32 page=0 chnl=0 +char id=1024 x=417 y=104 width=22 height=31 xoffset=-1 yoffset=1 xadvance=20 page=0 chnl=0 +char id=1025 x=36 y=256 width=22 height=29 xoffset=-1 yoffset=3 xadvance=20 page=0 chnl=0 +char id=1026 x=468 y=390 width=25 height=25 xoffset=-1 yoffset=8 xadvance=24 page=0 chnl=0 +char id=1027 x=439 y=104 width=20 height=31 xoffset=-1 yoffset=1 xadvance=18 page=0 chnl=0 +char id=1028 x=0 y=415 width=22 height=25 xoffset=0 yoffset=8 xadvance=21 page=0 chnl=0 +char id=1029 x=493 y=390 width=17 height=25 xoffset=-1 yoffset=8 xadvance=16 page=0 chnl=0 +char id=1031 x=341 y=166 width=13 height=30 xoffset=-1 yoffset=2 xadvance=11 page=0 chnl=0 +char id=1032 x=22 y=415 width=14 height=25 xoffset=-1 yoffset=8 xadvance=12 page=0 chnl=0 +char id=1033 x=36 y=415 width=32 height=25 xoffset=-1 yoffset=8 xadvance=30 page=0 chnl=0 +char id=1035 x=68 y=415 width=28 height=25 xoffset=-1 yoffset=8 xadvance=26 page=0 chnl=0 +char id=1036 x=459 y=104 width=24 height=31 xoffset=-1 yoffset=1 xadvance=21 page=0 chnl=0 +char id=1037 x=483 y=104 width=25 height=31 xoffset=-1 yoffset=1 xadvance=23 page=0 chnl=0 +char id=1038 x=0 y=135 width=25 height=31 xoffset=-1 yoffset=2 xadvance=23 page=0 chnl=0 +char id=1039 x=354 y=166 width=25 height=30 xoffset=-1 yoffset=8 xadvance=23 page=0 chnl=0 +char id=1044 x=379 y=166 width=23 height=30 xoffset=-1 yoffset=8 xadvance=20 page=0 chnl=0 +char id=1047 x=96 y=415 width=20 height=25 xoffset=-1 yoffset=8 xadvance=19 page=0 chnl=0 +char id=1049 x=402 y=166 width=25 height=30 xoffset=-1 yoffset=2 xadvance=23 page=0 chnl=0 +char id=1051 x=116 y=415 width=24 height=25 xoffset=-1 yoffset=8 xadvance=22 page=0 chnl=0 +char id=1054 x=140 y=415 width=24 height=25 xoffset=0 yoffset=8 xadvance=23 page=0 chnl=0 +char id=1057 x=164 y=415 width=23 height=25 xoffset=-1 yoffset=8 xadvance=21 page=0 chnl=0 +char id=1059 x=187 y=415 width=25 height=25 xoffset=-1 yoffset=8 xadvance=23 page=0 chnl=0 +char id=1062 x=427 y=166 width=25 height=30 xoffset=-1 yoffset=8 xadvance=23 page=0 chnl=0 +char id=1065 x=452 y=166 width=34 height=30 xoffset=-1 yoffset=8 xadvance=32 page=0 chnl=0 +char id=1069 x=212 y=415 width=23 height=25 xoffset=-1 yoffset=8 xadvance=21 page=0 chnl=0 +char id=1070 x=235 y=415 width=32 height=25 xoffset=-1 yoffset=8 xadvance=31 page=0 chnl=0 +char id=1073 x=130 y=314 width=18 height=26 xoffset=-1 yoffset=7 xadvance=16 page=0 chnl=0 +char id=1076 x=49 y=490 width=18 height=21 xoffset=-1 yoffset=15 xadvance=16 page=0 chnl=0 +char id=1092 x=25 y=135 width=24 height=31 xoffset=-1 yoffset=8 xadvance=22 page=0 chnl=0 +char id=1094 x=67 y=490 width=19 height=21 xoffset=-1 yoffset=15 xadvance=17 page=0 chnl=0 +char id=1097 x=86 y=490 width=26 height=21 xoffset=-1 yoffset=15 xadvance=24 page=0 chnl=0 +char id=1104 x=267 y=415 width=16 height=25 xoffset=-1 yoffset=8 xadvance=14 page=0 chnl=0 +char id=1106 x=49 y=135 width=17 height=31 xoffset=-1 yoffset=8 xadvance=15 page=0 chnl=0 +char id=1112 x=66 y=135 width=14 height=31 xoffset=-4 yoffset=8 xadvance=9 page=0 chnl=0 +char id=1118 x=80 y=135 width=18 height=31 xoffset=-1 yoffset=8 xadvance=15 page=0 chnl=0 +char id=1120 x=283 y=415 width=33 height=25 xoffset=-1 yoffset=8 xadvance=31 page=0 chnl=0 +char id=1124 x=316 y=415 width=32 height=25 xoffset=-1 yoffset=8 xadvance=30 page=0 chnl=0 +char id=1134 x=76 y=0 width=18 height=37 xoffset=-1 yoffset=2 xadvance=17 page=0 chnl=0 +char id=1135 x=232 y=285 width=14 height=28 xoffset=-1 yoffset=10 xadvance=13 page=0 chnl=0 +char id=1137 x=98 y=135 width=24 height=31 xoffset=-1 yoffset=8 xadvance=22 page=0 chnl=0 +char id=1138 x=348 y=415 width=24 height=25 xoffset=0 yoffset=8 xadvance=23 page=0 chnl=0 +char id=1140 x=372 y=415 width=27 height=25 xoffset=-1 yoffset=8 xadvance=25 page=0 chnl=0 +char id=1142 x=482 y=40 width=27 height=32 xoffset=-1 yoffset=1 xadvance=25 page=0 chnl=0 +char id=1143 x=399 y=415 width=21 height=25 xoffset=-2 yoffset=8 xadvance=18 page=0 chnl=0 +char id=1144 x=122 y=135 width=41 height=31 xoffset=-1 yoffset=8 xadvance=39 page=0 chnl=0 +char id=1146 x=58 y=256 width=28 height=29 xoffset=0 yoffset=6 xadvance=28 page=0 chnl=0 +char id=1147 x=428 y=490 width=21 height=20 xoffset=-1 yoffset=14 xadvance=20 page=0 chnl=0 +char id=1148 x=31 y=72 width=33 height=32 xoffset=-1 yoffset=1 xadvance=31 page=0 chnl=0 +char id=1149 x=148 y=314 width=24 height=26 xoffset=-1 yoffset=7 xadvance=21 page=0 chnl=0 +char id=1150 x=0 y=196 width=33 height=30 xoffset=-1 yoffset=3 xadvance=31 page=0 chnl=0 +char id=1160 x=326 y=0 width=68 height=34 xoffset=-26 yoffset=2 xadvance=0 page=0 chnl=0 +char id=1161 x=0 y=0 width=76 height=40 xoffset=-27 yoffset=1 xadvance=0 page=0 chnl=0 +char id=1162 x=112 y=0 width=25 height=35 xoffset=-1 yoffset=2 xadvance=23 page=0 chnl=0 +char id=1163 x=86 y=256 width=19 height=29 xoffset=-1 yoffset=8 xadvance=17 page=0 chnl=0 +char id=1168 x=429 y=285 width=20 height=27 xoffset=-1 yoffset=5 xadvance=18 page=0 chnl=0 +char id=1169 x=449 y=490 width=15 height=20 xoffset=-1 yoffset=12 xadvance=13 page=0 chnl=0 +char id=1172 x=163 y=135 width=21 height=31 xoffset=-1 yoffset=8 xadvance=20 page=0 chnl=0 +char id=1174 x=33 y=196 width=34 height=30 xoffset=-1 yoffset=8 xadvance=32 page=0 chnl=0 +char id=1175 x=112 y=490 width=24 height=21 xoffset=-1 yoffset=15 xadvance=22 page=0 chnl=0 +char id=1176 x=184 y=135 width=20 height=31 xoffset=-1 yoffset=8 xadvance=19 page=0 chnl=0 +char id=1178 x=486 y=166 width=24 height=30 xoffset=-1 yoffset=8 xadvance=22 page=0 chnl=0 +char id=1179 x=136 y=490 width=19 height=21 xoffset=-1 yoffset=15 xadvance=17 page=0 chnl=0 +char id=1186 x=67 y=196 width=25 height=30 xoffset=-1 yoffset=8 xadvance=23 page=0 chnl=0 +char id=1187 x=155 y=490 width=19 height=21 xoffset=-1 yoffset=15 xadvance=17 page=0 chnl=0 +char id=1190 x=204 y=135 width=34 height=31 xoffset=-1 yoffset=8 xadvance=33 page=0 chnl=0 +char id=1192 x=420 y=415 width=25 height=25 xoffset=0 yoffset=8 xadvance=24 page=0 chnl=0 +char id=1194 x=238 y=135 width=22 height=31 xoffset=0 yoffset=8 xadvance=21 page=0 chnl=0 +char id=1196 x=105 y=256 width=21 height=29 xoffset=-1 yoffset=8 xadvance=19 page=0 chnl=0 +char id=1197 x=174 y=490 width=17 height=21 xoffset=-1 yoffset=15 xadvance=14 page=0 chnl=0 +char id=1202 x=92 y=196 width=27 height=30 xoffset=-1 yoffset=8 xadvance=25 page=0 chnl=0 +char id=1203 x=191 y=490 width=19 height=21 xoffset=-1 yoffset=15 xadvance=17 page=0 chnl=0 +char id=1204 x=126 y=256 width=33 height=29 xoffset=-1 yoffset=8 xadvance=31 page=0 chnl=0 +char id=1205 x=210 y=490 width=24 height=21 xoffset=-1 yoffset=15 xadvance=22 page=0 chnl=0 +char id=1206 x=119 y=196 width=24 height=30 xoffset=-1 yoffset=8 xadvance=22 page=0 chnl=0 +char id=1207 x=234 y=490 width=18 height=21 xoffset=-1 yoffset=15 xadvance=16 page=0 chnl=0 +char id=1212 x=445 y=415 width=29 height=25 xoffset=-1 yoffset=8 xadvance=28 page=0 chnl=0 +char id=1214 x=159 y=256 width=29 height=29 xoffset=-1 yoffset=8 xadvance=28 page=0 chnl=0 +char id=1217 x=143 y=196 width=32 height=30 xoffset=-1 yoffset=2 xadvance=30 page=0 chnl=0 +char id=1219 x=260 y=135 width=22 height=31 xoffset=-1 yoffset=8 xadvance=20 page=0 chnl=0 +char id=1221 x=188 y=256 width=24 height=29 xoffset=-1 yoffset=8 xadvance=22 page=0 chnl=0 +char id=1223 x=175 y=196 width=25 height=30 xoffset=-1 yoffset=8 xadvance=23 page=0 chnl=0 +char id=1225 x=212 y=256 width=25 height=29 xoffset=-1 yoffset=8 xadvance=23 page=0 chnl=0 +char id=1227 x=237 y=256 width=24 height=29 xoffset=-1 yoffset=8 xadvance=22 page=0 chnl=0 +char id=1228 x=252 y=490 width=18 height=21 xoffset=-1 yoffset=15 xadvance=16 page=0 chnl=0 +char id=1229 x=261 y=256 width=30 height=29 xoffset=-1 yoffset=8 xadvance=29 page=0 chnl=0 +char id=1232 x=200 y=196 width=25 height=30 xoffset=-1 yoffset=2 xadvance=23 page=0 chnl=0 +char id=1233 x=474 y=415 width=16 height=25 xoffset=0 yoffset=8 xadvance=14 page=0 chnl=0 +char id=1234 x=225 y=196 width=25 height=30 xoffset=-1 yoffset=2 xadvance=23 page=0 chnl=0 +char id=1238 x=250 y=196 width=22 height=30 xoffset=-1 yoffset=2 xadvance=20 page=0 chnl=0 +char id=1239 x=490 y=415 width=16 height=25 xoffset=-1 yoffset=8 xadvance=14 page=0 chnl=0 +char id=1240 x=0 y=440 width=24 height=25 xoffset=-1 yoffset=8 xadvance=23 page=0 chnl=0 +char id=1242 x=272 y=196 width=24 height=30 xoffset=-1 yoffset=3 xadvance=23 page=0 chnl=0 +char id=1244 x=291 y=256 width=32 height=29 xoffset=-1 yoffset=3 xadvance=30 page=0 chnl=0 +char id=1246 x=296 y=196 width=20 height=30 xoffset=-1 yoffset=3 xadvance=19 page=0 chnl=0 +char id=1248 x=24 y=440 width=18 height=25 xoffset=-1 yoffset=8 xadvance=17 page=0 chnl=0 +char id=1250 x=246 y=285 width=25 height=28 xoffset=-1 yoffset=4 xadvance=23 page=0 chnl=0 +char id=1252 x=323 y=256 width=25 height=29 xoffset=-1 yoffset=3 xadvance=23 page=0 chnl=0 +char id=1254 x=316 y=196 width=24 height=30 xoffset=0 yoffset=3 xadvance=23 page=0 chnl=0 +char id=1256 x=42 y=440 width=24 height=25 xoffset=0 yoffset=8 xadvance=23 page=0 chnl=0 +char id=1258 x=340 y=196 width=24 height=30 xoffset=0 yoffset=3 xadvance=23 page=0 chnl=0 +char id=1260 x=364 y=196 width=23 height=30 xoffset=-1 yoffset=3 xadvance=21 page=0 chnl=0 +char id=1262 x=348 y=256 width=25 height=29 xoffset=-1 yoffset=4 xadvance=23 page=0 chnl=0 +char id=1263 x=373 y=256 width=18 height=29 xoffset=-1 yoffset=10 xadvance=15 page=0 chnl=0 +char id=1264 x=387 y=196 width=25 height=30 xoffset=-1 yoffset=3 xadvance=23 page=0 chnl=0 +char id=1265 x=391 y=256 width=18 height=29 xoffset=-1 yoffset=10 xadvance=15 page=0 chnl=0 +char id=1266 x=64 y=72 width=25 height=32 xoffset=-1 yoffset=1 xadvance=23 page=0 chnl=0 +char id=1267 x=282 y=135 width=18 height=31 xoffset=-1 yoffset=8 xadvance=15 page=0 chnl=0 +char id=1268 x=409 y=256 width=24 height=29 xoffset=-1 yoffset=3 xadvance=22 page=0 chnl=0 +char id=1270 x=433 y=256 width=20 height=29 xoffset=-1 yoffset=8 xadvance=18 page=0 chnl=0 +char id=1271 x=270 y=490 width=14 height=21 xoffset=-1 yoffset=15 xadvance=12 page=0 chnl=0 +char id=1272 x=453 y=256 width=30 height=29 xoffset=-1 yoffset=3 xadvance=28 page=0 chnl=0 +char id=1274 x=89 y=72 width=20 height=32 xoffset=-1 yoffset=8 xadvance=18 page=0 chnl=0 +char id=1275 x=66 y=440 width=14 height=25 xoffset=-1 yoffset=15 xadvance=12 page=0 chnl=0 +char id=1276 x=412 y=196 width=25 height=30 xoffset=-1 yoffset=8 xadvance=23 page=0 chnl=0 +char id=1281 x=80 y=440 width=18 height=25 xoffset=-1 yoffset=8 xadvance=16 page=0 chnl=0 +char id=1283 x=98 y=440 width=22 height=25 xoffset=-1 yoffset=8 xadvance=20 page=0 chnl=0 +char id=1284 x=120 y=440 width=28 height=25 xoffset=-1 yoffset=8 xadvance=26 page=0 chnl=0 +char id=1286 x=483 y=256 width=20 height=29 xoffset=-1 yoffset=8 xadvance=18 page=0 chnl=0 +char id=1288 x=148 y=440 width=32 height=25 xoffset=-1 yoffset=8 xadvance=31 page=0 chnl=0 +char id=1290 x=180 y=440 width=33 height=25 xoffset=-1 yoffset=8 xadvance=31 page=0 chnl=0 +char id=1292 x=213 y=440 width=24 height=25 xoffset=0 yoffset=8 xadvance=23 page=0 chnl=0 +char id=1294 x=237 y=440 width=25 height=25 xoffset=-1 yoffset=8 xadvance=23 page=0 chnl=0 +char id=1296 x=262 y=440 width=17 height=25 xoffset=0 yoffset=8 xadvance=17 page=0 chnl=0 +char id=1298 x=437 y=196 width=24 height=30 xoffset=-1 yoffset=8 xadvance=22 page=0 chnl=0 +char id=1300 x=279 y=440 width=33 height=25 xoffset=-1 yoffset=8 xadvance=31 page=0 chnl=0 +char id=1306 x=461 y=196 width=24 height=30 xoffset=0 yoffset=8 xadvance=23 page=0 chnl=0 +char id=1308 x=312 y=440 width=32 height=25 xoffset=-1 yoffset=8 xadvance=30 page=0 chnl=0 +char id=1312 x=300 y=135 width=33 height=31 xoffset=-1 yoffset=8 xadvance=32 page=0 chnl=0 +char id=1314 x=333 y=135 width=34 height=31 xoffset=-1 yoffset=8 xadvance=33 page=0 chnl=0 +char id=8192 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=16 page=0 chnl=0 +char id=8193 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=32 page=0 chnl=0 +char id=8194 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=16 page=0 chnl=0 +char id=8195 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=32 page=0 chnl=0 +char id=8196 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=8197 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=8198 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=8199 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=16 page=0 chnl=0 +char id=8200 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=8201 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=8202 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=3 page=0 chnl=0 +char id=8203 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=0 page=0 chnl=0 +char id=8204 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=0 page=0 chnl=0 +char id=8224 x=0 y=285 width=16 height=29 xoffset=0 yoffset=8 xadvance=16 page=0 chnl=0 +char id=8225 x=16 y=285 width=16 height=29 xoffset=0 yoffset=8 xadvance=16 page=0 chnl=0 +char id=8239 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=8240 x=172 y=314 width=34 height=26 xoffset=-1 yoffset=7 xadvance=32 page=0 chnl=0 +char id=8252 x=344 y=440 width=17 height=25 xoffset=3 yoffset=8 xadvance=21 page=0 chnl=0 +char id=8260 x=361 y=440 width=29 height=25 xoffset=-7 yoffset=8 xadvance=5 page=0 chnl=0 +char id=8286 x=503 y=256 width=6 height=29 xoffset=0 yoffset=4 xadvance=6 page=0 chnl=0 +char id=8352 x=390 y=440 width=22 height=25 xoffset=0 yoffset=7 xadvance=22 page=0 chnl=0 +char id=8353 x=394 y=0 width=23 height=33 xoffset=-1 yoffset=4 xadvance=21 page=0 chnl=0 +char id=8354 x=412 y=440 width=23 height=25 xoffset=-1 yoffset=8 xadvance=21 page=0 chnl=0 +char id=8356 x=435 y=440 width=18 height=25 xoffset=-1 yoffset=8 xadvance=16 page=0 chnl=0 +char id=8357 x=453 y=440 width=27 height=25 xoffset=-1 yoffset=11 xadvance=25 page=0 chnl=0 +char id=8358 x=480 y=440 width=25 height=25 xoffset=-1 yoffset=8 xadvance=23 page=0 chnl=0 +char id=8359 x=0 y=465 width=32 height=25 xoffset=-1 yoffset=8 xadvance=30 page=0 chnl=0 +char id=8360 x=32 y=465 width=34 height=25 xoffset=-1 yoffset=8 xadvance=33 page=0 chnl=0 +char id=8361 x=66 y=465 width=28 height=25 xoffset=-1 yoffset=8 xadvance=26 page=0 chnl=0 +char id=8363 x=32 y=285 width=18 height=29 xoffset=-1 yoffset=4 xadvance=16 page=0 chnl=0 +char id=8364 x=94 y=465 width=24 height=25 xoffset=0 yoffset=8 xadvance=24 page=0 chnl=0 +char id=8367 x=367 y=135 width=44 height=31 xoffset=-1 yoffset=8 xadvance=43 page=0 chnl=0 +char id=8368 x=411 y=135 width=18 height=31 xoffset=-1 yoffset=8 xadvance=16 page=0 chnl=0 +char id=8370 x=449 y=285 width=21 height=27 xoffset=0 yoffset=7 xadvance=20 page=0 chnl=0 +char id=8372 x=118 y=465 width=17 height=25 xoffset=0 yoffset=8 xadvance=18 page=0 chnl=0 +char id=8373 x=50 y=285 width=19 height=29 xoffset=0 yoffset=6 xadvance=20 page=0 chnl=0 +char id=11364 x=429 y=135 width=24 height=31 xoffset=-1 yoffset=8 xadvance=21 page=0 chnl=0 +char id=11365 x=284 y=490 width=16 height=21 xoffset=0 yoffset=13 xadvance=14 page=0 chnl=0 +char id=11367 x=485 y=196 width=25 height=30 xoffset=-1 yoffset=8 xadvance=23 page=0 chnl=0 +char id=11368 x=271 y=285 width=18 height=28 xoffset=-1 yoffset=8 xadvance=16 page=0 chnl=0 +char id=11369 x=0 y=226 width=25 height=30 xoffset=0 yoffset=8 xadvance=23 page=0 chnl=0 +char id=11370 x=289 y=285 width=19 height=28 xoffset=-1 yoffset=8 xadvance=16 page=0 chnl=0 +char id=11371 x=25 y=226 width=21 height=30 xoffset=-1 yoffset=8 xadvance=20 page=0 chnl=0 +char id=11372 x=300 y=490 width=16 height=21 xoffset=-1 yoffset=15 xadvance=14 page=0 chnl=0 +char id=11373 x=135 y=465 width=23 height=25 xoffset=0 yoffset=8 xadvance=22 page=0 chnl=0 +char id=11378 x=158 y=465 width=37 height=25 xoffset=-1 yoffset=8 xadvance=34 page=0 chnl=0 +char id=11380 x=464 y=490 width=18 height=20 xoffset=-1 yoffset=13 xadvance=16 page=0 chnl=0 +char id=34 x=420 y=269 width=11 height=11 xoffset=1 yoffset=8 xadvance=13 page=1 chnl=0 +char id=42 x=180 y=269 width=14 height=16 xoffset=1 yoffset=8 xadvance=16 page=1 chnl=0 +char id=44 x=431 y=269 width=8 height=11 xoffset=0 yoffset=26 xadvance=8 page=1 chnl=0 +char id=45 x=292 y=286 width=11 height=5 xoffset=0 yoffset=21 xadvance=11 page=1 chnl=0 +char id=46 x=505 y=24 width=6 height=7 xoffset=1 yoffset=26 xadvance=8 page=1 chnl=0 +char id=59 x=33 y=192 width=8 height=22 xoffset=1 yoffset=15 xadvance=9 page=1 chnl=0 +char id=61 x=297 y=269 width=20 height=12 xoffset=-1 yoffset=17 xadvance=18 page=1 chnl=0 +char id=80 x=0 y=0 width=20 height=24 xoffset=-1 yoffset=8 xadvance=18 page=1 chnl=0 +char id=82 x=20 y=0 width=24 height=24 xoffset=-1 yoffset=8 xadvance=21 page=1 chnl=0 +char id=84 x=44 y=0 width=21 height=24 xoffset=-1 yoffset=8 xadvance=20 page=1 chnl=0 +char id=88 x=65 y=0 width=25 height=24 xoffset=-1 yoffset=8 xadvance=23 page=1 chnl=0 +char id=89 x=90 y=0 width=25 height=24 xoffset=-1 yoffset=8 xadvance=23 page=1 chnl=0 +char id=90 x=115 y=0 width=22 height=24 xoffset=-1 yoffset=8 xadvance=20 page=1 chnl=0 +char id=94 x=218 y=269 width=17 height=15 xoffset=-1 yoffset=8 xadvance=15 page=1 chnl=0 +char id=95 x=400 y=286 width=19 height=4 xoffset=-1 yoffset=32 xadvance=16 page=1 chnl=0 +char id=96 x=100 y=286 width=10 height=8 xoffset=-1 yoffset=8 xadvance=11 page=1 chnl=0 +char id=97 x=18 y=215 width=16 height=18 xoffset=0 yoffset=15 xadvance=14 page=1 chnl=0 +char id=99 x=34 y=215 width=16 height=18 xoffset=-1 yoffset=15 xadvance=14 page=1 chnl=0 +char id=101 x=50 y=215 width=16 height=18 xoffset=-1 yoffset=15 xadvance=14 page=1 chnl=0 +char id=102 x=137 y=0 width=16 height=24 xoffset=-1 yoffset=8 xadvance=11 page=1 chnl=0 +char id=103 x=153 y=0 width=18 height=24 xoffset=-1 yoffset=15 xadvance=16 page=1 chnl=0 +char id=104 x=171 y=0 width=18 height=24 xoffset=-1 yoffset=8 xadvance=16 page=1 chnl=0 +char id=105 x=189 y=0 width=11 height=24 xoffset=-1 yoffset=8 xadvance=9 page=1 chnl=0 +char id=107 x=200 y=0 width=19 height=24 xoffset=-1 yoffset=8 xadvance=16 page=1 chnl=0 +char id=108 x=219 y=0 width=11 height=24 xoffset=-1 yoffset=8 xadvance=9 page=1 chnl=0 +char id=109 x=473 y=234 width=27 height=17 xoffset=-1 yoffset=15 xadvance=25 page=1 chnl=0 +char id=110 x=0 y=252 width=18 height=17 xoffset=-1 yoffset=15 xadvance=16 page=1 chnl=0 +char id=111 x=66 y=215 width=18 height=18 xoffset=-1 yoffset=15 xadvance=16 page=1 chnl=0 +char id=112 x=230 y=0 width=18 height=24 xoffset=-1 yoffset=15 xadvance=16 page=1 chnl=0 +char id=113 x=248 y=0 width=18 height=24 xoffset=-1 yoffset=15 xadvance=16 page=1 chnl=0 +char id=114 x=18 y=252 width=13 height=17 xoffset=-1 yoffset=15 xadvance=11 page=1 chnl=0 +char id=115 x=84 y=215 width=13 height=18 xoffset=0 yoffset=15 xadvance=12 page=1 chnl=0 +char id=116 x=41 y=192 width=11 height=22 xoffset=-1 yoffset=11 xadvance=9 page=1 chnl=0 +char id=117 x=97 y=215 width=18 height=18 xoffset=-1 yoffset=15 xadvance=16 page=1 chnl=0 +char id=118 x=115 y=215 width=18 height=18 xoffset=-1 yoffset=15 xadvance=16 page=1 chnl=0 +char id=119 x=133 y=215 width=25 height=18 xoffset=-1 yoffset=15 xadvance=23 page=1 chnl=0 +char id=120 x=31 y=252 width=18 height=17 xoffset=-1 yoffset=15 xadvance=16 page=1 chnl=0 +char id=121 x=266 y=0 width=18 height=24 xoffset=-1 yoffset=15 xadvance=16 page=1 chnl=0 +char id=122 x=49 y=252 width=16 height=17 xoffset=-1 yoffset=15 xadvance=14 page=1 chnl=0 +char id=126 x=110 y=286 width=17 height=8 xoffset=0 yoffset=19 xadvance=17 page=1 chnl=0 +char id=165 x=284 y=0 width=22 height=24 xoffset=-3 yoffset=8 xadvance=16 page=1 chnl=0 +char id=168 x=279 y=286 width=13 height=6 xoffset=-1 yoffset=10 xadvance=11 page=1 chnl=0 +char id=170 x=317 y=269 width=11 height=12 xoffset=-1 yoffset=8 xadvance=9 page=1 chnl=0 +char id=171 x=235 y=269 width=16 height=15 xoffset=-1 yoffset=16 xadvance=14 page=1 chnl=0 +char id=172 x=328 y=269 width=20 height=12 xoffset=-1 yoffset=17 xadvance=18 page=1 chnl=0 +char id=173 x=303 y=286 width=11 height=5 xoffset=0 yoffset=21 xadvance=11 page=1 chnl=0 +char id=175 x=314 y=286 width=13 height=5 xoffset=-1 yoffset=10 xadvance=11 page=1 chnl=0 +char id=176 x=348 y=269 width=12 height=12 xoffset=0 yoffset=8 xadvance=13 page=1 chnl=0 +char id=177 x=132 y=168 width=20 height=23 xoffset=-1 yoffset=9 xadvance=18 page=1 chnl=0 +char id=178 x=194 y=269 width=12 height=16 xoffset=-1 yoffset=8 xadvance=10 page=1 chnl=0 +char id=179 x=206 y=269 width=12 height=16 xoffset=-1 yoffset=8 xadvance=10 page=1 chnl=0 +char id=180 x=127 y=286 width=10 height=8 xoffset=2 yoffset=8 xadvance=11 page=1 chnl=0 +char id=181 x=306 y=0 width=18 height=24 xoffset=0 yoffset=15 xadvance=16 page=1 chnl=0 +char id=183 x=505 y=120 width=6 height=7 xoffset=1 yoffset=20 xadvance=8 page=1 chnl=0 +char id=184 x=39 y=286 width=10 height=10 xoffset=0 yoffset=29 xadvance=11 page=1 chnl=0 +char id=185 x=500 y=192 width=9 height=16 xoffset=1 yoffset=8 xadvance=10 page=1 chnl=0 +char id=186 x=360 y=269 width=12 height=12 xoffset=-1 yoffset=8 xadvance=10 page=1 chnl=0 +char id=187 x=251 y=269 width=16 height=15 xoffset=-1 yoffset=17 xadvance=14 page=1 chnl=0 +char id=198 x=324 y=0 width=30 height=24 xoffset=-1 yoffset=8 xadvance=28 page=1 chnl=0 +char id=208 x=354 y=0 width=24 height=24 xoffset=-1 yoffset=8 xadvance=23 page=1 chnl=0 +char id=215 x=158 y=215 width=18 height=18 xoffset=0 yoffset=14 xadvance=18 page=1 chnl=0 +char id=222 x=378 y=0 width=20 height=24 xoffset=-1 yoffset=8 xadvance=18 page=1 chnl=0 +char id=227 x=398 y=0 width=16 height=24 xoffset=0 yoffset=9 xadvance=14 page=1 chnl=0 +char id=228 x=152 y=168 width=16 height=23 xoffset=0 yoffset=10 xadvance=14 page=1 chnl=0 +char id=230 x=176 y=215 width=22 height=18 xoffset=0 yoffset=15 xadvance=21 page=1 chnl=0 +char id=231 x=414 y=0 width=16 height=24 xoffset=-1 yoffset=15 xadvance=14 page=1 chnl=0 +char id=235 x=168 y=168 width=16 height=23 xoffset=-1 yoffset=10 xadvance=14 page=1 chnl=0 +char id=236 x=430 y=0 width=11 height=24 xoffset=-1 yoffset=8 xadvance=9 page=1 chnl=0 +char id=237 x=441 y=0 width=11 height=24 xoffset=-1 yoffset=8 xadvance=9 page=1 chnl=0 +char id=238 x=452 y=0 width=13 height=24 xoffset=-2 yoffset=8 xadvance=9 page=1 chnl=0 +char id=239 x=52 y=192 width=12 height=22 xoffset=-2 yoffset=10 xadvance=9 page=1 chnl=0 +char id=241 x=184 y=168 width=18 height=23 xoffset=-1 yoffset=9 xadvance=16 page=1 chnl=0 +char id=245 x=465 y=0 width=18 height=24 xoffset=-1 yoffset=9 xadvance=16 page=1 chnl=0 +char id=246 x=202 y=168 width=18 height=23 xoffset=-1 yoffset=10 xadvance=16 page=1 chnl=0 +char id=248 x=483 y=0 width=18 height=24 xoffset=-1 yoffset=12 xadvance=16 page=1 chnl=0 +char id=252 x=220 y=168 width=18 height=23 xoffset=-1 yoffset=10 xadvance=16 page=1 chnl=0 +char id=257 x=64 y=192 width=16 height=22 xoffset=0 yoffset=11 xadvance=14 page=1 chnl=0 +char id=261 x=238 y=168 width=16 height=23 xoffset=0 yoffset=15 xadvance=14 page=1 chnl=0 +char id=267 x=254 y=168 width=16 height=23 xoffset=-1 yoffset=10 xadvance=14 page=1 chnl=0 +char id=272 x=0 y=24 width=24 height=24 xoffset=-1 yoffset=8 xadvance=23 page=1 chnl=0 +char id=275 x=80 y=192 width=16 height=22 xoffset=-1 yoffset=11 xadvance=14 page=1 chnl=0 +char id=279 x=270 y=168 width=16 height=23 xoffset=-1 yoffset=10 xadvance=14 page=1 chnl=0 +char id=281 x=286 y=168 width=16 height=23 xoffset=-1 yoffset=15 xadvance=14 page=1 chnl=0 +char id=294 x=24 y=24 width=25 height=24 xoffset=-1 yoffset=8 xadvance=23 page=1 chnl=0 +char id=295 x=49 y=24 width=18 height=24 xoffset=-1 yoffset=8 xadvance=16 page=1 chnl=0 +char id=297 x=96 y=192 width=13 height=22 xoffset=-2 yoffset=10 xadvance=9 page=1 chnl=0 +char id=301 x=67 y=24 width=12 height=24 xoffset=-2 yoffset=8 xadvance=9 page=1 chnl=0 +char id=305 x=500 y=234 width=11 height=17 xoffset=-1 yoffset=15 xadvance=9 page=1 chnl=0 +char id=312 x=65 y=252 width=18 height=17 xoffset=-1 yoffset=15 xadvance=16 page=1 chnl=0 +char id=317 x=79 y=24 width=22 height=24 xoffset=-1 yoffset=8 xadvance=20 page=1 chnl=0 +char id=318 x=101 y=24 width=15 height=24 xoffset=-1 yoffset=8 xadvance=13 page=1 chnl=0 +char id=319 x=116 y=24 width=22 height=24 xoffset=-1 yoffset=8 xadvance=20 page=1 chnl=0 +char id=320 x=138 y=24 width=15 height=24 xoffset=-1 yoffset=8 xadvance=14 page=1 chnl=0 +char id=321 x=153 y=24 width=22 height=24 xoffset=-1 yoffset=8 xadvance=20 page=1 chnl=0 +char id=322 x=175 y=24 width=11 height=24 xoffset=-1 yoffset=8 xadvance=9 page=1 chnl=0 +char id=324 x=186 y=24 width=18 height=24 xoffset=-1 yoffset=8 xadvance=16 page=1 chnl=0 +char id=328 x=204 y=24 width=18 height=24 xoffset=-1 yoffset=8 xadvance=16 page=1 chnl=0 +char id=329 x=222 y=24 width=20 height=24 xoffset=-1 yoffset=8 xadvance=18 page=1 chnl=0 +char id=331 x=242 y=24 width=16 height=24 xoffset=-1 yoffset=15 xadvance=16 page=1 chnl=0 +char id=333 x=109 y=192 width=18 height=22 xoffset=-1 yoffset=11 xadvance=16 page=1 chnl=0 +char id=339 x=198 y=215 width=24 height=18 xoffset=-1 yoffset=15 xadvance=23 page=1 chnl=0 +char id=341 x=258 y=24 width=13 height=24 xoffset=-1 yoffset=8 xadvance=11 page=1 chnl=0 +char id=345 x=271 y=24 width=13 height=24 xoffset=-1 yoffset=8 xadvance=11 page=1 chnl=0 +char id=351 x=284 y=24 width=13 height=24 xoffset=0 yoffset=15 xadvance=12 page=1 chnl=0 +char id=357 x=297 y=24 width=15 height=24 xoffset=-1 yoffset=9 xadvance=13 page=1 chnl=0 +char id=358 x=312 y=24 width=21 height=24 xoffset=-1 yoffset=8 xadvance=20 page=1 chnl=0 +char id=359 x=127 y=192 width=11 height=22 xoffset=-1 yoffset=11 xadvance=9 page=1 chnl=0 +char id=361 x=302 y=168 width=18 height=23 xoffset=-1 yoffset=10 xadvance=16 page=1 chnl=0 +char id=363 x=138 y=192 width=18 height=22 xoffset=-1 yoffset=11 xadvance=16 page=1 chnl=0 +char id=371 x=320 y=168 width=18 height=23 xoffset=-1 yoffset=15 xadvance=16 page=1 chnl=0 +char id=378 x=333 y=24 width=16 height=24 xoffset=-1 yoffset=8 xadvance=14 page=1 chnl=0 +char id=380 x=156 y=192 width=16 height=22 xoffset=-1 yoffset=10 xadvance=14 page=1 chnl=0 +char id=382 x=349 y=24 width=16 height=24 xoffset=-1 yoffset=8 xadvance=14 page=1 chnl=0 +char id=383 x=365 y=24 width=16 height=24 xoffset=-1 yoffset=8 xadvance=11 page=1 chnl=0 +char id=884 x=504 y=48 width=7 height=10 xoffset=-1 yoffset=5 xadvance=6 page=1 chnl=0 +char id=885 x=439 y=269 width=8 height=11 xoffset=0 yoffset=29 xadvance=6 page=1 chnl=0 +char id=890 x=137 y=286 width=8 height=8 xoffset=3 yoffset=31 xadvance=11 page=1 chnl=0 +char id=894 x=172 y=192 width=8 height=22 xoffset=1 yoffset=15 xadvance=9 page=1 chnl=0 +char id=900 x=504 y=144 width=7 height=10 xoffset=1 yoffset=5 xadvance=9 page=1 chnl=0 +char id=901 x=49 y=286 width=13 height=10 xoffset=-1 yoffset=6 xadvance=11 page=1 chnl=0 +char id=903 x=222 y=286 width=6 height=7 xoffset=1 yoffset=14 xadvance=8 page=1 chnl=0 +char id=913 x=381 y=24 width=25 height=24 xoffset=-1 yoffset=8 xadvance=23 page=1 chnl=0 +char id=914 x=406 y=24 width=21 height=24 xoffset=-1 yoffset=8 xadvance=21 page=1 chnl=0 +char id=915 x=427 y=24 width=20 height=24 xoffset=-1 yoffset=8 xadvance=19 page=1 chnl=0 +char id=916 x=447 y=24 width=23 height=24 xoffset=-1 yoffset=8 xadvance=21 page=1 chnl=0 +char id=917 x=470 y=24 width=22 height=24 xoffset=-1 yoffset=8 xadvance=20 page=1 chnl=0 +char id=918 x=0 y=48 width=22 height=24 xoffset=-1 yoffset=8 xadvance=20 page=1 chnl=0 +char id=919 x=22 y=48 width=25 height=24 xoffset=-1 yoffset=8 xadvance=23 page=1 chnl=0 +char id=921 x=492 y=24 width=13 height=24 xoffset=-1 yoffset=8 xadvance=11 page=1 chnl=0 +char id=922 x=47 y=48 width=25 height=24 xoffset=0 yoffset=8 xadvance=23 page=1 chnl=0 +char id=923 x=72 y=48 width=25 height=24 xoffset=-1 yoffset=8 xadvance=23 page=1 chnl=0 +char id=924 x=97 y=48 width=30 height=24 xoffset=-1 yoffset=8 xadvance=28 page=1 chnl=0 +char id=926 x=127 y=48 width=20 height=24 xoffset=0 yoffset=8 xadvance=20 page=1 chnl=0 +char id=928 x=147 y=48 width=25 height=24 xoffset=-1 yoffset=8 xadvance=23 page=1 chnl=0 +char id=929 x=172 y=48 width=20 height=24 xoffset=-1 yoffset=8 xadvance=18 page=1 chnl=0 +char id=931 x=192 y=48 width=20 height=24 xoffset=-1 yoffset=8 xadvance=20 page=1 chnl=0 +char id=932 x=212 y=48 width=21 height=24 xoffset=-1 yoffset=8 xadvance=20 page=1 chnl=0 +char id=933 x=233 y=48 width=23 height=24 xoffset=0 yoffset=8 xadvance=22 page=1 chnl=0 +char id=934 x=256 y=48 width=25 height=24 xoffset=-1 yoffset=8 xadvance=24 page=1 chnl=0 +char id=935 x=281 y=48 width=25 height=24 xoffset=-1 yoffset=8 xadvance=23 page=1 chnl=0 +char id=936 x=306 y=48 width=27 height=24 xoffset=-1 yoffset=8 xadvance=26 page=1 chnl=0 +char id=937 x=333 y=48 width=25 height=24 xoffset=-1 yoffset=8 xadvance=24 page=1 chnl=0 +char id=945 x=222 y=215 width=19 height=18 xoffset=0 yoffset=15 xadvance=19 page=1 chnl=0 +char id=949 x=241 y=215 width=14 height=18 xoffset=0 yoffset=15 xadvance=14 page=1 chnl=0 +char id=954 x=255 y=215 width=19 height=18 xoffset=-1 yoffset=14 xadvance=17 page=1 chnl=0 +char id=957 x=83 y=252 width=17 height=17 xoffset=-1 yoffset=15 xadvance=15 page=1 chnl=0 +char id=959 x=274 y=215 width=18 height=18 xoffset=-1 yoffset=15 xadvance=16 page=1 chnl=0 +char id=960 x=376 y=192 width=19 height=19 xoffset=0 yoffset=14 xadvance=19 page=1 chnl=0 +char id=963 x=395 y=192 width=18 height=19 xoffset=0 yoffset=14 xadvance=17 page=1 chnl=0 +char id=964 x=292 y=215 width=15 height=18 xoffset=-1 yoffset=15 xadvance=13 page=1 chnl=0 +char id=965 x=307 y=215 width=17 height=18 xoffset=-1 yoffset=15 xadvance=16 page=1 chnl=0 +char id=967 x=358 y=48 width=17 height=24 xoffset=-1 yoffset=15 xadvance=15 page=1 chnl=0 +char id=969 x=324 y=215 width=22 height=18 xoffset=0 yoffset=15 xadvance=22 page=1 chnl=0 +char id=970 x=375 y=48 width=14 height=24 xoffset=-3 yoffset=9 xadvance=9 page=1 chnl=0 +char id=971 x=389 y=48 width=17 height=24 xoffset=-1 yoffset=9 xadvance=16 page=1 chnl=0 +char id=978 x=406 y=48 width=23 height=24 xoffset=-2 yoffset=8 xadvance=20 page=1 chnl=0 +char id=983 x=338 y=168 width=18 height=23 xoffset=0 yoffset=15 xadvance=17 page=1 chnl=0 +char id=984 x=429 y=48 width=20 height=24 xoffset=-1 yoffset=8 xadvance=18 page=1 chnl=0 +char id=986 x=449 y=48 width=20 height=24 xoffset=-1 yoffset=8 xadvance=19 page=1 chnl=0 +char id=987 x=469 y=48 width=15 height=24 xoffset=-1 yoffset=15 xadvance=14 page=1 chnl=0 +char id=988 x=484 y=48 width=20 height=24 xoffset=-1 yoffset=8 xadvance=18 page=1 chnl=0 +char id=989 x=0 y=72 width=17 height=24 xoffset=-1 yoffset=15 xadvance=14 page=1 chnl=0 +char id=992 x=17 y=72 width=25 height=24 xoffset=-1 yoffset=8 xadvance=23 page=1 chnl=0 +char id=997 x=42 y=72 width=18 height=24 xoffset=-1 yoffset=15 xadvance=17 page=1 chnl=0 +char id=1003 x=413 y=192 width=21 height=19 xoffset=-1 yoffset=15 xadvance=19 page=1 chnl=0 +char id=1008 x=346 y=215 width=18 height=18 xoffset=0 yoffset=15 xadvance=17 page=1 chnl=0 +char id=1010 x=364 y=215 width=15 height=18 xoffset=0 yoffset=15 xadvance=16 page=1 chnl=0 +char id=1013 x=379 y=215 width=12 height=18 xoffset=0 yoffset=15 xadvance=12 page=1 chnl=0 +char id=1014 x=391 y=215 width=12 height=18 xoffset=0 yoffset=15 xadvance=12 page=1 chnl=0 +char id=1015 x=60 y=72 width=20 height=24 xoffset=-1 yoffset=8 xadvance=18 page=1 chnl=0 +char id=1018 x=80 y=72 width=30 height=24 xoffset=-1 yoffset=8 xadvance=28 page=1 chnl=0 +char id=1019 x=110 y=72 width=24 height=24 xoffset=0 yoffset=15 xadvance=23 page=1 chnl=0 +char id=1020 x=134 y=72 width=21 height=24 xoffset=-3 yoffset=15 xadvance=17 page=1 chnl=0 +char id=1030 x=155 y=72 width=13 height=24 xoffset=-1 yoffset=8 xadvance=11 page=1 chnl=0 +char id=1034 x=168 y=72 width=33 height=24 xoffset=-1 yoffset=8 xadvance=32 page=1 chnl=0 +char id=1040 x=201 y=72 width=25 height=24 xoffset=-1 yoffset=8 xadvance=23 page=1 chnl=0 +char id=1041 x=226 y=72 width=20 height=24 xoffset=-1 yoffset=8 xadvance=18 page=1 chnl=0 +char id=1042 x=246 y=72 width=21 height=24 xoffset=-1 yoffset=8 xadvance=20 page=1 chnl=0 +char id=1043 x=267 y=72 width=20 height=24 xoffset=-1 yoffset=8 xadvance=18 page=1 chnl=0 +char id=1045 x=287 y=72 width=22 height=24 xoffset=-1 yoffset=8 xadvance=20 page=1 chnl=0 +char id=1046 x=309 y=72 width=32 height=24 xoffset=-1 yoffset=8 xadvance=30 page=1 chnl=0 +char id=1048 x=341 y=72 width=25 height=24 xoffset=-1 yoffset=8 xadvance=23 page=1 chnl=0 +char id=1050 x=366 y=72 width=24 height=24 xoffset=-1 yoffset=8 xadvance=21 page=1 chnl=0 +char id=1052 x=390 y=72 width=30 height=24 xoffset=-1 yoffset=8 xadvance=29 page=1 chnl=0 +char id=1053 x=420 y=72 width=25 height=24 xoffset=-1 yoffset=8 xadvance=23 page=1 chnl=0 +char id=1055 x=445 y=72 width=25 height=24 xoffset=-1 yoffset=8 xadvance=23 page=1 chnl=0 +char id=1056 x=470 y=72 width=20 height=24 xoffset=-1 yoffset=8 xadvance=18 page=1 chnl=0 +char id=1058 x=490 y=72 width=21 height=24 xoffset=-1 yoffset=8 xadvance=19 page=1 chnl=0 +char id=1060 x=0 y=96 width=25 height=24 xoffset=-1 yoffset=8 xadvance=24 page=1 chnl=0 +char id=1061 x=25 y=96 width=25 height=24 xoffset=-1 yoffset=8 xadvance=23 page=1 chnl=0 +char id=1063 x=50 y=96 width=24 height=24 xoffset=-1 yoffset=8 xadvance=22 page=1 chnl=0 +char id=1064 x=74 y=96 width=33 height=24 xoffset=-1 yoffset=8 xadvance=31 page=1 chnl=0 +char id=1066 x=107 y=96 width=25 height=24 xoffset=-1 yoffset=8 xadvance=23 page=1 chnl=0 +char id=1067 x=132 y=96 width=30 height=24 xoffset=-1 yoffset=8 xadvance=28 page=1 chnl=0 +char id=1068 x=162 y=96 width=20 height=24 xoffset=-1 yoffset=8 xadvance=18 page=1 chnl=0 +char id=1071 x=182 y=96 width=23 height=24 xoffset=-1 yoffset=8 xadvance=21 page=1 chnl=0 +char id=1072 x=403 y=215 width=16 height=18 xoffset=0 yoffset=15 xadvance=14 page=1 chnl=0 +char id=1074 x=100 y=252 width=17 height=17 xoffset=-1 yoffset=15 xadvance=15 page=1 chnl=0 +char id=1075 x=117 y=252 width=14 height=17 xoffset=-1 yoffset=15 xadvance=12 page=1 chnl=0 +char id=1077 x=419 y=215 width=16 height=18 xoffset=-1 yoffset=15 xadvance=14 page=1 chnl=0 +char id=1078 x=131 y=252 width=23 height=17 xoffset=-1 yoffset=15 xadvance=21 page=1 chnl=0 +char id=1079 x=435 y=215 width=15 height=18 xoffset=-1 yoffset=15 xadvance=13 page=1 chnl=0 +char id=1080 x=154 y=252 width=19 height=17 xoffset=-1 yoffset=15 xadvance=17 page=1 chnl=0 +char id=1081 x=205 y=96 width=19 height=24 xoffset=-1 yoffset=8 xadvance=17 page=1 chnl=0 +char id=1082 x=173 y=252 width=18 height=17 xoffset=-1 yoffset=15 xadvance=16 page=1 chnl=0 +char id=1083 x=450 y=215 width=18 height=18 xoffset=-1 yoffset=15 xadvance=16 page=1 chnl=0 +char id=1084 x=468 y=215 width=22 height=18 xoffset=-1 yoffset=15 xadvance=20 page=1 chnl=0 +char id=1085 x=191 y=252 width=19 height=17 xoffset=-1 yoffset=15 xadvance=17 page=1 chnl=0 +char id=1086 x=490 y=215 width=18 height=18 xoffset=-1 yoffset=15 xadvance=16 page=1 chnl=0 +char id=1087 x=210 y=252 width=19 height=17 xoffset=-1 yoffset=15 xadvance=17 page=1 chnl=0 +char id=1088 x=224 y=96 width=18 height=24 xoffset=-1 yoffset=15 xadvance=16 page=1 chnl=0 +char id=1089 x=0 y=234 width=16 height=18 xoffset=-1 yoffset=15 xadvance=14 page=1 chnl=0 +char id=1090 x=229 y=252 width=16 height=17 xoffset=-1 yoffset=15 xadvance=14 page=1 chnl=0 +char id=1091 x=242 y=96 width=18 height=24 xoffset=-1 yoffset=15 xadvance=15 page=1 chnl=0 +char id=1093 x=245 y=252 width=18 height=17 xoffset=-1 yoffset=15 xadvance=15 page=1 chnl=0 +char id=1095 x=263 y=252 width=18 height=17 xoffset=-1 yoffset=15 xadvance=16 page=1 chnl=0 +char id=1096 x=281 y=252 width=26 height=17 xoffset=-1 yoffset=15 xadvance=24 page=1 chnl=0 +char id=1098 x=307 y=252 width=18 height=17 xoffset=-1 yoffset=15 xadvance=16 page=1 chnl=0 +char id=1099 x=325 y=252 width=22 height=17 xoffset=-1 yoffset=15 xadvance=20 page=1 chnl=0 +char id=1100 x=347 y=252 width=15 height=17 xoffset=-1 yoffset=15 xadvance=14 page=1 chnl=0 +char id=1101 x=16 y=234 width=16 height=18 xoffset=-1 yoffset=15 xadvance=14 page=1 chnl=0 +char id=1102 x=32 y=234 width=23 height=18 xoffset=-1 yoffset=15 xadvance=21 page=1 chnl=0 +char id=1103 x=362 y=252 width=18 height=17 xoffset=-1 yoffset=15 xadvance=16 page=1 chnl=0 +char id=1105 x=260 y=96 width=16 height=24 xoffset=-1 yoffset=9 xadvance=14 page=1 chnl=0 +char id=1107 x=276 y=96 width=15 height=24 xoffset=-1 yoffset=8 xadvance=12 page=1 chnl=0 +char id=1108 x=55 y=234 width=16 height=18 xoffset=-1 yoffset=15 xadvance=14 page=1 chnl=0 +char id=1109 x=71 y=234 width=13 height=18 xoffset=-1 yoffset=15 xadvance=11 page=1 chnl=0 +char id=1110 x=291 y=96 width=11 height=24 xoffset=-1 yoffset=8 xadvance=9 page=1 chnl=0 +char id=1111 x=302 y=96 width=13 height=24 xoffset=-2 yoffset=8 xadvance=9 page=1 chnl=0 +char id=1113 x=84 y=234 width=23 height=18 xoffset=-1 yoffset=15 xadvance=22 page=1 chnl=0 +char id=1114 x=380 y=252 width=24 height=17 xoffset=-1 yoffset=15 xadvance=23 page=1 chnl=0 +char id=1115 x=315 y=96 width=18 height=24 xoffset=-1 yoffset=8 xadvance=16 page=1 chnl=0 +char id=1116 x=333 y=96 width=18 height=24 xoffset=-1 yoffset=8 xadvance=16 page=1 chnl=0 +char id=1117 x=351 y=96 width=19 height=24 xoffset=-1 yoffset=8 xadvance=17 page=1 chnl=0 +char id=1119 x=180 y=192 width=19 height=22 xoffset=-1 yoffset=15 xadvance=17 page=1 chnl=0 +char id=1121 x=107 y=234 width=23 height=18 xoffset=-1 yoffset=15 xadvance=21 page=1 chnl=0 +char id=1122 x=370 y=96 width=25 height=24 xoffset=-1 yoffset=8 xadvance=23 page=1 chnl=0 +char id=1123 x=395 y=96 width=18 height=24 xoffset=-1 yoffset=8 xadvance=16 page=1 chnl=0 +char id=1125 x=130 y=234 width=22 height=18 xoffset=-1 yoffset=15 xadvance=21 page=1 chnl=0 +char id=1126 x=413 y=96 width=31 height=24 xoffset=-1 yoffset=8 xadvance=29 page=1 chnl=0 +char id=1127 x=404 y=252 width=23 height=17 xoffset=-1 yoffset=15 xadvance=20 page=1 chnl=0 +char id=1128 x=444 y=96 width=42 height=24 xoffset=-1 yoffset=8 xadvance=40 page=1 chnl=0 +char id=1129 x=427 y=252 width=31 height=17 xoffset=-1 yoffset=15 xadvance=29 page=1 chnl=0 +char id=1130 x=0 y=120 width=32 height=24 xoffset=-1 yoffset=8 xadvance=30 page=1 chnl=0 +char id=1131 x=458 y=252 width=23 height=17 xoffset=-1 yoffset=15 xadvance=21 page=1 chnl=0 +char id=1132 x=32 y=120 width=43 height=24 xoffset=-1 yoffset=8 xadvance=41 page=1 chnl=0 +char id=1133 x=0 y=269 width=31 height=17 xoffset=-1 yoffset=15 xadvance=29 page=1 chnl=0 +char id=1136 x=75 y=120 width=30 height=24 xoffset=-1 yoffset=8 xadvance=28 page=1 chnl=0 +char id=1139 x=152 y=234 width=17 height=18 xoffset=-1 yoffset=15 xadvance=16 page=1 chnl=0 +char id=1141 x=169 y=234 width=20 height=18 xoffset=-1 yoffset=15 xadvance=18 page=1 chnl=0 +char id=1145 x=105 y=120 width=32 height=24 xoffset=-1 yoffset=15 xadvance=30 page=1 chnl=0 +char id=1151 x=356 y=168 width=23 height=23 xoffset=-1 yoffset=10 xadvance=21 page=1 chnl=0 +char id=1152 x=486 y=96 width=20 height=24 xoffset=-1 yoffset=8 xadvance=19 page=1 chnl=0 +char id=1153 x=379 y=168 width=15 height=23 xoffset=-1 yoffset=15 xadvance=14 page=1 chnl=0 +char id=1154 x=287 y=269 width=10 height=13 xoffset=-1 yoffset=26 xadvance=7 page=1 chnl=0 +char id=1155 x=228 y=286 width=23 height=7 xoffset=-12 yoffset=9 xadvance=0 page=1 chnl=0 +char id=1156 x=145 y=286 width=30 height=8 xoffset=-15 yoffset=8 xadvance=0 page=1 chnl=0 +char id=1157 x=175 y=286 width=17 height=8 xoffset=-9 yoffset=8 xadvance=0 page=1 chnl=0 +char id=1158 x=192 y=286 width=17 height=8 xoffset=-9 yoffset=8 xadvance=0 page=1 chnl=0 +char id=1159 x=62 y=286 width=38 height=9 xoffset=-16 yoffset=3 xadvance=0 page=1 chnl=0 +char id=1164 x=137 y=120 width=20 height=24 xoffset=-1 yoffset=8 xadvance=18 page=1 chnl=0 +char id=1165 x=481 y=252 width=15 height=17 xoffset=-1 yoffset=15 xadvance=14 page=1 chnl=0 +char id=1166 x=157 y=120 width=20 height=24 xoffset=-1 yoffset=8 xadvance=18 page=1 chnl=0 +char id=1167 x=177 y=120 width=18 height=24 xoffset=-1 yoffset=15 xadvance=16 page=1 chnl=0 +char id=1170 x=195 y=120 width=20 height=24 xoffset=-1 yoffset=8 xadvance=19 page=1 chnl=0 +char id=1171 x=496 y=252 width=15 height=17 xoffset=-1 yoffset=15 xadvance=13 page=1 chnl=0 +char id=1173 x=215 y=120 width=17 height=24 xoffset=-1 yoffset=15 xadvance=15 page=1 chnl=0 +char id=1177 x=394 y=168 width=15 height=23 xoffset=-1 yoffset=15 xadvance=13 page=1 chnl=0 +char id=1180 x=232 y=120 width=25 height=24 xoffset=-1 yoffset=8 xadvance=23 page=1 chnl=0 +char id=1181 x=31 y=269 width=19 height=17 xoffset=-1 yoffset=15 xadvance=17 page=1 chnl=0 +char id=1182 x=257 y=120 width=24 height=24 xoffset=-1 yoffset=8 xadvance=21 page=1 chnl=0 +char id=1183 x=50 y=269 width=18 height=17 xoffset=-1 yoffset=15 xadvance=16 page=1 chnl=0 +char id=1184 x=281 y=120 width=28 height=24 xoffset=-1 yoffset=8 xadvance=26 page=1 chnl=0 +char id=1185 x=68 y=269 width=20 height=17 xoffset=-1 yoffset=15 xadvance=18 page=1 chnl=0 +char id=1188 x=309 y=120 width=32 height=24 xoffset=-1 yoffset=8 xadvance=30 page=1 chnl=0 +char id=1189 x=88 y=269 width=23 height=17 xoffset=-1 yoffset=15 xadvance=21 page=1 chnl=0 +char id=1191 x=341 y=120 width=25 height=24 xoffset=-1 yoffset=15 xadvance=23 page=1 chnl=0 +char id=1193 x=189 y=234 width=18 height=18 xoffset=-1 yoffset=15 xadvance=17 page=1 chnl=0 +char id=1195 x=409 y=168 width=16 height=23 xoffset=-1 yoffset=15 xadvance=14 page=1 chnl=0 +char id=1198 x=366 y=120 width=25 height=24 xoffset=-1 yoffset=8 xadvance=23 page=1 chnl=0 +char id=1199 x=391 y=120 width=20 height=24 xoffset=-1 yoffset=15 xadvance=18 page=1 chnl=0 +char id=1200 x=411 y=120 width=25 height=24 xoffset=-1 yoffset=8 xadvance=23 page=1 chnl=0 +char id=1201 x=436 y=120 width=20 height=24 xoffset=-1 yoffset=15 xadvance=18 page=1 chnl=0 +char id=1208 x=456 y=120 width=25 height=24 xoffset=-1 yoffset=8 xadvance=23 page=1 chnl=0 +char id=1209 x=111 y=269 width=19 height=17 xoffset=-1 yoffset=15 xadvance=17 page=1 chnl=0 +char id=1210 x=481 y=120 width=24 height=24 xoffset=-1 yoffset=8 xadvance=22 page=1 chnl=0 +char id=1211 x=0 y=144 width=18 height=24 xoffset=-1 yoffset=8 xadvance=16 page=1 chnl=0 +char id=1213 x=434 y=192 width=20 height=19 xoffset=-1 yoffset=14 xadvance=18 page=1 chnl=0 +char id=1215 x=425 y=168 width=20 height=23 xoffset=-1 yoffset=14 xadvance=18 page=1 chnl=0 +char id=1216 x=18 y=144 width=13 height=24 xoffset=-1 yoffset=8 xadvance=11 page=1 chnl=0 +char id=1218 x=31 y=144 width=23 height=24 xoffset=-1 yoffset=8 xadvance=21 page=1 chnl=0 +char id=1220 x=54 y=144 width=16 height=24 xoffset=-1 yoffset=15 xadvance=14 page=1 chnl=0 +char id=1222 x=199 y=192 width=18 height=22 xoffset=-1 yoffset=15 xadvance=16 page=1 chnl=0 +char id=1224 x=70 y=144 width=18 height=24 xoffset=-1 yoffset=15 xadvance=16 page=1 chnl=0 +char id=1226 x=217 y=192 width=19 height=22 xoffset=-1 yoffset=15 xadvance=18 page=1 chnl=0 +char id=1230 x=236 y=192 width=22 height=22 xoffset=-1 yoffset=15 xadvance=20 page=1 chnl=0 +char id=1231 x=88 y=144 width=13 height=24 xoffset=-1 yoffset=8 xadvance=11 page=1 chnl=0 +char id=1235 x=445 y=168 width=16 height=23 xoffset=0 yoffset=10 xadvance=14 page=1 chnl=0 +char id=1236 x=101 y=144 width=30 height=24 xoffset=-1 yoffset=8 xadvance=29 page=1 chnl=0 +char id=1237 x=207 y=234 width=22 height=18 xoffset=-1 yoffset=15 xadvance=20 page=1 chnl=0 +char id=1241 x=229 y=234 width=16 height=18 xoffset=-1 yoffset=15 xadvance=14 page=1 chnl=0 +char id=1243 x=461 y=168 width=16 height=23 xoffset=-1 yoffset=10 xadvance=14 page=1 chnl=0 +char id=1245 x=258 y=192 width=23 height=22 xoffset=-1 yoffset=10 xadvance=21 page=1 chnl=0 +char id=1247 x=477 y=168 width=15 height=23 xoffset=-1 yoffset=10 xadvance=13 page=1 chnl=0 +char id=1249 x=245 y=234 width=13 height=18 xoffset=-1 yoffset=15 xadvance=12 page=1 chnl=0 +char id=1251 x=281 y=192 width=19 height=22 xoffset=-1 yoffset=10 xadvance=17 page=1 chnl=0 +char id=1253 x=300 y=192 width=19 height=22 xoffset=-1 yoffset=10 xadvance=17 page=1 chnl=0 +char id=1255 x=492 y=168 width=18 height=23 xoffset=-1 yoffset=10 xadvance=16 page=1 chnl=0 +char id=1257 x=258 y=234 width=17 height=18 xoffset=-1 yoffset=15 xadvance=16 page=1 chnl=0 +char id=1259 x=0 y=192 width=17 height=23 xoffset=-1 yoffset=10 xadvance=16 page=1 chnl=0 +char id=1261 x=17 y=192 width=16 height=23 xoffset=-1 yoffset=10 xadvance=14 page=1 chnl=0 +char id=1269 x=319 y=192 width=18 height=22 xoffset=-1 yoffset=10 xadvance=16 page=1 chnl=0 +char id=1273 x=337 y=192 width=22 height=22 xoffset=-1 yoffset=10 xadvance=20 page=1 chnl=0 +char id=1277 x=131 y=144 width=16 height=24 xoffset=-1 yoffset=15 xadvance=14 page=1 chnl=0 +char id=1278 x=147 y=144 width=25 height=24 xoffset=-1 yoffset=8 xadvance=23 page=1 chnl=0 +char id=1279 x=130 y=269 width=18 height=17 xoffset=-1 yoffset=15 xadvance=16 page=1 chnl=0 +char id=1280 x=172 y=144 width=20 height=24 xoffset=-1 yoffset=8 xadvance=18 page=1 chnl=0 +char id=1282 x=192 y=144 width=30 height=24 xoffset=-1 yoffset=8 xadvance=29 page=1 chnl=0 +char id=1285 x=275 y=234 width=19 height=18 xoffset=-1 yoffset=15 xadvance=17 page=1 chnl=0 +char id=1287 x=359 y=192 width=17 height=22 xoffset=-1 yoffset=15 xadvance=15 page=1 chnl=0 +char id=1289 x=454 y=192 width=22 height=19 xoffset=-1 yoffset=15 xadvance=20 page=1 chnl=0 +char id=1291 x=476 y=192 width=24 height=19 xoffset=-1 yoffset=15 xadvance=22 page=1 chnl=0 +char id=1293 x=294 y=234 width=16 height=18 xoffset=-1 yoffset=15 xadvance=14 page=1 chnl=0 +char id=1295 x=0 y=215 width=18 height=19 xoffset=-1 yoffset=15 xadvance=16 page=1 chnl=0 +char id=1297 x=310 y=234 width=15 height=18 xoffset=-1 yoffset=15 xadvance=13 page=1 chnl=0 +char id=1299 x=222 y=144 width=18 height=24 xoffset=-1 yoffset=15 xadvance=16 page=1 chnl=0 +char id=1301 x=325 y=234 width=23 height=18 xoffset=-1 yoffset=15 xadvance=21 page=1 chnl=0 +char id=1302 x=240 y=144 width=28 height=24 xoffset=-1 yoffset=8 xadvance=26 page=1 chnl=0 +char id=1303 x=268 y=144 width=25 height=24 xoffset=-1 yoffset=15 xadvance=22 page=1 chnl=0 +char id=1304 x=293 y=144 width=33 height=24 xoffset=-1 yoffset=8 xadvance=31 page=1 chnl=0 +char id=1305 x=348 y=234 width=26 height=18 xoffset=-1 yoffset=15 xadvance=24 page=1 chnl=0 +char id=1307 x=326 y=144 width=18 height=24 xoffset=-1 yoffset=15 xadvance=16 page=1 chnl=0 +char id=1309 x=374 y=234 width=25 height=18 xoffset=-1 yoffset=15 xadvance=22 page=1 chnl=0 +char id=1310 x=344 y=144 width=24 height=24 xoffset=-1 yoffset=8 xadvance=21 page=1 chnl=0 +char id=1311 x=148 y=269 width=18 height=17 xoffset=-1 yoffset=15 xadvance=16 page=1 chnl=0 +char id=1313 x=368 y=144 width=24 height=24 xoffset=-1 yoffset=15 xadvance=23 page=1 chnl=0 +char id=1315 x=392 y=144 width=25 height=24 xoffset=-1 yoffset=15 xadvance=24 page=1 chnl=0 +char id=8210 x=327 y=286 width=19 height=5 xoffset=-1 yoffset=21 xadvance=16 page=1 chnl=0 +char id=8211 x=327 y=286 width=19 height=5 xoffset=-1 yoffset=21 xadvance=16 page=1 chnl=0 +char id=8212 x=346 y=286 width=35 height=5 xoffset=-1 yoffset=21 xadvance=32 page=1 chnl=0 +char id=8213 x=346 y=286 width=35 height=5 xoffset=-1 yoffset=21 xadvance=32 page=1 chnl=0 +char id=8214 x=501 y=0 width=8 height=23 xoffset=1 yoffset=12 xadvance=9 page=1 chnl=0 +char id=8215 x=209 y=286 width=13 height=8 xoffset=2 yoffset=31 xadvance=15 page=1 chnl=0 +char id=8216 x=447 y=269 width=8 height=11 xoffset=0 yoffset=8 xadvance=8 page=1 chnl=0 +char id=8217 x=455 y=269 width=8 height=11 xoffset=0 yoffset=8 xadvance=8 page=1 chnl=0 +char id=8218 x=463 y=269 width=8 height=11 xoffset=0 yoffset=26 xadvance=8 page=1 chnl=0 +char id=8219 x=471 y=269 width=8 height=11 xoffset=0 yoffset=8 xadvance=8 page=1 chnl=0 +char id=8220 x=479 y=269 width=14 height=11 xoffset=0 yoffset=8 xadvance=14 page=1 chnl=0 +char id=8221 x=493 y=269 width=14 height=11 xoffset=0 yoffset=8 xadvance=14 page=1 chnl=0 +char id=8222 x=0 y=286 width=14 height=11 xoffset=0 yoffset=26 xadvance=14 page=1 chnl=0 +char id=8223 x=14 y=286 width=14 height=11 xoffset=0 yoffset=8 xadvance=14 page=1 chnl=0 +char id=8226 x=28 y=286 width=11 height=11 xoffset=0 yoffset=15 xadvance=11 page=1 chnl=0 +char id=8230 x=251 y=286 width=28 height=7 xoffset=2 yoffset=26 xadvance=32 page=1 chnl=0 +char id=8242 x=372 y=269 width=10 height=12 xoffset=-1 yoffset=6 xadvance=8 page=1 chnl=0 +char id=8243 x=382 y=269 width=16 height=12 xoffset=-1 yoffset=6 xadvance=13 page=1 chnl=0 +char id=8244 x=398 y=269 width=22 height=12 xoffset=-1 yoffset=6 xadvance=20 page=1 chnl=0 +char id=8249 x=267 y=269 width=10 height=15 xoffset=-1 yoffset=16 xadvance=8 page=1 chnl=0 +char id=8250 x=277 y=269 width=10 height=15 xoffset=-1 yoffset=17 xadvance=8 page=1 chnl=0 +char id=8254 x=381 y=286 width=19 height=5 xoffset=-1 yoffset=10 xadvance=16 page=1 chnl=0 +char id=8355 x=417 y=144 width=20 height=24 xoffset=-1 yoffset=8 xadvance=18 page=1 chnl=0 +char id=8365 x=437 y=144 width=25 height=24 xoffset=0 yoffset=8 xadvance=23 page=1 chnl=0 +char id=8366 x=462 y=144 width=21 height=24 xoffset=-1 yoffset=8 xadvance=20 page=1 chnl=0 +char id=8369 x=483 y=144 width=21 height=24 xoffset=-1 yoffset=8 xadvance=19 page=1 chnl=0 +char id=8371 x=0 y=168 width=25 height=24 xoffset=-1 yoffset=8 xadvance=23 page=1 chnl=0 +char id=11360 x=25 y=168 width=22 height=24 xoffset=-1 yoffset=8 xadvance=20 page=1 chnl=0 +char id=11361 x=47 y=168 width=12 height=24 xoffset=-1 yoffset=8 xadvance=9 page=1 chnl=0 +char id=11362 x=59 y=168 width=22 height=24 xoffset=-1 yoffset=8 xadvance=20 page=1 chnl=0 +char id=11363 x=81 y=168 width=20 height=24 xoffset=-1 yoffset=8 xadvance=18 page=1 chnl=0 +char id=11366 x=101 y=168 width=12 height=24 xoffset=-1 yoffset=11 xadvance=10 page=1 chnl=0 +char id=11377 x=399 y=234 width=23 height=18 xoffset=-1 yoffset=15 xadvance=21 page=1 chnl=0 +char id=11379 x=422 y=234 width=30 height=18 xoffset=-1 yoffset=15 xadvance=28 page=1 chnl=0 +char id=11381 x=113 y=168 width=19 height=24 xoffset=-1 yoffset=8 xadvance=18 page=1 chnl=0 +char id=11382 x=166 y=269 width=14 height=17 xoffset=-1 yoffset=15 xadvance=12 page=1 chnl=0 +char id=11383 x=452 y=234 width=21 height=18 xoffset=0 yoffset=15 xadvance=21 page=1 chnl=0 +kernings count=22648 +kerning first=107 second=100 amount=-1 +kerning first=296 second=275 amount=-1 +kerning first=242 second=44 amount=-2 +kerning first=216 second=45 amount=-1 +kerning first=270 second=46 amount=-1 +kerning first=199 second=230 amount=-1 +kerning first=332 second=66 amount=-1 +kerning first=369 second=367 amount=-1 +kerning first=222 second=327 amount=-1 +kerning first=338 second=346 amount=-1 +kerning first=8220 second=380 amount=-1 +kerning first=67 second=65 amount=-2 +kerning first=210 second=66 amount=-1 +kerning first=200 second=67 amount=-1 +kerning first=208 second=68 amount=-1 +kerning first=274 second=69 amount=-1 +kerning first=332 second=70 amount=-1 +kerning first=204 second=71 amount=-1 +kerning first=216 second=72 amount=-1 +kerning first=198 second=73 amount=-1 +kerning first=216 second=74 amount=-1 +kerning first=210 second=75 amount=-1 +kerning first=198 second=76 amount=-1 +kerning first=83 second=77 amount=-1 +kerning first=338 second=78 amount=-1 +kerning first=304 second=79 amount=-1 +kerning first=262 second=80 amount=-1 +kerning first=67 second=81 amount=-2 +kerning first=202 second=82 amount=-1 +kerning first=258 second=83 amount=-2 +kerning first=8222 second=84 amount=-3 +kerning first=8222 second=85 amount=-2 +kerning first=8218 second=86 amount=-3 +kerning first=8250 second=87 amount=-2 +kerning first=208 second=89 amount=-1 +kerning first=286 second=90 amount=-1 +kerning first=274 second=97 amount=-1 +kerning first=103 second=99 amount=-1 +kerning first=374 second=100 amount=-2 +kerning first=264 second=101 amount=-1 +kerning first=198 second=102 amount=-1 +kerning first=246 second=103 amount=-1 +kerning first=380 second=104 amount=-1 +kerning first=103 second=108 amount=-1 +kerning first=266 second=109 amount=-1 +kerning first=8216 second=110 amount=-1 +kerning first=364 second=111 amount=-1 +kerning first=316 second=113 amount=-1 +kerning first=266 second=114 amount=-1 +kerning first=1052 second=1105 amount=-1 +kerning first=286 second=117 amount=-1 +kerning first=69 second=119 amount=-1 +kerning first=278 second=120 amount=-1 +kerning first=316 second=121 amount=-1 +kerning first=368 second=122 amount=-1 +kerning first=220 second=379 amount=-1 +kerning first=286 second=171 amount=-1 +kerning first=240 second=187 amount=-1 +kerning first=87 second=192 amount=-3 +kerning first=332 second=193 amount=-2 +kerning first=278 second=194 amount=-1 +kerning first=45 second=195 amount=-2 +kerning first=218 second=196 amount=-2 +kerning first=370 second=197 amount=-2 +kerning first=332 second=198 amount=-2 +kerning first=204 second=199 amount=-1 +kerning first=278 second=200 amount=-1 +kerning first=8250 second=201 amount=-3 +kerning first=216 second=202 amount=-1 +kerning first=212 second=203 amount=-1 +kerning first=290 second=204 amount=-1 +kerning first=8250 second=205 amount=-3 +kerning first=45 second=206 amount=-3 +kerning first=274 second=207 amount=-1 +kerning first=272 second=209 amount=-1 +kerning first=192 second=210 amount=-1 +kerning first=258 second=211 amount=-1 +kerning first=260 second=212 amount=-1 +kerning first=65 second=213 amount=-1 +kerning first=256 second=214 amount=-1 +kerning first=218 second=216 amount=-1 +kerning first=346 second=217 amount=-1 +kerning first=210 second=218 amount=-1 +kerning first=121 second=223 amount=-1 +kerning first=8216 second=220 amount=-1 +kerning first=71 second=221 amount=-1 +kerning first=338 second=223 amount=-1 +kerning first=218 second=224 amount=-1 +kerning first=250 second=225 amount=-1 +kerning first=364 second=226 amount=-2 +kerning first=344 second=227 amount=-1 +kerning first=218 second=228 amount=-1 +kerning first=107 second=229 amount=-1 +kerning first=316 second=230 amount=-1 +kerning first=113 second=231 amount=-1 +kerning first=364 second=232 amount=-1 +kerning first=206 second=233 amount=-1 +kerning first=268 second=234 amount=-1 +kerning first=87 second=235 amount=-1 +kerning first=119 second=237 amount=-1 +kerning first=194 second=240 amount=-1 +kerning first=380 second=241 amount=-1 +kerning first=268 second=242 amount=-1 +kerning first=382 second=243 amount=-1 +kerning first=298 second=245 amount=-1 +kerning first=344 second=246 amount=-1 +kerning first=87 second=248 amount=-2 +kerning first=196 second=249 amount=-1 +kerning first=268 second=250 amount=-1 +kerning first=250 second=251 amount=-1 +kerning first=103 second=252 amount=-1 +kerning first=364 second=253 amount=-1 +kerning first=113 second=254 amount=-1 +kerning first=374 second=255 amount=-1 +kerning first=8250 second=256 amount=-2 +kerning first=8216 second=257 amount=-1 +kerning first=356 second=259 amount=-2 +kerning first=71 second=260 amount=-1 +kerning first=202 second=261 amount=-1 +kerning first=298 second=262 amount=-1 +kerning first=89 second=263 amount=-2 +kerning first=85 second=264 amount=-1 +kerning first=206 second=266 amount=-1 +kerning first=258 second=267 amount=-1 +kerning first=220 second=268 amount=-1 +kerning first=380 second=269 amount=-1 +kerning first=89 second=270 amount=-1 +kerning first=99 second=271 amount=-1 +kerning first=107 second=273 amount=-1 +kerning first=332 second=274 amount=-1 +kerning first=75 second=275 amount=-1 +kerning first=380 second=277 amount=-1 +kerning first=79 second=278 amount=-1 +kerning first=280 second=280 amount=-1 +kerning first=364 second=281 amount=-1 +kerning first=198 second=282 amount=-1 +kerning first=65 second=283 amount=-1 +kerning first=73 second=284 amount=-1 +kerning first=262 second=286 amount=-2 +kerning first=226 second=287 amount=-1 +kerning first=280 second=288 amount=-1 +kerning first=334 second=289 amount=-1 +kerning first=366 second=290 amount=-1 +kerning first=302 second=291 amount=-1 +kerning first=207 second=249 amount=-1 +kerning first=45 second=296 amount=-3 +kerning first=336 second=298 amount=-1 +kerning first=85 second=223 amount=-1 +kerning first=332 second=302 amount=-1 +kerning first=111 second=303 amount=-1 +kerning first=214 second=304 amount=-1 +kerning first=370 second=305 amount=-1 +kerning first=266 second=311 amount=-1 +kerning first=8250 second=313 amount=-3 +kerning first=282 second=314 amount=-1 +kerning first=376 second=315 amount=-1 +kerning first=45 second=316 amount=-1 +kerning first=214 second=317 amount=-1 +kerning first=109 second=318 amount=-1 +kerning first=219 second=192 amount=-2 +kerning first=222 second=323 amount=-1 +kerning first=376 second=324 amount=-1 +kerning first=8250 second=325 amount=-3 +kerning first=8216 second=326 amount=-1 +kerning first=83 second=327 amount=-1 +kerning first=69 second=328 amount=-1 +kerning first=356 second=330 amount=-1 +kerning first=99 second=331 amount=-1 +kerning first=202 second=332 amount=-1 +kerning first=264 second=333 amount=-1 +kerning first=258 second=334 amount=-1 +kerning first=316 second=335 amount=-1 +kerning first=298 second=336 amount=-1 +kerning first=196 second=337 amount=-1 +kerning first=304 second=338 amount=-1 +kerning first=77 second=339 amount=-1 +kerning first=242 second=289 amount=-1 +kerning first=81 second=344 amount=-1 +kerning first=350 second=345 amount=-1 +kerning first=89 second=346 amount=-2 +kerning first=280 second=347 amount=-1 +kerning first=8220 second=350 amount=-1 +kerning first=262 second=352 amount=-1 +kerning first=224 second=353 amount=-1 +kerning first=8222 second=354 amount=-3 +kerning first=310 second=355 amount=-1 +kerning first=8220 second=356 amount=-1 +kerning first=45 second=357 amount=-1 +kerning first=278 second=289 amount=-1 +kerning first=8218 second=361 amount=-1 +kerning first=350 second=362 amount=-1 +kerning first=196 second=363 amount=-1 +kerning first=214 second=364 amount=-1 +kerning first=97 second=365 amount=-1 +kerning first=8250 second=366 amount=-2 +kerning first=356 second=367 amount=-1 +kerning first=290 second=368 amount=-1 +kerning first=83 second=369 amount=-1 +kerning first=346 second=370 amount=-1 +kerning first=224 second=371 amount=-1 +kerning first=74 second=268 amount=-1 +kerning first=310 second=374 amount=-1 +kerning first=220 second=375 amount=-1 +kerning first=71 second=377 amount=-1 +kerning first=8218 second=378 amount=-2 +kerning first=8222 second=379 amount=-1 +kerning first=77 second=380 amount=-1 +kerning first=8250 second=381 amount=-2 +kerning first=113 second=382 amount=-1 +kerning first=244 second=237 amount=-1 +kerning first=272 second=218 amount=-1 +kerning first=350 second=289 amount=-1 +kerning first=217 second=244 amount=-1 +kerning first=377 second=282 amount=-1 +kerning first=253 second=244 amount=-1 +kerning first=200 second=218 amount=-1 +kerning first=289 second=244 amount=-1 +kerning first=87 second=199 amount=-1 +kerning first=103 second=237 amount=-1 +kerning first=8217 second=245 amount=-2 +kerning first=67 second=237 amount=-1 +kerning first=1038 second=1117 amount=-2 +kerning first=75 second=8249 amount=-2 +kerning first=347 second=353 amount=-1 +kerning first=68 second=225 amount=-1 +kerning first=346 second=365 amount=-1 +kerning first=1027 second=1060 amount=-1 +kerning first=219 second=228 amount=-1 +kerning first=195 second=334 amount=-1 +kerning first=364 second=379 amount=-1 +kerning first=84 second=263 amount=-2 +kerning first=310 second=365 amount=-1 +kerning first=279 second=361 amount=-1 +kerning first=350 second=324 amount=-1 +kerning first=120 second=263 amount=-1 +kerning first=274 second=365 amount=-1 +kerning first=266 second=346 amount=-1 +kerning first=1043 second=1098 amount=-1 +kerning first=203 second=353 amount=-1 +kerning first=65 second=289 amount=-1 +kerning first=354 second=366 amount=-1 +kerning first=85 second=251 amount=-1 +kerning first=45 second=327 amount=-3 +kerning first=298 second=275 amount=-1 +kerning first=194 second=346 amount=-2 +kerning first=198 second=270 amount=-1 +kerning first=101 second=289 amount=-1 +kerning first=226 second=251 amount=-1 +kerning first=81 second=327 amount=-1 +kerning first=1063 second=1060 amount=-1 +kerning first=311 second=353 amount=-1 +kerning first=207 second=277 amount=-1 +kerning first=356 second=72 amount=-1 +kerning first=197 second=254 amount=-1 +kerning first=194 second=374 amount=-3 +kerning first=275 second=121 amount=-1 +kerning first=298 second=251 amount=-1 +kerning first=115 second=351 amount=-1 +kerning first=379 second=202 amount=-1 +kerning first=233 second=254 amount=-1 +kerning first=262 second=251 amount=-1 +kerning first=77 second=232 amount=-1 +kerning first=256 second=351 amount=-1 +kerning first=201 second=206 amount=-1 +kerning first=269 second=254 amount=-1 +kerning first=370 second=251 amount=-1 +kerning first=220 second=351 amount=-1 +kerning first=313 second=69 amount=-1 +kerning first=339 second=112 amount=-1 +kerning first=1105 second=1103 amount=-1 +kerning first=98 second=121 amount=-1 +kerning first=67 second=209 amount=-1 +kerning first=102 second=277 amount=-1 +kerning first=365 second=367 amount=-1 +kerning first=101 second=261 amount=-1 +kerning first=257 second=367 amount=-1 +kerning first=192 second=199 amount=-1 +kerning first=374 second=114 amount=-1 +kerning first=201 second=117 amount=-1 +kerning first=381 second=206 amount=-1 +kerning first=82 second=83 amount=-1 +kerning first=206 second=261 amount=-1 +kerning first=221 second=79 amount=-1 +kerning first=264 second=199 amount=-2 +kerning first=221 second=367 amount=-1 +kerning first=71 second=72 amount=-1 +kerning first=75 second=284 amount=-1 +kerning first=73 second=336 amount=-1 +kerning first=187 second=83 amount=-2 +kerning first=328 second=351 amount=-1 +kerning first=381 second=117 amount=-1 +kerning first=212 second=72 amount=-1 +kerning first=338 second=374 amount=-1 +kerning first=76 second=251 amount=-1 +kerning first=8222 second=356 amount=-3 +kerning first=87 second=67 amount=-1 +kerning first=214 second=76 amount=-1 +kerning first=339 second=255 amount=-1 +kerning first=284 second=72 amount=-1 +kerning first=266 second=374 amount=-1 +kerning first=347 second=121 amount=-1 +kerning first=364 second=351 amount=-1 +kerning first=211 second=344 amount=-1 +kerning first=317 second=318 amount=-1 +kerning first=287 second=240 amount=-1 +kerning first=266 second=86 amount=-1 +kerning first=365 second=107 amount=-1 +kerning first=87 second=171 amount=-3 +kerning first=1051 second=1089 amount=-1 +kerning first=323 second=240 amount=-1 +kerning first=8249 second=89 amount=-2 +kerning first=325 second=216 amount=-1 +kerning first=194 second=86 amount=-3 +kerning first=1027 second=1088 amount=-1 +kerning first=192 second=171 amount=-2 +kerning first=278 second=261 amount=-1 +kerning first=76 second=216 amount=-1 +kerning first=335 second=382 amount=-1 +kerning first=314 second=261 amount=-1 +kerning first=371 second=382 amount=-1 +kerning first=382 second=337 amount=-1 +kerning first=350 second=261 amount=-1 +kerning first=338 second=86 amount=-1 +kerning first=217 second=216 amount=-1 +kerning first=310 second=337 amount=-1 +kerning first=1036 second=1095 amount=-2 +kerning first=280 second=209 amount=-1 +kerning first=291 second=229 amount=-1 +kerning first=1006 second=995 amount=-1 +kerning first=1006 second=996 amount=-1 +kerning first=1006 second=1005 amount=-1 +kerning first=1006 second=1006 amount=-1 +kerning first=208 second=209 amount=-1 +kerning first=81 second=221 amount=-1 +kerning first=1056 second=1024 amount=-1 +kerning first=1024 second=1025 amount=-1 +kerning first=1054 second=1030 amount=-1 +kerning first=1060 second=1031 amount=-1 +kerning first=1070 second=1033 amount=-1 +kerning first=1054 second=1034 amount=-1 +kerning first=1060 second=1036 amount=-1 +kerning first=1056 second=1037 amount=-1 +kerning first=1036 second=1038 amount=-1 +kerning first=1056 second=1039 amount=-1 +kerning first=1070 second=1040 amount=-2 +kerning first=1054 second=1041 amount=-1 +kerning first=1060 second=1042 amount=-1 +kerning first=1054 second=1043 amount=-1 +kerning first=1054 second=1045 amount=-1 +kerning first=1036 second=1047 amount=-1 +kerning first=1060 second=1048 amount=-1 +kerning first=1054 second=1049 amount=-1 +kerning first=1070 second=1050 amount=-1 +kerning first=1058 second=1051 amount=-2 +kerning first=1024 second=1052 amount=-1 +kerning first=1070 second=1053 amount=-1 +kerning first=1064 second=1054 amount=-1 +kerning first=1060 second=1055 amount=-1 +kerning first=1056 second=1056 amount=-1 +kerning first=1046 second=1057 amount=-2 +kerning first=1050 second=1058 amount=-1 +kerning first=1040 second=1059 amount=-2 +kerning first=1058 second=1060 amount=-1 +kerning first=1054 second=1062 amount=-1 +kerning first=1036 second=1063 amount=-2 +kerning first=1042 second=1064 amount=-1 +kerning first=1054 second=1065 amount=-1 +kerning first=1070 second=1067 amount=-1 +kerning first=1056 second=1070 amount=-1 +kerning first=1050 second=1072 amount=-1 +kerning first=1036 second=1073 amount=-1 +kerning first=1058 second=1074 amount=-1 +kerning first=1114 second=1075 amount=-1 +kerning first=1098 second=1076 amount=-1 +kerning first=1036 second=1077 amount=-1 +kerning first=1024 second=1078 amount=-1 +kerning first=1040 second=1079 amount=-1 +kerning first=1058 second=1080 amount=-1 +kerning first=1038 second=1081 amount=-2 +kerning first=363 second=249 amount=-1 +kerning first=1118 second=1083 amount=-1 +kerning first=1058 second=1084 amount=-1 +kerning first=1038 second=1085 amount=-2 +kerning first=1036 second=1086 amount=-1 +kerning first=1058 second=1087 amount=-1 +kerning first=1038 second=1088 amount=-2 +kerning first=232 second=120 amount=-1 +kerning first=1040 second=1090 amount=-1 +kerning first=1046 second=1091 amount=-1 +kerning first=1056 second=1092 amount=-1 +kerning first=1038 second=1093 amount=-2 +kerning first=1058 second=1094 amount=-1 +kerning first=374 second=65 amount=-3 +kerning first=1038 second=1096 amount=-2 +kerning first=1038 second=1097 amount=-2 +kerning first=1036 second=1098 amount=-1 +kerning first=1058 second=1099 amount=-1 +kerning first=1038 second=1100 amount=-2 +kerning first=1040 second=1101 amount=-1 +kerning first=1058 second=1102 amount=-1 +kerning first=1058 second=1103 amount=-2 +kerning first=1036 second=1104 amount=-1 +kerning first=1118 second=1105 amount=-1 +kerning first=1058 second=1107 amount=-1 +kerning first=1040 second=1108 amount=-1 +kerning first=196 second=350 amount=-2 +kerning first=39 second=1111 amount=1 +kerning first=1118 second=1113 amount=-1 +kerning first=1038 second=1114 amount=-2 +kerning first=84 second=207 amount=-1 +kerning first=1038 second=1116 amount=-2 +kerning first=1114 second=1117 amount=-1 +kerning first=1116 second=1118 amount=-1 +kerning first=1038 second=1119 amount=-2 +kerning first=287 second=335 amount=-1 +kerning first=291 second=339 amount=-1 +kerning first=1025 second=1056 amount=-1 +kerning first=1047 second=1050 amount=-1 +kerning first=380 second=246 amount=-1 +kerning first=109 second=252 amount=-1 +kerning first=211 second=201 amount=-1 +kerning first=356 second=44 amount=-3 +kerning first=376 second=350 amount=-2 +kerning first=336 second=227 amount=-1 +kerning first=1108 second=1095 amount=-1 +kerning first=268 second=350 amount=-1 +kerning first=1050 second=1101 amount=-1 +kerning first=250 second=252 amount=-1 +kerning first=304 second=350 amount=-1 +kerning first=1100 second=1076 amount=-1 +kerning first=327 second=103 amount=-1 +kerning first=279 second=305 amount=-1 +kerning first=369 second=291 amount=-1 +kerning first=268 second=90 amount=-1 +kerning first=210 second=356 amount=-1 +kerning first=291 second=103 amount=-1 +kerning first=333 second=291 amount=-1 +kerning first=102 second=45 amount=-1 +kerning first=376 second=90 amount=-1 +kerning first=255 second=103 amount=-2 +kerning first=259 second=371 amount=-1 +kerning first=351 second=305 amount=-1 +kerning first=218 second=260 amount=-2 +kerning first=263 second=382 amount=-1 +kerning first=221 second=323 amount=-1 +kerning first=8250 second=253 amount=-2 +kerning first=8217 second=273 amount=-2 +kerning first=219 second=103 amount=-2 +kerning first=315 second=305 amount=-1 +kerning first=87 second=227 amount=-2 +kerning first=211 second=84 amount=-1 +kerning first=233 second=226 amount=-1 +kerning first=290 second=260 amount=-1 +kerning first=225 second=291 amount=-1 +kerning first=315 second=45 amount=-1 +kerning first=114 second=103 amount=-1 +kerning first=269 second=226 amount=-1 +kerning first=78 second=103 amount=-1 +kerning first=362 second=260 amount=-2 +kerning first=86 second=382 amount=-2 +kerning first=120 second=291 amount=-1 +kerning first=122 second=382 amount=-1 +kerning first=84 second=291 amount=-2 +kerning first=351 second=45 amount=-1 +kerning first=8218 second=116 amount=-1 +kerning first=354 second=213 amount=-1 +kerning first=77 second=115 amount=-1 +kerning first=201 second=89 amount=-1 +kerning first=99 second=109 amount=-1 +kerning first=323 second=212 amount=-1 +kerning first=218 second=115 amount=-1 +kerning first=254 second=115 amount=-1 +kerning first=377 second=78 amount=-1 +kerning first=113 second=115 amount=-1 +kerning first=66 second=45 amount=-1 +kerning first=337 second=187 amount=-1 +kerning first=315 second=193 amount=-1 +kerning first=248 second=44 amount=-2 +kerning first=362 second=115 amount=-1 +kerning first=212 second=44 amount=-1 +kerning first=381 second=89 amount=-1 +kerning first=364 second=268 amount=-1 +kerning first=362 second=232 amount=-1 +kerning first=69 second=213 amount=-1 +kerning first=284 second=44 amount=-1 +kerning first=326 second=115 amount=-1 +kerning first=69 second=353 amount=-1 +kerning first=368 second=303 amount=-1 +kerning first=71 second=44 amount=-1 +kerning first=113 second=232 amount=-1 +kerning first=8250 second=105 amount=-1 +kerning first=282 second=213 amount=-1 +kerning first=218 second=232 amount=-1 +kerning first=250 second=104 amount=-1 +kerning first=201 second=352 amount=-1 +kerning first=105 second=328 amount=-1 +kerning first=83 second=303 amount=-1 +kerning first=229 second=98 amount=-1 +kerning first=8250 second=77 amount=-3 +kerning first=376 second=118 amount=-1 +kerning first=119 second=303 amount=-1 +kerning first=324 second=8249 amount=-1 +kerning first=214 second=280 amount=-1 +kerning first=315 second=73 amount=-1 +kerning first=88 second=98 amount=-1 +kerning first=275 second=228 amount=-1 +kerning first=268 second=118 amount=-1 +kerning first=280 second=120 amount=-1 +kerning first=310 second=291 amount=-1 +kerning first=1054 second=1025 amount=-1 +kerning first=286 second=280 amount=-1 +kerning first=232 second=118 amount=-1 +kerning first=316 second=120 amount=-1 +kerning first=84 second=235 amount=-1 +kerning first=344 second=44 amount=-1 +kerning first=66 second=73 amount=-2 +kerning first=193 second=98 amount=-1 +kerning first=352 second=120 amount=-1 +kerning first=120 second=235 amount=-1 +kerning first=304 second=118 amount=-1 +kerning first=87 second=370 amount=-1 +kerning first=1050 second=1073 amount=-1 +kerning first=344 second=218 amount=-1 +kerning first=196 second=118 amount=-2 +kerning first=221 second=283 amount=-2 +kerning first=192 second=370 amount=-2 +kerning first=316 second=261 amount=-1 +kerning first=1064 second=1104 amount=-1 +kerning first=316 second=371 amount=-1 +kerning first=282 second=241 amount=-1 +kerning first=8220 second=352 amount=-1 +kerning first=264 second=370 amount=-1 +kerning first=66 second=193 amount=-3 +kerning first=80 second=196 amount=-2 +kerning first=262 second=284 amount=-2 +kerning first=354 second=241 amount=-1 +kerning first=336 second=370 amount=-1 +kerning first=203 second=325 amount=-1 +kerning first=195 second=362 amount=-2 +kerning first=196 second=266 amount=-1 +kerning first=105 second=241 amount=-1 +kerning first=106 second=112 amount=-1 +kerning first=379 second=286 amount=-1 +kerning first=69 second=241 amount=-1 +kerning first=199 second=314 amount=-1 +kerning first=1046 second=1090 amount=-1 +kerning first=111 second=8221 amount=-1 +kerning first=199 second=286 amount=-2 +kerning first=368 second=331 amount=-1 +kerning first=235 second=314 amount=-1 +kerning first=282 second=356 amount=-1 +kerning first=307 second=314 amount=-1 +kerning first=288 second=8221 amount=-1 +kerning first=204 second=81 amount=-1 +kerning first=203 second=210 amount=-1 +kerning first=324 second=8221 amount=-2 +kerning first=8220 second=324 amount=-1 +kerning first=258 second=67 amount=-1 +kerning first=216 second=8221 amount=-1 +kerning first=377 second=250 amount=-1 +kerning first=119 second=331 amount=-1 +kerning first=252 second=8221 amount=-2 +kerning first=73 second=252 amount=-1 +kerning first=228 second=255 amount=-1 +kerning first=171 second=221 amount=-2 +kerning first=221 second=224 amount=-2 +kerning first=192 second=255 amount=-1 +kerning first=354 second=269 amount=-2 +kerning first=283 second=112 amount=-1 +kerning first=376 second=266 amount=-1 +kerning first=83 second=331 amount=-1 +kerning first=364 second=196 amount=-2 +kerning first=66 second=221 amount=-2 +kerning first=268 second=266 amount=-2 +kerning first=87 second=255 amount=-1 +kerning first=304 second=266 amount=-1 +kerning first=263 second=326 amount=-1 +kerning first=274 second=250 amount=-1 +kerning first=76 second=289 amount=-1 +kerning first=261 second=347 amount=-1 +kerning first=261 second=318 amount=-1 +kerning first=346 second=250 amount=-1 +kerning first=120 second=378 amount=-1 +kerning first=371 second=326 amount=-1 +kerning first=310 second=250 amount=-1 +kerning first=84 second=378 amount=-2 +kerning first=207 second=101 amount=-1 +kerning first=267 second=273 amount=-1 +kerning first=324 second=371 amount=-1 +kerning first=84 second=347 amount=-2 +kerning first=76 second=328 amount=-1 +kerning first=89 second=231 amount=-2 +kerning first=255 second=307 amount=-1 +kerning first=211 second=257 amount=-1 +kerning first=369 second=378 amount=-1 +kerning first=1082 second=1118 amount=-1 +kerning first=87 second=283 amount=-2 +kerning first=289 second=328 amount=-1 +kerning first=333 second=378 amount=-1 +kerning first=1105 second=1076 amount=-1 +kerning first=1040 second=1047 amount=-1 +kerning first=253 second=328 amount=-1 +kerning first=197 second=366 amount=-2 +kerning first=106 second=257 amount=-1 +kerning first=365 second=8220 amount=-2 +kerning first=70 second=288 amount=-1 +kerning first=217 second=328 amount=-1 +kerning first=252 second=371 amount=-1 +kerning first=321 second=212 amount=-1 +kerning first=272 second=302 amount=-1 +kerning first=264 second=283 amount=-1 +kerning first=70 second=257 amount=-1 +kerning first=257 second=8220 amount=-1 +kerning first=200 second=302 amount=-1 +kerning first=369 second=347 amount=-1 +kerning first=192 second=283 amount=-1 +kerning first=67 second=352 amount=-1 +kerning first=333 second=347 amount=-1 +kerning first=218 second=338 amount=-1 +kerning first=290 second=87 amount=-1 +kerning first=305 second=106 amount=-1 +kerning first=44 second=8220 amount=-3 +kerning first=258 second=243 amount=-1 +kerning first=380 second=333 amount=-1 +kerning first=105 second=253 amount=-1 +kerning first=288 second=80 amount=-1 +kerning first=344 second=333 amount=-1 +kerning first=233 second=229 amount=-1 +kerning first=376 second=210 amount=-1 +kerning first=69 second=68 amount=-1 +kerning first=199 second=113 amount=-1 +kerning first=304 second=210 amount=-1 +kerning first=89 second=262 amount=-1 +kerning first=291 second=307 amount=-1 +kerning first=103 second=120 amount=-1 +kerning first=268 second=210 amount=-2 +kerning first=193 second=87 amount=-3 +kerning first=377 second=198 amount=-1 +kerning first=194 second=262 amount=-1 +kerning first=363 second=307 amount=-1 +kerning first=208 second=120 amount=-1 +kerning first=379 second=216 amount=-1 +kerning first=196 second=210 amount=-1 +kerning first=75 second=368 amount=-1 +kerning first=244 second=120 amount=-1 +kerning first=365 second=255 amount=-1 +kerning first=288 second=368 amount=-1 +kerning first=266 second=262 amount=-2 +kerning first=1092 second=1113 amount=-1 +kerning first=302 second=262 amount=-1 +kerning first=310 second=281 amount=-1 +kerning first=8250 second=225 amount=-1 +kerning first=330 second=243 amount=-1 +kerning first=1056 second=1113 amount=-1 +kerning first=216 second=368 amount=-1 +kerning first=338 second=262 amount=-1 +kerning first=257 second=255 amount=-1 +kerning first=366 second=243 amount=-1 +kerning first=374 second=262 amount=-1 +kerning first=86 second=323 amount=-1 +kerning first=221 second=255 amount=-1 +kerning first=219 second=279 amount=-1 +kerning first=106 second=229 amount=-1 +kerning first=119 second=99 amount=-1 +kerning first=365 second=227 amount=-1 +kerning first=352 second=324 amount=-1 +kerning first=272 second=274 amount=-1 +kerning first=89 second=234 amount=-2 +kerning first=291 second=279 amount=-1 +kerning first=1057 second=1101 amount=-1 +kerning first=255 second=279 amount=-1 +kerning first=70 second=229 amount=-1 +kerning first=200 second=274 amount=-1 +kerning first=1093 second=1101 amount=-1 +kerning first=283 second=229 amount=-1 +kerning first=291 second=44 amount=-2 +kerning first=296 second=99 amount=-1 +kerning first=377 second=369 amount=-1 +kerning first=202 second=278 amount=-1 +kerning first=255 second=44 amount=-3 +kerning first=260 second=99 amount=-1 +kerning first=211 second=229 amount=-1 +kerning first=108 second=233 amount=-1 +kerning first=363 second=44 amount=-1 +kerning first=368 second=99 amount=-1 +kerning first=78 second=279 amount=-1 +kerning first=280 second=324 amount=-1 +kerning first=72 second=233 amount=-1 +kerning first=327 second=44 amount=-1 +kerning first=76 second=356 amount=-1 +kerning first=254 second=382 amount=-1 +kerning first=371 second=267 amount=-1 +kerning first=374 second=234 amount=-2 +kerning first=346 second=278 amount=-1 +kerning first=370 second=223 amount=-1 +kerning first=212 second=330 amount=-1 +kerning first=194 second=234 amount=-1 +kerning first=233 second=106 amount=-1 +kerning first=221 second=227 amount=-2 +kerning first=327 second=279 amount=-1 +kerning first=269 second=106 amount=-1 +kerning first=266 second=234 amount=-1 +kerning first=81 second=97 amount=-1 +kerning first=379 second=317 amount=-1 +kerning first=67 second=296 amount=-1 +kerning first=217 second=81 amount=-1 +kerning first=302 second=234 amount=-1 +kerning first=70 second=281 amount=-1 +kerning first=86 second=66 amount=-1 +kerning first=106 second=316 amount=-1 +kerning first=321 second=264 amount=-1 +kerning first=366 second=212 amount=-1 +kerning first=344 second=361 amount=-1 +kerning first=199 second=110 amount=-1 +kerning first=83 second=219 amount=-1 +kerning first=86 second=267 amount=-2 +kerning first=235 second=110 amount=-1 +kerning first=330 second=212 amount=-1 +kerning first=8250 second=194 amount=-2 +kerning first=380 second=361 amount=-1 +kerning first=69 second=65 amount=-1 +kerning first=338 second=112 amount=-1 +kerning first=283 second=316 amount=-1 +kerning first=199 second=82 amount=-1 +kerning first=216 second=205 amount=-1 +kerning first=258 second=212 amount=-1 +kerning first=263 second=267 amount=-1 +kerning first=86 second=210 amount=-1 +kerning first=379 second=110 amount=-1 +kerning first=283 second=257 amount=-1 +kerning first=122 second=267 amount=-1 +kerning first=210 second=65 amount=-2 +kerning first=114 second=44 amount=-2 +kerning first=72 second=266 amount=-1 +kerning first=282 second=65 amount=-1 +kerning first=280 second=89 amount=-1 +kerning first=315 second=104 amount=-1 +kerning first=8216 second=109 amount=-1 +kerning first=286 second=364 amount=-1 +kerning first=354 second=65 amount=-3 +kerning first=352 second=89 amount=-1 +kerning first=243 second=104 amount=-1 +kerning first=335 second=8217 amount=-1 +kerning first=200 second=361 amount=-1 +kerning first=382 second=250 amount=-1 +kerning first=321 second=205 amount=-1 +kerning first=236 second=361 amount=-1 +kerning first=310 second=46 amount=-1 +kerning first=277 second=97 amount=-1 +kerning first=263 second=122 amount=-1 +kerning first=346 second=46 amount=-2 +kerning first=376 second=121 amount=-1 +kerning first=296 second=71 amount=-1 +kerning first=352 second=117 amount=-1 +kerning first=382 second=46 amount=-1 +kerning first=205 second=97 amount=-1 +kerning first=304 second=121 amount=-1 +kerning first=368 second=71 amount=-1 +kerning first=8216 second=84 amount=-1 +kerning first=66 second=76 amount=-2 +kerning first=346 second=225 amount=-1 +kerning first=202 second=46 amount=-1 +kerning first=232 second=121 amount=-1 +kerning first=382 second=225 amount=-1 +kerning first=371 second=122 amount=-1 +kerning first=196 second=121 amount=-1 +kerning first=260 second=71 amount=-1 +kerning first=83 second=102 amount=-1 +kerning first=335 second=122 amount=-1 +kerning first=274 second=46 amount=-1 +kerning first=67 second=377 amount=-1 +kerning first=280 second=377 amount=-1 +kerning first=1059 second=1108 amount=-2 +kerning first=67 second=117 amount=-1 +kerning first=90 second=90 amount=-1 +kerning first=366 second=240 amount=-1 +kerning first=208 second=377 amount=-1 +kerning first=97 second=46 amount=-1 +kerning first=78 second=332 amount=-1 +kerning first=332 second=219 amount=-1 +kerning first=103 second=117 amount=-1 +kerning first=374 second=290 amount=-1 +kerning first=122 second=122 amount=-1 +kerning first=87 second=267 amount=-2 +kerning first=219 second=332 amount=-1 +kerning first=1059 second=1077 amount=-2 +kerning first=288 second=200 amount=-1 +kerning first=86 second=122 amount=-2 +kerning first=78 second=363 amount=-1 +kerning first=260 second=219 amount=-2 +kerning first=368 second=102 amount=-1 +kerning first=315 second=76 amount=-1 +kerning first=352 second=377 amount=-1 +kerning first=89 second=287 amount=-2 +kerning first=316 second=117 amount=-1 +kerning first=216 second=200 amount=-1 +kerning first=350 second=381 amount=-1 +kerning first=280 second=117 amount=-1 +kerning first=231 second=44 amount=-1 +kerning first=377 second=310 amount=-1 +kerning first=194 second=287 amount=-1 +kerning first=302 second=83 amount=-1 +kerning first=205 second=214 amount=-1 +kerning first=374 second=259 amount=-2 +kerning first=327 second=332 amount=-1 +kerning first=313 second=214 amount=-1 +kerning first=266 second=287 amount=-1 +kerning first=230 second=287 amount=-1 +kerning first=266 second=259 amount=-1 +kerning first=205 second=242 amount=-1 +kerning first=338 second=287 amount=-1 +kerning first=330 second=240 amount=-1 +kerning first=230 second=259 amount=-1 +kerning first=302 second=287 amount=-1 +kerning first=86 second=298 amount=-1 +kerning first=338 second=259 amount=-1 +kerning first=258 second=240 amount=-1 +kerning first=302 second=259 amount=-1 +kerning first=374 second=287 amount=-2 +kerning first=344 second=8217 amount=-3 +kerning first=196 second=8220 amount=-3 +kerning first=109 second=8221 amount=-2 +kerning first=200 second=330 amount=-1 +kerning first=233 second=369 amount=-1 +kerning first=284 second=8249 amount=-1 +kerning first=248 second=8250 amount=-1 +kerning first=346 second=77 amount=-1 +kerning first=216 second=197 amount=-2 +kerning first=346 second=194 amount=-2 +kerning first=333 second=375 amount=-1 +kerning first=305 second=369 amount=-1 +kerning first=103 second=324 amount=-1 +kerning first=288 second=197 amount=-1 +kerning first=274 second=194 amount=-1 +kerning first=86 second=119 amount=-1 +kerning first=122 second=119 amount=-1 +kerning first=197 second=369 amount=-1 +kerning first=253 second=110 amount=-1 +kerning first=108 second=116 amount=-1 +kerning first=202 second=194 amount=-1 +kerning first=227 second=119 amount=-1 +kerning first=288 second=228 amount=-1 +kerning first=310 second=253 amount=-2 +kerning first=263 second=119 amount=-1 +kerning first=266 second=203 amount=-1 +kerning first=253 second=234 amount=-1 +kerning first=1098 second=1100 amount=-1 +kerning first=346 second=253 amount=-1 +kerning first=327 second=248 amount=-1 +kerning first=216 second=228 amount=-1 +kerning first=382 second=253 amount=-1 +kerning first=335 second=119 amount=-1 +kerning first=67 second=380 amount=-1 +kerning first=202 second=74 amount=-1 +kerning first=78 second=100 amount=-1 +kerning first=377 second=223 amount=-1 +kerning first=371 second=119 amount=-1 +kerning first=255 second=248 amount=-1 +kerning first=45 second=355 amount=-1 +kerning first=261 second=375 amount=-1 +kerning first=89 second=203 amount=-1 +kerning first=274 second=74 amount=-1 +kerning first=75 second=228 amount=-1 +kerning first=330 second=268 amount=-1 +kerning first=8250 second=250 amount=-1 +kerning first=1059 second=1080 amount=-2 +kerning first=225 second=375 amount=-1 +kerning first=219 second=248 amount=-1 +kerning first=346 second=74 amount=-1 +kerning first=282 second=68 amount=-1 +kerning first=210 second=68 amount=-1 +kerning first=379 second=113 amount=-1 +kerning first=375 second=103 amount=-2 +kerning first=216 second=80 amount=-1 +kerning first=258 second=268 amount=-1 +kerning first=374 second=203 amount=-1 +kerning first=354 second=68 amount=-1 +kerning first=211 second=313 amount=-1 +kerning first=338 second=203 amount=-1 +kerning first=252 second=108 amount=-1 +kerning first=219 second=363 amount=-1 +kerning first=86 second=270 amount=-1 +kerning first=288 second=315 amount=-1 +kerning first=8250 second=365 amount=-1 +kerning first=266 second=290 amount=-2 +kerning first=1051 second=1086 amount=-1 +kerning first=302 second=290 amount=-1 +kerning first=324 second=108 amount=-1 +kerning first=291 second=363 amount=-1 +kerning first=338 second=290 amount=-1 +kerning first=327 second=363 amount=-1 +kerning first=255 second=335 amount=-1 +kerning first=194 second=318 amount=-1 +kerning first=346 second=105 amount=-1 +kerning first=291 second=335 amount=-1 +kerning first=199 second=85 amount=-1 +kerning first=230 second=318 amount=-1 +kerning first=382 second=105 amount=-1 +kerning first=327 second=335 amount=-1 +kerning first=266 second=318 amount=-1 +kerning first=216 second=315 amount=-1 +kerning first=194 second=290 amount=-1 +kerning first=353 second=237 amount=-1 +kerning first=1070 second=1063 amount=-1 +kerning first=44 second=8217 amount=-3 +kerning first=78 second=335 amount=-1 +kerning first=280 second=380 amount=-1 +kerning first=338 second=318 amount=-1 +kerning first=202 second=225 amount=-1 +kerning first=316 second=380 amount=-1 +kerning first=99 second=45 amount=-1 +kerning first=374 second=231 amount=-2 +kerning first=81 second=296 amount=-1 +kerning first=282 second=198 amount=-1 +kerning first=377 second=338 amount=-1 +kerning first=266 second=231 amount=-1 +kerning first=274 second=225 amount=-1 +kerning first=219 second=335 amount=-1 +kerning first=302 second=231 amount=-1 +kerning first=310 second=225 amount=-1 +kerning first=362 second=192 amount=-2 +kerning first=103 second=380 amount=-1 +kerning first=75 second=108 amount=-1 +kerning first=257 second=8217 amount=-1 +kerning first=208 second=380 amount=-1 +kerning first=222 second=296 amount=-1 +kerning first=111 second=108 amount=-1 +kerning first=197 second=338 amount=-1 +kerning first=365 second=8217 amount=-2 +kerning first=8250 second=278 amount=-3 +kerning first=252 second=225 amount=-1 +kerning first=376 second=325 amount=-1 +kerning first=353 second=228 amount=-1 +kerning first=288 second=225 amount=-1 +kerning first=77 second=235 amount=-1 +kerning first=8250 second=80 amount=-3 +kerning first=233 second=251 amount=-1 +kerning first=278 second=104 amount=-1 +kerning first=113 second=235 amount=-1 +kerning first=197 second=251 amount=-1 +kerning first=281 second=228 amount=-1 +kerning first=315 second=280 amount=-1 +kerning first=305 second=251 amount=-1 +kerning first=75 second=225 amount=-1 +kerning first=218 second=235 amount=-1 +kerning first=90 second=303 amount=-1 +kerning first=67 second=206 amount=-1 +kerning first=269 second=251 amount=-1 +kerning first=378 second=273 amount=-1 +kerning first=209 second=228 amount=-1 +kerning first=208 second=206 amount=-1 +kerning first=377 second=251 amount=-1 +kerning first=263 second=103 amount=-1 +kerning first=313 second=270 amount=-1 +kerning first=69 second=171 amount=-1 +kerning first=216 second=225 amount=-1 +kerning first=1024 second=1093 amount=-1 +kerning first=258 second=98 amount=-1 +kerning first=280 second=206 amount=-1 +kerning first=88 second=355 amount=-1 +kerning first=202 second=102 amount=-1 +kerning first=100 second=45 amount=-1 +kerning first=352 second=206 amount=-1 +kerning first=274 second=102 amount=-1 +kerning first=332 second=46 amount=-1 +kerning first=368 second=46 amount=-3 +kerning first=8250 second=219 amount=-2 +kerning first=89 second=83 amount=-2 +kerning first=376 second=263 amount=-2 +kerning first=268 second=325 amount=-1 +kerning first=66 second=280 amount=-2 +kerning first=119 second=46 amount=-3 +kerning first=193 second=355 amount=-1 +kerning first=1114 second=1107 amount=-1 +kerning first=194 second=83 amount=-2 +kerning first=99 second=8249 amount=-1 +kerning first=224 second=46 amount=-1 +kerning first=8217 second=248 amount=-2 +kerning first=187 second=318 amount=-1 +kerning first=266 second=83 amount=-1 +kerning first=356 second=363 amount=-1 +kerning first=224 second=8221 amount=-1 +kerning first=75 second=289 amount=-1 +kerning first=240 second=112 amount=-1 +kerning first=74 second=67 amount=-1 +kerning first=223 second=318 amount=-1 +kerning first=200 second=221 amount=-1 +kerning first=281 second=8217 amount=-1 +kerning first=204 second=112 amount=-1 +kerning first=259 second=318 amount=-1 +kerning first=338 second=83 amount=-1 +kerning first=295 second=318 amount=-1 +kerning first=374 second=83 amount=-2 +kerning first=346 second=102 amount=-1 +kerning first=99 second=112 amount=-1 +kerning first=331 second=318 amount=-1 +kerning first=382 second=102 amount=-1 +kerning first=367 second=318 amount=-1 +kerning first=84 second=266 amount=-1 +kerning first=250 second=311 amount=-1 +kerning first=202 second=84 amount=-1 +kerning first=339 second=105 amount=-1 +kerning first=362 second=235 amount=-1 +kerning first=45 second=98 amount=-1 +kerning first=76 second=304 amount=-1 +kerning first=375 second=105 amount=-1 +kerning first=267 second=105 amount=-1 +kerning first=117 second=98 amount=-1 +kerning first=303 second=105 amount=-1 +kerning first=323 second=67 amount=-1 +kerning first=70 second=81 amount=-1 +kerning first=216 second=259 amount=-1 +kerning first=231 second=105 amount=-1 +kerning first=344 second=221 amount=-1 +kerning first=90 second=105 amount=-1 +kerning first=86 second=214 amount=-1 +kerning first=288 second=259 amount=-1 +kerning first=252 second=259 amount=-1 +kerning first=272 second=221 amount=-1 +kerning first=80 second=240 amount=-1 +kerning first=264 second=230 amount=-1 +kerning first=1050 second=1098 amount=-1 +kerning first=302 second=283 amount=-1 +kerning first=1054 second=1050 amount=-1 +kerning first=335 second=104 amount=-1 +kerning first=98 second=351 amount=-1 +kerning first=201 second=346 amount=-1 +kerning first=354 second=290 amount=-1 +kerning first=250 second=249 amount=-1 +kerning first=84 second=204 amount=-1 +kerning first=1043 second=1095 amount=-1 +kerning first=203 second=350 amount=-1 +kerning first=379 second=171 amount=-1 +kerning first=87 second=230 amount=-2 +kerning first=213 second=379 amount=-1 +kerning first=325 second=275 amount=-1 +kerning first=1025 second=1053 amount=-1 +kerning first=205 second=100 amount=-1 +kerning first=321 second=379 amount=-1 +kerning first=217 second=275 amount=-1 +kerning first=253 second=275 amount=-1 +kerning first=1113 second=1091 amount=-1 +kerning first=187 second=256 amount=-2 +kerning first=381 second=86 amount=-1 +kerning first=250 second=107 amount=-1 +kerning first=264 second=339 amount=-1 +kerning first=109 second=249 amount=-1 +kerning first=198 second=211 amount=-1 +kerning first=84 second=260 amount=-3 +kerning first=255 second=223 amount=-1 +kerning first=336 second=230 amount=-1 +kerning first=219 second=223 amount=-1 +kerning first=73 second=249 amount=-1 +kerning first=377 second=313 amount=-1 +kerning first=351 second=8217 amount=-1 +kerning first=356 second=192 amount=-3 +kerning first=196 second=263 amount=-1 +kerning first=231 second=365 amount=-1 +kerning first=118 second=114 amount=-1 +kerning first=195 second=365 amount=-1 +kerning first=187 second=114 amount=-1 +kerning first=280 second=268 amount=-1 +kerning first=284 second=192 amount=-1 +kerning first=268 second=263 amount=-1 +kerning first=304 second=263 amount=-1 +kerning first=90 second=365 amount=-1 +kerning first=212 second=192 amount=-2 +kerning first=354 second=353 amount=-2 +kerning first=381 second=237 amount=-1 +kerning first=243 second=8217 amount=-1 +kerning first=354 second=244 amount=-2 +kerning first=66 second=218 amount=-2 +kerning first=192 second=339 amount=-1 +kerning first=221 second=199 amount=-1 +kerning first=279 second=8217 amount=-1 +kerning first=67 second=268 amount=-2 +kerning first=204 second=118 amount=-1 +kerning first=315 second=8217 amount=-2 +kerning first=71 second=192 amount=-1 +kerning first=87 second=339 amount=-2 +kerning first=260 second=334 amount=-1 +kerning first=1059 second=1105 amount=-2 +kerning first=266 second=315 amount=-1 +kerning first=246 second=353 amount=-1 +kerning first=334 second=282 amount=-1 +kerning first=374 second=315 amount=-1 +kerning first=282 second=353 amount=-1 +kerning first=338 second=315 amount=-1 +kerning first=296 second=334 amount=-1 +kerning first=262 second=282 amount=-1 +kerning first=199 second=289 amount=-1 +kerning first=89 second=315 amount=-1 +kerning first=339 second=365 amount=-1 +kerning first=1055 second=1072 amount=-1 +kerning first=303 second=365 amount=-1 +kerning first=109 second=291 amount=-1 +kerning first=307 second=289 amount=-1 +kerning first=8250 second=74 amount=-2 +kerning first=1042 second=1051 amount=-1 +kerning first=230 second=371 amount=-1 +kerning first=233 second=257 amount=-1 +kerning first=86 second=351 amount=-2 +kerning first=118 second=345 amount=-1 +kerning first=344 second=277 amount=-1 +kerning first=353 second=8249 amount=-1 +kerning first=350 second=202 amount=-1 +kerning first=90 second=99 amount=-1 +kerning first=284 second=346 amount=-1 +kerning first=222 second=302 amount=-1 +kerning first=231 second=99 amount=-1 +kerning first=278 second=202 amount=-1 +kerning first=195 second=99 amount=-1 +kerning first=283 second=347 amount=-1 +kerning first=317 second=8249 amount=-1 +kerning first=268 second=381 amount=-1 +kerning first=66 second=336 amount=-1 +kerning first=335 second=351 amount=-1 +kerning first=192 second=79 amount=-1 +kerning first=376 second=381 amount=-1 +kerning first=207 second=336 amount=-1 +kerning first=87 second=79 amount=-1 +kerning first=280 second=212 amount=-1 +kerning first=72 second=261 amount=-1 +kerning first=371 second=351 amount=-1 +kerning first=378 second=267 amount=-1 +kerning first=377 second=269 amount=-1 +kerning first=198 second=69 amount=-1 +kerning first=286 second=367 amount=-1 +kerning first=314 second=371 amount=-1 +kerning first=315 second=336 amount=-1 +kerning first=307 second=110 amount=-1 +kerning first=122 second=351 amount=-1 +kerning first=313 second=80 amount=-1 +kerning first=67 second=212 amount=-2 +kerning first=269 second=257 amount=-1 +kerning first=1024 second=1059 amount=-1 +kerning first=263 second=351 amount=-1 +kerning first=264 second=79 amount=-2 +kerning first=227 second=351 amount=-1 +kerning first=73 second=367 amount=-1 +kerning first=218 second=291 amount=-2 +kerning first=109 second=367 amount=-1 +kerning first=378 second=382 amount=-1 +kerning first=1046 second=1059 amount=-1 +kerning first=77 second=291 amount=-1 +kerning first=1062 second=1047 amount=-1 +kerning first=198 second=382 amount=-1 +kerning first=101 second=314 amount=-1 +kerning first=85 second=226 amount=-2 +kerning first=287 second=271 amount=-1 +kerning first=199 second=99 amount=-1 +kerning first=234 second=382 amount=-1 +kerning first=334 second=209 amount=-1 +kerning first=65 second=314 amount=-1 +kerning first=1063 second=1057 amount=-1 +kerning first=86 second=229 amount=-2 +kerning first=121 second=226 amount=-2 +kerning first=213 second=261 amount=-1 +kerning first=209 second=337 amount=-1 +kerning first=1027 second=1057 amount=-1 +kerning first=249 second=261 amount=-1 +kerning first=1051 second=1092 amount=-1 +kerning first=1071 second=1104 amount=-1 +kerning first=313 second=326 amount=-1 +kerning first=278 second=314 amount=-1 +kerning first=8218 second=255 amount=-1 +kerning first=81 second=302 amount=-1 +kerning first=88 second=361 amount=-1 +kerning first=242 second=314 amount=-1 +kerning first=229 second=361 amount=-1 +kerning first=307 second=171 amount=-1 +kerning first=350 second=314 amount=-1 +kerning first=338 second=361 amount=-1 +kerning first=46 second=8221 amount=-3 +kerning first=193 second=361 amount=-1 +kerning first=106 second=347 amount=-1 +kerning first=314 second=314 amount=-1 +kerning first=82 second=8221 amount=-3 +kerning first=99 second=316 amount=-1 +kerning first=70 second=347 amount=-1 +kerning first=253 second=269 amount=-1 +kerning first=1057 second=1076 amount=-1 +kerning first=260 second=216 amount=-1 +kerning first=87 second=224 amount=-2 +kerning first=8216 second=198 amount=-4 +kerning first=217 second=269 amount=-1 +kerning first=1114 second=1103 amount=-1 +kerning first=1024 second=1037 amount=-1 +kerning first=296 second=216 amount=-1 +kerning first=325 second=269 amount=-1 +kerning first=1060 second=1037 amount=-1 +kerning first=223 second=8221 amount=-1 +kerning first=240 second=316 amount=-1 +kerning first=277 second=326 amount=-1 +kerning first=75 second=281 amount=-1 +kerning first=289 second=269 amount=-1 +kerning first=199 second=171 amount=-2 +kerning first=259 second=8221 amount=-1 +kerning first=1054 second=1056 amount=-1 +kerning first=264 second=224 amount=-1 +kerning first=107 second=103 amount=-1 +kerning first=286 second=45 amount=-1 +kerning first=272 second=70 amount=-1 +kerning first=71 second=103 amount=-1 +kerning first=221 second=252 amount=-1 +kerning first=367 second=8221 amount=-2 +kerning first=336 second=224 amount=-1 +kerning first=257 second=252 amount=-1 +kerning first=321 second=317 amount=-1 +kerning first=235 second=227 amount=-1 +kerning first=199 second=227 amount=-1 +kerning first=73 second=101 amount=-1 +kerning first=65 second=235 amount=-1 +kerning first=346 second=362 amount=-1 +kerning first=268 second=207 amount=-1 +kerning first=213 second=317 amount=-1 +kerning first=298 second=226 amount=-1 +kerning first=73 second=45 amount=-2 +kerning first=334 second=226 amount=-1 +kerning first=203 second=90 amount=-1 +kerning first=356 second=103 amount=-2 +kerning first=376 second=207 amount=-1 +kerning first=370 second=226 amount=-2 +kerning first=193 second=246 amount=-1 +kerning first=284 second=103 amount=-1 +kerning first=326 second=291 amount=-1 +kerning first=109 second=45 amount=-1 +kerning first=203 second=356 amount=-1 +kerning first=274 second=362 amount=-1 +kerning first=84 second=350 amount=-2 +kerning first=248 second=103 amount=-1 +kerning first=88 second=246 amount=-1 +kerning first=250 second=45 amount=-1 +kerning first=310 second=362 amount=-1 +kerning first=212 second=103 amount=-1 +kerning first=254 second=291 amount=-1 +kerning first=214 second=45 amount=-1 +kerning first=365 second=104 amount=-1 +kerning first=217 second=213 amount=-1 +kerning first=266 second=89 amount=-1 +kerning first=8249 second=86 amount=-2 +kerning first=377 second=109 amount=-1 +kerning first=220 second=338 amount=-1 +kerning first=338 second=89 amount=-1 +kerning first=269 second=109 amount=-1 +kerning first=286 second=193 amount=-1 +kerning first=325 second=213 amount=-1 +kerning first=84 second=115 amount=-2 +kerning first=200 second=219 amount=-1 +kerning first=194 second=89 amount=-3 +kerning first=290 second=84 amount=-1 +kerning first=221 second=370 amount=-1 +kerning first=214 second=193 amount=-2 +kerning first=197 second=234 amount=-1 +kerning first=209 second=8249 amount=-2 +kerning first=267 second=303 amount=-1 +kerning first=225 second=115 amount=-1 +kerning first=379 second=227 amount=-1 +kerning first=303 second=303 amount=-1 +kerning first=261 second=115 amount=-1 +kerning first=104 second=8249 amount=-1 +kerning first=334 second=78 amount=-1 +kerning first=120 second=115 amount=-1 +kerning first=307 second=227 amount=-1 +kerning first=376 second=103 amount=-2 +kerning first=231 second=303 amount=-1 +kerning first=241 second=44 amount=-1 +kerning first=200 second=70 amount=-1 +kerning first=262 second=78 amount=-1 +kerning first=1027 second=1113 amount=-2 +kerning first=187 second=368 amount=-2 +kerning first=68 second=8249 amount=-1 +kerning first=8217 second=97 amount=-3 +kerning first=339 second=303 amount=-1 +kerning first=277 second=44 amount=-2 +kerning first=82 second=368 amount=-1 +kerning first=76 second=213 amount=-1 +kerning first=375 second=303 amount=-1 +kerning first=333 second=115 amount=-1 +kerning first=287 second=120 amount=-1 +kerning first=304 second=115 amount=-1 +kerning first=198 second=323 amount=-1 +kerning first=68 second=278 amount=-1 +kerning first=200 second=73 amount=-1 +kerning first=369 second=118 amount=-1 +kerning first=377 second=201 amount=-1 +kerning first=225 second=361 amount=-1 +kerning first=272 second=73 amount=-1 +kerning first=315 second=70 amount=-1 +kerning first=356 second=248 amount=-2 +kerning first=251 second=120 amount=-1 +kerning first=192 second=85 amount=-2 +kerning first=261 second=118 amount=-1 +kerning first=314 second=113 amount=-1 +kerning first=195 second=253 amount=-1 +kerning first=225 second=118 amount=-1 +kerning first=334 second=75 amount=-1 +kerning first=317 second=278 amount=-1 +kerning first=87 second=85 amount=-1 +kerning first=231 second=253 amount=-1 +kerning first=333 second=118 amount=-1 +kerning first=76 second=68 amount=-1 +kerning first=267 second=253 amount=-1 +kerning first=317 second=80 amount=-1 +kerning first=366 second=246 amount=-1 +kerning first=262 second=75 amount=-1 +kerning first=220 second=233 amount=-1 +kerning first=303 second=253 amount=-1 +kerning first=330 second=246 amount=-1 +kerning first=84 second=118 amount=-1 +kerning first=108 second=257 amount=-1 +kerning first=214 second=196 amount=-2 +kerning first=339 second=253 amount=-1 +kerning first=68 second=80 amount=-1 +kerning first=256 second=233 amount=-1 +kerning first=286 second=196 amount=-1 +kerning first=120 second=118 amount=-1 +kerning first=364 second=233 amount=-1 +kerning first=298 second=338 amount=-1 +kerning first=118 second=108 amount=-1 +kerning first=262 second=335 amount=-1 +kerning first=262 second=338 amount=-2 +kerning first=82 second=108 amount=-1 +kerning first=298 second=335 amount=-1 +kerning first=223 second=108 amount=-1 +kerning first=368 second=234 amount=-1 +kerning first=368 second=328 amount=-1 +kerning first=101 second=110 amount=-1 +kerning first=201 second=290 amount=-1 +kerning first=199 second=283 amount=-1 +kerning first=187 second=108 amount=-1 +kerning first=1060 second=1040 amount=-2 +kerning first=80 second=193 amount=-2 +kerning first=287 second=380 amount=-1 +kerning first=336 second=85 amount=-1 +kerning first=295 second=108 amount=-1 +kerning first=85 second=335 amount=-1 +kerning first=85 second=338 amount=-1 +kerning first=323 second=380 amount=-1 +kerning first=259 second=108 amount=-1 +kerning first=121 second=335 amount=-1 +kerning first=379 second=283 amount=-1 +kerning first=264 second=85 amount=-1 +kerning first=264 second=286 amount=-2 +kerning first=367 second=108 amount=-1 +kerning first=203 second=241 amount=-1 +kerning first=76 second=65 amount=-1 +kerning first=278 second=110 amount=-1 +kerning first=331 second=108 amount=-1 +kerning first=314 second=110 amount=-1 +kerning first=192 second=286 amount=-1 +kerning first=350 second=110 amount=-1 +kerning first=217 second=65 amount=-2 +kerning first=87 second=286 amount=-1 +kerning first=289 second=331 amount=-1 +kerning first=221 second=193 amount=-3 +kerning first=251 second=380 amount=-1 +kerning first=232 second=115 amount=-1 +kerning first=217 second=331 amount=-1 +kerning first=268 second=115 amount=-1 +kerning first=107 second=248 amount=-1 +kerning first=381 second=231 amount=-1 +kerning first=253 second=331 amount=-1 +kerning first=370 second=338 amount=-1 +kerning first=196 second=115 amount=-1 +kerning first=74 second=380 amount=-1 +kerning first=260 second=356 amount=-3 +kerning first=283 second=8250 amount=-1 +kerning first=295 second=371 amount=-1 +kerning first=84 second=210 amount=-1 +kerning first=198 second=326 amount=-1 +kerning first=1064 second=1073 amount=-1 +kerning first=331 second=371 amount=-1 +kerning first=250 second=255 amount=-1 +kerning first=234 second=326 amount=-1 +kerning first=362 second=347 amount=-1 +kerning first=367 second=371 amount=-1 +kerning first=278 second=205 amount=-1 +kerning first=248 second=307 amount=-1 +kerning first=326 second=347 amount=-1 +kerning first=381 second=352 amount=-1 +kerning first=267 second=250 amount=-1 +kerning first=82 second=262 amount=-1 +kerning first=109 second=255 amount=-1 +kerning first=231 second=250 amount=-1 +kerning first=254 second=347 amount=-1 +kerning first=187 second=371 amount=-1 +kerning first=73 second=255 amount=-1 +kerning first=339 second=250 amount=-1 +kerning first=218 second=347 amount=-1 +kerning first=303 second=250 amount=-1 +kerning first=1047 second=1078 amount=-1 +kerning first=268 second=378 amount=-1 +kerning first=90 second=250 amount=-1 +kerning first=232 second=378 amount=-1 +kerning first=119 second=328 amount=-1 +kerning first=83 second=328 amount=-1 +kerning first=74 second=212 amount=-1 +kerning first=195 second=250 amount=-1 +kerning first=1113 second=1097 amount=-1 +kerning first=102 second=333 amount=-1 +kerning first=1030 second=1077 amount=-1 +kerning first=86 second=44 amount=-3 +kerning first=204 second=257 amount=-1 +kerning first=89 second=267 amount=-2 +kerning first=99 second=257 amount=-1 +kerning first=356 second=347 amount=-2 +kerning first=286 second=8220 amount=-1 +kerning first=1069 second=1047 amount=-1 +kerning first=331 second=119 amount=-1 +kerning first=218 second=288 amount=-1 +kerning first=250 second=8220 amount=-2 +kerning first=207 second=103 amount=-1 +kerning first=303 second=283 amount=-1 +kerning first=214 second=8220 amount=-1 +kerning first=87 second=345 amount=-1 +kerning first=97 second=351 amount=-1 +kerning first=88 second=243 amount=-1 +kerning first=8218 second=314 amount=-1 +kerning first=298 second=332 amount=-1 +kerning first=109 second=8220 amount=-2 +kerning first=240 second=106 amount=-1 +kerning first=262 second=332 amount=-2 +kerning first=206 second=113 amount=-1 +kerning first=370 second=332 amount=-1 +kerning first=207 second=333 amount=-1 +kerning first=264 second=345 amount=-1 +kerning first=107 second=242 amount=-1 +kerning first=77 second=288 amount=-1 +kerning first=211 second=87 amount=-1 +kerning first=65 second=113 amount=-1 +kerning first=1027 second=1116 amount=-1 +kerning first=303 second=99 amount=-1 +kerning first=1058 second=1033 amount=-2 +kerning first=381 second=287 amount=-2 +kerning first=113 second=347 amount=-1 +kerning first=267 second=99 amount=-1 +kerning first=345 second=287 amount=-1 +kerning first=77 second=347 amount=-1 +kerning first=375 second=99 amount=-1 +kerning first=198 second=217 amount=-1 +kerning first=219 second=232 amount=-1 +kerning first=362 second=288 amount=-1 +kerning first=193 second=243 amount=-1 +kerning first=8217 second=192 amount=-3 +kerning first=356 second=242 amount=-1 +kerning first=187 second=197 amount=-2 +kerning first=378 second=326 amount=-1 +kerning first=209 second=281 amount=-1 +kerning first=1105 second=1095 amount=-1 +kerning first=85 second=279 amount=-1 +kerning first=256 second=354 amount=-3 +kerning first=99 second=254 amount=-1 +kerning first=198 second=119 amount=-1 +kerning first=76 second=334 amount=-1 +kerning first=278 second=379 amount=-1 +kerning first=71 second=304 amount=-1 +kerning first=287 second=324 amount=-1 +kerning first=68 second=74 amount=-1 +kerning first=234 second=119 amount=-1 +kerning first=121 second=279 amount=-1 +kerning first=217 second=334 amount=-1 +kerning first=74 second=324 amount=-1 +kerning first=187 second=374 amount=-2 +kerning first=1093 second=1079 amount=-1 +kerning first=290 second=344 amount=-1 +kerning first=315 second=274 amount=-1 +kerning first=87 second=289 amount=-2 +kerning first=317 second=204 amount=-1 +kerning first=257 second=249 amount=-1 +kerning first=79 second=259 amount=-1 +kerning first=77 second=229 amount=-1 +kerning first=378 second=119 amount=-1 +kerning first=1057 second=1079 amount=-1 +kerning first=199 second=339 amount=-1 +kerning first=290 second=229 amount=-1 +kerning first=1038 second=1074 amount=-2 +kerning first=317 second=284 amount=-1 +kerning first=317 second=74 amount=-1 +kerning first=370 second=279 amount=-1 +kerning first=209 second=284 amount=-1 +kerning first=8216 second=366 amount=-1 +kerning first=258 second=246 amount=-1 +kerning first=218 second=229 amount=-2 +kerning first=210 second=201 amount=-1 +kerning first=366 second=114 amount=-1 +kerning first=199 second=76 amount=-1 +kerning first=1027 second=1119 amount=-1 +kerning first=262 second=279 amount=-1 +kerning first=379 second=339 amount=-1 +kerning first=8218 second=261 amount=-1 +kerning first=362 second=229 amount=-2 +kerning first=346 second=206 amount=-1 +kerning first=298 second=279 amount=-1 +kerning first=311 second=244 amount=-1 +kerning first=250 second=8217 amount=-2 +kerning first=286 second=8217 amount=-1 +kerning first=336 second=82 amount=-1 +kerning first=278 second=264 amount=-1 +kerning first=1058 second=1089 amount=-1 +kerning first=381 second=234 amount=-1 +kerning first=109 second=8217 amount=-2 +kerning first=201 second=86 amount=-1 +kerning first=206 second=264 amount=-1 +kerning first=82 second=111 amount=-1 +kerning first=118 second=111 amount=-1 +kerning first=192 second=289 amount=-1 +kerning first=261 second=121 amount=-1 +kerning first=221 second=364 amount=-1 +kerning first=225 second=121 amount=-1 +kerning first=1069 second=1041 amount=-1 +kerning first=65 second=264 amount=-1 +kerning first=264 second=289 amount=-1 +kerning first=264 second=82 amount=-1 +kerning first=198 second=66 amount=-1 +kerning first=120 second=121 amount=-1 +kerning first=8220 second=271 amount=-1 +kerning first=336 second=289 amount=-1 +kerning first=84 second=121 amount=-1 +kerning first=350 second=205 amount=-1 +kerning first=1058 second=1086 amount=-1 +kerning first=79 second=354 amount=-1 +kerning first=87 second=82 amount=-1 +kerning first=1038 second=1083 amount=-3 +kerning first=353 second=225 amount=-1 +kerning first=251 second=117 amount=-1 +kerning first=107 second=97 amount=-1 +kerning first=219 second=338 amount=-1 +kerning first=90 second=102 amount=-1 +kerning first=323 second=117 amount=-1 +kerning first=356 second=241 amount=-1 +kerning first=287 second=117 amount=-1 +kerning first=71 second=97 amount=-1 +kerning first=272 second=76 amount=-1 +kerning first=325 second=71 amount=-1 +kerning first=267 second=46 amount=-1 +kerning first=209 second=225 amount=-1 +kerning first=262 second=72 amount=-1 +kerning first=284 second=97 amount=-1 +kerning first=369 second=121 amount=-1 +kerning first=99 second=251 amount=-1 +kerning first=200 second=76 amount=-1 +kerning first=201 second=219 amount=-1 +kerning first=333 second=121 amount=-1 +kerning first=379 second=111 amount=-1 +kerning first=339 second=46 amount=-2 +kerning first=281 second=225 amount=-1 +kerning first=8217 second=103 amount=-2 +kerning first=334 second=72 amount=-1 +kerning first=212 second=97 amount=-1 +kerning first=68 second=77 amount=-1 +kerning first=204 second=251 amount=-1 +kerning first=198 second=122 amount=-1 +kerning first=375 second=46 amount=-3 +kerning first=381 second=290 amount=-1 +kerning first=339 second=102 amount=-1 +kerning first=107 second=245 amount=-1 +kerning first=71 second=363 amount=-1 +kerning first=356 second=97 amount=-2 +kerning first=231 second=46 amount=-1 +kerning first=315 second=84 amount=-1 +kerning first=356 second=245 amount=-2 +kerning first=1052 second=1108 amount=-1 +kerning first=187 second=200 amount=-3 +kerning first=231 second=102 amount=-1 +kerning first=267 second=102 amount=-1 +kerning first=82 second=318 amount=-1 +kerning first=284 second=363 amount=-1 +kerning first=303 second=102 amount=-1 +kerning first=110 second=117 amount=-1 +kerning first=118 second=318 amount=-1 +kerning first=352 second=90 amount=-1 +kerning first=101 second=116 amount=-1 +kerning first=65 second=116 amount=-1 +kerning first=201 second=83 amount=-1 +kerning first=315 second=330 amount=-1 +kerning first=79 second=298 amount=-1 +kerning first=193 second=240 amount=-1 +kerning first=367 second=259 amount=-1 +kerning first=198 second=214 amount=-1 +kerning first=90 second=194 amount=-1 +kerning first=1060 second=1043 amount=-1 +kerning first=88 second=240 amount=-1 +kerning first=110 second=371 amount=-1 +kerning first=90 second=253 amount=-2 +kerning first=1024 second=1043 amount=-1 +kerning first=350 second=116 amount=-1 +kerning first=381 second=83 amount=-1 +kerning first=317 second=77 amount=-1 +kerning first=314 second=116 amount=-1 +kerning first=66 second=330 amount=-2 +kerning first=232 second=375 amount=-1 +kerning first=187 second=259 amount=-1 +kerning first=356 second=304 amount=-1 +kerning first=378 second=122 amount=-1 +kerning first=196 second=375 amount=-1 +kerning first=204 second=369 amount=-1 +kerning first=217 second=71 amount=-1 +kerning first=122 second=311 amount=-1 +kerning first=284 second=304 amount=-1 +kerning first=376 second=375 amount=-1 +kerning first=334 second=220 amount=-1 +kerning first=76 second=71 amount=-1 +kerning first=212 second=304 amount=-1 +kerning first=118 second=259 amount=-2 +kerning first=304 second=375 amount=-1 +kerning first=262 second=220 amount=-1 +kerning first=82 second=259 amount=-1 +kerning first=354 second=90 amount=-1 +kerning first=264 second=233 amount=-1 +kerning first=71 second=298 amount=-1 +kerning first=347 second=291 amount=-1 +kerning first=332 second=77 amount=-1 +kerning first=311 second=291 amount=-1 +kerning first=288 second=194 amount=-1 +kerning first=275 second=291 amount=-1 +kerning first=101 second=227 amount=-1 +kerning first=212 second=298 amount=-1 +kerning first=69 second=350 amount=-1 +kerning first=284 second=82 amount=-1 +kerning first=216 second=194 amount=-2 +kerning first=203 second=291 amount=-1 +kerning first=354 second=233 amount=-2 +kerning first=198 second=304 amount=-1 +kerning first=284 second=298 amount=-1 +kerning first=78 second=97 amount=-1 +kerning first=67 second=235 amount=-1 +kerning first=210 second=350 amount=-1 +kerning first=291 second=97 amount=-1 +kerning first=98 second=291 amount=-1 +kerning first=260 second=337 amount=-1 +kerning first=351 second=311 amount=-1 +kerning first=1113 second=1088 amount=-1 +kerning first=368 second=213 amount=-1 +kerning first=327 second=97 amount=-1 +kerning first=315 second=311 amount=-1 +kerning first=222 second=66 amount=-1 +kerning first=279 second=311 amount=-1 +kerning first=79 second=317 amount=-1 +kerning first=346 second=200 amount=-1 +kerning first=75 second=318 amount=-1 +kerning first=255 second=97 amount=-2 +kerning first=119 second=337 amount=-1 +kerning first=243 second=311 amount=-1 +kerning first=69 second=90 amount=-1 +kerning first=197 second=84 amount=-3 +kerning first=354 second=350 amount=-2 +kerning first=210 second=90 amount=-1 +kerning first=8218 second=370 amount=-2 +kerning first=202 second=71 amount=-1 +kerning first=368 second=337 amount=-1 +kerning first=282 second=350 amount=-1 +kerning first=310 second=71 amount=-1 +kerning first=102 second=311 amount=2 +kerning first=282 second=90 amount=-1 +kerning first=377 second=84 amount=-1 +kerning first=252 second=318 amount=-1 +kerning first=274 second=71 amount=-1 +kerning first=296 second=337 amount=-1 +kerning first=66 second=311 amount=-1 +kerning first=1036 second=1101 amount=-1 +kerning first=264 second=104 amount=-1 +kerning first=217 second=381 amount=-1 +kerning first=198 second=44 amount=-1 +kerning first=194 second=284 amount=-1 +kerning first=382 second=303 amount=-1 +kerning first=279 second=187 amount=-1 +kerning first=287 second=234 amount=-1 +kerning first=192 second=104 amount=-1 +kerning first=243 second=187 amount=-1 +kerning first=323 second=234 amount=-1 +kerning first=270 second=44 amount=-1 +kerning first=89 second=284 amount=-1 +kerning first=8217 second=382 amount=-1 +kerning first=268 second=260 amount=-2 +kerning first=84 second=325 amount=-1 +kerning first=74 second=234 amount=-1 +kerning first=211 second=78 amount=-1 +kerning first=211 second=310 amount=-1 +kerning first=8220 second=86 amount=-1 +kerning first=376 second=260 amount=-3 +kerning first=8216 second=195 amount=-4 +kerning first=296 second=213 amount=-1 +kerning first=280 second=374 amount=-1 +kerning first=260 second=213 amount=-1 +kerning first=66 second=187 amount=-1 +kerning first=256 second=85 amount=-2 +kerning first=101 second=351 amount=-1 +kerning first=278 second=227 amount=-1 +kerning first=356 second=298 amount=-1 +kerning first=202 second=284 amount=-1 +kerning first=65 second=351 amount=-1 +kerning first=1038 second=1077 amount=-2 +kerning first=206 second=351 amount=-1 +kerning first=206 second=227 amount=-1 +kerning first=374 second=284 amount=-1 +kerning first=197 second=220 amount=-2 +kerning first=100 second=98 amount=-1 +kerning first=1059 second=1074 amount=-2 +kerning first=79 second=85 amount=-1 +kerning first=378 second=44 amount=-1 +kerning first=302 second=284 amount=-1 +kerning first=280 second=266 amount=-1 +kerning first=346 second=303 amount=-1 +kerning first=338 second=284 amount=-1 +kerning first=85 second=350 amount=-1 +kerning first=80 second=277 amount=-1 +kerning first=379 second=367 amount=-1 +kerning first=314 second=227 amount=-1 +kerning first=266 second=284 amount=-2 +kerning first=382 second=269 amount=-1 +kerning first=105 second=118 amount=-1 +kerning first=314 second=8220 amount=-2 +kerning first=115 second=345 amount=-1 +kerning first=8217 second=122 amount=-1 +kerning first=230 second=380 amount=-1 +kerning first=69 second=118 amount=-1 +kerning first=207 second=283 amount=-1 +kerning first=284 second=270 amount=-1 +kerning first=83 second=105 amount=-1 +kerning first=242 second=8220 amount=-1 +kerning first=8222 second=362 amount=-2 +kerning first=68 second=287 amount=-1 +kerning first=302 second=380 amount=-1 +kerning first=119 second=105 amount=-1 +kerning first=214 second=171 amount=-1 +kerning first=102 second=283 amount=-1 +kerning first=338 second=380 amount=-1 +kerning first=356 second=270 amount=-1 +kerning first=382 second=228 amount=-1 +kerning first=346 second=228 amount=-1 +kerning first=101 second=8220 amount=-1 +kerning first=8216 second=223 amount=-1 +kerning first=104 second=287 amount=-1 +kerning first=310 second=228 amount=-1 +kerning first=65 second=8220 amount=-3 +kerning first=364 second=345 amount=-1 +kerning first=274 second=228 amount=-1 +kerning first=368 second=241 amount=-1 +kerning first=209 second=287 amount=-1 +kerning first=212 second=270 amount=-1 +kerning first=317 second=287 amount=-1 +kerning first=202 second=228 amount=-1 +kerning first=119 second=241 amount=-1 +kerning first=281 second=287 amount=-1 +kerning first=338 second=8249 amount=-1 +kerning first=100 second=287 amount=-1 +kerning first=374 second=8249 amount=-3 +kerning first=353 second=287 amount=-1 +kerning first=377 second=248 amount=-1 +kerning first=266 second=8249 amount=-2 +kerning first=382 second=331 amount=-1 +kerning first=269 second=248 amount=-1 +kerning first=90 second=197 amount=-1 +kerning first=194 second=8249 amount=-2 +kerning first=83 second=241 amount=-1 +kerning first=197 second=248 amount=-1 +kerning first=311 second=263 amount=-1 +kerning first=346 second=331 amount=-1 +kerning first=356 second=366 amount=-1 +kerning first=324 second=318 amount=-1 +kerning first=350 second=255 amount=-1 +kerning first=274 second=331 amount=-1 +kerning first=377 second=112 amount=-1 +kerning first=374 second=256 amount=-3 +kerning first=284 second=366 amount=-1 +kerning first=74 second=262 amount=-1 +kerning first=338 second=256 amount=-1 +kerning first=202 second=331 amount=-1 +kerning first=305 second=112 amount=-1 +kerning first=242 second=255 amount=-1 +kerning first=8222 second=217 amount=-2 +kerning first=269 second=112 amount=-1 +kerning first=206 second=255 amount=-1 +kerning first=193 second=221 amount=-3 +kerning first=233 second=112 amount=-1 +kerning first=202 second=200 amount=-1 +kerning first=197 second=112 amount=-1 +kerning first=272 second=228 amount=-1 +kerning first=101 second=255 amount=-1 +kerning first=88 second=221 amount=-1 +kerning first=65 second=255 amount=-1 +kerning first=217 second=74 amount=-1 +kerning first=108 second=314 amount=-1 +kerning first=88 second=352 amount=-1 +kerning first=365 second=249 amount=-1 +kerning first=287 second=98 amount=-1 +kerning first=193 second=352 amount=-2 +kerning first=211 second=207 amount=-1 +kerning first=251 second=98 amount=-1 +kerning first=70 second=338 amount=-1 +kerning first=212 second=366 amount=-1 +kerning first=8217 second=279 amount=-2 +kerning first=8216 second=87 amount=-1 +kerning first=368 second=105 amount=-1 +kerning first=75 second=290 amount=-1 +kerning first=1058 second=1092 amount=-1 +kerning first=249 second=314 amount=-1 +kerning first=110 second=98 amount=-1 +kerning first=84 second=339 amount=-2 +kerning first=71 second=366 amount=-1 +kerning first=220 second=214 amount=-1 +kerning first=321 second=314 amount=-1 +kerning first=277 second=307 amount=-1 +kerning first=212 second=106 amount=-1 +kerning first=197 second=268 amount=-1 +kerning first=85 second=81 amount=-1 +kerning first=67 second=346 amount=-1 +kerning first=248 second=106 amount=-1 +kerning first=258 second=333 amount=-1 +kerning first=230 second=8221 amount=-1 +kerning first=199 second=224 amount=-1 +kerning first=90 second=68 amount=-1 +kerning first=298 second=81 amount=-1 +kerning first=90 second=80 amount=-1 +kerning first=280 second=346 amount=-1 +kerning first=86 second=217 amount=-1 +kerning first=262 second=81 amount=-2 +kerning first=235 second=224 amount=-1 +kerning first=370 second=81 amount=-1 +kerning first=208 second=346 amount=-1 +kerning first=284 second=106 amount=-1 +kerning first=307 second=224 amount=-1 +kerning first=103 second=243 amount=-1 +kerning first=8220 second=114 amount=-1 +kerning first=89 second=256 amount=-3 +kerning first=116 second=118 amount=-1 +kerning first=379 second=224 amount=-1 +kerning first=213 second=230 amount=-1 +kerning first=80 second=101 amount=-1 +kerning first=352 second=346 amount=-1 +kerning first=72 second=230 amount=-1 +kerning first=244 second=347 amount=-1 +kerning first=353 second=324 amount=-1 +kerning first=108 second=230 amount=-1 +kerning first=8250 second=315 amount=-3 +kerning first=330 second=333 amount=-1 +kerning first=266 second=256 amount=-2 +kerning first=362 second=253 amount=-1 +kerning first=67 second=326 amount=-1 +kerning first=221 second=101 amount=-2 +kerning first=366 second=333 amount=-1 +kerning first=344 second=67 amount=-1 +kerning first=67 second=243 amount=-1 +kerning first=86 second=69 amount=-1 +kerning first=89 second=120 amount=-1 +kerning first=1060 second=1034 amount=-1 +kerning first=8250 second=200 amount=-3 +kerning first=379 second=79 amount=-1 +kerning first=209 second=334 amount=-1 +kerning first=1048 second=1072 amount=-1 +kerning first=87 second=187 amount=-1 +kerning first=381 second=268 amount=-1 +kerning first=264 second=318 amount=-1 +kerning first=258 second=218 amount=-2 +kerning first=71 second=251 amount=-1 +kerning first=85 second=229 amount=-2 +kerning first=313 second=192 amount=-1 +kerning first=1113 second=1080 amount=-1 +kerning first=1024 second=1034 amount=-1 +kerning first=1065 second=1098 amount=-1 +kerning first=201 second=268 amount=-1 +kerning first=374 second=120 amount=-1 +kerning first=317 second=203 amount=-1 +kerning first=109 second=371 amount=-1 +kerning first=45 second=218 amount=-2 +kerning first=262 second=229 amount=-1 +kerning first=121 second=229 amount=-2 +kerning first=71 second=270 amount=-1 +kerning first=284 second=251 amount=-1 +kerning first=282 second=118 amount=-1 +kerning first=230 second=120 amount=-1 +kerning first=370 second=229 amount=-2 +kerning first=222 second=218 amount=-1 +kerning first=246 second=118 amount=-1 +kerning first=356 second=251 amount=-1 +kerning first=302 second=249 amount=-1 +kerning first=71 second=106 amount=-1 +kerning first=354 second=118 amount=-1 +kerning first=68 second=203 amount=-1 +kerning first=8222 second=102 amount=-1 +kerning first=298 second=229 amount=-1 +kerning first=350 second=366 amount=-1 +kerning first=338 second=120 amount=-1 +kerning first=334 second=229 amount=-1 +kerning first=81 second=218 amount=-1 +kerning first=375 second=244 amount=-1 +kerning first=334 second=257 amount=-1 +kerning first=194 second=368 amount=-2 +kerning first=370 second=257 amount=-2 +kerning first=317 second=219 amount=-1 +kerning first=45 second=361 amount=-1 +kerning first=262 second=257 amount=-1 +kerning first=241 second=45 amount=-1 +kerning first=89 second=368 amount=-1 +kerning first=298 second=257 amount=-1 +kerning first=117 second=361 amount=-1 +kerning first=99 second=232 amount=-1 +kerning first=213 second=202 amount=-1 +kerning first=338 second=368 amount=-1 +kerning first=363 second=254 amount=-1 +kerning first=374 second=368 amount=-1 +kerning first=85 second=257 amount=-2 +kerning first=204 second=232 amount=-1 +kerning first=266 second=368 amount=-1 +kerning first=84 second=8250 amount=-1 +kerning first=121 second=257 amount=-2 +kerning first=68 second=219 amount=-1 +kerning first=325 second=121 amount=-1 +kerning first=90 second=244 amount=-1 +kerning first=289 second=121 amount=-1 +kerning first=254 second=378 amount=-1 +kerning first=77 second=266 amount=-1 +kerning first=255 second=254 amount=-1 +kerning first=344 second=336 amount=-1 +kerning first=195 second=244 amount=-1 +kerning first=217 second=121 amount=-1 +kerning first=321 second=202 amount=-1 +kerning first=291 second=254 amount=-1 +kerning first=231 second=244 amount=-1 +kerning first=216 second=330 amount=-1 +kerning first=199 second=79 amount=-2 +kerning first=213 second=66 amount=-1 +kerning first=213 second=82 amount=-1 +kerning first=267 second=244 amount=-1 +kerning first=112 second=121 amount=-1 +kerning first=216 second=278 amount=-1 +kerning first=377 second=344 amount=-1 +kerning first=303 second=244 amount=-1 +kerning first=76 second=121 amount=-1 +kerning first=205 second=267 amount=-1 +kerning first=99 second=106 amount=-1 +kerning first=288 second=278 amount=-1 +kerning first=321 second=82 amount=-1 +kerning first=205 second=382 amount=-1 +kerning first=187 second=117 amount=-1 +kerning first=321 second=66 amount=-1 +kerning first=199 second=107 amount=-1 +kerning first=277 second=382 amount=-1 +kerning first=316 second=271 amount=-1 +kerning first=259 second=117 amount=-1 +kerning first=313 second=382 amount=-1 +kerning first=118 second=281 amount=-1 +kerning first=331 second=117 amount=-1 +kerning first=295 second=117 amount=-1 +kerning first=100 second=382 amount=-1 +kerning first=249 second=230 amount=-1 +kerning first=367 second=117 amount=-1 +kerning first=266 second=201 amount=-1 +kerning first=333 second=8250 amount=-1 +kerning first=258 second=361 amount=-1 +kerning first=86 second=205 amount=-1 +kerning first=366 second=361 amount=-1 +kerning first=82 second=281 amount=-1 +kerning first=330 second=361 amount=-1 +kerning first=212 second=315 amount=-1 +kerning first=240 second=347 amount=-1 +kerning first=90 second=216 amount=-1 +kerning first=204 second=347 amount=-1 +kerning first=235 second=107 amount=-1 +kerning first=103 second=271 amount=-1 +kerning first=195 second=216 amount=-1 +kerning first=82 second=117 amount=-1 +kerning first=99 second=347 amount=-1 +kerning first=307 second=107 amount=-1 +kerning first=381 second=240 amount=-1 +kerning first=1058 second=1095 amount=-1 +kerning first=106 second=226 amount=-1 +kerning first=281 second=259 amount=-1 +kerning first=332 second=65 amount=-2 +kerning first=327 second=245 amount=-1 +kerning first=325 second=266 amount=-1 +kerning first=368 second=65 amount=-2 +kerning first=291 second=245 amount=-1 +kerning first=1025 second=1062 amount=-1 +kerning first=1059 second=1083 amount=-3 +kerning first=75 second=46 amount=-1 +kerning first=211 second=226 amount=-1 +kerning first=193 second=336 amount=-1 +kerning first=69 second=362 amount=-1 +kerning first=263 second=111 amount=-1 +kerning first=255 second=245 amount=-1 +kerning first=111 second=46 amount=-2 +kerning first=87 second=252 amount=-1 +kerning first=79 second=202 amount=-1 +kerning first=310 second=219 amount=-1 +kerning first=282 second=102 amount=-1 +kerning first=205 second=122 amount=-1 +kerning first=283 second=226 amount=-1 +kerning first=274 second=219 amount=-1 +kerning first=8222 second=118 amount=-2 +kerning first=354 second=102 amount=-1 +kerning first=100 second=122 amount=-1 +kerning first=217 second=266 amount=-1 +kerning first=202 second=219 amount=-1 +kerning first=254 second=8250 amount=-1 +kerning first=1057 second=1042 amount=-1 +kerning first=8220 second=234 amount=-1 +kerning first=225 second=316 amount=-1 +kerning first=8217 second=267 amount=-2 +kerning first=261 second=316 amount=-1 +kerning first=219 second=245 amount=-1 +kerning first=269 second=335 amount=-1 +kerning first=280 second=259 amount=-1 +kerning first=65 second=79 amount=-1 +kerning first=263 second=261 amount=-1 +kerning first=333 second=316 amount=-1 +kerning first=192 second=252 amount=-1 +kerning first=352 second=259 amount=-1 +kerning first=369 second=316 amount=-1 +kerning first=228 second=252 amount=-1 +kerning first=78 second=245 amount=-1 +kerning first=377 second=335 amount=-1 +kerning first=316 second=259 amount=-1 +kerning first=70 second=226 amount=-1 +kerning first=264 second=252 amount=-1 +kerning first=323 second=246 amount=-1 +kerning first=1027 second=1082 amount=-1 +kerning first=88 second=45 amount=-2 +kerning first=219 second=369 amount=-1 +kerning first=103 second=259 amount=-1 +kerning first=71 second=382 amount=-1 +kerning first=287 second=246 amount=-1 +kerning first=76 second=202 amount=-1 +kerning first=67 second=259 amount=-1 +kerning first=90 second=356 amount=-1 +kerning first=352 second=86 amount=-1 +kerning first=347 second=375 amount=-1 +kerning first=99 second=351 amount=-1 +kerning first=291 second=369 amount=-1 +kerning first=208 second=259 amount=-1 +kerning first=235 second=116 amount=-1 +kerning first=233 second=103 amount=-1 +kerning first=1054 second=1103 amount=-1 +kerning first=212 second=382 amount=-1 +kerning first=83 second=253 amount=-1 +kerning first=8250 second=331 amount=-1 +kerning first=298 second=233 amount=-1 +kerning first=197 second=103 amount=-1 +kerning first=229 second=45 amount=-1 +kerning first=370 second=109 amount=-1 +kerning first=224 second=253 amount=-1 +kerning first=78 second=369 amount=-1 +kerning first=76 second=266 amount=-1 +kerning first=100 second=249 amount=-1 +kerning first=98 second=375 amount=-1 +kerning first=205 second=279 amount=-1 +kerning first=377 second=332 amount=-1 +kerning first=313 second=122 amount=-1 +kerning first=354 second=362 amount=-1 +kerning first=277 second=122 amount=-1 +kerning first=65 second=277 amount=-1 +kerning first=78 second=242 amount=-1 +kerning first=219 second=242 amount=-1 +kerning first=275 second=375 amount=-1 +kerning first=85 second=109 amount=-1 +kerning first=363 second=369 amount=-1 +kerning first=248 second=382 amount=-1 +kerning first=327 second=369 amount=-1 +kerning first=284 second=382 amount=-1 +kerning first=291 second=242 amount=-1 +kerning first=210 second=362 amount=-1 +kerning first=379 second=116 amount=-1 +kerning first=255 second=242 amount=-1 +kerning first=121 second=109 amount=-1 +kerning first=377 second=103 amount=-2 +kerning first=195 second=356 amount=-3 +kerning first=356 second=382 amount=-2 +kerning first=201 second=227 amount=-1 +kerning first=327 second=242 amount=-1 +kerning first=275 second=115 amount=-1 +kerning first=332 second=68 amount=-1 +kerning first=103 second=355 amount=-1 +kerning first=278 second=370 amount=-1 +kerning first=332 second=304 amount=-1 +kerning first=202 second=80 amount=-1 +kerning first=203 second=115 amount=-1 +kerning first=100 second=119 amount=-1 +kerning first=352 second=355 amount=-1 +kerning first=356 second=237 amount=-1 +kerning first=350 second=370 amount=-1 +kerning first=363 second=363 amount=-1 +kerning first=316 second=355 amount=-1 +kerning first=205 second=119 amount=-1 +kerning first=211 second=198 amount=-2 +kerning first=311 second=115 amount=-1 +kerning first=241 second=119 amount=-1 +kerning first=288 second=203 amount=-1 +kerning first=347 second=115 amount=-1 +kerning first=277 second=119 amount=-1 +kerning first=1061 second=1090 amount=-1 +kerning first=313 second=119 amount=-1 +kerning first=8222 second=90 amount=-1 +kerning first=8216 second=235 amount=-1 +kerning first=1025 second=1090 amount=-1 +kerning first=203 second=284 amount=-1 +kerning first=296 second=253 amount=-1 +kerning first=266 second=108 amount=-1 +kerning first=84 second=313 amount=-1 +kerning first=274 second=315 amount=-1 +kerning first=368 second=253 amount=-1 +kerning first=338 second=108 amount=-1 +kerning first=1061 second=1059 amount=-1 +kerning first=274 second=80 amount=-1 +kerning first=377 second=75 amount=-1 +kerning first=1031 second=1105 amount=-1 +kerning first=346 second=80 amount=-1 +kerning first=1067 second=1105 amount=-1 +kerning first=65 second=370 amount=-2 +kerning first=83 second=68 amount=-1 +kerning first=1104 second=1095 amount=-1 +kerning first=339 second=328 amount=-1 +kerning first=196 second=269 amount=-1 +kerning first=303 second=328 amount=-1 +kerning first=315 second=196 amount=-1 +kerning first=197 second=335 amount=-1 +kerning first=304 second=269 amount=-1 +kerning first=267 second=328 amount=-1 +kerning first=316 second=231 amount=-1 +kerning first=296 second=225 amount=-1 +kerning first=231 second=328 amount=-1 +kerning first=376 second=269 amount=-2 +kerning first=346 second=315 amount=-1 +kerning first=83 second=225 amount=-1 +kerning first=230 second=108 amount=-1 +kerning first=197 second=363 amount=-1 +kerning first=226 second=316 amount=-1 +kerning first=119 second=225 amount=-2 +kerning first=194 second=108 amount=-1 +kerning first=233 second=363 amount=-1 +kerning first=105 second=102 amount=-1 +kerning first=216 second=203 amount=-1 +kerning first=122 second=277 amount=-1 +kerning first=324 second=46 amount=-1 +kerning first=87 second=280 amount=-1 +kerning first=269 second=363 amount=-1 +kerning first=67 second=231 amount=-1 +kerning first=278 second=198 amount=-1 +kerning first=305 second=363 amount=-1 +kerning first=8250 second=303 amount=-1 +kerning first=235 second=8217 amount=-1 +kerning first=377 second=363 amount=-1 +kerning first=332 second=225 amount=-1 +kerning first=264 second=280 amount=-1 +kerning first=368 second=225 amount=-2 +kerning first=291 second=273 amount=-1 +kerning first=194 second=8221 amount=-3 +kerning first=216 second=46 amount=-1 +kerning first=103 second=231 amount=-1 +kerning first=1086 second=1076 amount=-1 +kerning first=255 second=273 amount=-1 +kerning first=252 second=46 amount=-1 +kerning first=336 second=280 amount=-1 +kerning first=69 second=102 amount=-1 +kerning first=288 second=46 amount=-1 +kerning first=362 second=245 amount=-1 +kerning first=221 second=261 amount=-2 +kerning first=206 second=367 amount=-1 +kerning first=1057 second=1067 amount=-1 +kerning first=65 second=367 amount=-1 +kerning first=218 second=210 amount=-1 +kerning first=101 second=367 amount=-1 +kerning first=211 second=379 amount=-1 +kerning first=72 second=211 amount=-1 +kerning first=45 second=352 amount=-2 +kerning first=307 second=8220 amount=-1 +kerning first=200 second=296 amount=-1 +kerning first=368 second=250 amount=-1 +kerning first=1043 second=1092 amount=-1 +kerning first=379 second=351 amount=-1 +kerning first=77 second=210 amount=-1 +kerning first=354 second=275 amount=-2 +kerning first=235 second=8220 amount=-1 +kerning first=272 second=296 amount=-1 +kerning first=81 second=352 amount=-1 +kerning first=280 second=86 amount=-1 +kerning first=260 second=250 amount=-1 +kerning first=98 second=378 amount=-1 +kerning first=200 second=327 amount=-1 +kerning first=224 second=250 amount=-1 +kerning first=208 second=86 amount=-1 +kerning first=321 second=326 amount=-1 +kerning first=203 second=378 amount=-1 +kerning first=272 second=327 amount=-1 +kerning first=120 second=122 amount=-1 +kerning first=81 second=206 amount=-1 +kerning first=121 second=112 amount=-1 +kerning first=99 second=235 amount=-1 +kerning first=296 second=250 amount=-1 +kerning first=85 second=112 amount=-1 +kerning first=83 second=250 amount=-1 +kerning first=365 second=261 amount=-1 +kerning first=8220 second=374 amount=-1 +kerning first=108 second=326 amount=-1 +kerning first=1024 second=1118 amount=-1 +kerning first=90 second=328 amount=-1 +kerning first=102 second=171 amount=-1 +kerning first=222 second=206 amount=-1 +kerning first=117 second=237 amount=-1 +kerning first=84 second=288 amount=-1 +kerning first=377 second=100 amount=-1 +kerning first=296 second=365 amount=-1 +kerning first=260 second=365 amount=-1 +kerning first=45 second=237 amount=-1 +kerning first=280 second=262 amount=-1 +kerning first=224 second=365 amount=-1 +kerning first=67 second=83 amount=-1 +kerning first=197 second=100 amount=-1 +kerning first=121 second=224 amount=-1 +kerning first=307 second=355 amount=-1 +kerning first=253 second=353 amount=-1 +kerning first=315 second=171 amount=-1 +kerning first=370 second=112 amount=-1 +kerning first=111 second=382 amount=-1 +kerning first=289 second=353 amount=-1 +kerning first=351 second=171 amount=-1 +kerning first=269 second=100 amount=-1 +kerning first=347 second=378 amount=-1 +kerning first=1042 second=1113 amount=-1 +kerning first=208 second=83 amount=-1 +kerning first=298 second=112 amount=-1 +kerning first=222 second=352 amount=-1 +kerning first=213 second=323 amount=-1 +kerning first=280 second=83 amount=-1 +kerning first=200 second=46 amount=-1 +kerning first=112 second=353 amount=-1 +kerning first=80 second=113 amount=-1 +kerning first=352 second=83 amount=-1 +kerning first=264 second=249 amount=-1 +kerning first=70 second=198 amount=-2 +kerning first=258 second=352 amount=-2 +kerning first=217 second=353 amount=-1 +kerning first=366 second=352 amount=-1 +kerning first=370 second=337 amount=-1 +kerning first=330 second=352 amount=-1 +kerning first=321 second=323 amount=-1 +kerning first=67 second=262 amount=-2 +kerning first=221 second=113 amount=-2 +kerning first=275 second=353 amount=-1 +kerning first=354 second=332 amount=-1 +kerning first=111 second=291 amount=-1 +kerning first=352 second=114 amount=-1 +kerning first=199 second=233 amount=-1 +kerning first=379 second=379 amount=-1 +kerning first=354 second=99 amount=-2 +kerning first=313 second=304 amount=-1 +kerning first=336 second=364 amount=-1 +kerning first=80 second=289 amount=-1 +kerning first=8220 second=346 amount=-1 +kerning first=8222 second=121 amount=-1 +kerning first=116 second=289 amount=-1 +kerning first=314 second=339 amount=-1 +kerning first=264 second=364 amount=-1 +kerning first=192 second=249 amount=-1 +kerning first=214 second=274 amount=-1 +kerning first=221 second=289 amount=-2 +kerning first=262 second=84 amount=-1 +kerning first=228 second=249 amount=-1 +kerning first=257 second=289 amount=-1 +kerning first=258 second=89 amount=-3 +kerning first=45 second=324 amount=-1 +kerning first=87 second=249 amount=-1 +kerning first=222 second=89 amount=-1 +kerning first=1057 second=1039 amount=-1 +kerning first=379 second=233 amount=-1 +kerning first=1050 second=1079 amount=-1 +kerning first=76 second=350 amount=-1 +kerning first=65 second=339 amount=-1 +kerning first=67 second=234 amount=-1 +kerning first=103 second=234 amount=-1 +kerning first=366 second=237 amount=-1 +kerning first=286 second=274 amount=-1 +kerning first=334 second=84 amount=-1 +kerning first=221 second=110 amount=-1 +kerning first=1114 second=1116 amount=-1 +kerning first=206 second=339 amount=-1 +kerning first=192 second=121 amount=-1 +kerning first=332 second=8217 amount=-1 +kerning first=199 second=379 amount=-1 +kerning first=76 second=381 amount=-1 +kerning first=366 second=324 amount=-1 +kerning first=217 second=350 amount=-1 +kerning first=88 second=362 amount=-1 +kerning first=315 second=199 amount=-1 +kerning first=89 second=111 amount=-2 +kerning first=325 second=350 amount=-1 +kerning first=222 second=209 amount=-1 +kerning first=275 second=8217 amount=-1 +kerning first=120 second=375 amount=-1 +kerning first=67 second=86 amount=-1 +kerning first=192 second=277 amount=-1 +kerning first=286 second=302 amount=-1 +kerning first=379 second=264 amount=-1 +kerning first=8220 second=259 amount=-1 +kerning first=203 second=260 amount=-1 +kerning first=316 second=234 amount=-1 +kerning first=264 second=277 amount=-1 +kerning first=214 second=302 amount=-1 +kerning first=365 second=289 amount=-1 +kerning first=374 second=111 amount=-2 +kerning first=235 second=351 amount=-1 +kerning first=81 second=89 amount=-1 +kerning first=272 second=330 amount=-1 +kerning first=8218 second=259 amount=-1 +kerning first=199 second=264 amount=-2 +kerning first=344 second=212 amount=-1 +kerning first=66 second=199 amount=-1 +kerning first=87 second=277 amount=-2 +kerning first=307 second=351 amount=-1 +kerning first=314 second=367 amount=-1 +kerning first=194 second=111 amount=-1 +kerning first=213 second=354 amount=-1 +kerning first=89 second=377 amount=-1 +kerning first=350 second=367 amount=-1 +kerning first=377 second=72 amount=-1 +kerning first=192 second=364 amount=-2 +kerning first=81 second=209 amount=-1 +kerning first=207 second=199 amount=-1 +kerning first=266 second=111 amount=-1 +kerning first=199 second=351 amount=-1 +kerning first=45 second=209 amount=-3 +kerning first=200 second=212 amount=-1 +kerning first=278 second=367 amount=-1 +kerning first=302 second=111 amount=-1 +kerning first=321 second=354 amount=-1 +kerning first=87 second=364 amount=-1 +kerning first=89 second=362 amount=-1 +kerning first=87 second=264 amount=-1 +kerning first=321 second=351 amount=-1 +kerning first=110 second=361 amount=-1 +kerning first=259 second=8249 amount=-1 +kerning first=105 second=121 amount=-1 +kerning first=266 second=377 amount=-1 +kerning first=8217 second=119 amount=-1 +kerning first=295 second=8249 amount=-1 +kerning first=199 second=364 amount=-1 +kerning first=363 second=257 amount=-1 +kerning first=73 second=277 amount=-1 +kerning first=230 second=97 amount=-1 +kerning first=374 second=377 amount=-1 +kerning first=287 second=361 amount=-1 +kerning first=291 second=257 amount=-1 +kerning first=264 second=367 amount=-1 +kerning first=117 second=311 amount=-1 +kerning first=108 second=351 amount=-1 +kerning first=251 second=361 amount=-1 +kerning first=226 second=254 amount=-1 +kerning first=327 second=257 amount=-1 +kerning first=118 second=8249 amount=-2 +kerning first=75 second=287 amount=-1 +kerning first=356 second=267 amount=-2 +kerning first=262 second=254 amount=-1 +kerning first=219 second=257 amount=-2 +kerning first=192 second=367 amount=-1 +kerning first=338 second=377 amount=-1 +kerning first=316 second=111 amount=-1 +kerning first=323 second=361 amount=-1 +kerning first=255 second=257 amount=-2 +kerning first=46 second=8249 amount=-1 +kerning first=221 second=274 amount=-1 +kerning first=381 second=374 amount=-1 +kerning first=374 second=117 amount=-1 +kerning first=235 second=261 amount=-1 +kerning first=87 second=367 amount=-1 +kerning first=111 second=287 amount=-1 +kerning first=338 second=117 amount=-1 +kerning first=260 second=244 amount=-1 +kerning first=69 second=381 amount=-1 +kerning first=252 second=287 amount=-1 +kerning first=122 second=44 amount=-1 +kerning first=8216 second=226 amount=-1 +kerning first=307 second=261 amount=-1 +kerning first=296 second=244 amount=-1 +kerning first=354 second=121 amount=-1 +kerning first=80 second=274 amount=-1 +kerning first=216 second=287 amount=-1 +kerning first=307 second=104 amount=-1 +kerning first=121 second=254 amount=-1 +kerning first=324 second=287 amount=-1 +kerning first=354 second=250 amount=-1 +kerning first=368 second=244 amount=-1 +kerning first=210 second=381 amount=-1 +kerning first=288 second=287 amount=-1 +kerning first=201 second=374 amount=-1 +kerning first=246 second=121 amount=-1 +kerning first=331 second=8249 amount=-1 +kerning first=282 second=381 amount=-1 +kerning first=287 second=237 amount=-1 +kerning first=199 second=261 amount=-1 +kerning first=367 second=8249 amount=-1 +kerning first=1049 second=1104 amount=-1 +kerning first=112 second=378 amount=-1 +kerning first=194 second=281 amount=-1 +kerning first=221 second=171 amount=-3 +kerning first=375 second=337 amount=-1 +kerning first=197 second=347 amount=-1 +kerning first=192 second=107 amount=-1 +kerning first=257 second=171 amount=-1 +kerning first=370 second=97 amount=-2 +kerning first=282 second=250 amount=-1 +kerning first=217 second=378 amount=-1 +kerning first=266 second=281 amount=-1 +kerning first=8220 second=89 amount=-1 +kerning first=303 second=337 amount=-1 +kerning first=1104 second=1078 amount=-1 +kerning first=89 second=117 amount=-1 +kerning first=302 second=281 amount=-1 +kerning first=264 second=107 amount=-1 +kerning first=230 second=117 amount=-1 +kerning first=379 second=261 amount=-1 +kerning first=44 second=171 amount=-1 +kerning first=194 second=117 amount=-1 +kerning first=80 second=171 amount=-1 +kerning first=65 second=354 amount=-3 +kerning first=302 second=117 amount=-1 +kerning first=89 second=281 amount=-2 +kerning first=116 second=171 amount=-1 +kerning first=266 second=117 amount=-1 +kerning first=69 second=250 amount=-1 +kerning first=346 second=197 amount=-2 +kerning first=291 second=100 amount=-1 +kerning first=103 second=240 amount=-1 +kerning first=327 second=100 amount=-1 +kerning first=83 second=74 amount=-1 +kerning first=203 second=288 amount=-1 +kerning first=8220 second=246 amount=-1 +kerning first=278 second=354 amount=-1 +kerning first=67 second=240 amount=-1 +kerning first=78 second=257 amount=-1 +kerning first=264 second=264 amount=-2 +kerning first=289 second=378 amount=-1 +kerning first=365 second=171 amount=-1 +kerning first=115 second=314 amount=-1 +kerning first=350 second=354 amount=-1 +kerning first=316 second=240 amount=-1 +kerning first=253 second=378 amount=-1 +kerning first=256 second=314 amount=-1 +kerning first=192 second=264 amount=-1 +kerning first=219 second=100 amount=-1 +kerning first=103 second=371 amount=-1 +kerning first=305 second=347 amount=-1 +kerning first=274 second=338 amount=-1 +kerning first=255 second=100 amount=-1 +kerning first=325 second=378 amount=-1 +kerning first=332 second=74 amount=-1 +kerning first=328 second=314 amount=-1 +kerning first=195 second=71 amount=-1 +kerning first=200 second=311 amount=-1 +kerning first=217 second=90 amount=-1 +kerning first=290 second=207 amount=-1 +kerning first=45 second=330 amount=-3 +kerning first=313 second=298 amount=-1 +kerning first=81 second=330 amount=-1 +kerning first=101 second=224 amount=-1 +kerning first=376 second=291 amount=-2 +kerning first=86 second=317 amount=-1 +kerning first=72 second=214 amount=-1 +kerning first=206 second=224 amount=-1 +kerning first=90 second=71 amount=-1 +kerning first=77 second=259 amount=-1 +kerning first=222 second=330 amount=-1 +kerning first=304 second=291 amount=-1 +kerning first=1038 second=1108 amount=-2 +kerning first=268 second=291 amount=-1 +kerning first=104 second=318 amount=-1 +kerning first=317 second=200 amount=-1 +kerning first=278 second=224 amount=-1 +kerning first=232 second=291 amount=-1 +kerning first=195 second=213 amount=-1 +kerning first=196 second=291 amount=-1 +kerning first=236 second=324 amount=-1 +kerning first=350 second=224 amount=-1 +kerning first=245 second=318 amount=-1 +kerning first=85 second=97 amount=-2 +kerning first=314 second=224 amount=-1 +kerning first=380 second=311 amount=-1 +kerning first=267 second=337 amount=-1 +kerning first=281 second=318 amount=-1 +kerning first=298 second=97 amount=-1 +kerning first=90 second=77 amount=-1 +kerning first=344 second=311 amount=-1 +kerning first=86 second=304 amount=-1 +kerning first=231 second=337 amount=-1 +kerning first=87 second=101 amount=-2 +kerning first=334 second=97 amount=-1 +kerning first=195 second=337 amount=-1 +kerning first=353 second=318 amount=-1 +kerning first=192 second=101 amount=-1 +kerning first=262 second=97 amount=-1 +kerning first=236 second=311 amount=-1 +kerning first=76 second=90 amount=-1 +kerning first=317 second=303 amount=-1 +kerning first=371 second=44 amount=-1 +kerning first=354 second=381 amount=-1 +kerning first=353 second=303 amount=-1 +kerning first=335 second=44 amount=-2 +kerning first=45 second=70 amount=-3 +kerning first=8220 second=83 amount=-1 +kerning first=272 second=193 amount=-2 +kerning first=1069 second=1025 amount=-1 +kerning first=235 second=104 amount=-1 +kerning first=222 second=70 amount=-1 +kerning first=290 second=325 amount=-1 +kerning first=380 second=324 amount=-1 +kerning first=199 second=104 amount=-1 +kerning first=81 second=70 amount=-1 +kerning first=263 second=44 amount=-1 +kerning first=82 second=284 amount=-1 +kerning first=90 second=213 amount=-1 +kerning first=108 second=227 amount=-1 +kerning first=67 second=111 amount=-1 +kerning first=78 second=251 amount=-1 +kerning first=72 second=227 amount=-1 +kerning first=317 second=194 amount=-1 +kerning first=103 second=111 amount=-1 +kerning first=72 second=351 amount=-1 +kerning first=219 second=251 amount=-1 +kerning first=321 second=85 amount=-1 +kerning first=258 second=234 amount=-1 +kerning first=291 second=251 amount=-1 +kerning first=213 second=85 amount=-1 +kerning first=249 second=227 amount=-1 +kerning first=330 second=234 amount=-1 +kerning first=290 second=201 amount=-1 +kerning first=363 second=251 amount=-1 +kerning first=213 second=227 amount=-1 +kerning first=366 second=234 amount=-1 +kerning first=1074 second=1093 amount=-1 +kerning first=327 second=251 amount=-1 +kerning first=290 second=310 amount=-1 +kerning first=68 second=194 amount=-2 +kerning first=275 second=118 amount=-1 +kerning first=289 second=105 amount=-1 +kerning first=73 second=283 amount=-1 +kerning first=258 second=231 amount=-1 +kerning first=347 second=118 amount=-1 +kerning first=217 second=105 amount=-1 +kerning first=311 second=118 amount=-1 +kerning first=253 second=105 amount=-1 +kerning first=80 second=280 amount=-1 +kerning first=98 second=118 amount=-1 +kerning first=201 second=368 amount=-1 +kerning first=112 second=105 amount=-1 +kerning first=259 second=103 amount=-1 +kerning first=197 second=245 amount=-1 +kerning first=203 second=118 amount=-1 +kerning first=221 second=280 amount=-1 +kerning first=356 second=8249 amount=-3 +kerning first=76 second=105 amount=-1 +kerning first=375 second=228 amount=-1 +kerning first=199 second=84 amount=-1 +kerning first=289 second=241 amount=-1 +kerning first=339 second=228 amount=-1 +kerning first=307 second=253 amount=-1 +kerning first=201 second=108 amount=-1 +kerning first=267 second=228 amount=-1 +kerning first=200 second=193 amount=-1 +kerning first=221 second=353 amount=-2 +kerning first=70 second=335 amount=-1 +kerning first=253 second=241 amount=-1 +kerning first=187 second=278 amount=-3 +kerning first=199 second=370 amount=-1 +kerning first=90 second=228 amount=-1 +kerning first=363 second=122 amount=-1 +kerning first=375 second=331 amount=-1 +kerning first=327 second=122 amount=-1 +kerning first=332 second=362 amount=-1 +kerning first=287 second=231 amount=-1 +kerning first=291 second=122 amount=-1 +kerning first=303 second=331 amount=-1 +kerning first=76 second=241 amount=-1 +kerning first=201 second=256 amount=-1 +kerning first=255 second=122 amount=-1 +kerning first=339 second=331 amount=-1 +kerning first=231 second=331 amount=-1 +kerning first=1050 second=1057 amount=-2 +kerning first=379 second=255 amount=-2 +kerning first=1027 second=1097 amount=-1 +kerning first=267 second=331 amount=-1 +kerning first=381 second=256 amount=-1 +kerning first=307 second=255 amount=-1 +kerning first=1043 second=1073 amount=-1 +kerning first=323 second=231 amount=-1 +kerning first=260 second=362 amount=-2 +kerning first=235 second=255 amount=-1 +kerning first=377 second=245 amount=-1 +kerning first=88 second=67 amount=-1 +kerning first=90 second=331 amount=-1 +kerning first=232 second=8250 amount=-1 +kerning first=377 second=81 amount=-1 +kerning first=1101 second=1095 amount=-1 +kerning first=378 second=261 amount=-1 +kerning first=1065 second=1095 amount=-1 +kerning first=83 second=362 amount=-1 +kerning first=269 second=245 amount=-1 +kerning first=321 second=214 amount=-1 +kerning first=219 second=122 amount=-1 +kerning first=203 second=266 amount=-1 +kerning first=74 second=231 amount=-1 +kerning first=90 second=65 amount=-1 +kerning first=78 second=122 amount=-1 +kerning first=356 second=282 amount=-1 +kerning first=377 second=229 amount=-1 +kerning first=378 second=307 amount=-1 +kerning first=79 second=217 amount=-1 +kerning first=1047 second=1053 amount=-1 +kerning first=284 second=282 amount=-1 +kerning first=88 second=333 amount=-1 +kerning first=1114 second=1084 amount=-1 +kerning first=202 second=68 amount=-1 +kerning first=310 second=216 amount=-1 +kerning first=212 second=282 amount=-1 +kerning first=256 second=217 amount=-2 +kerning first=76 second=74 amount=-1 +kerning first=236 second=305 amount=-1 +kerning first=74 second=346 amount=-1 +kerning first=255 second=106 amount=-1 +kerning first=332 second=80 amount=-1 +kerning first=193 second=67 amount=-1 +kerning first=197 second=81 amount=-1 +kerning first=71 second=282 amount=-1 +kerning first=314 second=230 amount=-1 +kerning first=363 second=106 amount=-1 +kerning first=8222 second=381 amount=-1 +kerning first=380 second=305 amount=-1 +kerning first=278 second=230 amount=-1 +kerning first=74 second=243 amount=-1 +kerning first=211 second=204 amount=-1 +kerning first=234 second=307 amount=-1 +kerning first=206 second=230 amount=-1 +kerning first=205 second=250 amount=-1 +kerning first=374 second=281 amount=-2 +kerning first=356 second=381 amount=-1 +kerning first=101 second=230 amount=-1 +kerning first=113 second=242 amount=-1 +kerning first=323 second=346 amount=-1 +kerning first=274 second=334 amount=-1 +kerning first=206 second=79 amount=-1 +kerning first=287 second=243 amount=-1 +kerning first=8250 second=197 amount=-2 +kerning first=202 second=203 amount=-1 +kerning first=317 second=193 amount=-1 +kerning first=323 second=243 amount=-1 +kerning first=193 second=218 amount=-2 +kerning first=275 second=104 amount=-1 +kerning first=8222 second=225 amount=-1 +kerning first=310 second=334 amount=-1 +kerning first=302 second=268 amount=-1 +kerning first=8222 second=250 amount=-1 +kerning first=79 second=69 amount=-1 +kerning first=8218 second=354 amount=-3 +kerning first=266 second=268 amount=-2 +kerning first=204 second=332 amount=-1 +kerning first=278 second=79 amount=-1 +kerning first=277 second=8221 amount=-1 +kerning first=374 second=268 amount=-1 +kerning first=1052 second=1072 amount=-1 +kerning first=119 second=244 amount=-1 +kerning first=338 second=268 amount=-1 +kerning first=346 second=68 amount=-1 +kerning first=83 second=80 amount=-1 +kerning first=89 second=268 amount=-1 +kerning first=274 second=68 amount=-1 +kerning first=366 second=268 amount=-1 +kerning first=1072 second=1098 amount=-1 +kerning first=194 second=268 amount=-1 +kerning first=88 second=218 amount=-1 +kerning first=198 second=192 amount=-1 +kerning first=346 second=203 amount=-1 +kerning first=354 second=328 amount=-1 +kerning first=321 second=201 amount=-1 +kerning first=371 second=46 amount=-1 +kerning first=269 second=229 amount=-1 +kerning first=202 second=334 amount=-1 +kerning first=121 second=242 amount=-1 +kerning first=201 second=120 amount=-1 +kerning first=274 second=203 amount=-1 +kerning first=85 second=242 amount=-1 +kerning first=356 second=279 amount=-2 +kerning first=289 second=99 amount=-1 +kerning first=86 second=192 amount=-3 +kerning first=1038 second=1099 amount=-2 +kerning first=253 second=99 amount=-1 +kerning first=377 second=232 amount=-1 +kerning first=298 second=242 amount=-1 +kerning first=8218 second=224 amount=-1 +kerning first=214 second=289 amount=-1 +kerning first=108 second=339 amount=-1 +kerning first=262 second=242 amount=-1 +kerning first=325 second=99 amount=-1 +kerning first=204 second=229 amount=-1 +kerning first=370 second=242 amount=-1 +kerning first=286 second=289 amount=-1 +kerning first=269 second=232 amount=-1 +kerning first=313 second=282 amount=-1 +kerning first=71 second=119 amount=-1 +kerning first=107 second=119 amount=-1 +kerning first=269 second=326 amount=-1 +kerning first=226 second=106 amount=-1 +kerning first=262 second=106 amount=-1 +kerning first=81 second=346 amount=-1 +kerning first=121 second=106 amount=-1 +kerning first=248 second=119 amount=-1 +kerning first=8222 second=378 amount=-2 +kerning first=197 second=232 amount=-1 +kerning first=45 second=346 amount=-2 +kerning first=284 second=119 amount=-1 +kerning first=264 second=379 amount=-1 +kerning first=330 second=346 amount=-1 +kerning first=1043 second=1079 amount=-1 +kerning first=196 second=367 amount=-1 +kerning first=350 second=82 amount=-1 +kerning first=356 second=119 amount=-1 +kerning first=336 second=379 amount=-1 +kerning first=258 second=346 amount=-2 +kerning first=362 second=249 amount=-1 +kerning first=274 second=289 amount=-1 +kerning first=222 second=346 amount=-1 +kerning first=334 second=106 amount=-1 +kerning first=73 second=289 amount=-1 +kerning first=1102 second=1095 amount=-1 +kerning first=72 second=79 amount=-1 +kerning first=321 second=69 amount=-1 +kerning first=278 second=82 amount=-1 +kerning first=79 second=66 amount=-1 +kerning first=113 second=316 amount=-1 +kerning first=88 second=212 amount=-1 +kerning first=45 second=196 amount=-2 +kerning first=311 second=269 amount=-1 +kerning first=213 second=69 amount=-1 +kerning first=315 second=302 amount=-1 +kerning first=254 second=316 amount=-1 +kerning first=346 second=350 amount=-1 +kerning first=68 second=228 amount=-1 +kerning first=202 second=216 amount=-1 +kerning first=336 second=8217 amount=-1 +kerning first=221 second=66 amount=-1 +kerning first=1036 second=1089 amount=-1 +kerning first=200 second=199 amount=-1 +kerning first=321 second=79 amount=-1 +kerning first=274 second=216 amount=-1 +kerning first=79 second=205 amount=-1 +kerning first=99 second=229 amount=-1 +kerning first=192 second=8217 amount=-3 +kerning first=81 second=76 amount=-1 +kerning first=344 second=199 amount=-1 +kerning first=228 second=8217 amount=-1 +kerning first=45 second=76 amount=-3 +kerning first=209 second=46 amount=-1 +kerning first=220 second=251 amount=-1 +kerning first=258 second=336 amount=-1 +kerning first=245 second=46 amount=-2 +kerning first=121 second=245 amount=-1 +kerning first=281 second=46 amount=-2 +kerning first=8250 second=318 amount=-1 +kerning first=85 second=245 amount=-1 +kerning first=366 second=336 amount=-1 +kerning first=370 second=245 amount=-1 +kerning first=354 second=266 amount=-1 +kerning first=335 second=8221 amount=-1 +kerning first=235 second=252 amount=-1 +kerning first=68 second=46 amount=-1 +kerning first=8218 second=227 amount=-1 +kerning first=282 second=266 amount=-1 +kerning first=104 second=46 amount=-1 +kerning first=1088 second=1083 amount=-1 +kerning first=262 second=245 amount=-1 +kerning first=198 second=87 amount=-1 +kerning first=272 second=45 amount=-1 +kerning first=86 second=202 amount=-1 +kerning first=236 second=45 amount=-1 +kerning first=326 second=316 amount=-1 +kerning first=121 second=103 amount=-2 +kerning first=344 second=45 amount=-2 +kerning first=315 second=296 amount=-1 +kerning first=85 second=103 amount=-2 +kerning first=195 second=219 amount=-2 +kerning first=307 second=252 amount=-1 +kerning first=208 second=364 amount=-1 +kerning first=99 second=226 amount=-1 +kerning first=380 second=45 amount=-2 +kerning first=204 second=335 amount=-1 +kerning first=381 second=259 amount=-1 +kerning first=204 second=226 amount=-1 +kerning first=76 second=253 amount=-1 +kerning first=85 second=369 amount=-1 +kerning first=112 second=253 amount=-1 +kerning first=246 second=375 amount=-1 +kerning first=66 second=85 amount=-2 +kerning first=1067 second=1073 amount=-1 +kerning first=217 second=253 amount=-1 +kerning first=370 second=103 amount=-2 +kerning first=187 second=287 amount=-1 +kerning first=316 second=246 amount=-1 +kerning first=317 second=103 amount=-1 +kerning first=334 second=103 amount=-1 +kerning first=8218 second=85 amount=-2 +kerning first=289 second=253 amount=-1 +kerning first=379 second=252 amount=-1 +kerning first=87 second=116 amount=-1 +kerning first=83 second=356 amount=-1 +kerning first=298 second=103 amount=-1 +kerning first=325 second=253 amount=-1 +kerning first=200 second=45 amount=-1 +kerning first=201 second=259 amount=-1 +kerning first=262 second=103 amount=-1 +kerning first=192 second=116 amount=-1 +kerning first=74 second=83 amount=-1 +kerning first=226 second=103 amount=-1 +kerning first=296 second=267 amount=-1 +kerning first=255 second=382 amount=-1 +kerning first=212 second=122 amount=-1 +kerning first=103 second=246 amount=-1 +kerning first=370 second=369 amount=-1 +kerning first=291 second=382 amount=-1 +kerning first=67 second=246 amount=-1 +kerning first=107 second=279 amount=-1 +kerning first=8250 second=280 amount=-3 +kerning first=8220 second=240 amount=-1 +kerning first=327 second=382 amount=-1 +kerning first=79 second=323 amount=-1 +kerning first=363 second=382 amount=-1 +kerning first=71 second=122 amount=-1 +kerning first=75 second=8221 amount=-1 +kerning first=262 second=369 amount=-1 +kerning first=65 second=81 amount=-1 +kerning first=78 second=382 amount=-1 +kerning first=255 second=109 amount=-1 +kerning first=356 second=122 amount=-2 +kerning first=226 second=369 amount=-1 +kerning first=323 second=83 amount=-1 +kerning first=69 second=266 amount=-1 +kerning first=284 second=122 amount=-1 +kerning first=298 second=369 amount=-1 +kerning first=76 second=362 amount=-1 +kerning first=332 second=356 amount=-1 +kerning first=219 second=382 amount=-1 +kerning first=291 second=109 amount=-1 +kerning first=248 second=122 amount=-1 +kerning first=105 second=115 amount=-1 +kerning first=262 second=248 amount=-1 +kerning first=8218 second=230 amount=-1 +kerning first=218 second=198 amount=-2 +kerning first=298 second=248 amount=-1 +kerning first=1038 second=1105 amount=-2 +kerning first=83 second=90 amount=-1 +kerning first=69 second=115 amount=-1 +kerning first=290 second=198 amount=-1 +kerning first=201 second=380 amount=-1 +kerning first=354 second=263 amount=-2 +kerning first=86 second=109 amount=-1 +kerning first=363 second=117 amount=-1 +kerning first=282 second=115 amount=-1 +kerning first=85 second=248 amount=-1 +kerning first=86 second=244 amount=-2 +kerning first=376 second=288 amount=-1 +kerning first=121 second=248 amount=-1 +kerning first=171 second=89 amount=-2 +kerning first=117 second=307 amount=-1 +kerning first=246 second=115 amount=-1 +kerning first=290 second=313 amount=-1 +kerning first=68 second=315 amount=-1 +kerning first=314 second=233 amount=-1 +kerning first=76 second=365 amount=-1 +kerning first=202 second=213 amount=-1 +kerning first=354 second=115 amount=-2 +kerning first=287 second=355 amount=-1 +kerning first=274 second=213 amount=-1 +kerning first=198 second=298 amount=-1 +kerning first=83 second=350 amount=-1 +kerning first=87 second=110 amount=-1 +kerning first=222 second=73 amount=-1 +kerning first=362 second=198 amount=-2 +kerning first=83 second=97 amount=-1 +kerning first=370 second=248 amount=-1 +kerning first=354 second=377 amount=-1 +kerning first=260 second=350 amount=-2 +kerning first=202 second=328 amount=-1 +kerning first=264 second=110 amount=-1 +kerning first=45 second=73 amount=-3 +kerning first=296 second=350 amount=-1 +kerning first=85 second=363 amount=-1 +kerning first=211 second=325 amount=-1 +kerning first=8250 second=203 amount=-3 +kerning first=90 second=225 amount=-1 +kerning first=81 second=73 amount=-1 +kerning first=103 second=98 amount=-1 +kerning first=268 second=269 amount=-1 +kerning first=67 second=98 amount=-1 +kerning first=65 second=85 amount=-2 +kerning first=258 second=221 amount=-3 +kerning first=346 second=328 amount=-1 +kerning first=226 second=363 amount=-1 +kerning first=262 second=363 amount=-1 +kerning first=200 second=196 amount=-1 +kerning first=317 second=315 amount=-1 +kerning first=332 second=350 amount=-1 +kerning first=274 second=328 amount=-1 +kerning first=298 second=363 amount=-1 +kerning first=252 second=303 amount=-1 +kerning first=222 second=221 amount=-1 +kerning first=368 second=350 amount=-1 +kerning first=69 second=260 amount=-1 +kerning first=272 second=196 amount=-2 +kerning first=339 second=225 amount=-1 +kerning first=352 second=98 amount=-1 +kerning first=366 second=264 amount=-1 +kerning first=210 second=260 amount=-2 +kerning first=370 second=363 amount=-1 +kerning first=381 second=380 amount=-1 +kerning first=375 second=225 amount=-2 +kerning first=316 second=98 amount=-1 +kerning first=82 second=290 amount=-1 +kerning first=282 second=260 amount=-1 +kerning first=382 second=328 amount=-1 +kerning first=1045 second=1093 amount=-1 +kerning first=354 second=260 amount=-3 +kerning first=204 second=338 amount=-1 +kerning first=350 second=85 amount=-1 +kerning first=353 second=46 amount=-1 +kerning first=231 second=225 amount=-1 +kerning first=267 second=225 amount=-1 +kerning first=1038 second=1102 amount=-2 +kerning first=280 second=98 amount=-1 +kerning first=278 second=85 amount=-1 +kerning first=303 second=225 amount=-1 +kerning first=78 second=112 amount=-1 +kerning first=8249 second=374 amount=-2 +kerning first=1052 second=1077 amount=-1 +kerning first=87 second=261 amount=-2 +kerning first=307 second=367 amount=-1 +kerning first=45 second=302 amount=-3 +kerning first=199 second=367 amount=-1 +kerning first=74 second=352 amount=-1 +kerning first=235 second=367 amount=-1 +kerning first=278 second=351 amount=-1 +kerning first=381 second=111 amount=-1 +kerning first=242 second=351 amount=-1 +kerning first=81 second=278 amount=-1 +kerning first=350 second=351 amount=-1 +kerning first=201 second=377 amount=-1 +kerning first=314 second=351 amount=-1 +kerning first=336 second=8220 amount=-1 +kerning first=364 second=326 amount=-1 +kerning first=1036 second=1092 amount=-1 +kerning first=363 second=112 amount=-1 +kerning first=88 second=252 amount=-1 +kerning first=73 second=171 amount=-2 +kerning first=197 second=235 amount=-1 +kerning first=115 second=326 amount=-1 +kerning first=325 second=250 amount=-1 +kerning first=327 second=112 amount=-1 +kerning first=109 second=171 amount=-1 +kerning first=220 second=211 amount=-1 +kerning first=82 second=287 amount=-1 +kerning first=291 second=113 amount=-1 +kerning first=192 second=8220 amount=-3 +kerning first=381 second=377 amount=-1 +kerning first=269 second=235 amount=-1 +kerning first=220 second=326 amount=-1 +kerning first=255 second=112 amount=-1 +kerning first=217 second=250 amount=-1 +kerning first=66 second=302 amount=-2 +kerning first=219 second=112 amount=-1 +kerning first=264 second=261 amount=-1 +kerning first=118 second=287 amount=-2 +kerning first=8220 second=243 amount=-1 +kerning first=377 second=235 amount=-1 +kerning first=364 second=211 amount=-1 +kerning first=104 second=121 amount=-1 +kerning first=336 second=261 amount=-1 +kerning first=223 second=287 amount=-1 +kerning first=260 second=353 amount=-1 +kerning first=251 second=237 amount=-1 +kerning first=282 second=378 amount=-1 +kerning first=331 second=287 amount=-1 +kerning first=264 second=113 amount=-1 +kerning first=296 second=353 amount=-1 +kerning first=8216 second=335 amount=-1 +kerning first=246 second=378 amount=-1 +kerning first=295 second=287 amount=-1 +kerning first=381 second=262 amount=-1 +kerning first=119 second=261 amount=-2 +kerning first=354 second=378 amount=-2 +kerning first=192 second=113 amount=-1 +kerning first=368 second=353 amount=-1 +kerning first=68 second=197 amount=-2 +kerning first=367 second=287 amount=-1 +kerning first=325 second=365 amount=-1 +kerning first=74 second=237 amount=-1 +kerning first=105 second=378 amount=-1 +kerning first=262 second=366 amount=-1 +kerning first=119 second=353 amount=-1 +kerning first=69 second=378 amount=-1 +kerning first=250 second=171 amount=-1 +kerning first=374 second=242 amount=-1 +kerning first=210 second=378 amount=-1 +kerning first=75 second=119 amount=-1 +kerning first=370 second=100 amount=-1 +kerning first=217 second=365 amount=-1 +kerning first=87 second=379 amount=-1 +kerning first=66 second=171 amount=-1 +kerning first=199 second=249 amount=-1 +kerning first=1058 second=1117 amount=-1 +kerning first=121 second=100 amount=-1 +kerning first=233 second=109 amount=-1 +kerning first=317 second=197 amount=-1 +kerning first=1025 second=1078 amount=-1 +kerning first=323 second=352 amount=-1 +kerning first=235 second=249 amount=-1 +kerning first=377 second=87 amount=-1 +kerning first=73 second=112 amount=-1 +kerning first=304 second=288 amount=-1 +kerning first=262 second=100 amount=-1 +kerning first=278 second=66 amount=-1 +kerning first=197 second=87 amount=-3 +kerning first=87 second=113 amount=-2 +kerning first=201 second=262 amount=-1 +kerning first=379 second=249 amount=-1 +kerning first=1056 second=1104 amount=-1 +kerning first=196 second=288 amount=-1 +kerning first=307 second=249 amount=-1 +kerning first=85 second=100 amount=-1 +kerning first=80 second=243 amount=-1 +kerning first=90 second=117 amount=-1 +kerning first=213 second=217 amount=-1 +kerning first=122 second=314 amount=-1 +kerning first=1059 second=1040 amount=-3 +kerning first=378 second=106 amount=-1 +kerning first=346 second=218 amount=-1 +kerning first=263 second=314 amount=-1 +kerning first=70 second=269 amount=-1 +kerning first=221 second=243 amount=-2 +kerning first=327 second=288 amount=-1 +kerning first=227 second=314 amount=-1 +kerning first=321 second=217 amount=-1 +kerning first=335 second=314 amount=-1 +kerning first=198 second=366 amount=-1 +kerning first=316 second=333 amount=-1 +kerning first=78 second=288 amount=-1 +kerning first=68 second=68 amount=-1 +kerning first=45 second=224 amount=-1 +kerning first=371 second=314 amount=-1 +kerning first=45 second=367 amount=-1 +kerning first=268 second=198 amount=-2 +kerning first=88 second=262 amount=-1 +kerning first=81 second=224 amount=-1 +kerning first=254 second=307 amount=-1 +kerning first=1059 second=1033 amount=-3 +kerning first=222 second=224 amount=-1 +kerning first=195 second=210 amount=-1 +kerning first=337 second=255 amount=-1 +kerning first=193 second=262 amount=-1 +kerning first=370 second=326 amount=-1 +kerning first=90 second=210 amount=-1 +kerning first=229 second=255 amount=-1 +kerning first=202 second=197 amount=-1 +kerning first=366 second=224 amount=-1 +kerning first=193 second=255 amount=-1 +kerning first=330 second=224 amount=-1 +kerning first=381 second=274 amount=-1 +kerning first=203 second=229 amount=-1 +kerning first=280 second=73 amount=-1 +kerning first=86 second=75 amount=-1 +kerning first=8220 second=256 amount=-4 +kerning first=352 second=73 amount=-1 +kerning first=199 second=101 amount=-1 +kerning first=122 second=375 amount=-1 +kerning first=376 second=198 amount=-3 +kerning first=347 second=229 amount=-1 +kerning first=216 second=120 amount=-1 +kerning first=8217 second=81 amount=-1 +kerning first=296 second=118 amount=-1 +kerning first=252 second=120 amount=-1 +kerning first=275 second=229 amount=-1 +kerning first=208 second=73 amount=-1 +kerning first=311 second=229 amount=-1 +kerning first=368 second=118 amount=-1 +kerning first=90 second=203 amount=-1 +kerning first=379 second=101 amount=-1 +kerning first=69 second=108 amount=-1 +kerning first=208 second=80 amount=-1 +kerning first=378 second=113 amount=-1 +kerning first=119 second=118 amount=-1 +kerning first=321 second=196 amount=-1 +kerning first=233 second=347 amount=-1 +kerning first=337 second=8220 amount=-1 +kerning first=260 second=118 amount=-2 +kerning first=352 second=226 amount=-1 +kerning first=280 second=80 amount=-1 +kerning first=224 second=118 amount=-1 +kerning first=67 second=73 amount=-1 +kerning first=334 second=87 amount=-1 +kerning first=67 second=80 amount=-1 +kerning first=213 second=196 amount=-2 +kerning first=288 second=198 amount=-1 +kerning first=229 second=8220 amount=-1 +kerning first=234 second=106 amount=-1 +kerning first=262 second=87 amount=-1 +kerning first=83 second=118 amount=-1 +kerning first=317 second=68 amount=-1 +kerning first=75 second=99 amount=-1 +kerning first=88 second=8220 amount=-1 +kerning first=356 second=249 amount=-1 +kerning first=1057 second=1113 amount=-1 +kerning first=280 second=361 amount=-1 +kerning first=260 second=111 amount=-1 +kerning first=65 second=364 amount=-2 +kerning first=221 second=264 amount=-1 +kerning first=296 second=111 amount=-1 +kerning first=352 second=361 amount=-1 +kerning first=316 second=361 amount=-1 +kerning first=78 second=267 amount=-1 +kerning first=278 second=364 amount=-1 +kerning first=291 second=267 amount=-1 +kerning first=255 second=316 amount=-1 +kerning first=76 second=368 amount=-1 +kerning first=327 second=267 amount=-1 +kerning first=119 second=111 amount=-1 +kerning first=291 second=316 amount=-1 +kerning first=66 second=104 amount=-1 +kerning first=268 second=356 amount=-1 +kerning first=347 second=257 amount=-1 +kerning first=219 second=267 amount=-1 +kerning first=1100 second=1116 amount=-1 +kerning first=255 second=267 amount=-1 +kerning first=8217 second=109 amount=-1 +kerning first=334 second=66 amount=-1 +kerning first=211 second=44 amount=-1 +kerning first=209 second=81 amount=-1 +kerning first=242 second=104 amount=-1 +kerning first=381 second=337 amount=-1 +kerning first=350 second=364 amount=-1 +kerning first=262 second=66 amount=-1 +kerning first=283 second=44 amount=-2 +kerning first=368 second=111 amount=-1 +kerning first=103 second=361 amount=-1 +kerning first=1078 second=1104 amount=-1 +kerning first=201 second=274 amount=-1 +kerning first=67 second=361 amount=-1 +kerning first=350 second=104 amount=-1 +kerning first=106 second=44 amount=-1 +kerning first=117 second=115 amount=-1 +kerning first=70 second=44 amount=-2 +kerning first=314 second=97 amount=-1 +kerning first=347 second=250 amount=-1 +kerning first=370 second=347 amount=-1 +kerning first=201 second=302 amount=-1 +kerning first=356 second=8250 amount=-1 +kerning first=89 second=278 amount=-1 +kerning first=350 second=97 amount=-1 +kerning first=262 second=326 amount=-1 +kerning first=376 second=226 amount=-2 +kerning first=83 second=378 amount=-1 +kerning first=346 second=346 amount=-1 +kerning first=298 second=347 amount=-1 +kerning first=214 second=205 amount=-1 +kerning first=278 second=97 amount=-1 +kerning first=262 second=347 amount=-1 +kerning first=203 second=250 amount=-1 +kerning first=226 second=347 amount=-1 +kerning first=266 second=278 amount=-1 +kerning first=85 second=326 amount=-1 +kerning first=73 second=233 amount=-1 +kerning first=8220 second=277 amount=-1 +kerning first=374 second=278 amount=-1 +kerning first=121 second=326 amount=-1 +kerning first=275 second=250 amount=-1 +kerning first=121 second=347 amount=-1 +kerning first=338 second=278 amount=-1 +kerning first=262 second=354 amount=-1 +kerning first=85 second=347 amount=-1 +kerning first=332 second=378 amount=-1 +kerning first=368 second=90 amount=-1 +kerning first=363 second=316 amount=-1 +kerning first=275 second=257 amount=-1 +kerning first=376 second=219 amount=-1 +kerning first=296 second=378 amount=-1 +kerning first=332 second=90 amount=-1 +kerning first=227 second=103 amount=-1 +kerning first=334 second=354 amount=-1 +kerning first=311 second=257 amount=-1 +kerning first=103 second=333 amount=-1 +kerning first=280 second=45 amount=-1 +kerning first=203 second=257 amount=-1 +kerning first=368 second=378 amount=-1 +kerning first=122 second=103 amount=-1 +kerning first=381 second=302 amount=-1 +kerning first=73 second=212 amount=-1 +kerning first=268 second=219 amount=-1 +kerning first=8222 second=253 amount=-1 +kerning first=86 second=103 amount=-2 +kerning first=1057 second=1092 amount=-1 +kerning first=119 second=378 amount=-1 +kerning first=316 second=45 amount=-1 +kerning first=1057 second=1085 amount=-1 +kerning first=86 second=110 amount=-1 +kerning first=232 second=226 amount=-1 +kerning first=196 second=219 amount=-2 +kerning first=1093 second=1092 amount=-1 +kerning first=122 second=110 amount=-1 +kerning first=268 second=226 amount=-1 +kerning first=67 second=333 amount=-1 +kerning first=304 second=226 amount=-1 +kerning first=232 second=328 amount=-1 +kerning first=122 second=363 amount=-1 +kerning first=278 second=214 amount=-1 +kerning first=203 second=194 amount=-1 +kerning first=227 second=363 amount=-1 +kerning first=1050 second=1089 amount=-1 +kerning first=1100 second=1088 amount=-1 +kerning first=263 second=363 amount=-1 +kerning first=330 second=259 amount=-1 +kerning first=88 second=318 amount=-1 +kerning first=371 second=110 amount=-1 +kerning first=211 second=220 amount=-1 +kerning first=202 second=65 amount=-1 +kerning first=379 second=353 amount=-1 +kerning first=193 second=318 amount=-1 +kerning first=1042 second=1063 amount=-1 +kerning first=371 second=363 amount=-1 +kerning first=274 second=65 amount=-1 +kerning first=366 second=259 amount=-2 +kerning first=229 second=318 amount=-1 +kerning first=206 second=214 amount=-1 +kerning first=205 second=369 amount=-1 +kerning first=277 second=116 amount=-1 +kerning first=75 second=71 amount=-1 +kerning first=381 second=77 amount=-1 +kerning first=117 second=259 amount=-1 +kerning first=201 second=330 amount=-1 +kerning first=277 second=369 amount=-1 +kerning first=337 second=318 amount=-1 +kerning first=65 second=214 amount=-1 +kerning first=241 second=369 amount=-1 +kerning first=222 second=259 amount=-1 +kerning first=211 second=304 amount=-1 +kerning first=73 second=240 amount=-1 +kerning first=206 second=97 amount=-1 +kerning first=100 second=369 amount=-1 +kerning first=81 second=259 amount=-1 +kerning first=381 second=330 amount=-1 +kerning first=45 second=259 amount=-1 +kerning first=101 second=97 amount=-1 +kerning first=246 second=253 amount=-1 +kerning first=68 second=377 amount=-1 +kerning first=113 second=279 amount=-1 +kerning first=112 second=375 amount=-1 +kerning first=119 second=228 amount=-1 +kerning first=195 second=374 amount=-3 +kerning first=76 second=375 amount=-1 +kerning first=232 second=254 amount=-1 +kerning first=83 second=228 amount=-1 +kerning first=218 second=279 amount=-1 +kerning first=354 second=253 amount=-1 +kerning first=66 second=209 amount=-2 +kerning first=118 second=355 amount=-1 +kerning first=90 second=374 amount=-1 +kerning first=325 second=375 amount=-1 +kerning first=313 second=369 amount=-1 +kerning first=268 second=337 amount=-1 +kerning first=82 second=355 amount=-1 +kerning first=289 second=375 amount=-1 +kerning first=99 second=273 amount=-1 +kerning first=77 second=279 amount=-1 +kerning first=69 second=361 amount=-1 +kerning first=346 second=8221 amount=-1 +kerning first=217 second=375 amount=-1 +kerning first=220 second=332 amount=-1 +kerning first=1067 second=1108 amount=-1 +kerning first=105 second=45 amount=-1 +kerning first=1104 second=1103 amount=-1 +kerning first=187 second=355 amount=-1 +kerning first=201 second=287 amount=-1 +kerning first=317 second=377 amount=-1 +kerning first=1031 second=1108 amount=-1 +kerning first=88 second=234 amount=-1 +kerning first=262 second=298 amount=-1 +kerning first=81 second=287 amount=-1 +kerning first=256 second=332 amount=-1 +kerning first=67 second=284 amount=-2 +kerning first=45 second=287 amount=-1 +kerning first=8250 second=356 amount=-2 +kerning first=193 second=234 amount=-1 +kerning first=364 second=332 amount=-1 +kerning first=334 second=298 amount=-1 +kerning first=198 second=310 amount=-1 +kerning first=267 second=119 amount=-1 +kerning first=86 second=363 amount=-1 +kerning first=117 second=287 amount=-1 +kerning first=362 second=279 amount=-1 +kerning first=258 second=287 amount=-1 +kerning first=212 second=313 amount=-1 +kerning first=371 second=335 amount=-1 +kerning first=289 second=108 amount=-1 +kerning first=198 second=338 amount=-1 +kerning first=193 second=290 amount=-1 +kerning first=66 second=375 amount=-1 +kerning first=222 second=8217 amount=-1 +kerning first=222 second=287 amount=-1 +kerning first=258 second=8217 amount=-3 +kerning first=197 second=242 amount=-1 +kerning first=330 second=287 amount=-1 +kerning first=381 second=105 amount=-1 +kerning first=99 second=245 amount=-1 +kerning first=269 second=242 amount=-1 +kerning first=76 second=197 amount=-1 +kerning first=366 second=287 amount=-2 +kerning first=71 second=313 amount=-1 +kerning first=263 second=335 amount=-1 +kerning first=81 second=8217 amount=-1 +kerning first=88 second=290 amount=-1 +kerning first=117 second=8217 amount=-2 +kerning first=217 second=197 amount=-2 +kerning first=216 second=380 amount=-1 +kerning first=334 second=270 amount=-1 +kerning first=1064 second=1060 amount=-1 +kerning first=105 second=225 amount=-1 +kerning first=252 second=380 amount=-1 +kerning first=377 second=242 amount=-1 +kerning first=86 second=335 amount=-2 +kerning first=76 second=108 amount=-1 +kerning first=87 second=119 amount=-1 +kerning first=330 second=231 amount=-1 +kerning first=210 second=225 amount=-1 +kerning first=122 second=335 amount=-1 +kerning first=221 second=277 amount=-2 +kerning first=84 second=90 amount=-1 +kerning first=366 second=231 amount=-1 +kerning first=192 second=119 amount=-2 +kerning first=1060 second=1049 amount=-1 +kerning first=368 second=228 amount=-1 +kerning first=112 second=108 amount=-1 +kerning first=228 second=119 amount=-1 +kerning first=1024 second=1049 amount=-1 +kerning first=332 second=228 amount=-1 +kerning first=1061 second=1118 amount=-1 +kerning first=253 second=108 amount=-1 +kerning first=264 second=119 amount=-1 +kerning first=262 second=270 amount=-1 +kerning first=296 second=228 amount=-1 +kerning first=89 second=74 amount=-2 +kerning first=69 second=225 amount=-1 +kerning first=235 second=122 amount=-1 +kerning first=374 second=46 amount=-3 +kerning first=199 second=122 amount=-1 +kerning first=67 second=256 amount=-2 +kerning first=75 second=352 amount=-1 +kerning first=332 second=200 amount=-1 +kerning first=187 second=102 amount=-1 +kerning first=216 second=352 amount=-1 +kerning first=376 second=201 amount=-1 +kerning first=266 second=74 amount=-1 +kerning first=8250 second=328 amount=-1 +kerning first=379 second=122 amount=-1 +kerning first=230 second=46 amount=-2 +kerning first=280 second=256 amount=-1 +kerning first=288 second=352 amount=-1 +kerning first=282 second=225 amount=-1 +kerning first=338 second=74 amount=-1 +kerning first=87 second=211 amount=-1 +kerning first=208 second=352 amount=-1 +kerning first=8218 second=104 amount=-1 +kerning first=208 second=256 amount=-2 +kerning first=113 second=307 amount=-1 +kerning first=354 second=225 amount=-2 +kerning first=338 second=46 amount=-1 +kerning first=83 second=200 amount=-1 +kerning first=89 second=46 amount=-3 +kerning first=264 second=211 amount=-2 +kerning first=204 second=245 amount=-1 +kerning first=352 second=256 amount=-2 +kerning first=192 second=211 amount=-1 +kerning first=367 second=102 amount=-1 +kerning first=115 second=171 amount=-1 +kerning first=8250 second=68 amount=-3 +kerning first=362 second=216 amount=-1 +kerning first=256 second=107 amount=-1 +kerning first=220 second=171 amount=-3 +kerning first=107 second=112 amount=-1 +kerning first=379 second=211 amount=-1 +kerning first=256 second=171 amount=-2 +kerning first=1043 second=1086 amount=-1 +kerning first=208 second=8221 amount=-1 +kerning first=115 second=107 amount=-1 +kerning first=244 second=8221 amount=-1 +kerning first=232 second=237 amount=-1 +kerning first=351 second=261 amount=-1 +kerning first=328 second=251 amount=-1 +kerning first=79 second=171 amount=-1 +kerning first=81 second=323 amount=-1 +kerning first=374 second=105 amount=-1 +kerning first=352 second=8221 amount=-1 +kerning first=1063 second=1072 amount=-1 +kerning first=364 second=100 amount=-1 +kerning first=266 second=105 amount=-1 +kerning first=8218 second=217 amount=-2 +kerning first=289 second=235 amount=-1 +kerning first=1027 second=1072 amount=-1 +kerning first=325 second=235 amount=-1 +kerning first=187 second=296 amount=-3 +kerning first=187 second=344 amount=-3 +kerning first=303 second=110 amount=-1 +kerning first=316 second=8221 amount=-2 +kerning first=230 second=105 amount=-1 +kerning first=220 second=100 amount=-1 +kerning first=356 second=112 amount=-1 +kerning first=89 second=105 amount=-1 +kerning first=195 second=86 amount=-3 +kerning first=328 second=171 amount=-1 +kerning first=256 second=100 amount=-1 +kerning first=120 second=251 amount=-1 +kerning first=364 second=171 amount=-3 +kerning first=211 second=85 amount=-1 +kerning first=356 second=81 amount=-1 +kerning first=90 second=86 amount=-1 +kerning first=84 second=251 amount=-1 +kerning first=187 second=327 amount=-3 +kerning first=83 second=305 amount=-1 +kerning first=248 second=112 amount=-1 +kerning first=82 second=67 amount=-1 +kerning first=225 second=251 amount=-1 +kerning first=282 second=171 amount=-1 +kerning first=66 second=230 amount=-1 +kerning first=90 second=353 amount=-1 +kerning first=102 second=230 amount=-1 +kerning first=76 second=204 amount=-1 +kerning first=274 second=346 amount=-1 +kerning first=84 second=233 amount=-2 +kerning first=287 second=249 amount=-1 +kerning first=261 second=251 amount=-1 +kerning first=323 second=249 amount=-1 +kerning first=71 second=379 amount=-1 +kerning first=196 second=275 amount=-1 +kerning first=231 second=353 amount=-1 +kerning first=200 second=206 amount=-1 +kerning first=369 second=251 amount=-1 +kerning first=212 second=379 amount=-1 +kerning first=1053 second=1105 amount=-1 +kerning first=74 second=256 amount=-3 +kerning first=272 second=206 amount=-1 +kerning first=381 second=365 amount=-1 +kerning first=82 second=334 amount=-1 +kerning first=284 second=379 amount=-1 +kerning first=84 second=223 amount=-1 +kerning first=364 second=339 amount=-1 +kerning first=1113 second=1114 amount=-1 +kerning first=351 second=230 amount=-1 +kerning first=90 second=83 amount=-1 +kerning first=376 second=275 amount=-2 +kerning first=356 second=313 amount=-1 +kerning first=279 second=230 amount=-1 +kerning first=251 second=249 amount=-1 +kerning first=73 second=268 amount=-1 +kerning first=195 second=83 amount=-2 +kerning first=199 second=211 amount=-2 +kerning first=110 second=249 amount=-1 +kerning first=304 second=275 amount=-1 +kerning first=284 second=313 amount=-1 +kerning first=207 second=230 amount=-1 +kerning first=77 second=244 amount=-1 +kerning first=279 second=289 amount=-1 +kerning first=269 second=103 amount=-1 +kerning first=113 second=244 amount=-1 +kerning first=69 second=194 amount=-1 +kerning first=315 second=289 amount=-1 +kerning first=8250 second=65 amount=-2 +kerning first=380 second=237 amount=-1 +kerning first=220 second=192 amount=-2 +kerning first=351 second=289 amount=-1 +kerning first=218 second=244 amount=-1 +kerning first=71 second=344 amount=-1 +kerning first=323 second=284 amount=-1 +kerning first=220 second=339 amount=-1 +kerning first=1078 second=1091 amount=-1 +kerning first=79 second=192 amount=-2 +kerning first=235 second=98 amount=-1 +kerning first=256 second=339 amount=-1 +kerning first=236 second=237 amount=-1 +kerning first=1114 second=1091 amount=-1 +kerning first=362 second=244 amount=-1 +kerning first=220 second=199 amount=-1 +kerning first=356 second=379 amount=-1 +kerning first=354 second=194 amount=-3 +kerning first=253 second=232 amount=-1 +kerning first=217 second=232 amount=-1 +kerning first=282 second=194 amount=-1 +kerning first=325 second=232 amount=-1 +kerning first=374 second=77 amount=-1 +kerning first=66 second=289 amount=-2 +kerning first=287 second=277 amount=-1 +kerning first=202 second=346 amount=-1 +kerning first=210 second=194 amount=-2 +kerning first=102 second=289 amount=-1 +kerning first=204 second=235 amount=-1 +kerning first=84 second=282 amount=-1 +kerning first=207 second=289 amount=-1 +kerning first=323 second=277 amount=-1 +kerning first=233 second=328 amount=-1 +kerning first=8218 second=221 amount=-3 +kerning first=243 second=289 amount=-1 +kerning first=217 second=111 amount=-1 +kerning first=248 second=351 amount=-1 +kerning first=90 second=350 amount=-1 +kerning first=261 second=254 amount=-1 +kerning first=339 second=121 amount=-1 +kerning first=74 second=277 amount=-1 +kerning first=315 second=202 amount=-1 +kerning first=303 second=121 amount=-1 +kerning first=267 second=121 amount=-1 +kerning first=214 second=379 amount=-1 +kerning first=369 second=254 amount=-1 +kerning first=231 second=121 amount=-1 +kerning first=377 second=69 amount=-1 +kerning first=200 second=209 amount=-1 +kerning first=195 second=121 amount=-1 +kerning first=328 second=367 amount=-1 +kerning first=1071 second=1095 amount=-1 +kerning first=120 second=254 amount=-1 +kerning first=364 second=367 amount=-1 +kerning first=195 second=350 amount=-2 +kerning first=90 second=121 amount=-2 +kerning first=256 second=367 amount=-1 +kerning first=107 second=351 amount=-1 +kerning first=74 second=305 amount=-1 +kerning first=284 second=344 amount=-1 +kerning first=375 second=114 amount=-1 +kerning first=256 second=79 amount=-1 +kerning first=104 second=117 amount=-1 +kerning first=74 second=284 amount=-1 +kerning first=207 second=261 amount=-1 +kerning first=220 second=367 amount=-1 +kerning first=77 second=216 amount=-1 +kerning first=287 second=305 amount=-1 +kerning first=346 second=374 amount=-1 +kerning first=1114 second=1119 amount=-1 +kerning first=351 second=117 amount=-1 +kerning first=85 second=260 amount=-2 +kerning first=364 second=199 amount=-1 +kerning first=279 second=261 amount=-1 +kerning first=115 second=367 amount=-1 +kerning first=220 second=79 amount=-1 +kerning first=317 second=117 amount=-1 +kerning first=274 second=374 amount=-1 +kerning first=356 second=351 amount=-2 +kerning first=281 second=117 amount=-1 +kerning first=79 second=72 amount=-1 +kerning first=364 second=192 amount=-2 +kerning first=202 second=374 amount=-1 +kerning first=66 second=261 amount=-1 +kerning first=353 second=117 amount=-1 +kerning first=1043 second=1089 amount=-1 +kerning first=1027 second=1051 amount=-3 +kerning first=262 second=260 amount=-2 +kerning first=102 second=261 amount=-1 +kerning first=364 second=79 amount=-1 +kerning first=381 second=361 amount=-1 +kerning first=121 second=291 amount=-2 +kerning first=370 second=260 amount=-2 +kerning first=337 second=311 amount=-1 +kerning first=248 second=316 amount=-1 +kerning first=315 second=286 amount=-1 +kerning first=85 second=291 amount=-2 +kerning first=334 second=260 amount=-2 +kerning first=207 second=352 amount=-1 +kerning first=8218 second=364 amount=-2 +kerning first=207 second=286 amount=-1 +kerning first=113 second=241 amount=-1 +kerning first=198 second=317 amount=-1 +kerning first=82 second=362 amount=-1 +kerning first=121 second=267 amount=-1 +kerning first=317 second=356 amount=-1 +kerning first=193 second=311 amount=-1 +kerning first=307 second=382 amount=-1 +kerning first=187 second=362 amount=-2 +kerning first=88 second=311 amount=-1 +kerning first=1064 second=1057 amount=-1 +kerning first=85 second=267 amount=-1 +kerning first=66 second=286 amount=-1 +kerning first=84 second=226 amount=-2 +kerning first=379 second=382 amount=-1 +kerning first=118 second=331 amount=-1 +kerning first=187 second=331 amount=-1 +kerning first=278 second=221 amount=-1 +kerning first=110 second=252 amount=-1 +kerning first=65 second=221 amount=-3 +kerning first=1024 second=1056 amount=-1 +kerning first=201 second=361 amount=-1 +kerning first=1060 second=1056 amount=-1 +kerning first=204 second=266 amount=-1 +kerning first=1053 second=1092 amount=-1 +kerning first=66 second=202 amount=-2 +kerning first=79 second=103 amount=-1 +kerning first=101 second=104 amount=-1 +kerning first=212 second=356 amount=-1 +kerning first=251 second=252 amount=-1 +kerning first=65 second=104 amount=-1 +kerning first=90 second=381 amount=-1 +kerning first=287 second=252 amount=-1 +kerning first=203 second=201 amount=-1 +kerning first=76 second=207 amount=-1 +kerning first=323 second=252 amount=-1 +kerning first=355 second=8249 amount=-1 +kerning first=120 second=226 amount=-1 +kerning first=74 second=45 amount=-2 +kerning first=71 second=84 amount=-1 +kerning first=264 second=246 amount=-1 +kerning first=364 second=103 amount=-2 +kerning first=74 second=336 amount=-1 +kerning first=68 second=356 amount=-1 +kerning first=328 second=103 amount=-1 +kerning first=370 second=291 amount=-2 +kerning first=199 second=382 amount=-1 +kerning first=192 second=246 amount=-1 +kerning first=334 second=291 amount=-1 +kerning first=235 second=382 amount=-1 +kerning first=110 second=45 amount=-1 +kerning first=284 second=84 amount=-1 +kerning first=356 second=109 amount=-1 +kerning first=256 second=103 amount=-1 +kerning first=298 second=291 amount=-1 +kerning first=251 second=45 amount=-1 +kerning first=87 second=246 amount=-1 +kerning first=220 second=103 amount=-2 +kerning first=262 second=291 amount=-1 +kerning first=88 second=227 amount=-1 +kerning first=212 second=84 amount=-1 +kerning first=369 second=226 amount=-1 +kerning first=226 second=291 amount=-1 +kerning first=334 second=259 amount=-1 +kerning first=323 second=45 amount=-2 +kerning first=87 second=78 amount=-1 +kerning first=115 second=103 amount=-1 +kerning first=323 second=336 amount=-1 +kerning first=287 second=45 amount=-1 +kerning first=370 second=263 amount=-1 +kerning first=264 second=352 amount=-1 +kerning first=192 second=218 amount=-2 +kerning first=362 second=213 amount=-1 +kerning first=87 second=218 amount=-1 +kerning first=336 second=218 amount=-1 +kerning first=198 second=314 amount=-1 +kerning first=112 second=115 amount=-1 +kerning first=262 second=263 amount=-1 +kerning first=350 second=193 amount=-2 +kerning first=73 second=243 amount=-1 +kerning first=298 second=263 amount=-1 +kerning first=77 second=269 amount=-1 +kerning first=264 second=218 amount=-1 +kerning first=356 second=288 amount=-1 +kerning first=229 second=8217 amount=-1 +kerning first=79 second=370 amount=-1 +kerning first=278 second=193 amount=-1 +kerning first=234 second=314 amount=-1 +kerning first=76 second=115 amount=-1 +kerning first=289 second=115 amount=-1 +kerning first=85 second=263 amount=-1 +kerning first=113 second=269 amount=-1 +kerning first=8218 second=97 amount=-1 +kerning first=208 second=8249 amount=-1 +kerning first=325 second=115 amount=-1 +kerning first=245 second=120 amount=-1 +kerning first=121 second=263 amount=-1 +kerning first=67 second=8249 amount=-2 +kerning first=217 second=115 amount=-1 +kerning first=281 second=120 amount=-1 +kerning first=1042 second=1038 amount=-1 +kerning first=218 second=269 amount=-1 +kerning first=103 second=8249 amount=-1 +kerning first=378 second=314 amount=-1 +kerning first=253 second=115 amount=-1 +kerning first=317 second=120 amount=-1 +kerning first=198 second=78 amount=-1 +kerning first=267 second=353 amount=-1 +kerning first=77 second=213 amount=-1 +kerning first=88 second=224 amount=-1 +kerning first=79 second=75 amount=-1 +kerning first=303 second=353 amount=-1 +kerning first=68 second=120 amount=-1 +kerning first=218 second=213 amount=-1 +kerning first=201 second=70 amount=-1 +kerning first=339 second=353 amount=-1 +kerning first=362 second=269 amount=-1 +kerning first=375 second=353 amount=-1 +kerning first=350 second=317 amount=-1 +kerning first=201 second=98 amount=-1 +kerning first=339 second=118 amount=-1 +kerning first=88 second=255 amount=-2 +kerning first=374 second=197 amount=-3 +kerning first=303 second=118 amount=-1 +kerning first=286 second=89 amount=-1 +kerning first=375 second=118 amount=-1 +kerning first=195 second=118 amount=-2 +kerning first=316 second=8249 amount=-1 +kerning first=187 second=303 amount=-1 +kerning first=65 second=101 amount=-1 +kerning first=353 second=120 amount=-1 +kerning first=264 second=99 amount=-1 +kerning first=74 second=259 amount=-1 +kerning first=352 second=8249 amount=-1 +kerning first=223 second=303 amount=-1 +kerning first=267 second=118 amount=-1 +kerning first=225 second=171 amount=-1 +kerning first=217 second=235 amount=-1 +kerning first=1027 second=1076 amount=-1 +kerning first=350 second=221 amount=-1 +kerning first=280 second=8249 amount=-1 +kerning first=118 second=303 amount=-1 +kerning first=206 second=101 amount=-1 +kerning first=253 second=235 amount=-1 +kerning first=327 second=375 amount=-1 +kerning first=362 second=241 amount=-1 +kerning first=220 second=196 amount=-2 +kerning first=1025 second=1093 amount=-1 +kerning first=193 second=283 amount=-1 +kerning first=90 second=118 amount=-1 +kerning first=317 second=328 amount=-1 +kerning first=314 second=101 amount=-1 +kerning first=1049 second=1073 amount=-1 +kerning first=256 second=370 amount=-2 +kerning first=281 second=328 amount=-1 +kerning first=88 second=283 amount=-1 +kerning first=218 second=241 amount=-1 +kerning first=253 second=46 amount=-3 +kerning first=79 second=196 amount=-2 +kerning first=380 second=283 amount=-1 +kerning first=367 second=380 amount=-1 +kerning first=1038 second=1087 amount=-2 +kerning first=344 second=283 amount=-1 +kerning first=117 second=8220 amount=-2 +kerning first=119 second=108 amount=-1 +kerning first=81 second=8220 amount=-1 +kerning first=1042 second=1045 amount=-1 +kerning first=76 second=118 amount=-1 +kerning first=86 second=345 amount=-1 +kerning first=224 second=108 amount=-1 +kerning first=223 second=380 amount=-1 +kerning first=213 second=193 amount=-2 +kerning first=8220 second=281 amount=-1 +kerning first=86 second=338 amount=-1 +kerning first=119 second=115 amount=-1 +kerning first=321 second=193 amount=-1 +kerning first=217 second=361 amount=-1 +kerning first=83 second=368 amount=-1 +kerning first=99 second=241 amount=-1 +kerning first=118 second=380 amount=-1 +kerning first=353 second=331 amount=-1 +kerning first=193 second=286 amount=-1 +kerning first=83 second=115 amount=-1 +kerning first=187 second=380 amount=-3 +kerning first=83 second=203 amount=-1 +kerning first=296 second=115 amount=-1 +kerning first=281 second=331 amount=-1 +kerning first=88 second=286 amount=-1 +kerning first=325 second=119 amount=-1 +kerning first=204 second=248 amount=-1 +kerning first=260 second=368 amount=-2 +kerning first=317 second=331 amount=-1 +kerning first=224 second=115 amount=-1 +kerning first=83 second=108 amount=-1 +kerning first=304 second=290 amount=-1 +kerning first=260 second=115 amount=-1 +kerning first=99 second=248 amount=-1 +kerning first=90 second=78 amount=-1 +kerning first=258 second=255 amount=-1 +kerning first=327 second=269 amount=-1 +kerning first=262 second=323 amount=-1 +kerning first=106 second=307 amount=-1 +kerning first=117 second=255 amount=-1 +kerning first=8217 second=277 amount=-2 +kerning first=332 second=368 amount=-1 +kerning first=193 second=252 amount=-1 +kerning first=317 second=352 amount=-1 +kerning first=334 second=323 amount=-1 +kerning first=88 second=231 amount=-1 +kerning first=1060 second=1052 amount=-1 +kerning first=67 second=77 amount=-1 +kerning first=45 second=255 amount=-2 +kerning first=206 second=122 amount=-1 +kerning first=283 second=307 amount=-1 +kerning first=201 second=278 amount=-1 +kerning first=101 second=122 amount=-1 +kerning first=344 second=290 amount=-1 +kerning first=1038 second=1080 amount=-2 +kerning first=80 second=233 amount=-1 +kerning first=70 second=245 amount=-1 +kerning first=381 second=278 amount=-1 +kerning first=221 second=233 amount=-2 +kerning first=200 second=290 amount=-1 +kerning first=229 second=252 amount=-1 +kerning first=90 second=200 amount=-1 +kerning first=313 second=366 amount=-1 +kerning first=378 second=335 amount=-1 +kerning first=68 second=352 amount=-1 +kerning first=250 second=367 amount=-1 +kerning first=209 second=352 amount=-1 +kerning first=323 second=333 amount=-1 +kerning first=313 second=106 amount=-1 +kerning first=1050 second=1092 amount=-1 +kerning first=350 second=217 amount=-1 +kerning first=287 second=333 amount=-1 +kerning first=85 second=288 amount=-1 +kerning first=241 second=106 amount=-1 +kerning first=198 second=110 amount=-1 +kerning first=277 second=106 amount=-1 +kerning first=234 second=110 amount=-1 +kerning first=339 second=378 amount=-1 +kerning first=68 second=65 amount=-2 +kerning first=303 second=378 amount=-1 +kerning first=8218 second=367 amount=-1 +kerning first=375 second=378 amount=-1 +kerning first=1043 second=1080 amount=-1 +kerning first=268 second=262 amount=-2 +kerning first=378 second=110 amount=-1 +kerning first=368 second=210 amount=-1 +kerning first=264 second=243 amount=-1 +kerning first=65 second=217 amount=-2 +kerning first=78 second=347 amount=-1 +kerning first=296 second=210 amount=-1 +kerning first=258 second=262 amount=-1 +kerning first=317 second=65 amount=-1 +kerning first=316 second=281 amount=-1 +kerning first=260 second=210 amount=-1 +kerning first=1118 second=1078 amount=-1 +kerning first=203 second=198 amount=-1 +kerning first=298 second=288 amount=-1 +kerning first=233 second=326 amount=-1 +kerning first=87 second=243 amount=-2 +kerning first=330 second=262 amount=-1 +kerning first=262 second=288 amount=-2 +kerning first=366 second=255 amount=-1 +kerning first=67 second=281 amount=-1 +kerning first=366 second=262 amount=-1 +kerning first=370 second=288 amount=-1 +kerning first=330 second=255 amount=-1 +kerning first=103 second=281 amount=-1 +kerning first=192 second=243 amount=-1 +kerning first=278 second=217 amount=-1 +kerning first=223 second=120 amount=-1 +kerning first=87 second=74 amount=-2 +kerning first=208 second=274 amount=-1 +kerning first=259 second=120 amount=-1 +kerning first=69 second=229 amount=-1 +kerning first=362 second=291 amount=-2 +kerning first=118 second=99 amount=-1 +kerning first=78 second=44 amount=-1 +kerning first=8218 second=107 amount=-1 +kerning first=1024 second=1031 amount=-1 +kerning first=288 second=68 amount=-1 +kerning first=82 second=99 amount=-1 +kerning first=210 second=229 amount=-1 +kerning first=352 second=274 amount=-1 +kerning first=332 second=203 amount=-1 +kerning first=220 second=365 amount=-1 +kerning first=118 second=120 amount=-1 +kerning first=105 second=229 amount=-1 +kerning first=350 second=78 amount=-1 +kerning first=280 second=274 amount=-1 +kerning first=187 second=120 amount=-2 +kerning first=381 second=73 amount=-1 +kerning first=87 second=240 amount=-2 +kerning first=298 second=267 amount=-1 +kerning first=354 second=229 amount=-2 +kerning first=216 second=377 amount=-1 +kerning first=67 second=108 amount=-1 +kerning first=325 second=118 amount=-1 +kerning first=289 second=118 amount=-1 +kerning first=282 second=229 amount=-1 +kerning first=1067 second=1077 amount=-1 +kerning first=205 second=113 amount=-1 +kerning first=262 second=267 amount=-1 +kerning first=381 second=80 amount=-1 +kerning first=198 second=75 amount=-1 +kerning first=367 second=120 amount=-1 +kerning first=201 second=80 amount=-1 +kerning first=278 second=196 amount=-1 +kerning first=86 second=332 amount=-1 +kerning first=1031 second=1077 amount=-1 +kerning first=112 second=118 amount=-1 +kerning first=370 second=267 amount=-1 +kerning first=258 second=8220 amount=-3 +kerning first=288 second=377 amount=-1 +kerning first=253 second=118 amount=-1 +kerning first=222 second=8220 amount=-1 +kerning first=350 second=196 amount=-2 +kerning first=217 second=118 amount=-1 +kerning first=90 second=111 amount=-1 +kerning first=72 second=199 amount=-1 +kerning first=88 second=287 amount=-1 +kerning first=229 second=287 amount=-1 +kerning first=195 second=111 amount=-1 +kerning first=286 second=209 amount=-1 +kerning first=193 second=287 amount=-1 +kerning first=84 second=219 amount=-1 +kerning first=231 second=111 amount=-1 +kerning first=86 second=339 amount=-2 +kerning first=110 second=8217 amount=-2 +kerning first=99 second=242 amount=-1 +kerning first=122 second=339 amount=-1 +kerning first=344 second=234 amount=-1 +kerning first=8217 second=113 amount=-2 +kerning first=204 second=242 amount=-1 +kerning first=321 second=199 amount=-1 +kerning first=337 second=287 amount=-1 +kerning first=380 second=234 amount=-1 +kerning first=73 second=264 amount=-1 +kerning first=83 second=374 amount=-1 +kerning first=311 second=254 amount=-1 +kerning first=367 second=303 amount=-1 +kerning first=83 second=197 amount=-2 +kerning first=347 second=254 amount=-1 +kerning first=200 second=289 amount=-1 +kerning first=83 second=121 amount=-1 +kerning first=213 second=364 amount=-1 +kerning first=236 second=289 amount=-1 +kerning first=1114 second=1094 amount=-1 +kerning first=331 second=361 amount=-1 +kerning first=70 second=244 amount=-1 +kerning first=79 second=82 amount=-1 +kerning first=67 second=274 amount=-1 +kerning first=267 second=111 amount=-1 +kerning first=258 second=216 amount=-1 +kerning first=303 second=111 amount=-1 +kerning first=203 second=254 amount=-1 +kerning first=344 second=289 amount=-1 +kerning first=380 second=289 amount=-1 +kerning first=8250 second=346 amount=-2 +kerning first=332 second=197 amount=-2 +kerning first=321 second=364 amount=-1 +kerning first=375 second=111 amount=-1 +kerning first=275 second=254 amount=-1 +kerning first=368 second=197 amount=-2 +kerning first=213 second=97 amount=-1 +kerning first=315 second=205 amount=-1 +kerning first=324 second=117 amount=-1 +kerning first=86 second=72 amount=-1 +kerning first=249 second=97 amount=-1 +kerning first=280 second=76 amount=-1 +kerning first=288 second=117 amount=-1 +kerning first=380 second=228 amount=-1 +kerning first=108 second=97 amount=-1 +kerning first=274 second=380 amount=-1 +kerning first=368 second=121 amount=-1 +kerning first=377 second=66 amount=-1 +kerning first=208 second=76 amount=-1 +kerning first=307 second=119 amount=-1 +kerning first=362 second=275 amount=-1 +kerning first=201 second=74 amount=-1 +kerning first=192 second=366 amount=-2 +kerning first=304 second=250 amount=-1 +kerning first=296 second=121 amount=-1 +kerning first=379 second=119 amount=-1 +kerning first=260 second=121 amount=-1 +kerning first=88 second=230 amount=-1 +kerning first=67 second=76 amount=-1 +kerning first=1069 second=1036 amount=-1 +kerning first=376 second=250 amount=-1 +kerning first=196 second=250 amount=-1 +kerning first=278 second=107 amount=-1 +kerning first=317 second=86 amount=-1 +kerning first=242 second=107 amount=-1 +kerning first=74 second=333 amount=-1 +kerning first=267 second=378 amount=-1 +kerning first=350 second=107 amount=-1 +kerning first=66 second=205 amount=-2 +kerning first=75 second=117 amount=-1 +kerning first=232 second=250 amount=-1 +kerning first=231 second=378 amount=-1 +kerning first=103 second=367 amount=-1 +kerning first=101 second=107 amount=-1 +kerning first=65 second=107 amount=-1 +kerning first=90 second=378 amount=-1 +kerning first=252 second=117 amount=-1 +kerning first=352 second=76 amount=-1 +kerning first=256 second=363 amount=-1 +kerning first=313 second=310 amount=-1 +kerning first=117 second=318 amount=-1 +kerning first=379 second=214 amount=-1 +kerning first=328 second=363 amount=-1 +kerning first=352 second=330 amount=-1 +kerning first=336 second=171 amount=-1 +kerning first=374 second=355 amount=-1 +kerning first=268 second=194 amount=-2 +kerning first=364 second=363 amount=-1 +kerning first=323 second=227 amount=-1 +kerning first=258 second=318 amount=-1 +kerning first=1043 second=1114 amount=-1 +kerning first=120 second=333 amount=-1 +kerning first=73 second=259 amount=-1 +kerning first=290 second=74 amount=-1 +kerning first=1057 second=1088 amount=-1 +kerning first=1093 second=1089 amount=-1 +kerning first=1057 second=1089 amount=-1 +kerning first=221 second=240 amount=-2 +kerning first=8216 second=241 amount=-1 +kerning first=287 second=259 amount=-1 +kerning first=209 second=71 amount=-1 +kerning first=378 second=116 amount=-1 +kerning first=350 second=122 amount=-1 +kerning first=208 second=77 amount=-1 +kerning first=296 second=375 amount=-1 +kerning first=317 second=71 amount=-1 +kerning first=88 second=346 amount=-1 +kerning first=199 second=214 amount=-2 +kerning first=260 second=375 amount=-1 +kerning first=67 second=330 amount=-1 +kerning first=278 second=122 amount=-1 +kerning first=224 second=375 amount=-1 +kerning first=1070 second=1041 amount=-1 +kerning first=71 second=369 amount=-1 +kerning first=323 second=259 amount=-1 +kerning first=89 second=296 amount=-1 +kerning first=280 second=330 amount=-1 +kerning first=234 second=116 amount=-1 +kerning first=72 second=97 amount=-1 +kerning first=352 second=77 amount=-1 +kerning first=264 second=220 amount=-1 +kerning first=209 second=246 amount=-1 +kerning first=376 second=194 amount=-3 +kerning first=208 second=330 amount=-1 +kerning first=290 second=220 amount=-1 +kerning first=1050 second=1086 amount=-1 +kerning first=280 second=77 amount=-1 +kerning first=368 second=375 amount=-1 +kerning first=334 second=344 amount=-1 +kerning first=266 second=296 amount=-1 +kerning first=325 second=228 amount=-1 +kerning first=187 second=324 amount=-1 +kerning first=356 second=369 amount=-1 +kerning first=289 second=228 amount=-1 +kerning first=118 second=324 amount=-1 +kerning first=332 second=374 amount=-1 +kerning first=338 second=296 amount=-1 +kerning first=253 second=228 amount=-1 +kerning first=84 second=279 amount=-2 +kerning first=217 second=228 amount=-1 +kerning first=228 second=289 amount=-1 +kerning first=260 second=374 amount=-3 +kerning first=232 second=251 amount=-1 +kerning first=66 second=206 amount=-2 +kerning first=374 second=296 amount=-1 +kerning first=1045 second=1055 amount=-1 +kerning first=196 second=251 amount=-1 +kerning first=262 second=344 amount=-1 +kerning first=304 second=251 amount=-1 +kerning first=83 second=375 amount=-1 +kerning first=284 second=369 amount=-1 +kerning first=268 second=251 amount=-1 +kerning first=376 second=251 amount=-1 +kerning first=8217 second=112 amount=-1 +kerning first=381 second=284 amount=-1 +kerning first=98 second=253 amount=-1 +kerning first=89 second=355 amount=-1 +kerning first=315 second=206 amount=-1 +kerning first=201 second=284 amount=-1 +kerning first=1100 second=1119 amount=-1 +kerning first=115 second=363 amount=-1 +kerning first=120 second=279 amount=-1 +kerning first=275 second=253 amount=-1 +kerning first=230 second=355 amount=-1 +kerning first=220 second=363 amount=-1 +kerning first=45 second=318 amount=-1 +kerning first=347 second=253 amount=-1 +kerning first=194 second=355 amount=-1 +kerning first=232 second=331 amount=-1 +kerning first=313 second=313 amount=-1 +kerning first=45 second=315 amount=-3 +kerning first=251 second=318 amount=-1 +kerning first=202 second=83 amount=-1 +kerning first=8220 second=337 amount=-1 +kerning first=66 second=268 amount=-1 +kerning first=287 second=318 amount=-1 +kerning first=89 second=365 amount=-1 +kerning first=71 second=310 amount=-1 +kerning first=207 second=268 amount=-1 +kerning first=274 second=83 amount=-1 +kerning first=81 second=315 amount=-1 +kerning first=377 second=263 amount=-1 +kerning first=310 second=83 amount=-1 +kerning first=199 second=218 amount=-1 +kerning first=213 second=370 amount=-1 +kerning first=346 second=83 amount=-1 +kerning first=284 second=310 amount=-1 +kerning first=8216 second=245 amount=-1 +kerning first=1045 second=1065 amount=-1 +kerning first=197 second=263 amount=-1 +kerning first=381 second=355 amount=-1 +kerning first=212 second=310 amount=-1 +kerning first=84 second=220 amount=-1 +kerning first=230 second=303 amount=-1 +kerning first=274 second=353 amount=-1 +kerning first=266 second=303 amount=-1 +kerning first=84 second=275 amount=-2 +kerning first=310 second=353 amount=-1 +kerning first=346 second=353 amount=-1 +kerning first=374 second=365 amount=-1 +kerning first=356 second=310 amount=-1 +kerning first=382 second=353 amount=-1 +kerning first=108 second=45 amount=-1 +kerning first=338 second=365 amount=-1 +kerning first=222 second=315 amount=-1 +kerning first=374 second=303 amount=-1 +kerning first=380 second=224 amount=-1 +kerning first=302 second=365 amount=-1 +kerning first=1071 second=1060 amount=-1 +kerning first=266 second=365 amount=-1 +kerning first=202 second=353 amount=-1 +kerning first=253 second=303 amount=-1 +kerning first=230 second=365 amount=-1 +kerning first=194 second=365 amount=-1 +kerning first=1070 second=1048 amount=-1 +kerning first=289 second=225 amount=-1 +kerning first=1114 second=1098 amount=-1 +kerning first=118 second=105 amount=-1 +kerning first=325 second=225 amount=-1 +kerning first=266 second=98 amount=-1 +kerning first=1114 second=1095 amount=-1 +kerning first=354 second=228 amount=-2 +kerning first=1104 second=1093 amount=-1 +kerning first=338 second=98 amount=-1 +kerning first=1042 second=1095 amount=-1 +kerning first=331 second=46 amount=-1 +kerning first=282 second=228 amount=-1 +kerning first=89 second=303 amount=-1 +kerning first=367 second=46 amount=-1 +kerning first=354 second=235 amount=-1 +kerning first=217 second=225 amount=-2 +kerning first=230 second=98 amount=-1 +kerning first=210 second=228 amount=-1 +kerning first=253 second=225 amount=-2 +kerning first=194 second=98 amount=-1 +kerning first=274 second=350 amount=-1 +kerning first=8250 second=352 amount=-2 +kerning first=266 second=102 amount=-1 +kerning first=108 second=363 amount=-1 +kerning first=105 second=228 amount=-1 +kerning first=45 second=305 amount=-1 +kerning first=223 second=46 amount=-2 +kerning first=321 second=370 amount=-1 +kerning first=202 second=350 amount=-1 +kerning first=69 second=228 amount=-1 +kerning first=338 second=102 amount=-1 +kerning first=8218 second=382 amount=-2 +kerning first=259 second=46 amount=-1 +kerning first=374 second=102 amount=-1 +kerning first=295 second=46 amount=-1 +kerning first=249 second=363 amount=-1 +kerning first=89 second=102 amount=-1 +kerning first=90 second=245 amount=-1 +kerning first=83 second=86 amount=-1 +kerning first=369 second=46 amount=-1 +kerning first=121 second=273 amount=-1 +kerning first=1053 second=1108 amount=-1 +kerning first=110 second=318 amount=-1 +kerning first=321 second=363 amount=-1 +kerning first=377 second=325 amount=-1 +kerning first=82 second=46 amount=-1 +kerning first=208 second=280 amount=-1 +kerning first=230 second=102 amount=-1 +kerning first=118 second=46 amount=-3 +kerning first=278 second=211 amount=-1 +kerning first=202 second=86 amount=-1 +kerning first=366 second=305 amount=-1 +kerning first=313 second=112 amount=-1 +kerning first=75 second=67 amount=-1 +kerning first=206 second=211 amount=-1 +kerning first=122 second=261 amount=-1 +kerning first=277 second=112 amount=-1 +kerning first=86 second=171 amount=-3 +kerning first=241 second=112 amount=-1 +kerning first=327 second=81 amount=-1 +kerning first=366 second=256 amount=-2 +kerning first=214 second=261 amount=-1 +kerning first=346 second=86 amount=-1 +kerning first=205 second=112 amount=-1 +kerning first=250 second=261 amount=-1 +kerning first=310 second=86 amount=-1 +kerning first=249 second=107 amount=-1 +kerning first=286 second=261 amount=-1 +kerning first=84 second=216 amount=-1 +kerning first=1043 second=1076 amount=-1 +kerning first=274 second=86 amount=-1 +kerning first=206 second=99 amount=-1 +kerning first=100 second=112 amount=-1 +kerning first=8250 second=89 amount=-2 +kerning first=321 second=107 amount=-1 +kerning first=332 second=204 amount=-1 +kerning first=371 second=171 amount=-1 +kerning first=256 second=211 amount=-1 +kerning first=367 second=105 amount=-1 +kerning first=268 second=254 amount=-1 +kerning first=216 second=327 amount=-1 +kerning first=122 second=171 amount=-2 +kerning first=78 second=81 amount=-1 +kerning first=315 second=209 amount=-1 +kerning first=288 second=327 amount=-1 +kerning first=219 second=81 amount=-1 +kerning first=223 second=105 amount=-1 +kerning first=263 second=171 amount=-1 +kerning first=209 second=346 amount=-1 +kerning first=1025 second=1103 amount=-1 +kerning first=258 second=249 amount=-1 +kerning first=236 second=230 amount=-1 +kerning first=83 second=204 amount=-1 +kerning first=106 second=303 amount=-1 +kerning first=117 second=249 amount=-1 +kerning first=75 second=334 amount=-1 +kerning first=199 second=318 amount=-1 +kerning first=68 second=346 amount=-1 +kerning first=366 second=249 amount=-1 +kerning first=313 second=379 amount=-1 +kerning first=72 second=100 amount=-1 +kerning first=317 second=346 amount=-1 +kerning first=378 second=242 amount=-1 +kerning first=202 second=196 amount=-1 +kerning first=362 second=223 amount=-1 +kerning first=108 second=100 amount=-1 +kerning first=120 second=275 amount=-1 +kerning first=330 second=249 amount=-1 +kerning first=263 second=339 amount=-1 +kerning first=325 second=334 amount=-1 +kerning first=218 second=223 amount=-1 +kerning first=81 second=256 amount=-2 +kerning first=45 second=256 amount=-2 +kerning first=45 second=249 amount=-1 +kerning first=344 second=230 amount=-1 +kerning first=380 second=230 amount=-1 +kerning first=1042 second=1039 amount=-1 +kerning first=272 second=230 amount=-1 +kerning first=288 second=202 amount=-1 +kerning first=65 second=211 amount=-1 +kerning first=113 second=223 amount=-1 +kerning first=222 second=256 amount=-2 +kerning first=1045 second=1059 amount=-1 +kerning first=313 second=109 amount=-1 +kerning first=274 second=89 amount=-1 +kerning first=119 second=114 amount=-1 +kerning first=321 second=104 amount=-1 +kerning first=8250 second=86 amount=-2 +kerning first=321 second=192 amount=-1 +kerning first=83 second=114 amount=-1 +kerning first=277 second=109 amount=-1 +kerning first=315 second=212 amount=-1 +kerning first=1043 second=1104 amount=-1 +kerning first=100 second=314 amount=-1 +kerning first=337 second=237 amount=-1 +kerning first=221 second=187 amount=-1 +kerning first=323 second=262 amount=-1 +kerning first=199 second=217 amount=-1 +kerning first=194 second=99 amount=-1 +kerning first=302 second=99 amount=-1 +kerning first=201 second=8249 amount=-1 +kerning first=84 second=269 amount=-2 +kerning first=277 second=314 amount=-1 +kerning first=380 second=227 amount=-1 +kerning first=266 second=99 amount=-1 +kerning first=244 second=378 amount=-1 +kerning first=241 second=314 amount=-1 +kerning first=374 second=99 amount=-2 +kerning first=346 second=89 amount=-1 +kerning first=249 second=104 amount=-1 +kerning first=290 second=282 amount=-1 +kerning first=99 second=44 amount=-1 +kerning first=120 second=269 amount=-1 +kerning first=310 second=89 amount=-1 +kerning first=313 second=314 amount=-1 +kerning first=240 second=44 amount=-2 +kerning first=1102 second=1083 amount=-1 +kerning first=8222 second=229 amount=-1 +kerning first=78 second=351 amount=-1 +kerning first=231 second=371 amount=-1 +kerning first=200 second=224 amount=-1 +kerning first=267 second=371 amount=-1 +kerning first=377 second=267 amount=-1 +kerning first=316 second=277 amount=-1 +kerning first=266 second=302 amount=-1 +kerning first=303 second=371 amount=-1 +kerning first=272 second=224 amount=-1 +kerning first=363 second=347 amount=-1 +kerning first=8250 second=353 amount=-1 +kerning first=1070 second=1051 amount=-1 +kerning first=339 second=371 amount=-1 +kerning first=236 second=224 amount=-1 +kerning first=79 second=70 amount=-1 +kerning first=327 second=347 amount=-1 +kerning first=286 second=202 amount=-1 +kerning first=67 second=277 amount=-1 +kerning first=356 second=344 amount=-1 +kerning first=344 second=224 amount=-1 +kerning first=291 second=347 amount=-1 +kerning first=255 second=347 amount=-1 +kerning first=345 second=8249 amount=-1 +kerning first=214 second=202 amount=-1 +kerning first=89 second=302 amount=-1 +kerning first=89 second=361 amount=-1 +kerning first=381 second=8249 amount=-1 +kerning first=103 second=277 amount=-1 +kerning first=321 second=367 amount=-1 +kerning first=72 second=101 amount=-1 +kerning first=86 second=79 amount=-1 +kerning first=73 second=261 amount=-1 +kerning first=197 second=267 amount=-1 +kerning first=8217 second=106 amount=-1 +kerning first=108 second=101 amount=-1 +kerning first=363 second=351 amount=-1 +kerning first=249 second=367 amount=-1 +kerning first=334 second=69 amount=-1 +kerning first=207 second=212 amount=-1 +kerning first=376 second=257 amount=-2 +kerning first=66 second=212 amount=-1 +kerning first=368 second=114 amount=-1 +kerning first=255 second=351 amount=-1 +kerning first=233 second=97 amount=-1 +kerning first=268 second=257 amount=-1 +kerning first=262 second=69 amount=-1 +kerning first=1070 second=1047 amount=-1 +kerning first=304 second=257 amount=-1 +kerning first=8250 second=83 amount=-2 +kerning first=327 second=351 amount=-1 +kerning first=108 second=367 amount=-1 +kerning first=269 second=267 amount=-1 +kerning first=291 second=351 amount=-1 +kerning first=232 second=257 amount=-1 +kerning first=291 second=291 amount=-1 +kerning first=67 second=337 amount=-1 +kerning first=278 second=382 amount=-1 +kerning first=80 second=246 amount=-1 +kerning first=313 second=316 amount=-1 +kerning first=255 second=291 amount=-2 +kerning first=314 second=382 amount=-1 +kerning first=1045 second=1062 amount=-1 +kerning first=197 second=266 amount=-1 +kerning first=194 second=362 amount=-2 +kerning first=350 second=382 amount=-1 +kerning first=344 second=286 amount=-1 +kerning first=79 second=206 amount=-1 +kerning first=283 second=241 amount=-1 +kerning first=77 second=226 amount=-1 +kerning first=1071 second=1057 amount=-1 +kerning first=113 second=226 amount=-1 +kerning first=114 second=291 amount=-1 +kerning first=101 second=382 amount=-1 +kerning first=282 second=205 amount=-1 +kerning first=258 second=311 amount=-1 +kerning first=255 second=287 amount=-2 +kerning first=78 second=291 amount=-1 +kerning first=196 second=279 amount=-1 +kerning first=282 second=67 amount=-1 +kerning first=218 second=226 amount=-2 +kerning first=206 second=382 amount=-1 +kerning first=200 second=286 amount=-1 +kerning first=1042 second=1042 amount=-1 +kerning first=106 second=241 amount=-1 +kerning first=346 second=356 amount=-1 +kerning first=103 second=337 amount=-1 +kerning first=242 second=382 amount=-1 +kerning first=379 second=221 amount=-1 +kerning first=230 second=361 amount=-1 +kerning first=1107 second=1113 amount=-1 +kerning first=194 second=361 amount=-1 +kerning first=251 second=8221 amount=-2 +kerning first=99 second=382 amount=-1 +kerning first=302 second=361 amount=-1 +kerning first=316 second=337 amount=-1 +kerning first=192 second=290 amount=-1 +kerning first=110 second=8221 amount=-2 +kerning first=266 second=361 amount=-1 +kerning first=1100 second=1075 amount=-1 +kerning first=100 second=316 amount=-1 +kerning first=8217 second=369 amount=-1 +kerning first=374 second=361 amount=-1 +kerning first=1057 second=1082 amount=-1 +kerning first=284 second=289 amount=-1 +kerning first=241 second=316 amount=-1 +kerning first=216 second=274 amount=-1 +kerning first=199 second=221 amount=-1 +kerning first=377 second=266 amount=-1 +kerning first=200 second=227 amount=-1 +kerning first=280 second=70 amount=-1 +kerning first=213 second=103 amount=-1 +kerning first=258 second=252 amount=-1 +kerning first=83 second=381 amount=-1 +kerning first=222 second=45 amount=-1 +kerning first=368 second=115 amount=-1 +kerning first=208 second=70 amount=-1 +kerning first=83 second=207 amount=-1 +kerning first=108 second=103 amount=-1 +kerning first=86 second=78 amount=-1 +kerning first=195 second=368 amount=-2 +kerning first=330 second=252 amount=-1 +kerning first=72 second=103 amount=-1 +kerning first=45 second=252 amount=-1 +kerning first=1042 second=1101 amount=-1 +kerning first=366 second=45 amount=-3 +kerning first=67 second=336 amount=-2 +kerning first=272 second=227 amount=-1 +kerning first=352 second=70 amount=-1 +kerning first=1078 second=1101 amount=-1 +kerning first=117 second=252 amount=-1 +kerning first=67 second=278 amount=-1 +kerning first=8250 second=350 amount=-2 +kerning first=332 second=381 amount=-1 +kerning first=290 second=226 amount=-1 +kerning first=332 second=207 amount=-1 +kerning first=268 second=201 amount=-1 +kerning first=274 second=356 amount=-1 +kerning first=45 second=311 amount=-1 +kerning first=313 second=317 amount=-1 +kerning first=1043 second=1107 amount=-1 +kerning first=202 second=90 amount=-1 +kerning first=280 second=336 amount=-1 +kerning first=202 second=356 amount=-1 +kerning first=377 second=323 amount=-1 +kerning first=208 second=278 amount=-1 +kerning first=266 second=362 amount=-1 +kerning first=366 second=252 amount=-1 +kerning first=274 second=90 amount=-1 +kerning first=81 second=45 amount=-1 +kerning first=87 second=233 amount=-2 +kerning first=221 second=246 amount=-1 +kerning first=321 second=103 amount=-1 +kerning first=280 second=278 amount=-1 +kerning first=338 second=362 amount=-1 +kerning first=346 second=90 amount=-1 +kerning first=192 second=233 amount=-1 +kerning first=327 second=291 amount=-1 +kerning first=200 second=216 amount=-1 +kerning first=117 second=45 amount=-1 +kerning first=352 second=278 amount=-1 +kerning first=108 second=382 amount=-1 +kerning first=122 second=369 amount=-1 +kerning first=277 second=103 amount=-1 +kerning first=1086 second=1095 amount=-1 +kerning first=86 second=369 amount=-1 +kerning first=241 second=103 amount=-1 +kerning first=218 second=259 amount=-2 +kerning first=187 second=356 amount=-2 +kerning first=1050 second=1095 amount=-2 +kerning first=213 second=382 amount=-1 +kerning first=227 second=369 amount=-1 +kerning first=205 second=103 amount=-1 +kerning first=249 second=382 amount=-1 +kerning first=236 second=259 amount=-1 +kerning first=263 second=116 amount=-1 +kerning first=82 second=356 amount=-1 +kerning first=100 second=103 amount=-1 +kerning first=73 second=246 amount=-1 +kerning first=380 second=252 amount=-1 +kerning first=356 second=263 amount=-2 +kerning first=122 second=116 amount=-1 +kerning first=100 second=363 amount=-1 +kerning first=72 second=382 amount=-1 +kerning first=374 second=45 amount=-3 +kerning first=86 second=116 amount=-1 +kerning first=354 second=226 amount=-2 +kerning first=99 second=279 amount=-1 +kerning first=1071 second=1054 amount=-1 +kerning first=195 second=375 amount=-1 +kerning first=205 second=363 amount=-1 +kerning first=1042 second=1076 amount=-1 +kerning first=249 second=122 amount=-1 +kerning first=1057 second=1100 amount=-1 +kerning first=89 second=305 amount=-1 +kerning first=204 second=279 amount=-1 +kerning first=90 second=375 amount=-2 +kerning first=213 second=122 amount=-1 +kerning first=277 second=363 amount=-1 +kerning first=317 second=362 amount=-1 +kerning first=1064 second=1089 amount=-1 +kerning first=371 second=109 amount=-1 +kerning first=313 second=363 amount=-1 +kerning first=216 second=65 amount=-2 +kerning first=339 second=375 amount=-1 +kerning first=371 second=116 amount=-1 +kerning first=321 second=382 amount=-1 +kerning first=303 second=375 amount=-1 +kerning first=68 second=362 amount=-1 +kerning first=263 second=369 amount=-1 +kerning first=122 second=109 amount=-1 +kerning first=266 second=305 amount=-1 +kerning first=288 second=65 amount=-1 +kerning first=267 second=375 amount=-1 +kerning first=371 second=369 amount=-1 +kerning first=89 second=45 amount=-3 +kerning first=263 second=109 amount=-1 +kerning first=69 second=122 amount=-1 +kerning first=230 second=305 amount=-1 +kerning first=1114 second=1076 amount=-1 +kerning first=231 second=375 amount=-1 +kerning first=321 second=122 amount=-1 +kerning first=313 second=103 amount=-1 +kerning first=1056 second=1063 amount=-1 +kerning first=281 second=355 amount=-1 +kerning first=303 second=115 amount=-1 +kerning first=339 second=115 amount=-1 +kerning first=304 second=232 amount=-1 +kerning first=231 second=115 amount=-1 +kerning first=374 second=305 amount=-1 +kerning first=84 second=202 amount=-1 +kerning first=1060 second=1062 amount=-1 +kerning first=196 second=232 amount=-1 +kerning first=219 second=44 amount=-3 +kerning first=201 second=336 amount=-1 +kerning first=1024 second=1062 amount=-1 +kerning first=353 second=355 amount=-1 +kerning first=375 second=115 amount=-1 +kerning first=268 second=232 amount=-1 +kerning first=8250 second=371 amount=-1 +kerning first=196 second=253 amount=-1 +kerning first=375 second=108 amount=-1 +kerning first=382 second=251 amount=-1 +kerning first=232 second=253 amount=-1 +kerning first=8250 second=90 amount=-2 +kerning first=339 second=108 amount=-1 +kerning first=1024 second=1055 amount=-1 +kerning first=381 second=336 amount=-1 +kerning first=304 second=253 amount=-1 +kerning first=8250 second=378 amount=-3 +kerning first=376 second=253 amount=-1 +kerning first=262 second=325 amount=-1 +kerning first=71 second=66 amount=-1 +kerning first=1042 second=1048 amount=-1 +kerning first=65 second=251 amount=-1 +kerning first=264 second=227 amount=-1 +kerning first=379 second=196 amount=-1 +kerning first=344 second=231 amount=-1 +kerning first=380 second=231 amount=-1 +kerning first=232 second=225 amount=-1 +kerning first=198 second=332 amount=-1 +kerning first=231 second=108 amount=-1 +kerning first=73 second=380 amount=-1 +kerning first=195 second=108 amount=-1 +kerning first=381 second=315 amount=-1 +kerning first=303 second=108 amount=-1 +kerning first=199 second=196 amount=-2 +kerning first=267 second=108 amount=-1 +kerning first=366 second=286 amount=-1 +kerning first=236 second=8217 amount=-1 +kerning first=264 second=84 amount=-1 +kerning first=272 second=8217 amount=-1 +kerning first=330 second=286 amount=-1 +kerning first=76 second=203 amount=-1 +kerning first=88 second=8221 amount=-1 +kerning first=268 second=225 amount=-1 +kerning first=286 second=218 amount=-1 +kerning first=244 second=46 amount=-2 +kerning first=200 second=280 amount=-1 +kerning first=258 second=286 amount=-1 +kerning first=195 second=115 amount=-1 +kerning first=304 second=225 amount=-1 +kerning first=280 second=46 amount=-1 +kerning first=214 second=218 amount=-1 +kerning first=272 second=280 amount=-1 +kerning first=113 second=273 amount=-1 +kerning first=90 second=115 amount=-1 +kerning first=376 second=225 amount=-2 +kerning first=352 second=46 amount=-2 +kerning first=353 second=102 amount=-1 +kerning first=217 second=210 amount=-1 +kerning first=1060 second=1083 amount=-1 +kerning first=67 second=46 amount=-1 +kerning first=1042 second=1053 amount=-1 +kerning first=240 second=307 amount=-1 +kerning first=65 second=119 amount=-2 +kerning first=103 second=46 amount=-2 +kerning first=193 second=8221 amount=-3 +kerning first=218 second=245 amount=-1 +kerning first=362 second=266 amount=-1 +kerning first=76 second=210 amount=-1 +kerning first=229 second=8221 amount=-1 +kerning first=207 second=337 amount=-1 +kerning first=67 second=67 amount=-2 +kerning first=108 second=122 amount=-1 +kerning first=206 second=119 amount=-1 +kerning first=72 second=122 amount=-1 +kerning first=242 second=119 amount=-1 +kerning first=281 second=102 amount=-1 +kerning first=337 second=8221 amount=-1 +kerning first=278 second=119 amount=-1 +kerning first=218 second=266 amount=-1 +kerning first=8250 second=118 amount=-2 +kerning first=314 second=119 amount=-1 +kerning first=268 second=204 amount=-1 +kerning first=350 second=119 amount=-1 +kerning first=236 second=252 amount=-1 +kerning first=1024 second=1090 amount=-1 +kerning first=344 second=252 amount=-1 +kerning first=267 second=115 amount=-1 +kerning first=205 second=335 amount=-1 +kerning first=344 second=259 amount=-1 +kerning first=1114 second=1097 amount=-1 +kerning first=376 second=204 amount=-1 +kerning first=77 second=245 amount=-1 +kerning first=1056 second=1042 amount=-1 +kerning first=99 second=307 amount=-1 +kerning first=197 second=269 amount=-1 +kerning first=187 second=328 amount=-1 +kerning first=368 second=196 amount=-2 +kerning first=280 second=67 amount=-1 +kerning first=380 second=259 amount=-1 +kerning first=86 second=81 amount=-1 +kerning first=118 second=328 amount=-1 +kerning first=200 second=252 amount=-1 +kerning first=364 second=113 amount=-1 +kerning first=324 second=353 amount=-1 +kerning first=269 second=269 amount=-1 +kerning first=8217 second=335 amount=-2 +kerning first=378 second=100 amount=-1 +kerning first=70 second=275 amount=-1 +kerning first=256 second=366 amount=-2 +kerning first=363 second=291 amount=-1 +kerning first=324 second=365 amount=-1 +kerning first=256 second=113 amount=-1 +kerning first=70 second=263 amount=-1 +kerning first=288 second=365 amount=-1 +kerning first=382 second=378 amount=-1 +kerning first=65 second=99 amount=-1 +kerning first=8217 second=347 amount=-1 +kerning first=252 second=365 amount=-1 +kerning first=202 second=378 amount=-1 +kerning first=278 second=171 amount=-1 +kerning first=71 second=259 amount=-1 +kerning first=314 second=171 amount=-1 +kerning first=252 second=353 amount=-1 +kerning first=274 second=378 amount=-1 +kerning first=350 second=171 amount=-1 +kerning first=315 second=262 amount=-1 +kerning first=379 second=8250 amount=-1 +kerning first=234 second=112 amount=-1 +kerning first=317 second=212 amount=-1 +kerning first=89 second=352 amount=-2 +kerning first=75 second=353 amount=-1 +kerning first=1027 second=1054 amount=-1 +kerning first=111 second=353 amount=-1 +kerning first=194 second=352 amount=-2 +kerning first=1057 second=1086 amount=-1 +kerning first=1093 second=1091 amount=-1 +kerning first=71 second=87 amount=-1 +kerning first=377 second=288 amount=-1 +kerning first=71 second=354 amount=-1 +kerning first=220 second=113 amount=-1 +kerning first=302 second=352 amount=-1 +kerning first=197 second=288 amount=-1 +kerning first=352 second=105 amount=-1 +kerning first=266 second=352 amount=-1 +kerning first=73 second=211 amount=-1 +kerning first=374 second=352 amount=-2 +kerning first=1045 second=1052 amount=-1 +kerning first=212 second=354 amount=-1 +kerning first=347 second=223 amount=-1 +kerning first=8220 second=283 amount=-1 +kerning first=338 second=352 amount=-1 +kerning first=88 second=249 amount=-1 +kerning first=1100 second=1117 amount=-1 +kerning first=351 second=8220 amount=-1 +kerning first=112 second=303 amount=-1 +kerning first=202 second=380 amount=-1 +kerning first=315 second=8220 amount=-2 +kerning first=84 second=248 amount=-2 +kerning first=201 second=296 amount=-1 +kerning first=203 second=223 amount=-1 +kerning first=1088 second=1113 amount=-1 +kerning first=378 second=339 amount=-1 +kerning first=279 second=8220 amount=-1 +kerning first=120 second=248 amount=-1 +kerning first=354 second=198 amount=-3 +kerning first=229 second=249 amount=-1 +kerning first=88 second=289 amount=-1 +kerning first=243 second=8220 amount=-1 +kerning first=69 second=198 amount=-1 +kerning first=221 second=282 amount=-1 +kerning first=193 second=289 amount=-1 +kerning first=356 second=338 amount=-1 +kerning first=193 second=249 amount=-1 +kerning first=67 second=327 amount=-1 +kerning first=102 second=8220 amount=1 +kerning first=210 second=198 amount=-2 +kerning first=266 second=73 amount=-1 +kerning first=75 second=365 amount=-1 +kerning first=66 second=8220 amount=-2 +kerning first=1043 second=1113 amount=-2 +kerning first=365 second=237 amount=-1 +kerning first=8222 second=219 amount=-2 +kerning first=262 second=313 amount=-1 +kerning first=381 second=296 amount=-1 +kerning first=338 second=73 amount=-1 +kerning first=346 second=324 amount=-1 +kerning first=208 second=327 amount=-1 +kerning first=374 second=73 amount=-1 +kerning first=201 second=315 amount=-1 +kerning first=1039 second=1105 amount=-1 +kerning first=89 second=73 amount=-1 +kerning first=310 second=99 amount=-1 +kerning first=193 second=8249 amount=-2 +kerning first=280 second=327 amount=-1 +kerning first=221 second=237 amount=-1 +kerning first=313 second=75 amount=-1 +kerning first=229 second=8249 amount=-1 +kerning first=214 second=206 amount=-1 +kerning first=382 second=99 amount=-1 +kerning first=88 second=8249 amount=-2 +kerning first=352 second=327 amount=-1 +kerning first=198 second=379 amount=-1 +kerning first=286 second=206 amount=-1 +kerning first=200 second=310 amount=-1 +kerning first=206 second=199 amount=-1 +kerning first=101 second=187 amount=-1 +kerning first=192 second=212 amount=-1 +kerning first=221 second=209 amount=-1 +kerning first=278 second=199 amount=-1 +kerning first=68 second=83 amount=-1 +kerning first=216 second=381 amount=-1 +kerning first=87 second=212 amount=-1 +kerning first=241 second=363 amount=-1 +kerning first=1118 second=1103 amount=-2 +kerning first=288 second=381 amount=-1 +kerning first=102 second=234 amount=-1 +kerning first=8217 second=363 amount=-1 +kerning first=209 second=83 amount=-1 +kerning first=206 second=234 amount=-1 +kerning first=315 second=264 amount=-1 +kerning first=207 second=234 amount=-1 +kerning first=82 second=89 amount=-1 +kerning first=317 second=83 amount=-1 +kerning first=198 second=351 amount=-1 +kerning first=207 second=264 amount=-1 +kerning first=88 second=277 amount=-1 +kerning first=310 second=111 amount=-1 +kerning first=79 second=364 amount=-1 +kerning first=187 second=89 amount=-2 +kerning first=337 second=289 amount=-1 +kerning first=193 second=277 amount=-1 +kerning first=234 second=351 amount=-1 +kerning first=66 second=264 amount=-1 +kerning first=378 second=367 amount=-1 +kerning first=327 second=119 amount=-1 +kerning first=80 second=209 amount=-1 +kerning first=65 second=199 amount=-1 +kerning first=256 second=364 amount=-2 +kerning first=264 second=212 amount=-2 +kerning first=355 second=291 amount=-1 +kerning first=234 second=367 amount=-1 +kerning first=284 second=354 amount=-1 +kerning first=69 second=226 amount=-1 +kerning first=79 second=97 amount=-1 +kerning first=105 second=226 amount=-1 +kerning first=283 second=291 amount=-1 +kerning first=269 second=108 amount=-1 +kerning first=381 second=76 amount=-1 +kerning first=353 second=97 amount=-1 +kerning first=198 second=367 amount=-1 +kerning first=380 second=233 amount=-1 +kerning first=210 second=226 amount=-1 +kerning first=211 second=291 amount=-1 +kerning first=1071 second=1092 amount=-1 +kerning first=198 second=72 amount=-1 +kerning first=220 second=97 amount=-2 +kerning first=344 second=233 amount=-1 +kerning first=350 second=346 amount=-1 +kerning first=1063 second=1054 amount=-1 +kerning first=356 second=326 amount=-1 +kerning first=282 second=226 amount=-1 +kerning first=106 second=291 amount=-1 +kerning first=75 second=337 amount=-1 +kerning first=115 second=97 amount=-1 +kerning first=70 second=291 amount=-1 +kerning first=378 second=351 amount=-1 +kerning first=201 second=76 amount=-1 +kerning first=108 second=110 amount=-1 +kerning first=1045 second=1040 amount=-1 +kerning first=364 second=97 amount=-2 +kerning first=209 second=350 amount=-1 +kerning first=261 second=250 amount=-1 +kerning first=1024 second=1050 amount=-1 +kerning first=206 second=171 amount=-2 +kerning first=68 second=350 amount=-1 +kerning first=369 second=250 amount=-1 +kerning first=75 second=86 amount=-1 +kerning first=202 second=77 amount=-1 +kerning first=1060 second=1050 amount=-1 +kerning first=197 second=316 amount=-1 +kerning first=1113 second=1100 amount=-1 +kerning first=317 second=350 amount=-1 +kerning first=233 second=316 amount=-1 +kerning first=120 second=250 amount=-1 +kerning first=84 second=250 amount=-1 +kerning first=288 second=86 amount=-1 +kerning first=305 second=316 amount=-1 +kerning first=225 second=250 amount=-1 +kerning first=65 second=171 amount=-2 +kerning first=377 second=234 amount=-1 +kerning first=201 second=331 amount=-1 +kerning first=203 second=200 amount=-1 +kerning first=264 second=221 amount=-1 +kerning first=317 second=381 amount=-1 +kerning first=380 second=271 amount=-1 +kerning first=192 second=221 amount=-3 +kerning first=267 second=117 amount=-1 +kerning first=231 second=117 amount=-1 +kerning first=339 second=117 amount=-1 +kerning first=303 second=117 amount=-1 +kerning first=344 second=264 amount=-1 +kerning first=280 second=290 amount=-1 +kerning first=264 second=214 amount=-2 +kerning first=203 second=207 amount=-1 +kerning first=82 second=98 amount=-1 +kerning first=78 second=338 amount=-1 +kerning first=187 second=98 amount=-1 +kerning first=194 second=291 amount=-1 +kerning first=200 second=264 amount=-1 +kerning first=344 second=240 amount=-1 +kerning first=87 second=214 amount=-1 +kerning first=380 second=240 amount=-1 +kerning first=86 second=364 amount=-1 +kerning first=192 second=214 amount=-1 +kerning first=90 second=377 amount=-1 +kerning first=336 second=221 amount=-1 +kerning first=1079 second=1093 amount=-1 +kerning first=368 second=194 amount=-2 +kerning first=268 second=220 amount=-1 +kerning first=1045 second=1024 amount=-1 +kerning first=8218 second=119 amount=-2 +kerning first=76 second=201 amount=-1 +kerning first=353 second=249 amount=-1 +kerning first=377 second=304 amount=-1 +kerning first=196 second=220 amount=-2 +kerning first=99 second=275 amount=-1 +kerning first=332 second=194 amount=-2 +kerning first=187 second=330 amount=-3 +kerning first=89 second=324 amount=-1 +kerning first=317 second=90 amount=-1 +kerning first=67 second=287 amount=-1 +kerning first=207 second=227 amount=-1 +kerning first=1082 second=1077 amount=-1 +kerning first=86 second=97 amount=-2 +kerning first=284 second=317 amount=-1 +kerning first=198 second=84 amount=-1 +kerning first=1118 second=1077 amount=-1 +kerning first=102 second=227 amount=-1 +kerning first=240 second=291 amount=-1 +kerning first=103 second=287 amount=-1 +kerning first=376 second=220 amount=-1 +kerning first=66 second=227 amount=-1 +kerning first=356 second=317 amount=-1 +kerning first=1046 second=1077 amount=-1 +kerning first=204 second=291 amount=-1 +kerning first=244 second=287 amount=-1 +kerning first=287 second=311 amount=-1 +kerning first=71 second=317 amount=-1 +kerning first=304 second=213 amount=-1 +kerning first=374 second=324 amount=-1 +kerning first=118 second=337 amount=-1 +kerning first=251 second=311 amount=-1 +kerning first=268 second=213 amount=-2 +kerning first=338 second=324 amount=-1 +kerning first=381 second=71 amount=-1 +kerning first=82 second=337 amount=-1 +kerning first=316 second=287 amount=-1 +kerning first=327 second=243 amount=-1 +kerning first=376 second=213 amount=-1 +kerning first=1114 second=1088 amount=-1 +kerning first=280 second=287 amount=-1 +kerning first=241 second=253 amount=-1 +kerning first=200 second=207 amount=-1 +kerning first=212 second=317 amount=-1 +kerning first=371 second=97 amount=-1 +kerning first=351 second=347 amount=-1 +kerning first=68 second=381 amount=-1 +kerning first=230 second=324 amount=-1 +kerning first=352 second=287 amount=-1 +kerning first=288 second=77 amount=-1 +kerning first=327 second=261 amount=-1 +kerning first=68 second=90 amount=-1 +kerning first=242 second=187 amount=-1 +kerning first=315 second=303 amount=-1 +kerning first=350 second=187 amount=-1 +kerning first=201 second=71 amount=-1 +kerning first=216 second=77 amount=-1 +kerning first=266 second=324 amount=-1 +kerning first=352 second=318 amount=-1 +kerning first=225 second=8217 amount=-1 +kerning first=381 second=303 amount=-1 +kerning first=99 second=263 amount=-1 +kerning first=295 second=365 amount=-1 +kerning first=259 second=365 amount=-1 +kerning first=203 second=197 amount=-1 +kerning first=344 second=268 amount=-1 +kerning first=377 second=326 amount=-1 +kerning first=231 second=120 amount=-1 +kerning first=1050 second=1104 amount=-1 +kerning first=204 second=263 amount=-1 +kerning first=336 second=193 amount=-2 +kerning first=356 second=78 amount=-1 +kerning first=363 second=45 amount=-1 +kerning first=267 second=120 amount=-1 +kerning first=187 second=365 amount=-1 +kerning first=317 second=353 amount=-1 +kerning first=344 second=243 amount=-1 +kerning first=284 second=78 amount=-1 +kerning first=353 second=353 amount=-1 +kerning first=380 second=243 amount=-1 +kerning first=251 second=291 amount=-1 +kerning first=200 second=268 amount=-1 +kerning first=187 second=70 amount=-3 +kerning first=212 second=78 amount=-1 +kerning first=267 second=232 amount=-1 +kerning first=71 second=78 amount=-1 +kerning first=218 second=275 amount=-1 +kerning first=69 second=356 amount=-1 +kerning first=209 second=353 amount=-1 +kerning first=284 second=85 amount=-1 +kerning first=353 second=118 amount=-1 +kerning first=113 second=275 amount=-1 +kerning first=245 second=353 amount=-1 +kerning first=108 second=113 amount=-1 +kerning first=281 second=353 amount=-1 +kerning first=212 second=85 amount=-1 +kerning first=248 second=314 amount=-1 +kerning first=303 second=120 amount=-1 +kerning first=288 second=74 amount=-1 +kerning first=77 second=275 amount=-1 +kerning first=8250 second=102 amount=-1 +kerning first=339 second=120 amount=-1 +kerning first=209 second=118 amount=-1 +kerning first=375 second=120 amount=-1 +kerning first=71 second=85 amount=-1 +kerning first=367 second=365 amount=-1 +kerning first=317 second=118 amount=-1 +kerning first=104 second=353 amount=-1 +kerning first=331 second=365 amount=-1 +kerning first=281 second=118 amount=-1 +kerning first=1082 second=1108 amount=-1 +kerning first=252 second=105 amount=-1 +kerning first=303 second=380 amount=-1 +kerning first=1046 second=1108 amount=-1 +kerning first=376 second=241 amount=-1 +kerning first=8250 second=362 amount=-2 +kerning first=8218 second=122 amount=-2 +kerning first=339 second=380 amount=-1 +kerning first=81 second=8249 amount=-1 +kerning first=311 second=235 amount=-1 +kerning first=74 second=283 amount=-1 +kerning first=375 second=380 amount=-1 +kerning first=117 second=8249 amount=-1 +kerning first=325 second=353 amount=-1 +kerning first=66 second=224 amount=-1 +kerning first=104 second=118 amount=-1 +kerning first=327 second=338 amount=-1 +kerning first=268 second=241 amount=-1 +kerning first=323 second=283 amount=-1 +kerning first=295 second=98 amount=-1 +kerning first=207 second=224 amount=-1 +kerning first=111 second=318 amount=-1 +kerning first=287 second=283 amount=-1 +kerning first=259 second=98 amount=-1 +kerning first=231 second=380 amount=-1 +kerning first=367 second=98 amount=-1 +kerning first=279 second=224 amount=-1 +kerning first=1060 second=1053 amount=-1 +kerning first=344 second=8221 amount=-3 +kerning first=267 second=380 amount=-1 +kerning first=356 second=85 amount=-1 +kerning first=1024 second=1053 amount=-1 +kerning first=198 second=112 amount=-1 +kerning first=376 second=248 amount=-2 +kerning first=103 second=45 amount=-1 +kerning first=351 second=224 amount=-1 +kerning first=87 second=193 amount=-3 +kerning first=67 second=318 amount=-1 +kerning first=286 second=74 amount=-1 +kerning first=334 second=325 amount=-1 +kerning first=236 second=226 amount=-1 +kerning first=103 second=318 amount=-1 +kerning first=304 second=248 amount=-1 +kerning first=90 second=380 amount=-1 +kerning first=203 second=228 amount=-1 +kerning first=330 second=8249 amount=-2 +kerning first=264 second=193 amount=-2 +kerning first=244 second=318 amount=-1 +kerning first=366 second=8249 amount=-3 +kerning first=268 second=248 amount=-1 +kerning first=381 second=331 amount=-1 +kerning first=280 second=318 amount=-1 +kerning first=258 second=8249 amount=-2 +kerning first=220 second=101 amount=-1 +kerning first=316 second=318 amount=-1 +kerning first=256 second=101 amount=-1 +kerning first=1070 second=1038 amount=-1 +kerning first=1049 second=1072 amount=-1 +kerning first=379 second=205 amount=-1 +kerning first=1027 second=1047 amount=-1 +kerning first=71 second=82 amount=-1 +kerning first=364 second=101 amount=-1 +kerning first=313 second=66 amount=-1 +kerning first=365 second=230 amount=-1 +kerning first=315 second=255 amount=-1 +kerning first=279 second=255 amount=-1 +kerning first=1071 second=1073 amount=-1 +kerning first=199 second=205 amount=-1 +kerning first=287 second=281 amount=-1 +kerning first=243 second=255 amount=-1 +kerning first=8216 second=263 amount=-1 +kerning first=106 second=251 amount=-1 +kerning first=323 second=281 amount=-1 +kerning first=207 second=255 amount=-1 +kerning first=70 second=251 amount=-1 +kerning first=221 second=230 amount=-2 +kerning first=97 second=108 amount=-1 +kerning first=74 second=281 amount=-1 +kerning first=66 second=8217 amount=-2 +kerning first=81 second=8221 amount=-1 +kerning first=376 second=216 amount=-1 +kerning first=248 second=347 amount=-1 +kerning first=102 second=8217 amount=1 +kerning first=66 second=255 amount=-1 +kerning first=283 second=251 amount=-1 +kerning first=381 second=99 amount=-1 +kerning first=378 second=107 amount=-1 +kerning first=198 second=107 amount=-1 +kerning first=222 second=8221 amount=-1 +kerning first=196 second=216 amount=-1 +kerning first=107 second=347 amount=-1 +kerning first=258 second=8221 amount=-3 +kerning first=207 second=231 amount=-1 +kerning first=117 second=8221 amount=-2 +kerning first=268 second=216 amount=-2 +kerning first=382 second=371 amount=-1 +kerning first=234 second=107 amount=-1 +kerning first=304 second=216 amount=-1 +kerning first=102 second=231 amount=-1 +kerning first=381 second=67 amount=-1 +kerning first=115 second=106 amount=-1 +kerning first=369 second=229 amount=-1 +kerning first=211 second=282 amount=-1 +kerning first=266 second=80 amount=-1 +kerning first=87 second=217 amount=-1 +kerning first=79 second=106 amount=-1 +kerning first=82 second=333 amount=-1 +kerning first=356 second=345 amount=-1 +kerning first=216 second=346 amount=-1 +kerning first=274 second=368 amount=-1 +kerning first=201 second=67 amount=-1 +kerning first=380 second=107 amount=-1 +kerning first=302 second=257 amount=-1 +kerning first=328 second=106 amount=-1 +kerning first=310 second=368 amount=-1 +kerning first=89 second=80 amount=-1 +kerning first=118 second=333 amount=-1 +kerning first=264 second=217 amount=-1 +kerning first=75 second=346 amount=-1 +kerning first=203 second=204 amount=-1 +kerning first=288 second=346 amount=-1 +kerning first=1045 second=1049 amount=-1 +kerning first=346 second=368 amount=-1 +kerning first=207 second=338 amount=-1 +kerning first=338 second=80 amount=-1 +kerning first=233 second=307 amount=-1 +kerning first=269 second=307 amount=-1 +kerning first=1038 second=1033 amount=-3 +kerning first=374 second=80 amount=-1 +kerning first=201 second=334 amount=-1 +kerning first=88 second=284 amount=-1 +kerning first=8216 second=260 amount=-4 +kerning first=8217 second=326 amount=-1 +kerning first=256 second=369 amount=-1 +kerning first=233 second=44 amount=-2 +kerning first=198 second=79 amount=-1 +kerning first=256 second=104 amount=-1 +kerning first=364 second=369 amount=-1 +kerning first=102 second=259 amount=-1 +kerning first=66 second=259 amount=-1 +kerning first=201 second=77 amount=-1 +kerning first=115 second=369 amount=-1 +kerning first=288 second=374 amount=-1 +kerning first=198 second=344 amount=-1 +kerning first=220 second=369 amount=-1 +kerning first=350 second=192 amount=-2 +kerning first=381 second=334 amount=-1 +kerning first=216 second=374 amount=-1 +kerning first=378 second=109 amount=-1 +kerning first=351 second=227 amount=-1 +kerning first=269 second=279 amount=-1 +kerning first=120 second=229 amount=-1 +kerning first=278 second=192 amount=-1 +kerning first=1114 second=1085 amount=-1 +kerning first=83 second=194 amount=-2 +kerning first=336 second=217 amount=-1 +kerning first=1069 second=1059 amount=-1 +kerning first=279 second=227 amount=-1 +kerning first=234 second=109 amount=-1 +kerning first=84 second=229 amount=-2 +kerning first=305 second=44 amount=-1 +kerning first=1093 second=1095 amount=-1 +kerning first=269 second=44 amount=-1 +kerning first=1057 second=1095 amount=-1 +kerning first=115 second=104 amount=-1 +kerning first=193 second=284 amount=-1 +kerning first=197 second=279 amount=-1 +kerning first=187 second=65 amount=-2 +kerning first=339 second=289 amount=-1 +kerning first=97 second=371 amount=-1 +kerning first=354 second=219 amount=-1 +kerning first=218 second=379 amount=-1 +kerning first=311 second=232 amount=-1 +kerning first=282 second=219 amount=-1 +kerning first=82 second=361 amount=-1 +kerning first=84 second=257 amount=-2 +kerning first=326 second=118 amount=-1 +kerning first=120 second=257 amount=-1 +kerning first=210 second=219 amount=-1 +kerning first=187 second=361 amount=-1 +kerning first=377 second=279 amount=-1 +kerning first=295 second=361 amount=-1 +kerning first=381 second=305 amount=-1 +kerning first=82 second=210 amount=-1 +kerning first=259 second=361 amount=-1 +kerning first=80 second=202 amount=-1 +kerning first=69 second=219 amount=-1 +kerning first=353 second=121 amount=-1 +kerning first=356 second=82 amount=-1 +kerning first=196 second=244 amount=-1 +kerning first=283 second=254 amount=-1 +kerning first=75 second=374 amount=-1 +kerning first=317 second=121 amount=-1 +kerning first=221 second=202 amount=-1 +kerning first=281 second=121 amount=-1 +kerning first=268 second=244 amount=-1 +kerning first=8216 second=291 amount=-2 +kerning first=245 second=121 amount=-1 +kerning first=204 second=267 amount=-1 +kerning first=304 second=244 amount=-1 +kerning first=209 second=121 amount=-1 +kerning first=212 second=82 amount=-1 +kerning first=106 second=254 amount=-1 +kerning first=99 second=267 amount=-1 +kerning first=376 second=244 amount=-2 +kerning first=296 second=249 amount=-1 +kerning first=369 second=257 amount=-1 +kerning first=1057 second=1116 amount=-1 +kerning first=87 second=209 amount=-1 +kerning first=379 second=199 amount=-1 +kerning first=356 second=69 amount=-1 +kerning first=88 second=8217 amount=-1 +kerning first=221 second=212 amount=-1 +kerning first=284 second=69 amount=-1 +kerning first=205 second=332 amount=-1 +kerning first=264 second=209 amount=-1 +kerning first=313 second=79 amount=-1 +kerning first=212 second=69 amount=-1 +kerning first=205 second=79 amount=-1 +kerning first=121 second=316 amount=-1 +kerning first=198 second=82 amount=-1 +kerning first=71 second=69 amount=-1 +kerning first=371 second=303 amount=-1 +kerning first=379 second=192 amount=-1 +kerning first=69 second=216 amount=-1 +kerning first=266 second=76 amount=-1 +kerning first=366 second=289 amount=-2 +kerning first=337 second=8217 amount=-1 +kerning first=216 second=89 amount=-1 +kerning first=313 second=332 amount=-1 +kerning first=288 second=89 amount=-1 +kerning first=356 second=113 amount=-2 +kerning first=206 second=333 amount=-1 +kerning first=83 second=313 amount=-1 +kerning first=199 second=199 amount=-2 +kerning first=193 second=8217 amount=-3 +kerning first=199 second=192 amount=-2 +kerning first=77 second=242 amount=-1 +kerning first=313 second=72 amount=-1 +kerning first=218 second=242 amount=-1 +kerning first=86 second=82 amount=-1 +kerning first=221 second=205 amount=-1 +kerning first=89 second=336 amount=-1 +kerning first=75 second=89 amount=-1 +kerning first=203 second=226 amount=-1 +kerning first=8250 second=374 amount=-2 +kerning first=80 second=205 amount=-1 +kerning first=362 second=242 amount=-1 +kerning first=275 second=226 amount=-1 +kerning first=84 second=75 amount=-1 +kerning first=272 second=8221 amount=-1 +kerning first=72 second=119 amount=-1 +kerning first=347 second=226 amount=-1 +kerning first=307 second=45 amount=-1 +kerning first=282 second=216 amount=-1 +kerning first=374 second=76 amount=-1 +kerning first=108 second=119 amount=-1 +kerning first=219 second=326 amount=-1 +kerning first=338 second=76 amount=-1 +kerning first=255 second=326 amount=-1 +kerning first=97 second=253 amount=-1 +kerning first=236 second=8221 amount=-1 +kerning first=354 second=216 amount=-1 +kerning first=291 second=326 amount=-1 +kerning first=1064 second=1092 amount=-1 +kerning first=352 second=302 amount=-1 +kerning first=249 second=119 amount=-1 +kerning first=8216 second=267 amount=-1 +kerning first=82 second=86 amount=-1 +kerning first=203 second=219 amount=-1 +kerning first=262 second=316 amount=-1 +kerning first=87 second=202 amount=-1 +kerning first=280 second=302 amount=-1 +kerning first=321 second=119 amount=-1 +kerning first=381 second=333 amount=-1 +kerning first=336 second=209 amount=-1 +kerning first=280 second=282 amount=-1 +kerning first=350 second=230 amount=-1 +kerning first=381 second=45 amount=-1 +kerning first=336 second=202 amount=-1 +kerning first=208 second=302 amount=-1 +kerning first=1060 second=1059 amount=-1 +kerning first=264 second=202 amount=-1 +kerning first=187 second=86 amount=-2 +kerning first=67 second=302 amount=-1 +kerning first=346 second=375 amount=-1 +kerning first=310 second=375 amount=-2 +kerning first=8217 second=338 amount=-1 +kerning first=1100 second=1085 amount=-1 +kerning first=99 second=269 amount=-1 +kerning first=378 second=103 amount=-1 +kerning first=84 second=253 amount=-1 +kerning first=288 second=356 amount=-1 +kerning first=364 second=122 amount=-1 +kerning first=79 second=382 amount=-1 +kerning first=120 second=253 amount=-1 +kerning first=204 second=269 amount=-1 +kerning first=115 second=382 amount=-1 +kerning first=279 second=252 amount=-1 +kerning first=201 second=45 amount=-1 +kerning first=216 second=356 amount=-1 +kerning first=216 second=362 amount=-1 +kerning first=207 second=246 amount=-1 +kerning first=225 second=253 amount=-1 +kerning first=198 second=363 amount=-1 +kerning first=234 second=103 amount=-1 +kerning first=261 second=253 amount=-1 +kerning first=351 second=252 amount=-1 +kerning first=288 second=362 amount=-1 +kerning first=198 second=103 amount=-1 +kerning first=382 second=375 amount=-1 +kerning first=256 second=116 amount=-1 +kerning first=75 second=356 amount=-1 +kerning first=1045 second=1043 amount=-1 +kerning first=8217 second=345 amount=-1 +kerning first=115 second=122 amount=-1 +kerning first=84 second=213 amount=-1 +kerning first=75 second=362 amount=-1 +kerning first=79 second=122 amount=-1 +kerning first=364 second=382 amount=-1 +kerning first=88 second=259 amount=-1 +kerning first=378 second=363 amount=-1 +kerning first=378 second=369 amount=-1 +kerning first=1071 second=1089 amount=-1 +kerning first=198 second=369 amount=-1 +kerning first=314 second=307 amount=-1 +kerning first=220 second=382 amount=-1 +kerning first=364 second=109 amount=-1 +kerning first=97 second=375 amount=-1 +kerning first=220 second=122 amount=-1 +kerning first=234 second=369 amount=-1 +kerning first=70 second=266 amount=-1 +kerning first=115 second=109 amount=-1 +kerning first=202 second=115 amount=-1 +kerning first=75 second=355 amount=-1 +kerning first=194 second=336 amount=-1 +kerning first=220 second=109 amount=-1 +kerning first=97 second=115 amount=-1 +kerning first=356 second=256 amount=-3 +kerning first=335 second=380 amount=-1 +kerning first=302 second=336 amount=-1 +kerning first=346 second=115 amount=-1 +kerning first=338 second=336 amount=-1 +kerning first=382 second=115 amount=-1 +kerning first=1045 second=1036 amount=-1 +kerning first=374 second=336 amount=-1 +kerning first=274 second=115 amount=-1 +kerning first=208 second=296 amount=-1 +kerning first=1064 second=1086 amount=-1 +kerning first=310 second=115 amount=-1 +kerning first=333 second=253 amount=-1 +kerning first=280 second=296 amount=-1 +kerning first=369 second=253 amount=-1 +kerning first=120 second=232 amount=-1 +kerning first=202 second=108 amount=-1 +kerning first=115 second=116 amount=-1 +kerning first=352 second=296 amount=-1 +kerning first=310 second=108 amount=-1 +kerning first=274 second=108 amount=-1 +kerning first=80 second=206 amount=-1 +kerning first=382 second=108 amount=-1 +kerning first=346 second=108 amount=-1 +kerning first=198 second=370 amount=-1 +kerning first=84 second=232 amount=-1 +kerning first=67 second=251 amount=-1 +kerning first=104 second=98 amount=-1 +kerning first=356 second=75 amount=-1 +kerning first=266 second=328 amount=-1 +kerning first=352 second=315 amount=-1 +kerning first=244 second=303 amount=-1 +kerning first=330 second=290 amount=-1 +kerning first=221 second=206 amount=-1 +kerning first=230 second=328 amount=-1 +kerning first=354 second=245 amount=-2 +kerning first=284 second=75 amount=-1 +kerning first=1086 second=1113 amount=-1 +kerning first=187 second=73 amount=-3 +kerning first=76 second=200 amount=-1 +kerning first=1050 second=1113 amount=-1 +kerning first=208 second=315 amount=-1 +kerning first=75 second=83 amount=-1 +kerning first=374 second=328 amount=-1 +kerning first=264 second=196 amount=-2 +kerning first=1100 second=1107 amount=-1 +kerning first=338 second=328 amount=-1 +kerning first=280 second=315 amount=-1 +kerning first=316 second=303 amount=-1 +kerning first=258 second=290 amount=-1 +kerning first=286 second=221 amount=-1 +kerning first=1056 second=1038 amount=-1 +kerning first=336 second=196 amount=-2 +kerning first=352 second=303 amount=-1 +kerning first=317 second=211 amount=-1 +kerning first=275 second=225 amount=-1 +kerning first=216 second=83 amount=-1 +kerning first=317 second=380 amount=-1 +kerning first=311 second=225 amount=-1 +kerning first=71 second=323 amount=-1 +kerning first=87 second=196 amount=-3 +kerning first=353 second=380 amount=-1 +kerning first=347 second=225 amount=-1 +kerning first=313 second=338 amount=-1 +kerning first=203 second=80 amount=-1 +kerning first=1057 second=1117 amount=-1 +kerning first=281 second=98 amount=-1 +kerning first=1118 second=1093 amount=-1 +kerning first=284 second=323 amount=-1 +kerning first=313 second=85 amount=-1 +kerning first=67 second=303 amount=-1 +kerning first=209 second=380 amount=-1 +kerning first=353 second=98 amount=-1 +kerning first=203 second=225 amount=-1 +kerning first=356 second=323 amount=-1 +kerning first=245 second=380 amount=-1 +kerning first=317 second=98 amount=-1 +kerning first=8250 second=375 amount=-2 +kerning first=323 second=286 amount=-1 +kerning first=281 second=380 amount=-1 +kerning first=376 second=235 amount=-1 +kerning first=102 second=233 amount=-1 +kerning first=252 second=102 amount=-1 +kerning first=354 second=210 amount=-1 +kerning first=288 second=102 amount=-1 +kerning first=89 second=77 amount=-1 +kerning first=207 second=233 amount=-1 +kerning first=282 second=210 amount=-1 +kerning first=345 second=46 amount=-2 +kerning first=338 second=77 amount=-1 +kerning first=1038 second=1040 amount=-3 +kerning first=82 second=71 amount=-1 +kerning first=221 second=211 amount=-1 +kerning first=74 second=286 amount=-1 +kerning first=323 second=103 amount=-1 +kerning first=82 second=352 amount=-1 +kerning first=266 second=77 amount=-1 +kerning first=268 second=345 amount=-1 +kerning first=193 second=45 amount=-2 +kerning first=201 second=46 amount=-1 +kerning first=69 second=210 amount=-1 +kerning first=335 second=112 amount=-1 +kerning first=214 second=221 amount=-1 +kerning first=207 second=252 amount=-1 +kerning first=263 second=112 amount=-1 +kerning first=196 second=235 amount=-1 +kerning first=115 second=110 amount=-1 +kerning first=89 second=328 amount=-1 +kerning first=268 second=235 amount=-1 +kerning first=122 second=112 amount=-1 +kerning first=216 second=350 amount=-1 +kerning first=220 second=110 amount=-1 +kerning first=304 second=235 amount=-1 +kerning first=86 second=112 amount=-1 +kerning first=80 second=194 amount=-2 +kerning first=66 second=252 amount=-1 +kerning first=8217 second=332 amount=-1 +kerning first=113 second=250 amount=-1 +kerning first=209 second=378 amount=-1 +kerning first=187 second=353 amount=-1 +kerning first=364 second=110 amount=-1 +kerning first=204 second=275 amount=-1 +kerning first=223 second=353 amount=-1 +kerning first=321 second=171 amount=-1 +kerning first=8250 second=120 amount=-2 +kerning first=122 second=113 amount=-1 +kerning first=218 second=250 amount=-1 +kerning first=281 second=378 amount=-1 +kerning first=259 second=353 amount=-1 +kerning first=86 second=366 amount=-1 +kerning first=344 second=262 amount=-1 +kerning first=86 second=113 amount=-2 +kerning first=288 second=350 amount=-1 +kerning first=245 second=378 amount=-1 +kerning first=327 second=352 amount=-1 +kerning first=371 second=113 amount=-1 +kerning first=70 second=260 amount=-2 +kerning first=371 second=100 amount=-1 +kerning first=201 second=73 amount=-1 +kerning first=8250 second=108 amount=-1 +kerning first=108 second=171 amount=-1 +kerning first=353 second=365 amount=-1 +kerning first=203 second=315 amount=-1 +kerning first=317 second=365 amount=-1 +kerning first=82 second=353 amount=-1 +kerning first=213 second=171 amount=-1 +kerning first=281 second=365 amount=-1 +kerning first=263 second=113 amount=-1 +kerning first=352 second=237 amount=-1 +kerning first=68 second=378 amount=-1 +kerning first=118 second=353 amount=-1 +kerning first=249 second=171 amount=-1 +kerning first=204 second=288 amount=-1 +kerning first=211 second=260 amount=-2 +kerning first=263 second=100 amount=-1 +kerning first=313 second=87 amount=-1 +kerning first=200 second=249 amount=-1 +kerning first=1107 second=1076 amount=-1 +kerning first=356 second=114 amount=-1 +kerning first=298 second=350 amount=-1 +kerning first=236 second=249 amount=-1 +kerning first=1060 second=1065 amount=-1 +kerning first=353 second=378 amount=-1 +kerning first=303 second=271 amount=-1 +kerning first=86 second=100 amount=-2 +kerning first=313 second=354 amount=-1 +kerning first=317 second=378 amount=-1 +kerning first=122 second=100 amount=-1 +kerning first=344 second=249 amount=-1 +kerning first=200 second=262 amount=-1 +kerning first=1100 second=1091 amount=-1 +kerning first=45 second=289 amount=-1 +kerning first=1046 second=1105 amount=-1 +kerning first=202 second=377 amount=-1 +kerning first=268 second=223 amount=-1 +kerning first=81 second=289 amount=-1 +kerning first=362 second=248 amount=-1 +kerning first=1082 second=1105 amount=-1 +kerning first=1053 second=1077 amount=-1 +kerning first=353 second=114 amount=-1 +kerning first=376 second=223 amount=-1 +kerning first=217 second=198 amount=-2 +kerning first=117 second=289 amount=-1 +kerning first=205 second=339 amount=-1 +kerning first=68 second=380 amount=-1 +kerning first=1024 second=1065 amount=-1 +kerning first=8250 second=121 amount=-2 +kerning first=222 second=289 amount=-1 +kerning first=346 second=377 amount=-1 +kerning first=258 second=289 amount=-1 +kerning first=344 second=8220 amount=-3 +kerning first=218 second=248 amount=-1 +kerning first=81 second=274 amount=-1 +kerning first=362 second=263 amount=-1 +kerning first=201 second=327 amount=-1 +kerning first=77 second=248 amount=-1 +kerning first=45 second=274 amount=-3 +kerning first=274 second=377 amount=-1 +kerning first=76 second=198 amount=-1 +kerning first=330 second=289 amount=-1 +kerning first=272 second=8220 amount=-1 +kerning first=113 second=248 amount=-1 +kerning first=113 second=263 amount=-1 +kerning first=1075 second=1103 amount=-1 +kerning first=236 second=8220 amount=-1 +kerning first=74 second=287 amount=-1 +kerning first=209 second=365 amount=-1 +kerning first=353 second=110 amount=-1 +kerning first=86 second=379 amount=-1 +kerning first=218 second=263 amount=-1 +kerning first=1042 second=1079 amount=-1 +kerning first=222 second=274 amount=-1 +kerning first=104 second=365 amount=-1 +kerning first=1078 second=1079 amount=-1 +kerning first=381 second=327 amount=-1 +kerning first=67 second=315 amount=-1 +kerning first=110 second=287 amount=-1 +kerning first=212 second=75 amount=-1 +kerning first=209 second=99 amount=-1 +kerning first=331 second=353 amount=-1 +kerning first=251 second=287 amount=-1 +kerning first=367 second=353 amount=-1 +kerning first=8250 second=204 amount=-3 +kerning first=323 second=287 amount=-1 +kerning first=77 second=263 amount=-1 +kerning first=71 second=75 amount=-1 +kerning first=250 second=237 amount=-1 +kerning first=287 second=287 amount=-1 +kerning first=338 second=334 amount=-1 +kerning first=315 second=237 amount=-1 +kerning first=302 second=334 amount=-1 +kerning first=279 second=237 amount=-1 +kerning first=122 second=104 amount=-1 +kerning first=235 second=187 amount=-1 +kerning first=262 second=44 amount=-1 +kerning first=258 second=284 amount=-1 +kerning first=243 second=237 amount=-1 +kerning first=262 second=223 amount=-1 +kerning first=69 second=197 amount=-1 +kerning first=374 second=334 amount=-1 +kerning first=84 second=244 amount=-2 +kerning first=198 second=193 amount=-1 +kerning first=334 second=44 amount=-1 +kerning first=120 second=244 amount=-1 +kerning first=121 second=44 amount=-3 +kerning first=381 second=324 amount=-1 +kerning first=85 second=44 amount=-3 +kerning first=210 second=197 amount=-2 +kerning first=73 second=234 amount=-1 +kerning first=66 second=237 amount=-1 +kerning first=263 second=104 amount=-1 +kerning first=226 second=44 amount=-1 +kerning first=198 second=354 amount=-1 +kerning first=282 second=197 amount=-1 +kerning first=217 second=194 amount=-2 +kerning first=258 second=277 amount=-1 +kerning first=354 second=197 amount=-3 +kerning first=366 second=277 amount=-1 +kerning first=209 second=111 amount=-1 +kerning first=1045 second=1034 amount=-1 +kerning first=330 second=277 amount=-1 +kerning first=100 second=351 amount=-1 +kerning first=73 second=227 amount=-1 +kerning first=194 second=334 amount=-1 +kerning first=366 second=284 amount=-1 +kerning first=187 second=74 amount=-2 +kerning first=1093 second=1104 amount=-1 +kerning first=89 second=331 amount=-1 +kerning first=1049 second=1054 amount=-1 +kerning first=76 second=194 amount=-1 +kerning first=1057 second=1104 amount=-1 +kerning first=266 second=334 amount=-2 +kerning first=286 second=227 amount=-1 +kerning first=250 second=227 amount=-1 +kerning first=330 second=284 amount=-1 +kerning first=198 second=364 amount=-1 +kerning first=255 second=314 amount=-1 +kerning first=193 second=264 amount=-1 +kerning first=323 second=8249 amount=-2 +kerning first=89 second=327 amount=-1 +kerning first=382 second=111 amount=-1 +kerning first=354 second=248 amount=-2 +kerning first=371 second=367 amount=-1 +kerning first=88 second=264 amount=-1 +kerning first=263 second=367 amount=-1 +kerning first=288 second=361 amount=-1 +kerning first=251 second=8249 amount=-1 +kerning first=97 second=121 amount=-1 +kerning first=291 second=314 amount=-1 +kerning first=362 second=257 amount=-2 +kerning first=252 second=361 amount=-1 +kerning first=287 second=8249 amount=-1 +kerning first=352 second=102 amount=-1 +kerning first=241 second=351 amount=-1 +kerning first=304 second=378 amount=-1 +kerning first=266 second=327 amount=-1 +kerning first=205 second=351 amount=-1 +kerning first=363 second=314 amount=-1 +kerning first=290 second=257 amount=-1 +kerning first=227 second=367 amount=-1 +kerning first=324 second=361 amount=-1 +kerning first=202 second=315 amount=-1 +kerning first=346 second=114 amount=-1 +kerning first=313 second=351 amount=-1 +kerning first=86 second=367 amount=-1 +kerning first=326 second=254 amount=-1 +kerning first=74 second=8249 amount=-2 +kerning first=338 second=327 amount=-1 +kerning first=277 second=351 amount=-1 +kerning first=73 second=224 amount=-1 +kerning first=122 second=367 amount=-1 +kerning first=110 second=8249 amount=-1 +kerning first=374 second=327 amount=-1 +kerning first=1056 second=1051 amount=-1 +kerning first=317 second=374 amount=-1 +kerning first=214 second=224 amount=-1 +kerning first=274 second=117 amount=-1 +kerning first=344 second=261 amount=-1 +kerning first=382 second=117 amount=-1 +kerning first=380 second=261 amount=-1 +kerning first=346 second=117 amount=-1 +kerning first=371 second=104 amount=-1 +kerning first=72 second=171 amount=-2 +kerning first=1058 second=1114 amount=-1 +kerning first=290 second=250 amount=-1 +kerning first=346 second=121 amount=-1 +kerning first=1049 second=1057 amount=-1 +kerning first=200 second=261 amount=-1 +kerning first=313 second=344 amount=-1 +kerning first=310 second=121 amount=-2 +kerning first=236 second=261 amount=-1 +kerning first=8217 second=339 amount=-2 +kerning first=362 second=250 amount=-1 +kerning first=86 second=101 amount=-2 +kerning first=351 second=237 amount=-1 +kerning first=272 second=261 amount=-1 +kerning first=326 second=250 amount=-1 +kerning first=75 second=361 amount=-1 +kerning first=1045 second=1031 amount=-1 +kerning first=122 second=101 amount=-1 +kerning first=378 second=97 amount=-1 +kerning first=338 second=331 amount=-1 +kerning first=302 second=337 amount=-1 +kerning first=8217 second=79 amount=-1 +kerning first=230 second=331 amount=-1 +kerning first=266 second=337 amount=-1 +kerning first=1057 second=1107 amount=-1 +kerning first=263 second=101 amount=-1 +kerning first=1056 second=1041 amount=-1 +kerning first=266 second=331 amount=-1 +kerning first=210 second=200 amount=-1 +kerning first=97 second=117 amount=-1 +kerning first=323 second=290 amount=-1 +kerning first=371 second=101 amount=-1 +kerning first=202 second=117 amount=-1 +kerning first=69 second=200 amount=-1 +kerning first=374 second=337 amount=-2 +kerning first=374 second=330 amount=-1 +kerning first=1042 second=1067 amount=-1 +kerning first=252 second=98 amount=-1 +kerning first=69 second=207 amount=-1 +kerning first=113 second=251 amount=-1 +kerning first=324 second=98 amount=-1 +kerning first=290 second=323 amount=-1 +kerning first=77 second=251 amount=-1 +kerning first=207 second=240 amount=-1 +kerning first=218 second=251 amount=-1 +kerning first=221 second=214 amount=-1 +kerning first=75 second=98 amount=-1 +kerning first=89 second=8249 amount=-3 +kerning first=8216 second=279 amount=-1 +kerning first=102 second=240 amount=-1 +kerning first=382 second=380 amount=-1 +kerning first=79 second=194 amount=-2 +kerning first=290 second=251 amount=-1 +kerning first=282 second=201 amount=-1 +kerning first=103 second=311 amount=-1 +kerning first=362 second=251 amount=-1 +kerning first=354 second=207 amount=-1 +kerning first=1045 second=1030 amount=-1 +kerning first=89 second=71 amount=-1 +kerning first=67 second=311 amount=-1 +kerning first=326 second=251 amount=-1 +kerning first=216 second=90 amount=-1 +kerning first=224 second=289 amount=-1 +kerning first=194 second=71 amount=-1 +kerning first=377 second=298 amount=-1 +kerning first=288 second=90 amount=-1 +kerning first=334 second=304 amount=-1 +kerning first=210 second=207 amount=-1 +kerning first=69 second=201 amount=-1 +kerning first=266 second=330 amount=-1 +kerning first=203 second=220 amount=-1 +kerning first=377 second=291 amount=-2 +kerning first=282 second=207 amount=-1 +kerning first=68 second=368 amount=-1 +kerning first=354 second=200 amount=-1 +kerning first=8216 second=273 amount=-1 +kerning first=305 second=291 amount=-1 +kerning first=80 second=221 amount=-1 +kerning first=317 second=368 amount=-1 +kerning first=269 second=291 amount=-1 +kerning first=201 second=324 amount=-1 +kerning first=282 second=200 amount=-1 +kerning first=352 second=311 amount=-1 +kerning first=356 second=116 amount=-1 +kerning first=233 second=291 amount=-1 +kerning first=102 second=382 amount=-1 +kerning first=202 second=381 amount=-1 +kerning first=272 second=364 amount=-1 +kerning first=197 second=291 amount=-1 +kerning first=203 second=213 amount=-1 +kerning first=45 second=278 amount=-3 +kerning first=234 second=97 amount=-1 +kerning first=1043 second=1060 amount=-1 +kerning first=280 second=311 amount=-1 +kerning first=194 second=337 amount=-1 +kerning first=274 second=381 amount=-1 +kerning first=266 second=71 amount=-2 +kerning first=202 second=212 amount=-1 +kerning first=244 second=311 amount=-1 +kerning first=379 second=187 amount=-1 +kerning first=374 second=71 amount=-1 +kerning first=313 second=84 amount=-1 +kerning first=89 second=337 amount=-2 +kerning first=346 second=381 amount=-1 +kerning first=338 second=71 amount=-1 +kerning first=198 second=97 amount=-1 +kerning first=69 second=203 amount=-1 +kerning first=222 second=278 amount=-1 +kerning first=245 second=375 amount=-1 +kerning first=218 second=253 amount=-1 +kerning first=209 second=375 amount=-1 +kerning first=8250 second=117 amount=-1 +kerning first=199 second=193 amount=-2 +kerning first=254 second=253 amount=-1 +kerning first=221 second=218 amount=-1 +kerning first=97 second=120 amount=-1 +kerning first=104 second=375 amount=-1 +kerning first=207 second=243 amount=-1 +kerning first=89 second=70 amount=-1 +kerning first=326 second=253 amount=-1 +kerning first=371 second=103 amount=-1 +kerning first=8216 second=275 amount=-1 +kerning first=193 second=268 amount=-1 +kerning first=353 second=375 amount=-1 +kerning first=335 second=103 amount=-1 +kerning first=313 second=78 amount=-1 +kerning first=317 second=375 amount=-1 +kerning first=67 second=45 amount=-2 +kerning first=267 second=103 amount=-1 +kerning first=1049 second=1060 amount=-1 +kerning first=379 second=193 amount=-1 +kerning first=201 second=311 amount=-1 +kerning first=281 second=375 amount=-1 +kerning first=1100 second=1095 amount=-1 +kerning first=266 second=70 amount=-1 +kerning first=346 second=120 amount=-1 +kerning first=1064 second=1095 amount=-1 +kerning first=382 second=120 amount=-1 +kerning first=338 second=68 amount=-1 +kerning first=1056 second=1045 amount=-1 +kerning first=354 second=203 amount=-1 +kerning first=374 second=68 amount=-1 +kerning first=88 second=268 amount=-1 +kerning first=346 second=118 amount=-1 +kerning first=334 second=310 amount=-1 +kerning first=282 second=203 amount=-1 +kerning first=310 second=118 amount=-1 +kerning first=202 second=120 amount=-1 +kerning first=354 second=201 amount=-1 +kerning first=262 second=310 amount=-1 +kerning first=338 second=70 amount=-1 +kerning first=77 second=253 amount=-1 +kerning first=210 second=203 amount=-1 +kerning first=382 second=118 amount=-1 +kerning first=274 second=120 amount=-1 +kerning first=374 second=70 amount=-1 +kerning first=113 second=253 amount=-1 +kerning first=72 second=375 amount=-1 +kerning first=202 second=118 amount=-1 +kerning first=353 second=105 amount=-1 +kerning first=120 second=245 amount=-1 +kerning first=353 second=108 amount=-1 +kerning first=45 second=280 amount=-3 +kerning first=211 second=270 amount=-1 +kerning first=84 second=245 amount=-2 +kerning first=8250 second=377 amount=-2 +kerning first=274 second=118 amount=-1 +kerning first=81 second=280 amount=-1 +kerning first=103 second=305 amount=-1 +kerning first=281 second=105 amount=-1 +kerning first=67 second=305 amount=-1 +kerning first=317 second=105 amount=-1 +kerning first=202 second=73 amount=-1 +kerning first=266 second=65 amount=-2 +kerning first=222 second=280 amount=-1 +kerning first=1039 second=1108 amount=-1 +kerning first=245 second=105 amount=-1 +kerning first=97 second=118 amount=-1 +kerning first=338 second=65 amount=-1 +kerning first=65 second=108 amount=-1 +kerning first=1056 second=1048 amount=-1 +kerning first=200 second=204 amount=-1 +kerning first=201 second=318 amount=-1 +kerning first=366 second=283 amount=-1 +kerning first=352 second=305 amount=-1 +kerning first=330 second=283 amount=-1 +kerning first=316 second=305 amount=-1 +kerning first=376 second=228 amount=-2 +kerning first=264 second=334 amount=-2 +kerning first=104 second=108 amount=-1 +kerning first=356 second=335 amount=-2 +kerning first=258 second=283 amount=-1 +kerning first=1042 second=1070 amount=-1 +kerning first=245 second=108 amount=-1 +kerning first=84 second=241 amount=-1 +kerning first=304 second=228 amount=-1 +kerning first=107 second=335 amount=-1 +kerning first=268 second=228 amount=-1 +kerning first=317 second=108 amount=-1 +kerning first=374 second=331 amount=-1 +kerning first=232 second=228 amount=-1 +kerning first=281 second=108 amount=-1 +kerning first=200 second=256 amount=-1 +kerning first=258 second=281 amount=-1 +kerning first=284 second=66 amount=-1 +kerning first=122 second=107 amount=-1 +kerning first=236 second=8249 amount=-1 +kerning first=100 second=347 amount=-1 +kerning first=263 second=107 amount=-1 +kerning first=73 second=231 amount=-1 +kerning first=330 second=281 amount=-1 +kerning first=212 second=66 amount=-1 +kerning first=366 second=281 amount=-1 +kerning first=336 second=205 amount=-1 +kerning first=380 second=255 amount=-1 +kerning first=272 second=256 amount=-2 +kerning first=344 second=255 amount=-1 +kerning first=356 second=66 amount=-1 +kerning first=233 second=8250 amount=-1 +kerning first=1100 second=1098 amount=-1 +kerning first=281 second=371 amount=-1 +kerning first=77 second=257 amount=-1 +kerning first=203 second=216 amount=-1 +kerning first=194 second=45 amount=-2 +kerning first=205 second=81 amount=-1 +kerning first=113 second=257 amount=-1 +kerning first=236 second=255 amount=-1 +kerning first=194 second=67 amount=-1 +kerning first=313 second=81 amount=-1 +kerning first=353 second=371 amount=-1 +kerning first=264 second=205 amount=-1 +kerning first=89 second=67 amount=-1 +kerning first=335 second=107 amount=-1 +kerning first=377 second=8250 amount=-1 +kerning first=356 second=332 amount=-1 +kerning first=104 second=371 amount=-1 +kerning first=313 second=347 amount=-1 +kerning first=8250 second=115 amount=-1 +kerning first=277 second=347 amount=-1 +kerning first=84 second=242 amount=-1 +kerning first=241 second=347 amount=-1 +kerning first=290 second=221 amount=-1 +kerning first=371 second=107 amount=-1 +kerning first=272 second=259 amount=-1 +kerning first=87 second=205 amount=-1 +kerning first=205 second=347 amount=-1 +kerning first=89 second=68 amount=-1 +kerning first=89 second=333 amount=-2 +kerning first=282 second=204 amount=-1 +kerning first=304 second=229 amount=-1 +kerning first=120 second=242 amount=-1 +kerning first=194 second=333 amount=-1 +kerning first=221 second=217 amount=-1 +kerning first=232 second=229 amount=-1 +kerning first=313 second=201 amount=-1 +kerning first=122 second=246 amount=-1 +kerning first=268 second=229 amount=-1 +kerning first=187 second=80 amount=-3 +kerning first=374 second=67 amount=-1 +kerning first=122 second=106 amount=-1 +kerning first=338 second=67 amount=-1 +kerning first=8250 second=380 amount=-3 +kerning first=376 second=229 amount=-2 +kerning first=266 second=67 amount=-2 +kerning first=250 second=230 amount=-1 +kerning first=121 second=307 amount=-1 +kerning first=286 second=230 amount=-1 +kerning first=115 second=119 amount=-1 +kerning first=374 second=333 amount=-2 +kerning first=321 second=334 amount=-1 +kerning first=187 second=346 amount=-2 +kerning first=335 second=106 amount=-1 +kerning first=102 second=243 amount=-1 +kerning first=227 second=106 amount=-1 +kerning first=214 second=230 amount=-1 +kerning first=220 second=119 amount=-1 +kerning first=82 second=346 amount=-1 +kerning first=263 second=106 amount=-1 +kerning first=73 second=230 amount=-1 +kerning first=256 second=119 amount=-2 +kerning first=266 second=333 amount=-1 +kerning first=69 second=204 amount=-1 +kerning first=202 second=314 amount=-1 +kerning first=328 second=119 amount=-1 +kerning first=266 second=100 amount=-1 +kerning first=210 second=204 amount=-1 +kerning first=291 second=328 amount=-1 +kerning first=371 second=106 amount=1 +kerning first=8250 second=114 amount=-1 +kerning first=364 second=119 amount=-1 +kerning first=302 second=333 amount=-1 +kerning first=288 second=317 amount=-1 +kerning first=323 second=275 amount=-1 +kerning first=121 second=230 amount=-2 +kerning first=222 second=74 amount=-1 +kerning first=1045 second=1053 amount=-1 +kerning first=221 second=100 amount=-2 +kerning first=107 second=353 amount=-1 +kerning first=8216 second=324 amount=-1 +kerning first=287 second=275 amount=-1 +kerning first=85 second=230 amount=-2 +kerning first=86 second=121 amount=-1 +kerning first=366 second=74 amount=-1 +kerning first=74 second=275 amount=-1 +kerning first=90 second=81 amount=-1 +kerning first=80 second=100 amount=-1 +kerning first=66 second=256 amount=-3 +kerning first=315 second=256 amount=-1 +kerning first=259 second=45 amount=-1 +kerning first=200 second=211 amount=-1 +kerning first=370 second=230 amount=-2 +kerning first=253 second=223 amount=-1 +kerning first=356 second=339 amount=-2 +kerning first=282 second=328 amount=-1 +kerning first=217 second=223 amount=-1 +kerning first=75 second=249 amount=-1 +kerning first=298 second=230 amount=-1 +kerning first=206 second=268 amount=-1 +kerning first=334 second=230 amount=-1 +kerning first=324 second=249 amount=-1 +kerning first=344 second=211 amount=-1 +kerning first=8216 second=269 amount=-1 +kerning first=76 second=223 amount=-1 +kerning first=278 second=268 amount=-1 +kerning first=262 second=230 amount=-1 +kerning first=86 second=204 amount=-1 +kerning first=252 second=249 amount=-1 +kerning first=86 second=218 amount=-1 +kerning first=70 second=365 amount=-1 +kerning first=107 second=339 amount=-1 +kerning first=366 second=334 amount=-1 +kerning first=251 second=289 amount=-1 +kerning first=210 second=192 amount=-2 +kerning first=85 second=244 amount=-1 +kerning first=1045 second=1039 amount=-1 +kerning first=287 second=289 amount=-1 +kerning first=1079 second=1091 amount=-1 +kerning first=121 second=244 amount=-1 +kerning first=65 second=268 amount=-1 +kerning first=323 second=289 amount=-1 +kerning first=289 second=237 amount=-1 +kerning first=90 second=313 amount=-1 +kerning first=1071 second=1086 amount=-1 +kerning first=253 second=237 amount=-1 +kerning first=69 second=192 amount=-1 +kerning first=8220 second=366 amount=-1 +kerning first=217 second=237 amount=-1 +kerning first=350 second=282 amount=-1 +kerning first=262 second=244 amount=-1 +kerning first=8218 second=226 amount=-1 +kerning first=298 second=244 amount=-1 +kerning first=112 second=237 amount=-1 +kerning first=71 second=65 amount=-1 +kerning first=278 second=282 amount=-1 +kerning first=76 second=237 amount=-1 +kerning first=75 second=107 amount=-1 +kerning first=84 second=8249 amount=-3 +kerning first=75 second=263 amount=-1 +kerning first=8217 second=252 amount=-1 +kerning first=99 second=244 amount=-1 +kerning first=200 second=225 amount=-1 +kerning first=283 second=365 amount=-1 +kerning first=315 second=270 amount=-1 +kerning first=1053 second=1072 amount=-1 +kerning first=1116 second=1079 amount=-1 +kerning first=248 second=353 amount=-1 +kerning first=278 second=296 amount=-1 +kerning first=221 second=346 amount=-2 +kerning first=66 second=270 amount=-2 +kerning first=268 second=315 amount=-1 +kerning first=74 second=289 amount=-1 +kerning first=217 second=251 amount=-1 +kerning first=330 second=334 amount=-1 +kerning first=110 second=289 amount=-1 +kerning first=90 second=327 amount=-1 +kerning first=350 second=296 amount=-1 +kerning first=106 second=365 amount=-1 +kerning first=87 second=206 amount=-1 +kerning first=289 second=251 amount=-1 +kerning first=334 second=202 amount=-1 +kerning first=248 second=121 amount=-1 +kerning first=106 second=351 amount=-1 +kerning first=86 second=232 amount=-1 +kerning first=262 second=202 amount=-1 +kerning first=278 second=254 amount=-1 +kerning first=376 second=69 amount=-1 +kerning first=325 second=251 amount=-1 +kerning first=80 second=374 amount=-1 +kerning first=314 second=254 amount=-1 +kerning first=264 second=206 amount=-1 +kerning first=65 second=254 amount=-1 +kerning first=76 second=209 amount=-1 +kerning first=336 second=206 amount=-1 +kerning first=1060 second=1103 amount=-1 +kerning first=71 second=381 amount=-1 +kerning first=101 second=254 amount=-1 +kerning first=75 second=277 amount=-1 +kerning first=70 second=351 amount=-1 +kerning first=1078 second=1077 amount=-1 +kerning first=1024 second=1103 amount=-1 +kerning first=268 second=69 amount=-1 +kerning first=364 second=214 amount=-1 +kerning first=1043 second=1119 amount=-1 +kerning first=201 second=199 amount=-1 +kerning first=370 second=244 amount=-1 +kerning first=212 second=381 amount=-1 +kerning first=284 second=367 amount=-1 +kerning first=356 second=79 amount=-1 +kerning first=282 second=117 amount=-1 +kerning first=284 second=381 amount=-1 +kerning first=313 second=76 amount=-1 +kerning first=8249 second=356 amount=-2 +kerning first=221 second=72 amount=-1 +kerning first=8222 second=363 amount=-1 +kerning first=71 second=367 amount=-1 +kerning first=221 second=114 amount=-1 +kerning first=354 second=117 amount=-1 +kerning first=268 second=83 amount=-1 +kerning first=283 second=351 amount=-1 +kerning first=381 second=199 amount=-1 +kerning first=205 second=336 amount=-1 +kerning first=356 second=121 amount=-1 +kerning first=304 second=83 amount=-1 +kerning first=8222 second=103 amount=-1 +kerning first=75 second=291 amount=-1 +kerning first=262 second=216 amount=-2 +kerning first=376 second=83 amount=-2 +kerning first=314 second=240 amount=-1 +kerning first=298 second=216 amount=-1 +kerning first=206 second=240 amount=-1 +kerning first=370 second=216 amount=-1 +kerning first=201 second=171 amount=-1 +kerning first=85 second=216 amount=-1 +kerning first=69 second=117 amount=-1 +kerning first=251 second=261 amount=-1 +kerning first=287 second=261 amount=-1 +kerning first=380 second=382 amount=-1 +kerning first=8222 second=89 amount=-3 +kerning first=323 second=261 amount=-1 +kerning first=248 second=107 amount=-1 +kerning first=1045 second=1095 amount=-1 +kerning first=381 second=171 amount=-1 +kerning first=74 second=267 amount=-1 +kerning first=220 second=229 amount=-2 +kerning first=80 second=86 amount=-1 +kerning first=252 second=307 amount=-1 +kerning first=350 second=254 amount=-1 +kerning first=65 second=240 amount=-1 +kerning first=345 second=171 amount=-1 +kerning first=187 second=350 amount=-2 +kerning first=346 second=201 amount=-1 +kerning first=277 second=252 amount=-1 +kerning first=313 second=252 amount=-1 +kerning first=82 second=350 amount=-1 +kerning first=213 second=221 amount=-1 +kerning first=274 second=201 amount=-1 +kerning first=1056 second=1050 amount=-1 +kerning first=8222 second=377 amount=-1 +kerning first=216 second=207 amount=-1 +kerning first=371 second=246 amount=-1 +kerning first=202 second=201 amount=-1 +kerning first=8218 second=254 amount=-1 +kerning first=100 second=252 amount=-1 +kerning first=381 second=227 amount=-1 +kerning first=365 second=44 amount=-1 +kerning first=236 second=378 amount=-1 +kerning first=205 second=252 amount=-1 +kerning first=263 second=246 amount=-1 +kerning first=1059 second=1101 amount=-1 +kerning first=1091 second=1076 amount=-2 +kerning first=241 second=252 amount=-1 +kerning first=267 second=271 amount=-1 +kerning first=86 second=260 amount=-3 +kerning first=200 second=382 amount=-1 +kerning first=101 second=226 amount=-1 +kerning first=75 second=45 amount=-2 +kerning first=201 second=356 amount=-1 +kerning first=236 second=382 amount=-1 +kerning first=290 second=192 amount=-1 +kerning first=377 second=317 amount=-1 +kerning first=272 second=382 amount=-1 +kerning first=288 second=291 amount=-1 +kerning first=206 second=226 amount=-1 +kerning first=375 second=271 amount=-1 +kerning first=210 second=103 amount=-1 +kerning first=252 second=291 amount=-1 +kerning first=288 second=45 amount=-1 +kerning first=216 second=291 amount=-1 +kerning first=70 second=337 amount=-1 +kerning first=278 second=226 amount=-1 +kerning first=252 second=45 amount=-1 +kerning first=288 second=207 amount=-1 +kerning first=105 second=103 amount=-1 +kerning first=314 second=226 amount=-1 +kerning first=69 second=103 amount=-1 +kerning first=79 second=84 amount=-1 +kerning first=350 second=226 amount=-1 +kerning first=324 second=45 amount=-1 +kerning first=382 second=365 amount=-1 +kerning first=216 second=193 amount=-2 +kerning first=313 second=336 amount=-1 +kerning first=245 second=118 amount=-1 +kerning first=1098 second=1103 amount=-1 +kerning first=267 second=109 amount=-1 +kerning first=210 second=89 amount=-1 +kerning first=375 second=109 amount=-1 +kerning first=256 second=84 amount=-3 +kerning first=381 second=213 amount=-1 +kerning first=339 second=109 amount=-1 +kerning first=227 second=115 amount=-1 +kerning first=8222 second=117 amount=-1 +kerning first=101 second=8250 amount=-1 +kerning first=90 second=109 amount=-1 +kerning first=86 second=115 amount=-2 +kerning first=278 second=212 amount=-1 +kerning first=8216 second=194 amount=-4 +kerning first=122 second=115 amount=-1 +kerning first=187 second=90 amount=-2 +kerning first=346 second=187 amount=-1 +kerning first=257 second=44 amount=-1 +kerning first=335 second=115 amount=-1 +kerning first=223 second=104 amount=-1 +kerning first=278 second=78 amount=-1 +kerning first=221 second=44 amount=-3 +kerning first=282 second=364 amount=-1 +kerning first=371 second=115 amount=-1 +kerning first=187 second=104 amount=-1 +kerning first=338 second=199 amount=-1 +kerning first=263 second=115 amount=-1 +kerning first=118 second=104 amount=-1 +kerning first=377 second=303 amount=-1 +kerning first=371 second=232 amount=-1 +kerning first=80 second=44 amount=-2 +kerning first=201 second=213 amount=-1 +kerning first=282 second=89 amount=-1 +kerning first=367 second=104 amount=-1 +kerning first=122 second=232 amount=-1 +kerning first=263 second=232 amount=-1 +kerning first=1027 second=1085 amount=-1 +kerning first=266 second=325 amount=-1 +kerning first=256 second=98 amount=-1 +kerning first=369 second=8249 amount=-1 +kerning first=216 second=73 amount=-1 +kerning first=367 second=118 amount=-1 +kerning first=338 second=325 amount=-1 +kerning first=328 second=98 amount=-1 +kerning first=288 second=73 amount=-1 +kerning first=8222 second=307 amount=-1 +kerning first=374 second=325 amount=-1 +kerning first=69 second=75 amount=-1 +kerning first=269 second=303 amount=-1 +kerning first=259 second=118 amount=-1 +kerning first=365 second=252 amount=-1 +kerning first=354 second=75 amount=-1 +kerning first=75 second=235 amount=-1 +kerning first=223 second=118 amount=-1 +kerning first=307 second=120 amount=-1 +kerning first=219 second=67 amount=-1 +kerning first=89 second=283 amount=-2 +kerning first=366 second=216 amount=-1 +kerning first=363 second=250 amount=-1 +kerning first=313 second=280 amount=-1 +kerning first=120 second=8249 amount=-2 +kerning first=282 second=75 amount=-1 +kerning first=233 second=303 amount=-1 +kerning first=115 second=98 amount=-1 +kerning first=295 second=118 amount=-1 +kerning first=201 second=328 amount=-1 +kerning first=368 second=347 amount=-1 +kerning first=82 second=118 amount=-1 +kerning first=284 second=196 amount=-1 +kerning first=266 second=283 amount=-1 +kerning first=187 second=118 amount=-2 +kerning first=381 second=328 amount=-1 +kerning first=1059 second=1073 amount=-2 +kerning first=1091 second=1104 amount=-1 +kerning first=1070 second=1070 amount=-1 +kerning first=356 second=196 amount=-3 +kerning first=202 second=45 amount=-1 +kerning first=118 second=118 amount=-1 +kerning first=194 second=283 amount=-1 +kerning first=1055 second=1104 amount=-1 +kerning first=201 second=370 amount=-1 +kerning first=89 second=325 amount=-1 +kerning first=369 second=311 amount=-1 +kerning first=71 second=196 amount=-1 +kerning first=381 second=241 amount=-1 +kerning first=374 second=283 amount=-2 +kerning first=103 second=314 amount=-1 +kerning first=205 second=266 amount=-1 +kerning first=115 second=112 amount=-1 +kerning first=75 second=87 amount=-1 +kerning first=370 second=286 amount=-1 +kerning first=338 second=311 amount=-1 +kerning first=222 second=362 amount=-1 +kerning first=1070 second=1042 amount=-1 +kerning first=258 second=362 amount=-2 +kerning first=298 second=286 amount=-1 +kerning first=1092 second=1095 amount=-1 +kerning first=356 second=210 amount=-1 +kerning first=1036 second=1059 amount=-1 +kerning first=280 second=314 amount=-1 +kerning first=120 second=8221 amount=-1 +kerning first=381 second=356 amount=-1 +kerning first=377 second=331 amount=-1 +kerning first=65 second=365 amount=-1 +kerning first=194 second=311 amount=-1 +kerning first=45 second=362 amount=-2 +kerning first=86 second=85 amount=-1 +kerning first=85 second=286 amount=-1 +kerning first=352 second=314 amount=-1 +kerning first=81 second=362 amount=-1 +kerning first=316 second=314 amount=-1 +kerning first=67 second=314 amount=-1 +kerning first=381 second=255 amount=-2 +kerning first=65 second=112 amount=-1 +kerning first=195 second=81 amount=-1 +kerning first=71 second=224 amount=-1 +kerning first=333 second=8221 amount=-1 +kerning first=269 second=331 amount=-1 +kerning first=328 second=369 amount=-1 +kerning first=225 second=8221 amount=-1 +kerning first=364 second=112 amount=-1 +kerning first=261 second=8221 amount=-1 +kerning first=328 second=112 amount=-1 +kerning first=195 second=67 amount=-1 +kerning first=288 second=221 amount=-1 +kerning first=1070 second=1056 amount=-1 +kerning first=1059 second=1087 amount=-2 +kerning first=381 second=269 amount=-1 +kerning first=266 second=363 amount=-1 +kerning first=90 second=67 amount=-1 +kerning first=216 second=221 amount=-1 +kerning first=212 second=224 amount=-1 +kerning first=369 second=8221 amount=-2 +kerning first=220 second=112 amount=-1 +kerning first=75 second=221 amount=-1 +kerning first=313 second=266 amount=-1 +kerning first=284 second=224 amount=-1 +kerning first=81 second=205 amount=-1 +kerning first=86 second=302 amount=-1 +kerning first=194 second=255 amount=-1 +kerning first=283 second=250 amount=-1 +kerning first=252 second=347 amount=-1 +kerning first=356 second=224 amount=-2 +kerning first=89 second=255 amount=-1 +kerning first=111 second=378 amount=-1 +kerning first=380 second=326 amount=-1 +kerning first=111 second=347 amount=-1 +kerning first=1042 second=1033 amount=-1 +kerning first=8217 second=353 amount=-1 +kerning first=106 second=250 amount=-1 +kerning first=105 second=307 amount=-1 +kerning first=75 second=347 amount=-1 +kerning first=187 second=204 amount=-3 +kerning first=70 second=250 amount=-1 +kerning first=67 second=328 amount=-1 +kerning first=369 second=371 amount=-1 +kerning first=200 second=326 amount=-1 +kerning first=379 second=352 amount=-1 +kerning first=246 second=307 amount=-1 +kerning first=236 second=326 amount=-1 +kerning first=316 second=328 amount=-1 +kerning first=120 second=371 amount=-1 +kerning first=1057 second=1097 amount=-1 +kerning first=344 second=117 amount=-1 +kerning first=280 second=328 amount=-1 +kerning first=274 second=257 amount=-1 +kerning first=209 second=333 amount=-1 +kerning first=72 second=212 amount=-1 +kerning first=209 second=361 amount=-1 +kerning first=378 second=101 amount=-1 +kerning first=326 second=8221 amount=-2 +kerning first=261 second=371 amount=-1 +kerning first=202 second=257 amount=-1 +kerning first=252 second=378 amount=-1 +kerning first=1030 second=1073 amount=-1 +kerning first=284 second=8220 amount=-1 +kerning first=216 second=378 amount=-1 +kerning first=248 second=8220 amount=-1 +kerning first=354 second=202 amount=-1 +kerning first=212 second=8220 amount=-1 +kerning first=288 second=378 amount=-1 +kerning first=352 second=328 amount=-1 +kerning first=194 second=252 amount=-1 +kerning first=364 second=288 amount=-1 +kerning first=107 second=8220 amount=-1 +kerning first=286 second=217 amount=-1 +kerning first=121 second=113 amount=-1 +kerning first=71 second=8220 amount=-1 +kerning first=314 second=106 amount=-1 +kerning first=85 second=113 amount=-1 +kerning first=231 second=243 amount=-1 +kerning first=350 second=106 amount=-1 +kerning first=267 second=243 amount=-1 +kerning first=315 second=80 amount=-1 +kerning first=220 second=288 amount=-1 +kerning first=68 second=87 amount=-1 +kerning first=298 second=113 amount=-1 +kerning first=65 second=366 amount=-2 +kerning first=121 second=345 amount=-1 +kerning first=262 second=113 amount=-1 +kerning first=256 second=288 amount=-1 +kerning first=90 second=243 amount=-1 +kerning first=8220 second=289 amount=-2 +kerning first=313 second=210 amount=-1 +kerning first=262 second=345 amount=-1 +kerning first=260 second=45 amount=-2 +kerning first=8217 second=121 amount=-1 +kerning first=221 second=262 amount=-1 +kerning first=350 second=198 amount=-2 +kerning first=205 second=210 amount=-1 +kerning first=66 second=368 amount=-2 +kerning first=235 second=120 amount=-1 +kerning first=370 second=345 amount=-1 +kerning first=303 second=243 amount=-1 +kerning first=260 second=100 amount=-1 +kerning first=302 second=255 amount=-1 +kerning first=315 second=368 amount=-1 +kerning first=1101 second=1113 amount=-1 +kerning first=8222 second=237 amount=-1 +kerning first=375 second=243 amount=-1 +kerning first=214 second=217 amount=-1 +kerning first=230 second=255 amount=-1 +kerning first=8250 second=296 amount=-3 +kerning first=379 second=324 amount=-1 +kerning first=374 second=227 amount=-2 +kerning first=79 second=366 amount=-1 +kerning first=338 second=227 amount=-1 +kerning first=80 second=234 amount=-1 +kerning first=302 second=227 amount=-1 +kerning first=213 second=219 amount=-1 +kerning first=8220 second=261 amount=-1 +kerning first=266 second=227 amount=-1 +kerning first=200 second=354 amount=-1 +kerning first=264 second=44 amount=-1 +kerning first=235 second=324 amount=-1 +kerning first=228 second=44 amount=-1 +kerning first=199 second=324 amount=-1 +kerning first=269 second=99 amount=-1 +kerning first=272 second=354 amount=-1 +kerning first=336 second=44 amount=-1 +kerning first=307 second=324 amount=-1 +kerning first=377 second=99 amount=-1 +kerning first=75 second=104 amount=-1 +kerning first=344 second=354 amount=-1 +kerning first=362 second=267 amount=-1 +kerning first=338 second=197 amount=-1 +kerning first=99 second=335 amount=-1 +kerning first=101 second=106 amount=-1 +kerning first=67 second=356 amount=-1 +kerning first=346 second=229 amount=-1 +kerning first=84 second=111 amount=-2 +kerning first=382 second=229 amount=-1 +kerning first=258 second=233 amount=-1 +kerning first=242 second=106 amount=-1 +kerning first=366 second=233 amount=-1 +kerning first=230 second=227 amount=-1 +kerning first=338 second=109 amount=-1 +kerning first=330 second=233 amount=-1 +kerning first=354 second=279 amount=-2 +kerning first=334 second=317 amount=-1 +kerning first=1052 second=1060 amount=-1 +kerning first=317 second=87 amount=-1 +kerning first=261 second=171 amount=-1 +kerning first=89 second=227 amount=-2 +kerning first=67 second=110 amount=-1 +kerning first=317 second=361 amount=-1 +kerning first=115 second=316 amount=-1 +kerning first=352 second=82 amount=-1 +kerning first=103 second=110 amount=-1 +kerning first=281 second=361 amount=-1 +kerning first=77 second=267 amount=-1 +kerning first=1056 second=1064 amount=-1 +kerning first=353 second=361 amount=-1 +kerning first=256 second=316 amount=-1 +kerning first=204 second=264 amount=-1 +kerning first=354 second=291 amount=-2 +kerning first=208 second=82 amount=-1 +kerning first=382 second=257 amount=-1 +kerning first=280 second=110 amount=-1 +kerning first=328 second=316 amount=-1 +kerning first=316 second=110 amount=-1 +kerning first=235 second=378 amount=-1 +kerning first=113 second=267 amount=-1 +kerning first=280 second=82 amount=-1 +kerning first=310 second=257 amount=-1 +kerning first=219 second=65 amount=-2 +kerning first=352 second=110 amount=-1 +kerning first=82 second=364 amount=-1 +kerning first=231 second=271 amount=-1 +kerning first=346 second=257 amount=-1 +kerning first=317 second=45 amount=-1 +kerning first=87 second=44 amount=-3 +kerning first=67 second=82 amount=-1 +kerning first=1065 second=1057 amount=-1 +kerning first=352 second=72 amount=-1 +kerning first=267 second=365 amount=-1 +kerning first=252 second=104 amount=-1 +kerning first=272 second=66 amount=-1 +kerning first=219 second=105 amount=-1 +kerning first=222 second=205 amount=-1 +kerning first=76 second=89 amount=-1 +kerning first=86 second=274 amount=-1 +kerning first=268 second=97 amount=-1 +kerning first=337 second=46 amount=-2 +kerning first=208 second=304 amount=-1 +kerning first=304 second=97 amount=-1 +kerning first=272 second=122 amount=-1 +kerning first=79 second=77 amount=-1 +kerning first=236 second=122 amount=-1 +kerning first=377 second=71 amount=-1 +kerning first=313 second=121 amount=-1 +kerning first=264 second=72 amount=-1 +kerning first=232 second=97 amount=-1 +kerning first=200 second=122 amount=-1 +kerning first=197 second=71 amount=-1 +kerning first=277 second=121 amount=-1 +kerning first=241 second=121 amount=-1 +kerning first=336 second=72 amount=-1 +kerning first=229 second=46 amount=-1 +kerning first=205 second=121 amount=-1 +kerning first=211 second=77 amount=-1 +kerning first=74 second=102 amount=-1 +kerning first=380 second=122 amount=-1 +kerning first=76 second=377 amount=-1 +kerning first=376 second=97 amount=-2 +kerning first=302 second=199 amount=-1 +kerning first=304 second=245 amount=-1 +kerning first=192 second=375 amount=-1 +kerning first=374 second=199 amount=-1 +kerning first=84 second=200 amount=-1 +kerning first=217 second=377 amount=-1 +kerning first=88 second=46 amount=-1 +kerning first=87 second=332 amount=-1 +kerning first=282 second=199 amount=-1 +kerning first=376 second=214 amount=-1 +kerning first=1050 second=1077 amount=-1 +kerning first=240 second=382 amount=-1 +kerning first=69 second=363 amount=-1 +kerning first=325 second=117 amount=-1 +kerning first=105 second=363 amount=-1 +kerning first=98 second=287 amount=-1 +kerning first=376 second=245 amount=-2 +kerning first=87 second=72 amount=-1 +kerning first=264 second=332 amount=-2 +kerning first=1024 second=1058 amount=-1 +kerning first=70 second=194 amount=-2 +kerning first=1100 second=1114 amount=-1 +kerning first=350 second=310 amount=-1 +kerning first=203 second=287 amount=-1 +kerning first=196 second=214 amount=-1 +kerning first=347 second=259 amount=-1 +kerning first=73 second=242 amount=-1 +kerning first=278 second=310 amount=-1 +kerning first=304 second=214 amount=-1 +kerning first=72 second=240 amount=-1 +kerning first=275 second=287 amount=-1 +kerning first=108 second=240 amount=-1 +kerning first=8217 second=266 amount=-1 +kerning first=347 second=287 amount=-1 +kerning first=192 second=220 amount=-2 +kerning first=315 second=284 amount=-1 +kerning first=311 second=287 amount=-1 +kerning first=207 second=284 amount=-1 +kerning first=311 second=259 amount=-1 +kerning first=87 second=220 amount=-1 +kerning first=66 second=197 amount=-3 +kerning first=275 second=259 amount=-1 +kerning first=378 second=375 amount=-1 +kerning first=260 second=369 amount=-1 +kerning first=336 second=304 amount=-1 +kerning first=224 second=369 amount=-1 +kerning first=86 second=330 amount=-1 +kerning first=258 second=116 amount=-1 +kerning first=264 second=304 amount=-1 +kerning first=296 second=369 amount=-1 +kerning first=1060 second=1030 amount=-1 +kerning first=45 second=116 amount=-1 +kerning first=77 second=119 amount=-1 +kerning first=1024 second=1030 amount=-1 +kerning first=113 second=45 amount=-1 +kerning first=315 second=197 amount=-1 +kerning first=113 second=119 amount=-2 +kerning first=87 second=304 amount=-1 +kerning first=211 second=194 amount=-2 +kerning first=374 second=209 amount=-1 +kerning first=218 second=119 amount=-1 +kerning first=221 second=203 amount=-1 +kerning first=368 second=223 amount=-1 +kerning first=254 second=119 amount=-1 +kerning first=337 second=253 amount=-1 +kerning first=1036 second=1105 amount=-1 +kerning first=290 second=119 amount=-1 +kerning first=326 second=119 amount=-1 +kerning first=120 second=228 amount=-1 +kerning first=313 second=311 amount=-1 +kerning first=362 second=119 amount=-1 +kerning first=234 second=375 amount=-1 +kerning first=264 second=248 amount=-1 +kerning first=84 second=228 amount=-2 +kerning first=80 second=203 amount=-1 +kerning first=321 second=268 amount=-1 +kerning first=192 second=248 amount=-1 +kerning first=291 second=8249 amount=-1 +kerning first=231 second=355 amount=-1 +kerning first=195 second=355 amount=-1 +kerning first=200 second=298 amount=-1 +kerning first=119 second=223 amount=-1 +kerning first=346 second=313 amount=-1 +kerning first=201 second=68 amount=-1 +kerning first=338 second=364 amount=-1 +kerning first=83 second=223 amount=-1 +kerning first=370 second=113 amount=-1 +kerning first=90 second=355 amount=-1 +kerning first=272 second=298 amount=-1 +kerning first=274 second=313 amount=-1 +kerning first=375 second=355 amount=-1 +kerning first=193 second=253 amount=-1 +kerning first=339 second=355 amount=-1 +kerning first=229 second=253 amount=-1 +kerning first=66 second=80 amount=-2 +kerning first=202 second=313 amount=-1 +kerning first=303 second=355 amount=-1 +kerning first=381 second=68 amount=-1 +kerning first=267 second=355 amount=-1 +kerning first=72 second=268 amount=-1 +kerning first=221 second=290 amount=-1 +kerning first=1078 second=1086 amount=-1 +kerning first=279 second=108 amount=-1 +kerning first=334 second=85 amount=-1 +kerning first=243 second=108 amount=-1 +kerning first=65 second=338 amount=-1 +kerning first=194 second=8217 amount=-3 +kerning first=351 second=108 amount=-1 +kerning first=282 second=363 amount=-1 +kerning first=200 second=270 amount=-1 +kerning first=262 second=85 amount=-1 +kerning first=288 second=83 amount=-1 +kerning first=230 second=8217 amount=-1 +kerning first=315 second=108 amount=-1 +kerning first=221 second=286 amount=-1 +kerning first=84 second=315 amount=-1 +kerning first=269 second=8221 amount=-1 +kerning first=354 second=363 amount=-1 +kerning first=257 second=318 amount=-1 +kerning first=283 second=105 amount=-1 +kerning first=200 second=313 amount=-1 +kerning first=354 second=335 amount=-2 +kerning first=365 second=318 amount=-1 +kerning first=317 second=209 amount=-1 +kerning first=307 second=380 amount=-1 +kerning first=106 second=105 amount=-1 +kerning first=379 second=380 amount=-1 +kerning first=311 second=231 amount=-1 +kerning first=102 second=108 amount=1 +kerning first=272 second=270 amount=-1 +kerning first=278 second=338 amount=-1 +kerning first=66 second=108 amount=-1 +kerning first=199 second=380 amount=-1 +kerning first=88 second=225 amount=-1 +kerning first=8217 second=210 amount=-1 +kerning first=206 second=338 amount=-1 +kerning first=1105 second=1113 amount=-1 +kerning first=235 second=380 amount=-1 +kerning first=213 second=296 amount=-1 +kerning first=321 second=296 amount=-1 +kerning first=362 second=228 amount=-1 +kerning first=279 second=225 amount=-1 +kerning first=83 second=251 amount=-1 +kerning first=224 second=251 amount=-1 +kerning first=290 second=228 amount=-1 +kerning first=351 second=225 amount=-1 +kerning first=249 second=98 amount=-1 +kerning first=66 second=225 amount=-1 +kerning first=296 second=251 amount=-1 +kerning first=78 second=113 amount=-1 +kerning first=209 second=235 amount=-1 +kerning first=99 second=303 amount=-1 +kerning first=102 second=225 amount=-1 +kerning first=260 second=251 amount=-1 +kerning first=1046 second=1058 amount=-1 +kerning first=1114 second=1100 amount=-1 +kerning first=321 second=98 amount=-1 +kerning first=368 second=251 amount=-1 +kerning first=113 second=228 amount=-1 +kerning first=207 second=225 amount=-1 +kerning first=66 second=314 amount=-1 +kerning first=77 second=228 amount=-1 +kerning first=1056 second=1025 amount=-1 +kerning first=251 second=46 amount=-1 +kerning first=287 second=46 amount=-2 +kerning first=266 second=370 amount=-1 +kerning first=323 second=46 amount=-1 +kerning first=374 second=370 amount=-1 +kerning first=198 second=218 amount=-1 +kerning first=338 second=370 amount=-1 +kerning first=187 second=325 amount=-3 +kerning first=120 second=273 amount=-1 +kerning first=74 second=46 amount=-1 +kerning first=8250 second=73 amount=-3 +kerning first=110 second=46 amount=-1 +kerning first=109 second=98 amount=-1 +kerning first=8220 second=110 amount=-1 +kerning first=198 second=280 amount=-1 +kerning first=203 second=83 amount=-1 +kerning first=347 second=363 amount=-1 +kerning first=249 second=112 amount=-1 +kerning first=250 second=318 amount=-1 +kerning first=68 second=221 amount=-1 +kerning first=315 second=211 amount=-1 +kerning first=288 second=8249 amount=-1 +kerning first=362 second=214 amount=-1 +kerning first=367 second=311 amount=-1 +kerning first=108 second=112 amount=-1 +kerning first=72 second=112 amount=-1 +kerning first=198 second=266 amount=-1 +kerning first=218 second=214 amount=-1 +kerning first=369 second=259 amount=-1 +kerning first=368 second=67 amount=-1 +kerning first=313 second=260 amount=-1 +kerning first=108 second=98 amount=-1 +kerning first=296 second=67 amount=-1 +kerning first=202 second=81 amount=-1 +kerning first=365 second=254 amount=-1 +kerning first=260 second=67 amount=-1 +kerning first=317 second=221 amount=-1 +kerning first=240 second=105 amount=-1 +kerning first=274 second=81 amount=-1 +kerning first=99 second=105 amount=-1 +kerning first=77 second=214 amount=-1 +kerning first=321 second=112 amount=-1 +kerning first=291 second=230 amount=-1 +kerning first=295 second=249 amount=-1 +kerning first=264 second=346 amount=-1 +kerning first=327 second=230 amount=-1 +kerning first=332 second=327 amount=-1 +kerning first=331 second=249 amount=-1 +kerning first=219 second=230 amount=-2 +kerning first=192 second=346 amount=-2 +kerning first=1113 second=1098 amount=-1 +kerning first=255 second=230 amount=-2 +kerning first=73 second=286 amount=-1 +kerning first=259 second=249 amount=-1 +kerning first=194 second=350 amount=-2 +kerning first=1052 second=1095 amount=-1 +kerning first=119 second=106 amount=-1 +kerning first=73 second=100 amount=-1 +kerning first=198 second=204 amount=-1 +kerning first=316 second=275 amount=-1 +kerning first=89 second=350 amount=-2 +kerning first=8250 second=361 amount=-1 +kerning first=367 second=249 amount=-1 +kerning first=336 second=346 amount=-1 +kerning first=8220 second=328 amount=-1 +kerning first=78 second=230 amount=-1 +kerning first=338 second=350 amount=-1 +kerning first=327 second=339 amount=-1 +kerning first=282 second=362 amount=-1 +kerning first=118 second=305 amount=-1 +kerning first=374 second=350 amount=-2 +kerning first=66 second=211 amount=-1 +kerning first=282 second=223 amount=-1 +kerning first=214 second=256 amount=-2 +kerning first=336 second=86 amount=-1 +kerning first=277 second=107 amount=-1 +kerning first=302 second=350 amount=-1 +kerning first=187 second=305 amount=-1 +kerning first=354 second=223 amount=-1 +kerning first=207 second=211 amount=-1 +kerning first=310 second=311 amount=-1 +kerning first=187 second=249 amount=-1 +kerning first=363 second=230 amount=-1 +kerning first=105 second=250 amount=-1 +kerning first=100 second=107 amount=-1 +kerning first=379 second=268 amount=-1 +kerning first=82 second=249 amount=-1 +kerning first=198 second=260 amount=-1 +kerning first=286 second=256 amount=-1 +kerning first=352 second=289 amount=-1 +kerning first=204 second=365 amount=-1 +kerning first=199 second=268 amount=-2 +kerning first=219 second=244 amount=-1 +kerning first=1113 second=1084 amount=-1 +kerning first=255 second=244 amount=-1 +kerning first=99 second=365 amount=-1 +kerning first=1061 second=1060 amount=-2 +kerning first=69 second=223 amount=-1 +kerning first=332 second=313 amount=-1 +kerning first=291 second=244 amount=-1 +kerning first=89 second=199 amount=-1 +kerning first=376 second=232 amount=-1 +kerning first=216 second=8217 amount=-1 +kerning first=327 second=244 amount=-1 +kerning first=203 second=192 amount=-1 +kerning first=363 second=353 amount=-1 +kerning first=252 second=8217 amount=-2 +kerning first=219 second=339 amount=-1 +kerning first=194 second=199 amount=-1 +kerning first=354 second=237 amount=-1 +kerning first=288 second=8217 amount=-1 +kerning first=78 second=339 amount=-1 +kerning first=82 second=263 amount=-1 +kerning first=1050 second=1091 amount=-1 +kerning first=8218 second=366 amount=-2 +kerning first=8220 second=219 amount=-1 +kerning first=324 second=8217 amount=-2 +kerning first=266 second=199 amount=-2 +kerning first=118 second=263 amount=-1 +kerning first=100 second=121 amount=-1 +kerning first=374 second=302 amount=-1 +kerning first=246 second=237 amount=-1 +kerning first=103 second=275 amount=-1 +kerning first=219 second=353 amount=-1 +kerning first=379 second=282 amount=-1 +kerning first=67 second=289 amount=-1 +kerning first=269 second=369 amount=-1 +kerning first=255 second=353 amount=-1 +kerning first=1050 second=1105 amount=-1 +kerning first=1118 second=1072 amount=-1 +kerning first=103 second=289 amount=-1 +kerning first=214 second=270 amount=-1 +kerning first=323 second=334 amount=-1 +kerning first=291 second=353 amount=-1 +kerning first=105 second=237 amount=-1 +kerning first=67 second=275 amount=-1 +kerning first=327 second=353 amount=-1 +kerning first=376 second=264 amount=-1 +kerning first=208 second=289 amount=-1 +kerning first=87 second=346 amount=-2 +kerning first=325 second=363 amount=-1 +kerning first=244 second=289 amount=-1 +kerning first=1025 second=1060 amount=-1 +kerning first=8250 second=347 amount=-1 +kerning first=344 second=332 amount=-1 +kerning first=199 second=282 amount=-1 +kerning first=280 second=289 amount=-1 +kerning first=78 second=244 amount=-1 +kerning first=8218 second=380 amount=-2 +kerning first=316 second=289 amount=-1 +kerning first=1046 second=1072 amount=-1 +kerning first=303 second=122 amount=-1 +kerning first=352 second=255 amount=-1 +kerning first=220 second=232 amount=-1 +kerning first=321 second=302 amount=-1 +kerning first=83 second=257 amount=-1 +kerning first=8250 second=229 amount=-1 +kerning first=275 second=371 amount=-1 +kerning first=119 second=257 amount=-2 +kerning first=362 second=8249 amount=-3 +kerning first=382 second=347 amount=-1 +kerning first=213 second=302 amount=-1 +kerning first=99 second=99 amount=-1 +kerning first=377 second=202 amount=-1 +kerning first=290 second=8249 amount=-1 +kerning first=346 second=347 amount=-1 +kerning first=326 second=8249 amount=-1 +kerning first=209 second=277 amount=-1 +kerning first=352 second=380 amount=-1 +kerning first=204 second=99 amount=-1 +kerning first=326 second=351 amount=-1 +kerning first=313 second=381 amount=-1 +kerning first=219 second=79 amount=-1 +kerning first=45 second=261 amount=-1 +kerning first=313 second=367 amount=-1 +kerning first=120 second=267 amount=-1 +kerning first=198 second=336 amount=-1 +kerning first=78 second=79 amount=-1 +kerning first=81 second=261 amount=-1 +kerning first=220 second=71 amount=-1 +kerning first=362 second=351 amount=-1 +kerning first=241 second=367 amount=-1 +kerning first=327 second=79 amount=-1 +kerning first=332 second=257 amount=-1 +kerning first=277 second=367 amount=-1 +kerning first=199 second=212 amount=-2 +kerning first=113 second=351 amount=-1 +kerning first=368 second=257 amount=-2 +kerning first=254 second=351 amount=-1 +kerning first=84 second=69 amount=-1 +kerning first=218 second=351 amount=-1 +kerning first=296 second=257 amount=-1 +kerning first=351 second=382 amount=-1 +kerning first=209 second=291 amount=-1 +kerning first=113 second=337 amount=-1 +kerning first=330 second=261 amount=-1 +kerning first=119 second=271 amount=-1 +kerning first=77 second=337 amount=-1 +kerning first=366 second=261 amount=-2 +kerning first=197 second=216 amount=-1 +kerning first=104 second=291 amount=-1 +kerning first=68 second=291 amount=-1 +kerning first=117 second=261 amount=-1 +kerning first=110 second=314 amount=-1 +kerning first=207 second=382 amount=-1 +kerning first=84 second=267 amount=-2 +kerning first=243 second=382 amount=-1 +kerning first=222 second=261 amount=-1 +kerning first=279 second=382 amount=-1 +kerning first=218 second=337 amount=-1 +kerning first=377 second=270 amount=-1 +kerning first=1078 second=1092 amount=-1 +kerning first=315 second=382 amount=-1 +kerning first=199 second=226 amount=-1 +kerning first=287 second=314 amount=-1 +kerning first=274 second=347 amount=-1 +kerning first=120 second=281 amount=-1 +kerning first=103 second=269 amount=-1 +kerning first=196 second=8221 amount=-3 +kerning first=280 second=171 amount=-1 +kerning first=97 second=361 amount=-1 +kerning first=251 second=314 amount=-1 +kerning first=67 second=269 amount=-1 +kerning first=316 second=171 amount=-1 +kerning first=202 second=347 amount=-1 +kerning first=362 second=337 amount=-1 +kerning first=352 second=171 amount=-1 +kerning first=202 second=361 amount=-1 +kerning first=70 second=352 amount=-1 +kerning first=267 second=361 amount=-1 +kerning first=67 second=171 amount=-2 +kerning first=310 second=361 amount=-1 +kerning first=97 second=347 amount=-1 +kerning first=78 second=224 amount=-1 +kerning first=103 second=171 amount=-1 +kerning first=274 second=361 amount=-1 +kerning first=108 second=316 amount=-1 +kerning first=347 second=371 amount=-1 +kerning first=232 second=8221 amount=-1 +kerning first=382 second=361 amount=-1 +kerning first=377 second=216 amount=-1 +kerning first=208 second=171 amount=-1 +kerning first=346 second=361 amount=-1 +kerning first=84 second=281 amount=-2 +kerning first=316 second=269 amount=-1 +kerning first=103 second=227 amount=-1 +kerning first=255 second=224 amount=-1 +kerning first=331 second=45 amount=-1 +kerning first=67 second=227 amount=-1 +kerning first=98 second=103 amount=-1 +kerning first=321 second=110 amount=-1 +kerning first=219 second=224 amount=-1 +kerning first=295 second=45 amount=-1 +kerning first=327 second=224 amount=-1 +kerning first=85 second=8249 amount=-3 +kerning first=291 second=224 amount=-1 +kerning first=367 second=45 amount=-1 +kerning first=280 second=227 amount=-1 +kerning first=208 second=227 amount=-1 +kerning first=364 second=246 amount=-1 +kerning first=223 second=311 amount=-1 +kerning first=235 second=226 amount=-1 +kerning first=338 second=356 amount=-1 +kerning first=187 second=311 amount=-1 +kerning first=205 second=101 amount=-1 +kerning first=66 second=382 amount=-2 +kerning first=118 second=311 amount=-1 +kerning first=266 second=90 amount=-1 +kerning first=90 second=201 amount=-1 +kerning first=307 second=226 amount=-1 +kerning first=82 second=45 amount=-2 +kerning first=266 second=356 amount=-1 +kerning first=347 second=103 amount=-1 +kerning first=256 second=246 amount=-1 +kerning first=82 second=311 amount=-1 +kerning first=46 second=45 amount=-1 +kerning first=311 second=103 amount=-1 +kerning first=220 second=246 amount=-1 +kerning first=193 second=362 amount=-2 +kerning first=338 second=90 amount=-1 +kerning first=353 second=291 amount=-1 +kerning first=379 second=226 amount=-1 +kerning first=194 second=356 amount=-3 +kerning first=275 second=103 amount=-1 +kerning first=187 second=207 amount=-3 +kerning first=317 second=291 amount=-1 +kerning first=118 second=45 amount=-2 +kerning first=262 second=102 amount=-1 +kerning first=281 second=291 amount=-1 +kerning first=356 second=252 amount=-1 +kerning first=203 second=103 amount=-1 +kerning first=332 second=261 amount=-1 +kerning first=374 second=90 amount=-1 +kerning first=245 second=291 amount=-1 +kerning first=73 second=44 amount=-1 +kerning first=368 second=109 amount=-1 +kerning first=338 second=104 amount=-1 +kerning first=246 second=8250 amount=-1 +kerning first=280 second=213 amount=-1 +kerning first=266 second=104 amount=-1 +kerning first=109 second=44 amount=-1 +kerning first=89 second=370 amount=-1 +kerning first=203 second=89 amount=-1 +kerning first=379 second=212 amount=-1 +kerning first=89 second=90 amount=-1 +kerning first=187 second=193 amount=-2 +kerning first=194 second=370 amount=-2 +kerning first=83 second=109 amount=-1 +kerning first=234 second=115 amount=-1 +kerning first=113 second=8249 amount=-1 +kerning first=352 second=227 amount=-1 +kerning first=1036 second=1113 amount=-1 +kerning first=119 second=109 amount=-1 +kerning first=316 second=227 amount=-1 +kerning first=198 second=115 amount=-1 +kerning first=339 second=187 amount=-1 +kerning first=379 second=78 amount=-1 +kerning first=240 second=303 amount=-1 +kerning first=230 second=104 amount=-1 +kerning first=378 second=115 amount=-1 +kerning first=250 second=44 amount=-1 +kerning first=77 second=8249 amount=-2 +kerning first=194 second=104 amount=-1 +kerning first=256 second=232 amount=-1 +kerning first=214 second=44 amount=-1 +kerning first=214 second=368 amount=-1 +kerning first=86 second=70 amount=-1 +kerning first=67 second=213 amount=-2 +kerning first=286 second=44 amount=-1 +kerning first=264 second=78 amount=-1 +kerning first=76 second=75 amount=-1 +kerning first=84 second=323 amount=-1 +kerning first=314 second=120 amount=-1 +kerning first=235 second=289 amount=-1 +kerning first=286 second=203 amount=-1 +kerning first=350 second=120 amount=-1 +kerning first=1101 second=1103 amount=-1 +kerning first=99 second=116 amount=-1 +kerning first=313 second=115 amount=-1 +kerning first=198 second=70 amount=-1 +kerning first=286 second=368 amount=-1 +kerning first=214 second=203 amount=-1 +kerning first=101 second=120 amount=-1 +kerning first=321 second=198 amount=-1 +kerning first=100 second=375 amount=-1 +kerning first=362 second=210 amount=-1 +kerning first=8216 second=111 amount=-1 +kerning first=242 second=120 amount=-1 +kerning first=317 second=73 amount=-1 +kerning first=252 second=118 amount=-1 +kerning first=117 second=253 amount=-1 +kerning first=332 second=201 amount=-1 +kerning first=68 second=73 amount=-1 +kerning first=71 second=356 amount=-1 +kerning first=200 second=278 amount=-1 +kerning first=324 second=118 amount=-1 +kerning first=269 second=113 amount=-1 +kerning first=289 second=117 amount=-1 +kerning first=88 second=233 amount=-1 +kerning first=288 second=118 amount=-1 +kerning first=67 second=68 amount=-1 +kerning first=272 second=278 amount=-1 +kerning first=258 second=253 amount=-1 +kerning first=75 second=118 amount=-1 +kerning first=280 second=68 amount=-1 +kerning first=193 second=233 amount=-1 +kerning first=374 second=241 amount=-1 +kerning first=330 second=253 amount=-1 +kerning first=113 second=353 amount=-1 +kerning first=366 second=253 amount=-1 +kerning first=83 second=201 amount=-1 +kerning first=1058 second=1085 amount=-1 +kerning first=200 second=80 amount=-1 +kerning first=382 second=291 amount=-1 +kerning first=111 second=118 amount=-1 +kerning first=313 second=196 amount=-1 +kerning first=377 second=113 amount=-1 +kerning first=316 second=283 amount=-1 +kerning first=253 second=335 amount=-1 +kerning first=266 second=241 amount=-1 +kerning first=109 second=108 amount=-1 +kerning first=106 second=305 amount=-1 +kerning first=289 second=335 amount=-1 +kerning first=230 second=241 amount=-1 +kerning first=1069 second=1040 amount=-2 +kerning first=90 second=323 amount=-1 +kerning first=74 second=110 amount=-1 +kerning first=325 second=335 amount=-1 +kerning first=338 second=241 amount=-1 +kerning first=89 second=193 amount=-3 +kerning first=89 second=241 amount=-1 +kerning first=278 second=380 amount=-1 +kerning first=205 second=232 amount=-1 +kerning first=314 second=380 amount=-1 +kerning first=84 second=85 amount=-1 +kerning first=250 second=108 amount=-1 +kerning first=350 second=380 amount=-1 +kerning first=287 second=110 amount=-1 +kerning first=217 second=335 amount=-1 +kerning first=85 second=65 amount=-2 +kerning first=266 second=193 amount=-2 +kerning first=221 second=248 amount=-2 +kerning first=101 second=380 amount=-1 +kerning first=219 second=286 amount=-1 +kerning first=370 second=331 amount=-1 +kerning first=290 second=70 amount=-1 +kerning first=100 second=115 amount=-1 +kerning first=78 second=286 amount=-1 +kerning first=262 second=331 amount=-1 +kerning first=206 second=380 amount=-1 +kerning first=8220 second=275 amount=-1 +kerning first=250 second=375 amount=-1 +kerning first=242 second=380 amount=-1 +kerning first=262 second=65 amount=-2 +kerning first=316 second=224 amount=-1 +kerning first=354 second=231 amount=-2 +kerning first=241 second=115 amount=-1 +kerning first=80 second=248 amount=-1 +kerning first=277 second=115 amount=-1 +kerning first=334 second=65 amount=-2 +kerning first=336 second=78 amount=-1 +kerning first=338 second=193 amount=-1 +kerning first=85 second=331 amount=-1 +kerning first=370 second=65 amount=-2 +kerning first=379 second=338 amount=-1 +kerning first=374 second=193 amount=-3 +kerning first=121 second=331 amount=-1 +kerning first=205 second=115 amount=-1 +kerning first=1037 second=1073 amount=-1 +kerning first=331 second=255 amount=-1 +kerning first=98 second=307 amount=-1 +kerning first=336 second=352 amount=-1 +kerning first=295 second=255 amount=-1 +kerning first=259 second=255 amount=-1 +kerning first=353 second=347 amount=-1 +kerning first=223 second=255 amount=-1 +kerning first=321 second=366 amount=-1 +kerning first=317 second=347 amount=-1 +kerning first=77 second=281 amount=-1 +kerning first=1092 second=1078 amount=-1 +kerning first=79 second=302 amount=-1 +kerning first=187 second=255 amount=-2 +kerning first=73 second=262 amount=-1 +kerning first=275 second=307 amount=-1 +kerning first=281 second=347 amount=-1 +kerning first=245 second=347 amount=-1 +kerning first=82 second=255 amount=-1 +kerning first=347 second=307 amount=-1 +kerning first=232 second=371 amount=-1 +kerning first=209 second=347 amount=-1 +kerning first=1056 second=1078 amount=-1 +kerning first=66 second=326 amount=-1 +kerning first=1093 second=1077 amount=-1 +kerning first=99 second=250 amount=-1 +kerning first=206 second=212 amount=-1 +kerning first=339 second=257 amount=-1 +kerning first=75 second=333 amount=-1 +kerning first=8250 second=355 amount=-1 +kerning first=223 second=378 amount=-1 +kerning first=274 second=280 amount=-1 +kerning first=382 second=97 amount=-1 +kerning first=375 second=257 amount=-2 +kerning first=338 second=330 amount=-1 +kerning first=204 second=250 amount=-1 +kerning first=87 second=352 amount=-2 +kerning first=74 second=328 amount=-1 +kerning first=1057 second=1077 amount=-1 +kerning first=1025 second=1052 amount=-1 +kerning first=83 second=377 amount=-1 +kerning first=303 second=257 amount=-1 +kerning first=350 second=325 amount=-1 +kerning first=274 second=229 amount=-1 +kerning first=192 second=352 amount=-2 +kerning first=1098 second=1118 amount=-1 +kerning first=103 second=283 amount=-1 +kerning first=332 second=377 amount=-1 +kerning first=65 second=212 amount=-1 +kerning first=231 second=257 amount=-1 +kerning first=287 second=328 amount=-1 +kerning first=67 second=283 amount=-1 +kerning first=187 second=378 amount=-3 +kerning first=213 second=366 amount=-1 +kerning first=1042 second=1047 amount=-1 +kerning first=118 second=378 amount=-1 +kerning first=313 second=8220 amount=-2 +kerning first=249 second=106 amount=-1 +kerning first=277 second=8220 amount=-1 +kerning first=199 second=332 amount=-2 +kerning first=241 second=8220 amount=-2 +kerning first=278 second=103 amount=-1 +kerning first=310 second=87 amount=-1 +kerning first=368 second=377 amount=-1 +kerning first=105 second=287 amount=-1 +kerning first=1049 second=1092 amount=-1 +kerning first=8217 second=367 amount=-1 +kerning first=346 second=87 amount=-1 +kerning first=213 second=106 amount=-1 +kerning first=69 second=287 amount=-1 +kerning first=219 second=345 amount=-1 +kerning first=379 second=332 amount=-1 +kerning first=210 second=287 amount=-1 +kerning first=197 second=113 amount=-1 +kerning first=100 second=8220 amount=-1 +kerning first=255 second=345 amount=-1 +kerning first=367 second=378 amount=-1 +kerning first=377 second=268 amount=-1 +kerning first=321 second=106 amount=-1 +kerning first=8220 second=269 amount=-1 +kerning first=282 second=287 amount=-1 +kerning first=67 second=316 amount=-1 +kerning first=1113 second=1090 amount=-1 +kerning first=202 second=87 amount=-1 +kerning first=86 second=288 amount=-1 +kerning first=80 second=242 amount=-1 +kerning first=246 second=287 amount=-1 +kerning first=66 second=217 amount=-2 +kerning first=221 second=242 amount=-1 +kerning first=354 second=287 amount=-2 +kerning first=104 second=347 amount=-1 +kerning first=310 second=243 amount=-1 +kerning first=213 second=198 amount=-2 +kerning first=377 second=102 amount=-1 +kerning first=362 second=281 amount=-1 +kerning first=327 second=367 amount=-1 +kerning first=279 second=326 amount=-1 +kerning first=113 second=281 amount=-1 +kerning first=315 second=326 amount=-1 +kerning first=187 second=82 amount=-3 +kerning first=315 second=217 amount=-1 +kerning first=351 second=326 amount=-1 +kerning first=218 second=281 amount=-1 +kerning first=214 second=197 amount=-2 +kerning first=367 second=255 amount=-1 +kerning first=84 second=119 amount=-1 +kerning first=198 second=210 amount=-1 +kerning first=120 second=119 amount=-1 +kerning first=278 second=324 amount=-1 +kerning first=67 second=334 amount=-2 +kerning first=198 second=274 amount=-1 +kerning first=286 second=197 amount=-1 +kerning first=321 second=270 amount=-1 +kerning first=194 second=249 amount=-1 +kerning first=122 second=97 amount=-1 +kerning first=108 second=254 amount=-1 +kerning first=225 second=119 amount=-1 +kerning first=86 second=283 amount=-2 +kerning first=89 second=249 amount=-1 +kerning first=261 second=119 amount=-1 +kerning first=80 second=304 amount=-1 +kerning first=214 second=374 amount=-1 +kerning first=314 second=324 amount=-1 +kerning first=81 second=75 amount=-1 +kerning first=377 second=379 amount=-1 +kerning first=267 second=369 amount=-1 +kerning first=101 second=324 amount=-1 +kerning first=338 second=249 amount=-1 +kerning first=333 second=119 amount=-1 +kerning first=8217 second=101 amount=-2 +kerning first=231 second=369 amount=-1 +kerning first=369 second=119 amount=-1 +kerning first=339 second=369 amount=-1 +kerning first=200 second=74 amount=-1 +kerning first=1062 second=1054 amount=-1 +kerning first=266 second=249 amount=-1 +kerning first=8218 second=316 amount=-1 +kerning first=303 second=369 amount=-1 +kerning first=68 second=229 amount=-1 +kerning first=280 second=334 amount=-1 +kerning first=86 second=344 amount=-1 +kerning first=192 second=234 amount=-1 +kerning first=281 second=229 amount=-1 +kerning first=272 second=74 amount=-1 +kerning first=85 second=339 amount=-1 +kerning first=200 second=284 amount=-1 +kerning first=264 second=234 amount=-1 +kerning first=209 second=229 amount=-1 +kerning first=121 second=339 amount=-1 +kerning first=253 second=279 amount=-1 +kerning first=1091 second=1093 amount=-1 +kerning first=370 second=339 amount=-1 +kerning first=108 second=106 amount=-1 +kerning first=217 second=279 amount=-1 +kerning first=262 second=339 amount=-1 +kerning first=87 second=234 amount=-2 +kerning first=325 second=279 amount=-1 +kerning first=353 second=229 amount=-1 +kerning first=298 second=339 amount=-1 +kerning first=289 second=279 amount=-1 +kerning first=223 second=8217 amount=-1 +kerning first=280 second=219 amount=-1 +kerning first=196 second=111 amount=-1 +kerning first=259 second=8217 amount=-1 +kerning first=356 second=244 amount=-2 +kerning first=295 second=8217 amount=-2 +kerning first=377 second=264 amount=-1 +kerning first=286 second=374 amount=-1 +kerning first=208 second=219 amount=-1 +kerning first=268 second=111 amount=-1 +kerning first=331 second=8217 amount=-2 +kerning first=332 second=209 amount=-1 +kerning first=264 second=86 amount=-1 +kerning first=85 second=332 amount=-1 +kerning first=66 second=66 amount=-2 +kerning first=82 second=8217 amount=-3 +kerning first=1067 second=1089 amount=-1 +kerning first=313 second=107 amount=-1 +kerning first=67 second=219 amount=-1 +kerning first=192 second=86 amount=-3 +kerning first=197 second=264 amount=-1 +kerning first=8250 second=291 amount=-1 +kerning first=379 second=72 amount=-1 +kerning first=201 second=289 amount=-1 +kerning first=1042 second=1041 amount=-1 +kerning first=234 second=121 amount=-1 +kerning first=194 second=364 amount=-2 +kerning first=83 second=209 amount=-1 +kerning first=315 second=298 amount=-1 +kerning first=196 second=254 amount=-1 +kerning first=201 second=82 amount=-1 +kerning first=280 second=326 amount=-1 +kerning first=89 second=364 amount=-1 +kerning first=107 second=244 amount=-1 +kerning first=304 second=111 amount=-1 +kerning first=345 second=289 amount=-1 +kerning first=286 second=83 amount=-1 +kerning first=366 second=90 amount=-1 +kerning first=284 second=368 amount=-1 +kerning first=381 second=289 amount=-2 +kerning first=249 second=254 amount=-1 +kerning first=88 second=354 amount=-1 +kerning first=376 second=111 amount=-2 +kerning first=274 second=278 amount=-1 +kerning first=79 second=296 amount=-1 +kerning first=315 second=66 amount=-1 +kerning first=266 second=364 amount=-1 +kerning first=321 second=254 amount=-1 +kerning first=82 second=199 amount=-1 +kerning first=193 second=354 amount=-3 +kerning first=380 second=225 amount=-1 +kerning first=260 second=117 amount=-1 +kerning first=102 second=122 amount=-1 +kerning first=45 second=102 amount=-1 +kerning first=224 second=117 amount=-1 +kerning first=268 second=200 amount=-1 +kerning first=66 second=122 amount=-2 +kerning first=90 second=251 amount=-1 +kerning first=117 second=102 amount=-1 +kerning first=8216 second=99 amount=-1 +kerning first=296 second=117 amount=-1 +kerning first=275 second=97 amount=-1 +kerning first=315 second=122 amount=-1 +kerning first=236 second=225 amount=-1 +kerning first=195 second=251 amount=-1 +kerning first=378 second=121 amount=-1 +kerning first=199 second=72 amount=-1 +kerning first=311 second=97 amount=-1 +kerning first=279 second=122 amount=-1 +kerning first=298 second=71 amount=-1 +kerning first=330 second=46 amount=-1 +kerning first=272 second=225 amount=-1 +kerning first=368 second=117 amount=-1 +kerning first=203 second=97 amount=-1 +kerning first=243 second=122 amount=-1 +kerning first=366 second=46 amount=-3 +kerning first=267 second=251 amount=-1 +kerning first=376 second=200 amount=-1 +kerning first=207 second=122 amount=-1 +kerning first=370 second=71 amount=-1 +kerning first=344 second=225 amount=-1 +kerning first=231 second=251 amount=-1 +kerning first=117 second=46 amount=-1 +kerning first=339 second=251 amount=-1 +kerning first=366 second=102 amount=-1 +kerning first=303 second=251 amount=-1 +kerning first=364 second=240 amount=-1 +kerning first=347 second=97 amount=-1 +kerning first=222 second=46 amount=-1 +kerning first=256 second=240 amount=-1 +kerning first=203 second=363 amount=-1 +kerning first=83 second=117 amount=-1 +kerning first=311 second=245 amount=-1 +kerning first=278 second=206 amount=-1 +kerning first=275 second=363 amount=-1 +kerning first=352 second=219 amount=-1 +kerning first=1061 second=1108 amount=-1 +kerning first=350 second=206 amount=-1 +kerning first=69 second=83 amount=-1 +kerning first=382 second=355 amount=-1 +kerning first=213 second=310 amount=-1 +kerning first=72 second=284 amount=-1 +kerning first=351 second=249 amount=-1 +kerning first=346 second=355 amount=-1 +kerning first=1045 second=1056 amount=-1 +kerning first=291 second=289 amount=-1 +kerning first=376 second=259 amount=-2 +kerning first=282 second=83 amount=-1 +kerning first=221 second=267 amount=-2 +kerning first=220 second=240 amount=-1 +kerning first=344 second=284 amount=-1 +kerning first=8217 second=196 amount=-3 +kerning first=45 second=253 amount=-2 +kerning first=354 second=83 amount=-2 +kerning first=332 second=69 amount=-1 +kerning first=290 second=77 amount=-1 +kerning first=90 second=369 amount=-1 +kerning first=232 second=259 amount=-1 +kerning first=277 second=375 amount=-1 +kerning first=199 second=220 amount=-1 +kerning first=287 second=116 amount=-1 +kerning first=241 second=375 amount=-1 +kerning first=262 second=71 amount=-2 +kerning first=75 second=269 amount=-1 +kerning first=195 second=369 amount=-1 +kerning first=304 second=259 amount=-1 +kerning first=205 second=375 amount=-1 +kerning first=351 second=122 amount=-1 +kerning first=268 second=259 amount=-1 +kerning first=1038 second=1075 amount=-2 +kerning first=115 second=45 amount=-1 +kerning first=85 second=71 amount=-1 +kerning first=8216 second=271 amount=-1 +kerning first=221 second=304 amount=-1 +kerning first=266 second=87 amount=-1 +kerning first=313 second=375 amount=-1 +kerning first=266 second=266 amount=-2 +kerning first=204 second=351 amount=-1 +kerning first=278 second=330 amount=-1 +kerning first=374 second=291 amount=-2 +kerning first=80 second=298 amount=-1 +kerning first=350 second=220 amount=-1 +kerning first=377 second=77 amount=-1 +kerning first=315 second=304 amount=-1 +kerning first=381 second=233 amount=-1 +kerning first=338 second=291 amount=-1 +kerning first=70 second=214 amount=-1 +kerning first=70 second=71 amount=-1 +kerning first=278 second=220 amount=-1 +kerning first=381 second=90 amount=-1 +kerning first=105 second=97 amount=-1 +kerning first=266 second=291 amount=-1 +kerning first=221 second=298 amount=-1 +kerning first=211 second=317 amount=-1 +kerning first=98 second=8250 amount=-1 +kerning first=74 second=227 amount=-1 +kerning first=118 second=110 amount=-1 +kerning first=230 second=291 amount=-1 +kerning first=8217 second=286 amount=-1 +kerning first=187 second=110 amount=-1 +kerning first=65 second=84 amount=-3 +kerning first=350 second=330 amount=-1 +kerning first=346 second=207 amount=-1 +kerning first=86 second=287 amount=-2 +kerning first=69 second=97 amount=-1 +kerning first=278 second=65 amount=-1 +kerning first=66 second=304 amount=-2 +kerning first=282 second=97 amount=-1 +kerning first=89 second=291 amount=-2 +kerning first=193 second=8220 amount=-3 +kerning first=278 second=84 amount=-1 +kerning first=197 second=337 amount=-1 +kerning first=323 second=213 amount=-1 +kerning first=364 second=324 amount=-1 +kerning first=210 second=97 amount=-1 +kerning first=66 second=318 amount=-1 +kerning first=252 second=311 amount=-1 +kerning first=201 second=350 amount=-1 +kerning first=115 second=324 amount=-1 +kerning first=377 second=337 amount=-1 +kerning first=381 second=350 amount=-1 +kerning first=201 second=90 amount=-1 +kerning first=220 second=324 amount=-1 +kerning first=354 second=97 amount=-2 +kerning first=111 second=311 amount=-1 +kerning first=243 second=318 amount=-1 +kerning first=350 second=84 amount=-1 +kerning first=269 second=337 amount=-1 +kerning first=75 second=311 amount=-1 +kerning first=279 second=318 amount=-1 +kerning first=79 second=310 amount=-1 +kerning first=243 second=44 amount=-2 +kerning first=234 second=289 amount=-1 +kerning first=201 second=104 amount=-1 +kerning first=221 second=284 amount=-1 +kerning first=111 second=187 amount=-1 +kerning first=314 second=234 amount=-1 +kerning first=278 second=344 amount=-1 +kerning first=1070 second=1025 amount=-1 +kerning first=279 second=44 amount=-2 +kerning first=74 second=213 amount=-1 +kerning first=65 second=234 amount=-1 +kerning first=334 second=381 amount=-1 +kerning first=374 second=277 amount=-2 +kerning first=66 second=44 amount=-2 +kerning first=379 second=374 amount=-1 +kerning first=370 second=381 amount=-1 +kerning first=8218 second=368 amount=-2 +kerning first=350 second=70 amount=-1 +kerning first=79 second=78 amount=-1 +kerning first=102 second=44 amount=-1 +kerning first=1059 second=1081 amount=-2 +kerning first=278 second=70 amount=-1 +kerning first=287 second=227 amount=-1 +kerning first=194 second=277 amount=-1 +kerning first=251 second=227 amount=-1 +kerning first=8222 second=259 amount=-1 +kerning first=302 second=277 amount=-1 +kerning first=233 second=351 amount=-1 +kerning first=266 second=277 amount=-1 +kerning first=197 second=351 amount=-1 +kerning first=84 second=194 amount=-3 +kerning first=283 second=303 amount=-1 +kerning first=268 second=377 amount=-1 +kerning first=351 second=44 amount=-1 +kerning first=216 second=201 amount=-1 +kerning first=370 second=367 amount=-1 +kerning first=65 second=220 amount=-2 +kerning first=89 second=277 amount=-2 +kerning first=376 second=377 amount=-1 +kerning first=221 second=380 amount=-2 +kerning first=209 second=266 amount=-1 +kerning first=269 second=8220 amount=-1 +kerning first=1058 second=1093 amount=-1 +kerning first=310 second=235 amount=-1 +kerning first=65 second=248 amount=-1 +kerning first=201 second=118 amount=-1 +kerning first=233 second=8220 amount=-1 +kerning first=364 second=338 amount=-1 +kerning first=350 second=98 amount=-1 +kerning first=197 second=8220 amount=-3 +kerning first=80 second=270 amount=-1 +kerning first=382 second=235 amount=-1 +kerning first=314 second=98 amount=-1 +kerning first=287 second=241 amount=-1 +kerning first=221 second=270 amount=-1 +kerning first=218 second=287 amount=-2 +kerning first=116 second=380 amount=-1 +kerning first=209 second=211 amount=-1 +kerning first=256 second=338 amount=-1 +kerning first=283 second=228 amount=-1 +kerning first=101 second=112 amount=-1 +kerning first=202 second=193 amount=-1 +kerning first=216 second=325 amount=-1 +kerning first=290 second=287 amount=-1 +kerning first=374 second=263 amount=-2 +kerning first=254 second=287 amount=-1 +kerning first=211 second=228 amount=-1 +kerning first=69 second=274 amount=-1 +kerning first=206 second=363 amount=-1 +kerning first=220 second=197 amount=-2 +kerning first=362 second=287 amount=-2 +kerning first=347 second=8249 amount=-1 +kerning first=326 second=287 amount=-1 +kerning first=106 second=228 amount=-1 +kerning first=194 second=263 amount=-1 +kerning first=346 second=193 amount=-2 +kerning first=70 second=228 amount=-1 +kerning first=45 second=197 amount=-2 +kerning first=8216 second=230 amount=-1 +kerning first=314 second=248 amount=-1 +kerning first=311 second=8249 amount=-2 +kerning first=81 second=197 amount=-2 +kerning first=266 second=263 amount=-1 +kerning first=274 second=193 amount=-1 +kerning first=206 second=248 amount=-1 +kerning first=203 second=8249 amount=-1 +kerning first=74 second=241 amount=-1 +kerning first=302 second=263 amount=-1 +kerning first=274 second=221 amount=-1 +kerning first=263 second=110 amount=-1 +kerning first=222 second=197 amount=-2 +kerning first=112 second=104 amount=-1 +kerning first=283 second=331 amount=-1 +kerning first=310 second=221 amount=-1 +kerning first=364 second=352 amount=-1 +kerning first=351 second=318 amount=-1 +kerning first=350 second=112 amount=-1 +kerning first=202 second=221 amount=-1 +kerning first=323 second=255 amount=-1 +kerning first=65 second=262 amount=-1 +kerning first=314 second=112 amount=-1 +kerning first=287 second=255 amount=-1 +kerning first=278 second=112 amount=-1 +kerning first=251 second=255 amount=-1 +kerning first=366 second=197 amount=-2 +kerning first=242 second=112 amount=-1 +kerning first=106 second=331 amount=-1 +kerning first=8222 second=369 amount=-1 +kerning first=206 second=262 amount=-1 +kerning first=1064 second=1072 amount=-1 +kerning first=67 second=74 amount=-1 +kerning first=82 second=374 amount=-1 +kerning first=206 second=112 amount=-1 +kerning first=278 second=318 amount=-1 +kerning first=45 second=314 amount=-1 +kerning first=211 second=200 amount=-1 +kerning first=110 second=255 amount=-1 +kerning first=278 second=262 amount=-1 +kerning first=8216 second=244 amount=-1 +kerning first=117 second=314 amount=-1 +kerning first=79 second=352 amount=-1 +kerning first=207 second=290 amount=-1 +kerning first=208 second=74 amount=-1 +kerning first=88 second=253 amount=-2 +kerning first=374 second=249 amount=-1 +kerning first=75 second=111 amount=-1 +kerning first=278 second=98 amount=-1 +kerning first=280 second=74 amount=-1 +kerning first=377 second=105 amount=-1 +kerning first=202 second=207 amount=-1 +kerning first=315 second=290 amount=-1 +kerning first=75 second=283 amount=-1 +kerning first=221 second=366 amount=-1 +kerning first=256 second=352 amount=-2 +kerning first=352 second=74 amount=-1 +kerning first=365 second=380 amount=-1 +kerning first=258 second=314 amount=-1 +kerning first=220 second=352 amount=-1 +kerning first=66 second=290 amount=-1 +kerning first=378 second=112 amount=-1 +kerning first=346 second=221 amount=-1 +kerning first=101 second=98 amount=-1 +kerning first=233 second=105 amount=-1 +kerning first=65 second=98 amount=-1 +kerning first=8222 second=355 amount=-1 +kerning first=195 second=333 amount=-1 +kerning first=317 second=67 amount=-1 +kerning first=85 second=224 amount=-1 +kerning first=311 second=8221 amount=-1 +kerning first=222 second=68 amount=-1 +kerning first=76 second=81 amount=-1 +kerning first=347 second=8221 amount=-1 +kerning first=222 second=80 amount=-1 +kerning first=267 second=333 amount=-1 +kerning first=81 second=68 amount=-1 +kerning first=231 second=333 amount=-1 +kerning first=209 second=67 amount=-1 +kerning first=220 second=261 amount=-2 +kerning first=87 second=282 amount=-1 +kerning first=275 second=8221 amount=-1 +kerning first=262 second=224 amount=-1 +kerning first=81 second=80 amount=-1 +kerning first=365 second=106 amount=-1 +kerning first=377 second=355 amount=-1 +kerning first=45 second=80 amount=-3 +kerning first=90 second=333 amount=-1 +kerning first=255 second=45 amount=-2 +kerning first=257 second=106 amount=-1 +kerning first=334 second=224 amount=-1 +kerning first=199 second=346 amount=-1 +kerning first=200 second=217 amount=-1 +kerning first=325 second=81 amount=-1 +kerning first=298 second=224 amount=-1 +kerning first=80 second=256 amount=-2 +kerning first=370 second=102 amount=-1 +kerning first=204 second=230 amount=-1 +kerning first=379 second=346 amount=-1 +kerning first=217 second=243 amount=-1 +kerning first=107 second=101 amount=-1 +kerning first=253 second=243 amount=-1 +kerning first=99 second=230 amount=-1 +kerning first=213 second=204 amount=-1 +kerning first=321 second=204 amount=-1 +kerning first=303 second=333 amount=-1 +kerning first=45 second=68 amount=-3 +kerning first=282 second=332 amount=-1 +kerning first=221 second=256 amount=-3 +kerning first=1043 second=1099 amount=-1 +kerning first=68 second=103 amount=-1 +kerning first=375 second=333 amount=-1 +kerning first=232 second=307 amount=-1 +kerning first=362 second=118 amount=-1 +kerning first=356 second=101 amount=-2 +kerning first=370 second=79 amount=-1 +kerning first=116 second=120 amount=-1 +kerning first=321 second=218 amount=-1 +kerning first=1039 second=1072 amount=-1 +kerning first=262 second=79 amount=-2 +kerning first=90 second=335 amount=-1 +kerning first=298 second=79 amount=-1 +kerning first=376 second=192 amount=-3 +kerning first=200 second=334 amount=-1 +kerning first=221 second=120 amount=-1 +kerning first=192 second=268 amount=-1 +kerning first=289 second=243 amount=-1 +kerning first=325 second=243 amount=-1 +kerning first=315 second=347 amount=-1 +kerning first=264 second=268 amount=-2 +kerning first=268 second=192 amount=-2 +kerning first=203 second=251 amount=-1 +kerning first=198 second=315 amount=-1 +kerning first=344 second=334 amount=-1 +kerning first=275 second=251 amount=-1 +kerning first=217 second=229 amount=-2 +kerning first=272 second=217 amount=-1 +kerning first=253 second=229 amount=-2 +kerning first=87 second=268 amount=-1 +kerning first=272 second=203 amount=-1 +kerning first=347 second=251 amount=-1 +kerning first=344 second=217 amount=-1 +kerning first=200 second=203 amount=-1 +kerning first=257 second=120 amount=-1 +kerning first=213 second=218 amount=-1 +kerning first=336 second=282 amount=-1 +kerning first=289 second=229 amount=-1 +kerning first=381 second=118 amount=-1 +kerning first=264 second=282 amount=-1 +kerning first=325 second=229 amount=-1 +kerning first=325 second=257 amount=-1 +kerning first=344 second=219 amount=-1 +kerning first=221 second=368 amount=-1 +kerning first=105 second=371 amount=-1 +kerning first=253 second=257 amount=-2 +kerning first=272 second=219 amount=-1 +kerning first=289 second=257 amount=-1 +kerning first=1024 second=1036 amount=-1 +kerning first=376 second=267 amount=-2 +kerning first=86 second=336 amount=-1 +kerning first=108 second=232 amount=-1 +kerning first=217 second=257 amount=-2 +kerning first=304 second=279 amount=-1 +kerning first=90 second=361 amount=-1 +kerning first=72 second=232 amount=-1 +kerning first=231 second=361 amount=-1 +kerning first=105 second=375 amount=-1 +kerning first=376 second=279 amount=-2 +kerning first=195 second=361 amount=-1 +kerning first=45 second=66 amount=-3 +kerning first=66 second=278 amount=-2 +kerning first=298 second=121 amount=-1 +kerning first=192 second=254 amount=-1 +kerning first=199 second=374 amount=-1 +kerning first=228 second=254 amount=-1 +kerning first=226 second=121 amount=-1 +kerning first=264 second=254 amount=-1 +kerning first=204 second=244 amount=-1 +kerning first=350 second=344 amount=-1 +kerning first=290 second=69 amount=-1 +kerning first=269 second=316 amount=-1 +kerning first=268 second=267 amount=-1 +kerning first=222 second=82 amount=-1 +kerning first=304 second=267 amount=-1 +kerning first=85 second=121 amount=-1 +kerning first=85 second=79 amount=-1 +kerning first=315 second=278 amount=-1 +kerning first=196 second=267 amount=-1 +kerning first=81 second=66 amount=-1 +kerning first=8217 second=260 amount=-3 +kerning first=304 second=281 amount=-1 +kerning first=214 second=382 amount=-1 +kerning first=45 second=82 amount=-3 +kerning first=196 second=117 amount=-1 +kerning first=250 second=382 amount=-1 +kerning first=108 second=246 amount=-1 +kerning first=81 second=82 amount=-1 +kerning first=376 second=281 amount=-2 +kerning first=286 second=382 amount=-1 +kerning first=72 second=246 amount=-1 +kerning first=289 second=271 amount=-1 +kerning first=1043 second=1057 amount=-1 +kerning first=268 second=117 amount=-1 +kerning first=121 second=107 amount=-1 +kerning first=232 second=117 amount=-1 +kerning first=196 second=281 amount=-1 +kerning first=73 second=382 amount=-1 +kerning first=272 second=205 amount=-1 +kerning first=1043 second=1085 amount=-1 +kerning first=304 second=117 amount=-1 +kerning first=370 second=121 amount=-1 +kerning first=268 second=281 amount=-1 +kerning first=203 second=230 amount=-1 +kerning first=376 second=117 amount=-1 +kerning first=375 second=347 amount=-1 +kerning first=72 second=352 amount=-1 +kerning first=264 second=240 amount=-1 +kerning first=339 second=347 amount=-1 +kerning first=303 second=347 amount=-1 +kerning first=234 second=8250 amount=-1 +kerning first=267 second=347 amount=-1 +kerning first=339 second=361 amount=-1 +kerning first=368 second=379 amount=-1 +kerning first=231 second=347 amount=-1 +kerning first=262 second=107 amount=-1 +kerning first=302 second=339 amount=-1 +kerning first=195 second=347 amount=-1 +kerning first=1067 second=1095 amount=-1 +kerning first=204 second=216 amount=-1 +kerning first=1031 second=1095 amount=-1 +kerning first=90 second=347 amount=-1 +kerning first=115 second=226 amount=-1 +kerning first=207 second=262 amount=-1 +kerning first=370 second=266 amount=-1 +kerning first=111 second=104 amount=-1 +kerning first=1050 second=1083 amount=-1 +kerning first=377 second=65 amount=-1 +kerning first=78 second=252 amount=-1 +kerning first=346 second=305 amount=-1 +kerning first=346 second=249 amount=-1 +kerning first=66 second=46 amount=-2 +kerning first=220 second=226 amount=-2 +kerning first=298 second=266 amount=-1 +kerning first=1086 second=1083 amount=-1 +kerning first=102 second=46 amount=-1 +kerning first=86 second=8250 amount=-1 +kerning first=220 second=336 amount=-1 +kerning first=256 second=336 amount=-1 +kerning first=382 second=305 amount=-1 +kerning first=335 second=8250 amount=-1 +kerning first=1070 second=1062 amount=-1 +kerning first=262 second=266 amount=-2 +kerning first=73 second=122 amount=-1 +kerning first=1116 second=1104 amount=-1 +kerning first=381 second=102 amount=-1 +kerning first=364 second=336 amount=-1 +kerning first=327 second=252 amount=-1 +kerning first=193 second=219 amount=-2 +kerning first=363 second=252 amount=-1 +kerning first=198 second=316 amount=-1 +kerning first=382 second=45 amount=-2 +kerning first=117 second=365 amount=-1 +kerning first=88 second=219 amount=-1 +kerning first=234 second=316 amount=-1 +kerning first=80 second=269 amount=-1 +kerning first=211 second=202 amount=-1 +kerning first=296 second=335 amount=-1 +kerning first=289 second=259 amount=-1 +kerning first=219 second=252 amount=-1 +kerning first=253 second=259 amount=-2 +kerning first=201 second=102 amount=-1 +kerning first=378 second=316 amount=-1 +kerning first=291 second=252 amount=-1 +kerning first=325 second=259 amount=-1 +kerning first=79 second=226 amount=-1 +kerning first=368 second=103 amount=-2 +kerning first=97 second=45 amount=-1 +kerning first=314 second=246 amount=-1 +kerning first=65 second=332 amount=-1 +kerning first=81 second=356 amount=-1 +kerning first=332 second=103 amount=-1 +kerning first=8216 second=85 amount=-1 +kerning first=103 second=116 amount=-1 +kerning first=45 second=356 amount=-2 +kerning first=116 second=382 amount=-1 +kerning first=217 second=259 amount=-2 +kerning first=356 second=375 amount=-1 +kerning first=282 second=369 amount=-1 +kerning first=260 second=103 amount=-1 +kerning first=1045 second=1103 amount=-1 +kerning first=206 second=246 amount=-1 +kerning first=69 second=369 amount=-1 +kerning first=224 second=103 amount=-1 +kerning first=110 second=253 amount=-1 +kerning first=274 second=45 amount=-1 +kerning first=8220 second=74 amount=-1 +kerning first=206 second=332 amount=-1 +kerning first=119 second=103 amount=-2 +kerning first=346 second=45 amount=-1 +kerning first=65 second=246 amount=-1 +kerning first=8250 second=221 amount=-2 +kerning first=105 second=369 amount=-1 +kerning first=83 second=103 amount=-1 +kerning first=251 second=253 amount=-1 +kerning first=310 second=45 amount=-2 +kerning first=278 second=332 amount=-1 +kerning first=102 second=120 amount=-1 +kerning first=365 second=382 amount=-1 +kerning first=253 second=109 amount=-1 +kerning first=194 second=8220 amount=-3 +kerning first=286 second=122 amount=-1 +kerning first=85 second=266 amount=-1 +kerning first=268 second=279 amount=-1 +kerning first=250 second=122 amount=-1 +kerning first=289 second=109 amount=-1 +kerning first=214 second=122 amount=-1 +kerning first=352 second=68 amount=-1 +kerning first=87 second=242 amount=-1 +kerning first=221 second=382 amount=-2 +kerning first=76 second=109 amount=-1 +kerning first=70 second=97 amount=-1 +kerning first=316 second=116 amount=-1 +kerning first=8218 second=98 amount=-1 +kerning first=258 second=356 amount=-3 +kerning first=354 second=369 amount=-1 +kerning first=248 second=375 amount=-1 +kerning first=192 second=242 amount=-1 +kerning first=222 second=356 amount=-1 +kerning first=201 second=362 amount=-1 +kerning first=352 second=116 amount=-1 +kerning first=264 second=242 amount=-1 +kerning first=248 second=115 amount=-1 +kerning first=352 second=378 amount=-1 +kerning first=364 second=198 amount=-2 +kerning first=346 second=251 amount=-1 +kerning first=346 second=73 amount=-1 +kerning first=83 second=75 amount=-1 +kerning first=316 second=8217 amount=-2 +kerning first=220 second=198 amount=-2 +kerning first=196 second=119 amount=-2 +kerning first=364 second=210 amount=-1 +kerning first=352 second=8217 amount=-1 +kerning first=289 second=355 amount=-1 +kerning first=232 second=119 amount=-1 +kerning first=8222 second=97 amount=-1 +kerning first=356 second=115 amount=-2 +kerning first=253 second=355 amount=-1 +kerning first=268 second=119 amount=-1 +kerning first=315 second=203 amount=-1 +kerning first=288 second=313 amount=-1 +kerning first=304 second=119 amount=-1 +kerning first=287 second=253 amount=-1 +kerning first=350 second=74 amount=-1 +kerning first=257 second=108 amount=-1 +kerning first=70 second=230 amount=-1 +kerning first=323 second=253 amount=-1 +kerning first=216 second=313 amount=-1 +kerning first=211 second=315 amount=-1 +kerning first=365 second=108 amount=-1 +kerning first=274 second=73 amount=-1 +kerning first=368 second=381 amount=-1 +kerning first=332 second=75 amount=-1 +kerning first=118 second=269 amount=-1 +kerning first=82 second=269 amount=-1 +kerning first=119 second=335 amount=-1 +kerning first=198 second=196 amount=-1 +kerning first=251 second=225 amount=-1 +kerning first=289 second=231 amount=-1 +kerning first=287 second=225 amount=-1 +kerning first=260 second=335 amount=-1 +kerning first=325 second=231 amount=-1 +kerning first=83 second=363 amount=-1 +kerning first=74 second=225 amount=-1 +kerning first=366 second=328 amount=-1 +kerning first=224 second=363 amount=-1 +kerning first=1056 second=1086 amount=-1 +kerning first=260 second=363 amount=-1 +kerning first=356 second=286 amount=-1 +kerning first=8218 second=220 amount=-2 +kerning first=208 second=8217 amount=-1 +kerning first=296 second=363 amount=-1 +kerning first=8216 second=345 amount=-1 +kerning first=244 second=8217 amount=-1 +kerning first=65 second=218 amount=-2 +kerning first=323 second=225 amount=-1 +kerning first=368 second=363 amount=-1 +kerning first=217 second=231 amount=-1 +kerning first=8220 second=255 amount=-1 +kerning first=350 second=218 amount=-1 +kerning first=107 second=115 amount=-1 +kerning first=253 second=231 amount=-1 +kerning first=66 second=203 amount=-2 +kerning first=243 second=46 amount=-2 +kerning first=1113 second=1076 amount=-1 +kerning first=278 second=218 amount=-1 +kerning first=279 second=46 amount=-2 +kerning first=98 second=8221 amount=-1 +kerning first=230 second=261 amount=-1 +kerning first=79 second=368 amount=-1 +kerning first=266 second=261 amount=-1 +kerning first=197 second=367 amount=-1 +kerning first=366 second=122 amount=-1 +kerning first=302 second=261 amount=-1 +kerning first=375 second=235 amount=-1 +kerning first=338 second=261 amount=-1 +kerning first=334 second=8220 amount=-1 +kerning first=86 second=296 amount=-1 +kerning first=8218 second=218 amount=-2 +kerning first=89 second=261 amount=-2 +kerning first=8250 second=193 amount=-2 +kerning first=330 second=211 amount=-1 +kerning first=370 second=351 amount=-1 +kerning first=68 second=327 amount=-1 +kerning first=226 second=8220 amount=-1 +kerning first=259 second=347 amount=-1 +kerning first=381 second=275 amount=-1 +kerning first=89 second=378 amount=-2 +kerning first=233 second=250 amount=-1 +kerning first=102 second=244 amount=-1 +kerning first=216 second=171 amount=-1 +kerning first=235 second=112 amount=-1 +kerning first=252 second=171 amount=-1 +kerning first=199 second=112 amount=-1 +kerning first=366 second=211 amount=-1 +kerning first=288 second=171 amount=-1 +kerning first=90 second=235 amount=-1 +kerning first=366 second=326 amount=-1 +kerning first=317 second=327 amount=-1 +kerning first=199 second=86 amount=-1 +kerning first=269 second=250 amount=-1 +kerning first=374 second=261 amount=-2 +kerning first=195 second=235 amount=-1 +kerning first=75 second=171 amount=-2 +kerning first=231 second=235 amount=-1 +kerning first=379 second=86 amount=-1 +kerning first=213 second=206 amount=-1 +kerning first=267 second=235 amount=-1 +kerning first=45 second=328 amount=-1 +kerning first=321 second=206 amount=-1 +kerning first=370 second=353 amount=-1 +kerning first=87 second=117 amount=-1 +kerning first=314 second=100 amount=-1 +kerning first=305 second=365 amount=-1 +kerning first=374 second=378 amount=-2 +kerning first=199 second=262 amount=-2 +kerning first=269 second=365 amount=-1 +kerning first=233 second=365 amount=-1 +kerning first=87 second=366 amount=-1 +kerning first=197 second=365 amount=-1 +kerning first=324 second=171 amount=-1 +kerning first=76 second=83 amount=-1 +kerning first=266 second=378 amount=-1 +kerning first=226 second=353 amount=-1 +kerning first=336 second=366 amount=-1 +kerning first=379 second=112 amount=-1 +kerning first=230 second=378 amount=-1 +kerning first=262 second=353 amount=-1 +kerning first=206 second=100 amount=-1 +kerning first=256 second=45 amount=-2 +kerning first=298 second=353 amount=-1 +kerning first=379 second=262 amount=-1 +kerning first=264 second=366 amount=-1 +kerning first=307 second=112 amount=-1 +kerning first=217 second=83 amount=-1 +kerning first=302 second=378 amount=-1 +kerning first=107 second=113 amount=-1 +kerning first=274 second=286 amount=-1 +kerning first=85 second=353 amount=-1 +kerning first=346 second=223 amount=-1 +kerning first=213 second=352 amount=-1 +kerning first=79 second=198 amount=-2 +kerning first=325 second=83 amount=-1 +kerning first=121 second=353 amount=-1 +kerning first=65 second=100 amount=-1 +kerning first=321 second=352 amount=-1 +kerning first=195 second=87 amount=-3 +kerning first=198 second=288 amount=-1 +kerning first=8250 second=305 amount=-1 +kerning first=90 second=87 amount=-1 +kerning first=202 second=223 amount=-1 +kerning first=67 second=233 amount=-1 +kerning first=377 second=365 amount=-1 +kerning first=274 second=223 amount=-1 +kerning first=370 second=379 amount=-1 +kerning first=286 second=304 amount=-1 +kerning first=108 second=324 amount=-1 +kerning first=103 second=233 amount=-1 +kerning first=334 second=379 amount=-1 +kerning first=377 second=339 amount=-1 +kerning first=269 second=339 amount=-1 +kerning first=89 second=289 amount=-2 +kerning first=101 second=305 amount=-1 +kerning first=316 second=233 amount=-1 +kerning first=195 second=89 amount=-3 +kerning first=199 second=114 amount=-1 +kerning first=201 second=249 amount=-1 +kerning first=194 second=289 amount=-1 +kerning first=230 second=289 amount=-1 +kerning first=266 second=289 amount=-1 +kerning first=78 second=99 amount=-1 +kerning first=1070 second=1064 amount=-1 +kerning first=89 second=110 amount=-1 +kerning first=1059 second=1079 amount=-1 +kerning first=67 second=350 amount=-1 +kerning first=313 second=274 amount=-1 +kerning first=375 second=237 amount=-1 +kerning first=379 second=84 amount=-1 +kerning first=339 second=237 amount=-1 +kerning first=1114 second=1114 amount=-1 +kerning first=85 second=379 amount=-1 +kerning first=230 second=110 amount=-1 +kerning first=303 second=237 amount=-1 +kerning first=255 second=99 amount=-1 +kerning first=266 second=110 amount=-1 +kerning first=267 second=237 amount=-1 +kerning first=197 second=339 amount=-1 +kerning first=223 second=187 amount=-1 +kerning first=219 second=99 amount=-1 +kerning first=231 second=237 amount=-1 +kerning first=280 second=350 amount=-1 +kerning first=327 second=99 amount=-1 +kerning first=85 second=381 amount=-1 +kerning first=338 second=110 amount=-1 +kerning first=291 second=99 amount=-1 +kerning first=262 second=379 amount=-1 +kerning first=1048 second=1060 amount=-1 +kerning first=374 second=110 amount=-1 +kerning first=208 second=350 amount=-1 +kerning first=321 second=324 amount=-1 +kerning first=381 second=277 amount=-1 +kerning first=107 second=224 amount=-1 +kerning first=86 second=212 amount=-1 +kerning first=379 second=234 amount=-1 +kerning first=45 second=326 amount=-1 +kerning first=352 second=350 amount=-1 +kerning first=313 second=302 amount=-1 +kerning first=199 second=234 amount=-1 +kerning first=370 second=264 amount=-1 +kerning first=1038 second=1089 amount=-2 +kerning first=347 second=241 amount=-1 +kerning first=212 second=260 amount=-2 +kerning first=336 second=356 amount=-1 +kerning first=298 second=264 amount=-1 +kerning first=302 second=289 amount=-1 +kerning first=262 second=351 amount=-1 +kerning first=262 second=264 amount=-2 +kerning first=278 second=72 amount=-1 +kerning first=284 second=260 amount=-1 +kerning first=45 second=354 amount=-2 +kerning first=338 second=289 amount=-1 +kerning first=226 second=351 amount=-1 +kerning first=377 second=367 amount=-1 +kerning first=90 second=89 amount=-1 +kerning first=81 second=354 amount=-1 +kerning first=374 second=289 amount=-2 +kerning first=350 second=72 amount=-1 +kerning first=356 second=260 amount=-3 +kerning first=1055 second=1054 amount=-1 +kerning first=298 second=351 amount=-1 +kerning first=75 second=199 amount=-1 +kerning first=79 second=76 amount=-1 +kerning first=305 second=367 amount=-1 +kerning first=85 second=351 amount=-1 +kerning first=222 second=354 amount=-1 +kerning first=201 second=364 amount=-1 +kerning first=233 second=367 amount=-1 +kerning first=90 second=209 amount=-1 +kerning first=258 second=354 amount=-3 +kerning first=269 second=367 amount=-1 +kerning first=377 second=110 amount=-1 +kerning first=121 second=351 amount=-1 +kerning first=311 second=111 amount=-1 +kerning first=268 second=8249 amount=-2 +kerning first=78 second=264 amount=-1 +kerning first=304 second=8249 amount=-2 +kerning first=78 second=121 amount=-1 +kerning first=83 second=361 amount=-1 +kerning first=311 second=267 amount=-1 +kerning first=118 second=277 amount=-1 +kerning first=196 second=8249 amount=-2 +kerning first=1030 second=1095 amount=-1 +kerning first=224 second=361 amount=-1 +kerning first=82 second=277 amount=-1 +kerning first=203 second=377 amount=-1 +kerning first=363 second=367 amount=-1 +kerning first=296 second=361 amount=-1 +kerning first=199 second=254 amount=-1 +kerning first=354 second=327 amount=-1 +kerning first=253 second=111 amount=-1 +kerning first=354 second=257 amount=-2 +kerning first=291 second=367 amount=-1 +kerning first=260 second=361 amount=-1 +kerning first=235 second=254 amount=-1 +kerning first=240 second=351 amount=-1 +kerning first=289 second=111 amount=-1 +kerning first=84 second=287 amount=-2 +kerning first=264 second=114 amount=-1 +kerning first=368 second=361 amount=-1 +kerning first=325 second=111 amount=-1 +kerning first=282 second=257 amount=-1 +kerning first=219 second=367 amount=-1 +kerning first=280 second=364 amount=-1 +kerning first=307 second=254 amount=-1 +kerning first=212 second=274 amount=-1 +kerning first=78 second=367 amount=-1 +kerning first=347 second=117 amount=-1 +kerning first=336 second=374 amount=-1 +kerning first=120 second=287 amount=-1 +kerning first=280 second=261 amount=-1 +kerning first=269 second=244 amount=-1 +kerning first=218 second=197 amount=-2 +kerning first=87 second=114 amount=-1 +kerning first=363 second=121 amount=-1 +kerning first=352 second=104 amount=-1 +kerning first=264 second=374 amount=-1 +kerning first=71 second=274 amount=-1 +kerning first=225 second=287 amount=-1 +kerning first=352 second=261 amount=-1 +kerning first=327 second=121 amount=-1 +kerning first=356 second=274 amount=-1 +kerning first=333 second=287 amount=-1 +kerning first=67 second=261 amount=-1 +kerning first=377 second=244 amount=-1 +kerning first=291 second=121 amount=-1 +kerning first=213 second=344 amount=-1 +kerning first=192 second=374 amount=-3 +kerning first=327 second=250 amount=-1 +kerning first=103 second=261 amount=-1 +kerning first=219 second=381 amount=-1 +kerning first=284 second=274 amount=-1 +kerning first=219 second=121 amount=-1 +kerning first=369 second=287 amount=-1 +kerning first=208 second=261 amount=-1 +kerning first=321 second=344 amount=-1 +kerning first=224 second=347 amount=-1 +kerning first=255 second=107 amount=-1 +kerning first=219 second=250 amount=-1 +kerning first=103 second=378 amount=-1 +kerning first=266 second=171 amount=-2 +kerning first=1040 second=1104 amount=-1 +kerning first=119 second=347 amount=-1 +kerning first=291 second=250 amount=-1 +kerning first=289 second=289 amount=-1 +kerning first=83 second=347 amount=-1 +kerning first=291 second=107 amount=-1 +kerning first=379 second=240 amount=-1 +kerning first=338 second=171 amount=-1 +kerning first=1057 second=1047 amount=-1 +kerning first=305 second=250 amount=-1 +kerning first=89 second=171 amount=-3 +kerning first=67 second=378 amount=-1 +kerning first=275 second=117 amount=-1 +kerning first=377 second=230 amount=-1 +kerning first=78 second=250 amount=-1 +kerning first=73 second=199 amount=-1 +kerning first=194 second=171 amount=-2 +kerning first=1118 second=1108 amount=-1 +kerning first=74 second=74 amount=-1 +kerning first=210 second=257 amount=-1 +kerning first=289 second=371 amount=-1 +kerning first=69 second=257 amount=-1 +kerning first=327 second=264 amount=-1 +kerning first=105 second=257 amount=-1 +kerning first=316 second=378 amount=-1 +kerning first=374 second=171 amount=-3 +kerning first=67 second=364 amount=-1 +kerning first=280 second=378 amount=-1 +kerning first=363 second=107 amount=-1 +kerning first=192 second=100 amount=-1 +kerning first=88 second=314 amount=-1 +kerning first=296 second=347 amount=-1 +kerning first=199 second=240 amount=-1 +kerning first=229 second=314 amount=-1 +kerning first=260 second=347 amount=-1 +kerning first=264 second=100 amount=-1 +kerning first=8220 second=253 amount=-1 +kerning first=1048 second=1054 amount=-1 +kerning first=193 second=314 amount=-1 +kerning first=213 second=220 amount=-1 +kerning first=208 second=90 amount=-1 +kerning first=214 second=298 amount=-1 +kerning first=213 second=330 amount=-1 +kerning first=280 second=90 amount=-1 +kerning first=286 second=298 amount=-1 +kerning first=317 second=207 amount=-1 +kerning first=290 second=317 amount=-1 +kerning first=68 second=201 amount=-1 +kerning first=204 second=214 amount=-1 +kerning first=337 second=314 amount=-1 +kerning first=321 second=330 amount=-1 +kerning first=68 second=207 amount=-1 +kerning first=1024 second=1024 amount=-1 +kerning first=367 second=291 amount=-1 +kerning first=331 second=291 amount=-1 +kerning first=362 second=194 amount=-2 +kerning first=321 second=220 amount=-1 +kerning first=295 second=291 amount=-1 +kerning first=90 second=221 amount=-1 +kerning first=258 second=213 amount=-1 +kerning first=269 second=224 amount=-1 +kerning first=259 second=291 amount=-1 +kerning first=99 second=337 amount=-1 +kerning first=122 second=324 amount=-1 +kerning first=290 second=200 amount=-1 +kerning first=233 second=224 amount=-1 +kerning first=272 second=304 amount=-1 +kerning first=86 second=324 amount=-1 +kerning first=217 second=97 amount=-2 +kerning first=200 second=318 amount=-1 +kerning first=187 second=291 amount=-1 +kerning first=8220 second=370 amount=-1 +kerning first=118 second=291 amount=-2 +kerning first=82 second=291 amount=-1 +kerning first=1038 second=1101 amount=-1 +kerning first=325 second=97 amount=-1 +kerning first=321 second=84 amount=-1 +kerning first=353 second=311 amount=-1 +kerning first=78 second=101 amount=-1 +kerning first=366 second=213 amount=-1 +kerning first=377 second=224 amount=-1 +kerning first=235 second=251 amount=-1 +kerning first=8250 second=195 amount=-2 +kerning first=317 second=311 amount=-1 +kerning first=344 second=318 amount=-1 +kerning first=204 second=337 amount=-1 +kerning first=70 second=103 amount=-1 +kerning first=253 second=97 amount=-2 +kerning first=281 second=311 amount=-1 +kerning first=380 second=318 amount=-1 +kerning first=67 second=90 amount=-1 +kerning first=289 second=97 amount=-1 +kerning first=213 second=84 amount=-1 +kerning first=245 second=311 amount=-1 +kerning first=219 second=101 amount=-1 +kerning first=72 second=234 amount=-1 +kerning first=1036 second=1057 amount=-2 +kerning first=103 second=104 amount=-1 +kerning first=255 second=101 amount=-1 +kerning first=281 second=187 amount=-1 +kerning first=108 second=234 amount=-1 +kerning first=68 second=325 amount=-1 +kerning first=362 second=303 amount=-1 +kerning first=67 second=104 amount=-1 +kerning first=291 second=101 amount=-1 +kerning first=254 second=303 amount=-1 +kerning first=1057 second=1041 amount=-1 +kerning first=366 second=227 amount=-2 +kerning first=347 second=249 amount=-1 +kerning first=327 second=101 amount=-1 +kerning first=8250 second=209 amount=-3 +kerning first=380 second=44 amount=-1 +kerning first=330 second=227 amount=-1 +kerning first=200 second=44 amount=-1 +kerning first=321 second=78 amount=-1 +kerning first=280 second=104 amount=-1 +kerning first=86 second=310 amount=-1 +kerning first=263 second=324 amount=-1 +kerning first=213 second=70 amount=-1 +kerning first=381 second=266 amount=-1 +kerning first=244 second=104 amount=-1 +kerning first=245 second=187 amount=-1 +kerning first=272 second=44 amount=-1 +kerning first=371 second=324 amount=-1 +kerning first=236 second=44 amount=-1 +kerning first=317 second=325 amount=-1 +kerning first=381 second=211 amount=-1 +kerning first=117 second=227 amount=-1 +kerning first=290 second=194 amount=-1 +kerning first=105 second=251 amount=-1 +kerning first=213 second=78 amount=-1 +kerning first=81 second=227 amount=-1 +kerning first=69 second=251 amount=-1 +kerning first=1060 second=1024 amount=-1 +kerning first=45 second=227 amount=-1 +kerning first=218 second=194 amount=-2 +kerning first=282 second=251 amount=-1 +kerning first=317 second=201 amount=-1 +kerning first=218 second=303 amount=-1 +kerning first=1101 second=1093 amount=-1 +kerning first=222 second=227 amount=-1 +kerning first=354 second=251 amount=-1 +kerning first=8220 second=233 amount=-1 +kerning first=113 second=303 amount=-1 +kerning first=85 second=237 amount=-1 +kerning first=266 second=118 amount=-1 +kerning first=82 second=283 amount=-1 +kerning first=230 second=118 amount=-1 +kerning first=280 second=370 amount=-1 +kerning first=8250 second=327 amount=-3 +kerning first=255 second=226 amount=-2 +kerning first=264 second=270 amount=-1 +kerning first=302 second=118 amount=-1 +kerning first=352 second=370 amount=-1 +kerning first=262 second=105 amount=-1 +kerning first=89 second=118 amount=-1 +kerning first=260 second=245 amount=-1 +kerning first=192 second=368 amount=-2 +kerning first=121 second=105 amount=-1 +kerning first=310 second=335 amount=-1 +kerning first=71 second=280 amount=-1 +kerning first=194 second=118 amount=-2 +kerning first=87 second=368 amount=-1 +kerning first=382 second=335 amount=-1 +kerning first=87 second=270 amount=-1 +kerning first=323 second=268 amount=-1 +kerning first=118 second=283 amount=-1 +kerning first=85 second=105 amount=-1 +kerning first=212 second=280 amount=-1 +kerning first=316 second=241 amount=-1 +kerning first=336 second=368 amount=-1 +kerning first=218 second=193 amount=-2 +kerning first=68 second=193 amount=-2 +kerning first=280 second=241 amount=-1 +kerning first=368 second=216 amount=-1 +kerning first=67 second=370 amount=-1 +kerning first=67 second=223 amount=-1 +kerning first=228 second=108 amount=-1 +kerning first=264 second=368 amount=-1 +kerning first=1036 second=1083 amount=-1 +kerning first=352 second=241 amount=-1 +kerning first=192 second=108 amount=-1 +kerning first=212 second=87 amount=-1 +kerning first=336 second=270 amount=-1 +kerning first=305 second=254 amount=-1 +kerning first=264 second=108 amount=-1 +kerning first=204 second=228 amount=-1 +kerning first=214 second=278 amount=-1 +kerning first=208 second=370 amount=-1 +kerning first=99 second=228 amount=-1 +kerning first=117 second=353 amount=-1 +kerning first=286 second=278 amount=-1 +kerning first=66 second=89 amount=-2 +kerning first=260 second=231 amount=-1 +kerning first=336 second=122 amount=-1 +kerning first=67 second=241 amount=-1 +kerning first=119 second=231 amount=-1 +kerning first=352 second=356 amount=-1 +kerning first=333 second=107 amount=-1 +kerning first=262 second=304 amount=-1 +kerning first=264 second=122 amount=-1 +kerning first=368 second=231 amount=-1 +kerning first=280 second=356 amount=-1 +kerning first=336 second=73 amount=-1 +kerning first=316 second=255 amount=-1 +kerning first=374 second=116 amount=-1 +kerning first=296 second=231 amount=-1 +kerning first=336 second=256 amount=-2 +kerning first=208 second=356 amount=-1 +kerning first=1052 second=1073 amount=-1 +kerning first=244 second=255 amount=-1 +kerning first=356 second=266 amount=-1 +kerning first=368 second=245 amount=-1 +kerning first=296 second=81 amount=-1 +kerning first=284 second=280 amount=-1 +kerning first=103 second=255 amount=-1 +kerning first=296 second=245 amount=-1 +kerning first=356 second=280 amount=-1 +kerning first=1038 second=1095 amount=-2 +kerning first=370 second=105 amount=-1 +kerning first=277 second=8250 amount=-1 +kerning first=87 second=122 amount=-2 +kerning first=260 second=108 amount=-1 +kerning first=368 second=229 amount=-2 +kerning first=88 second=217 amount=-1 +kerning first=296 second=229 amount=-1 +kerning first=103 second=303 amount=-1 +kerning first=193 second=217 amount=-2 +kerning first=332 second=229 amount=-1 +kerning first=281 second=305 amount=-1 +kerning first=228 second=106 amount=-1 +kerning first=310 second=67 amount=-1 +kerning first=305 second=8220 amount=-1 +kerning first=264 second=106 amount=-1 +kerning first=274 second=67 amount=-1 +kerning first=353 second=305 amount=-1 +kerning first=65 second=346 amount=-2 +kerning first=260 second=81 amount=-1 +kerning first=317 second=305 amount=-1 +kerning first=80 second=282 amount=-1 +kerning first=278 second=346 amount=-1 +kerning first=310 second=333 amount=-1 +kerning first=233 second=230 amount=-1 +kerning first=79 second=204 amount=-1 +kerning first=206 second=346 amount=-1 +kerning first=382 second=333 amount=-1 +kerning first=336 second=106 amount=-1 +kerning first=269 second=230 amount=-1 +kerning first=311 second=281 amount=-1 +kerning first=87 second=256 amount=-3 +kerning first=370 second=224 amount=-1 +kerning first=324 second=316 amount=-1 +kerning first=369 second=307 amount=-1 +kerning first=197 second=79 amount=-1 +kerning first=256 second=218 amount=-2 +kerning first=296 second=243 amount=-1 +kerning first=334 second=352 amount=-1 +kerning first=217 second=99 amount=-1 +kerning first=368 second=243 amount=-1 +kerning first=211 second=69 amount=-1 +kerning first=119 second=243 amount=-1 +kerning first=1039 second=1060 amount=-1 +kerning first=72 second=332 amount=-1 +kerning first=377 second=79 amount=-1 +kerning first=200 second=381 amount=-1 +kerning first=352 second=80 amount=-1 +kerning first=260 second=243 amount=-1 +kerning first=1027 second=1098 amount=-1 +kerning first=311 second=171 amount=-2 +kerning first=83 second=229 amount=-1 +kerning first=336 second=120 amount=-1 +kerning first=221 second=268 amount=-1 +kerning first=321 second=332 amount=-1 +kerning first=88 second=334 amount=-1 +kerning first=79 second=218 amount=-1 +kerning first=87 second=120 amount=-1 +kerning first=374 second=118 amount=-1 +kerning first=193 second=334 amount=-1 +kerning first=84 second=192 amount=-3 +kerning first=119 second=229 amount=-2 +kerning first=228 second=120 amount=-1 +kerning first=8222 second=371 amount=-1 +kerning first=267 second=229 amount=-1 +kerning first=262 second=99 amount=-1 +kerning first=69 second=109 amount=-1 +kerning first=204 second=339 amount=-1 +kerning first=311 second=279 amount=-1 +kerning first=199 second=242 amount=-1 +kerning first=303 second=229 amount=-1 +kerning first=187 second=289 amount=-1 +kerning first=223 second=289 amount=-1 +kerning first=99 second=339 amount=-1 +kerning first=231 second=229 amount=-1 +kerning first=262 second=112 amount=-1 +kerning first=105 second=109 amount=-1 +kerning first=259 second=289 amount=-1 +kerning first=307 second=122 amount=-1 +kerning first=379 second=242 amount=-1 +kerning first=295 second=289 amount=-1 +kerning first=370 second=99 amount=-1 +kerning first=331 second=289 amount=-1 +kerning first=260 second=89 amount=-3 +kerning first=286 second=282 amount=-1 +kerning first=339 second=229 amount=-1 +kerning first=367 second=289 amount=-1 +kerning first=200 second=230 amount=-1 +kerning first=314 second=232 amount=-1 +kerning first=375 second=229 amount=-2 +kerning first=332 second=89 amount=-1 +kerning first=214 second=282 amount=-1 +kerning first=219 second=379 amount=-1 +kerning first=235 second=106 amount=-1 +kerning first=65 second=232 amount=-1 +kerning first=203 second=119 amount=-1 +kerning first=206 second=232 amount=-1 +kerning first=72 second=346 amount=-1 +kerning first=8216 second=261 amount=-1 +kerning first=338 second=75 amount=-1 +kerning first=72 second=111 amount=-1 +kerning first=275 second=119 amount=-1 +kerning first=85 second=99 amount=-1 +kerning first=321 second=346 amount=-1 +kerning first=311 second=119 amount=-1 +kerning first=249 second=307 amount=-1 +kerning first=347 second=119 amount=-1 +kerning first=222 second=364 amount=-1 +kerning first=307 second=106 amount=-1 +kerning first=121 second=99 amount=-1 +kerning first=213 second=346 amount=-1 +kerning first=82 second=289 amount=-1 +kerning first=202 second=209 amount=-1 +kerning first=220 second=212 amount=-1 +kerning first=256 second=212 amount=-1 +kerning first=66 second=87 amount=-2 +kerning first=8220 second=354 amount=-1 +kerning first=8217 second=288 amount=-1 +kerning first=89 second=269 amount=-2 +kerning first=82 second=8249 amount=-2 +kerning first=346 second=209 amount=-1 +kerning first=122 second=316 amount=-1 +kerning first=194 second=269 amount=-1 +kerning first=1058 second=1119 amount=-1 +kerning first=1061 second=1072 amount=-1 +kerning first=274 second=209 amount=-1 +kerning first=302 second=269 amount=-1 +kerning first=227 second=316 amount=-1 +kerning first=8222 second=251 amount=-1 +kerning first=249 second=8220 amount=-2 +kerning first=266 second=269 amount=-1 +kerning first=263 second=316 amount=-1 +kerning first=204 second=79 amount=-1 +kerning first=374 second=269 amount=-2 +kerning first=99 second=291 amount=-1 +kerning first=330 second=288 amount=-1 +kerning first=67 second=229 amount=-1 +kerning first=321 second=76 amount=-1 +kerning first=83 second=89 amount=-1 +kerning first=213 second=72 amount=-1 +kerning first=209 second=199 amount=-1 +kerning first=66 second=274 amount=-2 +kerning first=364 second=212 amount=-1 +kerning first=90 second=229 amount=-1 +kerning first=213 second=76 amount=-1 +kerning first=317 second=199 amount=-1 +kerning first=280 second=368 amount=-1 +kerning first=379 second=365 amount=-1 +kerning first=219 second=109 amount=-1 +kerning first=321 second=72 amount=-1 +kerning first=70 second=216 amount=-1 +kerning first=218 second=192 amount=-2 +kerning first=249 second=226 amount=-1 +kerning first=316 second=102 amount=-1 +kerning first=217 second=245 amount=-1 +kerning first=210 second=8221 amount=-1 +kerning first=205 second=286 amount=-1 +kerning first=236 second=46 amount=-1 +kerning first=321 second=336 amount=-1 +kerning first=105 second=8221 amount=-1 +kerning first=272 second=46 amount=-1 +kerning first=67 second=280 amount=-1 +kerning first=325 second=245 amount=-1 +kerning first=246 second=8221 amount=-1 +kerning first=1043 second=1083 amount=-2 +kerning first=289 second=245 amount=-1 +kerning first=8218 second=84 amount=-3 +kerning first=327 second=266 amount=-1 +kerning first=1027 second=1086 amount=-1 +kerning first=280 second=102 amount=-1 +kerning first=253 second=245 amount=-1 +kerning first=303 second=335 amount=-1 +kerning first=90 second=257 amount=-1 +kerning first=198 second=296 amount=-1 +kerning first=258 second=219 amount=-2 +kerning first=226 second=252 amount=-1 +kerning first=112 second=103 amount=-1 +kerning first=375 second=335 amount=-1 +kerning first=222 second=219 amount=-1 +kerning first=371 second=316 amount=-1 +kerning first=262 second=252 amount=-1 +kerning first=76 second=103 amount=-1 +kerning first=298 second=252 amount=-1 +kerning first=78 second=269 amount=-1 +kerning first=1088 second=1095 amount=-1 +kerning first=72 second=226 amount=-1 +kerning first=195 second=335 amount=-1 +kerning first=81 second=219 amount=-1 +kerning first=108 second=226 amount=-1 +kerning first=290 second=202 amount=-1 +kerning first=231 second=335 amount=-1 +kerning first=45 second=219 amount=-2 +kerning first=85 second=252 amount=-1 +kerning first=267 second=335 amount=-1 +kerning first=213 second=226 amount=-1 +kerning first=76 second=369 amount=-1 +kerning first=282 second=259 amount=-1 +kerning first=291 second=375 amount=-1 +kerning first=103 second=253 amount=-1 +kerning first=379 second=246 amount=-1 +kerning first=354 second=259 amount=-2 +kerning first=381 second=116 amount=-1 +kerning first=219 second=375 amount=-1 +kerning first=1058 second=1113 amount=-1 +kerning first=8220 second=241 amount=-1 +kerning first=105 second=259 amount=-1 +kerning first=244 second=253 amount=-1 +kerning first=104 second=45 amount=-1 +kerning first=325 second=103 amount=-1 +kerning first=280 second=362 amount=-1 +kerning first=69 second=259 amount=-1 +kerning first=370 second=252 amount=-1 +kerning first=289 second=103 amount=-1 +kerning first=210 second=259 amount=-1 +kerning first=363 second=375 amount=-1 +kerning first=253 second=103 amount=-2 +kerning first=352 second=362 amount=-1 +kerning first=199 second=246 amount=-1 +kerning first=352 second=253 amount=-1 +kerning first=83 second=83 amount=-1 +kerning first=217 second=103 amount=-2 +kerning first=221 second=122 amount=-2 +kerning first=219 second=266 amount=-1 +kerning first=264 second=382 amount=-1 +kerning first=354 second=109 amount=-1 +kerning first=116 second=122 amount=-1 +kerning first=208 second=362 amount=-1 +kerning first=336 second=382 amount=-1 +kerning first=67 second=225 amount=-1 +kerning first=260 second=83 amount=-2 +kerning first=8216 second=331 amount=-1 +kerning first=296 second=83 amount=-1 +kerning first=365 second=122 amount=-1 +kerning first=211 second=323 amount=-1 +kerning first=364 second=256 amount=-2 +kerning first=87 second=382 amount=-2 +kerning first=217 second=369 amount=-1 +kerning first=72 second=336 amount=-1 +kerning first=8216 second=65 amount=-4 +kerning first=78 second=375 amount=-1 +kerning first=332 second=83 amount=-1 +kerning first=78 second=266 amount=-1 +kerning first=8220 second=364 amount=-1 +kerning first=325 second=369 amount=-1 +kerning first=368 second=83 amount=-1 +kerning first=289 second=369 amount=-1 +kerning first=282 second=109 amount=-1 +kerning first=67 second=362 amount=-1 +kerning first=67 second=89 amount=-1 +kerning first=231 second=289 amount=-1 +kerning first=1057 second=1055 amount=-1 +kerning first=311 second=273 amount=-1 +kerning first=203 second=104 amount=-1 +kerning first=232 second=241 amount=-1 +kerning first=74 second=233 amount=-1 +kerning first=255 second=115 amount=-1 +kerning first=381 second=263 amount=-1 +kerning first=291 second=115 amount=-1 +kerning first=79 second=330 amount=-1 +kerning first=119 second=355 amount=-1 +kerning first=287 second=233 amount=-1 +kerning first=86 second=198 amount=-3 +kerning first=90 second=223 amount=-1 +kerning first=219 second=115 amount=-1 +kerning first=83 second=355 amount=-1 +kerning first=88 second=213 amount=-1 +kerning first=317 second=313 amount=-1 +kerning first=323 second=233 amount=-1 +kerning first=327 second=115 amount=-1 +kerning first=8216 second=337 amount=-1 +kerning first=193 second=213 amount=-1 +kerning first=85 second=365 amount=-1 +kerning first=363 second=115 amount=-1 +kerning first=260 second=355 amount=-1 +kerning first=74 second=350 amount=-1 +kerning first=214 second=227 amount=-1 +kerning first=1027 second=1090 amount=-1 +kerning first=201 second=110 amount=-1 +kerning first=379 second=248 amount=-1 +kerning first=68 second=313 amount=-1 +kerning first=202 second=325 amount=-1 +kerning first=1050 second=1063 amount=-2 +kerning first=76 second=363 amount=-1 +kerning first=1046 second=1038 amount=-1 +kerning first=197 second=85 amount=-2 +kerning first=45 second=225 amount=-1 +kerning first=274 second=325 amount=-1 +kerning first=84 second=303 amount=-1 +kerning first=81 second=225 amount=-1 +kerning first=363 second=8220 amount=-2 +kerning first=117 second=225 amount=-1 +kerning first=381 second=110 amount=-1 +kerning first=217 second=363 amount=-1 +kerning first=346 second=325 amount=-1 +kerning first=333 second=303 amount=-1 +kerning first=369 second=303 amount=-1 +kerning first=289 second=363 amount=-1 +kerning first=195 second=221 amount=-3 +kerning first=323 second=350 amount=-1 +kerning first=376 second=302 amount=-1 +kerning first=290 second=315 amount=-1 +kerning first=8250 second=207 amount=-3 +kerning first=321 second=338 amount=-1 +kerning first=330 second=225 amount=-1 +kerning first=73 second=290 amount=-1 +kerning first=307 second=98 amount=-1 +kerning first=366 second=225 amount=-2 +kerning first=67 second=102 amount=-1 +kerning first=86 second=196 amount=-3 +kerning first=219 second=260 amount=-2 +kerning first=264 second=380 amount=-1 +kerning first=199 second=98 amount=-1 +kerning first=313 second=286 amount=-1 +kerning first=344 second=46 amount=-1 +kerning first=222 second=225 amount=-1 +kerning first=336 second=380 amount=-1 +kerning first=72 second=338 amount=-1 +kerning first=8220 second=362 amount=-1 +kerning first=380 second=46 amount=-1 +kerning first=69 second=377 amount=-1 +kerning first=298 second=367 amount=-1 +kerning first=1043 second=1077 amount=-1 +kerning first=103 second=307 amount=-1 +kerning first=226 second=367 amount=-1 +kerning first=65 second=352 amount=-2 +kerning first=201 second=261 amount=-1 +kerning first=262 second=367 amount=-1 +kerning first=350 second=86 amount=-1 +kerning first=206 second=352 amount=-1 +kerning first=305 second=351 amount=-1 +kerning first=256 second=210 amount=-1 +kerning first=354 second=111 amount=-2 +kerning first=354 second=325 amount=-1 +kerning first=202 second=327 amount=-1 +kerning first=282 second=377 amount=-1 +kerning first=269 second=351 amount=-1 +kerning first=220 second=210 amount=-1 +kerning first=193 second=211 amount=-1 +kerning first=278 second=352 amount=-1 +kerning first=377 second=351 amount=-1 +kerning first=274 second=327 amount=-1 +kerning first=210 second=377 amount=-1 +kerning first=85 second=367 amount=-1 +kerning first=88 second=211 amount=-1 +kerning first=119 second=235 amount=-1 +kerning first=381 second=261 amount=-1 +kerning first=370 second=250 amount=-1 +kerning first=346 second=327 amount=-1 +kerning first=46 second=171 amount=-1 +kerning first=1072 second=1090 amount=-1 +kerning first=1063 second=1092 amount=-1 +kerning first=82 second=171 amount=-2 +kerning first=65 second=86 amount=-3 +kerning first=260 second=235 amount=-1 +kerning first=118 second=171 amount=-2 +kerning first=264 second=112 amount=-1 +kerning first=198 second=302 amount=-1 +kerning first=296 second=235 amount=-1 +kerning first=196 second=287 amount=-1 +kerning first=226 second=250 amount=-1 +kerning first=278 second=86 amount=-1 +kerning first=368 second=235 amount=-1 +kerning first=268 second=287 amount=-1 +kerning first=298 second=250 amount=-1 +kerning first=1074 second=1103 amount=-1 +kerning first=232 second=287 amount=-1 +kerning first=87 second=112 amount=-1 +kerning first=262 second=250 amount=-1 +kerning first=1038 second=1103 amount=-3 +kerning first=303 second=242 amount=-1 +kerning first=89 second=275 amount=-2 +kerning first=269 second=353 amount=-1 +kerning first=331 second=171 amount=-1 +kerning first=1072 second=1091 amount=-1 +kerning first=304 second=287 amount=-1 +kerning first=255 second=113 amount=-1 +kerning first=305 second=353 amount=-1 +kerning first=367 second=171 amount=-1 +kerning first=219 second=113 amount=-1 +kerning first=376 second=287 amount=-2 +kerning first=377 second=353 amount=-1 +kerning first=85 second=250 amount=-1 +kerning first=370 second=365 amount=-1 +kerning first=83 second=237 amount=-1 +kerning first=298 second=365 amount=-1 +kerning first=197 second=353 amount=-1 +kerning first=200 second=197 amount=-1 +kerning first=259 second=171 amount=-1 +kerning first=379 second=100 amount=-1 +kerning first=201 second=378 amount=-1 +kerning first=262 second=365 amount=-1 +kerning first=199 second=366 amount=-1 +kerning first=327 second=113 amount=-1 +kerning first=233 second=353 amount=-1 +kerning first=295 second=171 amount=-1 +kerning first=226 second=365 amount=-1 +kerning first=350 second=352 amount=-1 +kerning first=272 second=197 amount=-2 +kerning first=332 second=87 amount=-1 +kerning first=258 second=45 amount=-2 +kerning first=199 second=100 amount=-1 +kerning first=260 second=87 amount=-3 +kerning first=103 second=249 amount=-1 +kerning first=87 second=262 amount=-1 +kerning first=374 second=275 amount=-2 +kerning first=313 second=288 amount=-1 +kerning first=375 second=223 amount=-1 +kerning first=266 second=275 amount=-1 +kerning first=45 second=74 amount=-2 +kerning first=352 second=249 amount=-1 +kerning first=192 second=262 amount=-1 +kerning first=302 second=275 amount=-1 +kerning first=81 second=74 amount=-1 +kerning first=8222 second=257 amount=-1 +kerning first=381 second=378 amount=-1 +kerning first=194 second=275 amount=-1 +kerning first=83 second=87 amount=-1 +kerning first=280 second=249 amount=-1 +kerning first=205 second=288 amount=-1 +kerning first=264 second=262 amount=-2 +kerning first=316 second=249 amount=-1 +kerning first=1036 second=1091 amount=-1 +kerning first=364 second=262 amount=-1 +kerning first=200 second=314 amount=-1 +kerning first=222 second=217 amount=-1 +kerning first=264 second=288 amount=-2 +kerning first=258 second=217 amount=-2 +kerning first=89 second=243 amount=-2 +kerning first=236 second=314 amount=-1 +kerning first=194 second=243 amount=-1 +kerning first=344 second=314 amount=-1 +kerning first=379 second=80 amount=-1 +kerning first=325 second=333 amount=-1 +kerning first=289 second=333 amount=-1 +kerning first=87 second=288 amount=-1 +kerning first=380 second=314 amount=-1 +kerning first=192 second=288 amount=-1 +kerning first=120 second=113 amount=-1 +kerning first=66 second=366 amount=-2 +kerning first=245 second=307 amount=-1 +kerning first=310 second=269 amount=-1 +kerning first=108 second=224 amount=-1 +kerning first=8216 second=121 amount=-1 +kerning first=354 second=281 amount=-2 +kerning first=281 second=307 amount=-1 +kerning first=382 second=255 amount=-1 +kerning first=72 second=224 amount=-1 +kerning first=66 second=120 amount=-2 +kerning first=346 second=255 amount=-1 +kerning first=313 second=198 amount=-1 +kerning first=353 second=307 amount=-1 +kerning first=310 second=255 amount=-2 +kerning first=220 second=262 amount=-1 +kerning first=45 second=217 amount=-2 +kerning first=256 second=262 amount=-1 +kerning first=379 second=326 amount=-1 +kerning first=81 second=217 amount=-1 +kerning first=266 second=243 amount=-1 +kerning first=351 second=120 amount=-1 +kerning first=105 second=353 amount=-1 +kerning first=336 second=274 amount=-1 +kerning first=230 second=229 amount=-1 +kerning first=85 second=101 amount=-1 +kerning first=222 second=203 amount=-1 +kerning first=89 second=229 amount=-2 +kerning first=121 second=101 amount=-1 +kerning first=264 second=274 amount=-1 +kerning first=323 second=118 amount=-1 +kerning first=338 second=229 amount=-1 +kerning first=290 second=75 amount=-1 +kerning first=1056 second=1076 amount=-1 +kerning first=364 second=248 amount=-1 +kerning first=287 second=118 amount=-1 +kerning first=243 second=120 amount=-1 +kerning first=374 second=229 amount=-2 +kerning first=262 second=101 amount=-1 +kerning first=45 second=203 amount=-3 +kerning first=256 second=248 amount=-1 +kerning first=279 second=120 amount=-1 +kerning first=266 second=229 amount=-1 +kerning first=298 second=101 amount=-1 +kerning first=81 second=203 amount=-1 +kerning first=66 second=284 amount=-1 +kerning first=315 second=120 amount=-1 +kerning first=302 second=229 amount=-1 +kerning first=200 second=68 amount=-1 +kerning first=370 second=101 amount=-1 +kerning first=199 second=80 amount=-1 +kerning first=110 second=118 amount=-1 +kerning first=328 second=8220 amount=-2 +kerning first=280 second=316 amount=-1 +kerning first=354 second=267 amount=-2 +kerning first=251 second=118 amount=-1 +kerning first=8220 second=85 amount=-1 +kerning first=66 second=106 amount=-1 +kerning first=194 second=242 amount=-1 +kerning first=76 second=73 amount=-1 +kerning first=256 second=8220 amount=-3 +kerning first=346 second=241 amount=-1 +kerning first=315 second=106 amount=-1 +kerning first=351 second=106 amount=-1 +kerning first=74 second=118 amount=-1 +kerning first=120 second=99 amount=-1 +kerning first=115 second=8220 amount=-1 +kerning first=243 second=106 amount=-1 +kerning first=307 second=116 amount=-1 +kerning first=84 second=99 amount=-2 +kerning first=382 second=241 amount=-1 +kerning first=79 second=8220 amount=-1 +kerning first=279 second=106 amount=-1 +kerning first=316 second=363 amount=-1 +kerning first=269 second=111 amount=-1 +kerning first=325 second=361 amount=-1 +kerning first=289 second=361 amount=-1 +kerning first=192 second=316 amount=-1 +kerning first=228 second=316 amount=-1 +kerning first=199 second=66 amount=-1 +kerning first=264 second=316 amount=-1 +kerning first=67 second=368 amount=-1 +kerning first=313 second=212 amount=-1 +kerning first=246 second=8220 amount=-1 +kerning first=374 second=257 amount=-2 +kerning first=278 second=350 amount=-1 +kerning first=205 second=212 amount=-1 +kerning first=197 second=111 amount=-1 +kerning first=208 second=368 amount=-1 +kerning first=287 second=104 amount=-1 +kerning first=115 second=44 amount=-1 +kerning first=251 second=104 amount=-1 +kerning first=69 second=323 amount=-1 +kerning first=200 second=82 amount=-1 +kerning first=220 second=44 amount=-3 +kerning first=1030 second=1057 amount=-1 +kerning first=291 second=275 amount=-1 +kerning first=76 second=361 amount=-1 +kerning first=377 second=111 amount=-1 +kerning first=352 second=368 amount=-1 +kerning first=8216 second=339 amount=-1 +kerning first=311 second=228 amount=-1 +kerning first=79 second=44 amount=-1 +kerning first=290 second=89 amount=-1 +kerning first=210 second=323 amount=-1 +kerning first=379 second=66 amount=-1 +kerning first=87 second=274 amount=-1 +kerning first=266 second=280 amount=-1 +kerning first=1102 second=1113 amount=-1 +kerning first=356 second=250 amount=-1 +kerning first=199 second=326 amount=-1 +kerning first=187 second=205 amount=-3 +kerning first=80 second=278 amount=-1 +kerning first=282 second=323 amount=-1 +kerning first=377 second=97 amount=-1 +kerning first=235 second=326 amount=-1 +kerning first=325 second=347 amount=-1 +kerning first=221 second=278 amount=-1 +kerning first=74 second=378 amount=-1 +kerning first=87 second=302 amount=-1 +kerning first=269 second=97 amount=-1 +kerning first=289 second=347 amount=-1 +kerning first=354 second=323 amount=-1 +kerning first=84 second=362 amount=-1 +kerning first=307 second=326 amount=-1 +kerning first=253 second=347 amount=-1 +kerning first=233 second=371 amount=-1 +kerning first=118 second=233 amount=-1 +kerning first=199 second=354 amount=-1 +kerning first=269 second=371 amount=-1 +kerning first=82 second=233 amount=-1 +kerning first=8216 second=353 amount=-1 +kerning first=284 second=250 amount=-1 +kerning first=305 second=371 amount=-1 +kerning first=112 second=347 amount=-1 +kerning first=76 second=347 amount=-1 +kerning first=68 second=89 amount=-1 +kerning first=323 second=378 amount=-1 +kerning first=217 second=45 amount=-3 +kerning first=254 second=103 amount=-1 +kerning first=287 second=378 amount=-1 +kerning first=338 second=257 amount=-1 +kerning first=218 second=103 amount=-2 +kerning first=289 second=45 amount=-1 +kerning first=253 second=333 amount=-1 +kerning first=71 second=250 amount=-1 +kerning first=253 second=45 amount=-2 +kerning first=217 second=333 amount=-1 +kerning first=1048 second=1092 amount=-1 +kerning first=336 second=302 amount=-1 +kerning first=361 second=45 amount=-1 +kerning first=77 second=103 amount=-1 +kerning first=187 second=219 amount=-2 +kerning first=356 second=264 amount=-1 +kerning first=205 second=226 amount=-1 +kerning first=325 second=45 amount=-2 +kerning first=251 second=378 amount=-1 +kerning first=264 second=302 amount=-1 +kerning first=82 second=219 amount=-1 +kerning first=277 second=226 amount=-1 +kerning first=89 second=257 amount=-2 +kerning first=200 second=110 amount=-1 +kerning first=113 second=363 amount=-1 +kerning first=8216 second=196 amount=-4 +kerning first=212 second=194 amount=-2 +kerning first=79 second=220 amount=-1 +kerning first=70 second=65 amount=-2 +kerning first=236 second=110 amount=-1 +kerning first=377 second=214 amount=-1 +kerning first=71 second=194 amount=-1 +kerning first=218 second=363 amount=-1 +kerning first=1059 second=1089 amount=-2 +kerning first=8220 second=221 amount=-1 +kerning first=205 second=240 amount=-1 +kerning first=315 second=310 amount=-1 +kerning first=1114 second=1078 amount=-1 +kerning first=211 second=65 amount=-2 +kerning first=290 second=363 amount=-1 +kerning first=303 second=259 amount=-1 +kerning first=115 second=318 amount=-1 +kerning first=256 second=220 amount=-2 +kerning first=379 second=284 amount=-1 +kerning first=380 second=110 amount=-1 +kerning first=326 second=363 amount=-1 +kerning first=267 second=259 amount=-1 +kerning first=77 second=117 amount=-1 +kerning first=362 second=363 amount=-1 +kerning first=375 second=259 amount=-2 +kerning first=197 second=214 amount=-1 +kerning first=8250 second=241 amount=-1 +kerning first=339 second=259 amount=-1 +kerning first=256 second=318 amount=-1 +kerning first=354 second=77 amount=-1 +kerning first=264 second=330 amount=-1 +kerning first=196 second=369 amount=-1 +kerning first=90 second=259 amount=-1 +kerning first=328 second=318 amount=-1 +kerning first=282 second=77 amount=-1 +kerning first=370 second=375 amount=-1 +kerning first=268 second=369 amount=-1 +kerning first=231 second=259 amount=-1 +kerning first=232 second=369 amount=-1 +kerning first=356 second=194 amount=-3 +kerning first=1025 second=1030 amount=-1 +kerning first=336 second=330 amount=-1 +kerning first=284 second=194 amount=-1 +kerning first=100 second=254 amount=-1 +kerning first=315 second=324 amount=-1 +kerning first=258 second=374 amount=-3 +kerning first=8250 second=255 amount=-2 +kerning first=85 second=375 amount=-1 +kerning first=79 second=304 amount=-1 +kerning first=279 second=324 amount=-1 +kerning first=222 second=374 amount=-1 +kerning first=332 second=346 amount=-1 +kerning first=8220 second=235 amount=-1 +kerning first=303 second=273 amount=-1 +kerning first=241 second=254 amount=-1 +kerning first=351 second=324 amount=-1 +kerning first=209 second=279 amount=-1 +kerning first=1059 second=1103 amount=-3 +kerning first=381 second=253 amount=-2 +kerning first=298 second=375 amount=-1 +kerning first=87 second=330 amount=-1 +kerning first=231 second=273 amount=-1 +kerning first=81 second=374 amount=-1 +kerning first=218 second=377 amount=-1 +kerning first=45 second=374 amount=-2 +kerning first=304 second=369 amount=-1 +kerning first=226 second=375 amount=-1 +kerning first=121 second=318 amount=-1 +kerning first=376 second=369 amount=-1 +kerning first=256 second=234 amount=-1 +kerning first=199 second=284 amount=-2 +kerning first=1061 second=1058 amount=-1 +kerning first=362 second=377 amount=-1 +kerning first=88 second=332 amount=-1 +kerning first=1025 second=1058 amount=-1 +kerning first=66 second=310 amount=-2 +kerning first=199 second=298 amount=-1 +kerning first=232 second=355 amount=-1 +kerning first=209 second=45 amount=-2 +kerning first=290 second=377 amount=-1 +kerning first=193 second=332 amount=-1 +kerning first=196 second=355 amount=-1 +kerning first=364 second=234 amount=-1 +kerning first=264 second=344 amount=-1 +kerning first=248 second=311 amount=-1 +kerning first=90 second=287 amount=-2 +kerning first=1057 second=1043 amount=-1 +kerning first=376 second=355 amount=-1 +kerning first=1051 second=1077 amount=-1 +kerning first=195 second=287 amount=-1 +kerning first=379 second=298 amount=-1 +kerning first=220 second=234 amount=-1 +kerning first=87 second=344 amount=-1 +kerning first=77 second=363 amount=-1 +kerning first=65 second=242 amount=-1 +kerning first=203 second=313 amount=-1 +kerning first=267 second=287 amount=-1 +kerning first=195 second=8217 amount=-3 +kerning first=280 second=108 amount=-1 +kerning first=220 second=290 amount=-1 +kerning first=362 second=335 amount=-1 +kerning first=231 second=287 amount=-1 +kerning first=231 second=8217 amount=-1 +kerning first=256 second=290 amount=-1 +kerning first=354 second=105 amount=-1 +kerning first=339 second=287 amount=-1 +kerning first=267 second=8217 amount=-1 +kerning first=352 second=108 amount=-1 +kerning first=303 second=287 amount=-1 +kerning first=351 second=380 amount=-1 +kerning first=66 second=338 amount=-1 +kerning first=251 second=353 amount=-1 +kerning first=206 second=242 amount=-1 +kerning first=218 second=335 amount=-1 +kerning first=375 second=287 amount=-2 +kerning first=314 second=242 amount=-1 +kerning first=246 second=105 amount=-1 +kerning first=83 second=315 amount=-1 +kerning first=208 second=197 amount=-2 +kerning first=8218 second=252 amount=-1 +kerning first=105 second=105 amount=-1 +kerning first=1055 second=1060 amount=-1 +kerning first=1101 second=1083 amount=-1 +kerning first=1059 second=1117 amount=-2 +kerning first=243 second=380 amount=-1 +kerning first=89 second=259 amount=-2 +kerning first=280 second=197 amount=-1 +kerning first=279 second=380 amount=-1 +kerning first=201 second=225 amount=-1 +kerning first=77 second=335 amount=-1 +kerning first=78 second=119 amount=-1 +kerning first=377 second=228 amount=-1 +kerning first=315 second=380 amount=-1 +kerning first=379 second=270 amount=-1 +kerning first=113 second=335 amount=-1 +kerning first=1040 second=1038 amount=-2 +kerning first=375 second=231 amount=-1 +kerning first=352 second=197 amount=-2 +kerning first=199 second=270 amount=-1 +kerning first=339 second=8217 amount=-1 +kerning first=66 second=380 amount=-2 +kerning first=332 second=315 amount=-1 +kerning first=219 second=119 amount=-1 +kerning first=269 second=228 amount=-1 +kerning first=244 second=108 amount=-1 +kerning first=102 second=380 amount=-1 +kerning first=80 second=74 amount=-1 +kerning first=255 second=119 amount=-1 +kerning first=233 second=228 amount=-1 +kerning first=291 second=119 amount=-1 +kerning first=365 second=46 amount=-1 +kerning first=244 second=122 amount=-1 +kerning first=90 second=231 amount=-1 +kerning first=377 second=200 amount=-1 +kerning first=66 second=352 amount=-2 +kerning first=221 second=74 amount=-2 +kerning first=208 second=122 amount=-1 +kerning first=363 second=119 amount=-1 +kerning first=1006 second=1007 amount=-1 +kerning first=366 second=346 amount=-1 +kerning first=282 second=103 amount=-1 +kerning first=103 second=122 amount=-1 +kerning first=221 second=46 amount=-3 +kerning first=210 second=77 amount=-1 +kerning first=267 second=231 amount=-1 +kerning first=257 second=46 amount=-1 +kerning first=107 second=337 amount=-1 +kerning first=352 second=122 amount=-1 +kerning first=199 second=256 amount=-2 +kerning first=316 second=122 amount=-1 +kerning first=195 second=231 amount=-1 +kerning first=69 second=77 amount=-1 +kerning first=315 second=352 amount=-1 +kerning first=381 second=225 amount=-1 +kerning first=280 second=122 amount=-1 +kerning first=84 second=344 amount=-1 +kerning first=75 second=350 amount=-1 +kerning first=267 second=245 amount=-1 +kerning first=80 second=46 amount=-2 +kerning first=379 second=256 amount=-1 +kerning first=231 second=245 amount=-1 +kerning first=315 second=366 amount=-1 +kerning first=354 second=192 amount=-3 +kerning first=195 second=245 amount=-1 +kerning first=205 second=367 amount=-1 +kerning first=266 second=45 amount=-2 +kerning first=201 second=211 amount=-1 +kerning first=250 second=102 amount=-1 +kerning first=67 second=122 amount=-1 +kerning first=264 second=278 amount=-1 +kerning first=286 second=102 amount=-1 +kerning first=375 second=245 amount=-1 +kerning first=364 second=290 amount=-1 +kerning first=1063 second=1086 amount=-1 +kerning first=8250 second=227 amount=-1 +kerning first=8220 second=193 amount=-4 +kerning first=303 second=245 amount=-1 +kerning first=199 second=248 amount=-1 +kerning first=221 second=112 amount=-1 +kerning first=283 second=107 amount=-1 +kerning first=76 second=8221 amount=-2 +kerning first=193 second=171 amount=-2 +kerning first=258 second=86 amount=-3 +kerning first=229 second=171 amount=-1 +kerning first=222 second=86 amount=-1 +kerning first=8220 second=368 amount=-1 +kerning first=106 second=107 amount=-1 +kerning first=112 second=8221 amount=-1 +kerning first=347 second=105 amount=-1 +kerning first=88 second=171 amount=-2 +kerning first=275 second=105 amount=-1 +kerning first=316 second=235 amount=-1 +kerning first=8222 second=87 amount=-3 +kerning first=304 second=67 amount=-1 +kerning first=268 second=67 amount=-2 +kerning first=203 second=81 amount=-1 +kerning first=267 second=45 amount=-1 +kerning first=196 second=67 amount=-1 +kerning first=98 second=105 amount=-1 +kerning first=365 second=112 amount=-1 +kerning first=214 second=296 amount=-1 +kerning first=1062 second=1098 amount=-1 +kerning first=369 second=375 amount=-1 +kerning first=81 second=86 amount=-1 +kerning first=370 second=228 amount=-1 +kerning first=286 second=296 amount=-1 +kerning first=75 second=251 amount=-1 +kerning first=45 second=86 amount=-2 +kerning first=99 second=353 amount=-1 +kerning first=1100 second=1097 amount=-1 +kerning first=369 second=122 amount=-1 +kerning first=1036 second=1079 amount=-1 +kerning first=368 second=249 amount=-1 +kerning first=88 second=100 amount=-1 +kerning first=204 second=353 amount=-1 +kerning first=288 second=251 amount=-1 +kerning first=193 second=100 amount=-1 +kerning first=86 second=206 amount=-1 +kerning first=82 second=275 amount=-1 +kerning first=220 second=350 amount=-1 +kerning first=235 second=257 amount=-1 +kerning first=203 second=379 amount=-1 +kerning first=118 second=275 amount=-1 +kerning first=1116 second=1105 amount=-1 +kerning first=262 second=204 amount=-1 +kerning first=73 second=334 amount=-1 +kerning first=376 second=67 amount=-1 +kerning first=334 second=204 amount=-1 +kerning first=354 second=365 amount=-1 +kerning first=378 second=230 amount=-1 +kerning first=274 second=197 amount=-1 +kerning first=67 second=211 amount=-2 +kerning first=218 second=237 amount=-1 +kerning first=83 second=249 amount=-1 +kerning first=278 second=256 amount=-1 +kerning first=8217 second=212 amount=-1 +kerning first=68 second=304 amount=-1 +kerning first=313 second=268 amount=-1 +kerning first=234 second=230 amount=-1 +kerning first=224 second=249 amount=-1 +kerning first=204 second=83 amount=-1 +kerning first=260 second=249 amount=-1 +kerning first=280 second=211 amount=-1 +kerning first=205 second=268 amount=-1 +kerning first=198 second=230 amount=-1 +kerning first=1025 second=1055 amount=-1 +kerning first=350 second=256 amount=-2 +kerning first=288 second=289 amount=-1 +kerning first=70 second=339 amount=-1 +kerning first=381 second=187 amount=-1 +kerning first=199 second=106 amount=-1 +kerning first=324 second=289 amount=-1 +kerning first=122 second=244 amount=-1 +kerning first=203 second=109 amount=-1 +kerning first=352 second=374 amount=-1 +kerning first=211 second=192 amount=-2 +kerning first=278 second=284 amount=-1 +kerning first=45 second=114 amount=-1 +kerning first=275 second=109 amount=-1 +kerning first=290 second=291 amount=-1 +kerning first=263 second=244 amount=-1 +kerning first=317 second=237 amount=-1 +kerning first=206 second=284 amount=-1 +kerning first=88 second=199 amount=-1 +kerning first=370 second=232 amount=-1 +kerning first=70 second=192 amount=-2 +kerning first=281 second=237 amount=-1 +kerning first=8250 second=311 amount=-1 +kerning first=245 second=237 amount=-1 +kerning first=193 second=199 amount=-1 +kerning first=371 second=244 amount=-1 +kerning first=69 second=89 amount=-1 +kerning first=249 second=351 amount=-1 +kerning first=262 second=232 amount=-1 +kerning first=66 second=69 amount=-2 +kerning first=8222 second=361 amount=-1 +kerning first=8217 second=264 amount=-1 +kerning first=368 second=277 amount=-1 +kerning first=221 second=116 amount=-1 +kerning first=298 second=232 amount=-1 +kerning first=85 second=232 amount=-1 +kerning first=193 second=346 amount=-2 +kerning first=260 second=277 amount=-1 +kerning first=219 second=194 amount=-2 +kerning first=216 second=289 amount=-1 +kerning first=317 second=110 amount=-1 +kerning first=328 second=8217 amount=-2 +kerning first=1047 second=1034 amount=-1 +kerning first=121 second=232 amount=-1 +kerning first=296 second=277 amount=-1 +kerning first=81 second=350 amount=-1 +kerning first=268 second=327 amount=-1 +kerning first=203 second=351 amount=-1 +kerning first=198 second=202 amount=-1 +kerning first=311 second=351 amount=-1 +kerning first=45 second=350 amount=-2 +kerning first=240 second=121 amount=-1 +kerning first=378 second=254 amount=-1 +kerning first=119 second=277 amount=-1 +kerning first=275 second=351 amount=-1 +kerning first=258 second=350 amount=-2 +kerning first=376 second=327 amount=-1 +kerning first=70 second=79 amount=-1 +kerning first=1098 second=1102 amount=-1 +kerning first=99 second=121 amount=-1 +kerning first=1044 second=1095 amount=-1 +kerning first=198 second=254 amount=-1 +kerning first=119 second=305 amount=-1 +kerning first=222 second=350 amount=-1 +kerning first=283 second=367 amount=-1 +kerning first=234 second=254 amount=-1 +kerning first=70 second=233 amount=-1 +kerning first=68 second=209 amount=-1 +kerning first=315 second=252 amount=-1 +kerning first=113 second=117 amount=-1 +kerning first=216 second=261 amount=-1 +kerning first=65 second=284 amount=-1 +kerning first=330 second=350 amount=-1 +kerning first=252 second=261 amount=-1 +kerning first=70 second=367 amount=-1 +kerning first=327 second=286 amount=-1 +kerning first=366 second=350 amount=-1 +kerning first=350 second=76 amount=-1 +kerning first=288 second=261 amount=-1 +kerning first=106 second=367 amount=-1 +kerning first=199 second=260 amount=-2 +kerning first=326 second=117 amount=-1 +kerning first=368 second=305 amount=-1 +kerning first=278 second=76 amount=-1 +kerning first=290 second=117 amount=-1 +kerning first=83 second=69 amount=-1 +kerning first=347 second=351 amount=-1 +kerning first=75 second=261 amount=-1 +kerning first=1052 second=1089 amount=-1 +kerning first=221 second=344 amount=-1 +kerning first=193 second=374 amount=-3 +kerning first=362 second=117 amount=-1 +kerning first=295 second=44 amount=-1 +kerning first=8216 second=115 amount=-1 +kerning first=112 second=291 amount=-1 +kerning first=274 second=311 amount=-1 +kerning first=84 second=317 amount=-1 +kerning first=286 second=362 amount=-1 +kerning first=76 second=291 amount=-1 +kerning first=198 second=286 amount=-1 +kerning first=257 second=316 amount=-1 +kerning first=8217 second=268 amount=-1 +kerning first=376 second=331 amount=-1 +kerning first=202 second=311 amount=-1 +kerning first=118 second=271 amount=-1 +kerning first=379 second=260 amount=-1 +kerning first=8220 second=197 amount=-4 +kerning first=344 second=356 amount=-1 +kerning first=354 second=337 amount=-2 +kerning first=280 second=382 amount=-1 +kerning first=365 second=316 amount=-1 +kerning first=316 second=382 amount=-1 +kerning first=272 second=356 amount=-1 +kerning first=352 second=382 amount=-1 +kerning first=214 second=362 amount=-1 +kerning first=268 second=331 amount=-1 +kerning first=1037 second=1057 amount=-1 +kerning first=65 second=252 amount=-1 +kerning first=253 second=337 amount=-1 +kerning first=101 second=252 amount=-1 +kerning first=105 second=361 amount=-1 +kerning first=321 second=266 amount=-1 +kerning first=8218 second=121 amount=-1 +kerning first=1069 second=1056 amount=-1 +kerning first=382 second=311 amount=-1 +kerning first=346 second=311 amount=-1 +kerning first=282 second=361 amount=-1 +kerning first=368 second=45 amount=-3 +kerning first=350 second=252 amount=-1 +kerning first=310 second=227 amount=-1 +kerning first=332 second=45 amount=-1 +kerning first=1058 second=1101 amount=-1 +kerning first=374 second=201 amount=-1 +kerning first=208 second=207 amount=-1 +kerning first=274 second=227 amount=-1 +kerning first=66 second=78 amount=-2 +kerning first=336 second=70 amount=-1 +kerning first=338 second=201 amount=-1 +kerning first=280 second=207 amount=-1 +kerning first=202 second=227 amount=-1 +kerning first=328 second=44 amount=-1 +kerning first=206 second=252 amount=-1 +kerning first=1113 second=1078 amount=-1 +kerning first=224 second=121 amount=-1 +kerning first=278 second=252 amount=-1 +kerning first=67 second=207 amount=-1 +kerning first=382 second=227 amount=-1 +kerning first=327 second=246 amount=-1 +kerning first=364 second=44 amount=-3 +kerning first=314 second=252 amount=-1 +kerning first=346 second=227 amount=-1 +kerning first=291 second=246 amount=-1 +kerning first=231 second=109 amount=-1 +kerning first=89 second=201 amount=-1 +kerning first=200 second=356 amount=-1 +kerning first=80 second=84 amount=-1 +kerning first=103 second=382 amount=-1 +kerning first=255 second=246 amount=-1 +kerning first=198 second=226 amount=-1 +kerning first=355 second=103 amount=-1 +kerning first=65 second=336 amount=-1 +kerning first=222 second=90 amount=-1 +kerning first=1063 second=1104 amount=-1 +kerning first=219 second=246 amount=-1 +kerning first=234 second=226 amount=-1 +kerning first=80 second=267 amount=-1 +kerning first=208 second=382 amount=-1 +kerning first=283 second=103 amount=-1 +kerning first=325 second=291 amount=-1 +kerning first=244 second=382 amount=-1 +kerning first=224 second=45 amount=-1 +kerning first=206 second=336 amount=-1 +kerning first=289 second=291 amount=-1 +kerning first=78 second=246 amount=-1 +kerning first=1047 second=1062 amount=-1 +kerning first=211 second=103 amount=-1 +kerning first=352 second=207 amount=-1 +kerning first=253 second=291 amount=-2 +kerning first=347 second=109 amount=-1 +kerning first=378 second=226 amount=-1 +kerning first=278 second=336 amount=-1 +kerning first=217 second=291 amount=-2 +kerning first=106 second=103 amount=-1 +kerning first=67 second=382 amount=-1 +kerning first=102 second=314 amount=1 +kerning first=317 second=213 amount=-1 +kerning first=74 second=193 amount=-3 +kerning first=121 second=115 amount=-1 +kerning first=81 second=90 amount=-1 +kerning first=253 second=263 amount=-1 +kerning first=45 second=90 amount=-2 +kerning first=82 second=243 amount=-1 +kerning first=289 second=263 amount=-1 +kerning first=279 second=314 amount=-1 +kerning first=118 second=243 amount=-1 +kerning first=325 second=263 amount=-1 +kerning first=243 second=314 amount=-1 +kerning first=85 second=115 amount=-1 +kerning first=88 second=370 amount=-1 +kerning first=76 second=117 amount=-1 +kerning first=87 second=70 amount=-1 +kerning first=351 second=314 amount=-1 +kerning first=298 second=115 amount=-1 +kerning first=200 second=120 amount=-1 +kerning first=315 second=314 amount=-1 +kerning first=236 second=120 amount=-1 +kerning first=282 second=365 amount=-1 +kerning first=376 second=303 amount=-1 +kerning first=226 second=115 amount=-1 +kerning first=272 second=120 amount=-1 +kerning first=268 second=303 amount=-1 +kerning first=76 second=8249 amount=-1 +kerning first=209 second=269 amount=-1 +kerning first=262 second=115 amount=-1 +kerning first=217 second=263 amount=-1 +kerning first=315 second=78 amount=-1 +kerning first=264 second=70 amount=-1 +kerning first=198 second=198 amount=-1 +kerning first=332 second=73 amount=-1 +kerning first=105 second=365 amount=-1 +kerning first=115 second=224 amount=-1 +kerning first=209 second=213 amount=-1 +kerning first=370 second=115 amount=-1 +kerning first=316 second=108 amount=-1 +kerning first=69 second=365 amount=-1 +kerning first=338 second=338 amount=-1 +kerning first=8217 second=240 amount=-2 +kerning first=220 second=224 amount=-1 +kerning first=330 second=118 amount=-1 +kerning first=97 second=255 amount=-1 +kerning first=192 second=98 amount=-1 +kerning first=8250 second=307 amount=-1 +kerning first=194 second=116 amount=-1 +kerning first=264 second=98 amount=-1 +kerning first=361 second=8249 amount=-1 +kerning first=211 second=75 amount=-1 +kerning first=228 second=98 amount=-1 +kerning first=8220 second=227 amount=-1 +kerning first=278 second=280 amount=-1 +kerning first=364 second=224 amount=-1 +kerning first=103 second=235 amount=-1 +kerning first=236 second=328 amount=-1 +kerning first=289 second=8249 amount=-1 +kerning first=1054 second=1048 amount=-1 +kerning first=117 second=118 amount=-1 +kerning first=200 second=328 amount=-1 +kerning first=325 second=8249 amount=-2 +kerning first=1090 second=1076 amount=-1 +kerning first=350 second=280 amount=-1 +kerning first=380 second=120 amount=-1 +kerning first=232 second=303 amount=-1 +kerning first=258 second=118 amount=-2 +kerning first=199 second=232 amount=-1 +kerning first=212 second=65 amount=-2 +kerning first=253 second=8249 amount=-2 +kerning first=197 second=101 amount=-1 +kerning first=1088 second=1093 amount=-1 +kerning first=83 second=73 amount=-1 +kerning first=380 second=328 amount=-1 +kerning first=353 second=241 amount=-1 +kerning first=269 second=101 amount=-1 +kerning first=8216 second=83 amount=-1 +kerning first=256 second=375 amount=-1 +kerning first=193 second=370 amount=-2 +kerning first=196 second=84 amount=-3 +kerning first=45 second=118 amount=-2 +kerning first=1058 second=1073 amount=-1 +kerning first=90 second=325 amount=-1 +kerning first=311 second=226 amount=-1 +kerning first=377 second=101 amount=-1 +kerning first=382 second=283 amount=-1 +kerning first=67 second=324 amount=-1 +kerning first=317 second=241 amount=-1 +kerning first=310 second=283 amount=-1 +kerning first=70 second=196 amount=-2 +kerning first=281 second=241 amount=-1 +kerning first=8250 second=223 amount=-1 +kerning first=339 second=241 amount=-1 +kerning first=213 second=8220 amount=-1 +kerning first=45 second=193 amount=-2 +kerning first=344 second=338 amount=-1 +kerning first=303 second=241 amount=-1 +kerning first=67 second=118 amount=-1 +kerning first=287 second=108 amount=-1 +kerning first=86 second=290 amount=-1 +kerning first=108 second=8220 amount=-2 +kerning first=251 second=108 amount=-1 +kerning first=375 second=241 amount=-1 +kerning first=113 second=345 amount=-1 +kerning first=290 second=85 amount=-1 +kerning first=214 second=380 amount=-1 +kerning first=222 second=193 amount=-2 +kerning first=200 second=338 amount=-1 +kerning first=218 second=345 amount=-1 +kerning first=327 second=71 amount=-1 +kerning first=81 second=193 amount=-2 +kerning first=84 second=335 amount=-2 +kerning first=286 second=380 amount=-1 +kerning first=267 second=241 amount=-1 +kerning first=120 second=335 amount=-1 +kerning first=364 second=286 amount=-1 +kerning first=231 second=241 amount=-1 +kerning first=256 second=286 amount=-1 +kerning first=1069 second=1038 amount=-1 +kerning first=366 second=193 amount=-2 +kerning first=310 second=231 amount=-1 +kerning first=197 second=115 amount=-1 +kerning first=362 second=345 amount=-1 +kerning first=113 second=361 amount=-1 +kerning first=90 second=241 amount=-1 +kerning first=69 second=304 amount=-1 +kerning first=362 second=331 amount=-1 +kerning first=220 second=286 amount=-1 +kerning first=1058 second=1083 amount=-1 +kerning first=1073 second=1113 amount=-1 +kerning first=108 second=248 amount=-1 +kerning first=305 second=115 amount=-1 +kerning first=8216 second=97 amount=-1 +kerning first=272 second=78 amount=-1 +kerning first=76 second=323 amount=-1 +kerning first=110 second=108 amount=-1 +kerning first=233 second=115 amount=-1 +kerning first=218 second=331 amount=-1 +kerning first=72 second=248 amount=-1 +kerning first=278 second=81 amount=-1 +kerning first=382 second=231 amount=-1 +kerning first=269 second=115 amount=-1 +kerning first=74 second=122 amount=-1 +kerning first=267 second=255 amount=-1 +kerning first=272 second=352 amount=-1 +kerning first=231 second=255 amount=-1 +kerning first=113 second=331 amount=-1 +kerning first=105 second=355 amount=-1 +kerning first=382 second=245 amount=-1 +kerning first=195 second=255 amount=-1 +kerning first=344 second=352 amount=-1 +kerning first=115 second=252 amount=-1 +kerning first=310 second=245 amount=-1 +kerning first=251 second=122 amount=-1 +kerning first=1069 second=1052 amount=-1 +kerning first=90 second=255 amount=-2 +kerning first=264 second=298 amount=-1 +kerning first=76 second=77 amount=-1 +kerning first=72 second=262 amount=-1 +kerning first=87 second=278 amount=-1 +kerning first=222 second=207 amount=-1 +kerning first=214 second=366 amount=-1 +kerning first=364 second=252 amount=-1 +kerning first=89 second=233 amount=-2 +kerning first=1059 second=1085 amount=-2 +kerning first=1006 second=997 amount=-1 +kerning first=1058 second=1097 amount=-1 +kerning first=194 second=233 amount=-1 +kerning first=336 second=278 amount=-1 +kerning first=335 second=316 amount=-1 +kerning first=45 second=207 amount=-3 +kerning first=302 second=233 amount=-1 +kerning first=220 second=252 amount=-1 +kerning first=1025 second=1040 amount=-1 +kerning first=81 second=207 amount=-1 +kerning first=266 second=233 amount=-1 +kerning first=351 second=328 amount=-1 +kerning first=256 second=252 amount=-1 +kerning first=202 second=250 amount=-1 +kerning first=374 second=233 amount=-2 +kerning first=200 second=352 amount=-1 +kerning first=315 second=328 amount=-1 +kerning first=279 second=328 amount=-1 +kerning first=328 second=252 amount=-1 +kerning first=66 second=110 amount=-1 +kerning first=296 second=333 amount=-1 +kerning first=250 second=106 amount=-1 +kerning first=286 second=106 amount=-1 +kerning first=282 second=87 amount=-1 +kerning first=199 second=288 amount=-2 +kerning first=368 second=333 amount=-1 +kerning first=227 second=121 amount=-1 +kerning first=330 second=378 amount=-1 +kerning first=210 second=87 amount=-1 +kerning first=279 second=110 amount=-1 +kerning first=119 second=333 amount=-1 +kerning first=69 second=87 amount=-1 +kerning first=315 second=110 amount=-1 +kerning first=260 second=333 amount=-1 +kerning first=351 second=110 amount=-1 +kerning first=366 second=378 amount=-1 +kerning first=377 second=210 amount=-1 +kerning first=217 second=281 amount=-1 +kerning first=376 second=99 amount=-2 +kerning first=218 second=65 amount=-2 +kerning first=8220 second=225 amount=-1 +kerning first=253 second=281 amount=-1 +kerning first=382 second=307 amount=-1 +kerning first=1059 second=1099 amount=-2 +kerning first=8216 second=192 amount=-4 +kerning first=105 second=347 amount=-1 +kerning first=289 second=281 amount=-1 +kerning first=290 second=65 amount=-1 +kerning first=212 second=198 amount=-2 +kerning first=381 second=243 amount=-1 +kerning first=321 second=262 amount=-1 +kerning first=69 second=347 amount=-1 +kerning first=325 second=281 amount=-1 +kerning first=362 second=65 amount=-2 +kerning first=278 second=326 amount=-1 +kerning first=379 second=288 amount=-1 +kerning first=314 second=326 amount=-1 +kerning first=8250 second=237 amount=-1 +kerning first=350 second=326 amount=-1 +kerning first=230 second=249 amount=-1 +kerning first=105 second=351 amount=-1 +kerning first=214 second=120 amount=-1 +kerning first=250 second=120 amount=-1 +kerning first=199 second=274 amount=-1 +kerning first=282 second=261 amount=-1 +kerning first=87 second=80 amount=-1 +kerning first=315 second=68 amount=-1 +kerning first=282 second=73 amount=-1 +kerning first=201 second=229 amount=-1 +kerning first=284 second=198 amount=-1 +kerning first=379 second=274 amount=-1 +kerning first=220 second=346 amount=-1 +kerning first=84 second=377 amount=-1 +kerning first=354 second=73 amount=-1 +kerning first=304 second=99 amount=-1 +kerning first=356 second=198 amount=-3 +kerning first=268 second=99 amount=-1 +kerning first=268 second=113 amount=-1 +kerning first=289 second=267 amount=-1 +kerning first=316 second=118 amount=-1 +kerning first=325 second=267 amount=-1 +kerning first=336 second=80 amount=-1 +kerning first=280 second=118 amount=-1 +kerning first=80 second=263 amount=-1 +kerning first=66 second=68 amount=-2 +kerning first=196 second=113 amount=-1 +kerning first=210 second=73 amount=-1 +kerning first=217 second=267 amount=-1 +kerning first=1058 second=1077 amount=-1 +kerning first=253 second=267 amount=-1 +kerning first=352 second=118 amount=-1 +kerning first=376 second=113 amount=-2 +kerning first=303 second=234 amount=-1 +kerning first=103 second=118 amount=-1 +kerning first=321 second=8220 amount=-2 +kerning first=287 second=107 amount=-1 +kerning first=244 second=118 amount=-1 +kerning first=304 second=113 amount=-1 +kerning first=109 second=106 amount=-1 +kerning first=69 second=73 amount=-1 +kerning first=200 second=332 amount=-1 +kerning first=264 second=80 amount=-1 +kerning first=377 second=196 amount=-1 +kerning first=97 second=287 amount=-1 +kerning first=216 second=219 amount=-1 +kerning first=256 second=244 amount=-1 +kerning first=99 second=111 amount=-1 +kerning first=313 second=264 amount=-1 +kerning first=202 second=287 amount=-1 +kerning first=204 second=111 amount=-1 +kerning first=75 second=219 amount=-1 +kerning first=364 second=244 amount=-1 +kerning first=200 second=86 amount=-1 +kerning first=108 second=242 amount=-1 +kerning first=274 second=287 amount=-1 +kerning first=263 second=234 amount=-1 +kerning first=258 second=199 amount=-1 +kerning first=81 second=364 amount=-1 +kerning first=113 second=339 amount=-1 +kerning first=205 second=264 amount=-1 +kerning first=224 second=8217 amount=-1 +kerning first=45 second=364 amount=-2 +kerning first=8222 second=291 amount=-1 +kerning first=346 second=287 amount=-1 +kerning first=260 second=8217 amount=-3 +kerning first=330 second=199 amount=-1 +kerning first=310 second=287 amount=-1 +kerning first=371 second=234 amount=-1 +kerning first=197 second=121 amount=-1 +kerning first=104 second=289 amount=-1 +kerning first=315 second=334 amount=-1 +kerning first=368 second=262 amount=-1 +kerning first=258 second=364 amount=-2 +kerning first=74 second=197 amount=-3 +kerning first=382 second=287 amount=-1 +kerning first=209 second=289 amount=-1 +kerning first=245 second=289 amount=-1 +kerning first=107 second=254 amount=-1 +kerning first=281 second=289 amount=-1 +kerning first=350 second=66 amount=-1 +kerning first=317 second=289 amount=-1 +kerning first=353 second=289 amount=-1 +kerning first=187 second=209 amount=-3 +kerning first=8250 second=270 amount=-3 +kerning first=85 second=119 amount=-1 +kerning first=121 second=119 amount=-1 +kerning first=220 second=244 amount=-1 +kerning first=8220 second=231 amount=-1 +kerning first=78 second=8249 amount=-2 +kerning first=71 second=330 amount=-1 +kerning first=204 second=97 amount=-1 +kerning first=288 second=205 amount=-1 +kerning first=364 second=230 amount=-2 +kerning first=226 second=119 amount=-1 +kerning first=192 second=354 amount=-3 +kerning first=262 second=119 amount=-1 +kerning first=99 second=97 amount=-1 +kerning first=377 second=121 amount=-2 +kerning first=369 second=117 amount=-1 +kerning first=200 second=72 amount=-1 +kerning first=298 second=119 amount=-1 +kerning first=264 second=354 amount=-1 +kerning first=313 second=250 amount=-1 +kerning first=305 second=121 amount=-1 +kerning first=272 second=72 amount=-1 +kerning first=8216 second=103 amount=-2 +kerning first=220 second=230 amount=-2 +kerning first=370 second=119 amount=-1 +kerning first=336 second=354 amount=-1 +kerning first=277 second=250 amount=-1 +kerning first=269 second=121 amount=-1 +kerning first=79 second=230 amount=-1 +kerning first=1061 second=1054 amount=-2 +kerning first=264 second=74 amount=-1 +kerning first=233 second=121 amount=-1 +kerning first=115 second=230 amount=-1 +kerning first=1025 second=1054 amount=-1 +kerning first=344 second=86 amount=-1 +kerning first=366 second=199 amount=-1 +kerning first=187 second=195 amount=-2 +kerning first=336 second=74 amount=-1 +kerning first=311 second=100 amount=-1 +kerning first=117 second=378 amount=-1 +kerning first=233 second=107 amount=-1 +kerning first=100 second=250 amount=-1 +kerning first=272 second=86 amount=-1 +kerning first=84 second=117 amount=-1 +kerning first=241 second=250 amount=-1 +kerning first=83 second=8217 amount=-1 +kerning first=222 second=378 amount=-1 +kerning first=356 second=240 amount=-2 +kerning first=8216 second=89 amount=-1 +kerning first=8217 second=350 amount=-1 +kerning first=120 second=117 amount=-1 +kerning first=379 second=76 amount=-1 +kerning first=261 second=117 amount=-1 +kerning first=81 second=378 amount=-1 +kerning first=197 second=107 amount=-1 +kerning first=288 second=219 amount=-1 +kerning first=225 second=117 amount=-1 +kerning first=45 second=378 amount=-3 +kerning first=283 second=363 amount=-1 +kerning first=66 second=116 amount=-1 +kerning first=313 second=194 amount=-1 +kerning first=108 second=318 amount=-1 +kerning first=107 second=240 amount=-1 +kerning first=214 second=310 amount=-1 +kerning first=379 second=330 amount=-1 +kerning first=347 second=355 amount=-1 +kerning first=1030 second=1089 amount=-1 +kerning first=249 second=318 amount=-1 +kerning first=298 second=214 amount=-1 +kerning first=8249 second=221 amount=-2 +kerning first=262 second=214 amount=-2 +kerning first=86 second=220 amount=-1 +kerning first=87 second=298 amount=-1 +kerning first=321 second=318 amount=-1 +kerning first=370 second=214 amount=-1 +kerning first=277 second=241 amount=-1 +kerning first=296 second=259 amount=-1 +kerning first=218 second=71 amount=-1 +kerning first=85 second=214 amount=-1 +kerning first=351 second=116 amount=-1 +kerning first=305 second=375 amount=-1 +kerning first=323 second=122 amount=-1 +kerning first=368 second=259 amount=-2 +kerning first=269 second=375 amount=-1 +kerning first=287 second=122 amount=-1 +kerning first=332 second=259 amount=-1 +kerning first=233 second=375 amount=-1 +kerning first=77 second=71 amount=-1 +kerning first=119 second=259 amount=-2 +kerning first=80 second=296 amount=-1 +kerning first=83 second=259 amount=-1 +kerning first=199 second=330 amount=-1 +kerning first=321 second=304 amount=-1 +kerning first=279 second=116 amount=-1 +kerning first=377 second=375 amount=-2 +kerning first=334 second=228 amount=-1 +kerning first=213 second=304 amount=-1 +kerning first=82 second=251 amount=-1 +kerning first=347 second=369 amount=-1 +kerning first=374 second=253 amount=-1 +kerning first=8217 second=115 amount=-1 +kerning first=379 second=344 amount=-1 +kerning first=221 second=296 amount=-1 +kerning first=262 second=228 amount=-1 +kerning first=75 second=279 amount=-1 +kerning first=187 second=251 amount=-1 +kerning first=1039 second=1089 amount=-1 +kerning first=199 second=344 amount=-1 +kerning first=259 second=251 amount=-1 +kerning first=203 second=369 amount=-1 +kerning first=197 second=375 amount=-1 +kerning first=121 second=228 amount=-1 +kerning first=85 second=228 amount=-1 +kerning first=331 second=251 amount=-1 +kerning first=275 second=369 amount=-1 +kerning first=1043 second=1097 amount=-1 +kerning first=295 second=251 amount=-1 +kerning first=368 second=100 amount=-1 +kerning first=86 second=234 amount=-2 +kerning first=198 second=206 amount=-1 +kerning first=367 second=251 amount=-1 +kerning first=119 second=273 amount=-1 +kerning first=122 second=234 amount=-1 +kerning first=89 second=253 amount=-1 +kerning first=264 second=284 amount=-2 +kerning first=70 second=363 amount=-1 +kerning first=194 second=253 amount=-1 +kerning first=192 second=284 amount=-1 +kerning first=106 second=363 amount=-1 +kerning first=230 second=253 amount=-1 +kerning first=211 second=45 amount=-1 +kerning first=263 second=365 amount=-1 +kerning first=275 second=355 amount=-1 +kerning first=87 second=284 amount=-1 +kerning first=70 second=83 amount=-1 +kerning first=302 second=253 amount=-1 +kerning first=8220 second=382 amount=-1 +kerning first=242 second=318 amount=-1 +kerning first=45 second=370 amount=-2 +kerning first=296 second=263 amount=-1 +kerning first=75 second=213 amount=-1 +kerning first=211 second=83 amount=-1 +kerning first=376 second=313 amount=-1 +kerning first=80 second=310 amount=-1 +kerning first=314 second=318 amount=-1 +kerning first=198 second=268 amount=-1 +kerning first=268 second=313 amount=-1 +kerning first=368 second=263 amount=-1 +kerning first=81 second=370 amount=-1 +kerning first=90 second=315 amount=-1 +kerning first=356 second=216 amount=-1 +kerning first=222 second=370 amount=-1 +kerning first=119 second=263 amount=-1 +kerning first=8222 second=105 amount=-1 +kerning first=1114 second=1074 amount=-1 +kerning first=221 second=310 amount=-1 +kerning first=258 second=370 amount=-2 +kerning first=354 second=355 amount=-1 +kerning first=283 second=353 amount=-1 +kerning first=278 second=270 amount=-1 +kerning first=98 second=303 amount=-1 +kerning first=1051 second=1105 amount=-1 +kerning first=103 second=225 amount=-1 +kerning first=347 second=365 amount=-1 +kerning first=1062 second=1060 amount=-1 +kerning first=347 second=303 amount=-1 +kerning first=106 second=353 amount=-1 +kerning first=275 second=365 amount=-1 +kerning first=366 second=118 amount=-1 +kerning first=203 second=365 amount=-1 +kerning first=198 second=220 amount=-1 +kerning first=316 second=225 amount=-1 +kerning first=1025 second=1048 amount=-1 +kerning first=352 second=225 amount=-1 +kerning first=1051 second=1095 amount=-1 +kerning first=365 second=98 amount=-1 +kerning first=1037 second=1105 amount=-1 +kerning first=379 second=280 amount=-1 +kerning first=290 second=259 amount=-1 +kerning first=225 second=8249 amount=-1 +kerning first=362 second=74 amount=-1 +kerning first=350 second=270 amount=-1 +kerning first=327 second=228 amount=-1 +kerning first=8220 second=217 amount=-1 +kerning first=208 second=225 amount=-1 +kerning first=193 second=350 amount=-2 +kerning first=291 second=228 amount=-1 +kerning first=257 second=98 amount=-1 +kerning first=255 second=228 amount=-1 +kerning first=280 second=225 amount=-1 +kerning first=353 second=44 amount=-1 +kerning first=88 second=350 amount=-1 +kerning first=381 second=235 amount=-1 +kerning first=214 second=46 amount=-1 +kerning first=334 second=218 amount=-1 +kerning first=99 second=363 amount=-1 +kerning first=250 second=46 amount=-1 +kerning first=289 second=273 amount=-1 +kerning first=286 second=46 amount=-1 +kerning first=262 second=218 amount=-1 +kerning first=78 second=228 amount=-1 +kerning first=253 second=273 amount=-1 +kerning first=365 second=102 amount=-1 +kerning first=204 second=363 amount=-1 +kerning first=90 second=305 amount=-1 +kerning first=65 second=318 amount=-1 +kerning first=203 second=252 amount=-1 +kerning first=73 second=46 amount=-1 +kerning first=101 second=318 amount=-1 +kerning first=332 second=325 amount=-1 +kerning first=8220 second=122 amount=-1 +kerning first=109 second=46 amount=-1 +kerning first=303 second=305 amount=-1 +kerning first=199 second=280 amount=-1 +kerning first=1057 second=1025 amount=-1 +kerning first=221 second=102 amount=-1 +kerning first=267 second=305 amount=-1 +kerning first=282 second=81 amount=-1 +kerning first=193 second=86 amount=-3 +kerning first=198 second=216 amount=-1 +kerning first=375 second=305 amount=-1 +kerning first=323 second=211 amount=-1 +kerning first=339 second=305 amount=-1 +kerning first=235 second=291 amount=-1 +kerning first=8250 second=287 amount=-1 +kerning first=367 second=261 amount=-1 +kerning first=84 second=67 amount=-1 +kerning first=88 second=86 amount=-1 +kerning first=250 second=112 amount=-1 +kerning first=253 second=230 amount=-2 +kerning first=8217 second=198 amount=-3 +kerning first=278 second=260 amount=-1 +kerning first=203 second=381 amount=-1 +kerning first=187 second=261 amount=-1 +kerning first=350 second=260 amount=-2 +kerning first=192 second=240 amount=-1 +kerning first=216 second=209 amount=-1 +kerning first=344 second=171 amount=-2 +kerning first=84 second=327 amount=-1 +kerning first=380 second=171 amount=-2 +kerning first=283 second=121 amount=-1 +kerning first=377 second=204 amount=-1 +kerning first=376 second=105 amount=-1 +kerning first=268 second=105 amount=-1 +kerning first=277 second=254 amount=-1 +kerning first=330 second=100 amount=-1 +kerning first=69 second=81 amount=-1 +kerning first=200 second=171 amount=-1 +kerning first=313 second=254 amount=-1 +kerning first=368 second=335 amount=-1 +kerning first=366 second=100 amount=-1 +kerning first=236 second=171 amount=-1 +kerning first=288 second=209 amount=-1 +kerning first=232 second=105 amount=-1 +kerning first=272 second=171 amount=-1 +kerning first=231 second=249 amount=-1 +kerning first=200 second=346 amount=-1 +kerning first=263 second=230 amount=-1 +kerning first=267 second=249 amount=-1 +kerning first=86 second=282 amount=-1 +kerning first=122 second=230 amount=-1 +kerning first=66 second=334 amount=-1 +kerning first=268 second=379 amount=-1 +kerning first=258 second=100 amount=-1 +kerning first=195 second=249 amount=-1 +kerning first=70 second=353 amount=-1 +kerning first=344 second=346 amount=-1 +kerning first=86 second=230 amount=-2 +kerning first=353 second=223 amount=-1 +kerning first=103 second=347 amount=-1 +kerning first=303 second=249 amount=-1 +kerning first=272 second=346 amount=-1 +kerning first=68 second=289 amount=-1 +kerning first=1088 second=1103 amount=-1 +kerning first=207 second=334 amount=-1 +kerning first=376 second=379 amount=-1 +kerning first=288 second=380 amount=-1 +kerning first=99 second=107 amount=-1 +kerning first=231 second=113 amount=-1 +kerning first=317 second=223 amount=-1 +kerning first=218 second=339 amount=-1 +kerning first=193 second=244 amount=-1 +kerning first=371 second=230 amount=-1 +kerning first=321 second=256 amount=-1 +kerning first=90 second=249 amount=-1 +kerning first=1052 second=1054 amount=-1 +kerning first=260 second=252 amount=-1 +kerning first=74 second=211 amount=-1 +kerning first=362 second=339 amount=-1 +kerning first=213 second=256 amount=-2 +kerning first=8217 second=250 amount=-1 +kerning first=211 second=89 amount=-1 +kerning first=76 second=69 amount=-1 +kerning first=289 second=255 amount=-1 +kerning first=72 second=44 amount=-1 +kerning first=350 second=374 amount=-1 +kerning first=192 second=84 amount=-3 +kerning first=376 second=109 amount=-1 +kerning first=362 second=79 amount=-1 +kerning first=374 second=187 amount=-1 +kerning first=268 second=109 amount=-1 +kerning first=382 second=237 amount=-1 +kerning first=109 second=314 amount=-1 +kerning first=336 second=84 amount=-1 +kerning first=232 second=109 amount=-1 +kerning first=346 second=237 amount=-1 +kerning first=282 second=8249 amount=-1 +kerning first=1098 second=1116 amount=-1 +kerning first=117 second=104 amount=-1 +kerning first=230 second=187 amount=-1 +kerning first=208 second=217 amount=-1 +kerning first=311 second=99 amount=-1 +kerning first=210 second=8249 amount=-1 +kerning first=45 second=104 amount=-1 +kerning first=280 second=217 amount=-1 +kerning first=250 second=314 amount=-1 +kerning first=353 second=227 amount=-1 +kerning first=105 second=8249 amount=-1 +kerning first=255 second=232 amount=-1 +kerning first=352 second=217 amount=-1 +kerning first=258 second=104 amount=-1 +kerning first=249 second=44 amount=-1 +kerning first=86 second=224 amount=-2 +kerning first=213 second=44 amount=-1 +kerning first=291 second=232 amount=-1 +kerning first=89 second=187 amount=-1 +kerning first=78 second=232 amount=-1 +kerning first=253 second=277 amount=-1 +kerning first=69 second=351 amount=-1 +kerning first=71 second=203 amount=-1 +kerning first=82 second=257 amount=-1 +kerning first=101 second=326 amount=-1 +kerning first=217 second=277 amount=-1 +kerning first=122 second=224 amount=-1 +kerning first=381 second=280 amount=-1 +kerning first=325 second=277 amount=-1 +kerning first=263 second=224 amount=-1 +kerning first=1043 second=1051 amount=-3 +kerning first=289 second=277 amount=-1 +kerning first=221 second=302 amount=-1 +kerning first=354 second=347 amount=-2 +kerning first=99 second=371 amount=-1 +kerning first=313 second=202 amount=-1 +kerning first=354 second=8249 amount=-3 +kerning first=282 second=347 amount=-1 +kerning first=80 second=302 amount=-1 +kerning first=246 second=347 amount=-1 +kerning first=371 second=224 amount=-1 +kerning first=99 second=101 amount=-1 +kerning first=77 second=79 amount=-1 +kerning first=354 second=351 amount=-2 +kerning first=8217 second=194 amount=-3 +kerning first=204 second=101 amount=-1 +kerning first=198 second=212 amount=-1 +kerning first=82 second=261 amount=-1 +kerning first=119 second=267 amount=-1 +kerning first=367 second=257 amount=-1 +kerning first=118 second=261 amount=-2 +kerning first=1113 second=1096 amount=-1 +kerning first=246 second=351 amount=-1 +kerning first=1043 second=1047 amount=-1 +kerning first=368 second=267 amount=-1 +kerning first=204 second=367 amount=-1 +kerning first=260 second=267 amount=-1 +kerning first=228 second=103 amount=-1 +kerning first=187 second=257 amount=-1 +kerning first=350 second=8220 amount=-1 +kerning first=218 second=79 amount=-1 +kerning first=282 second=351 amount=-1 +kerning first=99 second=367 amount=-1 +kerning first=107 second=246 amount=-1 +kerning first=202 second=241 amount=-1 +kerning first=287 second=382 amount=-1 +kerning first=67 second=221 amount=-1 +kerning first=246 second=291 amount=-1 +kerning first=323 second=382 amount=-1 +kerning first=278 second=266 amount=-1 +kerning first=375 second=311 amount=-1 +kerning first=210 second=291 amount=-1 +kerning first=274 second=241 amount=-1 +kerning first=339 second=311 amount=-1 +kerning first=221 second=362 amount=-1 +kerning first=1044 second=1057 amount=-1 +kerning first=331 second=8221 amount=-2 +kerning first=280 second=352 amount=-1 +kerning first=303 second=311 amount=-1 +kerning first=105 second=291 amount=-1 +kerning first=217 second=337 amount=-1 +kerning first=122 second=226 amount=-1 +kerning first=65 second=266 amount=-1 +kerning first=83 second=8221 amount=-1 +kerning first=267 second=311 amount=-1 +kerning first=69 second=291 amount=-1 +kerning first=231 second=311 amount=-1 +kerning first=1069 second=1042 amount=-1 +kerning first=195 second=311 amount=-1 +kerning first=251 second=382 amount=-1 +kerning first=84 second=113 amount=-2 +kerning first=260 second=8221 amount=-3 +kerning first=203 second=361 amount=-1 +kerning first=325 second=337 amount=-1 +kerning first=277 second=316 amount=-1 +kerning first=289 second=337 amount=-1 +kerning first=275 second=361 amount=-1 +kerning first=109 second=316 amount=-1 +kerning first=352 second=221 amount=-1 +kerning first=81 second=368 amount=-1 +kerning first=347 second=361 amount=-1 +kerning first=280 second=221 amount=-1 +kerning first=250 second=316 amount=-1 +kerning first=332 second=8221 amount=-1 +kerning first=122 second=45 amount=-2 +kerning first=336 second=83 amount=-1 +kerning first=84 second=331 amount=-1 +kerning first=208 second=221 amount=-1 +kerning first=45 second=368 amount=-2 +kerning first=200 second=78 amount=-1 +kerning first=258 second=368 amount=-2 +kerning first=219 second=97 amount=-2 +kerning first=204 second=103 amount=-1 +kerning first=249 second=252 amount=-1 +kerning first=231 second=45 amount=-1 +kerning first=199 second=70 amount=-1 +kerning first=83 second=323 amount=-1 +kerning first=377 second=115 amount=-1 +kerning first=68 second=227 amount=-1 +kerning first=195 second=353 amount=-1 +kerning first=99 second=103 amount=-1 +kerning first=222 second=368 amount=-1 +kerning first=376 second=317 amount=-1 +kerning first=72 second=252 amount=-1 +kerning first=281 second=227 amount=-1 +kerning first=375 second=45 amount=-2 +kerning first=108 second=252 amount=-1 +kerning first=379 second=70 amount=-1 +kerning first=86 second=257 amount=-2 +kerning first=209 second=227 amount=-1 +kerning first=332 second=323 amount=-1 +kerning first=303 second=307 amount=-1 +kerning first=199 second=336 amount=-2 +kerning first=377 second=381 amount=-1 +kerning first=268 second=317 amount=-1 +kerning first=356 second=246 amount=-1 +kerning first=187 second=201 amount=-3 +kerning first=371 second=226 amount=-1 +kerning first=255 second=339 amount=-1 +kerning first=193 second=356 amount=-3 +kerning first=8218 second=318 amount=-1 +kerning first=74 second=382 amount=-1 +kerning first=90 second=45 amount=-1 +kerning first=88 second=356 amount=-1 +kerning first=379 second=336 amount=-1 +kerning first=379 second=278 amount=-1 +kerning first=195 second=45 amount=-2 +kerning first=280 second=223 amount=-1 +kerning first=214 second=356 amount=-1 +kerning first=1059 second=1095 amount=-2 +kerning first=117 second=382 amount=-1 +kerning first=236 second=116 amount=-1 +kerning first=203 second=45 amount=-1 +kerning first=113 second=369 amount=-1 +kerning first=268 second=103 amount=-1 +kerning first=205 second=246 amount=-1 +kerning first=279 second=103 amount=-1 +kerning first=222 second=382 amount=-1 +kerning first=218 second=369 amount=-1 +kerning first=196 second=103 amount=-1 +kerning first=344 second=362 amount=-1 +kerning first=347 second=45 amount=-1 +kerning first=82 second=253 amount=-1 +kerning first=311 second=45 amount=-2 +kerning first=77 second=369 amount=-1 +kerning first=45 second=382 amount=-3 +kerning first=81 second=382 amount=-1 +kerning first=187 second=253 amount=-2 +kerning first=90 second=279 amount=-1 +kerning first=245 second=303 amount=-1 +kerning first=204 second=375 amount=-1 +kerning first=200 second=362 amount=-1 +kerning first=69 second=67 amount=-1 +kerning first=363 second=226 amount=-1 +kerning first=84 second=65 amount=-3 +kerning first=222 second=122 amount=-1 +kerning first=195 second=279 amount=-1 +kerning first=232 second=363 amount=-1 +kerning first=99 second=375 amount=-1 +kerning first=272 second=362 amount=-1 +kerning first=1113 second=1102 amount=-1 +kerning first=268 second=363 amount=-1 +kerning first=117 second=122 amount=-1 +kerning first=362 second=109 amount=-1 +kerning first=86 second=266 amount=-1 +kerning first=304 second=363 amount=-1 +kerning first=326 second=369 amount=-1 +kerning first=380 second=116 amount=-1 +kerning first=290 second=369 amount=-1 +kerning first=330 second=382 amount=-1 +kerning first=344 second=116 amount=-1 +kerning first=286 second=356 amount=-1 +kerning first=376 second=363 amount=-1 +kerning first=330 second=122 amount=-1 +kerning first=366 second=382 amount=-1 +kerning first=362 second=369 amount=-1 +kerning first=218 second=109 amount=-1 +kerning first=240 second=375 amount=-1 +kerning first=66 second=298 amount=-2 +kerning first=8222 second=287 amount=-1 +kerning first=1039 second=1095 amount=-1 +kerning first=375 second=279 amount=-1 +kerning first=275 second=305 amount=-1 +kerning first=240 second=115 amount=-1 +kerning first=214 second=370 amount=-1 +kerning first=87 second=336 amount=-1 +kerning first=1047 second=1070 amount=-1 +kerning first=347 second=305 amount=-1 +kerning first=113 second=355 amount=-1 +kerning first=267 second=279 amount=-1 +kerning first=286 second=370 amount=-1 +kerning first=192 second=336 amount=-1 +kerning first=231 second=279 amount=-1 +kerning first=196 second=89 amount=-3 +kerning first=8250 second=261 amount=-1 +kerning first=264 second=336 amount=-2 +kerning first=303 second=279 amount=-1 +kerning first=1069 second=1062 amount=-1 +kerning first=268 second=89 amount=-1 +kerning first=223 second=253 amount=-1 +kerning first=259 second=253 amount=-1 +kerning first=87 second=380 amount=-2 +kerning first=295 second=253 amount=-1 +kerning first=331 second=253 amount=-1 +kerning first=1073 second=1103 amount=-1 +kerning first=367 second=253 amount=-1 +kerning first=286 second=82 amount=-1 +kerning first=80 second=66 amount=-1 +kerning first=1069 second=1048 amount=-1 +kerning first=66 second=332 amount=-1 +kerning first=366 second=230 amount=-2 +kerning first=82 second=225 amount=-1 +kerning first=45 second=108 amount=-1 +kerning first=118 second=225 amount=-2 +kerning first=262 second=196 amount=-2 +kerning first=187 second=225 amount=-1 +kerning first=370 second=196 amount=-2 +kerning first=117 second=108 amount=-1 +kerning first=196 second=335 amount=-1 +kerning first=334 second=196 amount=-2 +kerning first=376 second=75 amount=-1 +kerning first=207 second=332 amount=-1 +kerning first=282 second=315 amount=-1 +kerning first=85 second=196 amount=-2 +kerning first=197 second=116 amount=-1 +kerning first=354 second=315 amount=-1 +kerning first=78 second=115 amount=-1 +kerning first=258 second=108 amount=-1 +kerning first=280 second=203 amount=-1 +kerning first=245 second=8217 amount=-1 +kerning first=208 second=203 amount=-1 +kerning first=321 second=286 amount=-1 +kerning first=220 second=242 amount=-1 +kerning first=317 second=8217 amount=-2 +kerning first=200 second=102 amount=-1 +kerning first=313 second=218 amount=-1 +kerning first=235 second=46 amount=-2 +kerning first=204 second=115 amount=-1 +kerning first=97 second=8221 amount=-1 +kerning first=86 second=269 amount=-2 +kerning first=68 second=8217 amount=-1 +kerning first=256 second=242 amount=-1 +kerning first=209 second=231 amount=-1 +kerning first=307 second=46 amount=-1 +kerning first=364 second=242 amount=-1 +kerning first=99 second=115 amount=-1 +kerning first=367 second=225 amount=-1 +kerning first=67 second=203 amount=-1 +kerning first=218 second=81 amount=-1 +kerning first=72 second=286 amount=-1 +kerning first=217 second=67 amount=-1 +kerning first=231 second=307 amount=-1 +kerning first=267 second=307 amount=-1 +kerning first=209 second=245 amount=-1 +kerning first=197 second=119 amount=-2 +kerning first=199 second=46 amount=-1 +kerning first=85 second=210 amount=-1 +kerning first=76 second=67 amount=-1 +kerning first=81 second=122 amount=-1 +kerning first=233 second=119 amount=-1 +kerning first=8250 second=289 amount=-1 +kerning first=339 second=307 amount=-1 +kerning first=236 second=102 amount=-1 +kerning first=45 second=122 amount=-3 +kerning first=269 second=119 amount=-1 +kerning first=375 second=307 amount=-1 +kerning first=67 second=217 amount=-1 +kerning first=305 second=119 amount=-1 +kerning first=310 second=8221 amount=-1 +kerning first=356 second=74 amount=-2 +kerning first=65 second=8217 amount=-3 +kerning first=263 second=252 amount=-1 +kerning first=376 second=335 amount=-2 +kerning first=377 second=119 amount=-1 +kerning first=1056 second=1062 amount=-1 +kerning first=80 second=344 amount=-1 +kerning first=1047 second=1042 amount=-1 +kerning first=313 second=204 amount=-1 +kerning first=371 second=252 amount=-1 +kerning first=86 second=252 amount=-1 +kerning first=353 second=259 amount=-1 +kerning first=119 second=269 amount=-1 +kerning first=122 second=252 amount=-1 +kerning first=268 second=335 amount=-1 +kerning first=1067 second=1086 amount=-1 +kerning first=325 second=67 amount=-1 +kerning first=304 second=335 amount=-1 +kerning first=77 second=81 amount=-1 +kerning first=227 second=252 amount=-1 +kerning first=105 second=104 amount=-1 +kerning first=333 second=353 amount=-1 +kerning first=296 second=269 amount=-1 +kerning first=337 second=378 amount=-1 +kerning first=369 second=365 amount=-1 +kerning first=369 second=353 amount=-1 +kerning first=260 second=269 amount=-1 +kerning first=65 second=288 amount=-1 +kerning first=346 second=378 amount=-1 +kerning first=368 second=269 amount=-1 +kerning first=198 second=262 amount=-1 +kerning first=261 second=365 amount=-1 +kerning first=351 second=112 amount=-1 +kerning first=251 second=171 amount=-1 +kerning first=225 second=365 amount=-1 +kerning first=315 second=112 amount=-1 +kerning first=225 second=353 amount=-1 +kerning first=287 second=171 amount=-1 +kerning first=8217 second=244 amount=-2 +kerning first=279 second=112 amount=-1 +kerning first=261 second=353 amount=-1 +kerning first=323 second=171 amount=-2 +kerning first=120 second=365 amount=-1 +kerning first=243 second=112 amount=-1 +kerning first=382 second=249 amount=-1 +kerning first=278 second=288 amount=-1 +kerning first=382 second=275 amount=-1 +kerning first=203 second=87 amount=-1 +kerning first=102 second=100 amount=-1 +kerning first=310 second=249 amount=-1 +kerning first=84 second=353 amount=-2 +kerning first=1048 second=1086 amount=-1 +kerning first=310 second=275 amount=-1 +kerning first=120 second=353 amount=-1 +kerning first=207 second=100 amount=-1 +kerning first=80 second=354 amount=-1 +kerning first=221 second=352 amount=-2 +kerning first=370 second=210 amount=-1 +kerning first=201 second=365 amount=-1 +kerning first=82 second=211 amount=-1 +kerning first=88 second=366 amount=-1 +kerning first=266 second=223 amount=-1 +kerning first=1054 second=1052 amount=-1 +kerning first=1098 second=1078 amount=-1 +kerning first=374 second=223 amount=-1 +kerning first=298 second=210 amount=-1 +kerning first=206 second=288 amount=-1 +kerning first=70 second=113 amount=-1 +kerning first=262 second=210 amount=-2 +kerning first=87 second=296 amount=-1 +kerning first=97 second=249 amount=-1 +kerning first=89 second=223 amount=-1 +kerning first=85 second=277 amount=-1 +kerning first=270 second=8220 amount=-1 +kerning first=234 second=8220 amount=-1 +kerning first=264 second=296 amount=-1 +kerning first=278 second=274 amount=-1 +kerning first=274 second=249 amount=-1 +kerning first=97 second=289 amount=-1 +kerning first=1058 second=1079 amount=-1 +kerning first=336 second=296 amount=-1 +kerning first=86 second=370 amount=-1 +kerning first=202 second=249 amount=-1 +kerning first=202 second=289 amount=-1 +kerning first=76 second=327 amount=-1 +kerning first=66 second=114 amount=-1 +kerning first=219 second=198 amount=-2 +kerning first=346 second=8249 amount=-1 +kerning first=374 second=237 amount=-1 +kerning first=310 second=263 amount=-1 +kerning first=382 second=8249 amount=-2 +kerning first=120 second=339 amount=-1 +kerning first=274 second=8249 amount=-1 +kerning first=109 second=363 amount=-1 +kerning first=350 second=274 amount=-1 +kerning first=382 second=263 amount=-1 +kerning first=310 second=8249 amount=-2 +kerning first=210 second=315 amount=-1 +kerning first=266 second=237 amount=-1 +kerning first=202 second=8249 amount=-1 +kerning first=230 second=237 amount=-1 +kerning first=1030 second=1105 amount=-1 +kerning first=84 second=379 amount=-1 +kerning first=97 second=8249 amount=-1 +kerning first=69 second=315 amount=-1 +kerning first=313 second=206 amount=-1 +kerning first=268 second=75 amount=-1 +kerning first=89 second=237 amount=-1 +kerning first=203 second=73 amount=-1 +kerning first=266 second=209 amount=-1 +kerning first=84 second=381 amount=-1 +kerning first=234 second=44 amount=-2 +kerning first=1058 second=1081 amount=-1 +kerning first=378 second=234 amount=-1 +kerning first=77 second=83 amount=-1 +kerning first=78 second=212 amount=-1 +kerning first=323 second=199 amount=-1 +kerning first=230 second=257 amount=-1 +kerning first=70 second=111 amount=-1 +kerning first=310 second=277 amount=-1 +kerning first=66 second=86 amount=-2 +kerning first=218 second=83 amount=-1 +kerning first=8217 second=246 amount=-2 +kerning first=262 second=381 amount=-1 +kerning first=350 second=302 amount=-1 +kerning first=70 second=99 amount=-1 +kerning first=338 second=209 amount=-1 +kerning first=382 second=277 amount=-1 +kerning first=290 second=83 amount=-1 +kerning first=278 second=302 amount=-1 +kerning first=315 second=72 amount=-1 +kerning first=225 second=351 amount=-1 +kerning first=268 second=323 amount=-1 +kerning first=198 second=264 amount=-1 +kerning first=362 second=83 amount=-1 +kerning first=88 second=364 amount=-1 +kerning first=87 second=76 amount=-1 +kerning first=310 second=289 amount=-1 +kerning first=261 second=351 amount=-1 +kerning first=346 second=289 amount=-1 +kerning first=89 second=209 amount=-1 +kerning first=382 second=289 amount=-1 +kerning first=327 second=212 amount=-1 +kerning first=74 second=199 amount=-1 +kerning first=376 second=323 amount=-1 +kerning first=120 second=351 amount=-1 +kerning first=219 second=212 amount=-1 +kerning first=351 second=114 amount=-1 +kerning first=84 second=351 amount=-2 +kerning first=193 second=364 amount=-2 +kerning first=225 second=367 amount=-1 +kerning first=346 second=291 amount=-1 +kerning first=1098 second=1097 amount=-1 +kerning first=261 second=367 amount=-1 +kerning first=209 second=233 amount=-1 +kerning first=78 second=226 amount=-1 +kerning first=66 second=72 amount=-2 +kerning first=120 second=367 amount=-1 +kerning first=274 second=291 amount=-1 +kerning first=274 second=261 amount=-1 +kerning first=212 second=8217 amount=-1 +kerning first=336 second=76 amount=-1 +kerning first=211 second=97 amount=-1 +kerning first=369 second=351 amount=-1 +kerning first=202 second=291 amount=-1 +kerning first=120 second=337 amount=-1 +kerning first=219 second=226 amount=-2 +kerning first=84 second=367 amount=-1 +kerning first=45 second=110 amount=-1 +kerning first=333 second=351 amount=-1 +kerning first=84 second=337 amount=-2 +kerning first=264 second=76 amount=-1 +kerning first=106 second=97 amount=-1 +kerning first=97 second=291 amount=-1 +kerning first=291 second=226 amount=-1 +kerning first=199 second=345 amount=-1 +kerning first=327 second=226 amount=-1 +kerning first=1054 second=1040 amount=-2 +kerning first=74 second=171 amount=-2 +kerning first=65 second=316 amount=-1 +kerning first=8217 second=232 amount=-2 +kerning first=221 second=326 amount=-1 +kerning first=110 second=171 amount=-1 +kerning first=200 second=350 amount=-1 +kerning first=101 second=316 amount=-1 +kerning first=283 second=97 amount=-1 +kerning first=378 second=250 amount=-1 +kerning first=171 second=86 amount=-2 +kerning first=1069 second=1050 amount=-1 +kerning first=1057 second=1064 amount=-1 +kerning first=310 second=261 amount=-1 +kerning first=242 second=316 amount=-1 +kerning first=346 second=261 amount=-1 +kerning first=274 second=87 amount=-1 +kerning first=366 second=110 amount=-1 +kerning first=344 second=350 amount=-1 +kerning first=278 second=316 amount=-1 +kerning first=382 second=261 amount=-1 +kerning first=1113 second=1116 amount=-1 +kerning first=314 second=316 amount=-1 +kerning first=234 second=250 amount=-1 +kerning first=315 second=86 amount=-1 +kerning first=272 second=350 amount=-1 +kerning first=350 second=316 amount=-1 +kerning first=198 second=250 amount=-1 +kerning first=212 second=200 amount=-1 +kerning first=1051 second=1057 amount=-1 +kerning first=99 second=117 amount=-1 +kerning first=290 second=381 amount=-1 +kerning first=69 second=331 amount=-1 +kerning first=204 second=117 amount=-1 +kerning first=362 second=381 amount=-1 +kerning first=376 second=337 amount=-2 +kerning first=105 second=331 amount=-1 +kerning first=201 second=221 amount=-1 +kerning first=356 second=200 amount=-1 +kerning first=282 second=352 amount=-1 +kerning first=213 second=260 amount=-2 +kerning first=284 second=200 amount=-1 +kerning first=321 second=260 amount=-1 +kerning first=75 second=85 amount=-1 +kerning first=376 second=361 amount=-1 +kerning first=268 second=288 amount=-2 +kerning first=97 second=8220 amount=-1 +kerning first=219 second=214 amount=-1 +kerning first=87 second=338 amount=-1 +kerning first=86 second=240 amount=-2 +kerning first=327 second=214 amount=-1 +kerning first=266 second=207 amount=-1 +kerning first=122 second=240 amount=-1 +kerning first=379 second=290 amount=-1 +kerning first=381 second=221 amount=-1 +kerning first=371 second=240 amount=-1 +kerning first=263 second=240 amount=-1 +kerning first=199 second=290 amount=-2 +kerning first=89 second=207 amount=-1 +kerning first=272 second=90 amount=-1 +kerning first=66 second=84 amount=-2 +kerning first=1054 second=1024 amount=-1 +kerning first=350 second=304 amount=-1 +kerning first=214 second=330 amount=-1 +kerning first=377 second=194 amount=-1 +kerning first=313 second=220 amount=-1 +kerning first=330 second=67 amount=-1 +kerning first=69 second=71 amount=-1 +kerning first=213 second=298 amount=-1 +kerning first=278 second=304 amount=-1 +kerning first=67 second=201 amount=-1 +kerning first=375 second=291 amount=-2 +kerning first=216 second=227 amount=-1 +kerning first=339 second=291 amount=-1 +kerning first=76 second=287 amount=-1 +kerning first=67 second=197 amount=-2 +kerning first=1047 second=1030 amount=-1 +kerning first=338 second=207 amount=-1 +kerning first=303 second=291 amount=-1 +kerning first=77 second=97 amount=-1 +kerning first=321 second=298 amount=-1 +kerning first=374 second=207 amount=-1 +kerning first=1037 second=1077 amount=-1 +kerning first=267 second=291 amount=-1 +kerning first=286 second=330 amount=-1 +kerning first=75 second=227 amount=-1 +kerning first=231 second=291 amount=-1 +kerning first=112 second=287 amount=-1 +kerning first=195 second=291 amount=-1 +kerning first=218 second=97 amount=-2 +kerning first=253 second=287 amount=-2 +kerning first=264 second=290 amount=-2 +kerning first=282 second=71 amount=-1 +kerning first=217 second=287 amount=-2 +kerning first=260 second=311 amount=-1 +kerning first=90 second=291 amount=-2 +kerning first=113 second=97 amount=-1 +kerning first=325 second=287 amount=-1 +kerning first=203 second=317 amount=-1 +kerning first=84 second=77 amount=-1 +kerning first=354 second=71 amount=-1 +kerning first=289 second=287 amount=-1 +kerning first=110 second=365 amount=-1 +kerning first=1116 second=1101 amount=-1 +kerning first=362 second=97 amount=-2 +kerning first=119 second=311 amount=-1 +kerning first=221 second=324 amount=-1 +kerning first=304 second=337 amount=-1 +kerning first=83 second=311 amount=-1 +kerning first=200 second=90 amount=-1 +kerning first=290 second=97 amount=-1 +kerning first=1059 second=1107 amount=-2 +kerning first=218 second=381 amount=-1 +kerning first=354 second=204 amount=-1 +kerning first=89 second=197 amount=-3 +kerning first=117 second=120 amount=-1 +kerning first=90 second=263 amount=-1 +kerning first=268 second=365 amount=-1 +kerning first=232 second=365 amount=-1 +kerning first=222 second=120 amount=-1 +kerning first=195 second=263 amount=-1 +kerning first=196 second=365 amount=-1 +kerning first=381 second=193 amount=-1 +kerning first=231 second=263 amount=-1 +kerning first=76 second=325 amount=-1 +kerning first=354 second=303 amount=-1 +kerning first=266 second=197 amount=-2 +kerning first=86 second=268 amount=-1 +kerning first=326 second=353 amount=-1 +kerning first=286 second=70 amount=-1 +kerning first=82 second=213 amount=-1 +kerning first=45 second=120 amount=-2 +kerning first=87 second=310 amount=-1 +kerning first=362 second=353 amount=-1 +kerning first=66 second=74 amount=-2 +kerning first=81 second=120 amount=-1 +kerning first=221 second=78 amount=-1 +kerning first=214 second=70 amount=-1 +kerning first=204 second=113 amount=-1 +kerning first=336 second=310 amount=-1 +kerning first=80 second=78 amount=-1 +kerning first=370 second=262 amount=-1 +kerning first=209 second=275 amount=-1 +kerning first=380 second=118 amount=-1 +kerning first=196 second=248 amount=-1 +kerning first=1007 second=1003 amount=-1 +kerning first=76 second=346 amount=-1 +kerning first=105 second=303 amount=-1 +kerning first=344 second=118 amount=-1 +kerning first=99 second=113 amount=-1 +kerning first=264 second=310 amount=-1 +kerning first=218 second=353 amount=-1 +kerning first=201 second=254 amount=-1 +kerning first=254 second=353 amount=-1 +kerning first=352 second=201 amount=-1 +kerning first=203 second=85 amount=-1 +kerning first=246 second=303 amount=-1 +kerning first=236 second=118 amount=-1 +kerning first=315 second=74 amount=-1 +kerning first=376 second=365 amount=-1 +kerning first=200 second=118 amount=-1 +kerning first=280 second=201 amount=-1 +kerning first=366 second=120 amount=-1 +kerning first=286 second=366 amount=-1 +kerning first=304 second=365 amount=-1 +kerning first=77 second=353 amount=-1 +kerning first=257 second=314 amount=-1 +kerning first=208 second=201 amount=-1 +kerning first=1102 second=1093 amount=-1 +kerning first=266 second=235 amount=-1 +kerning first=195 second=8249 amount=-2 +kerning first=365 second=314 amount=-1 +kerning first=119 second=283 amount=-1 +kerning first=302 second=235 amount=-1 +kerning first=330 second=380 amount=-1 +kerning first=231 second=8249 amount=-1 +kerning first=8216 second=227 amount=-1 +kerning first=366 second=380 amount=-1 +kerning first=90 second=8249 amount=-1 +kerning first=258 second=355 amount=-1 +kerning first=374 second=235 amount=-1 +kerning first=213 second=270 amount=-1 +kerning first=198 second=224 amount=-1 +kerning first=117 second=380 amount=-1 +kerning first=339 second=249 amount=-1 +kerning first=296 second=283 amount=-1 +kerning first=264 second=338 amount=-2 +kerning first=250 second=98 amount=-1 +kerning first=84 second=105 amount=-1 +kerning first=260 second=283 amount=-1 +kerning first=222 second=380 amount=-1 +kerning first=234 second=224 amount=-1 +kerning first=356 second=228 amount=-2 +kerning first=192 second=338 amount=-1 +kerning first=284 second=228 amount=-1 +kerning first=45 second=380 amount=-3 +kerning first=187 second=241 amount=-1 +kerning first=70 second=101 amount=-1 +kerning first=368 second=283 amount=-1 +kerning first=66 second=112 amount=-2 +kerning first=378 second=224 amount=-1 +kerning first=212 second=228 amount=-1 +kerning first=81 second=380 amount=-1 +kerning first=251 second=102 amount=-1 +kerning first=118 second=241 amount=-1 +kerning first=267 second=263 amount=-1 +kerning first=205 second=248 amount=-1 +kerning first=89 second=235 amount=-1 +kerning first=235 second=318 amount=-1 +kerning first=303 second=263 amount=-1 +kerning first=354 second=331 amount=-1 +kerning first=107 second=228 amount=-1 +kerning first=375 second=8249 amount=-2 +kerning first=1025 second=1038 amount=-1 +kerning first=71 second=228 amount=-1 +kerning first=307 second=318 amount=-1 +kerning first=267 second=8249 amount=-1 +kerning first=1061 second=1038 amount=-1 +kerning first=375 second=263 amount=-1 +kerning first=282 second=331 amount=-1 +kerning first=368 second=281 amount=-1 +kerning first=1040 second=1072 amount=-1 +kerning first=352 second=205 amount=-1 +kerning first=220 second=256 amount=-2 +kerning first=356 second=230 amount=-2 +kerning first=80 second=82 amount=-1 +kerning first=213 second=205 amount=-1 +kerning first=1044 second=1073 amount=-1 +kerning first=260 second=281 amount=-1 +kerning first=208 second=205 amount=-1 +kerning first=284 second=230 amount=-1 +kerning first=252 second=255 amount=-1 +kerning first=296 second=281 amount=-1 +kerning first=97 second=251 amount=-1 +kerning first=88 second=108 amount=-1 +kerning first=280 second=205 amount=-1 +kerning first=212 second=230 amount=-1 +kerning first=311 second=347 amount=-1 +kerning first=67 second=205 amount=-1 +kerning first=111 second=255 amount=-1 +kerning first=202 second=251 amount=-1 +kerning first=75 second=8217 amount=-1 +kerning first=275 second=347 amount=-1 +kerning first=75 second=255 amount=-2 +kerning first=307 second=102 amount=-1 +kerning first=111 second=8217 amount=-1 +kerning first=119 second=281 amount=-1 +kerning first=274 second=251 amount=-1 +kerning first=85 second=378 amount=-1 +kerning first=203 second=347 amount=-1 +kerning first=8222 second=303 amount=-1 +kerning first=369 second=107 amount=-1 +kerning first=205 second=216 amount=-1 +kerning first=231 second=8221 amount=-1 +kerning first=369 second=105 amount=-1 +kerning first=98 second=347 amount=-1 +kerning first=267 second=8221 amount=-1 +kerning first=283 second=371 amount=-1 +kerning first=313 second=216 amount=-1 +kerning first=75 second=231 amount=-1 +kerning first=195 second=8221 amount=-3 +kerning first=333 second=105 amount=-1 +kerning first=88 second=106 amount=-1 +kerning first=88 second=368 amount=-1 +kerning first=268 second=333 amount=-1 +kerning first=286 second=68 amount=-1 +kerning first=354 second=67 amount=-1 +kerning first=214 second=68 amount=-1 +kerning first=221 second=80 amount=-1 +kerning first=304 second=333 amount=-1 +kerning first=339 second=8221 amount=-1 +kerning first=347 second=345 amount=-1 +kerning first=88 second=374 amount=-1 +kerning first=207 second=346 amount=-1 +kerning first=201 second=217 amount=-1 +kerning first=79 second=282 amount=-1 +kerning first=352 second=203 amount=-1 +kerning first=193 second=368 amount=-2 +kerning first=196 second=333 amount=-1 +kerning first=229 second=106 amount=-1 +kerning first=66 second=346 amount=-2 +kerning first=209 second=243 amount=-1 +kerning first=71 second=230 amount=-1 +kerning first=71 second=204 amount=-1 +kerning first=107 second=230 amount=-1 +kerning first=315 second=346 amount=-1 +kerning first=212 second=204 amount=-1 +kerning first=337 second=106 amount=-1 +kerning first=119 second=307 amount=-1 +kerning first=8216 second=101 amount=-1 +kerning first=275 second=314 amount=-1 +kerning first=284 second=204 amount=-1 +kerning first=376 second=333 amount=-2 +kerning first=356 second=204 amount=-1 +kerning first=278 second=278 amount=-1 +kerning first=79 second=256 amount=-2 +kerning first=210 second=69 amount=-1 +kerning first=283 second=369 amount=-1 +kerning first=346 second=380 amount=-1 +kerning first=315 second=344 amount=-1 +kerning first=192 second=334 amount=-1 +kerning first=101 second=44 amount=-2 +kerning first=193 second=104 amount=-1 +kerning first=75 second=259 amount=-1 +kerning first=206 second=44 amount=-1 +kerning first=1025 second=1034 amount=-1 +kerning first=106 second=369 amount=-1 +kerning first=315 second=374 amount=-1 +kerning first=69 second=69 amount=-1 +kerning first=70 second=369 amount=-1 +kerning first=377 second=192 amount=-1 +kerning first=337 second=104 amount=-1 +kerning first=72 second=225 amount=-1 +kerning first=288 second=227 amount=-1 +kerning first=252 second=227 amount=-1 +kerning first=296 second=279 amount=-1 +kerning first=364 second=284 amount=-1 +kerning first=75 second=229 amount=-1 +kerning first=256 second=284 amount=-1 +kerning first=356 second=232 amount=-1 +kerning first=1057 second=1054 amount=-1 +kerning first=288 second=229 amount=-1 +kerning first=88 second=104 amount=-1 +kerning first=278 second=44 amount=-1 +kerning first=105 second=305 amount=-1 +kerning first=84 second=109 amount=-1 +kerning first=216 second=229 amount=-1 +kerning first=119 second=279 amount=-1 +kerning first=220 second=284 amount=-1 +kerning first=197 second=250 amount=-1 +kerning first=87 second=334 amount=-1 +kerning first=350 second=44 amount=-2 +kerning first=252 second=229 amount=-1 +kerning first=8250 second=249 amount=-1 +kerning first=252 second=257 amount=-1 +kerning first=225 second=249 amount=-1 +kerning first=268 second=65 amount=-2 +kerning first=106 second=371 amount=-1 +kerning first=288 second=257 amount=-1 +kerning first=267 second=267 amount=-1 +kerning first=303 second=267 amount=-1 +kerning first=216 second=257 amount=-1 +kerning first=8216 second=113 amount=-1 +kerning first=354 second=305 amount=-1 +kerning first=376 second=65 amount=-3 +kerning first=235 second=8250 amount=-1 +kerning first=232 second=361 amount=-1 +kerning first=75 second=257 amount=-1 +kerning first=212 second=202 amount=-1 +kerning first=368 second=279 amount=-1 +kerning first=196 second=361 amount=-1 +kerning first=71 second=202 amount=-1 +kerning first=107 second=232 amount=-1 +kerning first=304 second=361 amount=-1 +kerning first=347 second=347 amount=-1 +kerning first=214 second=209 amount=-1 +kerning first=268 second=361 amount=-1 +kerning first=171 second=374 amount=-2 +kerning first=362 second=121 amount=-1 +kerning first=356 second=202 amount=-1 +kerning first=256 second=254 amount=-1 +kerning first=205 second=244 amount=-1 +kerning first=326 second=121 amount=-1 +kerning first=66 second=374 amount=-2 +kerning first=284 second=202 amount=-1 +kerning first=328 second=254 amount=-1 +kerning first=254 second=121 amount=-1 +kerning first=84 second=79 amount=-1 +kerning first=354 second=69 amount=-1 +kerning first=286 second=66 amount=-1 +kerning first=264 second=171 amount=-2 +kerning first=195 second=267 amount=-1 +kerning first=231 second=267 amount=-1 +kerning first=115 second=254 amount=-1 +kerning first=282 second=69 amount=-1 +kerning first=214 second=66 amount=-1 +kerning first=90 second=267 amount=-1 +kerning first=113 second=121 amount=-1 +kerning first=221 second=82 amount=-1 +kerning first=77 second=121 amount=-1 +kerning first=315 second=82 amount=-1 +kerning first=196 second=79 amount=-1 +kerning first=87 second=66 amount=-1 +kerning first=97 second=8217 amount=-1 +kerning first=73 second=332 amount=-1 +kerning first=1059 second=1119 amount=-2 +kerning first=203 second=69 amount=-1 +kerning first=264 second=66 amount=-1 +kerning first=201 second=209 amount=-1 +kerning first=379 second=302 amount=-1 +kerning first=199 second=316 amount=-1 +kerning first=338 second=205 amount=-1 +kerning first=214 second=72 amount=-1 +kerning first=78 second=216 amount=-1 +kerning first=67 second=199 amount=-2 +kerning first=370 second=192 amount=-2 +kerning first=1098 second=1096 amount=-1 +kerning first=221 second=76 amount=-1 +kerning first=286 second=72 amount=-1 +kerning first=376 second=79 amount=-1 +kerning first=334 second=192 amount=-2 +kerning first=374 second=205 amount=-1 +kerning first=66 second=82 amount=-2 +kerning first=336 second=66 amount=-1 +kerning first=122 second=242 amount=-1 +kerning first=187 second=229 amount=-1 +kerning first=262 second=192 amount=-2 +kerning first=86 second=242 amount=-1 +kerning first=80 second=76 amount=-1 +kerning first=266 second=205 amount=-1 +kerning first=356 second=212 amount=-1 +kerning first=82 second=229 amount=-1 +kerning first=280 second=199 amount=-1 +kerning first=118 second=229 amount=-2 +kerning first=310 second=8217 amount=-1 +kerning first=104 second=8221 amount=-2 +kerning first=212 second=226 amount=-1 +kerning first=263 second=242 amount=-1 +kerning first=202 second=268 amount=-1 +kerning first=290 second=382 amount=-1 +kerning first=89 second=205 amount=-1 +kerning first=371 second=242 amount=-1 +kerning first=284 second=226 amount=-1 +kerning first=68 second=8221 amount=-1 +kerning first=286 second=86 amount=-1 +kerning first=374 second=219 amount=-1 +kerning first=281 second=8221 amount=-1 +kerning first=219 second=216 amount=-1 +kerning first=356 second=226 amount=-2 +kerning first=99 second=119 amount=-1 +kerning first=338 second=219 amount=-1 +kerning first=317 second=8221 amount=-2 +kerning first=1043 second=1033 amount=-3 +kerning first=264 second=326 amount=-1 +kerning first=204 second=119 amount=-1 +kerning first=266 second=219 amount=-1 +kerning first=245 second=8221 amount=-1 +kerning first=327 second=216 amount=-1 +kerning first=240 second=119 amount=-1 +kerning first=235 second=316 amount=-1 +kerning first=1055 second=1092 amount=-1 +kerning first=84 second=103 amount=-2 +kerning first=194 second=219 amount=-2 +kerning first=1091 second=1092 amount=-1 +kerning first=381 second=209 amount=-1 +kerning first=354 second=333 amount=-2 +kerning first=353 second=8221 amount=-1 +kerning first=87 second=326 amount=-1 +kerning first=89 second=219 amount=-1 +kerning first=199 second=302 amount=-1 +kerning first=214 second=86 amount=-1 +kerning first=71 second=226 amount=-1 +kerning first=221 second=334 amount=-1 +kerning first=107 second=226 amount=-1 +kerning first=346 second=259 amount=-1 +kerning first=296 second=289 amount=-1 +kerning first=8217 second=231 amount=-2 +kerning first=378 second=246 amount=-1 +kerning first=310 second=259 amount=-1 +kerning first=369 second=103 amount=-1 +kerning first=90 second=269 amount=-1 +kerning first=84 second=369 amount=-1 +kerning first=75 second=253 amount=-2 +kerning first=333 second=103 amount=-1 +kerning first=231 second=269 amount=-1 +kerning first=84 second=363 amount=-1 +kerning first=382 second=259 amount=-1 +kerning first=111 second=253 amount=-1 +kerning first=337 second=122 amount=-1 +kerning first=69 second=45 amount=-1 +kerning first=195 second=269 amount=-1 +kerning first=120 second=363 amount=-1 +kerning first=287 second=263 amount=-1 +kerning first=1098 second=1082 amount=-1 +kerning first=210 second=45 amount=-1 +kerning first=303 second=269 amount=-1 +kerning first=109 second=112 amount=-1 +kerning first=193 second=116 amount=-1 +kerning first=225 second=103 amount=-1 +kerning first=267 second=269 amount=-1 +kerning first=315 second=362 amount=-1 +kerning first=274 second=259 amount=-1 +kerning first=252 second=253 amount=-1 +kerning first=282 second=45 amount=-1 +kerning first=375 second=269 amount=-1 +kerning first=261 second=363 amount=-1 +kerning first=378 second=252 amount=-1 +kerning first=120 second=103 amount=-1 +kerning first=8250 second=251 amount=-1 +kerning first=66 second=356 amount=-2 +kerning first=66 second=362 amount=-2 +kerning first=1055 second=1086 amount=-1 +kerning first=337 second=382 amount=-1 +kerning first=369 second=363 amount=-1 +kerning first=220 second=266 amount=-1 +kerning first=369 second=369 amount=-1 +kerning first=256 second=266 amount=-1 +kerning first=120 second=369 amount=-1 +kerning first=261 second=369 amount=-1 +kerning first=106 second=375 amount=-1 +kerning first=1116 second=1089 amount=-1 +kerning first=225 second=369 amount=-1 +kerning first=321 second=284 amount=-1 +kerning first=120 second=355 amount=-1 +kerning first=313 second=361 amount=-1 +kerning first=310 second=279 amount=-1 +kerning first=84 second=355 amount=-1 +kerning first=106 second=109 amount=-1 +kerning first=221 second=336 amount=-1 +kerning first=70 second=115 amount=-1 +kerning first=315 second=370 amount=-1 +kerning first=382 second=279 amount=-1 +kerning first=106 second=115 amount=-1 +kerning first=330 second=213 amount=-1 +kerning first=8217 second=214 amount=-1 +kerning first=8222 second=311 amount=-1 +kerning first=79 second=280 amount=-1 +kerning first=378 second=232 amount=-1 +kerning first=283 second=115 amount=-1 +kerning first=199 second=296 amount=-1 +kerning first=1091 second=1086 amount=-1 +kerning first=1054 second=1036 amount=-1 +kerning first=229 second=108 amount=-1 +kerning first=324 second=253 amount=-1 +kerning first=193 second=108 amount=-1 +kerning first=89 second=380 amount=-2 +kerning first=379 second=296 amount=-1 +kerning first=88 second=116 amount=-1 +kerning first=71 second=206 amount=-1 +kerning first=66 second=370 amount=-2 +kerning first=337 second=108 amount=-1 +kerning first=66 second=296 amount=-2 +kerning first=45 second=323 amount=-3 +kerning first=73 second=338 amount=-1 +kerning first=212 second=206 amount=-1 +kerning first=289 second=303 amount=-1 +kerning first=321 second=290 amount=-1 +kerning first=69 second=313 amount=-1 +kerning first=73 second=83 amount=-1 +kerning first=200 second=98 amount=-1 +kerning first=221 second=328 amount=-1 +kerning first=284 second=206 amount=-1 +kerning first=217 second=303 amount=-1 +kerning first=74 second=334 amount=-1 +kerning first=282 second=325 amount=-1 +kerning first=1059 second=1113 amount=-3 +kerning first=356 second=206 amount=-1 +kerning first=89 second=213 amount=-1 +kerning first=84 second=83 amount=-2 +kerning first=266 second=225 amount=-1 +kerning first=380 second=380 amount=-1 +kerning first=380 second=98 amount=-1 +kerning first=344 second=364 amount=-1 +kerning first=79 second=344 amount=-1 +kerning first=302 second=225 amount=-1 +kerning first=219 second=196 amount=-2 +kerning first=376 second=85 amount=-1 +kerning first=203 second=323 amount=-1 +kerning first=338 second=225 amount=-1 +kerning first=1091 second=1077 amount=-1 +kerning first=72 second=290 amount=-1 +kerning first=374 second=225 amount=-2 +kerning first=382 second=273 amount=-1 +kerning first=8222 second=305 amount=-1 +kerning first=89 second=225 amount=-2 +kerning first=236 second=380 amount=-1 +kerning first=236 second=98 amount=-1 +kerning first=1073 second=1093 amount=-1 +kerning first=268 second=85 amount=-1 +kerning first=278 second=286 amount=-1 +kerning first=272 second=380 amount=-1 +kerning first=344 second=98 amount=-1 +kerning first=69 second=325 amount=-1 +kerning first=196 second=85 amount=-2 +kerning first=230 second=225 amount=-1 +kerning first=75 second=233 amount=-1 +kerning first=206 second=286 amount=-1 +kerning first=246 second=311 amount=-1 +kerning first=203 second=77 amount=-1 +kerning first=268 second=71 amount=-2 +kerning first=228 second=46 amount=-1 +kerning first=89 second=211 amount=-1 +kerning first=279 second=102 amount=-1 +kerning first=327 second=210 amount=-1 +kerning first=1113 second=1118 amount=-1 +kerning first=214 second=8217 amount=-1 +kerning first=105 second=311 amount=-1 +kerning first=351 second=102 amount=-1 +kerning first=304 second=71 amount=-1 +kerning first=336 second=46 amount=-1 +kerning first=69 second=311 amount=-1 +kerning first=302 second=210 amount=-1 +kerning first=1047 second=1040 amount=-1 +kerning first=66 second=102 amount=-2 +kerning first=219 second=210 amount=-1 +kerning first=65 second=286 amount=-1 +kerning first=73 second=352 amount=-1 +kerning first=266 second=211 amount=-2 +kerning first=102 second=102 amount=-1 +kerning first=87 second=46 amount=-3 +kerning first=214 second=352 amount=-1 +kerning first=196 second=71 amount=-1 +kerning first=76 second=317 amount=-1 +kerning first=194 second=211 amount=-1 +kerning first=78 second=210 amount=-1 +kerning first=187 second=221 amount=-2 +kerning first=374 second=211 amount=-1 +kerning first=82 second=235 amount=-1 +kerning first=1098 second=1090 amount=-1 +kerning first=82 second=221 amount=-1 +kerning first=118 second=235 amount=-1 +kerning first=302 second=211 amount=-1 +kerning first=198 second=252 amount=-1 +kerning first=236 second=112 amount=-1 +kerning first=344 second=366 amount=-1 +kerning first=338 second=211 amount=-1 +kerning first=234 second=252 amount=-1 +kerning first=200 second=112 amount=-1 +kerning first=207 second=350 amount=-1 +kerning first=334 second=200 amount=-1 +kerning first=1054 second=1042 amount=-1 +kerning first=66 second=350 amount=-2 +kerning first=1062 second=1090 amount=-1 +kerning first=282 second=311 amount=-1 +kerning first=262 second=200 amount=-1 +kerning first=195 second=275 amount=-1 +kerning first=196 second=353 amount=-1 +kerning first=315 second=350 amount=-1 +kerning first=187 second=237 amount=-1 +kerning first=122 second=250 amount=-1 +kerning first=231 second=275 amount=-1 +kerning first=232 second=353 amount=-1 +kerning first=118 second=237 amount=-1 +kerning first=86 second=250 amount=-1 +kerning first=218 second=113 amount=-1 +kerning first=330 second=171 amount=-2 +kerning first=256 second=112 amount=-1 +kerning first=90 second=275 amount=-1 +kerning first=268 second=353 amount=-1 +kerning first=227 second=250 amount=-1 +kerning first=366 second=171 amount=-3 +kerning first=272 second=378 amount=-1 +kerning first=304 second=353 amount=-1 +kerning first=113 second=113 amount=-1 +kerning first=79 second=260 amount=-2 +kerning first=380 second=100 amount=-1 +kerning first=117 second=171 amount=-1 +kerning first=362 second=113 amount=-1 +kerning first=362 second=365 amount=-1 +kerning first=1031 second=1073 amount=-1 +kerning first=380 second=112 amount=-1 +kerning first=222 second=171 amount=-1 +kerning first=326 second=365 amount=-1 +kerning first=200 second=366 amount=-1 +kerning first=344 second=112 amount=-1 +kerning first=258 second=171 amount=-2 +kerning first=213 second=65 amount=-2 +kerning first=286 second=352 amount=-1 +kerning first=268 second=87 amount=-1 +kerning first=281 second=249 amount=-1 +kerning first=8217 second=336 amount=-1 +kerning first=196 second=87 amount=-3 +kerning first=209 second=249 amount=-1 +kerning first=344 second=100 amount=-1 +kerning first=214 second=354 amount=-1 +kerning first=380 second=378 amount=-1 +kerning first=194 second=100 amount=-1 +kerning first=8250 second=257 amount=-1 +kerning first=77 second=113 amount=-1 +kerning first=375 second=275 amount=-1 +kerning first=364 second=260 amount=-2 +kerning first=286 second=354 amount=-1 +kerning first=86 second=262 amount=-1 +kerning first=1047 second=1052 amount=-1 +kerning first=267 second=275 amount=-1 +kerning first=1073 second=1091 amount=-1 +kerning first=303 second=275 amount=-1 +kerning first=72 second=288 amount=-1 +kerning first=1116 second=1077 amount=-1 +kerning first=85 second=198 amount=-2 +kerning first=268 second=339 amount=-1 +kerning first=371 second=248 amount=-1 +kerning first=211 second=377 amount=-1 +kerning first=90 second=289 amount=-2 +kerning first=304 second=339 amount=-1 +kerning first=263 second=248 amount=-1 +kerning first=8216 second=229 amount=-1 +kerning first=196 second=339 amount=-1 +kerning first=362 second=99 amount=-1 +kerning first=195 second=289 amount=-1 +kerning first=69 second=327 amount=-1 +kerning first=118 second=223 amount=-1 +kerning first=371 second=8220 amount=-2 +kerning first=104 second=249 amount=-1 +kerning first=335 second=8220 amount=-1 +kerning first=267 second=289 amount=-1 +kerning first=321 second=288 amount=-1 +kerning first=86 second=248 amount=-2 +kerning first=303 second=289 amount=-1 +kerning first=210 second=327 amount=-1 +kerning first=122 second=248 amount=-1 +kerning first=187 second=223 amount=-1 +kerning first=263 second=8220 amount=-1 +kerning first=376 second=339 amount=-2 +kerning first=74 second=223 amount=-1 +kerning first=83 second=287 amount=-1 +kerning first=354 second=313 amount=-1 +kerning first=376 second=73 amount=-1 +kerning first=282 second=327 amount=-1 +kerning first=209 second=263 amount=-1 +kerning first=218 second=365 amount=-1 +kerning first=213 second=274 amount=-1 +kerning first=77 second=99 amount=-1 +kerning first=282 second=313 amount=-1 +kerning first=76 second=315 amount=-1 +kerning first=1069 second=1064 amount=-1 +kerning first=119 second=287 amount=-2 +kerning first=367 second=237 amount=-1 +kerning first=113 second=365 amount=-1 +kerning first=290 second=379 amount=-1 +kerning first=260 second=287 amount=-1 +kerning first=210 second=313 amount=-1 +kerning first=262 second=198 amount=-2 +kerning first=203 second=75 amount=-1 +kerning first=77 second=365 amount=-1 +kerning first=376 second=353 amount=-2 +kerning first=224 second=287 amount=-1 +kerning first=113 second=99 amount=-1 +kerning first=89 second=44 amount=-3 +kerning first=268 second=73 amount=-1 +kerning first=362 second=379 amount=-1 +kerning first=332 second=287 amount=-1 +kerning first=334 second=198 amount=-2 +kerning first=321 second=274 amount=-1 +kerning first=296 second=287 amount=-1 +kerning first=218 second=99 amount=-1 +kerning first=223 second=237 amount=-1 +kerning first=370 second=198 amount=-2 +kerning first=1102 second=1103 amount=-1 +kerning first=244 second=187 amount=-1 +kerning first=307 second=44 amount=-1 +kerning first=200 second=104 amount=-1 +kerning first=368 second=287 amount=-2 +kerning first=205 second=234 amount=-1 +kerning first=252 second=237 amount=-1 +kerning first=1116 second=1091 amount=-1 +kerning first=66 second=354 amount=-2 +kerning first=344 second=104 amount=-1 +kerning first=111 second=237 amount=-1 +kerning first=171 second=354 amount=-2 +kerning first=235 second=44 amount=-2 +kerning first=344 second=374 amount=-1 +kerning first=1098 second=1084 amount=-1 +kerning first=199 second=44 amount=-1 +kerning first=236 second=104 amount=-1 +kerning first=303 second=277 amount=-1 +kerning first=113 second=111 amount=-1 +kerning first=267 second=277 amount=-1 +kerning first=274 second=77 amount=-1 +kerning first=381 second=197 amount=-1 +kerning first=111 second=120 amount=-1 +kerning first=187 second=227 amount=-1 +kerning first=262 second=194 amount=-2 +kerning first=375 second=277 amount=-1 +kerning first=315 second=354 amount=-1 +kerning first=118 second=227 amount=-2 +kerning first=218 second=111 amount=-1 +kerning first=8250 second=259 amount=-1 +kerning first=82 second=227 amount=-1 +kerning first=367 second=227 amount=-1 +kerning first=90 second=277 amount=-1 +kerning first=1040 second=1054 amount=-2 +kerning first=85 second=194 amount=-2 +kerning first=231 second=277 amount=-1 +kerning first=192 second=314 amount=-1 +kerning first=214 second=74 amount=-1 +kerning first=195 second=277 amount=-1 +kerning first=77 second=111 amount=-1 +kerning first=1048 second=1104 amount=-1 +kerning first=376 second=351 amount=-2 +kerning first=264 second=314 amount=-1 +kerning first=362 second=367 amount=-1 +kerning first=332 second=8249 amount=-1 +kerning first=227 second=249 amount=-1 +kerning first=120 second=361 amount=-1 +kerning first=228 second=314 amount=-1 +kerning first=368 second=8249 amount=-3 +kerning first=261 second=361 amount=-1 +kerning first=314 second=122 amount=-1 +kerning first=68 second=261 amount=-1 +kerning first=290 second=367 amount=-1 +kerning first=260 second=8249 amount=-2 +kerning first=106 second=121 amount=-1 +kerning first=66 second=364 amount=-2 +kerning first=203 second=327 amount=-1 +kerning first=353 second=257 amount=-1 +kerning first=326 second=367 amount=-1 +kerning first=1037 second=1089 amount=-1 +kerning first=232 second=351 amount=-1 +kerning first=263 second=254 amount=-1 +kerning first=196 second=351 amount=-1 +kerning first=281 second=257 amount=-1 +kerning first=224 second=8249 amount=-1 +kerning first=304 second=351 amount=-1 +kerning first=113 second=367 amount=-1 +kerning first=202 second=260 amount=-1 +kerning first=83 second=8249 amount=-1 +kerning first=369 second=361 amount=-1 +kerning first=268 second=351 amount=-1 +kerning first=209 second=257 amount=-1 +kerning first=119 second=8249 amount=-2 +kerning first=371 second=254 amount=-1 +kerning first=205 second=224 amount=-1 +kerning first=283 second=117 amount=-1 +kerning first=272 second=374 amount=-1 +kerning first=353 second=261 amount=-1 +kerning first=79 second=274 amount=-1 +kerning first=8217 second=226 amount=-3 +kerning first=122 second=254 amount=-1 +kerning first=277 second=224 amount=-1 +kerning first=203 second=367 amount=-1 +kerning first=200 second=374 amount=-1 +kerning first=378 second=244 amount=-1 +kerning first=81 second=171 amount=-1 +kerning first=227 second=254 amount=-1 +kerning first=286 second=344 amount=-1 +kerning first=1058 second=1057 amount=-1 +kerning first=209 second=261 amount=-1 +kerning first=263 second=250 amount=-1 +kerning first=84 second=361 amount=-1 +kerning first=371 second=250 amount=-1 +kerning first=281 second=261 amount=-1 +kerning first=77 second=101 amount=-1 +kerning first=338 second=221 amount=-1 +kerning first=113 second=101 amount=-1 +kerning first=311 second=337 amount=-1 +kerning first=378 second=240 amount=-1 +kerning first=347 second=331 amount=-1 +kerning first=266 second=221 amount=-1 +kerning first=218 second=101 amount=-1 +kerning first=275 second=331 amount=-1 +kerning first=1054 second=1038 amount=-1 +kerning first=369 second=97 amount=-1 +kerning first=278 second=290 amount=-1 +kerning first=194 second=221 amount=-3 +kerning first=106 second=117 amount=-1 +kerning first=70 second=117 amount=-1 +kerning first=362 second=101 amount=-1 +kerning first=279 second=98 amount=-1 +kerning first=208 second=282 amount=-1 +kerning first=221 second=338 amount=-1 +kerning first=356 second=214 amount=-1 +kerning first=206 second=290 amount=-1 +kerning first=104 second=251 amount=-1 +kerning first=351 second=98 amount=-1 +kerning first=364 second=264 amount=-1 +kerning first=328 second=8221 amount=-2 +kerning first=315 second=98 amount=-1 +kerning first=209 second=251 amount=-1 +kerning first=102 second=98 amount=2 +kerning first=66 second=98 amount=-1 +kerning first=337 second=380 amount=-1 +kerning first=281 second=251 amount=-1 +kerning first=256 second=264 amount=-1 +kerning first=65 second=290 amount=-1 +kerning first=220 second=264 amount=-1 +kerning first=283 second=109 amount=-1 +kerning first=382 second=271 amount=-1 +kerning first=80 second=330 amount=-1 +kerning first=290 second=378 amount=-1 +kerning first=278 second=298 amount=-1 +kerning first=112 second=311 amount=-1 +kerning first=282 second=317 amount=-1 +kerning first=317 second=251 amount=-1 +kerning first=66 second=90 amount=-2 +kerning first=1098 second=1080 amount=-1 +kerning first=76 second=311 amount=-1 +kerning first=379 second=304 amount=-1 +kerning first=201 second=201 amount=-1 +kerning first=350 second=298 amount=-1 +kerning first=203 second=71 amount=-1 +kerning first=268 second=77 amount=-1 +kerning first=381 second=207 amount=-1 +kerning first=354 second=317 amount=-1 +kerning first=71 second=220 amount=-1 +kerning first=379 second=310 amount=-1 +kerning first=284 second=220 amount=-1 +kerning first=370 second=194 amount=-2 +kerning first=201 second=207 amount=-1 +kerning first=368 second=248 amount=-1 +kerning first=212 second=220 amount=-1 +kerning first=351 second=46 amount=-1 +kerning first=210 second=317 amount=-1 +kerning first=368 second=291 amount=-2 +kerning first=221 second=330 amount=-1 +kerning first=1025 second=1024 amount=-1 +kerning first=376 second=77 amount=-1 +kerning first=334 second=194 amount=-2 +kerning first=332 second=291 amount=-1 +kerning first=194 second=213 amount=-1 +kerning first=272 second=368 amount=-1 +kerning first=84 second=97 amount=-2 +kerning first=296 second=291 amount=-1 +kerning first=362 second=226 amount=-2 +kerning first=214 second=84 amount=-1 +kerning first=120 second=97 amount=-1 +kerning first=260 second=291 amount=-1 +kerning first=266 second=213 amount=-2 +kerning first=356 second=220 amount=-1 +kerning first=200 second=368 amount=-1 +kerning first=310 second=347 amount=-1 +kerning first=224 second=291 amount=-1 +kerning first=264 second=324 amount=-1 +kerning first=211 second=381 amount=-1 +kerning first=69 second=317 amount=-1 +kerning first=338 second=213 amount=-1 +kerning first=119 second=45 amount=-2 +kerning first=289 second=311 amount=-1 +kerning first=119 second=291 amount=-2 +kerning first=302 second=213 amount=-1 +kerning first=352 second=187 amount=-1 +kerning first=253 second=311 amount=-1 +kerning first=83 second=291 amount=-1 +kerning first=344 second=368 amount=-1 +kerning first=1098 second=1088 amount=-1 +kerning first=374 second=213 amount=-1 +kerning first=87 second=324 amount=-1 +kerning first=286 second=84 amount=-1 +kerning first=213 second=278 amount=-1 +kerning first=218 second=375 amount=-1 +kerning first=280 second=193 amount=-1 +kerning first=209 second=253 amount=-1 +kerning first=284 second=218 amount=-1 +kerning first=245 second=253 amount=-1 +kerning first=113 second=375 amount=-1 +kerning first=344 second=263 amount=-1 +kerning first=208 second=193 amount=-2 +kerning first=281 second=253 amount=-1 +kerning first=77 second=375 amount=-1 +kerning first=212 second=218 amount=-1 +kerning first=256 second=268 amount=-1 +kerning first=362 second=375 amount=-1 +kerning first=80 second=70 amount=-1 +kerning first=222 second=8249 amount=-1 +kerning first=321 second=278 amount=-1 +kerning first=353 second=253 amount=-1 +kerning first=326 second=375 amount=-1 +kerning first=362 second=103 amount=-2 +kerning first=286 second=78 amount=-1 +kerning first=1040 second=1060 amount=-2 +kerning first=352 second=193 amount=-2 +kerning first=326 second=103 amount=-1 +kerning first=254 second=375 amount=-1 +kerning first=356 second=218 amount=-1 +kerning first=76 second=45 amount=-1 +kerning first=290 second=103 amount=-1 +kerning first=381 second=203 amount=-1 +kerning first=214 second=78 amount=-1 +kerning first=337 second=120 amount=-1 +kerning first=199 second=310 amount=-1 +kerning first=1073 second=1095 amount=-1 +kerning first=208 second=45 amount=-1 +kerning first=1037 second=1095 amount=-1 +kerning first=221 second=70 amount=-1 +kerning first=381 second=201 amount=-1 +kerning first=70 second=213 amount=-1 +kerning first=229 second=120 amount=-1 +kerning first=71 second=218 amount=-1 +kerning first=228 second=253 amount=-1 +kerning first=196 second=104 amount=-1 +kerning first=171 second=356 amount=-2 +kerning first=104 second=253 amount=-1 +kerning first=201 second=203 amount=-1 +kerning first=8216 second=233 amount=-1 +kerning first=377 second=278 amount=-1 +kerning first=380 second=108 amount=-1 +kerning first=362 second=105 amount=-1 +kerning first=229 second=118 amount=-1 +kerning first=344 second=370 amount=-1 +kerning first=344 second=108 amount=-1 +kerning first=193 second=118 amount=-2 +kerning first=75 second=245 amount=-1 +kerning first=203 second=65 amount=-1 +kerning first=76 second=305 amount=-1 +kerning first=217 second=305 amount=-1 +kerning first=195 second=283 amount=-1 +kerning first=218 second=105 amount=-1 +kerning first=79 second=270 amount=-1 +kerning first=213 second=280 amount=-1 +kerning first=1048 second=1108 amount=-1 +kerning first=254 second=105 amount=-1 +kerning first=289 second=305 amount=-1 +kerning first=90 second=283 amount=-1 +kerning first=364 second=266 amount=-1 +kerning first=113 second=105 amount=-1 +kerning first=253 second=305 amount=-1 +kerning first=1047 second=1048 amount=-1 +kerning first=88 second=118 amount=-1 +kerning first=192 second=318 amount=-1 +kerning first=1069 second=1070 amount=-1 +kerning first=1051 second=1073 amount=-1 +kerning first=228 second=318 amount=-1 +kerning first=311 second=335 amount=-1 +kerning first=267 second=283 amount=-1 +kerning first=202 second=365 amount=-1 +kerning first=231 second=283 amount=-1 +kerning first=277 second=228 amount=-1 +kerning first=236 second=108 amount=-1 +kerning first=200 second=370 amount=-1 +kerning first=351 second=287 amount=-1 +kerning first=200 second=108 amount=-1 +kerning first=307 second=230 amount=-1 +kerning first=199 second=252 amount=-1 +kerning first=205 second=228 amount=-1 +kerning first=272 second=370 amount=-1 +kerning first=375 second=283 amount=-1 +kerning first=67 second=193 amount=-2 +kerning first=231 second=281 amount=-1 +kerning first=267 second=281 amount=-1 +kerning first=113 second=107 amount=-1 +kerning first=303 second=281 amount=-1 +kerning first=86 second=256 amount=-3 +kerning first=254 second=107 amount=-1 +kerning first=214 second=82 amount=-1 +kerning first=82 second=231 amount=-1 +kerning first=281 second=103 amount=-1 +kerning first=90 second=281 amount=-1 +kerning first=272 second=207 amount=-1 +kerning first=1065 second=1047 amount=-1 +kerning first=317 second=268 amount=-1 +kerning first=353 second=255 amount=-1 +kerning first=112 second=307 amount=-1 +kerning first=381 second=205 amount=-1 +kerning first=260 second=266 amount=-1 +kerning first=221 second=332 amount=-1 +kerning first=321 second=280 amount=-1 +kerning first=201 second=205 amount=-1 +kerning first=242 second=8250 amount=-1 +kerning first=268 second=81 amount=-2 +kerning first=281 second=255 amount=-1 +kerning first=326 second=371 amount=-1 +kerning first=203 second=67 amount=-1 +kerning first=245 second=255 amount=-1 +kerning first=376 second=347 amount=-2 +kerning first=209 second=255 amount=-1 +kerning first=304 second=81 amount=-1 +kerning first=304 second=347 amount=-1 +kerning first=113 second=371 amount=-1 +kerning first=67 second=304 amount=-1 +kerning first=104 second=255 amount=-1 +kerning first=268 second=347 amount=-1 +kerning first=376 second=81 amount=-1 +kerning first=232 second=347 amount=-1 +kerning first=196 second=347 amount=-1 +kerning first=350 second=8250 amount=-1 +kerning first=80 second=68 amount=-1 +kerning first=85 second=192 amount=-2 +kerning first=367 second=229 amount=-1 +kerning first=376 second=345 amount=-1 +kerning first=194 second=217 amount=-2 +kerning first=286 second=80 amount=-1 +kerning first=321 second=282 amount=-1 +kerning first=266 second=217 amount=-1 +kerning first=1040 second=1058 amount=-1 +kerning first=73 second=346 amount=-1 +kerning first=8217 second=224 amount=-3 +kerning first=274 second=318 amount=-1 +kerning first=338 second=217 amount=-1 +kerning first=209 second=288 amount=-1 +kerning first=213 second=282 amount=-1 +kerning first=196 second=81 amount=-1 +kerning first=374 second=217 amount=-1 +kerning first=214 second=8221 amount=-1 +kerning first=221 second=68 amount=-1 +kerning first=214 second=80 amount=-1 +kerning first=70 second=119 amount=-1 +kerning first=214 second=346 amount=-1 +kerning first=75 second=243 amount=-1 +kerning first=344 second=106 amount=-1 +kerning first=277 second=230 amount=-1 +kerning first=106 second=119 amount=-1 +kerning first=253 second=307 amount=-1 +kerning first=197 second=244 amount=-1 +kerning first=289 second=307 amount=-1 +kerning first=272 second=106 amount=-1 +kerning first=205 second=230 amount=-1 +kerning first=375 second=281 amount=-1 +kerning first=283 second=119 amount=-1 +kerning first=380 second=106 amount=-1 +kerning first=311 second=333 amount=-1 +kerning first=286 second=346 amount=-1 +kerning first=89 second=217 amount=-1 +kerning first=355 second=119 amount=-1 +kerning first=314 second=275 amount=-1 +kerning first=382 second=119 amount=-1 +kerning first=89 second=100 amount=-2 +kerning first=379 second=45 amount=-1 +kerning first=289 second=46 amount=-2 +kerning first=80 second=353 amount=-1 +kerning first=356 second=346 amount=-2 +kerning first=74 second=65 amount=-3 +kerning first=205 second=67 amount=-1 +kerning first=187 second=68 amount=-3 +kerning first=90 second=69 amount=-1 +kerning first=321 second=70 amount=-1 +kerning first=84 second=71 amount=-1 +kerning first=68 second=72 amount=-1 +kerning first=84 second=73 amount=-1 +kerning first=90 second=75 amount=-1 +kerning first=98 second=353 amount=-1 +kerning first=199 second=78 amount=-1 +kerning first=66 second=79 amount=-1 +kerning first=84 second=81 amount=-1 +kerning first=313 second=82 amount=-1 +kerning first=86 second=83 amount=-2 +kerning first=193 second=84 amount=-3 +kerning first=68 second=86 amount=-1 +kerning first=76 second=87 amount=-1 +kerning first=317 second=89 amount=-1 +kerning first=363 second=97 amount=-1 +kerning first=311 second=98 amount=-1 +kerning first=371 second=99 amount=-1 +kerning first=287 second=100 amount=-1 +kerning first=102 second=101 amount=-1 +kerning first=305 second=103 amount=-1 +kerning first=317 second=104 amount=-1 +kerning first=269 second=107 amount=-1 +kerning first=235 second=108 amount=-1 +kerning first=108 second=109 amount=-1 +kerning first=231 second=110 amount=-1 +kerning first=120 second=111 amount=-1 +kerning first=207 second=112 amount=-1 +kerning first=72 second=113 amount=-1 +kerning first=253 second=114 amount=-1 +kerning first=120 second=116 amount=-1 +kerning first=277 second=117 amount=-1 +kerning first=337 second=118 amount=-1 +kerning first=235 second=119 amount=-1 +kerning first=365 second=120 amount=-1 +kerning first=66 second=121 amount=-1 +kerning first=377 second=122 amount=-1 +kerning first=198 second=256 amount=-1 +kerning first=202 second=379 amount=-1 +kerning first=65 second=275 amount=-1 +kerning first=90 second=171 amount=-1 +kerning first=90 second=187 amount=-1 +kerning first=84 second=249 amount=-1 +kerning first=201 second=192 amount=-1 +kerning first=201 second=193 amount=-1 +kerning first=379 second=194 amount=-1 +kerning first=8217 second=195 amount=-3 +kerning first=201 second=197 amount=-1 +kerning first=84 second=198 amount=-3 +kerning first=197 second=199 amount=-1 +kerning first=68 second=200 amount=-1 +kerning first=84 second=201 amount=-1 +kerning first=68 second=202 amount=-1 +kerning first=187 second=203 amount=-3 +kerning first=379 second=206 amount=-1 +kerning first=90 second=207 amount=-1 +kerning first=313 second=209 amount=-1 +kerning first=197 second=210 amount=-1 +kerning first=321 second=211 amount=-1 +kerning first=193 second=212 amount=-1 +kerning first=313 second=213 amount=-1 +kerning first=84 second=214 amount=-1 +kerning first=251 second=8217 amount=-2 +kerning first=317 second=216 amount=-1 +kerning first=82 second=217 amount=-1 +kerning first=315 second=221 amount=-1 +kerning first=213 second=224 amount=-1 +kerning first=303 second=228 amount=-1 +kerning first=255 second=229 amount=-2 +kerning first=82 second=230 amount=-1 +kerning first=118 second=231 amount=-1 +kerning first=327 second=232 amount=-1 +kerning first=377 second=233 amount=-1 +kerning first=303 second=235 amount=-1 +kerning first=90 second=237 amount=-1 +kerning first=330 second=45 amount=-2 +kerning first=231 second=240 amount=-1 +kerning first=8217 second=242 amount=-2 +kerning first=323 second=244 amount=-1 +kerning first=205 second=245 amount=-1 +kerning first=74 second=246 amount=-1 +kerning first=291 second=248 amount=-1 +kerning first=66 second=249 amount=-1 +kerning first=76 second=250 amount=-1 +kerning first=225 second=254 amount=-1 +kerning first=351 second=255 amount=-1 +kerning first=122 second=257 amount=-1 +kerning first=307 second=259 amount=-1 +kerning first=377 second=260 amount=-1 +kerning first=74 second=261 amount=-1 +kerning first=66 second=262 amount=-1 +kerning first=379 second=263 amount=-1 +kerning first=321 second=305 amount=-1 +kerning first=379 second=266 amount=-1 +kerning first=375 second=267 amount=-1 +kerning first=315 second=268 amount=-1 +kerning first=207 second=269 amount=-1 +kerning first=84 second=270 amount=-1 +kerning first=102 second=271 amount=-1 +kerning first=269 second=273 amount=-1 +kerning first=76 second=274 amount=-1 +kerning first=289 second=275 amount=-1 +kerning first=263 second=277 amount=-1 +kerning first=313 second=278 amount=-1 +kerning first=199 second=279 amount=-1 +kerning first=86 second=280 amount=-1 +kerning first=197 second=281 amount=-1 +kerning first=66 second=282 amount=-2 +kerning first=8217 second=284 amount=-1 +kerning first=86 second=286 amount=-1 +kerning first=245 second=287 amount=-1 +kerning first=219 second=288 amount=-1 +kerning first=229 second=289 amount=-1 +kerning first=74 second=290 amount=-1 +kerning first=1078 second=1095 amount=-1 +kerning first=217 second=230 amount=-2 +kerning first=76 second=302 amount=-1 +kerning first=281 second=303 amount=-1 +kerning first=231 second=305 amount=-1 +kerning first=337 second=307 amount=-1 +kerning first=321 second=310 amount=-1 +kerning first=365 second=311 amount=-1 +kerning first=76 second=313 amount=-1 +kerning first=197 second=314 amount=-1 +kerning first=199 second=315 amount=-1 +kerning first=112 second=316 amount=-1 +kerning first=315 second=317 amount=-1 +kerning first=315 second=318 amount=-1 +kerning first=313 second=323 amount=-1 +kerning first=66 second=324 amount=-1 +kerning first=122 second=326 amount=-1 +kerning first=313 second=327 amount=-1 +kerning first=353 second=328 amount=-1 +kerning first=350 second=379 amount=-1 +kerning first=90 second=330 amount=-1 +kerning first=233 second=331 amount=-1 +kerning first=315 second=332 amount=-1 +kerning first=193 second=333 amount=-1 +kerning first=317 second=334 amount=-1 +kerning first=323 second=335 amount=-1 +kerning first=88 second=336 amount=-1 +kerning first=8217 second=337 amount=-2 +kerning first=84 second=338 amount=-1 +kerning first=311 second=339 amount=-1 +kerning first=370 second=237 amount=-1 +kerning first=253 second=345 amount=-1 +kerning first=8217 second=346 amount=-1 +kerning first=74 second=347 amount=-1 +kerning first=221 second=350 amount=-2 +kerning first=219 second=351 amount=-1 +kerning first=187 second=352 amount=-2 +kerning first=78 second=353 amount=-1 +kerning first=379 second=354 amount=-1 +kerning first=371 second=355 amount=-1 +kerning first=187 second=357 amount=-1 +kerning first=305 second=361 amount=-1 +kerning first=379 second=363 amount=-1 +kerning first=187 second=364 amount=-2 +kerning first=235 second=365 amount=-1 +kerning first=332 second=289 amount=-1 +kerning first=100 second=367 amount=-1 +kerning first=281 second=369 amount=-1 +kerning first=249 second=371 amount=-1 +kerning first=222 second=313 amount=-1 +kerning first=197 second=374 amount=-3 +kerning first=187 second=377 amount=-2 +kerning first=335 second=378 amount=-1 +kerning first=76 second=379 amount=-1 +kerning first=8217 second=380 amount=-1 +kerning first=120 second=382 amount=-1 +kerning first=199 second=244 amount=-1 +kerning first=81 second=313 amount=-1 +kerning first=262 second=237 amount=-1 +kerning first=207 second=263 amount=-1 +kerning first=1054 second=1067 amount=-1 +kerning first=69 second=199 amount=-1 +kerning first=1043 second=1084 amount=-1 +kerning first=45 second=313 amount=-3 +kerning first=72 second=334 amount=-1 +kerning first=274 second=379 amount=-1 +kerning first=365 second=353 amount=-1 +kerning first=71 second=346 amount=-1 +kerning first=288 second=270 amount=-1 +kerning first=86 second=225 amount=-2 +kerning first=328 second=365 amount=-1 +kerning first=346 second=379 amount=-1 +kerning first=122 second=225 amount=-1 +kerning first=102 second=263 amount=-1 +kerning first=256 second=365 amount=-1 +kerning first=1061 second=1098 amount=-1 +kerning first=103 second=251 amount=-1 +kerning first=104 second=361 amount=-1 +kerning first=83 second=289 amount=-1 +kerning first=257 second=353 amount=-1 +kerning first=212 second=346 amount=-1 +kerning first=219 second=283 amount=-1 +kerning first=282 second=291 amount=-1 +kerning first=119 second=289 amount=-2 +kerning first=115 second=365 amount=-1 +kerning first=1045 second=1060 amount=-1 +kerning first=216 second=270 amount=-1 +kerning first=377 second=296 amount=-1 +kerning first=313 second=315 amount=-1 +kerning first=212 second=374 amount=-1 +kerning first=280 second=251 amount=-1 +kerning first=374 second=72 amount=-1 +kerning first=257 second=121 amount=-1 +kerning first=120 second=277 amount=-1 +kerning first=338 second=72 amount=-1 +kerning first=251 second=254 amount=-1 +kerning first=221 second=121 amount=-1 +kerning first=352 second=251 amount=-1 +kerning first=287 second=254 amount=-1 +kerning first=71 second=374 amount=-1 +kerning first=316 second=251 amount=-1 +kerning first=202 second=351 amount=-1 +kerning first=280 second=344 amount=-1 +kerning first=1027 second=1074 amount=-1 +kerning first=86 second=246 amount=-1 +kerning first=266 second=381 amount=-1 +kerning first=203 second=79 amount=-1 +kerning first=84 second=277 amount=-2 +kerning first=110 second=254 amount=-1 +kerning first=1025 second=1118 amount=-1 +kerning first=199 second=331 amount=-1 +kerning first=83 second=261 amount=-1 +kerning first=219 second=117 amount=-1 +kerning first=379 second=244 amount=-1 +kerning first=187 second=69 amount=-3 +kerning first=275 second=367 amount=-1 +kerning first=376 second=76 amount=-1 +kerning first=221 second=381 amount=-1 +kerning first=291 second=117 amount=-1 +kerning first=121 second=328 amount=-1 +kerning first=1047 second=1036 amount=-1 +kerning first=89 second=72 amount=-1 +kerning first=205 second=83 amount=-1 +kerning first=310 second=351 amount=-1 +kerning first=381 second=192 amount=-1 +kerning first=268 second=76 amount=-1 +kerning first=354 second=199 amount=-1 +kerning first=274 second=351 amount=-1 +kerning first=327 second=117 amount=-1 +kerning first=196 second=336 amount=-1 +kerning first=284 second=374 amount=-1 +kerning first=365 second=121 amount=-1 +kerning first=1114 second=1096 amount=-1 +kerning first=382 second=351 amount=-1 +kerning first=313 second=83 amount=-1 +kerning first=346 second=351 amount=-1 +kerning first=266 second=72 amount=-1 +kerning first=268 second=336 amount=-2 +kerning first=66 second=291 amount=-2 +kerning first=212 second=86 amount=-1 +kerning first=347 second=107 amount=-1 +kerning first=256 second=337 amount=-1 +kerning first=8217 second=234 amount=-2 +kerning first=221 second=249 amount=-1 +kerning first=220 second=337 amount=-1 +kerning first=210 second=171 amount=-1 +kerning first=269 second=240 amount=-1 +kerning first=317 second=382 amount=-1 +kerning first=203 second=107 amount=-1 +kerning first=353 second=382 amount=-1 +kerning first=8216 second=243 amount=-1 +kerning first=296 second=261 amount=-1 +kerning first=364 second=337 amount=-1 +kerning first=377 second=240 amount=-1 +kerning first=284 second=86 amount=-1 +kerning first=275 second=107 amount=-1 +kerning first=368 second=261 amount=-2 +kerning first=199 second=216 amount=-2 +kerning first=8222 second=370 amount=-2 +kerning first=78 second=117 amount=-1 +kerning first=262 second=209 amount=-1 +kerning first=1047 second=1024 amount=-1 +kerning first=1047 second=1025 amount=-1 +kerning first=1057 second=1030 amount=-1 +kerning first=1057 second=1031 amount=-1 +kerning first=1057 second=1033 amount=-1 +kerning first=1069 second=1034 amount=-1 +kerning first=1025 second=1036 amount=-1 +kerning first=1045 second=1037 amount=-1 +kerning first=1047 second=1038 amount=-1 +kerning first=1047 second=1039 amount=-1 +kerning first=1043 second=1040 amount=-2 +kerning first=1045 second=1041 amount=-1 +kerning first=1025 second=1042 amount=-1 +kerning first=1025 second=1043 amount=-1 +kerning first=1057 second=1045 amount=-1 +kerning first=1047 second=1047 amount=-1 +kerning first=1057 second=1048 amount=-1 +kerning first=1057 second=1049 amount=-1 +kerning first=1025 second=1050 amount=-1 +kerning first=1059 second=1051 amount=-3 +kerning first=1057 second=1052 amount=-1 +kerning first=1057 second=1053 amount=-1 +kerning first=1067 second=1054 amount=-1 +kerning first=1069 second=1055 amount=-1 +kerning first=1047 second=1056 amount=-1 +kerning first=1057 second=1057 amount=-1 +kerning first=1045 second=1058 amount=-1 +kerning first=1025 second=1059 amount=-1 +kerning first=1051 second=1060 amount=-1 +kerning first=1057 second=1062 amount=-1 +kerning first=1057 second=1063 amount=-1 +kerning first=1045 second=1064 amount=-1 +kerning first=1057 second=1065 amount=-1 +kerning first=302 second=100 amount=-1 +kerning first=1045 second=1067 amount=-1 +kerning first=197 second=240 amount=-1 +kerning first=1057 second=1070 amount=-1 +kerning first=1091 second=1072 amount=-1 +kerning first=1065 second=1073 amount=-1 +kerning first=1043 second=1074 amount=-1 +kerning first=1059 second=1075 amount=-2 +kerning first=1047 second=1076 amount=-1 +kerning first=1061 second=1077 amount=-1 +kerning first=1027 second=1078 amount=-2 +kerning first=1027 second=1079 amount=-1 +kerning first=1027 second=1080 amount=-1 +kerning first=1043 second=1081 amount=-1 +kerning first=1113 second=1082 amount=-1 +kerning first=1057 second=1083 amount=-1 +kerning first=1027 second=1084 amount=-1 +kerning first=1031 second=1086 amount=-1 +kerning first=1043 second=1087 amount=-1 +kerning first=1043 second=1088 amount=-1 +kerning first=1031 second=1089 amount=-1 +kerning first=1059 second=1090 amount=-1 +kerning first=1045 second=1091 amount=-1 +kerning first=1027 second=1092 amount=-1 +kerning first=1059 second=1093 amount=-2 +kerning first=1027 second=1094 amount=-1 +kerning first=1063 second=1095 amount=-1 +kerning first=1043 second=1096 amount=-1 +kerning first=1059 second=1097 amount=-2 +kerning first=1025 second=1098 amount=-1 +kerning first=1027 second=1100 amount=-1 +kerning first=1043 second=1101 amount=-1 +kerning first=1057 second=1102 amount=-1 +kerning first=1047 second=1103 amount=-1 +kerning first=1027 second=1104 amount=-1 +kerning first=1043 second=1105 amount=-1 +kerning first=1027 second=1107 amount=-1 +kerning first=1027 second=1108 amount=-1 +kerning first=1069 second=1113 amount=-1 +kerning first=1057 second=1114 amount=-1 +kerning first=1043 second=1116 amount=-1 +kerning first=1043 second=1117 amount=-1 +kerning first=214 second=350 amount=-1 +kerning first=1057 second=1119 amount=-1 +kerning first=210 second=227 amount=-1 +kerning first=304 second=252 amount=-1 +kerning first=73 second=350 amount=-1 +kerning first=105 second=227 amount=-1 +kerning first=376 second=252 amount=-1 +kerning first=107 second=8221 amount=-1 +kerning first=362 second=246 amount=-1 +kerning first=84 second=305 amount=-1 +kerning first=354 second=227 amount=-2 +kerning first=374 second=44 amount=-3 +kerning first=1118 second=1076 amount=-2 +kerning first=196 second=252 amount=-1 +kerning first=286 second=350 amount=-1 +kerning first=66 second=207 amount=-2 +kerning first=282 second=227 amount=-1 +kerning first=232 second=252 amount=-1 +kerning first=120 second=45 amount=-2 +kerning first=264 second=356 amount=-1 +kerning first=218 second=246 amount=-1 +kerning first=74 second=226 amount=-1 +kerning first=209 second=382 amount=-1 +kerning first=351 second=291 amount=-1 +kerning first=332 second=317 amount=-1 +kerning first=200 second=260 amount=-1 +kerning first=245 second=382 amount=-1 +kerning first=315 second=291 amount=-1 +kerning first=225 second=45 amount=-1 +kerning first=192 second=356 amount=-3 +kerning first=218 second=121 amount=-1 +kerning first=113 second=246 amount=-1 +kerning first=281 second=382 amount=-1 +kerning first=279 second=291 amount=-1 +kerning first=201 second=103 amount=-1 +kerning first=77 second=246 amount=-1 +kerning first=272 second=260 amount=-2 +kerning first=243 second=291 amount=-1 +kerning first=321 second=362 amount=-1 +kerning first=69 second=227 amount=-1 +kerning first=251 second=226 amount=-1 +kerning first=207 second=291 amount=-1 +kerning first=315 second=207 amount=-1 +kerning first=261 second=45 amount=-1 +kerning first=287 second=226 amount=-1 +kerning first=68 second=382 amount=-1 +kerning first=369 second=45 amount=-1 +kerning first=88 second=84 amount=-1 +kerning first=323 second=226 amount=-1 +kerning first=102 second=291 amount=-1 +kerning first=304 second=336 amount=-1 +kerning first=8220 second=195 amount=-4 +kerning first=193 second=232 amount=-1 +kerning first=366 second=109 amount=-1 +kerning first=376 second=336 amount=-1 +kerning first=368 second=365 amount=-1 +kerning first=200 second=115 amount=-1 +kerning first=236 second=115 amount=-1 +kerning first=283 second=187 amount=-1 +kerning first=377 second=212 amount=-1 +kerning first=381 second=103 amount=-2 +kerning first=214 second=90 amount=-1 +kerning first=345 second=103 amount=-1 +kerning first=344 second=115 amount=-1 +kerning first=266 second=44 amount=-1 +kerning first=380 second=115 amount=-1 +kerning first=230 second=44 amount=-2 +kerning first=350 second=303 amount=-1 +kerning first=380 second=232 amount=-1 +kerning first=45 second=109 amount=-1 +kerning first=87 second=213 amount=-1 +kerning first=338 second=44 amount=-1 +kerning first=344 second=232 amount=-1 +kerning first=192 second=213 amount=-1 +kerning first=200 second=259 amount=-1 +kerning first=8217 second=259 amount=-3 +kerning first=264 second=213 amount=-2 +kerning first=268 second=104 amount=-1 +kerning first=378 second=8249 amount=-2 +kerning first=101 second=303 amount=-1 +kerning first=87 second=328 amount=-1 +kerning first=201 second=75 amount=-1 +kerning first=187 second=315 amount=-3 +kerning first=283 second=98 amount=-1 +kerning first=250 second=118 amount=-1 +kerning first=381 second=75 amount=-1 +kerning first=8216 second=287 amount=-2 +kerning first=270 second=8249 amount=-1 +kerning first=264 second=328 amount=-1 +kerning first=8218 second=102 amount=-1 +kerning first=314 second=303 amount=-1 +kerning first=268 second=280 amount=-1 +kerning first=334 second=120 amount=-1 +kerning first=199 second=202 amount=-1 +kerning first=286 second=118 amount=-1 +kerning first=370 second=120 amount=-1 +kerning first=263 second=105 amount=-1 +kerning first=242 second=303 amount=-1 +kerning first=106 second=98 amount=-1 +kerning first=73 second=118 amount=-1 +kerning first=1118 second=1104 amount=-1 +kerning first=1082 second=1104 amount=-1 +kerning first=109 second=118 amount=-1 +kerning first=1046 second=1104 amount=-1 +kerning first=210 second=370 amount=-1 +kerning first=290 second=218 amount=-1 +kerning first=8220 second=223 amount=-1 +kerning first=80 second=325 amount=-1 +kerning first=84 second=193 amount=-3 +kerning first=264 second=241 amount=-1 +kerning first=260 second=263 amount=-1 +kerning first=1025 second=1070 amount=-1 +kerning first=282 second=370 amount=-1 +kerning first=203 second=196 amount=-1 +kerning first=234 second=122 amount=-1 +kerning first=378 second=305 amount=-1 +kerning first=311 second=283 amount=-1 +kerning first=102 second=104 amount=2 +kerning first=354 second=370 amount=-1 +kerning first=76 second=314 amount=-1 +kerning first=87 second=241 amount=-1 +kerning first=347 second=311 amount=-1 +kerning first=171 second=87 amount=-2 +kerning first=213 second=362 amount=-1 +kerning first=88 second=112 amount=-1 +kerning first=73 second=266 amount=-1 +kerning first=275 second=311 amount=-1 +kerning first=83 second=317 amount=-1 +kerning first=325 second=286 amount=-1 +kerning first=112 second=314 amount=-1 +kerning first=350 second=331 amount=-1 +kerning first=346 second=65 amount=-2 +kerning first=87 second=269 amount=-2 +kerning first=217 second=286 amount=-1 +kerning first=253 second=314 amount=-1 +kerning first=203 second=311 amount=-1 +kerning first=219 second=8249 amount=-3 +kerning first=231 second=261 amount=-1 +kerning first=87 second=8250 amount=-1 +kerning first=278 second=331 amount=-1 +kerning first=192 second=269 amount=-1 +kerning first=98 second=311 amount=-1 +kerning first=314 second=331 amount=-1 +kerning first=1093 second=1118 amount=-1 +kerning first=1057 second=1059 amount=-1 +kerning first=289 second=314 amount=-1 +kerning first=354 second=255 amount=-1 +kerning first=207 second=235 amount=-1 +kerning first=83 second=345 amount=-1 +kerning first=270 second=8221 amount=-1 +kerning first=264 second=269 amount=-1 +kerning first=376 second=280 amount=-1 +kerning first=119 second=345 amount=-1 +kerning first=76 second=286 amount=-1 +kerning first=258 second=81 amount=-1 +kerning first=101 second=331 amount=-1 +kerning first=222 second=196 amount=-2 +kerning first=246 second=255 amount=-1 +kerning first=234 second=8221 amount=-1 +kerning first=337 second=112 amount=-1 +kerning first=330 second=81 amount=-1 +kerning first=1100 second=1090 amount=-1 +kerning first=231 second=118 amount=-1 +kerning first=203 second=224 amount=-1 +kerning first=105 second=255 amount=-1 +kerning first=311 second=224 amount=-1 +kerning first=366 second=81 amount=-1 +kerning first=368 second=345 amount=-1 +kerning first=275 second=224 amount=-1 +kerning first=193 second=112 amount=-1 +kerning first=281 second=326 amount=-1 +kerning first=66 second=378 amount=-2 +kerning first=1058 second=1078 amount=-1 +kerning first=90 second=205 amount=-1 +kerning first=317 second=326 amount=-1 +kerning first=256 second=250 amount=-1 +kerning first=243 second=347 amount=-1 +kerning first=347 second=224 amount=-1 +kerning first=353 second=326 amount=-1 +kerning first=364 second=250 amount=-1 +kerning first=207 second=347 amount=-1 +kerning first=98 second=255 amount=-1 +kerning first=8218 second=303 amount=-1 +kerning first=328 second=250 amount=-1 +kerning first=102 second=378 amount=-1 +kerning first=220 second=281 amount=-1 +kerning first=84 second=101 amount=-2 +kerning first=115 second=250 amount=-1 +kerning first=102 second=347 amount=-1 +kerning first=120 second=101 amount=-1 +kerning first=1069 second=1033 amount=-1 +kerning first=298 second=352 amount=-1 +kerning first=66 second=347 amount=-1 +kerning first=76 second=344 amount=-1 +kerning first=378 second=371 amount=-1 +kerning first=220 second=250 amount=-1 +kerning first=264 second=71 amount=-2 +kerning first=107 second=231 amount=-1 +kerning first=218 second=333 amount=-1 +kerning first=8217 second=83 amount=-1 +kerning first=307 second=328 amount=-1 +kerning first=121 second=237 amount=-1 +kerning first=351 second=378 amount=-1 +kerning first=282 second=76 amount=-1 +kerning first=268 second=366 amount=-1 +kerning first=347 second=8220 amount=-1 +kerning first=1058 second=1047 amount=-1 +kerning first=235 second=328 amount=-1 +kerning first=311 second=8220 amount=-1 +kerning first=88 second=288 amount=-1 +kerning first=199 second=328 amount=-1 +kerning first=243 second=378 amount=-1 +kerning first=275 second=8220 amount=-1 +kerning first=290 second=302 amount=-1 +kerning first=351 second=345 amount=-1 +kerning first=88 second=257 amount=-1 +kerning first=207 second=378 amount=-1 +kerning first=1039 second=1073 amount=-1 +kerning first=204 second=210 amount=-1 +kerning first=85 second=352 amount=-1 +kerning first=113 second=333 amount=-1 +kerning first=379 second=328 amount=-1 +kerning first=77 second=333 amount=-1 +kerning first=98 second=8220 amount=-1 +kerning first=204 second=243 amount=-1 +kerning first=272 second=87 amount=-1 +kerning first=336 second=344 amount=-1 +kerning first=97 second=353 amount=-1 +kerning first=200 second=87 amount=-1 +kerning first=74 second=198 amount=-3 +kerning first=362 second=333 amount=-1 +kerning first=87 second=68 amount=-1 +kerning first=325 second=113 amount=-1 +kerning first=8217 second=114 amount=-1 +kerning first=289 second=113 amount=-1 +kerning first=193 second=288 amount=-1 +kerning first=45 second=194 amount=-2 +kerning first=253 second=113 amount=-1 +kerning first=99 second=243 amount=-1 +kerning first=217 second=345 amount=-1 +kerning first=217 second=113 amount=-1 +kerning first=85 second=120 amount=-1 +kerning first=121 second=120 amount=-1 +kerning first=198 second=368 amount=-1 +kerning first=226 second=120 amount=-1 +kerning first=68 second=323 amount=-1 +kerning first=347 second=255 amount=-1 +kerning first=356 second=262 amount=-1 +kerning first=209 second=214 amount=-1 +kerning first=275 second=255 amount=-1 +kerning first=73 second=210 amount=-1 +kerning first=1079 second=1095 amount=-1 +kerning first=1038 second=1113 amount=-3 +kerning first=68 second=354 amount=-1 +kerning first=88 second=229 amount=-1 +kerning first=269 second=347 amount=-1 +kerning first=347 second=227 amount=-1 +kerning first=1024 second=1054 amount=-1 +kerning first=370 second=324 amount=-1 +kerning first=290 second=274 amount=-1 +kerning first=317 second=323 amount=-1 +kerning first=311 second=227 amount=-1 +kerning first=275 second=227 amount=-1 +kerning first=107 second=234 amount=-1 +kerning first=262 second=324 amount=-1 +kerning first=345 second=44 amount=-2 +kerning first=317 second=354 amount=-1 +kerning first=314 second=99 amount=-1 +kerning first=90 second=233 amount=-1 +kerning first=231 second=233 amount=-1 +kerning first=374 second=101 amount=-2 +kerning first=356 second=234 amount=-2 +kerning first=195 second=233 amount=-1 +kerning first=110 second=106 amount=-1 +kerning first=303 second=233 amount=-1 +kerning first=267 second=233 amount=-1 +kerning first=381 second=279 amount=-1 +kerning first=219 second=264 amount=-1 +kerning first=375 second=233 amount=-1 +kerning first=251 second=106 amount=-1 +kerning first=203 second=227 amount=-1 +kerning first=344 second=87 amount=-1 +kerning first=76 second=110 amount=-1 +kerning first=326 second=361 amount=-1 +kerning first=1047 second=1064 amount=-1 +kerning first=68 second=66 amount=-1 +kerning first=302 second=243 amount=-1 +kerning first=88 second=316 amount=-1 +kerning first=65 second=219 amount=-2 +kerning first=378 second=111 amount=-1 +kerning first=193 second=316 amount=-1 +kerning first=217 second=110 amount=-1 +kerning first=362 second=361 amount=-1 +kerning first=229 second=316 amount=-1 +kerning first=195 second=264 amount=-1 +kerning first=204 second=212 amount=-1 +kerning first=209 second=267 amount=-1 +kerning first=87 second=65 amount=-3 +kerning first=196 second=364 amount=-2 +kerning first=289 second=110 amount=-1 +kerning first=90 second=264 amount=-1 +kerning first=337 second=316 amount=-1 +kerning first=333 second=104 amount=-1 +kerning first=264 second=65 amount=-2 +kerning first=1038 second=1057 amount=-1 +kerning first=201 second=44 amount=-1 +kerning first=77 second=361 amount=-1 +kerning first=330 second=336 amount=-1 +kerning first=336 second=65 amount=-2 +kerning first=317 second=66 amount=-1 +kerning first=268 second=364 amount=-1 +kerning first=76 second=82 amount=-1 +kerning first=334 second=89 amount=-1 +kerning first=369 second=104 amount=-1 +kerning first=218 second=361 amount=-1 +kerning first=376 second=364 amount=-1 +kerning first=317 second=122 amount=-1 +kerning first=370 second=117 amount=-1 +kerning first=201 second=72 amount=-1 +kerning first=281 second=122 amount=-1 +kerning first=328 second=46 amount=-1 +kerning first=187 second=97 amount=-1 +kerning first=69 second=370 amount=-1 +kerning first=245 second=122 amount=-1 +kerning first=364 second=46 amount=-3 +kerning first=278 second=102 amount=-1 +kerning first=209 second=122 amount=-1 +kerning first=85 second=377 amount=-1 +kerning first=206 second=71 amount=-1 +kerning first=364 second=225 amount=-2 +kerning first=381 second=72 amount=-1 +kerning first=84 second=76 amount=-1 +kerning first=115 second=46 amount=-1 +kerning first=250 second=121 amount=-1 +kerning first=303 second=116 amount=-1 +kerning first=278 second=71 amount=-1 +kerning first=220 second=46 amount=-3 +kerning first=367 second=97 amount=-1 +kerning first=101 second=102 amount=-1 +kerning first=353 second=122 amount=-1 +kerning first=375 second=116 amount=-1 +kerning first=109 second=121 amount=-1 +kerning first=262 second=377 amount=-1 +kerning first=85 second=117 amount=-1 +kerning first=350 second=219 amount=-1 +kerning first=79 second=46 amount=-1 +kerning first=278 second=219 amount=-1 +kerning first=314 second=102 amount=-1 +kerning first=262 second=117 amount=-1 +kerning first=201 second=332 amount=-1 +kerning first=350 second=102 amount=-1 +kerning first=226 second=117 amount=-1 +kerning first=334 second=377 amount=-1 +kerning first=104 second=8217 amount=-2 +kerning first=107 second=287 amount=-1 +kerning first=68 second=122 amount=-1 +kerning first=370 second=377 amount=-1 +kerning first=71 second=287 amount=-1 +kerning first=298 second=117 amount=-1 +kerning first=198 second=200 amount=-1 +kerning first=352 second=364 amount=-1 +kerning first=381 second=332 amount=-1 +kerning first=212 second=287 amount=-1 +kerning first=204 second=240 amount=-1 +kerning first=82 second=242 amount=-1 +kerning first=284 second=287 amount=-1 +kerning first=248 second=287 amount=-1 +kerning first=278 second=249 amount=-1 +kerning first=99 second=240 amount=-1 +kerning first=356 second=287 amount=-2 +kerning first=108 second=8221 amount=-2 +kerning first=201 second=220 amount=-1 +kerning first=118 second=242 amount=-1 +kerning first=212 second=259 amount=-1 +kerning first=381 second=304 amount=-1 +kerning first=68 second=298 amount=-1 +kerning first=198 second=284 amount=-1 +kerning first=82 second=214 amount=-1 +kerning first=284 second=259 amount=-1 +kerning first=361 second=8217 amount=-2 +kerning first=261 second=8220 amount=-1 +kerning first=361 second=8221 amount=-2 +kerning first=251 second=369 amount=-1 +kerning first=85 second=324 amount=-1 +kerning first=195 second=116 amount=-1 +kerning first=250 second=380 amount=-1 +kerning first=351 second=375 amount=-1 +kerning first=261 second=8249 amount=-1 +kerning first=381 second=8250 amount=-1 +kerning first=315 second=375 amount=-1 +kerning first=323 second=369 amount=-1 +kerning first=267 second=116 amount=-1 +kerning first=198 second=197 amount=-1 +kerning first=1069 second=1030 amount=-1 +kerning first=65 second=71 amount=-1 +kerning first=279 second=375 amount=-1 +kerning first=287 second=369 amount=-1 +kerning first=121 second=324 amount=-1 +kerning first=231 second=116 amount=-1 +kerning first=82 second=97 amount=-1 +kerning first=104 second=119 amount=-1 +kerning first=118 second=97 amount=-2 +kerning first=201 second=304 amount=-1 +kerning first=209 second=119 amount=-1 +kerning first=90 second=116 amount=-1 +kerning first=220 second=194 amount=-2 +kerning first=245 second=119 amount=-1 +kerning first=110 second=369 amount=-1 +kerning first=1058 second=1075 amount=-1 +kerning first=281 second=119 amount=-1 +kerning first=381 second=248 amount=-1 +kerning first=79 second=74 amount=-1 +kerning first=234 second=228 amount=-1 +kerning first=1027 second=1105 amount=-1 +kerning first=328 second=253 amount=-1 +kerning first=317 second=119 amount=-1 +kerning first=284 second=203 amount=-1 +kerning first=198 second=228 amount=-1 +kerning first=353 second=119 amount=-1 +kerning first=220 second=74 amount=-1 +kerning first=243 second=375 amount=-1 +kerning first=195 second=217 amount=-2 +kerning first=207 second=375 amount=-1 +kerning first=364 second=74 amount=-1 +kerning first=118 second=273 amount=-1 +kerning first=264 second=68 amount=-1 +kerning first=204 second=268 amount=-1 +kerning first=221 second=196 amount=-3 +kerning first=99 second=355 amount=-1 +kerning first=198 second=80 amount=-1 +kerning first=115 second=253 amount=-1 +kerning first=317 second=298 amount=-1 +kerning first=220 second=253 amount=-1 +kerning first=336 second=68 amount=-1 +kerning first=72 second=264 amount=-1 +kerning first=256 second=253 amount=-1 +kerning first=356 second=203 amount=-1 +kerning first=201 second=363 amount=-1 +kerning first=68 second=270 amount=-1 +kerning first=381 second=335 amount=-1 +kerning first=98 second=8217 amount=-1 +kerning first=234 second=108 amount=-1 +kerning first=74 second=338 amount=-1 +kerning first=208 second=381 amount=-1 +kerning first=356 second=290 amount=-1 +kerning first=364 second=105 amount=-1 +kerning first=381 second=363 amount=-1 +kerning first=118 second=245 amount=-1 +kerning first=378 second=108 amount=-1 +kerning first=248 second=318 amount=-1 +kerning first=82 second=245 amount=-1 +kerning first=76 second=85 amount=-1 +kerning first=220 second=105 amount=-1 +kerning first=220 second=225 amount=-2 +kerning first=262 second=380 amount=-1 +kerning first=356 second=231 amount=-2 +kerning first=8218 second=362 amount=-2 +kerning first=298 second=380 amount=-1 +kerning first=115 second=105 amount=-1 +kerning first=1038 second=1060 amount=-1 +kerning first=334 second=380 amount=-1 +kerning first=1091 second=1083 amount=-1 +kerning first=108 second=331 amount=-1 +kerning first=307 second=8217 amount=-1 +kerning first=370 second=380 amount=-1 +kerning first=111 second=316 amount=-1 +kerning first=85 second=380 amount=-1 +kerning first=323 second=338 amount=-1 +kerning first=378 second=228 amount=-1 +kerning first=364 second=251 amount=-1 +kerning first=79 second=225 amount=-1 +kerning first=98 second=119 amount=-1 +kerning first=207 second=248 amount=-1 +kerning first=121 second=380 amount=-1 +kerning first=317 second=270 amount=-1 +kerning first=311 second=8217 amount=-1 +kerning first=115 second=225 amount=-1 +kerning first=198 second=108 amount=-1 +kerning first=347 second=8217 amount=-1 +kerning first=313 second=350 amount=-1 +kerning first=330 second=351 amount=-1 +kerning first=234 second=225 amount=-1 +kerning first=110 second=251 amount=-1 +kerning first=371 second=228 amount=-1 +kerning first=8217 second=262 amount=-1 +kerning first=251 second=251 amount=-1 +kerning first=376 second=282 amount=-1 +kerning first=108 second=303 amount=-1 +kerning first=323 second=251 amount=-1 +kerning first=263 second=228 amount=-1 +kerning first=1114 second=1093 amount=-1 +kerning first=287 second=251 amount=-1 +kerning first=1042 second=1093 amount=-1 +kerning first=122 second=228 amount=-1 +kerning first=198 second=225 amount=-1 +kerning first=278 second=46 amount=-1 +kerning first=86 second=228 amount=-2 +kerning first=262 second=206 amount=-1 +kerning first=350 second=46 amount=-2 +kerning first=214 second=325 amount=-1 +kerning first=334 second=206 amount=-1 +kerning first=88 second=103 amount=-1 +kerning first=101 second=46 amount=-2 +kerning first=71 second=83 amount=-1 +kerning first=45 second=310 amount=-3 +kerning first=378 second=225 amount=-1 +kerning first=286 second=325 amount=-1 +kerning first=84 second=280 amount=-1 +kerning first=206 second=46 amount=-1 +kerning first=277 second=287 amount=-1 +kerning first=1054 second=1070 amount=-1 +kerning first=115 second=102 amount=-1 +kerning first=242 second=46 amount=-2 +kerning first=212 second=83 amount=-1 +kerning first=106 second=355 amount=-1 +kerning first=315 second=266 amount=-1 +kerning first=338 second=363 amount=-1 +kerning first=258 second=112 amount=-1 +kerning first=290 second=46 amount=-1 +kerning first=284 second=83 amount=-1 +kerning first=374 second=363 amount=-1 +kerning first=241 second=318 amount=-1 +kerning first=79 second=362 amount=-1 +kerning first=277 second=318 amount=-1 +kerning first=356 second=83 amount=-2 +kerning first=117 second=112 amount=-1 +kerning first=313 second=318 amount=-1 +kerning first=364 second=102 amount=-1 +kerning first=250 second=289 amount=-1 +kerning first=317 second=214 amount=-1 +kerning first=207 second=266 amount=-1 +kerning first=45 second=112 amount=-1 +kerning first=66 second=266 amount=-1 +kerning first=268 second=311 amount=-1 +kerning first=344 second=235 amount=-1 +kerning first=378 second=259 amount=-1 +kerning first=321 second=105 amount=-1 +kerning first=380 second=235 amount=-1 +kerning first=88 second=81 amount=-1 +kerning first=249 second=105 amount=-1 +kerning first=99 second=98 amount=-1 +kerning first=378 second=248 amount=-1 +kerning first=234 second=259 amount=-1 +kerning first=76 second=382 amount=-1 +kerning first=198 second=259 amount=-1 +kerning first=366 second=112 amount=-1 +kerning first=197 second=67 amount=-1 +kerning first=330 second=112 amount=-1 +kerning first=108 second=105 amount=-1 +kerning first=282 second=230 amount=-1 +kerning first=1082 second=1079 amount=-1 +kerning first=66 second=204 amount=-2 +kerning first=67 second=282 amount=-1 +kerning first=304 second=249 amount=-1 +kerning first=90 second=379 amount=-1 +kerning first=219 second=346 amount=-1 +kerning first=379 second=275 amount=-1 +kerning first=210 second=230 amount=-1 +kerning first=377 second=327 amount=-1 +kerning first=232 second=249 amount=-1 +kerning first=1046 second=1079 amount=-1 +kerning first=268 second=249 amount=-1 +kerning first=105 second=230 amount=-1 +kerning first=65 second=334 amount=-1 +kerning first=82 second=100 amount=-1 +kerning first=1061 second=1095 amount=-2 +kerning first=118 second=100 amount=-1 +kerning first=255 second=240 amount=-1 +kerning first=1025 second=1095 amount=-1 +kerning first=315 second=204 amount=-1 +kerning first=376 second=249 amount=-1 +kerning first=327 second=346 amount=-1 +kerning first=69 second=230 amount=-1 +kerning first=196 second=107 amount=-1 +kerning first=354 second=339 amount=-2 +kerning first=217 second=8249 amount=-3 +kerning first=220 second=121 amount=-1 +kerning first=381 second=223 amount=-1 +kerning first=232 second=305 amount=-1 +kerning first=268 second=107 amount=-1 +kerning first=232 second=107 amount=-1 +kerning first=84 second=333 amount=-2 +kerning first=66 second=260 amount=-3 +kerning first=298 second=268 amount=-1 +kerning first=8218 second=250 amount=-1 +kerning first=268 second=305 amount=-1 +kerning first=354 second=230 amount=-2 +kerning first=313 second=256 amount=-1 +kerning first=376 second=305 amount=-1 +kerning first=75 second=211 amount=-1 +kerning first=201 second=223 amount=-1 +kerning first=370 second=268 amount=-1 +kerning first=1025 second=1039 amount=-1 +kerning first=369 second=8217 amount=-2 +kerning first=192 second=244 amount=-1 +kerning first=374 second=192 amount=-3 +kerning first=338 second=192 amount=-1 +kerning first=108 second=365 amount=-1 +kerning first=1098 second=1117 amount=-1 +kerning first=262 second=268 amount=-2 +kerning first=71 second=315 amount=-1 +kerning first=264 second=244 amount=-1 +kerning first=220 second=102 amount=-1 +kerning first=72 second=365 amount=-1 +kerning first=315 second=260 amount=-1 +kerning first=8220 second=226 amount=-1 +kerning first=266 second=192 amount=-2 +kerning first=363 second=237 amount=-1 +kerning first=84 second=218 amount=-1 +kerning first=203 second=199 amount=-1 +kerning first=261 second=8217 amount=-1 +kerning first=73 second=263 amount=-1 +kerning first=291 second=237 amount=-1 +kerning first=85 second=268 amount=-1 +kerning first=255 second=237 amount=-1 +kerning first=333 second=8217 amount=-1 +kerning first=89 second=192 amount=-3 +kerning first=228 second=353 amount=-1 +kerning first=219 second=237 amount=-1 +kerning first=73 second=121 amount=-1 +kerning first=217 second=117 amount=-1 +kerning first=199 second=275 amount=-1 +kerning first=264 second=353 amount=-1 +kerning first=206 second=334 amount=-1 +kerning first=375 second=101 amount=-1 +kerning first=352 second=282 amount=-1 +kerning first=284 second=315 amount=-1 +kerning first=8220 second=335 amount=-1 +kerning first=278 second=334 amount=-1 +kerning first=187 second=270 amount=-3 +kerning first=356 second=315 amount=-1 +kerning first=1057 second=1034 amount=-1 +kerning first=217 second=289 amount=-2 +kerning first=78 second=346 amount=-1 +kerning first=268 second=252 amount=-1 +kerning first=321 second=365 amount=-1 +kerning first=8250 second=354 amount=-2 +kerning first=87 second=244 amount=-2 +kerning first=1060 second=1051 amount=-1 +kerning first=88 second=232 amount=-1 +kerning first=104 second=351 amount=-1 +kerning first=72 second=99 amount=-1 +kerning first=74 second=257 amount=-1 +kerning first=1025 second=1065 amount=-1 +kerning first=362 second=277 amount=-1 +kerning first=279 second=249 amount=-1 +kerning first=371 second=8249 amount=-1 +kerning first=113 second=277 amount=-1 +kerning first=108 second=99 amount=-1 +kerning first=214 second=381 amount=-1 +kerning first=71 second=8249 amount=-1 +kerning first=70 second=361 amount=-1 +kerning first=337 second=347 amount=-1 +kerning first=332 second=202 amount=-1 +kerning first=218 second=277 amount=-1 +kerning first=286 second=381 amount=-1 +kerning first=84 second=336 amount=-1 +kerning first=353 second=351 amount=-1 +kerning first=288 second=69 amount=-1 +kerning first=376 second=367 amount=-1 +kerning first=317 second=351 amount=-1 +kerning first=370 second=212 amount=-1 +kerning first=77 second=277 amount=-1 +kerning first=69 second=79 amount=-1 +kerning first=262 second=212 amount=-2 +kerning first=216 second=69 amount=-1 +kerning first=304 second=367 amount=-1 +kerning first=298 second=212 amount=-1 +kerning first=209 second=351 amount=-1 +kerning first=323 second=257 amount=-1 +kerning first=232 second=367 amount=-1 +kerning first=354 second=79 amount=-1 +kerning first=268 second=367 amount=-1 +kerning first=281 second=351 amount=-1 +kerning first=85 second=212 amount=-1 +kerning first=251 second=257 amount=-1 +kerning first=245 second=351 amount=-1 +kerning first=282 second=79 amount=-1 +kerning first=287 second=257 amount=-1 +kerning first=236 second=291 amount=-1 +kerning first=122 second=337 amount=-1 +kerning first=258 second=316 amount=-1 +kerning first=267 second=261 amount=-1 +kerning first=200 second=291 amount=-1 +kerning first=86 second=337 amount=-2 +kerning first=303 second=261 amount=-1 +kerning first=206 second=216 amount=-1 +kerning first=8250 second=298 amount=-3 +kerning first=339 second=261 amount=-1 +kerning first=1044 second=1047 amount=-1 +kerning first=375 second=261 amount=-2 +kerning first=119 second=314 amount=-1 +kerning first=75 second=267 amount=-1 +kerning first=67 second=226 amount=-1 +kerning first=90 second=261 amount=-1 +kerning first=216 second=382 amount=-1 +kerning first=263 second=337 amount=-1 +kerning first=83 second=314 amount=-1 +kerning first=103 second=226 amount=-1 +kerning first=269 second=271 amount=-1 +kerning first=252 second=382 amount=-1 +kerning first=224 second=314 amount=-1 +kerning first=1045 second=1057 amount=-1 +kerning first=378 second=281 amount=-1 +kerning first=288 second=382 amount=-1 +kerning first=1053 second=1104 amount=-1 +kerning first=65 second=216 amount=-1 +kerning first=208 second=226 amount=-1 +kerning first=253 second=171 amount=-2 +kerning first=260 second=314 amount=-1 +kerning first=106 second=361 amount=-1 +kerning first=229 second=347 amount=-1 +kerning first=289 second=171 amount=-1 +kerning first=371 second=337 amount=-1 +kerning first=193 second=347 amount=-1 +kerning first=199 second=269 amount=-1 +kerning first=325 second=171 amount=-2 +kerning first=361 second=171 amount=-1 +kerning first=106 second=255 amount=-1 +kerning first=278 second=216 amount=-1 +kerning first=69 second=224 amount=-1 +kerning first=118 second=326 amount=-1 +kerning first=88 second=347 amount=-1 +kerning first=76 second=171 amount=-1 +kerning first=83 second=202 amount=-1 +kerning first=283 second=361 amount=-1 +kerning first=117 second=316 amount=-1 +kerning first=187 second=326 amount=-1 +kerning first=1042 second=1037 amount=-1 +kerning first=241 second=8221 amount=-2 +kerning first=105 second=224 amount=-1 +kerning first=217 second=171 amount=-3 +kerning first=304 second=45 amount=-2 +kerning first=268 second=45 amount=-2 +kerning first=8220 second=279 amount=-1 +kerning first=210 second=224 amount=-1 +kerning first=379 second=269 amount=-1 +kerning first=89 second=103 amount=-2 +kerning first=376 second=71 amount=-1 +kerning first=98 second=115 amount=-1 +kerning first=229 second=371 amount=-1 +kerning first=67 second=78 amount=-1 +kerning first=275 second=252 amount=-1 +kerning first=282 second=224 amount=-1 +kerning first=253 second=227 amount=-2 +kerning first=354 second=224 amount=-2 +kerning first=217 second=227 amount=-2 +kerning first=317 second=206 amount=-1 +kerning first=222 second=201 amount=-1 +kerning first=225 second=363 amount=-1 +kerning first=286 second=207 amount=-1 +kerning first=196 second=311 amount=-1 +kerning first=291 second=318 amount=-1 +kerning first=268 second=101 amount=-1 +kerning first=81 second=201 amount=-1 +kerning first=316 second=226 amount=-1 +kerning first=310 second=251 amount=-1 +kerning first=374 second=103 amount=-2 +kerning first=304 second=101 amount=-1 +kerning first=45 second=201 amount=-3 +kerning first=1061 second=1101 amount=-1 +kerning first=221 second=90 amount=-1 +kerning first=338 second=103 amount=-1 +kerning first=110 second=316 amount=-1 +kerning first=302 second=103 amount=-1 +kerning first=344 second=291 amount=-1 +kerning first=347 second=252 amount=-1 +kerning first=376 second=101 amount=-2 +kerning first=266 second=103 amount=-1 +kerning first=214 second=207 amount=-1 +kerning first=90 second=317 amount=-1 +kerning first=256 second=362 amount=-2 +kerning first=230 second=103 amount=-1 +kerning first=196 second=45 amount=-2 +kerning first=80 second=356 amount=-1 +kerning first=194 second=103 amount=-1 +kerning first=82 second=44 amount=-1 +kerning first=199 second=213 amount=-2 +kerning first=200 second=84 amount=-1 +kerning first=347 second=104 amount=-1 +kerning first=1047 second=1067 amount=-1 +kerning first=212 second=89 amount=-1 +kerning first=368 second=74 amount=-1 +kerning first=118 second=44 amount=-3 +kerning first=354 second=283 amount=-2 +kerning first=284 second=89 amount=-1 +kerning first=228 second=367 amount=-1 +kerning first=287 second=109 amount=-1 +kerning first=71 second=89 amount=-1 +kerning first=344 second=84 amount=-1 +kerning first=362 second=338 amount=-1 +kerning first=66 second=115 amount=-1 +kerning first=8217 second=111 amount=-2 +kerning first=268 second=193 amount=-2 +kerning first=203 second=370 amount=-1 +kerning first=272 second=84 amount=-1 +kerning first=379 second=213 amount=-1 +kerning first=207 second=115 amount=-1 +kerning first=376 second=193 amount=-3 +kerning first=321 second=303 amount=-1 +kerning first=243 second=115 amount=-1 +kerning first=367 second=44 amount=-1 +kerning first=74 second=109 amount=-1 +kerning first=352 second=78 amount=-1 +kerning first=102 second=115 amount=-1 +kerning first=122 second=8249 amount=-2 +kerning first=325 second=227 amount=-1 +kerning first=249 second=303 amount=-1 +kerning first=289 second=227 amount=-1 +kerning first=280 second=78 amount=-1 +kerning first=351 second=115 amount=-1 +kerning first=259 second=44 amount=-1 +kerning first=256 second=346 amount=-2 +kerning first=223 second=44 amount=-2 +kerning first=8216 second=240 amount=-1 +kerning first=86 second=8249 amount=-3 +kerning first=208 second=78 amount=-1 +kerning first=279 second=115 amount=-1 +kerning first=331 second=44 amount=-1 +kerning first=315 second=115 amount=-1 +kerning first=98 second=104 amount=-1 +kerning first=67 second=75 amount=-1 +kerning first=69 second=374 amount=-1 +kerning first=313 second=368 amount=-1 +kerning first=201 second=78 amount=-1 +kerning first=279 second=378 amount=-1 +kerning first=313 second=203 amount=-1 +kerning first=379 second=68 amount=-1 +kerning first=73 second=375 amount=-1 +kerning first=374 second=248 amount=-2 +kerning first=367 second=361 amount=-1 +kerning first=351 second=118 amount=-1 +kerning first=208 second=75 amount=-1 +kerning first=216 second=323 amount=-1 +kerning first=8218 second=105 amount=-1 +kerning first=218 second=8249 amount=-3 +kerning first=8222 second=230 amount=-1 +kerning first=366 second=198 amount=-2 +kerning first=302 second=248 amount=-1 +kerning first=233 second=120 amount=-1 +kerning first=86 second=278 amount=-1 +kerning first=288 second=323 amount=-1 +kerning first=269 second=120 amount=-1 +kerning first=210 second=85 amount=-1 +kerning first=108 second=253 amount=-1 +kerning first=218 second=117 amount=-1 +kerning first=243 second=118 amount=-1 +kerning first=296 second=113 amount=-1 +kerning first=207 second=118 amount=-1 +kerning first=346 second=298 amount=-1 +kerning first=352 second=75 amount=-1 +kerning first=376 second=196 amount=-3 +kerning first=8220 second=257 amount=-1 +kerning first=315 second=118 amount=-1 +kerning first=69 second=85 amount=-1 +kerning first=249 second=253 amount=-1 +kerning first=279 second=118 amount=-1 +kerning first=280 second=75 amount=-1 +kerning first=211 second=203 amount=-1 +kerning first=113 second=229 amount=-1 +kerning first=66 second=118 amount=-2 +kerning first=77 second=382 amount=-1 +kerning first=268 second=196 amount=-2 +kerning first=321 second=253 amount=-1 +kerning first=86 second=80 amount=-1 +kerning first=310 second=233 amount=-1 +kerning first=83 second=84 amount=-1 +kerning first=199 second=68 amount=-1 +kerning first=368 second=113 amount=-1 +kerning first=100 second=108 amount=-1 +kerning first=382 second=233 amount=-1 +kerning first=78 second=290 amount=-1 +kerning first=1057 second=1087 amount=-1 +kerning first=325 second=283 amount=-1 +kerning first=280 second=338 amount=-1 +kerning first=289 second=283 amount=-1 +kerning first=253 second=283 amount=-1 +kerning first=1042 second=1040 amount=-1 +kerning first=350 second=328 amount=-1 +kerning first=83 second=110 amount=-1 +kerning first=219 second=290 amount=-1 +kerning first=217 second=283 amount=-1 +kerning first=354 second=85 amount=-1 +kerning first=277 second=108 amount=-1 +kerning first=103 second=335 amount=-1 +kerning first=119 second=110 amount=-1 +kerning first=354 second=286 amount=-1 +kerning first=241 second=108 amount=-1 +kerning first=8220 second=220 amount=-1 +kerning first=282 second=85 amount=-1 +kerning first=204 second=67 amount=-1 +kerning first=221 second=241 amount=-1 +kerning first=67 second=338 amount=-2 +kerning first=282 second=286 amount=-1 +kerning first=313 second=108 amount=-1 +kerning first=377 second=380 amount=-1 +kerning first=73 second=115 amount=-1 +kerning first=219 second=231 amount=-1 +kerning first=379 second=331 amount=-1 +kerning first=109 second=115 amount=-1 +kerning first=199 second=65 amount=-2 +kerning first=266 second=248 amount=-1 +kerning first=255 second=231 amount=-1 +kerning first=69 second=286 amount=-1 +kerning first=368 second=110 amount=-1 +kerning first=307 second=331 amount=-1 +kerning first=67 second=335 amount=-1 +kerning first=203 second=193 amount=-1 +kerning first=194 second=248 amount=-1 +kerning first=233 second=380 amount=-1 +kerning first=70 second=279 amount=-1 +kerning first=250 second=115 amount=-1 +kerning first=235 second=331 amount=-1 +kerning first=84 second=70 amount=-1 +kerning first=89 second=248 amount=-2 +kerning first=379 second=65 amount=-1 +kerning first=291 second=231 amount=-1 +kerning first=381 second=78 amount=-1 +kerning first=327 second=231 amount=-1 +kerning first=1046 second=1073 amount=-1 +kerning first=45 second=257 amount=-1 +kerning first=304 second=255 amount=-1 +kerning first=380 second=347 amount=-1 +kerning first=211 second=302 amount=-1 +kerning first=81 second=257 amount=-1 +kerning first=344 second=347 amount=-1 +kerning first=332 second=205 amount=-1 +kerning first=232 second=255 amount=-1 +kerning first=1075 second=1076 amount=-1 +kerning first=196 second=255 amount=-1 +kerning first=230 second=307 amount=-1 +kerning first=1101 second=1078 amount=-1 +kerning first=83 second=205 amount=-1 +kerning first=249 second=289 amount=-1 +kerning first=249 second=250 amount=-1 +kerning first=236 second=347 amount=-1 +kerning first=8222 second=289 amount=-1 +kerning first=78 second=231 amount=-1 +kerning first=200 second=347 amount=-1 +kerning first=337 second=8250 amount=-1 +kerning first=205 second=262 amount=-1 +kerning first=241 second=371 amount=-1 +kerning first=321 second=250 amount=-1 +kerning first=277 second=371 amount=-1 +kerning first=8250 second=316 amount=-1 +kerning first=366 second=257 amount=-2 +kerning first=250 second=378 amount=-1 +kerning first=197 second=212 amount=-1 +kerning first=72 second=250 amount=-1 +kerning first=214 second=378 amount=-1 +kerning first=268 second=203 amount=-1 +kerning first=81 second=366 amount=-1 +kerning first=302 second=353 amount=-1 +kerning first=1070 second=1052 amount=-1 +kerning first=78 second=352 amount=-1 +kerning first=45 second=366 amount=-2 +kerning first=100 second=371 amount=-1 +kerning first=330 second=257 amount=-1 +kerning first=286 second=378 amount=-1 +kerning first=108 second=250 amount=-1 +kerning first=67 second=332 amount=-2 +kerning first=222 second=257 amount=-1 +kerning first=73 second=378 amount=-1 +kerning first=314 second=328 amount=-1 +kerning first=278 second=328 amount=-1 +kerning first=258 second=366 amount=-2 +kerning first=364 second=194 amount=-2 +kerning first=222 second=366 amount=-1 +kerning first=219 second=352 amount=-1 +kerning first=246 second=119 amount=-1 +kerning first=1025 second=1045 amount=-1 +kerning first=352 second=254 amount=-1 +kerning first=200 second=288 amount=-1 +kerning first=232 second=8220 amount=-1 +kerning first=122 second=98 amount=-1 +kerning first=1040 second=1092 amount=-1 +kerning first=70 second=243 amount=-1 +kerning first=377 second=377 amount=-1 +kerning first=114 second=287 amount=-1 +kerning first=222 second=106 amount=-1 +kerning first=280 second=332 amount=-1 +kerning first=78 second=287 amount=-1 +kerning first=219 second=287 amount=-2 +kerning first=119 second=113 amount=-1 +kerning first=76 second=378 amount=-1 +kerning first=1050 second=1090 amount=-1 +kerning first=89 second=242 amount=-1 +kerning first=291 second=287 amount=-1 +kerning first=354 second=345 amount=-1 +kerning first=263 second=281 amount=-1 +kerning first=75 second=217 amount=-1 +kerning first=1058 second=1105 amount=-1 +kerning first=363 second=287 amount=-1 +kerning first=313 second=262 amount=-1 +kerning first=88 second=87 amount=-1 +kerning first=266 second=242 amount=-1 +kerning first=222 second=198 amount=-2 +kerning first=371 second=281 amount=-1 +kerning first=216 second=217 amount=-1 +kerning first=86 second=281 amount=-2 +kerning first=315 second=210 amount=-1 +kerning first=122 second=281 amount=-1 +kerning first=288 second=217 amount=-1 +kerning first=302 second=242 amount=-1 +kerning first=8222 second=224 amount=-1 +kerning first=344 second=288 amount=-1 +kerning first=376 second=255 amount=-1 +kerning first=81 second=198 amount=-2 +kerning first=313 second=197 amount=-1 +kerning first=111 second=119 amount=-1 +kerning first=67 second=279 amount=-1 +kerning first=202 second=354 amount=-1 +kerning first=45 second=254 amount=-1 +kerning first=72 second=45 amount=-2 +kerning first=269 second=324 amount=-1 +kerning first=313 second=374 amount=-1 +kerning first=203 second=249 amount=-1 +kerning first=233 second=324 amount=-1 +kerning first=84 second=274 amount=-1 +kerning first=274 second=354 amount=-1 +kerning first=332 second=379 amount=-1 +kerning first=117 second=254 amount=-1 +kerning first=252 second=119 amount=-1 +kerning first=103 second=279 amount=-1 +kerning first=310 second=354 amount=-1 +kerning first=89 second=304 amount=-1 +kerning first=86 second=74 amount=-2 +kerning first=288 second=119 amount=-1 +kerning first=346 second=354 amount=-1 +kerning first=1053 second=1054 amount=-1 +kerning first=324 second=119 amount=-1 +kerning first=258 second=369 amount=-1 +kerning first=199 second=334 amount=-2 +kerning first=272 second=344 amount=-1 +kerning first=8217 second=256 amount=-3 +kerning first=366 second=369 amount=-1 +kerning first=65 second=233 amount=-1 +kerning first=8250 second=351 amount=-1 +kerning first=330 second=369 amount=-1 +kerning first=105 second=289 amount=-1 +kerning first=74 second=264 amount=-1 +kerning first=272 second=229 amount=-1 +kerning first=8217 second=371 amount=-1 +kerning first=217 second=339 amount=-1 +kerning first=219 second=234 amount=-1 +kerning first=255 second=234 amount=-1 +kerning first=200 second=229 amount=-1 +kerning first=200 second=344 amount=-1 +kerning first=291 second=234 amount=-1 +kerning first=236 second=229 amount=-1 +kerning first=81 second=106 amount=-1 +kerning first=325 second=339 amount=-1 +kerning first=86 second=284 amount=-1 +kerning first=117 second=106 amount=-1 +kerning first=377 second=324 amount=-1 +kerning first=368 second=97 amount=-2 +kerning first=316 second=279 amount=-1 +kerning first=253 second=339 amount=-1 +kerning first=78 second=234 amount=-1 +kerning first=344 second=229 amount=-1 +kerning first=45 second=106 amount=-1 +kerning first=289 second=339 amount=-1 +kerning first=1057 second=1084 amount=-1 +kerning first=380 second=229 amount=-1 +kerning first=232 second=8217 amount=-1 +kerning first=205 second=111 amount=-1 +kerning first=196 second=199 amount=-1 +kerning first=199 second=219 amount=-1 +kerning first=368 second=264 amount=-1 +kerning first=377 second=209 amount=-1 +kerning first=268 second=199 amount=-2 +kerning first=1054 second=1064 amount=-1 +kerning first=296 second=264 amount=-1 +kerning first=8216 second=246 amount=-1 +kerning first=304 second=199 amount=-1 +kerning first=327 second=234 amount=-1 +kerning first=260 second=264 amount=-1 +kerning first=1040 second=1089 amount=-1 +kerning first=354 second=82 amount=-1 +kerning first=376 second=199 amount=-1 +kerning first=196 second=8217 amount=-3 +kerning first=264 second=105 amount=-1 +kerning first=379 second=334 amount=-1 +kerning first=243 second=121 amount=-1 +kerning first=203 second=364 amount=-1 +kerning first=252 second=251 amount=-1 +kerning first=210 second=289 amount=-1 +kerning first=207 second=121 amount=-1 +kerning first=210 second=82 amount=-1 +kerning first=216 second=66 amount=-1 +kerning first=1114 second=1099 amount=-1 +kerning first=246 second=289 amount=-1 +kerning first=80 second=244 amount=-1 +kerning first=282 second=289 amount=-1 +kerning first=282 second=82 amount=-1 +kerning first=1040 second=1086 amount=-1 +kerning first=354 second=289 amount=-2 +kerning first=221 second=244 amount=-2 +kerning first=258 second=254 amount=-1 +kerning first=69 second=82 amount=-1 +kerning first=288 second=66 amount=-1 +kerning first=371 second=225 amount=-1 +kerning first=269 second=117 amount=-1 +kerning first=67 second=72 amount=-1 +kerning first=89 second=97 amount=-2 +kerning first=211 second=296 amount=-1 +kerning first=233 second=117 amount=-1 +kerning first=313 second=200 amount=-1 +kerning first=111 second=122 amount=-1 +kerning first=290 second=76 amount=-1 +kerning first=108 second=102 amount=-1 +kerning first=305 second=117 amount=-1 +kerning first=374 second=245 amount=-2 +kerning first=45 second=251 amount=-1 +kerning first=266 second=97 amount=-1 +kerning first=85 second=227 amount=-2 +kerning first=263 second=225 amount=-1 +kerning first=377 second=117 amount=-1 +kerning first=208 second=72 amount=-1 +kerning first=302 second=97 amount=-1 +kerning first=86 second=77 amount=-1 +kerning first=351 second=121 amount=-1 +kerning first=117 second=251 amount=-1 +kerning first=288 second=122 amount=-1 +kerning first=379 second=71 amount=-1 +kerning first=315 second=121 amount=-1 +kerning first=258 second=251 amount=-1 +kerning first=252 second=122 amount=-1 +kerning first=280 second=72 amount=-1 +kerning first=279 second=121 amount=-1 +kerning first=216 second=122 amount=-1 +kerning first=194 second=245 amount=-1 +kerning first=330 second=251 amount=-1 +kerning first=213 second=46 amount=-1 +kerning first=338 second=97 amount=-1 +kerning first=89 second=245 amount=-2 +kerning first=89 second=363 amount=-1 +kerning first=249 second=46 amount=-1 +kerning first=1045 second=1063 amount=-1 +kerning first=374 second=97 amount=-2 +kerning first=366 second=251 amount=-1 +kerning first=194 second=363 amount=-1 +kerning first=8222 second=227 amount=-1 +kerning first=302 second=245 amount=-1 +kerning first=230 second=363 amount=-1 +kerning first=249 second=102 amount=-1 +kerning first=197 second=117 amount=-1 +kerning first=377 second=206 amount=-1 +kerning first=266 second=245 amount=-1 +kerning first=327 second=290 amount=-1 +kerning first=72 second=46 amount=-1 +kerning first=100 second=318 amount=-1 +kerning first=302 second=363 amount=-1 +kerning first=222 second=310 amount=-1 +kerning first=78 second=83 amount=-1 +kerning first=83 second=116 amount=-1 +kerning first=283 second=355 amount=-1 +kerning first=81 second=310 amount=-1 +kerning first=219 second=83 amount=-1 +kerning first=213 second=194 amount=-2 +kerning first=202 second=298 amount=-1 +kerning first=70 second=240 amount=-1 +kerning first=327 second=83 amount=-1 +kerning first=1098 second=1114 amount=-1 +kerning first=72 second=253 amount=-1 +kerning first=1042 second=1043 amount=-1 +kerning first=274 second=298 amount=-1 +kerning first=117 second=369 amount=-1 +kerning first=84 second=330 amount=-1 +kerning first=208 second=220 amount=-1 +kerning first=205 second=259 amount=-1 +kerning first=67 second=220 amount=-1 +kerning first=218 second=230 amount=-2 +kerning first=1059 second=1094 amount=-2 +kerning first=374 second=304 amount=-1 +kerning first=109 second=375 amount=-1 +kerning first=277 second=259 amount=-1 +kerning first=199 second=71 amount=-2 +kerning first=75 second=214 amount=-1 +kerning first=352 second=220 amount=-1 +kerning first=119 second=116 amount=-1 +kerning first=338 second=304 amount=-1 +kerning first=45 second=369 amount=-1 +kerning first=260 second=116 amount=-1 +kerning first=1070 second=1049 amount=-1 +kerning first=321 second=194 amount=-1 +kerning first=280 second=220 amount=-1 +kerning first=1077 second=1095 amount=-1 +kerning first=266 second=304 amount=-1 +kerning first=336 second=90 amount=-1 +kerning first=66 second=201 amount=-2 +kerning first=346 second=317 amount=-1 +kerning first=350 second=77 amount=-1 +kerning first=89 second=298 amount=-1 +kerning first=365 second=291 amount=-1 +kerning first=76 second=76 amount=-1 +kerning first=1114 second=1082 amount=-1 +kerning first=278 second=77 amount=-1 +kerning first=67 second=290 amount=-2 +kerning first=1063 second=1108 amount=-1 +kerning first=119 second=227 amount=-2 +kerning first=78 second=240 amount=-1 +kerning first=1057 second=1037 amount=-1 +kerning first=257 second=291 amount=-1 +kerning first=65 second=337 amount=-1 +kerning first=202 second=317 amount=-1 +kerning first=83 second=227 amount=-1 +kerning first=288 second=304 amount=-1 +kerning first=266 second=298 amount=-1 +kerning first=87 second=350 amount=-2 +kerning first=201 second=97 amount=-1 +kerning first=221 second=291 amount=-2 +kerning first=377 second=330 amount=-1 +kerning first=298 second=100 amount=-1 +kerning first=274 second=317 amount=-1 +kerning first=216 second=304 amount=-1 +kerning first=338 second=298 amount=-1 +kerning first=283 second=324 amount=-1 +kerning first=232 second=110 amount=-1 +kerning first=80 second=291 amount=-1 +kerning first=264 second=350 amount=-1 +kerning first=268 second=110 amount=-1 +kerning first=206 second=337 amount=-1 +kerning first=333 second=311 amount=-1 +kerning first=87 second=90 amount=-1 +kerning first=1059 second=1088 amount=-2 +kerning first=192 second=350 amount=-2 +kerning first=333 second=187 amount=-1 +kerning first=106 second=324 amount=-1 +kerning first=376 second=110 amount=-1 +kerning first=198 second=318 amount=-1 +kerning first=264 second=90 amount=-1 +kerning first=107 second=259 amount=-1 +kerning first=234 second=318 amount=-1 +kerning first=381 second=97 amount=-1 +kerning first=314 second=337 amount=-1 +kerning first=336 second=350 amount=-1 +kerning first=256 second=71 amount=-1 +kerning first=216 second=44 amount=-1 +kerning first=289 second=250 amount=-1 +kerning first=199 second=381 amount=-1 +kerning first=269 second=234 amount=-1 +kerning first=68 second=374 amount=-1 +kerning first=354 second=334 amount=-1 +kerning first=364 second=365 amount=-1 +kerning first=288 second=44 amount=-1 +kerning first=364 second=303 amount=-1 +kerning first=252 second=44 amount=-1 +kerning first=212 second=90 amount=-1 +kerning first=214 second=260 amount=-2 +kerning first=206 second=213 amount=-1 +kerning first=286 second=260 amount=-1 +kerning first=379 second=381 amount=-1 +kerning first=66 second=325 amount=-2 +kerning first=8218 second=356 amount=-3 +kerning first=84 second=187 amount=-1 +kerning first=111 second=44 amount=-2 +kerning first=278 second=213 amount=-1 +kerning first=75 second=44 amount=-1 +kerning first=262 second=374 amount=-1 +kerning first=274 second=85 amount=-1 +kerning first=119 second=351 amount=-1 +kerning first=296 second=227 amount=-1 +kerning first=374 second=298 amount=-1 +kerning first=275 second=241 amount=-1 +kerning first=219 second=111 amount=-1 +kerning first=115 second=303 amount=-1 +kerning first=83 second=351 amount=-1 +kerning first=1056 second=1077 amount=-1 +kerning first=198 second=194 amount=-1 +kerning first=255 second=111 amount=-1 +kerning first=311 second=277 amount=-1 +kerning first=224 second=351 amount=-1 +kerning first=377 second=70 amount=-1 +kerning first=315 second=201 amount=-1 +kerning first=334 second=207 amount=-1 +kerning first=327 second=111 amount=-1 +kerning first=69 second=104 amount=-1 +kerning first=324 second=44 amount=-1 +kerning first=356 second=284 amount=-1 +kerning first=346 second=204 amount=-1 +kerning first=78 second=111 amount=-1 +kerning first=1113 second=1074 amount=-1 +kerning first=202 second=229 amount=-1 +kerning first=368 second=227 amount=-2 +kerning first=220 second=303 amount=-1 +kerning first=332 second=227 amount=-1 +kerning first=248 second=380 amount=-1 +kerning first=107 second=8249 amount=-2 +kerning first=376 second=362 amount=-1 +kerning first=332 second=8220 amount=-1 +kerning first=193 second=235 amount=-1 +kerning first=284 second=380 amount=-1 +kerning first=266 second=270 amount=-1 +kerning first=8222 second=252 amount=-1 +kerning first=87 second=118 amount=-1 +kerning first=374 second=270 amount=-1 +kerning first=228 second=118 amount=-1 +kerning first=260 second=8220 amount=-3 +kerning first=313 second=377 amount=-1 +kerning first=74 second=248 amount=-1 +kerning first=356 second=380 amount=-2 +kerning first=338 second=270 amount=-1 +kerning first=192 second=118 amount=-2 +kerning first=101 second=105 amount=-1 +kerning first=224 second=8220 amount=-1 +kerning first=120 second=283 amount=-1 +kerning first=71 second=380 amount=-1 +kerning first=314 second=241 amount=-1 +kerning first=376 second=206 amount=-1 +kerning first=122 second=287 amount=-1 +kerning first=364 second=228 amount=-1 +kerning first=278 second=241 amount=-1 +kerning first=346 second=345 amount=-1 +kerning first=346 second=85 amount=-1 +kerning first=83 second=8220 amount=-1 +kerning first=227 second=287 amount=-1 +kerning first=310 second=85 amount=-1 +kerning first=212 second=380 amount=-1 +kerning first=350 second=241 amount=-1 +kerning first=1058 second=1100 amount=-1 +kerning first=110 second=112 amount=-1 +kerning first=74 second=112 amount=-1 +kerning first=211 second=193 amount=-2 +kerning first=101 second=241 amount=-1 +kerning first=263 second=287 amount=-1 +kerning first=70 second=193 amount=-2 +kerning first=371 second=287 amount=-1 +kerning first=115 second=228 amount=-1 +kerning first=315 second=325 amount=-1 +kerning first=335 second=287 amount=-1 +kerning first=287 second=248 amount=-1 +kerning first=79 second=228 amount=-1 +kerning first=221 second=263 amount=-2 +kerning first=323 second=248 amount=-1 +kerning first=81 second=46 amount=-1 +kerning first=212 second=8249 amount=-1 +kerning first=88 second=235 amount=-1 +kerning first=213 second=197 amount=-2 +kerning first=364 second=331 amount=-1 +kerning first=307 second=365 amount=-1 +kerning first=368 second=255 amount=-1 +kerning first=374 second=366 amount=-1 +kerning first=79 second=200 amount=-1 +kerning first=338 second=366 amount=-1 +kerning first=211 second=221 amount=-1 +kerning first=321 second=197 amount=-1 +kerning first=378 second=318 amount=-1 +kerning first=296 second=255 amount=-1 +kerning first=323 second=112 amount=-1 +kerning first=284 second=256 amount=-1 +kerning first=260 second=255 amount=-1 +kerning first=266 second=366 amount=-1 +kerning first=220 second=331 amount=-1 +kerning first=197 second=262 amount=-1 +kerning first=248 second=289 amount=-1 +kerning first=224 second=255 amount=-1 +kerning first=251 second=112 amount=-1 +kerning first=83 second=255 amount=-1 +kerning first=198 second=290 amount=-1 +kerning first=199 second=74 amount=-1 +kerning first=193 second=338 amount=-1 +kerning first=197 second=98 amount=-1 +kerning first=76 second=219 amount=-1 +kerning first=310 second=214 amount=-1 +kerning first=305 second=98 amount=-1 +kerning first=231 second=314 amount=-1 +kerning first=88 second=338 amount=-1 +kerning first=290 second=352 amount=-1 +kerning first=269 second=98 amount=-1 +kerning first=195 second=314 amount=-1 +kerning first=202 second=214 amount=-1 +kerning first=303 second=314 amount=-1 +kerning first=89 second=65 amount=-3 +kerning first=314 second=105 amount=-1 +kerning first=84 second=283 amount=-2 +kerning first=325 second=214 amount=-1 +kerning first=267 second=314 amount=-1 +kerning first=211 second=352 amount=-1 +kerning first=350 second=105 amount=-1 +kerning first=194 second=366 amount=-2 +kerning first=274 second=214 amount=-1 +kerning first=375 second=314 amount=-1 +kerning first=242 second=105 amount=-1 +kerning first=339 second=314 amount=-1 +kerning first=89 second=366 amount=-1 +kerning first=204 second=333 amount=-1 +kerning first=85 second=346 amount=-1 +kerning first=230 second=106 amount=-1 +kerning first=213 second=68 amount=-1 +kerning first=213 second=80 amount=-1 +kerning first=248 second=8221 amount=-1 +kerning first=321 second=80 amount=-1 +kerning first=284 second=8221 amount=-1 +kerning first=367 second=307 amount=-1 +kerning first=218 second=67 amount=-1 +kerning first=298 second=346 amount=-1 +kerning first=253 second=224 amount=-1 +kerning first=321 second=68 amount=-1 +kerning first=68 second=217 amount=-1 +kerning first=1047 second=1059 amount=-1 +kerning first=262 second=346 amount=-1 +kerning first=217 second=224 amount=-1 +kerning first=280 second=81 amount=-1 +kerning first=266 second=106 amount=-1 +kerning first=325 second=224 amount=-1 +kerning first=99 second=333 amount=-1 +kerning first=77 second=67 amount=-1 +kerning first=326 second=45 amount=-1 +kerning first=71 second=256 amount=-1 +kerning first=85 second=243 amount=-1 +kerning first=231 second=230 amount=-1 +kerning first=121 second=243 amount=-1 +kerning first=370 second=346 amount=-1 +kerning first=90 second=230 amount=-1 +kerning first=334 second=346 amount=-1 +kerning first=222 second=204 amount=-1 +kerning first=212 second=256 amount=-2 +kerning first=118 second=307 amount=-1 +kerning first=187 second=307 amount=-1 +kerning first=311 second=101 amount=-1 +kerning first=1074 second=1095 amount=-1 +kerning first=101 second=361 amount=-1 +kerning first=362 second=67 amount=-1 +kerning first=262 second=109 amount=-1 +kerning first=327 second=268 amount=-1 +kerning first=86 second=334 amount=-1 +kerning first=1042 second=1034 amount=-1 +kerning first=1059 second=1060 amount=-1 +kerning first=316 second=229 amount=-1 +kerning first=68 second=69 amount=-1 +kerning first=212 second=120 amount=-1 +kerning first=1030 second=1072 amount=-1 +kerning first=89 second=251 amount=-1 +kerning first=262 second=243 amount=-1 +kerning first=255 second=225 amount=-2 +kerning first=8218 second=225 amount=-1 +kerning first=298 second=243 amount=-1 +kerning first=81 second=204 amount=-1 +kerning first=194 second=251 amount=-1 +kerning first=219 second=268 amount=-1 +kerning first=45 second=204 amount=-3 +kerning first=370 second=243 amount=-1 +kerning first=187 second=192 amount=-2 +kerning first=266 second=251 amount=-1 +kerning first=230 second=251 amount=-1 +kerning first=268 second=79 amount=-2 +kerning first=78 second=268 amount=-1 +kerning first=317 second=217 amount=-1 +kerning first=338 second=251 amount=-1 +kerning first=103 second=229 amount=-1 +kerning first=368 second=380 amount=-1 +kerning first=302 second=251 amount=-1 +kerning first=381 second=282 amount=-1 +kerning first=248 second=120 amount=-1 +kerning first=352 second=229 amount=-1 +kerning first=8220 second=100 amount=-1 +kerning first=264 second=118 amount=-1 +kerning first=374 second=251 amount=-1 +kerning first=86 second=203 amount=-1 +kerning first=280 second=229 amount=-1 +kerning first=207 second=244 amount=-1 +kerning first=356 second=120 amount=-1 +kerning first=268 second=214 amount=-2 +kerning first=316 second=257 amount=-1 +kerning first=258 second=232 amount=-1 +kerning first=90 second=202 amount=-1 +kerning first=212 second=368 amount=-1 +kerning first=352 second=257 amount=-1 +kerning first=366 second=232 amount=-1 +kerning first=71 second=368 amount=-1 +kerning first=85 second=231 amount=-1 +kerning first=330 second=232 amount=-1 +kerning first=280 second=257 amount=-1 +kerning first=77 second=336 amount=-1 +kerning first=325 second=79 amount=-1 +kerning first=356 second=368 amount=-1 +kerning first=208 second=257 amount=-1 +kerning first=86 second=219 amount=-1 +kerning first=66 second=8250 amount=-1 +kerning first=69 second=8249 amount=-1 +kerning first=67 second=257 amount=-1 +kerning first=218 second=336 amount=-1 +kerning first=204 second=361 amount=-1 +kerning first=103 second=257 amount=-1 +kerning first=72 second=244 amount=-1 +kerning first=307 second=121 amount=-1 +kerning first=82 second=267 amount=-1 +kerning first=310 second=213 amount=-1 +kerning first=82 second=103 amount=-1 +kerning first=108 second=244 amount=-1 +kerning first=118 second=267 amount=-1 +kerning first=198 second=278 amount=-1 +kerning first=235 second=121 amount=-1 +kerning first=8222 second=116 amount=-1 +kerning first=362 second=336 amount=-1 +kerning first=236 second=318 amount=-1 +kerning first=317 second=69 amount=-1 +kerning first=217 second=79 amount=-1 +kerning first=76 second=79 amount=-1 +kerning first=90 second=66 amount=-1 +kerning first=205 second=117 amount=-1 +kerning first=204 second=246 amount=-1 +kerning first=76 second=107 amount=-1 +kerning first=223 second=382 amount=-1 +kerning first=90 second=82 amount=-1 +kerning first=45 second=347 amount=-1 +kerning first=1052 second=1057 amount=-1 +kerning first=99 second=246 amount=-1 +kerning first=8218 second=253 amount=-1 +kerning first=72 second=216 amount=-1 +kerning first=241 second=117 amount=-1 +kerning first=112 second=107 amount=-1 +kerning first=339 second=230 amount=-1 +kerning first=313 second=117 amount=-1 +kerning first=375 second=230 amount=-2 +kerning first=205 second=281 amount=-1 +kerning first=332 second=196 amount=-2 +kerning first=267 second=230 amount=-1 +kerning first=379 second=121 amount=-2 +kerning first=118 second=382 amount=-1 +kerning first=317 second=205 amount=-1 +kerning first=303 second=230 amount=-1 +kerning first=187 second=382 amount=-3 +kerning first=321 second=216 amount=-1 +kerning first=68 second=205 amount=-1 +kerning first=291 second=240 amount=-1 +kerning first=366 second=347 amount=-1 +kerning first=363 second=371 amount=-1 +kerning first=330 second=347 amount=-1 +kerning first=243 second=8250 amount=-1 +kerning first=313 second=217 amount=-1 +kerning first=219 second=240 amount=-1 +kerning first=279 second=8250 amount=-1 +kerning first=258 second=347 amount=-1 +kerning first=354 second=81 amount=-1 +kerning first=253 second=107 amount=-1 +kerning first=367 second=382 amount=-1 +kerning first=8250 second=217 amount=-2 +kerning first=100 second=117 amount=-1 +kerning first=327 second=240 amount=-1 +kerning first=121 second=271 amount=-1 +kerning first=1040 second=1095 amount=-1 +kerning first=117 second=347 amount=-1 +kerning first=289 second=107 amount=-1 +kerning first=291 second=371 amount=-1 +kerning first=80 second=80 amount=-1 +kerning first=88 second=226 amount=-1 +kerning first=70 second=336 amount=-1 +kerning first=350 second=65 amount=-2 +kerning first=69 second=252 amount=-1 +kerning first=363 second=365 amount=-1 +kerning first=8220 second=84 amount=-1 +kerning first=105 second=252 amount=-1 +kerning first=283 second=305 amount=-1 +kerning first=187 second=122 amount=-3 +kerning first=275 second=249 amount=-1 +kerning first=118 second=122 amount=-1 +kerning first=256 second=219 amount=-2 +kerning first=115 second=305 amount=-1 +kerning first=199 second=266 amount=-2 +kerning first=381 second=245 amount=-1 +kerning first=8218 second=365 amount=-1 +kerning first=354 second=252 amount=-1 +kerning first=274 second=202 amount=-1 +kerning first=88 second=261 amount=-1 +kerning first=243 second=316 amount=-1 +kerning first=79 second=219 amount=-1 +kerning first=279 second=316 amount=-1 +kerning first=202 second=202 amount=-1 +kerning first=370 second=335 amount=-1 +kerning first=298 second=259 amount=-1 +kerning first=315 second=316 amount=-1 +kerning first=262 second=259 amount=-1 +kerning first=351 second=316 amount=-1 +kerning first=331 second=98 amount=-1 +kerning first=370 second=259 amount=-2 +kerning first=346 second=69 amount=-1 +kerning first=118 second=113 amount=-1 +kerning first=282 second=252 amount=-1 +kerning first=346 second=202 amount=-1 +kerning first=171 second=84 amount=-2 +kerning first=121 second=259 amount=-2 +kerning first=74 second=332 amount=-1 +kerning first=106 second=45 amount=-1 +kerning first=201 second=369 amount=-1 +kerning first=85 second=259 amount=-2 +kerning first=89 second=382 amount=-2 +kerning first=269 second=246 amount=-1 +kerning first=70 second=45 amount=-2 +kerning first=287 second=103 amount=-1 +kerning first=253 second=116 amount=-1 +kerning first=365 second=375 amount=-1 +kerning first=251 second=103 amount=-1 +kerning first=197 second=246 amount=-1 +kerning first=101 second=253 amount=-1 +kerning first=352 second=109 amount=-1 +kerning first=231 second=231 amount=-1 +kerning first=110 second=103 amount=-1 +kerning first=323 second=332 amount=-1 +kerning first=355 second=45 amount=-1 +kerning first=74 second=103 amount=-1 +kerning first=242 second=253 amount=-1 +kerning first=374 second=382 amount=-2 +kerning first=264 second=362 amount=-1 +kerning first=118 second=279 amount=-1 +kerning first=8222 second=364 amount=-2 +kerning first=316 second=109 amount=-1 +kerning first=336 second=362 amount=-1 +kerning first=280 second=109 amount=-1 +kerning first=223 second=122 amount=-1 +kerning first=321 second=356 amount=-1 +kerning first=67 second=109 amount=-1 +kerning first=381 second=369 amount=-1 +kerning first=8217 second=117 amount=-1 +kerning first=230 second=382 amount=-1 +kerning first=87 second=362 amount=-1 +kerning first=289 second=116 amount=-1 +kerning first=266 second=382 amount=-1 +kerning first=257 second=375 amount=-1 +kerning first=82 second=279 amount=-1 +kerning first=1100 second=1081 amount=-1 +kerning first=213 second=356 amount=-1 +kerning first=302 second=382 amount=-1 +kerning first=192 second=362 amount=-2 +kerning first=221 second=375 amount=-1 +kerning first=367 second=122 amount=-1 +kerning first=338 second=382 amount=-1 +kerning first=381 second=242 amount=-1 +kerning first=257 second=115 amount=-1 +kerning first=67 second=374 amount=-1 +kerning first=350 second=68 amount=-1 +kerning first=79 second=80 amount=-1 +kerning first=1116 second=1086 amount=-1 +kerning first=260 second=370 amount=-2 +kerning first=278 second=68 amount=-1 +kerning first=221 second=115 amount=-2 +kerning first=82 second=119 amount=-1 +kerning first=332 second=370 amount=-1 +kerning first=315 second=313 amount=-1 +kerning first=118 second=119 amount=-1 +kerning first=8216 second=352 amount=-1 +kerning first=187 second=119 amount=-2 +kerning first=221 second=363 amount=-1 +kerning first=223 second=119 amount=-1 +kerning first=69 second=280 amount=-1 +kerning first=365 second=115 amount=-1 +kerning first=259 second=119 amount=-1 +kerning first=350 second=318 amount=-1 +kerning first=295 second=119 amount=-1 +kerning first=248 second=108 amount=-1 +kerning first=8218 second=257 amount=-1 +kerning first=1043 second=1090 amount=-1 +kerning first=211 second=73 amount=-1 +kerning first=66 second=313 amount=-2 +kerning first=350 second=253 amount=-1 +kerning first=367 second=119 amount=-1 +kerning first=101 second=119 amount=-1 +kerning first=79 second=315 amount=-1 +kerning first=83 second=370 amount=-1 +kerning first=377 second=246 amount=-1 +kerning first=73 second=269 amount=-1 +kerning first=8220 second=333 amount=-1 +kerning first=1049 second=1105 amount=-1 +kerning first=370 second=231 amount=-1 +kerning first=1060 second=1041 amount=-1 +kerning first=321 second=328 amount=-1 +kerning first=206 second=225 amount=-1 +kerning first=298 second=231 amount=-1 +kerning first=1040 second=1098 amount=-1 +kerning first=226 second=371 amount=-1 +kerning first=278 second=225 amount=-1 +kerning first=73 second=117 amount=-1 +kerning first=84 second=196 amount=-3 +kerning first=356 second=100 amount=-2 +kerning first=110 second=363 amount=-1 +kerning first=74 second=335 amount=-1 +kerning first=101 second=225 amount=-1 +kerning first=198 second=203 amount=-1 +kerning first=251 second=363 amount=-1 +kerning first=112 second=8217 amount=-1 +kerning first=197 second=218 amount=-2 +kerning first=378 second=46 amount=-1 +kerning first=287 second=363 amount=-1 +kerning first=216 second=8249 amount=-1 +kerning first=210 second=280 amount=-1 +kerning first=323 second=363 amount=-1 +kerning first=1042 second=1024 amount=-1 +kerning first=338 second=378 amount=-1 +kerning first=198 second=46 amount=-1 +kerning first=282 second=280 amount=-1 +kerning first=80 second=115 amount=-1 +kerning first=314 second=225 amount=-1 +kerning first=212 second=8221 amount=-1 +kerning first=234 second=46 amount=-2 +kerning first=262 second=231 amount=-1 +kerning first=350 second=225 amount=-1 +kerning first=71 second=8221 amount=-1 +kerning first=354 second=280 amount=-1 +kerning first=121 second=231 amount=-1 +kerning first=1104 second=1076 amount=-1 +kerning first=76 second=8217 amount=-2 +kerning first=87 second=102 amount=-1 +kerning first=330 second=235 amount=-1 +kerning first=203 second=261 amount=-1 +kerning first=1114 second=1118 amount=-1 +kerning first=195 second=211 amount=-1 +kerning first=366 second=235 amount=-1 +kerning first=1078 second=1118 amount=-1 +kerning first=200 second=210 amount=-1 +kerning first=275 second=261 amount=-1 +kerning first=90 second=211 amount=-1 +kerning first=311 second=261 amount=-1 +kerning first=83 second=367 amount=-1 +kerning first=361 second=8220 amount=-2 +kerning first=375 second=326 amount=-1 +kerning first=350 second=250 amount=-1 +kerning first=1061 second=1092 amount=-1 +kerning first=290 second=296 amount=-1 +kerning first=356 second=235 amount=-1 +kerning first=244 second=112 amount=-1 +kerning first=231 second=326 amount=-1 +kerning first=262 second=86 amount=-1 +kerning first=267 second=326 amount=-1 +kerning first=206 second=250 amount=-1 +kerning first=112 second=8220 amount=-1 +kerning first=303 second=326 amount=-1 +kerning first=314 second=250 amount=-1 +kerning first=290 second=327 amount=-1 +kerning first=76 second=8220 amount=-2 +kerning first=339 second=326 amount=-1 +kerning first=278 second=250 amount=-1 +kerning first=116 second=378 amount=-1 +kerning first=8217 second=120 amount=-1 +kerning first=67 second=112 amount=-1 +kerning first=65 second=250 amount=-1 +kerning first=347 second=261 amount=-1 +kerning first=90 second=326 amount=-1 +kerning first=108 second=328 amount=-1 +kerning first=258 second=235 amount=-1 +kerning first=84 second=171 amount=-3 +kerning first=206 second=244 amount=-1 +kerning first=334 second=86 amount=-1 +kerning first=101 second=250 amount=-1 +kerning first=120 second=171 amount=-2 +kerning first=99 second=237 amount=-1 +kerning first=66 second=288 amount=-1 +kerning first=323 second=100 amount=-1 +kerning first=350 second=365 amount=-1 +kerning first=1043 second=1093 amount=-2 +kerning first=201 second=366 amount=-1 +kerning first=365 second=378 amount=-1 +kerning first=314 second=365 amount=-1 +kerning first=278 second=365 amount=-1 +kerning first=311 second=113 amount=-1 +kerning first=262 second=262 amount=-2 +kerning first=85 second=83 amount=-1 +kerning first=216 second=106 amount=-1 +kerning first=206 second=365 amount=-1 +kerning first=1060 second=1113 amount=-1 +kerning first=352 second=112 amount=-1 +kerning first=221 second=378 amount=-2 +kerning first=369 second=171 amount=-1 +kerning first=222 second=76 amount=-1 +kerning first=316 second=112 amount=-1 +kerning first=307 second=353 amount=-1 +kerning first=8250 second=69 amount=-3 +kerning first=280 second=112 amount=-1 +kerning first=262 second=83 amount=-1 +kerning first=222 second=87 amount=-1 +kerning first=264 second=275 amount=-1 +kerning first=298 second=83 amount=-1 +kerning first=258 second=87 amount=-3 +kerning first=354 second=249 amount=-1 +kerning first=204 second=352 amount=-1 +kerning first=334 second=83 amount=-1 +kerning first=288 second=193 amount=-1 +kerning first=74 second=100 amount=-1 +kerning first=192 second=275 amount=-1 +kerning first=370 second=83 amount=-1 +kerning first=282 second=249 amount=-1 +kerning first=203 second=286 amount=-1 +kerning first=199 second=353 amount=-1 +kerning first=207 second=210 amount=-1 +kerning first=45 second=87 amount=-2 +kerning first=1074 second=1091 amount=-1 +kerning first=87 second=275 amount=-2 +kerning first=81 second=87 amount=-1 +kerning first=207 second=288 amount=-1 +kerning first=379 second=203 amount=-1 +kerning first=315 second=288 amount=-1 +kerning first=344 second=210 amount=-1 +kerning first=85 second=262 amount=-1 +kerning first=370 second=114 amount=-1 +kerning first=99 second=324 amount=-1 +kerning first=354 second=364 amount=-1 +kerning first=368 second=339 amount=-1 +kerning first=67 second=84 amount=-1 +kerning first=253 second=233 amount=-1 +kerning first=260 second=339 amount=-1 +kerning first=217 second=233 amount=-1 +kerning first=298 second=334 amount=-1 +kerning first=98 second=289 amount=-1 +kerning first=296 second=339 amount=-1 +kerning first=325 second=233 amount=-1 +kerning first=262 second=114 amount=-1 +kerning first=289 second=233 amount=-1 +kerning first=203 second=289 amount=-1 +kerning first=121 second=114 amount=-1 +kerning first=69 second=249 amount=-1 +kerning first=208 second=84 amount=-1 +kerning first=105 second=249 amount=-1 +kerning first=275 second=289 amount=-1 +kerning first=87 second=99 amount=-2 +kerning first=85 second=234 amount=-1 +kerning first=121 second=234 amount=-1 +kerning first=45 second=205 amount=-3 +kerning first=268 second=274 amount=-1 +kerning first=203 second=110 amount=-1 +kerning first=352 second=84 amount=-1 +kerning first=217 second=379 amount=-1 +kerning first=275 second=110 amount=-1 +kerning first=240 second=237 amount=-1 +kerning first=347 second=110 amount=-1 +kerning first=199 second=350 amount=-1 +kerning first=376 second=274 amount=-1 +kerning first=232 second=187 amount=-1 +kerning first=119 second=339 amount=-1 +kerning first=370 second=234 amount=-1 +kerning first=368 second=369 amount=-1 +kerning first=77 second=212 amount=-1 +kerning first=354 second=277 amount=-2 +kerning first=80 second=260 amount=-2 +kerning first=107 second=111 amount=-1 +kerning first=8220 second=229 amount=-1 +kerning first=262 second=234 amount=-1 +kerning first=268 second=302 amount=-1 +kerning first=298 second=234 amount=-1 +kerning first=66 second=316 amount=-1 +kerning first=102 second=316 amount=1 +kerning first=325 second=264 amount=-1 +kerning first=221 second=260 amount=-3 +kerning first=1025 second=1064 amount=-1 +kerning first=211 second=76 amount=-1 +kerning first=69 second=364 amount=-1 +kerning first=289 second=351 amount=-1 +kerning first=311 second=289 amount=-1 +kerning first=356 second=111 amount=-2 +kerning first=253 second=351 amount=-1 +kerning first=347 second=289 amount=-1 +kerning first=90 second=354 amount=-1 +kerning first=217 second=264 amount=-1 +kerning first=368 second=367 amount=-1 +kerning first=1046 second=1054 amount=-2 +kerning first=325 second=351 amount=-1 +kerning first=362 second=212 amount=-1 +kerning first=84 second=199 amount=-1 +kerning first=195 second=354 amount=-3 +kerning first=112 second=351 amount=-1 +kerning first=296 second=367 amount=-1 +kerning first=8220 second=109 amount=-1 +kerning first=210 second=364 amount=-1 +kerning first=76 second=351 amount=-1 +kerning first=76 second=264 amount=-1 +kerning first=106 second=259 amount=-1 +kerning first=379 second=267 amount=-1 +kerning first=217 second=351 amount=-1 +kerning first=224 second=367 amount=-1 +kerning first=218 second=212 amount=-1 +kerning first=260 second=367 amount=-1 +kerning first=266 second=267 amount=-1 +kerning first=316 second=254 amount=-1 +kerning first=241 second=8249 amount=-1 +kerning first=370 second=111 amount=-1 +kerning first=69 second=264 amount=-1 +kerning first=303 second=351 amount=-1 +kerning first=302 second=267 amount=-1 +kerning first=8222 second=249 amount=-1 +kerning first=87 second=121 amount=-1 +kerning first=284 second=377 amount=-1 +kerning first=68 second=45 amount=-1 +kerning first=267 second=351 amount=-1 +kerning first=197 second=361 amount=-1 +kerning first=194 second=267 amount=-1 +kerning first=381 second=257 amount=-1 +kerning first=354 second=367 amount=-1 +kerning first=375 second=351 amount=-1 +kerning first=370 second=44 amount=-3 +kerning first=212 second=377 amount=-1 +kerning first=339 second=351 amount=-1 +kerning first=269 second=361 amount=-1 +kerning first=282 second=367 amount=-1 +kerning first=1027 second=1077 amount=-1 +kerning first=233 second=361 amount=-1 +kerning first=100 second=8249 amount=-1 +kerning first=262 second=111 amount=-1 +kerning first=1063 second=1077 amount=-1 +kerning first=90 second=351 amount=-1 +kerning first=354 second=171 amount=-3 +kerning first=298 second=111 amount=-1 +kerning first=255 second=114 amount=-1 +kerning first=231 second=351 amount=-1 +kerning first=374 second=267 amount=-2 +kerning first=280 second=254 amount=-1 +kerning first=356 second=377 amount=-1 +kerning first=195 second=351 amount=-1 +kerning first=253 second=261 amount=-2 +kerning first=105 second=367 amount=-1 +kerning first=356 second=117 amount=-1 +kerning first=289 second=261 amount=-1 +kerning first=203 second=274 amount=-1 +kerning first=219 second=114 amount=-1 +kerning first=104 second=44 amount=-1 +kerning first=67 second=254 amount=-1 +kerning first=325 second=261 amount=-1 +kerning first=87 second=381 amount=-1 +kerning first=234 second=287 amount=-1 +kerning first=68 second=44 amount=-1 +kerning first=103 second=254 amount=-1 +kerning first=119 second=120 amount=-1 +kerning first=314 second=244 amount=-1 +kerning first=198 second=287 amount=-1 +kerning first=222 second=344 amount=-1 +kerning first=8220 second=103 amount=-2 +kerning first=8220 second=232 amount=-1 +kerning first=377 second=237 amount=-1 +kerning first=83 second=46 amount=-2 +kerning first=313 second=8249 amount=-1 +kerning first=228 second=121 amount=-1 +kerning first=264 second=381 amount=-1 +kerning first=378 second=287 amount=-1 +kerning first=1059 second=1057 amount=-1 +kerning first=217 second=261 amount=-2 +kerning first=228 second=250 amount=-1 +kerning first=246 second=107 amount=-1 +kerning first=203 second=171 amount=-1 +kerning first=1067 second=1104 amount=-1 +kerning first=192 second=250 amount=-1 +kerning first=1031 second=1104 amount=-1 +kerning first=110 second=347 amount=-1 +kerning first=370 second=240 amount=-1 +kerning first=264 second=250 amount=-1 +kerning first=199 second=378 amount=-1 +kerning first=282 second=107 amount=-1 +kerning first=1086 second=1078 amount=-1 +kerning first=71 second=117 amount=-1 +kerning first=69 second=107 amount=-1 +kerning first=8218 second=219 amount=-2 +kerning first=368 second=230 amount=-2 +kerning first=83 second=354 amount=-1 +kerning first=284 second=117 amount=-1 +kerning first=87 second=250 amount=-1 +kerning first=107 second=281 amount=-1 +kerning first=105 second=107 amount=-1 +kerning first=85 second=240 amount=-1 +kerning first=377 second=361 amount=-1 +kerning first=121 second=240 amount=-1 +kerning first=201 second=257 amount=-1 +kerning first=354 second=264 amount=-1 +kerning first=381 second=100 amount=-1 +kerning first=246 second=104 amount=-1 +kerning first=221 second=288 amount=-1 +kerning first=260 second=354 amount=-3 +kerning first=282 second=264 amount=-1 +kerning first=262 second=240 amount=-1 +kerning first=307 second=378 amount=-1 +kerning first=347 second=171 amount=-1 +kerning first=76 second=364 amount=-1 +kerning first=199 second=278 amount=-1 +kerning first=332 second=354 amount=-1 +kerning first=377 second=67 amount=-1 +kerning first=298 second=240 amount=-1 +kerning first=255 second=271 amount=-1 +kerning first=323 second=347 amount=-1 +kerning first=97 second=314 amount=-1 +kerning first=217 second=347 amount=-1 +kerning first=291 second=271 amount=-1 +kerning first=379 second=378 amount=-1 +kerning first=278 second=74 amount=-1 +kerning first=251 second=347 amount=-1 +kerning first=321 second=252 amount=-1 +kerning first=287 second=337 amount=-1 +kerning first=199 second=90 amount=-1 +kerning first=310 second=314 amount=-1 +kerning first=113 second=311 amount=-1 +kerning first=90 second=214 amount=-1 +kerning first=274 second=314 amount=-1 +kerning first=222 second=220 amount=-1 +kerning first=200 second=201 amount=-1 +kerning first=382 second=314 amount=-1 +kerning first=81 second=220 amount=-1 +kerning first=213 second=77 amount=-1 +kerning first=317 second=317 amount=-1 +kerning first=195 second=214 amount=-1 +kerning first=346 second=314 amount=-1 +kerning first=225 second=371 amount=-1 +kerning first=302 second=338 amount=-1 +kerning first=8250 second=202 amount=-3 +kerning first=119 second=224 amount=-1 +kerning first=1057 second=1040 amount=-1 +kerning first=68 second=317 amount=-1 +kerning first=83 second=224 amount=-1 +kerning first=317 second=304 amount=-1 +kerning first=258 second=220 amount=-2 +kerning first=72 second=71 amount=-1 +kerning first=379 second=90 amount=-1 +kerning first=286 second=291 amount=-1 +kerning first=1056 second=1108 amount=-1 +kerning first=321 second=77 amount=-1 +kerning first=250 second=291 amount=-1 +kerning first=72 second=337 amount=-1 +kerning first=122 second=318 amount=-1 +kerning first=296 second=224 amount=-1 +kerning first=214 second=291 amount=-1 +kerning first=113 second=324 amount=-1 +kerning first=208 second=97 amount=-1 +kerning first=110 second=44 amount=-1 +kerning first=321 second=213 amount=-1 +kerning first=81 second=84 amount=-1 +kerning first=227 second=318 amount=-1 +kerning first=67 second=97 amount=-1 +kerning first=368 second=224 amount=-1 +kerning first=45 second=84 amount=-2 +kerning first=218 second=324 amount=-1 +kerning first=263 second=318 amount=-1 +kerning first=332 second=224 amount=-1 +kerning first=1047 second=1101 amount=-1 +kerning first=8250 second=66 amount=-3 +kerning first=73 second=291 amount=-1 +kerning first=316 second=97 amount=-1 +kerning first=321 second=71 amount=-1 +kerning first=200 second=380 amount=-1 +kerning first=335 second=318 amount=-1 +kerning first=352 second=97 amount=-1 +kerning first=254 second=311 amount=-1 +kerning first=74 second=196 amount=-3 +kerning first=258 second=84 amount=-3 +kerning first=66 second=328 amount=-1 +kerning first=371 second=318 amount=-1 +kerning first=382 second=267 amount=-1 +kerning first=187 second=298 amount=-3 +kerning first=222 second=84 amount=-1 +kerning first=108 second=337 amount=-1 +kerning first=280 second=97 amount=-1 +kerning first=45 second=344 amount=-3 +kerning first=313 second=284 amount=-1 +kerning first=362 second=193 amount=-2 +kerning first=336 second=381 amount=-1 +kerning first=99 second=234 amount=-1 +kerning first=290 second=193 amount=-1 +kerning first=375 second=227 amount=-2 +kerning first=339 second=227 amount=-1 +kerning first=204 second=234 amount=-1 +kerning first=263 second=303 amount=-1 +kerning first=253 second=104 amount=-1 +kerning first=72 second=213 amount=-1 +kerning first=268 second=275 amount=-1 +kerning first=200 second=325 amount=-1 +kerning first=354 second=101 amount=-2 +kerning first=205 second=284 amount=-1 +kerning first=1038 second=1107 amount=-2 +kerning first=281 second=44 amount=-2 +kerning first=222 second=78 amount=-1 +kerning first=254 second=187 amount=-1 +kerning first=245 second=44 amount=-2 +kerning first=362 second=324 amount=-1 +kerning first=272 second=310 amount=-1 +kerning first=90 second=227 amount=-1 +kerning first=85 second=111 amount=-1 +kerning first=304 second=277 amount=-1 +kerning first=201 second=251 amount=-1 +kerning first=1025 second=1067 amount=-1 +kerning first=1069 second=1024 amount=-1 +kerning first=121 second=111 amount=-1 +kerning first=45 second=78 amount=-3 +kerning first=81 second=78 amount=-1 +kerning first=376 second=277 amount=-2 +kerning first=303 second=227 amount=-1 +kerning first=86 second=194 amount=-3 +kerning first=122 second=303 amount=-1 +kerning first=196 second=277 amount=-1 +kerning first=267 second=227 amount=-1 +kerning first=45 second=220 amount=-2 +kerning first=195 second=85 amount=-2 +kerning first=231 second=227 amount=-1 +kerning first=1092 second=1093 amount=-1 +kerning first=268 second=277 amount=-1 +kerning first=1056 second=1093 amount=-1 +kerning first=86 second=303 amount=-1 +kerning first=272 second=201 amount=-1 +kerning first=307 second=105 amount=-1 +kerning first=74 second=245 amount=-1 +kerning first=381 second=251 amount=-1 +kerning first=257 second=118 amount=-1 +kerning first=235 second=105 amount=-1 +kerning first=365 second=118 amount=-1 +kerning first=201 second=270 amount=-1 +kerning first=375 second=345 amount=-1 +kerning first=268 second=283 amount=-1 +kerning first=199 second=105 amount=-1 +kerning first=196 second=283 amount=-1 +kerning first=221 second=118 amount=-1 +kerning first=203 second=280 amount=-1 +kerning first=307 second=241 amount=-1 +kerning first=376 second=283 amount=-2 +kerning first=193 second=335 amount=-1 +kerning first=8220 second=87 amount=-1 +kerning first=1063 second=1105 amount=-1 +kerning first=255 second=108 amount=-1 +kerning first=1027 second=1083 amount=-2 +kerning first=76 second=370 amount=-1 +kerning first=304 second=283 amount=-1 +kerning first=213 second=228 amount=-1 +kerning first=291 second=108 amount=-1 +kerning first=381 second=270 amount=-1 +kerning first=108 second=228 amount=-1 +kerning first=235 second=241 amount=-1 +kerning first=72 second=228 amount=-1 +kerning first=88 second=335 amount=-1 +kerning first=363 second=108 amount=-1 +kerning first=199 second=241 amount=-1 +kerning first=90 second=73 amount=-1 +kerning first=381 second=122 amount=-1 +kerning first=219 second=256 amount=-2 +kerning first=331 second=347 amount=-1 +kerning first=269 second=231 amount=-1 +kerning first=379 second=356 amount=-1 +kerning first=321 second=331 amount=-1 +kerning first=197 second=231 amount=-1 +kerning first=377 second=231 amount=-1 +kerning first=275 second=116 amount=-1 +kerning first=325 second=255 amount=-1 +kerning first=1061 second=1073 amount=-1 +kerning first=347 second=116 amount=-1 +kerning first=199 second=356 amount=-1 +kerning first=278 second=362 amount=-1 +kerning first=291 second=111 amount=-1 +kerning first=323 second=81 amount=-1 +kerning first=217 second=255 amount=-1 +kerning first=65 second=362 amount=-2 +kerning first=323 second=245 amount=-1 +kerning first=70 second=67 amount=-1 +kerning first=214 second=8249 amount=-1 +kerning first=112 second=255 amount=-1 +kerning first=1047 second=1095 amount=-1 +kerning first=287 second=245 amount=-1 +kerning first=76 second=255 amount=-1 +kerning first=221 second=266 amount=-1 +kerning first=78 second=211 amount=-1 +kerning first=201 second=122 amount=-1 +kerning first=371 second=339 amount=-1 +kerning first=379 second=105 amount=-1 +kerning first=374 second=282 amount=-1 +kerning first=113 second=305 amount=-1 +kerning first=253 second=316 amount=-1 +kerning first=338 second=282 amount=-1 +kerning first=350 second=80 amount=-1 +kerning first=1027 second=1099 amount=-1 +kerning first=323 second=229 amount=-1 +kerning first=218 second=305 amount=-1 +kerning first=74 second=81 amount=-1 +kerning first=70 second=333 amount=-1 +kerning first=266 second=282 amount=-1 +kerning first=1031 second=1092 amount=-1 +kerning first=202 second=217 amount=-1 +kerning first=321 second=65 amount=-1 +kerning first=274 second=217 amount=-1 +kerning first=362 second=305 amount=-1 +kerning first=79 second=68 amount=-1 +kerning first=310 second=217 amount=-1 +kerning first=364 second=216 amount=-1 +kerning first=89 second=282 amount=-1 +kerning first=278 second=80 amount=-1 +kerning first=296 second=230 amount=-1 +kerning first=111 second=307 amount=-1 +kerning first=332 second=230 amount=-1 +kerning first=8222 second=367 amount=-1 +kerning first=197 second=346 amount=-2 +kerning first=119 second=230 amount=-2 +kerning first=356 second=281 amount=-2 +kerning first=377 second=346 amount=-1 +kerning first=83 second=230 amount=-1 +kerning first=1059 second=1072 amount=-2 +kerning first=211 second=218 amount=-1 +kerning first=192 second=112 amount=-1 +kerning first=260 second=79 amount=-1 +kerning first=377 second=243 amount=-1 +kerning first=202 second=69 amount=-1 +kerning first=79 second=203 amount=-1 +kerning first=364 second=334 amount=-1 +kerning first=1030 second=1060 amount=-1 +kerning first=368 second=79 amount=-1 +kerning first=197 second=243 amount=-1 +kerning first=65 second=244 amount=-1 +kerning first=296 second=79 amount=-1 +kerning first=356 second=268 amount=-1 +kerning first=269 second=243 amount=-1 +kerning first=74 second=229 amount=-1 +kerning first=8217 second=290 amount=-1 +kerning first=255 second=120 amount=-1 +kerning first=258 second=332 amount=-1 +kerning first=291 second=120 amount=-1 +kerning first=288 second=192 amount=-1 +kerning first=8250 second=314 amount=-1 +kerning first=330 second=332 amount=-1 +kerning first=363 second=120 amount=-1 +kerning first=216 second=192 amount=-2 +kerning first=251 second=229 amount=-1 +kerning first=46 second=8217 amount=-3 +kerning first=67 second=242 amount=-1 +kerning first=287 second=229 amount=-1 +kerning first=366 second=332 amount=-1 +kerning first=220 second=334 amount=-1 +kerning first=219 second=120 amount=-1 +kerning first=103 second=242 amount=-1 +kerning first=231 second=339 amount=-1 +kerning first=1114 second=1090 amount=-1 +kerning first=374 second=279 amount=-2 +kerning first=196 second=289 amount=-1 +kerning first=267 second=339 amount=-1 +kerning first=232 second=289 amount=-1 +kerning first=217 second=102 amount=-1 +kerning first=68 second=192 amount=-2 +kerning first=316 second=242 amount=-1 +kerning first=268 second=289 amount=-1 +kerning first=195 second=339 amount=-1 +kerning first=222 second=229 amount=-1 +kerning first=304 second=289 amount=-1 +kerning first=375 second=339 amount=-1 +kerning first=287 second=232 amount=-1 +kerning first=67 second=106 amount=-1 +kerning first=379 second=99 amount=-1 +kerning first=194 second=279 amount=-1 +kerning first=376 second=289 amount=-2 +kerning first=303 second=339 amount=-1 +kerning first=330 second=229 amount=-1 +kerning first=377 second=89 amount=-1 +kerning first=302 second=279 amount=-1 +kerning first=8222 second=261 amount=-1 +kerning first=323 second=232 amount=-1 +kerning first=366 second=229 amount=-2 +kerning first=1027 second=1096 amount=-1 +kerning first=89 second=119 amount=-1 +kerning first=266 second=279 amount=-1 +kerning first=210 second=379 amount=-1 +kerning first=244 second=106 amount=-1 +kerning first=187 second=282 amount=-3 +kerning first=74 second=232 amount=-1 +kerning first=194 second=119 amount=-2 +kerning first=282 second=379 amount=-1 +kerning first=230 second=119 amount=-1 +kerning first=8216 second=221 amount=-1 +kerning first=1050 second=1059 amount=-1 +kerning first=208 second=106 amount=-1 +kerning first=266 second=119 amount=-1 +kerning first=354 second=379 amount=-1 +kerning first=302 second=119 amount=-1 +kerning first=1061 second=1079 amount=-1 +kerning first=90 second=339 amount=-1 +kerning first=338 second=119 amount=-1 +kerning first=316 second=106 amount=-1 +kerning first=374 second=119 amount=-1 +kerning first=204 second=346 amount=-1 +kerning first=352 second=106 amount=-1 +kerning first=211 second=209 amount=-1 +kerning first=202 second=66 amount=-1 +kerning first=90 second=79 amount=-1 +kerning first=317 second=202 amount=-1 +kerning first=221 second=269 amount=-2 +kerning first=1025 second=1076 amount=-1 +kerning first=200 second=316 amount=-1 +kerning first=83 second=82 amount=-1 +kerning first=346 second=66 amount=-1 +kerning first=236 second=316 amount=-1 +kerning first=274 second=66 amount=-1 +kerning first=195 second=79 amount=-1 +kerning first=274 second=205 amount=-1 +kerning first=77 second=199 amount=-1 +kerning first=251 second=259 amount=-1 +kerning first=8217 second=281 amount=-2 +kerning first=81 second=72 amount=-1 +kerning first=346 second=205 amount=-1 +kerning first=222 second=72 amount=-1 +kerning first=220 second=216 amount=-1 +kerning first=218 second=199 amount=-1 +kerning first=197 second=89 amount=-3 +kerning first=256 second=216 amount=-1 +kerning first=81 second=229 amount=-1 +kerning first=105 second=8217 amount=-1 +kerning first=317 second=192 amount=-1 +kerning first=117 second=229 amount=-1 +kerning first=202 second=205 amount=-1 +kerning first=210 second=8217 amount=-1 +kerning first=201 second=282 amount=-1 +kerning first=362 second=199 amount=-1 +kerning first=45 second=229 amount=-1 +kerning first=246 second=8217 amount=-1 +kerning first=232 second=103 amount=-1 +kerning first=122 second=46 amount=-1 +kerning first=196 second=286 amount=-1 +kerning first=330 second=226 amount=-1 +kerning first=192 second=353 amount=-1 +kerning first=379 second=102 amount=-1 +kerning first=366 second=226 amount=-2 +kerning first=103 second=245 amount=-1 +kerning first=263 second=46 amount=-1 +kerning first=381 second=382 amount=-1 +kerning first=199 second=102 amount=-1 +kerning first=363 second=8221 amount=-2 +kerning first=316 second=245 amount=-1 +kerning first=8220 second=248 amount=-1 +kerning first=235 second=102 amount=-1 +kerning first=45 second=72 amount=-3 +kerning first=1070 second=1083 amount=-1 +kerning first=86 second=46 amount=-3 +kerning first=84 second=296 amount=-1 +kerning first=208 second=103 amount=-1 +kerning first=321 second=219 amount=-1 +kerning first=290 second=45 amount=-1 +kerning first=344 second=316 amount=-1 +kerning first=217 second=252 amount=-1 +kerning first=330 second=335 amount=-1 +kerning first=8250 second=317 amount=-3 +kerning first=380 second=316 amount=-1 +kerning first=103 second=103 amount=-1 +kerning first=196 second=213 amount=-1 +kerning first=362 second=45 amount=-3 +kerning first=366 second=335 amount=-1 +kerning first=45 second=226 amount=-1 +kerning first=67 second=103 amount=-1 +kerning first=289 second=252 amount=-1 +kerning first=81 second=226 amount=-1 +kerning first=67 second=245 amount=-1 +kerning first=221 second=200 amount=-1 +kerning first=117 second=226 amount=-1 +kerning first=363 second=259 amount=-1 +kerning first=67 second=381 amount=-1 +kerning first=76 second=252 amount=-1 +kerning first=222 second=226 amount=-1 +kerning first=258 second=335 amount=-1 +kerning first=278 second=356 amount=-1 +kerning first=211 second=206 amount=-1 +kerning first=67 second=369 amount=-1 +kerning first=255 second=259 amount=-2 +kerning first=219 second=259 amount=-2 +kerning first=228 second=375 amount=-1 +kerning first=370 second=246 amount=-1 +kerning first=327 second=259 amount=-1 +kerning first=354 second=116 amount=-1 +kerning first=374 second=122 amount=-2 +kerning first=235 second=253 amount=-1 +kerning first=103 second=369 amount=-1 +kerning first=291 second=259 amount=-1 +kerning first=352 second=103 amount=-1 +kerning first=325 second=252 amount=-1 +kerning first=298 second=246 amount=-1 +kerning first=78 second=259 amount=-1 +kerning first=105 second=116 amount=-1 +kerning first=65 second=356 amount=-3 +kerning first=316 second=103 amount=-1 +kerning first=1043 second=1075 amount=-1 +kerning first=77 second=45 amount=-2 +kerning first=262 second=246 amount=-1 +kerning first=217 second=241 amount=-1 +kerning first=280 second=103 amount=-1 +kerning first=218 second=45 amount=-3 +kerning first=244 second=103 amount=-1 +kerning first=381 second=109 amount=-1 +kerning first=8220 second=378 amount=-1 +kerning first=121 second=246 amount=-1 +kerning first=199 second=362 amount=-1 +kerning first=264 second=266 amount=-2 +kerning first=85 second=246 amount=-1 +kerning first=197 second=83 amount=-2 +kerning first=89 second=122 amount=-2 +kerning first=1057 second=1056 amount=-1 +kerning first=192 second=266 amount=-1 +kerning first=89 second=279 amount=-2 +kerning first=338 second=122 amount=-1 +kerning first=45 second=115 amount=-1 +kerning first=202 second=323 amount=-1 +kerning first=201 second=109 amount=-1 +kerning first=302 second=122 amount=-1 +kerning first=87 second=266 amount=-1 +kerning first=87 second=375 amount=-1 +kerning first=350 second=356 amount=-1 +kerning first=266 second=122 amount=-1 +kerning first=316 second=369 amount=-1 +kerning first=274 second=323 amount=-1 +kerning first=201 second=382 amount=-1 +kerning first=377 second=83 amount=-1 +kerning first=230 second=122 amount=-1 +kerning first=260 second=346 amount=-2 +kerning first=280 second=369 amount=-1 +kerning first=204 second=336 amount=-1 +kerning first=87 second=115 amount=-2 +kerning first=8222 second=255 amount=-1 +kerning first=78 second=380 amount=-1 +kerning first=346 second=323 amount=-1 +kerning first=316 second=248 amount=-1 +kerning first=364 second=213 amount=-1 +kerning first=272 second=198 amount=-2 +kerning first=1056 second=1105 amount=-1 +kerning first=192 second=115 amount=-1 +kerning first=219 second=380 amount=-1 +kerning first=264 second=115 amount=-1 +kerning first=233 second=355 amount=-1 +kerning first=103 second=248 amount=-1 +kerning first=45 second=223 amount=-1 +kerning first=119 second=233 amount=-1 +kerning first=197 second=355 amount=-1 +kerning first=211 second=330 amount=-1 +kerning first=8220 second=97 amount=-1 +kerning first=260 second=233 amount=-1 +kerning first=364 second=259 amount=-2 +kerning first=70 second=102 amount=-1 +kerning first=228 second=115 amount=-1 +kerning first=366 second=338 amount=-1 +kerning first=67 second=248 amount=-1 +kerning first=278 second=90 amount=-1 +kerning first=199 second=365 amount=-1 +kerning first=86 second=315 amount=-1 +kerning first=296 second=233 amount=-1 +kerning first=264 second=263 amount=-1 +kerning first=45 second=75 amount=-3 +kerning first=368 second=233 amount=-1 +kerning first=269 second=355 amount=-1 +kerning first=69 second=110 amount=-1 +kerning first=272 second=313 amount=-1 +kerning first=65 second=350 amount=-2 +kerning first=105 second=110 amount=-1 +kerning first=1036 second=1090 amount=-1 +kerning first=256 second=213 amount=-1 +kerning first=8220 second=245 amount=-1 +kerning first=87 second=263 amount=-2 +kerning first=220 second=213 amount=-1 +kerning first=216 second=298 amount=-1 +kerning first=222 second=75 amount=-1 +kerning first=288 second=298 amount=-1 +kerning first=220 second=328 amount=-1 +kerning first=282 second=110 amount=-1 +kerning first=362 second=196 amount=-2 +kerning first=252 second=316 amount=-1 +kerning first=67 second=363 amount=-1 +kerning first=234 second=303 amount=-1 +kerning first=115 second=328 amount=-1 +kerning first=354 second=110 amount=-1 +kerning first=103 second=363 amount=-1 +kerning first=284 second=87 amount=-1 +kerning first=206 second=350 amount=-1 +kerning first=83 second=85 amount=-1 +kerning first=108 second=225 amount=-1 +kerning first=364 second=328 amount=-1 +kerning first=205 second=290 amount=-1 +kerning first=1057 second=1050 amount=-1 +kerning first=378 second=303 amount=-1 +kerning first=86 second=200 amount=-1 +kerning first=87 second=260 amount=-3 +kerning first=280 second=363 amount=-1 +kerning first=290 second=196 amount=-1 +kerning first=350 second=350 amount=-1 +kerning first=313 second=290 amount=-1 +kerning first=74 second=235 amount=-1 +kerning first=1090 second=1103 amount=-1 +kerning first=330 second=338 amount=-1 +kerning first=352 second=363 amount=-1 +kerning first=264 second=260 amount=-2 +kerning first=258 second=338 amount=-1 +kerning first=376 second=286 amount=-1 +kerning first=85 second=345 amount=-1 +kerning first=264 second=256 amount=-2 +kerning first=336 second=260 amount=-2 +kerning first=255 second=380 amount=-1 +kerning first=304 second=286 amount=-1 +kerning first=1027 second=1093 amount=-2 +kerning first=291 second=380 amount=-1 +kerning first=332 second=85 amount=-1 +kerning first=335 second=46 amount=-2 +kerning first=213 second=225 amount=-1 +kerning first=121 second=98 amount=-1 +kerning first=8220 second=242 amount=-1 +kerning first=327 second=380 amount=-1 +kerning first=249 second=225 amount=-1 +kerning first=262 second=98 amount=-1 +kerning first=363 second=380 amount=-1 +kerning first=260 second=85 amount=-2 +kerning first=268 second=286 amount=-2 +kerning first=226 second=98 amount=-1 +kerning first=69 second=261 amount=-1 +kerning first=289 second=367 amount=-1 +kerning first=105 second=261 amount=-1 +kerning first=325 second=367 amount=-1 +kerning first=217 second=367 amount=-1 +kerning first=377 second=86 amount=-1 +kerning first=210 second=261 amount=-1 +kerning first=321 second=67 amount=-1 +kerning first=296 second=351 amount=-1 +kerning first=274 second=326 amount=-1 +kerning first=8216 second=333 amount=-1 +kerning first=260 second=351 amount=-1 +kerning first=211 second=327 amount=-1 +kerning first=202 second=211 amount=-1 +kerning first=197 second=352 amount=-2 +kerning first=368 second=351 amount=-1 +kerning first=193 second=210 amount=-1 +kerning first=346 second=326 amount=-1 +kerning first=76 second=367 amount=-1 +kerning first=219 second=377 amount=-1 +kerning first=382 second=326 amount=-1 +kerning first=88 second=210 amount=-1 +kerning first=310 second=211 amount=-1 +kerning first=379 second=250 amount=-1 +kerning first=381 second=112 amount=-1 +kerning first=352 second=366 amount=-1 +kerning first=210 second=8220 amount=-1 +kerning first=202 second=326 amount=-1 +kerning first=280 second=366 amount=-1 +kerning first=274 second=211 amount=-1 +kerning first=105 second=8220 amount=-1 +kerning first=287 second=235 amount=-1 +kerning first=235 second=250 amount=-1 +kerning first=323 second=263 amount=-1 +kerning first=323 second=235 amount=-1 +kerning first=199 second=250 amount=-1 +kerning first=84 second=302 amount=-1 +kerning first=201 second=112 amount=-1 +kerning first=307 second=250 amount=-1 +kerning first=354 second=261 amount=-2 +kerning first=197 second=86 amount=-3 +kerning first=241 second=287 amount=-1 +kerning first=67 second=366 amount=-1 +kerning first=72 second=245 amount=-1 +kerning first=80 second=275 amount=-1 +kerning first=242 second=353 amount=-1 +kerning first=269 second=237 amount=-1 +kerning first=77 second=367 amount=-1 +kerning first=313 second=287 amount=-1 +kerning first=278 second=353 amount=-1 +kerning first=327 second=262 amount=-1 +kerning first=233 second=237 amount=-1 +kerning first=314 second=353 amount=-1 +kerning first=336 second=378 amount=-1 +kerning first=350 second=353 amount=-1 +kerning first=196 second=171 amount=-2 +kerning first=316 second=100 amount=-1 +kerning first=65 second=353 amount=-1 +kerning first=86 second=197 amount=-3 +kerning first=87 second=378 amount=-2 +kerning first=208 second=366 amount=-1 +kerning first=8222 second=107 amount=-1 +kerning first=101 second=353 amount=-1 +kerning first=268 second=171 amount=-2 +kerning first=69 second=379 amount=-1 +kerning first=304 second=171 amount=-2 +kerning first=45 second=198 amount=-2 +kerning first=354 second=113 amount=-2 +kerning first=206 second=353 amount=-1 +kerning first=377 second=352 amount=-1 +kerning first=217 second=249 amount=-1 +kerning first=8216 second=218 amount=-1 +kerning first=76 second=249 amount=-1 +kerning first=374 second=346 amount=-2 +kerning first=78 second=262 amount=-1 +kerning first=325 second=249 amount=-1 +kerning first=73 second=288 amount=-1 +kerning first=366 second=223 amount=-1 +kerning first=1038 second=1104 amount=-2 +kerning first=67 second=100 amount=-1 +kerning first=219 second=262 amount=-1 +kerning first=1043 second=1078 amount=-2 +kerning first=289 second=249 amount=-1 +kerning first=103 second=100 amount=-1 +kerning first=221 second=275 amount=-2 +kerning first=213 second=74 amount=-1 +kerning first=1079 second=1078 amount=-1 +kerning first=75 second=113 amount=-1 +kerning first=208 second=87 amount=-1 +kerning first=104 second=314 amount=-1 +kerning first=67 second=87 amount=-1 +kerning first=381 second=288 amount=-1 +kerning first=245 second=314 amount=-1 +kerning first=8222 second=218 amount=-2 +kerning first=260 second=217 amount=-2 +kerning first=298 second=333 amount=-1 +kerning first=317 second=314 amount=-1 +kerning first=262 second=333 amount=-1 +kerning first=88 second=269 amount=-1 +kerning first=281 second=314 amount=-1 +kerning first=334 second=80 amount=-1 +kerning first=321 second=210 amount=-1 +kerning first=75 second=366 amount=-1 +kerning first=370 second=333 amount=-1 +kerning first=8250 second=192 amount=-2 +kerning first=193 second=269 amount=-1 +kerning first=201 second=288 amount=-1 +kerning first=353 second=314 amount=-1 +kerning first=327 second=281 amount=-1 +kerning first=236 second=307 amount=-1 +kerning first=214 second=198 amount=-2 +kerning first=378 second=98 amount=-1 +kerning first=70 second=262 amount=-1 +kerning first=99 second=224 amount=-1 +kerning first=286 second=198 amount=-1 +kerning first=204 second=224 amount=-1 +kerning first=72 second=210 amount=-1 +kerning first=380 second=307 amount=-1 +kerning first=283 second=255 amount=-1 +kerning first=193 second=369 amount=-1 +kerning first=352 second=326 amount=-1 +kerning first=219 second=281 amount=-1 +kerning first=255 second=281 amount=-1 +kerning first=311 second=243 amount=-1 +kerning first=291 second=281 amount=-1 +kerning first=8220 second=263 amount=-1 +kerning first=1039 second=1054 amount=-1 +kerning first=378 second=120 amount=-1 +kerning first=334 second=73 amount=-1 +kerning first=321 second=203 amount=-1 +kerning first=221 second=229 amount=-2 +kerning first=68 second=75 amount=-1 +kerning first=213 second=203 amount=-1 +kerning first=314 second=118 amount=-1 +kerning first=198 second=120 amount=-1 +kerning first=317 second=75 amount=-1 +kerning first=217 second=101 amount=-1 +kerning first=278 second=118 amount=-1 +kerning first=234 second=120 amount=-1 +kerning first=365 second=229 amount=-1 +kerning first=289 second=101 amount=-1 +kerning first=350 second=118 amount=-1 +kerning first=262 second=73 amount=-1 +kerning first=378 second=99 amount=-1 +kerning first=325 second=101 amount=-1 +kerning first=101 second=118 amount=-1 +kerning first=240 second=103 amount=-1 +kerning first=315 second=90 amount=-1 +kerning first=242 second=118 amount=-1 +kerning first=283 second=8220 amount=-1 +kerning first=75 second=106 amount=-1 +kerning first=86 second=68 amount=-1 +kerning first=206 second=118 amount=-1 +kerning first=381 second=267 amount=-1 +kerning first=111 second=106 amount=-1 +kerning first=211 second=8220 amount=-1 +kerning first=324 second=106 amount=-1 +kerning first=121 second=355 amount=-1 +kerning first=352 second=87 amount=-1 +kerning first=65 second=118 amount=-2 +kerning first=106 second=8220 amount=-1 +kerning first=252 second=106 amount=-1 +kerning first=288 second=106 amount=-1 +kerning first=280 second=87 amount=-1 +kerning first=262 second=361 amount=-1 +kerning first=83 second=364 amount=-1 +kerning first=226 second=361 amount=-1 +kerning first=203 second=264 amount=-1 +kerning first=314 second=111 amount=-1 +kerning first=8220 second=291 amount=-2 +kerning first=376 second=212 amount=-1 +kerning first=298 second=361 amount=-1 +kerning first=268 second=212 amount=-2 +kerning first=65 second=111 amount=-1 +kerning first=260 second=364 amount=-2 +kerning first=201 second=316 amount=-1 +kerning first=304 second=212 amount=-1 +kerning first=370 second=361 amount=-1 +kerning first=196 second=212 amount=-1 +kerning first=365 second=257 amount=-1 +kerning first=67 second=66 amount=-1 +kerning first=206 second=111 amount=-1 +kerning first=65 second=8249 amount=-2 +kerning first=199 second=368 amount=-1 +kerning first=68 second=82 amount=-1 +kerning first=260 second=104 amount=-1 +kerning first=280 second=66 amount=-1 +kerning first=266 second=335 amount=-1 +kerning first=332 second=364 amount=-1 +kerning first=229 second=44 amount=-1 +kerning first=1039 second=1057 amount=-1 +kerning first=208 second=66 amount=-1 +kerning first=88 second=44 amount=-1 +kerning first=201 second=323 amount=-1 +kerning first=376 second=205 amount=-1 +kerning first=352 second=66 amount=-1 +kerning first=352 second=347 amount=-1 +kerning first=332 second=97 amount=-1 +kerning first=316 second=347 amount=-1 +kerning first=354 second=375 amount=-1 +kerning first=1057 second=1078 amount=-1 +kerning first=374 second=8250 amount=-1 +kerning first=71 second=278 amount=-1 +kerning first=78 second=281 amount=-1 +kerning first=1059 second=1054 amount=-1 +kerning first=381 second=323 amount=-1 +kerning first=268 second=205 amount=-1 +kerning first=212 second=278 amount=-1 +kerning first=67 second=354 amount=-1 +kerning first=214 second=106 amount=-1 +kerning first=264 second=351 amount=-1 +kerning first=296 second=97 amount=-1 +kerning first=316 second=326 amount=-1 +kerning first=365 second=250 amount=-1 +kerning first=284 second=278 amount=-1 +kerning first=208 second=354 amount=-1 +kerning first=196 second=233 amount=-1 +kerning first=356 second=278 amount=-1 +kerning first=103 second=326 amount=-1 +kerning first=257 second=250 amount=-1 +kerning first=67 second=347 amount=-1 +kerning first=1057 second=1099 amount=-1 +kerning first=280 second=354 amount=-1 +kerning first=221 second=250 amount=-1 +kerning first=268 second=233 amount=-1 +kerning first=121 second=333 amount=-1 +kerning first=314 second=378 amount=-1 +kerning first=226 second=45 amount=-1 +kerning first=1059 second=1047 amount=-1 +kerning first=266 second=82 amount=-1 +kerning first=101 second=371 amount=-1 +kerning first=85 second=333 amount=-1 +kerning first=278 second=378 amount=-1 +kerning first=350 second=90 amount=-1 +kerning first=209 second=103 amount=-1 +kerning first=352 second=354 amount=-1 +kerning first=73 second=226 amount=-1 +kerning first=221 second=257 amount=-2 +kerning first=286 second=219 amount=-1 +kerning first=304 second=233 amount=-1 +kerning first=311 second=271 amount=-1 +kerning first=350 second=378 amount=-1 +kerning first=262 second=45 amount=-2 +kerning first=214 second=219 amount=-1 +kerning first=377 second=203 amount=-1 +kerning first=370 second=45 amount=-3 +kerning first=376 second=233 amount=-2 +kerning first=214 second=226 amount=-1 +kerning first=230 second=8250 amount=-1 +kerning first=101 second=378 amount=-1 +kerning first=334 second=45 amount=-1 +kerning first=250 second=226 amount=-1 +kerning first=89 second=8250 amount=-1 +kerning first=242 second=378 amount=-1 +kerning first=112 second=289 amount=-1 +kerning first=286 second=226 amount=-1 +kerning first=206 second=378 amount=-1 +kerning first=104 second=363 amount=-1 +kerning first=296 second=214 amount=-1 +kerning first=88 second=220 amount=-1 +kerning first=268 second=240 amount=-1 +kerning first=260 second=214 amount=-1 +kerning first=221 second=194 amount=-3 +kerning first=209 second=363 amount=-1 +kerning first=79 second=65 amount=-2 +kerning first=368 second=214 amount=-1 +kerning first=281 second=110 amount=-1 +kerning first=196 second=240 amount=-1 +kerning first=200 second=304 amount=-1 +kerning first=281 second=363 amount=-1 +kerning first=106 second=318 amount=-1 +kerning first=266 second=317 amount=-1 +kerning first=317 second=363 amount=-1 +kerning first=220 second=65 amount=-2 +kerning first=370 second=284 amount=-1 +kerning first=353 second=363 amount=-1 +kerning first=304 second=240 amount=-1 +kerning first=1060 second=1063 amount=-1 +kerning first=193 second=220 amount=-2 +kerning first=90 second=334 amount=-1 +kerning first=1024 second=1063 amount=-1 +kerning first=187 second=369 amount=-1 +kerning first=283 second=318 amount=-1 +kerning first=364 second=65 amount=-2 +kerning first=99 second=259 amount=-1 +kerning first=198 second=71 amount=-1 +kerning first=379 second=375 amount=-2 +kerning first=259 second=369 amount=-1 +kerning first=204 second=259 amount=-1 +kerning first=82 second=116 amount=-1 +kerning first=1070 second=1030 amount=-1 +kerning first=82 second=369 amount=-1 +kerning first=187 second=116 amount=-1 +kerning first=1113 second=1094 amount=-1 +kerning first=118 second=116 amount=-1 +kerning first=206 second=228 amount=-1 +kerning first=109 second=254 amount=-1 +kerning first=1100 second=1102 amount=-1 +kerning first=1056 second=1055 amount=-1 +kerning first=101 second=228 amount=-1 +kerning first=213 second=374 amount=-1 +kerning first=8222 second=382 amount=-2 +kerning first=250 second=254 amount=-1 +kerning first=378 second=324 amount=-1 +kerning first=1100 second=1074 amount=-1 +kerning first=307 second=375 amount=-1 +kerning first=331 second=369 amount=-1 +kerning first=198 second=324 amount=-1 +kerning first=8220 second=326 amount=-1 +kerning first=295 second=369 amount=-1 +kerning first=86 second=377 amount=-1 +kerning first=235 second=375 amount=-1 +kerning first=381 second=344 amount=-1 +kerning first=367 second=369 amount=-1 +kerning first=234 second=324 amount=-1 +kerning first=67 second=298 amount=-1 +kerning first=277 second=355 amount=-1 +kerning first=201 second=344 amount=-1 +kerning first=1049 second=1108 amount=-1 +kerning first=85 second=284 amount=-1 +kerning first=1086 second=1103 amount=-1 +kerning first=208 second=298 amount=-1 +kerning first=99 second=287 amount=-1 +kerning first=90 second=224 amount=-1 +kerning first=70 second=234 amount=-1 +kerning first=274 second=332 amount=-1 +kerning first=87 second=253 amount=-1 +kerning first=280 second=298 amount=-1 +kerning first=216 second=310 amount=-1 +kerning first=380 second=279 amount=-1 +kerning first=8218 second=371 amount=-1 +kerning first=344 second=279 amount=-1 +kerning first=192 second=253 amount=-1 +kerning first=310 second=332 amount=-1 +kerning first=352 second=298 amount=-1 +kerning first=67 second=249 amount=-1 +kerning first=8217 second=67 amount=-1 +kerning first=74 second=242 amount=-1 +kerning first=288 second=85 amount=-1 +kerning first=240 second=287 amount=-1 +kerning first=8218 second=90 amount=-1 +kerning first=307 second=108 amount=-1 +kerning first=240 second=8217 amount=-1 +kerning first=89 second=313 amount=-1 +kerning first=216 second=85 amount=-1 +kerning first=1049 second=1086 amount=-1 +kerning first=67 second=270 amount=-1 +kerning first=291 second=105 amount=-1 +kerning first=75 second=338 amount=-1 +kerning first=209 second=335 amount=-1 +kerning first=378 second=380 amount=-1 +kerning first=323 second=242 amount=-1 +kerning first=70 second=290 amount=-1 +kerning first=99 second=8217 amount=-1 +kerning first=287 second=242 amount=-1 +kerning first=255 second=105 amount=-1 +kerning first=218 second=382 amount=-1 +kerning first=1046 second=1060 amount=-2 +kerning first=1092 second=1083 amount=-1 +kerning first=199 second=197 amount=-2 +kerning first=198 second=380 amount=-1 +kerning first=352 second=270 amount=-1 +kerning first=193 second=248 amount=-1 +kerning first=234 second=380 amount=-1 +kerning first=264 second=225 amount=-1 +kerning first=88 second=248 amount=-1 +kerning first=105 second=119 amount=-1 +kerning first=350 second=228 amount=-1 +kerning first=199 second=108 amount=-1 +kerning first=208 second=270 amount=-1 +kerning first=314 second=228 amount=-1 +kerning first=379 second=197 amount=-1 +kerning first=304 second=112 amount=-1 +kerning first=1042 second=1049 amount=-1 +kerning first=278 second=228 amount=-1 +kerning first=71 second=74 amount=-1 +kerning first=280 second=270 amount=-1 +kerning first=87 second=225 amount=-2 +kerning first=377 second=315 amount=-1 +kerning first=1056 second=1083 amount=-1 +kerning first=296 second=103 amount=-1 +kerning first=282 second=119 amount=-1 +kerning first=8216 second=283 amount=-1 +kerning first=253 second=122 amount=-1 +kerning first=118 second=98 amount=-1 +kerning first=356 second=46 amount=-3 +kerning first=99 second=231 amount=-1 +kerning first=350 second=200 amount=-1 +kerning first=217 second=122 amount=-1 +kerning first=354 second=119 amount=-1 +kerning first=212 second=74 amount=-1 +kerning first=85 second=256 amount=-2 +kerning first=198 second=352 amount=-1 +kerning first=112 second=122 amount=-1 +kerning first=284 second=74 amount=-1 +kerning first=69 second=211 amount=-1 +kerning first=212 second=46 amount=-1 +kerning first=336 second=225 amount=-1 +kerning first=352 second=119 amount=-1 +kerning first=248 second=46 amount=-2 +kerning first=262 second=256 amount=-2 +kerning first=325 second=122 amount=-1 +kerning first=284 second=46 amount=-1 +kerning first=8217 second=334 amount=-1 +kerning first=204 second=231 amount=-1 +kerning first=282 second=318 amount=-1 +kerning first=289 second=122 amount=-1 +kerning first=258 second=245 amount=-1 +kerning first=288 second=366 amount=-1 +kerning first=282 second=211 amount=-1 +kerning first=187 second=379 amount=-2 +kerning first=71 second=46 amount=-1 +kerning first=244 second=380 amount=-1 +kerning first=107 second=46 amount=-1 +kerning first=370 second=256 amount=-2 +kerning first=216 second=366 amount=-1 +kerning first=334 second=256 amount=-2 +kerning first=76 second=122 amount=-1 +kerning first=277 second=102 amount=-1 +kerning first=366 second=245 amount=-1 +kerning first=330 second=245 amount=-1 +kerning first=8218 second=118 amount=-2 +kerning first=354 second=211 amount=-1 +kerning first=230 second=112 amount=-1 +kerning first=321 second=86 amount=-1 +kerning first=310 second=107 amount=-1 +kerning first=321 second=313 amount=-1 +kerning first=194 second=112 amount=-1 +kerning first=374 second=81 amount=-1 +kerning first=274 second=107 amount=-1 +kerning first=202 second=171 amount=-1 +kerning first=344 second=216 amount=-1 +kerning first=269 second=105 amount=-1 +kerning first=1061 second=1086 amount=-1 +kerning first=382 second=107 amount=-1 +kerning first=325 second=211 amount=-1 +kerning first=89 second=112 amount=-1 +kerning first=213 second=86 amount=-1 +kerning first=346 second=107 amount=-1 +kerning first=274 second=171 amount=-1 +kerning first=369 second=261 amount=-1 +kerning first=226 second=8221 amount=-1 +kerning first=200 second=324 amount=-1 +kerning first=356 second=105 amount=-1 +kerning first=8249 second=87 amount=-2 +kerning first=202 second=107 amount=-1 +kerning first=97 second=171 amount=-1 +kerning first=89 second=81 amount=-1 +kerning first=334 second=8221 amount=-1 +kerning first=313 second=67 amount=-1 +kerning first=382 second=100 amount=-1 +kerning first=314 second=8217 amount=-2 +kerning first=290 second=209 amount=-1 +kerning first=266 second=336 amount=-2 +kerning first=1098 second=1074 amount=-1 +kerning first=248 second=105 amount=-1 +kerning first=379 second=235 amount=-1 +kerning first=374 second=112 amount=-1 +kerning first=266 second=81 amount=-2 +kerning first=66 second=251 amount=-1 +kerning first=376 second=203 amount=-1 +kerning first=310 second=171 amount=-2 +kerning first=338 second=45 amount=-1 +kerning first=346 second=171 amount=-1 +kerning first=8250 second=75 amount=-3 +kerning first=302 second=112 amount=-1 +kerning first=338 second=81 amount=-1 +kerning first=8249 second=354 amount=-2 +kerning first=382 second=171 amount=-2 +kerning first=313 second=296 amount=-1 +kerning first=266 second=112 amount=-1 +kerning first=302 second=81 amount=-1 +kerning first=310 second=100 amount=-1 +kerning first=379 second=228 amount=-1 +kerning first=108 second=353 amount=-1 +kerning first=377 second=249 amount=-1 +kerning first=207 second=251 amount=-1 +kerning first=84 second=230 amount=-2 +kerning first=269 second=249 amount=-1 +kerning first=89 second=379 amount=-1 +kerning first=305 second=249 amount=-1 +kerning first=8216 second=231 amount=-1 +kerning first=199 second=204 amount=-1 +kerning first=249 second=353 amount=-1 +kerning first=279 second=251 amount=-1 +kerning first=1071 second=1105 amount=-1 +kerning first=195 second=281 amount=-1 +kerning first=73 second=275 amount=-1 +kerning first=351 second=251 amount=-1 +kerning first=266 second=379 amount=-1 +kerning first=379 second=204 amount=-1 +kerning first=290 second=206 amount=-1 +kerning first=315 second=223 amount=-1 +kerning first=72 second=353 amount=-1 +kerning first=364 second=346 amount=-1 +kerning first=304 second=268 amount=-1 +kerning first=382 second=339 amount=-1 +kerning first=76 second=211 amount=-1 +kerning first=369 second=230 amount=-1 +kerning first=66 second=223 amount=-1 +kerning first=268 second=268 amount=-2 +kerning first=298 second=228 amount=-1 +kerning first=376 second=268 amount=-1 +kerning first=310 second=339 amount=-1 +kerning first=8250 second=323 amount=-3 +kerning first=122 second=229 amount=-1 +kerning first=72 second=83 amount=-1 +kerning first=197 second=249 amount=-1 +kerning first=338 second=313 amount=-1 +kerning first=233 second=249 amount=-1 +kerning first=374 second=313 amount=-1 +kerning first=219 second=291 amount=-2 +kerning first=290 second=330 amount=-1 +kerning first=213 second=83 amount=-1 +kerning first=266 second=313 amount=-1 +kerning first=377 second=256 amount=-1 +kerning first=120 second=230 amount=-1 +kerning first=196 second=268 amount=-1 +kerning first=217 second=211 amount=-1 +kerning first=86 second=76 amount=-1 +kerning first=377 second=284 amount=-1 +kerning first=80 second=283 amount=-1 +kerning first=230 second=109 amount=-1 +kerning first=333 second=289 amount=-1 +kerning first=321 second=83 amount=-1 +kerning first=274 second=192 amount=-1 +kerning first=369 second=289 amount=-1 +kerning first=338 second=84 amount=-1 +kerning first=89 second=344 amount=-1 +kerning first=375 second=328 amount=-1 +kerning first=202 second=192 amount=-1 +kerning first=263 second=97 amount=-1 +kerning first=1024 second=1091 amount=-1 +kerning first=246 second=187 amount=-1 +kerning first=379 second=232 amount=-1 +kerning first=254 second=237 amount=-1 +kerning first=344 second=244 amount=-1 +kerning first=197 second=284 amount=-1 +kerning first=202 second=199 amount=-1 +kerning first=89 second=109 amount=-1 +kerning first=380 second=244 amount=-1 +kerning first=338 second=379 amount=-1 +kerning first=336 second=194 amount=-2 +kerning first=97 second=250 amount=-1 +kerning first=315 second=282 amount=-1 +kerning first=89 second=116 amount=-1 +kerning first=377 second=277 amount=-1 +kerning first=113 second=237 amount=-1 +kerning first=230 second=116 amount=-1 +kerning first=264 second=194 amount=-2 +kerning first=315 second=89 amount=-1 +kerning first=205 second=334 amount=-1 +kerning first=374 second=379 amount=-1 +kerning first=84 second=289 amount=-2 +kerning first=120 second=289 amount=-1 +kerning first=269 second=277 amount=-1 +kerning first=87 second=194 amount=-3 +kerning first=225 second=289 amount=-1 +kerning first=1056 second=1034 amount=-1 +kerning first=79 second=346 amount=-1 +kerning first=8216 second=259 amount=-1 +kerning first=230 second=351 amount=-1 +kerning first=279 second=254 amount=-1 +kerning first=8250 second=103 amount=-1 +kerning first=79 second=374 amount=-1 +kerning first=321 second=121 amount=-1 +kerning first=194 second=351 amount=-1 +kerning first=274 second=72 amount=-1 +kerning first=315 second=254 amount=-1 +kerning first=197 second=277 amount=-1 +kerning first=302 second=351 amount=-1 +kerning first=351 second=254 amount=-1 +kerning first=249 second=121 amount=-1 +kerning first=266 second=351 amount=-1 +kerning first=72 second=350 amount=-1 +kerning first=288 second=325 amount=-1 +kerning first=102 second=254 amount=2 +kerning first=382 second=367 amount=-1 +kerning first=1089 second=1095 amount=-1 +kerning first=321 second=350 amount=-1 +kerning first=108 second=121 amount=-1 +kerning first=274 second=367 amount=-1 +kerning first=1053 second=1095 amount=-1 +kerning first=213 second=350 amount=-1 +kerning first=72 second=121 amount=-1 +kerning first=310 second=367 amount=-1 +kerning first=89 second=351 amount=-2 +kerning first=233 second=305 amount=-1 +kerning first=202 second=367 amount=-1 +kerning first=122 second=117 amount=-1 +kerning first=315 second=213 amount=-1 +kerning first=338 second=344 amount=-1 +kerning first=274 second=199 amount=-1 +kerning first=274 second=79 amount=-1 +kerning first=86 second=117 amount=-1 +kerning first=374 second=344 amount=-1 +kerning first=97 second=367 amount=-1 +kerning first=227 second=117 amount=-1 +kerning first=269 second=305 amount=-1 +kerning first=67 second=260 amount=-2 +kerning first=202 second=79 amount=-1 +kerning first=377 second=76 amount=-1 +kerning first=66 second=254 amount=-1 +kerning first=377 second=305 amount=-1 +kerning first=208 second=260 amount=-2 +kerning first=374 second=351 amount=-2 +kerning first=256 second=374 amount=-3 +kerning first=338 second=351 amount=-1 +kerning first=263 second=117 amount=-1 +kerning first=81 second=192 amount=-2 +kerning first=280 second=260 amount=-1 +kerning first=84 second=261 amount=-2 +kerning first=310 second=79 amount=-1 +kerning first=371 second=117 amount=-1 +kerning first=1061 second=1089 amount=-1 +kerning first=209 second=117 amount=-1 +kerning first=266 second=344 amount=-1 +kerning first=120 second=261 amount=-1 +kerning first=202 second=72 amount=-1 +kerning first=346 second=192 amount=-2 +kerning first=352 second=260 amount=-2 +kerning first=194 second=316 amount=-1 +kerning first=103 second=291 amount=-1 +kerning first=377 second=336 amount=-1 +kerning first=283 second=311 amount=-1 +kerning first=363 second=361 amount=-1 +kerning first=230 second=316 amount=-1 +kerning first=67 second=291 amount=-1 +kerning first=313 second=362 amount=-1 +kerning first=266 second=316 amount=-1 +kerning first=78 second=337 amount=-1 +kerning first=72 second=367 amount=-1 +kerning first=253 second=382 amount=-1 +kerning first=338 second=316 amount=-1 +kerning first=313 second=331 amount=-1 +kerning first=327 second=337 amount=-1 +kerning first=289 second=382 amount=-1 +kerning first=106 second=311 amount=-1 +kerning first=291 second=337 amount=-1 +kerning first=325 second=382 amount=-1 +kerning first=67 second=267 amount=-1 +kerning first=66 second=226 amount=-1 +kerning first=255 second=337 amount=-1 +kerning first=103 second=267 amount=-1 +kerning first=277 second=331 amount=-1 +kerning first=84 second=286 amount=-1 +kerning first=102 second=226 amount=-1 +kerning first=78 second=361 amount=-1 +kerning first=260 second=221 amount=-3 +kerning first=8222 second=119 amount=-2 +kerning first=288 second=310 amount=-1 +kerning first=330 second=266 amount=-1 +kerning first=366 second=266 amount=-1 +kerning first=1114 second=1087 amount=-1 +kerning first=83 second=221 amount=-1 +kerning first=258 second=266 amount=-1 +kerning first=1042 second=1056 amount=-1 +kerning first=1070 second=1037 amount=-1 +kerning first=219 second=361 amount=-1 +kerning first=111 second=289 amount=-1 +kerning first=327 second=361 amount=-1 +kerning first=291 second=361 amount=-1 +kerning first=199 second=207 amount=-1 +kerning first=377 second=45 amount=-1 +kerning first=283 second=227 amount=-1 +kerning first=377 second=252 amount=-1 +kerning first=374 second=74 amount=-2 +kerning first=211 second=227 amount=-1 +kerning first=337 second=44 amount=-2 +kerning first=197 second=252 amount=-1 +kerning first=119 second=104 amount=-1 +kerning first=221 second=201 amount=-1 +kerning first=233 second=252 amount=-1 +kerning first=83 second=104 amount=-1 +kerning first=269 second=252 amount=-1 +kerning first=354 second=246 amount=-1 +kerning first=8216 second=234 amount=-1 +kerning first=305 second=252 amount=-1 +kerning first=80 second=201 amount=-1 +kerning first=213 second=381 amount=-1 +kerning first=382 second=103 amount=-1 +kerning first=112 second=382 amount=-1 +kerning first=213 second=90 amount=-1 +kerning first=207 second=226 amount=-1 +kerning first=346 second=103 amount=-1 +kerning first=8250 second=72 amount=-3 +kerning first=321 second=90 amount=-1 +kerning first=310 second=103 amount=-1 +kerning first=352 second=291 amount=-1 +kerning first=217 second=382 amount=-1 +kerning first=321 second=381 amount=-1 +kerning first=8250 second=363 amount=-1 +kerning first=274 second=103 amount=-1 +kerning first=316 second=291 amount=-1 +kerning first=197 second=336 amount=-1 +kerning first=216 second=317 amount=-1 +kerning first=266 second=84 amount=-1 +kerning first=374 second=109 amount=-1 +kerning first=280 second=291 amount=-1 +kerning first=354 second=103 amount=-2 +kerning first=379 second=207 amount=-1 +kerning first=106 second=227 amount=-1 +kerning first=197 second=45 amount=-2 +kerning first=351 second=226 amount=-1 +kerning first=202 second=103 amount=-1 +kerning first=244 second=291 amount=-1 +kerning first=70 second=227 amount=-1 +kerning first=305 second=45 amount=-1 +kerning first=194 second=84 amount=-3 +kerning first=208 second=291 amount=-1 +kerning first=269 second=45 amount=-1 +kerning first=97 second=103 amount=-1 +kerning first=242 second=122 amount=-1 +kerning first=374 second=288 amount=-1 +kerning first=268 second=243 amount=-1 +kerning first=66 second=198 amount=-3 +kerning first=111 second=314 amount=-1 +kerning first=304 second=243 amount=-1 +kerning first=344 second=213 amount=-1 +kerning first=1070 second=1065 amount=-1 +kerning first=75 second=314 amount=-1 +kerning first=83 second=193 amount=-2 +kerning first=266 second=288 amount=-2 +kerning first=282 second=218 amount=-1 +kerning first=338 second=288 amount=-1 +kerning first=316 second=263 amount=-1 +kerning first=328 second=249 amount=-1 +kerning first=302 second=288 amount=-1 +kerning first=252 second=314 amount=-1 +kerning first=196 second=243 amount=-1 +kerning first=8220 second=347 amount=-1 +kerning first=121 second=8249 amount=-2 +kerning first=67 second=263 amount=-1 +kerning first=327 second=365 amount=-1 +kerning first=324 second=314 amount=-1 +kerning first=307 second=115 amount=-1 +kerning first=227 second=120 amount=-1 +kerning first=103 second=263 amount=-1 +kerning first=291 second=365 amount=-1 +kerning first=118 second=316 amount=-1 +kerning first=288 second=78 amount=-1 +kerning first=277 second=303 amount=-1 +kerning first=199 second=115 amount=-1 +kerning first=263 second=120 amount=-1 +kerning first=70 second=224 amount=-1 +kerning first=368 second=193 amount=-2 +kerning first=115 second=331 amount=-1 +kerning first=313 second=303 amount=-1 +kerning first=235 second=115 amount=-1 +kerning first=219 second=365 amount=-1 +kerning first=216 second=78 amount=-1 +kerning first=376 second=243 amount=-2 +kerning first=344 second=269 amount=-1 +kerning first=321 second=353 amount=-1 +kerning first=106 second=224 amount=-1 +kerning first=86 second=120 amount=-1 +kerning first=377 second=73 amount=-1 +kerning first=78 second=365 amount=-1 +kerning first=200 second=213 amount=-1 +kerning first=379 second=115 amount=-1 +kerning first=122 second=120 amount=-1 +kerning first=211 second=224 amount=-1 +kerning first=210 second=83 amount=-1 +kerning first=315 second=198 amount=-1 +kerning first=274 second=75 amount=-1 +kerning first=313 second=324 amount=-1 +kerning first=283 second=224 amount=-1 +kerning first=321 second=118 amount=-1 +kerning first=370 second=8249 amount=-3 +kerning first=255 second=98 amount=-1 +kerning first=78 second=46 amount=-1 +kerning first=202 second=75 amount=-1 +kerning first=1045 second=1048 amount=-1 +kerning first=346 second=196 amount=-2 +kerning first=334 second=8249 amount=-1 +kerning first=119 second=101 amount=-1 +kerning first=377 second=221 amount=-1 +kerning first=371 second=120 amount=-1 +kerning first=226 second=8249 amount=-1 +kerning first=377 second=280 amount=-1 +kerning first=199 second=235 amount=-1 +kerning first=332 second=221 amount=-1 +kerning first=122 second=328 amount=-1 +kerning first=346 second=75 amount=-1 +kerning first=262 second=8249 amount=-2 +kerning first=1045 second=1076 amount=-1 +kerning first=249 second=118 amount=-1 +kerning first=86 second=328 amount=-1 +kerning first=260 second=101 amount=-1 +kerning first=8222 second=122 amount=-2 +kerning first=350 second=115 amount=-1 +kerning first=371 second=328 amount=-1 +kerning first=45 second=325 amount=-3 +kerning first=296 second=101 amount=-1 +kerning first=89 second=99 amount=-2 +kerning first=81 second=325 amount=-1 +kerning first=274 second=196 amount=-1 +kerning first=1056 second=1031 amount=-1 +kerning first=310 second=370 amount=-1 +kerning first=108 second=118 amount=-1 +kerning first=368 second=101 amount=-1 +kerning first=70 second=283 amount=-1 +kerning first=274 second=370 amount=-1 +kerning first=354 second=218 amount=-1 +kerning first=72 second=118 amount=-1 +kerning first=263 second=328 amount=-1 +kerning first=236 second=241 amount=-1 +kerning first=217 second=109 amount=-1 +kerning first=222 second=325 amount=-1 +kerning first=291 second=98 amount=-1 +kerning first=379 second=241 amount=-1 +kerning first=363 second=98 amount=-1 +kerning first=269 second=263 amount=-1 +kerning first=317 second=338 amount=-1 +kerning first=362 second=283 amount=-1 +kerning first=77 second=290 amount=-1 +kerning first=99 second=8220 amount=-1 +kerning first=1024 second=1045 amount=-1 +kerning first=278 second=108 amount=-1 +kerning first=366 second=241 amount=-1 +kerning first=317 second=85 amount=-1 +kerning first=1060 second=1045 amount=-1 +kerning first=242 second=108 amount=-1 +kerning first=1027 second=1114 amount=-1 +kerning first=209 second=338 amount=-1 +kerning first=350 second=108 amount=-1 +kerning first=314 second=289 amount=-1 +kerning first=75 second=335 amount=-1 +kerning first=72 second=363 amount=-1 +kerning first=314 second=108 amount=-1 +kerning first=8217 second=365 amount=-1 +kerning first=83 second=196 amount=-2 +kerning first=277 second=380 amount=-1 +kerning first=90 second=193 amount=-1 +kerning first=313 second=380 amount=-1 +kerning first=1060 second=1038 amount=-1 +kerning first=65 second=368 amount=-2 +kerning first=206 second=115 amount=-1 +kerning first=353 second=345 amount=-1 +kerning first=330 second=248 amount=-1 +kerning first=352 second=352 amount=-1 +kerning first=65 second=115 amount=-1 +kerning first=100 second=380 amount=-1 +kerning first=371 second=331 amount=-1 +kerning first=101 second=115 amount=-1 +kerning first=45 second=241 amount=-1 +kerning first=258 second=248 amount=-1 +kerning first=263 second=331 amount=-1 +kerning first=70 second=286 amount=-1 +kerning first=314 second=115 amount=-1 +kerning first=1046 second=1113 amount=-1 +kerning first=278 second=368 amount=-1 +kerning first=242 second=115 amount=-1 +kerning first=67 second=323 amount=-1 +kerning first=101 second=108 amount=-1 +kerning first=317 second=78 amount=-1 +kerning first=278 second=115 amount=-1 +kerning first=1024 second=1038 amount=-1 +kerning first=379 second=350 amount=-1 +kerning first=86 second=331 amount=-1 +kerning first=240 second=255 amount=-1 +kerning first=65 second=210 amount=-1 +kerning first=106 second=252 amount=-1 +kerning first=204 second=255 amount=-1 +kerning first=213 second=200 amount=-1 +kerning first=208 second=323 amount=-1 +kerning first=99 second=255 amount=-1 +kerning first=350 second=368 amount=-1 +kerning first=8217 second=324 amount=-1 +kerning first=1042 second=1052 amount=-1 +kerning first=280 second=323 amount=-1 +kerning first=321 second=200 amount=-1 +kerning first=352 second=323 amount=-1 +kerning first=119 second=122 amount=-1 +kerning first=70 second=231 amount=-1 +kerning first=8220 second=260 amount=-4 +kerning first=234 second=328 amount=-1 +kerning first=213 second=207 amount=-1 +kerning first=88 second=245 amount=-1 +kerning first=362 second=290 amount=-1 +kerning first=198 second=328 amount=-1 +kerning first=187 second=366 amount=-2 +kerning first=1072 second=1118 amount=-1 +kerning first=376 second=346 amount=-2 +kerning first=1036 second=1118 amount=-1 +kerning first=321 second=207 amount=-1 +kerning first=82 second=366 amount=-1 +kerning first=86 second=352 amount=-2 +kerning first=378 second=328 amount=-1 +kerning first=311 second=233 amount=-1 +kerning first=218 second=290 amount=-1 +kerning first=283 second=252 amount=-1 +kerning first=218 second=283 amount=-1 +kerning first=1038 second=1073 amount=-2 +kerning first=193 second=245 amount=-1 +kerning first=113 second=283 amount=-1 +kerning first=332 second=217 amount=-1 +kerning first=218 second=257 amount=-2 +kerning first=331 second=106 amount=-1 +kerning first=367 second=106 amount=-1 +kerning first=316 second=324 amount=-1 +kerning first=259 second=106 amount=-1 +kerning first=377 second=333 amount=-1 +kerning first=295 second=106 amount=-1 +kerning first=82 second=113 amount=-1 +kerning first=197 second=333 amount=-1 +kerning first=321 second=378 amount=-1 +kerning first=370 second=281 amount=-1 +kerning first=86 second=65 amount=-3 +kerning first=201 second=87 amount=-1 +kerning first=67 second=288 amount=-2 +kerning first=98 second=107 amount=-1 +kerning first=204 second=262 amount=-1 +kerning first=80 second=198 amount=-2 +kerning first=278 second=366 amount=-1 +kerning first=201 second=347 amount=-1 +kerning first=8218 second=374 amount=-3 +kerning first=262 second=281 amount=-1 +kerning first=1100 second=1078 amount=-1 +kerning first=83 second=217 amount=-1 +kerning first=298 second=281 amount=-1 +kerning first=221 second=198 amount=-3 +kerning first=278 second=210 amount=-1 +kerning first=354 second=243 amount=-2 +kerning first=85 second=281 amount=-1 +kerning first=206 second=210 amount=-1 +kerning first=99 second=361 amount=-1 +kerning first=287 second=326 amount=-1 +kerning first=121 second=281 amount=-1 +kerning first=262 second=274 amount=-1 +kerning first=325 second=230 amount=-1 +kerning first=277 second=120 amount=-1 +kerning first=350 second=203 amount=-1 +kerning first=313 second=120 amount=-1 +kerning first=278 second=203 amount=-1 +kerning first=205 second=99 amount=-1 +kerning first=100 second=120 amount=-1 +kerning first=366 second=248 amount=-1 +kerning first=334 second=274 amount=-1 +kerning first=87 second=229 amount=-2 +kerning first=198 second=377 amount=-1 +kerning first=307 second=118 amount=-1 +kerning first=316 second=267 amount=-1 +kerning first=336 second=229 amount=-1 +kerning first=288 second=75 amount=-1 +kerning first=379 second=118 amount=-1 +kerning first=264 second=229 amount=-1 +kerning first=216 second=75 amount=-1 +kerning first=187 second=106 amount=-1 +kerning first=1049 second=1077 amount=-1 +kerning first=223 second=106 amount=-1 +kerning first=235 second=118 amount=-1 +kerning first=82 second=106 amount=-1 +kerning first=381 second=87 amount=-1 +kerning first=209 second=332 amount=-1 +kerning first=198 second=68 amount=-1 +kerning first=199 second=118 amount=-1 +kerning first=321 second=316 amount=-1 +kerning first=240 second=8220 amount=-1 +kerning first=118 second=106 amount=-1 +kerning first=317 second=332 amount=-1 +kerning first=376 second=209 amount=-1 +kerning first=305 second=8217 amount=-1 +kerning first=106 second=287 amount=-1 +kerning first=249 second=365 amount=-1 +kerning first=108 second=111 amount=-1 +kerning first=90 second=199 amount=-1 +kerning first=70 second=287 amount=-1 +kerning first=304 second=264 amount=-1 +kerning first=211 second=287 amount=-1 +kerning first=66 second=219 amount=-2 +kerning first=268 second=264 amount=-2 +kerning first=195 second=199 amount=-1 +kerning first=268 second=209 amount=-1 +kerning first=283 second=287 amount=-1 +kerning first=196 second=264 amount=-1 +kerning first=352 second=224 amount=-1 +kerning first=377 second=347 amount=-1 +kerning first=362 second=234 amount=-1 +kerning first=233 second=8217 amount=-1 +kerning first=355 second=287 amount=-1 +kerning first=269 second=8217 amount=-1 +kerning first=258 second=242 amount=-1 +kerning first=77 second=289 amount=-1 +kerning first=65 second=374 amount=-3 +kerning first=274 second=82 amount=-1 +kerning first=347 second=314 amount=-1 +kerning first=101 second=121 amount=-1 +kerning first=330 second=242 amount=-1 +kerning first=65 second=121 amount=-1 +kerning first=195 second=364 amount=-2 +kerning first=218 second=289 amount=-2 +kerning first=346 second=82 amount=-1 +kerning first=310 second=44 amount=-1 +kerning first=254 second=289 amount=-1 +kerning first=88 second=244 amount=-1 +kerning first=352 second=223 amount=-1 +kerning first=366 second=242 amount=-1 +kerning first=76 second=119 amount=-1 +kerning first=290 second=289 amount=-1 +kerning first=112 second=119 amount=-1 +kerning first=326 second=289 amount=-1 +kerning first=290 second=73 amount=-1 +kerning first=366 second=67 amount=-1 +kerning first=278 second=197 amount=-1 +kerning first=257 second=254 amount=-1 +kerning first=362 second=289 amount=-2 +kerning first=8218 second=381 amount=-1 +kerning first=217 second=119 amount=-1 +kerning first=350 second=197 amount=-2 +kerning first=231 second=97 amount=-1 +kerning first=262 second=76 amount=-1 +kerning first=253 second=119 amount=-1 +kerning first=8217 second=99 amount=-2 +kerning first=201 second=354 amount=-1 +kerning first=90 second=97 amount=-1 +kerning first=283 second=230 amount=-1 +kerning first=289 second=119 amount=-1 +kerning first=378 second=117 amount=-1 +kerning first=350 second=121 amount=-1 +kerning first=339 second=97 amount=-1 +kerning first=211 second=230 amount=-1 +kerning first=317 second=72 amount=-1 +kerning first=344 second=275 amount=-1 +kerning first=314 second=121 amount=-1 +kerning first=219 second=74 amount=-1 +kerning first=84 second=205 amount=-1 +kerning first=286 second=250 amount=-1 +kerning first=380 second=275 amount=-1 +kerning first=267 second=97 amount=-1 +kerning first=106 second=230 amount=-1 +kerning first=381 second=354 amount=-1 +kerning first=242 second=121 amount=-1 +kerning first=303 second=97 amount=-1 +kerning first=206 second=121 amount=-1 +kerning first=232 second=311 amount=-1 +kerning first=260 second=107 amount=-1 +kerning first=109 second=250 amount=-1 +kerning first=108 second=378 amount=-1 +kerning first=311 second=240 amount=-1 +kerning first=334 second=366 amount=-1 +kerning first=250 second=250 amount=-1 +kerning first=249 second=378 amount=-1 +kerning first=346 second=72 amount=-1 +kerning first=213 second=378 amount=-1 +kerning first=198 second=117 amount=-1 +kerning first=83 second=107 amount=-1 +kerning first=315 second=219 amount=-1 +kerning first=202 second=89 amount=-1 +kerning first=73 second=250 amount=-1 +kerning first=72 second=378 amount=-1 +kerning first=334 second=76 amount=-1 +kerning first=234 second=117 amount=-1 +kerning first=119 second=107 amount=-1 +kerning first=75 second=116 amount=-1 +kerning first=274 second=363 amount=-1 +kerning first=99 second=318 amount=-1 +kerning first=338 second=302 amount=-1 +kerning first=8220 second=267 amount=-1 +kerning first=310 second=363 amount=-1 +kerning first=379 second=355 amount=-1 +kerning first=346 second=363 amount=-1 +kerning first=334 second=330 amount=-1 +kerning first=356 second=355 amount=-1 +kerning first=266 second=350 amount=-1 +kerning first=286 second=194 amount=-1 +kerning first=382 second=363 amount=-1 +kerning first=187 second=310 amount=-3 +kerning first=240 second=318 amount=-1 +kerning first=8222 second=221 amount=-3 +kerning first=214 second=194 amount=-2 +kerning first=201 second=298 amount=-1 +kerning first=314 second=375 amount=-1 +kerning first=76 second=214 amount=-1 +kerning first=272 second=220 amount=-1 +kerning first=269 second=259 amount=-1 +kerning first=217 second=214 amount=-1 +kerning first=242 second=375 amount=-1 +kerning first=332 second=122 amount=-1 +kerning first=206 second=375 amount=-1 +kerning first=200 second=220 amount=-1 +kerning first=89 second=369 amount=-1 +kerning first=296 second=122 amount=-1 +kerning first=71 second=296 amount=-1 +kerning first=262 second=330 amount=-1 +kerning first=334 second=77 amount=-1 +kerning first=1057 second=1075 amount=-1 +kerning first=233 second=259 amount=-1 +kerning first=262 second=77 amount=-1 +kerning first=350 second=375 amount=-1 +kerning first=344 second=220 amount=-1 +kerning first=86 second=71 amount=-1 +kerning first=365 second=253 amount=-1 +kerning first=374 second=369 amount=-1 +kerning first=222 second=304 amount=-1 +kerning first=73 second=251 amount=-1 +kerning first=89 second=76 amount=-1 +kerning first=338 second=369 amount=-1 +kerning first=1043 second=1100 amount=-1 +kerning first=352 second=344 amount=-1 +kerning first=212 second=296 amount=-1 +kerning first=307 second=228 amount=-1 +kerning first=323 second=351 amount=-1 +kerning first=220 second=260 amount=-2 +kerning first=277 second=324 amount=-1 +kerning first=278 second=374 amount=-1 +kerning first=235 second=228 amount=-1 +kerning first=230 second=369 amount=-1 +kerning first=199 second=228 amount=-1 +kerning first=101 second=375 amount=-1 +kerning first=194 second=369 amount=-1 +kerning first=119 second=245 amount=-1 +kerning first=208 second=344 amount=-1 +kerning first=8216 second=255 amount=-1 +kerning first=356 second=296 amount=-1 +kerning first=81 second=304 amount=-1 +kerning first=65 second=375 amount=-1 +kerning first=302 second=369 amount=-1 +kerning first=287 second=273 amount=-1 +kerning first=1052 second=1104 amount=-1 +kerning first=84 second=206 amount=-1 +kerning first=266 second=369 amount=-1 +kerning first=286 second=251 amount=-1 +kerning first=376 second=240 amount=-2 +kerning first=113 second=234 amount=-1 +kerning first=327 second=284 amount=-1 +kerning first=1078 second=1108 amount=-1 +kerning first=68 second=85 amount=-1 +kerning first=218 second=234 amount=-1 +kerning first=315 second=218 amount=-1 +kerning first=67 second=344 amount=-1 +kerning first=221 second=253 amount=-1 +kerning first=381 second=298 amount=-1 +kerning first=97 second=363 amount=-1 +kerning first=102 second=279 amount=-1 +kerning first=257 second=253 amount=-1 +kerning first=219 second=284 amount=-1 +kerning first=79 second=83 amount=-1 +kerning first=78 second=284 amount=-1 +kerning first=202 second=363 amount=-1 +kerning first=77 second=234 amount=-1 +kerning first=207 second=279 amount=-1 +kerning first=1057 second=1074 amount=-1 +kerning first=233 second=318 amount=-1 +kerning first=84 second=268 amount=-1 +kerning first=269 second=318 amount=-1 +kerning first=71 second=365 amount=-1 +kerning first=220 second=83 amount=-1 +kerning first=291 second=355 amount=-1 +kerning first=89 second=310 amount=-1 +kerning first=66 second=213 amount=-1 +kerning first=305 second=318 amount=-1 +kerning first=256 second=83 amount=-2 +kerning first=255 second=355 amount=-1 +kerning first=207 second=213 amount=-1 +kerning first=87 second=73 amount=-1 +kerning first=74 second=263 amount=-1 +kerning first=195 second=370 amount=-2 +kerning first=187 second=313 amount=-3 +kerning first=364 second=83 amount=-1 +kerning first=266 second=310 amount=-1 +kerning first=76 second=218 amount=-1 +kerning first=66 second=220 amount=-2 +kerning first=1078 second=1105 amount=-1 +kerning first=102 second=275 amount=-1 +kerning first=328 second=353 amount=-1 +kerning first=248 second=303 amount=-1 +kerning first=364 second=353 amount=-1 +kerning first=356 second=365 amount=-1 +kerning first=1070 second=1055 amount=-1 +kerning first=374 second=310 amount=-1 +kerning first=338 second=310 amount=-1 +kerning first=115 second=353 amount=-1 +kerning first=284 second=365 amount=-1 +kerning first=1053 second=1060 amount=-1 +kerning first=356 second=303 amount=-1 +kerning first=101 second=365 amount=-1 +kerning first=379 second=82 amount=-1 +kerning first=220 second=353 amount=-1 +kerning first=256 second=353 amount=-1 +kerning first=240 second=8250 amount=-1 +kerning first=334 second=280 amount=-1 +kerning first=192 second=235 amount=-1 +kerning first=379 second=225 amount=-1 +kerning first=1024 second=1095 amount=-1 +kerning first=71 second=102 amount=-1 +kerning first=264 second=235 amount=-1 +kerning first=1086 second=1093 amount=-1 +kerning first=1073 second=1083 amount=-1 +kerning first=336 second=228 amount=-1 +kerning first=303 second=361 amount=-1 +kerning first=199 second=225 amount=-1 +kerning first=107 second=98 amount=-1 +kerning first=235 second=225 amount=-1 +kerning first=264 second=228 amount=-1 +kerning first=8218 second=375 amount=-1 +kerning first=79 second=350 amount=-1 +kerning first=295 second=353 amount=-1 +kerning first=90 second=363 amount=-1 +kerning first=316 second=273 amount=-1 +kerning first=284 second=102 amount=-1 +kerning first=241 second=46 amount=-1 +kerning first=1114 second=1102 amount=-1 +kerning first=1046 second=1063 amount=-2 +kerning first=277 second=46 amount=-2 +kerning first=195 second=363 amount=-1 +kerning first=87 second=228 amount=-2 +kerning first=356 second=102 amount=-1 +kerning first=107 second=44 amount=-1 +kerning first=256 second=350 amount=-2 +kerning first=99 second=305 amount=-1 +kerning first=267 second=363 amount=-1 +kerning first=303 second=363 amount=-1 +kerning first=103 second=273 amount=-1 +kerning first=8249 second=84 amount=-2 +kerning first=1071 second=1108 amount=-1 +kerning first=339 second=363 amount=-1 +kerning first=8250 second=345 amount=-1 +kerning first=197 second=318 amount=-1 +kerning first=74 second=260 amount=-3 +kerning first=262 second=280 amount=-1 +kerning first=367 second=112 amount=-1 +kerning first=198 second=67 amount=-1 +kerning first=260 second=211 amount=-1 +kerning first=331 second=112 amount=-1 +kerning first=376 second=261 amount=-2 +kerning first=207 second=216 amount=-1 +kerning first=296 second=211 amount=-1 +kerning first=79 second=86 amount=-1 +kerning first=295 second=112 amount=-1 +kerning first=68 second=171 amount=-1 +kerning first=104 second=171 amount=-1 +kerning first=303 second=107 amount=-1 +kerning first=223 second=112 amount=-1 +kerning first=267 second=107 amount=-1 +kerning first=187 second=112 amount=-1 +kerning first=381 second=81 amount=-1 +kerning first=8220 second=287 amount=-2 +kerning first=232 second=261 amount=-1 +kerning first=256 second=86 amount=-3 +kerning first=375 second=107 amount=-1 +kerning first=118 second=112 amount=-1 +kerning first=268 second=261 amount=-1 +kerning first=66 second=216 amount=-1 +kerning first=339 second=107 amount=-1 +kerning first=82 second=112 amount=-1 +kerning first=304 second=261 amount=-1 +kerning first=368 second=211 amount=-1 +kerning first=317 second=171 amount=-1 +kerning first=354 second=232 amount=-1 +kerning first=278 second=204 amount=-1 +kerning first=353 second=171 amount=-1 +kerning first=313 second=105 amount=-1 +kerning first=350 second=204 amount=-1 +kerning first=84 second=209 amount=-1 +kerning first=198 second=327 amount=-1 +kerning first=315 second=216 amount=-1 +kerning first=8250 second=82 amount=-3 +kerning first=8218 second=108 amount=-1 +kerning first=375 second=100 amount=-1 +kerning first=277 second=105 amount=-1 +kerning first=209 second=171 amount=-2 +kerning first=201 second=81 amount=-1 +kerning first=1024 second=1098 amount=-1 +kerning first=1043 second=1103 amount=-2 +kerning first=195 second=100 amount=-1 +kerning first=231 second=100 amount=-1 +kerning first=113 second=230 amount=-1 +kerning first=267 second=100 amount=-1 +kerning first=86 second=346 amount=-2 +kerning first=303 second=100 amount=-1 +kerning first=204 second=249 amount=-1 +kerning first=77 second=230 amount=-1 +kerning first=1038 second=1079 amount=-1 +kerning first=90 second=100 amount=-1 +kerning first=207 second=275 amount=-1 +kerning first=1079 second=1103 amount=-1 +kerning first=231 second=107 amount=-1 +kerning first=195 second=107 amount=-1 +kerning first=209 second=339 amount=-1 +kerning first=362 second=230 amount=-2 +kerning first=1060 second=1039 amount=-1 +kerning first=99 second=249 amount=-1 +kerning first=290 second=230 amount=-1 +kerning first=200 second=223 amount=-1 +kerning first=1024 second=1039 amount=-1 +kerning first=83 second=325 amount=-1 +kerning first=67 second=69 amount=-1 +kerning first=317 second=79 amount=-1 +kerning first=375 second=104 amount=-1 +kerning first=201 second=84 amount=-1 +kerning first=81 second=44 amount=-1 +kerning first=256 second=89 amount=-3 +kerning first=339 second=104 amount=-1 +kerning first=288 second=201 amount=-1 +kerning first=1061 second=1104 amount=-1 +kerning first=381 second=84 amount=-1 +kerning first=187 second=109 amount=-1 +kerning first=118 second=314 amount=-1 +kerning first=79 second=89 amount=-1 +kerning first=82 second=314 amount=-1 +kerning first=90 second=192 amount=-1 +kerning first=283 second=237 amount=-1 +kerning first=223 second=314 amount=-1 +kerning first=330 second=44 amount=-1 +kerning first=377 second=262 amount=-1 +kerning first=290 second=72 amount=-1 +kerning first=187 second=314 amount=-1 +kerning first=327 second=8249 amount=-2 +kerning first=295 second=314 amount=-1 +kerning first=118 second=109 amount=-1 +kerning first=102 second=269 amount=-1 +kerning first=259 second=314 amount=-1 +kerning first=362 second=227 amount=-2 +kerning first=275 second=187 amount=-1 +kerning first=366 second=44 amount=-3 +kerning first=378 second=245 amount=-1 +kerning first=106 second=237 amount=-1 +kerning first=367 second=314 amount=-1 +kerning first=303 second=104 amount=-1 +kerning first=114 second=8249 amount=-1 +kerning first=370 second=277 amount=-1 +kerning first=331 second=314 amount=-1 +kerning first=192 second=232 amount=-1 +kerning first=267 second=104 amount=-1 +kerning first=272 second=282 amount=-1 +kerning first=356 second=99 amount=-2 +kerning first=117 second=44 amount=-1 +kerning first=77 second=224 amount=-1 +kerning first=231 second=104 amount=-1 +kerning first=98 second=380 amount=-1 +kerning first=264 second=232 amount=-1 +kerning first=195 second=104 amount=-1 +kerning first=200 second=282 amount=-1 +kerning first=98 second=187 amount=-1 +kerning first=222 second=44 amount=-1 +kerning first=262 second=277 amount=-1 +kerning first=214 second=344 amount=-1 +kerning first=284 second=302 amount=-1 +kerning first=113 second=224 amount=-1 +kerning first=74 second=326 amount=-1 +kerning first=201 second=351 amount=-1 +kerning first=1038 second=1076 amount=-3 +kerning first=298 second=277 amount=-1 +kerning first=212 second=302 amount=-1 +kerning first=73 second=257 amount=-1 +kerning first=87 second=232 amount=-1 +kerning first=381 second=347 amount=-1 +kerning first=72 second=257 amount=-1 +kerning first=71 second=361 amount=-1 +kerning first=108 second=371 amount=-1 +kerning first=290 second=224 amount=-1 +kerning first=71 second=302 amount=-1 +kerning first=363 second=8249 amount=-1 +kerning first=268 second=202 amount=-1 +kerning first=121 second=277 amount=-1 +kerning first=362 second=224 amount=-1 +kerning first=107 second=99 amount=-1 +kerning first=90 second=101 amount=-1 +kerning first=375 second=97 amount=-2 +kerning first=303 second=367 amount=-1 +kerning first=352 second=69 amount=-1 +kerning first=381 second=351 amount=-1 +kerning first=339 second=367 amount=-1 +kerning first=195 second=101 amount=-1 +kerning first=376 second=202 amount=-1 +kerning first=231 second=367 amount=-1 +kerning first=280 second=69 amount=-1 +kerning first=231 second=101 amount=-1 +kerning first=267 second=367 amount=-1 +kerning first=267 second=101 amount=-1 +kerning first=286 second=257 amount=-1 +kerning first=208 second=69 amount=-1 +kerning first=323 second=267 amount=-1 +kerning first=84 second=212 amount=-1 +kerning first=303 second=101 amount=-1 +kerning first=195 second=367 amount=-1 +kerning first=382 second=121 amount=-1 +kerning first=380 second=226 amount=-1 +kerning first=214 second=257 amount=-1 +kerning first=350 second=114 amount=-1 +kerning first=209 second=79 amount=-1 +kerning first=356 second=302 amount=-1 +kerning first=250 second=257 amount=-1 +kerning first=90 second=367 amount=-1 +kerning first=287 second=267 amount=-1 +kerning first=331 second=316 amount=-1 +kerning first=76 second=221 amount=-1 +kerning first=120 second=271 amount=-1 +kerning first=71 second=362 amount=-1 +kerning first=296 second=382 amount=-1 +kerning first=367 second=316 amount=-1 +kerning first=332 second=382 amount=-1 +kerning first=90 second=196 amount=-1 +kerning first=201 second=291 amount=-1 +kerning first=368 second=382 amount=-1 +kerning first=362 second=286 amount=-1 +kerning first=212 second=362 amount=-1 +kerning first=1053 second=1057 amount=-1 +kerning first=74 second=266 amount=-1 +kerning first=119 second=382 amount=-1 +kerning first=303 second=255 amount=-1 +kerning first=200 second=226 amount=-1 +kerning first=1024 second=1042 amount=-1 +kerning first=240 second=311 amount=-1 +kerning first=121 second=337 amount=-1 +kerning first=218 second=286 amount=-1 +kerning first=378 second=331 amount=-1 +kerning first=272 second=226 amount=-1 +kerning first=296 second=119 amount=-1 +kerning first=85 second=337 amount=-1 +kerning first=77 second=286 amount=-1 +kerning first=233 second=8221 amount=-1 +kerning first=203 second=331 amount=-1 +kerning first=109 second=289 amount=-1 +kerning first=82 second=316 amount=-1 +kerning first=198 second=331 amount=-1 +kerning first=298 second=337 amount=-1 +kerning first=197 second=8221 amount=-3 +kerning first=234 second=331 amount=-1 +kerning first=284 second=361 amount=-1 +kerning first=262 second=337 amount=-1 +kerning first=187 second=316 amount=-1 +kerning first=223 second=316 amount=-1 +kerning first=356 second=361 amount=-1 +kerning first=259 second=316 amount=-1 +kerning first=323 second=266 amount=-1 +kerning first=295 second=316 amount=-1 +kerning first=231 second=103 amount=-1 +kerning first=204 second=252 amount=-1 +kerning first=364 second=90 amount=-1 +kerning first=195 second=103 amount=-1 +kerning first=113 second=227 amount=-1 +kerning first=334 second=70 amount=-1 +kerning first=77 second=227 amount=-1 +kerning first=90 second=103 amount=-2 +kerning first=381 second=229 amount=-1 +kerning first=213 second=368 amount=-1 +kerning first=262 second=70 amount=-1 +kerning first=68 second=78 amount=-1 +kerning first=290 second=227 amount=-1 +kerning first=278 second=381 amount=-1 +kerning first=85 second=336 amount=-1 +kerning first=321 second=368 amount=-1 +kerning first=99 second=252 amount=-1 +kerning first=286 second=201 amount=-1 +kerning first=218 second=227 amount=-2 +kerning first=79 second=90 amount=-1 +kerning first=214 second=201 amount=-1 +kerning first=99 second=311 amount=-1 +kerning first=262 second=278 amount=-1 +kerning first=262 second=336 amount=-2 +kerning first=256 second=356 amount=-3 +kerning first=311 second=246 amount=-1 +kerning first=83 second=382 amount=-1 +kerning first=105 second=171 amount=-1 +kerning first=334 second=278 amount=-1 +kerning first=8250 second=85 amount=-2 +kerning first=351 second=223 amount=-1 +kerning first=339 second=103 amount=-1 +kerning first=370 second=336 amount=-1 +kerning first=284 second=362 amount=-1 +kerning first=278 second=207 amount=-1 +kerning first=303 second=103 amount=-1 +kerning first=79 second=356 amount=-1 +kerning first=187 second=317 amount=-3 +kerning first=345 second=291 amount=-1 +kerning first=8220 second=273 amount=-1 +kerning first=356 second=362 amount=-1 +kerning first=295 second=103 amount=-1 +kerning first=268 second=246 amount=-1 +kerning first=104 second=369 amount=-1 +kerning first=107 second=45 amount=-2 +kerning first=223 second=103 amount=-1 +kerning first=196 second=246 amount=-1 +kerning first=231 second=382 amount=-1 +kerning first=209 second=369 amount=-1 +kerning first=212 second=45 amount=-1 +kerning first=281 second=116 amount=-1 +kerning first=267 second=382 amount=-1 +kerning first=118 second=103 amount=-2 +kerning first=1070 second=1043 amount=-1 +kerning first=80 second=72 amount=-1 +kerning first=284 second=45 amount=-1 +kerning first=73 second=253 amount=-1 +kerning first=113 second=259 amount=-1 +kerning first=82 second=363 amount=-1 +kerning first=109 second=253 amount=-1 +kerning first=356 second=45 amount=-3 +kerning first=90 second=382 amount=-1 +kerning first=1046 second=1089 amount=-1 +kerning first=267 second=122 amount=-1 +kerning first=317 second=109 amount=-1 +kerning first=187 second=363 amount=-1 +kerning first=231 second=122 amount=-1 +kerning first=281 second=109 amount=-1 +kerning first=200 second=266 amount=-1 +kerning first=330 second=367 amount=-1 +kerning first=1118 second=1089 amount=-1 +kerning first=8250 second=364 amount=-2 +kerning first=8218 second=117 amount=-1 +kerning first=259 second=363 amount=-1 +kerning first=1024 second=1076 amount=-1 +kerning first=108 second=375 amount=-1 +kerning first=1082 second=1089 amount=-1 +kerning first=353 second=109 amount=-1 +kerning first=295 second=363 amount=-1 +kerning first=198 second=65 amount=-1 +kerning first=352 second=8250 amount=-1 +kerning first=317 second=369 amount=-1 +kerning first=331 second=363 amount=-1 +kerning first=377 second=226 amount=-1 +kerning first=356 second=364 amount=-1 +kerning first=303 second=382 amount=-1 +kerning first=86 second=362 amount=-1 +kerning first=375 second=122 amount=-1 +kerning first=353 second=116 amount=-1 +kerning first=313 second=356 amount=-1 +kerning first=367 second=363 amount=-1 +kerning first=315 second=67 amount=-1 +kerning first=8250 second=357 amount=-1 +kerning first=339 second=382 amount=-1 +kerning first=321 second=375 amount=-1 +kerning first=264 second=102 amount=-1 +kerning first=339 second=122 amount=-1 +kerning first=71 second=45 amount=-1 +kerning first=8250 second=104 amount=-1 +kerning first=375 second=382 amount=-1 +kerning first=353 second=369 amount=-1 +kerning first=331 second=103 amount=-1 +kerning first=249 second=375 amount=-1 +kerning first=82 second=370 amount=-1 +kerning first=263 second=355 amount=-1 +kerning first=321 second=115 amount=-1 +kerning first=83 second=76 amount=-1 +kerning first=8250 second=97 amount=-1 +kerning first=187 second=370 amount=-2 +kerning first=78 second=336 amount=-1 +kerning first=249 second=115 amount=-1 +kerning first=122 second=355 amount=-1 +kerning first=356 second=305 amount=-1 +kerning first=1070 second=1036 amount=-1 +kerning first=1042 second=1062 amount=-1 +kerning first=219 second=336 amount=-1 +kerning first=258 second=279 amount=-1 +kerning first=280 second=284 amount=-1 +kerning first=313 second=89 amount=-1 +kerning first=366 second=279 amount=-1 +kerning first=330 second=279 amount=-1 +kerning first=327 second=336 amount=-1 +kerning first=321 second=108 amount=-1 +kerning first=250 second=253 amount=-1 +kerning first=73 second=232 amount=-1 +kerning first=1042 second=1055 amount=-1 +kerning first=1100 second=1103 amount=-1 +kerning first=376 second=246 amount=-1 +kerning first=89 second=66 amount=-1 +kerning first=75 second=332 amount=-1 +kerning first=304 second=246 amount=-1 +kerning first=1024 second=1048 amount=-1 +kerning first=73 second=225 amount=-1 +kerning first=82 second=335 amount=-1 +kerning first=1053 second=1086 amount=-1 +kerning first=118 second=335 amount=-1 +kerning first=108 second=108 amount=-1 +kerning first=376 second=218 amount=-1 +kerning first=362 second=231 amount=-1 +kerning first=313 second=328 amount=-1 +kerning first=1071 second=1072 amount=-1 +kerning first=214 second=225 amount=-1 +kerning first=66 second=344 amount=-2 +kerning first=351 second=104 amount=-1 +kerning first=249 second=108 amount=-1 +kerning first=280 second=192 amount=-1 +kerning first=380 second=273 amount=-1 +kerning first=254 second=8217 amount=-1 +kerning first=86 second=102 amount=-1 +kerning first=88 second=242 amount=-1 +kerning first=290 second=8217 amount=-1 +kerning first=122 second=102 amount=-1 +kerning first=76 second=196 amount=-1 +kerning first=199 second=203 amount=-1 +kerning first=326 second=8217 amount=-2 +kerning first=193 second=242 amount=-1 +kerning first=77 second=231 amount=-1 +kerning first=262 second=46 amount=-1 +kerning first=86 second=355 amount=-1 +kerning first=268 second=218 amount=-1 +kerning first=106 second=8221 amount=-1 +kerning first=286 second=225 amount=-1 +kerning first=290 second=280 amount=-1 +kerning first=113 second=8217 amount=-1 +kerning first=218 second=231 amount=-1 +kerning first=72 second=115 amount=-1 +kerning first=196 second=218 amount=-2 +kerning first=370 second=46 amount=-3 +kerning first=204 second=286 amount=-1 +kerning first=108 second=115 amount=-1 +kerning first=73 second=279 amount=-1 +kerning first=1042 second=1083 amount=-1 +kerning first=85 second=46 amount=-3 +kerning first=371 second=102 amount=-1 +kerning first=262 second=67 amount=-2 +kerning first=196 second=211 amount=-1 +kerning first=83 second=119 amount=-1 +kerning first=121 second=46 amount=-3 +kerning first=199 second=210 amount=-2 +kerning first=283 second=8221 amount=-1 +kerning first=119 second=119 amount=-1 +kerning first=226 second=46 amount=-1 +kerning first=211 second=8221 amount=-1 +kerning first=90 second=122 amount=-1 +kerning first=224 second=119 amount=-1 +kerning first=85 second=67 amount=-1 +kerning first=260 second=119 amount=-2 +kerning first=317 second=81 amount=-1 +kerning first=1056 second=1049 amount=-1 +kerning first=344 second=266 amount=-1 +kerning first=263 second=102 amount=-1 +kerning first=376 second=211 amount=-1 +kerning first=380 second=245 amount=-1 +kerning first=76 second=217 amount=-1 +kerning first=268 second=211 amount=-2 +kerning first=344 second=245 amount=-1 +kerning first=304 second=211 amount=-1 +kerning first=368 second=119 amount=-1 +kerning first=230 second=311 amount=-1 +kerning first=214 second=204 amount=-1 +kerning first=326 second=252 amount=-1 +kerning first=362 second=252 amount=-1 +kerning first=286 second=204 amount=-1 +kerning first=362 second=259 amount=-2 +kerning first=277 second=328 amount=-1 +kerning first=77 second=252 amount=-1 +kerning first=113 second=252 amount=-1 +kerning first=45 second=307 amount=-1 +kerning first=74 second=269 amount=-1 +kerning first=1079 second=1118 amount=-1 +kerning first=218 second=252 amount=-1 +kerning first=298 second=67 amount=-1 +kerning first=364 second=378 amount=-1 +kerning first=84 second=262 amount=-1 +kerning first=382 second=113 amount=-1 +kerning first=287 second=269 amount=-1 +kerning first=274 second=366 amount=-1 +kerning first=378 second=365 amount=-1 +kerning first=74 second=288 amount=-1 +kerning first=66 second=250 amount=-1 +kerning first=310 second=113 amount=-1 +kerning first=378 second=353 amount=-1 +kerning first=120 second=249 amount=-1 +kerning first=202 second=366 amount=-1 +kerning first=88 second=263 amount=-1 +kerning first=323 second=269 amount=-1 +kerning first=275 second=378 amount=-1 +kerning first=220 second=378 amount=-1 +kerning first=260 second=171 amount=-2 +kerning first=324 second=112 amount=-1 +kerning first=338 second=87 amount=-1 +kerning first=198 second=353 amount=-1 +kerning first=234 second=365 amount=-1 +kerning first=332 second=171 amount=-1 +kerning first=252 second=112 amount=-1 +kerning first=234 second=353 amount=-1 +kerning first=198 second=365 amount=-1 +kerning first=368 second=171 amount=-3 +kerning first=346 second=366 amount=-1 +kerning first=75 second=100 amount=-1 +kerning first=323 second=288 amount=-1 +kerning first=272 second=366 amount=-1 +kerning first=194 second=87 amount=-3 +kerning first=1045 second=1054 amount=-1 +kerning first=212 second=352 amount=-1 +kerning first=193 second=275 amount=-1 +kerning first=379 second=210 amount=-1 +kerning first=76 second=192 amount=-1 +kerning first=284 second=352 amount=-1 +kerning first=194 second=354 amount=-3 +kerning first=88 second=275 amount=-1 +kerning first=328 second=121 amount=-1 +kerning first=356 second=352 amount=-2 +kerning first=8217 second=361 amount=-1 +kerning first=264 second=198 amount=-2 +kerning first=121 second=97 amount=-2 +kerning first=220 second=380 amount=-1 +kerning first=8217 second=193 amount=-3 +kerning first=106 second=249 amount=-1 +kerning first=288 second=379 amount=-1 +kerning first=70 second=8249 amount=-2 +kerning first=369 second=8220 amount=-2 +kerning first=102 second=248 amount=-1 +kerning first=336 second=198 amount=-2 +kerning first=221 second=223 amount=-1 +kerning first=1093 second=1105 amount=-1 +kerning first=333 second=8220 amount=-1 +kerning first=346 second=364 amount=-1 +kerning first=87 second=198 amount=-3 +kerning first=200 second=75 amount=-1 +kerning first=70 second=289 amount=-1 +kerning first=374 second=338 amount=-1 +kerning first=283 second=249 amount=-1 +kerning first=106 second=289 amount=-1 +kerning first=225 second=8220 amount=-1 +kerning first=79 second=380 amount=-1 +kerning first=354 second=361 amount=-1 +kerning first=115 second=380 amount=-1 +kerning first=211 second=289 amount=-1 +kerning first=352 second=313 amount=-1 +kerning first=120 second=8220 amount=-1 +kerning first=347 second=237 amount=-1 +kerning first=187 second=75 amount=-3 +kerning first=75 second=339 amount=-1 +kerning first=377 second=274 amount=-1 +kerning first=284 second=73 amount=-1 +kerning first=280 second=313 amount=-1 +kerning first=275 second=237 amount=-1 +kerning first=334 second=46 amount=-1 +kerning first=256 second=99 amount=-1 +kerning first=8216 second=256 amount=-4 +kerning first=356 second=73 amount=-1 +kerning first=220 second=99 amount=-1 +kerning first=208 second=313 amount=-1 +kerning first=71 second=73 amount=-1 +kerning first=211 second=8249 amount=-1 +kerning first=67 second=313 amount=-1 +kerning first=1057 second=1105 amount=-1 +kerning first=193 second=263 amount=-1 +kerning first=334 second=327 amount=-1 +kerning first=98 second=237 amount=-1 +kerning first=106 second=8249 amount=-1 +kerning first=268 second=206 amount=-1 +kerning first=216 second=379 amount=-1 +kerning first=212 second=73 amount=-1 +kerning first=364 second=99 amount=-1 +kerning first=83 second=187 amount=-1 +kerning first=260 second=199 amount=-1 +kerning first=198 second=381 amount=-1 +kerning first=203 second=209 amount=-1 +kerning first=69 second=212 amount=-1 +kerning first=296 second=199 amount=-1 +kerning first=120 second=234 amount=-1 +kerning first=377 second=302 amount=-1 +kerning first=368 second=199 amount=-1 +kerning first=236 second=227 amount=-1 +kerning first=187 second=323 amount=-3 +kerning first=1061 second=1113 amount=-1 +kerning first=380 second=339 amount=-1 +kerning first=288 second=72 amount=-1 +kerning first=283 second=289 amount=-1 +kerning first=8217 second=333 amount=-2 +kerning first=252 second=351 amount=-1 +kerning first=84 second=264 amount=-1 +kerning first=355 second=289 amount=-1 +kerning first=310 second=364 amount=-1 +kerning first=77 second=233 amount=-1 +kerning first=274 second=364 amount=-1 +kerning first=354 second=212 amount=-1 +kerning first=70 second=277 amount=-1 +kerning first=111 second=351 amount=-1 +kerning first=288 second=367 amount=-1 +kerning first=220 second=111 amount=-1 +kerning first=202 second=364 amount=-1 +kerning first=113 second=233 amount=-1 +kerning first=282 second=212 amount=-1 +kerning first=324 second=367 amount=-1 +kerning first=266 second=354 amount=-1 +kerning first=106 second=261 amount=-1 +kerning first=218 second=233 amount=-1 +kerning first=87 second=226 amount=-2 +kerning first=252 second=367 amount=-1 +kerning first=338 second=354 amount=-1 +kerning first=315 second=220 amount=-1 +kerning first=211 second=261 amount=-1 +kerning first=69 second=367 amount=-1 +kerning first=229 second=291 amount=-1 +kerning first=380 second=105 amount=-1 +kerning first=202 second=97 amount=-1 +kerning first=338 second=326 amount=-1 +kerning first=193 second=291 amount=-1 +kerning first=324 second=351 amount=-1 +kerning first=374 second=326 amount=-1 +kerning first=362 second=233 amount=-1 +kerning first=264 second=226 amount=-1 +kerning first=75 second=367 amount=-1 +kerning first=90 second=110 amount=-1 +kerning first=88 second=291 amount=-1 +kerning first=336 second=226 amount=-1 +kerning first=70 second=261 amount=-1 +kerning first=83 second=171 amount=-1 +kerning first=346 second=97 amount=-1 +kerning first=315 second=250 amount=-1 +kerning first=70 second=267 amount=-1 +kerning first=119 second=171 amount=-2 +kerning first=264 second=83 amount=-1 +kerning first=230 second=326 amount=-1 +kerning first=279 second=250 amount=-1 +kerning first=198 second=86 amount=-1 +kerning first=108 second=289 amount=-1 +kerning first=115 second=378 amount=-1 +kerning first=1042 second=1050 amount=-1 +kerning first=266 second=326 amount=-1 +kerning first=267 second=110 amount=-1 +kerning first=380 second=248 amount=-1 +kerning first=79 second=378 amount=-1 +kerning first=224 second=171 amount=-1 +kerning first=86 second=350 amount=-2 +kerning first=310 second=97 amount=-1 +kerning first=351 second=250 amount=-1 +kerning first=251 second=316 amount=-1 +kerning first=339 second=110 amount=-1 +kerning first=283 second=261 amount=-1 +kerning first=287 second=316 amount=-1 +kerning first=375 second=110 amount=-1 +kerning first=89 second=326 amount=-1 +kerning first=378 second=337 amount=-1 +kerning first=207 second=250 amount=-1 +kerning first=108 second=117 amount=-1 +kerning first=210 second=221 amount=-1 +kerning first=81 second=260 amount=-2 +kerning first=1024 second=1057 amount=-1 +kerning first=72 second=117 amount=-1 +kerning first=45 second=260 amount=-2 +kerning first=1070 second=1031 amount=-1 +kerning first=80 second=200 amount=-1 +kerning first=249 second=117 amount=-1 +kerning first=69 second=221 amount=-1 +kerning first=222 second=260 amount=-2 +kerning first=262 second=317 amount=-1 +kerning first=321 second=117 amount=-1 +kerning first=1114 second=1081 amount=-1 +kerning first=362 second=264 amount=-1 +kerning first=262 second=290 amount=-2 +kerning first=282 second=214 amount=-1 +kerning first=298 second=290 amount=-1 +kerning first=218 second=240 amount=-1 +kerning first=366 second=260 amount=-2 +kerning first=241 second=98 amount=-1 +kerning first=77 second=240 amount=-1 +kerning first=354 second=214 amount=-1 +kerning first=221 second=207 amount=-1 +kerning first=370 second=290 amount=-1 +kerning first=113 second=240 amount=-1 +kerning first=218 second=264 amount=-1 +kerning first=85 second=290 amount=-1 +kerning first=113 second=271 amount=-1 +kerning first=362 second=240 amount=-1 +kerning first=69 second=214 amount=-1 +kerning first=213 second=377 amount=-1 +kerning first=240 second=118 amount=-1 +kerning first=282 second=221 amount=-1 +kerning first=68 second=364 amount=-1 +kerning first=77 second=264 amount=-1 +kerning first=262 second=89 amount=-1 +kerning first=80 second=207 amount=-1 +kerning first=75 second=84 amount=-1 +kerning first=321 second=377 amount=-1 +kerning first=286 second=220 amount=-1 +kerning first=222 second=298 amount=-1 +kerning first=366 second=291 amount=-2 +kerning first=350 second=194 amount=-2 +kerning first=214 second=220 amount=-1 +kerning first=330 second=291 amount=-1 +kerning first=68 second=97 amount=-1 +kerning first=1056 second=1030 amount=-1 +kerning first=216 second=84 amount=-1 +kerning first=120 second=227 amount=-1 +kerning first=313 second=330 amount=-1 +kerning first=240 second=353 amount=-1 +kerning first=368 second=289 amount=-2 +kerning first=258 second=291 amount=-1 +kerning first=121 second=287 amount=-2 +kerning first=84 second=227 amount=-2 +kerning first=338 second=317 amount=-1 +kerning first=1064 second=1077 amount=-1 +kerning first=222 second=291 amount=-1 +kerning first=85 second=287 amount=-2 +kerning first=374 second=317 amount=-1 +kerning first=356 second=324 amount=-1 +kerning first=89 second=317 amount=-1 +kerning first=117 second=291 amount=-1 +kerning first=281 second=97 amount=-1 +kerning first=269 second=311 amount=-1 +kerning first=81 second=291 amount=-1 +kerning first=298 second=287 amount=-1 +kerning first=233 second=311 amount=-1 +kerning first=288 second=84 amount=-1 +kerning first=84 second=234 amount=-2 +kerning first=45 second=291 amount=-1 +kerning first=209 second=97 amount=-1 +kerning first=262 second=287 amount=-1 +kerning first=197 second=311 amount=-1 +kerning first=86 second=90 amount=-1 +kerning first=370 second=287 amount=-2 +kerning first=86 second=381 amount=-1 +kerning first=78 second=71 amount=-1 +kerning first=334 second=287 amount=-1 +kerning first=80 second=197 amount=-2 +kerning first=45 second=298 amount=-3 +kerning first=219 second=71 amount=-1 +kerning first=198 second=77 amount=-1 +kerning first=81 second=298 amount=-1 +kerning first=205 second=337 amount=-1 +kerning first=203 second=70 amount=-1 +kerning first=277 second=365 amount=-1 +kerning first=374 second=78 amount=-1 +kerning first=363 second=303 amount=-1 +kerning first=241 second=365 amount=-1 +kerning first=221 second=197 amount=-3 +kerning first=218 second=268 amount=-1 +kerning first=213 second=120 amount=-1 +kerning first=205 second=365 amount=-1 +kerning first=73 second=213 amount=-1 +kerning first=354 second=193 amount=-3 +kerning first=291 second=303 amount=-1 +kerning first=249 second=120 amount=-1 +kerning first=375 second=113 amount=-1 +kerning first=379 second=230 amount=-1 +kerning first=67 second=325 amount=-1 +kerning first=100 second=365 amount=-1 +kerning first=201 second=310 amount=-1 +kerning first=367 second=8217 amount=-2 +kerning first=77 second=268 amount=-1 +kerning first=266 second=78 amount=-1 +kerning first=335 second=353 amount=-1 +kerning first=362 second=243 amount=-1 +kerning first=208 second=325 amount=-1 +kerning first=371 second=353 amount=-1 +kerning first=108 second=120 amount=-1 +kerning first=338 second=85 amount=-1 +kerning first=195 second=113 amount=-1 +kerning first=371 second=118 amount=-1 +kerning first=45 second=270 amount=-3 +kerning first=122 second=353 amount=-1 +kerning first=335 second=118 amount=-1 +kerning first=89 second=78 amount=-1 +kerning first=266 second=85 amount=-1 +kerning first=90 second=113 amount=-1 +kerning first=198 second=74 amount=-1 +kerning first=313 second=70 amount=-1 +kerning first=379 second=201 amount=-1 +kerning first=350 second=227 amount=-1 +kerning first=1056 second=1065 amount=-1 +kerning first=81 second=270 amount=-1 +kerning first=263 second=353 amount=-1 +kerning first=194 second=85 amount=-2 +kerning first=227 second=118 amount=-1 +kerning first=230 second=314 amount=-1 +kerning first=219 second=303 amount=-1 +kerning first=321 second=120 amount=-1 +kerning first=1100 second=1080 amount=-1 +kerning first=303 second=113 amount=-1 +kerning first=194 second=314 amount=-1 +kerning first=255 second=303 amount=-1 +kerning first=89 second=345 amount=-1 +kerning first=89 second=85 amount=-1 +kerning first=267 second=113 amount=-1 +kerning first=8250 second=206 amount=-3 +kerning first=313 second=365 amount=-1 +kerning first=263 second=118 amount=-1 +kerning first=381 second=310 amount=-1 +kerning first=266 second=314 amount=-1 +kerning first=199 second=201 amount=-1 +kerning first=86 second=353 amount=-2 +kerning first=353 second=251 amount=-1 +kerning first=234 second=105 amount=-1 +kerning first=197 second=283 amount=-1 +kerning first=1057 second=1093 amount=-1 +kerning first=381 second=338 amount=-1 +kerning first=1064 second=1108 amount=-1 +kerning first=338 second=314 amount=-1 +kerning first=73 second=248 amount=-1 +kerning first=321 second=380 amount=-1 +kerning first=84 second=224 amount=-2 +kerning first=122 second=118 amount=-1 +kerning first=317 second=324 amount=-1 +kerning first=86 second=118 amount=-1 +kerning first=313 second=98 amount=-1 +kerning first=222 second=270 amount=-1 +kerning first=108 second=380 amount=-1 +kerning first=277 second=98 amount=-1 +kerning first=120 second=224 amount=-1 +kerning first=1100 second=1087 amount=-1 +kerning first=201 second=338 amount=-1 +kerning first=71 second=352 amount=-1 +kerning first=200 second=198 amount=-1 +kerning first=269 second=283 amount=-1 +kerning first=213 second=380 amount=-1 +kerning first=374 second=85 amount=-1 +kerning first=249 second=380 amount=-1 +kerning first=280 second=325 amount=-1 +kerning first=111 second=112 amount=-1 +kerning first=1057 second=1108 amount=-1 +kerning first=221 second=228 amount=-2 +kerning first=8250 second=369 amount=-1 +kerning first=75 second=112 amount=-1 +kerning first=352 second=325 amount=-1 +kerning first=69 second=193 amount=-1 +kerning first=377 second=283 amount=-1 +kerning first=72 second=380 amount=-1 +kerning first=282 second=193 amount=-1 +kerning first=226 second=318 amount=-1 +kerning first=80 second=235 amount=-1 +kerning first=262 second=318 amount=-1 +kerning first=330 second=263 amount=-1 +kerning first=255 second=331 amount=-1 +kerning first=210 second=193 amount=-2 +kerning first=366 second=263 amount=-1 +kerning first=291 second=331 amount=-1 +kerning first=221 second=235 amount=-1 +kerning first=377 second=281 amount=-1 +kerning first=378 second=237 amount=-1 +kerning first=73 second=216 amount=-1 +kerning first=310 second=101 amount=-1 +kerning first=347 second=230 amount=-1 +kerning first=369 second=255 amount=-1 +kerning first=211 second=256 amount=-2 +kerning first=1067 second=1072 amount=-1 +kerning first=89 second=82 amount=-1 +kerning first=382 second=101 amount=-1 +kerning first=333 second=255 amount=-1 +kerning first=1053 second=1073 amount=-1 +kerning first=275 second=230 amount=-1 +kerning first=311 second=230 amount=-1 +kerning first=269 second=281 amount=-1 +kerning first=289 second=224 amount=-1 +kerning first=261 second=255 amount=-1 +kerning first=88 second=251 amount=-1 +kerning first=286 second=76 amount=-1 +kerning first=115 second=108 amount=-1 +kerning first=225 second=255 amount=-1 +kerning first=193 second=251 amount=-1 +kerning first=338 second=347 amount=-1 +kerning first=78 second=67 amount=-1 +kerning first=120 second=255 amount=-1 +kerning first=99 second=8221 amount=-1 +kerning first=302 second=347 amount=-1 +kerning first=211 second=280 amount=-1 +kerning first=84 second=255 amount=-1 +kerning first=266 second=347 amount=-1 +kerning first=120 second=8217 amount=-1 +kerning first=229 second=251 amount=-1 +kerning first=76 second=205 amount=-1 +kerning first=230 second=347 amount=-1 +kerning first=240 second=8221 amount=-1 +kerning first=120 second=231 amount=-1 +kerning first=194 second=347 amount=-1 +kerning first=378 second=105 amount=-1 +kerning first=111 second=107 amount=-1 +kerning first=89 second=347 amount=-2 +kerning first=328 second=371 amount=-1 +kerning first=252 second=107 amount=-1 +kerning first=84 second=231 amount=-2 +kerning first=97 second=106 amount=-1 +kerning first=212 second=80 amount=-1 +kerning first=75 second=81 amount=-1 +kerning first=266 second=345 amount=-1 +kerning first=284 second=80 amount=-1 +kerning first=327 second=67 amount=-1 +kerning first=69 second=217 amount=-1 +kerning first=256 second=368 amount=-2 +kerning first=374 second=345 amount=-1 +kerning first=198 second=346 amount=-1 +kerning first=310 second=106 amount=-1 +kerning first=1045 second=1045 amount=-1 +kerning first=210 second=217 amount=-1 +kerning first=313 second=68 amount=-1 +kerning first=205 second=333 amount=-1 +kerning first=71 second=80 amount=-1 +kerning first=282 second=217 amount=-1 +kerning first=216 second=256 amount=-2 +kerning first=80 second=204 amount=-1 +kerning first=218 second=243 amount=-1 +kerning first=346 second=106 amount=-1 +kerning first=381 second=249 amount=-1 +kerning first=8217 second=328 amount=-1 +kerning first=382 second=106 amount=-1 +kerning first=356 second=80 amount=-1 +kerning first=362 second=268 amount=-1 +kerning first=221 second=204 amount=-1 +kerning first=70 second=256 amount=-2 +kerning first=251 second=307 amount=-1 +kerning first=334 second=374 amount=-1 +kerning first=77 second=243 amount=-1 +kerning first=8216 second=289 amount=-2 +kerning first=83 second=65 amount=-2 +kerning first=287 second=307 amount=-1 +kerning first=1056 second=1033 amount=-1 +kerning first=113 second=243 amount=-1 +kerning first=201 second=69 amount=-1 +kerning first=310 second=104 amount=-1 +kerning first=310 second=369 amount=-1 +kerning first=219 second=334 amount=-1 +kerning first=70 second=284 amount=-1 +kerning first=274 second=104 amount=-1 +kerning first=274 second=369 amount=-1 +kerning first=288 second=344 amount=-1 +kerning first=382 second=369 amount=-1 +kerning first=120 second=259 amount=-1 +kerning first=251 second=44 amount=-1 +kerning first=202 second=104 amount=-1 +kerning first=346 second=369 amount=-1 +kerning first=84 second=259 amount=-2 +kerning first=368 second=192 amount=-2 +kerning first=327 second=334 amount=-1 +kerning first=382 second=104 amount=-1 +kerning first=332 second=192 amount=-2 +kerning first=74 second=44 amount=-1 +kerning first=1070 second=1034 amount=-1 +kerning first=73 second=244 amount=-1 +kerning first=202 second=369 amount=-1 +kerning first=216 second=344 amount=-1 +kerning first=207 second=229 amount=-1 +kerning first=354 second=217 amount=-1 +kerning first=323 second=279 amount=-1 +kerning first=66 second=229 amount=-1 +kerning first=1100 second=1084 amount=-1 +kerning first=287 second=279 amount=-1 +kerning first=102 second=229 amount=-1 +kerning first=74 second=279 amount=-1 +kerning first=83 second=192 amount=-2 +kerning first=323 second=44 amount=-1 +kerning first=351 second=229 amount=-1 +kerning first=287 second=44 amount=-2 +kerning first=279 second=229 amount=-1 +kerning first=78 second=334 amount=-1 +kerning first=369 second=227 amount=-1 +kerning first=330 second=267 amount=-1 +kerning first=221 second=232 amount=-1 +kerning first=212 second=344 amount=-1 +kerning first=77 second=283 amount=-1 +kerning first=366 second=267 amount=-1 +kerning first=115 second=371 amount=-1 +kerning first=279 second=257 amount=-1 +kerning first=202 second=67 amount=-1 +kerning first=100 second=361 amount=-1 +kerning first=1057 second=1096 amount=-1 +kerning first=313 second=65 amount=-1 +kerning first=255 second=305 amount=-1 +kerning first=336 second=219 amount=-1 +kerning first=219 second=305 amount=-1 +kerning first=207 second=257 amount=-1 +kerning first=205 second=361 amount=-1 +kerning first=66 second=257 amount=-1 +kerning first=264 second=219 amount=-1 +kerning first=244 second=8250 amount=-1 +kerning first=203 second=202 amount=-1 +kerning first=291 second=305 amount=-1 +kerning first=102 second=257 amount=-1 +kerning first=277 second=361 amount=-1 +kerning first=203 second=324 amount=-1 +kerning first=266 second=230 amount=-1 +kerning first=192 second=219 amount=-2 +kerning first=241 second=361 amount=-1 +kerning first=374 second=347 amount=-2 +kerning first=80 second=232 amount=-1 +kerning first=229 second=254 amount=-1 +kerning first=199 second=206 amount=-1 +kerning first=371 second=121 amount=-1 +kerning first=87 second=219 amount=-1 +kerning first=335 second=121 amount=-1 +kerning first=338 second=82 amount=-1 +kerning first=374 second=82 amount=-1 +kerning first=263 second=121 amount=-1 +kerning first=381 second=69 amount=-1 +kerning first=88 second=254 amount=-1 +kerning first=122 second=121 amount=-1 +kerning first=197 second=8217 amount=-3 +kerning first=187 second=66 amount=-3 +kerning first=193 second=254 amount=-1 +kerning first=351 second=257 amount=-1 +kerning first=75 second=79 amount=-1 +kerning first=288 second=82 amount=-1 +kerning first=338 second=69 amount=-1 +kerning first=69 second=209 amount=-1 +kerning first=374 second=69 amount=-1 +kerning first=266 second=69 amount=-1 +kerning first=203 second=212 amount=-1 +kerning first=82 second=332 amount=-1 +kerning first=86 second=326 amount=-1 +kerning first=106 second=8217 amount=-1 +kerning first=82 second=79 amount=-1 +kerning first=282 second=209 amount=-1 +kerning first=208 second=230 amount=-1 +kerning first=103 second=316 amount=-1 +kerning first=210 second=209 amount=-1 +kerning first=216 second=82 amount=-1 +kerning first=89 second=69 amount=-1 +kerning first=201 second=66 amount=-1 +kerning first=187 second=72 amount=-3 +kerning first=284 second=76 amount=-1 +kerning first=198 second=89 amount=-1 +kerning first=87 second=216 amount=-1 +kerning first=76 second=199 amount=-1 +kerning first=8217 second=71 amount=-1 +kerning first=381 second=66 amount=-1 +kerning first=212 second=76 amount=-1 +kerning first=8216 second=281 amount=-1 +kerning first=192 second=216 amount=-1 +kerning first=203 second=205 amount=-1 +kerning first=217 second=199 amount=-1 +kerning first=211 second=8217 amount=-1 +kerning first=214 second=229 amount=-1 +kerning first=217 second=192 amount=-2 +kerning first=120 second=347 amount=-1 +kerning first=71 second=76 amount=-1 +kerning first=73 second=229 amount=-1 +kerning first=283 second=8217 amount=-1 +kerning first=202 second=70 amount=-1 +kerning first=1048 second=1077 amount=-1 +kerning first=370 second=67 amount=-1 +kerning first=325 second=199 amount=-1 +kerning first=77 second=287 amount=-1 +kerning first=381 second=326 amount=-1 +kerning first=221 second=226 amount=-2 +kerning first=113 second=8221 amount=-1 +kerning first=313 second=86 amount=-1 +kerning first=1100 second=1099 amount=-1 +kerning first=380 second=242 amount=-1 +kerning first=68 second=257 amount=-1 +kerning first=344 second=242 amount=-1 +kerning first=201 second=326 amount=-1 +kerning first=254 second=8221 amount=-1 +kerning first=365 second=226 amount=-1 +kerning first=290 second=8221 amount=-1 +kerning first=264 second=216 amount=-2 +kerning first=90 second=119 amount=-1 +kerning first=218 second=367 amount=-1 +kerning first=356 second=76 amount=-1 +kerning first=195 second=119 amount=-2 +kerning first=291 second=333 amount=-1 +kerning first=244 second=316 amount=-1 +kerning first=86 second=216 amount=-1 +kerning first=111 second=103 amount=-1 +kerning first=1082 second=1092 amount=-1 +kerning first=231 second=119 amount=-1 +kerning first=255 second=333 amount=-1 +kerning first=75 second=103 amount=-1 +kerning first=221 second=219 amount=-1 +kerning first=210 second=202 amount=-1 +kerning first=1118 second=1092 amount=-1 +kerning first=334 second=302 amount=-1 +kerning first=327 second=45 amount=-2 +kerning first=354 second=209 amount=-1 +kerning first=69 second=202 amount=-1 +kerning first=303 second=119 amount=-1 +kerning first=262 second=302 amount=-1 +kerning first=339 second=119 amount=-1 +kerning first=375 second=119 amount=-1 +kerning first=8250 second=367 amount=-1 +kerning first=1042 second=1059 amount=-1 +kerning first=219 second=333 amount=-1 +kerning first=337 second=291 amount=-1 +kerning first=282 second=202 amount=-1 +kerning first=1046 second=1092 amount=-1 +kerning first=382 second=116 amount=-1 +kerning first=364 second=375 amount=-1 +kerning first=346 second=116 amount=-1 +kerning first=382 second=122 amount=-1 +kerning first=66 second=253 amount=-1 +kerning first=328 second=375 amount=-1 +kerning first=283 second=259 amount=-1 +kerning first=346 second=122 amount=-1 +kerning first=75 second=369 amount=-1 +kerning first=114 second=45 amount=-1 +kerning first=75 second=363 amount=-1 +kerning first=324 second=103 amount=-1 +kerning first=78 second=45 amount=-2 +kerning first=198 second=356 amount=-1 +kerning first=288 second=103 amount=-1 +kerning first=207 second=253 amount=-1 +kerning first=261 second=252 amount=-1 +kerning first=219 second=45 amount=-3 +kerning first=258 second=269 amount=-1 +kerning first=252 second=103 amount=-1 +kerning first=243 second=253 amount=-1 +kerning first=310 second=116 amount=-1 +kerning first=366 second=269 amount=-1 +kerning first=216 second=103 amount=-1 +kerning first=120 second=246 amount=-1 +kerning first=279 second=253 amount=-1 +kerning first=291 second=45 amount=-1 +kerning first=330 second=269 amount=-1 +kerning first=252 second=363 amount=-1 +kerning first=84 second=246 amount=-1 +kerning first=315 second=253 amount=-1 +kerning first=369 second=252 amount=-1 +kerning first=211 second=259 amount=-1 +kerning first=288 second=363 amount=-1 +kerning first=1046 second=1086 amount=-1 +kerning first=324 second=369 amount=-1 +kerning first=324 second=363 amount=-1 +kerning first=346 second=382 amount=-1 +kerning first=288 second=369 amount=-1 +kerning first=382 second=382 amount=-1 +kerning first=70 second=259 amount=-1 +kerning first=198 second=362 amount=-1 +kerning first=274 second=122 amount=-1 +kerning first=1053 second=1089 amount=-1 +kerning first=193 second=266 amount=-1 +kerning first=202 second=382 amount=-1 +kerning first=274 second=109 amount=-1 +kerning first=8217 second=331 amount=-1 +kerning first=262 second=327 amount=-1 +kerning first=202 second=122 amount=-1 +kerning first=382 second=109 amount=-1 +kerning first=115 second=375 amount=-1 +kerning first=252 second=369 amount=-1 +kerning first=88 second=266 amount=-1 +kerning first=274 second=382 amount=-1 +kerning first=346 second=109 amount=-1 +kerning first=119 second=97 amount=-2 +kerning first=220 second=115 amount=-1 +kerning first=216 second=370 amount=-1 +kerning first=115 second=115 amount=-1 +kerning first=288 second=370 amount=-1 +kerning first=202 second=109 amount=-1 +kerning first=8217 second=352 amount=-1 +kerning first=328 second=115 amount=-1 +kerning first=364 second=115 amount=-1 +kerning first=88 second=279 amount=-1 +kerning first=234 second=355 amount=-1 +kerning first=356 second=336 amount=-1 +kerning first=256 second=115 amount=-1 +kerning first=1118 second=1086 amount=-1 +kerning first=1082 second=1086 amount=-1 +kerning first=193 second=279 amount=-1 +kerning first=207 second=232 amount=-1 +kerning first=351 second=253 amount=-1 +kerning first=262 second=296 amount=-1 +kerning first=378 second=355 amount=-1 +kerning first=334 second=296 amount=-1 +kerning first=356 second=353 amount=-2 +kerning first=256 second=108 amount=-1 +kerning first=75 second=370 amount=-1 +kerning first=328 second=108 amount=-1 +kerning first=263 second=8249 amount=-1 +kerning first=203 second=206 amount=-1 +kerning first=313 second=8221 amount=-2 +kerning first=334 second=315 amount=-1 +kerning first=187 second=85 amount=-2 +kerning first=262 second=303 amount=-1 +kerning first=82 second=338 amount=-1 +kerning first=1104 second=1113 amount=-1 +kerning first=82 second=85 amount=-1 +kerning first=201 second=325 amount=-1 +kerning first=266 second=75 amount=-1 +kerning first=282 second=196 amount=-1 +kerning first=204 second=290 amount=-1 +kerning first=356 second=328 amount=-1 +kerning first=262 second=315 amount=-1 +kerning first=354 second=196 amount=-3 +kerning first=268 second=221 amount=-1 +kerning first=381 second=325 amount=-1 +kerning first=370 second=303 amount=-1 +kerning first=374 second=75 amount=-1 +kerning first=198 second=83 amount=-1 +kerning first=89 second=323 amount=-1 +kerning first=8250 second=122 amount=-3 +kerning first=371 second=380 amount=-1 +kerning first=371 second=98 amount=-1 +kerning first=210 second=196 amount=-2 +kerning first=8217 second=65 amount=-3 +kerning first=365 second=225 amount=-1 +kerning first=85 second=303 amount=-1 +kerning first=263 second=98 amount=-1 +kerning first=363 second=46 amount=-1 +kerning first=1100 second=1093 amount=-1 +kerning first=377 second=286 amount=-1 +kerning first=266 second=323 amount=-1 +kerning first=121 second=303 amount=-1 +kerning first=227 second=98 amount=-1 +kerning first=374 second=323 amount=-1 +kerning first=263 second=380 amount=-1 +kerning first=338 second=323 amount=-1 +kerning first=221 second=225 amount=-2 +kerning first=262 second=226 amount=-1 +kerning first=255 second=311 amount=-1 +kerning first=219 second=46 amount=-3 +kerning first=212 second=77 amount=-1 +kerning first=1050 second=1118 amount=-1 +kerning first=255 second=46 amount=-3 +kerning first=264 second=210 amount=-2 +kerning first=208 second=317 amount=-1 +kerning first=291 second=46 amount=-2 +kerning first=313 second=71 amount=-1 +kerning first=120 second=233 amount=-1 +kerning first=327 second=46 amount=-1 +kerning first=71 second=77 amount=-1 +kerning first=197 second=286 amount=-1 +kerning first=356 second=77 amount=-1 +kerning first=1056 second=1040 amount=-2 +kerning first=1114 second=1080 amount=-1 +kerning first=205 second=71 amount=-1 +kerning first=87 second=210 amount=-1 +kerning first=114 second=46 amount=-2 +kerning first=284 second=77 amount=-1 +kerning first=1105 second=1078 amount=-1 +kerning first=203 second=211 amount=-1 +kerning first=67 second=317 amount=-1 +kerning first=79 second=197 amount=-2 +kerning first=205 second=352 amount=-1 +kerning first=73 second=235 amount=-1 +kerning first=84 second=252 amount=-1 +kerning first=317 second=112 amount=-1 +kerning first=196 second=221 amount=-3 +kerning first=120 second=252 amount=-1 +kerning first=281 second=112 amount=-1 +kerning first=199 second=200 amount=-1 +kerning first=245 second=112 amount=-1 +kerning first=225 second=252 amount=-1 +kerning first=209 second=112 amount=-1 +kerning first=202 second=110 amount=-1 +kerning first=378 second=102 amount=-1 +kerning first=379 second=200 amount=-1 +kerning first=1045 second=1042 amount=-1 +kerning first=363 second=311 amount=-1 +kerning first=104 second=112 amount=-1 +kerning first=88 second=228 amount=-1 +kerning first=274 second=110 amount=-1 +kerning first=291 second=311 amount=-1 +kerning first=81 second=196 amount=-2 +kerning first=346 second=110 amount=-1 +kerning first=205 second=353 amount=-1 +kerning first=267 second=171 amount=-1 +kerning first=218 second=262 amount=-1 +kerning first=382 second=110 amount=-1 +kerning first=241 second=353 amount=-1 +kerning first=209 second=113 amount=-1 +kerning first=236 second=250 amount=-1 +kerning first=277 second=353 amount=-1 +kerning first=68 second=366 amount=-1 +kerning first=223 second=291 amount=-1 +kerning first=122 second=249 amount=-1 +kerning first=200 second=250 amount=-1 +kerning first=263 second=378 amount=-1 +kerning first=313 second=353 amount=-1 +kerning first=375 second=171 amount=-2 +kerning first=317 second=366 amount=-1 +kerning first=362 second=262 amount=-1 +kerning first=371 second=365 amount=-1 +kerning first=253 second=289 amount=-2 +kerning first=122 second=378 amount=-1 +kerning first=100 second=353 amount=-1 +kerning first=195 second=171 amount=-2 +kerning first=86 second=378 amount=-2 +kerning first=231 second=171 amount=-1 +kerning first=353 second=112 amount=-1 +kerning first=82 second=354 amount=-1 +kerning first=313 second=352 amount=-1 +kerning first=1038 second=1054 amount=-1 +kerning first=258 second=288 amount=-1 +kerning first=187 second=354 amount=-2 +kerning first=218 second=249 amount=-1 +kerning first=330 second=275 amount=-1 +kerning first=351 second=103 amount=-1 +kerning first=1042 second=1078 amount=-1 +kerning first=366 second=275 amount=-1 +kerning first=187 second=87 amount=-2 +kerning first=77 second=262 amount=-1 +kerning first=1056 second=1052 amount=-1 +kerning first=326 second=249 amount=-1 +kerning first=1082 second=1091 amount=-1 +kerning first=209 second=100 amount=-1 +kerning first=82 second=87 amount=-1 +kerning first=344 second=248 amount=-1 +kerning first=1064 second=1105 amount=-1 +kerning first=317 second=364 amount=-1 +kerning first=99 second=289 amount=-1 +kerning first=220 second=377 amount=-1 +kerning first=86 second=380 amount=-2 +kerning first=79 second=377 amount=-1 +kerning first=199 second=198 amount=-2 +kerning first=204 second=289 amount=-1 +kerning first=8250 second=106 amount=-1 +kerning first=122 second=380 amount=-1 +kerning first=1071 second=1077 amount=-1 +kerning first=1042 second=1065 amount=-1 +kerning first=240 second=289 amount=-1 +kerning first=89 second=330 amount=-1 +kerning first=77 second=249 amount=-1 +kerning first=326 second=8220 amount=-2 +kerning first=113 second=249 amount=-1 +kerning first=364 second=377 amount=-1 +kerning first=290 second=8220 amount=-1 +kerning first=380 second=263 amount=-1 +kerning first=366 second=288 amount=-1 +kerning first=254 second=8220 amount=-1 +kerning first=1057 second=1103 amount=-1 +kerning first=86 second=114 amount=-1 +kerning first=381 second=313 amount=-1 +kerning first=68 second=379 amount=-1 +kerning first=227 second=365 amount=-1 +kerning first=1024 second=1064 amount=-1 +kerning first=86 second=99 amount=-2 +kerning first=8217 second=291 amount=-2 +kerning first=113 second=8220 amount=-1 +kerning first=8250 second=107 amount=-1 +kerning first=197 second=287 amount=-1 +kerning first=1060 second=1064 amount=-1 +kerning first=376 second=237 amount=-1 +kerning first=122 second=365 amount=-1 +kerning first=118 second=339 amount=-1 +kerning first=201 second=313 amount=-1 +kerning first=317 second=82 amount=-1 +kerning first=269 second=287 amount=-1 +kerning first=86 second=365 amount=-1 +kerning first=122 second=99 amount=-1 +kerning first=334 second=378 amount=-1 +kerning first=233 second=287 amount=-1 +kerning first=263 second=99 amount=-1 +kerning first=268 second=237 amount=-1 +kerning first=313 second=73 amount=-1 +kerning first=89 second=75 amount=-1 +kerning first=82 second=339 amount=-1 +kerning first=317 second=379 amount=-1 +kerning first=305 second=287 amount=-1 +kerning first=208 second=229 amount=-1 +kerning first=379 second=198 amount=-1 +kerning first=280 second=44 amount=-1 +kerning first=356 second=334 amount=-1 +kerning first=333 second=237 amount=-1 +kerning first=244 second=44 amount=-2 +kerning first=377 second=287 amount=-2 +kerning first=196 second=234 amount=-1 +kerning first=352 second=44 amount=-2 +kerning first=87 second=197 amount=-3 +kerning first=204 second=284 amount=-1 +kerning first=103 second=44 amount=-2 +kerning first=75 second=354 amount=-1 +kerning first=281 second=104 amount=-1 +kerning first=67 second=44 amount=-1 +kerning first=218 second=267 amount=-1 +kerning first=245 second=104 amount=-1 +kerning first=208 second=44 amount=-1 +kerning first=264 second=197 amount=-2 +kerning first=84 second=237 amount=-1 +kerning first=112 second=187 amount=-1 +kerning first=216 second=354 amount=-1 +kerning first=232 second=227 amount=-1 +kerning first=336 second=197 amount=-2 +kerning first=199 second=194 amount=-2 +kerning first=122 second=111 amount=-1 +kerning first=90 second=337 amount=-1 +kerning first=288 second=354 amount=-1 +kerning first=118 second=351 amount=-1 +kerning first=82 second=351 amount=-1 +kerning first=376 second=227 amount=-2 +kerning first=304 second=234 amount=-1 +kerning first=328 second=117 amount=-1 +kerning first=99 second=277 amount=-1 +kerning first=1031 second=1054 amount=-1 +kerning first=288 second=87 amount=-1 +kerning first=304 second=227 amount=-1 +kerning first=376 second=234 amount=-2 +kerning first=204 second=277 amount=-1 +kerning first=268 second=227 amount=-1 +kerning first=216 second=87 amount=-1 +kerning first=86 second=111 amount=-2 +kerning first=353 second=367 amount=-1 +kerning first=380 second=254 amount=-1 +kerning first=198 second=361 amount=-1 +kerning first=305 second=8249 amount=-1 +kerning first=71 second=327 amount=-1 +kerning first=313 second=74 amount=-1 +kerning first=367 second=351 amount=-1 +kerning first=380 second=257 amount=-1 +kerning first=331 second=351 amount=-1 +kerning first=201 second=314 amount=-1 +kerning first=77 second=261 amount=-1 +kerning first=281 second=367 amount=-1 +kerning first=88 second=267 amount=-1 +kerning first=115 second=121 amount=-1 +kerning first=75 second=364 amount=-1 +kerning first=70 second=264 amount=-1 +kerning first=113 second=261 amount=-1 +kerning first=317 second=367 amount=-1 +kerning first=234 second=361 amount=-1 +kerning first=269 second=8249 amount=-1 +kerning first=344 second=257 amount=-1 +kerning first=209 second=367 amount=-1 +kerning first=236 second=254 amount=-1 +kerning first=223 second=351 amount=-1 +kerning first=236 second=257 amount=-1 +kerning first=197 second=8249 amount=-2 +kerning first=284 second=327 amount=-1 +kerning first=288 second=364 amount=-1 +kerning first=187 second=351 amount=-1 +kerning first=272 second=257 amount=-1 +kerning first=104 second=367 amount=-1 +kerning first=8250 second=109 amount=-1 +kerning first=295 second=351 amount=-1 +kerning first=344 second=254 amount=-1 +kerning first=378 second=361 amount=-1 +kerning first=356 second=327 amount=-1 +kerning first=364 second=114 amount=-1 +kerning first=216 second=364 amount=-1 +kerning first=259 second=351 amount=-1 +kerning first=200 second=257 amount=-1 +kerning first=8250 second=116 amount=-1 +kerning first=232 second=224 amount=-1 +kerning first=362 second=261 amount=-2 +kerning first=1055 second=1108 amount=-1 +kerning first=256 second=117 amount=-1 +kerning first=304 second=224 amount=-1 +kerning first=353 second=104 amount=-1 +kerning first=200 second=254 amount=-1 +kerning first=220 second=114 amount=-1 +kerning first=1038 second=1051 amount=-3 +kerning first=268 second=224 amount=-1 +kerning first=364 second=121 amount=-1 +kerning first=1067 second=1057 amount=-1 +kerning first=376 second=224 amount=-2 +kerning first=218 second=261 amount=-2 +kerning first=115 second=114 amount=-1 +kerning first=1031 second=1057 amount=-1 +kerning first=380 second=250 amount=-1 +kerning first=377 second=8249 amount=-1 +kerning first=290 second=261 amount=-1 +kerning first=344 second=250 amount=-1 +kerning first=211 second=274 amount=-1 +kerning first=369 second=237 amount=-1 +kerning first=90 second=234 amount=-1 +kerning first=356 second=337 amount=-2 +kerning first=356 second=331 amount=-1 +kerning first=209 second=101 amount=-1 +kerning first=1045 second=1038 amount=-1 +kerning first=274 second=268 amount=-1 +kerning first=203 second=221 amount=-1 +kerning first=115 second=117 amount=-1 +kerning first=220 second=117 amount=-1 +kerning first=324 second=347 amount=-1 +kerning first=87 second=200 amount=-1 +kerning first=377 second=290 amount=-1 +kerning first=266 second=338 amount=-2 +kerning first=1024 second=1067 amount=-1 +kerning first=200 second=205 amount=-1 +kerning first=234 second=98 amount=-1 +kerning first=84 second=240 amount=-2 +kerning first=194 second=338 amount=-1 +kerning first=197 second=290 amount=-1 +kerning first=67 second=114 amount=-1 +kerning first=87 second=207 amount=-1 +kerning first=256 second=199 amount=-1 +kerning first=89 second=338 amount=-1 +kerning first=364 second=380 amount=-1 +kerning first=89 second=228 amount=-2 +kerning first=346 second=219 amount=-1 +kerning first=264 second=8249 amount=-2 +kerning first=198 second=98 amount=-1 +kerning first=120 second=240 amount=-1 +kerning first=236 second=251 amount=-1 +kerning first=1060 second=1067 amount=-1 +kerning first=344 second=251 amount=-1 +kerning first=336 second=207 amount=-1 +kerning first=313 second=77 amount=-1 +kerning first=264 second=201 amount=-1 +kerning first=381 second=317 amount=-1 +kerning first=380 second=251 amount=-1 +kerning first=198 second=90 amount=-1 +kerning first=86 second=368 amount=-1 +kerning first=82 second=84 amount=-1 +kerning first=1070 second=1024 amount=-1 +kerning first=352 second=304 amount=-1 +kerning first=284 second=330 amount=-1 +kerning first=87 second=201 amount=-1 +kerning first=221 second=220 amount=-1 +kerning first=201 second=317 amount=-1 +kerning first=280 second=304 amount=-1 +kerning first=264 second=207 amount=-1 +kerning first=323 second=291 amount=-1 +kerning first=219 second=324 amount=-1 +kerning first=79 second=381 amount=-1 +kerning first=75 second=97 amount=-1 +kerning first=336 second=200 amount=-1 +kerning first=8250 second=110 amount=-1 +kerning first=287 second=291 amount=-1 +kerning first=240 second=107 amount=-1 +kerning first=187 second=84 amount=-2 +kerning first=291 second=324 amount=-1 +kerning first=264 second=200 amount=-1 +kerning first=221 second=213 amount=-1 +kerning first=255 second=324 amount=-1 +kerning first=220 second=381 amount=-1 +kerning first=262 second=311 amount=-1 +kerning first=252 second=97 amount=-1 +kerning first=110 second=291 amount=-1 +kerning first=288 second=97 amount=-1 +kerning first=74 second=291 amount=-1 +kerning first=1046 second=1101 amount=-1 +kerning first=356 second=71 amount=-1 +kerning first=121 second=311 amount=-1 +kerning first=1082 second=1101 amount=-1 +kerning first=364 second=381 amount=-1 +kerning first=216 second=97 amount=-1 +kerning first=263 second=226 amount=-1 +kerning first=227 second=375 amount=-1 +kerning first=87 second=203 amount=-1 +kerning first=73 second=228 amount=-1 +kerning first=228 second=8220 amount=-1 +kerning first=217 second=193 amount=-2 +kerning first=236 second=253 amount=-1 +kerning first=8250 second=382 amount=-3 +kerning first=79 second=120 amount=-1 +kerning first=86 second=375 amount=-1 +kerning first=203 second=218 amount=-1 +kerning first=115 second=120 amount=-1 +kerning first=71 second=70 amount=-1 +kerning first=371 second=375 amount=-1 +kerning first=344 second=253 amount=-1 +kerning first=335 second=375 amount=-1 +kerning first=353 second=103 amount=-1 +kerning first=380 second=253 amount=-1 +kerning first=121 second=45 amount=-2 +kerning first=1031 second=1060 amount=-1 +kerning first=263 second=375 amount=-1 +kerning first=85 second=45 amount=-3 +kerning first=1067 second=1060 amount=-1 +kerning first=282 second=192 amount=-1 +kerning first=208 second=310 amount=-1 +kerning first=70 second=268 amount=-1 +kerning first=268 second=245 amount=-1 +kerning first=284 second=70 amount=-1 +kerning first=364 second=120 amount=-1 +kerning first=1082 second=1095 amount=-1 +kerning first=336 second=203 amount=-1 +kerning first=1046 second=1095 amount=-2 +kerning first=67 second=310 amount=-1 +kerning first=212 second=70 amount=-1 +kerning first=356 second=68 amount=-1 +kerning first=187 second=78 amount=-3 +kerning first=187 second=345 amount=-1 +kerning first=264 second=203 amount=-1 +kerning first=364 second=118 amount=-1 +kerning first=1100 second=1100 amount=-1 +kerning first=194 second=286 amount=-1 +kerning first=328 second=118 amount=-1 +kerning first=220 second=120 amount=-1 +kerning first=280 second=310 amount=-1 +kerning first=356 second=70 amount=-1 +kerning first=1056 second=1043 amount=-1 +kerning first=336 second=201 amount=-1 +kerning first=371 second=105 amount=-1 +kerning first=220 second=118 amount=-1 +kerning first=102 second=245 amount=-1 +kerning first=371 second=108 amount=-1 +kerning first=8250 second=112 amount=-1 +kerning first=121 second=305 amount=-1 +kerning first=85 second=305 amount=-1 +kerning first=335 second=105 amount=-1 +kerning first=199 second=304 amount=-1 +kerning first=256 second=118 amount=-2 +kerning first=204 second=283 amount=-1 +kerning first=8217 second=287 amount=-2 +kerning first=374 second=335 amount=-2 +kerning first=284 second=65 amount=-1 +kerning first=351 second=241 amount=-1 +kerning first=99 second=283 amount=-1 +kerning first=122 second=105 amount=-1 +kerning first=115 second=118 amount=-1 +kerning first=1107 second=1083 amount=-1 +kerning first=262 second=305 amount=-1 +kerning first=356 second=65 amount=-3 +kerning first=207 second=245 amount=-1 +kerning first=89 second=334 amount=-1 +kerning first=1060 second=1070 amount=-1 +kerning first=68 second=370 amount=-1 +kerning first=86 second=105 amount=-1 +kerning first=255 second=318 amount=-1 +kerning first=376 second=231 amount=-2 +kerning first=325 second=244 amount=-1 +kerning first=302 second=335 amount=-1 +kerning first=315 second=241 amount=-1 +kerning first=1024 second=1070 amount=-1 +kerning first=122 second=108 amount=-1 +kerning first=279 second=241 amount=-1 +kerning first=286 second=228 amount=-1 +kerning first=263 second=108 amount=-1 +kerning first=363 second=318 amount=-1 +kerning first=66 second=241 amount=-1 +kerning first=227 second=108 amount=-1 +kerning first=89 second=335 amount=-2 +kerning first=214 second=228 amount=-1 +kerning first=335 second=108 amount=-1 +kerning first=317 second=370 amount=-1 +kerning first=76 second=193 amount=-1 +kerning first=194 second=335 amount=-1 +kerning first=118 second=347 amount=-1 +kerning first=200 second=66 amount=-1 +kerning first=316 second=316 amount=-1 +kerning first=218 second=256 amount=-2 +kerning first=82 second=347 amount=-1 +kerning first=266 second=66 amount=-1 +kerning first=245 second=107 amount=-1 +kerning first=354 second=205 amount=-1 +kerning first=304 second=231 amount=-1 +kerning first=376 second=230 amount=-2 +kerning first=362 second=256 amount=-2 +kerning first=8250 second=379 amount=-2 +kerning first=362 second=380 amount=-1 +kerning first=99 second=281 amount=-1 +kerning first=1038 second=1047 amount=-1 +kerning first=362 second=255 amount=-1 +kerning first=374 second=66 amount=-1 +kerning first=304 second=230 amount=-1 +kerning first=89 second=332 amount=-1 +kerning first=290 second=256 amount=-1 +kerning first=326 second=255 amount=-1 +kerning first=268 second=231 amount=-1 +kerning first=204 second=281 amount=-1 +kerning first=338 second=66 amount=-1 +kerning first=210 second=205 amount=-1 +kerning first=221 second=216 amount=-1 +kerning first=194 second=332 amount=-1 +kerning first=263 second=371 amount=-1 +kerning first=254 second=255 amount=-1 +kerning first=8217 second=74 amount=-1 +kerning first=1046 second=1098 amount=-1 +kerning first=218 second=255 amount=-1 +kerning first=367 second=347 amount=-1 +kerning first=286 second=310 amount=-1 +kerning first=267 second=240 amount=-1 +kerning first=266 second=332 amount=-2 +kerning first=380 second=102 amount=-1 +kerning first=99 second=369 amount=-1 +kerning first=371 second=371 amount=-1 +kerning first=113 second=255 amount=-1 +kerning first=295 second=347 amount=-1 +kerning first=317 second=107 amount=-1 +kerning first=338 second=332 amount=-1 +kerning first=77 second=255 amount=-1 +kerning first=381 second=346 amount=-1 +kerning first=281 second=107 amount=-1 +kerning first=302 second=332 amount=-1 +kerning first=122 second=371 amount=-1 +kerning first=223 second=347 amount=-1 +kerning first=69 second=205 amount=-1 +kerning first=187 second=347 amount=-1 +kerning first=353 second=107 amount=-1 +kerning first=374 second=332 amount=-1 +kerning first=227 second=371 amount=-1 +kerning first=71 second=68 amount=-1 +kerning first=107 second=333 amount=-1 +kerning first=264 second=204 amount=-1 +kerning first=203 second=217 amount=-1 +kerning first=1027 second=1033 amount=-3 +kerning first=250 second=229 amount=-1 +kerning first=8216 second=277 amount=-1 +kerning first=336 second=204 amount=-1 +kerning first=207 second=242 amount=-1 +kerning first=286 second=229 amount=-1 +kerning first=356 second=67 amount=-1 +kerning first=104 second=106 amount=-1 +kerning first=82 second=81 amount=-1 +kerning first=252 second=289 amount=-1 +kerning first=284 second=68 amount=-1 +kerning first=222 second=282 amount=-1 +kerning first=68 second=106 amount=-1 +kerning first=212 second=68 amount=-1 +kerning first=281 second=106 amount=-1 +kerning first=232 second=230 amount=-1 +kerning first=81 second=282 amount=-1 +kerning first=84 second=243 amount=-2 +kerning first=205 second=346 amount=-1 +kerning first=317 second=106 amount=-1 +kerning first=268 second=230 amount=-1 +kerning first=97 second=119 amount=-1 +kerning first=45 second=282 amount=-3 +kerning first=120 second=243 amount=-1 +kerning first=244 second=307 amount=-1 +kerning first=245 second=106 amount=-1 +kerning first=202 second=119 amount=-1 +kerning first=316 second=307 amount=-1 +kerning first=87 second=204 amount=-1 +kerning first=274 second=119 amount=-1 +kerning first=313 second=346 amount=-1 +kerning first=353 second=106 amount=-1 +kerning first=310 second=119 amount=-1 +kerning first=356 second=333 amount=-2 +kerning first=203 second=214 amount=-1 +kerning first=346 second=119 amount=-1 +kerning first=103 second=230 amount=-1 +kerning first=213 second=327 amount=-1 +kerning first=89 second=353 amount=-2 +kerning first=310 second=199 amount=-1 +kerning first=378 second=249 amount=-1 +kerning first=269 second=275 amount=-1 +kerning first=67 second=230 amount=-1 +kerning first=321 second=327 amount=-1 +kerning first=197 second=275 amount=-1 +kerning first=84 second=45 amount=-3 +kerning first=8250 second=302 amount=-3 +kerning first=72 second=81 amount=-1 +kerning first=379 second=223 amount=-1 +kerning first=84 second=256 amount=-3 +kerning first=199 second=223 amount=-1 +kerning first=368 second=268 amount=-1 +kerning first=218 second=211 amount=-1 +kerning first=374 second=339 amount=-2 +kerning first=77 second=211 amount=-1 +kerning first=352 second=230 amount=-1 +kerning first=86 second=264 amount=-1 +kerning first=280 second=230 amount=-1 +kerning first=362 second=211 amount=-1 +kerning first=8250 second=368 amount=-2 +kerning first=296 second=268 amount=-1 +kerning first=198 second=249 amount=-1 +kerning first=377 second=275 amount=-1 +kerning first=246 second=318 amount=-1 +kerning first=264 second=378 amount=-1 +kerning first=260 second=268 amount=-1 +kerning first=234 second=249 amount=-1 +kerning first=68 second=204 amount=-1 +kerning first=86 second=209 amount=-1 +kerning first=233 second=289 amount=-1 +kerning first=379 second=237 amount=-1 +kerning first=68 second=218 amount=-1 +kerning first=269 second=289 amount=-1 +kerning first=194 second=339 amount=-1 +kerning first=119 second=380 amount=-1 +kerning first=67 second=244 amount=-1 +kerning first=378 second=263 amount=-1 +kerning first=214 second=315 amount=-1 +kerning first=305 second=289 amount=-1 +kerning first=307 second=237 amount=-1 +kerning first=1025 second=1091 amount=-1 +kerning first=103 second=244 amount=-1 +kerning first=220 second=248 amount=-1 +kerning first=213 second=313 amount=-1 +kerning first=89 second=339 amount=-2 +kerning first=1061 second=1091 amount=-1 +kerning first=68 second=259 amount=-1 +kerning first=377 second=289 amount=-2 +kerning first=235 second=237 amount=-1 +kerning first=199 second=237 amount=-1 +kerning first=78 second=199 amount=-1 +kerning first=332 second=282 amount=-1 +kerning first=266 second=339 amount=-1 +kerning first=316 second=244 amount=-1 +kerning first=338 second=353 amount=-1 +kerning first=66 second=8249 amount=-1 +kerning first=374 second=353 amount=-2 +kerning first=1036 second=1060 amount=-2 +kerning first=350 second=361 amount=-1 +kerning first=102 second=8249 amount=-1 +kerning first=77 second=225 amount=-1 +kerning first=1061 second=1105 amount=-1 +kerning first=204 second=334 amount=-1 +kerning first=113 second=225 amount=-1 +kerning first=229 second=365 amount=-1 +kerning first=286 second=315 amount=-1 +kerning first=194 second=353 amount=-1 +kerning first=83 second=282 amount=-1 +kerning first=193 second=365 amount=-1 +kerning first=230 second=353 amount=-1 +kerning first=203 second=346 amount=-1 +kerning first=266 second=353 amount=-1 +kerning first=88 second=365 amount=-1 +kerning first=197 second=289 amount=-1 +kerning first=199 second=251 amount=-1 +kerning first=332 second=296 amount=-1 +kerning first=352 second=202 amount=-1 +kerning first=193 second=351 amount=-1 +kerning first=307 second=251 amount=-1 +kerning first=203 second=374 amount=-1 +kerning first=224 second=254 amount=-1 +kerning first=193 second=231 amount=-1 +kerning first=230 second=121 amount=-1 +kerning first=280 second=202 amount=-1 +kerning first=260 second=254 amount=-1 +kerning first=210 second=206 amount=-1 +kerning first=379 second=251 amount=-1 +kerning first=194 second=121 amount=-1 +kerning first=229 second=351 amount=-1 +kerning first=282 second=206 amount=-1 +kerning first=89 second=121 amount=-1 +kerning first=194 second=79 amount=-1 +kerning first=286 second=205 amount=-1 +kerning first=83 second=254 amount=-1 +kerning first=338 second=367 amount=-1 +kerning first=354 second=206 amount=-1 +kerning first=1042 second=1103 amount=-1 +kerning first=89 second=381 amount=-1 +kerning first=119 second=254 amount=-1 +kerning first=286 second=69 amount=-1 +kerning first=374 second=367 amount=-1 +kerning first=89 second=79 amount=-1 +kerning first=266 second=367 amount=-1 +kerning first=302 second=79 amount=-1 +kerning first=228 second=117 amount=-1 +kerning first=274 second=344 amount=-1 +kerning first=214 second=69 amount=-1 +kerning first=302 second=367 amount=-1 +kerning first=338 second=79 amount=-1 +kerning first=219 second=199 amount=-1 +kerning first=347 second=114 amount=-1 +kerning first=192 second=117 amount=-1 +kerning first=194 second=367 amount=-1 +kerning first=8220 second=99 amount=-1 +kerning first=346 second=344 amount=-1 +kerning first=84 second=284 amount=-1 +kerning first=233 second=261 amount=-1 +kerning first=1056 second=1036 amount=-1 +kerning first=266 second=79 amount=-2 +kerning first=82 second=336 amount=-1 +kerning first=264 second=117 amount=-1 +kerning first=203 second=72 amount=-1 +kerning first=214 second=83 amount=-1 +kerning first=89 second=367 amount=-1 +kerning first=327 second=199 amount=-1 +kerning first=338 second=381 amount=-1 +kerning first=336 second=192 amount=-2 +kerning first=374 second=121 amount=-1 +kerning first=374 second=381 amount=-1 +kerning first=187 second=76 amount=-3 +kerning first=204 second=121 amount=-1 +kerning first=374 second=79 amount=-1 +kerning first=202 second=344 amount=-1 +kerning first=364 second=71 amount=-1 +kerning first=264 second=192 amount=-2 +kerning first=1027 second=1081 amount=-1 +kerning first=302 second=121 amount=-1 +kerning first=1078 second=1089 amount=-1 +kerning first=296 second=240 amount=-1 +kerning first=338 second=107 amount=-1 +kerning first=78 second=171 amount=-2 +kerning first=280 second=216 amount=-1 +kerning first=114 second=171 amount=-1 +kerning first=193 second=337 amount=-1 +kerning first=203 second=86 amount=-1 +kerning first=8220 second=113 amount=-1 +kerning first=260 second=240 amount=-1 +kerning first=269 second=261 amount=-1 +kerning first=230 second=107 amount=-1 +kerning first=67 second=216 amount=-2 +kerning first=194 second=107 amount=-1 +kerning first=362 second=382 amount=-1 +kerning first=368 second=240 amount=-1 +kerning first=377 second=261 amount=-1 +kerning first=266 second=107 amount=-1 +kerning first=1027 second=1095 amount=-1 +kerning first=363 second=171 amount=-1 +kerning first=67 second=202 amount=-1 +kerning first=346 second=330 amount=-1 +kerning first=8250 second=274 amount=-3 +kerning first=199 second=209 amount=-1 +kerning first=274 second=330 amount=-1 +kerning first=208 second=202 amount=-1 +kerning first=219 second=171 amount=-3 +kerning first=119 second=240 amount=-1 +kerning first=255 second=171 amount=-2 +kerning first=379 second=209 amount=-1 +kerning first=291 second=171 amount=-1 +kerning first=327 second=171 amount=-2 +kerning first=1027 second=1102 amount=-1 +kerning first=295 second=252 amount=-1 +kerning first=69 second=206 amount=-1 +kerning first=255 second=227 amount=-2 +kerning first=1073 second=1076 amount=-1 +kerning first=205 second=350 amount=-1 +kerning first=331 second=252 amount=-1 +kerning first=219 second=227 amount=-2 +kerning first=198 second=207 amount=-1 +kerning first=367 second=252 amount=-1 +kerning first=187 second=252 amount=-1 +kerning first=363 second=227 amount=-1 +kerning first=234 second=305 amount=-1 +kerning first=327 second=227 amount=-1 +kerning first=198 second=330 amount=-1 +kerning first=259 second=252 amount=-1 +kerning first=291 second=227 amount=-1 +kerning first=79 second=201 amount=-1 +kerning first=324 second=291 amount=-1 +kerning first=336 second=103 amount=-1 +kerning first=378 second=291 amount=-1 +kerning first=83 second=226 amount=-1 +kerning first=313 second=90 amount=-1 +kerning first=119 second=226 amount=-2 +kerning first=68 second=260 amount=-2 +kerning first=210 second=74 amount=-1 +kerning first=201 second=241 amount=-1 +kerning first=264 second=103 amount=-1 +kerning first=198 second=45 amount=-1 +kerning first=8250 second=344 amount=-3 +kerning first=78 second=227 amount=-1 +kerning first=192 second=103 amount=-1 +kerning first=234 second=291 amount=-1 +kerning first=88 second=337 amount=-1 +kerning first=198 second=291 amount=-1 +kerning first=296 second=226 amount=-1 +kerning first=270 second=45 amount=-1 +kerning first=87 second=103 amount=-2 +kerning first=332 second=226 amount=-1 +kerning first=378 second=45 amount=-2 +kerning first=235 second=230 amount=-1 +kerning first=368 second=226 amount=-2 +kerning first=317 second=260 amount=-1 +kerning first=346 second=84 amount=-1 +kerning first=327 second=213 amount=-1 +kerning first=310 second=84 amount=-1 +kerning first=274 second=84 amount=-1 +kerning first=192 second=89 amount=-3 +kerning first=321 second=109 amount=-1 +kerning first=209 second=115 amount=-1 +kerning first=368 second=212 amount=-1 +kerning first=245 second=115 amount=-1 +kerning first=104 second=115 amount=-1 +kerning first=208 second=196 amount=-2 +kerning first=296 second=212 amount=-1 +kerning first=275 second=44 amount=-2 +kerning first=353 second=115 amount=-1 +kerning first=332 second=84 amount=-1 +kerning first=332 second=78 amount=-1 +kerning first=100 second=104 amount=-1 +kerning first=1092 second=1076 amount=-1 +kerning first=347 second=44 amount=-1 +kerning first=281 second=115 amount=-1 +kerning first=78 second=213 amount=-1 +kerning first=311 second=44 amount=-1 +kerning first=317 second=115 amount=-1 +kerning first=8216 second=74 amount=-1 +kerning first=98 second=44 amount=-2 +kerning first=346 second=70 amount=-1 +kerning first=264 second=89 amount=-1 +kerning first=313 second=104 amount=-1 +kerning first=277 second=104 amount=-1 +kerning first=192 second=267 amount=-1 +kerning first=203 second=44 amount=-1 +kerning first=274 second=70 amount=-1 +kerning first=336 second=89 amount=-1 +kerning first=83 second=78 amount=-1 +kerning first=378 second=277 amount=-1 +kerning first=209 second=232 amount=-1 +kerning first=219 second=213 amount=-1 +kerning first=74 second=303 amount=-1 +kerning first=8218 second=355 amount=-1 +kerning first=284 second=325 amount=-1 +kerning first=202 second=98 amount=-1 +kerning first=310 second=98 amount=-1 +kerning first=315 second=8249 amount=-1 +kerning first=87 second=75 amount=-1 +kerning first=368 second=237 amount=-1 +kerning first=356 second=325 amount=-1 +kerning first=187 second=280 amount=-3 +kerning first=274 second=98 amount=-1 +kerning first=351 second=8249 amount=-1 +kerning first=107 second=283 amount=-1 +kerning first=251 second=303 amount=-1 +kerning first=277 second=118 amount=-1 +kerning first=289 second=120 amount=-1 +kerning first=379 second=289 amount=-2 +kerning first=374 second=196 amount=-3 +kerning first=336 second=75 amount=-1 +kerning first=287 second=303 amount=-1 +kerning first=1045 second=1025 amount=-1 +kerning first=241 second=118 amount=-1 +kerning first=255 second=328 amount=-1 +kerning first=8250 second=330 amount=-3 +kerning first=219 second=328 amount=-1 +kerning first=264 second=75 amount=-1 +kerning first=97 second=98 amount=-1 +kerning first=313 second=118 amount=-1 +kerning first=266 second=196 amount=-2 +kerning first=100 second=118 amount=-1 +kerning first=1098 second=1093 amount=-1 +kerning first=208 second=287 amount=-1 +kerning first=272 second=80 amount=-1 +kerning first=272 second=204 amount=-1 +kerning first=381 second=291 amount=-2 +kerning first=338 second=196 amount=-1 +kerning first=1098 second=1107 amount=-1 +kerning first=205 second=118 amount=-1 +kerning first=317 second=218 amount=-1 +kerning first=1037 second=1104 amount=-1 +kerning first=89 second=196 amount=-3 +kerning first=71 second=325 amount=-1 +kerning first=382 second=98 amount=-1 +kerning first=291 second=241 amount=-1 +kerning first=255 second=241 amount=-1 +kerning first=356 second=283 amount=-2 +kerning first=212 second=325 amount=-1 +kerning first=8218 second=369 amount=-1 +kerning first=280 second=286 amount=-1 +kerning first=82 second=266 amount=-1 +kerning first=1113 second=1087 amount=-1 +kerning first=219 second=241 amount=-1 +kerning first=121 second=314 amount=-1 +kerning first=374 second=210 amount=-1 +kerning first=262 second=314 amount=-1 +kerning first=102 second=8221 amount=1 +kerning first=226 second=314 amount=-1 +kerning first=287 second=331 amount=-1 +kerning first=266 second=210 amount=-2 +kerning first=83 second=353 amount=-1 +kerning first=66 second=8221 amount=-2 +kerning first=363 second=255 amount=-1 +kerning first=279 second=8221 amount=-1 +kerning first=194 second=210 amount=-1 +kerning first=327 second=255 amount=-1 +kerning first=67 second=286 amount=-2 +kerning first=315 second=8221 amount=-2 +kerning first=219 second=269 amount=-1 +kerning first=382 second=112 amount=-1 +kerning first=291 second=255 amount=-1 +kerning first=89 second=210 amount=-1 +kerning first=346 second=112 amount=-1 +kerning first=82 second=252 amount=-1 +kerning first=89 second=224 amount=-2 +kerning first=243 second=8221 amount=-1 +kerning first=291 second=269 amount=-1 +kerning first=310 second=112 amount=-1 +kerning first=321 second=81 amount=-1 +kerning first=219 second=255 amount=-1 +kerning first=230 second=224 amount=-1 +kerning first=378 second=235 amount=-1 +kerning first=208 second=378 amount=-1 +kerning first=274 second=112 amount=-1 +kerning first=72 second=67 amount=-1 +kerning first=74 second=331 amount=-1 +kerning first=198 second=221 amount=-1 +kerning first=302 second=224 amount=-1 +kerning first=351 second=8221 amount=-1 +kerning first=202 second=112 amount=-1 +kerning first=78 second=255 amount=-1 +kerning first=266 second=224 amount=-1 +kerning first=374 second=224 amount=-2 +kerning first=88 second=281 amount=-1 +kerning first=217 second=352 amount=-1 +kerning first=371 second=279 amount=-1 +kerning first=338 second=224 amount=-1 +kerning first=68 second=302 amount=-1 +kerning first=229 second=250 amount=-1 +kerning first=75 second=101 amount=-1 +kerning first=362 second=326 amount=-1 +kerning first=234 second=347 amount=-1 +kerning first=193 second=281 amount=-1 +kerning first=198 second=347 amount=-1 +kerning first=113 second=326 amount=-1 +kerning first=1060 second=1033 amount=-1 +kerning first=279 second=371 amount=-1 +kerning first=88 second=250 amount=-1 +kerning first=221 second=231 amount=-2 +kerning first=85 second=328 amount=-1 +kerning first=325 second=352 amount=-1 +kerning first=218 second=326 amount=-1 +kerning first=80 second=231 amount=-1 +kerning first=351 second=371 amount=-1 +kerning first=193 second=250 amount=-1 +kerning first=218 second=46 amount=-3 +kerning first=260 second=366 amount=-2 +kerning first=378 second=378 amount=-1 +kerning first=1073 second=1118 amount=-1 +kerning first=220 second=257 amount=-2 +kerning first=78 second=283 amount=-1 +kerning first=262 second=328 amount=-1 +kerning first=115 second=257 amount=-1 +kerning first=263 second=333 amount=-1 +kerning first=317 second=302 amount=-1 +kerning first=291 second=283 amount=-1 +kerning first=234 second=378 amount=-1 +kerning first=97 second=369 amount=-1 +kerning first=230 second=8220 amount=-1 +kerning first=255 second=283 amount=-1 +kerning first=198 second=378 amount=-1 +kerning first=1038 second=1092 amount=-2 +kerning first=1048 second=1073 amount=-1 +kerning first=79 second=257 amount=-1 +kerning first=122 second=333 amount=-1 +kerning first=332 second=366 amount=-1 +kerning first=378 second=347 amount=-1 +kerning first=370 second=328 amount=-1 +kerning first=86 second=333 amount=-2 +kerning first=76 second=352 amount=-1 +kerning first=268 second=217 amount=-1 +kerning first=103 second=113 amount=-1 +kerning first=310 second=288 amount=-1 +kerning first=67 second=113 amount=-1 +kerning first=332 second=106 amount=-1 +kerning first=83 second=198 amount=-2 +kerning first=376 second=217 amount=-1 +kerning first=371 second=333 amount=-1 +kerning first=202 second=288 amount=-1 +kerning first=83 second=366 amount=-1 +kerning first=67 second=345 amount=-1 +kerning first=113 second=245 amount=-1 +kerning first=274 second=288 amount=-1 +kerning first=72 second=243 amount=-1 +kerning first=45 second=69 amount=-3 +kerning first=108 second=243 amount=-1 +kerning first=112 second=120 amount=-1 +kerning first=202 second=370 amount=-1 +kerning first=368 second=198 amount=-2 +kerning first=203 second=262 amount=-1 +kerning first=217 second=120 amount=-1 +kerning first=352 second=345 amount=-1 +kerning first=356 second=255 amount=-1 +kerning first=84 second=368 amount=-1 +kerning first=253 second=120 amount=-1 +kerning first=8250 second=218 amount=-2 +kerning first=196 second=217 amount=-2 +kerning first=248 second=255 amount=-1 +kerning first=253 second=271 amount=-1 +kerning first=1057 second=1094 amount=-1 +kerning first=1047 second=1113 amount=-1 +kerning first=76 second=120 amount=-1 +kerning first=317 second=274 amount=-1 +kerning first=1051 second=1054 amount=-1 +kerning first=79 second=229 amount=-1 +kerning first=74 second=99 amount=-1 +kerning first=356 second=227 amount=-2 +kerning first=192 second=279 amount=-1 +kerning first=200 second=323 amount=-1 +kerning first=115 second=229 amount=-1 +kerning first=284 second=227 amount=-1 +kerning first=264 second=279 amount=-1 +kerning first=272 second=323 amount=-1 +kerning first=287 second=99 amount=-1 +kerning first=198 second=104 amount=-1 +kerning first=211 second=278 amount=-1 +kerning first=282 second=44 amount=-1 +kerning first=253 second=324 amount=-1 +kerning first=246 second=44 amount=-2 +kerning first=217 second=324 amount=-1 +kerning first=99 second=233 amount=-1 +kerning first=290 second=354 amount=-1 +kerning first=354 second=44 amount=-3 +kerning first=323 second=99 amount=-1 +kerning first=87 second=279 amount=-2 +kerning first=289 second=324 amount=-1 +kerning first=204 second=233 amount=-1 +kerning first=71 second=227 amount=-1 +kerning first=380 second=267 amount=-1 +kerning first=83 second=106 amount=-1 +kerning first=311 second=234 amount=-1 +kerning first=344 second=267 amount=-1 +kerning first=102 second=111 amount=-1 +kerning first=364 second=229 amount=-2 +kerning first=86 second=226 amount=-2 +kerning first=280 second=317 amount=-1 +kerning first=212 second=227 amount=-1 +kerning first=352 second=317 amount=-1 +kerning first=107 second=227 amount=-1 +kerning first=85 second=110 amount=-1 +kerning first=224 second=106 amount=-1 +kerning first=121 second=110 amount=-1 +kerning first=97 second=316 amount=-1 +kerning first=334 second=82 amount=-1 +kerning first=258 second=264 amount=-1 +kerning first=202 second=316 amount=-1 +kerning first=262 second=110 amount=-1 +kerning first=371 second=361 amount=-1 +kerning first=195 second=212 amount=-1 +kerning first=274 second=316 amount=-1 +kerning first=364 second=257 amount=-2 +kerning first=282 second=290 amount=-1 +kerning first=286 second=224 amount=-1 +kerning first=310 second=316 amount=-1 +kerning first=108 second=271 amount=-1 +kerning first=207 second=111 amount=-1 +kerning first=201 second=65 amount=-1 +kerning first=370 second=110 amount=-1 +kerning first=90 second=212 amount=-1 +kerning first=346 second=316 amount=-1 +kerning first=262 second=82 amount=-1 +kerning first=1058 second=1040 amount=-1 +kerning first=382 second=316 amount=-1 +kerning first=196 second=362 amount=-2 +kerning first=105 second=44 amount=-1 +kerning first=313 second=364 amount=-1 +kerning first=69 second=44 amount=-1 +kerning first=379 second=89 amount=-1 +kerning first=86 second=361 amount=-1 +kerning first=210 second=44 amount=-1 +kerning first=381 second=65 amount=-1 +kerning first=234 second=104 amount=-1 +kerning first=290 second=66 amount=-1 +kerning first=274 second=206 amount=-1 +kerning first=122 second=361 amount=-1 +kerning first=68 second=274 amount=-1 +kerning first=263 second=361 amount=-1 +kerning first=199 second=89 amount=-1 +kerning first=378 second=104 amount=-1 +kerning first=227 second=361 amount=-1 +kerning first=250 second=97 amount=-1 +kerning first=290 second=122 amount=-1 +kerning first=323 second=71 amount=-1 +kerning first=283 second=46 amount=-2 +kerning first=379 second=117 amount=-1 +kerning first=286 second=97 amount=-1 +kerning first=254 second=122 amount=-1 +kerning first=367 second=121 amount=-1 +kerning first=210 second=72 amount=-1 +kerning first=216 second=76 amount=-1 +kerning first=233 second=102 amount=-1 +kerning first=218 second=122 amount=-1 +kerning first=331 second=121 amount=-1 +kerning first=339 second=8250 amount=-1 +kerning first=269 second=102 amount=-1 +kerning first=214 second=97 amount=-1 +kerning first=295 second=121 amount=-1 +kerning first=282 second=72 amount=-1 +kerning first=106 second=46 amount=-1 +kerning first=259 second=121 amount=-1 +kerning first=8250 second=98 amount=-1 +kerning first=223 second=121 amount=-1 +kerning first=354 second=72 amount=-1 +kerning first=362 second=122 amount=-1 +kerning first=211 second=46 amount=-1 +kerning first=187 second=121 amount=-2 +kerning first=1050 second=1108 amount=-1 +kerning first=90 second=8250 amount=-1 +kerning first=210 second=325 amount=-1 +kerning first=356 second=199 amount=-1 +kerning first=199 second=377 amount=-1 +kerning first=375 second=240 amount=-1 +kerning first=66 second=200 amount=-2 +kerning first=70 second=46 amount=-2 +kerning first=69 second=332 amount=-1 +kerning first=316 second=243 amount=-1 +kerning first=113 second=122 amount=-1 +kerning first=235 second=117 amount=-1 +kerning first=69 second=72 amount=-1 +kerning first=315 second=200 amount=-1 +kerning first=77 second=122 amount=-1 +kerning first=199 second=117 amount=-1 +kerning first=87 second=363 amount=-1 +kerning first=116 second=287 amount=-1 +kerning first=8217 second=118 amount=-1 +kerning first=379 second=377 amount=-1 +kerning first=80 second=287 amount=-1 +kerning first=197 second=219 amount=-2 +kerning first=330 second=264 amount=-1 +kerning first=288 second=76 amount=-1 +kerning first=221 second=287 amount=-2 +kerning first=310 second=366 amount=-1 +kerning first=221 second=339 amount=-2 +kerning first=332 second=310 amount=-1 +kerning first=195 second=240 amount=-1 +kerning first=365 second=259 amount=-1 +kerning first=90 second=240 amount=-1 +kerning first=257 second=287 amount=-1 +kerning first=73 second=214 amount=-1 +kerning first=303 second=240 amount=-1 +kerning first=365 second=287 amount=-1 +kerning first=196 second=242 amount=-1 +kerning first=221 second=259 amount=-2 +kerning first=84 second=197 amount=-3 +kerning first=69 second=220 amount=-1 +kerning first=278 second=369 amount=-1 +kerning first=379 second=253 amount=-2 +kerning first=76 second=324 amount=-1 +kerning first=354 second=304 amount=-1 +kerning first=304 second=242 amount=-1 +kerning first=352 second=310 amount=-1 +kerning first=350 second=369 amount=-1 +kerning first=74 second=71 amount=-1 +kerning first=324 second=375 amount=-1 +kerning first=210 second=220 amount=-1 +kerning first=314 second=369 amount=-1 +kerning first=282 second=304 amount=-1 +kerning first=376 second=242 amount=-1 +kerning first=118 second=289 amount=-2 +kerning first=73 second=97 amount=-1 +kerning first=101 second=369 amount=-1 +kerning first=1042 second=1030 amount=-1 +kerning first=65 second=369 amount=-1 +kerning first=210 second=304 amount=-1 +kerning first=200 second=119 amount=-1 +kerning first=206 second=369 amount=-1 +kerning first=86 second=211 amount=-1 +kerning first=354 second=220 amount=-1 +kerning first=317 second=330 amount=-1 +kerning first=236 second=119 amount=-1 +kerning first=70 second=74 amount=-2 +kerning first=102 second=107 amount=2 +kerning first=75 second=375 amount=-2 +kerning first=350 second=223 amount=-1 +kerning first=350 second=89 amount=-1 +kerning first=344 second=119 amount=-1 +kerning first=8220 second=230 amount=-1 +kerning first=207 second=228 amount=-1 +kerning first=211 second=74 amount=-1 +kerning first=380 second=119 amount=-1 +kerning first=203 second=203 amount=-1 +kerning first=223 second=307 amount=-1 +kerning first=252 second=375 amount=-1 +kerning first=68 second=330 amount=-1 +kerning first=122 second=331 amount=-1 +kerning first=66 second=228 amount=-1 +kerning first=278 second=223 amount=-1 +kerning first=111 second=375 amount=-1 +kerning first=195 second=268 amount=-1 +kerning first=304 second=103 amount=-1 +kerning first=84 second=80 amount=-1 +kerning first=8217 second=216 amount=-1 +kerning first=108 second=355 amount=-1 +kerning first=290 second=298 amount=-1 +kerning first=106 second=253 amount=-1 +kerning first=83 second=310 amount=-1 +kerning first=90 second=268 amount=-1 +kerning first=283 second=253 amount=-1 +kerning first=222 second=381 amount=-1 +kerning first=71 second=8217 amount=-1 +kerning first=261 second=108 amount=-1 +kerning first=192 second=363 amount=-1 +kerning first=352 second=85 amount=-1 +kerning first=284 second=296 amount=-1 +kerning first=107 second=8217 amount=-1 +kerning first=225 second=108 amount=-1 +kerning first=228 second=363 amount=-1 +kerning first=333 second=108 amount=-1 +kerning first=264 second=363 amount=-1 +kerning first=280 second=85 amount=-1 +kerning first=98 second=318 amount=-1 +kerning first=8220 second=345 amount=-1 +kerning first=79 second=313 amount=-1 +kerning first=315 second=315 amount=-1 +kerning first=1025 second=1063 amount=-1 +kerning first=264 second=335 amount=-1 +kerning first=208 second=85 amount=-1 +kerning first=203 second=318 amount=-1 +kerning first=337 second=105 amount=-1 +kerning first=369 second=108 amount=-1 +kerning first=8250 second=70 amount=-3 +kerning first=66 second=315 amount=-2 +kerning first=1057 second=1038 amount=-1 +kerning first=73 second=245 amount=-1 +kerning first=275 second=318 amount=-1 +kerning first=1061 second=1063 amount=-2 +kerning first=67 second=85 amount=-1 +kerning first=203 second=290 amount=-1 +kerning first=211 second=225 amount=-1 +kerning first=87 second=335 amount=-2 +kerning first=347 second=318 amount=-1 +kerning first=253 second=380 amount=-1 +kerning first=1046 second=1083 amount=-1 +kerning first=289 second=380 amount=-1 +kerning first=283 second=225 amount=-1 +kerning first=192 second=335 amount=-1 +kerning first=347 second=228 amount=-1 +kerning first=90 second=296 amount=-1 +kerning first=325 second=380 amount=-1 +kerning first=116 second=8249 amount=-1 +kerning first=1065 second=1060 amount=-1 +kerning first=368 second=338 amount=-1 +kerning first=248 second=8217 amount=-1 +kerning first=345 second=45 amount=-1 +kerning first=76 second=380 amount=-1 +kerning first=284 second=8217 amount=-1 +kerning first=70 second=225 amount=-1 +kerning first=296 second=338 amount=-1 +kerning first=112 second=380 amount=-1 +kerning first=106 second=225 amount=-1 +kerning first=260 second=338 amount=-1 +kerning first=351 second=228 amount=-1 +kerning first=290 second=270 amount=-1 +kerning first=217 second=380 amount=-1 +kerning first=1107 second=1103 amount=-1 +kerning first=375 second=98 amount=-1 +kerning first=216 second=280 amount=-1 +kerning first=339 second=98 amount=-1 +kerning first=45 second=105 amount=-1 +kerning first=101 second=251 amount=-1 +kerning first=86 second=235 amount=-1 +kerning first=344 second=228 amount=-1 +kerning first=288 second=280 amount=-1 +kerning first=122 second=235 amount=-1 +kerning first=206 second=251 amount=-1 +kerning first=117 second=303 amount=-1 +kerning first=231 second=98 amount=-1 +kerning first=314 second=251 amount=-1 +kerning first=76 second=206 amount=-1 +kerning first=1105 second=1093 amount=-1 +kerning first=195 second=98 amount=-1 +kerning first=236 second=228 amount=-1 +kerning first=84 second=225 amount=-2 +kerning first=278 second=251 amount=-1 +kerning first=268 second=270 amount=-1 +kerning first=263 second=235 amount=-1 +kerning first=45 second=303 amount=-1 +kerning first=303 second=98 amount=-1 +kerning first=200 second=228 amount=-1 +kerning first=120 second=225 amount=-1 +kerning first=376 second=270 amount=-1 +kerning first=267 second=98 amount=-1 +kerning first=350 second=251 amount=-1 +kerning first=8217 second=255 amount=-1 +kerning first=284 second=370 amount=-1 +kerning first=288 second=218 amount=-1 +kerning first=305 second=46 amount=-1 +kerning first=356 second=370 amount=-1 +kerning first=216 second=218 amount=-1 +kerning first=283 second=102 amount=-1 +kerning first=321 second=289 amount=-1 +kerning first=256 second=355 amount=-1 +kerning first=102 second=273 amount=-1 +kerning first=369 second=225 amount=-1 +kerning first=313 second=325 amount=-1 +kerning first=1045 second=1070 amount=-1 +kerning first=106 second=102 amount=-1 +kerning first=65 second=253 amount=-1 +kerning first=233 second=46 amount=-2 +kerning first=115 second=355 amount=-1 +kerning first=275 second=303 amount=-1 +kerning first=221 second=83 amount=-2 +kerning first=364 second=81 amount=-1 +kerning first=365 second=363 amount=-1 +kerning first=267 second=112 amount=-1 +kerning first=65 second=67 amount=-1 +kerning first=232 second=318 amount=-1 +kerning first=231 second=112 amount=-1 +kerning first=268 second=318 amount=-1 +kerning first=295 second=8221 amount=-2 +kerning first=195 second=112 amount=-1 +kerning first=344 second=214 amount=-1 +kerning first=90 second=112 amount=-1 +kerning first=260 second=279 amount=-1 +kerning first=75 second=266 amount=-1 +kerning first=234 second=102 amount=-1 +kerning first=277 second=311 amount=-1 +kerning first=200 second=214 amount=-1 +kerning first=351 second=259 amount=-1 +kerning first=371 second=235 amount=-1 +kerning first=366 second=105 amount=-1 +kerning first=8250 second=370 amount=-2 +kerning first=203 second=117 amount=-1 +kerning first=220 second=81 amount=-1 +kerning first=278 second=67 amount=-1 +kerning first=207 second=259 amount=-1 +kerning first=375 second=112 amount=-1 +kerning first=8217 second=241 amount=-1 +kerning first=206 second=67 amount=-1 +kerning first=279 second=259 amount=-1 +kerning first=376 second=304 amount=-1 +kerning first=256 second=81 amount=-1 +kerning first=117 second=105 amount=-1 +kerning first=277 second=249 amount=-1 +kerning first=282 second=346 amount=-1 +kerning first=268 second=100 amount=-1 +kerning first=76 second=282 amount=-1 +kerning first=1059 second=1098 amount=-1 +kerning first=313 second=249 amount=-1 +kerning first=45 second=379 amount=-2 +kerning first=304 second=100 amount=-1 +kerning first=1045 second=1050 amount=-1 +kerning first=71 second=350 amount=-1 +kerning first=350 second=327 amount=-1 +kerning first=205 second=249 amount=-1 +kerning first=210 second=346 amount=-1 +kerning first=370 second=275 amount=-1 +kerning first=201 second=230 amount=-1 +kerning first=241 second=249 amount=-1 +kerning first=376 second=100 amount=-2 +kerning first=86 second=45 amount=-3 +kerning first=212 second=350 amount=-1 +kerning first=216 second=204 amount=-1 +kerning first=222 second=379 amount=-1 +kerning first=1043 second=1102 amount=-1 +kerning first=354 second=346 amount=-2 +kerning first=196 second=100 amount=-1 +kerning first=102 second=103 amount=-1 +kerning first=288 second=204 amount=-1 +kerning first=262 second=275 amount=-1 +kerning first=223 second=107 amount=-1 +kerning first=356 second=350 amount=-2 +kerning first=187 second=107 amount=-1 +kerning first=284 second=350 amount=-1 +kerning first=313 second=305 amount=-1 +kerning first=376 second=256 amount=-3 +kerning first=325 second=268 amount=-1 +kerning first=277 second=305 amount=-1 +kerning first=216 second=260 amount=-2 +kerning first=118 second=107 amount=-1 +kerning first=264 second=223 amount=-1 +kerning first=381 second=339 amount=-1 +kerning first=84 second=211 amount=-1 +kerning first=1070 second=1039 amount=-1 +kerning first=82 second=107 amount=-1 +kerning first=268 second=256 amount=-2 +kerning first=381 second=230 amount=-1 +kerning first=288 second=260 amount=-1 +kerning first=205 second=263 amount=-1 +kerning first=370 second=289 amount=-2 +kerning first=221 second=210 amount=-1 +kerning first=381 second=79 amount=-1 +kerning first=87 second=223 amount=-1 +kerning first=280 second=218 amount=-1 +kerning first=1059 second=1084 amount=-2 +kerning first=350 second=313 amount=-1 +kerning first=217 second=268 amount=-1 +kerning first=381 second=353 amount=-1 +kerning first=234 second=8217 amount=-1 +kerning first=221 second=192 amount=-3 +kerning first=45 second=365 amount=-1 +kerning first=75 second=218 amount=-1 +kerning first=278 second=313 amount=-1 +kerning first=270 second=8217 amount=-1 +kerning first=381 second=244 amount=-1 +kerning first=76 second=268 amount=-1 +kerning first=264 second=237 amount=-1 +kerning first=80 second=192 amount=-2 +kerning first=121 second=275 amount=-1 +kerning first=82 second=121 amount=-1 +kerning first=197 second=334 amount=-1 +kerning first=366 second=379 amount=-1 +kerning first=85 second=289 amount=-2 +kerning first=87 second=237 amount=-1 +kerning first=85 second=275 amount=-1 +kerning first=121 second=289 amount=-2 +kerning first=377 second=334 amount=-1 +kerning first=366 second=365 amount=-1 +kerning first=69 second=346 amount=-1 +kerning first=80 second=315 amount=-1 +kerning first=226 second=289 amount=-1 +kerning first=330 second=365 amount=-1 +kerning first=221 second=315 amount=-1 +kerning first=262 second=289 amount=-1 +kerning first=201 second=353 amount=-1 +kerning first=298 second=289 amount=-1 +kerning first=258 second=365 amount=-1 +kerning first=278 second=327 amount=-1 +kerning first=206 second=257 amount=-1 +kerning first=1069 second=1051 amount=-1 +kerning first=257 second=371 amount=-1 +kerning first=101 second=257 amount=-1 +kerning first=371 second=277 amount=-1 +kerning first=380 second=8249 amount=-2 +kerning first=364 second=347 amount=-1 +kerning first=187 second=381 amount=-2 +kerning first=328 second=347 amount=-1 +kerning first=90 second=302 amount=-1 +kerning first=324 second=251 amount=-1 +kerning first=344 second=8249 amount=-2 +kerning first=75 second=336 amount=-1 +kerning first=344 second=351 amount=-1 +kerning first=367 second=367 amount=-1 +kerning first=325 second=212 amount=-1 +kerning first=201 second=79 amount=-1 +kerning first=315 second=69 amount=-1 +kerning first=86 second=277 amount=-2 +kerning first=376 second=114 amount=-1 +kerning first=295 second=367 amount=-1 +kerning first=380 second=351 amount=-1 +kerning first=331 second=367 amount=-1 +kerning first=207 second=267 amount=-1 +kerning first=200 second=351 amount=-1 +kerning first=1058 second=1096 amount=-1 +kerning first=350 second=257 amount=-1 +kerning first=259 second=367 amount=-1 +kerning first=8217 second=378 amount=-1 +kerning first=217 second=212 amount=-1 +kerning first=8217 second=249 amount=-1 +kerning first=278 second=257 amount=-1 +kerning first=76 second=212 amount=-1 +kerning first=236 second=351 amount=-1 +kerning first=314 second=257 amount=-1 +kerning first=268 second=114 amount=-1 +kerning first=187 second=367 amount=-1 +kerning first=362 second=71 amount=-1 +kerning first=333 second=382 amount=-1 +kerning first=227 second=291 amount=-1 +kerning first=267 second=316 amount=-1 +kerning first=74 second=216 amount=-1 +kerning first=103 second=109 amount=-1 +kerning first=369 second=382 amount=-1 +kerning first=303 second=316 amount=-1 +kerning first=82 second=367 amount=-1 +kerning first=122 second=291 amount=-1 +kerning first=339 second=316 amount=-1 +kerning first=86 second=291 amount=-2 +kerning first=375 second=316 amount=-1 +kerning first=99 second=261 amount=-1 +kerning first=8217 second=263 amount=-2 +kerning first=366 second=113 amount=-1 +kerning first=102 second=267 amount=-1 +kerning first=8216 second=253 amount=-1 +kerning first=204 second=261 amount=-1 +kerning first=364 second=197 amount=-2 +kerning first=314 second=271 amount=-1 +kerning first=256 second=347 amount=-1 +kerning first=102 second=281 amount=-1 +kerning first=85 second=269 amount=-1 +kerning first=262 second=171 amount=-2 +kerning first=269 second=314 amount=-1 +kerning first=220 second=347 amount=-1 +kerning first=231 second=228 amount=-1 +kerning first=115 second=361 amount=-1 +kerning first=233 second=314 amount=-1 +kerning first=207 second=281 amount=-1 +kerning first=380 second=337 amount=-1 +kerning first=1058 second=1082 amount=-1 +kerning first=334 second=171 amount=-1 +kerning first=256 second=361 amount=-1 +kerning first=376 second=326 amount=-1 +kerning first=115 second=347 amount=-1 +kerning first=121 second=269 amount=-1 +kerning first=344 second=337 amount=-1 +kerning first=370 second=171 amount=-3 +kerning first=220 second=361 amount=-1 +kerning first=305 second=314 amount=-1 +kerning first=262 second=269 amount=-1 +kerning first=286 second=8221 amount=-1 +kerning first=85 second=171 amount=-3 +kerning first=328 second=361 amount=-1 +kerning first=365 second=371 amount=-1 +kerning first=121 second=171 amount=-2 +kerning first=195 second=316 amount=-1 +kerning first=323 second=216 amount=-1 +kerning first=302 second=67 amount=-1 +kerning first=232 second=326 amount=-1 +kerning first=298 second=269 amount=-1 +kerning first=231 second=316 amount=-1 +kerning first=1069 second=1037 amount=-1 +kerning first=250 second=8221 amount=-2 +kerning first=226 second=171 amount=-1 +kerning first=364 second=361 amount=-1 +kerning first=8218 second=251 amount=-1 +kerning first=268 second=326 amount=-1 +kerning first=313 second=45 amount=-1 +kerning first=116 second=103 amount=-1 +kerning first=1024 second=1060 amount=-1 +kerning first=201 second=224 amount=-1 +kerning first=80 second=103 amount=-1 +kerning first=67 second=331 amount=-1 +kerning first=230 second=252 amount=-1 +kerning first=76 second=78 amount=-1 +kerning first=266 second=252 amount=-1 +kerning first=317 second=70 amount=-1 +kerning first=381 second=224 amount=-1 +kerning first=1057 second=1051 amount=-1 +kerning first=262 second=227 amount=-1 +kerning first=344 second=226 amount=-1 +kerning first=275 second=46 amount=-2 +kerning first=82 second=101 amount=-1 +kerning first=118 second=101 amount=-1 +kerning first=213 second=201 amount=-1 +kerning first=89 second=252 amount=-1 +kerning first=121 second=227 amount=-2 +kerning first=382 second=246 amount=-1 +kerning first=217 second=226 amount=-2 +kerning first=8218 second=379 amount=-1 +kerning first=253 second=226 amount=-2 +kerning first=310 second=246 amount=-1 +kerning first=313 second=207 amount=-1 +kerning first=222 second=317 amount=-1 +kerning first=84 second=382 amount=-2 +kerning first=289 second=226 amount=-1 +kerning first=365 second=103 amount=-1 +kerning first=8216 second=248 amount=-1 +kerning first=325 second=226 amount=-1 +kerning first=284 second=356 amount=-1 +kerning first=100 second=311 amount=-1 +kerning first=211 second=362 amount=-1 +kerning first=371 second=291 amount=-1 +kerning first=302 second=252 amount=-1 +kerning first=284 second=90 amount=-1 +kerning first=335 second=291 amount=-1 +kerning first=338 second=252 amount=-1 +kerning first=257 second=103 amount=-1 +kerning first=45 second=317 amount=-3 +kerning first=374 second=252 amount=-1 +kerning first=221 second=103 amount=-2 +kerning first=81 second=317 amount=-1 +kerning first=356 second=90 amount=-1 +kerning first=263 second=291 amount=-1 +kerning first=1056 second=1067 amount=-1 +kerning first=298 second=213 amount=-1 +kerning first=8222 second=86 amount=-3 +kerning first=262 second=213 amount=-2 +kerning first=327 second=283 amount=-1 +kerning first=68 second=84 amount=-1 +kerning first=370 second=213 amount=-1 +kerning first=278 second=109 amount=-1 +kerning first=80 second=89 amount=-1 +kerning first=75 second=115 amount=-1 +kerning first=71 second=370 amount=-1 +kerning first=317 second=84 amount=-1 +kerning first=71 second=90 amount=-1 +kerning first=212 second=370 amount=-1 +kerning first=350 second=109 amount=-1 +kerning first=8222 second=220 amount=-2 +kerning first=314 second=109 amount=-1 +kerning first=101 second=109 amount=-1 +kerning first=252 second=115 amount=-1 +kerning first=68 second=70 amount=-1 +kerning first=272 second=8249 amount=-1 +kerning first=370 second=227 amount=-2 +kerning first=111 second=115 amount=-1 +kerning first=313 second=193 amount=-1 +kerning first=1090 second=1113 amount=-1 +kerning first=334 second=227 amount=-1 +kerning first=82 second=220 amount=-1 +kerning first=1054 second=1113 amount=-1 +kerning first=200 second=8249 amount=-1 +kerning first=298 second=227 amount=-1 +kerning first=203 second=334 amount=-1 +kerning first=310 second=232 amount=-1 +kerning first=232 second=44 amount=-2 +kerning first=248 second=104 amount=-1 +kerning first=196 second=368 amount=-2 +kerning first=72 second=339 amount=-1 +kerning first=382 second=232 amount=-1 +kerning first=304 second=44 amount=-1 +kerning first=366 second=303 amount=-1 +kerning first=324 second=115 amount=-1 +kerning first=85 second=213 amount=-1 +kerning first=268 second=44 amount=-1 +kerning first=216 second=70 amount=-1 +kerning first=66 second=323 amount=-2 +kerning first=1075 second=1113 amount=-1 +kerning first=282 second=78 amount=-1 +kerning first=295 second=115 amount=-1 +kerning first=368 second=120 amount=-1 +kerning first=102 second=318 amount=1 +kerning first=331 second=115 amount=-1 +kerning first=268 second=368 amount=-1 +kerning first=210 second=78 amount=-1 +kerning first=378 second=118 amount=-1 +kerning first=82 second=375 amount=-1 +kerning first=69 second=78 amount=-1 +kerning first=199 second=75 amount=-1 +kerning first=311 second=248 amount=-1 +kerning first=288 second=70 amount=-1 +kerning first=1057 second=1080 amount=-1 +kerning first=376 second=368 amount=-1 +kerning first=224 second=120 amount=-1 +kerning first=315 second=323 amount=-1 +kerning first=350 second=201 amount=-1 +kerning first=234 second=118 amount=-1 +kerning first=323 second=113 amount=-1 +kerning first=99 second=253 amount=-1 +kerning first=379 second=75 amount=-1 +kerning first=201 second=85 amount=-1 +kerning first=290 second=80 amount=-1 +kerning first=198 second=118 amount=-1 +kerning first=287 second=113 amount=-1 +kerning first=278 second=201 amount=-1 +kerning first=236 second=106 amount=-1 +kerning first=204 second=253 amount=-1 +kerning first=86 second=73 amount=-1 +kerning first=375 second=246 amount=-1 +kerning first=290 second=278 amount=-1 +kerning first=240 second=253 amount=-1 +kerning first=303 second=246 amount=-1 +kerning first=334 second=68 amount=-1 +kerning first=298 second=99 amount=-1 +kerning first=267 second=246 amount=-1 +kerning first=231 second=246 amount=-1 +kerning first=262 second=68 amount=-1 +kerning first=69 second=290 amount=-1 +kerning first=298 second=283 amount=-1 +kerning first=187 second=196 amount=-2 +kerning first=196 second=108 amount=-1 +kerning first=217 second=338 amount=-1 +kerning first=262 second=283 amount=-1 +kerning first=379 second=335 amount=-1 +kerning first=377 second=328 amount=-1 +kerning first=258 second=275 amount=-1 +kerning first=296 second=380 amount=-1 +kerning first=268 second=108 amount=-1 +kerning first=71 second=193 amount=-1 +kerning first=332 second=380 amount=-1 +kerning first=232 second=108 amount=-1 +kerning first=76 second=338 amount=-1 +kerning first=8216 second=362 amount=-1 +kerning first=381 second=286 amount=-1 +kerning first=193 second=103 amount=-1 +kerning first=199 second=335 amount=-1 +kerning first=332 second=120 amount=-1 +kerning first=233 second=110 amount=-1 +kerning first=370 second=283 amount=-1 +kerning first=269 second=110 amount=-1 +kerning first=192 second=231 amount=-1 +kerning first=363 second=105 amount=-1 +kerning first=205 second=287 amount=-1 +kerning first=1040 second=1118 amount=-1 +kerning first=201 second=286 amount=-1 +kerning first=352 second=331 amount=-1 +kerning first=82 second=115 amount=-1 +kerning first=284 second=193 amount=-1 +kerning first=87 second=231 amount=-2 +kerning first=324 second=255 amount=-1 +kerning first=1050 second=1038 amount=-1 +kerning first=208 second=65 amount=-2 +kerning first=280 second=331 amount=-1 +kerning first=212 second=193 amount=-2 +kerning first=316 second=331 amount=-1 +kerning first=223 second=115 amount=-1 +kerning first=280 second=65 amount=-1 +kerning first=259 second=115 amount=-1 +kerning first=264 second=231 amount=-1 +kerning first=118 second=115 amount=-1 +kerning first=352 second=65 amount=-2 +kerning first=1075 second=1083 amount=-1 +kerning first=103 second=331 amount=-1 +kerning first=83 second=380 amount=-1 +kerning first=187 second=115 amount=-1 +kerning first=325 second=338 amount=-1 +kerning first=354 second=78 amount=-1 +kerning first=356 second=193 amount=-3 +kerning first=274 second=302 amount=-1 +kerning first=313 second=255 amount=-1 +kerning first=371 second=347 amount=-1 +kerning first=75 second=210 amount=-1 +kerning first=1055 second=1073 amount=-1 +kerning first=366 second=250 amount=-1 +kerning first=277 second=255 amount=-1 +kerning first=335 second=347 amount=-1 +kerning first=1102 second=1076 amount=-1 +kerning first=202 second=302 amount=-1 +kerning first=241 second=255 amount=-1 +kerning first=354 second=352 amount=-2 +kerning first=205 second=255 amount=-1 +kerning first=263 second=347 amount=-1 +kerning first=1074 second=1078 amount=-1 +kerning first=258 second=250 amount=-1 +kerning first=227 second=347 amount=-1 +kerning first=100 second=255 amount=-1 +kerning first=196 second=262 amount=-1 +kerning first=365 second=307 amount=-1 +kerning first=250 second=371 amount=-1 +kerning first=346 second=8250 amount=-1 +kerning first=330 second=250 amount=-1 +kerning first=84 second=326 amount=-1 +kerning first=122 second=347 amount=-1 +kerning first=1038 second=1078 amount=-2 +kerning first=45 second=250 amount=-1 +kerning first=205 second=378 amount=-1 +kerning first=380 second=249 amount=-1 +kerning first=69 second=352 amount=-1 +kerning first=83 second=296 amount=-1 +kerning first=1039 second=1077 amount=-1 +kerning first=117 second=250 amount=-1 +kerning first=277 second=378 amount=-1 +kerning first=278 second=377 amount=-1 +kerning first=76 second=332 amount=-1 +kerning first=213 second=257 amount=-1 +kerning first=249 second=257 amount=-1 +kerning first=367 second=8220 amount=-2 +kerning first=121 second=283 amount=-1 +kerning first=193 second=267 amount=-1 +kerning first=269 second=328 amount=-1 +kerning first=331 second=8220 amount=-2 +kerning first=85 second=283 amount=-1 +kerning first=346 second=302 amount=-1 +kerning first=1060 second=1047 amount=-1 +kerning first=210 second=352 amount=-1 +kerning first=363 second=103 amount=-1 +kerning first=295 second=8220 amount=-2 +kerning first=100 second=378 amount=-1 +kerning first=195 second=366 amount=-2 +kerning first=378 second=333 amount=-1 +kerning first=259 second=8220 amount=-1 +kerning first=267 second=106 amount=-1 +kerning first=217 second=332 amount=-1 +kerning first=1070 second=1045 amount=-1 +kerning first=223 second=8220 amount=-1 +kerning first=203 second=66 amount=-1 +kerning first=303 second=106 amount=1 +kerning first=350 second=377 amount=-1 +kerning first=325 second=332 amount=-1 +kerning first=317 second=288 amount=-1 +kerning first=87 second=287 amount=-2 +kerning first=1067 second=1092 amount=-1 +kerning first=231 second=106 amount=-1 +kerning first=228 second=287 amount=-1 +kerning first=82 second=8220 amount=-3 +kerning first=192 second=287 amount=-1 +kerning first=46 second=8220 amount=-3 +kerning first=256 second=87 amount=-3 +kerning first=74 second=113 amount=-1 +kerning first=339 second=106 amount=-1 +kerning first=281 second=254 amount=-1 +kerning first=264 second=287 amount=-1 +kerning first=375 second=106 amount=-1 +kerning first=202 second=85 amount=-1 +kerning first=86 second=347 amount=-2 +kerning first=84 second=217 amount=-1 +kerning first=304 second=262 amount=-1 +kerning first=336 second=287 amount=-1 +kerning first=258 second=99 amount=-1 +kerning first=364 second=243 amount=-1 +kerning first=79 second=87 amount=-1 +kerning first=87 second=100 amount=-2 +kerning first=366 second=99 amount=-1 +kerning first=344 second=281 amount=-1 +kerning first=376 second=262 amount=-1 +kerning first=330 second=99 amount=-1 +kerning first=380 second=281 amount=-1 +kerning first=83 second=120 amount=-1 +kerning first=192 second=263 amount=-1 +kerning first=311 second=242 amount=-1 +kerning first=220 second=243 amount=-1 +kerning first=8217 second=199 amount=-1 +kerning first=256 second=243 amount=-1 +kerning first=268 second=197 amount=-2 +kerning first=90 second=198 amount=-1 +kerning first=66 second=119 amount=-2 +kerning first=211 second=354 amount=-1 +kerning first=8220 second=331 amount=-1 +kerning first=268 second=374 amount=-1 +kerning first=376 second=197 amount=-3 +kerning first=207 second=119 amount=-1 +kerning first=85 second=334 amount=-1 +kerning first=195 second=254 amount=-1 +kerning first=243 second=119 amount=-1 +kerning first=196 second=374 amount=-3 +kerning first=83 second=324 amount=-1 +kerning first=1044 second=1054 amount=-1 +kerning first=279 second=119 amount=-1 +kerning first=249 second=369 amount=-1 +kerning first=288 second=274 amount=-1 +kerning first=315 second=119 amount=-1 +kerning first=78 second=289 amount=-1 +kerning first=317 second=344 amount=-1 +kerning first=351 second=119 amount=-1 +kerning first=321 second=369 amount=-1 +kerning first=119 second=324 amount=-1 +kerning first=262 second=334 amount=-2 +kerning first=218 second=74 amount=-1 +kerning first=331 second=118 amount=-1 +kerning first=379 second=279 amount=-1 +kerning first=68 second=344 amount=-1 +kerning first=333 second=46 amount=-2 +kerning first=8216 second=375 amount=-1 +kerning first=67 second=339 amount=-1 +kerning first=263 second=229 amount=-1 +kerning first=103 second=339 amount=-1 +kerning first=218 second=284 amount=-1 +kerning first=316 second=339 amount=-1 +kerning first=77 second=284 amount=-1 +kerning first=368 second=324 amount=-1 +kerning first=371 second=229 amount=-1 +kerning first=1057 second=1024 amount=-1 +kerning first=8222 second=226 amount=-1 +kerning first=262 second=219 amount=-1 +kerning first=302 second=244 amount=-1 +kerning first=241 second=8217 amount=-2 +kerning first=69 second=86 amount=-1 +kerning first=277 second=8217 amount=-1 +kerning first=205 second=199 amount=-1 +kerning first=374 second=244 amount=-2 +kerning first=313 second=8217 amount=-2 +kerning first=350 second=209 amount=-1 +kerning first=323 second=264 amount=-1 +kerning first=354 second=234 amount=-2 +kerning first=367 second=107 amount=-1 +kerning first=282 second=86 amount=-1 +kerning first=84 second=66 amount=-1 +kerning first=313 second=199 amount=-1 +kerning first=338 second=254 amount=-1 +kerning first=100 second=8217 amount=-1 +kerning first=1049 second=1089 amount=-1 +kerning first=210 second=86 amount=-1 +kerning first=73 second=111 amount=-1 +kerning first=370 second=334 amount=-1 +kerning first=252 second=121 amount=-1 +kerning first=272 second=82 amount=-1 +kerning first=68 second=76 amount=-1 +kerning first=212 second=364 amount=-1 +kerning first=375 second=254 amount=-1 +kerning first=219 second=289 amount=-2 +kerning first=206 second=289 amount=-1 +kerning first=200 second=241 amount=-1 +kerning first=255 second=289 amount=-2 +kerning first=1024 second=1041 amount=-1 +kerning first=89 second=244 amount=-2 +kerning first=111 second=121 amount=-1 +kerning first=71 second=364 amount=-1 +kerning first=377 second=205 amount=-1 +kerning first=75 second=121 amount=-2 +kerning first=327 second=289 amount=-1 +kerning first=231 second=254 amount=-1 +kerning first=278 second=209 amount=-1 +kerning first=266 second=380 amount=-1 +kerning first=194 second=244 amount=-1 +kerning first=363 second=289 amount=-1 +kerning first=267 second=254 amount=-1 +kerning first=284 second=364 amount=-1 +kerning first=303 second=254 amount=-1 +kerning first=266 second=244 amount=-1 +kerning first=339 second=254 amount=-1 +kerning first=202 second=296 amount=-1 +kerning first=278 second=117 amount=-1 +kerning first=76 second=72 amount=-1 +kerning first=362 second=225 amount=-2 +kerning first=286 second=200 amount=-1 +kerning first=72 second=251 amount=-1 +kerning first=274 second=296 amount=-1 +kerning first=350 second=117 amount=-1 +kerning first=317 second=76 amount=-1 +kerning first=99 second=102 amount=-1 +kerning first=314 second=117 amount=-1 +kerning first=214 second=200 amount=-1 +kerning first=346 second=296 amount=-1 +kerning first=315 second=85 amount=-1 +kerning first=333 second=122 amount=-1 +kerning first=218 second=225 amount=-2 +kerning first=108 second=251 amount=-1 +kerning first=313 second=370 amount=-1 +kerning first=280 second=71 amount=-1 +kerning first=249 second=251 amount=-1 +kerning first=324 second=121 amount=-1 +kerning first=221 second=97 amount=-2 +kerning first=290 second=225 amount=-1 +kerning first=321 second=251 amount=-1 +kerning first=310 second=240 amount=-1 +kerning first=99 second=46 amount=-1 +kerning first=83 second=206 amount=-1 +kerning first=365 second=97 amount=-1 +kerning first=80 second=245 amount=-1 +kerning first=1054 second=1063 amount=-1 +kerning first=240 second=46 amount=-2 +kerning first=249 second=103 amount=-1 +kerning first=101 second=117 amount=-1 +kerning first=1043 second=1108 amount=-1 +kerning first=65 second=117 amount=-1 +kerning first=257 second=363 amount=-1 +kerning first=382 second=240 amount=-1 +kerning first=334 second=219 amount=-1 +kerning first=206 second=117 amount=-1 +kerning first=332 second=206 amount=-1 +kerning first=8250 second=84 amount=-2 +kerning first=221 second=245 amount=-2 +kerning first=87 second=83 amount=-2 +kerning first=219 second=337 amount=-1 +kerning first=315 second=214 amount=-1 +kerning first=288 second=330 amount=-1 +kerning first=192 second=83 amount=-2 +kerning first=222 second=194 amount=-2 +kerning first=90 second=310 amount=-1 +kerning first=207 second=214 amount=-1 +kerning first=81 second=194 amount=-2 +kerning first=211 second=298 amount=-1 +kerning first=77 second=250 amount=-1 +kerning first=8220 second=65 amount=-4 +kerning first=1069 second=1043 amount=-1 +kerning first=1038 second=1082 amount=-2 +kerning first=362 second=284 amount=-1 +kerning first=289 second=230 amount=-1 +kerning first=108 second=369 amount=-1 +kerning first=250 second=259 amount=-1 +kerning first=259 second=375 amount=-1 +kerning first=1058 second=1088 amount=-1 +kerning first=72 second=369 amount=-1 +kerning first=214 second=259 amount=-1 +kerning first=223 second=375 amount=-1 +kerning first=272 second=77 amount=-1 +kerning first=76 second=220 amount=-1 +kerning first=187 second=375 amount=-2 +kerning first=286 second=259 amount=-1 +kerning first=377 second=116 amount=-1 +kerning first=66 second=214 amount=-1 +kerning first=200 second=77 amount=-1 +kerning first=205 second=338 amount=-1 +kerning first=80 second=313 amount=-1 +kerning first=367 second=375 amount=-1 +kerning first=203 second=304 amount=-1 +kerning first=269 second=116 amount=-1 +kerning first=331 second=375 amount=-1 +kerning first=67 second=71 amount=-2 +kerning first=233 second=116 amount=-1 +kerning first=295 second=375 amount=-1 +kerning first=1025 second=1049 amount=-1 +kerning first=366 second=194 amount=-2 +kerning first=332 second=220 amount=-1 +kerning first=1036 second=1108 amount=-1 +kerning first=327 second=233 amount=-1 +kerning first=332 second=330 amount=-1 +kerning first=291 second=233 amount=-1 +kerning first=356 second=291 amount=-2 +kerning first=88 second=214 amount=-1 +kerning first=260 second=220 amount=-2 +kerning first=88 second=71 amount=-1 +kerning first=203 second=298 amount=-1 +kerning first=284 second=291 amount=-1 +kerning first=74 second=337 amount=-1 +kerning first=248 second=291 amount=-1 +kerning first=78 second=350 amount=-1 +kerning first=315 second=194 amount=-1 +kerning first=212 second=291 amount=-1 +kerning first=70 second=248 amount=-1 +kerning first=228 second=171 amount=-1 +kerning first=87 second=97 amount=-2 +kerning first=107 second=291 amount=-1 +kerning first=219 second=350 amount=-1 +kerning first=377 second=213 amount=-1 +kerning first=84 second=304 amount=-1 +kerning first=198 second=334 amount=-1 +kerning first=71 second=291 amount=-1 +kerning first=274 second=324 amount=-1 +kerning first=336 second=97 amount=-1 +kerning first=277 second=110 amount=-1 +kerning first=260 second=84 amount=-3 +kerning first=382 second=324 amount=-1 +kerning first=313 second=110 amount=-1 +kerning first=234 second=311 amount=-1 +kerning first=264 second=97 amount=-1 +kerning first=198 second=311 amount=-1 +kerning first=269 second=380 amount=-1 +kerning first=193 second=71 amount=-1 +kerning first=323 second=337 amount=-1 +kerning first=225 second=318 amount=-1 +kerning first=266 second=68 amount=-1 +kerning first=1027 second=1101 amount=-1 +kerning first=327 second=350 amount=-1 +kerning first=83 second=330 amount=-1 +kerning first=202 second=324 amount=-1 +kerning first=225 second=44 amount=-1 +kerning first=255 second=104 amount=-1 +kerning first=346 second=98 amount=-1 +kerning first=1113 second=1081 amount=-1 +kerning first=260 second=234 amount=-1 +kerning first=346 second=78 amount=-1 +kerning first=121 second=378 amount=-1 +kerning first=296 second=234 amount=-1 +kerning first=280 second=381 amount=-1 +kerning first=261 second=44 amount=-1 +kerning first=83 second=70 amount=-1 +kerning first=187 second=260 amount=-2 +kerning first=274 second=78 amount=-1 +kerning first=8218 second=363 amount=-1 +kerning first=234 second=187 amount=-1 +kerning first=352 second=381 amount=-1 +kerning first=356 second=277 amount=-2 +kerning first=197 second=213 amount=-1 +kerning first=363 second=104 amount=-1 +kerning first=202 second=78 amount=-1 +kerning first=202 second=310 amount=-1 +kerning first=120 second=44 amount=-1 +kerning first=119 second=234 amount=-1 +kerning first=83 second=344 amount=-1 +kerning first=84 second=44 amount=-3 +kerning first=198 second=325 amount=-1 +kerning first=291 second=104 amount=-1 +kerning first=192 second=111 amount=-1 +kerning first=110 second=351 amount=-1 +kerning first=269 second=227 amount=-1 +kerning first=346 second=310 amount=-1 +kerning first=74 second=351 amount=-1 +kerning first=233 second=227 amount=-1 +kerning first=264 second=111 amount=-1 +kerning first=193 second=85 amount=-2 +kerning first=66 second=194 amount=-3 +kerning first=198 second=81 amount=-1 +kerning first=274 second=310 amount=-1 +kerning first=214 second=377 amount=-1 +kerning first=369 second=44 amount=-1 +kerning first=266 second=257 amount=-1 +kerning first=88 second=85 amount=-1 +kerning first=333 second=44 amount=-2 +kerning first=337 second=303 amount=-1 +kerning first=198 second=201 amount=-1 +kerning first=211 second=70 amount=-1 +kerning first=377 second=227 amount=-1 +kerning first=87 second=111 amount=-2 +kerning first=83 second=220 amount=-1 +kerning first=107 second=277 amount=-1 +kerning first=352 second=367 amount=-1 +kerning first=119 second=248 amount=-1 +kerning first=80 second=8249 amount=-1 +kerning first=220 second=235 amount=-1 +kerning first=78 second=118 amount=-1 +kerning first=275 second=380 amount=-1 +kerning first=286 second=377 amount=-1 +kerning first=256 second=235 amount=-1 +kerning first=219 second=118 amount=-1 +kerning first=74 second=105 amount=-1 +kerning first=251 second=8220 amount=-2 +kerning first=44 second=8249 amount=-1 +kerning first=347 second=380 amount=-1 +kerning first=206 second=253 amount=-1 +kerning first=303 second=231 amount=-1 +kerning first=1027 second=1087 amount=-1 +kerning first=364 second=235 amount=-1 +kerning first=310 second=338 amount=-1 +kerning first=351 second=367 amount=-1 +kerning first=110 second=8220 amount=-2 +kerning first=378 second=283 amount=-1 +kerning first=236 second=287 amount=-1 +kerning first=290 second=361 amount=-1 +kerning first=200 second=287 amount=-1 +kerning first=377 second=241 amount=-1 +kerning first=203 second=380 amount=-1 +kerning first=203 second=270 amount=-1 +kerning first=204 second=287 amount=-1 +kerning first=83 second=112 amount=-1 +kerning first=272 second=287 amount=-1 +kerning first=233 second=108 amount=-1 +kerning first=220 second=193 amount=-2 +kerning first=335 second=120 amount=-1 +kerning first=380 second=287 amount=-1 +kerning first=317 second=249 amount=-1 +kerning first=269 second=241 amount=-1 +kerning first=79 second=193 amount=-2 +kerning first=344 second=287 amount=-1 +kerning first=365 second=8249 amount=-1 +kerning first=233 second=241 amount=-1 +kerning first=296 second=248 amount=-1 +kerning first=257 second=8249 amount=-1 +kerning first=364 second=193 amount=-2 +kerning first=260 second=248 amount=-1 +kerning first=221 second=8249 amount=-3 +kerning first=377 second=255 amount=-2 +kerning first=346 second=352 amount=-1 +kerning first=333 second=318 amount=-1 +kerning first=368 second=112 amount=-1 +kerning first=369 second=318 amount=-1 +kerning first=1027 second=1073 amount=-1 +kerning first=305 second=255 amount=-1 +kerning first=115 second=251 amount=-1 +kerning first=296 second=112 amount=-1 +kerning first=1063 second=1073 amount=-1 +kerning first=256 second=221 amount=-3 +kerning first=269 second=255 amount=-1 +kerning first=87 second=353 amount=-2 +kerning first=260 second=112 amount=-1 +kerning first=1051 second=1104 amount=-1 +kerning first=233 second=255 amount=-1 +kerning first=197 second=255 amount=-1 +kerning first=260 second=262 amount=-1 +kerning first=85 second=74 amount=-1 +kerning first=296 second=262 amount=-1 +kerning first=378 second=311 amount=-1 +kerning first=119 second=112 amount=-1 +kerning first=79 second=221 amount=-1 +kerning first=202 second=338 amount=-1 +kerning first=224 second=98 amount=-1 +kerning first=99 second=314 amount=-1 +kerning first=8218 second=377 amount=-1 +kerning first=79 second=207 amount=-1 +kerning first=240 second=314 amount=-1 +kerning first=262 second=74 amount=-1 +kerning first=260 second=98 amount=-1 +kerning first=193 second=214 amount=-1 +kerning first=79 second=379 amount=-1 +kerning first=334 second=74 amount=-1 +kerning first=202 second=352 amount=-1 +kerning first=370 second=74 amount=-1 +kerning first=203 second=366 amount=-1 +kerning first=310 second=352 amount=-1 +kerning first=119 second=98 amount=-1 +kerning first=251 second=105 amount=-1 +kerning first=274 second=352 amount=-1 +kerning first=83 second=98 amount=-1 +kerning first=287 second=105 amount=-1 +kerning first=368 second=81 amount=-1 +kerning first=250 second=307 amount=-1 +kerning first=103 second=224 amount=-1 +kerning first=210 second=282 amount=-1 +kerning first=365 second=8221 amount=-2 +kerning first=67 second=224 amount=-1 +kerning first=257 second=8221 amount=-1 +kerning first=72 second=242 amount=-1 +kerning first=98 second=106 amount=-1 +kerning first=208 second=224 amount=-1 +kerning first=199 second=81 amount=-2 +kerning first=69 second=282 amount=-1 +kerning first=347 second=106 amount=-1 +kerning first=280 second=224 amount=-1 +kerning first=233 second=98 amount=-1 +kerning first=235 second=355 amount=-1 +kerning first=217 second=346 amount=-1 +kerning first=108 second=333 amount=-1 +kerning first=86 second=67 amount=-1 +kerning first=379 second=81 amount=-1 +kerning first=275 second=106 amount=-1 +kerning first=72 second=333 amount=-1 +kerning first=222 second=230 amount=-1 +kerning first=289 second=232 amount=-1 +kerning first=81 second=230 amount=-1 +kerning first=199 second=243 amount=-1 +kerning first=89 second=101 amount=-2 +kerning first=117 second=230 amount=-1 +kerning first=325 second=346 amount=-1 +kerning first=8250 second=326 amount=-1 +kerning first=194 second=101 amount=-1 +kerning first=45 second=230 amount=-1 +kerning first=203 second=256 amount=-1 +kerning first=266 second=101 amount=-1 +kerning first=302 second=101 amount=-1 +kerning first=1050 second=1060 amount=-2 +kerning first=77 second=334 amount=-1 +kerning first=98 second=120 amount=-1 +kerning first=282 second=268 amount=-1 +kerning first=255 second=233 amount=-1 +kerning first=218 second=334 amount=-1 +kerning first=1057 second=1072 amount=-1 +kerning first=280 second=79 amount=-1 +kerning first=203 second=120 amount=-1 +kerning first=72 second=335 amount=-1 +kerning first=354 second=268 amount=-1 +kerning first=90 second=204 amount=-1 +kerning first=286 second=192 amount=-1 +kerning first=379 second=243 amount=-1 +kerning first=1038 second=1098 amount=-1 +kerning first=257 second=251 amount=-1 +kerning first=235 second=229 amount=-1 +kerning first=8216 second=354 amount=-1 +kerning first=214 second=192 amount=-2 +kerning first=221 second=251 amount=-1 +kerning first=290 second=217 amount=-1 +kerning first=69 second=268 amount=-1 +kerning first=290 second=203 amount=-1 +kerning first=199 second=229 amount=-1 +kerning first=8250 second=76 amount=-3 +kerning first=379 second=229 amount=-1 +kerning first=291 second=118 amount=-1 +kerning first=365 second=251 amount=-1 +kerning first=354 second=282 amount=-1 +kerning first=255 second=118 amount=-1 +kerning first=275 second=120 amount=-1 +kerning first=195 second=218 amount=-2 +kerning first=307 second=229 amount=-1 +kerning first=363 second=118 amount=-1 +kerning first=1038 second=1084 amount=-2 +kerning first=282 second=282 amount=-1 +kerning first=327 second=118 amount=-1 +kerning first=347 second=120 amount=-1 +kerning first=303 second=232 amount=-1 +kerning first=366 second=244 amount=-1 +kerning first=45 second=202 amount=-3 +kerning first=307 second=257 amount=-1 +kerning first=203 second=368 amount=-1 +kerning first=290 second=219 amount=-1 +kerning first=81 second=202 amount=-1 +kerning first=375 second=232 amount=-1 +kerning first=381 second=70 amount=-1 +kerning first=8217 second=110 amount=-1 +kerning first=108 second=361 amount=-1 +kerning first=222 second=202 amount=-1 +kerning first=72 second=361 amount=-1 +kerning first=90 second=232 amount=-1 +kerning first=199 second=257 amount=-1 +kerning first=231 second=232 amount=-1 +kerning first=209 second=336 amount=-1 +kerning first=195 second=232 amount=-1 +kerning first=111 second=8250 amount=-1 +kerning first=84 second=278 amount=-1 +kerning first=73 second=267 amount=-1 +kerning first=197 second=332 amount=-1 +kerning first=8218 second=103 amount=-1 +kerning first=67 second=79 amount=-2 +kerning first=317 second=336 amount=-1 +kerning first=244 second=121 amount=-1 +kerning first=282 second=254 amount=-1 +kerning first=76 second=374 amount=-1 +kerning first=332 second=344 amount=-1 +kerning first=272 second=69 amount=-1 +kerning first=1042 second=1036 amount=-1 +kerning first=258 second=244 amount=-1 +kerning first=103 second=121 amount=-1 +kerning first=69 second=254 amount=-1 +kerning first=379 second=257 amount=-1 +kerning first=200 second=69 amount=-1 +kerning first=8250 second=226 amount=-1 +kerning first=371 second=273 amount=-1 +kerning first=330 second=244 amount=-1 +kerning first=105 second=254 amount=-1 +kerning first=195 second=246 amount=-1 +kerning first=72 second=347 amount=-1 +kerning first=67 second=107 amount=-1 +kerning first=232 second=382 amount=-1 +kerning first=268 second=382 amount=-1 +kerning first=90 second=246 amount=-1 +kerning first=1061 second=1057 amount=-2 +kerning first=304 second=382 amount=-1 +kerning first=1025 second=1057 amount=-1 +kerning first=250 second=117 amount=-1 +kerning first=103 second=107 amount=-1 +kerning first=290 second=205 amount=-1 +kerning first=330 second=230 amount=-1 +kerning first=368 second=334 amount=-1 +kerning first=256 second=281 amount=-1 +kerning first=234 second=363 amount=-1 +kerning first=8220 second=339 amount=-1 +kerning first=8250 second=78 amount=-3 +kerning first=352 second=121 amount=-1 +kerning first=1046 second=1047 amount=-1 +kerning first=249 second=361 amount=-1 +kerning first=330 second=216 amount=-1 +kerning first=352 second=107 amount=-1 +kerning first=8250 second=198 amount=-2 +kerning first=321 second=347 amount=-1 +kerning first=73 second=281 amount=-1 +kerning first=8217 second=375 amount=-1 +kerning first=321 second=361 amount=-1 +kerning first=200 second=336 amount=-1 +kerning first=249 second=347 amount=-1 +kerning first=244 second=107 amount=-1 +kerning first=376 second=382 amount=-2 +kerning first=228 second=371 amount=-1 +kerning first=109 second=117 amount=-1 +kerning first=8220 second=353 amount=-1 +kerning first=354 second=240 amount=-2 +kerning first=8218 second=89 amount=-3 +kerning first=1049 second=1095 amount=-1 +kerning first=108 second=347 amount=-1 +kerning first=280 second=107 amount=-1 +kerning first=220 second=305 amount=-1 +kerning first=84 second=46 amount=-3 +kerning first=202 second=226 amount=-1 +kerning first=120 second=46 amount=-1 +kerning first=264 second=245 amount=-1 +kerning first=202 second=336 amount=-1 +kerning first=1104 second=1083 amount=-1 +kerning first=274 second=226 amount=-1 +kerning first=281 second=8250 amount=-1 +kerning first=83 second=72 amount=-1 +kerning first=346 second=76 amount=-1 +kerning first=310 second=226 amount=-1 +kerning first=274 second=336 amount=-1 +kerning first=364 second=305 amount=-1 +kerning first=346 second=226 amount=-1 +kerning first=274 second=76 amount=-1 +kerning first=310 second=336 amount=-1 +kerning first=363 second=102 amount=-1 +kerning first=211 second=219 amount=-1 +kerning first=382 second=226 amount=-1 +kerning first=245 second=8250 amount=-1 +kerning first=364 second=45 amount=-3 +kerning first=79 second=224 amount=-1 +kerning first=379 second=259 amount=-1 +kerning first=269 second=333 amount=-1 +kerning first=381 second=252 amount=-1 +kerning first=8216 second=197 amount=-4 +kerning first=1027 second=1103 amount=-2 +kerning first=287 second=347 amount=-1 +kerning first=267 second=257 amount=-1 +kerning first=192 second=245 amount=-1 +kerning first=74 second=79 amount=-1 +kerning first=201 second=252 amount=-1 +kerning first=314 second=335 amount=-1 +kerning first=235 second=259 amount=-1 +kerning first=346 second=304 amount=-1 +kerning first=87 second=245 amount=-2 +kerning first=255 second=269 amount=-1 +kerning first=79 second=45 amount=-1 +kerning first=228 second=369 amount=-1 +kerning first=350 second=103 amount=-1 +kerning first=121 second=116 amount=-1 +kerning first=374 second=375 amount=-1 +kerning first=296 second=246 amount=-1 +kerning first=98 second=382 amount=-1 +kerning first=192 second=369 amount=-1 +kerning first=314 second=103 amount=-1 +kerning first=8220 second=351 amount=-1 +kerning first=260 second=246 amount=-1 +kerning first=199 second=259 amount=-1 +kerning first=302 second=375 amount=-1 +kerning first=203 second=382 amount=-1 +kerning first=264 second=369 amount=-1 +kerning first=242 second=103 amount=-1 +kerning first=90 second=266 amount=-1 +kerning first=260 second=332 amount=-1 +kerning first=206 second=103 amount=-1 +kerning first=220 second=45 amount=-3 +kerning first=119 second=246 amount=-1 +kerning first=379 second=109 amount=-1 +kerning first=197 second=253 amount=-1 +kerning first=328 second=45 amount=-1 +kerning first=101 second=103 amount=-1 +kerning first=233 second=253 amount=-1 +kerning first=296 second=332 amount=-1 +kerning first=87 second=369 amount=-1 +kerning first=65 second=103 amount=-1 +kerning first=89 second=375 amount=-1 +kerning first=67 second=266 amount=-2 +kerning first=368 second=332 amount=-1 +kerning first=1027 second=1075 amount=-1 +kerning first=235 second=109 amount=-1 +kerning first=304 second=122 amount=-1 +kerning first=268 second=122 amount=-1 +kerning first=307 second=109 amount=-1 +kerning first=232 second=122 amount=-1 +kerning first=230 second=375 amount=-1 +kerning first=275 second=382 amount=-1 +kerning first=194 second=375 amount=-1 +kerning first=199 second=109 amount=-1 +kerning first=8220 second=224 amount=-1 +kerning first=347 second=382 amount=-1 +kerning first=376 second=122 amount=-2 +kerning first=354 second=242 amount=-1 +kerning first=266 second=115 amount=-1 +kerning first=197 second=370 amount=-2 +kerning first=302 second=115 amount=-1 +kerning first=346 second=198 amount=-2 +kerning first=211 second=80 amount=-1 +kerning first=220 second=345 amount=-1 +kerning first=194 second=115 amount=-1 +kerning first=115 second=223 amount=-1 +kerning first=230 second=115 amount=-1 +kerning first=73 second=119 amount=-1 +kerning first=375 second=289 amount=-2 +kerning first=109 second=119 amount=-1 +kerning first=334 second=8217 amount=-1 +kerning first=202 second=198 amount=-1 +kerning first=377 second=68 amount=-1 +kerning first=338 second=115 amount=-1 +kerning first=374 second=115 amount=-2 +kerning first=274 second=198 amount=-1 +kerning first=250 second=119 amount=-1 +kerning first=269 second=253 amount=-1 +kerning first=286 second=119 amount=-1 +kerning first=305 second=253 amount=-1 +kerning first=198 second=313 amount=-1 +kerning first=275 second=108 amount=-1 +kerning first=76 second=303 amount=-1 +kerning first=377 second=253 amount=-2 +kerning first=347 second=108 amount=-1 +kerning first=1070 second=1059 amount=-1 +kerning first=350 second=75 amount=-1 +kerning first=1040 second=1105 amount=-1 +kerning first=79 second=73 amount=-1 +kerning first=368 second=246 amount=-1 +kerning first=278 second=75 amount=-1 +kerning first=205 second=269 amount=-1 +kerning first=8250 second=310 amount=-3 +kerning first=379 second=231 amount=-1 +kerning first=233 second=225 amount=-1 +kerning first=206 second=335 amount=-1 +kerning first=269 second=225 amount=-1 +kerning first=288 second=196 amount=-1 +kerning first=187 second=105 amount=-1 +kerning first=65 second=363 amount=-1 +kerning first=98 second=108 amount=-1 +kerning first=101 second=363 amount=-1 +kerning first=374 second=286 amount=-1 +kerning first=203 second=108 amount=-1 +kerning first=65 second=335 amount=-1 +kerning first=302 second=286 amount=-1 +kerning first=261 second=249 amount=-1 +kerning first=338 second=286 amount=-1 +kerning first=44 second=8221 amount=-3 +kerning first=278 second=363 amount=-1 +kerning first=201 second=280 amount=-1 +kerning first=84 second=203 amount=-1 +kerning first=226 second=8217 amount=-1 +kerning first=219 second=102 amount=-1 +kerning first=314 second=363 amount=-1 +kerning first=266 second=286 amount=-2 +kerning first=83 second=218 amount=-1 +kerning first=350 second=363 amount=-1 +kerning first=89 second=115 amount=-2 +kerning first=225 second=46 amount=-1 +kerning first=332 second=218 amount=-1 +kerning first=261 second=46 amount=-1 +kerning first=377 second=225 amount=-1 +kerning first=89 second=286 amount=-1 +kerning first=1059 second=1076 amount=-3 +kerning first=260 second=218 amount=-2 +kerning first=199 second=231 amount=-1 +kerning first=212 second=261 amount=-1 +kerning first=110 second=367 amount=-1 +kerning first=209 second=210 amount=-1 +kerning first=284 second=261 amount=-1 +kerning first=352 second=8220 amount=-1 +kerning first=68 second=296 amount=-1 +kerning first=316 second=8220 amount=-2 +kerning first=1052 second=1092 amount=-1 +kerning first=193 second=366 amount=-2 +kerning first=71 second=261 amount=-1 +kerning first=86 second=327 amount=-1 +kerning first=107 second=261 amount=-1 +kerning first=244 second=8220 amount=-1 +kerning first=204 second=211 amount=-1 +kerning first=90 second=352 amount=-1 +kerning first=208 second=8220 amount=-1 +kerning first=251 second=250 amount=-1 +kerning first=198 second=171 amount=-1 +kerning first=253 second=112 amount=-1 +kerning first=71 second=378 amount=-1 +kerning first=217 second=112 amount=-1 +kerning first=317 second=296 amount=-1 +kerning first=212 second=378 amount=-1 +kerning first=1042 second=1025 amount=-1 +kerning first=323 second=250 amount=-1 +kerning first=270 second=171 amount=-1 +kerning first=90 second=206 amount=-1 +kerning first=72 second=235 amount=-1 +kerning first=287 second=250 amount=-1 +kerning first=112 second=112 amount=-1 +kerning first=108 second=235 amount=-1 +kerning first=356 second=261 amount=-2 +kerning first=76 second=112 amount=-1 +kerning first=99 second=326 amount=-1 +kerning first=99 second=328 amount=-1 +kerning first=110 second=250 amount=-1 +kerning first=75 second=288 amount=-1 +kerning first=108 second=237 amount=-1 +kerning first=193 second=113 amount=-1 +kerning first=217 second=262 amount=-1 +kerning first=323 second=365 amount=-1 +kerning first=210 second=366 amount=-1 +kerning first=374 second=113 amount=-2 +kerning first=287 second=365 amount=-1 +kerning first=1057 second=1081 amount=-1 +kerning first=251 second=365 amount=-1 +kerning first=284 second=378 amount=-1 +kerning first=244 second=353 amount=-1 +kerning first=325 second=262 amount=-1 +kerning first=232 second=98 amount=-1 +kerning first=248 second=378 amount=-1 +kerning first=280 second=353 amount=-1 +kerning first=378 second=171 amount=-2 +kerning first=356 second=378 amount=-2 +kerning first=316 second=353 amount=-1 +kerning first=1043 second=1094 amount=-1 +kerning first=325 second=112 amount=-1 +kerning first=199 second=83 amount=-1 +kerning first=352 second=353 amount=-1 +kerning first=296 second=100 amount=-1 +kerning first=282 second=366 amount=-1 +kerning first=321 second=87 amount=-1 +kerning first=67 second=353 amount=-1 +kerning first=327 second=249 amount=-1 +kerning first=213 second=87 amount=-1 +kerning first=327 second=275 amount=-1 +kerning first=103 second=353 amount=-1 +kerning first=364 second=223 amount=-1 +kerning first=195 second=352 amount=-2 +kerning first=89 second=113 amount=-2 +kerning first=219 second=275 amount=-1 +kerning first=1045 second=1078 amount=-1 +kerning first=255 second=275 amount=-1 +kerning first=119 second=100 amount=-1 +kerning first=291 second=249 amount=-1 +kerning first=379 second=83 amount=-1 +kerning first=302 second=113 amount=-1 +kerning first=69 second=366 amount=-1 +kerning first=220 second=223 amount=-1 +kerning first=266 second=113 amount=-1 +kerning first=76 second=262 amount=-1 +kerning first=85 second=233 amount=-1 +kerning first=78 second=275 amount=-1 +kerning first=317 second=210 amount=-1 +kerning first=194 second=113 amount=-1 +kerning first=333 second=307 amount=-1 +kerning first=268 second=304 amount=-1 +kerning first=90 second=324 amount=-1 +kerning first=321 second=89 amount=-1 +kerning first=121 second=233 amount=-1 +kerning first=352 second=379 amount=-1 +kerning first=76 second=84 amount=-1 +kerning first=71 second=289 amount=-1 +kerning first=287 second=339 amount=-1 +kerning first=262 second=233 amount=-1 +kerning first=107 second=289 amount=-1 +kerning first=323 second=339 amount=-1 +kerning first=217 second=114 amount=-1 +kerning first=212 second=289 amount=-1 +kerning first=219 second=249 amount=-1 +kerning first=187 second=274 amount=-3 +kerning first=1100 second=1082 amount=-1 +kerning first=78 second=249 amount=-1 +kerning first=370 second=233 amount=-1 +kerning first=213 second=89 amount=-1 +kerning first=67 second=379 amount=-1 +kerning first=74 second=339 amount=-1 +kerning first=375 second=324 amount=-1 +kerning first=321 second=237 amount=-1 +kerning first=267 second=324 amount=-1 +kerning first=262 second=350 amount=-1 +kerning first=231 second=324 amount=-1 +kerning first=208 second=379 amount=-1 +kerning first=249 second=237 amount=-1 +kerning first=277 second=187 amount=-1 +kerning first=339 second=324 amount=-1 +kerning first=303 second=324 amount=-1 +kerning first=280 second=379 amount=-1 +kerning first=356 second=110 amount=-1 +kerning first=370 second=350 amount=-1 +kerning first=321 second=209 amount=-1 +kerning first=346 second=8217 amount=-1 +kerning first=80 second=111 amount=-1 +kerning first=89 second=260 amount=-3 +kerning first=1093 second=1108 amount=-1 +kerning first=334 second=350 amount=-1 +kerning first=376 second=119 amount=-1 +kerning first=213 second=209 amount=-1 +kerning first=255 second=277 amount=-1 +kerning first=217 second=234 amount=-1 +kerning first=219 second=277 amount=-1 +kerning first=76 second=86 amount=-1 +kerning first=327 second=277 amount=-1 +kerning first=75 second=316 amount=-1 +kerning first=289 second=234 amount=-1 +kerning first=266 second=260 amount=-2 +kerning first=291 second=277 amount=-1 +kerning first=187 second=302 amount=-3 +kerning first=325 second=234 amount=-1 +kerning first=78 second=277 amount=-1 +kerning first=280 second=351 amount=-1 +kerning first=280 second=264 amount=-1 +kerning first=202 second=76 amount=-1 +kerning first=338 second=260 amount=-1 +kerning first=1037 second=1054 amount=-1 +kerning first=356 second=289 amount=-2 +kerning first=244 second=351 amount=-1 +kerning first=1056 second=1089 amount=-1 +kerning first=352 second=351 amount=-1 +kerning first=332 second=72 amount=-1 +kerning first=1037 second=1072 amount=-1 +kerning first=316 second=351 amount=-1 +kerning first=187 second=103 amount=-1 +kerning first=374 second=260 amount=-3 +kerning first=103 second=351 amount=-1 +kerning first=287 second=367 amount=-1 +kerning first=67 second=351 amount=-1 +kerning first=67 second=264 amount=-2 +kerning first=221 second=111 amount=-2 +kerning first=323 second=367 amount=-1 +kerning first=198 second=199 amount=-1 +kerning first=321 second=74 amount=-1 +kerning first=272 second=291 amount=-1 +kerning first=251 second=367 amount=-1 +kerning first=209 second=212 amount=-1 +kerning first=262 second=364 amount=-1 +kerning first=286 second=8249 amount=-1 +kerning first=65 second=361 amount=-1 +kerning first=258 second=351 amount=-1 +kerning first=206 second=361 amount=-1 +kerning first=366 second=351 amount=-1 +kerning first=381 second=367 amount=-1 +kerning first=221 second=377 amount=-1 +kerning first=354 second=114 amount=-1 +kerning first=73 second=8249 amount=-2 +kerning first=278 second=361 amount=-1 +kerning first=117 second=351 amount=-1 +kerning first=109 second=8249 amount=-1 +kerning first=336 second=257 amount=-1 +kerning first=201 second=367 amount=-1 +kerning first=334 second=364 amount=-1 +kerning first=253 second=254 amount=-1 +kerning first=66 second=287 amount=-2 +kerning first=314 second=361 amount=-1 +kerning first=289 second=254 amount=-1 +kerning first=264 second=257 amount=-1 +kerning first=262 second=261 amount=-1 +kerning first=365 second=117 amount=-1 +kerning first=298 second=261 amount=-1 +kerning first=102 second=287 amount=-1 +kerning first=334 second=261 amount=-1 +kerning first=287 second=244 amount=-1 +kerning first=381 second=121 amount=-2 +kerning first=76 second=254 amount=-1 +kerning first=282 second=374 amount=-1 +kerning first=113 second=44 amount=-1 +kerning first=243 second=287 amount=-1 +kerning first=370 second=261 amount=-2 +kerning first=77 second=44 amount=-1 +kerning first=207 second=287 amount=-1 +kerning first=85 second=261 amount=-2 +kerning first=8217 second=269 amount=-2 +kerning first=210 second=374 amount=-1 +kerning first=374 second=274 amount=-1 +kerning first=315 second=287 amount=-1 +kerning first=121 second=261 amount=-2 +kerning first=201 second=381 amount=-1 +kerning first=338 second=274 amount=-1 +kerning first=279 second=287 amount=-1 +kerning first=350 second=237 amount=-1 +kerning first=338 second=210 amount=-1 +kerning first=314 second=237 amount=-1 +kerning first=8216 second=219 amount=-1 +kerning first=266 second=274 amount=-1 +kerning first=381 second=250 amount=-1 +kerning first=212 second=171 amount=-1 +kerning first=1058 second=1104 amount=-1 +kerning first=242 second=347 amount=-1 +kerning first=70 second=197 amount=-2 +kerning first=201 second=250 amount=-1 +kerning first=206 second=347 amount=-1 +kerning first=221 second=281 amount=-2 +kerning first=201 second=107 amount=-1 +kerning first=366 second=337 amount=-1 +kerning first=379 second=97 amount=-1 +kerning first=284 second=171 amount=-1 +kerning first=330 second=337 amount=-1 +kerning first=1059 second=1078 amount=-2 +kerning first=101 second=347 amount=-1 +kerning first=211 second=197 amount=-2 +kerning first=221 second=117 amount=-1 +kerning first=65 second=347 amount=-1 +kerning first=71 second=171 amount=-1 +kerning first=282 second=220 amount=-1 +kerning first=107 second=171 amount=-2 +kerning first=80 second=281 amount=-1 +kerning first=350 second=207 amount=-1 +kerning first=257 second=117 amount=-1 +kerning first=89 second=288 amount=-1 +kerning first=197 second=354 amount=-3 +kerning first=381 second=264 amount=-1 +kerning first=235 second=371 amount=-1 +kerning first=194 second=288 amount=-1 +kerning first=212 second=327 amount=-1 +kerning first=354 second=100 amount=-2 +kerning first=8218 second=229 amount=-1 +kerning first=81 second=379 amount=-1 +kerning first=307 second=371 amount=-1 +kerning first=87 second=257 amount=-2 +kerning first=356 second=171 amount=-3 +kerning first=290 second=304 amount=-1 +kerning first=298 second=378 amount=-1 +kerning first=289 second=240 amount=-1 +kerning first=106 second=314 amount=-1 +kerning first=350 second=347 amount=-1 +kerning first=377 second=354 amount=-1 +kerning first=325 second=240 amount=-1 +kerning first=201 second=264 amount=-1 +kerning first=314 second=347 amount=-1 +kerning first=374 second=243 amount=-2 +kerning first=217 second=240 amount=-1 +kerning first=1030 second=1054 amount=-1 +kerning first=114 second=289 amount=-1 +kerning first=278 second=347 amount=-1 +kerning first=253 second=240 amount=-1 +kerning first=200 second=317 amount=-1 +kerning first=195 second=220 amount=-2 +kerning first=222 second=77 amount=-1 +kerning first=283 second=314 amount=-1 +kerning first=258 second=214 amount=-1 +kerning first=272 second=317 amount=-1 +kerning first=268 second=298 amount=-1 +kerning first=258 second=71 amount=-1 +kerning first=262 second=90 amount=-1 +kerning first=86 second=201 amount=-1 +kerning first=86 second=207 amount=-1 +kerning first=370 second=90 amount=-1 +kerning first=334 second=90 amount=-1 +kerning first=74 second=224 amount=-1 +kerning first=376 second=298 amount=-1 +kerning first=313 second=291 amount=-1 +kerning first=277 second=291 amount=-1 +kerning first=195 second=84 amount=-3 +kerning first=113 second=318 amount=-1 +kerning first=287 second=224 amount=-1 +kerning first=241 second=291 amount=-1 +kerning first=199 second=97 amount=-1 +kerning first=204 second=213 amount=-1 +kerning first=205 second=291 amount=-1 +kerning first=259 second=287 amount=-1 +kerning first=90 second=84 amount=-1 +kerning first=245 second=103 amount=-1 +kerning first=200 second=200 amount=-1 +kerning first=371 second=311 amount=-1 +kerning first=254 second=318 amount=-1 +kerning first=323 second=224 amount=-1 +kerning first=100 second=291 amount=-1 +kerning first=307 second=97 amount=-1 +kerning first=81 second=77 amount=-1 +kerning first=366 second=71 amount=-1 +kerning first=335 second=311 amount=-1 +kerning first=258 second=337 amount=-1 +kerning first=45 second=77 amount=-3 +kerning first=330 second=71 amount=-1 +kerning first=326 second=318 amount=-1 +kerning first=235 second=97 amount=-1 +kerning first=263 second=311 amount=-1 +kerning first=85 second=90 amount=-1 +kerning first=81 second=85 amount=-1 +kerning first=304 second=284 amount=-1 +kerning first=335 second=187 amount=-1 +kerning first=362 second=44 amount=-3 +kerning first=45 second=85 amount=-2 +kerning first=90 second=344 amount=-1 +kerning first=326 second=44 amount=-1 +kerning first=381 second=381 amount=-1 +kerning first=86 second=325 amount=-1 +kerning first=236 second=303 amount=-1 +kerning first=268 second=284 amount=-2 +kerning first=1060 second=1025 amount=-1 +kerning first=195 second=234 amount=-1 +kerning first=262 second=104 amount=-1 +kerning first=218 second=44 amount=-3 +kerning first=196 second=284 amount=-1 +kerning first=68 second=310 amount=-1 +kerning first=381 second=101 amount=-1 +kerning first=281 second=324 amount=-1 +kerning first=290 second=44 amount=-1 +kerning first=380 second=303 amount=-1 +kerning first=90 second=70 amount=-1 +kerning first=121 second=104 amount=-1 +kerning first=310 second=81 amount=-1 +kerning first=232 second=104 amount=-1 +kerning first=254 second=44 amount=-2 +kerning first=272 second=194 amount=-2 +kerning first=87 second=251 amount=-1 +kerning first=375 second=234 amount=-1 +kerning first=99 second=227 amount=-1 +kerning first=200 second=194 amount=-1 +kerning first=192 second=251 amount=-1 +kerning first=45 second=351 amount=-1 +kerning first=86 second=187 amount=-1 +kerning first=199 second=111 amount=-1 +kerning first=258 second=85 amount=-2 +kerning first=264 second=251 amount=-1 +kerning first=205 second=277 amount=-1 +kerning first=231 second=234 amount=-1 +kerning first=222 second=85 amount=-1 +kerning first=228 second=251 amount=-1 +kerning first=267 second=234 amount=-1 +kerning first=376 second=284 amount=-1 +kerning first=204 second=227 amount=-1 +kerning first=317 second=310 amount=-1 +kerning first=1047 second=1093 amount=-1 +kerning first=316 second=105 amount=-1 +kerning first=8218 second=87 amount=-3 +kerning first=284 second=118 amount=-1 +kerning first=334 second=370 amount=-1 +kerning first=65 second=245 amount=-1 +kerning first=89 second=114 amount=-1 +kerning first=335 second=303 amount=-1 +kerning first=248 second=118 amount=-1 +kerning first=69 second=368 amount=-1 +kerning first=244 second=105 amount=-1 +kerning first=356 second=118 amount=-1 +kerning first=366 second=345 amount=-1 +kerning first=210 second=270 amount=-1 +kerning first=1090 second=1083 amount=-1 +kerning first=89 second=280 amount=-1 +kerning first=107 second=118 amount=-1 +kerning first=210 second=368 amount=-1 +kerning first=364 second=335 amount=-1 +kerning first=71 second=118 amount=-1 +kerning first=206 second=245 amount=-1 +kerning first=67 second=105 amount=-1 +kerning first=69 second=270 amount=-1 +kerning first=205 second=283 amount=-1 +kerning first=103 second=105 amount=-1 +kerning first=88 second=351 amount=-1 +kerning first=366 second=228 amount=-1 +kerning first=354 second=368 amount=-1 +kerning first=330 second=228 amount=-1 +kerning first=220 second=335 amount=-1 +kerning first=262 second=241 amount=-1 +kerning first=105 second=108 amount=-1 +kerning first=256 second=335 amount=-1 +kerning first=370 second=241 amount=-1 +kerning first=246 second=108 amount=-1 +kerning first=282 second=368 amount=-1 +kerning first=1054 second=1083 amount=-1 +kerning first=222 second=228 amount=-1 +kerning first=121 second=241 amount=-1 +kerning first=282 second=270 amount=-1 +kerning first=85 second=241 amount=-1 +kerning first=282 second=108 amount=-1 +kerning first=86 second=193 amount=-3 +kerning first=262 second=370 amount=-1 +kerning first=81 second=228 amount=-1 +kerning first=354 second=270 amount=-1 +kerning first=354 second=122 amount=-2 +kerning first=366 second=331 amount=-1 +kerning first=268 second=278 amount=-1 +kerning first=282 second=256 amount=-1 +kerning first=334 second=356 amount=-1 +kerning first=282 second=122 amount=-1 +kerning first=210 second=256 amount=-2 +kerning first=246 second=122 amount=-1 +kerning first=206 second=231 amount=-1 +kerning first=262 second=356 amount=-1 +kerning first=289 second=104 amount=-1 +kerning first=197 second=362 amount=-2 +kerning first=376 second=278 amount=-1 +kerning first=298 second=255 amount=-1 +kerning first=8218 second=237 amount=-1 +kerning first=314 second=231 amount=-1 +kerning first=354 second=256 amount=-3 +kerning first=8222 second=98 amount=-1 +kerning first=226 second=255 amount=-1 +kerning first=45 second=331 amount=-1 +kerning first=338 second=266 amount=-1 +kerning first=256 second=334 amount=-1 +kerning first=223 second=8250 amount=-1 +kerning first=374 second=266 amount=-1 +kerning first=362 second=111 amount=-1 +kerning first=338 second=280 amount=-1 +kerning first=314 second=245 amount=-1 +kerning first=45 second=345 amount=-1 +kerning first=85 second=255 amount=-1 +kerning first=374 second=280 amount=-1 +kerning first=302 second=266 amount=-1 +kerning first=330 second=214 amount=-1 +kerning first=210 second=122 amount=-1 +kerning first=65 second=231 amount=-1 +kerning first=194 second=266 amount=-1 +kerning first=45 second=65 amount=-2 +kerning first=105 second=122 amount=-1 +kerning first=81 second=65 amount=-2 +kerning first=89 second=266 amount=-1 +kerning first=366 second=214 amount=-1 +kerning first=8250 second=196 amount=-2 +kerning first=86 second=305 amount=-1 +kerning first=377 second=80 amount=-1 +kerning first=222 second=65 amount=-2 +kerning first=364 second=67 amount=-1 +kerning first=314 second=229 amount=-1 +kerning first=350 second=229 amount=-1 +kerning first=211 second=217 amount=-1 +kerning first=210 second=106 amount=-1 +kerning first=263 second=305 amount=-1 +kerning first=203 second=282 amount=-1 +kerning first=246 second=106 amount=-1 +kerning first=256 second=67 amount=-1 +kerning first=83 second=346 amount=-1 +kerning first=366 second=65 amount=-2 +kerning first=211 second=68 amount=-1 +kerning first=105 second=106 amount=-1 +kerning first=220 second=67 amount=-1 +kerning first=206 second=81 amount=-1 +kerning first=8222 second=380 amount=-2 +kerning first=8216 second=328 amount=-1 +kerning first=323 second=230 amount=-1 +kerning first=296 second=346 amount=-1 +kerning first=364 second=333 amount=-1 +kerning first=235 second=353 amount=-1 +kerning first=302 second=346 amount=-1 +kerning first=371 second=305 amount=-1 +kerning first=251 second=230 amount=-1 +kerning first=303 second=109 amount=-1 +kerning first=287 second=230 amount=-1 +kerning first=260 second=289 amount=-1 +kerning first=65 second=243 amount=-1 +kerning first=381 second=82 amount=-1 +kerning first=202 second=204 amount=-1 +kerning first=243 second=307 amount=-1 +kerning first=220 second=333 amount=-1 +kerning first=8217 second=289 amount=-2 +kerning first=279 second=307 amount=-1 +kerning first=69 second=256 amount=-1 +kerning first=74 second=230 amount=-1 +kerning first=274 second=204 amount=-1 +kerning first=368 second=346 amount=-1 +kerning first=311 second=275 amount=-1 +kerning first=209 second=259 amount=-1 +kerning first=351 second=307 amount=-1 +kerning first=256 second=333 amount=-1 +kerning first=8216 second=225 amount=-1 +kerning first=202 second=218 amount=-1 +kerning first=314 second=243 amount=-1 +kerning first=346 second=104 amount=-1 +kerning first=90 second=332 amount=-1 +kerning first=74 second=244 amount=-1 +kerning first=1057 second=1060 amount=-1 +kerning first=195 second=332 amount=-1 +kerning first=310 second=218 amount=-1 +kerning first=206 second=243 amount=-1 +kerning first=313 second=334 amount=-1 +kerning first=8217 second=275 amount=-2 +kerning first=323 second=79 amount=-1 +kerning first=274 second=218 amount=-1 +kerning first=246 second=120 amount=-1 +kerning first=315 second=192 amount=-1 +kerning first=198 second=374 amount=-1 +kerning first=282 second=120 amount=-1 +kerning first=101 second=229 amount=-1 +kerning first=327 second=333 amount=-1 +kerning first=354 second=120 amount=-1 +kerning first=203 second=268 amount=-1 +kerning first=69 second=120 amount=-1 +kerning first=105 second=120 amount=-1 +kerning first=278 second=229 amount=-1 +kerning first=70 second=334 amount=-1 +kerning first=8222 second=366 amount=-2 +kerning first=66 second=192 amount=-3 +kerning first=210 second=120 amount=-1 +kerning first=206 second=229 amount=-1 +kerning first=117 second=257 amount=-1 +kerning first=253 second=242 amount=-1 +kerning first=249 second=229 amount=-1 +kerning first=205 second=289 amount=-1 +kerning first=258 second=339 amount=-1 +kerning first=368 second=232 amount=-1 +kerning first=217 second=242 amount=-1 +kerning first=241 second=289 amount=-1 +kerning first=325 second=242 amount=-1 +kerning first=87 second=109 amount=-1 +kerning first=277 second=289 amount=-1 +kerning first=289 second=242 amount=-1 +kerning first=213 second=229 amount=-1 +kerning first=316 second=99 amount=-1 +kerning first=313 second=289 amount=-1 +kerning first=366 second=339 amount=-1 +kerning first=260 second=232 amount=-1 +kerning first=221 second=279 amount=-2 +kerning first=76 second=106 amount=-1 +kerning first=278 second=89 amount=-1 +kerning first=268 second=282 amount=-1 +kerning first=330 second=339 amount=-1 +kerning first=116 second=119 amount=-1 +kerning first=296 second=232 amount=-1 +kerning first=201 second=379 amount=-1 +kerning first=253 second=106 amount=-1 +kerning first=221 second=119 amount=-1 +kerning first=90 second=346 amount=-1 +kerning first=112 second=106 amount=-1 +kerning first=257 second=119 amount=-1 +kerning first=1038 second=1072 amount=-2 +kerning first=119 second=232 amount=-1 +kerning first=8220 second=218 amount=-1 +kerning first=365 second=119 amount=-1 +kerning first=8222 second=254 amount=-1 +kerning first=67 second=99 amount=-1 +kerning first=377 second=82 amount=-1 +kerning first=1058 second=1116 amount=-1 +kerning first=203 second=344 amount=-1 +kerning first=100 second=289 amount=-1 +kerning first=381 second=379 amount=-1 +kerning first=368 second=275 amount=-1 +kerning first=195 second=346 amount=-2 +kerning first=376 second=115 amount=-2 +kerning first=107 second=267 amount=-1 +kerning first=274 second=212 amount=-1 +kerning first=79 second=209 amount=-1 +kerning first=107 second=269 amount=-1 +kerning first=104 second=316 amount=-1 +kerning first=1043 second=1072 amount=-1 +kerning first=258 second=79 amount=-1 +kerning first=222 second=69 amount=-1 +kerning first=245 second=316 amount=-1 +kerning first=90 second=72 amount=-1 +kerning first=81 second=69 amount=-1 +kerning first=366 second=79 amount=-1 +kerning first=86 second=199 amount=-1 +kerning first=193 second=216 amount=-1 +kerning first=356 second=269 amount=-2 +kerning first=1063 second=1089 amount=-1 +kerning first=1088 second=1076 amount=-1 +kerning first=363 second=8217 amount=-2 +kerning first=1027 second=1089 amount=-1 +kerning first=330 second=79 amount=-1 +kerning first=72 second=229 amount=-1 +kerning first=272 second=192 amount=-2 +kerning first=108 second=229 amount=-1 +kerning first=90 second=76 amount=-1 +kerning first=65 second=89 amount=-3 +kerning first=310 second=212 amount=-1 +kerning first=211 second=205 amount=-1 +kerning first=88 second=216 amount=-1 +kerning first=200 second=192 amount=-1 +kerning first=192 second=8221 amount=-3 +kerning first=267 second=226 amount=-1 +kerning first=8222 second=368 amount=-2 +kerning first=228 second=8221 amount=-1 +kerning first=199 second=245 amount=-1 +kerning first=303 second=226 amount=-1 +kerning first=254 second=46 amount=-2 +kerning first=8250 second=324 amount=-1 +kerning first=339 second=226 amount=-1 +kerning first=82 second=286 amount=-1 +kerning first=375 second=226 amount=-2 +kerning first=336 second=8221 amount=-1 +kerning first=379 second=245 amount=-1 +kerning first=77 second=46 amount=-1 +kerning first=1061 second=1083 amount=-1 +kerning first=113 second=46 amount=-1 +kerning first=216 second=296 amount=-1 +kerning first=281 second=316 amount=-1 +kerning first=317 second=316 amount=-1 +kerning first=263 second=45 amount=-1 +kerning first=288 second=296 amount=-1 +kerning first=353 second=316 amount=-1 +kerning first=371 second=45 amount=-1 +kerning first=280 second=252 amount=-1 +kerning first=272 second=202 amount=-1 +kerning first=84 second=290 amount=-1 +kerning first=108 second=335 amount=-1 +kerning first=90 second=226 amount=-1 +kerning first=200 second=202 amount=-1 +kerning first=67 second=252 amount=-1 +kerning first=231 second=226 amount=-1 +kerning first=202 second=206 amount=-1 +kerning first=264 second=259 amount=-1 +kerning first=291 second=116 amount=-1 +kerning first=85 second=253 amount=-1 +kerning first=255 second=116 amount=-1 +kerning first=197 second=356 amount=-3 +kerning first=336 second=259 amount=-1 +kerning first=379 second=103 amount=-2 +kerning first=325 second=246 amount=-1 +kerning first=226 second=253 amount=-1 +kerning first=1043 second=1082 amount=-1 +kerning first=289 second=246 amount=-1 +kerning first=87 second=259 amount=-2 +kerning first=316 second=252 amount=-1 +kerning first=307 second=103 amount=-1 +kerning first=334 second=362 amount=-1 +kerning first=253 second=246 amount=-1 +kerning first=298 second=253 amount=-1 +kerning first=352 second=252 amount=-1 +kerning first=217 second=246 amount=-1 +kerning first=381 second=375 amount=-2 +kerning first=65 second=83 amount=-2 +kerning first=235 second=103 amount=-1 +kerning first=352 second=316 amount=-1 +kerning first=212 second=323 amount=-1 +kerning first=203 second=122 amount=-1 +kerning first=246 second=382 amount=-1 +kerning first=379 second=369 amount=-1 +kerning first=282 second=382 amount=-1 +kerning first=206 second=83 amount=-1 +kerning first=98 second=122 amount=-1 +kerning first=201 second=266 amount=-1 +kerning first=262 second=362 amount=-1 +kerning first=354 second=382 amount=-2 +kerning first=80 second=279 amount=-1 +kerning first=278 second=83 amount=-1 +kerning first=347 second=122 amount=-1 +kerning first=69 second=382 amount=-1 +kerning first=235 second=369 amount=-1 +kerning first=377 second=356 amount=-1 +kerning first=105 second=382 amount=-1 +kerning first=199 second=369 amount=-1 +kerning first=90 second=336 amount=-1 +kerning first=350 second=83 amount=-1 +kerning first=275 second=122 amount=-1 +kerning first=307 second=369 amount=-1 +kerning first=264 second=109 amount=-1 +kerning first=210 second=382 amount=-1 +kerning first=195 second=336 amount=-1 +kerning first=253 second=248 amount=-1 +kerning first=69 second=380 amount=-1 +kerning first=289 second=248 amount=-1 +kerning first=105 second=380 amount=-1 +kerning first=317 second=198 amount=-1 +kerning first=217 second=248 amount=-1 +kerning first=210 second=380 amount=-1 +kerning first=197 second=233 amount=-1 +kerning first=68 second=198 amount=-2 +kerning first=202 second=330 amount=-1 +kerning first=269 second=233 amount=-1 +kerning first=201 second=115 amount=-1 +kerning first=101 second=355 amount=-1 +kerning first=65 second=355 amount=-1 +kerning first=219 second=263 amount=-1 +kerning first=321 second=73 amount=-1 +kerning first=350 second=355 amount=-1 +kerning first=255 second=263 amount=-1 +kerning first=103 second=365 amount=-1 +kerning first=314 second=355 amount=-1 +kerning first=291 second=263 amount=-1 +kerning first=67 second=365 amount=-1 +kerning first=84 second=298 amount=-1 +kerning first=200 second=315 amount=-1 +kerning first=327 second=263 amount=-1 +kerning first=381 second=115 amount=-1 +kerning first=1045 second=1090 amount=-1 +kerning first=78 second=263 amount=-1 +kerning first=213 second=73 amount=-1 +kerning first=213 second=75 amount=-1 +kerning first=219 second=110 amount=-1 +kerning first=325 second=248 amount=-1 +kerning first=255 second=110 amount=-1 +kerning first=86 second=313 amount=-1 +kerning first=291 second=110 amount=-1 +kerning first=376 second=290 amount=-1 +kerning first=1091 second=1108 amount=-1 +kerning first=99 second=225 amount=-1 +kerning first=66 second=303 amount=-1 +kerning first=197 second=350 amount=-2 +kerning first=106 second=328 amount=-1 +kerning first=76 second=98 amount=-1 +kerning first=321 second=75 amount=-1 +kerning first=199 second=363 amount=-1 +kerning first=235 second=363 amount=-1 +kerning first=272 second=315 amount=-1 +kerning first=268 second=290 amount=-2 +kerning first=321 second=221 amount=-1 +kerning first=351 second=303 amount=-1 +kerning first=307 second=363 amount=-1 +kerning first=78 second=214 amount=-1 +kerning first=317 second=196 amount=-1 +kerning first=243 second=303 amount=-1 +kerning first=283 second=328 amount=-1 +kerning first=1042 second=1031 amount=-1 +kerning first=279 second=303 amount=-1 +kerning first=377 second=350 amount=-1 +kerning first=68 second=196 amount=-2 +kerning first=201 second=260 amount=-1 +kerning first=85 second=102 amount=-1 +kerning first=196 second=290 amount=-1 +kerning first=326 second=46 amount=-1 +kerning first=204 second=225 amount=-1 +kerning first=246 second=380 amount=-1 +kerning first=310 second=267 amount=-1 +kerning first=362 second=46 amount=-3 +kerning first=282 second=380 amount=-1 +kerning first=289 second=98 amount=-1 +kerning first=316 second=237 amount=-1 +kerning first=79 second=325 amount=-1 +kerning first=90 second=338 amount=-1 +kerning first=253 second=98 amount=-1 +kerning first=354 second=380 amount=-2 +kerning first=381 second=260 amount=-1 +kerning first=69 second=112 amount=-1 +kerning first=87 second=377 amount=-1 +kerning first=8222 second=374 amount=-3 +kerning first=280 second=367 amount=-1 +kerning first=65 second=87 amount=-3 +kerning first=78 second=261 amount=-1 +kerning first=316 second=367 amount=-1 +kerning first=196 second=318 amount=-1 +kerning first=79 second=327 amount=-1 +kerning first=8217 second=283 amount=-2 +kerning first=332 second=86 amount=-1 +kerning first=83 second=352 amount=-1 +kerning first=310 second=210 amount=-1 +kerning first=264 second=377 amount=-1 +kerning first=287 second=351 amount=-1 +kerning first=274 second=210 amount=-1 +kerning first=283 second=326 amount=-1 +kerning first=251 second=351 amount=-1 +kerning first=70 second=211 amount=-1 +kerning first=296 second=352 amount=-1 +kerning first=202 second=210 amount=-1 +kerning first=260 second=352 amount=-2 +kerning first=67 second=367 amount=-1 +kerning first=288 second=302 amount=-1 +kerning first=363 second=261 amount=-1 +kerning first=354 second=112 amount=-1 +kerning first=352 second=250 amount=-1 +kerning first=206 second=235 amount=-1 +kerning first=106 second=326 amount=-1 +kerning first=216 second=302 amount=-1 +kerning first=336 second=377 amount=-1 +kerning first=73 second=287 amount=-1 +kerning first=100 second=171 amount=-1 +kerning first=282 second=112 amount=-1 +kerning first=246 second=112 amount=-1 +kerning first=8216 second=217 amount=-1 +kerning first=314 second=235 amount=-1 +kerning first=219 second=261 amount=-2 +kerning first=260 second=86 amount=-3 +kerning first=109 second=287 amount=-1 +kerning first=255 second=261 amount=-2 +kerning first=316 second=250 amount=-1 +kerning first=1092 second=1103 amount=-1 +kerning first=250 second=287 amount=-1 +kerning first=291 second=261 amount=-1 +kerning first=105 second=112 amount=-1 +kerning first=280 second=250 amount=-1 +kerning first=1056 second=1103 amount=-1 +kerning first=214 second=287 amount=-1 +kerning first=118 second=257 amount=-2 +kerning first=67 second=250 amount=-1 +kerning first=291 second=378 amount=-1 +kerning first=76 second=366 amount=-1 +kerning first=282 second=262 amount=-1 +kerning first=8220 second=244 amount=-1 +kerning first=255 second=378 amount=-1 +kerning first=242 second=237 amount=-1 +kerning first=286 second=287 amount=-1 +kerning first=107 second=275 amount=-1 +kerning first=287 second=353 amount=-1 +kerning first=363 second=378 amount=-1 +kerning first=354 second=262 amount=-1 +kerning first=323 second=353 amount=-1 +kerning first=103 second=250 amount=-1 +kerning first=327 second=378 amount=-1 +kerning first=352 second=365 amount=-1 +kerning first=325 second=100 amount=-1 +kerning first=352 second=369 amount=-1 +kerning first=316 second=365 amount=-1 +kerning first=101 second=237 amount=-1 +kerning first=74 second=353 amount=-1 +kerning first=1116 second=1095 amount=-1 +kerning first=78 second=378 amount=-1 +kerning first=280 second=365 amount=-1 +kerning first=83 second=45 amount=-1 +kerning first=199 second=277 amount=-1 +kerning first=110 second=353 amount=-1 +kerning first=241 second=171 amount=-1 +kerning first=219 second=378 amount=-1 +kerning first=381 second=113 amount=-1 +kerning first=8222 second=108 amount=-1 +kerning first=313 second=171 amount=-1 +kerning first=350 second=87 amount=-1 +kerning first=368 second=352 amount=-1 +kerning first=217 second=100 amount=-1 +kerning first=198 second=85 amount=-1 +kerning first=226 second=249 amount=-1 +kerning first=332 second=352 amount=-1 +kerning first=315 second=338 amount=-1 +kerning first=290 second=197 amount=-1 +kerning first=253 second=100 amount=-1 +kerning first=278 second=87 amount=-1 +kerning first=85 second=249 amount=-1 +kerning first=289 second=100 amount=-1 +kerning first=69 second=262 amount=-1 +kerning first=356 second=275 amount=-2 +kerning first=362 second=197 amount=-2 +kerning first=82 second=288 amount=-1 +kerning first=370 second=249 amount=-1 +kerning first=321 second=223 amount=-1 +kerning first=262 second=249 amount=-1 +kerning first=1088 second=1078 amount=-1 +kerning first=298 second=249 amount=-1 +kerning first=282 second=288 amount=-1 +kerning first=199 second=87 amount=-1 +kerning first=1100 second=1096 amount=-1 +kerning first=107 second=243 amount=-1 +kerning first=113 second=314 amount=-1 +kerning first=354 second=288 amount=-1 +kerning first=369 second=106 amount=-1 +kerning first=254 second=314 amount=-1 +kerning first=8216 second=114 amount=-1 +kerning first=1030 second=1092 amount=-1 +kerning first=231 second=363 amount=-1 +kerning first=326 second=314 amount=-1 +kerning first=69 second=288 amount=-1 +kerning first=207 second=113 amount=-1 +kerning first=366 second=210 amount=-1 +kerning first=379 second=333 amount=-1 +kerning first=84 second=366 amount=-1 +kerning first=256 second=269 amount=-1 +kerning first=330 second=210 amount=-1 +kerning first=1074 second=1118 amount=-1 +kerning first=102 second=113 amount=-1 +kerning first=220 second=269 amount=-1 +kerning first=258 second=210 amount=-1 +kerning first=263 second=307 amount=-1 +kerning first=364 second=255 amount=-1 +kerning first=8220 second=375 amount=-1 +kerning first=84 second=120 amount=-1 +kerning first=196 second=83 amount=-2 +kerning first=328 second=255 amount=-1 +kerning first=231 second=224 amount=-1 +kerning first=82 second=268 amount=-1 +kerning first=335 second=307 amount=-1 +kerning first=364 second=269 amount=-1 +kerning first=192 second=281 amount=-1 +kerning first=202 second=262 amount=-1 +kerning first=371 second=307 amount=-1 +kerning first=256 second=255 amount=-1 +kerning first=303 second=224 amount=-1 +kerning first=220 second=255 amount=-1 +kerning first=267 second=224 amount=-1 +kerning first=264 second=281 amount=-1 +kerning first=274 second=262 amount=-1 +kerning first=375 second=224 amount=-1 +kerning first=356 second=243 amount=-2 +kerning first=310 second=262 amount=-1 +kerning first=115 second=255 amount=-1 +kerning first=339 second=224 amount=-1 +kerning first=187 second=198 amount=-2 +kerning first=207 second=99 amount=-1 +kerning first=67 second=101 amount=-1 +kerning first=369 second=120 amount=-1 +kerning first=103 second=101 amount=-1 +kerning first=354 second=274 amount=-1 +kerning first=212 second=229 amount=-1 +kerning first=382 second=248 amount=-1 +kerning first=71 second=229 amount=-1 +kerning first=282 second=274 amount=-1 +kerning first=379 second=73 amount=-1 +kerning first=202 second=362 amount=-1 +kerning first=8216 second=100 amount=-1 +kerning first=310 second=248 amount=-1 +kerning first=225 second=120 amount=-1 +kerning first=272 second=75 amount=-1 +kerning first=305 second=118 amount=-1 +kerning first=261 second=120 amount=-1 +kerning first=356 second=229 amount=-2 +kerning first=316 second=101 amount=-1 +kerning first=199 second=73 amount=-1 +kerning first=377 second=118 amount=-1 +kerning first=333 second=120 amount=-1 +kerning first=284 second=229 amount=-1 +kerning first=346 second=8220 amount=-1 +kerning first=197 second=118 amount=-2 +kerning first=310 second=8220 amount=-1 +kerning first=269 second=118 amount=-1 +kerning first=366 second=196 amount=-2 +kerning first=233 second=118 amount=-1 +kerning first=364 second=241 amount=-1 +kerning first=69 second=196 amount=-1 +kerning first=333 second=106 amount=-1 +kerning first=379 second=87 amount=-1 +kerning first=102 second=99 amount=-1 +kerning first=290 second=68 amount=-1 +kerning first=225 second=106 amount=-1 +kerning first=261 second=106 amount=1 +kerning first=76 second=80 amount=-1 +kerning first=374 second=364 amount=-1 +kerning first=235 second=361 amount=-1 +kerning first=69 second=316 amount=-1 +kerning first=194 second=264 amount=-1 +kerning first=287 second=111 amount=-1 +kerning first=105 second=316 amount=-1 +kerning first=323 second=111 amount=-1 +kerning first=307 second=361 amount=-1 +kerning first=89 second=264 amount=-1 +kerning first=74 second=111 amount=-1 +kerning first=379 second=361 amount=-1 +kerning first=246 second=316 amount=-1 +kerning first=290 second=82 amount=-1 +kerning first=107 second=271 amount=-1 +kerning first=197 second=364 amount=-2 +kerning first=282 second=316 amount=-1 +kerning first=76 second=66 amount=-1 +kerning first=356 second=257 amount=-2 +kerning first=264 second=267 amount=-1 +kerning first=269 second=104 amount=-1 +kerning first=75 second=351 amount=-1 +kerning first=202 second=44 amount=-1 +kerning first=344 second=89 amount=-1 +kerning first=233 second=104 amount=-1 +kerning first=262 second=368 amount=-1 +kerning first=197 second=104 amount=-1 +kerning first=274 second=44 amount=-1 +kerning first=1048 second=1057 amount=-1 +kerning first=8216 second=346 amount=-1 +kerning first=313 second=205 amount=-1 +kerning first=200 second=89 amount=-1 +kerning first=87 second=323 amount=-1 +kerning first=210 second=274 amount=-1 +kerning first=199 second=361 amount=-1 +kerning first=97 second=44 amount=-1 +kerning first=272 second=89 amount=-1 +kerning first=8216 second=86 amount=-1 +kerning first=334 second=368 amount=-1 +kerning first=323 second=97 amount=-1 +kerning first=217 second=326 amount=-1 +kerning first=338 second=250 amount=-1 +kerning first=210 second=302 amount=-1 +kerning first=253 second=326 amount=-1 +kerning first=307 second=347 amount=-1 +kerning first=298 second=284 amount=-1 +kerning first=264 second=323 amount=-1 +kerning first=302 second=250 amount=-1 +kerning first=367 second=226 amount=-1 +kerning first=1050 second=1054 amount=-2 +kerning first=251 second=97 amount=-1 +kerning first=289 second=326 amount=-1 +kerning first=87 second=281 amount=-2 +kerning first=203 second=278 amount=-1 +kerning first=76 second=354 amount=-1 +kerning first=275 second=8250 amount=-1 +kerning first=287 second=97 amount=-1 +kerning first=235 second=347 amount=-1 +kerning first=283 second=375 amount=-1 +kerning first=336 second=323 amount=-1 +kerning first=374 second=250 amount=-1 +kerning first=69 second=302 amount=-1 +kerning first=103 second=97 amount=-1 +kerning first=199 second=347 amount=-1 +kerning first=194 second=250 amount=-1 +kerning first=76 second=326 amount=-1 +kerning first=251 second=371 amount=-1 +kerning first=8216 second=374 amount=-1 +kerning first=205 second=233 amount=-1 +kerning first=266 second=250 amount=-1 +kerning first=287 second=371 amount=-1 +kerning first=1102 second=1078 amount=-1 +kerning first=230 second=250 amount=-1 +kerning first=82 second=212 amount=-1 +kerning first=272 second=103 amount=-1 +kerning first=377 second=90 amount=-1 +kerning first=284 second=257 amount=-1 +kerning first=236 second=103 amount=-1 +kerning first=269 second=378 amount=-1 +kerning first=199 second=45 amount=-2 +kerning first=200 second=103 amount=-1 +kerning first=313 second=219 amount=-1 +kerning first=89 second=250 amount=-1 +kerning first=377 second=378 amount=-1 +kerning first=82 second=226 amount=-1 +kerning first=212 second=257 amount=-1 +kerning first=199 second=333 amount=-1 +kerning first=118 second=226 amount=-2 +kerning first=374 second=264 amount=-1 +kerning first=354 second=302 amount=-1 +kerning first=187 second=226 amount=-1 +kerning first=107 second=257 amount=-1 +kerning first=338 second=264 amount=-1 +kerning first=113 second=110 amount=-1 +kerning first=302 second=264 amount=-1 +kerning first=233 second=378 amount=-1 +kerning first=282 second=302 amount=-1 +kerning first=379 second=347 amount=-1 +kerning first=266 second=264 amount=-2 +kerning first=211 second=66 amount=-1 +kerning first=71 second=257 amount=-1 +kerning first=218 second=110 amount=-1 +kerning first=1069 second=1063 amount=-1 +kerning first=200 second=363 amount=-1 +kerning first=118 second=240 amount=-1 +kerning first=89 second=194 amount=-3 +kerning first=236 second=363 amount=-1 +kerning first=323 second=214 amount=-1 +kerning first=362 second=110 amount=-1 +kerning first=8216 second=351 amount=-1 +kerning first=202 second=220 amount=-1 +kerning first=206 second=275 amount=-1 +kerning first=74 second=214 amount=-1 +kerning first=8216 second=242 amount=-1 +kerning first=344 second=363 amount=-1 +kerning first=202 second=318 amount=-1 +kerning first=325 second=284 amount=-1 +kerning first=380 second=363 amount=-1 +kerning first=66 second=71 amount=-1 +kerning first=346 second=220 amount=-1 +kerning first=108 second=259 amount=-1 +kerning first=310 second=318 amount=-1 +kerning first=232 second=116 amount=-1 +kerning first=336 second=77 amount=-1 +kerning first=282 second=330 amount=-1 +kerning first=286 second=369 amount=-1 +kerning first=249 second=259 amount=-1 +kerning first=346 second=318 amount=-1 +kerning first=100 second=8221 amount=-1 +kerning first=274 second=220 amount=-1 +kerning first=84 second=324 amount=-1 +kerning first=250 second=369 amount=-1 +kerning first=213 second=259 amount=-1 +kerning first=382 second=318 amount=-1 +kerning first=264 second=77 amount=-1 +kerning first=352 second=375 amount=-1 +kerning first=310 second=220 amount=-1 +kerning first=210 second=330 amount=-1 +kerning first=338 second=194 amount=-1 +kerning first=82 second=240 amount=-1 +kerning first=374 second=194 amount=-3 +kerning first=274 second=304 amount=-1 +kerning first=74 second=97 amount=-1 +kerning first=109 second=369 amount=-1 +kerning first=72 second=259 amount=-1 +kerning first=196 second=116 amount=-1 +kerning first=266 second=194 amount=-2 +kerning first=73 second=369 amount=-1 +kerning first=202 second=304 amount=-1 +kerning first=354 second=330 amount=-1 +kerning first=122 second=279 amount=-1 +kerning first=118 second=254 amount=-1 +kerning first=86 second=279 amount=-2 +kerning first=291 second=253 amount=-1 +kerning first=103 second=375 amount=-1 +kerning first=187 second=254 amount=-1 +kerning first=327 second=253 amount=-1 +kerning first=1047 second=1055 amount=-1 +kerning first=363 second=253 amount=-1 +kerning first=74 second=228 amount=-1 +kerning first=259 second=254 amount=-1 +kerning first=200 second=377 amount=-1 +kerning first=194 second=81 amount=-1 +kerning first=316 second=375 amount=-1 +kerning first=69 second=330 amount=-1 +kerning first=354 second=344 amount=-1 +kerning first=244 second=375 amount=-1 +kerning first=108 second=273 amount=-1 +kerning first=364 second=117 amount=-1 +kerning first=82 second=254 amount=-1 +kerning first=217 second=284 amount=-1 +kerning first=316 second=253 amount=-1 +kerning first=76 second=298 amount=-1 +kerning first=310 second=234 amount=-1 +kerning first=210 second=344 amount=-1 +kerning first=84 second=310 amount=-1 +kerning first=315 second=251 amount=-1 +kerning first=70 second=332 amount=-1 +kerning first=1058 second=1108 amount=-1 +kerning first=272 second=377 amount=-1 +kerning first=1113 second=1103 amount=-1 +kerning first=382 second=234 amount=-1 +kerning first=282 second=344 amount=-1 +kerning first=325 second=210 amount=-1 +kerning first=371 second=378 amount=-1 +kerning first=108 second=287 amount=-1 +kerning first=78 second=253 amount=-1 +kerning first=263 second=279 amount=-1 +kerning first=76 second=284 amount=-1 +kerning first=72 second=287 amount=-1 +kerning first=69 second=344 amount=-1 +kerning first=213 second=287 amount=-1 +kerning first=198 second=8249 amount=-1 +kerning first=1098 second=1119 amount=-1 +kerning first=219 second=253 amount=-1 +kerning first=344 second=335 amount=-1 +kerning first=202 second=290 amount=-1 +kerning first=221 second=313 amount=-1 +kerning first=380 second=335 amount=-1 +kerning first=249 second=287 amount=-1 +kerning first=213 second=8217 amount=-1 +kerning first=76 second=270 amount=-1 +kerning first=278 second=315 amount=-1 +kerning first=249 second=8217 amount=-2 +kerning first=274 second=290 amount=-1 +kerning first=321 second=287 amount=-1 +kerning first=119 second=242 amount=-1 +kerning first=260 second=242 amount=-1 +kerning first=333 second=380 amount=-1 +kerning first=196 second=101 amount=-1 +kerning first=369 second=380 amount=-1 +kerning first=347 second=367 amount=-1 +kerning first=85 second=197 amount=-2 +kerning first=108 second=8217 amount=-2 +kerning first=296 second=242 amount=-1 +kerning first=367 second=103 amount=-1 +kerning first=1037 second=1060 amount=-1 +kerning first=1113 second=1117 amount=-1 +kerning first=76 second=353 amount=-1 +kerning first=368 second=242 amount=-1 +kerning first=219 second=225 amount=-2 +kerning first=262 second=197 amount=-2 +kerning first=87 second=105 amount=-1 +kerning first=350 second=315 amount=-1 +kerning first=201 second=119 amount=-1 +kerning first=1069 second=1049 amount=-1 +kerning first=321 second=8217 amount=-2 +kerning first=334 second=197 amount=-2 +kerning first=323 second=228 amount=-1 +kerning first=121 second=108 amount=-1 +kerning first=287 second=228 amount=-1 +kerning first=262 second=108 amount=-1 +kerning first=84 second=380 amount=-2 +kerning first=78 second=225 amount=-1 +kerning first=8220 second=101 amount=-1 +kerning first=1047 second=1083 amount=-1 +kerning first=226 second=108 amount=-1 +kerning first=120 second=380 amount=-1 +kerning first=45 second=221 amount=-2 +kerning first=72 second=231 amount=-1 +kerning first=347 second=46 amount=-1 +kerning first=203 second=74 amount=-1 +kerning first=381 second=119 amount=-1 +kerning first=76 second=256 amount=-1 +kerning first=84 second=352 amount=-2 +kerning first=121 second=122 amount=-1 +kerning first=85 second=122 amount=-1 +kerning first=232 second=102 amount=-1 +kerning first=69 second=289 amount=-1 +kerning first=291 second=225 amount=-1 +kerning first=370 second=122 amount=-1 +kerning first=203 second=46 amount=-1 +kerning first=327 second=225 amount=-1 +kerning first=334 second=122 amount=-1 +kerning first=207 second=71 amount=-1 +kerning first=376 second=116 amount=-1 +kerning first=334 second=313 amount=-1 +kerning first=363 second=225 amount=-1 +kerning first=298 second=122 amount=-1 +kerning first=307 second=117 amount=-1 +kerning first=315 second=71 amount=-1 +kerning first=122 second=307 amount=-1 +kerning first=217 second=256 amount=-2 +kerning first=262 second=122 amount=-1 +kerning first=311 second=46 amount=-1 +kerning first=87 second=77 amount=-1 +kerning first=98 second=46 amount=-2 +kerning first=219 second=211 amount=-1 +kerning first=83 second=379 amount=-1 +kerning first=209 second=44 amount=-1 +kerning first=253 second=101 amount=-1 +kerning first=108 second=245 amount=-1 +kerning first=310 second=290 amount=-1 +kerning first=268 second=102 amount=-1 +kerning first=219 second=347 amount=-1 +kerning first=1045 second=1098 amount=-1 +kerning first=327 second=211 amount=-1 +kerning first=376 second=102 amount=-1 +kerning first=106 second=171 amount=-1 +kerning first=203 second=112 amount=-1 +kerning first=1052 second=1086 amount=-1 +kerning first=211 second=171 amount=-1 +kerning first=98 second=112 amount=-1 +kerning first=370 second=211 amount=-1 +kerning first=337 second=107 amount=-1 +kerning first=204 second=382 amount=-1 +kerning first=209 second=216 amount=-1 +kerning first=88 second=107 amount=-1 +kerning first=235 second=8221 amount=-1 +kerning first=8220 second=115 amount=-1 +kerning first=70 second=171 amount=-2 +kerning first=193 second=107 amount=-1 +kerning first=365 second=105 amount=-1 +kerning first=377 second=257 amount=-1 +kerning first=298 second=235 amount=-1 +kerning first=67 second=70 amount=-1 +kerning first=1036 second=1072 amount=-1 +kerning first=1044 second=1098 amount=-1 +kerning first=370 second=235 amount=-1 +kerning first=307 second=8221 amount=-1 +kerning first=221 second=105 amount=-1 +kerning first=347 second=112 amount=-1 +kerning first=221 second=81 amount=-1 +kerning first=311 second=112 amount=-1 +kerning first=355 second=171 amount=-1 +kerning first=275 second=112 amount=-1 +kerning first=268 second=296 amount=-1 +kerning first=73 second=67 amount=-1 +kerning first=214 second=327 amount=-1 +kerning first=350 second=249 amount=-1 +kerning first=376 second=296 amount=-1 +kerning first=234 second=251 amount=-1 +kerning first=70 second=100 amount=-1 +kerning first=75 second=230 amount=-1 +kerning first=198 second=251 amount=-1 +kerning first=8217 second=233 amount=-2 +kerning first=195 second=117 amount=-1 +kerning first=208 second=204 amount=-1 +kerning first=314 second=249 amount=-1 +kerning first=205 second=275 amount=-1 +kerning first=111 second=380 amount=-1 +kerning first=211 second=346 amount=-1 +kerning first=378 second=251 amount=-1 +kerning first=280 second=204 amount=-1 +kerning first=83 second=256 amount=-2 +kerning first=352 second=204 amount=-1 +kerning first=221 second=379 amount=-1 +kerning first=45 second=353 amount=-1 +kerning first=85 second=211 amount=-1 +kerning first=377 second=259 amount=-1 +kerning first=65 second=249 amount=-1 +kerning first=45 second=83 amount=-2 +kerning first=288 second=230 amount=-1 +kerning first=198 second=223 amount=-1 +kerning first=81 second=83 amount=-1 +kerning first=206 second=249 amount=-1 +kerning first=262 second=211 amount=-2 +kerning first=216 second=230 amount=-1 +kerning first=298 second=211 amount=-1 +kerning first=252 second=230 amount=-1 +kerning first=67 second=204 amount=-1 +kerning first=222 second=83 amount=-1 +kerning first=101 second=249 amount=-1 +kerning first=368 second=256 amount=-2 +kerning first=332 second=256 amount=-2 +kerning first=1113 second=1075 amount=-1 +kerning first=221 second=109 amount=-1 +kerning first=368 second=284 amount=-1 +kerning first=330 second=83 amount=-1 +kerning first=88 second=339 amount=-1 +kerning first=8217 second=271 amount=-2 +kerning first=366 second=83 amount=-1 +kerning first=371 second=237 amount=-1 +kerning first=296 second=284 amount=-1 +kerning first=209 second=244 amount=-1 +kerning first=335 second=237 amount=-1 +kerning first=378 second=289 amount=-1 +kerning first=70 second=199 amount=-1 +kerning first=263 second=237 amount=-1 +kerning first=260 second=284 amount=-1 +kerning first=203 second=362 amount=-1 +kerning first=193 second=339 amount=-1 +kerning first=1072 second=1095 amount=-1 +kerning first=122 second=237 amount=-1 +kerning first=196 second=334 amount=-1 +kerning first=86 second=237 amount=-1 +kerning first=346 second=274 amount=-1 +kerning first=288 second=282 amount=-1 +kerning first=381 second=194 amount=-1 +kerning first=313 second=378 amount=-1 +kerning first=316 second=232 amount=-1 +kerning first=268 second=334 amount=-2 +kerning first=84 second=345 amount=-1 +kerning first=216 second=282 amount=-1 +kerning first=67 second=232 amount=-1 +kerning first=201 second=194 amount=-1 +kerning first=304 second=334 amount=-1 +kerning first=272 second=289 amount=-1 +kerning first=198 second=289 amount=-1 +kerning first=71 second=198 amount=-1 +kerning first=70 second=346 amount=-1 +kerning first=314 second=277 amount=-1 +kerning first=103 second=232 amount=-1 +kerning first=376 second=334 amount=-1 +kerning first=352 second=209 amount=-1 +kerning first=252 second=254 amount=-1 +kerning first=257 second=351 amount=-1 +kerning first=330 second=121 amount=-1 +kerning first=221 second=351 amount=-2 +kerning first=286 second=327 amount=-1 +kerning first=324 second=254 amount=-1 +kerning first=206 second=277 amount=-1 +kerning first=258 second=121 amount=-1 +kerning first=1038 second=1090 amount=-1 +kerning first=75 second=254 amount=-1 +kerning first=80 second=351 amount=-1 +kerning first=88 second=79 amount=-1 +kerning first=117 second=121 amount=-1 +kerning first=1098 second=1095 amount=-1 +kerning first=204 second=350 amount=-1 +kerning first=1062 second=1095 amount=-1 +kerning first=350 second=69 amount=-1 +kerning first=45 second=121 amount=-2 +kerning first=198 second=261 amount=-1 +kerning first=193 second=367 amount=-1 +kerning first=234 second=261 amount=-1 +kerning first=229 second=367 amount=-1 +kerning first=278 second=69 amount=-1 +kerning first=88 second=367 amount=-1 +kerning first=314 second=305 amount=-1 +kerning first=196 second=245 amount=-1 +kerning first=236 second=117 amount=-1 +kerning first=193 second=79 amount=-1 +kerning first=8217 second=243 amount=-2 +kerning first=76 second=260 amount=-1 +kerning first=200 second=117 amount=-1 +kerning first=105 second=117 amount=-1 +kerning first=255 second=8249 amount=-2 +kerning first=8216 second=224 amount=-1 +kerning first=217 second=260 amount=-2 +kerning first=332 second=76 amount=-1 +kerning first=350 second=305 amount=-1 +kerning first=365 second=351 amount=-1 +kerning first=305 second=8221 amount=-1 +kerning first=211 second=72 amount=-1 +kerning first=211 second=374 amount=-1 +kerning first=380 second=117 amount=-1 +kerning first=203 second=316 amount=-1 +kerning first=66 second=317 amount=-2 +kerning first=368 second=336 amount=-1 +kerning first=192 second=337 amount=-1 +kerning first=268 second=362 amount=-1 +kerning first=275 second=316 amount=-1 +kerning first=256 second=311 amount=-1 +kerning first=122 second=241 amount=-1 +kerning first=87 second=337 amount=-2 +kerning first=86 second=241 amount=-1 +kerning first=370 second=378 amount=-1 +kerning first=347 second=316 amount=-1 +kerning first=262 second=382 amount=-1 +kerning first=290 second=356 amount=-1 +kerning first=298 second=382 amount=-1 +kerning first=115 second=311 amount=-1 +kerning first=199 second=267 amount=-1 +kerning first=334 second=382 amount=-1 +kerning first=75 second=226 amount=-1 +kerning first=264 second=337 amount=-1 +kerning first=370 second=382 amount=-1 +kerning first=75 second=286 amount=-1 +kerning first=1055 second=1057 amount=-1 +kerning first=1059 second=1082 amount=-2 +kerning first=87 second=361 amount=-1 +kerning first=197 second=221 amount=-3 +kerning first=192 second=361 amount=-1 +kerning first=83 second=252 amount=-1 +kerning first=1025 second=1037 amount=-1 +kerning first=264 second=361 amount=-1 +kerning first=228 second=361 amount=-1 +kerning first=98 second=316 amount=-1 +kerning first=195 second=266 amount=-1 +kerning first=107 second=263 amount=-1 +kerning first=198 second=229 amount=-1 +kerning first=84 second=78 amount=-1 +kerning first=366 second=121 amount=-1 +kerning first=368 second=252 amount=-1 +kerning first=262 second=207 amount=-1 +kerning first=354 second=70 amount=-1 +kerning first=356 second=201 amount=-1 +kerning first=307 second=316 amount=-1 +kerning first=220 second=227 amount=-2 +kerning first=45 second=381 amount=-2 +kerning first=346 second=44 amount=-2 +kerning first=284 second=201 amount=-1 +kerning first=81 second=381 amount=-1 +kerning first=381 second=246 amount=-1 +kerning first=224 second=252 amount=-1 +kerning first=212 second=201 amount=-1 +kerning first=289 second=365 amount=-1 +kerning first=364 second=227 amount=-2 +kerning first=382 second=44 amount=-1 +kerning first=296 second=252 amount=-1 +kerning first=8220 second=111 amount=-1 +kerning first=85 second=382 amount=-1 +kerning first=65 second=45 amount=-2 +kerning first=1057 second=1036 amount=-1 +kerning first=121 second=382 amount=-1 +kerning first=216 second=226 amount=-1 +kerning first=337 second=103 amount=-1 +kerning first=71 second=201 amount=-1 +kerning first=379 second=291 amount=-2 +kerning first=252 second=226 amount=-1 +kerning first=288 second=226 amount=-1 +kerning first=366 second=381 amount=-1 +kerning first=307 second=291 amount=-1 +kerning first=263 second=259 amount=-1 +kerning first=229 second=103 amount=-1 +kerning first=115 second=227 amount=-1 +kerning first=206 second=45 amount=-2 +kerning first=260 second=336 amount=-1 +kerning first=79 second=227 amount=-1 +kerning first=203 second=84 amount=-1 +kerning first=314 second=45 amount=-1 +kerning first=296 second=336 amount=-1 +kerning first=199 second=291 amount=-1 +kerning first=278 second=45 amount=-1 +kerning first=201 second=218 amount=-1 +kerning first=1039 second=1092 amount=-1 +kerning first=1100 second=1094 amount=-1 +kerning first=8250 second=220 amount=-2 +kerning first=1065 second=1090 amount=-1 +kerning first=103 second=115 amount=-1 +kerning first=66 second=345 amount=-1 +kerning first=213 second=192 amount=-2 +kerning first=261 second=314 amount=-1 +kerning first=67 second=115 amount=-1 +kerning first=205 second=243 amount=-1 +kerning first=225 second=314 amount=-1 +kerning first=280 second=115 amount=-1 +kerning first=333 second=314 amount=-1 +kerning first=316 second=115 amount=-1 +kerning first=218 second=120 amount=-1 +kerning first=264 second=365 amount=-1 +kerning first=199 second=8249 amount=-2 +kerning first=122 second=269 amount=-1 +kerning first=377 second=193 amount=-1 +kerning first=254 second=120 amount=-1 +kerning first=228 second=365 amount=-1 +kerning first=263 second=269 amount=-1 +kerning first=244 second=115 amount=-1 +kerning first=199 second=263 amount=-1 +kerning first=192 second=365 amount=-1 +kerning first=350 second=278 amount=-1 +kerning first=196 second=338 amount=-1 +kerning first=69 second=70 amount=-1 +kerning first=369 second=314 amount=-1 +kerning first=216 second=198 amount=-2 +kerning first=258 second=353 amount=-1 +kerning first=282 second=70 amount=-1 +kerning first=86 second=213 amount=-1 +kerning first=350 second=73 amount=-1 +kerning first=87 second=365 amount=-1 +kerning first=352 second=115 amount=-1 +kerning first=352 second=45 amount=-1 +kerning first=330 second=353 amount=-1 +kerning first=210 second=70 amount=-1 +kerning first=113 second=120 amount=-1 +kerning first=202 second=224 amount=-1 +kerning first=366 second=353 amount=-1 +kerning first=371 second=269 amount=-1 +kerning first=321 second=325 amount=-1 +kerning first=310 second=224 amount=-1 +kerning first=274 second=224 amount=-1 +kerning first=105 second=98 amount=-1 +kerning first=382 second=224 amount=-1 +kerning first=379 second=8249 amount=-1 +kerning first=278 second=73 amount=-1 +kerning first=346 second=224 amount=-1 +kerning first=85 second=235 amount=-1 +kerning first=90 second=278 amount=-1 +kerning first=74 second=101 amount=-1 +kerning first=121 second=235 amount=-1 +kerning first=218 second=328 amount=-1 +kerning first=307 second=8249 amount=-1 +kerning first=362 second=120 amount=-1 +kerning first=219 second=331 amount=-1 +kerning first=250 second=303 amount=-1 +kerning first=332 second=280 amount=-1 +kerning first=346 second=367 amount=-1 +kerning first=113 second=328 amount=-1 +kerning first=69 second=98 amount=-1 +kerning first=262 second=235 amount=-1 +kerning first=220 second=283 amount=-1 +kerning first=211 second=370 amount=-1 +kerning first=362 second=328 amount=-1 +kerning first=371 second=241 amount=-1 +kerning first=287 second=101 amount=-1 +kerning first=323 second=101 amount=-1 +kerning first=1046 second=1118 amount=-1 +kerning first=1047 second=1031 amount=-1 +kerning first=99 second=118 amount=-1 +kerning first=195 second=243 amount=-1 +kerning first=1040 second=1073 amount=-1 +kerning first=364 second=283 amount=-1 +kerning first=113 second=109 amount=-1 +kerning first=213 second=325 amount=-1 +kerning first=282 second=98 amount=-1 +kerning first=200 second=378 amount=-1 +kerning first=256 second=283 amount=-1 +kerning first=263 second=241 amount=-1 +kerning first=83 second=280 amount=-1 +kerning first=207 second=335 amount=-1 +kerning first=197 second=108 amount=-1 +kerning first=376 second=380 amount=-2 +kerning first=371 second=283 amount=-1 +kerning first=195 second=8220 amount=-3 +kerning first=321 second=241 amount=-1 +kerning first=344 second=85 amount=-1 +kerning first=374 second=362 amount=-1 +kerning first=263 second=283 amount=-1 +kerning first=1069 second=1045 amount=-1 +kerning first=232 second=380 amount=-1 +kerning first=272 second=85 amount=-1 +kerning first=305 second=108 amount=-1 +kerning first=268 second=380 amount=-1 +kerning first=102 second=335 amount=-1 +kerning first=310 second=286 amount=-1 +kerning first=304 second=380 amount=-1 +kerning first=200 second=85 amount=-1 +kerning first=77 second=338 amount=-1 +kerning first=303 second=248 amount=-1 +kerning first=256 second=231 amount=-1 +kerning first=110 second=115 amount=-1 +kerning first=77 second=351 amount=-1 +kerning first=8250 second=230 amount=-1 +kerning first=231 second=248 amount=-1 +kerning first=108 second=241 amount=-1 +kerning first=315 second=249 amount=-1 +kerning first=267 second=248 amount=-1 +kerning first=202 second=286 amount=-1 +kerning first=220 second=231 amount=-1 +kerning first=74 second=115 amount=-1 +kerning first=380 second=331 amount=-1 +kerning first=287 second=115 amount=-1 +kerning first=1091 second=1113 amount=-1 +kerning first=195 second=248 amount=-1 +kerning first=323 second=115 amount=-1 +kerning first=200 second=331 amount=-1 +kerning first=90 second=248 amount=-1 +kerning first=364 second=231 amount=-1 +kerning first=251 second=115 amount=-1 +kerning first=76 second=70 amount=-1 +kerning first=290 second=78 amount=-1 +kerning first=197 second=368 amount=-2 +kerning first=236 second=331 amount=-1 +kerning first=74 second=210 amount=-1 +kerning first=249 second=255 amount=-1 +kerning first=218 second=352 amount=-1 +kerning first=97 second=252 amount=-1 +kerning first=222 second=200 amount=-1 +kerning first=337 second=351 amount=-1 +kerning first=364 second=245 amount=-1 +kerning first=69 second=278 amount=-1 +kerning first=115 second=307 amount=-1 +kerning first=8216 second=350 amount=-1 +kerning first=260 second=113 amount=-1 +kerning first=376 second=366 amount=-1 +kerning first=202 second=252 amount=-1 +kerning first=199 second=323 amount=-1 +kerning first=108 second=255 amount=-1 +kerning first=84 second=328 amount=-1 +kerning first=354 second=8250 amount=-1 +kerning first=269 second=122 amount=-1 +kerning first=72 second=255 amount=-1 +kerning first=362 second=352 amount=-1 +kerning first=8218 second=305 amount=-1 +kerning first=233 second=122 amount=-1 +kerning first=344 second=71 amount=-1 +kerning first=90 second=262 amount=-1 +kerning first=379 second=323 amount=-1 +kerning first=210 second=278 amount=-1 +kerning first=107 second=233 amount=-1 +kerning first=196 second=366 amount=-2 +kerning first=317 second=290 amount=-1 +kerning first=382 second=252 amount=-1 +kerning first=282 second=278 amount=-1 +kerning first=354 second=278 amount=-1 +kerning first=1045 second=1118 amount=-1 +kerning first=77 second=352 amount=-1 +kerning first=81 second=200 amount=-1 +kerning first=256 second=245 amount=-1 +kerning first=209 second=290 amount=-1 +kerning first=274 second=252 amount=-1 +kerning first=45 second=200 amount=-3 +kerning first=356 second=233 amount=-2 +kerning first=220 second=245 amount=-1 +kerning first=122 second=283 amount=-1 +kerning first=310 second=252 amount=-1 +kerning first=1113 second=1085 amount=-1 +kerning first=346 second=252 amount=-1 +kerning first=314 second=333 amount=-1 +kerning first=1059 second=1092 amount=-2 +kerning first=336 second=87 amount=-1 +kerning first=84 second=110 amount=-1 +kerning first=268 second=106 amount=-1 +kerning first=264 second=87 amount=-1 +kerning first=217 second=288 amount=-1 +kerning first=193 second=81 amount=-1 +kerning first=379 second=281 amount=-1 +kerning first=73 second=113 amount=-1 +kerning first=192 second=87 amount=-3 +kerning first=280 second=84 amount=-1 +kerning first=76 second=288 amount=-1 +kerning first=192 second=347 amount=-1 +kerning first=199 second=281 amount=-1 +kerning first=200 second=65 amount=-1 +kerning first=255 second=243 amount=-1 +kerning first=195 second=262 amount=-1 +kerning first=368 second=326 amount=-1 +kerning first=8222 second=375 amount=-1 +kerning first=89 second=198 amount=-3 +kerning first=291 second=243 amount=-1 +kerning first=217 second=196 amount=-2 +kerning first=87 second=347 amount=-2 +kerning first=272 second=65 amount=-2 +kerning first=82 second=104 amount=-1 +kerning first=323 second=210 amount=-1 +kerning first=116 second=291 amount=-1 +kerning first=197 second=217 amount=-2 +kerning first=78 second=243 amount=-1 +kerning first=325 second=288 amount=-1 +kerning first=1058 second=1076 amount=-1 +kerning first=1054 second=1039 amount=-1 +kerning first=321 second=255 amount=-1 +kerning first=69 second=354 amount=-1 +kerning first=219 second=243 amount=-1 +kerning first=374 second=198 amount=-3 +kerning first=78 second=229 amount=-1 +kerning first=1050 second=1047 amount=-1 +kerning first=1069 second=1031 amount=-1 +kerning first=378 second=275 amount=-1 +kerning first=73 second=99 amount=-1 +kerning first=69 second=80 amount=-1 +kerning first=219 second=229 amount=-2 +kerning first=264 second=73 amount=-1 +kerning first=8217 second=351 amount=-1 +kerning first=66 second=377 amount=-2 +kerning first=266 second=198 amount=-2 +kerning first=375 second=248 amount=-1 +kerning first=199 second=103 amount=-1 +kerning first=66 second=75 amount=-2 +kerning first=338 second=198 amount=-1 +kerning first=298 second=118 amount=-1 +kerning first=363 second=229 amount=-1 +kerning first=8218 second=249 amount=-1 +kerning first=315 second=75 amount=-1 +kerning first=354 second=80 amount=-1 +kerning first=262 second=118 amount=-1 +kerning first=84 second=68 amount=-1 +kerning first=370 second=118 amount=-1 +kerning first=374 second=380 amount=-2 +kerning first=327 second=229 amount=-1 +kerning first=121 second=118 amount=-1 +kerning first=339 second=8220 amount=-1 +kerning first=376 second=120 amount=-1 +kerning first=210 second=80 amount=-1 +kerning first=85 second=118 amount=-1 +kerning first=1040 second=1077 amount=-1 +kerning first=232 second=106 amount=-1 +kerning first=77 second=332 amount=-1 +kerning first=226 second=118 amount=-1 +kerning first=267 second=8220 amount=-1 +kerning first=218 second=332 amount=-1 +kerning first=282 second=80 amount=-1 +kerning first=315 second=377 amount=-1 +kerning first=231 second=8220 amount=-1 +kerning first=115 second=287 amount=-1 +kerning first=198 second=219 amount=-1 +kerning first=79 second=287 amount=-1 +kerning first=350 second=8217 amount=-1 +kerning first=288 second=256 amount=-1 +kerning first=220 second=287 amount=-2 +kerning first=310 second=244 amount=-1 +kerning first=362 second=332 amount=-1 +kerning first=90 second=242 amount=-1 +kerning first=382 second=244 amount=-1 +kerning first=1037 second=1108 amount=-1 +kerning first=256 second=287 amount=-1 +kerning first=195 second=242 amount=-1 +kerning first=364 second=287 amount=-2 +kerning first=242 second=8217 amount=-1 +kerning first=328 second=287 amount=-1 +kerning first=82 second=264 amount=-1 +kerning first=1027 second=1040 amount=-2 +kerning first=267 second=242 amount=-1 +kerning first=86 second=289 amount=-2 +kerning first=231 second=242 amount=-1 +kerning first=110 second=121 amount=-1 +kerning first=122 second=289 amount=-1 +kerning first=8250 second=224 amount=-1 +kerning first=83 second=66 amount=-1 +kerning first=192 second=99 amount=-1 +kerning first=227 second=289 amount=-1 +kerning first=258 second=111 amount=-1 +kerning first=263 second=289 amount=-1 +kerning first=375 second=242 amount=-1 +kerning first=67 second=119 amount=-1 +kerning first=194 second=254 amount=-1 +kerning first=103 second=119 amount=-1 +kerning first=330 second=111 amount=-1 +kerning first=230 second=254 amount=-1 +kerning first=335 second=289 amount=-1 +kerning first=211 second=82 amount=-1 +kerning first=366 second=111 amount=-1 +kerning first=266 second=254 amount=-1 +kerning first=371 second=289 amount=-1 +kerning first=346 second=230 amount=-1 +kerning first=377 second=197 amount=-1 +kerning first=315 second=117 amount=-1 +kerning first=382 second=230 amount=-1 +kerning first=244 second=119 amount=-1 +kerning first=222 second=97 amount=-1 +kerning first=279 second=117 amount=-1 +kerning first=274 second=230 amount=-1 +kerning first=280 second=119 amount=-1 +kerning first=69 second=74 amount=-1 +kerning first=210 second=354 amount=-1 +kerning first=310 second=230 amount=-1 +kerning first=316 second=119 amount=-1 +kerning first=117 second=97 amount=-1 +kerning first=85 second=361 amount=-1 +kerning first=371 second=275 amount=-1 +kerning first=202 second=230 amount=-1 +kerning first=330 second=97 amount=-1 +kerning first=282 second=354 amount=-1 +kerning first=331 second=250 amount=-1 +kerning first=323 second=121 amount=-1 +kerning first=366 second=97 amount=-2 +kerning first=1073 second=1078 amount=-1 +kerning first=295 second=250 amount=-1 +kerning first=1113 second=1099 amount=-1 +kerning first=287 second=121 amount=-1 +kerning first=1043 second=1054 amount=-1 +kerning first=251 second=121 amount=-1 +kerning first=198 second=205 amount=-1 +kerning first=282 second=74 amount=-1 +kerning first=367 second=250 amount=-1 +kerning first=204 second=378 amount=-1 +kerning first=374 second=240 amount=-2 +kerning first=187 second=250 amount=-1 +kerning first=251 second=107 amount=-1 +kerning first=354 second=74 amount=-2 +kerning first=302 second=240 amount=-1 +kerning first=65 second=333 amount=-1 +kerning first=259 second=250 amount=-1 +kerning first=290 second=86 amount=-1 +kerning first=66 second=117 amount=-1 +kerning first=199 second=338 amount=-2 +kerning first=240 second=378 amount=-1 +kerning first=327 second=287 amount=-1 +kerning first=101 second=8217 amount=-1 +kerning first=370 second=269 amount=-1 +kerning first=99 second=378 amount=-1 +kerning first=82 second=250 amount=-1 +kerning first=207 second=117 amount=-1 +kerning first=8216 second=370 amount=-1 +kerning first=84 second=116 amount=-1 +kerning first=89 second=240 amount=-2 +kerning first=268 second=310 amount=-1 +kerning first=195 second=318 amount=-1 +kerning first=231 second=318 amount=-1 +kerning first=68 second=220 amount=-1 +kerning first=69 second=298 amount=-1 +kerning first=267 second=318 amount=-1 +kerning first=280 second=214 amount=-1 +kerning first=266 second=240 amount=-1 +kerning first=187 second=194 amount=-2 +kerning first=303 second=318 amount=-1 +kerning first=376 second=310 amount=-1 +kerning first=339 second=318 amount=-1 +kerning first=210 second=298 amount=-1 +kerning first=1048 second=1089 amount=-1 +kerning first=375 second=318 amount=-1 +kerning first=314 second=259 amount=-1 +kerning first=323 second=375 amount=-1 +kerning first=278 second=259 amount=-1 +kerning first=199 second=77 amount=-1 +kerning first=287 second=375 amount=-1 +kerning first=200 second=71 amount=-1 +kerning first=67 second=214 amount=-2 +kerning first=251 second=375 amount=-1 +kerning first=1025 second=1041 amount=-1 +kerning first=76 second=330 amount=-1 +kerning first=350 second=259 amount=-1 +kerning first=379 second=77 amount=-1 +kerning first=108 second=231 amount=-1 +kerning first=101 second=259 amount=-1 +kerning first=45 second=97 amount=-1 +kerning first=317 second=220 amount=-1 +kerning first=203 second=296 amount=-1 +kerning first=206 second=259 amount=-1 +kerning first=1059 second=1086 amount=-2 +kerning first=365 second=369 amount=-1 +kerning first=356 second=253 amount=-1 +kerning first=352 second=228 amount=-1 +kerning first=111 second=105 amount=-1 +kerning first=377 second=374 amount=-1 +kerning first=316 second=228 amount=-1 +kerning first=90 second=304 amount=-1 +kerning first=268 second=324 amount=-1 +kerning first=100 second=251 amount=-1 +kerning first=232 second=324 amount=-1 +kerning first=8216 second=356 amount=-1 +kerning first=241 second=251 amount=-1 +kerning first=221 second=369 amount=-1 +kerning first=208 second=228 amount=-1 +kerning first=280 second=226 amount=-1 +kerning first=205 second=251 amount=-1 +kerning first=314 second=273 amount=-1 +kerning first=110 second=375 amount=-1 +kerning first=382 second=281 amount=-1 +kerning first=313 second=251 amount=-1 +kerning first=1054 second=1055 amount=-1 +kerning first=103 second=228 amount=-1 +kerning first=277 second=251 amount=-1 +kerning first=257 second=369 amount=-1 +kerning first=67 second=228 amount=-1 +kerning first=216 second=206 amount=-1 +kerning first=8217 second=261 amount=-3 +kerning first=282 second=298 amount=-1 +kerning first=66 second=70 amount=-2 +kerning first=354 second=284 amount=-1 +kerning first=288 second=206 amount=-1 +kerning first=209 second=234 amount=-1 +kerning first=187 second=217 amount=-2 +kerning first=354 second=298 amount=-1 +kerning first=378 second=279 amount=-1 +kerning first=282 second=284 amount=-1 +kerning first=88 second=363 amount=-1 +kerning first=87 second=290 amount=-1 +kerning first=248 second=253 amount=-1 +kerning first=193 second=363 amount=-1 +kerning first=8218 second=311 amount=-1 +kerning first=353 second=45 amount=-1 +kerning first=1051 second=1108 amount=-1 +kerning first=69 second=284 amount=-1 +kerning first=229 second=363 amount=-1 +kerning first=221 second=355 amount=-1 +kerning first=88 second=83 amount=-1 +kerning first=224 second=318 amount=-1 +kerning first=336 second=220 amount=-1 +kerning first=260 second=318 amount=-1 +kerning first=75 second=268 amount=-1 +kerning first=193 second=83 amount=-2 +kerning first=314 second=263 amount=-1 +kerning first=198 second=213 amount=-1 +kerning first=286 second=313 amount=-1 +kerning first=65 second=263 amount=-1 +kerning first=208 second=218 amount=-1 +kerning first=214 second=313 amount=-1 +kerning first=206 second=263 amount=-1 +kerning first=67 second=218 amount=-1 +kerning first=69 second=218 amount=-1 +kerning first=203 second=310 amount=-1 +kerning first=221 second=303 amount=-1 +kerning first=75 second=220 amount=-1 +kerning first=317 second=255 amount=-1 +kerning first=337 second=353 amount=-1 +kerning first=321 second=315 amount=-1 +kerning first=365 second=365 amount=-1 +kerning first=85 second=225 amount=-2 +kerning first=365 second=303 amount=-1 +kerning first=213 second=315 amount=-1 +kerning first=257 second=365 amount=-1 +kerning first=288 second=220 amount=-1 +kerning first=193 second=353 amount=-1 +kerning first=85 second=114 amount=-1 +kerning first=221 second=365 amount=-1 +kerning first=229 second=353 amount=-1 +kerning first=216 second=220 amount=-1 +kerning first=1044 second=1060 amount=-1 +kerning first=83 second=270 amount=-1 +kerning first=78 second=235 amount=-1 +kerning first=298 second=225 amount=-1 +kerning first=354 second=45 amount=-3 +kerning first=275 second=98 amount=-1 +kerning first=334 second=225 amount=-1 +kerning first=381 second=228 amount=-1 +kerning first=370 second=225 amount=-2 +kerning first=219 second=235 amount=-1 +kerning first=1113 second=1093 amount=-1 +kerning first=347 second=98 amount=-1 +kerning first=255 second=235 amount=-1 +kerning first=121 second=225 amount=-2 +kerning first=291 second=235 amount=-1 +kerning first=1059 second=1100 amount=-2 +kerning first=332 second=270 amount=-1 +kerning first=327 second=235 amount=-1 +kerning first=70 second=350 amount=-1 +kerning first=201 second=228 amount=-1 +kerning first=203 second=98 amount=-1 +kerning first=45 second=363 amount=-1 +kerning first=262 second=225 amount=-1 +kerning first=352 second=218 amount=-1 +kerning first=275 second=102 amount=-1 +kerning first=117 second=363 amount=-1 +kerning first=232 second=46 amount=-2 +kerning first=278 second=317 amount=-1 +kerning first=211 second=350 amount=-1 +kerning first=347 second=102 amount=-1 +kerning first=268 second=46 amount=-1 +kerning first=108 second=305 amount=-1 +kerning first=278 second=325 amount=-1 +kerning first=76 second=280 amount=-1 +kerning first=304 second=46 amount=-1 +kerning first=192 second=355 amount=-1 +kerning first=1116 second=1108 amount=-1 +kerning first=258 second=363 amount=-1 +kerning first=83 second=318 amount=-1 +kerning first=310 second=356 amount=-1 +kerning first=119 second=318 amount=-1 +kerning first=87 second=355 amount=-1 +kerning first=286 second=270 amount=-1 +kerning first=203 second=102 amount=-1 +kerning first=330 second=363 amount=-1 +kerning first=83 second=260 amount=-2 +kerning first=71 second=200 amount=-1 +kerning first=366 second=363 amount=-1 +kerning first=207 second=67 amount=-1 +kerning first=211 second=86 amount=-1 +kerning first=310 second=117 amount=-1 +kerning first=1027 second=1117 amount=-1 +kerning first=249 second=316 amount=-1 +kerning first=264 second=81 amount=-2 +kerning first=8216 second=193 amount=-4 +kerning first=268 second=112 amount=-1 +kerning first=197 second=211 amount=-1 +kerning first=77 second=171 amount=-2 +kerning first=232 second=112 amount=-1 +kerning first=66 second=67 amount=-1 +kerning first=113 second=171 amount=-1 +kerning first=368 second=260 amount=-2 +kerning first=205 second=261 amount=-1 +kerning first=196 second=112 amount=-1 +kerning first=290 second=365 amount=-1 +kerning first=332 second=260 amount=-2 +kerning first=381 second=283 amount=-1 +kerning first=258 second=107 amount=-1 +kerning first=352 second=280 amount=-1 +kerning first=277 second=261 amount=-1 +kerning first=75 second=216 amount=-1 +kerning first=377 second=211 amount=-1 +kerning first=317 second=253 amount=-1 +kerning first=326 second=171 amount=-1 +kerning first=198 second=209 amount=-1 +kerning first=66 second=327 amount=-2 +kerning first=362 second=171 amount=-3 +kerning first=250 second=105 amount=-1 +kerning first=295 second=254 amount=-1 +kerning first=87 second=81 amount=-1 +kerning first=218 second=171 amount=-3 +kerning first=331 second=254 amount=-1 +kerning first=367 second=254 amount=-1 +kerning first=315 second=327 amount=-1 +kerning first=376 second=112 amount=-1 +kerning first=192 second=81 amount=-1 +kerning first=290 second=171 amount=-1 +kerning first=218 second=346 amount=-1 +kerning first=204 second=100 amount=-1 +kerning first=209 second=230 amount=-1 +kerning first=249 second=249 amount=-1 +kerning first=108 second=249 amount=-1 +kerning first=8217 second=257 amount=-3 +kerning first=68 second=282 amount=-1 +kerning first=77 second=346 amount=-1 +kerning first=88 second=353 amount=-1 +kerning first=78 second=333 amount=-1 +kerning first=362 second=346 amount=-1 +kerning first=1036 second=1058 amount=-1 +kerning first=84 second=334 amount=-1 +kerning first=286 second=379 amount=-1 +kerning first=1047 second=1079 amount=-1 +kerning first=68 second=230 amount=-1 +kerning first=290 second=346 amount=-1 +kerning first=99 second=100 amount=-1 +kerning first=321 second=249 amount=-1 +kerning first=1070 second=1103 amount=-1 +kerning first=364 second=350 amount=-1 +kerning first=272 second=325 amount=-1 +kerning first=117 second=107 amount=-1 +kerning first=1040 second=1091 amount=-1 +kerning first=90 second=256 amount=-1 +kerning first=86 second=223 amount=-1 +kerning first=1069 second=1039 amount=-1 +kerning first=353 second=230 amount=-1 +kerning first=72 second=249 amount=-1 +kerning first=45 second=107 amount=-1 +kerning first=281 second=230 amount=-1 +kerning first=344 second=339 amount=-1 +kerning first=282 second=84 amount=-1 +kerning first=1054 second=1059 amount=-1 +kerning first=193 second=89 amount=-3 +kerning first=1098 second=1094 amount=-1 +kerning first=210 second=84 amount=-1 +kerning first=74 second=240 amount=-1 +kerning first=344 second=79 amount=-1 +kerning first=366 second=192 amount=-2 +kerning first=8218 second=357 amount=-1 +kerning first=356 second=187 amount=-1 +kerning first=362 second=237 amount=-1 +kerning first=381 second=281 amount=-1 +kerning first=364 second=237 amount=-1 +kerning first=88 second=89 amount=-1 +kerning first=222 second=192 amount=-2 +kerning first=232 second=314 amount=-1 +kerning first=339 second=44 amount=-2 +kerning first=381 second=232 amount=-1 +kerning first=274 second=200 amount=-1 +kerning first=196 second=314 amount=-1 +kerning first=221 second=99 amount=-2 +kerning first=336 second=8249 amount=-1 +kerning first=338 second=118 amount=-1 +kerning first=99 second=104 amount=-1 +kerning first=315 second=378 amount=-1 +kerning first=220 second=237 amount=-1 +kerning first=228 second=8249 amount=-1 +kerning first=262 second=217 amount=-1 +kerning first=45 second=192 amount=-2 +kerning first=268 second=314 amount=-1 +kerning first=371 second=227 amount=-1 +kerning first=248 second=187 amount=-1 +kerning first=375 second=44 amount=-3 +kerning first=115 second=237 amount=-1 +kerning first=317 second=282 amount=-1 +kerning first=334 second=217 amount=-1 +kerning first=379 second=277 amount=-1 +kerning first=192 second=8249 amount=-2 +kerning first=68 second=224 amount=-1 +kerning first=267 second=44 amount=-1 +kerning first=240 second=104 amount=-1 +kerning first=108 second=261 amount=-1 +kerning first=8220 second=121 amount=-1 +kerning first=87 second=8249 amount=-3 +kerning first=87 second=351 amount=-2 +kerning first=8217 second=251 amount=-1 +kerning first=187 second=202 amount=-3 +kerning first=1101 second=1076 amount=-1 +kerning first=83 second=326 amount=-1 +kerning first=192 second=351 amount=-1 +kerning first=119 second=326 amount=-1 +kerning first=203 second=302 amount=-1 +kerning first=378 second=269 amount=-1 +kerning first=209 second=224 amount=-1 +kerning first=80 second=99 amount=-1 +kerning first=117 second=371 amount=-1 +kerning first=281 second=224 amount=-1 +kerning first=264 second=347 amount=-1 +kerning first=260 second=253 amount=-1 +kerning first=228 second=347 amount=-1 +kerning first=353 second=224 amount=-1 +kerning first=325 second=44 amount=-1 +kerning first=216 second=196 amount=-2 +kerning first=206 second=267 amount=-1 +kerning first=366 second=367 amount=-1 +kerning first=119 second=275 amount=-1 +kerning first=379 second=69 amount=-1 +kerning first=65 second=267 amount=-1 +kerning first=258 second=367 amount=-1 +kerning first=45 second=371 amount=-1 +kerning first=314 second=267 amount=-1 +kerning first=75 second=212 amount=-1 +kerning first=277 second=257 amount=-1 +kerning first=199 second=69 amount=-1 +kerning first=258 second=101 amount=-1 +kerning first=228 second=351 amount=-1 +kerning first=1061 second=1047 amount=-1 +kerning first=208 second=374 amount=-1 +kerning first=205 second=257 amount=-1 +kerning first=330 second=101 amount=-1 +kerning first=200 second=79 amount=-1 +kerning first=117 second=367 amount=-1 +kerning first=1059 second=1096 amount=-2 +kerning first=366 second=101 amount=-1 +kerning first=220 second=241 amount=-1 +kerning first=269 second=382 amount=-1 +kerning first=89 second=246 amount=-1 +kerning first=264 second=291 amount=-1 +kerning first=296 second=266 amount=-1 +kerning first=228 second=291 amount=-1 +kerning first=192 second=291 amount=-1 +kerning first=377 second=382 amount=-1 +kerning first=68 second=226 amount=-1 +kerning first=1062 second=1057 amount=-1 +kerning first=8217 second=253 amount=-1 +kerning first=321 second=311 amount=-1 +kerning first=87 second=291 amount=-2 +kerning first=199 second=337 amount=-1 +kerning first=65 second=8221 amount=-3 +kerning first=317 second=286 amount=-1 +kerning first=115 second=241 amount=-1 +kerning first=351 second=331 amount=-1 +kerning first=209 second=226 amount=-1 +kerning first=8216 second=364 amount=-1 +kerning first=209 second=286 amount=-1 +kerning first=249 second=311 amount=-1 +kerning first=378 second=271 amount=-1 +kerning first=233 second=382 amount=-1 +kerning first=221 second=361 amount=-1 +kerning first=379 second=337 amount=-1 +kerning first=279 second=331 amount=-1 +kerning first=315 second=331 amount=-1 +kerning first=242 second=8221 amount=-1 +kerning first=103 second=241 amount=-1 +kerning first=101 second=8221 amount=-1 +kerning first=257 second=361 amount=-1 +kerning first=334 second=221 amount=-1 +kerning first=365 second=361 amount=-1 +kerning first=196 second=316 amount=-1 +kerning first=350 second=8221 amount=-1 +kerning first=232 second=316 amount=-1 +kerning first=8222 second=104 amount=-1 +kerning first=262 second=221 amount=-1 +kerning first=268 second=316 amount=-1 +kerning first=66 second=331 amount=-1 +kerning first=368 second=266 amount=-1 +kerning first=314 second=8221 amount=-2 +kerning first=231 second=252 amount=-1 +kerning first=249 second=45 amount=-1 +kerning first=222 second=103 amount=-1 +kerning first=267 second=252 amount=-1 +kerning first=122 second=227 amount=-1 +kerning first=213 second=45 amount=-1 +kerning first=303 second=252 amount=-1 +kerning first=86 second=227 amount=-2 +kerning first=321 second=45 amount=-1 +kerning first=117 second=103 amount=-1 +kerning first=66 second=210 amount=-1 +kerning first=339 second=252 amount=-1 +kerning first=81 second=103 amount=-1 +kerning first=216 second=86 amount=-1 +kerning first=45 second=103 amount=-1 +kerning first=310 second=229 amount=-1 +kerning first=90 second=252 amount=-1 +kerning first=76 second=278 amount=-1 +kerning first=278 second=323 amount=-1 +kerning first=76 second=336 amount=-1 +kerning first=263 second=227 amount=-1 +kerning first=195 second=252 amount=-1 +kerning first=350 second=323 amount=-1 +kerning first=281 second=226 amount=-1 +kerning first=217 second=336 amount=-1 +kerning first=374 second=246 amount=-1 +kerning first=377 second=207 amount=-1 +kerning first=286 second=317 amount=-1 +kerning first=269 second=46 amount=-1 +kerning first=353 second=226 amount=-1 +kerning first=78 second=233 amount=-1 +kerning first=302 second=246 amount=-1 +kerning first=211 second=356 amount=-1 +kerning first=325 second=336 amount=-1 +kerning first=266 second=246 amount=-1 +kerning first=366 second=103 amount=-2 +kerning first=211 second=90 amount=-1 +kerning first=69 second=84 amount=-1 +kerning first=330 second=103 amount=-1 +kerning first=194 second=246 amount=-1 +kerning first=336 second=291 amount=-1 +kerning first=219 second=233 amount=-1 +kerning first=80 second=339 amount=-1 +kerning first=258 second=103 amount=-1 +kerning first=1098 second=1098 amount=-1 +kerning first=286 second=103 amount=-1 +kerning first=116 second=45 amount=-1 +kerning first=196 second=356 amount=-3 +kerning first=122 second=259 amount=-1 +kerning first=279 second=347 amount=-1 +kerning first=257 second=45 amount=-1 +kerning first=236 second=369 amount=-1 +kerning first=214 second=103 amount=-1 +kerning first=118 second=246 amount=-1 +kerning first=366 second=375 amount=-1 +kerning first=221 second=45 amount=-3 +kerning first=200 second=369 amount=-1 +kerning first=82 second=246 amount=-1 +kerning first=1039 second=1086 amount=-1 +kerning first=109 second=103 amount=-1 +kerning first=8216 second=347 amount=-1 +kerning first=73 second=103 amount=-1 +kerning first=100 second=253 amount=-1 +kerning first=73 second=363 amount=-1 +kerning first=86 second=259 amount=-2 +kerning first=113 second=116 amount=-1 +kerning first=365 second=45 amount=-1 +kerning first=104 second=103 amount=-1 +kerning first=1055 second=1089 amount=-1 +kerning first=108 second=279 amount=-1 +kerning first=66 second=65 amount=-3 +kerning first=117 second=375 amount=-1 +kerning first=381 second=226 amount=-1 +kerning first=1059 second=1102 amount=-2 +kerning first=72 second=279 amount=-1 +kerning first=240 second=122 amount=-1 +kerning first=380 second=109 amount=-1 +kerning first=290 second=362 amount=-1 +kerning first=250 second=363 amount=-1 +kerning first=204 second=122 amount=-1 +kerning first=45 second=375 amount=-2 +kerning first=1091 second=1089 amount=-1 +kerning first=286 second=363 amount=-1 +kerning first=330 second=375 amount=-1 +kerning first=199 second=119 amount=-1 +kerning first=236 second=109 amount=-1 +kerning first=258 second=375 amount=-1 +kerning first=80 second=45 amount=-1 +kerning first=315 second=65 amount=-1 +kerning first=380 second=369 amount=-1 +kerning first=221 second=305 amount=-1 +kerning first=200 second=109 amount=-1 +kerning first=44 second=45 amount=-1 +kerning first=1047 second=1063 amount=-1 +kerning first=1113 second=1095 amount=-1 +kerning first=344 second=369 amount=-1 +kerning first=330 second=115 amount=-1 +kerning first=1038 second=1094 amount=-2 +kerning first=236 second=355 amount=-1 +kerning first=366 second=115 amount=-1 +kerning first=196 second=370 amount=-2 +kerning first=69 second=336 amount=-1 +kerning first=258 second=115 amount=-1 +kerning first=268 second=370 amount=-1 +kerning first=371 second=8217 amount=-2 +kerning first=380 second=355 amount=-1 +kerning first=214 second=89 amount=-1 +kerning first=200 second=364 amount=-1 +kerning first=1056 second=1053 amount=-1 +kerning first=344 second=355 amount=-1 +kerning first=282 second=336 amount=-1 +kerning first=212 second=196 amount=-2 +kerning first=205 second=253 amount=-1 +kerning first=8217 second=197 amount=-3 +kerning first=354 second=336 amount=-1 +kerning first=277 second=253 amount=-1 +kerning first=118 second=232 amount=-1 +kerning first=313 second=253 amount=-1 +kerning first=82 second=232 amount=-1 +kerning first=1091 second=1103 amount=-2 +kerning first=8250 second=254 amount=-1 +kerning first=84 second=332 amount=-1 +kerning first=376 second=82 amount=-1 +kerning first=376 second=328 amount=-1 +kerning first=73 second=335 amount=-1 +kerning first=280 second=196 amount=-1 +kerning first=99 second=108 amount=-1 +kerning first=371 second=231 amount=-1 +kerning first=1039 second=1104 amount=-1 +kerning first=205 second=225 amount=-1 +kerning first=352 second=196 amount=-2 +kerning first=336 second=315 amount=-1 +kerning first=279 second=228 amount=-1 +kerning first=339 second=116 amount=-1 +kerning first=240 second=108 amount=-1 +kerning first=262 second=203 amount=-1 +kerning first=122 second=231 amount=-1 +kerning first=376 second=370 amount=-1 +kerning first=68 second=280 amount=-1 +kerning first=82 second=218 amount=-1 +kerning first=263 second=8217 amount=-1 +kerning first=113 second=102 amount=-1 +kerning first=321 second=374 amount=-1 +kerning first=67 second=196 amount=-2 +kerning first=86 second=231 amount=-2 +kerning first=79 second=8221 amount=-1 +kerning first=263 second=273 amount=-1 +kerning first=115 second=8221 amount=-1 +kerning first=277 second=225 amount=-1 +kerning first=325 second=46 amount=-1 +kerning first=310 second=350 amount=-1 +kerning first=361 second=46 amount=-1 +kerning first=317 second=280 amount=-1 +kerning first=195 second=286 amount=-1 +kerning first=310 second=242 amount=-1 +kerning first=122 second=273 amount=-1 +kerning first=187 second=218 amount=-2 +kerning first=263 second=231 amount=-1 +kerning first=256 second=8221 amount=-3 +kerning first=362 second=102 amount=-1 +kerning first=205 second=211 amount=-1 +kerning first=112 second=46 amount=-2 +kerning first=1069 second=1083 amount=-1 +kerning first=90 second=286 amount=-1 +kerning first=382 second=242 amount=-1 +kerning first=263 second=245 amount=-1 +kerning first=234 second=371 amount=-1 +kerning first=200 second=81 amount=-1 +kerning first=74 second=119 amount=-1 +kerning first=1105 second=1083 amount=-1 +kerning first=199 second=67 amount=-2 +kerning first=110 second=119 amount=-1 +kerning first=246 second=314 amount=-1 +kerning first=217 second=46 amount=-3 +kerning first=67 second=210 amount=-2 +kerning first=317 second=266 amount=-1 +kerning first=218 second=102 amount=-1 +kerning first=99 second=122 amount=-1 +kerning first=1047 second=1049 amount=-1 +kerning first=344 second=81 amount=-1 +kerning first=251 second=119 amount=-1 +kerning first=8250 second=282 amount=-3 +kerning first=290 second=102 amount=-1 +kerning first=371 second=245 amount=-1 +kerning first=287 second=119 amount=-1 +kerning first=313 second=211 amount=-1 +kerning first=314 second=255 amount=-1 +kerning first=323 second=119 amount=-1 +kerning first=354 second=187 amount=-1 +kerning first=281 second=252 amount=-1 +kerning first=317 second=252 amount=-1 +kerning first=353 second=252 amount=-1 +kerning first=268 second=328 amount=-1 +kerning first=122 second=245 amount=-1 +kerning first=65 second=269 amount=-1 +kerning first=86 second=245 amount=-2 +kerning first=379 second=67 amount=-1 +kerning first=104 second=252 amount=-1 +kerning first=216 second=68 amount=-1 +kerning first=108 second=307 amount=-1 +kerning first=206 second=269 amount=-1 +kerning first=209 second=252 amount=-1 +kerning first=371 second=259 amount=-1 +kerning first=75 second=262 amount=-1 +kerning first=198 second=109 amount=-1 +kerning first=355 second=378 amount=-1 +kerning first=315 second=353 amount=-1 +kerning first=351 second=353 amount=-1 +kerning first=75 second=250 amount=-1 +kerning first=351 second=365 amount=-1 +kerning first=314 second=269 amount=-1 +kerning first=315 second=365 amount=-1 +kerning first=369 second=112 amount=-1 +kerning first=211 second=366 amount=-1 +kerning first=211 second=378 amount=-1 +kerning first=279 second=365 amount=-1 +kerning first=333 second=112 amount=-1 +kerning first=269 second=171 amount=-1 +kerning first=207 second=353 amount=-1 +kerning first=305 second=171 amount=-1 +kerning first=283 second=378 amount=-1 +kerning first=207 second=365 amount=-1 +kerning first=243 second=353 amount=-1 +kerning first=279 second=353 amount=-1 +kerning first=377 second=171 amount=-1 +kerning first=84 second=100 amount=-2 +kerning first=120 second=100 amount=-1 +kerning first=296 second=288 amount=-1 +kerning first=364 second=275 amount=-1 +kerning first=1036 second=1054 amount=-2 +kerning first=256 second=275 amount=-1 +kerning first=66 second=353 amount=-1 +kerning first=203 second=352 amount=-1 +kerning first=368 second=288 amount=-1 +kerning first=364 second=249 amount=-1 +kerning first=102 second=353 amount=-1 +kerning first=80 second=87 amount=-1 +kerning first=1030 second=1086 amount=-1 +kerning first=220 second=275 amount=-1 +kerning first=203 second=354 amount=-1 +kerning first=280 second=210 amount=-1 +kerning first=260 second=288 amount=-1 +kerning first=356 second=223 amount=-1 +kerning first=8216 second=368 amount=-1 +kerning first=88 second=113 amount=-1 +kerning first=83 second=365 amount=-1 +kerning first=83 second=274 amount=-1 +kerning first=315 second=379 amount=-1 +kerning first=69 second=296 amount=-1 +kerning first=196 second=231 amount=-1 +kerning first=211 second=380 amount=-1 +kerning first=79 second=8249 amount=-1 +kerning first=115 second=249 amount=-1 +kerning first=210 second=296 amount=-1 +kerning first=324 second=8220 amount=-2 +kerning first=230 second=367 amount=-1 +kerning first=381 second=198 amount=-1 +kerning first=283 second=380 amount=-1 +kerning first=288 second=8220 amount=-1 +kerning first=79 second=289 amount=-1 +kerning first=282 second=296 amount=-1 +kerning first=379 second=313 amount=-1 +kerning first=252 second=8220 amount=-2 +kerning first=256 second=249 amount=-1 +kerning first=115 second=289 amount=-1 +kerning first=192 second=217 amount=-2 +kerning first=75 second=248 amount=-1 +kerning first=216 second=8220 amount=-1 +kerning first=354 second=296 amount=-1 +kerning first=201 second=198 amount=-1 +kerning first=70 second=380 amount=-1 +kerning first=8216 second=122 amount=-1 +kerning first=220 second=289 amount=-2 +kerning first=84 second=114 amount=-1 +kerning first=106 second=380 amount=-1 +kerning first=111 second=8220 amount=-1 +kerning first=220 second=249 amount=-1 +kerning first=103 second=328 amount=-1 +kerning first=102 second=339 amount=-1 +kerning first=193 second=99 amount=-1 +kerning first=364 second=8249 amount=-3 +kerning first=75 second=8220 amount=-1 +kerning first=66 second=365 amount=-1 +kerning first=199 second=327 amount=-1 +kerning first=364 second=263 amount=-1 +kerning first=264 second=315 amount=-1 +kerning first=187 second=206 amount=-3 +kerning first=66 second=379 amount=-2 +kerning first=248 second=237 amount=-1 +kerning first=328 second=8249 amount=-1 +kerning first=199 second=313 amount=-1 +kerning first=1048 second=1105 amount=-1 +kerning first=80 second=73 amount=-1 +kerning first=220 second=8249 amount=-3 +kerning first=256 second=8249 amount=-2 +kerning first=286 second=75 amount=-1 +kerning first=207 second=339 amount=-1 +kerning first=220 second=263 amount=-1 +kerning first=115 second=8249 amount=-1 +kerning first=87 second=315 amount=-1 +kerning first=379 second=327 amount=-1 +kerning first=221 second=73 amount=-1 +kerning first=256 second=263 amount=-1 +kerning first=214 second=75 amount=-1 +kerning first=212 second=209 amount=-1 +kerning first=201 second=212 amount=-1 +kerning first=371 second=111 amount=-1 +kerning first=200 second=83 amount=-1 +kerning first=377 second=199 amount=-1 +kerning first=356 second=209 amount=-1 +kerning first=256 second=277 amount=-1 +kerning first=315 second=381 amount=-1 +kerning first=214 second=323 amount=-1 +kerning first=88 second=99 amount=-1 +kerning first=272 second=83 amount=-1 +kerning first=364 second=277 amount=-1 +kerning first=367 second=115 amount=-1 +kerning first=1070 second=1113 amount=-1 +kerning first=284 second=209 amount=-1 +kerning first=256 second=289 amount=-1 +kerning first=286 second=323 amount=-1 +kerning first=344 second=83 amount=-1 +kerning first=207 second=351 amount=-1 +kerning first=69 second=76 amount=-1 +kerning first=1100 second=1118 amount=-1 +kerning first=328 second=289 amount=-1 +kerning first=220 second=277 amount=-1 +kerning first=279 second=351 amount=-1 +kerning first=381 second=212 amount=-1 +kerning first=364 second=289 amount=-2 +kerning first=75 second=264 amount=-1 +kerning first=243 second=351 amount=-1 +kerning first=8220 second=194 amount=-4 +kerning first=88 second=111 amount=-1 +kerning first=71 second=209 amount=-1 +kerning first=86 second=233 amount=-2 +kerning first=193 second=111 amount=-1 +kerning first=279 second=367 amount=-1 +kerning first=102 second=351 amount=-1 +kerning first=211 second=364 amount=-1 +kerning first=315 second=367 amount=-1 +kerning first=122 second=233 amount=-1 +kerning first=66 second=351 amount=-1 +kerning first=364 second=291 amount=-2 +kerning first=115 second=261 amount=-1 +kerning first=207 second=367 amount=-1 +kerning first=263 second=233 amount=-1 +kerning first=328 second=291 amount=-1 +kerning first=88 second=97 amount=-1 +kerning first=354 second=76 amount=-1 +kerning first=84 second=72 amount=-1 +kerning first=256 second=291 amount=-1 +kerning first=220 second=291 amount=-2 +kerning first=201 second=226 amount=-1 +kerning first=351 second=351 amount=-1 +kerning first=102 second=337 amount=-1 +kerning first=1116 second=1092 amount=-1 +kerning first=66 second=367 amount=-1 +kerning first=347 second=326 amount=-1 +kerning first=371 second=233 amount=-1 +kerning first=315 second=351 amount=-1 +kerning first=115 second=291 amount=-1 +kerning first=210 second=76 amount=-1 +kerning first=79 second=291 amount=-1 +kerning first=79 second=261 amount=-1 +kerning first=99 second=110 amount=-1 +kerning first=83 second=316 amount=-1 +kerning first=324 second=250 amount=-1 +kerning first=119 second=316 amount=-1 +kerning first=288 second=250 amount=-1 +kerning first=203 second=326 amount=-1 +kerning first=8250 second=119 amount=-2 +kerning first=106 second=378 amount=-1 +kerning first=197 second=171 amount=-2 +kerning first=77 second=350 amount=-1 +kerning first=224 second=316 amount=-1 +kerning first=250 second=103 amount=-1 +kerning first=70 second=378 amount=-1 +kerning first=83 second=302 amount=-1 +kerning first=275 second=326 amount=-1 +kerning first=290 second=350 amount=-1 +kerning first=260 second=316 amount=-1 +kerning first=205 second=380 amount=-1 +kerning first=218 second=350 amount=-1 +kerning first=252 second=250 amount=-1 +kerning first=364 second=261 amount=-2 +kerning first=66 second=381 amount=-2 +kerning first=1059 second=1116 amount=-2 +kerning first=353 second=8217 amount=-1 +kerning first=117 second=117 amount=-1 +kerning first=272 second=381 amount=-1 +kerning first=1113 second=1107 amount=-1 +kerning first=362 second=350 amount=-1 +kerning first=371 second=271 amount=-1 +kerning first=89 second=200 amount=-1 +kerning first=87 second=331 amount=-1 +kerning first=90 second=260 amount=-1 +kerning first=338 second=200 amount=-1 +kerning first=381 second=214 amount=-1 +kerning first=258 second=117 amount=-1 +kerning first=78 second=248 amount=-1 +kerning first=350 second=311 amount=-1 +kerning first=366 second=117 amount=-1 +kerning first=266 second=200 amount=-1 +kerning first=187 second=77 amount=-3 +kerning first=330 second=117 amount=-1 +kerning first=211 second=196 amount=-2 +kerning first=209 second=240 amount=-1 +kerning first=69 second=338 amount=-1 +kerning first=317 second=264 amount=-1 +kerning first=325 second=290 amount=-1 +kerning first=212 second=207 amount=-1 +kerning first=196 second=98 amount=-1 +kerning first=8220 second=196 amount=-4 +kerning first=122 second=271 amount=-1 +kerning first=76 second=290 amount=-1 +kerning first=209 second=264 amount=-1 +kerning first=84 second=375 amount=-1 +kerning first=203 second=259 amount=-1 +kerning first=45 second=377 amount=-2 +kerning first=201 second=214 amount=-1 +kerning first=45 second=117 amount=-1 +kerning first=81 second=377 amount=-1 +kerning first=263 second=271 amount=-1 +kerning first=217 second=290 amount=-1 +kerning first=71 second=207 amount=-1 +kerning first=290 second=90 amount=-1 +kerning first=268 second=330 amount=-1 +kerning first=256 second=111 amount=-1 +kerning first=222 second=377 amount=-1 +kerning first=187 second=220 amount=-2 +kerning first=362 second=90 amount=-1 +kerning first=8217 second=230 amount=-3 +kerning first=84 second=122 amount=-2 +kerning first=362 second=334 amount=-1 +kerning first=1038 second=1086 amount=-2 +kerning first=376 second=330 amount=-1 +kerning first=284 second=207 amount=-1 +kerning first=198 second=227 amount=-1 +kerning first=321 second=291 amount=-1 +kerning first=122 second=305 amount=-1 +kerning first=1047 second=1037 amount=-1 +kerning first=366 second=377 amount=-1 +kerning first=83 second=304 amount=-1 +kerning first=356 second=207 amount=-1 +kerning first=249 second=291 amount=-1 +kerning first=1055 second=1077 amount=-1 +kerning first=213 second=291 amount=-1 +kerning first=278 second=311 amount=-1 +kerning first=80 second=317 amount=-1 +kerning first=347 second=324 amount=-1 +kerning first=1059 second=1114 amount=-2 +kerning first=236 second=97 amount=-1 +kerning first=235 second=287 amount=-1 +kerning first=242 second=311 amount=-1 +kerning first=377 second=187 amount=-1 +kerning first=108 second=291 amount=-1 +kerning first=272 second=97 amount=-1 +kerning first=199 second=287 amount=-1 +kerning first=66 second=77 amount=-2 +kerning first=72 second=291 amount=-1 +kerning first=73 second=337 amount=-1 +kerning first=307 second=287 amount=-1 +kerning first=221 second=317 amount=-1 +kerning first=75 second=234 amount=-1 +kerning first=374 second=200 amount=-1 +kerning first=200 second=97 amount=-1 +kerning first=101 second=311 amount=-1 +kerning first=315 second=77 amount=-1 +kerning first=8222 second=365 amount=-1 +kerning first=380 second=97 amount=-1 +kerning first=379 second=287 amount=-2 +kerning first=89 second=290 amount=-1 +kerning first=65 second=311 amount=-1 +kerning first=233 second=187 amount=-1 +kerning first=87 second=71 amount=-1 +kerning first=71 second=197 amount=-1 +kerning first=275 second=324 amount=-1 +kerning first=218 second=90 amount=-1 +kerning first=90 second=298 amount=-1 +kerning first=1024 second=1040 amount=-1 +kerning first=192 second=71 amount=-1 +kerning first=344 second=97 amount=-1 +kerning first=108 second=263 amount=-1 +kerning first=286 second=365 amount=-1 +kerning first=212 second=197 amount=-2 +kerning first=250 second=365 amount=-1 +kerning first=209 second=268 amount=-1 +kerning first=240 second=120 amount=-1 +kerning first=1059 second=1104 amount=-2 +kerning first=315 second=356 amount=-1 +kerning first=284 second=197 amount=-1 +kerning first=109 second=365 amount=-1 +kerning first=344 second=353 amount=-1 +kerning first=268 second=70 amount=-1 +kerning first=356 second=197 amount=-3 +kerning first=371 second=243 amount=-1 +kerning first=73 second=365 amount=-1 +kerning first=8216 second=382 amount=-1 +kerning first=380 second=353 amount=-1 +kerning first=69 second=310 amount=-1 +kerning first=199 second=325 amount=-1 +kerning first=205 second=213 amount=-1 +kerning first=84 second=74 amount=-2 +kerning first=99 second=120 amount=-1 +kerning first=72 second=263 amount=-1 +kerning first=203 second=78 amount=-1 +kerning first=376 second=70 amount=-1 +kerning first=264 second=46 amount=-1 +kerning first=263 second=275 amount=-1 +kerning first=200 second=353 amount=-1 +kerning first=282 second=310 amount=-1 +kerning first=87 second=303 amount=-1 +kerning first=122 second=275 amount=-1 +kerning first=236 second=353 amount=-1 +kerning first=1047 second=1065 amount=-1 +kerning first=98 second=314 amount=-1 +kerning first=334 second=201 amount=-1 +kerning first=90 second=270 amount=-1 +kerning first=210 second=310 amount=-1 +kerning first=221 second=85 amount=-1 +kerning first=218 second=118 amount=-1 +kerning first=86 second=275 amount=-2 +kerning first=203 second=314 amount=-1 +kerning first=262 second=201 amount=-1 +kerning first=330 second=113 amount=-1 +kerning first=264 second=303 amount=-1 +kerning first=290 second=118 amount=-1 +kerning first=254 second=118 amount=-1 +kerning first=258 second=113 amount=-1 +kerning first=354 second=310 amount=-1 +kerning first=243 second=105 amount=-1 +kerning first=8250 second=252 amount=-1 +kerning first=206 second=283 amount=-1 +kerning first=82 second=248 amount=-1 +kerning first=213 second=8249 amount=-1 +kerning first=279 second=105 amount=-1 +kerning first=113 second=118 amount=-2 +kerning first=354 second=338 amount=-1 +kerning first=72 second=8249 amount=-2 +kerning first=260 second=275 amount=-1 +kerning first=77 second=118 amount=-1 +kerning first=108 second=8249 amount=-1 +kerning first=279 second=104 amount=-1 +kerning first=75 second=224 amount=-1 +kerning first=282 second=338 amount=-1 +kerning first=66 second=105 amount=-1 +kerning first=197 second=99 amount=-1 +kerning first=216 second=224 amount=-1 +kerning first=280 second=228 amount=-1 +kerning first=204 second=380 amount=-1 +kerning first=268 second=98 amount=-1 +kerning first=314 second=283 amount=-1 +kerning first=374 second=228 amount=-2 +kerning first=240 second=380 amount=-1 +kerning first=1069 second=1053 amount=-1 +kerning first=288 second=224 amount=-1 +kerning first=338 second=228 amount=-1 +kerning first=313 second=241 amount=-1 +kerning first=302 second=228 amount=-1 +kerning first=209 second=283 amount=-1 +kerning first=266 second=228 amount=-1 +kerning first=76 second=318 amount=-1 +kerning first=120 second=112 amount=-1 +kerning first=8218 second=307 amount=-1 +kerning first=230 second=228 amount=-1 +kerning first=112 second=318 amount=-1 +kerning first=84 second=112 amount=-1 +kerning first=99 second=380 amount=-1 +kerning first=379 second=325 amount=-1 +kerning first=321 second=8249 amount=-1 +kerning first=88 second=101 amount=-1 +kerning first=1025 second=1031 amount=-1 +kerning first=107 second=235 amount=-1 +kerning first=253 second=318 amount=-1 +kerning first=118 second=248 amount=-1 +kerning first=289 second=318 amount=-1 +kerning first=249 second=8249 amount=-1 +kerning first=193 second=101 amount=-1 +kerning first=264 second=331 amount=-1 +kerning first=219 second=193 amount=-2 +kerning first=82 second=365 amount=-1 +kerning first=346 second=256 amount=-2 +kerning first=1058 second=1072 amount=-1 +kerning first=334 second=205 amount=-1 +kerning first=1054 second=1047 amount=-1 +kerning first=376 second=66 amount=-1 +kerning first=338 second=230 amount=-1 +kerning first=378 second=255 amount=-1 +kerning first=82 second=216 amount=-1 +kerning first=274 second=256 amount=-1 +kerning first=374 second=230 amount=-2 +kerning first=66 second=107 amount=-1 +kerning first=225 second=98 amount=-1 +kerning first=8217 second=213 amount=-1 +kerning first=279 second=226 amount=-1 +kerning first=1062 second=1073 amount=-1 +kerning first=302 second=230 amount=-1 +kerning first=234 second=255 amount=-1 +kerning first=378 second=231 amount=-1 +kerning first=314 second=281 amount=-1 +kerning first=262 second=205 amount=-1 +kerning first=230 second=230 amount=-1 +kerning first=106 second=108 amount=-1 +kerning first=76 second=104 amount=-1 +kerning first=351 second=107 amount=-1 +kerning first=202 second=280 amount=-1 +kerning first=65 second=281 amount=-1 +kerning first=315 second=107 amount=-1 +kerning first=256 second=251 amount=-1 +kerning first=257 second=347 amount=-1 +kerning first=325 second=289 amount=-1 +kerning first=221 second=347 amount=-2 +kerning first=206 second=281 amount=-1 +kerning first=249 second=8221 amount=-2 +kerning first=346 second=280 amount=-1 +kerning first=279 second=107 amount=-1 +kerning first=315 second=105 amount=-1 +kerning first=80 second=347 amount=-1 +kerning first=243 second=107 amount=-1 +kerning first=213 second=8221 amount=-1 +kerning first=351 second=105 amount=-1 +kerning first=71 second=86 amount=-1 +kerning first=221 second=345 amount=-1 +kerning first=66 second=81 amount=-1 +kerning first=106 second=106 amount=-1 +kerning first=274 second=282 amount=-1 +kerning first=374 second=204 amount=-1 +kerning first=97 second=318 amount=-1 +kerning first=268 second=68 amount=-1 +kerning first=321 second=8221 amount=-2 +kerning first=378 second=229 amount=-1 +kerning first=381 second=196 amount=-1 +kerning first=202 second=282 amount=-1 +kerning first=264 second=67 amount=-2 +kerning first=73 second=333 amount=-1 +kerning first=376 second=68 amount=-1 +kerning first=283 second=106 amount=-1 +kerning first=192 second=67 amount=-1 +kerning first=207 second=81 amount=-1 +kerning first=334 second=203 amount=-1 +kerning first=315 second=81 amount=-1 +kerning first=211 second=106 amount=-1 +kerning first=211 second=368 amount=-1 +kerning first=84 second=346 amount=-2 +kerning first=89 second=230 amount=-2 +kerning first=89 second=204 amount=-1 +kerning first=1003 second=1007 amount=-1 +kerning first=8216 second=380 amount=-1 +kerning first=263 second=243 amount=-1 +kerning first=83 second=278 amount=-1 +kerning first=101 second=307 amount=-1 +kerning first=266 second=204 amount=-1 +kerning first=202 second=256 amount=-1 +kerning first=256 second=121 amount=-1 +kerning first=338 second=204 amount=-1 +kerning first=86 second=243 amount=-2 +kerning first=242 second=307 amount=-1 +kerning first=1047 second=1033 amount=-1 +kerning first=122 second=243 amount=-1 +kerning first=119 second=44 amount=-3 +kerning first=332 second=278 amount=-1 +kerning first=83 second=44 amount=-2 +kerning first=89 second=274 amount=-1 +kerning first=283 second=104 amount=-1 +kerning first=315 second=79 amount=-1 +kerning first=219 second=90 amount=-1 +kerning first=282 second=334 amount=-1 +kerning first=224 second=44 amount=-1 +kerning first=362 second=81 amount=-1 +kerning first=207 second=79 amount=-1 +kerning first=87 second=69 amount=-1 +kerning first=351 second=109 amount=-1 +kerning first=88 second=369 amount=-1 +kerning first=315 second=109 amount=-1 +kerning first=229 second=369 amount=-1 +kerning first=82 second=244 amount=-1 +kerning first=74 second=194 amount=-3 +kerning first=272 second=200 amount=-1 +kerning first=221 second=234 amount=-2 +kerning first=279 second=109 amount=-1 +kerning first=310 second=284 amount=-1 +kerning first=234 second=227 amount=-1 +kerning first=314 second=279 amount=-1 +kerning first=374 second=232 amount=-1 +kerning first=74 second=192 amount=-3 +kerning first=8217 second=211 amount=-1 +kerning first=252 second=8249 amount=-1 +kerning first=1048 second=1095 amount=-1 +kerning first=106 second=104 amount=-1 +kerning first=65 second=279 amount=-1 +kerning first=274 second=284 amount=-1 +kerning first=368 second=44 amount=-3 +kerning first=234 second=229 amount=-1 +kerning first=87 second=305 amount=-1 +kerning first=206 second=279 amount=-1 +kerning first=346 second=282 amount=-1 +kerning first=69 second=334 amount=-1 +kerning first=332 second=44 amount=-1 +kerning first=378 second=227 amount=-1 +kerning first=66 second=109 amount=-1 +kerning first=214 second=65 amount=-2 +kerning first=194 second=232 amount=-1 +kerning first=286 second=65 amount=-1 +kerning first=302 second=232 amount=-1 +kerning first=109 second=361 amount=-1 +kerning first=198 second=257 amount=-1 +kerning first=264 second=305 amount=-1 +kerning first=76 second=331 amount=-1 +kerning first=266 second=232 amount=-1 +kerning first=73 second=361 amount=-1 +kerning first=234 second=257 amount=-1 +kerning first=382 second=254 amount=-1 +kerning first=112 second=8250 amount=-1 +kerning first=286 second=361 amount=-1 +kerning first=89 second=232 amount=-1 +kerning first=250 second=361 amount=-1 +kerning first=89 second=202 amount=-1 +kerning first=365 second=347 amount=-1 +kerning first=118 second=244 amount=-1 +kerning first=380 second=121 amount=-1 +kerning first=344 second=121 amount=-1 +kerning first=338 second=202 amount=-1 +kerning first=274 second=254 amount=-1 +kerning first=310 second=254 amount=-1 +kerning first=221 second=325 amount=-1 +kerning first=266 second=202 amount=-1 +kerning first=346 second=254 amount=-1 +kerning first=8216 second=378 amount=-1 +kerning first=236 second=121 amount=-1 +kerning first=336 second=69 amount=-1 +kerning first=268 second=66 amount=-1 +kerning first=203 second=82 amount=-1 +kerning first=97 second=254 amount=-1 +kerning first=1098 second=1099 amount=-1 +kerning first=72 second=267 amount=-1 +kerning first=374 second=202 amount=-1 +kerning first=264 second=69 amount=-1 +kerning first=108 second=267 amount=-1 +kerning first=378 second=257 amount=-1 +kerning first=202 second=254 amount=-1 +kerning first=302 second=212 amount=-1 +kerning first=8222 second=357 amount=-1 +kerning first=370 second=199 amount=-1 +kerning first=338 second=212 amount=-1 +kerning first=79 second=8217 amount=-1 +kerning first=69 second=66 amount=-1 +kerning first=381 second=202 amount=-1 +kerning first=115 second=8217 amount=-1 +kerning first=73 second=79 amount=-1 +kerning first=266 second=212 amount=-2 +kerning first=196 second=99 amount=-1 +kerning first=196 second=332 amount=-1 +kerning first=84 second=82 amount=-1 +kerning first=221 second=69 amount=-1 +kerning first=1113 second=1119 amount=-1 +kerning first=282 second=66 amount=-1 +kerning first=194 second=212 amount=-1 +kerning first=76 second=316 amount=-1 +kerning first=80 second=69 amount=-1 +kerning first=268 second=332 amount=-2 +kerning first=307 second=225 amount=-1 +kerning first=89 second=212 amount=-1 +kerning first=356 second=205 amount=-1 +kerning first=304 second=332 amount=-1 +kerning first=352 second=192 amount=-2 +kerning first=332 second=82 amount=-1 +kerning first=203 second=76 amount=-1 +kerning first=85 second=199 amount=-1 +kerning first=268 second=72 amount=-1 +kerning first=201 second=216 amount=-1 +kerning first=8217 second=102 amount=-1 +kerning first=376 second=332 amount=-1 +kerning first=354 second=66 amount=-1 +kerning first=212 second=205 amount=-1 +kerning first=208 second=192 amount=-2 +kerning first=205 second=229 amount=-1 +kerning first=256 second=8217 amount=-3 +kerning first=262 second=199 amount=-2 +kerning first=284 second=205 amount=-1 +kerning first=374 second=212 amount=-1 +kerning first=298 second=199 amount=-1 +kerning first=376 second=72 amount=-1 +kerning first=209 second=242 amount=-1 +kerning first=194 second=235 amount=-1 +kerning first=381 second=216 amount=-1 +kerning first=354 second=326 amount=-1 +kerning first=230 second=226 amount=-1 +kerning first=266 second=226 amount=-1 +kerning first=268 second=86 amount=-1 +kerning first=302 second=226 amount=-1 +kerning first=71 second=205 amount=-1 +kerning first=207 second=380 amount=-1 +kerning first=338 second=226 amount=-1 +kerning first=45 second=119 amount=-2 +kerning first=263 second=8221 amount=-1 +kerning first=374 second=226 amount=-2 +kerning first=356 second=219 amount=-1 +kerning first=8220 second=198 amount=-4 +kerning first=282 second=326 amount=-1 +kerning first=117 second=119 amount=-1 +kerning first=284 second=219 amount=-1 +kerning first=336 second=45 amount=-1 +kerning first=66 second=103 amount=-2 +kerning first=69 second=326 amount=-1 +kerning first=258 second=119 amount=-2 +kerning first=212 second=219 amount=-1 +kerning first=201 second=202 amount=-1 +kerning first=105 second=326 amount=-1 +kerning first=289 second=316 amount=-1 +kerning first=66 second=305 amount=-1 +kerning first=330 second=119 amount=-1 +kerning first=371 second=8221 amount=-2 +kerning first=366 second=119 amount=-1 +kerning first=71 second=219 amount=-1 +kerning first=196 second=86 amount=-3 +kerning first=87 second=333 amount=-2 +kerning first=89 second=226 amount=-2 +kerning first=8218 second=291 amount=-1 +kerning first=192 second=333 amount=-1 +kerning first=1037 second=1092 amount=-1 +kerning first=84 second=365 amount=-1 +kerning first=108 second=269 amount=-1 +kerning first=72 second=269 amount=-1 +kerning first=337 second=375 amount=-1 +kerning first=355 second=122 amount=-1 +kerning first=87 second=45 amount=-3 +kerning first=66 second=363 amount=-1 +kerning first=66 second=369 amount=-1 +kerning first=70 second=382 amount=-1 +kerning first=315 second=103 amount=-1 +kerning first=106 second=382 amount=-1 +kerning first=1040 second=1063 amount=-3 +kerning first=192 second=45 amount=-2 +kerning first=252 second=252 amount=-1 +kerning first=243 second=103 amount=-1 +kerning first=207 second=363 amount=-1 +kerning first=115 second=259 amount=-1 +kerning first=1098 second=1075 amount=-1 +kerning first=234 second=253 amount=-1 +kerning first=1037 second=1086 amount=-1 +kerning first=264 second=45 amount=-2 +kerning first=283 second=116 amount=-1 +kerning first=324 second=252 amount=-1 +kerning first=228 second=45 amount=-1 +kerning first=279 second=363 amount=-1 +kerning first=220 second=259 amount=-2 +kerning first=8217 second=235 amount=-2 +kerning first=106 second=122 amount=-1 +kerning first=75 second=246 amount=-1 +kerning first=315 second=363 amount=-1 +kerning first=315 second=369 amount=-1 +kerning first=274 second=266 amount=-1 +kerning first=70 second=122 amount=-1 +kerning first=351 second=363 amount=-1 +kerning first=279 second=369 amount=-1 +kerning first=355 second=382 amount=-1 +kerning first=310 second=266 amount=-1 +kerning first=376 second=378 amount=-2 +kerning first=202 second=266 amount=-1 +kerning first=351 second=369 amount=-1 +kerning first=283 second=122 amount=-1 +kerning first=229 second=375 amount=-1 +kerning first=211 second=382 amount=-1 +kerning first=193 second=375 amount=-1 +kerning first=211 second=122 amount=-1 +kerning first=370 second=352 amount=-1 +kerning first=207 second=369 amount=-1 +kerning first=283 second=382 amount=-1 +kerning first=88 second=375 amount=-2 +kerning first=68 second=206 amount=-1 +kerning first=193 second=115 amount=-1 +kerning first=256 second=279 amount=-1 +kerning first=66 second=355 amount=-1 +kerning first=203 second=336 amount=-1 +kerning first=229 second=115 amount=-1 +kerning first=364 second=279 amount=-1 +kerning first=198 second=350 amount=-1 +kerning first=88 second=115 amount=-1 +kerning first=8222 second=318 amount=-1 +kerning first=279 second=355 amount=-1 +kerning first=337 second=115 amount=-1 +kerning first=76 second=296 amount=-1 +kerning first=220 second=279 amount=-1 +kerning first=378 second=253 amount=-1 +kerning first=351 second=355 amount=-1 +kerning first=106 second=116 amount=-1 +kerning first=283 second=108 amount=-1 +kerning first=89 second=206 amount=-1 +kerning first=302 second=71 amount=-1 +kerning first=84 second=370 amount=-1 +kerning first=45 second=89 amount=-2 +kerning first=75 second=232 amount=-1 +kerning first=266 second=206 amount=-1 +kerning first=87 second=325 amount=-1 +kerning first=235 second=303 amount=-1 +kerning first=275 second=328 amount=-1 +kerning first=87 second=313 amount=-1 +kerning first=338 second=206 amount=-1 +kerning first=203 second=328 amount=-1 +kerning first=214 second=73 amount=-1 +kerning first=282 second=104 amount=-1 +kerning first=71 second=225 amount=-1 +kerning first=199 second=303 amount=-1 +kerning first=113 second=98 amount=-1 +kerning first=199 second=352 amount=-1 +kerning first=379 second=315 amount=-1 +kerning first=264 second=325 amount=-1 +kerning first=379 second=303 amount=-1 +kerning first=374 second=206 amount=-1 +kerning first=195 second=290 amount=-1 +kerning first=66 second=83 amount=-2 +kerning first=336 second=325 amount=-1 +kerning first=307 second=303 amount=-1 +kerning first=1025 second=1025 amount=-1 +kerning first=347 second=328 amount=-1 +kerning first=313 second=221 amount=-1 +kerning first=284 second=225 amount=-1 +kerning first=207 second=83 amount=-1 +kerning first=80 second=323 amount=-1 +kerning first=376 second=338 amount=-1 +kerning first=356 second=225 amount=-2 +kerning first=201 second=196 amount=-1 +kerning first=90 second=290 amount=-1 +kerning first=315 second=83 amount=-1 +kerning first=107 second=225 amount=-1 +kerning first=368 second=286 amount=-1 +kerning first=268 second=338 amount=-2 +kerning first=286 second=85 amount=-1 +kerning first=218 second=380 amount=-1 +kerning first=258 second=263 amount=-1 +kerning first=212 second=225 amount=-1 +kerning first=296 second=286 amount=-1 +kerning first=254 second=380 amount=-1 +kerning first=326 second=98 amount=-1 +kerning first=214 second=85 amount=-1 +kerning first=221 second=8250 amount=-1 +kerning first=290 second=380 amount=-1 +kerning first=246 second=46 amount=-2 +kerning first=264 second=311 amount=-1 +kerning first=221 second=77 amount=-1 +kerning first=282 second=46 amount=-1 +kerning first=8220 second=192 amount=-4 +kerning first=260 second=286 amount=-1 +kerning first=199 second=317 amount=-1 +kerning first=192 second=311 amount=-1 +kerning first=354 second=46 amount=-3 +kerning first=244 second=314 amount=-1 +kerning first=80 second=77 amount=-1 +kerning first=201 second=210 amount=-1 +kerning first=69 second=46 amount=-1 +kerning first=84 second=102 amount=-1 +kerning first=73 second=71 amount=-1 +kerning first=105 second=46 amount=-1 +kerning first=210 second=46 amount=-1 +kerning first=196 second=352 amount=-2 +kerning first=326 second=112 amount=-1 +kerning first=356 second=211 amount=-1 +kerning first=75 second=252 amount=-1 +kerning first=208 second=200 amount=-1 +kerning first=378 second=233 amount=-1 +kerning first=254 second=112 amount=-1 +kerning first=106 second=110 amount=-1 +kerning first=208 second=46 amount=-1 +kerning first=218 second=112 amount=-1 +kerning first=205 second=235 amount=-1 +kerning first=369 second=102 amount=-1 +kerning first=352 second=200 amount=-1 +kerning first=77 second=112 amount=-1 +kerning first=1044 second=1090 amount=-1 +kerning first=283 second=110 amount=-1 +kerning first=280 second=200 amount=-1 +kerning first=218 second=378 amount=-1 +kerning first=104 second=250 amount=-1 +kerning first=317 second=262 amount=-1 +kerning first=72 second=275 amount=-1 +kerning first=250 second=353 amount=-1 +kerning first=209 second=250 amount=-1 +kerning first=108 second=275 amount=-1 +kerning first=380 second=113 amount=-1 +kerning first=99 second=171 amount=-1 +kerning first=380 second=365 amount=-1 +kerning first=362 second=100 amount=-1 +kerning first=344 second=113 amount=-1 +kerning first=344 second=365 amount=-1 +kerning first=290 second=366 amount=-1 +kerning first=200 second=251 amount=-1 +kerning first=113 second=378 amount=-1 +kerning first=73 second=353 amount=-1 +kerning first=362 second=112 amount=-1 +kerning first=77 second=378 amount=-1 +kerning first=109 second=353 amount=-1 +kerning first=286 second=87 amount=-1 +kerning first=195 second=288 amount=-1 +kerning first=263 second=249 amount=-1 +kerning first=274 second=260 amount=-1 +kerning first=304 second=352 amount=-1 +kerning first=218 second=100 amount=-1 +kerning first=268 second=352 amount=-1 +kerning first=1065 second=1054 amount=-1 +kerning first=220 second=228 amount=-1 +kerning first=214 second=87 amount=-1 +kerning first=346 second=260 amount=-2 +kerning first=376 second=352 amount=-2 +kerning first=196 second=354 amount=-3 +kerning first=1069 second=1065 amount=-1 +kerning first=362 second=378 amount=-1 +kerning first=268 second=354 amount=-1 +kerning first=77 second=100 amount=-1 +kerning first=90 second=288 amount=-1 +kerning first=113 second=100 amount=-1 +kerning first=381 second=210 amount=-1 +kerning first=209 second=262 amount=-1 +kerning first=371 second=249 amount=-1 +kerning first=1055 second=1105 amount=-1 +kerning first=72 second=289 amount=-1 +kerning first=344 second=99 amount=-1 +kerning first=1091 second=1105 amount=-1 +kerning first=290 second=364 amount=-1 +kerning first=362 second=114 amount=-1 +kerning first=208 second=198 amount=-2 +kerning first=213 second=289 amount=-1 +kerning first=313 second=223 amount=-1 +kerning first=113 second=380 amount=-1 +kerning first=380 second=99 amount=-1 +kerning first=1054 second=1053 amount=-1 +kerning first=87 second=327 amount=-1 +kerning first=86 second=249 amount=-1 +kerning first=209 second=248 amount=-1 +kerning first=90 second=274 amount=-1 +kerning first=353 second=8220 amount=-1 +kerning first=218 second=114 amount=-1 +kerning first=371 second=263 amount=-1 +kerning first=101 second=328 amount=-1 +kerning first=317 second=8220 amount=-2 +kerning first=67 second=198 amount=-2 +kerning first=281 second=8220 amount=-1 +kerning first=113 second=114 amount=-1 +kerning first=122 second=263 amount=-1 +kerning first=236 second=365 amount=-1 +kerning first=264 second=327 amount=-1 +kerning first=65 second=287 amount=-1 +kerning first=245 second=8220 amount=-1 +kerning first=314 second=253 amount=-1 +kerning first=200 second=365 amount=-1 +kerning first=336 second=327 amount=-1 +kerning first=1091 second=1078 amount=-1 +kerning first=263 second=263 amount=-1 +kerning first=200 second=379 amount=-1 +kerning first=101 second=287 amount=-1 +kerning first=336 second=313 amount=-1 +kerning first=104 second=8220 amount=-2 +kerning first=280 second=198 amount=-1 +kerning first=221 second=75 amount=-1 +kerning first=242 second=287 amount=-1 +kerning first=68 second=8220 amount=-1 +kerning first=286 second=73 amount=-1 +kerning first=272 second=379 amount=-1 +kerning first=206 second=287 amount=-1 +kerning first=202 second=259 amount=-1 +kerning first=313 second=237 amount=-1 +kerning first=264 second=313 amount=-1 +kerning first=352 second=198 amount=-2 +kerning first=314 second=287 amount=-1 +kerning first=277 second=237 amount=-1 +kerning first=80 second=75 amount=-1 +kerning first=86 second=263 amount=-2 +kerning first=73 second=339 amount=-1 +kerning first=278 second=287 amount=-1 +kerning first=289 second=44 amount=-2 +kerning first=8222 second=316 amount=-1 +kerning first=118 second=234 amount=-1 +kerning first=253 second=44 amount=-3 +kerning first=113 second=104 amount=-1 +kerning first=350 second=287 amount=-1 +kerning first=361 second=44 amount=-1 +kerning first=1098 second=1091 amount=-1 +kerning first=234 second=237 amount=-1 +kerning first=195 second=284 amount=-1 +kerning first=75 second=244 amount=-1 +kerning first=112 second=44 amount=-2 +kerning first=219 second=197 amount=-2 +kerning first=354 second=324 amount=-1 +kerning first=217 second=44 amount=-3 +kerning first=254 second=104 amount=-1 +kerning first=82 second=234 amount=-1 +kerning first=192 second=332 amount=-1 +kerning first=369 second=115 amount=-1 +kerning first=208 second=194 amount=-2 +kerning first=205 second=227 amount=-1 +kerning first=109 second=351 amount=-1 +kerning first=202 second=368 amount=-1 +kerning first=266 second=46 amount=-1 +kerning first=73 second=351 amount=-1 +kerning first=1058 second=1054 amount=-1 +kerning first=108 second=277 amount=-1 +kerning first=69 second=314 amount=-1 +kerning first=67 second=194 amount=-2 +kerning first=315 second=87 amount=-1 +kerning first=72 second=277 amount=-1 +kerning first=250 second=8249 amount=-1 +kerning first=277 second=227 amount=-1 +kerning first=1030 second=1104 amount=-1 +kerning first=105 second=314 amount=-1 +kerning first=268 second=74 amount=-1 +kerning first=314 second=8249 amount=-1 +kerning first=229 second=121 amount=-1 +kerning first=207 second=361 amount=-1 +kerning first=220 second=267 amount=-1 +kerning first=80 second=327 amount=-1 +kerning first=371 second=257 amount=-1 +kerning first=344 second=367 amount=-1 +kerning first=350 second=8249 amount=-1 +kerning first=193 second=121 amount=-1 +kerning first=220 second=90 amount=-1 +kerning first=256 second=267 amount=-1 +kerning first=380 second=367 amount=-1 +kerning first=84 second=364 amount=-1 +kerning first=376 second=74 amount=-2 +kerning first=278 second=8249 amount=-1 +kerning first=88 second=121 amount=-2 +kerning first=221 second=327 amount=-1 +kerning first=86 second=261 amount=-2 +kerning first=351 second=361 amount=-1 +kerning first=364 second=267 amount=-1 +kerning first=200 second=367 amount=-1 +kerning first=206 second=8249 amount=-2 +kerning first=315 second=361 amount=-1 +kerning first=263 second=257 amount=-1 +kerning first=236 second=367 amount=-1 +kerning first=344 second=111 amount=-1 +kerning first=317 second=254 amount=-1 +kerning first=118 second=224 amount=-1 +kerning first=380 second=111 amount=-1 +kerning first=353 second=254 amount=-1 +kerning first=250 second=351 amount=-1 +kerning first=82 second=224 amount=-1 +kerning first=1093 second=1086 amount=-1 +kerning first=1047 second=1051 amount=-1 +kerning first=290 second=374 amount=-1 +kerning first=104 second=254 amount=-1 +kerning first=187 second=224 amount=-1 +kerning first=371 second=261 amount=-1 +kerning first=195 second=338 amount=-1 +kerning first=268 second=344 amount=-1 +kerning first=281 second=250 amount=-1 +kerning first=1040 second=1057 amount=-2 +kerning first=337 second=121 amount=-1 +kerning first=90 second=284 amount=-1 +kerning first=369 second=249 amount=-1 +kerning first=1031 second=1072 amount=-1 +kerning first=274 second=274 amount=-1 +kerning first=1054 second=1031 amount=-1 +kerning first=353 second=250 amount=-1 +kerning first=66 second=361 amount=-1 +kerning first=376 second=344 amount=-1 +kerning first=225 second=347 amount=-1 +kerning first=202 second=274 amount=-1 +kerning first=317 second=250 amount=-1 +kerning first=1003 second=997 amount=-1 +kerning first=284 second=221 amount=-1 +kerning first=1047 second=1041 amount=-1 +kerning first=351 second=97 amount=-1 +kerning first=221 second=337 amount=-2 +kerning first=296 second=290 amount=-1 +kerning first=212 second=221 amount=-1 +kerning first=88 second=117 amount=-1 +kerning first=344 second=101 amount=-1 +kerning first=201 second=200 amount=-1 +kerning first=221 second=331 amount=-1 +kerning first=370 second=255 amount=-1 +kerning first=229 second=117 amount=-1 +kerning first=380 second=101 amount=-1 +kerning first=368 second=290 amount=-1 +kerning first=193 second=117 amount=-1 +kerning first=1098 second=1087 amount=-1 +kerning first=261 second=98 amount=-1 +kerning first=1054 second=1037 amount=-1 +kerning first=374 second=214 amount=-1 +kerning first=75 second=240 amount=-1 +kerning first=8217 second=229 amount=-3 +kerning first=369 second=98 amount=-1 +kerning first=122 second=251 amount=-1 +kerning first=203 second=338 amount=-1 +kerning first=260 second=290 amount=-1 +kerning first=86 second=251 amount=-1 +kerning first=120 second=98 amount=-1 +kerning first=66 second=196 amount=-3 +kerning first=266 second=214 amount=-2 +kerning first=227 second=251 amount=-1 +kerning first=310 second=264 amount=-1 +kerning first=355 second=380 amount=-1 +kerning first=274 second=264 amount=-1 +kerning first=375 second=273 amount=-1 +kerning first=338 second=214 amount=-1 +kerning first=1069 second=1067 amount=-1 +kerning first=302 second=214 amount=-1 +kerning first=263 second=251 amount=-1 +kerning first=202 second=264 amount=-1 +kerning first=272 second=68 amount=-1 +kerning first=89 second=214 amount=-1 +kerning first=264 second=317 amount=-1 +kerning first=371 second=251 amount=-1 +kerning first=89 second=220 amount=-1 +kerning first=286 second=77 amount=-1 +kerning first=194 second=231 amount=-1 +kerning first=221 second=71 amount=-1 +kerning first=70 second=210 amount=-1 +kerning first=194 second=214 amount=-1 +kerning first=336 second=317 amount=-1 +kerning first=332 second=298 amount=-1 +kerning first=214 second=77 amount=-1 +kerning first=352 second=194 amount=-2 +kerning first=87 second=317 amount=-1 +kerning first=266 second=220 amount=-1 +kerning first=280 second=194 amount=-1 +kerning first=1056 second=1059 amount=-1 +kerning first=194 second=220 amount=-2 +kerning first=350 second=291 amount=-1 +kerning first=203 second=330 amount=-1 +kerning first=268 second=84 amount=-1 +kerning first=66 second=97 amount=-1 +kerning first=381 second=200 amount=-1 +kerning first=314 second=291 amount=-1 +kerning first=102 second=97 amount=-1 +kerning first=278 second=291 amount=-1 +kerning first=1069 second=1103 amount=-1 +kerning first=242 second=291 amount=-1 +kerning first=338 second=220 amount=-1 +kerning first=307 second=311 amount=-1 +kerning first=1098 second=1081 amount=-1 +kerning first=206 second=291 amount=-1 +kerning first=282 second=324 amount=-1 +kerning first=374 second=220 amount=-1 +kerning first=69 second=324 amount=-1 +kerning first=83 second=298 amount=-1 +kerning first=279 second=97 amount=-1 +kerning first=235 second=311 amount=-1 +kerning first=101 second=291 amount=-1 +kerning first=199 second=311 amount=-1 +kerning first=65 second=291 amount=-1 +kerning first=80 second=337 amount=-1 +kerning first=207 second=97 amount=-1 +kerning first=356 second=213 amount=-1 +kerning first=105 second=324 amount=-1 +kerning first=236 second=375 amount=-1 +kerning first=118 second=228 amount=-1 +kerning first=334 second=193 amount=-2 +kerning first=227 second=253 amount=-1 +kerning first=266 second=218 amount=-1 +kerning first=82 second=228 amount=-1 +kerning first=378 second=243 amount=-1 +kerning first=70 second=120 amount=-1 +kerning first=263 second=253 amount=-1 +kerning first=262 second=193 amount=-2 +kerning first=106 second=120 amount=-1 +kerning first=194 second=218 amount=-2 +kerning first=376 second=78 amount=-1 +kerning first=335 second=253 amount=-1 +kerning first=380 second=375 amount=-1 +kerning first=1098 second=1085 amount=-1 +kerning first=380 second=103 amount=-1 +kerning first=8250 second=260 amount=-2 +kerning first=371 second=253 amount=-1 +kerning first=344 second=375 amount=-1 +kerning first=370 second=193 amount=-2 +kerning first=344 second=103 amount=-1 +kerning first=310 second=268 amount=-1 +kerning first=374 second=218 amount=-1 +kerning first=8217 second=225 amount=-3 +kerning first=338 second=218 amount=-1 +kerning first=1047 second=1045 amount=-1 +kerning first=268 second=78 amount=-1 +kerning first=1055 second=1095 amount=-1 +kerning first=355 second=120 amount=-1 +kerning first=370 second=253 amount=-1 +kerning first=76 second=310 amount=-1 +kerning first=1047 second=1043 amount=-1 +kerning first=355 second=118 amount=-1 +kerning first=211 second=120 amount=-1 +kerning first=89 second=218 amount=-1 +kerning first=350 second=45 amount=-1 +kerning first=86 second=253 amount=-1 +kerning first=283 second=120 amount=-1 +kerning first=122 second=253 amount=-1 +kerning first=80 second=65 amount=-2 +kerning first=202 second=270 amount=-1 +kerning first=283 second=118 amount=-1 +kerning first=1054 second=1051 amount=-1 +kerning first=221 second=65 amount=-3 +kerning first=274 second=270 amount=-1 +kerning first=90 second=280 amount=-1 +kerning first=236 second=105 amount=-1 +kerning first=199 second=305 amount=-1 +kerning first=378 second=241 amount=-1 +kerning first=109 second=251 amount=-1 +kerning first=8217 second=227 amount=-3 +kerning first=83 second=8250 amount=-1 +kerning first=1030 second=1108 amount=-1 +kerning first=69 second=318 amount=-1 +kerning first=106 second=118 amount=-1 +kerning first=105 second=318 amount=-1 +kerning first=108 second=283 amount=-1 +kerning first=70 second=118 amount=-1 +kerning first=235 second=305 amount=-1 +kerning first=72 second=283 amount=-1 +kerning first=221 second=335 amount=-2 +kerning first=234 second=241 amount=-1 +kerning first=307 second=305 amount=-1 +kerning first=198 second=241 amount=-1 +kerning first=8218 second=287 amount=-1 +kerning first=380 second=291 amount=-1 +kerning first=8217 second=100 amount=-2 +kerning first=8217 second=223 amount=-1 +kerning first=379 second=305 amount=-1 +kerning first=113 second=108 amount=-1 +kerning first=254 second=108 amount=-1 +kerning first=346 second=270 amount=-1 +kerning first=80 second=335 amount=-1 +kerning first=67 second=200 amount=-1 +kerning first=326 second=108 amount=-1 +kerning first=85 second=193 amount=-2 +kerning first=290 second=370 amount=-1 +kerning first=8216 second=232 amount=-1 +kerning first=205 second=231 amount=-1 +kerning first=109 second=347 amount=-1 +kerning first=73 second=347 amount=-1 +kerning first=236 second=107 amount=-1 +kerning first=268 second=82 amount=-1 +kerning first=68 second=256 amount=-2 +kerning first=83 second=122 amount=-1 +kerning first=200 second=107 amount=-1 +kerning first=72 second=281 amount=-1 +kerning first=108 second=281 amount=-1 +kerning first=317 second=256 amount=-1 +kerning first=371 second=255 amount=-1 +kerning first=315 second=364 amount=-1 +kerning first=1051 second=1072 amount=-1 +kerning first=367 second=230 amount=-1 +kerning first=335 second=255 amount=-1 +kerning first=221 second=67 amount=-1 +kerning first=203 second=332 amount=-1 +kerning first=266 second=216 amount=-2 +kerning first=263 second=255 amount=-1 +kerning first=302 second=216 amount=-1 +kerning first=227 second=255 amount=-1 +kerning first=227 second=353 amount=-1 +kerning first=310 second=346 amount=-1 +kerning first=338 second=216 amount=-1 +kerning first=380 second=371 amount=-1 +kerning first=122 second=255 amount=-1 +kerning first=89 second=216 amount=-1 +kerning first=86 second=255 amount=-1 +kerning first=8222 second=314 amount=-1 +kerning first=250 second=347 amount=-1 +kerning first=75 second=242 amount=-1 +kerning first=262 second=378 amount=-1 +kerning first=194 second=216 amount=-1 +kerning first=236 second=371 amount=-1 +kerning first=344 second=107 amount=-1 +kerning first=67 second=192 amount=-2 +kerning first=80 second=333 amount=-1 +kerning first=212 second=217 amount=-1 +kerning first=221 second=333 amount=-2 +kerning first=1054 second=1033 amount=-1 +kerning first=376 second=80 amount=-1 +kerning first=277 second=229 amount=-1 +kerning first=73 second=81 amount=-1 +kerning first=113 second=106 amount=2 +kerning first=284 second=217 amount=-1 +kerning first=374 second=216 amount=-1 +kerning first=70 second=212 amount=-1 +kerning first=381 second=204 amount=-1 +kerning first=356 second=217 amount=-1 +kerning first=268 second=80 amount=-1 +kerning first=203 second=68 amount=-1 +kerning first=290 second=106 amount=-1 +kerning first=88 second=119 amount=-1 +kerning first=90 second=282 amount=-1 +kerning first=326 second=106 amount=-1 +kerning first=196 second=346 amount=-2 +kerning first=187 second=230 amount=-1 +kerning first=193 second=119 amount=-2 +kerning first=235 second=307 amount=-1 +kerning first=254 second=106 amount=-1 +kerning first=229 second=119 amount=-1 +kerning first=8218 second=289 amount=-1 +kerning first=307 second=307 amount=-1 +kerning first=118 second=230 amount=-2 +kerning first=337 second=119 amount=-1 +kerning first=304 second=346 amount=-1 +kerning first=201 second=204 amount=-1 +kerning first=71 second=217 amount=-1 +kerning first=268 second=346 amount=-1 diff --git a/jme3-examples/src/main/resources/jme3test/font/FreeSerif321.png b/jme3-examples/src/main/resources/jme3test/font/FreeSerif321.png new file mode 100644 index 000000000..f516ba320 Binary files /dev/null and b/jme3-examples/src/main/resources/jme3test/font/FreeSerif321.png differ diff --git a/jme3-examples/src/main/resources/jme3test/font/FreeSerif322.png b/jme3-examples/src/main/resources/jme3test/font/FreeSerif322.png new file mode 100644 index 000000000..c9cb692d8 Binary files /dev/null and b/jme3-examples/src/main/resources/jme3test/font/FreeSerif322.png differ diff --git a/jme3-examples/src/main/resources/jme3test/font/FreeSerif64I.fnt b/jme3-examples/src/main/resources/jme3test/font/FreeSerif64I.fnt new file mode 100644 index 000000000..cddcf233f --- /dev/null +++ b/jme3-examples/src/main/resources/jme3test/font/FreeSerif64I.fnt @@ -0,0 +1,27837 @@ +info face="Free Serif" size=64 bold=0 italic=1 charset="" unicode=0 stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=-2,-2 +common lineHeight=82 base=61 scaleW=1024 scaleH=1024 pages=2 packed=0 +page id=0 file="FreeSerif64I1.png" +page id=1 file="FreeSerif64I2.png" +chars count=821 +char id=13 x=0 y=0 width=0 height=0 xoffset=0 yoffset=0 xadvance=-2 page=0 chnl=0 +char id=32 x=0 y=0 width=0 height=0 xoffset=0 yoffset=0 xadvance=14 page=0 chnl=0 +char id=33 x=1006 y=580 width=15 height=45 xoffset=8 yoffset=17 xadvance=19 page=0 chnl=0 +char id=36 x=741 y=473 width=33 height=53 xoffset=3 yoffset=14 xadvance=30 page=0 chnl=0 +char id=37 x=334 y=632 width=45 height=45 xoffset=8 yoffset=17 xadvance=51 page=0 chnl=0 +char id=38 x=379 y=632 width=47 height=45 xoffset=4 yoffset=17 xadvance=48 page=0 chnl=0 +char id=39 x=1013 y=903 width=10 height=17 xoffset=9 yoffset=17 xadvance=10 page=0 chnl=0 +char id=40 x=243 y=307 width=27 height=56 xoffset=5 yoffset=17 xadvance=19 page=0 chnl=0 +char id=41 x=270 y=307 width=23 height=56 xoffset=-1 yoffset=17 xadvance=19 page=0 chnl=0 +char id=44 x=1013 y=679 width=10 height=16 xoffset=3 yoffset=54 xadvance=14 page=0 chnl=0 +char id=46 x=1012 y=473 width=9 height=8 xoffset=4 yoffset=54 xadvance=14 page=0 chnl=0 +char id=47 x=426 y=632 width=34 height=45 xoffset=-1 yoffset=17 xadvance=16 page=0 chnl=0 +char id=48 x=460 y=632 width=34 height=45 xoffset=4 yoffset=17 xadvance=30 page=0 chnl=0 +char id=49 x=702 y=814 width=20 height=44 xoffset=7 yoffset=17 xadvance=30 page=0 chnl=0 +char id=50 x=722 y=814 width=33 height=44 xoffset=1 yoffset=17 xadvance=30 page=0 chnl=0 +char id=51 x=494 y=632 width=29 height=45 xoffset=3 yoffset=17 xadvance=30 page=0 chnl=0 +char id=52 x=755 y=814 width=31 height=44 xoffset=2 yoffset=17 xadvance=30 page=0 chnl=0 +char id=53 x=106 y=632 width=37 height=46 xoffset=2 yoffset=16 xadvance=30 page=0 chnl=0 +char id=54 x=523 y=632 width=37 height=45 xoffset=4 yoffset=17 xadvance=30 page=0 chnl=0 +char id=55 x=786 y=814 width=34 height=44 xoffset=7 yoffset=18 xadvance=30 page=0 chnl=0 +char id=56 x=560 y=632 width=30 height=45 xoffset=5 yoffset=17 xadvance=30 page=0 chnl=0 +char id=57 x=143 y=632 width=35 height=46 xoffset=3 yoffset=17 xadvance=30 page=0 chnl=0 +char id=58 x=191 y=991 width=13 height=31 xoffset=5 yoffset=31 xadvance=16 page=0 chnl=0 +char id=59 x=1009 y=632 width=13 height=39 xoffset=5 yoffset=31 xadvance=16 page=0 chnl=0 +char id=63 x=590 y=632 width=28 height=45 xoffset=10 yoffset=17 xadvance=26 page=0 chnl=0 +char id=64 x=618 y=632 width=47 height=45 xoffset=10 yoffset=17 xadvance=57 page=0 chnl=0 +char id=65 x=820 y=814 width=46 height=44 xoffset=0 yoffset=17 xadvance=44 page=0 chnl=0 +char id=67 x=665 y=632 width=46 height=45 xoffset=4 yoffset=17 xadvance=41 page=0 chnl=0 +char id=71 x=711 y=632 width=48 height=45 xoffset=5 yoffset=17 xadvance=44 page=0 chnl=0 +char id=74 x=866 y=814 width=37 height=44 xoffset=1 yoffset=18 xadvance=23 page=0 chnl=0 +char id=78 x=903 y=814 width=59 height=44 xoffset=0 yoffset=18 xadvance=44 page=0 chnl=0 +char id=79 x=759 y=632 width=47 height=45 xoffset=5 yoffset=17 xadvance=44 page=0 chnl=0 +char id=81 x=293 y=307 width=47 height=56 xoffset=5 yoffset=17 xadvance=44 page=0 chnl=0 +char id=83 x=806 y=632 width=33 height=45 xoffset=4 yoffset=17 xadvance=34 page=0 chnl=0 +char id=85 x=962 y=814 width=51 height=44 xoffset=8 yoffset=18 xadvance=44 page=0 chnl=0 +char id=86 x=0 y=859 width=50 height=44 xoffset=8 yoffset=18 xadvance=44 page=0 chnl=0 +char id=87 x=50 y=859 width=68 height=44 xoffset=7 yoffset=18 xadvance=58 page=0 chnl=0 +char id=91 x=774 y=473 width=29 height=53 xoffset=3 yoffset=18 xadvance=19 page=0 chnl=0 +char id=92 x=1008 y=134 width=12 height=45 xoffset=7 yoffset=17 xadvance=17 page=0 chnl=0 +char id=93 x=803 y=473 width=24 height=53 xoffset=0 yoffset=19 xadvance=19 page=0 chnl=0 +char id=97 x=204 y=991 width=28 height=31 xoffset=3 yoffset=31 xadvance=26 page=0 chnl=0 +char id=98 x=839 y=632 width=29 height=45 xoffset=5 yoffset=17 xadvance=30 page=0 chnl=0 +char id=99 x=232 y=991 width=28 height=31 xoffset=3 yoffset=31 xadvance=26 page=0 chnl=0 +char id=100 x=868 y=632 width=34 height=45 xoffset=3 yoffset=17 xadvance=30 page=0 chnl=0 +char id=101 x=260 y=991 width=28 height=31 xoffset=3 yoffset=31 xadvance=26 page=0 chnl=0 +char id=102 x=118 y=859 width=41 height=44 xoffset=1 yoffset=17 xadvance=19 page=0 chnl=0 +char id=103 x=159 y=859 width=37 height=44 xoffset=0 yoffset=31 xadvance=30 page=0 chnl=0 +char id=104 x=196 y=859 width=32 height=44 xoffset=0 yoffset=17 xadvance=30 page=0 chnl=0 +char id=105 x=228 y=859 width=18 height=44 xoffset=1 yoffset=17 xadvance=16 page=0 chnl=0 +char id=106 x=429 y=75 width=34 height=58 xoffset=-7 yoffset=17 xadvance=16 page=0 chnl=0 +char id=107 x=246 y=859 width=39 height=44 xoffset=0 yoffset=17 xadvance=30 page=0 chnl=0 +char id=108 x=285 y=859 width=20 height=44 xoffset=1 yoffset=17 xadvance=16 page=0 chnl=0 +char id=111 x=288 y=991 width=30 height=31 xoffset=4 yoffset=31 xadvance=30 page=0 chnl=0 +char id=112 x=305 y=859 width=40 height=44 xoffset=-3 yoffset=31 xadvance=30 page=0 chnl=0 +char id=113 x=345 y=859 width=30 height=44 xoffset=3 yoffset=31 xadvance=30 page=0 chnl=0 +char id=115 x=318 y=991 width=22 height=31 xoffset=3 yoffset=31 xadvance=23 page=0 chnl=0 +char id=123 x=340 y=307 width=22 height=56 xoffset=9 yoffset=17 xadvance=29 page=0 chnl=0 +char id=124 x=902 y=632 width=16 height=45 xoffset=4 yoffset=17 xadvance=11 page=0 chnl=0 +char id=125 x=362 y=307 width=22 height=56 xoffset=6 yoffset=17 xadvance=29 page=0 chnl=0 +char id=160 x=0 y=0 width=0 height=0 xoffset=0 yoffset=0 xadvance=14 page=0 chnl=0 +char id=161 x=918 y=632 width=14 height=45 xoffset=4 yoffset=31 xadvance=19 page=0 chnl=0 +char id=162 x=978 y=580 width=28 height=47 xoffset=5 yoffset=23 xadvance=30 page=0 chnl=0 +char id=163 x=932 y=632 width=38 height=45 xoffset=1 yoffset=17 xadvance=30 page=0 chnl=0 +char id=166 x=970 y=632 width=16 height=45 xoffset=4 yoffset=17 xadvance=11 page=0 chnl=0 +char id=167 x=959 y=364 width=25 height=54 xoffset=6 yoffset=17 xadvance=30 page=0 chnl=0 +char id=169 x=653 y=580 width=52 height=48 xoffset=5 yoffset=15 xadvance=49 page=0 chnl=0 +char id=174 x=705 y=580 width=52 height=48 xoffset=5 yoffset=15 xadvance=49 page=0 chnl=0 +char id=182 x=827 y=473 width=41 height=53 xoffset=5 yoffset=18 xadvance=29 page=0 chnl=0 +char id=183 x=1014 y=250 width=7 height=8 xoffset=7 yoffset=42 xadvance=14 page=0 chnl=0 +char id=188 x=0 y=679 width=44 height=45 xoffset=5 yoffset=17 xadvance=46 page=0 chnl=0 +char id=189 x=44 y=679 width=48 height=45 xoffset=5 yoffset=17 xadvance=46 page=0 chnl=0 +char id=190 x=92 y=679 width=45 height=45 xoffset=4 yoffset=17 xadvance=46 page=0 chnl=0 +char id=191 x=986 y=632 width=23 height=45 xoffset=0 yoffset=31 xadvance=26 page=0 chnl=0 +char id=192 x=925 y=192 width=46 height=57 xoffset=0 yoffset=4 xadvance=44 page=0 chnl=0 +char id=193 x=0 y=250 width=54 height=57 xoffset=0 yoffset=4 xadvance=44 page=0 chnl=0 +char id=194 x=971 y=192 width=46 height=57 xoffset=0 yoffset=4 xadvance=44 page=0 chnl=0 +char id=195 x=0 y=419 width=46 height=54 xoffset=0 yoffset=7 xadvance=44 page=0 chnl=0 +char id=196 x=46 y=419 width=50 height=54 xoffset=0 yoffset=7 xadvance=44 page=0 chnl=0 +char id=197 x=463 y=75 width=46 height=58 xoffset=0 yoffset=3 xadvance=44 page=0 chnl=0 +char id=199 x=509 y=75 width=45 height=58 xoffset=5 yoffset=17 xadvance=41 page=0 chnl=0 +char id=200 x=54 y=250 width=46 height=57 xoffset=0 yoffset=4 xadvance=37 page=0 chnl=0 +char id=201 x=100 y=250 width=54 height=57 xoffset=0 yoffset=4 xadvance=37 page=0 chnl=0 +char id=202 x=154 y=250 width=46 height=57 xoffset=0 yoffset=4 xadvance=37 page=0 chnl=0 +char id=203 x=96 y=419 width=50 height=54 xoffset=0 yoffset=7 xadvance=37 page=0 chnl=0 +char id=204 x=200 y=250 width=37 height=57 xoffset=1 yoffset=4 xadvance=19 page=0 chnl=0 +char id=205 x=237 y=250 width=53 height=57 xoffset=1 yoffset=4 xadvance=19 page=0 chnl=0 +char id=206 x=290 y=250 width=35 height=57 xoffset=1 yoffset=4 xadvance=19 page=0 chnl=0 +char id=207 x=146 y=419 width=49 height=54 xoffset=1 yoffset=7 xadvance=19 page=0 chnl=0 +char id=209 x=0 y=364 width=59 height=55 xoffset=0 yoffset=7 xadvance=44 page=0 chnl=0 +char id=210 x=554 y=75 width=47 height=58 xoffset=5 yoffset=4 xadvance=44 page=0 chnl=0 +char id=211 x=601 y=75 width=49 height=58 xoffset=5 yoffset=4 xadvance=44 page=0 chnl=0 +char id=212 x=650 y=75 width=47 height=58 xoffset=5 yoffset=4 xadvance=44 page=0 chnl=0 +char id=213 x=59 y=364 width=47 height=55 xoffset=5 yoffset=7 xadvance=44 page=0 chnl=0 +char id=214 x=106 y=364 width=47 height=55 xoffset=5 yoffset=7 xadvance=44 page=0 chnl=0 +char id=215 x=0 y=991 width=38 height=32 xoffset=3 yoffset=29 xadvance=34 page=0 chnl=0 +char id=216 x=868 y=473 width=53 height=53 xoffset=2 yoffset=14 xadvance=44 page=0 chnl=0 +char id=217 x=697 y=75 width=51 height=58 xoffset=8 yoffset=4 xadvance=44 page=0 chnl=0 +char id=218 x=748 y=75 width=51 height=58 xoffset=8 yoffset=4 xadvance=44 page=0 chnl=0 +char id=219 x=799 y=75 width=51 height=58 xoffset=8 yoffset=4 xadvance=44 page=0 chnl=0 +char id=220 x=153 y=364 width=51 height=55 xoffset=8 yoffset=7 xadvance=44 page=0 chnl=0 +char id=221 x=325 y=250 width=51 height=57 xoffset=8 yoffset=4 xadvance=44 page=0 chnl=0 +char id=223 x=137 y=679 width=35 height=45 xoffset=0 yoffset=17 xadvance=30 page=0 chnl=0 +char id=224 x=172 y=679 width=30 height=45 xoffset=3 yoffset=17 xadvance=26 page=0 chnl=0 +char id=225 x=202 y=679 width=46 height=45 xoffset=3 yoffset=17 xadvance=26 page=0 chnl=0 +char id=226 x=248 y=679 width=28 height=45 xoffset=3 yoffset=17 xadvance=26 page=0 chnl=0 +char id=229 x=757 y=580 width=28 height=48 xoffset=3 yoffset=14 xadvance=26 page=0 chnl=0 +char id=230 x=340 y=991 width=41 height=31 xoffset=3 yoffset=31 xadvance=40 page=0 chnl=0 +char id=231 x=375 y=859 width=28 height=44 xoffset=3 yoffset=31 xadvance=26 page=0 chnl=0 +char id=232 x=276 y=679 width=30 height=45 xoffset=3 yoffset=17 xadvance=26 page=0 chnl=0 +char id=233 x=306 y=679 width=46 height=45 xoffset=3 yoffset=17 xadvance=26 page=0 chnl=0 +char id=234 x=352 y=679 width=28 height=45 xoffset=3 yoffset=17 xadvance=26 page=0 chnl=0 +char id=236 x=403 y=859 width=32 height=44 xoffset=1 yoffset=17 xadvance=16 page=0 chnl=0 +char id=237 x=435 y=859 width=46 height=44 xoffset=1 yoffset=17 xadvance=16 page=0 chnl=0 +char id=238 x=481 y=859 width=30 height=44 xoffset=1 yoffset=17 xadvance=16 page=0 chnl=0 +char id=240 x=380 y=679 width=35 height=45 xoffset=3 yoffset=17 xadvance=30 page=0 chnl=0 +char id=242 x=415 y=679 width=30 height=45 xoffset=4 yoffset=17 xadvance=30 page=0 chnl=0 +char id=243 x=445 y=679 width=45 height=45 xoffset=4 yoffset=17 xadvance=30 page=0 chnl=0 +char id=244 x=490 y=679 width=30 height=45 xoffset=4 yoffset=17 xadvance=30 page=0 chnl=0 +char id=248 x=511 y=859 width=35 height=44 xoffset=2 yoffset=25 xadvance=30 page=0 chnl=0 +char id=249 x=520 y=679 width=27 height=45 xoffset=5 yoffset=17 xadvance=30 page=0 chnl=0 +char id=250 x=547 y=679 width=44 height=45 xoffset=5 yoffset=17 xadvance=30 page=0 chnl=0 +char id=251 x=591 y=679 width=27 height=45 xoffset=5 yoffset=17 xadvance=30 page=0 chnl=0 +char id=253 x=850 y=75 width=49 height=58 xoffset=0 yoffset=17 xadvance=30 page=0 chnl=0 +char id=254 x=899 y=75 width=39 height=58 xoffset=-3 yoffset=17 xadvance=30 page=0 chnl=0 +char id=255 x=195 y=419 width=47 height=54 xoffset=0 yoffset=21 xadvance=30 page=0 chnl=0 +char id=256 x=38 y=580 width=51 height=51 xoffset=0 yoffset=10 xadvance=44 page=0 chnl=0 +char id=258 x=938 y=75 width=46 height=58 xoffset=0 yoffset=3 xadvance=44 page=0 chnl=0 +char id=259 x=546 y=859 width=30 height=44 xoffset=3 yoffset=18 xadvance=26 page=0 chnl=0 +char id=260 x=204 y=364 width=53 height=55 xoffset=0 yoffset=17 xadvance=44 page=0 chnl=0 +char id=262 x=0 y=134 width=57 height=58 xoffset=4 yoffset=4 xadvance=41 page=0 chnl=0 +char id=263 x=618 y=679 width=49 height=45 xoffset=3 yoffset=17 xadvance=26 page=0 chnl=0 +char id=264 x=57 y=134 width=46 height=58 xoffset=4 yoffset=4 xadvance=41 page=0 chnl=0 +char id=265 x=667 y=679 width=30 height=45 xoffset=3 yoffset=17 xadvance=26 page=0 chnl=0 +char id=266 x=257 y=364 width=46 height=55 xoffset=4 yoffset=7 xadvance=41 page=0 chnl=0 +char id=268 x=103 y=134 width=46 height=58 xoffset=4 yoffset=4 xadvance=41 page=0 chnl=0 +char id=269 x=697 y=679 width=35 height=45 xoffset=3 yoffset=17 xadvance=26 page=0 chnl=0 +char id=270 x=376 y=250 width=49 height=57 xoffset=1 yoffset=4 xadvance=44 page=0 chnl=0 +char id=271 x=732 y=679 width=65 height=45 xoffset=3 yoffset=17 xadvance=38 page=0 chnl=0 +char id=273 x=797 y=679 width=42 height=45 xoffset=3 yoffset=17 xadvance=30 page=0 chnl=0 +char id=274 x=89 y=580 width=48 height=51 xoffset=0 yoffset=10 xadvance=37 page=0 chnl=0 +char id=276 x=425 y=250 width=46 height=57 xoffset=0 yoffset=4 xadvance=37 page=0 chnl=0 +char id=277 x=576 y=859 width=32 height=44 xoffset=3 yoffset=18 xadvance=26 page=0 chnl=0 +char id=278 x=242 y=419 width=46 height=54 xoffset=0 yoffset=7 xadvance=37 page=0 chnl=0 +char id=280 x=288 y=419 width=46 height=54 xoffset=0 yoffset=18 xadvance=37 page=0 chnl=0 +char id=282 x=471 y=250 width=46 height=57 xoffset=0 yoffset=4 xadvance=37 page=0 chnl=0 +char id=283 x=839 y=679 width=32 height=45 xoffset=3 yoffset=17 xadvance=26 page=0 chnl=0 +char id=284 x=149 y=134 width=48 height=58 xoffset=5 yoffset=4 xadvance=44 page=0 chnl=0 +char id=285 x=984 y=75 width=37 height=58 xoffset=0 yoffset=17 xadvance=30 page=0 chnl=0 +char id=286 x=197 y=134 width=48 height=58 xoffset=5 yoffset=4 xadvance=44 page=0 chnl=0 +char id=287 x=517 y=250 width=37 height=57 xoffset=0 yoffset=18 xadvance=30 page=0 chnl=0 +char id=288 x=303 y=364 width=48 height=55 xoffset=5 yoffset=7 xadvance=44 page=0 chnl=0 +char id=289 x=984 y=364 width=37 height=54 xoffset=0 yoffset=21 xadvance=30 page=0 chnl=0 +char id=290 x=280 y=0 width=48 height=64 xoffset=5 yoffset=17 xadvance=44 page=0 chnl=0 +char id=291 x=753 y=0 width=37 height=62 xoffset=0 yoffset=13 xadvance=30 page=0 chnl=0 +char id=292 x=245 y=134 width=58 height=58 xoffset=1 yoffset=3 xadvance=44 page=0 chnl=0 +char id=293 x=554 y=250 width=35 height=57 xoffset=0 yoffset=4 xadvance=30 page=0 chnl=0 +char id=295 x=608 y=859 width=32 height=44 xoffset=0 yoffset=17 xadvance=30 page=0 chnl=0 +char id=296 x=334 y=419 width=39 height=54 xoffset=1 yoffset=7 xadvance=19 page=0 chnl=0 +char id=298 x=137 y=580 width=51 height=51 xoffset=1 yoffset=10 xadvance=19 page=0 chnl=0 +char id=300 x=303 y=134 width=37 height=58 xoffset=1 yoffset=3 xadvance=19 page=0 chnl=0 +char id=302 x=373 y=419 width=33 height=54 xoffset=1 yoffset=18 xadvance=19 page=0 chnl=0 +char id=303 x=351 y=364 width=18 height=55 xoffset=1 yoffset=17 xadvance=16 page=0 chnl=0 +char id=304 x=406 y=419 width=33 height=54 xoffset=1 yoffset=7 xadvance=19 page=0 chnl=0 +char id=306 x=640 y=859 width=57 height=44 xoffset=1 yoffset=18 xadvance=43 page=0 chnl=0 +char id=307 x=340 y=134 width=36 height=58 xoffset=1 yoffset=17 xadvance=32 page=0 chnl=0 +char id=308 x=870 y=0 width=39 height=59 xoffset=1 yoffset=3 xadvance=23 page=0 chnl=0 +char id=309 x=376 y=134 width=46 height=58 xoffset=-7 yoffset=17 xadvance=16 page=0 chnl=0 +char id=310 x=557 y=0 width=53 height=63 xoffset=2 yoffset=18 xadvance=44 page=0 chnl=0 +char id=311 x=328 y=0 width=39 height=64 xoffset=0 yoffset=17 xadvance=30 page=0 chnl=0 +char id=313 x=422 y=134 width=42 height=58 xoffset=0 yoffset=3 xadvance=37 page=0 chnl=0 +char id=314 x=464 y=134 width=53 height=58 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0 +char id=315 x=610 y=0 width=42 height=63 xoffset=0 yoffset=18 xadvance=37 page=0 chnl=0 +char id=316 x=367 y=0 width=20 height=64 xoffset=1 yoffset=17 xadvance=16 page=0 chnl=0 +char id=317 x=697 y=859 width=55 height=44 xoffset=0 yoffset=17 xadvance=37 page=0 chnl=0 +char id=318 x=752 y=859 width=52 height=44 xoffset=1 yoffset=17 xadvance=23 page=0 chnl=0 +char id=320 x=804 y=859 width=27 height=44 xoffset=1 yoffset=17 xadvance=26 page=0 chnl=0 +char id=322 x=831 y=859 width=24 height=44 xoffset=1 yoffset=17 xadvance=16 page=0 chnl=0 +char id=323 x=909 y=0 width=59 height=59 xoffset=0 yoffset=3 xadvance=44 page=0 chnl=0 +char id=324 x=855 y=859 width=48 height=44 xoffset=1 yoffset=17 xadvance=30 page=0 chnl=0 +char id=325 x=652 y=0 width=59 height=63 xoffset=0 yoffset=18 xadvance=44 page=0 chnl=0 +char id=326 x=329 y=580 width=31 height=50 xoffset=1 yoffset=31 xadvance=30 page=0 chnl=0 +char id=327 x=517 y=134 width=59 height=58 xoffset=0 yoffset=4 xadvance=44 page=0 chnl=0 +char id=328 x=903 y=859 width=34 height=44 xoffset=1 yoffset=17 xadvance=30 page=0 chnl=0 +char id=329 x=937 y=859 width=31 height=44 xoffset=4 yoffset=17 xadvance=34 page=0 chnl=0 +char id=330 x=871 y=679 width=47 height=45 xoffset=2 yoffset=17 xadvance=44 page=0 chnl=0 +char id=331 x=968 y=859 width=30 height=44 xoffset=1 yoffset=31 xadvance=30 page=0 chnl=0 +char id=332 x=452 y=527 width=47 height=52 xoffset=5 yoffset=10 xadvance=44 page=0 chnl=0 +char id=334 x=968 y=0 width=47 height=59 xoffset=5 yoffset=3 xadvance=44 page=0 chnl=0 +char id=335 x=0 y=903 width=30 height=44 xoffset=4 yoffset=18 xadvance=30 page=0 chnl=0 +char id=336 x=576 y=134 width=77 height=58 xoffset=5 yoffset=4 xadvance=44 page=0 chnl=0 +char id=337 x=918 y=679 width=68 height=45 xoffset=4 yoffset=17 xadvance=30 page=0 chnl=0 +char id=338 x=30 y=903 width=61 height=44 xoffset=5 yoffset=18 xadvance=55 page=0 chnl=0 +char id=339 x=381 y=991 width=45 height=31 xoffset=4 yoffset=31 xadvance=43 page=0 chnl=0 +char id=340 x=653 y=134 width=42 height=58 xoffset=1 yoffset=3 xadvance=41 page=0 chnl=0 +char id=341 x=91 y=903 width=49 height=44 xoffset=0 yoffset=17 xadvance=19 page=0 chnl=0 +char id=342 x=711 y=0 width=42 height=63 xoffset=1 yoffset=18 xadvance=41 page=0 chnl=0 +char id=343 x=360 y=580 width=32 height=50 xoffset=0 yoffset=31 xadvance=19 page=0 chnl=0 +char id=344 x=589 y=250 width=42 height=57 xoffset=1 yoffset=4 xadvance=41 page=0 chnl=0 +char id=345 x=140 y=903 width=36 height=44 xoffset=0 yoffset=17 xadvance=19 page=0 chnl=0 +char id=346 x=0 y=75 width=50 height=59 xoffset=4 yoffset=3 xadvance=34 page=0 chnl=0 +char id=347 x=0 y=724 width=49 height=45 xoffset=3 yoffset=17 xadvance=23 page=0 chnl=0 +char id=348 x=695 y=134 width=33 height=58 xoffset=4 yoffset=4 xadvance=34 page=0 chnl=0 +char id=349 x=986 y=679 width=27 height=45 xoffset=3 yoffset=17 xadvance=23 page=0 chnl=0 +char id=350 x=728 y=134 width=33 height=58 xoffset=4 yoffset=17 xadvance=34 page=0 chnl=0 +char id=351 x=998 y=859 width=22 height=44 xoffset=3 yoffset=31 xadvance=23 page=0 chnl=0 +char id=352 x=761 y=134 width=35 height=58 xoffset=4 yoffset=4 xadvance=34 page=0 chnl=0 +char id=353 x=49 y=724 width=31 height=45 xoffset=3 yoffset=17 xadvance=23 page=0 chnl=0 +char id=354 x=631 y=250 width=44 height=57 xoffset=6 yoffset=18 xadvance=37 page=0 chnl=0 +char id=355 x=997 y=527 width=24 height=51 xoffset=1 yoffset=24 xadvance=16 page=0 chnl=0 +char id=356 x=675 y=250 width=44 height=57 xoffset=6 yoffset=4 xadvance=37 page=0 chnl=0 +char id=357 x=80 y=724 width=50 height=45 xoffset=5 yoffset=17 xadvance=25 page=0 chnl=0 +char id=360 x=369 y=364 width=51 height=55 xoffset=8 yoffset=7 xadvance=44 page=0 chnl=0 +char id=362 x=499 y=527 width=51 height=52 xoffset=8 yoffset=10 xadvance=44 page=0 chnl=0 +char id=364 x=50 y=75 width=51 height=59 xoffset=8 yoffset=3 xadvance=44 page=0 chnl=0 +char id=365 x=176 y=903 width=28 height=44 xoffset=5 yoffset=18 xadvance=30 page=0 chnl=0 +char id=366 x=101 y=75 width=51 height=59 xoffset=8 yoffset=3 xadvance=44 page=0 chnl=0 +char id=367 x=785 y=580 width=27 height=48 xoffset=5 yoffset=14 xadvance=30 page=0 chnl=0 +char id=368 x=152 y=75 width=74 height=59 xoffset=8 yoffset=3 xadvance=44 page=0 chnl=0 +char id=369 x=130 y=724 width=67 height=45 xoffset=5 yoffset=17 xadvance=30 page=0 chnl=0 +char id=370 x=439 y=419 width=51 height=54 xoffset=8 yoffset=18 xadvance=44 page=0 chnl=0 +char id=372 x=796 y=134 width=68 height=58 xoffset=7 yoffset=4 xadvance=58 page=0 chnl=0 +char id=373 x=197 y=724 width=47 height=45 xoffset=6 yoffset=17 xadvance=44 page=0 chnl=0 +char id=374 x=719 y=250 width=51 height=57 xoffset=8 yoffset=4 xadvance=44 page=0 chnl=0 +char id=375 x=864 y=134 width=39 height=58 xoffset=0 yoffset=17 xadvance=30 page=0 chnl=0 +char id=376 x=490 y=419 width=51 height=54 xoffset=8 yoffset=7 xadvance=44 page=0 chnl=0 +char id=377 x=903 y=134 width=54 height=58 xoffset=0 yoffset=3 xadvance=37 page=0 chnl=0 +char id=378 x=204 y=903 width=49 height=44 xoffset=1 yoffset=17 xadvance=26 page=0 chnl=0 +char id=379 x=541 y=419 width=50 height=54 xoffset=0 yoffset=7 xadvance=37 page=0 chnl=0 +char id=381 x=770 y=250 width=50 height=57 xoffset=0 yoffset=4 xadvance=37 page=0 chnl=0 +char id=382 x=253 y=903 width=34 height=44 xoffset=1 yoffset=17 xadvance=26 page=0 chnl=0 +char id=383 x=287 y=903 width=41 height=44 xoffset=1 yoffset=17 xadvance=19 page=0 chnl=0 +char id=902 x=328 y=903 width=45 height=44 xoffset=1 yoffset=17 xadvance=44 page=0 chnl=0 +char id=903 x=1013 y=814 width=9 height=9 xoffset=8 yoffset=30 xadvance=14 page=0 chnl=0 +char id=904 x=373 y=903 width=65 height=44 xoffset=7 yoffset=17 xadvance=49 page=0 chnl=0 +char id=905 x=244 y=724 width=78 height=45 xoffset=7 yoffset=16 xadvance=56 page=0 chnl=0 +char id=906 x=322 y=724 width=54 height=45 xoffset=7 yoffset=16 xadvance=30 page=0 chnl=0 +char id=908 x=178 y=632 width=61 height=46 xoffset=7 yoffset=16 xadvance=50 page=0 chnl=0 +char id=910 x=376 y=724 width=59 height=45 xoffset=7 yoffset=16 xadvance=53 page=0 chnl=0 +char id=911 x=435 y=724 width=51 height=45 xoffset=7 yoffset=16 xadvance=54 page=0 chnl=0 +char id=912 x=392 y=580 width=26 height=50 xoffset=3 yoffset=12 xadvance=16 page=0 chnl=0 +char id=913 x=438 y=903 width=46 height=44 xoffset=0 yoffset=17 xadvance=44 page=0 chnl=0 +char id=916 x=484 y=903 width=41 height=44 xoffset=0 yoffset=17 xadvance=40 page=0 chnl=0 +char id=920 x=486 y=724 width=50 height=45 xoffset=5 yoffset=17 xadvance=44 page=0 chnl=0 +char id=923 x=525 y=903 width=46 height=44 xoffset=0 yoffset=17 xadvance=44 page=0 chnl=0 +char id=925 x=571 y=903 width=59 height=44 xoffset=0 yoffset=18 xadvance=44 page=0 chnl=0 +char id=927 x=536 y=724 width=47 height=45 xoffset=5 yoffset=17 xadvance=44 page=0 chnl=0 +char id=933 x=630 y=903 width=46 height=44 xoffset=9 yoffset=17 xadvance=43 page=0 chnl=0 +char id=937 x=676 y=903 width=48 height=44 xoffset=2 yoffset=17 xadvance=46 page=0 chnl=0 +char id=938 x=591 y=419 width=49 height=54 xoffset=1 yoffset=7 xadvance=19 page=0 chnl=0 +char id=939 x=640 y=419 width=45 height=54 xoffset=9 yoffset=7 xadvance=44 page=0 chnl=0 +char id=940 x=188 y=580 width=35 height=51 xoffset=4 yoffset=11 xadvance=35 page=0 chnl=0 +char id=941 x=223 y=580 width=28 height=51 xoffset=3 yoffset=11 xadvance=25 page=0 chnl=0 +char id=942 x=250 y=0 width=30 height=65 xoffset=4 yoffset=11 xadvance=32 page=0 chnl=0 +char id=943 x=251 y=580 width=20 height=51 xoffset=5 yoffset=11 xadvance=16 page=0 chnl=0 +char id=944 x=506 y=580 width=34 height=49 xoffset=4 yoffset=13 xadvance=31 page=0 chnl=0 +char id=945 x=426 y=991 width=35 height=31 xoffset=4 yoffset=31 xadvance=35 page=0 chnl=0 +char id=946 x=820 y=250 width=34 height=57 xoffset=1 yoffset=17 xadvance=32 page=0 chnl=0 +char id=947 x=583 y=724 width=34 height=45 xoffset=4 yoffset=31 xadvance=29 page=0 chnl=0 +char id=948 x=617 y=724 width=31 height=45 xoffset=4 yoffset=17 xadvance=32 page=0 chnl=0 +char id=949 x=461 y=991 width=27 height=31 xoffset=3 yoffset=31 xadvance=25 page=0 chnl=0 +char id=950 x=957 y=134 width=29 height=58 xoffset=5 yoffset=16 xadvance=28 page=0 chnl=0 +char id=951 x=648 y=724 width=30 height=45 xoffset=4 yoffset=31 xadvance=32 page=0 chnl=0 +char id=952 x=678 y=724 width=31 height=45 xoffset=6 yoffset=17 xadvance=32 page=0 chnl=0 +char id=954 x=488 y=991 width=36 height=31 xoffset=6 yoffset=30 xadvance=33 page=0 chnl=0 +char id=955 x=709 y=724 width=30 height=45 xoffset=1 yoffset=17 xadvance=28 page=0 chnl=0 +char id=956 x=724 y=903 width=33 height=44 xoffset=2 yoffset=32 xadvance=32 page=0 chnl=0 +char id=958 x=790 y=0 width=35 height=60 xoffset=3 yoffset=13 xadvance=31 page=0 chnl=0 +char id=959 x=524 y=991 width=30 height=31 xoffset=4 yoffset=31 xadvance=30 page=0 chnl=0 +char id=960 x=38 y=991 width=40 height=32 xoffset=3 yoffset=30 xadvance=36 page=0 chnl=0 +char id=961 x=739 y=724 width=35 height=45 xoffset=0 yoffset=31 xadvance=32 page=0 chnl=0 +char id=962 x=774 y=724 width=30 height=45 xoffset=4 yoffset=31 xadvance=27 page=0 chnl=0 +char id=963 x=78 y=991 width=39 height=32 xoffset=4 yoffset=30 xadvance=32 page=0 chnl=0 +char id=964 x=554 y=991 width=32 height=31 xoffset=4 yoffset=31 xadvance=25 page=0 chnl=0 +char id=965 x=586 y=991 width=31 height=31 xoffset=4 yoffset=31 xadvance=31 page=0 chnl=0 +char id=966 x=804 y=724 width=37 height=45 xoffset=5 yoffset=31 xadvance=39 page=0 chnl=0 +char id=967 x=757 y=903 width=37 height=44 xoffset=-1 yoffset=31 xadvance=29 page=0 chnl=0 +char id=968 x=921 y=473 width=41 height=53 xoffset=5 yoffset=23 xadvance=42 page=0 chnl=0 +char id=969 x=617 y=991 width=42 height=31 xoffset=4 yoffset=31 xadvance=42 page=0 chnl=0 +char id=972 x=418 y=580 width=37 height=50 xoffset=5 yoffset=12 xadvance=30 page=0 chnl=0 +char id=973 x=540 y=580 width=31 height=49 xoffset=4 yoffset=13 xadvance=31 page=0 chnl=0 +char id=974 x=571 y=580 width=42 height=49 xoffset=4 yoffset=13 xadvance=42 page=0 chnl=0 +char id=976 x=0 y=632 width=32 height=47 xoffset=5 yoffset=15 xadvance=32 page=0 chnl=0 +char id=977 x=32 y=632 width=39 height=47 xoffset=4 yoffset=15 xadvance=36 page=0 chnl=0 +char id=978 x=794 y=903 width=44 height=44 xoffset=7 yoffset=17 xadvance=38 page=0 chnl=0 +char id=979 x=239 y=632 width=56 height=46 xoffset=7 yoffset=15 xadvance=50 page=0 chnl=0 +char id=980 x=685 y=419 width=44 height=54 xoffset=7 yoffset=7 xadvance=38 page=0 chnl=0 +char id=981 x=550 y=527 width=37 height=52 xoffset=4 yoffset=24 xadvance=39 page=0 chnl=0 +char id=985 x=841 y=724 width=30 height=45 xoffset=4 yoffset=31 xadvance=30 page=0 chnl=0 +char id=986 x=838 y=903 width=40 height=44 xoffset=6 yoffset=17 xadvance=36 page=0 chnl=0 +char id=989 x=878 y=903 width=42 height=44 xoffset=-2 yoffset=31 xadvance=26 page=0 chnl=0 +char id=990 x=871 y=724 width=36 height=45 xoffset=6 yoffset=18 xadvance=40 page=0 chnl=0 +char id=991 x=986 y=134 width=22 height=58 xoffset=5 yoffset=15 xadvance=24 page=0 chnl=0 +char id=992 x=920 y=903 width=46 height=44 xoffset=0 yoffset=17 xadvance=44 page=0 chnl=0 +char id=993 x=0 y=192 width=38 height=58 xoffset=1 yoffset=15 xadvance=34 page=0 chnl=0 +char id=994 x=226 y=75 width=65 height=59 xoffset=2 yoffset=17 xadvance=59 page=0 chnl=0 +char id=995 x=907 y=724 width=46 height=45 xoffset=1 yoffset=31 xadvance=41 page=0 chnl=0 +char id=996 x=384 y=307 width=38 height=56 xoffset=6 yoffset=17 xadvance=36 page=0 chnl=0 +char id=997 x=953 y=724 width=35 height=45 xoffset=3 yoffset=31 xadvance=31 page=0 chnl=0 +char id=998 x=422 y=307 width=39 height=56 xoffset=0 yoffset=17 xadvance=35 page=0 chnl=0 +char id=1000 x=587 y=527 width=38 height=52 xoffset=2 yoffset=17 xadvance=30 page=0 chnl=0 +char id=1002 x=812 y=580 width=51 height=48 xoffset=2 yoffset=17 xadvance=52 page=0 chnl=0 +char id=1004 x=962 y=473 width=50 height=53 xoffset=5 yoffset=9 xadvance=34 page=0 chnl=0 +char id=1006 x=387 y=0 width=40 height=64 xoffset=6 yoffset=9 xadvance=39 page=0 chnl=0 +char id=1007 x=271 y=580 width=28 height=51 xoffset=4 yoffset=24 xadvance=27 page=0 chnl=0 +char id=1008 x=659 y=991 width=29 height=31 xoffset=5 yoffset=31 xadvance=32 page=0 chnl=0 +char id=1009 x=988 y=724 width=31 height=45 xoffset=3 yoffset=31 xadvance=32 page=0 chnl=0 +char id=1010 x=688 y=991 width=28 height=31 xoffset=4 yoffset=31 xadvance=29 page=0 chnl=0 +char id=1011 x=38 y=192 width=34 height=58 xoffset=-7 yoffset=17 xadvance=16 page=0 chnl=0 +char id=1012 x=0 y=769 width=47 height=45 xoffset=5 yoffset=17 xadvance=44 page=0 chnl=0 +char id=1013 x=716 y=991 width=26 height=31 xoffset=4 yoffset=31 xadvance=21 page=0 chnl=0 +char id=1014 x=742 y=991 width=24 height=31 xoffset=2 yoffset=31 xadvance=21 page=0 chnl=0 +char id=1016 x=461 y=307 width=32 height=56 xoffset=5 yoffset=19 xadvance=33 page=0 chnl=0 +char id=1017 x=47 y=769 width=45 height=45 xoffset=5 yoffset=17 xadvance=41 page=0 chnl=0 +char id=1019 x=966 y=903 width=47 height=44 xoffset=1 yoffset=31 xadvance=43 page=0 chnl=0 +char id=1020 x=0 y=947 width=45 height=44 xoffset=-6 yoffset=31 xadvance=32 page=0 chnl=0 +char id=1021 x=92 y=769 width=44 height=45 xoffset=3 yoffset=17 xadvance=41 page=0 chnl=0 +char id=1022 x=136 y=769 width=42 height=45 xoffset=5 yoffset=17 xadvance=62 page=0 chnl=0 +char id=1023 x=178 y=769 width=42 height=45 xoffset=3 yoffset=17 xadvance=62 page=0 chnl=0 +char id=1024 x=72 y=192 width=61 height=58 xoffset=1 yoffset=3 xadvance=37 page=0 chnl=0 +char id=1025 x=420 y=364 width=61 height=55 xoffset=1 yoffset=6 xadvance=37 page=0 chnl=0 +char id=1026 x=45 y=947 width=44 height=44 xoffset=6 yoffset=18 xadvance=46 page=0 chnl=0 +char id=1027 x=133 y=192 width=54 height=58 xoffset=1 yoffset=3 xadvance=34 page=0 chnl=0 +char id=1028 x=220 y=769 width=48 height=45 xoffset=5 yoffset=17 xadvance=40 page=0 chnl=0 +char id=1029 x=268 y=769 width=36 height=45 xoffset=2 yoffset=17 xadvance=29 page=0 chnl=0 +char id=1031 x=481 y=364 width=49 height=55 xoffset=1 yoffset=6 xadvance=20 page=0 chnl=0 +char id=1032 x=89 y=947 width=36 height=44 xoffset=0 yoffset=18 xadvance=23 page=0 chnl=0 +char id=1033 x=125 y=947 width=61 height=44 xoffset=0 yoffset=18 xadvance=58 page=0 chnl=0 +char id=1035 x=186 y=947 width=46 height=44 xoffset=6 yoffset=18 xadvance=51 page=0 chnl=0 +char id=1036 x=187 y=192 width=55 height=58 xoffset=1 yoffset=3 xadvance=41 page=0 chnl=0 +char id=1037 x=242 y=192 width=58 height=58 xoffset=1 yoffset=3 xadvance=44 page=0 chnl=0 +char id=1038 x=854 y=250 width=53 height=57 xoffset=7 yoffset=5 xadvance=43 page=0 chnl=0 +char id=1039 x=729 y=419 width=58 height=54 xoffset=1 yoffset=18 xadvance=44 page=0 chnl=0 +char id=1040 x=232 y=947 width=46 height=44 xoffset=0 yoffset=17 xadvance=44 page=0 chnl=0 +char id=1044 x=787 y=419 width=57 height=54 xoffset=-2 yoffset=18 xadvance=39 page=0 chnl=0 +char id=1047 x=304 y=769 width=41 height=45 xoffset=2 yoffset=17 xadvance=35 page=0 chnl=0 +char id=1049 x=493 y=307 width=58 height=56 xoffset=1 yoffset=5 xadvance=44 page=0 chnl=0 +char id=1051 x=278 y=947 width=54 height=44 xoffset=1 yoffset=18 xadvance=42 page=0 chnl=0 +char id=1054 x=345 y=769 width=47 height=45 xoffset=5 yoffset=17 xadvance=44 page=0 chnl=0 +char id=1057 x=392 y=769 width=47 height=45 xoffset=4 yoffset=17 xadvance=40 page=0 chnl=0 +char id=1059 x=332 y=947 width=53 height=44 xoffset=7 yoffset=18 xadvance=43 page=0 chnl=0 +char id=1062 x=844 y=419 width=57 height=54 xoffset=1 yoffset=18 xadvance=45 page=0 chnl=0 +char id=1065 x=901 y=419 width=75 height=54 xoffset=1 yoffset=18 xadvance=61 page=0 chnl=0 +char id=1069 x=439 y=769 width=45 height=45 xoffset=2 yoffset=17 xadvance=40 page=0 chnl=0 +char id=1070 x=484 y=769 width=66 height=45 xoffset=1 yoffset=17 xadvance=60 page=0 chnl=0 +char id=1072 x=766 y=991 width=27 height=31 xoffset=2 yoffset=31 xadvance=26 page=0 chnl=0 +char id=1073 x=71 y=632 width=35 height=47 xoffset=4 yoffset=15 xadvance=30 page=0 chnl=0 +char id=1077 x=793 y=991 width=28 height=31 xoffset=3 yoffset=31 xadvance=26 page=0 chnl=0 +char id=1079 x=821 y=991 width=27 height=31 xoffset=1 yoffset=31 xadvance=24 page=0 chnl=0 +char id=1081 x=385 y=947 width=40 height=44 xoffset=1 yoffset=17 xadvance=32 page=0 chnl=0 +char id=1086 x=848 y=991 width=31 height=31 xoffset=4 yoffset=31 xadvance=29 page=0 chnl=0 +char id=1088 x=425 y=947 width=40 height=44 xoffset=-3 yoffset=31 xadvance=30 page=0 chnl=0 +char id=1089 x=879 y=991 width=29 height=31 xoffset=3 yoffset=31 xadvance=25 page=0 chnl=0 +char id=1092 x=300 y=192 width=45 height=58 xoffset=3 yoffset=17 xadvance=42 page=0 chnl=0 +char id=1101 x=908 y=991 width=29 height=31 xoffset=1 yoffset=31 xadvance=26 page=0 chnl=0 +char id=1102 x=937 y=991 width=44 height=31 xoffset=1 yoffset=31 xadvance=41 page=0 chnl=0 +char id=1104 x=550 y=769 width=33 height=45 xoffset=5 yoffset=17 xadvance=26 page=0 chnl=0 +char id=1106 x=907 y=250 width=32 height=57 xoffset=1 yoffset=17 xadvance=29 page=0 chnl=0 +char id=1107 x=465 y=947 width=50 height=44 xoffset=1 yoffset=17 xadvance=23 page=0 chnl=0 +char id=1108 x=981 y=991 width=32 height=31 xoffset=3 yoffset=31 xadvance=26 page=0 chnl=0 +char id=1110 x=515 y=947 width=19 height=44 xoffset=1 yoffset=17 xadvance=15 page=0 chnl=0 +char id=1111 x=534 y=947 width=45 height=44 xoffset=1 yoffset=17 xadvance=16 page=0 chnl=0 +char id=1112 x=345 y=192 width=34 height=58 xoffset=-7 yoffset=17 xadvance=16 page=0 chnl=0 +char id=1115 x=579 y=947 width=32 height=44 xoffset=1 yoffset=17 xadvance=31 page=0 chnl=0 +char id=1116 x=611 y=947 width=43 height=44 xoffset=1 yoffset=17 xadvance=30 page=0 chnl=0 +char id=1117 x=654 y=947 width=40 height=44 xoffset=1 yoffset=17 xadvance=32 page=0 chnl=0 +char id=1118 x=379 y=192 width=55 height=58 xoffset=-3 yoffset=17 xadvance=28 page=0 chnl=0 +char id=1120 x=583 y=769 width=62 height=45 xoffset=5 yoffset=17 xadvance=61 page=0 chnl=0 +char id=1123 x=694 y=947 width=29 height=44 xoffset=4 yoffset=17 xadvance=30 page=0 chnl=0 +char id=1124 x=645 y=769 width=69 height=45 xoffset=1 yoffset=17 xadvance=59 page=0 chnl=0 +char id=1126 x=723 y=947 width=58 height=44 xoffset=0 yoffset=17 xadvance=56 page=0 chnl=0 +char id=1128 x=781 y=947 width=80 height=44 xoffset=0 yoffset=17 xadvance=78 page=0 chnl=0 +char id=1134 x=148 y=0 width=45 height=69 xoffset=1 yoffset=6 xadvance=31 page=0 chnl=0 +char id=1135 x=299 y=580 width=30 height=51 xoffset=3 yoffset=22 xadvance=23 page=0 chnl=0 +char id=1137 x=434 y=192 width=46 height=58 xoffset=5 yoffset=17 xadvance=42 page=0 chnl=0 +char id=1138 x=714 y=769 width=47 height=45 xoffset=5 yoffset=17 xadvance=44 page=0 chnl=0 +char id=1140 x=861 y=947 width=53 height=44 xoffset=8 yoffset=18 xadvance=48 page=0 chnl=0 +char id=1142 x=480 y=192 width=57 height=58 xoffset=8 yoffset=4 xadvance=48 page=0 chnl=0 +char id=1143 x=761 y=769 width=51 height=45 xoffset=5 yoffset=17 xadvance=33 page=0 chnl=0 +char id=1144 x=537 y=192 width=81 height=58 xoffset=5 yoffset=17 xadvance=75 page=0 chnl=0 +char id=1145 x=914 y=947 width=65 height=44 xoffset=3 yoffset=31 xadvance=59 page=0 chnl=0 +char id=1146 x=625 y=527 width=56 height=52 xoffset=5 yoffset=14 xadvance=54 page=0 chnl=0 +char id=1148 x=291 y=75 width=62 height=59 xoffset=5 yoffset=3 xadvance=61 page=0 chnl=0 +char id=1149 x=863 y=580 width=51 height=48 xoffset=3 yoffset=14 xadvance=41 page=0 chnl=0 +char id=1150 x=551 y=307 width=62 height=56 xoffset=5 yoffset=6 xadvance=61 page=0 chnl=0 +char id=1152 x=979 y=947 width=40 height=44 xoffset=6 yoffset=17 xadvance=36 page=0 chnl=0 +char id=1160 x=427 y=0 width=130 height=64 xoffset=-44 yoffset=6 xadvance=-2 page=0 chnl=0 +char id=1161 x=0 y=0 width=148 height=75 xoffset=-48 yoffset=3 xadvance=-2 page=0 chnl=0 +char id=1162 x=193 y=0 width=57 height=66 xoffset=0 yoffset=5 xadvance=44 page=0 chnl=0 +char id=1163 x=976 y=419 width=42 height=54 xoffset=0 yoffset=17 xadvance=31 page=0 chnl=0 +char id=1168 x=455 y=580 width=51 height=50 xoffset=0 yoffset=11 xadvance=34 page=0 chnl=0 +char id=1172 x=939 y=250 width=44 height=57 xoffset=1 yoffset=18 xadvance=38 page=0 chnl=0 +char id=1174 x=0 y=473 width=63 height=54 xoffset=1 yoffset=18 xadvance=62 page=0 chnl=0 +char id=1176 x=618 y=192 width=41 height=58 xoffset=2 yoffset=17 xadvance=35 page=0 chnl=0 +char id=1178 x=63 y=473 width=45 height=54 xoffset=1 yoffset=18 xadvance=43 page=0 chnl=0 +char id=1186 x=108 y=473 width=57 height=54 xoffset=1 yoffset=18 xadvance=45 page=0 chnl=0 +char id=1190 x=0 y=307 width=65 height=57 xoffset=1 yoffset=18 xadvance=64 page=0 chnl=0 +char id=1192 x=812 y=769 width=47 height=45 xoffset=5 yoffset=17 xadvance=46 page=0 chnl=0 +char id=1194 x=659 y=192 width=48 height=58 xoffset=5 yoffset=17 xadvance=40 page=0 chnl=0 +char id=1196 x=681 y=527 width=44 height=52 xoffset=6 yoffset=18 xadvance=37 page=0 chnl=0 +char id=1202 x=165 y=473 width=54 height=54 xoffset=0 yoffset=18 xadvance=47 page=0 chnl=0 +char id=1204 x=725 y=527 width=67 height=52 xoffset=6 yoffset=18 xadvance=60 page=0 chnl=0 +char id=1206 x=219 y=473 width=48 height=54 xoffset=7 yoffset=18 xadvance=42 page=0 chnl=0 +char id=1212 x=859 y=769 width=53 height=45 xoffset=7 yoffset=17 xadvance=53 page=0 chnl=0 +char id=1214 x=0 y=527 width=53 height=53 xoffset=7 yoffset=17 xadvance=53 page=0 chnl=0 +char id=1217 x=613 y=307 width=65 height=56 xoffset=0 yoffset=5 xadvance=58 page=0 chnl=0 +char id=1219 x=65 y=307 width=50 height=57 xoffset=1 yoffset=18 xadvance=38 page=0 chnl=0 +char id=1221 x=53 y=527 width=56 height=53 xoffset=2 yoffset=18 xadvance=43 page=0 chnl=0 +char id=1223 x=530 y=364 width=58 height=55 xoffset=1 yoffset=18 xadvance=44 page=0 chnl=0 +char id=1225 x=109 y=527 width=58 height=53 xoffset=1 yoffset=18 xadvance=44 page=0 chnl=0 +char id=1227 x=792 y=527 width=47 height=52 xoffset=8 yoffset=18 xadvance=42 page=0 chnl=0 +char id=1229 x=167 y=527 width=69 height=53 xoffset=1 yoffset=18 xadvance=55 page=0 chnl=0 +char id=1232 x=678 y=307 width=45 height=56 xoffset=1 yoffset=5 xadvance=44 page=0 chnl=0 +char id=1233 x=912 y=769 width=32 height=45 xoffset=3 yoffset=17 xadvance=26 page=0 chnl=0 +char id=1234 x=588 y=364 width=51 height=55 xoffset=1 yoffset=6 xadvance=44 page=0 chnl=0 +char id=1238 x=723 y=307 width=60 height=56 xoffset=1 yoffset=5 xadvance=38 page=0 chnl=0 +char id=1239 x=944 y=769 width=34 height=45 xoffset=3 yoffset=17 xadvance=26 page=0 chnl=0 +char id=1240 x=0 y=814 width=47 height=45 xoffset=4 yoffset=17 xadvance=43 page=0 chnl=0 +char id=1242 x=639 y=364 width=47 height=55 xoffset=4 yoffset=7 xadvance=43 page=0 chnl=0 +char id=1244 x=686 y=364 width=65 height=55 xoffset=0 yoffset=6 xadvance=58 page=0 chnl=0 +char id=1246 x=751 y=364 width=48 height=55 xoffset=2 yoffset=7 xadvance=35 page=0 chnl=0 +char id=1250 x=839 y=527 width=58 height=52 xoffset=1 yoffset=9 xadvance=44 page=0 chnl=0 +char id=1252 x=267 y=473 width=58 height=54 xoffset=1 yoffset=7 xadvance=44 page=0 chnl=0 +char id=1254 x=783 y=307 width=55 height=56 xoffset=7 yoffset=6 xadvance=44 page=0 chnl=0 +char id=1256 x=47 y=814 width=47 height=45 xoffset=5 yoffset=17 xadvance=44 page=0 chnl=0 +char id=1258 x=799 y=364 width=47 height=55 xoffset=5 yoffset=7 xadvance=44 page=0 chnl=0 +char id=1260 x=838 y=307 width=45 height=56 xoffset=2 yoffset=6 xadvance=40 page=0 chnl=0 +char id=1262 x=236 y=527 width=53 height=53 xoffset=7 yoffset=9 xadvance=43 page=0 chnl=0 +char id=1263 x=289 y=527 width=55 height=53 xoffset=-3 yoffset=22 xadvance=28 page=0 chnl=0 +char id=1264 x=883 y=307 width=53 height=56 xoffset=7 yoffset=6 xadvance=43 page=0 chnl=0 +char id=1265 x=325 y=473 width=55 height=54 xoffset=-3 yoffset=21 xadvance=28 page=0 chnl=0 +char id=1266 x=353 y=75 width=76 height=59 xoffset=7 yoffset=3 xadvance=43 page=0 chnl=0 +char id=1267 x=707 y=192 width=84 height=58 xoffset=-3 yoffset=17 xadvance=28 page=0 chnl=0 +char id=1268 x=380 y=473 width=47 height=54 xoffset=8 yoffset=7 xadvance=42 page=0 chnl=0 +char id=1270 x=897 y=527 width=47 height=52 xoffset=1 yoffset=18 xadvance=35 page=0 chnl=0 +char id=1272 x=427 y=473 width=97 height=54 xoffset=1 yoffset=7 xadvance=53 page=0 chnl=0 +char id=1274 x=791 y=192 width=47 height=58 xoffset=1 yoffset=18 xadvance=35 page=0 chnl=0 +char id=1276 x=846 y=364 width=57 height=55 xoffset=0 yoffset=18 xadvance=44 page=0 chnl=0 +char id=1281 x=978 y=769 width=34 height=45 xoffset=3 yoffset=17 xadvance=30 page=0 chnl=0 +char id=1283 x=295 y=632 width=39 height=46 xoffset=3 yoffset=17 xadvance=39 page=0 chnl=0 +char id=1284 x=94 y=814 width=52 height=45 xoffset=6 yoffset=17 xadvance=49 page=0 chnl=0 +char id=1285 x=117 y=991 width=32 height=32 xoffset=4 yoffset=31 xadvance=31 page=0 chnl=0 +char id=1286 x=344 y=527 width=29 height=53 xoffset=6 yoffset=17 xadvance=33 page=0 chnl=0 +char id=1289 x=149 y=991 width=42 height=32 xoffset=0 yoffset=32 xadvance=39 page=0 chnl=0 +char id=1292 x=146 y=814 width=48 height=45 xoffset=5 yoffset=17 xadvance=44 page=0 chnl=0 +char id=1296 x=194 y=814 width=37 height=45 xoffset=4 yoffset=17 xadvance=32 page=0 chnl=0 +char id=1298 x=903 y=364 width=56 height=55 xoffset=2 yoffset=18 xadvance=43 page=0 chnl=0 +char id=1306 x=936 y=307 width=47 height=56 xoffset=5 yoffset=17 xadvance=44 page=0 chnl=0 +char id=1312 x=115 y=307 width=63 height=57 xoffset=1 yoffset=18 xadvance=61 page=0 chnl=0 +char id=1314 x=178 y=307 width=65 height=57 xoffset=1 yoffset=18 xadvance=64 page=0 chnl=0 +char id=8192 x=0 y=0 width=0 height=0 xoffset=0 yoffset=0 xadvance=30 page=0 chnl=0 +char id=8193 x=0 y=0 width=0 height=0 xoffset=0 yoffset=0 xadvance=62 page=0 chnl=0 +char id=8194 x=0 y=0 width=0 height=0 xoffset=0 yoffset=0 xadvance=30 page=0 chnl=0 +char id=8195 x=0 y=0 width=0 height=0 xoffset=0 yoffset=0 xadvance=62 page=0 chnl=0 +char id=8196 x=0 y=0 width=0 height=0 xoffset=0 yoffset=0 xadvance=19 page=0 chnl=0 +char id=8197 x=0 y=0 width=0 height=0 xoffset=0 yoffset=0 xadvance=14 page=0 chnl=0 +char id=8198 x=0 y=0 width=0 height=0 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=8199 x=0 y=0 width=0 height=0 xoffset=0 yoffset=0 xadvance=30 page=0 chnl=0 +char id=8200 x=0 y=0 width=0 height=0 xoffset=0 yoffset=0 xadvance=14 page=0 chnl=0 +char id=8201 x=0 y=0 width=0 height=0 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=0 +char id=8202 x=0 y=0 width=0 height=0 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=0 +char id=8203 x=0 y=0 width=0 height=0 xoffset=0 yoffset=0 xadvance=-2 page=0 chnl=0 +char id=8204 x=0 y=0 width=0 height=0 xoffset=0 yoffset=0 xadvance=-2 page=0 chnl=0 +char id=8218 x=1012 y=769 width=10 height=16 xoffset=3 yoffset=54 xadvance=14 page=0 chnl=0 +char id=8224 x=524 y=473 width=27 height=54 xoffset=8 yoffset=17 xadvance=30 page=0 chnl=0 +char id=8225 x=551 y=473 width=31 height=54 xoffset=4 yoffset=17 xadvance=30 page=0 chnl=0 +char id=8239 x=0 y=0 width=0 height=0 xoffset=0 yoffset=0 xadvance=14 page=0 chnl=0 +char id=8240 x=914 y=580 width=64 height=48 xoffset=5 yoffset=15 xadvance=62 page=0 chnl=0 +char id=8252 x=231 y=814 width=37 height=45 xoffset=8 yoffset=17 xadvance=41 page=0 chnl=0 +char id=8260 x=268 y=814 width=67 height=45 xoffset=-11 yoffset=17 xadvance=9 page=0 chnl=0 +char id=8286 x=944 y=527 width=21 height=52 xoffset=3 yoffset=10 xadvance=9 page=0 chnl=0 +char id=8352 x=335 y=814 width=36 height=45 xoffset=8 yoffset=16 xadvance=43 page=0 chnl=0 +char id=8353 x=825 y=0 width=45 height=60 xoffset=5 yoffset=10 xadvance=41 page=0 chnl=0 +char id=8354 x=371 y=814 width=45 height=45 xoffset=5 yoffset=17 xadvance=41 page=0 chnl=0 +char id=8356 x=416 y=814 width=38 height=45 xoffset=1 yoffset=17 xadvance=30 page=0 chnl=0 +char id=8357 x=454 y=814 width=49 height=45 xoffset=1 yoffset=24 xadvance=48 page=0 chnl=0 +char id=8363 x=373 y=527 width=42 height=53 xoffset=4 yoffset=9 xadvance=31 page=0 chnl=0 +char id=8364 x=503 y=814 width=51 height=45 xoffset=5 yoffset=17 xadvance=45 page=0 chnl=0 +char id=8367 x=838 y=192 width=87 height=58 xoffset=0 yoffset=17 xadvance=84 page=0 chnl=0 +char id=8368 x=983 y=250 width=31 height=57 xoffset=0 yoffset=17 xadvance=29 page=0 chnl=0 +char id=8370 x=613 y=580 width=40 height=49 xoffset=5 yoffset=15 xadvance=38 page=0 chnl=0 +char id=8372 x=554 y=814 width=32 height=45 xoffset=4 yoffset=17 xadvance=34 page=0 chnl=0 +char id=8373 x=415 y=527 width=37 height=53 xoffset=5 yoffset=14 xadvance=37 page=0 chnl=0 +char id=11364 x=983 y=307 width=37 height=56 xoffset=6 yoffset=18 xadvance=41 page=0 chnl=0 +char id=11367 x=582 y=473 width=57 height=54 xoffset=1 yoffset=18 xadvance=45 page=0 chnl=0 +char id=11368 x=965 y=527 width=32 height=52 xoffset=0 yoffset=17 xadvance=30 page=0 chnl=0 +char id=11369 x=639 y=473 width=52 height=54 xoffset=2 yoffset=18 xadvance=45 page=0 chnl=0 +char id=11370 x=0 y=580 width=38 height=52 xoffset=0 yoffset=17 xadvance=31 page=0 chnl=0 +char id=11371 x=691 y=473 width=50 height=54 xoffset=0 yoffset=18 xadvance=37 page=0 chnl=0 +char id=11373 x=586 y=814 width=42 height=45 xoffset=5 yoffset=17 xadvance=42 page=0 chnl=0 +char id=11378 x=628 y=814 width=74 height=45 xoffset=7 yoffset=17 xadvance=67 page=0 chnl=0 +char id=0 x=946 y=0 width=43 height=43 xoffset=5 yoffset=18 xadvance=43 page=1 chnl=0 +char id=34 x=163 y=476 width=20 height=17 xoffset=11 yoffset=17 xadvance=24 page=1 chnl=0 +char id=35 x=0 y=44 width=39 height=43 xoffset=2 yoffset=18 xadvance=30 page=1 chnl=0 +char id=42 x=653 y=447 width=27 height=28 xoffset=8 yoffset=17 xadvance=30 page=1 chnl=0 +char id=43 x=220 y=382 width=35 height=33 xoffset=4 yoffset=28 xadvance=34 page=1 chnl=0 +char id=45 x=781 y=476 width=18 height=5 xoffset=4 yoffset=44 xadvance=19 page=1 chnl=0 +char id=60 x=109 y=382 width=41 height=34 xoffset=4 yoffset=28 xadvance=34 page=1 chnl=0 +char id=61 x=105 y=476 width=38 height=18 xoffset=3 yoffset=36 xadvance=34 page=1 chnl=0 +char id=62 x=150 y=382 width=38 height=34 xoffset=1 yoffset=28 xadvance=34 page=1 chnl=0 +char id=66 x=39 y=44 width=41 height=43 xoffset=1 yoffset=18 xadvance=41 page=1 chnl=0 +char id=68 x=80 y=44 width=49 height=43 xoffset=1 yoffset=18 xadvance=44 page=1 chnl=0 +char id=69 x=129 y=44 width=46 height=43 xoffset=0 yoffset=18 xadvance=37 page=1 chnl=0 +char id=70 x=175 y=44 width=49 height=43 xoffset=0 yoffset=18 xadvance=34 page=1 chnl=0 +char id=72 x=224 y=44 width=58 height=43 xoffset=1 yoffset=18 xadvance=44 page=1 chnl=0 +char id=73 x=989 y=0 width=33 height=43 xoffset=1 yoffset=18 xadvance=19 page=1 chnl=0 +char id=75 x=282 y=44 width=53 height=43 xoffset=2 yoffset=18 xadvance=44 page=1 chnl=0 +char id=76 x=335 y=44 width=42 height=43 xoffset=0 yoffset=18 xadvance=37 page=1 chnl=0 +char id=77 x=377 y=44 width=68 height=43 xoffset=0 yoffset=18 xadvance=55 page=1 chnl=0 +char id=80 x=445 y=44 width=44 height=43 xoffset=1 yoffset=18 xadvance=34 page=1 chnl=0 +char id=82 x=489 y=44 width=42 height=43 xoffset=1 yoffset=18 xadvance=41 page=1 chnl=0 +char id=84 x=531 y=44 width=44 height=43 xoffset=6 yoffset=18 xadvance=37 page=1 chnl=0 +char id=88 x=575 y=44 width=57 height=43 xoffset=0 yoffset=18 xadvance=44 page=1 chnl=0 +char id=89 x=632 y=44 width=51 height=43 xoffset=8 yoffset=18 xadvance=44 page=1 chnl=0 +char id=90 x=683 y=44 width=50 height=43 xoffset=0 yoffset=18 xadvance=37 page=1 chnl=0 +char id=94 x=852 y=447 width=29 height=24 xoffset=4 yoffset=18 xadvance=28 page=1 chnl=0 +char id=95 x=919 y=476 width=35 height=4 xoffset=-2 yoffset=65 xadvance=30 page=1 chnl=0 +char id=96 x=450 y=476 width=14 height=12 xoffset=8 yoffset=17 xadvance=19 page=1 chnl=0 +char id=109 x=943 y=382 width=49 height=30 xoffset=1 yoffset=31 xadvance=48 page=1 chnl=0 +char id=110 x=992 y=382 width=31 height=30 xoffset=1 yoffset=31 xadvance=30 page=1 chnl=0 +char id=114 x=0 y=417 width=32 height=30 xoffset=0 yoffset=31 xadvance=19 page=1 chnl=0 +char id=116 x=1003 y=302 width=20 height=38 xoffset=5 yoffset=24 xadvance=16 page=1 chnl=0 +char id=117 x=32 y=417 width=27 height=30 xoffset=5 yoffset=32 xadvance=30 page=1 chnl=0 +char id=118 x=59 y=417 width=33 height=30 xoffset=6 yoffset=32 xadvance=30 page=1 chnl=0 +char id=119 x=92 y=417 width=47 height=30 xoffset=6 yoffset=32 xadvance=44 page=1 chnl=0 +char id=120 x=684 y=417 width=32 height=29 xoffset=1 yoffset=32 xadvance=30 page=1 chnl=0 +char id=121 x=733 y=44 width=39 height=43 xoffset=0 yoffset=32 xadvance=30 page=1 chnl=0 +char id=122 x=716 y=417 width=32 height=29 xoffset=1 yoffset=32 xadvance=26 page=1 chnl=0 +char id=126 x=623 y=476 width=30 height=10 xoffset=5 yoffset=40 xadvance=33 page=1 chnl=0 +char id=164 x=695 y=343 width=48 height=36 xoffset=-1 yoffset=22 xadvance=30 page=1 chnl=0 +char id=165 x=772 y=44 width=46 height=43 xoffset=3 yoffset=18 xadvance=30 page=1 chnl=0 +char id=168 x=756 y=476 width=25 height=7 xoffset=7 yoffset=21 xadvance=19 page=1 chnl=0 +char id=170 x=921 y=447 width=22 height=19 xoffset=5 yoffset=17 xadvance=16 page=1 chnl=0 +char id=171 x=746 y=447 width=32 height=25 xoffset=3 yoffset=34 xadvance=26 page=1 chnl=0 +char id=172 x=943 y=447 width=36 height=19 xoffset=5 yoffset=36 xadvance=34 page=1 chnl=0 +char id=173 x=799 y=476 width=18 height=5 xoffset=4 yoffset=44 xadvance=19 page=1 chnl=0 +char id=175 x=954 y=476 width=28 height=4 xoffset=6 yoffset=22 xadvance=19 page=1 chnl=0 +char id=176 x=899 y=447 width=22 height=20 xoffset=9 yoffset=17 xadvance=24 page=1 chnl=0 +char id=177 x=719 y=259 width=40 height=41 xoffset=1 yoffset=20 xadvance=34 page=1 chnl=0 +char id=178 x=705 y=447 width=27 height=27 xoffset=4 yoffset=17 xadvance=18 page=1 chnl=0 +char id=179 x=680 y=447 width=25 height=28 xoffset=4 yoffset=17 xadvance=18 page=1 chnl=0 +char id=180 x=464 y=476 width=23 height=12 xoffset=11 yoffset=17 xadvance=19 page=1 chnl=0 +char id=181 x=818 y=44 width=35 height=43 xoffset=0 yoffset=32 xadvance=30 page=1 chnl=0 +char id=184 x=309 y=476 width=15 height=15 xoffset=1 yoffset=60 xadvance=19 page=1 chnl=0 +char id=185 x=732 y=447 width=14 height=27 xoffset=7 yoffset=17 xadvance=18 page=1 chnl=0 +char id=186 x=979 y=447 width=26 height=19 xoffset=6 yoffset=17 xadvance=18 page=1 chnl=0 +char id=187 x=778 y=447 width=36 height=25 xoffset=1 yoffset=34 xadvance=26 page=1 chnl=0 +char id=198 x=853 y=44 width=62 height=43 xoffset=0 yoffset=18 xadvance=55 page=1 chnl=0 +char id=208 x=915 y=44 width=49 height=43 xoffset=1 yoffset=18 xadvance=44 page=1 chnl=0 +char id=222 x=964 y=44 width=40 height=43 xoffset=1 yoffset=18 xadvance=35 page=1 chnl=0 +char id=227 x=583 y=259 width=32 height=42 xoffset=3 yoffset=20 xadvance=26 page=1 chnl=0 +char id=228 x=759 y=259 width=43 height=41 xoffset=3 yoffset=21 xadvance=26 page=1 chnl=0 +char id=235 x=802 y=259 width=43 height=41 xoffset=3 yoffset=21 xadvance=26 page=1 chnl=0 +char id=239 x=449 y=302 width=28 height=40 xoffset=1 yoffset=21 xadvance=16 page=1 chnl=0 +char id=241 x=845 y=259 width=34 height=41 xoffset=1 yoffset=20 xadvance=30 page=1 chnl=0 +char id=245 x=615 y=259 width=31 height=42 xoffset=4 yoffset=20 xadvance=30 page=1 chnl=0 +char id=246 x=879 y=259 width=41 height=41 xoffset=4 yoffset=21 xadvance=30 page=1 chnl=0 +char id=247 x=917 y=343 width=35 height=35 xoffset=4 yoffset=27 xadvance=34 page=1 chnl=0 +char id=252 x=920 y=259 width=40 height=41 xoffset=5 yoffset=21 xadvance=30 page=1 chnl=0 +char id=257 x=790 y=302 width=44 height=39 xoffset=3 yoffset=23 xadvance=26 page=1 chnl=0 +char id=261 x=960 y=259 width=28 height=41 xoffset=3 yoffset=31 xadvance=26 page=1 chnl=0 +char id=267 x=988 y=259 width=28 height=41 xoffset=3 yoffset=21 xadvance=26 page=1 chnl=0 +char id=272 x=0 y=87 width=49 height=43 xoffset=1 yoffset=18 xadvance=44 page=1 chnl=0 +char id=275 x=834 y=302 width=46 height=39 xoffset=3 yoffset=23 xadvance=26 page=1 chnl=0 +char id=279 x=0 y=302 width=28 height=41 xoffset=3 yoffset=21 xadvance=26 page=1 chnl=0 +char id=281 x=28 y=302 width=28 height=41 xoffset=3 yoffset=31 xadvance=26 page=1 chnl=0 +char id=294 x=49 y=87 width=58 height=43 xoffset=1 yoffset=18 xadvance=44 page=1 chnl=0 +char id=297 x=477 y=302 width=34 height=40 xoffset=1 yoffset=21 xadvance=16 page=1 chnl=0 +char id=299 x=121 y=343 width=44 height=38 xoffset=1 yoffset=23 xadvance=16 page=1 chnl=0 +char id=301 x=107 y=87 width=32 height=43 xoffset=1 yoffset=18 xadvance=16 page=1 chnl=0 +char id=305 x=1002 y=87 width=16 height=30 xoffset=1 yoffset=31 xadvance=16 page=1 chnl=0 +char id=312 x=139 y=417 width=37 height=30 xoffset=0 yoffset=31 xadvance=30 page=1 chnl=0 +char id=319 x=139 y=87 width=42 height=43 xoffset=0 yoffset=18 xadvance=37 page=1 chnl=0 +char id=321 x=181 y=87 width=42 height=43 xoffset=0 yoffset=18 xadvance=37 page=1 chnl=0 +char id=333 x=880 y=302 width=43 height=39 xoffset=4 yoffset=23 xadvance=30 page=1 chnl=0 +char id=358 x=223 y=87 width=44 height=43 xoffset=6 yoffset=18 xadvance=37 page=1 chnl=0 +char id=359 x=165 y=343 width=22 height=38 xoffset=3 yoffset=24 xadvance=16 page=1 chnl=0 +char id=361 x=56 y=302 width=28 height=41 xoffset=5 yoffset=21 xadvance=30 page=1 chnl=0 +char id=363 x=923 y=302 width=40 height=39 xoffset=5 yoffset=23 xadvance=30 page=1 chnl=0 +char id=371 x=511 y=302 width=27 height=40 xoffset=5 yoffset=32 xadvance=30 page=1 chnl=0 +char id=380 x=538 y=302 width=32 height=40 xoffset=1 yoffset=21 xadvance=26 page=1 chnl=0 +char id=884 x=324 y=476 width=18 height=15 xoffset=6 yoffset=11 xadvance=11 page=1 chnl=0 +char id=885 x=1010 y=216 width=13 height=15 xoffset=0 yoffset=61 xadvance=11 page=1 chnl=0 +char id=890 x=653 y=476 width=12 height=10 xoffset=6 yoffset=64 xadvance=19 page=1 chnl=0 +char id=894 x=999 y=130 width=22 height=40 xoffset=4 yoffset=31 xadvance=16 page=1 chnl=0 +char id=900 x=342 y=476 width=15 height=15 xoffset=10 yoffset=11 xadvance=15 page=1 chnl=0 +char id=901 x=357 y=476 width=25 height=15 xoffset=7 yoffset=14 xadvance=19 page=1 chnl=0 +char id=914 x=267 y=87 width=41 height=43 xoffset=1 yoffset=18 xadvance=41 page=1 chnl=0 +char id=915 x=308 y=87 width=47 height=43 xoffset=0 yoffset=18 xadvance=36 page=1 chnl=0 +char id=917 x=355 y=87 width=46 height=43 xoffset=0 yoffset=18 xadvance=37 page=1 chnl=0 +char id=918 x=401 y=87 width=50 height=43 xoffset=0 yoffset=18 xadvance=37 page=1 chnl=0 +char id=919 x=451 y=87 width=58 height=43 xoffset=1 yoffset=18 xadvance=44 page=1 chnl=0 +char id=921 x=509 y=87 width=33 height=43 xoffset=1 yoffset=18 xadvance=19 page=1 chnl=0 +char id=922 x=542 y=87 width=53 height=43 xoffset=2 yoffset=18 xadvance=44 page=1 chnl=0 +char id=924 x=595 y=87 width=68 height=43 xoffset=0 yoffset=18 xadvance=55 page=1 chnl=0 +char id=926 x=663 y=87 width=44 height=43 xoffset=3 yoffset=18 xadvance=38 page=1 chnl=0 +char id=928 x=707 y=87 width=58 height=43 xoffset=1 yoffset=18 xadvance=44 page=1 chnl=0 +char id=929 x=765 y=87 width=44 height=43 xoffset=1 yoffset=18 xadvance=34 page=1 chnl=0 +char id=931 x=809 y=87 width=44 height=43 xoffset=1 yoffset=18 xadvance=38 page=1 chnl=0 +char id=932 x=853 y=87 width=44 height=43 xoffset=6 yoffset=18 xadvance=37 page=1 chnl=0 +char id=934 x=897 y=87 width=48 height=43 xoffset=5 yoffset=18 xadvance=45 page=1 chnl=0 +char id=935 x=945 y=87 width=57 height=43 xoffset=0 yoffset=18 xadvance=44 page=1 chnl=0 +char id=936 x=0 y=130 width=54 height=43 xoffset=7 yoffset=18 xadvance=50 page=1 chnl=0 +char id=953 x=176 y=417 width=14 height=30 xoffset=5 yoffset=32 xadvance=16 page=1 chnl=0 +char id=957 x=190 y=417 width=33 height=30 xoffset=4 yoffset=31 xadvance=29 page=1 chnl=0 +char id=970 x=54 y=130 width=36 height=43 xoffset=5 yoffset=19 xadvance=16 page=1 chnl=0 +char id=971 x=90 y=130 width=42 height=43 xoffset=4 yoffset=19 xadvance=31 page=1 chnl=0 +char id=982 x=952 y=343 width=47 height=35 xoffset=4 yoffset=27 xadvance=42 page=1 chnl=0 +char id=983 x=84 y=302 width=29 height=41 xoffset=5 yoffset=31 xadvance=32 page=1 chnl=0 +char id=984 x=132 y=130 width=43 height=43 xoffset=6 yoffset=18 xadvance=34 page=1 chnl=0 +char id=987 x=175 y=130 width=35 height=43 xoffset=1 yoffset=31 xadvance=25 page=1 chnl=0 +char id=988 x=210 y=130 width=49 height=43 xoffset=0 yoffset=18 xadvance=34 page=1 chnl=0 +char id=999 x=188 y=382 width=32 height=34 xoffset=1 yoffset=28 xadvance=27 page=1 chnl=0 +char id=1001 x=743 y=343 width=26 height=36 xoffset=1 yoffset=31 xadvance=20 page=1 chnl=0 +char id=1003 x=255 y=382 width=36 height=33 xoffset=1 yoffset=31 xadvance=36 page=1 chnl=0 +char id=1005 x=347 y=343 width=36 height=37 xoffset=3 yoffset=25 xadvance=24 page=1 chnl=0 +char id=1015 x=259 y=130 width=40 height=43 xoffset=1 yoffset=18 xadvance=35 page=1 chnl=0 +char id=1018 x=299 y=130 width=68 height=43 xoffset=0 yoffset=18 xadvance=55 page=1 chnl=0 +char id=1030 x=367 y=130 width=32 height=43 xoffset=1 yoffset=18 xadvance=20 page=1 chnl=0 +char id=1034 x=399 y=130 width=63 height=43 xoffset=1 yoffset=18 xadvance=61 page=1 chnl=0 +char id=1041 x=462 y=130 width=43 height=43 xoffset=1 yoffset=18 xadvance=35 page=1 chnl=0 +char id=1042 x=505 y=130 width=44 height=43 xoffset=1 yoffset=18 xadvance=38 page=1 chnl=0 +char id=1043 x=549 y=130 width=48 height=43 xoffset=1 yoffset=18 xadvance=34 page=1 chnl=0 +char id=1045 x=597 y=130 width=47 height=43 xoffset=1 yoffset=18 xadvance=37 page=1 chnl=0 +char id=1046 x=644 y=130 width=65 height=43 xoffset=0 yoffset=18 xadvance=58 page=1 chnl=0 +char id=1048 x=709 y=130 width=58 height=43 xoffset=1 yoffset=18 xadvance=44 page=1 chnl=0 +char id=1050 x=767 y=130 width=47 height=43 xoffset=1 yoffset=18 xadvance=41 page=1 chnl=0 +char id=1052 x=814 y=130 width=69 height=43 xoffset=1 yoffset=18 xadvance=55 page=1 chnl=0 +char id=1053 x=883 y=130 width=58 height=43 xoffset=1 yoffset=18 xadvance=44 page=1 chnl=0 +char id=1055 x=941 y=130 width=58 height=43 xoffset=1 yoffset=18 xadvance=44 page=1 chnl=0 +char id=1056 x=0 y=173 width=43 height=43 xoffset=1 yoffset=18 xadvance=35 page=1 chnl=0 +char id=1058 x=43 y=173 width=44 height=43 xoffset=6 yoffset=18 xadvance=37 page=1 chnl=0 +char id=1060 x=87 y=173 width=47 height=43 xoffset=5 yoffset=18 xadvance=46 page=1 chnl=0 +char id=1061 x=134 y=173 width=57 height=43 xoffset=0 yoffset=18 xadvance=44 page=1 chnl=0 +char id=1063 x=191 y=173 width=47 height=43 xoffset=8 yoffset=18 xadvance=42 page=1 chnl=0 +char id=1064 x=238 y=173 width=75 height=43 xoffset=1 yoffset=18 xadvance=61 page=1 chnl=0 +char id=1066 x=313 y=173 width=41 height=43 xoffset=6 yoffset=18 xadvance=44 page=1 chnl=0 +char id=1067 x=354 y=173 width=83 height=43 xoffset=1 yoffset=18 xadvance=53 page=1 chnl=0 +char id=1068 x=437 y=173 width=37 height=43 xoffset=1 yoffset=18 xadvance=35 page=1 chnl=0 +char id=1071 x=474 y=173 width=54 height=43 xoffset=0 yoffset=18 xadvance=39 page=1 chnl=0 +char id=1074 x=748 y=417 width=31 height=29 xoffset=1 yoffset=32 xadvance=28 page=1 chnl=0 +char id=1075 x=779 y=417 width=31 height=29 xoffset=1 yoffset=32 xadvance=23 page=1 chnl=0 +char id=1076 x=383 y=343 width=41 height=37 xoffset=-1 yoffset=32 xadvance=29 page=1 chnl=0 +char id=1078 x=223 y=417 width=47 height=30 xoffset=0 yoffset=31 xadvance=40 page=1 chnl=0 +char id=1080 x=810 y=417 width=40 height=29 xoffset=1 yoffset=32 xadvance=32 page=1 chnl=0 +char id=1082 x=270 y=417 width=32 height=30 xoffset=1 yoffset=31 xadvance=30 page=1 chnl=0 +char id=1083 x=302 y=417 width=40 height=30 xoffset=0 yoffset=32 xadvance=29 page=1 chnl=0 +char id=1084 x=342 y=417 width=48 height=30 xoffset=1 yoffset=32 xadvance=38 page=1 chnl=0 +char id=1085 x=850 y=417 width=40 height=29 xoffset=1 yoffset=32 xadvance=32 page=1 chnl=0 +char id=1087 x=890 y=417 width=40 height=29 xoffset=1 yoffset=32 xadvance=32 page=1 chnl=0 +char id=1090 x=930 y=417 width=30 height=29 xoffset=4 yoffset=32 xadvance=25 page=1 chnl=0 +char id=1091 x=528 y=173 width=41 height=43 xoffset=-1 yoffset=32 xadvance=28 page=1 chnl=0 +char id=1093 x=960 y=417 width=33 height=29 xoffset=1 yoffset=32 xadvance=29 page=1 chnl=0 +char id=1094 x=424 y=343 width=40 height=37 xoffset=1 yoffset=32 xadvance=32 page=1 chnl=0 +char id=1095 x=0 y=447 width=36 height=29 xoffset=5 yoffset=32 xadvance=30 page=1 chnl=0 +char id=1096 x=36 y=447 width=56 height=29 xoffset=1 yoffset=32 xadvance=46 page=1 chnl=0 +char id=1097 x=464 y=343 width=56 height=37 xoffset=1 yoffset=32 xadvance=46 page=1 chnl=0 +char id=1098 x=993 y=417 width=29 height=29 xoffset=4 yoffset=32 xadvance=30 page=1 chnl=0 +char id=1099 x=92 y=447 width=48 height=29 xoffset=1 yoffset=32 xadvance=38 page=1 chnl=0 +char id=1100 x=140 y=447 width=27 height=29 xoffset=1 yoffset=32 xadvance=26 page=1 chnl=0 +char id=1103 x=167 y=447 width=40 height=29 xoffset=0 yoffset=32 xadvance=29 page=1 chnl=0 +char id=1105 x=569 y=173 width=42 height=43 xoffset=5 yoffset=19 xadvance=26 page=1 chnl=0 +char id=1109 x=999 y=343 width=24 height=31 xoffset=1 yoffset=31 xadvance=20 page=1 chnl=0 +char id=1113 x=390 y=417 width=44 height=30 xoffset=0 yoffset=32 xadvance=41 page=1 chnl=0 +char id=1114 x=207 y=447 width=45 height=29 xoffset=1 yoffset=32 xadvance=44 page=1 chnl=0 +char id=1119 x=187 y=343 width=40 height=38 xoffset=1 yoffset=32 xadvance=32 page=1 chnl=0 +char id=1121 x=401 y=382 width=42 height=31 xoffset=3 yoffset=31 xadvance=41 page=1 chnl=0 +char id=1122 x=611 y=173 width=42 height=43 xoffset=5 yoffset=18 xadvance=44 page=1 chnl=0 +char id=1125 x=443 y=382 width=48 height=31 xoffset=0 yoffset=31 xadvance=39 page=1 chnl=0 +char id=1127 x=252 y=447 width=41 height=29 xoffset=0 yoffset=32 xadvance=39 page=1 chnl=0 +char id=1129 x=293 y=447 width=57 height=29 xoffset=0 yoffset=32 xadvance=55 page=1 chnl=0 +char id=1130 x=653 y=173 width=60 height=43 xoffset=0 yoffset=18 xadvance=58 page=1 chnl=0 +char id=1131 x=350 y=447 width=42 height=29 xoffset=0 yoffset=32 xadvance=40 page=1 chnl=0 +char id=1132 x=713 y=173 width=82 height=43 xoffset=0 yoffset=18 xadvance=80 page=1 chnl=0 +char id=1133 x=392 y=447 width=58 height=29 xoffset=0 yoffset=32 xadvance=56 page=1 chnl=0 +char id=1136 x=795 y=173 width=60 height=43 xoffset=7 yoffset=18 xadvance=54 page=1 chnl=0 +char id=1139 x=491 y=382 width=32 height=31 xoffset=3 yoffset=31 xadvance=29 page=1 chnl=0 +char id=1141 x=523 y=382 width=39 height=31 xoffset=5 yoffset=31 xadvance=33 page=1 chnl=0 +char id=1147 x=0 y=382 width=39 height=35 xoffset=3 yoffset=29 xadvance=37 page=1 chnl=0 +char id=1151 x=646 y=259 width=45 height=42 xoffset=3 yoffset=20 xadvance=41 page=1 chnl=0 +char id=1153 x=113 y=302 width=29 height=41 xoffset=3 yoffset=31 xadvance=25 page=1 chnl=0 +char id=1154 x=881 y=447 width=18 height=22 xoffset=-1 yoffset=53 xadvance=13 page=1 chnl=0 +char id=1155 x=665 y=476 width=42 height=10 xoffset=-15 yoffset=19 xadvance=-2 page=1 chnl=0 +char id=1156 x=487 y=476 width=56 height=12 xoffset=-23 yoffset=17 xadvance=-2 page=1 chnl=0 +char id=1157 x=543 y=476 width=28 height=12 xoffset=-9 yoffset=17 xadvance=-2 page=1 chnl=0 +char id=1158 x=571 y=476 width=28 height=12 xoffset=-9 yoffset=17 xadvance=-2 page=1 chnl=0 +char id=1159 x=382 y=476 width=68 height=14 xoffset=-23 yoffset=7 xadvance=-2 page=1 chnl=0 +char id=1164 x=855 y=173 width=37 height=43 xoffset=0 yoffset=18 xadvance=34 page=1 chnl=0 +char id=1165 x=450 y=447 width=28 height=29 xoffset=0 yoffset=32 xadvance=26 page=1 chnl=0 +char id=1166 x=892 y=173 width=44 height=43 xoffset=1 yoffset=18 xadvance=34 page=1 chnl=0 +char id=1167 x=0 y=0 width=38 height=44 xoffset=-2 yoffset=31 xadvance=31 page=1 chnl=0 +char id=1169 x=39 y=382 width=35 height=35 xoffset=1 yoffset=26 xadvance=23 page=1 chnl=0 +char id=1170 x=936 y=173 width=47 height=43 xoffset=0 yoffset=18 xadvance=36 page=1 chnl=0 +char id=1171 x=478 y=447 width=31 height=29 xoffset=1 yoffset=32 xadvance=23 page=1 chnl=0 +char id=1173 x=983 y=173 width=29 height=43 xoffset=1 yoffset=32 xadvance=28 page=1 chnl=0 +char id=1175 x=227 y=343 width=44 height=38 xoffset=1 yoffset=31 xadvance=42 page=1 chnl=0 +char id=1177 x=142 y=302 width=27 height=41 xoffset=1 yoffset=31 xadvance=24 page=1 chnl=0 +char id=1179 x=271 y=343 width=32 height=38 xoffset=1 yoffset=31 xadvance=31 page=1 chnl=0 +char id=1180 x=0 y=216 width=50 height=43 xoffset=1 yoffset=18 xadvance=44 page=1 chnl=0 +char id=1181 x=434 y=417 width=34 height=30 xoffset=1 yoffset=31 xadvance=32 page=1 chnl=0 +char id=1182 x=50 y=216 width=47 height=43 xoffset=1 yoffset=18 xadvance=41 page=1 chnl=0 +char id=1183 x=468 y=417 width=32 height=30 xoffset=1 yoffset=31 xadvance=30 page=1 chnl=0 +char id=1184 x=97 y=216 width=51 height=43 xoffset=6 yoffset=18 xadvance=50 page=1 chnl=0 +char id=1185 x=500 y=417 width=34 height=30 xoffset=4 yoffset=31 xadvance=35 page=1 chnl=0 +char id=1187 x=520 y=343 width=40 height=37 xoffset=1 yoffset=32 xadvance=32 page=1 chnl=0 +char id=1188 x=148 y=216 width=70 height=43 xoffset=1 yoffset=18 xadvance=58 page=1 chnl=0 +char id=1189 x=509 y=447 width=48 height=29 xoffset=1 yoffset=32 xadvance=40 page=1 chnl=0 +char id=1191 x=218 y=216 width=45 height=43 xoffset=1 yoffset=32 xadvance=44 page=1 chnl=0 +char id=1193 x=562 y=382 width=32 height=31 xoffset=3 yoffset=31 xadvance=31 page=1 chnl=0 +char id=1195 x=169 y=302 width=29 height=41 xoffset=3 yoffset=31 xadvance=25 page=1 chnl=0 +char id=1197 x=769 y=343 width=32 height=36 xoffset=4 yoffset=32 xadvance=27 page=1 chnl=0 +char id=1198 x=263 y=216 width=51 height=43 xoffset=8 yoffset=18 xadvance=44 page=1 chnl=0 +char id=1199 x=314 y=216 width=40 height=43 xoffset=5 yoffset=32 xadvance=34 page=1 chnl=0 +char id=1200 x=354 y=216 width=51 height=43 xoffset=8 yoffset=18 xadvance=44 page=1 chnl=0 +char id=1201 x=405 y=216 width=41 height=43 xoffset=4 yoffset=32 xadvance=34 page=1 chnl=0 +char id=1203 x=560 y=343 width=32 height=37 xoffset=1 yoffset=32 xadvance=31 page=1 chnl=0 +char id=1205 x=801 y=343 width=49 height=36 xoffset=4 yoffset=32 xadvance=42 page=1 chnl=0 +char id=1207 x=592 y=343 width=36 height=37 xoffset=5 yoffset=32 xadvance=30 page=1 chnl=0 +char id=1208 x=446 y=216 width=51 height=43 xoffset=8 yoffset=18 xadvance=44 page=1 chnl=0 +char id=1209 x=557 y=447 width=37 height=29 xoffset=5 yoffset=32 xadvance=33 page=1 chnl=0 +char id=1210 x=497 y=216 width=42 height=43 xoffset=1 yoffset=18 xadvance=42 page=1 chnl=0 +char id=1211 x=38 y=0 width=32 height=44 xoffset=0 yoffset=17 xadvance=31 page=1 chnl=0 +char id=1213 x=291 y=382 width=34 height=33 xoffset=5 yoffset=29 xadvance=33 page=1 chnl=0 +char id=1215 x=198 y=302 width=34 height=41 xoffset=5 yoffset=29 xadvance=33 page=1 chnl=0 +char id=1216 x=539 y=216 width=33 height=43 xoffset=1 yoffset=18 xadvance=19 page=1 chnl=0 +char id=1218 x=70 y=0 width=47 height=44 xoffset=0 yoffset=17 xadvance=40 page=1 chnl=0 +char id=1220 x=117 y=0 width=35 height=44 xoffset=1 yoffset=31 xadvance=27 page=1 chnl=0 +char id=1222 x=963 y=302 width=40 height=39 xoffset=0 yoffset=32 xadvance=29 page=1 chnl=0 +char id=1224 x=572 y=216 width=38 height=43 xoffset=1 yoffset=32 xadvance=30 page=1 chnl=0 +char id=1226 x=570 y=302 width=43 height=40 xoffset=1 yoffset=31 xadvance=33 page=1 chnl=0 +char id=1228 x=850 y=343 width=36 height=36 xoffset=5 yoffset=32 xadvance=30 page=1 chnl=0 +char id=1230 x=0 y=343 width=48 height=39 xoffset=1 yoffset=32 xadvance=38 page=1 chnl=0 +char id=1231 x=610 y=216 width=47 height=43 xoffset=1 yoffset=18 xadvance=20 page=1 chnl=0 +char id=1235 x=232 y=302 width=42 height=41 xoffset=3 yoffset=21 xadvance=26 page=1 chnl=0 +char id=1236 x=657 y=216 width=64 height=43 xoffset=0 yoffset=18 xadvance=55 page=1 chnl=0 +char id=1237 x=594 y=382 width=42 height=31 xoffset=2 yoffset=31 xadvance=38 page=1 chnl=0 +char id=1241 x=636 y=382 width=28 height=31 xoffset=0 yoffset=31 xadvance=26 page=1 chnl=0 +char id=1243 x=274 y=302 width=46 height=41 xoffset=1 yoffset=21 xadvance=26 page=1 chnl=0 +char id=1245 x=48 y=343 width=47 height=39 xoffset=0 yoffset=22 xadvance=40 page=1 chnl=0 +char id=1247 x=320 y=302 width=44 height=41 xoffset=1 yoffset=21 xadvance=24 page=1 chnl=0 +char id=1248 x=152 y=0 width=41 height=44 xoffset=2 yoffset=18 xadvance=32 page=1 chnl=0 +char id=1249 x=534 y=417 width=26 height=30 xoffset=2 yoffset=32 xadvance=21 page=1 chnl=0 +char id=1251 x=303 y=343 width=44 height=38 xoffset=1 yoffset=23 xadvance=32 page=1 chnl=0 +char id=1253 x=613 y=302 width=44 height=40 xoffset=1 yoffset=21 xadvance=32 page=1 chnl=0 +char id=1255 x=364 y=302 width=43 height=41 xoffset=5 yoffset=21 xadvance=29 page=1 chnl=0 +char id=1257 x=664 y=382 width=32 height=31 xoffset=3 yoffset=31 xadvance=29 page=1 chnl=0 +char id=1259 x=657 y=302 width=43 height=40 xoffset=3 yoffset=22 xadvance=29 page=1 chnl=0 +char id=1261 x=407 y=302 width=42 height=41 xoffset=1 yoffset=21 xadvance=26 page=1 chnl=0 +char id=1269 x=700 y=302 width=42 height=40 xoffset=5 yoffset=21 xadvance=30 page=1 chnl=0 +char id=1271 x=886 y=343 width=31 height=36 xoffset=1 yoffset=32 xadvance=23 page=1 chnl=0 +char id=1273 x=742 y=302 width=48 height=40 xoffset=1 yoffset=21 xadvance=38 page=1 chnl=0 +char id=1275 x=193 y=0 width=31 height=44 xoffset=1 yoffset=32 xadvance=23 page=1 chnl=0 +char id=1277 x=721 y=216 width=37 height=43 xoffset=0 yoffset=32 xadvance=26 page=1 chnl=0 +char id=1278 x=758 y=216 width=57 height=43 xoffset=0 yoffset=18 xadvance=44 page=1 chnl=0 +char id=1279 x=594 y=447 width=33 height=29 xoffset=0 yoffset=32 xadvance=30 page=1 chnl=0 +char id=1280 x=815 y=216 width=47 height=43 xoffset=2 yoffset=18 xadvance=34 page=1 chnl=0 +char id=1282 x=862 y=216 width=61 height=43 xoffset=2 yoffset=18 xadvance=56 page=1 chnl=0 +char id=1287 x=95 y=343 width=26 height=39 xoffset=4 yoffset=31 xadvance=28 page=1 chnl=0 +char id=1288 x=224 y=0 width=65 height=44 xoffset=2 yoffset=18 xadvance=60 page=1 chnl=0 +char id=1290 x=289 y=0 width=68 height=44 xoffset=1 yoffset=18 xadvance=60 page=1 chnl=0 +char id=1291 x=325 y=382 width=45 height=33 xoffset=0 yoffset=31 xadvance=42 page=1 chnl=0 +char id=1293 x=696 y=382 width=28 height=31 xoffset=3 yoffset=31 xadvance=26 page=1 chnl=0 +char id=1294 x=357 y=0 width=47 height=44 xoffset=6 yoffset=18 xadvance=44 page=1 chnl=0 +char id=1295 x=370 y=382 width=31 height=33 xoffset=4 yoffset=31 xadvance=30 page=1 chnl=0 +char id=1297 x=724 y=382 width=29 height=31 xoffset=2 yoffset=31 xadvance=24 page=1 chnl=0 +char id=1299 x=923 y=216 width=40 height=43 xoffset=0 yoffset=32 xadvance=29 page=1 chnl=0 +char id=1300 x=404 y=0 width=73 height=44 xoffset=1 yoffset=18 xadvance=59 page=1 chnl=0 +char id=1301 x=560 y=417 width=44 height=30 xoffset=0 yoffset=32 xadvance=39 page=1 chnl=0 +char id=1302 x=0 y=259 width=64 height=43 xoffset=0 yoffset=18 xadvance=51 page=1 chnl=0 +char id=1303 x=477 y=0 width=51 height=44 xoffset=-2 yoffset=31 xadvance=43 page=1 chnl=0 +char id=1304 x=64 y=259 width=66 height=43 xoffset=1 yoffset=18 xadvance=60 page=1 chnl=0 +char id=1305 x=753 y=382 width=51 height=31 xoffset=0 yoffset=31 xadvance=46 page=1 chnl=0 +char id=1307 x=528 y=0 width=30 height=44 xoffset=3 yoffset=31 xadvance=30 page=1 chnl=0 +char id=1308 x=558 y=0 width=67 height=44 xoffset=7 yoffset=18 xadvance=59 page=1 chnl=0 +char id=1309 x=604 y=417 width=48 height=30 xoffset=5 yoffset=32 xadvance=42 page=1 chnl=0 +char id=1310 x=963 y=216 width=47 height=43 xoffset=1 yoffset=18 xadvance=41 page=1 chnl=0 +char id=1311 x=652 y=417 width=32 height=30 xoffset=1 yoffset=31 xadvance=30 page=1 chnl=0 +char id=1313 x=130 y=259 width=46 height=43 xoffset=0 yoffset=32 xadvance=43 page=1 chnl=0 +char id=1315 x=176 y=259 width=47 height=43 xoffset=1 yoffset=32 xadvance=45 page=1 chnl=0 +char id=8210 x=817 y=476 width=35 height=5 xoffset=2 yoffset=44 xadvance=30 page=1 chnl=0 +char id=8211 x=817 y=476 width=35 height=5 xoffset=2 yoffset=44 xadvance=30 page=1 chnl=0 +char id=8212 x=852 y=476 width=67 height=5 xoffset=2 yoffset=44 xadvance=62 page=1 chnl=0 +char id=8213 x=852 y=476 width=67 height=5 xoffset=2 yoffset=44 xadvance=62 page=1 chnl=0 +char id=8214 x=1004 y=44 width=18 height=41 xoffset=4 yoffset=25 xadvance=17 page=1 chnl=0 +char id=8215 x=599 y=476 width=24 height=11 xoffset=1 yoffset=63 xadvance=29 page=1 chnl=0 +char id=8216 x=1005 y=447 width=12 height=17 xoffset=9 yoffset=17 xadvance=14 page=1 chnl=0 +char id=8217 x=183 y=476 width=14 height=17 xoffset=9 yoffset=17 xadvance=14 page=1 chnl=0 +char id=8219 x=197 y=476 width=14 height=17 xoffset=9 yoffset=17 xadvance=14 page=1 chnl=0 +char id=8220 x=211 y=476 width=24 height=17 xoffset=9 yoffset=17 xadvance=26 page=1 chnl=0 +char id=8221 x=235 y=476 width=26 height=17 xoffset=9 yoffset=17 xadvance=26 page=1 chnl=0 +char id=8222 x=287 y=476 width=22 height=16 xoffset=3 yoffset=54 xadvance=26 page=1 chnl=0 +char id=8223 x=261 y=476 width=26 height=17 xoffset=9 yoffset=17 xadvance=26 page=1 chnl=0 +char id=8226 x=143 y=476 width=20 height=18 xoffset=6 yoffset=31 xadvance=20 page=1 chnl=0 +char id=8230 x=707 y=476 width=49 height=8 xoffset=8 yoffset=54 xadvance=62 page=1 chnl=0 +char id=8242 x=0 y=476 width=22 height=19 xoffset=7 yoffset=13 xadvance=14 page=1 chnl=0 +char id=8243 x=22 y=476 width=36 height=19 xoffset=7 yoffset=13 xadvance=24 page=1 chnl=0 +char id=8244 x=58 y=476 width=47 height=19 xoffset=7 yoffset=13 xadvance=37 page=1 chnl=0 +char id=8249 x=814 y=447 width=20 height=25 xoffset=3 yoffset=34 xadvance=14 page=1 chnl=0 +char id=8250 x=834 y=447 width=18 height=25 xoffset=1 yoffset=34 xadvance=14 page=1 chnl=0 +char id=8254 x=982 y=476 width=39 height=4 xoffset=6 yoffset=22 xadvance=30 page=1 chnl=0 +char id=8355 x=223 y=259 width=49 height=43 xoffset=0 yoffset=18 xadvance=34 page=1 chnl=0 +char id=8358 x=625 y=0 width=59 height=44 xoffset=0 yoffset=18 xadvance=44 page=1 chnl=0 +char id=8359 x=684 y=0 width=63 height=44 xoffset=0 yoffset=18 xadvance=58 page=1 chnl=0 +char id=8360 x=747 y=0 width=65 height=44 xoffset=1 yoffset=18 xadvance=64 page=1 chnl=0 +char id=8361 x=812 y=0 width=61 height=44 xoffset=4 yoffset=18 xadvance=50 page=1 chnl=0 +char id=8365 x=272 y=259 width=53 height=43 xoffset=2 yoffset=18 xadvance=44 page=1 chnl=0 +char id=8366 x=325 y=259 width=44 height=43 xoffset=6 yoffset=18 xadvance=37 page=1 chnl=0 +char id=8369 x=369 y=259 width=48 height=43 xoffset=1 yoffset=18 xadvance=36 page=1 chnl=0 +char id=8371 x=873 y=0 width=46 height=44 xoffset=0 yoffset=17 xadvance=44 page=1 chnl=0 +char id=11360 x=417 y=259 width=42 height=43 xoffset=0 yoffset=18 xadvance=37 page=1 chnl=0 +char id=11361 x=919 y=0 width=27 height=44 xoffset=1 yoffset=17 xadvance=17 page=1 chnl=0 +char id=11362 x=459 y=259 width=42 height=43 xoffset=1 yoffset=18 xadvance=38 page=1 chnl=0 +char id=11363 x=501 y=259 width=44 height=43 xoffset=1 yoffset=18 xadvance=34 page=1 chnl=0 +char id=11365 x=628 y=343 width=35 height=37 xoffset=3 yoffset=27 xadvance=27 page=1 chnl=0 +char id=11366 x=691 y=259 width=28 height=42 xoffset=0 yoffset=24 xadvance=17 page=1 chnl=0 +char id=11372 x=663 y=343 width=32 height=37 xoffset=1 yoffset=32 xadvance=26 page=1 chnl=0 +char id=11377 x=804 y=382 width=43 height=31 xoffset=6 yoffset=31 xadvance=40 page=1 chnl=0 +char id=11379 x=847 y=382 width=58 height=31 xoffset=6 yoffset=31 xadvance=54 page=1 chnl=0 +char id=11380 x=74 y=382 width=35 height=35 xoffset=4 yoffset=27 xadvance=30 page=1 chnl=0 +char id=11381 x=545 y=259 width=38 height=43 xoffset=1 yoffset=18 xadvance=34 page=1 chnl=0 +char id=11382 x=627 y=447 width=26 height=29 xoffset=0 yoffset=32 xadvance=23 page=1 chnl=0 +char id=11383 x=905 y=382 width=38 height=31 xoffset=4 yoffset=31 xadvance=39 page=1 chnl=0 +kernings count=27010 +kerning first=107 second=100 amount=-3 +kerning first=8216 second=257 amount=-3 +kerning first=85 second=46 amount=-5 +kerning first=199 second=230 amount=-2 +kerning first=369 second=367 amount=-1 +kerning first=222 second=327 amount=-2 +kerning first=338 second=346 amount=-2 +kerning first=8220 second=380 amount=-1 +kerning first=280 second=65 amount=-2 +kerning first=354 second=66 amount=-1 +kerning first=200 second=67 amount=-1 +kerning first=208 second=68 amount=-2 +kerning first=45 second=69 amount=-5 +kerning first=352 second=70 amount=-3 +kerning first=370 second=71 amount=-1 +kerning first=346 second=72 amount=-3 +kerning first=67 second=73 amount=-3 +kerning first=356 second=74 amount=-4 +kerning first=374 second=75 amount=-1 +kerning first=198 second=76 amount=-2 +kerning first=350 second=77 amount=-3 +kerning first=336 second=78 amount=-2 +kerning first=304 second=79 amount=-2 +kerning first=262 second=80 amount=-3 +kerning first=370 second=81 amount=-1 +kerning first=81 second=82 amount=-2 +kerning first=290 second=83 amount=-2 +kerning first=83 second=84 amount=-3 +kerning first=8222 second=85 amount=-3 +kerning first=336 second=86 amount=-2 +kerning first=274 second=87 amount=-1 +kerning first=286 second=89 amount=-3 +kerning first=286 second=90 amount=-2 +kerning first=274 second=97 amount=-1 +kerning first=366 second=99 amount=-2 +kerning first=382 second=100 amount=-1 +kerning first=220 second=101 amount=-2 +kerning first=83 second=102 amount=-3 +kerning first=246 second=103 amount=-2 +kerning first=194 second=104 amount=-2 +kerning first=354 second=105 amount=-2 +kerning first=113 second=108 amount=-2 +kerning first=316 second=109 amount=-1 +kerning first=364 second=110 amount=-2 +kerning first=350 second=111 amount=-1 +kerning first=75 second=112 amount=-1 +kerning first=260 second=113 amount=-1 +kerning first=352 second=114 amount=-2 +kerning first=376 second=115 amount=-3 +kerning first=77 second=119 amount=-2 +kerning first=346 second=120 amount=-3 +kerning first=382 second=121 amount=-2 +kerning first=362 second=122 amount=-3 +kerning first=220 second=379 amount=-1 +kerning first=83 second=275 amount=-1 +kerning first=346 second=187 amount=-1 +kerning first=87 second=192 amount=-6 +kerning first=282 second=193 amount=-2 +kerning first=282 second=194 amount=-2 +kerning first=45 second=195 amount=-4 +kerning first=202 second=196 amount=-2 +kerning first=81 second=197 amount=-4 +kerning first=339 second=365 amount=-2 +kerning first=194 second=199 amount=-3 +kerning first=332 second=200 amount=-2 +kerning first=79 second=201 amount=-2 +kerning first=216 second=202 amount=-2 +kerning first=212 second=203 amount=-2 +kerning first=290 second=204 amount=-1 +kerning first=336 second=205 amount=-2 +kerning first=374 second=206 amount=-1 +kerning first=334 second=207 amount=-2 +kerning first=79 second=209 amount=-2 +kerning first=258 second=210 amount=-3 +kerning first=362 second=211 amount=-1 +kerning first=362 second=212 amount=-1 +kerning first=198 second=213 amount=-1 +kerning first=262 second=214 amount=-3 +kerning first=354 second=216 amount=-3 +kerning first=208 second=217 amount=-1 +kerning first=288 second=218 amount=-1 +kerning first=8250 second=219 amount=-4 +kerning first=350 second=220 amount=-3 +kerning first=350 second=221 amount=-3 +kerning first=8216 second=223 amount=-1 +kerning first=250 second=224 amount=-1 +kerning first=220 second=225 amount=-3 +kerning first=366 second=226 amount=-3 +kerning first=111 second=227 amount=-1 +kerning first=89 second=228 amount=-4 +kerning first=304 second=229 amount=-2 +kerning first=364 second=231 amount=-2 +kerning first=250 second=232 amount=-1 +kerning first=366 second=233 amount=-2 +kerning first=87 second=235 amount=-3 +kerning first=87 second=237 amount=-2 +kerning first=218 second=240 amount=-2 +kerning first=8220 second=241 amount=-1 +kerning first=75 second=242 amount=-2 +kerning first=250 second=244 amount=-1 +kerning first=67 second=245 amount=-2 +kerning first=73 second=246 amount=-2 +kerning first=69 second=249 amount=-2 +kerning first=378 second=250 amount=-2 +kerning first=368 second=251 amount=-1 +kerning first=8218 second=252 amount=-1 +kerning first=370 second=253 amount=-1 +kerning first=113 second=254 amount=-2 +kerning first=370 second=255 amount=-1 +kerning first=278 second=256 amount=-2 +kerning first=107 second=257 amount=-2 +kerning first=232 second=259 amount=-2 +kerning first=352 second=260 amount=-4 +kerning first=324 second=261 amount=-1 +kerning first=65 second=262 amount=-3 +kerning first=119 second=263 amount=-3 +kerning first=204 second=264 amount=-2 +kerning first=356 second=266 amount=-3 +kerning first=310 second=267 amount=-2 +kerning first=85 second=268 amount=-1 +kerning first=192 second=269 amount=-1 +kerning first=8250 second=270 amount=-5 +kerning first=226 second=271 amount=-1 +kerning first=107 second=273 amount=-3 +kerning first=67 second=275 amount=-2 +kerning first=117 second=277 amount=-1 +kerning first=79 second=278 amount=-2 +kerning first=105 second=279 amount=-1 +kerning first=198 second=280 amount=-2 +kerning first=204 second=281 amount=-2 +kerning first=352 second=282 amount=-3 +kerning first=264 second=284 amount=-3 +kerning first=67 second=286 amount=-3 +kerning first=8216 second=287 amount=-4 +kerning first=65 second=288 amount=-3 +kerning first=364 second=290 amount=-1 +kerning first=45 second=291 amount=-3 +kerning first=207 second=249 amount=-1 +kerning first=286 second=296 amount=-1 +kerning first=212 second=298 amount=-2 +kerning first=85 second=223 amount=-2 +kerning first=280 second=302 amount=-2 +kerning first=111 second=303 amount=-1 +kerning first=268 second=304 amount=-3 +kerning first=45 second=307 amount=-1 +kerning first=196 second=311 amount=-2 +kerning first=336 second=313 amount=-2 +kerning first=282 second=314 amount=-1 +kerning first=286 second=315 amount=-1 +kerning first=278 second=317 amount=-2 +kerning first=246 second=318 amount=-2 +kerning first=304 second=8249 amount=-4 +kerning first=352 second=323 amount=-3 +kerning first=220 second=324 amount=-2 +kerning first=71 second=325 amount=-1 +kerning first=8216 second=326 amount=-1 +kerning first=71 second=327 amount=-1 +kerning first=362 second=328 amount=-2 +kerning first=278 second=330 amount=-2 +kerning first=248 second=331 amount=-1 +kerning first=202 second=332 amount=-1 +kerning first=220 second=333 amount=-2 +kerning first=256 second=334 amount=-3 +kerning first=368 second=335 amount=-2 +kerning first=274 second=336 amount=-1 +kerning first=376 second=338 amount=-3 +kerning first=380 second=339 amount=-1 +kerning first=242 second=289 amount=-2 +kerning first=278 second=344 amount=-2 +kerning first=346 second=345 amount=-2 +kerning first=350 second=346 amount=-1 +kerning first=354 second=350 amount=-3 +kerning first=226 second=351 amount=-1 +kerning first=262 second=352 amount=-3 +kerning first=107 second=353 amount=-2 +kerning first=214 second=354 amount=-2 +kerning first=83 second=355 amount=-1 +kerning first=8220 second=356 amount=-1 +kerning first=45 second=357 amount=-1 +kerning first=278 second=289 amount=-3 +kerning first=236 second=361 amount=-1 +kerning first=334 second=362 amount=-1 +kerning first=350 second=364 amount=-3 +kerning first=97 second=365 amount=-1 +kerning first=338 second=366 amount=-2 +kerning first=362 second=367 amount=-1 +kerning first=262 second=368 amount=-2 +kerning first=368 second=369 amount=-1 +kerning first=332 second=370 amount=-1 +kerning first=74 second=268 amount=-2 +kerning first=310 second=374 amount=-2 +kerning first=105 second=375 amount=-3 +kerning first=370 second=377 amount=-1 +kerning first=210 second=378 amount=-2 +kerning first=374 second=379 amount=-3 +kerning first=288 second=380 amount=-1 +kerning first=374 second=381 amount=-3 +kerning first=240 second=382 amount=-2 +kerning first=244 second=237 amount=-1 +kerning first=208 second=379 amount=-2 +kerning first=272 second=218 amount=-1 +kerning first=350 second=289 amount=-3 +kerning first=217 second=244 amount=-2 +kerning first=208 second=237 amount=-1 +kerning first=377 second=282 amount=-1 +kerning first=253 second=244 amount=-3 +kerning first=225 second=263 amount=-1 +kerning first=200 second=218 amount=-2 +kerning first=289 second=244 amount=-2 +kerning first=87 second=199 amount=-3 +kerning first=261 second=263 amount=-1 +kerning first=103 second=237 amount=-2 +kerning first=112 second=371 amount=-1 +kerning first=223 second=380 amount=-2 +kerning first=67 second=237 amount=-1 +kerning first=1038 second=1117 amount=-4 +kerning first=75 second=8249 amount=-4 +kerning first=347 second=353 amount=-3 +kerning first=68 second=225 amount=-1 +kerning first=346 second=365 amount=-1 +kerning first=1027 second=1060 amount=-1 +kerning first=219 second=228 amount=-3 +kerning first=195 second=334 amount=-3 +kerning first=364 second=379 amount=-1 +kerning first=104 second=225 amount=-1 +kerning first=84 second=263 amount=-3 +kerning first=310 second=365 amount=-3 +kerning first=279 second=361 amount=-2 +kerning first=350 second=324 amount=-1 +kerning first=120 second=263 amount=-2 +kerning first=274 second=365 amount=-2 +kerning first=266 second=346 amount=-3 +kerning first=1043 second=1098 amount=-1 +kerning first=121 second=251 amount=-1 +kerning first=65 second=289 amount=-3 +kerning first=85 second=251 amount=-1 +kerning first=298 second=275 amount=-2 +kerning first=194 second=346 amount=-3 +kerning first=198 second=270 amount=-2 +kerning first=101 second=289 amount=-3 +kerning first=226 second=251 amount=-1 +kerning first=81 second=327 amount=-2 +kerning first=1063 second=1060 amount=-1 +kerning first=1051 second=1117 amount=-1 +kerning first=1071 second=1079 amount=-1 +kerning first=1079 second=1098 amount=-1 +kerning first=311 second=353 amount=-2 +kerning first=207 second=277 amount=-2 +kerning first=356 second=72 amount=-1 +kerning first=197 second=254 amount=-2 +kerning first=194 second=374 amount=-6 +kerning first=275 second=121 amount=-2 +kerning first=298 second=251 amount=-2 +kerning first=115 second=351 amount=-3 +kerning first=379 second=202 amount=-1 +kerning first=233 second=254 amount=-2 +kerning first=262 second=251 amount=-2 +kerning first=279 second=277 amount=-1 +kerning first=256 second=351 amount=-2 +kerning first=201 second=206 amount=-2 +kerning first=269 second=254 amount=-2 +kerning first=370 second=251 amount=-1 +kerning first=313 second=69 amount=-2 +kerning first=339 second=112 amount=-1 +kerning first=1105 second=1103 amount=-2 +kerning first=98 second=121 amount=-3 +kerning first=1045 second=1074 amount=-1 +kerning first=70 second=100 amount=-1 +kerning first=67 second=209 amount=-3 +kerning first=102 second=277 amount=-1 +kerning first=102 second=230 amount=-2 +kerning first=66 second=277 amount=-1 +kerning first=365 second=367 amount=-1 +kerning first=101 second=261 amount=-2 +kerning first=257 second=367 amount=-1 +kerning first=192 second=199 amount=-3 +kerning first=1024 second=1096 amount=-1 +kerning first=374 second=114 amount=-1 +kerning first=201 second=117 amount=-2 +kerning first=381 second=206 amount=-1 +kerning first=82 second=83 amount=-3 +kerning first=206 second=261 amount=-2 +kerning first=221 second=79 amount=-3 +kerning first=264 second=199 amount=-3 +kerning first=242 second=261 amount=-1 +kerning first=221 second=367 amount=-2 +kerning first=71 second=72 amount=-1 +kerning first=286 second=76 amount=-1 +kerning first=73 second=336 amount=-2 +kerning first=187 second=83 amount=-3 +kerning first=328 second=351 amount=-1 +kerning first=381 second=117 amount=-3 +kerning first=212 second=72 amount=-2 +kerning first=338 second=374 amount=-1 +kerning first=1057 second=1050 amount=-1 +kerning first=230 second=114 amount=-1 +kerning first=116 second=367 amount=-1 +kerning first=8222 second=356 amount=-6 +kerning first=214 second=76 amount=-2 +kerning first=339 second=255 amount=-2 +kerning first=284 second=72 amount=-1 +kerning first=266 second=374 amount=-1 +kerning first=347 second=121 amount=-3 +kerning first=364 second=351 amount=-2 +kerning first=211 second=344 amount=-2 +kerning first=311 second=121 amount=-1 +kerning first=376 second=193 amount=-6 +kerning first=317 second=318 amount=-2 +kerning first=287 second=240 amount=-2 +kerning first=266 second=86 amount=-1 +kerning first=365 second=107 amount=-2 +kerning first=1051 second=1089 amount=-1 +kerning first=323 second=240 amount=-2 +kerning first=8249 second=89 amount=-3 +kerning first=325 second=216 amount=-2 +kerning first=194 second=86 amount=-6 +kerning first=1052 second=1080 amount=-1 +kerning first=1027 second=1088 amount=-2 +kerning first=192 second=171 amount=-4 +kerning first=251 second=240 amount=-1 +kerning first=1063 second=1088 amount=-1 +kerning first=278 second=261 amount=-1 +kerning first=76 second=216 amount=-1 +kerning first=335 second=382 amount=-2 +kerning first=314 second=261 amount=-2 +kerning first=113 second=46 amount=-2 +kerning first=371 second=382 amount=-1 +kerning first=382 second=337 amount=-1 +kerning first=350 second=261 amount=-2 +kerning first=371 second=223 amount=-1 +kerning first=338 second=86 amount=-1 +kerning first=217 second=216 amount=-1 +kerning first=257 second=107 amount=-1 +kerning first=310 second=337 amount=-2 +kerning first=8217 second=380 amount=-1 +kerning first=280 second=209 amount=-2 +kerning first=1006 second=995 amount=-1 +kerning first=1006 second=996 amount=-1 +kerning first=1006 second=1005 amount=-1 +kerning first=1006 second=1006 amount=-1 +kerning first=208 second=209 amount=-2 +kerning first=81 second=221 amount=-2 +kerning first=1054 second=1024 amount=-1 +kerning first=1054 second=1025 amount=-1 +kerning first=1054 second=1030 amount=-1 +kerning first=1054 second=1031 amount=-1 +kerning first=1040 second=1033 amount=-1 +kerning first=1054 second=1034 amount=-1 +kerning first=1054 second=1036 amount=-1 +kerning first=1054 second=1037 amount=-1 +kerning first=1036 second=1038 amount=-3 +kerning first=1054 second=1039 amount=-1 +kerning first=1038 second=1040 amount=-6 +kerning first=228 second=171 amount=-2 +kerning first=1054 second=1042 amount=-1 +kerning first=199 second=202 amount=-3 +kerning first=1054 second=1045 amount=-1 +kerning first=1040 second=1047 amount=-2 +kerning first=1054 second=1048 amount=-1 +kerning first=1054 second=1049 amount=-1 +kerning first=1040 second=1051 amount=-1 +kerning first=1054 second=1052 amount=-1 +kerning first=1042 second=1053 amount=-2 +kerning first=1048 second=1054 amount=-1 +kerning first=1054 second=1055 amount=-1 +kerning first=1054 second=1056 amount=-1 +kerning first=264 second=171 amount=-4 +kerning first=1040 second=1058 amount=-3 +kerning first=1040 second=1059 amount=-4 +kerning first=1040 second=1060 amount=-3 +kerning first=1054 second=1062 amount=-1 +kerning first=1060 second=1063 amount=-2 +kerning first=1054 second=1064 amount=-1 +kerning first=1054 second=1065 amount=-1 +kerning first=1054 second=1067 amount=-1 +kerning first=1054 second=1070 amount=-1 +kerning first=1096 second=1072 amount=-1 +kerning first=1040 second=1073 amount=-2 +kerning first=356 second=100 amount=-3 +kerning first=1038 second=1075 amount=-4 +kerning first=1038 second=1076 amount=-5 +kerning first=1040 second=1077 amount=-2 +kerning first=1038 second=1078 amount=-3 +kerning first=352 second=209 amount=-3 +kerning first=1024 second=1080 amount=-1 +kerning first=1048 second=1081 amount=-1 +kerning first=1038 second=1083 amount=-5 +kerning first=1038 second=1084 amount=-4 +kerning first=1038 second=1085 amount=-4 +kerning first=1040 second=1086 amount=-2 +kerning first=1092 second=1087 amount=-1 +kerning first=1038 second=1088 amount=-4 +kerning first=1118 second=1089 amount=-2 +kerning first=1040 second=1090 amount=-2 +kerning first=1040 second=1091 amount=-3 +kerning first=74 second=240 amount=-2 +kerning first=1038 second=1093 amount=-3 +kerning first=1038 second=1094 amount=-4 +kerning first=1062 second=1095 amount=-3 +kerning first=1038 second=1096 amount=-4 +kerning first=1038 second=1097 amount=-4 +kerning first=1038 second=1100 amount=-4 +kerning first=8216 second=229 amount=-3 +kerning first=1038 second=1102 amount=-4 +kerning first=1038 second=1103 amount=-5 +kerning first=264 second=227 amount=-2 +kerning first=1040 second=1105 amount=-2 +kerning first=1074 second=1107 amount=-1 +kerning first=377 second=226 amount=-1 +kerning first=286 second=252 amount=-1 +kerning first=196 second=350 amount=-3 +kerning first=39 second=1111 amount=3 +kerning first=1038 second=1113 amount=-5 +kerning first=1038 second=1114 amount=-4 +kerning first=84 second=207 amount=-1 +kerning first=1038 second=1116 amount=-4 +kerning first=1114 second=1117 amount=-1 +kerning first=1116 second=1118 amount=-2 +kerning first=1038 second=1119 amount=-4 +kerning first=228 second=227 amount=-1 +kerning first=287 second=335 amount=-2 +kerning first=291 second=339 amount=-2 +kerning first=1025 second=1056 amount=-1 +kerning first=1047 second=1050 amount=-2 +kerning first=336 second=380 amount=-2 +kerning first=380 second=246 amount=-1 +kerning first=109 second=252 amount=-1 +kerning first=102 second=305 amount=-1 +kerning first=211 second=201 amount=-2 +kerning first=79 second=274 amount=-2 +kerning first=344 second=246 amount=-3 +kerning first=356 second=44 amount=-5 +kerning first=376 second=350 amount=-3 +kerning first=336 second=227 amount=-1 +kerning first=1108 second=1095 amount=-1 +kerning first=268 second=350 amount=-3 +kerning first=1050 second=1101 amount=-1 +kerning first=250 second=252 amount=-1 +kerning first=304 second=350 amount=-2 +kerning first=1100 second=1076 amount=-2 +kerning first=327 second=103 amount=-3 +kerning first=279 second=305 amount=-2 +kerning first=369 second=291 amount=-3 +kerning first=268 second=90 amount=-2 +kerning first=210 second=356 amount=-2 +kerning first=291 second=103 amount=-2 +kerning first=243 second=305 amount=-1 +kerning first=227 second=382 amount=-1 +kerning first=333 second=291 amount=-2 +kerning first=350 second=317 amount=-3 +kerning first=376 second=90 amount=-3 +kerning first=255 second=103 amount=-3 +kerning first=351 second=305 amount=-2 +kerning first=218 second=260 amount=-4 +kerning first=263 second=382 amount=-2 +kerning first=221 second=323 amount=-1 +kerning first=8250 second=253 amount=-3 +kerning first=8217 second=273 amount=-3 +kerning first=315 second=305 amount=-2 +kerning first=261 second=337 amount=-1 +kerning first=261 second=291 amount=-1 +kerning first=211 second=84 amount=-2 +kerning first=233 second=226 amount=-2 +kerning first=290 second=260 amount=-3 +kerning first=225 second=291 amount=-2 +kerning first=97 second=337 amount=-1 +kerning first=315 second=45 amount=-1 +kerning first=114 second=103 amount=-2 +kerning first=269 second=226 amount=-2 +kerning first=78 second=103 amount=-3 +kerning first=305 second=226 amount=-1 +kerning first=362 second=260 amount=-4 +kerning first=86 second=382 amount=-3 +kerning first=120 second=291 amount=-2 +kerning first=122 second=382 amount=-2 +kerning first=84 second=291 amount=-4 +kerning first=351 second=45 amount=-1 +kerning first=354 second=213 amount=-3 +kerning first=240 second=109 amount=-1 +kerning first=77 second=115 amount=-2 +kerning first=201 second=89 amount=-1 +kerning first=99 second=109 amount=-2 +kerning first=323 second=212 amount=-2 +kerning first=218 second=115 amount=-2 +kerning first=254 second=115 amount=-2 +kerning first=377 second=78 amount=-1 +kerning first=113 second=115 amount=-2 +kerning first=66 second=45 amount=-3 +kerning first=363 second=103 amount=-3 +kerning first=315 second=193 amount=-2 +kerning first=248 second=44 amount=-3 +kerning first=362 second=115 amount=-2 +kerning first=212 second=44 amount=-3 +kerning first=381 second=89 amount=-2 +kerning first=364 second=268 amount=-1 +kerning first=362 second=232 amount=-2 +kerning first=69 second=213 amount=-1 +kerning first=284 second=44 amount=-3 +kerning first=326 second=115 amount=-1 +kerning first=69 second=353 amount=-1 +kerning first=368 second=303 amount=-2 +kerning first=71 second=44 amount=-3 +kerning first=113 second=232 amount=-1 +kerning first=8250 second=105 amount=-1 +kerning first=282 second=213 amount=-1 +kerning first=286 second=104 amount=-1 +kerning first=218 second=232 amount=-2 +kerning first=250 second=104 amount=-2 +kerning first=105 second=328 amount=-2 +kerning first=83 second=303 amount=-3 +kerning first=229 second=98 amount=-1 +kerning first=8250 second=77 amount=-5 +kerning first=376 second=118 amount=-3 +kerning first=69 second=328 amount=-1 +kerning first=119 second=303 amount=-2 +kerning first=337 second=98 amount=-1 +kerning first=324 second=8249 amount=-3 +kerning first=214 second=280 amount=-2 +kerning first=1092 second=1094 amount=-1 +kerning first=315 second=73 amount=-2 +kerning first=88 second=98 amount=-1 +kerning first=275 second=228 amount=-2 +kerning first=268 second=118 amount=-1 +kerning first=280 second=120 amount=-1 +kerning first=310 second=291 amount=-2 +kerning first=260 second=303 amount=-1 +kerning first=286 second=280 amount=-1 +kerning first=232 second=118 amount=-2 +kerning first=246 second=328 amount=-1 +kerning first=84 second=235 amount=-3 +kerning first=344 second=44 amount=-2 +kerning first=296 second=303 amount=-1 +kerning first=193 second=98 amount=-2 +kerning first=339 second=8221 amount=-2 +kerning first=352 second=120 amount=-3 +kerning first=120 second=235 amount=-2 +kerning first=304 second=118 amount=-2 +kerning first=224 second=303 amount=-1 +kerning first=87 second=370 amount=-1 +kerning first=257 second=283 amount=-1 +kerning first=196 second=118 amount=-3 +kerning first=354 second=328 amount=-3 +kerning first=221 second=283 amount=-3 +kerning first=192 second=370 amount=-3 +kerning first=1071 second=1107 amount=-1 +kerning first=316 second=261 amount=-2 +kerning first=1064 second=1104 amount=-1 +kerning first=316 second=371 amount=-2 +kerning first=282 second=241 amount=-1 +kerning first=8220 second=352 amount=-1 +kerning first=264 second=370 amount=-2 +kerning first=66 second=193 amount=-5 +kerning first=246 second=241 amount=-1 +kerning first=354 second=241 amount=-3 +kerning first=365 second=283 amount=-1 +kerning first=336 second=370 amount=-1 +kerning first=203 second=325 amount=-2 +kerning first=195 second=362 amount=-3 +kerning first=196 second=266 amount=-3 +kerning first=105 second=241 amount=-2 +kerning first=106 second=112 amount=-1 +kerning first=379 second=286 amount=-1 +kerning first=69 second=241 amount=-1 +kerning first=365 second=311 amount=-2 +kerning first=70 second=112 amount=-1 +kerning first=199 second=314 amount=-1 +kerning first=1104 second=1087 amount=-1 +kerning first=1046 second=1090 amount=-3 +kerning first=111 second=8221 amount=-2 +kerning first=199 second=286 amount=-3 +kerning first=246 second=355 amount=-1 +kerning first=257 second=311 amount=-1 +kerning first=368 second=331 amount=-2 +kerning first=120 second=307 amount=-1 +kerning first=235 second=314 amount=-3 +kerning first=75 second=8221 amount=-2 +kerning first=282 second=356 amount=-1 +kerning first=307 second=314 amount=-2 +kerning first=315 second=221 amount=-3 +kerning first=204 second=81 amount=-2 +kerning first=203 second=210 amount=-1 +kerning first=225 second=235 amount=-1 +kerning first=101 second=345 amount=-1 +kerning first=324 second=8221 amount=-4 +kerning first=8220 second=324 amount=-1 +kerning first=1064 second=1096 amount=-1 +kerning first=88 second=339 amount=-2 +kerning first=216 second=8221 amount=-2 +kerning first=116 second=224 amount=-1 +kerning first=377 second=250 amount=-3 +kerning first=119 second=331 amount=-2 +kerning first=252 second=8221 amount=-3 +kerning first=80 second=224 amount=-1 +kerning first=73 second=252 amount=-1 +kerning first=228 second=255 amount=-3 +kerning first=242 second=345 amount=-1 +kerning first=171 second=221 amount=-3 +kerning first=221 second=224 amount=-4 +kerning first=192 second=255 amount=-3 +kerning first=369 second=235 amount=-1 +kerning first=354 second=269 amount=-3 +kerning first=283 second=112 amount=-1 +kerning first=376 second=266 amount=-3 +kerning first=1082 second=1090 amount=-1 +kerning first=83 second=331 amount=-1 +kerning first=66 second=221 amount=-3 +kerning first=268 second=266 amount=-3 +kerning first=87 second=255 amount=-3 +kerning first=350 second=345 amount=-2 +kerning first=257 second=224 amount=-1 +kerning first=211 second=112 amount=-1 +kerning first=304 second=266 amount=-2 +kerning first=305 second=8249 amount=-3 +kerning first=365 second=224 amount=-1 +kerning first=263 second=326 amount=-2 +kerning first=274 second=250 amount=-2 +kerning first=97 second=281 amount=-1 +kerning first=65 second=8220 amount=-5 +kerning first=76 second=289 amount=-3 +kerning first=261 second=347 amount=-1 +kerning first=116 second=255 amount=-1 +kerning first=261 second=318 amount=-1 +kerning first=98 second=117 amount=-1 +kerning first=376 second=69 amount=-1 +kerning first=335 second=326 amount=-1 +kerning first=346 second=250 amount=-1 +kerning first=225 second=347 amount=-1 +kerning first=102 second=101 amount=-1 +kerning first=78 second=365 amount=-2 +kerning first=371 second=326 amount=-2 +kerning first=84 second=378 amount=-3 +kerning first=201 second=118 amount=-1 +kerning first=207 second=101 amount=-2 +kerning first=267 second=273 amount=-1 +kerning first=112 second=328 amount=-1 +kerning first=324 second=371 amount=-1 +kerning first=230 second=231 amount=-1 +kerning first=84 second=347 amount=-3 +kerning first=76 second=328 amount=-1 +kerning first=202 second=250 amount=-2 +kerning first=330 second=281 amount=-2 +kerning first=279 second=101 amount=-1 +kerning first=255 second=307 amount=-2 +kerning first=227 second=326 amount=-1 +kerning first=1048 second=1097 amount=-1 +kerning first=111 second=371 amount=-1 +kerning first=211 second=257 amount=-1 +kerning first=369 second=378 amount=-2 +kerning first=1082 second=1118 amount=-2 +kerning first=87 second=283 amount=-3 +kerning first=289 second=328 amount=-1 +kerning first=333 second=378 amount=-2 +kerning first=1105 second=1076 amount=-2 +kerning first=253 second=328 amount=-2 +kerning first=197 second=366 amount=-3 +kerning first=106 second=257 amount=-2 +kerning first=365 second=8220 amount=-3 +kerning first=70 second=288 amount=-1 +kerning first=217 second=328 amount=-2 +kerning first=252 second=371 amount=-1 +kerning first=272 second=302 amount=-2 +kerning first=225 second=378 amount=-1 +kerning first=289 second=101 amount=-2 +kerning first=1057 second=1073 amount=-1 +kerning first=264 second=283 amount=-2 +kerning first=70 second=257 amount=-2 +kerning first=257 second=8220 amount=-3 +kerning first=1093 second=1073 amount=-1 +kerning first=228 second=283 amount=-1 +kerning first=200 second=302 amount=-2 +kerning first=369 second=347 amount=-2 +kerning first=1065 second=1092 amount=-1 +kerning first=192 second=283 amount=-1 +kerning first=67 second=352 amount=-3 +kerning first=333 second=347 amount=-2 +kerning first=1024 second=1063 amount=-2 +kerning first=117 second=243 amount=-1 +kerning first=218 second=338 amount=-1 +kerning first=290 second=87 amount=-3 +kerning first=8217 second=361 amount=-1 +kerning first=305 second=106 amount=-2 +kerning first=44 second=8220 amount=-5 +kerning first=258 second=243 amount=-1 +kerning first=307 second=113 amount=-1 +kerning first=380 second=333 amount=-1 +kerning first=105 second=253 amount=-3 +kerning first=288 second=80 amount=-1 +kerning first=1092 second=1116 amount=-1 +kerning first=344 second=333 amount=-3 +kerning first=235 second=113 amount=-1 +kerning first=376 second=210 amount=-3 +kerning first=1039 second=1090 amount=-1 +kerning first=199 second=345 amount=-1 +kerning first=199 second=113 amount=-2 +kerning first=235 second=345 amount=-1 +kerning first=304 second=210 amount=-2 +kerning first=89 second=262 amount=-3 +kerning first=291 second=307 amount=-2 +kerning first=103 second=120 amount=-2 +kerning first=268 second=210 amount=-3 +kerning first=193 second=87 amount=-6 +kerning first=307 second=345 amount=-1 +kerning first=377 second=198 amount=-1 +kerning first=194 second=262 amount=-3 +kerning first=363 second=307 amount=-2 +kerning first=208 second=120 amount=-1 +kerning first=196 second=210 amount=-3 +kerning first=75 second=368 amount=-2 +kerning first=244 second=120 amount=-3 +kerning first=365 second=255 amount=-3 +kerning first=288 second=368 amount=-1 +kerning first=266 second=262 amount=-3 +kerning first=1092 second=1113 amount=-2 +kerning first=302 second=262 amount=-2 +kerning first=310 second=281 amount=-2 +kerning first=8250 second=225 amount=-1 +kerning first=330 second=243 amount=-2 +kerning first=1056 second=1113 amount=-2 +kerning first=216 second=368 amount=-1 +kerning first=338 second=262 amount=-1 +kerning first=346 second=281 amount=-1 +kerning first=257 second=255 amount=-3 +kerning first=366 second=243 amount=-2 +kerning first=374 second=262 amount=-3 +kerning first=86 second=323 amount=-1 +kerning first=221 second=255 amount=-3 +kerning first=219 second=279 amount=-2 +kerning first=106 second=229 amount=-2 +kerning first=119 second=99 amount=-3 +kerning first=365 second=227 amount=-1 +kerning first=352 second=324 amount=-1 +kerning first=272 second=274 amount=-2 +kerning first=83 second=99 amount=-1 +kerning first=89 second=234 amount=-3 +kerning first=291 second=279 amount=-2 +kerning first=1057 second=1101 amount=-1 +kerning first=224 second=99 amount=-1 +kerning first=255 second=279 amount=-3 +kerning first=70 second=229 amount=-2 +kerning first=200 second=274 amount=-2 +kerning first=1093 second=1101 amount=-1 +kerning first=257 second=227 amount=-1 +kerning first=283 second=229 amount=-2 +kerning first=228 second=259 amount=-1 +kerning first=291 second=44 amount=-3 +kerning first=296 second=99 amount=-2 +kerning first=1031 second=1099 amount=-1 +kerning first=377 second=369 amount=-3 +kerning first=202 second=278 amount=-2 +kerning first=255 second=44 amount=-5 +kerning first=260 second=99 amount=-1 +kerning first=211 second=229 amount=-1 +kerning first=108 second=233 amount=-1 +kerning first=363 second=44 amount=-2 +kerning first=368 second=99 amount=-2 +kerning first=78 second=279 amount=-2 +kerning first=280 second=324 amount=-1 +kerning first=72 second=233 amount=-2 +kerning first=66 second=104 amount=-3 +kerning first=371 second=99 amount=-3 +kerning first=254 second=382 amount=-2 +kerning first=371 second=267 amount=-3 +kerning first=374 second=234 amount=-3 +kerning first=206 second=122 amount=-1 +kerning first=346 second=278 amount=-3 +kerning first=370 second=223 amount=-2 +kerning first=355 second=229 amount=-1 +kerning first=1049 second=1114 amount=-1 +kerning first=249 second=233 amount=-1 +kerning first=212 second=330 amount=-2 +kerning first=194 second=234 amount=-1 +kerning first=233 second=106 amount=-2 +kerning first=368 second=114 amount=-1 +kerning first=221 second=227 amount=-5 +kerning first=230 second=234 amount=-1 +kerning first=327 second=279 amount=-2 +kerning first=269 second=106 amount=-2 +kerning first=266 second=234 amount=-2 +kerning first=379 second=317 amount=-1 +kerning first=67 second=296 amount=-3 +kerning first=217 second=81 amount=-1 +kerning first=116 second=227 amount=-1 +kerning first=302 second=234 amount=-2 +kerning first=70 second=281 amount=-1 +kerning first=80 second=227 amount=-1 +kerning first=86 second=66 amount=-1 +kerning first=106 second=316 amount=-2 +kerning first=321 second=264 amount=-1 +kerning first=366 second=212 amount=-1 +kerning first=344 second=361 amount=-2 +kerning first=199 second=110 amount=-1 +kerning first=83 second=219 amount=-3 +kerning first=86 second=267 amount=-3 +kerning first=235 second=110 amount=-2 +kerning first=1092 second=1085 amount=-1 +kerning first=330 second=212 amount=-2 +kerning first=8250 second=194 amount=-4 +kerning first=380 second=361 amount=-2 +kerning first=69 second=65 amount=-2 +kerning first=214 second=364 amount=-1 +kerning first=283 second=316 amount=-3 +kerning first=307 second=110 amount=-2 +kerning first=355 second=257 amount=-1 +kerning first=227 second=267 amount=-1 +kerning first=216 second=205 amount=-2 +kerning first=258 second=212 amount=-3 +kerning first=263 second=267 amount=-1 +kerning first=117 second=271 amount=-1 +kerning first=86 second=210 amount=-3 +kerning first=355 second=316 amount=-1 +kerning first=72 second=264 amount=-2 +kerning first=283 second=257 amount=-2 +kerning first=122 second=267 amount=-1 +kerning first=210 second=65 amount=-4 +kerning first=252 second=111 amount=-1 +kerning first=351 second=104 amount=-1 +kerning first=72 second=266 amount=-2 +kerning first=282 second=65 amount=-2 +kerning first=280 second=89 amount=-1 +kerning first=315 second=104 amount=-2 +kerning first=8216 second=109 amount=-1 +kerning first=286 second=364 amount=-1 +kerning first=354 second=65 amount=-6 +kerning first=352 second=89 amount=-3 +kerning first=243 second=104 amount=-1 +kerning first=335 second=8217 amount=-2 +kerning first=200 second=361 amount=-2 +kerning first=213 second=205 amount=-2 +kerning first=382 second=250 amount=-2 +kerning first=321 second=205 amount=-2 +kerning first=208 second=89 amount=-2 +kerning first=310 second=46 amount=-1 +kerning first=277 second=97 amount=-2 +kerning first=263 second=122 amount=-2 +kerning first=346 second=46 amount=-4 +kerning first=376 second=121 amount=-3 +kerning first=296 second=71 amount=-2 +kerning first=224 second=102 amount=-1 +kerning first=352 second=117 amount=-1 +kerning first=227 second=122 amount=-1 +kerning first=382 second=46 amount=-1 +kerning first=205 second=97 amount=-2 +kerning first=260 second=102 amount=-1 +kerning first=304 second=121 amount=-2 +kerning first=368 second=71 amount=-1 +kerning first=8216 second=84 amount=-1 +kerning first=66 second=76 amount=-4 +kerning first=346 second=225 amount=-2 +kerning first=202 second=46 amount=-1 +kerning first=232 second=121 amount=-2 +kerning first=382 second=225 amount=-1 +kerning first=371 second=122 amount=-1 +kerning first=196 second=121 amount=-3 +kerning first=260 second=71 amount=-3 +kerning first=335 second=122 amount=-2 +kerning first=274 second=46 amount=-1 +kerning first=67 second=377 amount=-2 +kerning first=280 second=377 amount=-1 +kerning first=1059 second=1108 amount=-4 +kerning first=67 second=117 amount=-2 +kerning first=90 second=90 amount=-1 +kerning first=277 second=245 amount=-1 +kerning first=366 second=240 amount=-2 +kerning first=208 second=377 amount=-2 +kerning first=97 second=46 amount=-1 +kerning first=78 second=332 amount=-2 +kerning first=332 second=219 amount=-1 +kerning first=205 second=245 amount=-2 +kerning first=374 second=290 amount=-3 +kerning first=122 second=122 amount=-2 +kerning first=87 second=267 amount=-3 +kerning first=219 second=332 amount=-1 +kerning first=244 second=117 amount=-1 +kerning first=288 second=200 amount=-1 +kerning first=86 second=122 amount=-3 +kerning first=78 second=363 amount=-2 +kerning first=260 second=219 amount=-3 +kerning first=368 second=102 amount=-1 +kerning first=1079 second=1097 amount=-1 +kerning first=315 second=76 amount=-2 +kerning first=352 second=377 amount=-1 +kerning first=89 second=287 amount=-4 +kerning first=316 second=117 amount=-2 +kerning first=216 second=200 amount=-2 +kerning first=350 second=381 amount=-1 +kerning first=280 second=117 amount=-2 +kerning first=231 second=44 amount=-3 +kerning first=377 second=310 amount=-1 +kerning first=194 second=287 amount=-3 +kerning first=302 second=83 amount=-2 +kerning first=205 second=214 amount=-2 +kerning first=374 second=259 amount=-5 +kerning first=327 second=332 amount=-2 +kerning first=313 second=214 amount=-1 +kerning first=1037 second=1114 amount=-1 +kerning first=100 second=242 amount=-1 +kerning first=266 second=287 amount=-3 +kerning first=1073 second=1114 amount=-1 +kerning first=230 second=287 amount=-3 +kerning first=266 second=259 amount=-2 +kerning first=205 second=242 amount=-2 +kerning first=338 second=287 amount=-3 +kerning first=330 second=240 amount=-2 +kerning first=230 second=259 amount=-2 +kerning first=302 second=287 amount=-3 +kerning first=86 second=298 amount=-1 +kerning first=338 second=259 amount=-1 +kerning first=277 second=242 amount=-1 +kerning first=258 second=240 amount=-1 +kerning first=302 second=259 amount=-2 +kerning first=374 second=287 amount=-4 +kerning first=314 second=8217 amount=-3 +kerning first=71 second=8220 amount=-1 +kerning first=89 second=259 amount=-5 +kerning first=200 second=330 amount=-2 +kerning first=233 second=369 amount=-2 +kerning first=368 second=8249 amount=-5 +kerning first=87 second=8250 amount=-3 +kerning first=346 second=77 amount=-3 +kerning first=216 second=197 amount=-4 +kerning first=346 second=194 amount=-4 +kerning first=333 second=375 amount=-3 +kerning first=305 second=369 amount=-1 +kerning first=103 second=324 amount=-1 +kerning first=249 second=116 amount=-1 +kerning first=8217 second=357 amount=-1 +kerning first=288 second=197 amount=-3 +kerning first=100 second=97 amount=-1 +kerning first=274 second=194 amount=-2 +kerning first=86 second=119 amount=-3 +kerning first=336 second=89 amount=-2 +kerning first=122 second=119 amount=-2 +kerning first=253 second=110 amount=-2 +kerning first=272 second=330 amount=-2 +kerning first=202 second=194 amount=-2 +kerning first=227 second=119 amount=-3 +kerning first=288 second=228 amount=-1 +kerning first=310 second=253 amount=-3 +kerning first=84 second=375 amount=-3 +kerning first=266 second=203 amount=-3 +kerning first=252 second=228 amount=-1 +kerning first=253 second=234 amount=-3 +kerning first=1098 second=1100 amount=-1 +kerning first=346 second=253 amount=-2 +kerning first=327 second=248 amount=-2 +kerning first=216 second=228 amount=-1 +kerning first=382 second=253 amount=-2 +kerning first=335 second=119 amount=-2 +kerning first=67 second=380 amount=-2 +kerning first=202 second=74 amount=-1 +kerning first=381 second=197 amount=-1 +kerning first=78 second=100 amount=-2 +kerning first=377 second=223 amount=-1 +kerning first=371 second=119 amount=-3 +kerning first=255 second=248 amount=-3 +kerning first=111 second=228 amount=-1 +kerning first=366 second=268 amount=-1 +kerning first=45 second=355 amount=-1 +kerning first=261 second=375 amount=-2 +kerning first=89 second=203 amount=-1 +kerning first=274 second=74 amount=-1 +kerning first=75 second=228 amount=-1 +kerning first=330 second=268 amount=-2 +kerning first=8250 second=250 amount=-1 +kerning first=225 second=375 amount=-3 +kerning first=269 second=223 amount=-1 +kerning first=219 second=248 amount=-2 +kerning first=346 second=74 amount=-2 +kerning first=233 second=223 amount=-1 +kerning first=1081 second=1105 amount=-1 +kerning first=282 second=68 amount=-2 +kerning first=100 second=273 amount=-1 +kerning first=210 second=68 amount=-2 +kerning first=379 second=113 amount=-1 +kerning first=375 second=103 amount=-3 +kerning first=117 second=355 amount=-1 +kerning first=216 second=80 amount=-2 +kerning first=90 second=214 amount=-1 +kerning first=258 second=268 amount=-3 +kerning first=374 second=203 amount=-1 +kerning first=354 second=68 amount=-1 +kerning first=1059 second=1088 amount=-4 +kerning first=211 second=313 amount=-2 +kerning first=338 second=203 amount=-2 +kerning first=252 second=108 amount=-2 +kerning first=219 second=363 amount=-1 +kerning first=86 second=270 amount=-1 +kerning first=288 second=315 amount=-1 +kerning first=1087 second=1086 amount=-1 +kerning first=8250 second=365 amount=-1 +kerning first=266 second=290 amount=-3 +kerning first=255 second=363 amount=-1 +kerning first=1051 second=1086 amount=-1 +kerning first=302 second=290 amount=-2 +kerning first=324 second=108 amount=-1 +kerning first=291 second=363 amount=-1 +kerning first=338 second=290 amount=-1 +kerning first=288 second=108 amount=-1 +kerning first=327 second=363 amount=-2 +kerning first=255 second=335 amount=-3 +kerning first=194 second=318 amount=-2 +kerning first=346 second=105 amount=-3 +kerning first=291 second=335 amount=-2 +kerning first=199 second=85 amount=-2 +kerning first=230 second=318 amount=-3 +kerning first=382 second=105 amount=-1 +kerning first=100 second=245 amount=-1 +kerning first=327 second=335 amount=-2 +kerning first=8216 second=112 amount=-1 +kerning first=274 second=105 amount=-1 +kerning first=216 second=315 amount=-2 +kerning first=363 second=335 amount=-1 +kerning first=353 second=237 amount=-2 +kerning first=1070 second=1063 amount=-2 +kerning first=78 second=335 amount=-2 +kerning first=280 second=380 amount=-2 +kerning first=338 second=318 amount=-1 +kerning first=202 second=105 amount=-1 +kerning first=202 second=225 amount=-1 +kerning first=316 second=380 amount=-1 +kerning first=99 second=45 amount=-2 +kerning first=374 second=231 amount=-3 +kerning first=8216 second=89 amount=-1 +kerning first=81 second=296 amount=-2 +kerning first=282 second=198 amount=-2 +kerning first=377 second=338 amount=-1 +kerning first=97 second=105 amount=-1 +kerning first=266 second=231 amount=-2 +kerning first=274 second=225 amount=-1 +kerning first=219 second=335 amount=-2 +kerning first=45 second=296 amount=-5 +kerning first=302 second=231 amount=-2 +kerning first=310 second=225 amount=-1 +kerning first=362 second=192 amount=-4 +kerning first=103 second=380 amount=-3 +kerning first=75 second=108 amount=-1 +kerning first=257 second=8217 amount=-3 +kerning first=74 second=194 amount=-5 +kerning first=212 second=8220 amount=-2 +kerning first=208 second=380 amount=-2 +kerning first=97 second=225 amount=-1 +kerning first=222 second=296 amount=-2 +kerning first=111 second=108 amount=-2 +kerning first=197 second=338 amount=-3 +kerning first=8250 second=278 amount=-5 +kerning first=252 second=225 amount=-1 +kerning first=376 second=325 amount=-1 +kerning first=353 second=228 amount=-1 +kerning first=288 second=225 amount=-1 +kerning first=77 second=235 amount=-2 +kerning first=8218 second=361 amount=-1 +kerning first=8250 second=80 amount=-5 +kerning first=233 second=251 amount=-2 +kerning first=324 second=225 amount=-1 +kerning first=113 second=235 amount=-1 +kerning first=197 second=251 amount=-3 +kerning first=281 second=228 amount=-2 +kerning first=315 second=280 amount=-2 +kerning first=1105 second=1100 amount=-1 +kerning first=305 second=251 amount=-1 +kerning first=245 second=228 amount=-1 +kerning first=75 second=225 amount=-1 +kerning first=218 second=235 amount=-2 +kerning first=90 second=303 amount=-1 +kerning first=67 second=206 amount=-3 +kerning first=269 second=251 amount=-2 +kerning first=378 second=273 amount=-1 +kerning first=209 second=228 amount=-2 +kerning first=111 second=225 amount=-1 +kerning first=208 second=206 amount=-2 +kerning first=377 second=251 amount=-3 +kerning first=1060 second=1093 amount=-1 +kerning first=313 second=270 amount=-2 +kerning first=69 second=171 amount=-2 +kerning first=104 second=228 amount=-1 +kerning first=216 second=225 amount=-1 +kerning first=1024 second=1093 amount=-2 +kerning first=258 second=98 amount=-2 +kerning first=280 second=206 amount=-2 +kerning first=88 second=355 amount=-1 +kerning first=68 second=228 amount=-1 +kerning first=234 second=273 amount=-1 +kerning first=1047 second=1025 amount=-2 +kerning first=100 second=45 amount=-2 +kerning first=352 second=206 amount=-3 +kerning first=274 second=102 amount=-2 +kerning first=332 second=46 amount=-3 +kerning first=368 second=46 amount=-5 +kerning first=1090 second=1113 amount=-3 +kerning first=83 second=46 amount=-4 +kerning first=89 second=83 amount=-3 +kerning first=376 second=263 amount=-3 +kerning first=268 second=325 amount=-3 +kerning first=66 second=280 amount=-4 +kerning first=119 second=46 amount=-5 +kerning first=193 second=355 amount=-1 +kerning first=97 second=102 amount=-1 +kerning first=1114 second=1107 amount=-1 +kerning first=194 second=83 amount=-3 +kerning first=99 second=8249 amount=-2 +kerning first=102 second=121 amount=-1 +kerning first=224 second=46 amount=-1 +kerning first=1036 second=1098 amount=-3 +kerning first=311 second=363 amount=-1 +kerning first=8217 second=248 amount=-3 +kerning first=187 second=318 amount=-1 +kerning first=266 second=83 amount=-3 +kerning first=356 second=363 amount=-2 +kerning first=75 second=289 amount=-2 +kerning first=240 second=112 amount=-1 +kerning first=74 second=67 amount=-2 +kerning first=223 second=318 amount=-2 +kerning first=200 second=221 amount=-1 +kerning first=281 second=8217 amount=-2 +kerning first=204 second=112 amount=-1 +kerning first=259 second=318 amount=-1 +kerning first=338 second=83 amount=-2 +kerning first=295 second=318 amount=-1 +kerning first=374 second=83 amount=-3 +kerning first=346 second=102 amount=-3 +kerning first=99 second=112 amount=-1 +kerning first=331 second=318 amount=-1 +kerning first=382 second=102 amount=-2 +kerning first=367 second=318 amount=-2 +kerning first=115 second=46 amount=-2 +kerning first=286 second=311 amount=-1 +kerning first=84 second=266 amount=-3 +kerning first=250 second=311 amount=-2 +kerning first=202 second=84 amount=-1 +kerning first=339 second=105 amount=-2 +kerning first=1105 second=1114 amount=-1 +kerning first=362 second=235 amount=-2 +kerning first=45 second=98 amount=-1 +kerning first=76 second=304 amount=-2 +kerning first=375 second=105 amount=-2 +kerning first=324 second=259 amount=-1 +kerning first=267 second=105 amount=-2 +kerning first=117 second=98 amount=-2 +kerning first=303 second=105 amount=-1 +kerning first=323 second=67 amount=-2 +kerning first=70 second=81 amount=-1 +kerning first=195 second=105 amount=-1 +kerning first=216 second=259 amount=-1 +kerning first=231 second=105 amount=-2 +kerning first=344 second=221 amount=-3 +kerning first=72 second=262 amount=-2 +kerning first=90 second=105 amount=-1 +kerning first=86 second=214 amount=-3 +kerning first=288 second=259 amount=-1 +kerning first=252 second=259 amount=-1 +kerning first=272 second=221 amount=-2 +kerning first=277 second=100 amount=-1 +kerning first=80 second=240 amount=-1 +kerning first=286 second=249 amount=-1 +kerning first=264 second=230 amount=-2 +kerning first=1050 second=1098 amount=-3 +kerning first=1054 second=1050 amount=-1 +kerning first=335 second=104 amount=-1 +kerning first=98 second=351 amount=-2 +kerning first=201 second=346 amount=-2 +kerning first=250 second=249 amount=-1 +kerning first=228 second=230 amount=-1 +kerning first=84 second=204 amount=-1 +kerning first=100 second=100 amount=-1 +kerning first=117 second=375 amount=-3 +kerning first=203 second=350 amount=-2 +kerning first=379 second=171 amount=-3 +kerning first=289 second=275 amount=-2 +kerning first=87 second=230 amount=-5 +kerning first=213 second=379 amount=-2 +kerning first=325 second=275 amount=-2 +kerning first=1025 second=1053 amount=-1 +kerning first=205 second=100 amount=-2 +kerning first=73 second=305 amount=-1 +kerning first=321 second=379 amount=-3 +kerning first=217 second=275 amount=-2 +kerning first=1088 second=1102 amount=-1 +kerning first=350 second=267 amount=-1 +kerning first=253 second=275 amount=-3 +kerning first=305 second=102 amount=-1 +kerning first=1113 second=1091 amount=-2 +kerning first=291 second=223 amount=-1 +kerning first=187 second=256 amount=-4 +kerning first=109 second=305 amount=-1 +kerning first=250 second=305 amount=-1 +kerning first=286 second=107 amount=-1 +kerning first=228 second=339 amount=-1 +kerning first=363 second=223 amount=-1 +kerning first=214 second=305 amount=-1 +kerning first=250 second=107 amount=-2 +kerning first=264 second=339 amount=-2 +kerning first=286 second=221 amount=-3 +kerning first=109 second=249 amount=-1 +kerning first=198 second=211 amount=-1 +kerning first=255 second=223 amount=-1 +kerning first=336 second=230 amount=-1 +kerning first=219 second=223 amount=-2 +kerning first=73 second=249 amount=-1 +kerning first=338 second=274 amount=-2 +kerning first=377 second=313 amount=-1 +kerning first=351 second=8217 amount=-2 +kerning first=196 second=263 amount=-1 +kerning first=231 second=365 amount=-2 +kerning first=8217 second=242 amount=-3 +kerning first=118 second=114 amount=-1 +kerning first=232 second=263 amount=-1 +kerning first=195 second=365 amount=-3 +kerning first=379 second=289 amount=-3 +kerning first=1104 second=1084 amount=-1 +kerning first=280 second=268 amount=-1 +kerning first=284 second=192 amount=-3 +kerning first=268 second=263 amount=-2 +kerning first=304 second=263 amount=-2 +kerning first=90 second=365 amount=-3 +kerning first=212 second=192 amount=-4 +kerning first=354 second=353 amount=-3 +kerning first=381 second=237 amount=-1 +kerning first=243 second=8217 amount=-2 +kerning first=354 second=244 amount=-3 +kerning first=66 second=218 amount=-3 +kerning first=192 second=339 amount=-1 +kerning first=221 second=199 amount=-3 +kerning first=279 second=8217 amount=-2 +kerning first=67 second=268 amount=-3 +kerning first=204 second=118 amount=-2 +kerning first=315 second=8217 amount=-4 +kerning first=71 second=192 amount=-3 +kerning first=362 second=102 amount=-1 +kerning first=87 second=339 amount=-3 +kerning first=260 second=334 amount=-3 +kerning first=1059 second=1105 amount=-4 +kerning first=1091 second=1072 amount=-2 +kerning first=246 second=353 amount=-2 +kerning first=201 second=237 amount=-1 +kerning first=334 second=282 amount=-2 +kerning first=374 second=315 amount=-1 +kerning first=282 second=353 amount=-1 +kerning first=1048 second=1114 amount=-1 +kerning first=338 second=315 amount=-2 +kerning first=296 second=334 amount=-2 +kerning first=1051 second=1099 amount=-1 +kerning first=262 second=282 amount=-3 +kerning first=85 second=44 amount=-5 +kerning first=375 second=365 amount=-1 +kerning first=199 second=289 amount=-3 +kerning first=89 second=315 amount=-1 +kerning first=1055 second=1072 amount=-1 +kerning first=105 second=353 amount=-2 +kerning first=105 second=244 amount=-1 +kerning first=307 second=289 amount=-3 +kerning first=8250 second=74 amount=-4 +kerning first=1042 second=1051 amount=-1 +kerning first=230 second=371 amount=-2 +kerning first=233 second=257 amount=-2 +kerning first=106 second=232 amount=-1 +kerning first=346 second=339 amount=-1 +kerning first=380 second=277 amount=-1 +kerning first=86 second=351 amount=-3 +kerning first=118 second=345 amount=-1 +kerning first=100 second=326 amount=-1 +kerning first=344 second=277 amount=-3 +kerning first=353 second=8249 amount=-1 +kerning first=350 second=202 amount=-3 +kerning first=90 second=99 amount=-1 +kerning first=355 second=347 amount=-1 +kerning first=284 second=346 amount=-2 +kerning first=206 second=337 amount=-2 +kerning first=231 second=99 amount=-1 +kerning first=70 second=232 amount=-1 +kerning first=207 second=375 amount=-2 +kerning first=278 second=202 amount=-2 +kerning first=236 second=277 amount=-1 +kerning first=195 second=99 amount=-1 +kerning first=283 second=347 amount=-2 +kerning first=317 second=8249 amount=-1 +kerning first=268 second=381 amount=-2 +kerning first=66 second=336 amount=-3 +kerning first=234 second=267 amount=-1 +kerning first=335 second=351 amount=-2 +kerning first=192 second=79 amount=-3 +kerning first=376 second=381 amount=-3 +kerning first=207 second=336 amount=-2 +kerning first=367 second=114 amount=-1 +kerning first=87 second=79 amount=-3 +kerning first=280 second=212 amount=-1 +kerning first=72 second=261 amount=-2 +kerning first=371 second=351 amount=-2 +kerning first=378 second=267 amount=-1 +kerning first=1031 second=1096 amount=-1 +kerning first=198 second=69 amount=-2 +kerning first=286 second=367 amount=-1 +kerning first=314 second=371 amount=-2 +kerning first=1067 second=1096 amount=-1 +kerning first=315 second=336 amount=-1 +kerning first=122 second=351 amount=-2 +kerning first=313 second=80 amount=-2 +kerning first=67 second=212 amount=-3 +kerning first=269 second=257 amount=-2 +kerning first=1024 second=1059 amount=-3 +kerning first=223 second=114 amount=-1 +kerning first=263 second=351 amount=-2 +kerning first=264 second=79 amount=-3 +kerning first=305 second=257 amount=-1 +kerning first=227 second=351 amount=-1 +kerning first=73 second=367 amount=-2 +kerning first=1087 second=1092 amount=-1 +kerning first=218 second=291 amount=-4 +kerning first=109 second=367 amount=-1 +kerning first=378 second=382 amount=-2 +kerning first=1046 second=1059 amount=-3 +kerning first=77 second=291 amount=-3 +kerning first=1062 second=1047 amount=-1 +kerning first=251 second=271 amount=-1 +kerning first=198 second=382 amount=-2 +kerning first=281 second=337 amount=-1 +kerning first=101 second=314 amount=-3 +kerning first=85 second=226 amount=-3 +kerning first=287 second=271 amount=-2 +kerning first=199 second=99 amount=-2 +kerning first=234 second=382 amount=-2 +kerning first=65 second=314 amount=-2 +kerning first=1063 second=1057 amount=-1 +kerning first=86 second=229 amount=-5 +kerning first=121 second=226 amount=-3 +kerning first=213 second=261 amount=-1 +kerning first=209 second=337 amount=-2 +kerning first=1107 second=1104 amount=-1 +kerning first=1027 second=1057 amount=-1 +kerning first=249 second=261 amount=-1 +kerning first=1051 second=1092 amount=-1 +kerning first=1071 second=1104 amount=-1 +kerning first=313 second=326 amount=-1 +kerning first=278 second=314 amount=-1 +kerning first=8218 second=255 amount=-1 +kerning first=81 second=302 amount=-2 +kerning first=242 second=314 amount=-2 +kerning first=229 second=361 amount=-1 +kerning first=379 second=250 amount=-3 +kerning first=307 second=171 amount=-3 +kerning first=350 second=314 amount=-2 +kerning first=338 second=361 amount=-2 +kerning first=46 second=8221 amount=-5 +kerning first=193 second=361 amount=-3 +kerning first=106 second=347 amount=-2 +kerning first=252 second=281 amount=-1 +kerning first=314 second=314 amount=-2 +kerning first=82 second=8221 amount=-5 +kerning first=99 second=316 amount=-3 +kerning first=70 second=347 amount=-2 +kerning first=253 second=269 amount=-3 +kerning first=1057 second=1076 amount=-1 +kerning first=260 second=216 amount=-3 +kerning first=87 second=224 amount=-4 +kerning first=8216 second=198 amount=-8 +kerning first=217 second=269 amount=-2 +kerning first=1114 second=1103 amount=-2 +kerning first=1024 second=1037 amount=-1 +kerning first=296 second=216 amount=-2 +kerning first=241 second=326 amount=-1 +kerning first=325 second=269 amount=-2 +kerning first=1060 second=1037 amount=-1 +kerning first=223 second=8221 amount=-2 +kerning first=337 second=361 amount=-1 +kerning first=240 second=316 amount=-2 +kerning first=277 second=326 amount=-2 +kerning first=75 second=281 amount=-2 +kerning first=289 second=269 amount=-2 +kerning first=199 second=171 amount=-4 +kerning first=368 second=216 amount=-1 +kerning first=116 second=252 amount=-1 +kerning first=264 second=224 amount=-2 +kerning first=107 second=103 amount=-2 +kerning first=76 second=331 amount=-1 +kerning first=228 second=224 amount=-1 +kerning first=272 second=70 amount=-2 +kerning first=71 second=103 amount=-3 +kerning first=221 second=252 amount=-1 +kerning first=367 second=8221 amount=-3 +kerning first=336 second=224 amount=-1 +kerning first=257 second=252 amount=-1 +kerning first=1079 second=1101 amount=-1 +kerning first=321 second=317 amount=-2 +kerning first=235 second=227 amount=-2 +kerning first=1092 second=1075 amount=-1 +kerning first=199 second=227 amount=-2 +kerning first=73 second=101 amount=-2 +kerning first=289 second=44 amount=-3 +kerning first=226 second=226 amount=-1 +kerning first=346 second=362 amount=-3 +kerning first=268 second=207 amount=-3 +kerning first=213 second=317 amount=-2 +kerning first=298 second=226 amount=-2 +kerning first=73 second=45 amount=-4 +kerning first=250 second=101 amount=-1 +kerning first=1043 second=1101 amount=-1 +kerning first=334 second=226 amount=-1 +kerning first=203 second=90 amount=-1 +kerning first=356 second=103 amount=-4 +kerning first=229 second=246 amount=-1 +kerning first=376 second=207 amount=-1 +kerning first=370 second=226 amount=-3 +kerning first=193 second=246 amount=-1 +kerning first=284 second=103 amount=-3 +kerning first=326 second=291 amount=-2 +kerning first=109 second=45 amount=-3 +kerning first=203 second=356 amount=-1 +kerning first=274 second=362 amount=-2 +kerning first=248 second=103 amount=-2 +kerning first=290 second=291 amount=-3 +kerning first=250 second=45 amount=-2 +kerning first=310 second=362 amount=-2 +kerning first=212 second=103 amount=-1 +kerning first=254 second=291 amount=-2 +kerning first=214 second=45 amount=-1 +kerning first=365 second=104 amount=-2 +kerning first=217 second=213 amount=-1 +kerning first=266 second=89 amount=-1 +kerning first=8249 second=86 amount=-3 +kerning first=377 second=109 amount=-1 +kerning first=220 second=338 amount=-1 +kerning first=338 second=89 amount=-1 +kerning first=257 second=104 amount=-1 +kerning first=269 second=109 amount=-2 +kerning first=286 second=193 amount=-3 +kerning first=325 second=213 amount=-2 +kerning first=84 second=115 amount=-3 +kerning first=194 second=89 amount=-6 +kerning first=290 second=84 amount=-3 +kerning first=221 second=370 amount=-1 +kerning first=214 second=193 amount=-4 +kerning first=197 second=234 amount=-1 +kerning first=209 second=8249 amount=-4 +kerning first=267 second=303 amount=-2 +kerning first=225 second=115 amount=-1 +kerning first=379 second=227 amount=-1 +kerning first=303 second=303 amount=-1 +kerning first=261 second=115 amount=-1 +kerning first=104 second=8249 amount=-3 +kerning first=334 second=78 amount=-2 +kerning first=195 second=303 amount=-1 +kerning first=120 second=115 amount=-3 +kerning first=307 second=227 amount=-2 +kerning first=376 second=103 amount=-4 +kerning first=231 second=303 amount=-2 +kerning first=241 second=44 amount=-1 +kerning first=200 second=70 amount=-2 +kerning first=369 second=115 amount=-2 +kerning first=187 second=368 amount=-4 +kerning first=283 second=232 amount=-1 +kerning first=68 second=8249 amount=-1 +kerning first=8217 second=97 amount=-6 +kerning first=339 second=303 amount=-2 +kerning first=277 second=44 amount=-3 +kerning first=82 second=368 amount=-3 +kerning first=76 second=213 amount=-1 +kerning first=375 second=303 amount=-2 +kerning first=333 second=115 amount=-2 +kerning first=287 second=120 amount=-2 +kerning first=304 second=115 amount=-2 +kerning first=198 second=323 amount=-2 +kerning first=226 second=259 amount=-1 +kerning first=68 second=278 amount=-2 +kerning first=110 second=120 amount=-1 +kerning first=200 second=73 amount=-2 +kerning first=369 second=118 amount=-3 +kerning first=377 second=201 amount=-1 +kerning first=225 second=361 amount=-1 +kerning first=1030 second=1080 amount=-1 +kerning first=272 second=73 amount=-2 +kerning first=315 second=70 amount=-2 +kerning first=356 second=248 amount=-3 +kerning first=251 second=120 amount=-2 +kerning first=192 second=85 amount=-3 +kerning first=1102 second=1080 amount=-1 +kerning first=261 second=118 amount=-3 +kerning first=314 second=113 amount=-1 +kerning first=195 second=253 amount=-3 +kerning first=225 second=118 amount=-3 +kerning first=334 second=75 amount=-2 +kerning first=317 second=278 amount=-2 +kerning first=87 second=85 amount=-1 +kerning first=231 second=253 amount=-2 +kerning first=333 second=118 amount=-2 +kerning first=76 second=68 amount=-2 +kerning first=267 second=253 amount=-2 +kerning first=317 second=80 amount=-2 +kerning first=366 second=246 amount=-2 +kerning first=262 second=75 amount=-3 +kerning first=220 second=233 amount=-2 +kerning first=303 second=253 amount=-2 +kerning first=330 second=246 amount=-2 +kerning first=84 second=118 amount=-3 +kerning first=214 second=196 amount=-4 +kerning first=339 second=253 amount=-2 +kerning first=68 second=80 amount=-2 +kerning first=356 second=317 amount=-1 +kerning first=256 second=233 amount=-1 +kerning first=1049 second=1085 amount=-1 +kerning first=286 second=196 amount=-3 +kerning first=120 second=118 amount=-3 +kerning first=364 second=233 amount=-2 +kerning first=298 second=338 amount=-2 +kerning first=307 second=283 amount=-1 +kerning first=118 second=108 amount=-2 +kerning first=262 second=335 amount=-2 +kerning first=262 second=338 amount=-3 +kerning first=82 second=108 amount=-3 +kerning first=298 second=335 amount=-2 +kerning first=235 second=283 amount=-1 +kerning first=223 second=108 amount=-2 +kerning first=347 second=241 amount=-2 +kerning first=368 second=328 amount=-2 +kerning first=101 second=110 amount=-2 +kerning first=201 second=290 amount=-1 +kerning first=199 second=283 amount=-2 +kerning first=187 second=108 amount=-1 +kerning first=370 second=335 amount=-2 +kerning first=80 second=193 amount=-4 +kerning first=1047 second=1038 amount=-3 +kerning first=287 second=380 amount=-3 +kerning first=336 second=85 amount=-1 +kerning first=295 second=108 amount=-1 +kerning first=85 second=335 amount=-2 +kerning first=98 second=241 amount=-1 +kerning first=8250 second=367 amount=-1 +kerning first=85 second=338 amount=-1 +kerning first=323 second=380 amount=-1 +kerning first=259 second=108 amount=-1 +kerning first=121 second=335 amount=-3 +kerning first=242 second=110 amount=-1 +kerning first=379 second=283 amount=-1 +kerning first=264 second=85 amount=-2 +kerning first=264 second=286 amount=-3 +kerning first=367 second=108 amount=-2 +kerning first=203 second=241 amount=-1 +kerning first=76 second=65 amount=-2 +kerning first=278 second=110 amount=-1 +kerning first=331 second=108 amount=-1 +kerning first=226 second=335 amount=-1 +kerning first=314 second=110 amount=-1 +kerning first=110 second=380 amount=-1 +kerning first=192 second=286 amount=-3 +kerning first=350 second=110 amount=-1 +kerning first=217 second=65 amount=-4 +kerning first=87 second=286 amount=-3 +kerning first=289 second=331 amount=-1 +kerning first=221 second=193 amount=-6 +kerning first=251 second=380 amount=-2 +kerning first=232 second=115 amount=-2 +kerning first=337 second=8217 amount=-2 +kerning first=217 second=331 amount=-2 +kerning first=268 second=115 amount=-2 +kerning first=107 second=248 amount=-3 +kerning first=253 second=331 amount=-2 +kerning first=370 second=338 amount=-1 +kerning first=112 second=331 amount=-1 +kerning first=196 second=115 amount=-2 +kerning first=74 second=380 amount=-1 +kerning first=313 second=367 amount=-2 +kerning first=260 second=356 amount=-6 +kerning first=283 second=8250 amount=-2 +kerning first=295 second=371 amount=-1 +kerning first=84 second=210 amount=-3 +kerning first=198 second=326 amount=-1 +kerning first=375 second=250 amount=-1 +kerning first=1064 second=1073 amount=-1 +kerning first=331 second=371 amount=-1 +kerning first=250 second=255 amount=-3 +kerning first=234 second=326 amount=-2 +kerning first=362 second=347 amount=-2 +kerning first=367 second=371 amount=-1 +kerning first=278 second=205 amount=-2 +kerning first=248 second=307 amount=-1 +kerning first=326 second=347 amount=-1 +kerning first=381 second=352 amount=-1 +kerning first=267 second=250 amount=-2 +kerning first=82 second=262 amount=-3 +kerning first=118 second=371 amount=-1 +kerning first=109 second=255 amount=-2 +kerning first=231 second=250 amount=-2 +kerning first=254 second=347 amount=-2 +kerning first=187 second=371 amount=-1 +kerning first=73 second=255 amount=-2 +kerning first=339 second=250 amount=-2 +kerning first=218 second=347 amount=-2 +kerning first=223 second=371 amount=-1 +kerning first=303 second=250 amount=-1 +kerning first=224 second=380 amount=-1 +kerning first=259 second=371 amount=-1 +kerning first=66 second=333 amount=-1 +kerning first=90 second=250 amount=-3 +kerning first=1104 second=1114 amount=-1 +kerning first=232 second=378 amount=-2 +kerning first=119 second=328 amount=-2 +kerning first=295 second=305 amount=-1 +kerning first=345 second=229 amount=-1 +kerning first=74 second=212 amount=-2 +kerning first=195 second=250 amount=-3 +kerning first=1113 second=1097 amount=-1 +kerning first=102 second=333 amount=-1 +kerning first=1030 second=1077 amount=-1 +kerning first=86 second=44 amount=-5 +kerning first=204 second=257 amount=-2 +kerning first=8218 second=379 amount=-1 +kerning first=1077 second=1097 amount=-1 +kerning first=89 second=267 amount=-3 +kerning first=99 second=257 amount=-2 +kerning first=224 second=328 amount=-1 +kerning first=286 second=8220 amount=-1 +kerning first=1069 second=1047 amount=-2 +kerning first=331 second=119 amount=-3 +kerning first=218 second=288 amount=-1 +kerning first=250 second=8220 amount=-3 +kerning first=303 second=283 amount=-3 +kerning first=214 second=8220 amount=-2 +kerning first=87 second=345 amount=-1 +kerning first=97 second=351 amount=-1 +kerning first=88 second=243 amount=-2 +kerning first=120 second=250 amount=-3 +kerning first=298 second=332 amount=-2 +kerning first=109 second=8220 amount=-4 +kerning first=240 second=106 amount=-2 +kerning first=262 second=332 amount=-3 +kerning first=206 second=113 amount=-2 +kerning first=370 second=332 amount=-1 +kerning first=207 second=333 amount=-2 +kerning first=264 second=345 amount=-1 +kerning first=101 second=113 amount=-1 +kerning first=107 second=242 amount=-3 +kerning first=1063 second=1116 amount=-1 +kerning first=279 second=333 amount=-1 +kerning first=77 second=288 amount=-2 +kerning first=1104 second=1090 amount=-1 +kerning first=211 second=87 amount=-2 +kerning first=65 second=113 amount=-1 +kerning first=1027 second=1116 amount=-2 +kerning first=303 second=99 amount=-3 +kerning first=1058 second=1033 amount=-4 +kerning first=381 second=287 amount=-3 +kerning first=113 second=347 amount=-2 +kerning first=281 second=281 amount=-1 +kerning first=267 second=99 amount=-1 +kerning first=345 second=287 amount=-2 +kerning first=77 second=347 amount=-2 +kerning first=375 second=99 amount=-3 +kerning first=198 second=217 amount=-2 +kerning first=339 second=99 amount=-1 +kerning first=219 second=232 amount=-2 +kerning first=362 second=288 amount=-1 +kerning first=193 second=243 amount=-1 +kerning first=8217 second=192 amount=-6 +kerning first=356 second=242 amount=-3 +kerning first=229 second=243 amount=-1 +kerning first=187 second=197 amount=-4 +kerning first=378 second=326 amount=-2 +kerning first=209 second=281 amount=-2 +kerning first=83 second=82 amount=-3 +kerning first=116 second=249 amount=-1 +kerning first=251 second=324 amount=-1 +kerning first=85 second=279 amount=-2 +kerning first=256 second=354 amount=-6 +kerning first=99 second=254 amount=-2 +kerning first=198 second=119 amount=-1 +kerning first=76 second=334 amount=-1 +kerning first=278 second=379 amount=-1 +kerning first=71 second=304 amount=-1 +kerning first=287 second=324 amount=-1 +kerning first=68 second=74 amount=-2 +kerning first=234 second=119 amount=-2 +kerning first=121 second=279 amount=-3 +kerning first=217 second=334 amount=-1 +kerning first=113 second=229 amount=-2 +kerning first=187 second=374 amount=-4 +kerning first=1093 second=1079 amount=-1 +kerning first=290 second=344 amount=-1 +kerning first=315 second=274 amount=-2 +kerning first=240 second=369 amount=-1 +kerning first=87 second=289 amount=-4 +kerning first=209 second=74 amount=-1 +kerning first=82 second=374 amount=-3 +kerning first=257 second=249 amount=-1 +kerning first=79 second=259 amount=-1 +kerning first=77 second=229 amount=-2 +kerning first=378 second=119 amount=-2 +kerning first=1057 second=1079 amount=-1 +kerning first=199 second=339 amount=-2 +kerning first=290 second=229 amount=-1 +kerning first=1038 second=1074 amount=-4 +kerning first=235 second=339 amount=-1 +kerning first=317 second=284 amount=-1 +kerning first=326 second=229 amount=-1 +kerning first=317 second=74 amount=-1 +kerning first=1074 second=1074 amount=-1 +kerning first=370 second=279 amount=-2 +kerning first=339 second=361 amount=-2 +kerning first=209 second=284 amount=-2 +kerning first=8216 second=366 amount=-1 +kerning first=258 second=246 amount=-1 +kerning first=218 second=229 amount=-3 +kerning first=254 second=229 amount=-1 +kerning first=366 second=114 amount=-1 +kerning first=1027 second=1119 amount=-2 +kerning first=262 second=279 amount=-2 +kerning first=379 second=339 amount=-1 +kerning first=1063 second=1119 amount=-1 +kerning first=226 second=279 amount=-1 +kerning first=8218 second=261 amount=-2 +kerning first=362 second=229 amount=-3 +kerning first=307 second=339 amount=-1 +kerning first=298 second=279 amount=-2 +kerning first=311 second=244 amount=-3 +kerning first=1039 second=1084 amount=-1 +kerning first=250 second=8217 amount=-3 +kerning first=286 second=8217 amount=-1 +kerning first=259 second=111 amount=-1 +kerning first=1094 second=1089 amount=-1 +kerning first=336 second=82 amount=-2 +kerning first=1058 second=1089 amount=-1 +kerning first=381 second=234 amount=-1 +kerning first=76 second=219 amount=-3 +kerning first=201 second=86 amount=-1 +kerning first=206 second=264 amount=-2 +kerning first=82 second=111 amount=-3 +kerning first=118 second=111 amount=-3 +kerning first=192 second=289 amount=-3 +kerning first=261 second=121 amount=-2 +kerning first=221 second=364 amount=-1 +kerning first=228 second=289 amount=-2 +kerning first=225 second=121 amount=-3 +kerning first=275 second=119 amount=-2 +kerning first=8218 second=89 amount=-6 +kerning first=65 second=264 amount=-3 +kerning first=1024 second=1099 amount=-1 +kerning first=264 second=289 amount=-3 +kerning first=264 second=82 amount=-3 +kerning first=198 second=66 amount=-2 +kerning first=222 second=323 amount=-2 +kerning first=120 second=121 amount=-3 +kerning first=1024 second=1082 amount=-1 +kerning first=8220 second=271 amount=-3 +kerning first=336 second=289 amount=-1 +kerning first=84 second=121 amount=-3 +kerning first=77 second=251 amount=-2 +kerning first=350 second=205 amount=-3 +kerning first=240 second=254 amount=-1 +kerning first=1058 second=1086 amount=-1 +kerning first=367 second=111 amount=-1 +kerning first=79 second=354 amount=-2 +kerning first=87 second=82 amount=-1 +kerning first=365 second=249 amount=-1 +kerning first=275 second=244 amount=-1 +kerning first=73 second=199 amount=-2 +kerning first=353 second=225 amount=-1 +kerning first=251 second=117 amount=-1 +kerning first=107 second=97 amount=-2 +kerning first=69 second=85 amount=-2 +kerning first=90 second=102 amount=-3 +kerning first=323 second=117 amount=-2 +kerning first=287 second=117 amount=-1 +kerning first=71 second=97 amount=-1 +kerning first=272 second=76 amount=-2 +kerning first=325 second=71 amount=-2 +kerning first=267 second=46 amount=-3 +kerning first=209 second=225 amount=-2 +kerning first=262 second=72 amount=-3 +kerning first=284 second=97 amount=-1 +kerning first=369 second=121 amount=-3 +kerning first=99 second=251 amount=-2 +kerning first=245 second=225 amount=-1 +kerning first=200 second=76 amount=-2 +kerning first=333 second=121 amount=-3 +kerning first=240 second=251 amount=-1 +kerning first=379 second=111 amount=-1 +kerning first=339 second=46 amount=-3 +kerning first=281 second=225 amount=-2 +kerning first=8217 second=103 amount=-4 +kerning first=334 second=72 amount=-2 +kerning first=212 second=97 amount=-1 +kerning first=68 second=77 amount=-2 +kerning first=204 second=251 amount=-2 +kerning first=198 second=122 amount=-2 +kerning first=375 second=46 amount=-5 +kerning first=280 second=112 amount=-2 +kerning first=248 second=97 amount=-1 +kerning first=381 second=290 amount=-1 +kerning first=339 second=102 amount=-2 +kerning first=107 second=245 amount=-3 +kerning first=71 second=363 amount=-1 +kerning first=356 second=97 amount=-5 +kerning first=107 second=363 amount=-1 +kerning first=231 second=46 amount=-3 +kerning first=356 second=245 amount=-3 +kerning first=195 second=102 amount=-1 +kerning first=187 second=200 amount=-5 +kerning first=231 second=102 amount=-2 +kerning first=248 second=363 amount=-1 +kerning first=66 second=73 amount=-4 +kerning first=267 second=102 amount=-2 +kerning first=82 second=318 amount=-3 +kerning first=284 second=363 amount=-1 +kerning first=303 second=102 amount=-2 +kerning first=110 second=117 amount=-1 +kerning first=118 second=318 amount=-2 +kerning first=272 second=220 amount=-1 +kerning first=352 second=90 amount=-1 +kerning first=101 second=116 amount=-1 +kerning first=337 second=355 amount=-1 +kerning first=65 second=116 amount=-1 +kerning first=201 second=83 amount=-2 +kerning first=315 second=330 amount=-2 +kerning first=79 second=298 amount=-2 +kerning first=193 second=240 amount=-1 +kerning first=367 second=259 amount=-1 +kerning first=298 second=237 amount=-1 +kerning first=198 second=214 amount=-1 +kerning first=90 second=194 amount=-1 +kerning first=229 second=240 amount=-1 +kerning first=331 second=259 amount=-1 +kerning first=1060 second=1043 amount=-1 +kerning first=88 second=240 amount=-2 +kerning first=110 second=371 amount=-1 +kerning first=90 second=253 amount=-3 +kerning first=1024 second=1043 amount=-1 +kerning first=350 second=116 amount=-1 +kerning first=381 second=83 amount=-1 +kerning first=1049 second=1088 amount=-1 +kerning first=268 second=375 amount=-1 +kerning first=99 second=369 amount=-2 +kerning first=223 second=259 amount=-1 +kerning first=1113 second=1094 amount=-1 +kerning first=66 second=330 amount=-4 +kerning first=232 second=375 amount=-2 +kerning first=187 second=259 amount=-1 +kerning first=1077 second=1094 amount=-1 +kerning first=356 second=304 amount=-1 +kerning first=378 second=122 amount=-2 +kerning first=196 second=375 amount=-3 +kerning first=204 second=369 amount=-2 +kerning first=295 second=259 amount=-1 +kerning first=217 second=71 amount=-1 +kerning first=122 second=311 amount=-2 +kerning first=259 second=259 amount=-1 +kerning first=284 second=304 amount=-1 +kerning first=376 second=375 amount=-3 +kerning first=334 second=220 amount=-1 +kerning first=76 second=71 amount=-1 +kerning first=212 second=304 amount=-2 +kerning first=118 second=259 amount=-3 +kerning first=242 second=116 amount=-1 +kerning first=304 second=375 amount=-2 +kerning first=262 second=220 amount=-2 +kerning first=82 second=259 amount=-2 +kerning first=354 second=90 amount=-3 +kerning first=264 second=233 amount=-2 +kerning first=71 second=298 amount=-1 +kerning first=347 second=291 amount=-3 +kerning first=1081 second=1108 amount=-1 +kerning first=332 second=77 amount=-2 +kerning first=311 second=291 amount=-2 +kerning first=114 second=97 amount=-1 +kerning first=288 second=194 amount=-3 +kerning first=275 second=291 amount=-3 +kerning first=83 second=337 amount=-1 +kerning first=101 second=227 amount=-2 +kerning first=69 second=350 amount=-2 +kerning first=109 second=110 amount=-1 +kerning first=284 second=82 amount=-1 +kerning first=216 second=194 amount=-4 +kerning first=203 second=291 amount=-3 +kerning first=354 second=233 amount=-3 +kerning first=198 second=304 amount=-2 +kerning first=284 second=298 amount=-1 +kerning first=78 second=97 amount=-2 +kerning first=67 second=235 amount=-2 +kerning first=210 second=350 amount=-1 +kerning first=291 second=97 amount=-3 +kerning first=250 second=110 amount=-1 +kerning first=98 second=291 amount=-2 +kerning first=260 second=337 amount=-1 +kerning first=351 second=311 amount=-1 +kerning first=1113 second=1088 amount=-1 +kerning first=83 second=77 amount=-3 +kerning first=1072 second=1101 amount=-1 +kerning first=327 second=97 amount=-2 +kerning first=224 second=337 amount=-1 +kerning first=315 second=311 amount=-2 +kerning first=222 second=66 amount=-2 +kerning first=279 second=311 amount=-2 +kerning first=79 second=317 amount=-2 +kerning first=346 second=200 amount=-3 +kerning first=75 second=318 amount=-1 +kerning first=255 second=97 amount=-3 +kerning first=119 second=337 amount=-3 +kerning first=243 second=311 amount=-1 +kerning first=1077 second=1088 amount=-1 +kerning first=69 second=90 amount=-1 +kerning first=197 second=84 amount=-6 +kerning first=337 second=324 amount=-1 +kerning first=111 second=318 amount=-2 +kerning first=1025 second=1050 amount=-1 +kerning first=210 second=90 amount=-2 +kerning first=8218 second=370 amount=-3 +kerning first=202 second=71 amount=-1 +kerning first=368 second=337 amount=-2 +kerning first=370 second=382 amount=-3 +kerning first=282 second=350 amount=-2 +kerning first=102 second=311 amount=3 +kerning first=282 second=90 amount=-1 +kerning first=377 second=84 amount=-2 +kerning first=229 second=324 amount=-1 +kerning first=252 second=318 amount=-2 +kerning first=274 second=71 amount=-1 +kerning first=296 second=337 amount=-2 +kerning first=66 second=311 amount=-3 +kerning first=1036 second=1101 amount=-1 +kerning first=227 second=335 amount=-1 +kerning first=264 second=104 amount=-1 +kerning first=1049 second=1107 amount=-1 +kerning first=217 second=381 amount=-1 +kerning first=251 second=234 amount=-1 +kerning first=228 second=104 amount=-1 +kerning first=194 second=284 amount=-3 +kerning first=382 second=303 amount=-1 +kerning first=279 second=187 amount=-2 +kerning first=287 second=234 amount=-2 +kerning first=192 second=104 amount=-2 +kerning first=243 second=187 amount=-2 +kerning first=323 second=234 amount=-2 +kerning first=270 second=44 amount=-3 +kerning first=89 second=284 amount=-3 +kerning first=8217 second=382 amount=-1 +kerning first=365 second=277 amount=-1 +kerning first=268 second=260 amount=-3 +kerning first=84 second=325 amount=-1 +kerning first=211 second=78 amount=-2 +kerning first=211 second=310 amount=-2 +kerning first=8220 second=86 amount=-1 +kerning first=376 second=260 amount=-6 +kerning first=8216 second=195 amount=-8 +kerning first=296 second=213 amount=-2 +kerning first=1104 second=1081 amount=-1 +kerning first=280 second=374 amount=-1 +kerning first=208 second=356 amount=-2 +kerning first=346 second=116 amount=-1 +kerning first=221 second=277 amount=-3 +kerning first=101 second=351 amount=-2 +kerning first=278 second=227 amount=-1 +kerning first=356 second=298 amount=-1 +kerning first=65 second=269 amount=-1 +kerning first=1060 second=1058 amount=-1 +kerning first=202 second=284 amount=-1 +kerning first=65 second=351 amount=-2 +kerning first=242 second=227 amount=-1 +kerning first=1038 second=1077 amount=-4 +kerning first=206 second=351 amount=-2 +kerning first=206 second=227 amount=-2 +kerning first=374 second=284 amount=-3 +kerning first=97 second=303 amount=-1 +kerning first=257 second=277 amount=-1 +kerning first=197 second=220 amount=-3 +kerning first=100 second=98 amount=-1 +kerning first=1059 second=1074 amount=-4 +kerning first=79 second=85 amount=-1 +kerning first=378 second=44 amount=-1 +kerning first=302 second=284 amount=-2 +kerning first=346 second=303 amount=-3 +kerning first=338 second=284 amount=-1 +kerning first=85 second=350 amount=-3 +kerning first=84 second=201 amount=-1 +kerning first=274 second=303 amount=-1 +kerning first=80 second=277 amount=-1 +kerning first=379 second=367 amount=-3 +kerning first=314 second=227 amount=-2 +kerning first=266 second=284 amount=-3 +kerning first=382 second=269 amount=-1 +kerning first=105 second=118 amount=-3 +kerning first=314 second=8220 amount=-3 +kerning first=115 second=345 amount=-1 +kerning first=8217 second=122 amount=-1 +kerning first=230 second=380 amount=-2 +kerning first=69 second=118 amount=-1 +kerning first=224 second=105 amount=-1 +kerning first=207 second=283 amount=-2 +kerning first=266 second=380 amount=-2 +kerning first=284 second=270 amount=-1 +kerning first=83 second=105 amount=-3 +kerning first=242 second=8220 amount=-2 +kerning first=8222 second=362 amount=-3 +kerning first=68 second=287 amount=-1 +kerning first=302 second=380 amount=-1 +kerning first=119 second=105 amount=-2 +kerning first=214 second=171 amount=-1 +kerning first=283 second=235 amount=-1 +kerning first=102 second=283 amount=-1 +kerning first=338 second=380 amount=-2 +kerning first=356 second=270 amount=-1 +kerning first=382 second=228 amount=-1 +kerning first=1088 second=1094 amount=-1 +kerning first=346 second=228 amount=-1 +kerning first=101 second=8220 amount=-2 +kerning first=275 second=232 amount=-1 +kerning first=104 second=287 amount=-2 +kerning first=310 second=228 amount=-1 +kerning first=245 second=287 amount=-2 +kerning first=274 second=228 amount=-1 +kerning first=368 second=241 amount=-2 +kerning first=279 second=283 amount=-1 +kerning first=209 second=287 amount=-3 +kerning first=212 second=270 amount=-2 +kerning first=317 second=287 amount=-3 +kerning first=202 second=228 amount=-1 +kerning first=119 second=241 amount=-2 +kerning first=281 second=287 amount=-3 +kerning first=338 second=8249 amount=-2 +kerning first=100 second=287 amount=-2 +kerning first=97 second=228 amount=-1 +kerning first=224 second=241 amount=-1 +kerning first=353 second=287 amount=-3 +kerning first=377 second=248 amount=-1 +kerning first=266 second=8249 amount=-4 +kerning first=382 second=331 amount=-2 +kerning first=269 second=248 amount=-1 +kerning first=88 second=354 amount=-2 +kerning first=90 second=197 amount=-1 +kerning first=194 second=8249 amount=-4 +kerning first=83 second=241 amount=-1 +kerning first=275 second=263 amount=-1 +kerning first=70 second=235 amount=-1 +kerning first=197 second=248 amount=-1 +kerning first=311 second=263 amount=-3 +kerning first=106 second=235 amount=-1 +kerning first=346 second=331 amount=-1 +kerning first=233 second=248 amount=-1 +kerning first=288 second=318 amount=-1 +kerning first=356 second=366 amount=-1 +kerning first=324 second=318 amount=-1 +kerning first=350 second=255 amount=-2 +kerning first=274 second=331 amount=-1 +kerning first=1063 second=1094 amount=-1 +kerning first=377 second=112 amount=-1 +kerning first=374 second=256 amount=-6 +kerning first=284 second=366 amount=-1 +kerning first=1027 second=1094 amount=-2 +kerning first=74 second=262 amount=-2 +kerning first=1036 second=1073 amount=-3 +kerning first=338 second=256 amount=-2 +kerning first=1078 second=1104 amount=-2 +kerning first=305 second=112 amount=-1 +kerning first=1072 second=1073 amount=-1 +kerning first=242 second=255 amount=-3 +kerning first=274 second=200 amount=-2 +kerning first=269 second=112 amount=-1 +kerning first=206 second=255 amount=-2 +kerning first=336 second=8221 amount=-2 +kerning first=97 second=331 amount=-1 +kerning first=193 second=221 amount=-6 +kerning first=233 second=112 amount=-1 +kerning first=202 second=200 amount=-2 +kerning first=197 second=112 amount=-3 +kerning first=101 second=255 amount=-2 +kerning first=88 second=221 amount=-2 +kerning first=65 second=255 amount=-3 +kerning first=217 second=74 amount=-3 +kerning first=108 second=314 amount=-2 +kerning first=88 second=352 amount=-2 +kerning first=105 second=367 amount=-1 +kerning first=287 second=98 amount=-1 +kerning first=193 second=352 amount=-3 +kerning first=211 second=207 amount=-2 +kerning first=251 second=98 amount=-2 +kerning first=325 second=74 amount=-1 +kerning first=84 second=105 amount=-2 +kerning first=70 second=338 amount=-1 +kerning first=332 second=105 amount=-1 +kerning first=212 second=366 amount=-1 +kerning first=66 second=283 amount=-1 +kerning first=8217 second=279 amount=-3 +kerning first=374 second=380 amount=-3 +kerning first=368 second=105 amount=-2 +kerning first=1045 second=1080 amount=-1 +kerning first=75 second=290 amount=-3 +kerning first=1058 second=1092 amount=-1 +kerning first=249 second=314 amount=-2 +kerning first=260 second=105 amount=-1 +kerning first=84 second=339 amount=-3 +kerning first=296 second=105 amount=-1 +kerning first=71 second=366 amount=-1 +kerning first=220 second=214 amount=-1 +kerning first=321 second=314 amount=-2 +kerning first=277 second=307 amount=-2 +kerning first=212 second=106 amount=-1 +kerning first=197 second=268 amount=-3 +kerning first=85 second=81 amount=-1 +kerning first=116 second=261 amount=-1 +kerning first=117 second=333 amount=-1 +kerning first=90 second=113 amount=-1 +kerning first=67 second=346 amount=-3 +kerning first=248 second=106 amount=-2 +kerning first=258 second=333 amount=-1 +kerning first=230 second=8221 amount=-2 +kerning first=107 second=106 amount=-1 +kerning first=199 second=224 amount=-2 +kerning first=90 second=68 amount=-1 +kerning first=298 second=81 amount=-2 +kerning first=280 second=346 amount=-2 +kerning first=105 second=114 amount=-1 +kerning first=262 second=81 amount=-3 +kerning first=235 second=224 amount=-2 +kerning first=208 second=346 amount=-1 +kerning first=284 second=106 amount=-1 +kerning first=307 second=224 amount=-2 +kerning first=103 second=243 amount=-2 +kerning first=89 second=256 amount=-6 +kerning first=116 second=118 amount=-1 +kerning first=379 second=224 amount=-1 +kerning first=1088 second=1099 amount=-1 +kerning first=213 second=230 amount=-1 +kerning first=80 second=101 amount=-1 +kerning first=352 second=346 amount=-1 +kerning first=72 second=230 amount=-2 +kerning first=353 second=324 amount=-2 +kerning first=108 second=230 amount=-2 +kerning first=100 second=307 amount=-1 +kerning first=8250 second=315 amount=-5 +kerning first=330 second=333 amount=-2 +kerning first=266 second=256 amount=-3 +kerning first=362 second=253 amount=-1 +kerning first=67 second=326 amount=-1 +kerning first=221 second=101 amount=-3 +kerning first=257 second=101 amount=-1 +kerning first=1052 second=1099 amount=-1 +kerning first=241 second=307 amount=-1 +kerning first=366 second=333 amount=-2 +kerning first=344 second=67 amount=-3 +kerning first=67 second=243 amount=-2 +kerning first=86 second=69 amount=-1 +kerning first=89 second=120 amount=-2 +kerning first=1060 second=1034 amount=-1 +kerning first=365 second=101 amount=-1 +kerning first=8250 second=200 amount=-5 +kerning first=379 second=79 amount=-1 +kerning first=209 second=334 amount=-2 +kerning first=1048 second=1072 amount=-1 +kerning first=87 second=187 amount=-3 +kerning first=381 second=268 amount=-1 +kerning first=264 second=318 amount=-1 +kerning first=258 second=218 amount=-3 +kerning first=71 second=251 amount=-1 +kerning first=85 second=229 amount=-3 +kerning first=313 second=192 amount=-2 +kerning first=1113 second=1080 amount=-1 +kerning first=1101 second=1098 amount=-1 +kerning first=1050 second=1072 amount=-2 +kerning first=1024 second=1034 amount=-1 +kerning first=352 second=243 amount=-1 +kerning first=317 second=334 amount=-1 +kerning first=107 second=251 amount=-1 +kerning first=201 second=268 amount=-1 +kerning first=317 second=203 amount=-2 +kerning first=248 second=251 amount=-1 +kerning first=226 second=229 amount=-1 +kerning first=109 second=371 amount=-1 +kerning first=45 second=218 amount=-4 +kerning first=262 second=229 amount=-2 +kerning first=121 second=229 amount=-3 +kerning first=71 second=270 amount=-1 +kerning first=284 second=251 amount=-1 +kerning first=282 second=118 amount=-1 +kerning first=230 second=120 amount=-2 +kerning first=370 second=229 amount=-3 +kerning first=222 second=218 amount=-1 +kerning first=246 second=118 amount=-2 +kerning first=356 second=251 amount=-2 +kerning first=1084 second=1072 amount=-1 +kerning first=302 second=249 amount=-1 +kerning first=71 second=106 amount=-1 +kerning first=354 second=118 amount=-3 +kerning first=86 second=305 amount=-2 +kerning first=68 second=203 amount=-2 +kerning first=8222 second=102 amount=-1 +kerning first=1079 second=1074 amount=-1 +kerning first=338 second=120 amount=-1 +kerning first=1101 second=1083 amount=-2 +kerning first=81 second=218 amount=-1 +kerning first=375 second=244 amount=-3 +kerning first=1074 second=1096 amount=-1 +kerning first=334 second=257 amount=-1 +kerning first=194 second=368 amount=-3 +kerning first=370 second=257 amount=-3 +kerning first=317 second=219 amount=-3 +kerning first=45 second=361 amount=-1 +kerning first=262 second=257 amount=-2 +kerning first=89 second=368 amount=-1 +kerning first=298 second=257 amount=-2 +kerning first=117 second=361 amount=-1 +kerning first=99 second=232 amount=-1 +kerning first=213 second=202 amount=-2 +kerning first=338 second=368 amount=-2 +kerning first=226 second=257 amount=-1 +kerning first=363 second=254 amount=-2 +kerning first=374 second=368 amount=-1 +kerning first=266 second=122 amount=-2 +kerning first=85 second=257 amount=-3 +kerning first=204 second=232 amount=-2 +kerning first=266 second=368 amount=-2 +kerning first=84 second=8250 amount=-3 +kerning first=121 second=257 amount=-3 +kerning first=68 second=219 amount=-1 +kerning first=325 second=121 amount=-2 +kerning first=208 second=374 amount=-2 +kerning first=289 second=121 amount=-1 +kerning first=254 second=378 amount=-2 +kerning first=100 second=267 amount=-1 +kerning first=255 second=254 amount=-1 +kerning first=344 second=336 amount=-3 +kerning first=195 second=244 amount=-1 +kerning first=217 second=121 amount=-1 +kerning first=321 second=202 amount=-2 +kerning first=291 second=254 amount=-1 +kerning first=231 second=244 amount=-1 +kerning first=216 second=330 amount=-2 +kerning first=199 second=79 amount=-3 +kerning first=213 second=66 amount=-2 +kerning first=213 second=82 amount=-2 +kerning first=267 second=244 amount=-1 +kerning first=112 second=121 amount=-3 +kerning first=305 second=110 amount=-1 +kerning first=277 second=267 amount=-1 +kerning first=216 second=278 amount=-2 +kerning first=303 second=244 amount=-3 +kerning first=76 second=121 amount=-3 +kerning first=346 second=240 amount=-1 +kerning first=1078 second=1108 amount=-2 +kerning first=339 second=244 amount=-1 +kerning first=205 second=267 amount=-2 +kerning first=99 second=106 amount=-2 +kerning first=288 second=278 amount=-1 +kerning first=321 second=82 amount=-2 +kerning first=205 second=382 amount=-1 +kerning first=187 second=117 amount=-1 +kerning first=222 second=8221 amount=-2 +kerning first=241 second=382 amount=-1 +kerning first=321 second=66 amount=-2 +kerning first=117 second=246 amount=-1 +kerning first=367 second=281 amount=-1 +kerning first=199 second=107 amount=-1 +kerning first=277 second=382 amount=-2 +kerning first=316 second=271 amount=-1 +kerning first=259 second=117 amount=-1 +kerning first=313 second=382 amount=-3 +kerning first=223 second=117 amount=-1 +kerning first=118 second=281 amount=-3 +kerning first=331 second=117 amount=-1 +kerning first=295 second=117 amount=-1 +kerning first=100 second=382 amount=-1 +kerning first=249 second=230 amount=-1 +kerning first=259 second=281 amount=-1 +kerning first=367 second=117 amount=-1 +kerning first=1055 second=1047 amount=-1 +kerning first=266 second=201 amount=-3 +kerning first=333 second=8250 amount=-2 +kerning first=258 second=361 amount=-3 +kerning first=86 second=205 amount=-1 +kerning first=366 second=361 amount=-1 +kerning first=82 second=281 amount=-3 +kerning first=330 second=361 amount=-2 +kerning first=212 second=315 amount=-2 +kerning first=240 second=347 amount=-2 +kerning first=90 second=216 amount=-1 +kerning first=204 second=347 amount=-2 +kerning first=235 second=107 amount=-2 +kerning first=103 second=271 amount=-2 +kerning first=193 second=305 amount=-1 +kerning first=1092 second=1082 amount=-1 +kerning first=45 second=344 amount=-5 +kerning first=195 second=216 amount=-3 +kerning first=99 second=347 amount=-2 +kerning first=307 second=107 amount=-1 +kerning first=381 second=240 amount=-1 +kerning first=1058 second=1095 amount=-2 +kerning first=363 second=245 amount=-1 +kerning first=106 second=226 amount=-2 +kerning first=229 second=305 amount=-1 +kerning first=88 second=336 amount=-3 +kerning first=332 second=65 amount=-4 +kerning first=327 second=245 amount=-2 +kerning first=337 second=305 amount=-1 +kerning first=325 second=266 amount=-2 +kerning first=368 second=65 amount=-4 +kerning first=291 second=245 amount=-2 +kerning first=1025 second=1062 amount=-1 +kerning first=1059 second=1083 amount=-5 +kerning first=75 second=46 amount=-1 +kerning first=211 second=226 amount=-1 +kerning first=193 second=336 amount=-3 +kerning first=69 second=362 amount=-2 +kerning first=263 second=111 amount=-1 +kerning first=255 second=245 amount=-3 +kerning first=111 second=46 amount=-3 +kerning first=87 second=252 amount=-1 +kerning first=79 second=202 amount=-2 +kerning first=310 second=219 amount=-2 +kerning first=282 second=102 amount=-2 +kerning first=205 second=122 amount=-1 +kerning first=283 second=226 amount=-2 +kerning first=274 second=219 amount=-2 +kerning first=8222 second=118 amount=-3 +kerning first=354 second=102 amount=-1 +kerning first=1031 second=1086 amount=-1 +kerning first=100 second=122 amount=-1 +kerning first=355 second=226 amount=-1 +kerning first=217 second=266 amount=-1 +kerning first=202 second=219 amount=-2 +kerning first=254 second=8250 amount=-2 +kerning first=1057 second=1042 amount=-1 +kerning first=8220 second=234 amount=-3 +kerning first=120 second=316 amount=-1 +kerning first=225 second=316 amount=-1 +kerning first=8217 second=267 amount=-3 +kerning first=261 second=316 amount=-1 +kerning first=219 second=245 amount=-2 +kerning first=269 second=335 amount=-1 +kerning first=280 second=259 amount=-1 +kerning first=65 second=79 amount=-3 +kerning first=244 second=259 amount=-1 +kerning first=333 second=316 amount=-2 +kerning first=192 second=252 amount=-3 +kerning first=352 second=259 amount=-2 +kerning first=369 second=316 amount=-2 +kerning first=333 second=119 amount=-2 +kerning first=78 second=245 amount=-2 +kerning first=377 second=335 amount=-1 +kerning first=316 second=259 amount=-2 +kerning first=70 second=226 amount=-2 +kerning first=264 second=252 amount=-2 +kerning first=323 second=246 amount=-2 +kerning first=1027 second=1082 amount=-2 +kerning first=88 second=45 amount=-4 +kerning first=268 second=224 amount=-2 +kerning first=219 second=369 amount=-1 +kerning first=103 second=259 amount=-3 +kerning first=71 second=382 amount=-1 +kerning first=287 second=246 amount=-2 +kerning first=1063 second=1082 amount=-1 +kerning first=305 second=103 amount=-2 +kerning first=90 second=356 amount=-2 +kerning first=251 second=246 amount=-1 +kerning first=347 second=375 amount=-3 +kerning first=291 second=369 amount=-1 +kerning first=208 second=259 amount=-1 +kerning first=235 second=116 amount=-1 +kerning first=311 second=375 amount=-1 +kerning first=255 second=369 amount=-1 +kerning first=233 second=103 amount=-3 +kerning first=1054 second=1103 amount=-1 +kerning first=212 second=382 amount=-2 +kerning first=83 second=253 amount=-2 +kerning first=8250 second=331 amount=-2 +kerning first=197 second=103 amount=-3 +kerning first=229 second=45 amount=-2 +kerning first=370 second=109 amount=-2 +kerning first=74 second=246 amount=-1 +kerning first=305 second=117 amount=-1 +kerning first=224 second=253 amount=-3 +kerning first=78 second=369 amount=-2 +kerning first=76 second=266 amount=-1 +kerning first=100 second=249 amount=-1 +kerning first=98 second=375 amount=-3 +kerning first=205 second=279 amount=-2 +kerning first=377 second=332 amount=-1 +kerning first=226 second=109 amount=-1 +kerning first=313 second=122 amount=-3 +kerning first=354 second=362 amount=-1 +kerning first=277 second=279 amount=-1 +kerning first=277 second=122 amount=-2 +kerning first=78 second=242 amount=-2 +kerning first=241 second=122 amount=-1 +kerning first=219 second=242 amount=-2 +kerning first=275 second=375 amount=-2 +kerning first=85 second=109 amount=-2 +kerning first=363 second=369 amount=-1 +kerning first=248 second=382 amount=-2 +kerning first=327 second=369 amount=-2 +kerning first=284 second=382 amount=-1 +kerning first=291 second=242 amount=-2 +kerning first=210 second=362 amount=-1 +kerning first=100 second=279 amount=-1 +kerning first=379 second=116 amount=-1 +kerning first=255 second=242 amount=-3 +kerning first=121 second=109 amount=-2 +kerning first=377 second=103 amount=-3 +kerning first=356 second=382 amount=-3 +kerning first=70 second=223 amount=-1 +kerning first=363 second=242 amount=-1 +kerning first=201 second=227 amount=-1 +kerning first=327 second=242 amount=-2 +kerning first=275 second=115 amount=-2 +kerning first=332 second=68 amount=-2 +kerning first=103 second=355 amount=-1 +kerning first=278 second=370 amount=-2 +kerning first=202 second=80 amount=-2 +kerning first=106 second=223 amount=-1 +kerning first=203 second=115 amount=-1 +kerning first=100 second=119 amount=-2 +kerning first=352 second=355 amount=-1 +kerning first=356 second=237 amount=-2 +kerning first=350 second=370 amount=-3 +kerning first=363 second=363 amount=-1 +kerning first=316 second=355 amount=-1 +kerning first=205 second=119 amount=-2 +kerning first=1057 second=1070 amount=-1 +kerning first=211 second=198 amount=-4 +kerning first=311 second=115 amount=-2 +kerning first=241 second=119 amount=-3 +kerning first=288 second=203 amount=-1 +kerning first=347 second=115 amount=-3 +kerning first=244 second=355 amount=-1 +kerning first=277 second=119 amount=-2 +kerning first=1060 second=1103 amount=-1 +kerning first=313 second=119 amount=-3 +kerning first=8222 second=90 amount=-1 +kerning first=8216 second=235 amount=-3 +kerning first=1025 second=1090 amount=-3 +kerning first=203 second=284 amount=-1 +kerning first=296 second=253 amount=-2 +kerning first=350 second=113 amount=-1 +kerning first=266 second=108 amount=-1 +kerning first=84 second=313 amount=-1 +kerning first=274 second=315 amount=-2 +kerning first=368 second=253 amount=-1 +kerning first=338 second=108 amount=-1 +kerning first=1103 second=1105 amount=-1 +kerning first=1061 second=1059 amount=-3 +kerning first=274 second=80 amount=-2 +kerning first=377 second=75 amount=-1 +kerning first=1031 second=1105 amount=-1 +kerning first=346 second=80 amount=-3 +kerning first=1067 second=1105 amount=-1 +kerning first=65 second=370 amount=-3 +kerning first=83 second=68 amount=-3 +kerning first=1025 second=1059 amount=-3 +kerning first=352 second=231 amount=-1 +kerning first=232 second=269 amount=-1 +kerning first=224 second=225 amount=-1 +kerning first=356 second=45 amount=-5 +kerning first=196 second=269 amount=-1 +kerning first=303 second=328 amount=-2 +kerning first=315 second=196 amount=-2 +kerning first=197 second=335 amount=-1 +kerning first=304 second=269 amount=-2 +kerning first=379 second=356 amount=-2 +kerning first=316 second=231 amount=-1 +kerning first=296 second=225 amount=-2 +kerning first=233 second=335 amount=-1 +kerning first=268 second=269 amount=-2 +kerning first=231 second=328 amount=-2 +kerning first=376 second=269 amount=-3 +kerning first=346 second=315 amount=-3 +kerning first=83 second=225 amount=-2 +kerning first=230 second=108 amount=-3 +kerning first=197 second=363 amount=-3 +kerning first=119 second=225 amount=-3 +kerning first=375 second=328 amount=-2 +kerning first=233 second=363 amount=-2 +kerning first=105 second=102 amount=-2 +kerning first=216 second=203 amount=-2 +kerning first=122 second=277 amount=-1 +kerning first=324 second=46 amount=-1 +kerning first=87 second=280 amount=-1 +kerning first=269 second=363 amount=-2 +kerning first=257 second=46 amount=-1 +kerning first=67 second=231 amount=-2 +kerning first=278 second=198 amount=-2 +kerning first=305 second=363 amount=-1 +kerning first=8250 second=303 amount=-1 +kerning first=235 second=8217 amount=-2 +kerning first=246 second=102 amount=-1 +kerning first=363 second=273 amount=-1 +kerning first=377 second=363 amount=-3 +kerning first=332 second=225 amount=-1 +kerning first=264 second=280 amount=-3 +kerning first=291 second=273 amount=-2 +kerning first=194 second=8221 amount=-5 +kerning first=113 second=231 amount=-1 +kerning first=103 second=231 amount=-2 +kerning first=1086 second=1076 amount=-2 +kerning first=255 second=273 amount=-3 +kerning first=252 second=46 amount=-2 +kerning first=336 second=280 amount=-2 +kerning first=69 second=102 amount=-2 +kerning first=1050 second=1076 amount=-1 +kerning first=288 second=46 amount=-3 +kerning first=362 second=245 amount=-2 +kerning first=221 second=261 amount=-5 +kerning first=257 second=261 amount=-1 +kerning first=206 second=367 amount=-2 +kerning first=1060 second=1118 amount=-1 +kerning first=1057 second=1067 amount=-1 +kerning first=65 second=367 amount=-3 +kerning first=218 second=210 amount=-1 +kerning first=101 second=367 amount=-2 +kerning first=72 second=211 amount=-2 +kerning first=45 second=352 amount=-3 +kerning first=307 second=8220 amount=-2 +kerning first=200 second=296 amount=-2 +kerning first=368 second=250 amount=-1 +kerning first=80 second=261 amount=-1 +kerning first=1043 second=1092 amount=-3 +kerning first=321 second=211 amount=-1 +kerning first=379 second=351 amount=-2 +kerning first=77 second=210 amount=-2 +kerning first=354 second=275 amount=-3 +kerning first=235 second=8220 amount=-2 +kerning first=272 second=296 amount=-2 +kerning first=81 second=352 amount=-1 +kerning first=262 second=112 amount=-3 +kerning first=260 second=250 amount=-3 +kerning first=98 second=378 amount=-2 +kerning first=200 second=327 amount=-2 +kerning first=224 second=250 amount=-1 +kerning first=208 second=86 amount=-2 +kerning first=321 second=326 amount=-1 +kerning first=203 second=378 amount=-2 +kerning first=272 second=327 amount=-2 +kerning first=120 second=122 amount=-2 +kerning first=8216 second=232 amount=-3 +kerning first=325 second=212 amount=-2 +kerning first=121 second=112 amount=-2 +kerning first=99 second=235 amount=-1 +kerning first=296 second=250 amount=-2 +kerning first=8250 second=325 amount=-5 +kerning first=85 second=112 amount=-2 +kerning first=83 second=250 amount=-1 +kerning first=365 second=261 amount=-1 +kerning first=204 second=235 amount=-2 +kerning first=108 second=326 amount=-1 +kerning first=352 second=86 amount=-3 +kerning first=1024 second=1118 amount=-1 +kerning first=90 second=328 amount=-1 +kerning first=119 second=250 amount=-1 +kerning first=102 second=171 amount=-3 +kerning first=222 second=206 amount=-2 +kerning first=117 second=237 amount=-2 +kerning first=84 second=288 amount=-3 +kerning first=296 second=365 amount=-2 +kerning first=81 second=237 amount=-1 +kerning first=260 second=365 amount=-3 +kerning first=45 second=237 amount=-1 +kerning first=365 second=113 amount=-1 +kerning first=280 second=262 amount=-1 +kerning first=224 second=365 amount=-1 +kerning first=67 second=83 amount=-3 +kerning first=197 second=100 amount=-1 +kerning first=307 second=355 amount=-1 +kerning first=253 second=353 amount=-3 +kerning first=315 second=171 amount=-1 +kerning first=1114 second=1113 amount=-1 +kerning first=370 second=112 amount=-2 +kerning first=111 second=382 amount=-2 +kerning first=289 second=353 amount=-3 +kerning first=351 second=171 amount=-1 +kerning first=269 second=100 amount=-1 +kerning first=347 second=378 amount=-2 +kerning first=1042 second=1113 amount=-1 +kerning first=208 second=83 amount=-1 +kerning first=89 second=113 amount=-3 +kerning first=298 second=112 amount=-1 +kerning first=222 second=352 amount=-1 +kerning first=213 second=323 amount=-2 +kerning first=280 second=83 amount=-2 +kerning first=200 second=46 amount=-1 +kerning first=112 second=353 amount=-2 +kerning first=332 second=289 amount=-1 +kerning first=80 second=113 amount=-1 +kerning first=352 second=83 amount=-1 +kerning first=264 second=249 amount=-2 +kerning first=70 second=198 amount=-3 +kerning first=258 second=352 amount=-3 +kerning first=217 second=353 amount=-2 +kerning first=1054 second=1078 amount=-1 +kerning first=366 second=352 amount=-3 +kerning first=105 second=275 amount=-1 +kerning first=370 second=337 amount=-2 +kerning first=330 second=352 amount=-2 +kerning first=321 second=323 amount=-2 +kerning first=1006 second=997 amount=-2 +kerning first=257 second=113 amount=-1 +kerning first=1092 second=1091 amount=-1 +kerning first=67 second=262 amount=-3 +kerning first=221 second=113 amount=-3 +kerning first=275 second=353 amount=-2 +kerning first=283 second=223 amount=-1 +kerning first=354 second=332 amount=-3 +kerning first=111 second=291 amount=-2 +kerning first=350 second=339 amount=-1 +kerning first=117 second=324 amount=-1 +kerning first=199 second=233 amount=-2 +kerning first=379 second=379 amount=-1 +kerning first=354 second=99 amount=-3 +kerning first=313 second=304 amount=-2 +kerning first=336 second=364 amount=-1 +kerning first=80 second=289 amount=-3 +kerning first=8220 second=346 amount=-1 +kerning first=8222 second=121 amount=-1 +kerning first=116 second=289 amount=-2 +kerning first=314 second=339 amount=-1 +kerning first=264 second=364 amount=-2 +kerning first=1045 second=1102 amount=-1 +kerning first=192 second=249 amount=-3 +kerning first=214 second=274 amount=-2 +kerning first=221 second=289 amount=-4 +kerning first=262 second=84 amount=-1 +kerning first=228 second=249 amount=-1 +kerning first=257 second=289 amount=-2 +kerning first=258 second=89 amount=-6 +kerning first=103 second=114 amount=-1 +kerning first=45 second=324 amount=-2 +kerning first=87 second=249 amount=-1 +kerning first=222 second=89 amount=-2 +kerning first=1057 second=1039 amount=-1 +kerning first=379 second=233 amount=-1 +kerning first=76 second=350 amount=-1 +kerning first=65 second=339 amount=-1 +kerning first=67 second=234 amount=-2 +kerning first=103 second=234 amount=-2 +kerning first=366 second=237 amount=-2 +kerning first=1051 second=1114 amount=-1 +kerning first=286 second=274 amount=-1 +kerning first=105 second=99 amount=-1 +kerning first=334 second=84 amount=-2 +kerning first=330 second=237 amount=-1 +kerning first=221 second=110 amount=-3 +kerning first=268 second=212 amount=-3 +kerning first=1114 second=1116 amount=-1 +kerning first=206 second=339 amount=-2 +kerning first=257 second=110 amount=-1 +kerning first=192 second=121 amount=-3 +kerning first=332 second=8217 amount=-2 +kerning first=258 second=237 amount=-1 +kerning first=199 second=379 amount=-2 +kerning first=101 second=339 amount=-1 +kerning first=222 second=237 amount=-1 +kerning first=366 second=324 amount=-2 +kerning first=217 second=350 amount=-3 +kerning first=365 second=110 amount=-1 +kerning first=88 second=362 amount=-2 +kerning first=352 second=234 amount=-1 +kerning first=315 second=199 amount=-1 +kerning first=1058 second=1084 amount=-2 +kerning first=89 second=111 amount=-3 +kerning first=325 second=350 amount=-2 +kerning first=1092 second=1119 amount=-1 +kerning first=222 second=209 amount=-2 +kerning first=120 second=375 amount=-3 +kerning first=228 second=277 amount=-1 +kerning first=67 second=86 amount=-1 +kerning first=258 second=103 amount=-3 +kerning first=192 second=277 amount=-1 +kerning first=286 second=302 amount=-1 +kerning first=379 second=264 amount=-1 +kerning first=8220 second=259 amount=-3 +kerning first=203 second=260 amount=-2 +kerning first=316 second=234 amount=-1 +kerning first=264 second=277 amount=-2 +kerning first=214 second=302 amount=-2 +kerning first=365 second=289 amount=-3 +kerning first=374 second=111 amount=-3 +kerning first=235 second=351 amount=-2 +kerning first=81 second=89 amount=-2 +kerning first=8218 second=259 amount=-2 +kerning first=199 second=264 amount=-3 +kerning first=344 second=212 amount=-3 +kerning first=66 second=199 amount=-3 +kerning first=1064 second=1054 amount=-1 +kerning first=87 second=277 amount=-3 +kerning first=307 second=351 amount=-2 +kerning first=314 second=367 amount=-2 +kerning first=194 second=111 amount=-1 +kerning first=213 second=354 amount=-2 +kerning first=89 second=377 amount=-3 +kerning first=350 second=367 amount=-1 +kerning first=296 second=275 amount=-2 +kerning first=377 second=72 amount=-1 +kerning first=230 second=111 amount=-1 +kerning first=192 second=364 amount=-3 +kerning first=81 second=209 amount=-2 +kerning first=242 second=367 amount=-1 +kerning first=207 second=199 amount=-2 +kerning first=266 second=111 amount=-2 +kerning first=199 second=351 amount=-2 +kerning first=45 second=209 amount=-5 +kerning first=200 second=212 amount=-1 +kerning first=278 second=367 amount=-2 +kerning first=302 second=111 amount=-2 +kerning first=321 second=354 amount=-3 +kerning first=87 second=364 amount=-1 +kerning first=352 second=111 amount=-1 +kerning first=89 second=362 amount=-1 +kerning first=87 second=264 amount=-3 +kerning first=321 second=351 amount=-1 +kerning first=110 second=361 amount=-1 +kerning first=259 second=8249 amount=-2 +kerning first=105 second=121 amount=-3 +kerning first=266 second=377 amount=-2 +kerning first=1088 second=1074 amount=-1 +kerning first=8217 second=119 amount=-1 +kerning first=67 second=85 amount=-2 +kerning first=233 second=244 amount=-1 +kerning first=295 second=8249 amount=-3 +kerning first=199 second=364 amount=-2 +kerning first=1117 second=1077 amount=-1 +kerning first=363 second=257 amount=-1 +kerning first=73 second=277 amount=-2 +kerning first=230 second=97 amount=-2 +kerning first=374 second=377 amount=-3 +kerning first=287 second=361 amount=-1 +kerning first=291 second=257 amount=-3 +kerning first=264 second=367 amount=-2 +kerning first=117 second=311 amount=-2 +kerning first=1081 second=1077 amount=-1 +kerning first=108 second=351 amount=-2 +kerning first=251 second=361 amount=-1 +kerning first=226 second=254 amount=-1 +kerning first=327 second=257 amount=-2 +kerning first=118 second=8249 amount=-4 +kerning first=75 second=287 amount=-2 +kerning first=356 second=267 amount=-3 +kerning first=262 second=254 amount=-1 +kerning first=219 second=257 amount=-3 +kerning first=192 second=367 amount=-3 +kerning first=338 second=377 amount=-1 +kerning first=316 second=111 amount=-1 +kerning first=323 second=361 amount=-2 +kerning first=255 second=257 amount=-3 +kerning first=46 second=8249 amount=-3 +kerning first=221 second=274 amount=-1 +kerning first=381 second=374 amount=-2 +kerning first=374 second=117 amount=-2 +kerning first=235 second=261 amount=-2 +kerning first=87 second=367 amount=-2 +kerning first=111 second=287 amount=-2 +kerning first=338 second=117 amount=-2 +kerning first=260 second=244 amount=-1 +kerning first=69 second=381 amount=-1 +kerning first=252 second=287 amount=-3 +kerning first=122 second=44 amount=-1 +kerning first=8216 second=226 amount=-3 +kerning first=307 second=261 amount=-2 +kerning first=296 second=244 amount=-2 +kerning first=354 second=121 amount=-3 +kerning first=80 second=274 amount=-1 +kerning first=216 second=287 amount=-1 +kerning first=307 second=104 amount=-1 +kerning first=121 second=254 amount=-1 +kerning first=324 second=287 amount=-2 +kerning first=354 second=250 amount=-2 +kerning first=368 second=244 amount=-2 +kerning first=210 second=381 amount=-2 +kerning first=288 second=287 amount=-3 +kerning first=201 second=374 amount=-1 +kerning first=246 second=121 amount=-3 +kerning first=323 second=237 amount=-1 +kerning first=331 second=8249 amount=-3 +kerning first=282 second=381 amount=-1 +kerning first=287 second=237 amount=-2 +kerning first=307 second=114 amount=-1 +kerning first=367 second=8249 amount=-2 +kerning first=1049 second=1104 amount=-1 +kerning first=112 second=378 amount=-2 +kerning first=194 second=281 amount=-1 +kerning first=228 second=107 amount=-1 +kerning first=221 second=171 amount=-5 +kerning first=375 second=337 amount=-3 +kerning first=197 second=347 amount=-2 +kerning first=230 second=281 amount=-1 +kerning first=192 second=107 amount=-2 +kerning first=257 second=171 amount=-2 +kerning first=339 second=337 amount=-1 +kerning first=370 second=97 amount=-3 +kerning first=352 second=240 amount=-1 +kerning first=282 second=250 amount=-2 +kerning first=217 second=378 amount=-3 +kerning first=266 second=281 amount=-2 +kerning first=8220 second=89 amount=-1 +kerning first=303 second=337 amount=-3 +kerning first=1104 second=1078 amount=-1 +kerning first=89 second=117 amount=-2 +kerning first=246 second=250 amount=-1 +kerning first=302 second=281 amount=-2 +kerning first=264 second=107 amount=-1 +kerning first=1048 second=1047 amount=-1 +kerning first=230 second=117 amount=-2 +kerning first=379 second=261 amount=-1 +kerning first=44 second=171 amount=-3 +kerning first=194 second=117 amount=-3 +kerning first=274 second=197 amount=-2 +kerning first=80 second=171 amount=-3 +kerning first=65 second=354 amount=-6 +kerning first=302 second=117 amount=-2 +kerning first=105 second=250 amount=-1 +kerning first=89 second=281 amount=-3 +kerning first=116 second=171 amount=-1 +kerning first=266 second=117 amount=-2 +kerning first=69 second=250 amount=-2 +kerning first=346 second=197 amount=-4 +kerning first=291 second=100 amount=-2 +kerning first=103 second=240 amount=-2 +kerning first=114 second=257 amount=-1 +kerning first=327 second=100 amount=-2 +kerning first=244 second=371 amount=-1 +kerning first=83 second=74 amount=-2 +kerning first=203 second=288 amount=-1 +kerning first=363 second=100 amount=-1 +kerning first=8220 second=246 amount=-3 +kerning first=278 second=354 amount=-1 +kerning first=67 second=240 amount=-2 +kerning first=78 second=257 amount=-2 +kerning first=264 second=264 amount=-3 +kerning first=289 second=378 amount=-3 +kerning first=365 second=171 amount=-2 +kerning first=115 second=314 amount=-2 +kerning first=350 second=354 amount=-3 +kerning first=316 second=240 amount=-1 +kerning first=253 second=378 amount=-3 +kerning first=256 second=314 amount=-2 +kerning first=192 second=264 amount=-3 +kerning first=219 second=100 amount=-2 +kerning first=103 second=371 amount=-1 +kerning first=305 second=347 amount=-1 +kerning first=296 second=74 amount=-1 +kerning first=274 second=338 amount=-1 +kerning first=1085 second=1104 amount=-1 +kerning first=255 second=100 amount=-3 +kerning first=325 second=378 amount=-1 +kerning first=332 second=74 amount=-2 +kerning first=328 second=314 amount=-1 +kerning first=220 second=255 amount=-1 +kerning first=195 second=71 amount=-3 +kerning first=200 second=311 amount=-1 +kerning first=217 second=90 amount=-1 +kerning first=290 second=207 amount=-1 +kerning first=1101 second=1114 amount=-1 +kerning first=45 second=330 amount=-5 +kerning first=313 second=298 amount=-2 +kerning first=81 second=330 amount=-2 +kerning first=101 second=224 amount=-2 +kerning first=8249 second=84 amount=-3 +kerning first=376 second=291 amount=-4 +kerning first=86 second=317 amount=-1 +kerning first=72 second=214 amount=-2 +kerning first=206 second=224 amount=-2 +kerning first=90 second=71 amount=-1 +kerning first=257 second=234 amount=-1 +kerning first=222 second=330 amount=-2 +kerning first=304 second=291 amount=-3 +kerning first=1038 second=1108 amount=-4 +kerning first=268 second=291 amount=-3 +kerning first=104 second=318 amount=-1 +kerning first=317 second=200 amount=-2 +kerning first=278 second=224 amount=-1 +kerning first=232 second=291 amount=-3 +kerning first=242 second=224 amount=-1 +kerning first=195 second=213 amount=-3 +kerning first=196 second=291 amount=-3 +kerning first=236 second=324 amount=-2 +kerning first=350 second=224 amount=-1 +kerning first=200 second=324 amount=-1 +kerning first=245 second=318 amount=-2 +kerning first=85 second=97 amount=-3 +kerning first=84 second=346 amount=-3 +kerning first=314 second=224 amount=-2 +kerning first=380 second=311 amount=-2 +kerning first=267 second=337 amount=-1 +kerning first=281 second=318 amount=-3 +kerning first=298 second=97 amount=-2 +kerning first=90 second=77 amount=-1 +kerning first=344 second=311 amount=-3 +kerning first=86 second=304 amount=-1 +kerning first=231 second=337 amount=-1 +kerning first=87 second=101 amount=-3 +kerning first=334 second=97 amount=-1 +kerning first=195 second=337 amount=-1 +kerning first=353 second=318 amount=-2 +kerning first=226 second=97 amount=-1 +kerning first=192 second=101 amount=-1 +kerning first=262 second=97 amount=-2 +kerning first=236 second=311 amount=-1 +kerning first=76 second=90 amount=-3 +kerning first=317 second=303 amount=-2 +kerning first=228 second=101 amount=-1 +kerning first=371 second=44 amount=-2 +kerning first=117 second=234 amount=-1 +kerning first=354 second=381 amount=-3 +kerning first=353 second=303 amount=-2 +kerning first=264 second=101 amount=-2 +kerning first=335 second=44 amount=-3 +kerning first=45 second=70 amount=-5 +kerning first=8220 second=83 amount=-1 +kerning first=272 second=193 amount=-4 +kerning first=1089 second=1098 amount=-1 +kerning first=281 second=303 amount=-2 +kerning first=1092 second=1107 amount=-1 +kerning first=235 second=104 amount=-2 +kerning first=222 second=70 amount=-2 +kerning first=290 second=325 amount=-1 +kerning first=380 second=324 amount=-2 +kerning first=199 second=104 amount=-1 +kerning first=81 second=70 amount=-2 +kerning first=101 second=249 amount=-2 +kerning first=263 second=44 amount=-3 +kerning first=82 second=284 amount=-3 +kerning first=90 second=213 amount=-1 +kerning first=108 second=227 amount=-2 +kerning first=67 second=111 amount=-2 +kerning first=282 second=316 amount=-1 +kerning first=78 second=251 amount=-2 +kerning first=72 second=227 amount=-2 +kerning first=317 second=194 amount=-2 +kerning first=103 second=111 amount=-2 +kerning first=72 second=351 amount=-2 +kerning first=219 second=251 amount=-1 +kerning first=321 second=85 amount=-3 +kerning first=258 second=234 amount=-1 +kerning first=291 second=251 amount=-1 +kerning first=209 second=303 amount=-1 +kerning first=255 second=251 amount=-1 +kerning first=213 second=85 amount=-1 +kerning first=249 second=227 amount=-1 +kerning first=330 second=234 amount=-2 +kerning first=68 second=303 amount=-1 +kerning first=290 second=201 amount=-1 +kerning first=363 second=251 amount=-1 +kerning first=310 second=211 amount=-3 +kerning first=213 second=227 amount=-1 +kerning first=366 second=234 amount=-2 +kerning first=1074 second=1093 amount=-1 +kerning first=104 second=303 amount=-1 +kerning first=250 second=277 amount=-1 +kerning first=356 second=90 amount=-3 +kerning first=327 second=251 amount=-2 +kerning first=290 second=310 amount=-1 +kerning first=344 second=97 amount=-2 +kerning first=275 second=118 amount=-2 +kerning first=289 second=105 amount=-2 +kerning first=73 second=283 amount=-2 +kerning first=258 second=231 amount=-1 +kerning first=325 second=105 amount=-1 +kerning first=347 second=118 amount=-3 +kerning first=217 second=105 amount=-2 +kerning first=311 second=118 amount=-1 +kerning first=253 second=105 amount=-2 +kerning first=80 second=280 amount=-1 +kerning first=98 second=118 amount=-2 +kerning first=201 second=368 amount=-2 +kerning first=112 second=105 amount=-1 +kerning first=233 second=245 amount=-1 +kerning first=250 second=283 amount=-1 +kerning first=197 second=245 amount=-1 +kerning first=203 second=118 amount=-1 +kerning first=221 second=280 amount=-1 +kerning first=356 second=8249 amount=-5 +kerning first=76 second=105 amount=-2 +kerning first=375 second=228 amount=-3 +kerning first=199 second=84 amount=-1 +kerning first=316 second=337 amount=-1 +kerning first=289 second=241 amount=-1 +kerning first=339 second=228 amount=-2 +kerning first=303 second=228 amount=-2 +kerning first=283 second=335 amount=-1 +kerning first=201 second=108 amount=-1 +kerning first=1045 second=1083 amount=-1 +kerning first=122 second=326 amount=-2 +kerning first=200 second=193 amount=-2 +kerning first=112 second=241 amount=-1 +kerning first=221 second=353 amount=-3 +kerning first=70 second=335 amount=-1 +kerning first=1116 second=1092 amount=-2 +kerning first=253 second=241 amount=-2 +kerning first=106 second=335 amount=-1 +kerning first=199 second=370 amount=-2 +kerning first=90 second=228 amount=-1 +kerning first=363 second=122 amount=-2 +kerning first=375 second=331 amount=-2 +kerning first=1063 second=1085 amount=-1 +kerning first=251 second=231 amount=-1 +kerning first=327 second=122 amount=-1 +kerning first=332 second=362 amount=-1 +kerning first=287 second=231 amount=-2 +kerning first=1063 second=1097 amount=-1 +kerning first=291 second=122 amount=-3 +kerning first=303 second=331 amount=-2 +kerning first=76 second=241 amount=-1 +kerning first=201 second=256 amount=-2 +kerning first=255 second=122 amount=-3 +kerning first=339 second=331 amount=-2 +kerning first=231 second=331 amount=-2 +kerning first=1050 second=1057 amount=-4 +kerning first=379 second=255 amount=-3 +kerning first=1027 second=1097 amount=-2 +kerning first=267 second=331 amount=-2 +kerning first=365 second=116 amount=-1 +kerning first=307 second=255 amount=-3 +kerning first=1043 second=1073 amount=-1 +kerning first=323 second=231 amount=-2 +kerning first=260 second=362 amount=-3 +kerning first=381 second=77 amount=-1 +kerning first=235 second=255 amount=-2 +kerning first=1025 second=1087 amount=-1 +kerning first=377 second=245 amount=-1 +kerning first=88 second=67 amount=-3 +kerning first=90 second=331 amount=-1 +kerning first=199 second=255 amount=-1 +kerning first=232 second=8250 amount=-2 +kerning first=377 second=81 amount=-1 +kerning first=1101 second=1095 amount=-1 +kerning first=378 second=261 amount=-1 +kerning first=1065 second=1095 amount=-3 +kerning first=83 second=362 amount=-3 +kerning first=269 second=245 amount=-1 +kerning first=321 second=214 amount=-1 +kerning first=219 second=122 amount=-3 +kerning first=203 second=266 amount=-1 +kerning first=74 second=231 amount=-2 +kerning first=90 second=65 amount=-1 +kerning first=78 second=122 amount=-1 +kerning first=249 second=345 amount=-1 +kerning first=356 second=282 amount=-1 +kerning first=377 second=229 amount=-1 +kerning first=378 second=307 amount=-1 +kerning first=79 second=217 amount=-1 +kerning first=1047 second=1053 amount=-2 +kerning first=1045 second=1099 amount=-1 +kerning first=284 second=282 amount=-1 +kerning first=305 second=229 amount=-1 +kerning first=200 second=305 amount=-1 +kerning first=88 second=333 amount=-2 +kerning first=1114 second=1084 amount=-1 +kerning first=202 second=68 amount=-2 +kerning first=310 second=216 amount=-3 +kerning first=321 second=122 amount=-3 +kerning first=212 second=282 amount=-2 +kerning first=272 second=305 amount=-1 +kerning first=256 second=217 amount=-3 +kerning first=76 second=74 amount=-1 +kerning first=236 second=305 amount=-2 +kerning first=74 second=346 amount=-1 +kerning first=255 second=106 amount=-2 +kerning first=332 second=80 amount=-2 +kerning first=193 second=67 amount=-3 +kerning first=197 second=81 amount=-3 +kerning first=71 second=282 amount=-1 +kerning first=314 second=230 amount=-2 +kerning first=363 second=106 amount=-2 +kerning first=350 second=230 amount=-2 +kerning first=380 second=305 amount=-2 +kerning first=242 second=230 amount=-1 +kerning first=278 second=230 amount=-1 +kerning first=74 second=243 amount=-2 +kerning first=211 second=204 amount=-2 +kerning first=229 second=333 amount=-1 +kerning first=234 second=307 amount=-2 +kerning first=206 second=230 amount=-2 +kerning first=193 second=333 amount=-1 +kerning first=374 second=281 amount=-3 +kerning first=199 second=378 amount=-2 +kerning first=101 second=230 amount=-2 +kerning first=113 second=242 amount=-1 +kerning first=323 second=346 amount=-2 +kerning first=274 second=334 amount=-1 +kerning first=206 second=79 amount=-2 +kerning first=287 second=243 amount=-2 +kerning first=8250 second=197 amount=-4 +kerning first=202 second=203 amount=-2 +kerning first=323 second=243 amount=-2 +kerning first=193 second=218 amount=-3 +kerning first=275 second=104 amount=-2 +kerning first=8222 second=225 amount=-2 +kerning first=310 second=334 amount=-3 +kerning first=266 second=318 amount=-1 +kerning first=302 second=268 amount=-2 +kerning first=8222 second=250 amount=-1 +kerning first=79 second=69 amount=-2 +kerning first=208 second=73 amount=-2 +kerning first=334 second=112 amount=-1 +kerning first=8218 second=354 amount=-6 +kerning first=266 second=268 amount=-3 +kerning first=83 second=244 amount=-1 +kerning first=204 second=332 amount=-2 +kerning first=278 second=79 amount=-1 +kerning first=277 second=8221 amount=-2 +kerning first=374 second=268 amount=-3 +kerning first=1052 second=1072 amount=-1 +kerning first=119 second=244 amount=-3 +kerning first=338 second=268 amount=-1 +kerning first=251 second=243 amount=-1 +kerning first=346 second=68 amount=-3 +kerning first=245 second=98 amount=-1 +kerning first=83 second=80 amount=-3 +kerning first=89 second=268 amount=-3 +kerning first=274 second=68 amount=-2 +kerning first=1108 second=1098 amount=-1 +kerning first=1072 second=1098 amount=-1 +kerning first=194 second=268 amount=-3 +kerning first=88 second=218 amount=-2 +kerning first=1059 second=1058 amount=-1 +kerning first=233 second=229 amount=-2 +kerning first=198 second=192 amount=-2 +kerning first=346 second=203 amount=-3 +kerning first=269 second=229 amount=-2 +kerning first=202 second=334 amount=-1 +kerning first=121 second=242 amount=-3 +kerning first=201 second=120 amount=-1 +kerning first=274 second=203 amount=-2 +kerning first=85 second=242 amount=-2 +kerning first=1074 second=1099 amount=-1 +kerning first=356 second=279 amount=-3 +kerning first=226 second=242 amount=-1 +kerning first=289 second=99 amount=-2 +kerning first=240 second=229 amount=-1 +kerning first=86 second=192 amount=-6 +kerning first=1038 second=1099 amount=-4 +kerning first=253 second=99 amount=-3 +kerning first=249 second=339 amount=-1 +kerning first=377 second=232 amount=-1 +kerning first=298 second=242 amount=-2 +kerning first=8218 second=224 amount=-2 +kerning first=214 second=289 amount=-1 +kerning first=108 second=339 amount=-1 +kerning first=262 second=242 amount=-2 +kerning first=325 second=99 amount=-2 +kerning first=204 second=229 amount=-2 +kerning first=370 second=242 amount=-2 +kerning first=286 second=289 amount=-3 +kerning first=269 second=232 amount=-1 +kerning first=313 second=282 amount=-2 +kerning first=45 second=249 amount=-1 +kerning first=233 second=232 amount=-1 +kerning first=71 second=119 amount=-1 +kerning first=1045 second=1096 amount=-1 +kerning first=107 second=119 amount=-1 +kerning first=269 second=326 amount=-2 +kerning first=226 second=106 amount=-1 +kerning first=262 second=106 amount=-1 +kerning first=81 second=346 amount=-1 +kerning first=121 second=106 amount=-2 +kerning first=248 second=119 amount=-2 +kerning first=197 second=232 amount=-1 +kerning first=45 second=346 amount=-3 +kerning first=284 second=119 amount=-1 +kerning first=264 second=379 amount=-2 +kerning first=330 second=346 amount=-2 +kerning first=1043 second=1079 amount=-1 +kerning first=350 second=82 amount=-3 +kerning first=356 second=119 amount=-3 +kerning first=336 second=379 amount=-2 +kerning first=258 second=346 amount=-3 +kerning first=1049 second=1116 amount=-1 +kerning first=217 second=99 amount=-2 +kerning first=222 second=346 amount=-1 +kerning first=334 second=106 amount=-1 +kerning first=73 second=289 amount=-3 +kerning first=379 second=73 amount=-1 +kerning first=1102 second=1095 amount=-1 +kerning first=72 second=79 amount=-2 +kerning first=321 second=69 amount=-2 +kerning first=278 second=82 amount=-2 +kerning first=193 second=212 amount=-3 +kerning first=79 second=66 amount=-2 +kerning first=113 second=316 amount=-2 +kerning first=1049 second=1119 amount=-1 +kerning first=1045 second=1042 amount=-1 +kerning first=88 second=212 amount=-3 +kerning first=45 second=196 amount=-4 +kerning first=311 second=269 amount=-3 +kerning first=213 second=69 amount=-2 +kerning first=315 second=302 amount=-2 +kerning first=244 second=98 amount=-1 +kerning first=254 second=316 amount=-2 +kerning first=346 second=350 amount=-1 +kerning first=275 second=269 amount=-1 +kerning first=202 second=216 amount=-1 +kerning first=336 second=8217 amount=-2 +kerning first=1036 second=1089 amount=-2 +kerning first=200 second=199 amount=-1 +kerning first=321 second=79 amount=-1 +kerning first=274 second=216 amount=-1 +kerning first=79 second=205 amount=-2 +kerning first=99 second=229 amount=-2 +kerning first=74 second=89 amount=-1 +kerning first=81 second=76 amount=-2 +kerning first=344 second=199 amount=-3 +kerning first=228 second=8217 amount=-3 +kerning first=100 second=106 amount=-1 +kerning first=45 second=76 amount=-5 +kerning first=304 second=245 amount=-2 +kerning first=289 second=102 amount=-1 +kerning first=226 second=245 amount=-1 +kerning first=209 second=46 amount=-1 +kerning first=220 second=251 amount=-1 +kerning first=258 second=336 amount=-3 +kerning first=245 second=46 amount=-3 +kerning first=1036 second=1060 amount=-4 +kerning first=121 second=245 amount=-3 +kerning first=73 second=286 amount=-2 +kerning first=1088 second=1098 amount=-1 +kerning first=8250 second=318 amount=-1 +kerning first=85 second=245 amount=-2 +kerning first=112 second=102 amount=-1 +kerning first=366 second=336 amount=-1 +kerning first=370 second=245 amount=-2 +kerning first=354 second=266 amount=-3 +kerning first=335 second=8221 amount=-2 +kerning first=112 second=46 amount=-3 +kerning first=1036 second=1086 amount=-2 +kerning first=217 second=102 amount=-1 +kerning first=8218 second=227 amount=-2 +kerning first=298 second=245 amount=-2 +kerning first=282 second=266 amount=-1 +kerning first=104 second=46 amount=-1 +kerning first=1088 second=1083 amount=-2 +kerning first=262 second=245 amount=-2 +kerning first=199 second=252 amount=-2 +kerning first=86 second=202 amount=-1 +kerning first=236 second=45 amount=-3 +kerning first=281 second=316 amount=-3 +kerning first=326 second=316 amount=-1 +kerning first=121 second=103 amount=-3 +kerning first=344 second=45 amount=-4 +kerning first=315 second=296 amount=-2 +kerning first=246 second=347 amount=-2 +kerning first=85 second=103 amount=-4 +kerning first=195 second=219 amount=-3 +kerning first=307 second=252 amount=-1 +kerning first=208 second=364 amount=-1 +kerning first=99 second=226 amount=-2 +kerning first=380 second=45 amount=-3 +kerning first=204 second=335 amount=-2 +kerning first=381 second=259 amount=-1 +kerning first=204 second=226 amount=-2 +kerning first=240 second=226 amount=-1 +kerning first=76 second=253 amount=-3 +kerning first=85 second=369 amount=-1 +kerning first=112 second=253 amount=-3 +kerning first=246 second=375 amount=-3 +kerning first=66 second=85 amount=-3 +kerning first=345 second=259 amount=-1 +kerning first=1067 second=1073 amount=-1 +kerning first=217 second=253 amount=-1 +kerning first=352 second=246 amount=-1 +kerning first=121 second=369 amount=-1 +kerning first=370 second=103 amount=-4 +kerning first=187 second=287 amount=-3 +kerning first=316 second=246 amount=-1 +kerning first=334 second=103 amount=-1 +kerning first=8218 second=85 amount=-3 +kerning first=289 second=253 amount=-1 +kerning first=379 second=252 amount=-3 +kerning first=87 second=116 amount=-1 +kerning first=83 second=356 amount=-3 +kerning first=298 second=103 amount=-3 +kerning first=325 second=253 amount=-2 +kerning first=354 second=375 amount=-3 +kerning first=201 second=259 amount=-1 +kerning first=262 second=103 amount=-3 +kerning first=192 second=116 amount=-1 +kerning first=74 second=83 amount=-1 +kerning first=226 second=103 amount=-2 +kerning first=296 second=267 amount=-2 +kerning first=255 second=382 amount=-3 +kerning first=212 second=122 amount=-2 +kerning first=103 second=246 amount=-2 +kerning first=370 second=369 amount=-1 +kerning first=291 second=382 amount=-3 +kerning first=363 second=109 amount=-1 +kerning first=67 second=246 amount=-2 +kerning first=107 second=279 amount=-3 +kerning first=8220 second=240 amount=-3 +kerning first=327 second=382 amount=-1 +kerning first=79 second=323 amount=-2 +kerning first=363 second=382 amount=-2 +kerning first=71 second=122 amount=-1 +kerning first=262 second=369 amount=-2 +kerning first=65 second=81 amount=-3 +kerning first=255 second=109 amount=-2 +kerning first=356 second=122 amount=-3 +kerning first=226 second=369 amount=-1 +kerning first=323 second=83 amount=-2 +kerning first=69 second=266 amount=-1 +kerning first=284 second=122 amount=-1 +kerning first=298 second=369 amount=-2 +kerning first=76 second=362 amount=-3 +kerning first=332 second=356 amount=-2 +kerning first=219 second=382 amount=-3 +kerning first=291 second=109 amount=-1 +kerning first=248 second=122 amount=-2 +kerning first=1088 second=1080 amount=-1 +kerning first=240 second=223 amount=-1 +kerning first=105 second=115 amount=-2 +kerning first=8218 second=230 amount=-2 +kerning first=218 second=198 amount=-4 +kerning first=298 second=248 amount=-2 +kerning first=101 second=233 amount=-1 +kerning first=1038 second=1105 amount=-4 +kerning first=83 second=90 amount=-1 +kerning first=69 second=115 amount=-1 +kerning first=290 second=198 amount=-3 +kerning first=226 second=248 amount=-1 +kerning first=201 second=380 amount=-2 +kerning first=354 second=263 amount=-3 +kerning first=86 second=109 amount=-3 +kerning first=363 second=117 amount=-1 +kerning first=206 second=233 amount=-2 +kerning first=85 second=248 amount=-2 +kerning first=376 second=288 amount=-3 +kerning first=121 second=248 amount=-3 +kerning first=171 second=89 amount=-3 +kerning first=117 second=307 amount=-2 +kerning first=99 second=223 amount=-1 +kerning first=246 second=115 amount=-2 +kerning first=290 second=313 amount=-1 +kerning first=68 second=315 amount=-2 +kerning first=350 second=233 amount=-1 +kerning first=112 second=365 amount=-1 +kerning first=314 second=233 amount=-1 +kerning first=76 second=365 amount=-2 +kerning first=202 second=213 amount=-1 +kerning first=354 second=115 amount=-3 +kerning first=287 second=355 amount=-1 +kerning first=248 second=249 amount=-1 +kerning first=251 second=355 amount=-1 +kerning first=274 second=213 amount=-1 +kerning first=198 second=298 amount=-2 +kerning first=83 second=350 amount=-1 +kerning first=87 second=110 amount=-3 +kerning first=222 second=73 amount=-2 +kerning first=362 second=198 amount=-4 +kerning first=105 second=263 amount=-1 +kerning first=310 second=213 amount=-3 +kerning first=228 second=110 amount=-1 +kerning first=354 second=377 amount=-3 +kerning first=260 second=350 amount=-3 +kerning first=202 second=328 amount=-1 +kerning first=264 second=110 amount=-1 +kerning first=45 second=73 amount=-5 +kerning first=296 second=350 amount=-2 +kerning first=85 second=363 amount=-1 +kerning first=211 second=325 amount=-2 +kerning first=216 second=303 amount=-1 +kerning first=8250 second=203 amount=-5 +kerning first=90 second=225 amount=-1 +kerning first=81 second=73 amount=-2 +kerning first=103 second=98 amount=-1 +kerning first=97 second=328 amount=-1 +kerning first=121 second=363 amount=-1 +kerning first=67 second=98 amount=-1 +kerning first=65 second=85 amount=-3 +kerning first=258 second=221 amount=-6 +kerning first=346 second=328 amount=-1 +kerning first=226 second=363 amount=-1 +kerning first=324 second=303 amount=-1 +kerning first=262 second=363 amount=-2 +kerning first=200 second=196 amount=-2 +kerning first=222 second=205 amount=-2 +kerning first=68 second=200 amount=-2 +kerning first=286 second=44 amount=-3 +kerning first=317 second=315 amount=-2 +kerning first=332 second=350 amount=-1 +kerning first=274 second=328 amount=-1 +kerning first=298 second=363 amount=-2 +kerning first=252 second=303 amount=-2 +kerning first=222 second=221 amount=-2 +kerning first=368 second=350 amount=-3 +kerning first=69 second=260 amount=-2 +kerning first=272 second=196 amount=-4 +kerning first=339 second=225 amount=-2 +kerning first=352 second=98 amount=-2 +kerning first=366 second=264 amount=-1 +kerning first=210 second=260 amount=-4 +kerning first=370 second=363 amount=-1 +kerning first=381 second=380 amount=-3 +kerning first=375 second=225 amount=-3 +kerning first=316 second=98 amount=-1 +kerning first=82 second=290 amount=-3 +kerning first=282 second=260 amount=-2 +kerning first=382 second=328 amount=-2 +kerning first=1045 second=1093 amount=-2 +kerning first=354 second=260 amount=-6 +kerning first=103 second=117 amount=-1 +kerning first=350 second=85 amount=-3 +kerning first=231 second=225 amount=-2 +kerning first=267 second=225 amount=-2 +kerning first=8222 second=375 amount=-1 +kerning first=280 second=98 amount=-1 +kerning first=278 second=85 amount=-2 +kerning first=303 second=225 amount=-2 +kerning first=1074 second=1102 amount=-1 +kerning first=78 second=112 amount=-1 +kerning first=8249 second=374 amount=-3 +kerning first=1052 second=1077 amount=-1 +kerning first=8250 second=382 amount=-5 +kerning first=261 second=107 amount=-1 +kerning first=87 second=261 amount=-5 +kerning first=307 second=367 amount=-1 +kerning first=45 second=302 amount=-5 +kerning first=199 second=367 amount=-2 +kerning first=74 second=352 amount=-1 +kerning first=235 second=367 amount=-2 +kerning first=278 second=351 amount=-1 +kerning first=381 second=111 amount=-1 +kerning first=242 second=351 amount=-2 +kerning first=266 second=315 amount=-3 +kerning first=350 second=351 amount=-1 +kerning first=201 second=377 amount=-1 +kerning first=328 second=326 amount=-1 +kerning first=314 second=351 amount=-2 +kerning first=336 second=8220 amount=-2 +kerning first=364 second=326 amount=-2 +kerning first=1036 second=1092 amount=-2 +kerning first=363 second=112 amount=-2 +kerning first=338 second=78 amount=-2 +kerning first=88 second=252 amount=-3 +kerning first=73 second=171 amount=-4 +kerning first=197 second=235 amount=-1 +kerning first=115 second=326 amount=-2 +kerning first=327 second=112 amount=-1 +kerning first=109 second=171 amount=-3 +kerning first=74 second=86 amount=-1 +kerning first=233 second=235 amount=-1 +kerning first=220 second=211 amount=-1 +kerning first=82 second=287 amount=-3 +kerning first=291 second=112 amount=-1 +kerning first=291 second=113 amount=-2 +kerning first=192 second=8220 amount=-5 +kerning first=381 second=377 amount=-1 +kerning first=269 second=235 amount=-1 +kerning first=256 second=211 amount=-3 +kerning first=255 second=112 amount=-2 +kerning first=228 second=261 amount=-1 +kerning first=217 second=250 amount=-1 +kerning first=66 second=302 amount=-4 +kerning first=219 second=112 amount=-2 +kerning first=264 second=261 amount=-2 +kerning first=118 second=287 amount=-3 +kerning first=8220 second=243 amount=-3 +kerning first=377 second=235 amount=-1 +kerning first=364 second=211 amount=-1 +kerning first=104 second=121 amount=-2 +kerning first=1047 second=1103 amount=-2 +kerning first=114 second=112 amount=1 +kerning first=194 second=363 amount=-3 +kerning first=253 second=250 amount=-1 +kerning first=260 second=353 amount=-2 +kerning first=251 second=237 amount=-2 +kerning first=282 second=378 amount=-2 +kerning first=331 second=287 amount=-2 +kerning first=264 second=113 amount=-2 +kerning first=296 second=353 amount=-2 +kerning first=8216 second=335 amount=-3 +kerning first=246 second=378 amount=-2 +kerning first=295 second=287 amount=-2 +kerning first=228 second=113 amount=-1 +kerning first=381 second=262 amount=-1 +kerning first=119 second=261 amount=-3 +kerning first=354 second=378 amount=-3 +kerning first=112 second=250 amount=-1 +kerning first=192 second=113 amount=-1 +kerning first=368 second=353 amount=-2 +kerning first=110 second=237 amount=-1 +kerning first=367 second=287 amount=-3 +kerning first=325 second=365 amount=-2 +kerning first=74 second=237 amount=-2 +kerning first=105 second=378 amount=-1 +kerning first=262 second=366 amount=-2 +kerning first=289 second=365 amount=-1 +kerning first=69 second=378 amount=-2 +kerning first=250 second=171 amount=-2 +kerning first=253 second=365 amount=-1 +kerning first=374 second=242 amount=-3 +kerning first=281 second=369 amount=-2 +kerning first=286 second=171 amount=-3 +kerning first=370 second=100 amount=-2 +kerning first=224 second=353 amount=-1 +kerning first=87 second=379 amount=-3 +kerning first=66 second=171 amount=-3 +kerning first=199 second=249 amount=-2 +kerning first=268 second=288 amount=-3 +kerning first=233 second=109 amount=-2 +kerning first=317 second=197 amount=-2 +kerning first=1025 second=1078 amount=-2 +kerning first=323 second=352 amount=-2 +kerning first=235 second=249 amount=-2 +kerning first=377 second=87 amount=-2 +kerning first=73 second=112 amount=-1 +kerning first=226 second=100 amount=-1 +kerning first=381 second=216 amount=-1 +kerning first=304 second=288 amount=-2 +kerning first=262 second=100 amount=-2 +kerning first=275 second=275 amount=-1 +kerning first=197 second=87 amount=-6 +kerning first=87 second=113 amount=-3 +kerning first=201 second=262 amount=-1 +kerning first=221 second=202 amount=-1 +kerning first=1056 second=1104 amount=-1 +kerning first=196 second=288 amount=-3 +kerning first=307 second=249 amount=-1 +kerning first=85 second=100 amount=-2 +kerning first=80 second=243 amount=-1 +kerning first=90 second=117 amount=-3 +kerning first=213 second=217 amount=-1 +kerning first=122 second=314 amount=-2 +kerning first=377 second=115 amount=-2 +kerning first=378 second=106 amount=-2 +kerning first=346 second=218 amount=-3 +kerning first=70 second=269 amount=-1 +kerning first=327 second=288 amount=-2 +kerning first=227 second=314 amount=-1 +kerning first=321 second=217 amount=-3 +kerning first=198 second=366 amount=-2 +kerning first=316 second=333 amount=-1 +kerning first=78 second=288 amount=-2 +kerning first=68 second=68 amount=-2 +kerning first=234 second=113 amount=-1 +kerning first=106 second=269 amount=-1 +kerning first=1047 second=1118 amount=-1 +kerning first=219 second=288 amount=-1 +kerning first=371 second=314 amount=-2 +kerning first=352 second=333 amount=-1 +kerning first=117 second=224 amount=-1 +kerning first=45 second=367 amount=-1 +kerning first=268 second=198 amount=-3 +kerning first=88 second=262 amount=-3 +kerning first=81 second=224 amount=-1 +kerning first=381 second=281 amount=-1 +kerning first=254 second=307 amount=-1 +kerning first=283 second=269 amount=-1 +kerning first=222 second=224 amount=-1 +kerning first=195 second=210 amount=-3 +kerning first=337 second=255 amount=-3 +kerning first=193 second=262 amount=-3 +kerning first=326 second=307 amount=-1 +kerning first=257 second=243 amount=-1 +kerning first=370 second=326 amount=-2 +kerning first=90 second=210 amount=-1 +kerning first=45 second=257 amount=-1 +kerning first=229 second=255 amount=-3 +kerning first=202 second=197 amount=-2 +kerning first=366 second=224 amount=-3 +kerning first=193 second=255 amount=-3 +kerning first=330 second=224 amount=-2 +kerning first=381 second=274 amount=-1 +kerning first=203 second=229 amount=-1 +kerning first=280 second=73 amount=-2 +kerning first=86 second=75 amount=-1 +kerning first=98 second=229 amount=-1 +kerning first=8220 second=256 amount=-8 +kerning first=352 second=73 amount=-3 +kerning first=199 second=101 amount=-2 +kerning first=252 second=99 amount=-1 +kerning first=235 second=101 amount=-1 +kerning first=376 second=198 amount=-6 +kerning first=347 second=229 amount=-1 +kerning first=216 second=120 amount=-1 +kerning first=8217 second=81 amount=-2 +kerning first=296 second=118 amount=-2 +kerning first=252 second=120 amount=-2 +kerning first=307 second=101 amount=-1 +kerning first=275 second=229 amount=-2 +kerning first=283 second=248 amount=-1 +kerning first=311 second=229 amount=-2 +kerning first=368 second=118 amount=-2 +kerning first=324 second=120 amount=-1 +kerning first=90 second=203 amount=-1 +kerning first=379 second=101 amount=-1 +kerning first=69 second=108 amount=-1 +kerning first=208 second=80 amount=-2 +kerning first=378 second=113 amount=-1 +kerning first=119 second=118 amount=-1 +kerning first=321 second=196 amount=-2 +kerning first=233 second=347 amount=-2 +kerning first=337 second=8220 amount=-2 +kerning first=260 second=118 amount=-3 +kerning first=352 second=226 amount=-2 +kerning first=280 second=80 amount=-2 +kerning first=224 second=118 amount=-3 +kerning first=334 second=87 amount=-2 +kerning first=67 second=80 amount=-3 +kerning first=213 second=196 amount=-4 +kerning first=288 second=198 amount=-3 +kerning first=229 second=8220 amount=-3 +kerning first=234 second=106 amount=-2 +kerning first=262 second=87 amount=-1 +kerning first=83 second=118 amount=-3 +kerning first=317 second=68 amount=-2 +kerning first=75 second=99 amount=-2 +kerning first=88 second=8220 amount=-2 +kerning first=356 second=249 amount=-1 +kerning first=224 second=111 amount=-1 +kerning first=1057 second=1113 amount=-1 +kerning first=280 second=361 amount=-2 +kerning first=260 second=111 amount=-1 +kerning first=65 second=364 amount=-3 +kerning first=221 second=264 amount=-3 +kerning first=244 second=361 amount=-1 +kerning first=296 second=111 amount=-2 +kerning first=8217 second=116 amount=-1 +kerning first=352 second=361 amount=-1 +kerning first=68 second=89 amount=-2 +kerning first=316 second=361 amount=-2 +kerning first=78 second=267 amount=-2 +kerning first=278 second=364 amount=-2 +kerning first=1064 second=1116 amount=-1 +kerning first=291 second=267 amount=-2 +kerning first=83 second=111 amount=-1 +kerning first=255 second=316 amount=-2 +kerning first=76 second=368 amount=-3 +kerning first=327 second=267 amount=-2 +kerning first=119 second=111 amount=-3 +kerning first=291 second=316 amount=-3 +kerning first=347 second=257 amount=-1 +kerning first=219 second=267 amount=-2 +kerning first=230 second=233 amount=-1 +kerning first=1100 second=1116 amount=-1 +kerning first=255 second=267 amount=-3 +kerning first=278 second=104 amount=-1 +kerning first=334 second=66 amount=-2 +kerning first=211 second=44 amount=-3 +kerning first=242 second=104 amount=-1 +kerning first=381 second=337 amount=-1 +kerning first=317 second=89 amount=-3 +kerning first=262 second=66 amount=-3 +kerning first=283 second=44 amount=-3 +kerning first=1057 second=1057 amount=-1 +kerning first=368 second=111 amount=-2 +kerning first=119 second=353 amount=-3 +kerning first=1057 second=1114 amount=-1 +kerning first=103 second=361 amount=-1 +kerning first=286 second=205 amount=-1 +kerning first=201 second=274 amount=-2 +kerning first=1088 second=1117 amount=-1 +kerning first=67 second=361 amount=-2 +kerning first=350 second=104 amount=-2 +kerning first=106 second=44 amount=-2 +kerning first=314 second=104 amount=-1 +kerning first=70 second=44 amount=-3 +kerning first=314 second=97 amount=-2 +kerning first=226 second=326 amount=-1 +kerning first=347 second=250 amount=-1 +kerning first=370 second=347 amount=-2 +kerning first=201 second=302 amount=-2 +kerning first=89 second=278 amount=-1 +kerning first=350 second=97 amount=-2 +kerning first=262 second=326 amount=-1 +kerning first=311 second=250 amount=-1 +kerning first=376 second=226 amount=-5 +kerning first=83 second=378 amount=-2 +kerning first=346 second=346 amount=-1 +kerning first=242 second=97 amount=-1 +kerning first=298 second=347 amount=-2 +kerning first=214 second=205 amount=-2 +kerning first=278 second=97 amount=-1 +kerning first=262 second=347 amount=-2 +kerning first=1057 second=1095 amount=-2 +kerning first=226 second=347 amount=-1 +kerning first=224 second=371 amount=-1 +kerning first=266 second=278 amount=-3 +kerning first=85 second=326 amount=-2 +kerning first=73 second=233 amount=-2 +kerning first=8220 second=277 amount=-3 +kerning first=298 second=229 amount=-2 +kerning first=374 second=278 amount=-1 +kerning first=121 second=326 amount=-2 +kerning first=275 second=250 amount=-2 +kerning first=1030 second=1116 amount=-1 +kerning first=1039 second=1099 amount=-1 +kerning first=338 second=278 amount=-2 +kerning first=262 second=354 amount=-1 +kerning first=85 second=347 amount=-2 +kerning first=332 second=378 amount=-2 +kerning first=368 second=90 amount=-1 +kerning first=263 second=103 amount=-3 +kerning first=363 second=316 amount=-2 +kerning first=275 second=257 amount=-2 +kerning first=376 second=219 amount=-1 +kerning first=296 second=378 amount=-1 +kerning first=332 second=90 amount=-2 +kerning first=227 second=103 amount=-2 +kerning first=334 second=354 amount=-2 +kerning first=250 second=233 amount=-1 +kerning first=311 second=257 amount=-2 +kerning first=103 second=333 amount=-2 +kerning first=280 second=45 amount=-2 +kerning first=98 second=250 amount=-1 +kerning first=119 second=371 amount=-1 +kerning first=203 second=257 amount=-1 +kerning first=368 second=378 amount=-3 +kerning first=122 second=103 amount=-2 +kerning first=381 second=302 amount=-1 +kerning first=73 second=212 amount=-2 +kerning first=268 second=219 amount=-2 +kerning first=8222 second=253 amount=-1 +kerning first=86 second=103 amount=-4 +kerning first=98 second=257 amount=-1 +kerning first=1057 second=1092 amount=-1 +kerning first=119 second=378 amount=-3 +kerning first=316 second=45 amount=-3 +kerning first=1057 second=1085 amount=-1 +kerning first=86 second=110 amount=-3 +kerning first=232 second=226 amount=-2 +kerning first=365 second=271 amount=-1 +kerning first=196 second=219 amount=-3 +kerning first=1093 second=1092 amount=-2 +kerning first=248 second=8250 amount=-2 +kerning first=122 second=110 amount=-2 +kerning first=268 second=226 amount=-2 +kerning first=67 second=333 amount=-2 +kerning first=224 second=378 amount=-1 +kerning first=304 second=226 amount=-2 +kerning first=227 second=110 amount=-1 +kerning first=122 second=363 amount=-2 +kerning first=250 second=240 amount=-1 +kerning first=278 second=214 amount=-1 +kerning first=1031 second=1098 amount=-1 +kerning first=1072 second=1114 amount=-1 +kerning first=1064 second=1088 amount=-1 +kerning first=227 second=363 amount=-1 +kerning first=284 second=86 amount=-3 +kerning first=1050 second=1089 amount=-2 +kerning first=1100 second=1088 amount=-1 +kerning first=335 second=110 amount=-1 +kerning first=263 second=363 amount=-2 +kerning first=330 second=259 amount=-2 +kerning first=88 second=318 amount=-1 +kerning first=371 second=110 amount=-2 +kerning first=211 second=220 amount=-1 +kerning first=202 second=65 amount=-2 +kerning first=379 second=353 amount=-2 +kerning first=335 second=363 amount=-1 +kerning first=1103 second=1108 amount=-1 +kerning first=193 second=318 amount=-2 +kerning first=280 second=284 amount=-1 +kerning first=1108 second=1114 amount=-1 +kerning first=274 second=65 amount=-2 +kerning first=366 second=259 amount=-3 +kerning first=229 second=318 amount=-1 +kerning first=206 second=214 amount=-2 +kerning first=205 second=369 amount=-2 +kerning first=277 second=116 amount=-1 +kerning first=75 second=71 amount=-3 +kerning first=346 second=65 amount=-4 +kerning first=117 second=259 amount=-1 +kerning first=201 second=330 amount=-2 +kerning first=277 second=369 amount=-2 +kerning first=337 second=318 amount=-2 +kerning first=65 second=214 amount=-3 +kerning first=241 second=369 amount=-1 +kerning first=222 second=259 amount=-1 +kerning first=1057 second=1096 amount=-1 +kerning first=211 second=304 amount=-2 +kerning first=100 second=116 amount=-1 +kerning first=73 second=240 amount=-2 +kerning first=206 second=97 amount=-2 +kerning first=351 second=225 amount=-1 +kerning first=100 second=369 amount=-1 +kerning first=81 second=259 amount=-1 +kerning first=381 second=330 amount=-1 +kerning first=45 second=259 amount=-1 +kerning first=101 second=97 amount=-2 +kerning first=324 second=324 amount=-1 +kerning first=1104 second=1075 amount=-1 +kerning first=224 second=228 amount=-1 +kerning first=246 second=253 amount=-3 +kerning first=68 second=377 amount=-2 +kerning first=113 second=279 amount=-1 +kerning first=112 second=375 amount=-3 +kerning first=119 second=228 amount=-3 +kerning first=195 second=374 amount=-6 +kerning first=76 second=375 amount=-3 +kerning first=232 second=254 amount=-2 +kerning first=83 second=228 amount=-1 +kerning first=218 second=279 amount=-2 +kerning first=354 second=253 amount=-3 +kerning first=66 second=209 amount=-4 +kerning first=118 second=355 amount=-1 +kerning first=90 second=374 amount=-2 +kerning first=325 second=375 amount=-2 +kerning first=313 second=369 amount=-2 +kerning first=111 second=324 amount=-1 +kerning first=268 second=337 amount=-2 +kerning first=82 second=355 amount=-3 +kerning first=289 second=375 amount=-1 +kerning first=252 second=324 amount=-1 +kerning first=99 second=273 amount=-1 +kerning first=77 second=279 amount=-2 +kerning first=346 second=8221 amount=-2 +kerning first=217 second=375 amount=-1 +kerning first=220 second=332 amount=-1 +kerning first=223 second=355 amount=-1 +kerning first=1067 second=1108 amount=-1 +kerning first=105 second=45 amount=-3 +kerning first=1104 second=1103 amount=-2 +kerning first=187 second=355 amount=-1 +kerning first=201 second=287 amount=-3 +kerning first=317 second=377 amount=-3 +kerning first=1031 second=1108 amount=-1 +kerning first=88 second=234 amount=-2 +kerning first=262 second=298 amount=-3 +kerning first=81 second=287 amount=-1 +kerning first=256 second=332 amount=-3 +kerning first=67 second=284 amount=-3 +kerning first=45 second=287 amount=-3 +kerning first=8250 second=356 amount=-4 +kerning first=193 second=234 amount=-1 +kerning first=364 second=332 amount=-1 +kerning first=334 second=298 amount=-2 +kerning first=367 second=355 amount=-1 +kerning first=198 second=310 amount=-2 +kerning first=229 second=234 amount=-1 +kerning first=1096 second=1077 amount=-1 +kerning first=86 second=363 amount=-2 +kerning first=1071 second=1119 amount=-1 +kerning first=117 second=287 amount=-3 +kerning first=362 second=279 amount=-2 +kerning first=1051 second=1088 amount=-1 +kerning first=258 second=287 amount=-3 +kerning first=212 second=313 amount=-2 +kerning first=371 second=335 amount=-3 +kerning first=289 second=108 amount=-3 +kerning first=198 second=338 amount=-1 +kerning first=193 second=290 amount=-3 +kerning first=222 second=8217 amount=-2 +kerning first=222 second=287 amount=-1 +kerning first=258 second=8217 amount=-5 +kerning first=197 second=242 amount=-1 +kerning first=330 second=287 amount=-3 +kerning first=380 second=118 amount=-2 +kerning first=381 second=105 amount=-1 +kerning first=99 second=245 amount=-1 +kerning first=269 second=242 amount=-1 +kerning first=76 second=197 amount=-2 +kerning first=233 second=242 amount=-1 +kerning first=366 second=287 amount=-4 +kerning first=71 second=313 amount=-1 +kerning first=201 second=105 amount=-1 +kerning first=88 second=290 amount=-3 +kerning first=117 second=8217 amount=-3 +kerning first=1074 second=1083 amount=-1 +kerning first=217 second=197 amount=-4 +kerning first=216 second=380 amount=-2 +kerning first=334 second=270 amount=-2 +kerning first=1064 second=1060 amount=-1 +kerning first=105 second=225 amount=-2 +kerning first=1049 second=1094 amount=-1 +kerning first=252 second=380 amount=-2 +kerning first=1086 second=1117 amount=-1 +kerning first=377 second=242 amount=-1 +kerning first=86 second=335 amount=-3 +kerning first=76 second=108 amount=-2 +kerning first=87 second=119 amount=-3 +kerning first=1077 second=1085 amount=-1 +kerning first=330 second=231 amount=-2 +kerning first=210 second=225 amount=-1 +kerning first=122 second=335 amount=-1 +kerning first=324 second=380 amount=-1 +kerning first=84 second=90 amount=-3 +kerning first=366 second=231 amount=-2 +kerning first=246 second=225 amount=-1 +kerning first=192 second=119 amount=-3 +kerning first=1060 second=1049 amount=-1 +kerning first=368 second=228 amount=-3 +kerning first=112 second=108 amount=-2 +kerning first=228 second=119 amount=-3 +kerning first=1024 second=1049 amount=-1 +kerning first=332 second=228 amount=-1 +kerning first=1061 second=1118 amount=-2 +kerning first=253 second=108 amount=-2 +kerning first=264 second=119 amount=-1 +kerning first=262 second=270 amount=-3 +kerning first=296 second=228 amount=-2 +kerning first=89 second=74 amount=-4 +kerning first=69 second=225 amount=-1 +kerning first=235 second=122 amount=-2 +kerning first=374 second=46 amount=-5 +kerning first=199 second=122 amount=-2 +kerning first=296 second=83 amount=-2 +kerning first=67 second=256 amount=-3 +kerning first=117 second=231 amount=-1 +kerning first=85 second=328 amount=-2 +kerning first=187 second=102 amount=-1 +kerning first=216 second=352 amount=-1 +kerning first=376 second=201 amount=-1 +kerning first=266 second=74 amount=-2 +kerning first=223 second=102 amount=-1 +kerning first=8250 second=328 amount=-2 +kerning first=379 second=122 amount=-3 +kerning first=302 second=74 amount=-1 +kerning first=280 second=256 amount=-2 +kerning first=288 second=352 amount=-2 +kerning first=1031 second=1080 amount=-1 +kerning first=282 second=225 amount=-1 +kerning first=338 second=74 amount=-1 +kerning first=87 second=211 amount=-3 +kerning first=208 second=352 amount=-1 +kerning first=374 second=74 amount=-4 +kerning first=208 second=256 amount=-4 +kerning first=113 second=307 amount=-1 +kerning first=354 second=225 amount=-5 +kerning first=1092 second=1097 amount=-1 +kerning first=338 second=46 amount=-1 +kerning first=1067 second=1080 amount=-1 +kerning first=83 second=200 amount=-3 +kerning first=89 second=46 amount=-5 +kerning first=264 second=211 amount=-3 +kerning first=204 second=245 amount=-2 +kerning first=352 second=256 amount=-4 +kerning first=192 second=211 amount=-3 +kerning first=259 second=102 amount=-1 +kerning first=295 second=102 amount=-1 +kerning first=331 second=102 amount=-1 +kerning first=367 second=102 amount=-1 +kerning first=115 second=171 amount=-1 +kerning first=212 second=112 amount=-1 +kerning first=8250 second=68 amount=-5 +kerning first=362 second=216 amount=-1 +kerning first=256 second=107 amount=-2 +kerning first=220 second=171 amount=-5 +kerning first=77 second=44 amount=-1 +kerning first=107 second=112 amount=-1 +kerning first=379 second=211 amount=-1 +kerning first=256 second=171 amount=-4 +kerning first=71 second=112 amount=-1 +kerning first=1043 second=1086 amount=-3 +kerning first=208 second=8221 amount=-2 +kerning first=115 second=107 amount=-1 +kerning first=244 second=8221 amount=-2 +kerning first=218 second=216 amount=-1 +kerning first=232 second=237 amount=-2 +kerning first=280 second=205 amount=-2 +kerning first=351 second=261 amount=-1 +kerning first=328 second=251 amount=-1 +kerning first=338 second=105 amount=-1 +kerning first=79 second=171 amount=-1 +kerning first=81 second=323 amount=-2 +kerning first=374 second=105 amount=-2 +kerning first=352 second=8221 amount=-2 +kerning first=1063 second=1072 amount=-1 +kerning first=364 second=100 amount=-2 +kerning first=266 second=105 amount=-1 +kerning first=8218 second=217 amount=-3 +kerning first=289 second=235 amount=-2 +kerning first=1027 second=1072 amount=-3 +kerning first=302 second=105 amount=-1 +kerning first=325 second=235 amount=-2 +kerning first=187 second=296 amount=-5 +kerning first=272 second=209 amount=-2 +kerning first=194 second=105 amount=-1 +kerning first=303 second=110 amount=-2 +kerning first=316 second=8221 amount=-3 +kerning first=1099 second=1072 amount=-1 +kerning first=230 second=105 amount=-2 +kerning first=119 second=119 amount=-1 +kerning first=220 second=100 amount=-2 +kerning first=1079 second=1117 amount=-1 +kerning first=356 second=112 amount=-2 +kerning first=89 second=105 amount=-2 +kerning first=195 second=86 amount=-6 +kerning first=1027 second=1113 amount=-3 +kerning first=328 second=171 amount=-3 +kerning first=256 second=100 amount=-1 +kerning first=1043 second=1117 amount=-2 +kerning first=1071 second=1098 amount=-1 +kerning first=120 second=251 amount=-3 +kerning first=364 second=171 amount=-5 +kerning first=211 second=85 amount=-1 +kerning first=284 second=112 amount=-1 +kerning first=356 second=81 amount=-3 +kerning first=90 second=86 amount=-2 +kerning first=84 second=251 amount=-2 +kerning first=187 second=327 amount=-5 +kerning first=83 second=305 amount=-3 +kerning first=364 second=279 amount=-2 +kerning first=248 second=112 amount=-1 +kerning first=82 second=67 amount=-3 +kerning first=225 second=251 amount=-1 +kerning first=66 second=230 amount=-3 +kerning first=1027 second=1079 amount=-1 +kerning first=232 second=275 amount=-1 +kerning first=90 second=353 amount=-2 +kerning first=282 second=210 amount=-1 +kerning first=1063 second=1079 amount=-1 +kerning first=369 second=223 amount=-1 +kerning first=268 second=275 amount=-2 +kerning first=274 second=346 amount=-2 +kerning first=84 second=233 amount=-3 +kerning first=197 second=318 amount=-2 +kerning first=287 second=249 amount=-1 +kerning first=323 second=249 amount=-1 +kerning first=71 second=379 amount=-2 +kerning first=196 second=275 amount=-1 +kerning first=231 second=353 amount=-2 +kerning first=200 second=206 amount=-2 +kerning first=369 second=251 amount=-1 +kerning first=212 second=379 amount=-2 +kerning first=1053 second=1105 amount=-1 +kerning first=333 second=251 amount=-1 +kerning first=74 second=256 amount=-5 +kerning first=272 second=206 amount=-2 +kerning first=381 second=365 amount=-3 +kerning first=82 second=334 amount=-3 +kerning first=333 second=223 amount=-1 +kerning first=84 second=223 amount=-3 +kerning first=364 second=339 amount=-2 +kerning first=1113 second=1114 amount=-1 +kerning first=351 second=230 amount=-1 +kerning first=90 second=83 amount=-1 +kerning first=243 second=230 amount=-1 +kerning first=243 second=249 amount=-1 +kerning first=356 second=313 amount=-1 +kerning first=279 second=230 amount=-2 +kerning first=251 second=249 amount=-1 +kerning first=73 second=268 amount=-2 +kerning first=195 second=83 amount=-3 +kerning first=199 second=211 amount=-3 +kerning first=110 second=249 amount=-1 +kerning first=304 second=275 amount=-2 +kerning first=284 second=313 amount=-1 +kerning first=207 second=230 amount=-2 +kerning first=77 second=244 amount=-2 +kerning first=279 second=289 amount=-3 +kerning first=269 second=103 amount=-3 +kerning first=113 second=244 amount=-1 +kerning first=69 second=194 amount=-2 +kerning first=315 second=289 amount=-3 +kerning first=8250 second=65 amount=-4 +kerning first=380 second=237 amount=-1 +kerning first=220 second=192 amount=-4 +kerning first=351 second=289 amount=-3 +kerning first=248 second=109 amount=-1 +kerning first=218 second=244 amount=-2 +kerning first=71 second=344 amount=-1 +kerning first=323 second=284 amount=-2 +kerning first=1042 second=1091 amount=-1 +kerning first=220 second=339 amount=-2 +kerning first=272 second=237 amount=-1 +kerning first=1078 second=1091 amount=-2 +kerning first=79 second=192 amount=-4 +kerning first=235 second=98 amount=-2 +kerning first=256 second=339 amount=-1 +kerning first=1024 second=1084 amount=-1 +kerning first=236 second=237 amount=-1 +kerning first=1031 second=1116 amount=-1 +kerning first=1114 second=1091 amount=-2 +kerning first=200 second=237 amount=-1 +kerning first=362 second=244 amount=-2 +kerning first=220 second=199 amount=-1 +kerning first=253 second=45 amount=-4 +kerning first=107 second=116 amount=-1 +kerning first=354 second=194 amount=-6 +kerning first=253 second=232 amount=-3 +kerning first=217 second=232 amount=-2 +kerning first=325 second=232 amount=-2 +kerning first=374 second=77 amount=-1 +kerning first=66 second=289 amount=-4 +kerning first=287 second=277 amount=-2 +kerning first=202 second=346 amount=-2 +kerning first=210 second=194 amount=-4 +kerning first=102 second=289 amount=-2 +kerning first=251 second=277 amount=-1 +kerning first=84 second=282 amount=-1 +kerning first=207 second=289 amount=-3 +kerning first=323 second=277 amount=-2 +kerning first=8218 second=221 amount=-6 +kerning first=243 second=289 amount=-2 +kerning first=217 second=111 amount=-2 +kerning first=248 second=351 amount=-2 +kerning first=90 second=350 amount=-1 +kerning first=261 second=254 amount=-1 +kerning first=74 second=277 amount=-2 +kerning first=315 second=202 amount=-2 +kerning first=303 second=121 amount=-2 +kerning first=333 second=254 amount=-1 +kerning first=267 second=121 amount=-2 +kerning first=214 second=379 amount=-2 +kerning first=369 second=254 amount=-2 +kerning first=231 second=121 amount=-2 +kerning first=234 second=8221 amount=-2 +kerning first=1053 second=1102 amount=-1 +kerning first=377 second=69 amount=-1 +kerning first=200 second=209 amount=-2 +kerning first=195 second=121 amount=-3 +kerning first=328 second=367 amount=-1 +kerning first=1089 second=1102 amount=-1 +kerning first=1071 second=1095 amount=-1 +kerning first=120 second=254 amount=-3 +kerning first=364 second=367 amount=-1 +kerning first=195 second=350 amount=-3 +kerning first=110 second=305 amount=-1 +kerning first=90 second=121 amount=-3 +kerning first=256 second=367 amount=-3 +kerning first=1053 second=1074 amount=-1 +kerning first=107 second=351 amount=-2 +kerning first=225 second=254 amount=-1 +kerning first=74 second=305 amount=-2 +kerning first=1089 second=1074 amount=-1 +kerning first=284 second=344 amount=-1 +kerning first=375 second=114 amount=-1 +kerning first=256 second=79 amount=-3 +kerning first=104 second=117 amount=-1 +kerning first=74 second=284 amount=-2 +kerning first=207 second=261 amount=-2 +kerning first=220 second=367 amount=-1 +kerning first=1025 second=1096 amount=-1 +kerning first=245 second=117 amount=-1 +kerning first=77 second=216 amount=-2 +kerning first=287 second=305 amount=-1 +kerning first=346 second=374 amount=-3 +kerning first=303 second=114 amount=-1 +kerning first=244 second=252 amount=-1 +kerning first=1114 second=1119 amount=-1 +kerning first=351 second=117 amount=-1 +kerning first=251 second=305 amount=-1 +kerning first=85 second=260 amount=-4 +kerning first=364 second=199 amount=-1 +kerning first=339 second=114 amount=-1 +kerning first=115 second=367 amount=-1 +kerning first=220 second=79 amount=-1 +kerning first=118 second=353 amount=-3 +kerning first=317 second=117 amount=-2 +kerning first=274 second=374 amount=-1 +kerning first=231 second=114 amount=-1 +kerning first=356 second=351 amount=-3 +kerning first=281 second=117 amount=-2 +kerning first=79 second=72 amount=-2 +kerning first=323 second=305 amount=-1 +kerning first=267 second=114 amount=-1 +kerning first=364 second=192 amount=-4 +kerning first=202 second=374 amount=-1 +kerning first=66 second=261 amount=-3 +kerning first=353 second=117 amount=-1 +kerning first=1043 second=1089 amount=-3 +kerning first=1027 second=1051 amount=-5 +kerning first=262 second=260 amount=-3 +kerning first=102 second=261 amount=-2 +kerning first=364 second=79 amount=-1 +kerning first=381 second=361 amount=-3 +kerning first=121 second=291 amount=-3 +kerning first=370 second=260 amount=-4 +kerning first=337 second=311 amount=-1 +kerning first=248 second=316 amount=-2 +kerning first=315 second=286 amount=-1 +kerning first=85 second=291 amount=-4 +kerning first=334 second=260 amount=-4 +kerning first=207 second=352 amount=-2 +kerning first=284 second=316 amount=-1 +kerning first=367 second=331 amount=-1 +kerning first=8218 second=364 amount=-3 +kerning first=207 second=286 amount=-2 +kerning first=113 second=241 amount=-2 +kerning first=229 second=311 amount=-1 +kerning first=198 second=317 amount=-2 +kerning first=82 second=362 amount=-3 +kerning first=121 second=267 amount=-3 +kerning first=295 second=331 amount=-1 +kerning first=317 second=356 amount=-3 +kerning first=193 second=311 amount=-2 +kerning first=331 second=331 amount=-1 +kerning first=307 second=382 amount=-1 +kerning first=187 second=362 amount=-4 +kerning first=223 second=331 amount=-1 +kerning first=88 second=311 amount=-1 +kerning first=250 second=271 amount=-1 +kerning first=1064 second=1057 amount=-1 +kerning first=85 second=267 amount=-2 +kerning first=259 second=331 amount=-1 +kerning first=66 second=286 amount=-3 +kerning first=84 second=226 amount=-5 +kerning first=379 second=382 amount=-3 +kerning first=118 second=331 amount=-2 +kerning first=187 second=331 amount=-2 +kerning first=278 second=221 amount=-1 +kerning first=1086 second=1082 amount=-1 +kerning first=110 second=252 amount=-1 +kerning first=65 second=221 amount=-6 +kerning first=1024 second=1056 amount=-1 +kerning first=201 second=361 amount=-2 +kerning first=71 second=316 amount=-1 +kerning first=1060 second=1056 amount=-1 +kerning first=328 second=380 amount=-1 +kerning first=204 second=266 amount=-2 +kerning first=1024 second=1087 amount=-1 +kerning first=1053 second=1092 amount=-1 +kerning first=66 second=202 amount=-4 +kerning first=79 second=103 amount=-1 +kerning first=1049 second=1101 amount=-1 +kerning first=229 second=227 amount=-1 +kerning first=101 second=104 amount=-2 +kerning first=303 second=113 amount=-3 +kerning first=251 second=252 amount=-1 +kerning first=65 second=104 amount=-2 +kerning first=90 second=381 amount=-1 +kerning first=287 second=252 amount=-1 +kerning first=203 second=201 amount=-2 +kerning first=76 second=207 amount=-2 +kerning first=323 second=252 amount=-1 +kerning first=355 second=8249 amount=-1 +kerning first=337 second=227 amount=-1 +kerning first=1108 second=1107 amount=-1 +kerning first=120 second=226 amount=-2 +kerning first=74 second=45 amount=-4 +kerning first=71 second=84 amount=-3 +kerning first=1072 second=1107 amount=-1 +kerning first=264 second=246 amount=-2 +kerning first=364 second=103 amount=-4 +kerning first=74 second=336 amount=-2 +kerning first=228 second=246 amount=-1 +kerning first=68 second=356 amount=-2 +kerning first=328 second=103 amount=-2 +kerning first=370 second=291 amount=-4 +kerning first=87 second=346 amount=-3 +kerning first=199 second=382 amount=-2 +kerning first=1036 second=1104 amount=-2 +kerning first=192 second=246 amount=-1 +kerning first=261 second=226 amount=-1 +kerning first=334 second=291 amount=-1 +kerning first=235 second=382 amount=-2 +kerning first=110 second=45 amount=-3 +kerning first=284 second=84 amount=-3 +kerning first=356 second=109 amount=-3 +kerning first=256 second=103 amount=-3 +kerning first=298 second=291 amount=-3 +kerning first=251 second=45 amount=-2 +kerning first=87 second=246 amount=-3 +kerning first=333 second=226 amount=-1 +kerning first=220 second=103 amount=-4 +kerning first=262 second=291 amount=-3 +kerning first=88 second=227 amount=-1 +kerning first=212 second=84 amount=-2 +kerning first=369 second=226 amount=-1 +kerning first=226 second=291 amount=-2 +kerning first=334 second=259 amount=-1 +kerning first=323 second=45 amount=-4 +kerning first=87 second=78 amount=-1 +kerning first=115 second=103 amount=-3 +kerning first=323 second=336 amount=-2 +kerning first=287 second=45 amount=-3 +kerning first=370 second=263 amount=-2 +kerning first=192 second=218 amount=-3 +kerning first=250 second=243 amount=-1 +kerning first=362 second=213 amount=-1 +kerning first=121 second=100 amount=-3 +kerning first=89 second=313 amount=-1 +kerning first=1074 second=1090 amount=-1 +kerning first=226 second=263 amount=-1 +kerning first=336 second=218 amount=-1 +kerning first=198 second=314 amount=-1 +kerning first=112 second=115 amount=-2 +kerning first=262 second=263 amount=-2 +kerning first=350 second=193 amount=-4 +kerning first=73 second=243 amount=-2 +kerning first=298 second=263 amount=-2 +kerning first=77 second=269 amount=-2 +kerning first=264 second=218 amount=-2 +kerning first=356 second=288 amount=-3 +kerning first=229 second=8217 amount=-3 +kerning first=79 second=370 amount=-1 +kerning first=278 second=193 amount=-2 +kerning first=234 second=314 amount=-3 +kerning first=76 second=115 amount=-1 +kerning first=331 second=303 amount=-1 +kerning first=289 second=115 amount=-3 +kerning first=85 second=263 amount=-2 +kerning first=113 second=269 amount=-1 +kerning first=8218 second=97 amount=-2 +kerning first=1059 second=1100 amount=-4 +kerning first=208 second=8249 amount=-1 +kerning first=325 second=115 amount=-2 +kerning first=245 second=120 amount=-3 +kerning first=234 second=345 amount=-1 +kerning first=121 second=263 amount=-3 +kerning first=67 second=8249 amount=-4 +kerning first=259 second=303 amount=-1 +kerning first=217 second=115 amount=-2 +kerning first=281 second=120 amount=-2 +kerning first=201 second=365 amount=-2 +kerning first=218 second=269 amount=-2 +kerning first=103 second=8249 amount=-3 +kerning first=378 second=314 amount=-2 +kerning first=295 second=303 amount=-1 +kerning first=253 second=115 amount=-3 +kerning first=317 second=120 amount=-1 +kerning first=198 second=78 amount=-2 +kerning first=267 second=353 amount=-2 +kerning first=77 second=213 amount=-2 +kerning first=88 second=224 amount=-1 +kerning first=79 second=75 amount=-2 +kerning first=303 second=353 amount=-2 +kerning first=68 second=120 amount=-1 +kerning first=218 second=213 amount=-1 +kerning first=229 second=224 amount=-1 +kerning first=201 second=70 amount=-2 +kerning first=339 second=353 amount=-2 +kerning first=104 second=120 amount=-1 +kerning first=362 second=269 amount=-2 +kerning first=375 second=353 amount=-3 +kerning first=201 second=98 amount=-1 +kerning first=339 second=118 amount=-2 +kerning first=374 second=197 amount=-6 +kerning first=303 second=118 amount=-3 +kerning first=337 second=224 amount=-1 +kerning first=375 second=118 amount=-1 +kerning first=195 second=118 amount=-3 +kerning first=245 second=328 amount=-1 +kerning first=316 second=8249 amount=-3 +kerning first=187 second=303 amount=-1 +kerning first=65 second=101 amount=-1 +kerning first=364 second=196 amount=-4 +kerning first=74 second=259 amount=-3 +kerning first=352 second=8249 amount=-3 +kerning first=223 second=303 amount=-1 +kerning first=101 second=101 amount=-1 +kerning first=267 second=118 amount=-2 +kerning first=217 second=235 amount=-2 +kerning first=112 second=307 amount=-1 +kerning first=231 second=118 amount=-2 +kerning first=104 second=328 amount=-1 +kerning first=280 second=8249 amount=-2 +kerning first=118 second=303 amount=-2 +kerning first=206 second=101 amount=-2 +kerning first=253 second=235 amount=-3 +kerning first=362 second=241 amount=-2 +kerning first=220 second=196 amount=-4 +kerning first=353 second=328 amount=-2 +kerning first=326 second=241 amount=-1 +kerning first=266 second=243 amount=-2 +kerning first=193 second=283 amount=-1 +kerning first=90 second=118 amount=-2 +kerning first=317 second=328 amount=-1 +kerning first=1049 second=1073 amount=-1 +kerning first=256 second=370 amount=-3 +kerning first=281 second=328 amount=-2 +kerning first=350 second=101 amount=-1 +kerning first=88 second=283 amount=-2 +kerning first=1025 second=1093 amount=-2 +kerning first=218 second=241 amount=-2 +kerning first=253 second=46 amount=-5 +kerning first=254 second=241 amount=-1 +kerning first=79 second=196 amount=-4 +kerning first=380 second=283 amount=-1 +kerning first=367 second=380 amount=-2 +kerning first=1038 second=1087 amount=-4 +kerning first=344 second=283 amount=-3 +kerning first=117 second=8220 amount=-3 +kerning first=119 second=108 amount=-2 +kerning first=234 second=335 amount=-1 +kerning first=81 second=8220 amount=-2 +kerning first=1042 second=1045 amount=-2 +kerning first=260 second=108 amount=-2 +kerning first=76 second=118 amount=-3 +kerning first=231 second=8221 amount=-2 +kerning first=86 second=345 amount=-1 +kerning first=224 second=108 amount=-1 +kerning first=90 second=244 amount=-1 +kerning first=355 second=121 amount=-1 +kerning first=1031 second=1090 amount=-1 +kerning first=213 second=193 amount=-4 +kerning first=259 second=380 amount=-1 +kerning first=88 second=347 amount=-1 +kerning first=1074 second=1087 amount=-1 +kerning first=295 second=380 amount=-1 +kerning first=240 second=241 amount=-1 +kerning first=263 second=345 amount=-1 +kerning first=331 second=380 amount=-1 +kerning first=1067 second=1090 amount=-1 +kerning first=86 second=338 amount=-3 +kerning first=119 second=115 amount=-3 +kerning first=321 second=193 amount=-2 +kerning first=1042 second=1038 amount=-3 +kerning first=217 second=361 amount=-1 +kerning first=335 second=345 amount=-1 +kerning first=83 second=368 amount=-3 +kerning first=377 second=99 amount=-1 +kerning first=99 second=241 amount=-2 +kerning first=371 second=345 amount=-1 +kerning first=193 second=231 amount=-1 +kerning first=353 second=331 amount=-2 +kerning first=193 second=286 amount=-3 +kerning first=83 second=115 amount=-1 +kerning first=338 second=44 amount=-1 +kerning first=229 second=231 amount=-1 +kerning first=83 second=203 amount=-3 +kerning first=296 second=115 amount=-2 +kerning first=281 second=331 amount=-2 +kerning first=88 second=286 amount=-3 +kerning first=325 second=119 amount=-2 +kerning first=204 second=248 amount=-2 +kerning first=260 second=368 amount=-3 +kerning first=317 second=331 amount=-1 +kerning first=224 second=115 amount=-1 +kerning first=83 second=108 amount=-2 +kerning first=304 second=290 amount=-2 +kerning first=260 second=115 amount=-2 +kerning first=99 second=248 amount=-1 +kerning first=245 second=331 amount=-1 +kerning first=90 second=78 amount=-1 +kerning first=258 second=255 amount=-3 +kerning first=104 second=331 amount=-1 +kerning first=327 second=269 amount=-2 +kerning first=262 second=323 amount=-3 +kerning first=106 second=307 amount=-1 +kerning first=117 second=255 amount=-3 +kerning first=332 second=368 amount=-1 +kerning first=67 second=338 amount=-3 +kerning first=193 second=252 amount=-3 +kerning first=317 second=352 amount=-1 +kerning first=334 second=323 amount=-2 +kerning first=242 second=122 amount=-2 +kerning first=88 second=231 amount=-2 +kerning first=1060 second=1052 amount=-1 +kerning first=67 second=77 amount=-3 +kerning first=45 second=255 amount=-3 +kerning first=1024 second=1052 amount=-1 +kerning first=283 second=307 amount=-2 +kerning first=201 second=278 amount=-2 +kerning first=101 second=122 amount=-2 +kerning first=1086 second=1085 amount=-1 +kerning first=252 second=328 amount=-1 +kerning first=106 second=245 amount=-1 +kerning first=344 second=290 amount=-3 +kerning first=1038 second=1080 amount=-4 +kerning first=80 second=233 amount=-1 +kerning first=70 second=245 amount=-1 +kerning first=381 second=278 amount=-1 +kerning first=221 second=233 amount=-3 +kerning first=1049 second=1097 amount=-1 +kerning first=111 second=328 amount=-1 +kerning first=1074 second=1080 amount=-1 +kerning first=1054 second=1118 amount=-1 +kerning first=236 second=283 amount=-1 +kerning first=283 second=245 amount=-1 +kerning first=200 second=290 amount=-1 +kerning first=197 second=303 amount=-1 +kerning first=229 second=252 amount=-1 +kerning first=257 second=233 amount=-1 +kerning first=90 second=207 amount=-1 +kerning first=313 second=366 amount=-3 +kerning first=378 second=335 amount=-1 +kerning first=68 second=352 amount=-1 +kerning first=250 second=367 amount=-1 +kerning first=324 second=328 amount=-1 +kerning first=365 second=233 amount=-1 +kerning first=209 second=352 amount=-2 +kerning first=337 second=252 amount=-1 +kerning first=323 second=333 amount=-2 +kerning first=1052 second=1087 amount=-1 +kerning first=313 second=106 amount=-2 +kerning first=1050 second=1092 amount=-2 +kerning first=350 second=217 amount=-3 +kerning first=287 second=333 amount=-2 +kerning first=85 second=288 amount=-1 +kerning first=288 second=8221 amount=-1 +kerning first=241 second=106 amount=-2 +kerning first=344 second=218 amount=-3 +kerning first=198 second=110 amount=-1 +kerning first=277 second=106 amount=-2 +kerning first=234 second=110 amount=-2 +kerning first=339 second=378 amount=-2 +kerning first=352 second=281 amount=-1 +kerning first=100 second=113 amount=-1 +kerning first=68 second=65 amount=-4 +kerning first=303 second=378 amount=-1 +kerning first=8218 second=367 amount=-1 +kerning first=243 second=109 amount=-1 +kerning first=251 second=333 amount=-1 +kerning first=375 second=378 amount=-3 +kerning first=1043 second=1080 amount=-2 +kerning first=268 second=262 amount=-3 +kerning first=367 second=99 amount=-1 +kerning first=378 second=110 amount=-2 +kerning first=264 second=243 amount=-2 +kerning first=355 second=307 amount=-1 +kerning first=114 second=347 amount=-1 +kerning first=65 second=217 amount=-3 +kerning first=78 second=347 amount=-2 +kerning first=296 second=210 amount=-2 +kerning first=187 second=377 amount=-4 +kerning first=258 second=262 amount=-3 +kerning first=317 second=65 amount=-2 +kerning first=316 second=281 amount=-1 +kerning first=260 second=210 amount=-3 +kerning first=1118 second=1078 amount=-1 +kerning first=203 second=198 amount=-2 +kerning first=298 second=288 amount=-2 +kerning first=233 second=326 amount=-2 +kerning first=87 second=243 amount=-3 +kerning first=330 second=262 amount=-2 +kerning first=375 second=371 amount=-1 +kerning first=262 second=288 amount=-3 +kerning first=366 second=255 amount=-1 +kerning first=67 second=281 amount=-2 +kerning first=366 second=262 amount=-1 +kerning first=370 second=288 amount=-1 +kerning first=330 second=255 amount=-2 +kerning first=103 second=281 amount=-2 +kerning first=192 second=243 amount=-1 +kerning first=278 second=217 amount=-2 +kerning first=262 second=314 amount=-1 +kerning first=228 second=243 amount=-1 +kerning first=223 second=120 amount=-3 +kerning first=87 second=74 amount=-4 +kerning first=208 second=274 amount=-2 +kerning first=259 second=120 amount=-1 +kerning first=69 second=229 amount=-1 +kerning first=1060 second=1031 amount=-1 +kerning first=362 second=291 amount=-4 +kerning first=118 second=99 amount=-3 +kerning first=78 second=44 amount=-1 +kerning first=295 second=120 amount=-1 +kerning first=1024 second=1031 amount=-1 +kerning first=288 second=68 amount=-1 +kerning first=82 second=99 amount=-3 +kerning first=210 second=229 amount=-1 +kerning first=352 second=274 amount=-3 +kerning first=246 second=229 amount=-1 +kerning first=332 second=203 amount=-2 +kerning first=220 second=365 amount=-1 +kerning first=118 second=120 amount=-1 +kerning first=105 second=229 amount=-2 +kerning first=350 second=78 amount=-3 +kerning first=259 second=99 amount=-1 +kerning first=280 second=274 amount=-2 +kerning first=187 second=120 amount=-3 +kerning first=381 second=73 amount=-1 +kerning first=87 second=240 amount=-3 +kerning first=298 second=267 amount=-2 +kerning first=354 second=229 amount=-5 +kerning first=216 second=377 amount=-2 +kerning first=67 second=108 amount=-1 +kerning first=325 second=118 amount=-2 +kerning first=289 second=118 amount=-1 +kerning first=226 second=267 amount=-1 +kerning first=282 second=229 amount=-1 +kerning first=1067 second=1077 amount=-1 +kerning first=205 second=113 amount=-2 +kerning first=262 second=267 amount=-2 +kerning first=1103 second=1077 amount=-1 +kerning first=381 second=80 amount=-1 +kerning first=198 second=75 amount=-2 +kerning first=367 second=120 amount=-2 +kerning first=201 second=80 amount=-2 +kerning first=381 second=224 amount=-1 +kerning first=112 second=8220 amount=-2 +kerning first=278 second=196 amount=-2 +kerning first=1031 second=1077 amount=-1 +kerning first=112 second=118 amount=-2 +kerning first=370 second=267 amount=-2 +kerning first=288 second=377 amount=-2 +kerning first=253 second=118 amount=-1 +kerning first=222 second=8220 amount=-2 +kerning first=350 second=196 amount=-4 +kerning first=217 second=118 amount=-2 +kerning first=90 second=111 amount=-1 +kerning first=72 second=199 amount=-2 +kerning first=283 second=244 amount=-1 +kerning first=88 second=287 amount=-2 +kerning first=229 second=287 amount=-2 +kerning first=195 second=111 amount=-1 +kerning first=286 second=209 amount=-1 +kerning first=193 second=287 amount=-3 +kerning first=84 second=219 amount=-1 +kerning first=1086 second=1098 amount=-1 +kerning first=231 second=111 amount=-1 +kerning first=1064 second=1119 amount=-1 +kerning first=86 second=339 amount=-3 +kerning first=110 second=8217 amount=-4 +kerning first=99 second=242 amount=-1 +kerning first=122 second=339 amount=-1 +kerning first=344 second=234 amount=-3 +kerning first=8217 second=113 amount=-3 +kerning first=204 second=242 amount=-2 +kerning first=321 second=199 amount=-1 +kerning first=337 second=287 amount=-2 +kerning first=380 second=234 amount=-1 +kerning first=73 second=264 amount=-2 +kerning first=83 second=374 amount=-3 +kerning first=311 second=254 amount=-1 +kerning first=367 second=303 amount=-2 +kerning first=83 second=197 amount=-4 +kerning first=347 second=254 amount=-2 +kerning first=200 second=289 amount=-3 +kerning first=83 second=121 amount=-2 +kerning first=213 second=364 amount=-1 +kerning first=236 second=289 amount=-3 +kerning first=1114 second=1094 amount=-1 +kerning first=272 second=289 amount=-1 +kerning first=70 second=244 amount=-1 +kerning first=79 second=82 amount=-2 +kerning first=8220 second=281 amount=-3 +kerning first=267 second=111 amount=-1 +kerning first=106 second=244 amount=-1 +kerning first=303 second=111 amount=-3 +kerning first=203 second=254 amount=-1 +kerning first=344 second=289 amount=-3 +kerning first=254 second=46 amount=-3 +kerning first=339 second=111 amount=-1 +kerning first=380 second=289 amount=-2 +kerning first=8250 second=346 amount=-3 +kerning first=332 second=197 amount=-4 +kerning first=321 second=364 amount=-3 +kerning first=375 second=111 amount=-3 +kerning first=275 second=254 amount=-2 +kerning first=368 second=197 amount=-4 +kerning first=213 second=97 amount=-1 +kerning first=315 second=205 amount=-2 +kerning first=337 second=230 amount=-1 +kerning first=324 second=117 amount=-1 +kerning first=86 second=72 amount=-1 +kerning first=249 second=97 amount=-1 +kerning first=280 second=76 amount=-2 +kerning first=235 second=119 amount=-2 +kerning first=380 second=228 amount=-1 +kerning first=261 second=307 amount=-1 +kerning first=108 second=97 amount=-2 +kerning first=213 second=103 amount=-1 +kerning first=274 second=380 amount=-2 +kerning first=368 second=121 amount=-1 +kerning first=377 second=66 amount=-1 +kerning first=208 second=76 amount=-2 +kerning first=307 second=119 amount=-3 +kerning first=362 second=275 amount=-2 +kerning first=201 second=74 amount=-1 +kerning first=192 second=366 amount=-3 +kerning first=304 second=250 amount=-2 +kerning first=296 second=121 amount=-2 +kerning first=1104 second=1099 amount=-1 +kerning first=229 second=230 amount=-1 +kerning first=379 second=119 amount=-2 +kerning first=260 second=121 amount=-3 +kerning first=88 second=230 amount=-1 +kerning first=67 second=76 amount=-3 +kerning first=1069 second=1036 amount=-1 +kerning first=376 second=250 amount=-2 +kerning first=196 second=250 amount=-3 +kerning first=206 second=242 amount=-2 +kerning first=317 second=86 amount=-3 +kerning first=242 second=107 amount=-1 +kerning first=74 second=333 amount=-2 +kerning first=268 second=250 amount=-2 +kerning first=350 second=107 amount=-2 +kerning first=66 second=205 amount=-4 +kerning first=75 second=117 amount=-3 +kerning first=232 second=250 amount=-2 +kerning first=231 second=378 amount=-2 +kerning first=314 second=107 amount=-1 +kerning first=365 second=240 amount=-1 +kerning first=101 second=107 amount=-2 +kerning first=65 second=107 amount=-2 +kerning first=111 second=117 amount=-1 +kerning first=90 second=378 amount=-3 +kerning first=252 second=117 amount=-1 +kerning first=352 second=76 amount=-3 +kerning first=256 second=363 amount=-3 +kerning first=313 second=310 amount=-2 +kerning first=117 second=318 amount=-2 +kerning first=379 second=214 amount=-1 +kerning first=328 second=363 amount=-1 +kerning first=352 second=330 amount=-3 +kerning first=336 second=171 amount=-1 +kerning first=374 second=355 amount=-1 +kerning first=268 second=194 amount=-3 +kerning first=364 second=363 amount=-1 +kerning first=323 second=227 amount=-2 +kerning first=258 second=318 amount=-2 +kerning first=1043 second=1114 amount=-2 +kerning first=257 second=240 amount=-1 +kerning first=120 second=333 amount=-2 +kerning first=73 second=259 amount=-2 +kerning first=290 second=74 amount=-1 +kerning first=1057 second=1088 amount=-1 +kerning first=1093 second=1089 amount=-2 +kerning first=381 second=8250 amount=-1 +kerning first=246 second=257 amount=-1 +kerning first=1057 second=1089 amount=-1 +kerning first=221 second=240 amount=-3 +kerning first=8216 second=241 amount=-1 +kerning first=287 second=259 amount=-3 +kerning first=209 second=71 amount=-2 +kerning first=378 second=116 amount=-1 +kerning first=350 second=122 amount=-2 +kerning first=208 second=77 amount=-2 +kerning first=296 second=375 amount=-2 +kerning first=317 second=71 amount=-1 +kerning first=88 second=346 amount=-2 +kerning first=199 second=214 amount=-3 +kerning first=260 second=375 amount=-3 +kerning first=187 second=249 amount=-1 +kerning first=107 second=369 amount=-1 +kerning first=67 second=330 amount=-3 +kerning first=278 second=122 amount=-2 +kerning first=224 second=375 amount=-3 +kerning first=1070 second=1041 amount=-1 +kerning first=71 second=369 amount=-1 +kerning first=323 second=259 amount=-2 +kerning first=89 second=296 amount=-1 +kerning first=280 second=330 amount=-2 +kerning first=110 second=259 amount=-1 +kerning first=234 second=116 amount=-1 +kerning first=72 second=97 amount=-2 +kerning first=352 second=77 amount=-3 +kerning first=187 second=106 amount=-2 +kerning first=246 second=114 amount=-1 +kerning first=264 second=220 amount=-2 +kerning first=209 second=246 amount=-2 +kerning first=376 second=194 amount=-6 +kerning first=208 second=330 amount=-2 +kerning first=1039 second=1075 amount=-1 +kerning first=290 second=220 amount=-1 +kerning first=1050 second=1086 amount=-2 +kerning first=280 second=77 amount=-2 +kerning first=368 second=375 amount=-1 +kerning first=1025 second=1100 amount=-1 +kerning first=334 second=344 amount=-2 +kerning first=266 second=296 amount=-3 +kerning first=325 second=228 amount=-2 +kerning first=187 second=324 amount=-2 +kerning first=356 second=369 amount=-2 +kerning first=289 second=228 amount=-3 +kerning first=118 second=324 amount=-2 +kerning first=332 second=374 amount=-2 +kerning first=377 second=315 amount=-1 +kerning first=338 second=296 amount=-2 +kerning first=253 second=228 amount=-3 +kerning first=259 second=324 amount=-1 +kerning first=84 second=279 amount=-3 +kerning first=217 second=228 amount=-3 +kerning first=223 second=324 amount=-1 +kerning first=98 second=254 amount=-1 +kerning first=260 second=374 amount=-6 +kerning first=232 second=251 amount=-2 +kerning first=66 second=206 amount=-4 +kerning first=374 second=296 amount=-1 +kerning first=1045 second=1055 amount=-1 +kerning first=196 second=251 amount=-3 +kerning first=262 second=344 amount=-3 +kerning first=304 second=251 amount=-2 +kerning first=83 second=375 amount=-2 +kerning first=284 second=369 amount=-1 +kerning first=269 second=273 amount=-1 +kerning first=268 second=251 amount=-2 +kerning first=45 second=260 amount=-4 +kerning first=88 second=79 amount=-3 +kerning first=248 second=369 amount=-1 +kerning first=233 second=273 amount=-1 +kerning first=376 second=251 amount=-2 +kerning first=8217 second=112 amount=-1 +kerning first=381 second=284 amount=-1 +kerning first=1096 second=1108 amount=-1 +kerning first=98 second=253 amount=-3 +kerning first=89 second=355 amount=-1 +kerning first=98 second=382 amount=-2 +kerning first=107 second=45 amount=-3 +kerning first=369 second=279 amount=-1 +kerning first=201 second=284 amount=-1 +kerning first=331 second=324 amount=-1 +kerning first=1100 second=1119 amount=-1 +kerning first=115 second=363 amount=-1 +kerning first=295 second=324 amount=-1 +kerning first=120 second=279 amount=-2 +kerning first=275 second=253 amount=-2 +kerning first=201 second=197 amount=-2 +kerning first=261 second=279 amount=-1 +kerning first=311 second=253 amount=-1 +kerning first=230 second=355 amount=-1 +kerning first=220 second=363 amount=-1 +kerning first=367 second=324 amount=-1 +kerning first=45 second=318 amount=-1 +kerning first=225 second=279 amount=-1 +kerning first=347 second=253 amount=-3 +kerning first=194 second=355 amount=-1 +kerning first=232 second=331 amount=-2 +kerning first=313 second=313 amount=-2 +kerning first=45 second=315 amount=-5 +kerning first=251 second=318 amount=-2 +kerning first=202 second=83 amount=-2 +kerning first=8220 second=337 amount=-3 +kerning first=66 second=268 amount=-3 +kerning first=287 second=318 amount=-3 +kerning first=89 second=365 amount=-2 +kerning first=71 second=310 amount=-1 +kerning first=207 second=268 amount=-2 +kerning first=274 second=83 amount=-2 +kerning first=81 second=315 amount=-2 +kerning first=377 second=263 amount=-1 +kerning first=310 second=83 amount=-2 +kerning first=199 second=218 amount=-2 +kerning first=213 second=370 amount=-1 +kerning first=346 second=83 amount=-1 +kerning first=284 second=310 amount=-1 +kerning first=8216 second=245 amount=-3 +kerning first=1045 second=1065 amount=-1 +kerning first=197 second=263 amount=-1 +kerning first=381 second=355 amount=-1 +kerning first=212 second=310 amount=-2 +kerning first=233 second=263 amount=-1 +kerning first=84 second=220 amount=-1 +kerning first=1096 second=1105 amount=-1 +kerning first=230 second=303 amount=-2 +kerning first=274 second=353 amount=-1 +kerning first=1083 second=1089 amount=-1 +kerning first=266 second=303 amount=-1 +kerning first=84 second=275 amount=-3 +kerning first=310 second=353 amount=-1 +kerning first=346 second=353 amount=-1 +kerning first=374 second=365 amount=-2 +kerning first=194 second=303 amount=-1 +kerning first=382 second=353 amount=-2 +kerning first=108 second=45 amount=-3 +kerning first=338 second=365 amount=-2 +kerning first=222 second=315 amount=-2 +kerning first=374 second=303 amount=-2 +kerning first=380 second=224 amount=-1 +kerning first=302 second=365 amount=-2 +kerning first=1071 second=1060 amount=-1 +kerning first=266 second=365 amount=-2 +kerning first=302 second=303 amount=-1 +kerning first=202 second=353 amount=-1 +kerning first=253 second=303 amount=-2 +kerning first=230 second=365 amount=-2 +kerning first=338 second=303 amount=-1 +kerning first=194 second=365 amount=-3 +kerning first=1070 second=1048 amount=-1 +kerning first=105 second=235 amount=-1 +kerning first=289 second=225 amount=-3 +kerning first=1114 second=1098 amount=-1 +kerning first=280 second=280 amount=-2 +kerning first=118 second=105 amount=-2 +kerning first=325 second=225 amount=-2 +kerning first=266 second=98 amount=-1 +kerning first=1114 second=1095 amount=-2 +kerning first=352 second=280 amount=-3 +kerning first=354 second=228 amount=-4 +kerning first=381 second=356 amount=-2 +kerning first=1104 second=1093 amount=-1 +kerning first=338 second=98 amount=-1 +kerning first=1042 second=1095 amount=-2 +kerning first=109 second=318 amount=-1 +kerning first=112 second=225 amount=-1 +kerning first=282 second=228 amount=-1 +kerning first=89 second=303 amount=-2 +kerning first=367 second=46 amount=-2 +kerning first=246 second=228 amount=-1 +kerning first=1104 second=1100 amount=-1 +kerning first=354 second=235 amount=-3 +kerning first=217 second=225 amount=-3 +kerning first=1024 second=1102 amount=-1 +kerning first=230 second=98 amount=-2 +kerning first=210 second=228 amount=-1 +kerning first=377 second=270 amount=-1 +kerning first=253 second=225 amount=-3 +kerning first=194 second=98 amount=-2 +kerning first=274 second=350 amount=-2 +kerning first=8250 second=352 amount=-3 +kerning first=81 second=305 amount=-1 +kerning first=266 second=102 amount=-2 +kerning first=108 second=363 amount=-2 +kerning first=105 second=228 amount=-2 +kerning first=45 second=305 amount=-1 +kerning first=223 second=46 amount=-3 +kerning first=321 second=370 amount=-3 +kerning first=202 second=350 amount=-2 +kerning first=69 second=228 amount=-1 +kerning first=338 second=102 amount=-2 +kerning first=224 second=277 amount=-1 +kerning first=259 second=46 amount=-1 +kerning first=226 second=273 amount=-1 +kerning first=117 second=305 amount=-1 +kerning first=374 second=102 amount=-1 +kerning first=295 second=46 amount=-1 +kerning first=67 second=280 amount=-3 +kerning first=249 second=363 amount=-1 +kerning first=258 second=305 amount=-1 +kerning first=89 second=102 amount=-1 +kerning first=90 second=245 amount=-1 +kerning first=83 second=86 amount=-3 +kerning first=369 second=46 amount=-2 +kerning first=121 second=273 amount=-3 +kerning first=222 second=305 amount=-1 +kerning first=1053 second=1108 amount=-1 +kerning first=110 second=318 amount=-1 +kerning first=321 second=363 amount=-2 +kerning first=330 second=305 amount=-1 +kerning first=194 second=102 amount=-1 +kerning first=377 second=325 amount=-1 +kerning first=82 second=46 amount=-2 +kerning first=208 second=280 amount=-2 +kerning first=230 second=102 amount=-2 +kerning first=118 second=46 amount=-5 +kerning first=1072 second=1117 amount=-1 +kerning first=278 second=211 amount=-1 +kerning first=202 second=86 amount=-1 +kerning first=366 second=305 amount=-2 +kerning first=313 second=112 amount=-2 +kerning first=75 second=67 amount=-3 +kerning first=206 second=211 amount=-2 +kerning first=122 second=261 amount=-1 +kerning first=277 second=112 amount=-1 +kerning first=1108 second=1117 amount=-1 +kerning first=86 second=171 amount=-5 +kerning first=201 second=192 amount=-2 +kerning first=327 second=81 amount=-2 +kerning first=366 second=256 amount=-4 +kerning first=214 second=261 amount=-1 +kerning first=346 second=86 amount=-3 +kerning first=1102 second=1084 amount=-1 +kerning first=205 second=112 amount=-1 +kerning first=377 second=260 amount=-1 +kerning first=250 second=261 amount=-1 +kerning first=310 second=86 amount=-2 +kerning first=249 second=107 amount=-2 +kerning first=286 second=261 amount=-1 +kerning first=84 second=216 amount=-3 +kerning first=1043 second=1076 amount=-3 +kerning first=274 second=86 amount=-1 +kerning first=100 second=112 amount=-1 +kerning first=327 second=266 amount=-2 +kerning first=8250 second=89 amount=-4 +kerning first=321 second=107 amount=-2 +kerning first=332 second=204 amount=-2 +kerning first=370 second=216 amount=-1 +kerning first=331 second=105 amount=-1 +kerning first=367 second=105 amount=-2 +kerning first=268 second=254 amount=-1 +kerning first=216 second=327 amount=-2 +kerning first=122 second=171 amount=-3 +kerning first=295 second=105 amount=-1 +kerning first=78 second=81 amount=-2 +kerning first=315 second=209 amount=-2 +kerning first=288 second=327 amount=-1 +kerning first=1042 second=1098 amount=-1 +kerning first=219 second=81 amount=-1 +kerning first=223 second=105 amount=-1 +kerning first=209 second=346 amount=-2 +kerning first=1053 second=1087 amount=-1 +kerning first=369 second=275 amount=-1 +kerning first=200 second=230 amount=-1 +kerning first=249 second=100 amount=-1 +kerning first=258 second=249 amount=-3 +kerning first=236 second=230 amount=-2 +kerning first=83 second=204 amount=-3 +kerning first=106 second=303 amount=-1 +kerning first=117 second=249 amount=-1 +kerning first=199 second=318 amount=-1 +kerning first=68 second=346 amount=-1 +kerning first=379 second=223 amount=-1 +kerning first=366 second=249 amount=-1 +kerning first=313 second=379 amount=-3 +kerning first=225 second=275 amount=-1 +kerning first=1045 second=1058 amount=-1 +kerning first=72 second=100 amount=-2 +kerning first=317 second=346 amount=-1 +kerning first=378 second=242 amount=-1 +kerning first=261 second=275 amount=-1 +kerning first=362 second=223 amount=-2 +kerning first=108 second=100 amount=-1 +kerning first=120 second=275 amount=-2 +kerning first=330 second=249 amount=-1 +kerning first=263 second=339 amount=-1 +kerning first=325 second=334 amount=-2 +kerning first=108 second=107 amount=-1 +kerning first=254 second=223 amount=-1 +kerning first=218 second=223 amount=-2 +kerning first=231 second=305 amount=-2 +kerning first=81 second=256 amount=-4 +kerning first=227 second=339 amount=-1 +kerning first=45 second=256 amount=-4 +kerning first=1108 second=1103 amount=-1 +kerning first=344 second=230 amount=-2 +kerning first=380 second=230 amount=-1 +kerning first=1042 second=1039 amount=-2 +kerning first=272 second=230 amount=-1 +kerning first=371 second=339 amount=-3 +kerning first=65 second=211 amount=-3 +kerning first=113 second=223 amount=-1 +kerning first=222 second=256 amount=-4 +kerning first=324 second=228 amount=-1 +kerning first=1045 second=1059 amount=-3 +kerning first=313 second=109 amount=-1 +kerning first=274 second=89 amount=-1 +kerning first=119 second=114 amount=-1 +kerning first=321 second=104 amount=-2 +kerning first=8250 second=86 amount=-4 +kerning first=321 second=192 amount=-2 +kerning first=83 second=114 amount=-2 +kerning first=315 second=212 amount=-1 +kerning first=213 second=192 amount=-4 +kerning first=100 second=314 amount=-1 +kerning first=337 second=237 amount=-1 +kerning first=108 second=104 amount=-1 +kerning first=221 second=187 amount=-3 +kerning first=230 second=99 amount=-1 +kerning first=323 second=262 amount=-2 +kerning first=1071 second=1116 amount=-1 +kerning first=199 second=217 amount=-2 +kerning first=194 second=99 amount=-1 +kerning first=302 second=99 amount=-2 +kerning first=100 second=109 amount=-1 +kerning first=84 second=269 amount=-3 +kerning first=229 second=237 amount=-1 +kerning first=277 second=314 amount=-3 +kerning first=380 second=227 amount=-1 +kerning first=266 second=99 amount=-2 +kerning first=244 second=378 amount=-2 +kerning first=193 second=237 amount=-1 +kerning first=241 second=314 amount=-1 +kerning first=374 second=99 amount=-3 +kerning first=346 second=89 amount=-3 +kerning first=249 second=104 amount=-2 +kerning first=290 second=282 amount=-1 +kerning first=99 second=44 amount=-3 +kerning first=120 second=269 amount=-2 +kerning first=353 second=120 amount=-3 +kerning first=352 second=277 amount=-1 +kerning first=313 second=314 amount=-2 +kerning first=240 second=44 amount=-3 +kerning first=261 second=269 amount=-1 +kerning first=1102 second=1083 amount=-2 +kerning first=225 second=269 amount=-1 +kerning first=8222 second=229 amount=-2 +kerning first=78 second=351 amount=-2 +kerning first=231 second=371 amount=-2 +kerning first=200 second=224 amount=-1 +kerning first=240 second=121 amount=-3 +kerning first=267 second=371 amount=-2 +kerning first=377 second=267 amount=-1 +kerning first=316 second=277 amount=-1 +kerning first=266 second=302 amount=-3 +kerning first=303 second=371 amount=-1 +kerning first=272 second=224 amount=-1 +kerning first=105 second=232 amount=-1 +kerning first=363 second=347 amount=-2 +kerning first=369 second=269 amount=-1 +kerning first=8250 second=353 amount=-1 +kerning first=1070 second=1051 amount=-3 +kerning first=114 second=351 amount=-1 +kerning first=339 second=371 amount=-2 +kerning first=236 second=224 amount=-2 +kerning first=327 second=347 amount=-2 +kerning first=286 second=202 amount=-1 +kerning first=67 second=277 amount=-2 +kerning first=356 second=344 amount=-1 +kerning first=344 second=224 amount=-2 +kerning first=291 second=347 amount=-3 +kerning first=255 second=347 amount=-3 +kerning first=345 second=8249 amount=-1 +kerning first=214 second=202 amount=-2 +kerning first=89 second=302 amount=-1 +kerning first=89 second=99 amount=-3 +kerning first=381 second=8249 amount=-3 +kerning first=1073 second=1081 amount=-1 +kerning first=103 second=277 amount=-2 +kerning first=321 second=367 amount=-2 +kerning first=72 second=101 amount=-2 +kerning first=86 second=79 amount=-3 +kerning first=73 second=261 amount=-2 +kerning first=197 second=267 amount=-1 +kerning first=8217 second=106 amount=-1 +kerning first=108 second=101 amount=-1 +kerning first=363 second=351 amount=-2 +kerning first=109 second=261 amount=-1 +kerning first=249 second=367 amount=-1 +kerning first=334 second=69 amount=-2 +kerning first=207 second=212 amount=-2 +kerning first=376 second=257 amount=-5 +kerning first=66 second=212 amount=-3 +kerning first=249 second=101 amount=-1 +kerning first=255 second=351 amount=-3 +kerning first=233 second=97 amount=-2 +kerning first=268 second=257 amount=-2 +kerning first=262 second=69 amount=-3 +kerning first=1070 second=1047 amount=-2 +kerning first=219 second=351 amount=-2 +kerning first=304 second=257 amount=-2 +kerning first=72 second=367 amount=-2 +kerning first=233 second=267 amount=-1 +kerning first=327 second=351 amount=-2 +kerning first=108 second=367 amount=-2 +kerning first=269 second=267 amount=-1 +kerning first=8220 second=333 amount=-3 +kerning first=291 second=351 amount=-3 +kerning first=232 second=257 amount=-2 +kerning first=67 second=337 amount=-2 +kerning first=278 second=382 amount=-2 +kerning first=80 second=246 amount=-1 +kerning first=313 second=316 amount=-2 +kerning first=255 second=291 amount=-3 +kerning first=314 second=382 amount=-1 +kerning first=1045 second=1062 amount=-1 +kerning first=197 second=266 amount=-3 +kerning first=194 second=362 amount=-3 +kerning first=1067 second=1087 amount=-1 +kerning first=376 second=315 amount=-1 +kerning first=350 second=382 amount=-2 +kerning first=344 second=286 amount=-3 +kerning first=79 second=206 amount=-2 +kerning first=283 second=241 amount=-2 +kerning first=279 second=271 amount=-1 +kerning first=1071 second=1057 amount=-1 +kerning first=113 second=226 amount=-2 +kerning first=101 second=382 amount=-2 +kerning first=282 second=205 amount=-2 +kerning first=258 second=311 amount=-2 +kerning first=255 second=287 amount=-3 +kerning first=78 second=291 amount=-3 +kerning first=196 second=279 amount=-1 +kerning first=218 second=226 amount=-3 +kerning first=267 second=228 amount=-2 +kerning first=206 second=382 amount=-1 +kerning first=200 second=286 amount=-1 +kerning first=1042 second=1042 amount=-2 +kerning first=106 second=241 amount=-2 +kerning first=346 second=356 amount=-3 +kerning first=103 second=337 amount=-2 +kerning first=242 second=382 amount=-2 +kerning first=70 second=241 amount=-1 +kerning first=379 second=221 amount=-2 +kerning first=230 second=361 amount=-2 +kerning first=1107 second=1113 amount=-3 +kerning first=194 second=361 amount=-3 +kerning first=251 second=8221 amount=-3 +kerning first=324 second=331 amount=-1 +kerning first=99 second=382 amount=-2 +kerning first=302 second=361 amount=-2 +kerning first=192 second=290 amount=-3 +kerning first=110 second=8221 amount=-4 +kerning first=266 second=361 amount=-2 +kerning first=1100 second=1075 amount=-1 +kerning first=100 second=316 amount=-1 +kerning first=252 second=331 amount=-1 +kerning first=8217 second=369 amount=-1 +kerning first=374 second=361 amount=-2 +kerning first=1057 second=1082 amount=-1 +kerning first=111 second=331 amount=-1 +kerning first=381 second=333 amount=-1 +kerning first=241 second=316 amount=-1 +kerning first=216 second=274 amount=-2 +kerning first=199 second=221 amount=-1 +kerning first=102 second=271 amount=-1 +kerning first=277 second=316 amount=-3 +kerning first=200 second=227 amount=-1 +kerning first=280 second=70 amount=-2 +kerning first=1039 second=1081 amount=-1 +kerning first=258 second=252 amount=-3 +kerning first=83 second=381 amount=-1 +kerning first=222 second=45 amount=-1 +kerning first=368 second=115 amount=-2 +kerning first=208 second=70 amount=-2 +kerning first=368 second=45 amount=-5 +kerning first=83 second=207 amount=-3 +kerning first=108 second=103 amount=-3 +kerning first=86 second=78 amount=-1 +kerning first=195 second=368 amount=-3 +kerning first=330 second=252 amount=-1 +kerning first=72 second=103 amount=-3 +kerning first=344 second=227 amount=-2 +kerning first=45 second=252 amount=-1 +kerning first=1042 second=1101 amount=-2 +kerning first=366 second=45 amount=-5 +kerning first=67 second=336 amount=-3 +kerning first=272 second=227 amount=-1 +kerning first=1078 second=1101 amount=-1 +kerning first=117 second=252 amount=-1 +kerning first=67 second=278 amount=-3 +kerning first=8250 second=350 amount=-3 +kerning first=332 second=381 amount=-2 +kerning first=290 second=226 amount=-1 +kerning first=332 second=207 amount=-2 +kerning first=268 second=201 amount=-3 +kerning first=326 second=226 amount=-1 +kerning first=365 second=246 amount=-1 +kerning first=89 second=346 amount=-3 +kerning first=313 second=317 amount=-2 +kerning first=1043 second=1107 amount=-2 +kerning first=202 second=90 amount=-1 +kerning first=280 second=336 amount=-1 +kerning first=202 second=356 amount=-1 +kerning first=377 second=323 amount=-1 +kerning first=208 second=278 amount=-2 +kerning first=266 second=362 amount=-2 +kerning first=366 second=252 amount=-1 +kerning first=257 second=246 amount=-1 +kerning first=274 second=90 amount=-1 +kerning first=87 second=233 amount=-3 +kerning first=1079 second=1107 amount=-1 +kerning first=221 second=246 amount=-3 +kerning first=321 second=103 amount=-3 +kerning first=280 second=278 amount=-2 +kerning first=228 second=233 amount=-1 +kerning first=338 second=362 amount=-2 +kerning first=346 second=90 amount=-1 +kerning first=192 second=233 amount=-1 +kerning first=327 second=291 amount=-3 +kerning first=117 second=45 amount=-2 +kerning first=352 second=278 amount=-3 +kerning first=108 second=382 amount=-1 +kerning first=122 second=369 amount=-2 +kerning first=277 second=103 amount=-3 +kerning first=250 second=246 amount=-1 +kerning first=1086 second=1095 amount=-1 +kerning first=86 second=369 amount=-2 +kerning first=241 second=103 amount=-2 +kerning first=218 second=259 amount=-3 +kerning first=187 second=356 amount=-4 +kerning first=1050 second=1095 amount=-3 +kerning first=213 second=382 amount=-2 +kerning first=227 second=369 amount=-1 +kerning first=205 second=103 amount=-3 +kerning first=249 second=382 amount=-2 +kerning first=236 second=259 amount=-2 +kerning first=263 second=116 amount=-1 +kerning first=82 second=356 amount=-3 +kerning first=338 second=45 amount=-2 +kerning first=380 second=252 amount=-2 +kerning first=122 second=116 amount=-1 +kerning first=100 second=363 amount=-1 +kerning first=72 second=382 amount=-1 +kerning first=374 second=45 amount=-5 +kerning first=86 second=116 amount=-1 +kerning first=354 second=226 amount=-5 +kerning first=99 second=279 amount=-1 +kerning first=1071 second=1054 amount=-1 +kerning first=195 second=375 amount=-3 +kerning first=205 second=363 amount=-2 +kerning first=1042 second=1076 amount=-2 +kerning first=249 second=122 amount=-2 +kerning first=1057 second=1100 amount=-1 +kerning first=241 second=363 amount=-1 +kerning first=89 second=305 amount=-2 +kerning first=204 second=279 amount=-2 +kerning first=90 second=375 amount=-3 +kerning first=213 second=122 amount=-2 +kerning first=1104 second=1102 amount=-1 +kerning first=277 second=363 amount=-2 +kerning first=317 second=362 amount=-3 +kerning first=1064 second=1089 amount=-1 +kerning first=371 second=109 amount=-2 +kerning first=77 second=266 amount=-2 +kerning first=313 second=363 amount=-2 +kerning first=194 second=305 amount=-1 +kerning first=216 second=65 amount=-4 +kerning first=339 second=375 amount=-2 +kerning first=371 second=116 amount=-1 +kerning first=321 second=382 amount=-3 +kerning first=303 second=375 amount=-2 +kerning first=68 second=362 amount=-1 +kerning first=263 second=369 amount=-2 +kerning first=122 second=109 amount=-2 +kerning first=266 second=305 amount=-1 +kerning first=288 second=65 amount=-3 +kerning first=267 second=375 amount=-2 +kerning first=371 second=369 amount=-1 +kerning first=89 second=45 amount=-5 +kerning first=263 second=109 amount=-2 +kerning first=1064 second=1082 amount=-1 +kerning first=230 second=305 amount=-2 +kerning first=231 second=375 amount=-2 +kerning first=335 second=369 amount=-1 +kerning first=313 second=103 amount=-3 +kerning first=227 second=109 amount=-1 +kerning first=1056 second=1063 amount=-1 +kerning first=281 second=355 amount=-1 +kerning first=338 second=305 amount=-1 +kerning first=381 second=231 amount=-1 +kerning first=245 second=355 amount=-1 +kerning first=339 second=115 amount=-2 +kerning first=304 second=232 amount=-2 +kerning first=231 second=115 amount=-2 +kerning first=362 second=45 amount=-5 +kerning first=374 second=305 amount=-2 +kerning first=84 second=202 amount=-1 +kerning first=344 second=8217 amount=-5 +kerning first=1060 second=1062 amount=-1 +kerning first=196 second=232 amount=-1 +kerning first=219 second=44 amount=-5 +kerning first=201 second=336 amount=-1 +kerning first=1024 second=1062 amount=-1 +kerning first=353 second=355 amount=-2 +kerning first=375 second=115 amount=-3 +kerning first=268 second=232 amount=-2 +kerning first=8250 second=371 amount=-1 +kerning first=232 second=232 amount=-1 +kerning first=226 second=8217 amount=-3 +kerning first=196 second=253 amount=-3 +kerning first=375 second=108 amount=-2 +kerning first=232 second=253 amount=-2 +kerning first=8250 second=90 amount=-4 +kerning first=339 second=108 amount=-3 +kerning first=1024 second=1055 amount=-1 +kerning first=381 second=336 amount=-1 +kerning first=268 second=253 amount=-1 +kerning first=1060 second=1055 amount=-1 +kerning first=304 second=253 amount=-2 +kerning first=8250 second=378 amount=-5 +kerning first=333 second=380 amount=-2 +kerning first=376 second=253 amount=-3 +kerning first=262 second=325 amount=-3 +kerning first=71 second=66 amount=-1 +kerning first=1042 second=1048 amount=-2 +kerning first=65 second=251 amount=-3 +kerning first=367 second=328 amount=-1 +kerning first=379 second=196 amount=-1 +kerning first=324 second=115 amount=-1 +kerning first=100 second=335 amount=-1 +kerning first=331 second=328 amount=-1 +kerning first=380 second=231 amount=-1 +kerning first=232 second=225 amount=-2 +kerning first=198 second=332 amount=-1 +kerning first=295 second=328 amount=-1 +kerning first=231 second=108 amount=-3 +kerning first=195 second=108 amount=-2 +kerning first=381 second=315 amount=-1 +kerning first=303 second=108 amount=-2 +kerning first=199 second=196 amount=-3 +kerning first=267 second=108 amount=-3 +kerning first=366 second=286 amount=-1 +kerning first=106 second=242 amount=-1 +kerning first=102 second=45 amount=-3 +kerning first=236 second=8217 amount=-2 +kerning first=70 second=242 amount=-1 +kerning first=264 second=84 amount=-1 +kerning first=272 second=8217 amount=-2 +kerning first=104 second=102 amount=-1 +kerning first=330 second=286 amount=-2 +kerning first=283 second=242 amount=-1 +kerning first=76 second=203 amount=-2 +kerning first=88 second=8221 amount=-2 +kerning first=268 second=225 amount=-2 +kerning first=286 second=218 amount=-1 +kerning first=244 second=46 amount=-3 +kerning first=200 second=280 amount=-2 +kerning first=258 second=286 amount=-3 +kerning first=195 second=115 amount=-2 +kerning first=304 second=225 amount=-2 +kerning first=280 second=46 amount=-1 +kerning first=214 second=218 amount=-1 +kerning first=272 second=280 amount=-2 +kerning first=1057 second=1118 amount=-1 +kerning first=236 second=231 amount=-1 +kerning first=90 second=115 amount=-2 +kerning first=376 second=225 amount=-5 +kerning first=352 second=46 amount=-4 +kerning first=353 second=102 amount=-2 +kerning first=217 second=210 amount=-1 +kerning first=1060 second=1083 amount=-2 +kerning first=67 second=46 amount=-1 +kerning first=240 second=307 amount=-1 +kerning first=65 second=119 amount=-3 +kerning first=103 second=46 amount=-3 +kerning first=193 second=8221 amount=-5 +kerning first=101 second=119 amount=-2 +kerning first=362 second=266 amount=-1 +kerning first=262 second=224 amount=-2 +kerning first=76 second=210 amount=-1 +kerning first=229 second=8221 amount=-3 +kerning first=202 second=303 amount=-1 +kerning first=207 second=337 amount=-2 +kerning first=67 second=67 amount=-3 +kerning first=108 second=122 amount=-1 +kerning first=206 second=119 amount=-2 +kerning first=245 second=102 amount=-1 +kerning first=72 second=122 amount=-1 +kerning first=242 second=119 amount=-2 +kerning first=281 second=102 amount=-2 +kerning first=337 second=8221 amount=-2 +kerning first=278 second=119 amount=-1 +kerning first=218 second=266 amount=-1 +kerning first=8250 second=118 amount=-3 +kerning first=314 second=119 amount=-3 +kerning first=268 second=204 amount=-3 +kerning first=350 second=119 amount=-3 +kerning first=236 second=252 amount=-1 +kerning first=381 second=250 amount=-3 +kerning first=1024 second=1090 amount=-3 +kerning first=296 second=351 amount=-2 +kerning first=344 second=252 amount=-2 +kerning first=267 second=115 amount=-2 +kerning first=205 second=335 amount=-2 +kerning first=344 second=259 amount=-2 +kerning first=1114 second=1097 amount=-1 +kerning first=259 second=328 amount=-1 +kerning first=376 second=204 amount=-1 +kerning first=77 second=245 amount=-2 +kerning first=223 second=328 amount=-1 +kerning first=1056 second=1042 amount=-1 +kerning first=99 second=307 amount=-2 +kerning first=197 second=269 amount=-1 +kerning first=277 second=335 amount=-1 +kerning first=187 second=328 amount=-2 +kerning first=368 second=196 amount=-4 +kerning first=249 second=46 amount=-2 +kerning first=280 second=67 amount=-1 +kerning first=380 second=259 amount=-1 +kerning first=86 second=81 amount=-3 +kerning first=118 second=328 amount=-2 +kerning first=200 second=252 amount=-2 +kerning first=364 second=113 amount=-2 +kerning first=324 second=353 amount=-1 +kerning first=269 second=269 amount=-1 +kerning first=8217 second=335 amount=-3 +kerning first=66 second=262 amount=-3 +kerning first=313 second=73 amount=-2 +kerning first=70 second=275 amount=-1 +kerning first=256 second=366 amount=-3 +kerning first=233 second=269 amount=-1 +kerning first=363 second=291 amount=-3 +kerning first=71 second=368 amount=-1 +kerning first=324 second=365 amount=-1 +kerning first=256 second=113 amount=-1 +kerning first=70 second=263 amount=-1 +kerning first=288 second=365 amount=-1 +kerning first=382 second=378 amount=-2 +kerning first=65 second=99 amount=-1 +kerning first=207 second=262 amount=-2 +kerning first=252 second=365 amount=-1 +kerning first=202 second=378 amount=-2 +kerning first=284 second=87 amount=-3 +kerning first=234 second=100 amount=-1 +kerning first=71 second=259 amount=-1 +kerning first=314 second=171 amount=-3 +kerning first=252 second=353 amount=-2 +kerning first=274 second=378 amount=-2 +kerning first=212 second=87 amount=-2 +kerning first=315 second=262 amount=-1 +kerning first=379 second=8250 amount=-1 +kerning first=234 second=112 amount=-1 +kerning first=290 second=316 amount=-1 +kerning first=111 second=365 amount=-1 +kerning first=79 second=305 amount=-1 +kerning first=89 second=352 amount=-3 +kerning first=283 second=275 amount=-1 +kerning first=75 second=353 amount=-1 +kerning first=1027 second=1054 amount=-1 +kerning first=1057 second=1091 amount=-1 +kerning first=337 second=249 amount=-1 +kerning first=194 second=352 amount=-3 +kerning first=1057 second=1086 amount=-1 +kerning first=1093 second=1091 amount=-2 +kerning first=71 second=87 amount=-3 +kerning first=377 second=288 amount=-1 +kerning first=71 second=354 amount=-3 +kerning first=220 second=113 amount=-2 +kerning first=302 second=352 amount=-2 +kerning first=197 second=288 amount=-3 +kerning first=275 second=223 amount=-1 +kerning first=325 second=210 amount=-2 +kerning first=266 second=352 amount=-3 +kerning first=73 second=211 amount=-2 +kerning first=106 second=275 amount=-1 +kerning first=374 second=352 amount=-3 +kerning first=1089 second=1080 amount=-1 +kerning first=212 second=354 amount=-2 +kerning first=347 second=223 amount=-1 +kerning first=8220 second=283 amount=-3 +kerning first=338 second=352 amount=-2 +kerning first=1053 second=1080 amount=-1 +kerning first=88 second=249 amount=-3 +kerning first=1100 second=1117 amount=-1 +kerning first=351 second=8220 amount=-2 +kerning first=225 second=248 amount=-1 +kerning first=112 second=303 amount=-1 +kerning first=202 second=380 amount=-2 +kerning first=315 second=8220 amount=-4 +kerning first=84 second=248 amount=-3 +kerning first=201 second=296 amount=-2 +kerning first=203 second=223 amount=-1 +kerning first=1088 second=1113 amount=-2 +kerning first=378 second=339 amount=-1 +kerning first=279 second=8220 amount=-2 +kerning first=252 second=114 amount=-1 +kerning first=354 second=198 amount=-6 +kerning first=229 second=249 amount=-1 +kerning first=88 second=289 amount=-2 +kerning first=243 second=8220 amount=-2 +kerning first=111 second=114 amount=-1 +kerning first=69 second=198 amount=-2 +kerning first=1064 second=1117 amount=-1 +kerning first=193 second=289 amount=-3 +kerning first=356 second=338 amount=-3 +kerning first=193 second=249 amount=-3 +kerning first=67 second=327 amount=-3 +kerning first=102 second=8220 amount=3 +kerning first=75 second=114 amount=1 +kerning first=210 second=198 amount=-4 +kerning first=97 second=380 amount=-1 +kerning first=266 second=73 amount=-3 +kerning first=283 second=263 amount=-1 +kerning first=75 second=365 amount=-3 +kerning first=66 second=8220 amount=-4 +kerning first=1043 second=1113 amount=-3 +kerning first=365 second=237 amount=-2 +kerning first=8222 second=219 amount=-3 +kerning first=262 second=313 amount=-3 +kerning first=381 second=296 amount=-1 +kerning first=338 second=73 amount=-2 +kerning first=208 second=327 amount=-2 +kerning first=374 second=73 amount=-1 +kerning first=201 second=315 amount=-2 +kerning first=257 second=237 amount=-1 +kerning first=1039 second=1105 amount=-1 +kerning first=89 second=73 amount=-1 +kerning first=106 second=263 amount=-1 +kerning first=193 second=8249 amount=-4 +kerning first=280 second=327 amount=-2 +kerning first=221 second=237 amount=-2 +kerning first=302 second=275 amount=-2 +kerning first=1075 second=1105 amount=-1 +kerning first=313 second=75 amount=-2 +kerning first=229 second=8249 amount=-2 +kerning first=214 second=206 amount=-2 +kerning first=382 second=99 amount=-1 +kerning first=88 second=8249 amount=-4 +kerning first=352 second=327 amount=-3 +kerning first=261 second=248 amount=-1 +kerning first=355 second=253 amount=-1 +kerning first=116 second=237 amount=-1 +kerning first=198 second=379 amount=-1 +kerning first=346 second=99 amount=-1 +kerning first=234 second=339 amount=-1 +kerning first=286 second=206 amount=-1 +kerning first=206 second=199 amount=-2 +kerning first=279 second=234 amount=-1 +kerning first=101 second=187 amount=-2 +kerning first=192 second=212 amount=-3 +kerning first=1067 second=1081 amount=-1 +kerning first=221 second=209 amount=-1 +kerning first=68 second=83 amount=-1 +kerning first=216 second=381 amount=-2 +kerning first=87 second=212 amount=-3 +kerning first=1108 second=1102 amount=-1 +kerning first=1118 second=1103 amount=-4 +kerning first=288 second=381 amount=-2 +kerning first=102 second=234 amount=-1 +kerning first=8217 second=363 amount=-1 +kerning first=209 second=83 amount=-2 +kerning first=315 second=264 amount=-1 +kerning first=1031 second=1081 amount=-1 +kerning first=207 second=234 amount=-2 +kerning first=1079 second=1113 amount=-1 +kerning first=82 second=89 amount=-3 +kerning first=317 second=83 amount=-1 +kerning first=198 second=351 amount=-1 +kerning first=207 second=264 amount=-2 +kerning first=88 second=277 amount=-2 +kerning first=315 second=211 amount=-1 +kerning first=79 second=364 amount=-1 +kerning first=187 second=89 amount=-4 +kerning first=337 second=289 amount=-2 +kerning first=346 second=111 amount=-1 +kerning first=193 second=277 amount=-1 +kerning first=234 second=351 amount=-2 +kerning first=66 second=264 amount=-3 +kerning first=378 second=367 amount=-2 +kerning first=327 second=119 amount=-2 +kerning first=97 second=111 amount=-1 +kerning first=80 second=209 amount=-1 +kerning first=65 second=199 amount=-3 +kerning first=256 second=364 amount=-3 +kerning first=264 second=212 amount=-3 +kerning first=236 second=233 amount=-1 +kerning first=355 second=291 amount=-2 +kerning first=234 second=367 amount=-2 +kerning first=284 second=354 amount=-3 +kerning first=69 second=226 amount=-1 +kerning first=79 second=97 amount=-1 +kerning first=105 second=226 amount=-2 +kerning first=229 second=261 amount=-1 +kerning first=381 second=76 amount=-1 +kerning first=305 second=45 amount=-3 +kerning first=353 second=97 amount=-1 +kerning first=198 second=367 amount=-2 +kerning first=65 second=242 amount=-1 +kerning first=380 second=233 amount=-1 +kerning first=210 second=226 amount=-1 +kerning first=211 second=291 amount=-1 +kerning first=1071 second=1092 amount=-1 +kerning first=198 second=72 amount=-2 +kerning first=220 second=97 amount=-3 +kerning first=344 second=233 amount=-3 +kerning first=246 second=226 amount=-1 +kerning first=1063 second=1054 amount=-1 +kerning first=1107 second=1092 amount=-1 +kerning first=356 second=326 amount=-3 +kerning first=282 second=226 amount=-1 +kerning first=75 second=337 amount=-2 +kerning first=1046 second=1076 amount=-1 +kerning first=115 second=97 amount=-1 +kerning first=70 second=291 amount=-3 +kerning first=378 second=351 amount=-2 +kerning first=201 second=76 amount=-2 +kerning first=108 second=110 amount=-1 +kerning first=216 second=86 amount=-2 +kerning first=364 second=97 amount=-3 +kerning first=209 second=350 amount=-2 +kerning first=261 second=250 amount=-1 +kerning first=252 second=337 amount=-1 +kerning first=97 second=378 amount=-1 +kerning first=1024 second=1050 amount=-1 +kerning first=206 second=171 amount=-4 +kerning first=68 second=350 amount=-1 +kerning first=241 second=109 amount=-1 +kerning first=249 second=110 amount=-1 +kerning first=75 second=86 amount=-2 +kerning first=202 second=77 amount=-2 +kerning first=1060 second=1050 amount=-1 +kerning first=328 second=97 amount=-1 +kerning first=333 second=250 amount=-1 +kerning first=317 second=350 amount=-1 +kerning first=233 second=316 amount=-3 +kerning first=321 second=110 amount=-1 +kerning first=298 second=253 amount=-2 +kerning first=337 second=261 amount=-1 +kerning first=269 second=316 amount=-3 +kerning first=84 second=250 amount=-2 +kerning first=288 second=86 amount=-3 +kerning first=305 second=316 amount=-1 +kerning first=225 second=250 amount=-1 +kerning first=1086 second=1116 amount=-1 +kerning first=65 second=171 amount=-4 +kerning first=377 second=234 amount=-1 +kerning first=201 second=331 amount=-1 +kerning first=203 second=200 amount=-2 +kerning first=1086 second=1107 amount=-1 +kerning first=264 second=221 amount=-1 +kerning first=317 second=381 amount=-3 +kerning first=380 second=271 amount=-1 +kerning first=367 second=337 amount=-1 +kerning first=192 second=221 amount=-6 +kerning first=267 second=117 amount=-2 +kerning first=81 second=206 amount=-2 +kerning first=231 second=117 amount=-2 +kerning first=339 second=117 amount=-2 +kerning first=303 second=117 amount=-1 +kerning first=344 second=264 amount=-3 +kerning first=280 second=290 amount=-1 +kerning first=264 second=214 amount=-3 +kerning first=203 second=207 amount=-2 +kerning first=331 second=361 amount=-1 +kerning first=236 second=240 amount=-1 +kerning first=78 second=338 amount=-2 +kerning first=223 second=98 amount=-1 +kerning first=187 second=98 amount=-1 +kerning first=194 second=291 amount=-3 +kerning first=200 second=264 amount=-1 +kerning first=344 second=240 amount=-3 +kerning first=87 second=214 amount=-3 +kerning first=380 second=240 amount=-1 +kerning first=86 second=364 amount=-1 +kerning first=236 second=271 amount=-1 +kerning first=192 second=214 amount=-3 +kerning first=90 second=377 amount=-1 +kerning first=244 second=114 amount=-1 +kerning first=336 second=221 amount=-2 +kerning first=1079 second=1093 amount=-1 +kerning first=368 second=194 amount=-4 +kerning first=268 second=220 amount=-2 +kerning first=1045 second=1024 amount=-1 +kerning first=8218 second=119 amount=-3 +kerning first=259 second=311 amount=-1 +kerning first=76 second=201 amount=-2 +kerning first=353 second=249 amount=-1 +kerning first=377 second=304 amount=-1 +kerning first=196 second=220 amount=-3 +kerning first=99 second=275 amount=-1 +kerning first=332 second=194 amount=-4 +kerning first=187 second=330 amount=-5 +kerning first=89 second=324 amount=-3 +kerning first=317 second=90 amount=-3 +kerning first=67 second=287 amount=-3 +kerning first=207 second=227 amount=-2 +kerning first=1082 second=1077 amount=-2 +kerning first=86 second=97 amount=-5 +kerning first=284 second=317 amount=-1 +kerning first=198 second=84 amount=-1 +kerning first=1118 second=1077 amount=-2 +kerning first=102 second=227 amount=-2 +kerning first=240 second=291 amount=-2 +kerning first=103 second=287 amount=-2 +kerning first=376 second=220 amount=-1 +kerning first=66 second=227 amount=-3 +kerning first=1038 second=1058 amount=-1 +kerning first=1046 second=1077 amount=-2 +kerning first=204 second=291 amount=-3 +kerning first=227 second=97 amount=-1 +kerning first=244 second=287 amount=-2 +kerning first=287 second=311 amount=-2 +kerning first=71 second=317 amount=-1 +kerning first=304 second=213 amount=-2 +kerning first=374 second=324 amount=-3 +kerning first=118 second=337 amount=-3 +kerning first=251 second=311 amount=-2 +kerning first=268 second=213 amount=-3 +kerning first=338 second=324 amount=-1 +kerning first=99 second=291 amount=-3 +kerning first=82 second=337 amount=-3 +kerning first=316 second=287 amount=-3 +kerning first=376 second=213 amount=-3 +kerning first=1114 second=1088 amount=-1 +kerning first=1024 second=1081 amount=-1 +kerning first=280 second=287 amount=-3 +kerning first=212 second=317 amount=-2 +kerning first=66 second=234 amount=-1 +kerning first=371 second=97 amount=-2 +kerning first=351 second=347 amount=-3 +kerning first=230 second=324 amount=-2 +kerning first=352 second=287 amount=-3 +kerning first=288 second=77 amount=-1 +kerning first=327 second=261 amount=-2 +kerning first=371 second=318 amount=-2 +kerning first=242 second=187 amount=-2 +kerning first=259 second=337 amount=-1 +kerning first=315 second=303 amount=-2 +kerning first=187 second=367 amount=-1 +kerning first=350 second=187 amount=-1 +kerning first=201 second=71 amount=-1 +kerning first=335 second=97 amount=-1 +kerning first=216 second=77 amount=-2 +kerning first=266 second=324 amount=-1 +kerning first=352 second=318 amount=-2 +kerning first=225 second=8217 amount=-3 +kerning first=381 second=303 amount=-1 +kerning first=99 second=263 amount=-1 +kerning first=295 second=365 amount=-1 +kerning first=259 second=365 amount=-1 +kerning first=203 second=197 amount=-2 +kerning first=187 second=114 amount=-2 +kerning first=344 second=268 amount=-3 +kerning first=377 second=326 amount=-1 +kerning first=231 second=120 amount=-2 +kerning first=204 second=263 amount=-2 +kerning first=223 second=365 amount=-1 +kerning first=336 second=193 amount=-4 +kerning first=356 second=78 amount=-1 +kerning first=363 second=45 amount=-2 +kerning first=267 second=120 amount=-2 +kerning first=187 second=365 amount=-1 +kerning first=317 second=353 amount=-1 +kerning first=344 second=243 amount=-3 +kerning first=118 second=365 amount=-1 +kerning first=284 second=78 amount=-1 +kerning first=353 second=353 amount=-3 +kerning first=380 second=243 amount=-1 +kerning first=200 second=268 amount=-1 +kerning first=187 second=70 amount=-5 +kerning first=212 second=78 amount=-2 +kerning first=267 second=232 amount=-1 +kerning first=1071 second=1094 amount=-1 +kerning first=71 second=314 amount=-1 +kerning first=218 second=275 amount=-2 +kerning first=1039 second=1100 amount=-1 +kerning first=69 second=356 amount=-1 +kerning first=209 second=353 amount=-2 +kerning first=284 second=85 amount=-1 +kerning first=353 second=118 amount=-3 +kerning first=113 second=275 amount=-1 +kerning first=245 second=353 amount=-2 +kerning first=108 second=113 amount=-1 +kerning first=281 second=353 amount=-2 +kerning first=212 second=85 amount=-1 +kerning first=72 second=113 amount=-2 +kerning first=248 second=314 amount=-2 +kerning first=303 second=120 amount=-1 +kerning first=1049 second=1079 amount=-1 +kerning first=288 second=74 amount=-1 +kerning first=77 second=275 amount=-2 +kerning first=8250 second=102 amount=-1 +kerning first=339 second=120 amount=-2 +kerning first=209 second=118 amount=-2 +kerning first=375 second=120 amount=-1 +kerning first=71 second=85 amount=-1 +kerning first=367 second=365 amount=-1 +kerning first=317 second=118 amount=-3 +kerning first=284 second=314 amount=-1 +kerning first=201 second=303 amount=-1 +kerning first=104 second=353 amount=-1 +kerning first=331 second=365 amount=-1 +kerning first=249 second=113 amount=-1 +kerning first=281 second=118 amount=-2 +kerning first=1082 second=1108 amount=-2 +kerning first=252 second=105 amount=-2 +kerning first=303 second=380 amount=-1 +kerning first=222 second=8249 amount=-1 +kerning first=376 second=241 amount=-3 +kerning first=8250 second=362 amount=-4 +kerning first=275 second=235 amount=-1 +kerning first=8218 second=122 amount=-3 +kerning first=339 second=380 amount=-2 +kerning first=352 second=248 amount=-1 +kerning first=81 second=8249 amount=-1 +kerning first=311 second=235 amount=-3 +kerning first=74 second=283 amount=-2 +kerning first=375 second=380 amount=-3 +kerning first=117 second=8249 amount=-2 +kerning first=216 second=105 amount=-1 +kerning first=325 second=353 amount=-2 +kerning first=66 second=224 amount=-3 +kerning first=104 second=118 amount=-3 +kerning first=327 second=338 amount=-2 +kerning first=268 second=241 amount=-1 +kerning first=323 second=283 amount=-2 +kerning first=295 second=98 amount=-2 +kerning first=207 second=224 amount=-2 +kerning first=287 second=283 amount=-2 +kerning first=259 second=98 amount=-1 +kerning first=1079 second=1081 amount=-1 +kerning first=251 second=283 amount=-1 +kerning first=231 second=380 amount=-2 +kerning first=367 second=98 amount=-2 +kerning first=279 second=224 amount=-2 +kerning first=219 second=338 amount=-1 +kerning first=330 second=375 amount=-2 +kerning first=344 second=8221 amount=-5 +kerning first=267 second=380 amount=-2 +kerning first=356 second=85 amount=-1 +kerning first=243 second=224 amount=-1 +kerning first=1024 second=1053 amount=-1 +kerning first=198 second=112 amount=-2 +kerning first=376 second=248 amount=-3 +kerning first=103 second=45 amount=-3 +kerning first=198 second=204 amount=-2 +kerning first=351 second=224 amount=-1 +kerning first=87 second=193 amount=-6 +kerning first=67 second=318 amount=-1 +kerning first=334 second=325 amount=-2 +kerning first=236 second=226 amount=-2 +kerning first=103 second=318 amount=-3 +kerning first=304 second=248 amount=-2 +kerning first=90 second=380 amount=-3 +kerning first=203 second=228 amount=-1 +kerning first=232 second=248 amount=-1 +kerning first=264 second=193 amount=-3 +kerning first=244 second=318 amount=-2 +kerning first=366 second=8249 amount=-5 +kerning first=268 second=248 amount=-2 +kerning first=381 second=331 amount=-1 +kerning first=98 second=228 amount=-1 +kerning first=280 second=318 amount=-1 +kerning first=258 second=8249 amount=-4 +kerning first=316 second=318 amount=-2 +kerning first=256 second=101 amount=-1 +kerning first=1070 second=1038 amount=-3 +kerning first=1071 second=1097 amount=-1 +kerning first=1049 second=1072 amount=-1 +kerning first=379 second=205 amount=-1 +kerning first=1027 second=1047 amount=-1 +kerning first=1063 second=1047 amount=-1 +kerning first=71 second=82 amount=-1 +kerning first=364 second=101 amount=-2 +kerning first=313 second=66 amount=-2 +kerning first=365 second=230 amount=-1 +kerning first=279 second=231 amount=-1 +kerning first=1093 second=1098 amount=-1 +kerning first=315 second=255 amount=-3 +kerning first=257 second=230 amount=-1 +kerning first=251 second=281 amount=-1 +kerning first=279 second=255 amount=-2 +kerning first=1071 second=1073 amount=-1 +kerning first=199 second=205 amount=-3 +kerning first=287 second=281 amount=-2 +kerning first=243 second=255 amount=-3 +kerning first=106 second=251 amount=-1 +kerning first=323 second=281 amount=-2 +kerning first=207 second=255 amount=-2 +kerning first=70 second=251 amount=-1 +kerning first=221 second=230 amount=-5 +kerning first=97 second=108 amount=-1 +kerning first=1102 second=1075 amount=-1 +kerning first=74 second=281 amount=-2 +kerning first=66 second=8217 amount=-4 +kerning first=102 second=255 amount=-1 +kerning first=81 second=8221 amount=-2 +kerning first=376 second=216 amount=-3 +kerning first=248 second=347 amount=-2 +kerning first=102 second=8217 amount=3 +kerning first=334 second=44 amount=-3 +kerning first=283 second=251 amount=-2 +kerning first=381 second=99 amount=-1 +kerning first=378 second=107 amount=-2 +kerning first=198 second=107 amount=-1 +kerning first=355 second=251 amount=-1 +kerning first=67 second=364 amount=-2 +kerning first=196 second=216 amount=-3 +kerning first=107 second=347 amount=-2 +kerning first=258 second=8221 amount=-5 +kerning first=207 second=231 amount=-2 +kerning first=324 second=105 amount=-1 +kerning first=117 second=8221 amount=-3 +kerning first=268 second=216 amount=-3 +kerning first=66 second=231 amount=-1 +kerning first=382 second=371 amount=-2 +kerning first=234 second=107 amount=-2 +kerning first=325 second=250 amount=-2 +kerning first=304 second=216 amount=-2 +kerning first=102 second=231 amount=-1 +kerning first=259 second=333 amount=-1 +kerning first=381 second=67 amount=-1 +kerning first=115 second=106 amount=-1 +kerning first=248 second=345 amount=-1 +kerning first=369 second=229 amount=-1 +kerning first=211 second=282 amount=-2 +kerning first=266 second=80 amount=-3 +kerning first=278 second=171 amount=-2 +kerning first=87 second=217 amount=-1 +kerning first=79 second=106 amount=-1 +kerning first=187 second=68 amount=-5 +kerning first=82 second=333 amount=-3 +kerning first=356 second=345 amount=-1 +kerning first=216 second=346 amount=-1 +kerning first=274 second=368 amount=-2 +kerning first=201 second=67 amount=-1 +kerning first=328 second=106 amount=-2 +kerning first=1052 second=1102 amount=-1 +kerning first=310 second=368 amount=-2 +kerning first=89 second=80 amount=-1 +kerning first=118 second=333 amount=-3 +kerning first=264 second=217 amount=-2 +kerning first=75 second=346 amount=-2 +kerning first=80 second=230 amount=-1 +kerning first=236 second=243 amount=-1 +kerning first=116 second=230 amount=-1 +kerning first=203 second=204 amount=-2 +kerning first=288 second=346 amount=-2 +kerning first=1045 second=1049 amount=-1 +kerning first=346 second=368 amount=-3 +kerning first=207 second=338 amount=-2 +kerning first=338 second=80 amount=-2 +kerning first=367 second=333 amount=-1 +kerning first=233 second=307 amount=-2 +kerning first=269 second=307 amount=-2 +kerning first=305 second=307 amount=-1 +kerning first=1038 second=1033 amount=-5 +kerning first=374 second=80 amount=-1 +kerning first=201 second=334 amount=-1 +kerning first=88 second=284 amount=-3 +kerning first=1073 second=1074 amount=-1 +kerning first=8216 second=260 amount=-8 +kerning first=8217 second=326 amount=-2 +kerning first=256 second=369 amount=-3 +kerning first=233 second=44 amount=-3 +kerning first=198 second=79 amount=-1 +kerning first=256 second=104 amount=-2 +kerning first=364 second=369 amount=-1 +kerning first=102 second=259 amount=-2 +kerning first=201 second=77 amount=-2 +kerning first=115 second=369 amount=-1 +kerning first=288 second=374 amount=-3 +kerning first=198 second=344 amount=-2 +kerning first=220 second=369 amount=-1 +kerning first=350 second=192 amount=-4 +kerning first=381 second=334 amount=-1 +kerning first=216 second=374 amount=-2 +kerning first=378 second=109 amount=-2 +kerning first=351 second=227 amount=-1 +kerning first=198 second=109 amount=-1 +kerning first=327 second=246 amount=-2 +kerning first=120 second=229 amount=-2 +kerning first=1114 second=1085 amount=-1 +kerning first=83 second=194 amount=-4 +kerning first=336 second=217 amount=-1 +kerning first=258 second=8220 amount=-5 +kerning first=233 second=279 amount=-1 +kerning first=279 second=227 amount=-2 +kerning first=1080 second=1086 amount=-1 +kerning first=243 second=227 amount=-1 +kerning first=234 second=109 amount=-2 +kerning first=84 second=229 amount=-5 +kerning first=120 second=232 amount=-2 +kerning first=305 second=44 amount=-2 +kerning first=1093 second=1095 amount=-1 +kerning first=90 second=226 amount=-1 +kerning first=1031 second=1074 amount=-1 +kerning first=333 second=229 amount=-1 +kerning first=115 second=104 amount=-1 +kerning first=377 second=44 amount=-1 +kerning first=193 second=284 amount=-3 +kerning first=1067 second=1074 amount=-1 +kerning first=197 second=279 amount=-1 +kerning first=187 second=65 amount=-4 +kerning first=225 second=229 amount=-1 +kerning first=339 second=289 amount=-3 +kerning first=201 second=305 amount=-1 +kerning first=97 second=371 amount=-1 +kerning first=261 second=257 amount=-1 +kerning first=354 second=219 amount=-1 +kerning first=121 second=99 amount=-3 +kerning first=218 second=379 amount=-1 +kerning first=311 second=232 amount=-3 +kerning first=118 second=361 amount=-1 +kerning first=1039 second=1096 amount=-1 +kerning first=225 second=257 amount=-1 +kerning first=282 second=219 amount=-2 +kerning first=82 second=361 amount=-2 +kerning first=84 second=257 amount=-5 +kerning first=223 second=361 amount=-1 +kerning first=326 second=118 amount=-3 +kerning first=120 second=257 amount=-2 +kerning first=210 second=219 amount=-1 +kerning first=187 second=361 amount=-1 +kerning first=377 second=279 amount=-1 +kerning first=295 second=361 amount=-1 +kerning first=356 second=347 amount=-3 +kerning first=82 second=210 amount=-3 +kerning first=259 second=361 amount=-1 +kerning first=80 second=202 amount=-1 +kerning first=69 second=219 amount=-2 +kerning first=353 second=121 amount=-3 +kerning first=356 second=82 amount=-1 +kerning first=375 second=117 amount=-1 +kerning first=196 second=244 amount=-1 +kerning first=283 second=254 amount=-2 +kerning first=75 second=374 amount=-2 +kerning first=317 second=121 amount=-3 +kerning first=232 second=244 amount=-1 +kerning first=281 second=121 amount=-2 +kerning first=268 second=244 amount=-2 +kerning first=355 second=254 amount=-1 +kerning first=8216 second=291 amount=-4 +kerning first=245 second=121 amount=-3 +kerning first=1053 second=1099 amount=-1 +kerning first=204 second=267 amount=-2 +kerning first=304 second=244 amount=-2 +kerning first=209 second=121 amount=-2 +kerning first=212 second=82 amount=-2 +kerning first=106 second=254 amount=-1 +kerning first=333 second=257 amount=-1 +kerning first=99 second=267 amount=-1 +kerning first=376 second=244 amount=-3 +kerning first=296 second=249 amount=-1 +kerning first=369 second=257 amount=-1 +kerning first=1089 second=1099 amount=-1 +kerning first=1057 second=1116 amount=-1 +kerning first=87 second=209 amount=-1 +kerning first=379 second=199 amount=-1 +kerning first=356 second=69 amount=-1 +kerning first=88 second=8217 amount=-2 +kerning first=221 second=212 amount=-3 +kerning first=284 second=69 amount=-1 +kerning first=205 second=332 amount=-2 +kerning first=1086 second=1119 amount=-1 +kerning first=264 second=209 amount=-3 +kerning first=313 second=79 amount=-1 +kerning first=212 second=69 amount=-2 +kerning first=205 second=79 amount=-2 +kerning first=121 second=316 amount=-2 +kerning first=198 second=82 amount=-2 +kerning first=71 second=69 amount=-1 +kerning first=371 second=303 amount=-1 +kerning first=379 second=192 amount=-1 +kerning first=69 second=216 amount=-1 +kerning first=266 second=76 amount=-3 +kerning first=366 second=289 amount=-4 +kerning first=216 second=89 amount=-2 +kerning first=313 second=332 amount=-1 +kerning first=1089 second=1096 amount=-1 +kerning first=248 second=378 amount=-2 +kerning first=288 second=89 amount=-3 +kerning first=194 second=290 amount=-3 +kerning first=356 second=113 amount=-3 +kerning first=206 second=333 amount=-2 +kerning first=89 second=76 amount=-1 +kerning first=199 second=199 amount=-3 +kerning first=193 second=8217 amount=-5 +kerning first=240 second=110 amount=-1 +kerning first=199 second=192 amount=-3 +kerning first=77 second=242 amount=-2 +kerning first=313 second=72 amount=-2 +kerning first=218 second=242 amount=-2 +kerning first=86 second=82 amount=-1 +kerning first=221 second=205 amount=-1 +kerning first=89 second=336 amount=-3 +kerning first=75 second=89 amount=-2 +kerning first=203 second=226 amount=-1 +kerning first=8250 second=374 amount=-4 +kerning first=363 second=326 amount=-1 +kerning first=80 second=205 amount=-1 +kerning first=362 second=242 amount=-2 +kerning first=275 second=226 amount=-2 +kerning first=84 second=75 amount=-1 +kerning first=272 second=8221 amount=-2 +kerning first=72 second=119 amount=-2 +kerning first=347 second=226 amount=-1 +kerning first=307 second=45 amount=-3 +kerning first=282 second=216 amount=-1 +kerning first=374 second=76 amount=-1 +kerning first=108 second=119 amount=-3 +kerning first=219 second=326 amount=-2 +kerning first=338 second=76 amount=-2 +kerning first=255 second=326 amount=-2 +kerning first=97 second=253 amount=-3 +kerning first=236 second=8221 amount=-2 +kerning first=291 second=326 amount=-1 +kerning first=8250 second=381 amount=-4 +kerning first=1064 second=1092 amount=-1 +kerning first=352 second=302 amount=-3 +kerning first=226 second=316 amount=-1 +kerning first=82 second=86 amount=-3 +kerning first=203 second=219 amount=-2 +kerning first=262 second=316 amount=-1 +kerning first=87 second=202 amount=-1 +kerning first=378 second=100 amount=-1 +kerning first=321 second=119 amount=-3 +kerning first=336 second=209 amount=-2 +kerning first=381 second=45 amount=-3 +kerning first=336 second=202 amount=-2 +kerning first=208 second=302 amount=-2 +kerning first=1060 second=1059 amount=-3 +kerning first=264 second=202 amount=-3 +kerning first=45 second=374 amount=-4 +kerning first=187 second=86 amount=-4 +kerning first=98 second=226 amount=-1 +kerning first=363 second=279 amount=-1 +kerning first=67 second=302 amount=-3 +kerning first=346 second=375 amount=-2 +kerning first=337 second=259 amount=-1 +kerning first=310 second=375 amount=-3 +kerning first=8217 second=338 amount=-2 +kerning first=1100 second=1085 amount=-1 +kerning first=99 second=269 amount=-1 +kerning first=374 second=325 amount=-1 +kerning first=378 second=103 amount=-2 +kerning first=84 second=253 amount=-3 +kerning first=1064 second=1085 amount=-1 +kerning first=288 second=356 amount=-3 +kerning first=364 second=122 amount=-3 +kerning first=1025 second=1098 amount=-3 +kerning first=279 second=246 amount=-1 +kerning first=120 second=253 amount=-3 +kerning first=1071 second=1082 amount=-1 +kerning first=204 second=269 amount=-2 +kerning first=328 second=122 amount=-1 +kerning first=115 second=382 amount=-2 +kerning first=279 second=252 amount=-2 +kerning first=305 second=378 amount=-1 +kerning first=216 second=356 amount=-2 +kerning first=216 second=362 amount=-1 +kerning first=207 second=246 amount=-2 +kerning first=225 second=253 amount=-3 +kerning first=315 second=252 amount=-2 +kerning first=198 second=363 amount=-2 +kerning first=234 second=103 amount=-3 +kerning first=1089 second=1075 amount=-1 +kerning first=261 second=253 amount=-2 +kerning first=351 second=252 amount=-1 +kerning first=288 second=362 amount=-1 +kerning first=198 second=103 amount=-3 +kerning first=1053 second=1075 amount=-1 +kerning first=382 second=375 amount=-2 +kerning first=229 second=259 amount=-1 +kerning first=256 second=116 amount=-1 +kerning first=75 second=356 amount=-2 +kerning first=1059 second=1119 amount=-4 +kerning first=66 second=246 amount=-1 +kerning first=1045 second=1043 amount=-1 +kerning first=8217 second=345 amount=-2 +kerning first=115 second=122 amount=-2 +kerning first=328 second=382 amount=-1 +kerning first=84 second=213 amount=-3 +kerning first=75 second=362 amount=-2 +kerning first=79 second=122 amount=-2 +kerning first=364 second=382 amount=-3 +kerning first=88 second=259 amount=-1 +kerning first=378 second=363 amount=-2 +kerning first=369 second=245 amount=-1 +kerning first=378 second=369 amount=-2 +kerning first=1069 second=1058 amount=-1 +kerning first=1071 second=1089 amount=-1 +kerning first=198 second=369 amount=-2 +kerning first=314 second=307 amount=-1 +kerning first=220 second=382 amount=-3 +kerning first=364 second=109 amount=-2 +kerning first=97 second=375 amount=-3 +kerning first=220 second=122 amount=-3 +kerning first=328 second=109 amount=-1 +kerning first=1107 second=1089 amount=-1 +kerning first=234 second=369 amount=-2 +kerning first=70 second=266 amount=-1 +kerning first=283 second=279 amount=-1 +kerning first=111 second=355 amount=-1 +kerning first=202 second=115 amount=-1 +kerning first=75 second=355 amount=-1 +kerning first=194 second=336 amount=-3 +kerning first=220 second=109 amount=-2 +kerning first=97 second=115 amount=-1 +kerning first=356 second=256 amount=-6 +kerning first=335 second=380 amount=-2 +kerning first=106 second=279 amount=-1 +kerning first=302 second=336 amount=-2 +kerning first=346 second=115 amount=-1 +kerning first=70 second=279 amount=-1 +kerning first=252 second=355 amount=-1 +kerning first=338 second=336 amount=-1 +kerning first=382 second=115 amount=-2 +kerning first=1045 second=1036 amount=-1 +kerning first=374 second=336 amount=-3 +kerning first=274 second=115 amount=-1 +kerning first=208 second=296 amount=-2 +kerning first=1064 second=1086 amount=-1 +kerning first=310 second=115 amount=-1 +kerning first=369 second=232 amount=-1 +kerning first=333 second=253 amount=-3 +kerning first=280 second=296 amount=-2 +kerning first=369 second=253 amount=-3 +kerning first=241 second=351 amount=-1 +kerning first=202 second=108 amount=-1 +kerning first=8250 second=196 amount=-4 +kerning first=115 second=116 amount=-2 +kerning first=352 second=296 amount=-3 +kerning first=261 second=232 amount=-1 +kerning first=225 second=232 amount=-1 +kerning first=81 second=8217 amount=-2 +kerning first=274 second=108 amount=-1 +kerning first=80 second=206 amount=-1 +kerning first=1052 second=1096 amount=-1 +kerning first=382 second=108 amount=-2 +kerning first=346 second=108 amount=-2 +kerning first=198 second=370 amount=-2 +kerning first=84 second=232 amount=-3 +kerning first=104 second=98 amount=-2 +kerning first=356 second=75 amount=-1 +kerning first=266 second=328 amount=-1 +kerning first=352 second=315 amount=-3 +kerning first=244 second=303 amount=-1 +kerning first=330 second=290 amount=-2 +kerning first=221 second=206 amount=-1 +kerning first=230 second=328 amount=-2 +kerning first=280 second=303 amount=-1 +kerning first=366 second=290 amount=-1 +kerning first=284 second=75 amount=-1 +kerning first=1086 second=1113 amount=-2 +kerning first=208 second=303 amount=-1 +kerning first=76 second=200 amount=-2 +kerning first=1050 second=1113 amount=-2 +kerning first=208 second=315 amount=-2 +kerning first=75 second=83 amount=-2 +kerning first=374 second=328 amount=-3 +kerning first=264 second=196 amount=-3 +kerning first=1100 second=1107 amount=-1 +kerning first=338 second=328 amount=-1 +kerning first=280 second=315 amount=-2 +kerning first=316 second=303 amount=-1 +kerning first=258 second=290 amount=-3 +kerning first=1064 second=1107 amount=-1 +kerning first=317 second=77 amount=-2 +kerning first=352 second=303 amount=-3 +kerning first=317 second=211 amount=-1 +kerning first=275 second=225 amount=-2 +kerning first=216 second=83 amount=-1 +kerning first=317 second=380 amount=-3 +kerning first=217 second=365 amount=-1 +kerning first=311 second=225 amount=-2 +kerning first=71 second=323 amount=-1 +kerning first=87 second=196 amount=-6 +kerning first=353 second=380 amount=-2 +kerning first=347 second=225 amount=-1 +kerning first=288 second=83 amount=-2 +kerning first=1057 second=1117 amount=-1 +kerning first=281 second=98 amount=-2 +kerning first=381 second=46 amount=-1 +kerning first=98 second=225 amount=-1 +kerning first=284 second=323 amount=-1 +kerning first=313 second=85 amount=-3 +kerning first=240 second=249 amount=-1 +kerning first=209 second=380 amount=-1 +kerning first=353 second=98 amount=-2 +kerning first=203 second=225 amount=-1 +kerning first=356 second=323 amount=-1 +kerning first=245 second=380 amount=-2 +kerning first=317 second=98 amount=-2 +kerning first=8250 second=375 amount=-3 +kerning first=323 second=286 amount=-2 +kerning first=283 second=273 amount=-1 +kerning first=281 second=380 amount=-2 +kerning first=376 second=235 amount=-3 +kerning first=102 second=233 amount=-1 +kerning first=252 second=102 amount=-1 +kerning first=354 second=210 amount=-3 +kerning first=66 second=233 amount=-1 +kerning first=288 second=102 amount=-2 +kerning first=89 second=77 amount=-1 +kerning first=1104 second=1118 amount=-1 +kerning first=207 second=233 amount=-2 +kerning first=324 second=102 amount=-1 +kerning first=201 second=311 amount=-1 +kerning first=345 second=46 amount=-4 +kerning first=1025 second=1097 amount=-1 +kerning first=338 second=77 amount=-2 +kerning first=82 second=71 amount=-3 +kerning first=221 second=211 amount=-3 +kerning first=279 second=233 amount=-1 +kerning first=74 second=286 amount=-2 +kerning first=323 second=103 amount=-3 +kerning first=82 second=352 amount=-3 +kerning first=111 second=102 amount=-1 +kerning first=266 second=77 amount=-3 +kerning first=268 second=345 amount=-1 +kerning first=193 second=45 amount=-4 +kerning first=201 second=46 amount=-1 +kerning first=187 second=352 amount=-3 +kerning first=69 second=210 amount=-1 +kerning first=335 second=112 amount=-1 +kerning first=1089 second=1090 amount=-1 +kerning first=214 second=221 amount=-2 +kerning first=207 second=252 amount=-1 +kerning first=263 second=112 amount=-1 +kerning first=87 second=218 amount=-1 +kerning first=196 second=235 amount=-1 +kerning first=243 second=252 amount=-1 +kerning first=115 second=110 amount=-2 +kerning first=232 second=235 amount=-1 +kerning first=89 second=328 amount=-3 +kerning first=268 second=235 amount=-2 +kerning first=122 second=112 amount=-3 +kerning first=216 second=350 amount=-1 +kerning first=220 second=110 amount=-2 +kerning first=304 second=235 amount=-2 +kerning first=1053 second=1090 amount=-1 +kerning first=86 second=112 amount=-2 +kerning first=80 second=194 amount=-4 +kerning first=66 second=252 amount=-3 +kerning first=8217 second=332 amount=-2 +kerning first=227 second=113 amount=-1 +kerning first=214 second=237 amount=-1 +kerning first=113 second=250 amount=-2 +kerning first=209 second=378 amount=-1 +kerning first=187 second=353 amount=-1 +kerning first=77 second=250 amount=-2 +kerning first=204 second=275 amount=-2 +kerning first=223 second=353 amount=-2 +kerning first=321 second=171 amount=-1 +kerning first=8250 second=120 amount=-3 +kerning first=122 second=113 amount=-1 +kerning first=109 second=237 amount=-1 +kerning first=218 second=250 amount=-1 +kerning first=281 second=378 amount=-2 +kerning first=259 second=353 amount=-1 +kerning first=75 second=44 amount=-1 +kerning first=86 second=366 amount=-1 +kerning first=344 second=262 amount=-3 +kerning first=86 second=113 amount=-3 +kerning first=288 second=350 amount=-2 +kerning first=73 second=237 amount=-1 +kerning first=245 second=378 amount=-2 +kerning first=295 second=353 amount=-1 +kerning first=327 second=352 amount=-2 +kerning first=298 second=117 amount=-2 +kerning first=371 second=113 amount=-3 +kerning first=70 second=260 amount=-3 +kerning first=371 second=100 amount=-3 +kerning first=201 second=73 amount=-2 +kerning first=8250 second=108 amount=-1 +kerning first=108 second=171 amount=-3 +kerning first=353 second=365 amount=-1 +kerning first=203 second=315 amount=-2 +kerning first=317 second=365 amount=-2 +kerning first=104 second=378 amount=-1 +kerning first=82 second=353 amount=-2 +kerning first=213 second=171 amount=-1 +kerning first=281 second=365 amount=-2 +kerning first=263 second=113 amount=-1 +kerning first=352 second=237 amount=-3 +kerning first=277 second=273 amount=-1 +kerning first=68 second=378 amount=-2 +kerning first=249 second=171 amount=-2 +kerning first=227 second=100 amount=-1 +kerning first=204 second=288 amount=-2 +kerning first=211 second=260 amount=-4 +kerning first=263 second=100 amount=-1 +kerning first=313 second=87 amount=-3 +kerning first=374 second=220 amount=-1 +kerning first=200 second=249 amount=-2 +kerning first=1107 second=1076 amount=-2 +kerning first=298 second=350 amount=-2 +kerning first=236 second=249 amount=-1 +kerning first=1060 second=1078 amount=-1 +kerning first=1060 second=1065 amount=-1 +kerning first=353 second=378 amount=-2 +kerning first=86 second=100 amount=-3 +kerning first=313 second=354 amount=-3 +kerning first=317 second=378 amount=-3 +kerning first=122 second=100 amount=-1 +kerning first=344 second=249 amount=-2 +kerning first=200 second=262 amount=-1 +kerning first=1024 second=1078 amount=-2 +kerning first=380 second=249 amount=-2 +kerning first=1100 second=1091 amount=-2 +kerning first=45 second=289 amount=-3 +kerning first=277 second=339 amount=-1 +kerning first=1046 second=1105 amount=-2 +kerning first=202 second=377 amount=-1 +kerning first=268 second=223 amount=-1 +kerning first=81 second=289 amount=-1 +kerning first=76 second=282 amount=-2 +kerning first=362 second=248 amount=-2 +kerning first=1082 second=1105 amount=-2 +kerning first=1053 second=1077 amount=-1 +kerning first=353 second=114 amount=-1 +kerning first=376 second=223 amount=-3 +kerning first=217 second=198 amount=-4 +kerning first=117 second=289 amount=-3 +kerning first=84 second=71 amount=-3 +kerning first=68 second=380 amount=-2 +kerning first=1024 second=1065 amount=-1 +kerning first=8250 second=121 amount=-3 +kerning first=250 second=279 amount=-1 +kerning first=281 second=114 amount=-1 +kerning first=222 second=289 amount=-1 +kerning first=346 second=377 amount=-1 +kerning first=258 second=289 amount=-3 +kerning first=344 second=8220 amount=-5 +kerning first=218 second=248 amount=-2 +kerning first=81 second=274 amount=-2 +kerning first=362 second=263 amount=-2 +kerning first=232 second=223 amount=-1 +kerning first=1056 second=1039 amount=-1 +kerning first=201 second=327 amount=-2 +kerning first=77 second=248 amount=-2 +kerning first=45 second=274 amount=-5 +kerning first=274 second=377 amount=-1 +kerning first=245 second=114 amount=-1 +kerning first=76 second=198 amount=-2 +kerning first=330 second=289 amount=-3 +kerning first=272 second=8220 amount=-2 +kerning first=113 second=248 amount=-1 +kerning first=113 second=263 amount=-1 +kerning first=245 second=365 amount=-1 +kerning first=236 second=8220 amount=-2 +kerning first=66 second=356 amount=-3 +kerning first=74 second=287 amount=-3 +kerning first=209 second=365 amount=-2 +kerning first=1042 second=1064 amount=-2 +kerning first=353 second=110 amount=-2 +kerning first=86 second=379 amount=-3 +kerning first=218 second=263 amount=-2 +kerning first=1042 second=1079 amount=-2 +kerning first=222 second=274 amount=-2 +kerning first=104 second=365 amount=-1 +kerning first=1078 second=1079 amount=-1 +kerning first=381 second=327 amount=-1 +kerning first=67 second=315 amount=-3 +kerning first=110 second=287 amount=-2 +kerning first=212 second=75 amount=-2 +kerning first=209 second=99 amount=-2 +kerning first=100 second=339 amount=-1 +kerning first=331 second=353 amount=-1 +kerning first=251 second=287 amount=-3 +kerning first=367 second=353 amount=-2 +kerning first=281 second=99 amount=-1 +kerning first=8250 second=204 amount=-5 +kerning first=323 second=287 amount=-3 +kerning first=77 second=263 amount=-2 +kerning first=71 second=75 amount=-1 +kerning first=250 second=237 amount=-2 +kerning first=287 second=287 amount=-2 +kerning first=338 second=334 amount=-1 +kerning first=315 second=237 amount=-2 +kerning first=302 second=334 amount=-2 +kerning first=279 second=237 amount=-2 +kerning first=122 second=104 amount=-2 +kerning first=235 second=187 amount=-2 +kerning first=262 second=44 amount=-1 +kerning first=258 second=284 amount=-3 +kerning first=250 second=234 amount=-1 +kerning first=243 second=237 amount=-1 +kerning first=262 second=223 amount=-1 +kerning first=69 second=197 amount=-2 +kerning first=374 second=334 amount=-3 +kerning first=207 second=237 amount=-1 +kerning first=84 second=244 amount=-3 +kerning first=198 second=193 amount=-2 +kerning first=1064 second=1094 amount=-1 +kerning first=1049 second=1084 amount=-1 +kerning first=120 second=244 amount=-2 +kerning first=45 second=382 amount=-5 +kerning first=121 second=44 amount=-5 +kerning first=381 second=324 amount=-1 +kerning first=210 second=197 amount=-4 +kerning first=73 second=234 amount=-2 +kerning first=66 second=237 amount=-3 +kerning first=263 second=104 amount=-2 +kerning first=226 second=44 amount=-1 +kerning first=198 second=354 amount=-1 +kerning first=227 second=104 amount=-1 +kerning first=1089 second=1084 amount=-1 +kerning first=282 second=197 amount=-2 +kerning first=214 second=227 amount=-1 +kerning first=1053 second=1084 amount=-1 +kerning first=217 second=194 amount=-4 +kerning first=258 second=277 amount=-1 +kerning first=106 second=291 amount=-3 +kerning first=354 second=197 amount=-6 +kerning first=366 second=277 amount=-2 +kerning first=209 second=111 amount=-2 +kerning first=109 second=227 amount=-1 +kerning first=1045 second=1034 amount=-1 +kerning first=330 second=277 amount=-2 +kerning first=100 second=351 amount=-1 +kerning first=73 second=227 amount=-2 +kerning first=86 second=217 amount=-1 +kerning first=194 second=334 amount=-3 +kerning first=366 second=284 amount=-1 +kerning first=1053 second=1096 amount=-1 +kerning first=187 second=74 amount=-4 +kerning first=1093 second=1104 amount=-2 +kerning first=89 second=331 amount=-3 +kerning first=1049 second=1054 amount=-1 +kerning first=76 second=194 amount=-2 +kerning first=198 second=87 amount=-1 +kerning first=266 second=334 amount=-3 +kerning first=286 second=227 amount=-1 +kerning first=250 second=227 amount=-1 +kerning first=330 second=284 amount=-2 +kerning first=198 second=364 amount=-2 +kerning first=255 second=314 amount=-2 +kerning first=193 second=264 amount=-3 +kerning first=335 second=367 amount=-1 +kerning first=323 second=8249 amount=-4 +kerning first=89 second=327 amount=-1 +kerning first=382 second=111 amount=-1 +kerning first=1024 second=1074 amount=-1 +kerning first=354 second=248 amount=-3 +kerning first=371 second=367 amount=-1 +kerning first=326 second=257 amount=-1 +kerning first=263 second=367 amount=-2 +kerning first=288 second=361 amount=-1 +kerning first=251 second=8249 amount=-2 +kerning first=97 second=121 amount=-3 +kerning first=291 second=314 amount=-3 +kerning first=362 second=257 amount=-3 +kerning first=252 second=361 amount=-1 +kerning first=287 second=8249 amount=-3 +kerning first=352 second=102 amount=-3 +kerning first=281 second=111 amount=-1 +kerning first=337 second=187 amount=-2 +kerning first=254 second=257 amount=-1 +kerning first=254 second=254 amount=-1 +kerning first=304 second=378 amount=-1 +kerning first=266 second=327 amount=-3 +kerning first=205 second=351 amount=-2 +kerning first=363 second=314 amount=-2 +kerning first=227 second=367 amount=-1 +kerning first=290 second=254 amount=-1 +kerning first=324 second=361 amount=-1 +kerning first=202 second=315 amount=-2 +kerning first=346 second=114 amount=-2 +kerning first=313 second=351 amount=-1 +kerning first=109 second=224 amount=-1 +kerning first=86 second=367 amount=-2 +kerning first=326 second=254 amount=-2 +kerning first=283 second=267 amount=-1 +kerning first=338 second=327 amount=-2 +kerning first=277 second=351 amount=-2 +kerning first=122 second=367 amount=-2 +kerning first=110 second=8249 amount=-3 +kerning first=374 second=327 amount=-1 +kerning first=1056 second=1051 amount=-2 +kerning first=317 second=374 amount=-3 +kerning first=214 second=224 amount=-1 +kerning first=310 second=114 amount=1 +kerning first=274 second=117 amount=-2 +kerning first=344 second=261 amount=-2 +kerning first=382 second=117 amount=-2 +kerning first=380 second=261 amount=-1 +kerning first=369 second=244 amount=-1 +kerning first=346 second=117 amount=-1 +kerning first=371 second=104 amount=-1 +kerning first=72 second=171 amount=-4 +kerning first=1058 second=1114 amount=-2 +kerning first=290 second=250 amount=-1 +kerning first=346 second=121 amount=-2 +kerning first=266 second=338 amount=-3 +kerning first=1049 second=1057 amount=-1 +kerning first=200 second=261 amount=-1 +kerning first=254 second=250 amount=-1 +kerning first=313 second=344 amount=-2 +kerning first=236 second=261 amount=-2 +kerning first=8217 second=339 amount=-3 +kerning first=362 second=250 amount=-1 +kerning first=111 second=361 amount=-1 +kerning first=86 second=101 amount=-3 +kerning first=351 second=237 amount=-2 +kerning first=272 second=261 amount=-1 +kerning first=326 second=250 amount=-1 +kerning first=75 second=361 amount=-3 +kerning first=1045 second=1031 amount=-1 +kerning first=122 second=101 amount=-1 +kerning first=378 second=97 amount=-1 +kerning first=338 second=331 amount=-1 +kerning first=302 second=337 amount=-2 +kerning first=1071 second=1088 amount=-1 +kerning first=227 second=101 amount=-1 +kerning first=8217 second=79 amount=-2 +kerning first=279 second=240 amount=-1 +kerning first=230 second=331 amount=-2 +kerning first=266 second=337 amount=-2 +kerning first=1057 second=1107 amount=-1 +kerning first=263 second=101 amount=-1 +kerning first=1056 second=1041 amount=-1 +kerning first=266 second=331 amount=-1 +kerning first=230 second=337 amount=-1 +kerning first=210 second=200 amount=-2 +kerning first=121 second=108 amount=-2 +kerning first=97 second=117 amount=-1 +kerning first=323 second=290 amount=-2 +kerning first=371 second=101 amount=-3 +kerning first=202 second=117 amount=-2 +kerning first=69 second=200 amount=-2 +kerning first=374 second=337 amount=-3 +kerning first=288 second=98 amount=-1 +kerning first=374 second=330 amount=-1 +kerning first=1042 second=1067 amount=-2 +kerning first=252 second=98 amount=-2 +kerning first=66 second=240 amount=-1 +kerning first=1045 second=1037 amount=-1 +kerning first=69 second=207 amount=-2 +kerning first=113 second=251 amount=-2 +kerning first=324 second=98 amount=-2 +kerning first=290 second=323 amount=-1 +kerning first=229 second=271 amount=-1 +kerning first=338 second=330 amount=-2 +kerning first=111 second=98 amount=-1 +kerning first=207 second=240 amount=-2 +kerning first=218 second=251 amount=-1 +kerning first=221 second=214 amount=-3 +kerning first=75 second=98 amount=-1 +kerning first=89 second=8249 amount=-5 +kerning first=8216 second=279 amount=-3 +kerning first=102 second=240 amount=-1 +kerning first=382 second=380 amount=-2 +kerning first=79 second=194 amount=-4 +kerning first=290 second=251 amount=-1 +kerning first=74 second=290 amount=-2 +kerning first=254 second=251 amount=-1 +kerning first=282 second=201 amount=-2 +kerning first=103 second=311 amount=-2 +kerning first=362 second=251 amount=-1 +kerning first=1045 second=1030 amount=-1 +kerning first=89 second=71 amount=-3 +kerning first=67 second=311 amount=-1 +kerning first=326 second=251 amount=-1 +kerning first=216 second=90 amount=-2 +kerning first=210 second=201 amount=-2 +kerning first=194 second=71 amount=-3 +kerning first=377 second=298 amount=-1 +kerning first=288 second=90 amount=-2 +kerning first=334 second=304 amount=-2 +kerning first=210 second=207 amount=-2 +kerning first=69 second=201 amount=-2 +kerning first=266 second=330 amount=-3 +kerning first=203 second=220 amount=-2 +kerning first=262 second=304 amount=-3 +kerning first=282 second=207 amount=-2 +kerning first=68 second=368 amount=-1 +kerning first=354 second=200 amount=-1 +kerning first=8216 second=273 amount=-3 +kerning first=305 second=291 amount=-2 +kerning first=80 second=221 amount=-1 +kerning first=317 second=368 amount=-3 +kerning first=269 second=291 amount=-3 +kerning first=201 second=324 amount=-1 +kerning first=282 second=200 amount=-2 +kerning first=352 second=311 amount=-2 +kerning first=233 second=291 amount=-3 +kerning first=202 second=381 amount=-1 +kerning first=1089 second=1081 amount=-1 +kerning first=316 second=311 amount=-1 +kerning first=197 second=291 amount=-3 +kerning first=203 second=213 amount=-1 +kerning first=302 second=71 amount=-2 +kerning first=234 second=97 amount=-2 +kerning first=187 second=77 amount=-5 +kerning first=280 second=311 amount=-1 +kerning first=194 second=337 amount=-1 +kerning first=274 second=381 amount=-1 +kerning first=266 second=71 amount=-3 +kerning first=202 second=212 amount=-1 +kerning first=244 second=311 amount=-1 +kerning first=379 second=187 amount=-1 +kerning first=374 second=71 amount=-3 +kerning first=313 second=84 amount=-3 +kerning first=89 second=337 amount=-3 +kerning first=346 second=381 amount=-1 +kerning first=81 second=278 amount=-2 +kerning first=198 second=97 amount=-1 +kerning first=69 second=203 amount=-2 +kerning first=222 second=278 amount=-2 +kerning first=245 second=375 amount=-3 +kerning first=218 second=253 amount=-1 +kerning first=209 second=375 amount=-2 +kerning first=8250 second=117 amount=-1 +kerning first=199 second=193 amount=-3 +kerning first=254 second=253 amount=-3 +kerning first=221 second=218 amount=-1 +kerning first=97 second=120 amount=-1 +kerning first=104 second=375 amount=-2 +kerning first=1024 second=1075 amount=-1 +kerning first=207 second=243 amount=-2 +kerning first=89 second=70 amount=-1 +kerning first=326 second=253 amount=-2 +kerning first=371 second=103 amount=-1 +kerning first=8216 second=275 amount=-3 +kerning first=193 second=268 amount=-3 +kerning first=353 second=375 amount=-3 +kerning first=335 second=103 amount=-2 +kerning first=313 second=78 amount=-2 +kerning first=279 second=243 amount=-1 +kerning first=1071 second=1085 amount=-1 +kerning first=317 second=375 amount=-3 +kerning first=67 second=45 amount=-4 +kerning first=267 second=103 amount=-3 +kerning first=1049 second=1060 amount=-1 +kerning first=379 second=193 amount=-1 +kerning first=281 second=375 amount=-2 +kerning first=1100 second=1095 amount=-2 +kerning first=266 second=70 amount=-3 +kerning first=1064 second=1095 amount=-1 +kerning first=382 second=120 amount=-1 +kerning first=338 second=68 amount=-2 +kerning first=1056 second=1045 amount=-1 +kerning first=354 second=203 amount=-1 +kerning first=374 second=68 amount=-1 +kerning first=88 second=268 amount=-3 +kerning first=346 second=118 amount=-3 +kerning first=334 second=310 amount=-2 +kerning first=282 second=203 amount=-2 +kerning first=310 second=118 amount=-3 +kerning first=202 second=120 amount=-1 +kerning first=354 second=201 amount=-1 +kerning first=262 second=310 amount=-3 +kerning first=338 second=70 amount=-2 +kerning first=77 second=253 amount=-2 +kerning first=210 second=203 amount=-2 +kerning first=382 second=118 amount=-2 +kerning first=274 second=120 amount=-1 +kerning first=374 second=70 amount=-1 +kerning first=113 second=253 amount=-1 +kerning first=202 second=118 amount=-1 +kerning first=353 second=105 amount=-2 +kerning first=120 second=245 amount=-2 +kerning first=353 second=108 amount=-2 +kerning first=45 second=280 amount=-5 +kerning first=211 second=270 amount=-2 +kerning first=84 second=245 amount=-3 +kerning first=8250 second=377 amount=-4 +kerning first=274 second=118 amount=-1 +kerning first=81 second=280 amount=-2 +kerning first=103 second=305 amount=-1 +kerning first=281 second=105 amount=-2 +kerning first=67 second=305 amount=-1 +kerning first=317 second=105 amount=-2 +kerning first=202 second=73 amount=-2 +kerning first=208 second=305 amount=-1 +kerning first=1075 second=1108 amount=-1 +kerning first=209 second=105 amount=-1 +kerning first=369 second=241 amount=-1 +kerning first=222 second=280 amount=-2 +kerning first=245 second=105 amount=-1 +kerning first=261 second=245 amount=-1 +kerning first=97 second=118 amount=-3 +kerning first=1089 second=1083 amount=-1 +kerning first=117 second=283 amount=-1 +kerning first=280 second=305 amount=-1 +kerning first=104 second=105 amount=-1 +kerning first=225 second=245 amount=-1 +kerning first=244 second=305 amount=-1 +kerning first=374 second=65 amount=-6 +kerning first=200 second=204 amount=-2 +kerning first=201 second=318 amount=-1 +kerning first=1078 second=1073 amount=-1 +kerning first=261 second=241 amount=-1 +kerning first=366 second=283 amount=-2 +kerning first=352 second=305 amount=-3 +kerning first=225 second=241 amount=-1 +kerning first=330 second=283 amount=-2 +kerning first=316 second=305 amount=-1 +kerning first=68 second=105 amount=-1 +kerning first=333 second=241 amount=-1 +kerning first=376 second=228 amount=-4 +kerning first=264 second=334 amount=-3 +kerning first=104 second=108 amount=-1 +kerning first=356 second=335 amount=-3 +kerning first=86 second=370 amount=-1 +kerning first=258 second=283 amount=-1 +kerning first=1042 second=1070 amount=-2 +kerning first=245 second=108 amount=-2 +kerning first=84 second=241 amount=-3 +kerning first=304 second=228 amount=-2 +kerning first=8222 second=305 amount=-1 +kerning first=107 second=335 amount=-3 +kerning first=268 second=228 amount=-2 +kerning first=317 second=108 amount=-2 +kerning first=374 second=331 amount=-3 +kerning first=232 second=228 amount=-2 +kerning first=281 second=108 amount=-3 +kerning first=120 second=241 amount=-1 +kerning first=200 second=256 amount=-2 +kerning first=365 second=287 amount=-3 +kerning first=258 second=281 amount=-1 +kerning first=284 second=66 amount=-1 +kerning first=122 second=107 amount=-2 +kerning first=236 second=8249 amount=-3 +kerning first=100 second=347 amount=-1 +kerning first=263 second=107 amount=-2 +kerning first=73 second=231 amount=-2 +kerning first=212 second=66 amount=-2 +kerning first=227 second=107 amount=-1 +kerning first=366 second=281 amount=-2 +kerning first=1064 second=1097 amount=-1 +kerning first=380 second=255 amount=-2 +kerning first=117 second=281 amount=-1 +kerning first=1056 second=1047 amount=-1 +kerning first=272 second=256 amount=-4 +kerning first=344 second=255 amount=-3 +kerning first=250 second=231 amount=-1 +kerning first=356 second=66 amount=-1 +kerning first=1078 second=1072 amount=-1 +kerning first=233 second=8250 amount=-2 +kerning first=1100 second=1098 amount=-1 +kerning first=281 second=371 amount=-2 +kerning first=77 second=257 amount=-2 +kerning first=203 second=216 amount=-1 +kerning first=194 second=45 amount=-4 +kerning first=1064 second=1098 amount=-1 +kerning first=205 second=81 amount=-2 +kerning first=113 second=257 amount=-2 +kerning first=236 second=255 amount=-3 +kerning first=194 second=67 amount=-3 +kerning first=313 second=81 amount=-1 +kerning first=353 second=371 amount=-1 +kerning first=264 second=205 amount=-3 +kerning first=89 second=67 amount=-3 +kerning first=335 second=107 amount=-1 +kerning first=377 second=8250 amount=-1 +kerning first=356 second=332 amount=-3 +kerning first=104 second=371 amount=-1 +kerning first=313 second=347 amount=-1 +kerning first=8250 second=115 amount=-1 +kerning first=277 second=347 amount=-2 +kerning first=84 second=242 amount=-3 +kerning first=241 second=347 amount=-1 +kerning first=290 second=221 amount=-3 +kerning first=371 second=107 amount=-1 +kerning first=272 second=259 amount=-1 +kerning first=245 second=371 amount=-1 +kerning first=87 second=205 amount=-1 +kerning first=205 second=347 amount=-2 +kerning first=89 second=68 amount=-1 +kerning first=89 second=333 amount=-3 +kerning first=282 second=204 amount=-2 +kerning first=120 second=242 amount=-2 +kerning first=194 second=333 amount=-1 +kerning first=221 second=217 amount=-1 +kerning first=261 second=242 amount=-1 +kerning first=232 second=229 amount=-2 +kerning first=313 second=201 amount=-2 +kerning first=122 second=246 amount=-1 +kerning first=268 second=229 amount=-2 +kerning first=266 second=68 amount=-3 +kerning first=374 second=67 amount=-3 +kerning first=122 second=106 amount=-2 +kerning first=1048 second=1080 amount=-1 +kerning first=338 second=67 amount=-1 +kerning first=8250 second=380 amount=-5 +kerning first=376 second=229 amount=-5 +kerning first=369 second=242 amount=-1 +kerning first=266 second=67 amount=-3 +kerning first=250 second=230 amount=-1 +kerning first=121 second=307 amount=-2 +kerning first=286 second=230 amount=-1 +kerning first=115 second=119 amount=-3 +kerning first=374 second=333 amount=-3 +kerning first=321 second=334 amount=-1 +kerning first=66 second=243 amount=-1 +kerning first=187 second=346 amount=-3 +kerning first=335 second=106 amount=-2 +kerning first=102 second=243 amount=-1 +kerning first=226 second=307 amount=-1 +kerning first=227 second=106 amount=-1 +kerning first=214 second=230 amount=-1 +kerning first=220 second=119 amount=-2 +kerning first=82 second=346 amount=-3 +kerning first=263 second=106 amount=-2 +kerning first=73 second=230 amount=-2 +kerning first=256 second=119 amount=-3 +kerning first=266 second=333 amount=-2 +kerning first=109 second=230 amount=-1 +kerning first=230 second=333 amount=-1 +kerning first=69 second=204 amount=-2 +kerning first=202 second=314 amount=-1 +kerning first=328 second=119 amount=-3 +kerning first=1083 second=1104 amount=-1 +kerning first=210 second=204 amount=-2 +kerning first=291 second=328 amount=-1 +kerning first=371 second=106 amount=3 +kerning first=8250 second=114 amount=-2 +kerning first=364 second=119 amount=-2 +kerning first=302 second=333 amount=-2 +kerning first=323 second=275 amount=-2 +kerning first=121 second=230 amount=-3 +kerning first=222 second=74 amount=-2 +kerning first=1045 second=1053 amount=-1 +kerning first=251 second=275 amount=-1 +kerning first=8216 second=324 amount=-1 +kerning first=257 second=100 amount=-1 +kerning first=85 second=230 amount=-3 +kerning first=330 second=74 amount=-1 +kerning first=86 second=121 amount=-3 +kerning first=366 second=74 amount=-3 +kerning first=1043 second=1105 amount=-3 +kerning first=289 second=223 amount=-1 +kerning first=74 second=275 amount=-2 +kerning first=1055 second=1102 amount=-1 +kerning first=211 second=379 amount=-2 +kerning first=80 second=100 amount=-1 +kerning first=66 second=256 amount=-5 +kerning first=111 second=249 amount=-1 +kerning first=315 second=256 amount=-2 +kerning first=259 second=45 amount=-2 +kerning first=112 second=223 amount=-1 +kerning first=200 second=211 amount=-1 +kerning first=370 second=230 amount=-3 +kerning first=253 second=223 amount=-1 +kerning first=356 second=339 amount=-3 +kerning first=71 second=318 amount=-1 +kerning first=282 second=328 amount=-1 +kerning first=217 second=223 amount=-2 +kerning first=75 second=249 amount=-3 +kerning first=71 second=107 amount=-1 +kerning first=298 second=230 amount=-2 +kerning first=1056 second=1030 amount=-1 +kerning first=206 second=268 amount=-2 +kerning first=288 second=249 amount=-1 +kerning first=334 second=230 amount=-1 +kerning first=324 second=249 amount=-1 +kerning first=344 second=211 amount=-3 +kerning first=226 second=230 amount=-1 +kerning first=8216 second=269 amount=-3 +kerning first=76 second=223 amount=-1 +kerning first=278 second=268 amount=-1 +kerning first=262 second=230 amount=-2 +kerning first=86 second=204 amount=-1 +kerning first=102 second=248 amount=-1 +kerning first=252 second=249 amount=-1 +kerning first=86 second=218 amount=-1 +kerning first=70 second=365 amount=-1 +kerning first=107 second=339 amount=-3 +kerning first=366 second=334 amount=-1 +kerning first=251 second=289 amount=-3 +kerning first=210 second=192 amount=-4 +kerning first=85 second=244 amount=-2 +kerning first=1045 second=1039 amount=-1 +kerning first=287 second=289 amount=-2 +kerning first=325 second=237 amount=-1 +kerning first=1079 second=1091 amount=-2 +kerning first=121 second=244 amount=-3 +kerning first=65 second=268 amount=-3 +kerning first=323 second=289 amount=-3 +kerning first=289 second=237 amount=-2 +kerning first=90 second=313 amount=-1 +kerning first=1071 second=1086 amount=-1 +kerning first=253 second=237 amount=-2 +kerning first=69 second=192 amount=-2 +kerning first=8220 second=366 amount=-1 +kerning first=226 second=244 amount=-1 +kerning first=217 second=237 amount=-2 +kerning first=350 second=282 amount=-3 +kerning first=262 second=244 amount=-2 +kerning first=252 second=263 amount=-1 +kerning first=8218 second=226 amount=-2 +kerning first=298 second=244 amount=-2 +kerning first=112 second=237 amount=-1 +kerning first=71 second=65 amount=-3 +kerning first=278 second=282 amount=-2 +kerning first=76 second=237 amount=-2 +kerning first=75 second=107 amount=-1 +kerning first=84 second=8249 amount=-5 +kerning first=355 second=365 amount=-1 +kerning first=75 second=263 amount=-2 +kerning first=8217 second=252 amount=-1 +kerning first=99 second=244 amount=-1 +kerning first=200 second=225 amount=-1 +kerning first=283 second=365 amount=-2 +kerning first=315 second=270 amount=-2 +kerning first=112 second=251 amount=-1 +kerning first=1116 second=1079 amount=-1 +kerning first=248 second=353 amount=-2 +kerning first=278 second=296 amount=-2 +kerning first=221 second=346 amount=-3 +kerning first=66 second=270 amount=-4 +kerning first=268 second=315 amount=-3 +kerning first=74 second=289 amount=-3 +kerning first=217 second=251 amount=-1 +kerning first=330 second=334 amount=-2 +kerning first=1044 second=1079 amount=-1 +kerning first=110 second=289 amount=-2 +kerning first=90 second=327 amount=-1 +kerning first=350 second=296 amount=-3 +kerning first=106 second=365 amount=-1 +kerning first=87 second=206 amount=-1 +kerning first=289 second=251 amount=-1 +kerning first=334 second=202 amount=-2 +kerning first=253 second=251 amount=-1 +kerning first=248 second=121 amount=-3 +kerning first=242 second=254 amount=-1 +kerning first=106 second=351 amount=-2 +kerning first=86 second=232 amount=-3 +kerning first=262 second=202 amount=-3 +kerning first=278 second=254 amount=-1 +kerning first=252 second=277 amount=-1 +kerning first=325 second=251 amount=-2 +kerning first=80 second=374 amount=-1 +kerning first=314 second=254 amount=-1 +kerning first=264 second=206 amount=-3 +kerning first=107 second=121 amount=-1 +kerning first=65 second=254 amount=-2 +kerning first=76 second=209 amount=-2 +kerning first=336 second=206 amount=-2 +kerning first=71 second=381 amount=-2 +kerning first=101 second=254 amount=-2 +kerning first=75 second=277 amount=-2 +kerning first=70 second=351 amount=-2 +kerning first=1078 second=1077 amount=-2 +kerning first=1024 second=1103 amount=-2 +kerning first=268 second=69 amount=-3 +kerning first=364 second=214 amount=-1 +kerning first=246 second=117 amount=-1 +kerning first=1043 second=1119 amount=-2 +kerning first=248 second=367 amount=-1 +kerning first=201 second=199 amount=-1 +kerning first=365 second=114 amount=-1 +kerning first=370 second=244 amount=-2 +kerning first=212 second=381 amount=-2 +kerning first=1079 second=1119 amount=-1 +kerning first=110 second=261 amount=-1 +kerning first=284 second=367 amount=-1 +kerning first=356 second=79 amount=-3 +kerning first=282 second=117 amount=-2 +kerning first=80 second=72 amount=-1 +kerning first=284 second=381 amount=-2 +kerning first=313 second=76 amount=-2 +kerning first=220 second=105 amount=-2 +kerning first=8249 second=356 amount=-3 +kerning first=221 second=72 amount=-1 +kerning first=8222 second=363 amount=-1 +kerning first=71 second=367 amount=-1 +kerning first=221 second=114 amount=-1 +kerning first=354 second=117 amount=-2 +kerning first=356 second=381 amount=-3 +kerning first=107 second=367 amount=-1 +kerning first=354 second=192 amount=-6 +kerning first=1105 second=1096 amount=-1 +kerning first=356 second=121 amount=-3 +kerning first=304 second=83 amount=-2 +kerning first=355 second=351 amount=-1 +kerning first=282 second=192 amount=-2 +kerning first=75 second=291 amount=-2 +kerning first=283 second=337 amount=-1 +kerning first=262 second=216 amount=-3 +kerning first=376 second=83 amount=-3 +kerning first=314 second=240 amount=-1 +kerning first=298 second=216 amount=-2 +kerning first=206 second=240 amount=-2 +kerning first=90 second=196 amount=-1 +kerning first=212 second=219 amount=-1 +kerning first=1096 second=1089 amount=-1 +kerning first=201 second=171 amount=-2 +kerning first=85 second=216 amount=-1 +kerning first=69 second=117 amount=-2 +kerning first=251 second=261 amount=-1 +kerning first=287 second=261 amount=-3 +kerning first=380 second=382 amount=-2 +kerning first=350 second=240 amount=-1 +kerning first=8222 second=89 amount=-6 +kerning first=323 second=261 amount=-2 +kerning first=284 second=107 amount=-1 +kerning first=105 second=117 amount=-1 +kerning first=248 second=107 amount=-1 +kerning first=1045 second=1095 amount=-2 +kerning first=1105 second=1082 amount=-1 +kerning first=381 second=171 amount=-3 +kerning first=74 second=267 amount=-2 +kerning first=228 second=115 amount=-1 +kerning first=220 second=229 amount=-3 +kerning first=101 second=240 amount=-1 +kerning first=80 second=86 amount=-1 +kerning first=252 second=307 amount=-2 +kerning first=350 second=254 amount=-2 +kerning first=244 second=44 amount=-3 +kerning first=365 second=100 amount=-1 +kerning first=1051 second=1060 amount=-1 +kerning first=65 second=240 amount=-1 +kerning first=345 second=171 amount=-1 +kerning first=187 second=350 amount=-3 +kerning first=346 second=201 amount=-3 +kerning first=277 second=252 amount=-2 +kerning first=261 second=228 amount=-1 +kerning first=313 second=252 amount=-2 +kerning first=82 second=350 amount=-3 +kerning first=213 second=221 amount=-2 +kerning first=274 second=201 amount=-2 +kerning first=1056 second=1050 amount=-1 +kerning first=8222 second=377 amount=-1 +kerning first=216 second=207 amount=-2 +kerning first=371 second=246 amount=-3 +kerning first=202 second=201 amount=-2 +kerning first=8218 second=254 amount=-1 +kerning first=100 second=252 amount=-1 +kerning first=111 second=305 amount=-1 +kerning first=381 second=227 amount=-1 +kerning first=365 second=44 amount=-2 +kerning first=236 second=378 amount=-1 +kerning first=345 second=227 amount=-1 +kerning first=205 second=252 amount=-1 +kerning first=216 second=305 amount=-1 +kerning first=263 second=246 amount=-1 +kerning first=1059 second=1101 amount=-3 +kerning first=1091 second=1076 amount=-3 +kerning first=241 second=252 amount=-1 +kerning first=1057 second=1104 amount=-1 +kerning first=227 second=246 amount=-1 +kerning first=267 second=271 amount=-1 +kerning first=86 second=260 amount=-6 +kerning first=200 second=382 amount=-2 +kerning first=101 second=226 amount=-2 +kerning first=303 second=271 amount=-3 +kerning first=201 second=356 amount=-1 +kerning first=252 second=305 amount=-1 +kerning first=282 second=103 amount=-3 +kerning first=324 second=291 amount=-2 +kerning first=216 second=45 amount=-1 +kerning first=272 second=382 amount=-2 +kerning first=86 second=246 amount=-3 +kerning first=206 second=226 amount=-2 +kerning first=375 second=271 amount=-3 +kerning first=324 second=305 amount=-1 +kerning first=210 second=103 amount=-1 +kerning first=252 second=291 amount=-3 +kerning first=106 second=337 amount=-1 +kerning first=242 second=226 amount=-1 +kerning first=288 second=45 amount=-3 +kerning first=1101 second=1107 amount=-1 +kerning first=278 second=107 amount=-1 +kerning first=216 second=291 amount=-1 +kerning first=70 second=337 amount=-1 +kerning first=278 second=226 amount=-1 +kerning first=252 second=45 amount=-2 +kerning first=288 second=207 amount=-1 +kerning first=105 second=103 amount=-3 +kerning first=314 second=226 amount=-2 +kerning first=187 second=80 amount=-5 +kerning first=69 second=103 amount=-3 +kerning first=79 second=84 amount=-2 +kerning first=350 second=226 amount=-2 +kerning first=324 second=45 amount=-3 +kerning first=382 second=365 amount=-2 +kerning first=1087 second=1089 amount=-1 +kerning first=216 second=193 amount=-4 +kerning first=313 second=336 amount=-1 +kerning first=245 second=118 amount=-2 +kerning first=1098 second=1103 amount=-2 +kerning first=267 second=109 amount=-2 +kerning first=210 second=89 amount=-2 +kerning first=375 second=109 amount=-2 +kerning first=1045 second=1052 amount=-1 +kerning first=256 second=84 amount=-6 +kerning first=381 second=213 amount=-1 +kerning first=339 second=109 amount=-2 +kerning first=227 second=115 amount=-1 +kerning first=8222 second=117 amount=-1 +kerning first=101 second=8250 amount=-2 +kerning first=90 second=109 amount=-1 +kerning first=86 second=115 amount=-3 +kerning first=278 second=212 amount=-1 +kerning first=8216 second=194 amount=-8 +kerning first=122 second=115 amount=-2 +kerning first=187 second=90 amount=-4 +kerning first=354 second=103 amount=-4 +kerning first=257 second=44 amount=-1 +kerning first=335 second=115 amount=-2 +kerning first=223 second=104 amount=-1 +kerning first=278 second=78 amount=-2 +kerning first=221 second=44 amount=-5 +kerning first=282 second=364 amount=-2 +kerning first=371 second=115 amount=-2 +kerning first=187 second=104 amount=-1 +kerning first=79 second=70 amount=-2 +kerning first=118 second=104 amount=-2 +kerning first=286 second=117 amount=-1 +kerning first=371 second=232 amount=-3 +kerning first=82 second=104 amount=-3 +kerning first=80 second=44 amount=-4 +kerning first=201 second=213 amount=-1 +kerning first=282 second=89 amount=-1 +kerning first=367 second=104 amount=-2 +kerning first=122 second=232 amount=-1 +kerning first=263 second=232 amount=-1 +kerning first=1027 second=1085 amount=-2 +kerning first=227 second=232 amount=-1 +kerning first=259 second=104 amount=-1 +kerning first=266 second=325 amount=-3 +kerning first=256 second=98 amount=-2 +kerning first=369 second=8249 amount=-2 +kerning first=216 second=73 amount=-2 +kerning first=210 second=75 amount=-2 +kerning first=367 second=118 amount=-3 +kerning first=338 second=325 amount=-2 +kerning first=328 second=98 amount=-2 +kerning first=288 second=73 amount=-1 +kerning first=8222 second=307 amount=-1 +kerning first=218 second=103 amount=-4 +kerning first=69 second=75 amount=-2 +kerning first=269 second=303 amount=-2 +kerning first=259 second=118 amount=-3 +kerning first=365 second=252 amount=-1 +kerning first=354 second=75 amount=-1 +kerning first=75 second=235 amount=-2 +kerning first=305 second=303 amount=-1 +kerning first=223 second=118 amount=-2 +kerning first=307 second=120 amount=-1 +kerning first=89 second=283 amount=-3 +kerning first=366 second=216 amount=-1 +kerning first=363 second=250 amount=-1 +kerning first=313 second=280 amount=-2 +kerning first=331 second=118 amount=-3 +kerning first=282 second=75 amount=-2 +kerning first=274 second=354 amount=-1 +kerning first=233 second=303 amount=-2 +kerning first=115 second=98 amount=-2 +kerning first=295 second=118 amount=-3 +kerning first=201 second=328 amount=-1 +kerning first=82 second=118 amount=-3 +kerning first=302 second=283 amount=-2 +kerning first=1117 second=1108 amount=-1 +kerning first=284 second=196 amount=-3 +kerning first=266 second=283 amount=-2 +kerning first=187 second=118 amount=-3 +kerning first=381 second=328 amount=-1 +kerning first=1091 second=1104 amount=-2 +kerning first=1070 second=1070 amount=-1 +kerning first=356 second=196 amount=-6 +kerning first=202 second=45 amount=-2 +kerning first=118 second=118 amount=-1 +kerning first=194 second=283 amount=-1 +kerning first=1055 second=1104 amount=-1 +kerning first=201 second=370 amount=-2 +kerning first=369 second=311 amount=-2 +kerning first=71 second=196 amount=-3 +kerning first=381 second=241 amount=-1 +kerning first=374 second=283 amount=-3 +kerning first=212 second=196 amount=-4 +kerning first=103 second=314 amount=-3 +kerning first=205 second=266 amount=-2 +kerning first=115 second=112 amount=-3 +kerning first=75 second=87 amount=-2 +kerning first=370 second=286 amount=-1 +kerning first=338 second=311 amount=-1 +kerning first=222 second=362 amount=-1 +kerning first=79 second=112 amount=-1 +kerning first=1070 second=1042 amount=-1 +kerning first=262 second=286 amount=-3 +kerning first=258 second=362 amount=-3 +kerning first=1055 second=1090 amount=-1 +kerning first=298 second=286 amount=-2 +kerning first=266 second=311 amount=-1 +kerning first=1092 second=1095 amount=-1 +kerning first=356 second=210 amount=-3 +kerning first=1036 second=1059 amount=-3 +kerning first=280 second=314 amount=-1 +kerning first=120 second=8221 amount=-2 +kerning first=377 second=331 amount=-1 +kerning first=65 second=365 amount=-3 +kerning first=244 second=314 amount=-2 +kerning first=45 second=362 amount=-4 +kerning first=86 second=85 amount=-1 +kerning first=85 second=286 amount=-1 +kerning first=352 second=314 amount=-2 +kerning first=81 second=362 amount=-1 +kerning first=305 second=331 amount=-1 +kerning first=316 second=314 amount=-2 +kerning first=339 second=273 amount=-1 +kerning first=67 second=314 amount=-1 +kerning first=379 second=270 amount=-1 +kerning first=381 second=255 amount=-3 +kerning first=65 second=112 amount=-3 +kerning first=233 second=331 amount=-2 +kerning first=195 second=81 amount=-3 +kerning first=71 second=224 amount=-1 +kerning first=252 second=235 amount=-1 +kerning first=333 second=8221 amount=-2 +kerning first=269 second=331 amount=-2 +kerning first=328 second=369 amount=-1 +kerning first=225 second=8221 amount=-3 +kerning first=364 second=112 amount=-2 +kerning first=261 second=8221 amount=-3 +kerning first=328 second=112 amount=-1 +kerning first=195 second=67 amount=-3 +kerning first=233 second=345 amount=-1 +kerning first=288 second=221 amount=-3 +kerning first=107 second=224 amount=-2 +kerning first=1070 second=1056 amount=-1 +kerning first=1059 second=1087 amount=-4 +kerning first=381 second=269 amount=-1 +kerning first=1050 second=1058 amount=-3 +kerning first=269 second=345 amount=-1 +kerning first=248 second=224 amount=-1 +kerning first=266 second=363 amount=-2 +kerning first=90 second=67 amount=-1 +kerning first=216 second=221 amount=-2 +kerning first=368 second=256 amount=-4 +kerning first=212 second=224 amount=-1 +kerning first=369 second=8221 amount=-3 +kerning first=220 second=112 amount=-2 +kerning first=75 second=221 amount=-2 +kerning first=334 second=229 amount=-1 +kerning first=313 second=266 amount=-1 +kerning first=284 second=224 amount=-1 +kerning first=81 second=205 amount=-2 +kerning first=86 second=302 amount=-1 +kerning first=194 second=255 amount=-3 +kerning first=283 second=250 amount=-2 +kerning first=187 second=116 amount=-1 +kerning first=252 second=347 amount=-2 +kerning first=106 second=281 amount=-1 +kerning first=356 second=224 amount=-4 +kerning first=89 second=255 amount=-3 +kerning first=355 second=250 amount=-1 +kerning first=111 second=378 amount=-2 +kerning first=380 second=326 amount=-2 +kerning first=111 second=347 amount=-2 +kerning first=1042 second=1033 amount=-1 +kerning first=8217 second=353 amount=-2 +kerning first=105 second=307 amount=-1 +kerning first=75 second=347 amount=-1 +kerning first=187 second=204 amount=-5 +kerning first=333 second=371 amount=-1 +kerning first=70 second=250 amount=-1 +kerning first=67 second=328 amount=-1 +kerning first=369 second=371 amount=-1 +kerning first=363 second=248 amount=-1 +kerning first=234 second=101 amount=-1 +kerning first=200 second=326 amount=-1 +kerning first=379 second=352 amount=-1 +kerning first=246 second=307 amount=-1 +kerning first=236 second=326 amount=-2 +kerning first=316 second=328 amount=-1 +kerning first=120 second=371 amount=-3 +kerning first=1057 second=1097 amount=-1 +kerning first=278 second=366 amount=-2 +kerning first=280 second=328 amount=-1 +kerning first=274 second=257 amount=-1 +kerning first=209 second=333 amount=-2 +kerning first=72 second=212 amount=-2 +kerning first=244 second=328 amount=-1 +kerning first=378 second=101 amount=-1 +kerning first=326 second=8221 amount=-4 +kerning first=261 second=371 amount=-1 +kerning first=202 second=257 amount=-1 +kerning first=281 second=333 amount=-1 +kerning first=252 second=378 amount=-2 +kerning first=1030 second=1073 amount=-1 +kerning first=284 second=8220 amount=-1 +kerning first=216 second=378 amount=-2 +kerning first=97 second=257 amount=-1 +kerning first=248 second=8220 amount=-2 +kerning first=324 second=378 amount=-1 +kerning first=1056 second=1092 amount=-1 +kerning first=350 second=366 amount=-3 +kerning first=324 second=347 amount=-1 +kerning first=352 second=328 amount=-1 +kerning first=194 second=252 amount=-3 +kerning first=364 second=288 amount=-1 +kerning first=107 second=8220 amount=-2 +kerning first=286 second=217 amount=-1 +kerning first=1048 second=1090 amount=-1 +kerning first=121 second=113 amount=-3 +kerning first=195 second=243 amount=-1 +kerning first=314 second=106 amount=-3 +kerning first=85 second=113 amount=-2 +kerning first=231 second=243 amount=-1 +kerning first=350 second=106 amount=-1 +kerning first=267 second=243 amount=-1 +kerning first=315 second=80 amount=-2 +kerning first=220 second=288 amount=-1 +kerning first=68 second=87 amount=-2 +kerning first=298 second=113 amount=-2 +kerning first=65 second=366 amount=-3 +kerning first=121 second=345 amount=-1 +kerning first=262 second=113 amount=-2 +kerning first=226 second=113 amount=-1 +kerning first=256 second=288 amount=-3 +kerning first=90 second=243 amount=-1 +kerning first=8220 second=289 amount=-4 +kerning first=313 second=210 amount=-1 +kerning first=262 second=345 amount=-1 +kerning first=260 second=45 amount=-4 +kerning first=8217 second=121 amount=-1 +kerning first=221 second=262 amount=-3 +kerning first=350 second=198 amount=-4 +kerning first=205 second=210 amount=-2 +kerning first=66 second=368 amount=-3 +kerning first=235 second=120 amount=-2 +kerning first=370 second=345 amount=-1 +kerning first=303 second=243 amount=-3 +kerning first=283 second=281 amount=-1 +kerning first=302 second=255 amount=-2 +kerning first=315 second=368 amount=-3 +kerning first=1101 second=1113 amount=-2 +kerning first=8222 second=237 amount=-1 +kerning first=339 second=243 amount=-1 +kerning first=266 second=255 amount=-1 +kerning first=375 second=243 amount=-3 +kerning first=214 second=217 amount=-1 +kerning first=230 second=255 amount=-2 +kerning first=1039 second=1094 amount=-1 +kerning first=8250 second=296 amount=-5 +kerning first=97 second=229 amount=-1 +kerning first=374 second=227 amount=-5 +kerning first=79 second=366 amount=-1 +kerning first=89 second=196 amount=-6 +kerning first=338 second=227 amount=-1 +kerning first=80 second=234 amount=-1 +kerning first=1030 second=1101 amount=-1 +kerning first=233 second=99 amount=-1 +kerning first=302 second=227 amount=-2 +kerning first=213 second=219 amount=-1 +kerning first=197 second=99 amount=-1 +kerning first=266 second=227 amount=-2 +kerning first=200 second=354 amount=-1 +kerning first=1058 second=1099 amount=-2 +kerning first=264 second=44 amount=-1 +kerning first=235 second=324 amount=-2 +kerning first=90 second=289 amount=-3 +kerning first=228 second=44 amount=-1 +kerning first=199 second=324 amount=-1 +kerning first=269 second=99 amount=-1 +kerning first=272 second=354 amount=-2 +kerning first=336 second=44 amount=-3 +kerning first=202 second=229 amount=-1 +kerning first=117 second=233 amount=-1 +kerning first=111 second=104 amount=-1 +kerning first=75 second=104 amount=-1 +kerning first=344 second=354 amount=-3 +kerning first=362 second=267 amount=-2 +kerning first=338 second=197 amount=-2 +kerning first=99 second=335 amount=-1 +kerning first=101 second=106 amount=-2 +kerning first=365 second=234 amount=-1 +kerning first=67 second=356 amount=-1 +kerning first=346 second=229 amount=-2 +kerning first=84 second=111 amount=-3 +kerning first=382 second=229 amount=-1 +kerning first=258 second=233 amount=-1 +kerning first=242 second=106 amount=-2 +kerning first=245 second=44 amount=-3 +kerning first=338 second=109 amount=-1 +kerning first=221 second=234 amount=-3 +kerning first=330 second=233 amount=-2 +kerning first=354 second=279 amount=-3 +kerning first=334 second=317 amount=-2 +kerning first=1052 second=1060 amount=-1 +kerning first=111 second=353 amount=-2 +kerning first=317 second=87 amount=-3 +kerning first=261 second=171 amount=-2 +kerning first=89 second=227 amount=-5 +kerning first=67 second=110 amount=-1 +kerning first=317 second=361 amount=-2 +kerning first=115 second=316 amount=-2 +kerning first=352 second=82 amount=-3 +kerning first=103 second=110 amount=-1 +kerning first=281 second=361 amount=-2 +kerning first=77 second=267 amount=-2 +kerning first=1056 second=1064 amount=-1 +kerning first=1101 second=1085 amount=-1 +kerning first=369 second=111 amount=-1 +kerning first=353 second=361 amount=-1 +kerning first=256 second=316 amount=-2 +kerning first=244 second=110 amount=-1 +kerning first=321 second=212 amount=-1 +kerning first=208 second=82 amount=-2 +kerning first=120 second=111 amount=-2 +kerning first=382 second=257 amount=-1 +kerning first=280 second=110 amount=-1 +kerning first=187 second=364 amount=-4 +kerning first=328 second=316 amount=-1 +kerning first=316 second=110 amount=-1 +kerning first=200 second=66 amount=-2 +kerning first=113 second=267 amount=-1 +kerning first=280 second=82 amount=-2 +kerning first=225 second=111 amount=-1 +kerning first=310 second=257 amount=-1 +kerning first=219 second=65 amount=-4 +kerning first=352 second=110 amount=-1 +kerning first=82 second=364 amount=-3 +kerning first=231 second=271 amount=-1 +kerning first=261 second=111 amount=-1 +kerning first=346 second=257 amount=-2 +kerning first=317 second=45 amount=-1 +kerning first=87 second=44 amount=-5 +kerning first=67 second=82 amount=-3 +kerning first=1065 second=1057 amount=-1 +kerning first=352 second=72 amount=-3 +kerning first=267 second=365 amount=-2 +kerning first=288 second=104 amount=-1 +kerning first=252 second=104 amount=-2 +kerning first=272 second=66 amount=-2 +kerning first=219 second=105 amount=-2 +kerning first=104 second=361 amount=-1 +kerning first=76 second=89 amount=-3 +kerning first=86 second=274 amount=-1 +kerning first=209 second=361 amount=-2 +kerning first=268 second=97 amount=-2 +kerning first=337 second=46 amount=-3 +kerning first=208 second=304 amount=-2 +kerning first=304 second=97 amount=-2 +kerning first=272 second=122 amount=-2 +kerning first=79 second=77 amount=-2 +kerning first=236 second=122 amount=-1 +kerning first=377 second=71 amount=-1 +kerning first=313 second=121 amount=-3 +kerning first=264 second=72 amount=-3 +kerning first=287 second=102 amount=-1 +kerning first=232 second=97 amount=-2 +kerning first=200 second=122 amount=-2 +kerning first=197 second=71 amount=-3 +kerning first=277 second=121 amount=-2 +kerning first=337 second=225 amount=-1 +kerning first=241 second=121 amount=-2 +kerning first=336 second=72 amount=-2 +kerning first=229 second=46 amount=-1 +kerning first=205 second=121 amount=-2 +kerning first=211 second=77 amount=-2 +kerning first=74 second=102 amount=-1 +kerning first=380 second=122 amount=-2 +kerning first=110 second=102 amount=-1 +kerning first=76 second=377 amount=-3 +kerning first=376 second=97 amount=-5 +kerning first=302 second=199 amount=-2 +kerning first=338 second=199 amount=-1 +kerning first=192 second=375 amount=-3 +kerning first=374 second=199 amount=-3 +kerning first=84 second=200 amount=-1 +kerning first=89 second=249 amount=-1 +kerning first=217 second=377 amount=-1 +kerning first=88 second=46 amount=-1 +kerning first=232 second=245 amount=-1 +kerning first=87 second=332 amount=-3 +kerning first=282 second=199 amount=-1 +kerning first=253 second=117 amount=-1 +kerning first=376 second=214 amount=-3 +kerning first=1050 second=1077 amount=-2 +kerning first=217 second=117 amount=-1 +kerning first=69 second=363 amount=-2 +kerning first=325 second=117 amount=-2 +kerning first=105 second=363 amount=-1 +kerning first=98 second=287 amount=-2 +kerning first=289 second=117 amount=-1 +kerning first=87 second=72 amount=-1 +kerning first=264 second=332 amount=-3 +kerning first=1024 second=1058 amount=-1 +kerning first=70 second=194 amount=-3 +kerning first=109 second=347 amount=-1 +kerning first=350 second=310 amount=-3 +kerning first=203 second=287 amount=-3 +kerning first=196 second=214 amount=-3 +kerning first=347 second=259 amount=-1 +kerning first=73 second=242 amount=-2 +kerning first=278 second=310 amount=-2 +kerning first=304 second=214 amount=-2 +kerning first=72 second=240 amount=-2 +kerning first=275 second=287 amount=-3 +kerning first=1064 second=1114 amount=-1 +kerning first=268 second=214 amount=-3 +kerning first=108 second=240 amount=-1 +kerning first=8217 second=266 amount=-2 +kerning first=347 second=287 amount=-3 +kerning first=192 second=220 amount=-3 +kerning first=315 second=284 amount=-1 +kerning first=364 second=250 amount=-1 +kerning first=311 second=287 amount=-2 +kerning first=250 second=242 amount=-1 +kerning first=1077 second=1075 amount=-1 +kerning first=207 second=284 amount=-2 +kerning first=249 second=240 amount=-1 +kerning first=311 second=259 amount=-2 +kerning first=87 second=220 amount=-1 +kerning first=66 second=197 amount=-5 +kerning first=275 second=259 amount=-2 +kerning first=378 second=375 amount=-2 +kerning first=260 second=369 amount=-3 +kerning first=336 second=304 amount=-2 +kerning first=224 second=369 amount=-1 +kerning first=86 second=330 amount=-1 +kerning first=258 second=116 amount=-1 +kerning first=264 second=304 amount=-3 +kerning first=1025 second=1081 amount=-1 +kerning first=296 second=369 amount=-2 +kerning first=98 second=259 amount=-1 +kerning first=45 second=116 amount=-1 +kerning first=83 second=369 amount=-1 +kerning first=1024 second=1030 amount=-1 +kerning first=113 second=45 amount=-2 +kerning first=302 second=335 amount=-2 +kerning first=315 second=197 amount=-2 +kerning first=113 second=119 amount=-3 +kerning first=117 second=116 amount=-1 +kerning first=87 second=304 amount=-1 +kerning first=211 second=194 amount=-4 +kerning first=1067 second=1075 amount=-1 +kerning first=218 second=119 amount=-2 +kerning first=119 second=369 amount=-1 +kerning first=221 second=203 amount=-1 +kerning first=368 second=223 amount=-2 +kerning first=1071 second=1100 amount=-1 +kerning first=1031 second=1075 amount=-1 +kerning first=254 second=119 amount=-2 +kerning first=337 second=253 amount=-3 +kerning first=1036 second=1095 amount=-3 +kerning first=225 second=228 amount=-1 +kerning first=1036 second=1105 amount=-2 +kerning first=290 second=119 amount=-1 +kerning first=326 second=119 amount=-3 +kerning first=120 second=228 amount=-2 +kerning first=313 second=311 amount=-2 +kerning first=362 second=119 amount=-2 +kerning first=1104 second=1080 amount=-1 +kerning first=234 second=375 amount=-2 +kerning first=264 second=248 amount=-2 +kerning first=84 second=228 amount=-4 +kerning first=80 second=203 amount=-1 +kerning first=232 second=273 amount=-1 +kerning first=321 second=268 amount=-1 +kerning first=192 second=248 amount=-1 +kerning first=228 second=248 amount=-1 +kerning first=291 second=8249 amount=-3 +kerning first=231 second=355 amount=-1 +kerning first=365 second=345 amount=-1 +kerning first=195 second=355 amount=-1 +kerning first=200 second=298 amount=-2 +kerning first=119 second=223 amount=-1 +kerning first=346 second=313 amount=-3 +kerning first=201 second=68 amount=-2 +kerning first=339 second=328 amount=-2 +kerning first=88 second=253 amount=-3 +kerning first=83 second=223 amount=-1 +kerning first=370 second=113 amount=-2 +kerning first=90 second=355 amount=-1 +kerning first=272 second=298 amount=-2 +kerning first=274 second=313 amount=-2 +kerning first=375 second=355 amount=-1 +kerning first=193 second=253 amount=-3 +kerning first=339 second=355 amount=-1 +kerning first=74 second=324 amount=-1 +kerning first=229 second=253 amount=-3 +kerning first=66 second=80 amount=-4 +kerning first=202 second=313 amount=-2 +kerning first=303 second=355 amount=-1 +kerning first=381 second=68 amount=-1 +kerning first=267 second=355 amount=-1 +kerning first=72 second=268 amount=-2 +kerning first=221 second=290 amount=-3 +kerning first=1078 second=1086 amount=-2 +kerning first=279 second=108 amount=-3 +kerning first=334 second=85 amount=-1 +kerning first=243 second=108 amount=-2 +kerning first=246 second=363 amount=-1 +kerning first=333 second=105 amount=-1 +kerning first=65 second=338 amount=-3 +kerning first=351 second=108 amount=-2 +kerning first=282 second=363 amount=-2 +kerning first=200 second=270 amount=-2 +kerning first=262 second=85 amount=-2 +kerning first=116 second=318 amount=-1 +kerning first=219 second=103 amount=-4 +kerning first=230 second=8217 amount=-2 +kerning first=315 second=108 amount=-2 +kerning first=221 second=286 amount=-3 +kerning first=355 second=105 amount=-1 +kerning first=84 second=315 amount=-1 +kerning first=269 second=8221 amount=-2 +kerning first=354 second=363 amount=-2 +kerning first=370 second=351 amount=-2 +kerning first=257 second=318 amount=-1 +kerning first=283 second=105 amount=-2 +kerning first=200 second=313 amount=-2 +kerning first=354 second=335 amount=-3 +kerning first=87 second=248 amount=-3 +kerning first=211 second=105 amount=-1 +kerning first=365 second=318 amount=-2 +kerning first=307 second=380 amount=-1 +kerning first=229 second=225 amount=-1 +kerning first=105 second=335 amount=-1 +kerning first=106 second=105 amount=-1 +kerning first=1100 second=1083 amount=-1 +kerning first=1061 second=1108 amount=-2 +kerning first=275 second=231 amount=-1 +kerning first=379 second=380 amount=-3 +kerning first=311 second=231 amount=-3 +kerning first=102 second=108 amount=3 +kerning first=272 second=270 amount=-2 +kerning first=278 second=338 amount=-1 +kerning first=369 second=228 amount=-1 +kerning first=66 second=108 amount=-3 +kerning first=333 second=228 amount=-1 +kerning first=199 second=380 amount=-2 +kerning first=88 second=225 amount=-1 +kerning first=272 second=278 amount=-2 +kerning first=8217 second=210 amount=-2 +kerning first=206 second=338 amount=-2 +kerning first=1105 second=1113 amount=-2 +kerning first=235 second=380 amount=-2 +kerning first=82 second=275 amount=-3 +kerning first=213 second=296 amount=-2 +kerning first=243 second=225 amount=-1 +kerning first=119 second=251 amount=-1 +kerning first=1089 second=1103 amount=-1 +kerning first=321 second=296 amount=-2 +kerning first=279 second=225 amount=-2 +kerning first=83 second=251 amount=-1 +kerning first=326 second=228 amount=-1 +kerning first=224 second=251 amount=-1 +kerning first=290 second=228 amount=-1 +kerning first=195 second=305 amount=-1 +kerning first=249 second=98 amount=-2 +kerning first=254 second=228 amount=-1 +kerning first=66 second=225 amount=-3 +kerning first=296 second=251 amount=-2 +kerning first=286 second=270 amount=-1 +kerning first=209 second=235 amount=-2 +kerning first=99 second=303 amount=-2 +kerning first=218 second=228 amount=-3 +kerning first=102 second=225 amount=-2 +kerning first=260 second=251 amount=-3 +kerning first=1046 second=1058 amount=-3 +kerning first=1114 second=1100 amount=-1 +kerning first=321 second=98 amount=-2 +kerning first=281 second=235 amount=-1 +kerning first=113 second=228 amount=-2 +kerning first=207 second=225 amount=-2 +kerning first=66 second=314 amount=-3 +kerning first=77 second=228 amount=-2 +kerning first=1056 second=1025 amount=-1 +kerning first=251 second=46 amount=-2 +kerning first=261 second=273 amount=-1 +kerning first=229 second=102 amount=-1 +kerning first=287 second=46 amount=-3 +kerning first=266 second=370 amount=-2 +kerning first=225 second=273 amount=-1 +kerning first=323 second=46 amount=-1 +kerning first=374 second=370 amount=-1 +kerning first=379 second=206 amount=-1 +kerning first=338 second=370 amount=-2 +kerning first=187 second=325 amount=-5 +kerning first=120 second=273 amount=-2 +kerning first=1051 second=1107 amount=-1 +kerning first=74 second=46 amount=-1 +kerning first=8250 second=73 amount=-5 +kerning first=367 second=263 amount=-1 +kerning first=110 second=46 amount=-1 +kerning first=109 second=98 amount=-2 +kerning first=8220 second=110 amount=-1 +kerning first=1031 second=1087 amount=-1 +kerning first=203 second=83 amount=-2 +kerning first=347 second=363 amount=-1 +kerning first=249 second=112 amount=-2 +kerning first=250 second=318 amount=-2 +kerning first=68 second=221 amount=-2 +kerning first=213 second=112 amount=-1 +kerning first=286 second=318 amount=-1 +kerning first=337 second=102 amount=-1 +kerning first=288 second=8249 amount=-3 +kerning first=362 second=214 amount=-1 +kerning first=367 second=311 amount=-2 +kerning first=108 second=112 amount=-1 +kerning first=1062 second=1072 amount=-1 +kerning first=72 second=112 amount=-1 +kerning first=198 second=266 amount=-1 +kerning first=1077 second=1096 amount=-1 +kerning first=8250 second=87 amount=-4 +kerning first=218 second=214 amount=-1 +kerning first=369 second=259 amount=-1 +kerning first=368 second=67 amount=-1 +kerning first=333 second=259 amount=-1 +kerning first=313 second=260 amount=-2 +kerning first=108 second=98 amount=-1 +kerning first=296 second=67 amount=-2 +kerning first=202 second=81 amount=-1 +kerning first=365 second=254 amount=-2 +kerning first=260 second=67 amount=-3 +kerning first=225 second=259 amount=-1 +kerning first=317 second=221 amount=-3 +kerning first=366 second=379 amount=-1 +kerning first=240 second=105 amount=-1 +kerning first=274 second=81 amount=-1 +kerning first=99 second=105 amount=-2 +kerning first=77 second=214 amount=-2 +kerning first=261 second=259 amount=-1 +kerning first=321 second=112 amount=-2 +kerning first=1077 second=1098 amount=-1 +kerning first=291 second=230 amount=-3 +kerning first=295 second=249 amount=-1 +kerning first=264 second=346 amount=-3 +kerning first=250 second=100 amount=-1 +kerning first=327 second=230 amount=-2 +kerning first=332 second=327 amount=-2 +kerning first=331 second=249 amount=-1 +kerning first=219 second=230 amount=-3 +kerning first=223 second=249 amount=-1 +kerning first=192 second=346 amount=-3 +kerning first=352 second=275 amount=-1 +kerning first=89 second=325 amount=-1 +kerning first=1037 second=1079 amount=-1 +kerning first=1113 second=1098 amount=-1 +kerning first=255 second=230 amount=-3 +kerning first=1088 second=1095 amount=-1 +kerning first=259 second=249 amount=-1 +kerning first=194 second=350 amount=-3 +kerning first=114 second=230 amount=-1 +kerning first=1052 second=1095 amount=-1 +kerning first=74 second=334 amount=-2 +kerning first=73 second=100 amount=-2 +kerning first=1025 second=1102 amount=-1 +kerning first=316 second=275 amount=-1 +kerning first=89 second=350 amount=-3 +kerning first=367 second=249 amount=-1 +kerning first=336 second=346 amount=-1 +kerning first=8220 second=328 amount=-1 +kerning first=78 second=230 amount=-2 +kerning first=338 second=350 amount=-2 +kerning first=327 second=339 amount=-2 +kerning first=282 second=362 amount=-2 +kerning first=118 second=305 amount=-2 +kerning first=374 second=350 amount=-3 +kerning first=363 second=339 amount=-1 +kerning first=66 second=211 amount=-3 +kerning first=282 second=223 amount=-1 +kerning first=214 second=256 amount=-4 +kerning first=266 second=350 amount=-3 +kerning first=223 second=305 amount=-1 +kerning first=277 second=107 amount=-2 +kerning first=302 second=350 amount=-2 +kerning first=187 second=305 amount=-1 +kerning first=354 second=223 amount=-3 +kerning first=207 second=211 amount=-2 +kerning first=232 second=279 amount=-1 +kerning first=118 second=249 amount=-1 +kerning first=310 second=311 amount=-1 +kerning first=259 second=305 amount=-1 +kerning first=105 second=223 amount=-1 +kerning first=363 second=230 amount=-1 +kerning first=367 second=305 amount=-1 +kerning first=100 second=107 amount=-1 +kerning first=246 second=223 amount=-1 +kerning first=379 second=268 amount=-1 +kerning first=331 second=305 amount=-1 +kerning first=198 second=260 amount=-2 +kerning first=286 second=256 amount=-3 +kerning first=352 second=289 amount=-3 +kerning first=204 second=365 amount=-2 +kerning first=199 second=268 amount=-3 +kerning first=219 second=244 amount=-2 +kerning first=1113 second=1084 amount=-1 +kerning first=255 second=244 amount=-3 +kerning first=259 second=263 amount=-1 +kerning first=99 second=365 amount=-2 +kerning first=1061 second=1060 amount=-4 +kerning first=1077 second=1084 amount=-1 +kerning first=1089 second=1117 amount=-1 +kerning first=332 second=313 amount=-2 +kerning first=291 second=244 amount=-2 +kerning first=89 second=199 amount=-3 +kerning first=355 second=259 amount=-1 +kerning first=376 second=232 amount=-3 +kerning first=1053 second=1117 amount=-1 +kerning first=216 second=8217 amount=-2 +kerning first=327 second=244 amount=-2 +kerning first=203 second=192 amount=-2 +kerning first=363 second=353 amount=-2 +kerning first=252 second=8217 amount=-3 +kerning first=363 second=244 amount=-1 +kerning first=354 second=237 amount=-2 +kerning first=288 second=8217 amount=-1 +kerning first=78 second=339 amount=-2 +kerning first=82 second=263 amount=-3 +kerning first=1050 second=1091 amount=-2 +kerning first=8218 second=366 amount=-3 +kerning first=8220 second=219 amount=-1 +kerning first=324 second=8217 amount=-4 +kerning first=266 second=199 amount=-3 +kerning first=118 second=263 amount=-3 +kerning first=1086 second=1091 amount=-1 +kerning first=1119 second=1072 amount=-1 +kerning first=282 second=237 amount=-1 +kerning first=100 second=121 amount=-2 +kerning first=374 second=302 amount=-1 +kerning first=246 second=237 amount=-1 +kerning first=103 second=275 amount=-2 +kerning first=219 second=353 amount=-2 +kerning first=83 second=313 amount=-3 +kerning first=67 second=289 amount=-3 +kerning first=269 second=369 amount=-2 +kerning first=210 second=237 amount=-1 +kerning first=255 second=353 amount=-3 +kerning first=1050 second=1105 amount=-2 +kerning first=1118 second=1072 amount=-2 +kerning first=103 second=289 amount=-2 +kerning first=214 second=270 amount=-2 +kerning first=323 second=334 amount=-2 +kerning first=288 second=117 amount=-1 +kerning first=291 second=353 amount=-3 +kerning first=83 second=327 amount=-3 +kerning first=105 second=237 amount=-1 +kerning first=326 second=97 amount=-1 +kerning first=327 second=353 amount=-2 +kerning first=208 second=289 amount=-1 +kerning first=69 second=237 amount=-1 +kerning first=325 second=363 amount=-2 +kerning first=244 second=289 amount=-2 +kerning first=1025 second=1060 amount=-1 +kerning first=8250 second=347 amount=-1 +kerning first=78 second=353 amount=-2 +kerning first=199 second=282 amount=-3 +kerning first=280 second=289 amount=-3 +kerning first=78 second=244 amount=-2 +kerning first=8218 second=380 amount=-3 +kerning first=114 second=353 amount=-1 +kerning first=1082 second=1072 amount=-1 +kerning first=316 second=289 amount=-3 +kerning first=240 second=365 amount=-1 +kerning first=1046 second=1072 amount=-2 +kerning first=352 second=255 amount=-2 +kerning first=281 second=277 amount=-1 +kerning first=1038 second=1081 amount=-4 +kerning first=220 second=232 amount=-2 +kerning first=321 second=302 amount=-2 +kerning first=83 second=257 amount=-2 +kerning first=109 second=326 amount=-1 +kerning first=8250 second=229 amount=-1 +kerning first=275 second=371 amount=-2 +kerning first=119 second=257 amount=-3 +kerning first=362 second=8249 amount=-5 +kerning first=382 second=347 amount=-2 +kerning first=213 second=302 amount=-2 +kerning first=99 second=99 amount=-1 +kerning first=377 second=202 amount=-1 +kerning first=290 second=8249 amount=-3 +kerning first=346 second=347 amount=-1 +kerning first=326 second=8249 amount=-3 +kerning first=209 second=277 amount=-2 +kerning first=352 second=380 amount=-2 +kerning first=204 second=99 amount=-2 +kerning first=98 second=371 amount=-1 +kerning first=225 second=267 amount=-1 +kerning first=326 second=351 amount=-1 +kerning first=261 second=267 amount=-1 +kerning first=219 second=79 amount=-1 +kerning first=45 second=261 amount=-1 +kerning first=120 second=267 amount=-2 +kerning first=198 second=336 amount=-1 +kerning first=78 second=79 amount=-2 +kerning first=81 second=261 amount=-1 +kerning first=220 second=71 amount=-1 +kerning first=362 second=351 amount=-2 +kerning first=241 second=367 amount=-1 +kerning first=369 second=267 amount=-1 +kerning first=327 second=79 amount=-2 +kerning first=332 second=257 amount=-1 +kerning first=277 second=367 amount=-2 +kerning first=199 second=212 amount=-3 +kerning first=1074 second=1081 amount=-1 +kerning first=113 second=351 amount=-2 +kerning first=368 second=257 amount=-3 +kerning first=250 second=114 amount=-1 +kerning first=254 second=351 amount=-2 +kerning first=281 second=113 amount=-1 +kerning first=84 second=69 amount=-1 +kerning first=218 second=351 amount=-2 +kerning first=296 second=257 amount=-2 +kerning first=351 second=382 amount=-2 +kerning first=209 second=291 amount=-3 +kerning first=113 second=337 amount=-1 +kerning first=330 second=261 amount=-2 +kerning first=119 second=271 amount=-3 +kerning first=77 second=337 amount=-2 +kerning first=366 second=261 amount=-3 +kerning first=197 second=216 amount=-3 +kerning first=104 second=291 amount=-2 +kerning first=224 second=271 amount=-1 +kerning first=68 second=291 amount=-1 +kerning first=1071 second=1047 amount=-1 +kerning first=117 second=261 amount=-1 +kerning first=110 second=314 amount=-1 +kerning first=207 second=382 amount=-1 +kerning first=84 second=267 amount=-3 +kerning first=243 second=382 amount=-2 +kerning first=222 second=261 amount=-1 +kerning first=369 second=281 amount=-1 +kerning first=279 second=382 amount=-2 +kerning first=218 second=337 amount=-2 +kerning first=1062 second=1104 amount=-1 +kerning first=1078 second=1092 amount=-2 +kerning first=315 second=382 amount=-3 +kerning first=199 second=226 amount=-2 +kerning first=287 second=314 amount=-3 +kerning first=1025 second=1116 amount=-1 +kerning first=274 second=347 amount=-1 +kerning first=70 second=227 amount=-2 +kerning first=103 second=269 amount=-2 +kerning first=196 second=8221 amount=-5 +kerning first=280 second=171 amount=-2 +kerning first=97 second=361 amount=-1 +kerning first=251 second=314 amount=-2 +kerning first=67 second=269 amount=-2 +kerning first=316 second=171 amount=-3 +kerning first=202 second=347 amount=-1 +kerning first=225 second=281 amount=-1 +kerning first=362 second=337 amount=-2 +kerning first=352 second=171 amount=-3 +kerning first=202 second=361 amount=-2 +kerning first=261 second=281 amount=-1 +kerning first=70 second=352 amount=-3 +kerning first=267 second=361 amount=-2 +kerning first=67 second=171 amount=-4 +kerning first=310 second=361 amount=-3 +kerning first=97 second=347 amount=-1 +kerning first=78 second=224 amount=-2 +kerning first=311 second=371 amount=-1 +kerning first=103 second=171 amount=-3 +kerning first=274 second=361 amount=-2 +kerning first=8216 second=267 amount=-3 +kerning first=108 second=316 amount=-2 +kerning first=347 second=371 amount=-1 +kerning first=232 second=8221 amount=-2 +kerning first=382 second=361 amount=-2 +kerning first=250 second=326 amount=-1 +kerning first=352 second=269 amount=-1 +kerning first=377 second=216 amount=-1 +kerning first=208 second=171 amount=-1 +kerning first=346 second=361 amount=-1 +kerning first=84 second=281 amount=-3 +kerning first=316 second=269 amount=-1 +kerning first=114 second=224 amount=-1 +kerning first=103 second=227 amount=-3 +kerning first=255 second=224 amount=-3 +kerning first=107 second=252 amount=-1 +kerning first=67 second=227 amount=-2 +kerning first=219 second=224 amount=-3 +kerning first=295 second=45 amount=-3 +kerning first=327 second=224 amount=-2 +kerning first=291 second=224 amount=-3 +kerning first=248 second=252 amount=-1 +kerning first=280 second=227 amount=-1 +kerning first=244 second=227 amount=-1 +kerning first=363 second=224 amount=-1 +kerning first=208 second=227 amount=-1 +kerning first=100 second=101 amount=-1 +kerning first=71 second=252 amount=-1 +kerning first=364 second=246 amount=-2 +kerning first=223 second=311 amount=-1 +kerning first=235 second=226 amount=-2 +kerning first=338 second=356 amount=-1 +kerning first=187 second=311 amount=-1 +kerning first=205 second=101 amount=-2 +kerning first=66 second=382 amount=-4 +kerning first=118 second=311 amount=-2 +kerning first=266 second=90 amount=-2 +kerning first=102 second=382 amount=-1 +kerning first=279 second=326 amount=-2 +kerning first=307 second=226 amount=-2 +kerning first=82 second=45 amount=-4 +kerning first=266 second=356 amount=-1 +kerning first=347 second=103 amount=-3 +kerning first=256 second=246 amount=-1 +kerning first=82 second=311 amount=-3 +kerning first=277 second=101 amount=-1 +kerning first=1052 second=1101 amount=-1 +kerning first=46 second=45 amount=-3 +kerning first=311 second=103 amount=-2 +kerning first=220 second=246 amount=-2 +kerning first=193 second=362 amount=-3 +kerning first=338 second=90 amount=-1 +kerning first=353 second=291 amount=-3 +kerning first=379 second=226 amount=-1 +kerning first=284 second=252 amount=-1 +kerning first=194 second=356 amount=-6 +kerning first=275 second=103 amount=-3 +kerning first=187 second=207 amount=-5 +kerning first=317 second=291 amount=-3 +kerning first=118 second=45 amount=-4 +kerning first=281 second=291 amount=-3 +kerning first=356 second=252 amount=-1 +kerning first=203 second=103 amount=-3 +kerning first=332 second=261 amount=-1 +kerning first=374 second=90 amount=-3 +kerning first=245 second=291 amount=-2 +kerning first=73 second=44 amount=-1 +kerning first=203 second=353 amount=-1 +kerning first=368 second=109 amount=-2 +kerning first=338 second=104 amount=-1 +kerning first=246 second=8250 amount=-2 +kerning first=335 second=109 amount=-1 +kerning first=280 second=213 amount=-1 +kerning first=266 second=104 amount=-1 +kerning first=224 second=109 amount=-1 +kerning first=89 second=370 amount=-1 +kerning first=203 second=89 amount=-1 +kerning first=379 second=212 amount=-1 +kerning first=89 second=90 amount=-3 +kerning first=187 second=193 amount=-4 +kerning first=194 second=370 amount=-3 +kerning first=83 second=109 amount=-1 +kerning first=234 second=115 amount=-2 +kerning first=1108 second=1113 amount=-1 +kerning first=113 second=8249 amount=-2 +kerning first=352 second=227 amount=-2 +kerning first=204 second=303 amount=-1 +kerning first=1036 second=1113 amount=-2 +kerning first=119 second=109 amount=-2 +kerning first=316 second=227 amount=-2 +kerning first=198 second=115 amount=-1 +kerning first=339 second=187 amount=-2 +kerning first=379 second=78 amount=-1 +kerning first=240 second=303 amount=-1 +kerning first=230 second=104 amount=-2 +kerning first=378 second=115 amount=-2 +kerning first=250 second=44 amount=-2 +kerning first=77 second=8249 amount=-4 +kerning first=256 second=232 amount=-1 +kerning first=90 second=187 amount=-1 +kerning first=214 second=44 amount=-3 +kerning first=214 second=368 amount=-1 +kerning first=86 second=70 amount=-1 +kerning first=364 second=345 amount=-1 +kerning first=364 second=232 amount=-2 +kerning first=199 second=78 amount=-3 +kerning first=67 second=213 amount=-3 +kerning first=278 second=120 amount=-1 +kerning first=76 second=75 amount=-2 +kerning first=84 second=323 amount=-1 +kerning first=314 second=120 amount=-1 +kerning first=235 second=289 amount=-3 +kerning first=286 second=203 amount=-1 +kerning first=350 second=120 amount=-3 +kerning first=1101 second=1103 amount=-2 +kerning first=99 second=116 amount=-1 +kerning first=313 second=115 amount=-1 +kerning first=228 second=241 amount=-1 +kerning first=198 second=70 amount=-2 +kerning first=286 second=368 amount=-1 +kerning first=214 second=203 amount=-2 +kerning first=101 second=120 amount=-2 +kerning first=321 second=198 amount=-2 +kerning first=365 second=248 amount=-1 +kerning first=100 second=375 amount=-2 +kerning first=362 second=210 amount=-1 +kerning first=8216 second=111 amount=-3 +kerning first=1039 second=1080 amount=-1 +kerning first=242 second=120 amount=-3 +kerning first=317 second=73 amount=-2 +kerning first=252 second=118 amount=-3 +kerning first=117 second=253 amount=-3 +kerning first=332 second=201 amount=-2 +kerning first=68 second=73 amount=-2 +kerning first=71 second=356 amount=-3 +kerning first=200 second=278 amount=-2 +kerning first=324 second=118 amount=-3 +kerning first=88 second=233 amount=-2 +kerning first=288 second=118 amount=-1 +kerning first=67 second=68 amount=-3 +kerning first=233 second=113 amount=-1 +kerning first=258 second=253 amount=-3 +kerning first=187 second=84 amount=-4 +kerning first=229 second=233 amount=-1 +kerning first=75 second=118 amount=-3 +kerning first=280 second=68 amount=-2 +kerning first=193 second=233 amount=-1 +kerning first=374 second=241 amount=-3 +kerning first=330 second=253 amount=-2 +kerning first=249 second=246 amount=-1 +kerning first=366 second=253 amount=-1 +kerning first=83 second=201 amount=-3 +kerning first=1058 second=1085 amount=-2 +kerning first=200 second=80 amount=-2 +kerning first=382 second=291 amount=-2 +kerning first=111 second=118 amount=-2 +kerning first=313 second=196 amount=-2 +kerning first=377 second=113 amount=-1 +kerning first=316 second=283 amount=-1 +kerning first=253 second=335 amount=-3 +kerning first=266 second=241 amount=-1 +kerning first=109 second=108 amount=-1 +kerning first=1102 second=1087 amount=-1 +kerning first=106 second=305 amount=-2 +kerning first=289 second=335 amount=-2 +kerning first=230 second=241 amount=-2 +kerning first=1069 second=1040 amount=-3 +kerning first=74 second=110 amount=-1 +kerning first=325 second=335 amount=-2 +kerning first=8217 second=324 amount=-2 +kerning first=338 second=241 amount=-1 +kerning first=1030 second=1087 amount=-1 +kerning first=110 second=110 amount=-1 +kerning first=89 second=193 amount=-6 +kerning first=89 second=241 amount=-3 +kerning first=278 second=380 amount=-2 +kerning first=286 second=108 amount=-1 +kerning first=1079 second=1079 amount=-1 +kerning first=314 second=380 amount=-1 +kerning first=84 second=85 amount=-1 +kerning first=250 second=108 amount=-2 +kerning first=251 second=110 amount=-1 +kerning first=350 second=380 amount=-2 +kerning first=352 second=283 amount=-1 +kerning first=287 second=110 amount=-1 +kerning first=217 second=335 amount=-2 +kerning first=85 second=65 amount=-4 +kerning first=266 second=193 amount=-3 +kerning first=221 second=248 amount=-3 +kerning first=101 second=380 amount=-2 +kerning first=219 second=286 amount=-1 +kerning first=370 second=331 amount=-2 +kerning first=257 second=248 amount=-1 +kerning first=290 second=70 amount=-1 +kerning first=100 second=115 amount=-1 +kerning first=78 second=286 amount=-2 +kerning first=262 second=331 amount=-1 +kerning first=105 second=231 amount=-1 +kerning first=8220 second=275 amount=-3 +kerning first=250 second=375 amount=-3 +kerning first=242 second=380 amount=-2 +kerning first=262 second=65 amount=-3 +kerning first=354 second=231 amount=-3 +kerning first=241 second=115 amount=-1 +kerning first=226 second=331 amount=-1 +kerning first=80 second=248 amount=-1 +kerning first=277 second=115 amount=-2 +kerning first=334 second=65 amount=-4 +kerning first=106 second=250 amount=-1 +kerning first=1057 second=1083 amount=-1 +kerning first=338 second=193 amount=-2 +kerning first=85 second=331 amount=-2 +kerning first=370 second=65 amount=-4 +kerning first=379 second=338 amount=-1 +kerning first=374 second=193 amount=-6 +kerning first=121 second=331 amount=-2 +kerning first=205 second=115 amount=-2 +kerning first=1037 second=1073 amount=-1 +kerning first=110 second=347 amount=-1 +kerning first=331 second=255 amount=-2 +kerning first=98 second=307 amount=-1 +kerning first=102 second=326 amount=-1 +kerning first=336 second=352 amount=-1 +kerning first=295 second=255 amount=-2 +kerning first=259 second=255 amount=-3 +kerning first=353 second=347 amount=-3 +kerning first=223 second=255 amount=-3 +kerning first=321 second=366 amount=-3 +kerning first=243 second=326 amount=-1 +kerning first=317 second=347 amount=-1 +kerning first=77 second=281 amount=-2 +kerning first=1092 second=1078 amount=-1 +kerning first=79 second=302 amount=-2 +kerning first=187 second=255 amount=-3 +kerning first=73 second=262 amount=-2 +kerning first=275 second=307 amount=-2 +kerning first=281 second=347 amount=-2 +kerning first=240 second=250 amount=-1 +kerning first=245 second=347 amount=-2 +kerning first=82 second=255 amount=-3 +kerning first=347 second=307 amount=-2 +kerning first=232 second=371 amount=-2 +kerning first=209 second=347 amount=-2 +kerning first=1056 second=1078 amount=-1 +kerning first=66 second=326 amount=-3 +kerning first=1093 second=1077 amount=-2 +kerning first=99 second=250 amount=-2 +kerning first=259 second=378 amount=-1 +kerning first=206 second=212 amount=-2 +kerning first=339 second=257 amount=-2 +kerning first=75 second=333 amount=-2 +kerning first=8250 second=355 amount=-1 +kerning first=223 second=378 amount=-2 +kerning first=382 second=97 amount=-1 +kerning first=375 second=257 amount=-3 +kerning first=110 second=328 amount=-1 +kerning first=204 second=250 amount=-2 +kerning first=331 second=378 amount=-1 +kerning first=87 second=352 amount=-3 +kerning first=69 second=223 amount=-1 +kerning first=74 second=328 amount=-1 +kerning first=1057 second=1077 amount=-1 +kerning first=377 second=264 amount=-1 +kerning first=295 second=378 amount=-1 +kerning first=1025 second=1052 amount=-1 +kerning first=83 second=377 amount=-1 +kerning first=303 second=257 amount=-2 +kerning first=350 second=325 amount=-3 +kerning first=274 second=229 amount=-1 +kerning first=192 second=352 amount=-3 +kerning first=248 second=46 amount=-3 +kerning first=1098 second=1118 amount=-2 +kerning first=103 second=283 amount=-2 +kerning first=332 second=377 amount=-2 +kerning first=65 second=212 amount=-3 +kerning first=231 second=257 amount=-2 +kerning first=1086 second=1097 amount=-1 +kerning first=287 second=328 amount=-1 +kerning first=67 second=283 amount=-2 +kerning first=187 second=378 amount=-5 +kerning first=213 second=366 amount=-1 +kerning first=1042 second=1047 amount=-2 +kerning first=264 second=352 amount=-3 +kerning first=251 second=328 amount=-1 +kerning first=118 second=378 amount=-3 +kerning first=313 second=8220 amount=-4 +kerning first=249 second=106 amount=-2 +kerning first=277 second=8220 amount=-2 +kerning first=199 second=332 amount=-3 +kerning first=241 second=8220 amount=-4 +kerning first=278 second=103 amount=-3 +kerning first=310 second=87 amount=-2 +kerning first=368 second=377 amount=-1 +kerning first=90 second=325 amount=-1 +kerning first=105 second=287 amount=-3 +kerning first=1049 second=1092 amount=-1 +kerning first=8217 second=367 amount=-1 +kerning first=346 second=87 amount=-3 +kerning first=213 second=106 amount=-1 +kerning first=69 second=287 amount=-3 +kerning first=1085 second=1092 amount=-1 +kerning first=97 second=243 amount=-1 +kerning first=1077 second=1090 amount=-1 +kerning first=219 second=345 amount=-1 +kerning first=379 second=332 amount=-1 +kerning first=210 second=287 amount=-1 +kerning first=197 second=113 amount=-1 +kerning first=100 second=8220 amount=-2 +kerning first=255 second=345 amount=-1 +kerning first=367 second=378 amount=-2 +kerning first=377 second=268 amount=-1 +kerning first=291 second=345 amount=-1 +kerning first=321 second=106 amount=-2 +kerning first=8220 second=269 amount=-3 +kerning first=282 second=287 amount=-3 +kerning first=67 second=316 amount=-1 +kerning first=1113 second=1090 amount=-1 +kerning first=202 second=87 amount=-1 +kerning first=86 second=288 amount=-3 +kerning first=246 second=287 amount=-2 +kerning first=262 second=45 amount=-4 +kerning first=363 second=345 amount=-1 +kerning first=221 second=242 amount=-3 +kerning first=354 second=287 amount=-4 +kerning first=104 second=347 amount=-1 +kerning first=310 second=243 amount=-2 +kerning first=213 second=198 amount=-4 +kerning first=346 second=243 amount=-1 +kerning first=377 second=102 amount=-3 +kerning first=362 second=281 amount=-2 +kerning first=382 second=243 amount=-1 +kerning first=257 second=242 amount=-1 +kerning first=1102 second=1107 amount=-1 +kerning first=365 second=242 amount=-1 +kerning first=113 second=281 amount=-1 +kerning first=315 second=326 amount=-1 +kerning first=187 second=82 amount=-5 +kerning first=315 second=217 amount=-3 +kerning first=351 second=326 amount=-2 +kerning first=218 second=281 amount=-2 +kerning first=214 second=197 amount=-4 +kerning first=367 second=255 amount=-3 +kerning first=84 second=119 amount=-3 +kerning first=198 second=210 amount=-1 +kerning first=120 second=119 amount=-3 +kerning first=278 second=324 amount=-1 +kerning first=67 second=334 amount=-3 +kerning first=198 second=274 amount=-2 +kerning first=286 second=197 amount=-3 +kerning first=321 second=270 amount=-2 +kerning first=194 second=249 amount=-3 +kerning first=122 second=97 amount=-1 +kerning first=375 second=369 amount=-1 +kerning first=242 second=324 amount=-1 +kerning first=108 second=254 amount=-1 +kerning first=225 second=119 amount=-3 +kerning first=86 second=283 amount=-3 +kerning first=261 second=119 amount=-3 +kerning first=80 second=304 amount=-1 +kerning first=214 second=374 amount=-2 +kerning first=314 second=324 amount=-1 +kerning first=81 second=75 amount=-2 +kerning first=274 second=356 amount=-1 +kerning first=377 second=379 amount=-1 +kerning first=267 second=369 amount=-2 +kerning first=104 second=229 amount=-1 +kerning first=8217 second=101 amount=-3 +kerning first=231 second=369 amount=-2 +kerning first=1078 second=1098 amount=-1 +kerning first=240 second=257 amount=-1 +kerning first=369 second=119 amount=-3 +kerning first=339 second=369 amount=-2 +kerning first=200 second=74 amount=-1 +kerning first=1062 second=1054 amount=-1 +kerning first=1030 second=1079 amount=-1 +kerning first=266 second=249 amount=-2 +kerning first=8218 second=316 amount=-1 +kerning first=303 second=369 amount=-1 +kerning first=68 second=229 amount=-1 +kerning first=280 second=334 amount=-1 +kerning first=86 second=344 amount=-1 +kerning first=192 second=234 amount=-1 +kerning first=281 second=229 amount=-2 +kerning first=272 second=74 amount=-2 +kerning first=226 second=339 amount=-1 +kerning first=228 second=234 amount=-1 +kerning first=85 second=339 amount=-2 +kerning first=200 second=284 amount=-1 +kerning first=264 second=234 amount=-2 +kerning first=209 second=229 amount=-2 +kerning first=121 second=339 amount=-3 +kerning first=245 second=229 amount=-1 +kerning first=253 second=279 amount=-3 +kerning first=1091 second=1093 amount=-1 +kerning first=370 second=339 amount=-2 +kerning first=108 second=106 amount=-3 +kerning first=217 second=279 amount=-2 +kerning first=1072 second=1119 amount=-1 +kerning first=262 second=339 amount=-2 +kerning first=87 second=234 amount=-3 +kerning first=325 second=279 amount=-2 +kerning first=353 second=229 amount=-1 +kerning first=1108 second=1119 amount=-1 +kerning first=298 second=339 amount=-2 +kerning first=1048 second=1084 amount=-1 +kerning first=223 second=8217 amount=-2 +kerning first=280 second=219 amount=-2 +kerning first=196 second=111 amount=-1 +kerning first=259 second=8217 amount=-3 +kerning first=356 second=244 amount=-3 +kerning first=232 second=111 amount=-1 +kerning first=295 second=8217 amount=-4 +kerning first=1031 second=1089 amount=-1 +kerning first=286 second=374 amount=-3 +kerning first=208 second=219 amount=-1 +kerning first=268 second=111 amount=-2 +kerning first=331 second=8217 amount=-4 +kerning first=332 second=209 amount=-2 +kerning first=264 second=86 amount=-1 +kerning first=267 second=8221 amount=-2 +kerning first=85 second=332 amount=-1 +kerning first=66 second=66 amount=-4 +kerning first=82 second=8217 amount=-5 +kerning first=1067 second=1089 amount=-1 +kerning first=313 second=107 amount=-2 +kerning first=67 second=219 amount=-2 +kerning first=192 second=86 amount=-6 +kerning first=87 second=338 amount=-3 +kerning first=197 second=264 amount=-3 +kerning first=8250 second=291 amount=-3 +kerning first=379 second=72 amount=-1 +kerning first=1076 second=1092 amount=-1 +kerning first=201 second=289 amount=-3 +kerning first=1042 second=1041 amount=-2 +kerning first=234 second=121 amount=-2 +kerning first=194 second=364 amount=-3 +kerning first=83 second=209 amount=-3 +kerning first=315 second=298 amount=-2 +kerning first=196 second=254 amount=-2 +kerning first=201 second=82 amount=-2 +kerning first=280 second=326 amount=-1 +kerning first=89 second=364 amount=-1 +kerning first=107 second=244 amount=-3 +kerning first=304 second=111 amount=-2 +kerning first=1085 second=1086 amount=-1 +kerning first=366 second=90 amount=-1 +kerning first=284 second=368 amount=-1 +kerning first=338 second=364 amount=-2 +kerning first=249 second=254 amount=-2 +kerning first=376 second=111 amount=-3 +kerning first=274 second=278 amount=-2 +kerning first=79 second=296 amount=-2 +kerning first=315 second=66 amount=-2 +kerning first=266 second=364 amount=-2 +kerning first=321 second=254 amount=-2 +kerning first=82 second=199 amount=-3 +kerning first=193 second=354 amount=-6 +kerning first=379 second=110 amount=-1 +kerning first=98 second=97 amount=-1 +kerning first=380 second=225 amount=-1 +kerning first=260 second=117 amount=-3 +kerning first=102 second=122 amount=-1 +kerning first=45 second=102 amount=-1 +kerning first=224 second=117 amount=-1 +kerning first=268 second=200 amount=-3 +kerning first=66 second=122 amount=-4 +kerning first=90 second=251 amount=-3 +kerning first=117 second=102 amount=-1 +kerning first=8216 second=99 amount=-3 +kerning first=296 second=117 amount=-2 +kerning first=275 second=97 amount=-2 +kerning first=315 second=122 amount=-3 +kerning first=236 second=225 amount=-2 +kerning first=195 second=251 amount=-3 +kerning first=378 second=121 amount=-2 +kerning first=199 second=72 amount=-3 +kerning first=311 second=97 amount=-2 +kerning first=279 second=122 amount=-2 +kerning first=298 second=71 amount=-2 +kerning first=330 second=46 amount=-1 +kerning first=272 second=225 amount=-1 +kerning first=346 second=8249 amount=-3 +kerning first=368 second=117 amount=-1 +kerning first=203 second=97 amount=-1 +kerning first=243 second=122 amount=-2 +kerning first=366 second=46 amount=-5 +kerning first=267 second=251 amount=-2 +kerning first=376 second=200 amount=-1 +kerning first=207 second=122 amount=-1 +kerning first=344 second=225 amount=-2 +kerning first=231 second=251 amount=-2 +kerning first=117 second=46 amount=-2 +kerning first=339 second=251 amount=-2 +kerning first=287 second=275 amount=-2 +kerning first=1036 second=1063 amount=-4 +kerning first=366 second=102 amount=-1 +kerning first=303 second=251 amount=-1 +kerning first=364 second=240 amount=-2 +kerning first=347 second=97 amount=-1 +kerning first=222 second=46 amount=-3 +kerning first=97 second=246 amount=-1 +kerning first=98 second=363 amount=-1 +kerning first=256 second=240 amount=-1 +kerning first=375 second=251 amount=-1 +kerning first=203 second=363 amount=-2 +kerning first=83 second=117 amount=-1 +kerning first=311 second=245 amount=-3 +kerning first=278 second=206 amount=-2 +kerning first=258 second=102 amount=-1 +kerning first=275 second=245 amount=-1 +kerning first=275 second=363 amount=-2 +kerning first=352 second=219 amount=-3 +kerning first=81 second=46 amount=-3 +kerning first=74 second=103 amount=-3 +kerning first=1067 second=1084 amount=-1 +kerning first=350 second=206 amount=-3 +kerning first=119 second=117 amount=-1 +kerning first=69 second=83 amount=-2 +kerning first=382 second=355 amount=-1 +kerning first=213 second=310 amount=-2 +kerning first=72 second=284 amount=-2 +kerning first=351 second=249 amount=-1 +kerning first=346 second=355 amount=-1 +kerning first=310 second=355 amount=-1 +kerning first=210 second=83 amount=-1 +kerning first=291 second=289 amount=-2 +kerning first=8217 second=197 amount=-6 +kerning first=377 second=266 amount=-1 +kerning first=282 second=83 amount=-2 +kerning first=220 second=240 amount=-2 +kerning first=344 second=284 amount=-3 +kerning first=321 second=310 amount=-2 +kerning first=1056 second=1070 amount=-1 +kerning first=45 second=253 amount=-3 +kerning first=354 second=83 amount=-3 +kerning first=332 second=69 amount=-2 +kerning first=1071 second=1114 amount=-1 +kerning first=1116 second=1108 amount=-2 +kerning first=290 second=77 amount=-1 +kerning first=90 second=369 amount=-3 +kerning first=1024 second=1083 amount=-1 +kerning first=277 second=375 amount=-2 +kerning first=199 second=220 amount=-2 +kerning first=196 second=8220 amount=-5 +kerning first=241 second=375 amount=-2 +kerning first=262 second=71 amount=-3 +kerning first=75 second=269 amount=-2 +kerning first=195 second=369 amount=-3 +kerning first=304 second=259 amount=-2 +kerning first=205 second=375 amount=-2 +kerning first=351 second=122 amount=-2 +kerning first=268 second=259 amount=-2 +kerning first=1074 second=1075 amount=-1 +kerning first=198 second=330 amount=-2 +kerning first=115 second=45 amount=-1 +kerning first=85 second=71 amount=-1 +kerning first=8216 second=271 amount=-3 +kerning first=221 second=304 amount=-1 +kerning first=251 second=116 amount=-1 +kerning first=266 second=87 amount=-1 +kerning first=1089 second=1087 amount=-1 +kerning first=313 second=375 amount=-3 +kerning first=204 second=351 amount=-2 +kerning first=374 second=291 amount=-4 +kerning first=80 second=298 amount=-1 +kerning first=377 second=77 amount=-1 +kerning first=1090 second=1108 amount=-1 +kerning first=381 second=233 amount=-1 +kerning first=338 second=291 amount=-3 +kerning first=70 second=214 amount=-1 +kerning first=83 second=8249 amount=-3 +kerning first=70 second=71 amount=-1 +kerning first=278 second=220 amount=-2 +kerning first=381 second=90 amount=-1 +kerning first=105 second=97 amount=-2 +kerning first=110 second=227 amount=-1 +kerning first=266 second=291 amount=-3 +kerning first=221 second=298 amount=-1 +kerning first=211 second=317 amount=-2 +kerning first=98 second=8250 amount=-2 +kerning first=274 second=207 amount=-2 +kerning first=74 second=227 amount=-3 +kerning first=118 second=110 amount=-2 +kerning first=230 second=291 amount=-3 +kerning first=8217 second=286 amount=-2 +kerning first=187 second=110 amount=-2 +kerning first=65 second=84 amount=-6 +kerning first=350 second=330 amount=-3 +kerning first=346 second=207 amount=-3 +kerning first=69 second=97 amount=-1 +kerning first=223 second=110 amount=-1 +kerning first=278 second=65 amount=-2 +kerning first=66 second=304 amount=-4 +kerning first=1104 second=1088 amount=-1 +kerning first=282 second=97 amount=-1 +kerning first=259 second=110 amount=-1 +kerning first=89 second=291 amount=-4 +kerning first=233 second=337 amount=-1 +kerning first=193 second=8220 amount=-5 +kerning first=295 second=110 amount=-1 +kerning first=278 second=84 amount=-1 +kerning first=197 second=337 amount=-1 +kerning first=323 second=213 amount=-2 +kerning first=121 second=314 amount=-2 +kerning first=364 second=324 amount=-2 +kerning first=210 second=97 amount=-1 +kerning first=331 second=110 amount=-1 +kerning first=278 second=199 amount=-1 +kerning first=66 second=318 amount=-3 +kerning first=328 second=324 amount=-1 +kerning first=246 second=97 amount=-1 +kerning first=367 second=110 amount=-1 +kerning first=252 second=311 amount=-2 +kerning first=201 second=350 amount=-2 +kerning first=115 second=324 amount=-2 +kerning first=377 second=337 amount=-1 +kerning first=381 second=350 amount=-1 +kerning first=201 second=90 amount=-1 +kerning first=1070 second=1050 amount=-1 +kerning first=242 second=46 amount=-3 +kerning first=354 second=97 amount=-5 +kerning first=111 second=311 amount=-1 +kerning first=243 second=318 amount=-2 +kerning first=350 second=84 amount=-3 +kerning first=269 second=337 amount=-1 +kerning first=75 second=311 amount=-1 +kerning first=279 second=318 amount=-3 +kerning first=79 second=310 amount=-2 +kerning first=243 second=44 amount=-3 +kerning first=1058 second=1107 amount=-2 +kerning first=234 second=289 amount=-3 +kerning first=8220 second=233 amount=-3 +kerning first=201 second=104 amount=-1 +kerning first=221 second=284 amount=-3 +kerning first=111 second=187 amount=-2 +kerning first=314 second=234 amount=-1 +kerning first=262 second=381 amount=-2 +kerning first=355 second=303 amount=-1 +kerning first=210 second=221 amount=-2 +kerning first=1070 second=1025 amount=-1 +kerning first=279 second=44 amount=-3 +kerning first=74 second=213 amount=-2 +kerning first=65 second=234 amount=-1 +kerning first=334 second=381 amount=-2 +kerning first=374 second=277 amount=-3 +kerning first=66 second=44 amount=-4 +kerning first=379 second=374 amount=-2 +kerning first=101 second=234 amount=-1 +kerning first=370 second=381 amount=-1 +kerning first=8218 second=368 amount=-3 +kerning first=350 second=70 amount=-3 +kerning first=79 second=78 amount=-2 +kerning first=1117 second=1104 amount=-1 +kerning first=206 second=234 amount=-2 +kerning first=102 second=44 amount=-1 +kerning first=1059 second=1081 amount=-4 +kerning first=278 second=70 amount=-2 +kerning first=230 second=277 amount=-1 +kerning first=287 second=227 amount=-3 +kerning first=1065 second=1077 amount=-1 +kerning first=194 second=277 amount=-1 +kerning first=251 second=227 amount=-1 +kerning first=8222 second=259 amount=-2 +kerning first=302 second=277 amount=-2 +kerning first=233 second=351 amount=-2 +kerning first=266 second=277 amount=-2 +kerning first=197 second=351 amount=-2 +kerning first=288 second=201 amount=-1 +kerning first=283 second=303 amount=-2 +kerning first=1104 second=1074 amount=-1 +kerning first=268 second=377 amount=-2 +kerning first=351 second=44 amount=-2 +kerning first=216 second=201 amount=-2 +kerning first=370 second=367 amount=-1 +kerning first=105 second=111 amount=-1 +kerning first=211 second=303 amount=-1 +kerning first=65 second=220 amount=-3 +kerning first=89 second=277 amount=-3 +kerning first=252 second=283 amount=-1 +kerning first=106 second=345 amount=-1 +kerning first=376 second=377 amount=-3 +kerning first=101 second=248 amount=-1 +kerning first=221 second=380 amount=-3 +kerning first=197 second=105 amount=-1 +kerning first=257 second=380 amount=-1 +kerning first=269 second=8220 amount=-2 +kerning first=1058 second=1093 amount=-3 +kerning first=310 second=235 amount=-2 +kerning first=65 second=248 amount=-1 +kerning first=316 second=230 amount=-2 +kerning first=233 second=8220 amount=-2 +kerning first=283 second=345 amount=-1 +kerning first=346 second=235 amount=-1 +kerning first=364 second=338 amount=-1 +kerning first=350 second=98 amount=-2 +kerning first=197 second=8220 amount=-5 +kerning first=266 second=114 amount=-1 +kerning first=80 second=270 amount=-1 +kerning first=382 second=235 amount=-1 +kerning first=77 second=287 amount=-3 +kerning first=314 second=98 amount=-1 +kerning first=1045 second=1087 amount=-1 +kerning first=287 second=241 amount=-1 +kerning first=1049 second=1100 amount=-1 +kerning first=221 second=270 amount=-1 +kerning first=224 second=267 amount=-1 +kerning first=218 second=287 amount=-4 +kerning first=116 second=380 amount=-1 +kerning first=209 second=211 amount=-2 +kerning first=256 second=338 amount=-3 +kerning first=283 second=228 amount=-2 +kerning first=101 second=112 amount=-1 +kerning first=202 second=193 amount=-2 +kerning first=216 second=325 amount=-2 +kerning first=290 second=287 amount=-3 +kerning first=374 second=263 amount=-3 +kerning first=254 second=287 amount=-2 +kerning first=211 second=228 amount=-1 +kerning first=110 second=241 amount=-1 +kerning first=101 second=242 amount=-1 +kerning first=69 second=274 amount=-2 +kerning first=206 second=363 amount=-2 +kerning first=220 second=197 amount=-4 +kerning first=362 second=287 amount=-4 +kerning first=350 second=248 amount=-1 +kerning first=347 second=8249 amount=-1 +kerning first=251 second=241 amount=-1 +kerning first=326 second=287 amount=-2 +kerning first=106 second=228 amount=-2 +kerning first=194 second=263 amount=-1 +kerning first=346 second=193 amount=-4 +kerning first=70 second=228 amount=-1 +kerning first=45 second=197 amount=-4 +kerning first=230 second=263 amount=-1 +kerning first=8216 second=230 amount=-3 +kerning first=314 second=248 amount=-1 +kerning first=311 second=8249 amount=-3 +kerning first=266 second=263 amount=-2 +kerning first=274 second=193 amount=-2 +kerning first=97 second=235 amount=-1 +kerning first=206 second=248 amount=-2 +kerning first=203 second=8249 amount=-2 +kerning first=74 second=241 amount=-1 +kerning first=302 second=263 amount=-2 +kerning first=274 second=221 amount=-1 +kerning first=315 second=318 amount=-2 +kerning first=222 second=197 amount=-4 +kerning first=283 second=331 amount=-2 +kerning first=310 second=221 amount=-2 +kerning first=364 second=352 amount=-3 +kerning first=351 second=318 amount=-2 +kerning first=350 second=112 amount=-3 +kerning first=202 second=221 amount=-1 +kerning first=323 second=255 amount=-2 +kerning first=314 second=112 amount=-1 +kerning first=287 second=255 amount=-1 +kerning first=278 second=112 amount=-2 +kerning first=70 second=331 amount=-1 +kerning first=251 second=255 amount=-3 +kerning first=366 second=197 amount=-4 +kerning first=242 second=112 amount=-1 +kerning first=106 second=331 amount=-2 +kerning first=8222 second=369 amount=-1 +kerning first=206 second=262 amount=-2 +kerning first=1064 second=1072 amount=-1 +kerning first=67 second=74 amount=-2 +kerning first=206 second=112 amount=-1 +kerning first=278 second=318 amount=-1 +kerning first=45 second=314 amount=-1 +kerning first=211 second=200 amount=-2 +kerning first=110 second=255 amount=-2 +kerning first=278 second=262 amount=-1 +kerning first=8216 second=244 amount=-3 +kerning first=117 second=314 amount=-2 +kerning first=79 second=352 amount=-1 +kerning first=207 second=290 amount=-2 +kerning first=208 second=74 amount=-2 +kerning first=1088 second=1085 amount=-1 +kerning first=374 second=249 amount=-1 +kerning first=75 second=111 amount=-2 +kerning first=278 second=98 amount=-1 +kerning first=280 second=74 amount=-1 +kerning first=377 second=105 amount=-1 +kerning first=202 second=207 amount=-2 +kerning first=242 second=98 amount=-1 +kerning first=75 second=283 amount=-2 +kerning first=228 second=281 amount=-1 +kerning first=256 second=352 amount=-3 +kerning first=352 second=74 amount=-2 +kerning first=365 second=380 amount=-2 +kerning first=258 second=314 amount=-2 +kerning first=220 second=352 amount=-3 +kerning first=66 second=290 amount=-3 +kerning first=378 second=112 amount=-3 +kerning first=346 second=221 amount=-3 +kerning first=101 second=98 amount=-2 +kerning first=233 second=105 amount=-2 +kerning first=65 second=98 amount=-2 +kerning first=269 second=105 amount=-2 +kerning first=195 second=333 amount=-1 +kerning first=317 second=67 amount=-1 +kerning first=218 second=97 amount=-3 +kerning first=222 second=68 amount=-2 +kerning first=347 second=8221 amount=-2 +kerning first=222 second=80 amount=-2 +kerning first=267 second=333 amount=-1 +kerning first=81 second=68 amount=-2 +kerning first=231 second=333 amount=-1 +kerning first=209 second=67 amount=-2 +kerning first=121 second=224 amount=-3 +kerning first=87 second=282 amount=-1 +kerning first=233 second=287 amount=-3 +kerning first=275 second=8221 amount=-2 +kerning first=81 second=80 amount=-2 +kerning first=365 second=106 amount=-2 +kerning first=45 second=80 amount=-5 +kerning first=90 second=333 amount=-1 +kerning first=255 second=45 amount=-4 +kerning first=257 second=106 amount=-1 +kerning first=334 second=224 amount=-1 +kerning first=199 second=346 amount=-3 +kerning first=102 second=345 amount=-1 +kerning first=200 second=217 amount=-2 +kerning first=325 second=81 amount=-2 +kerning first=298 second=224 amount=-2 +kerning first=80 second=256 amount=-4 +kerning first=1079 second=1099 amount=-1 +kerning first=370 second=224 amount=-3 +kerning first=204 second=230 amount=-2 +kerning first=379 second=346 amount=-1 +kerning first=217 second=243 amount=-2 +kerning first=107 second=101 amount=-3 +kerning first=253 second=243 amount=-3 +kerning first=99 second=230 amount=-2 +kerning first=213 second=204 amount=-2 +kerning first=339 second=333 amount=-1 +kerning first=321 second=204 amount=-2 +kerning first=303 second=333 amount=-3 +kerning first=45 second=68 amount=-5 +kerning first=221 second=256 amount=-6 +kerning first=1043 second=1099 amount=-2 +kerning first=230 second=283 amount=-1 +kerning first=375 second=333 amount=-3 +kerning first=232 second=307 amount=-2 +kerning first=356 second=101 amount=-3 +kerning first=80 second=120 amount=-1 +kerning first=370 second=79 amount=-1 +kerning first=116 second=120 amount=-1 +kerning first=321 second=218 amount=-3 +kerning first=1039 second=1072 amount=-1 +kerning first=262 second=79 amount=-3 +kerning first=90 second=335 amount=-1 +kerning first=298 second=79 amount=-2 +kerning first=376 second=192 amount=-6 +kerning first=200 second=334 amount=-1 +kerning first=221 second=120 amount=-2 +kerning first=192 second=268 amount=-3 +kerning first=289 second=243 amount=-2 +kerning first=98 second=251 amount=-1 +kerning first=325 second=243 amount=-2 +kerning first=315 second=347 amount=-1 +kerning first=264 second=268 amount=-3 +kerning first=1092 second=1098 amount=-1 +kerning first=268 second=192 amount=-3 +kerning first=203 second=251 amount=-2 +kerning first=198 second=315 amount=-2 +kerning first=344 second=334 amount=-3 +kerning first=275 second=251 amount=-2 +kerning first=217 second=229 amount=-3 +kerning first=272 second=217 amount=-1 +kerning first=253 second=229 amount=-3 +kerning first=87 second=268 amount=-3 +kerning first=272 second=203 amount=-2 +kerning first=347 second=251 amount=-1 +kerning first=112 second=229 amount=-1 +kerning first=344 second=217 amount=-3 +kerning first=311 second=251 amount=-1 +kerning first=200 second=203 amount=-2 +kerning first=257 second=120 amount=-1 +kerning first=213 second=218 amount=-1 +kerning first=1075 second=1072 amount=-1 +kerning first=336 second=282 amount=-2 +kerning first=289 second=229 amount=-3 +kerning first=381 second=118 amount=-2 +kerning first=264 second=282 amount=-3 +kerning first=325 second=229 amount=-2 +kerning first=365 second=120 amount=-2 +kerning first=325 second=257 amount=-2 +kerning first=344 second=219 amount=-3 +kerning first=277 second=261 amount=-2 +kerning first=221 second=368 amount=-1 +kerning first=249 second=232 amount=-1 +kerning first=105 second=371 amount=-1 +kerning first=253 second=257 amount=-3 +kerning first=272 second=219 amount=-1 +kerning first=289 second=257 amount=-3 +kerning first=1024 second=1036 amount=-1 +kerning first=376 second=267 amount=-3 +kerning first=86 second=336 amount=-3 +kerning first=200 second=219 amount=-2 +kerning first=217 second=257 amount=-3 +kerning first=304 second=279 amount=-2 +kerning first=72 second=232 amount=-2 +kerning first=231 second=361 amount=-2 +kerning first=112 second=257 amount=-1 +kerning first=376 second=279 amount=-3 +kerning first=195 second=361 amount=-3 +kerning first=45 second=66 amount=-5 +kerning first=66 second=278 amount=-4 +kerning first=298 second=121 amount=-2 +kerning first=192 second=254 amount=-2 +kerning first=199 second=374 amount=-1 +kerning first=262 second=121 amount=-1 +kerning first=228 second=254 amount=-1 +kerning first=226 second=121 amount=-3 +kerning first=264 second=254 amount=-1 +kerning first=224 second=275 amount=-1 +kerning first=204 second=244 amount=-2 +kerning first=350 second=344 amount=-3 +kerning first=290 second=69 amount=-1 +kerning first=1060 second=1036 amount=-1 +kerning first=268 second=267 amount=-2 +kerning first=222 second=82 amount=-2 +kerning first=347 second=289 amount=-3 +kerning first=304 second=267 amount=-2 +kerning first=85 second=121 amount=-1 +kerning first=85 second=79 amount=-1 +kerning first=315 second=278 amount=-2 +kerning first=196 second=267 amount=-1 +kerning first=81 second=66 amount=-2 +kerning first=232 second=267 amount=-1 +kerning first=8217 second=260 amount=-6 +kerning first=1064 second=1047 amount=-1 +kerning first=304 second=281 amount=-2 +kerning first=214 second=382 amount=-2 +kerning first=45 second=82 amount=-5 +kerning first=196 second=117 amount=-3 +kerning first=250 second=382 amount=-2 +kerning first=108 second=246 amount=-1 +kerning first=253 second=271 amount=-3 +kerning first=376 second=281 amount=-3 +kerning first=286 second=382 amount=-1 +kerning first=72 second=246 amount=-2 +kerning first=289 second=271 amount=-2 +kerning first=1043 second=1057 amount=-1 +kerning first=268 second=117 amount=-2 +kerning first=121 second=107 amount=-2 +kerning first=232 second=117 amount=-2 +kerning first=1079 second=1085 amount=-1 +kerning first=196 second=281 amount=-1 +kerning first=73 second=382 amount=-1 +kerning first=272 second=205 amount=-2 +kerning first=1043 second=1085 amount=-2 +kerning first=304 second=117 amount=-2 +kerning first=232 second=281 amount=-1 +kerning first=109 second=382 amount=-1 +kerning first=240 second=230 amount=-1 +kerning first=370 second=121 amount=-1 +kerning first=268 second=281 amount=-2 +kerning first=376 second=117 amount=-2 +kerning first=72 second=352 amount=-2 +kerning first=264 second=240 amount=-2 +kerning first=339 second=347 amount=-2 +kerning first=303 second=347 amount=-2 +kerning first=234 second=8250 amount=-2 +kerning first=375 second=361 amount=-1 +kerning first=267 second=347 amount=-2 +kerning first=200 second=205 amount=-2 +kerning first=228 second=240 amount=-1 +kerning first=368 second=379 amount=-1 +kerning first=231 second=347 amount=-2 +kerning first=262 second=107 amount=-1 +kerning first=302 second=339 amount=-2 +kerning first=246 second=371 amount=-1 +kerning first=195 second=347 amount=-2 +kerning first=226 second=107 amount=-1 +kerning first=1067 second=1095 amount=-1 +kerning first=202 second=305 amount=-1 +kerning first=204 second=216 amount=-2 +kerning first=1031 second=1095 amount=-1 +kerning first=90 second=347 amount=-2 +kerning first=274 second=305 amount=-1 +kerning first=115 second=226 amount=-1 +kerning first=354 second=245 amount=-3 +kerning first=370 second=266 amount=-1 +kerning first=1050 second=1083 amount=-2 +kerning first=377 second=65 amount=-1 +kerning first=78 second=252 amount=-1 +kerning first=346 second=305 amount=-3 +kerning first=220 second=226 amount=-3 +kerning first=298 second=266 amount=-2 +kerning first=1037 second=1057 amount=-1 +kerning first=102 second=46 amount=-1 +kerning first=86 second=8250 amount=-3 +kerning first=220 second=336 amount=-1 +kerning first=256 second=336 amount=-3 +kerning first=382 second=305 amount=-2 +kerning first=109 second=122 amount=-1 +kerning first=207 second=112 amount=-1 +kerning first=328 second=226 amount=-1 +kerning first=335 second=8250 amount=-2 +kerning first=1070 second=1062 amount=-1 +kerning first=262 second=266 amount=-3 +kerning first=73 second=122 amount=-1 +kerning first=1116 second=1104 amount=-2 +kerning first=364 second=226 amount=-3 +kerning first=74 second=197 amount=-5 +kerning first=381 second=102 amount=-3 +kerning first=364 second=336 amount=-1 +kerning first=327 second=252 amount=-1 +kerning first=193 second=219 amount=-3 +kerning first=363 second=252 amount=-1 +kerning first=198 second=316 amount=-1 +kerning first=382 second=45 amount=-3 +kerning first=88 second=219 amount=-2 +kerning first=234 second=316 amount=-3 +kerning first=1064 second=1108 amount=-1 +kerning first=211 second=202 amount=-2 +kerning first=296 second=335 amount=-2 +kerning first=289 second=259 amount=-3 +kerning first=219 second=252 amount=-1 +kerning first=253 second=259 amount=-3 +kerning first=255 second=252 amount=-1 +kerning first=201 second=102 amount=-2 +kerning first=378 second=316 amount=-2 +kerning first=105 second=245 amount=-1 +kerning first=291 second=252 amount=-1 +kerning first=325 second=259 amount=-2 +kerning first=272 second=229 amount=-1 +kerning first=79 second=226 amount=-1 +kerning first=246 second=369 amount=-1 +kerning first=112 second=259 amount=-1 +kerning first=97 second=45 amount=-2 +kerning first=314 second=246 amount=-1 +kerning first=65 second=332 amount=-3 +kerning first=81 second=356 amount=-2 +kerning first=332 second=103 amount=-1 +kerning first=8216 second=85 amount=-1 +kerning first=103 second=116 amount=-1 +kerning first=45 second=356 amount=-4 +kerning first=116 second=382 amount=-1 +kerning first=217 second=259 amount=-3 +kerning first=244 second=116 amount=-1 +kerning first=356 second=375 amount=-3 +kerning first=83 second=328 amount=-1 +kerning first=282 second=369 amount=-2 +kerning first=260 second=103 amount=-3 +kerning first=1045 second=1103 amount=-2 +kerning first=206 second=246 amount=-2 +kerning first=69 second=369 amount=-2 +kerning first=224 second=103 amount=-2 +kerning first=110 second=253 amount=-2 +kerning first=274 second=45 amount=-2 +kerning first=8220 second=74 amount=-3 +kerning first=370 second=45 amount=-5 +kerning first=101 second=246 amount=-1 +kerning first=206 second=332 amount=-2 +kerning first=119 second=103 amount=-3 +kerning first=346 second=45 amount=-3 +kerning first=65 second=246 amount=-1 +kerning first=8250 second=221 amount=-4 +kerning first=105 second=369 amount=-1 +kerning first=83 second=103 amount=-3 +kerning first=251 second=253 amount=-3 +kerning first=310 second=45 amount=-4 +kerning first=278 second=332 amount=-1 +kerning first=102 second=120 amount=-1 +kerning first=365 second=382 amount=-2 +kerning first=253 second=109 amount=-2 +kerning first=107 second=375 amount=-1 +kerning first=1045 second=1075 amount=-1 +kerning first=217 second=109 amount=-2 +kerning first=286 second=122 amount=-1 +kerning first=346 second=196 amount=-4 +kerning first=85 second=266 amount=-1 +kerning first=268 second=279 amount=-2 +kerning first=250 second=122 amount=-2 +kerning first=289 second=109 amount=-1 +kerning first=214 second=122 amount=-2 +kerning first=352 second=68 amount=-3 +kerning first=87 second=242 amount=-3 +kerning first=221 second=382 amount=-3 +kerning first=76 second=109 amount=-1 +kerning first=70 second=97 amount=-2 +kerning first=316 second=116 amount=-1 +kerning first=8218 second=98 amount=-1 +kerning first=228 second=242 amount=-1 +kerning first=258 second=356 amount=-6 +kerning first=257 second=382 amount=-1 +kerning first=354 second=369 amount=-2 +kerning first=248 second=375 amount=-3 +kerning first=192 second=242 amount=-1 +kerning first=222 second=356 amount=-2 +kerning first=201 second=362 amount=-2 +kerning first=1056 second=1024 amount=-1 +kerning first=84 second=194 amount=-6 +kerning first=352 second=116 amount=-1 +kerning first=264 second=242 amount=-2 +kerning first=248 second=115 amount=-2 +kerning first=352 second=378 amount=-2 +kerning first=364 second=198 amount=-4 +kerning first=105 second=273 amount=-1 +kerning first=45 second=345 amount=-2 +kerning first=112 second=355 amount=-1 +kerning first=1056 second=1036 amount=-1 +kerning first=346 second=73 amount=-3 +kerning first=83 second=75 amount=-3 +kerning first=316 second=8217 amount=-3 +kerning first=220 second=198 amount=-4 +kerning first=196 second=119 amount=-3 +kerning first=352 second=8217 amount=-2 +kerning first=289 second=355 amount=-1 +kerning first=232 second=119 amount=-2 +kerning first=8222 second=97 amount=-2 +kerning first=356 second=115 amount=-3 +kerning first=253 second=355 amount=-1 +kerning first=268 second=119 amount=-1 +kerning first=315 second=203 amount=-2 +kerning first=112 second=228 amount=-1 +kerning first=288 second=313 amount=-1 +kerning first=304 second=119 amount=-2 +kerning first=287 second=253 amount=-1 +kerning first=350 second=74 amount=-2 +kerning first=257 second=108 amount=-1 +kerning first=70 second=230 amount=-2 +kerning first=323 second=253 amount=-2 +kerning first=221 second=73 amount=-1 +kerning first=216 second=313 amount=-2 +kerning first=211 second=315 amount=-2 +kerning first=365 second=108 amount=-2 +kerning first=274 second=73 amount=-2 +kerning first=368 second=381 amount=-1 +kerning first=371 second=171 amount=-2 +kerning first=1094 second=1105 amount=-1 +kerning first=332 second=75 amount=-2 +kerning first=118 second=269 amount=-3 +kerning first=1072 second=1082 amount=-1 +kerning first=350 second=246 amount=-1 +kerning first=82 second=269 amount=-3 +kerning first=119 second=335 amount=-3 +kerning first=198 second=196 amount=-2 +kerning first=251 second=225 amount=-1 +kerning first=224 second=335 amount=-1 +kerning first=289 second=231 amount=-2 +kerning first=287 second=225 amount=-3 +kerning first=260 second=335 amount=-1 +kerning first=325 second=231 amount=-2 +kerning first=259 second=269 amount=-1 +kerning first=116 second=108 amount=-1 +kerning first=381 second=221 amount=-2 +kerning first=367 second=269 amount=-1 +kerning first=1077 second=1100 amount=-1 +kerning first=83 second=363 amount=-1 +kerning first=74 second=225 amount=-3 +kerning first=119 second=363 amount=-1 +kerning first=110 second=225 amount=-1 +kerning first=83 second=335 amount=-1 +kerning first=366 second=328 amount=-2 +kerning first=224 second=363 amount=-1 +kerning first=1056 second=1086 amount=-1 +kerning first=260 second=363 amount=-3 +kerning first=356 second=286 amount=-3 +kerning first=8218 second=220 amount=-3 +kerning first=208 second=8217 amount=-2 +kerning first=296 second=363 amount=-2 +kerning first=8216 second=345 amount=-1 +kerning first=244 second=8217 amount=-2 +kerning first=8216 second=263 amount=-3 +kerning first=65 second=218 amount=-3 +kerning first=1057 second=1063 amount=-1 +kerning first=368 second=363 amount=-1 +kerning first=8220 second=255 amount=-1 +kerning first=350 second=218 amount=-3 +kerning first=107 second=115 amount=-2 +kerning first=253 second=231 amount=-3 +kerning first=66 second=203 amount=-4 +kerning first=243 second=46 amount=-3 +kerning first=1113 second=1076 amount=-2 +kerning first=278 second=218 amount=-2 +kerning first=279 second=46 amount=-3 +kerning first=1077 second=1076 amount=-1 +kerning first=98 second=8221 amount=-2 +kerning first=79 second=368 amount=-1 +kerning first=303 second=235 amount=-3 +kerning first=1105 second=1118 amount=-1 +kerning first=266 second=261 amount=-2 +kerning first=197 second=367 amount=-3 +kerning first=366 second=122 amount=-3 +kerning first=339 second=235 amount=-1 +kerning first=1069 second=1118 amount=-1 +kerning first=302 second=261 amount=-2 +kerning first=375 second=235 amount=-3 +kerning first=338 second=261 amount=-1 +kerning first=334 second=8220 amount=-2 +kerning first=86 second=296 amount=-1 +kerning first=1074 second=1117 amount=-1 +kerning first=8218 second=218 amount=-3 +kerning first=89 second=261 amount=-5 +kerning first=8250 second=193 amount=-4 +kerning first=330 second=211 amount=-2 +kerning first=68 second=327 amount=-2 +kerning first=1065 second=1072 amount=-1 +kerning first=226 second=8220 amount=-3 +kerning first=259 second=347 amount=-1 +kerning first=258 second=211 amount=-3 +kerning first=381 second=275 amount=-1 +kerning first=89 second=378 amount=-3 +kerning first=227 second=269 amount=-1 +kerning first=233 second=250 amount=-2 +kerning first=102 second=244 amount=-1 +kerning first=216 second=171 amount=-1 +kerning first=235 second=112 amount=-1 +kerning first=97 second=382 amount=-1 +kerning first=197 second=250 amount=-3 +kerning first=252 second=171 amount=-2 +kerning first=199 second=112 amount=-3 +kerning first=45 second=206 amount=-5 +kerning first=366 second=211 amount=-1 +kerning first=1086 second=1083 amount=-2 +kerning first=90 second=235 amount=-1 +kerning first=366 second=326 amount=-2 +kerning first=317 second=327 amount=-2 +kerning first=199 second=86 amount=-1 +kerning first=269 second=250 amount=-2 +kerning first=374 second=261 amount=-5 +kerning first=66 second=217 amount=-3 +kerning first=195 second=235 amount=-1 +kerning first=117 second=326 amount=-1 +kerning first=117 second=328 amount=-1 +kerning first=277 second=109 amount=-2 +kerning first=75 second=171 amount=-4 +kerning first=231 second=235 amount=-1 +kerning first=84 second=192 amount=-6 +kerning first=213 second=206 amount=-2 +kerning first=267 second=235 amount=-1 +kerning first=45 second=328 amount=-2 +kerning first=321 second=206 amount=-2 +kerning first=90 second=237 amount=-1 +kerning first=370 second=353 amount=-2 +kerning first=87 second=117 amount=-2 +kerning first=314 second=100 amount=-1 +kerning first=305 second=365 amount=-1 +kerning first=374 second=378 amount=-3 +kerning first=350 second=100 amount=-1 +kerning first=89 second=263 amount=-3 +kerning first=269 second=365 amount=-2 +kerning first=233 second=365 amount=-2 +kerning first=87 second=366 amount=-1 +kerning first=90 second=200 amount=-1 +kerning first=197 second=365 amount=-3 +kerning first=76 second=83 amount=-1 +kerning first=266 second=378 amount=-2 +kerning first=226 second=353 amount=-1 +kerning first=336 second=366 amount=-1 +kerning first=379 second=112 amount=-1 +kerning first=230 second=378 amount=-2 +kerning first=262 second=353 amount=-2 +kerning first=206 second=100 amount=-2 +kerning first=256 second=45 amount=-4 +kerning first=298 second=353 amount=-2 +kerning first=379 second=262 amount=-1 +kerning first=1025 second=1094 amount=-1 +kerning first=264 second=366 amount=-2 +kerning first=307 second=112 amount=-1 +kerning first=217 second=83 amount=-3 +kerning first=302 second=378 amount=-1 +kerning first=107 second=113 amount=-3 +kerning first=85 second=353 amount=-2 +kerning first=346 second=223 amount=-1 +kerning first=213 second=352 amount=-1 +kerning first=79 second=198 amount=-4 +kerning first=325 second=83 amount=-2 +kerning first=121 second=353 amount=-3 +kerning first=65 second=100 amount=-1 +kerning first=1027 second=1078 amount=-3 +kerning first=321 second=352 amount=-1 +kerning first=195 second=87 amount=-6 +kerning first=116 second=361 amount=-1 +kerning first=101 second=100 amount=-1 +kerning first=198 second=288 amount=-1 +kerning first=8250 second=305 amount=-1 +kerning first=90 second=87 amount=-2 +kerning first=1101 second=1091 amount=-1 +kerning first=202 second=223 amount=-1 +kerning first=67 second=233 amount=-2 +kerning first=377 second=365 amount=-3 +kerning first=76 second=356 amount=-3 +kerning first=274 second=223 amount=-1 +kerning first=370 second=379 amount=-1 +kerning first=1060 second=1040 amount=-3 +kerning first=286 second=304 amount=-1 +kerning first=108 second=324 amount=-1 +kerning first=363 second=99 amount=-1 +kerning first=334 second=379 amount=-2 +kerning first=377 second=339 amount=-1 +kerning first=269 second=339 amount=-1 +kerning first=214 second=304 amount=-2 +kerning first=89 second=289 amount=-4 +kerning first=101 second=305 amount=-2 +kerning first=316 second=233 amount=-1 +kerning first=195 second=89 amount=-6 +kerning first=199 second=114 amount=-1 +kerning first=201 second=249 amount=-2 +kerning first=194 second=289 amount=-3 +kerning first=235 second=114 amount=-1 +kerning first=230 second=289 amount=-3 +kerning first=352 second=233 amount=-1 +kerning first=266 second=289 amount=-3 +kerning first=78 second=99 amount=-2 +kerning first=1070 second=1064 amount=-1 +kerning first=89 second=110 amount=-3 +kerning first=67 second=350 amount=-3 +kerning first=313 second=274 amount=-2 +kerning first=375 second=237 amount=-2 +kerning first=379 second=84 amount=-2 +kerning first=339 second=237 amount=-2 +kerning first=1114 second=1114 amount=-1 +kerning first=85 second=379 amount=-1 +kerning first=230 second=110 amount=-2 +kerning first=303 second=237 amount=-1 +kerning first=255 second=99 amount=-3 +kerning first=266 second=110 amount=-1 +kerning first=267 second=237 amount=-2 +kerning first=1105 second=1116 amount=-1 +kerning first=197 second=339 amount=-1 +kerning first=223 second=187 amount=-2 +kerning first=219 second=99 amount=-2 +kerning first=231 second=237 amount=-2 +kerning first=280 second=350 amount=-2 +kerning first=233 second=339 amount=-1 +kerning first=249 second=324 amount=-1 +kerning first=327 second=99 amount=-2 +kerning first=85 second=381 amount=-1 +kerning first=338 second=110 amount=-1 +kerning first=195 second=237 amount=-1 +kerning first=291 second=99 amount=-2 +kerning first=262 second=379 amount=-2 +kerning first=1048 second=1060 amount=-1 +kerning first=374 second=110 amount=-3 +kerning first=208 second=350 amount=-1 +kerning first=321 second=324 amount=-1 +kerning first=381 second=277 amount=-1 +kerning first=86 second=212 amount=-3 +kerning first=379 second=234 amount=-1 +kerning first=1101 second=1119 amount=-1 +kerning first=45 second=326 amount=-2 +kerning first=352 second=350 amount=-1 +kerning first=1045 second=1101 amount=-1 +kerning first=313 second=302 amount=-2 +kerning first=8220 second=370 amount=-1 +kerning first=199 second=234 amount=-2 +kerning first=75 second=113 amount=-2 +kerning first=370 second=264 amount=-1 +kerning first=235 second=234 amount=-1 +kerning first=338 second=71 amount=-1 +kerning first=1038 second=1089 amount=-4 +kerning first=212 second=260 amount=-4 +kerning first=298 second=264 amount=-2 +kerning first=307 second=234 amount=-1 +kerning first=302 second=289 amount=-3 +kerning first=262 second=351 amount=-2 +kerning first=262 second=264 amount=-3 +kerning first=278 second=72 amount=-2 +kerning first=284 second=260 amount=-3 +kerning first=45 second=354 amount=-4 +kerning first=338 second=289 amount=-3 +kerning first=281 second=324 amount=-2 +kerning first=377 second=367 amount=-3 +kerning first=90 second=89 amount=-2 +kerning first=81 second=354 amount=-2 +kerning first=374 second=289 amount=-4 +kerning first=350 second=72 amount=-3 +kerning first=356 second=260 amount=-6 +kerning first=1055 second=1054 amount=-1 +kerning first=298 second=351 amount=-2 +kerning first=75 second=199 amount=-3 +kerning first=79 second=76 amount=-2 +kerning first=305 second=367 amount=-1 +kerning first=85 second=351 amount=-2 +kerning first=85 second=264 amount=-1 +kerning first=222 second=354 amount=-2 +kerning first=201 second=364 amount=-2 +kerning first=233 second=367 amount=-2 +kerning first=90 second=209 amount=-1 +kerning first=258 second=354 amount=-6 +kerning first=275 second=111 amount=-1 +kerning first=269 second=367 amount=-2 +kerning first=377 second=110 amount=-1 +kerning first=121 second=351 amount=-3 +kerning first=121 second=223 amount=-1 +kerning first=268 second=8249 amount=-4 +kerning first=119 second=361 amount=-1 +kerning first=275 second=267 amount=-1 +kerning first=78 second=264 amount=-2 +kerning first=108 second=226 amount=-2 +kerning first=78 second=121 amount=-2 +kerning first=83 second=361 amount=-1 +kerning first=311 second=267 amount=-3 +kerning first=118 second=277 amount=-3 +kerning first=327 second=367 amount=-2 +kerning first=1030 second=1095 amount=-1 +kerning first=224 second=361 amount=-1 +kerning first=82 second=277 amount=-3 +kerning first=203 second=377 amount=-1 +kerning first=363 second=367 amount=-1 +kerning first=1036 second=1077 amount=-2 +kerning first=255 second=367 amount=-1 +kerning first=296 second=361 amount=-2 +kerning first=199 second=254 amount=-1 +kerning first=99 second=351 amount=-2 +kerning first=253 second=111 amount=-3 +kerning first=354 second=257 amount=-5 +kerning first=291 second=367 amount=-1 +kerning first=260 second=361 amount=-3 +kerning first=235 second=254 amount=-2 +kerning first=240 second=351 amount=-2 +kerning first=289 second=111 amount=-2 +kerning first=84 second=287 amount=-4 +kerning first=264 second=114 amount=-1 +kerning first=368 second=361 amount=-1 +kerning first=314 second=45 amount=-3 +kerning first=325 second=111 amount=-2 +kerning first=282 second=257 amount=-1 +kerning first=219 second=367 amount=-1 +kerning first=280 second=364 amount=-2 +kerning first=307 second=254 amount=-1 +kerning first=1025 second=1074 amount=-1 +kerning first=212 second=274 amount=-2 +kerning first=244 second=261 amount=-1 +kerning first=78 second=367 amount=-2 +kerning first=347 second=117 amount=-1 +kerning first=336 second=374 amount=-2 +kerning first=120 second=287 amount=-2 +kerning first=280 second=261 amount=-1 +kerning first=269 second=244 amount=-1 +kerning first=311 second=117 amount=-1 +kerning first=261 second=287 amount=-1 +kerning first=87 second=114 amount=-1 +kerning first=363 second=121 amount=-3 +kerning first=352 second=104 amount=-2 +kerning first=1088 second=1081 amount=-1 +kerning first=264 second=374 amount=-1 +kerning first=71 second=274 amount=-1 +kerning first=225 second=287 amount=-2 +kerning first=352 second=261 amount=-2 +kerning first=327 second=121 amount=-2 +kerning first=316 second=104 amount=-1 +kerning first=67 second=274 amount=-3 +kerning first=356 second=274 amount=-1 +kerning first=333 second=287 amount=-2 +kerning first=67 second=261 amount=-2 +kerning first=377 second=244 amount=-1 +kerning first=291 second=121 amount=-1 +kerning first=213 second=344 amount=-2 +kerning first=192 second=374 amount=-6 +kerning first=327 second=250 amount=-2 +kerning first=103 second=261 amount=-3 +kerning first=219 second=381 amount=-1 +kerning first=332 second=237 amount=-1 +kerning first=284 second=274 amount=-1 +kerning first=219 second=121 amount=-1 +kerning first=116 second=351 amount=-1 +kerning first=296 second=237 amount=-1 +kerning first=369 second=287 amount=-3 +kerning first=208 second=261 amount=-1 +kerning first=321 second=344 amount=-2 +kerning first=224 second=347 amount=-1 +kerning first=255 second=107 amount=-2 +kerning first=219 second=250 amount=-1 +kerning first=1076 second=1104 amount=-1 +kerning first=103 second=378 amount=-3 +kerning first=266 second=171 amount=-4 +kerning first=1040 second=1104 amount=-2 +kerning first=119 second=347 amount=-3 +kerning first=291 second=250 amount=-1 +kerning first=289 second=289 amount=-2 +kerning first=83 second=347 amount=-1 +kerning first=275 second=281 amount=-1 +kerning first=291 second=107 amount=-2 +kerning first=379 second=240 amount=-1 +kerning first=255 second=250 amount=-1 +kerning first=338 second=171 amount=-2 +kerning first=339 second=271 amount=-1 +kerning first=1057 second=1047 amount=-1 +kerning first=305 second=250 amount=-1 +kerning first=89 second=171 amount=-5 +kerning first=67 second=378 amount=-2 +kerning first=74 second=354 amount=-1 +kerning first=275 second=117 amount=-2 +kerning first=377 second=230 amount=-1 +kerning first=78 second=250 amount=-2 +kerning first=194 second=171 amount=-4 +kerning first=1118 second=1108 amount=-2 +kerning first=74 second=74 amount=-2 +kerning first=253 second=371 amount=-1 +kerning first=210 second=257 amount=-1 +kerning first=289 second=371 amount=-1 +kerning first=69 second=257 amount=-1 +kerning first=327 second=264 amount=-2 +kerning first=105 second=257 amount=-2 +kerning first=368 second=347 amount=-2 +kerning first=374 second=171 amount=-5 +kerning first=375 second=110 amount=-2 +kerning first=363 second=107 amount=-2 +kerning first=192 second=100 amount=-1 +kerning first=307 second=240 amount=-1 +kerning first=88 second=314 amount=-1 +kerning first=219 second=264 amount=-1 +kerning first=296 second=347 amount=-2 +kerning first=228 second=100 amount=-1 +kerning first=199 second=240 amount=-2 +kerning first=229 second=314 amount=-1 +kerning first=260 second=347 amount=-2 +kerning first=323 second=74 amount=-1 +kerning first=264 second=100 amount=-2 +kerning first=235 second=240 amount=-1 +kerning first=202 second=102 amount=-2 +kerning first=193 second=314 amount=-2 +kerning first=213 second=220 amount=-1 +kerning first=208 second=90 amount=-2 +kerning first=214 second=298 amount=-2 +kerning first=204 second=71 amount=-2 +kerning first=213 second=330 amount=-2 +kerning first=1119 second=1108 amount=-1 +kerning first=280 second=90 amount=-1 +kerning first=286 second=298 amount=-1 +kerning first=1092 second=1114 amount=-1 +kerning first=317 second=207 amount=-2 +kerning first=290 second=317 amount=-1 +kerning first=68 second=201 amount=-2 +kerning first=204 second=214 amount=-2 +kerning first=337 second=314 amount=-2 +kerning first=321 second=330 amount=-2 +kerning first=68 second=207 amount=-2 +kerning first=1024 second=1024 amount=-1 +kerning first=367 second=291 amount=-3 +kerning first=1025 second=1075 amount=-1 +kerning first=331 second=291 amount=-2 +kerning first=362 second=194 amount=-4 +kerning first=1083 second=1108 amount=-1 +kerning first=321 second=220 amount=-3 +kerning first=90 second=221 amount=-2 +kerning first=258 second=213 amount=-3 +kerning first=269 second=224 amount=-2 +kerning first=259 second=291 amount=-2 +kerning first=99 second=337 amount=-1 +kerning first=122 second=324 amount=-2 +kerning first=290 second=200 amount=-1 +kerning first=233 second=224 amount=-2 +kerning first=272 second=304 amount=-2 +kerning first=86 second=324 amount=-3 +kerning first=217 second=97 amount=-3 +kerning first=200 second=318 amount=-1 +kerning first=187 second=291 amount=-3 +kerning first=227 second=324 amount=-1 +kerning first=305 second=224 amount=-1 +kerning first=118 second=291 amount=-3 +kerning first=112 second=97 amount=-1 +kerning first=82 second=291 amount=-3 +kerning first=1038 second=1101 amount=-3 +kerning first=325 second=97 amount=-2 +kerning first=321 second=84 amount=-3 +kerning first=78 second=101 amount=-2 +kerning first=366 second=213 amount=-1 +kerning first=377 second=224 amount=-1 +kerning first=275 second=109 amount=-2 +kerning first=235 second=251 amount=-2 +kerning first=8250 second=195 amount=-4 +kerning first=317 second=311 amount=-2 +kerning first=344 second=318 amount=-3 +kerning first=204 second=337 amount=-2 +kerning first=1025 second=1088 amount=-1 +kerning first=253 second=97 amount=-3 +kerning first=281 second=311 amount=-2 +kerning first=380 second=318 amount=-2 +kerning first=67 second=90 amount=-2 +kerning first=289 second=97 amount=-3 +kerning first=213 second=84 amount=-2 +kerning first=245 second=311 amount=-1 +kerning first=219 second=101 amount=-2 +kerning first=72 second=234 amount=-2 +kerning first=326 second=303 amount=-1 +kerning first=1036 second=1057 amount=-4 +kerning first=103 second=104 amount=-2 +kerning first=255 second=101 amount=-3 +kerning first=281 second=187 amount=-2 +kerning first=108 second=234 amount=-1 +kerning first=68 second=325 amount=-2 +kerning first=362 second=303 amount=-2 +kerning first=67 second=104 amount=-1 +kerning first=291 second=101 amount=-2 +kerning first=254 second=303 amount=-1 +kerning first=1057 second=1041 amount=-1 +kerning first=366 second=227 amount=-3 +kerning first=347 second=249 amount=-1 +kerning first=327 second=101 amount=-2 +kerning first=317 second=193 amount=-2 +kerning first=380 second=44 amount=-1 +kerning first=330 second=227 amount=-2 +kerning first=363 second=101 amount=-1 +kerning first=200 second=44 amount=-1 +kerning first=321 second=78 amount=-2 +kerning first=280 second=104 amount=-1 +kerning first=86 second=310 amount=-1 +kerning first=263 second=324 amount=-2 +kerning first=213 second=70 amount=-2 +kerning first=244 second=104 amount=-1 +kerning first=245 second=187 amount=-2 +kerning first=272 second=44 amount=-3 +kerning first=371 second=324 amount=-2 +kerning first=236 second=44 amount=-2 +kerning first=317 second=325 amount=-2 +kerning first=335 second=324 amount=-1 +kerning first=73 second=284 amount=-2 +kerning first=367 second=277 amount=-1 +kerning first=117 second=227 amount=-1 +kerning first=290 second=194 amount=-3 +kerning first=213 second=78 amount=-2 +kerning first=81 second=227 amount=-1 +kerning first=69 second=251 amount=-2 +kerning first=1060 second=1024 amount=-1 +kerning first=266 second=209 amount=-3 +kerning first=45 second=227 amount=-1 +kerning first=218 second=194 amount=-4 +kerning first=1092 second=1100 amount=-1 +kerning first=249 second=234 amount=-1 +kerning first=282 second=251 amount=-2 +kerning first=317 second=201 amount=-2 +kerning first=218 second=303 amount=-2 +kerning first=246 second=251 amount=-1 +kerning first=1101 second=1093 amount=-1 +kerning first=77 second=303 amount=-1 +kerning first=222 second=227 amount=-1 +kerning first=354 second=251 amount=-2 +kerning first=259 second=277 amount=-1 +kerning first=113 second=303 amount=-1 +kerning first=85 second=237 amount=-2 +kerning first=266 second=118 amount=-1 +kerning first=83 second=245 amount=-1 +kerning first=82 second=283 amount=-3 +kerning first=298 second=105 amount=-1 +kerning first=230 second=118 amount=-2 +kerning first=280 second=370 amount=-2 +kerning first=334 second=105 amount=-1 +kerning first=8250 second=327 amount=-5 +kerning first=255 second=226 amount=-3 +kerning first=226 second=105 amount=-1 +kerning first=264 second=270 amount=-3 +kerning first=302 second=118 amount=-2 +kerning first=352 second=370 amount=-3 +kerning first=262 second=105 amount=-1 +kerning first=89 second=118 amount=-3 +kerning first=260 second=245 amount=-1 +kerning first=259 second=283 amount=-1 +kerning first=192 second=368 amount=-3 +kerning first=1108 second=1083 amount=-1 +kerning first=121 second=105 amount=-2 +kerning first=310 second=335 amount=-2 +kerning first=71 second=280 amount=-1 +kerning first=224 second=245 amount=-1 +kerning first=1082 second=1079 amount=-1 +kerning first=346 second=335 amount=-1 +kerning first=194 second=118 amount=-3 +kerning first=87 second=368 amount=-1 +kerning first=382 second=335 amount=-1 +kerning first=87 second=270 amount=-1 +kerning first=323 second=268 amount=-2 +kerning first=118 second=283 amount=-3 +kerning first=85 second=105 amount=-2 +kerning first=212 second=280 amount=-2 +kerning first=316 second=241 amount=-1 +kerning first=336 second=368 amount=-1 +kerning first=200 second=45 amount=-2 +kerning first=218 second=193 amount=-4 +kerning first=68 second=193 amount=-4 +kerning first=280 second=241 amount=-1 +kerning first=367 second=283 amount=-1 +kerning first=67 second=370 amount=-2 +kerning first=67 second=223 amount=-1 +kerning first=228 second=108 amount=-1 +kerning first=264 second=368 amount=-2 +kerning first=1036 second=1083 amount=-2 +kerning first=352 second=241 amount=-1 +kerning first=192 second=108 amount=-2 +kerning first=8220 second=350 amount=-1 +kerning first=240 second=228 amount=-1 +kerning first=336 second=270 amount=-2 +kerning first=103 second=241 amount=-1 +kerning first=264 second=108 amount=-1 +kerning first=204 second=228 amount=-2 +kerning first=244 second=241 amount=-1 +kerning first=214 second=278 amount=-2 +kerning first=381 second=367 amount=-3 +kerning first=208 second=370 amount=-1 +kerning first=99 second=228 amount=-2 +kerning first=97 second=335 amount=-1 +kerning first=224 second=231 amount=-1 +kerning first=286 second=278 amount=-1 +kerning first=66 second=89 amount=-3 +kerning first=1072 second=1085 amount=-1 +kerning first=260 second=231 amount=-1 +kerning first=199 second=228 amount=-2 +kerning first=336 second=122 amount=-2 +kerning first=67 second=241 amount=-1 +kerning first=119 second=231 amount=-3 +kerning first=1072 second=1097 amount=-1 +kerning first=352 second=356 amount=-3 +kerning first=333 second=107 amount=-1 +kerning first=1108 second=1097 amount=-1 +kerning first=8250 second=313 amount=-5 +kerning first=231 second=241 amount=-2 +kerning first=264 second=122 amount=-2 +kerning first=368 second=231 amount=-2 +kerning first=280 second=356 amount=-1 +kerning first=240 second=331 amount=-1 +kerning first=336 second=73 amount=-2 +kerning first=316 second=255 amount=-3 +kerning first=374 second=116 amount=-1 +kerning first=296 second=231 amount=-2 +kerning first=336 second=256 amount=-4 +kerning first=1052 second=1073 amount=-1 +kerning first=229 second=235 amount=-1 +kerning first=1108 second=1085 amount=-1 +kerning first=244 second=255 amount=-3 +kerning first=368 second=245 amount=-2 +kerning first=296 second=81 amount=-2 +kerning first=99 second=331 amount=-2 +kerning first=310 second=220 amount=-2 +kerning first=103 second=255 amount=-1 +kerning first=296 second=245 amount=-2 +kerning first=368 second=81 amount=-1 +kerning first=67 second=255 amount=-1 +kerning first=356 second=280 amount=-1 +kerning first=99 second=345 amount=-1 +kerning first=228 second=122 amount=-1 +kerning first=1038 second=1095 amount=-3 +kerning first=83 second=231 amount=-1 +kerning first=315 second=290 amount=-1 +kerning first=1088 second=1087 amount=-1 +kerning first=370 second=105 amount=-2 +kerning first=277 second=8250 amount=-2 +kerning first=240 second=345 amount=-1 +kerning first=87 second=122 amount=-3 +kerning first=104 second=305 amount=-1 +kerning first=368 second=229 amount=-3 +kerning first=68 second=305 amount=-1 +kerning first=88 second=217 amount=-2 +kerning first=209 second=305 amount=-1 +kerning first=97 second=333 amount=-1 +kerning first=296 second=229 amount=-2 +kerning first=103 second=303 amount=-2 +kerning first=193 second=217 amount=-3 +kerning first=332 second=229 amount=-1 +kerning first=281 second=305 amount=-2 +kerning first=1046 second=1101 amount=-1 +kerning first=221 second=282 amount=-1 +kerning first=228 second=106 amount=-1 +kerning first=310 second=67 amount=-3 +kerning first=245 second=305 amount=-1 +kerning first=305 second=8220 amount=-2 +kerning first=264 second=106 amount=-1 +kerning first=274 second=67 amount=-1 +kerning first=353 second=305 amount=-2 +kerning first=65 second=346 amount=-3 +kerning first=260 second=81 amount=-3 +kerning first=317 second=305 amount=-2 +kerning first=228 second=8249 amount=-2 +kerning first=80 second=282 amount=-1 +kerning first=346 second=333 amount=-1 +kerning first=305 second=230 amount=-1 +kerning first=278 second=346 amount=-2 +kerning first=310 second=333 amount=-2 +kerning first=233 second=230 amount=-2 +kerning first=79 second=204 amount=-2 +kerning first=206 second=346 amount=-2 +kerning first=382 second=333 amount=-1 +kerning first=83 second=243 amount=-1 +kerning first=336 second=106 amount=-1 +kerning first=269 second=230 amount=-2 +kerning first=311 second=281 amount=-3 +kerning first=87 second=256 amount=-6 +kerning first=324 second=367 amount=-1 +kerning first=1108 second=1099 amount=-1 +kerning first=333 second=307 amount=-1 +kerning first=369 second=307 amount=-2 +kerning first=198 second=218 amount=-2 +kerning first=197 second=79 amount=-3 +kerning first=256 second=218 amount=-3 +kerning first=296 second=243 amount=-2 +kerning first=334 second=352 amount=-1 +kerning first=368 second=243 amount=-2 +kerning first=211 second=69 amount=-2 +kerning first=119 second=243 amount=-3 +kerning first=1039 second=1060 amount=-1 +kerning first=72 second=332 amount=-2 +kerning first=377 second=79 amount=-1 +kerning first=200 second=381 amount=-1 +kerning first=352 second=80 amount=-3 +kerning first=224 second=243 amount=-1 +kerning first=109 second=228 amount=-1 +kerning first=260 second=243 amount=-1 +kerning first=88 second=255 amount=-3 +kerning first=1027 second=1098 amount=-1 +kerning first=311 second=171 amount=-3 +kerning first=101 second=244 amount=-1 +kerning first=83 second=229 amount=-2 +kerning first=336 second=120 amount=-1 +kerning first=221 second=268 amount=-3 +kerning first=321 second=332 amount=-1 +kerning first=1027 second=1084 amount=-2 +kerning first=88 second=334 amount=-3 +kerning first=79 second=218 amount=-1 +kerning first=87 second=120 amount=-2 +kerning first=374 second=118 amount=-3 +kerning first=356 second=8250 amount=-3 +kerning first=193 second=334 amount=-3 +kerning first=119 second=229 amount=-3 +kerning first=228 second=120 amount=-1 +kerning first=235 second=242 amount=-1 +kerning first=267 second=229 amount=-2 +kerning first=262 second=99 amount=-2 +kerning first=356 second=333 amount=-3 +kerning first=1101 second=1099 amount=-1 +kerning first=69 second=109 amount=-1 +kerning first=204 second=339 amount=-2 +kerning first=311 second=279 amount=-3 +kerning first=199 second=242 amount=-2 +kerning first=303 second=229 amount=-2 +kerning first=226 second=99 amount=-1 +kerning first=279 second=261 amount=-2 +kerning first=187 second=289 amount=-3 +kerning first=307 second=242 amount=-1 +kerning first=217 second=346 amount=-3 +kerning first=223 second=289 amount=-2 +kerning first=99 second=339 amount=-1 +kerning first=231 second=229 amount=-2 +kerning first=298 second=99 amount=-2 +kerning first=105 second=109 amount=-2 +kerning first=259 second=289 amount=-2 +kerning first=307 second=122 amount=-1 +kerning first=379 second=242 amount=-1 +kerning first=295 second=289 amount=-2 +kerning first=370 second=99 amount=-2 +kerning first=331 second=289 amount=-2 +kerning first=260 second=89 amount=-6 +kerning first=350 second=232 amount=-1 +kerning first=275 second=279 amount=-1 +kerning first=286 second=282 amount=-1 +kerning first=339 second=229 amount=-2 +kerning first=367 second=289 amount=-3 +kerning first=314 second=232 amount=-1 +kerning first=375 second=229 amount=-3 +kerning first=1057 second=1049 amount=-1 +kerning first=332 second=89 amount=-2 +kerning first=101 second=232 amount=-1 +kerning first=214 second=282 amount=-2 +kerning first=219 second=379 amount=-1 +kerning first=235 second=106 amount=-2 +kerning first=65 second=232 amount=-1 +kerning first=310 second=214 amount=-3 +kerning first=203 second=119 amount=-1 +kerning first=206 second=232 amount=-2 +kerning first=363 second=303 amount=-2 +kerning first=72 second=346 amount=-2 +kerning first=374 second=347 amount=-3 +kerning first=8216 second=261 amount=-3 +kerning first=97 second=339 amount=-1 +kerning first=338 second=75 amount=-2 +kerning first=72 second=111 amount=-2 +kerning first=226 second=275 amount=-1 +kerning first=85 second=99 amount=-2 +kerning first=321 second=346 amount=-1 +kerning first=345 second=289 amount=-2 +kerning first=311 second=119 amount=-1 +kerning first=347 second=119 amount=-3 +kerning first=222 second=364 amount=-1 +kerning first=307 second=106 amount=-2 +kerning first=264 second=361 amount=-2 +kerning first=213 second=346 amount=-1 +kerning first=82 second=289 amount=-3 +kerning first=277 second=113 amount=-1 +kerning first=202 second=209 amount=-2 +kerning first=220 second=212 amount=-1 +kerning first=256 second=212 amount=-3 +kerning first=8220 second=354 amount=-1 +kerning first=8217 second=288 amount=-2 +kerning first=89 second=269 amount=-3 +kerning first=82 second=8249 amount=-4 +kerning first=346 second=209 amount=-3 +kerning first=122 second=316 amount=-2 +kerning first=194 second=269 amount=-1 +kerning first=1058 second=1119 amount=-2 +kerning first=1061 second=1072 amount=-2 +kerning first=274 second=209 amount=-2 +kerning first=302 second=269 amount=-2 +kerning first=227 second=316 amount=-1 +kerning first=8216 second=364 amount=-1 +kerning first=8222 second=251 amount=-1 +kerning first=249 second=8220 amount=-3 +kerning first=266 second=269 amount=-2 +kerning first=263 second=316 amount=-3 +kerning first=204 second=79 amount=-2 +kerning first=374 second=269 amount=-3 +kerning first=330 second=288 amount=-2 +kerning first=67 second=229 amount=-2 +kerning first=321 second=76 amount=-2 +kerning first=83 second=89 amount=-3 +kerning first=8220 second=374 amount=-1 +kerning first=1070 second=1076 amount=-1 +kerning first=213 second=72 amount=-2 +kerning first=209 second=199 amount=-2 +kerning first=66 second=274 amount=-4 +kerning first=364 second=212 amount=-1 +kerning first=90 second=229 amount=-1 +kerning first=213 second=76 amount=-2 +kerning first=1117 second=1089 amount=-1 +kerning first=1081 second=1089 amount=-1 +kerning first=290 second=192 amount=-3 +kerning first=280 second=368 amount=-2 +kerning first=379 second=365 amount=-3 +kerning first=219 second=109 amount=-2 +kerning first=321 second=72 amount=-2 +kerning first=70 second=216 amount=-1 +kerning first=218 second=192 amount=-4 +kerning first=249 second=226 amount=-1 +kerning first=336 second=261 amount=-1 +kerning first=316 second=102 amount=-1 +kerning first=217 second=245 amount=-2 +kerning first=210 second=8221 amount=-2 +kerning first=205 second=286 amount=-2 +kerning first=236 second=46 amount=-2 +kerning first=321 second=336 amount=-1 +kerning first=272 second=46 amount=-3 +kerning first=230 second=237 amount=-2 +kerning first=1099 second=1086 amount=-1 +kerning first=325 second=245 amount=-2 +kerning first=246 second=8221 amount=-2 +kerning first=1043 second=1083 amount=-3 +kerning first=244 second=102 amount=-1 +kerning first=289 second=245 amount=-2 +kerning first=8250 second=201 amount=-5 +kerning first=8218 second=84 amount=-6 +kerning first=1027 second=1086 amount=-3 +kerning first=280 second=102 amount=-2 +kerning first=253 second=245 amount=-3 +kerning first=303 second=335 amount=-3 +kerning first=90 second=257 amount=-1 +kerning first=313 second=381 amount=-3 +kerning first=339 second=335 amount=-1 +kerning first=198 second=296 amount=-2 +kerning first=258 second=219 amount=-3 +kerning first=226 second=252 amount=-1 +kerning first=112 second=103 amount=-2 +kerning first=375 second=335 amount=-3 +kerning first=222 second=219 amount=-1 +kerning first=371 second=316 amount=-2 +kerning first=262 second=252 amount=-2 +kerning first=76 second=103 amount=-3 +kerning first=298 second=252 amount=-1 +kerning first=78 second=269 amount=-2 +kerning first=72 second=226 amount=-2 +kerning first=195 second=335 amount=-1 +kerning first=81 second=219 amount=-1 +kerning first=70 second=99 amount=-1 +kerning first=290 second=202 amount=-1 +kerning first=231 second=335 amount=-1 +kerning first=45 second=219 amount=-4 +kerning first=85 second=252 amount=-1 +kerning first=267 second=335 amount=-1 +kerning first=213 second=226 amount=-1 +kerning first=121 second=252 amount=-1 +kerning first=76 second=369 amount=-2 +kerning first=282 second=259 amount=-1 +kerning first=67 second=253 amount=-1 +kerning first=291 second=375 amount=-1 +kerning first=246 second=259 amount=-1 +kerning first=103 second=253 amount=-1 +kerning first=379 second=246 amount=-1 +kerning first=354 second=259 amount=-5 +kerning first=219 second=375 amount=-1 +kerning first=1058 second=1113 amount=-2 +kerning first=112 second=369 amount=-1 +kerning first=307 second=246 amount=-1 +kerning first=105 second=259 amount=-2 +kerning first=1088 second=1075 amount=-1 +kerning first=244 second=253 amount=-3 +kerning first=104 second=45 amount=-3 +kerning first=325 second=103 amount=-3 +kerning first=280 second=362 amount=-2 +kerning first=1025 second=1082 amount=-1 +kerning first=69 second=259 amount=-1 +kerning first=370 second=252 amount=-1 +kerning first=289 second=103 amount=-2 +kerning first=74 second=356 amount=-1 +kerning first=235 second=246 amount=-1 +kerning first=210 second=259 amount=-1 +kerning first=363 second=375 amount=-3 +kerning first=253 second=103 amount=-3 +kerning first=352 second=362 amount=-3 +kerning first=199 second=246 amount=-2 +kerning first=352 second=253 amount=-2 +kerning first=327 second=375 amount=-2 +kerning first=83 second=83 amount=-1 +kerning first=217 second=103 amount=-4 +kerning first=221 second=122 amount=-3 +kerning first=219 second=266 amount=-1 +kerning first=264 second=382 amount=-2 +kerning first=354 second=109 amount=-3 +kerning first=116 second=122 amount=-1 +kerning first=208 second=362 amount=-1 +kerning first=336 second=382 amount=-2 +kerning first=67 second=225 amount=-2 +kerning first=260 second=83 amount=-3 +kerning first=8216 second=331 amount=-1 +kerning first=253 second=369 amount=-1 +kerning first=246 second=109 amount=-1 +kerning first=365 second=122 amount=-2 +kerning first=211 second=323 amount=-2 +kerning first=364 second=256 amount=-4 +kerning first=87 second=382 amount=-3 +kerning first=217 second=369 amount=-1 +kerning first=72 second=336 amount=-2 +kerning first=8216 second=65 amount=-8 +kerning first=78 second=375 amount=-2 +kerning first=332 second=83 amount=-1 +kerning first=78 second=266 amount=-2 +kerning first=8220 second=364 amount=-1 +kerning first=325 second=369 amount=-2 +kerning first=368 second=83 amount=-3 +kerning first=289 second=369 amount=-1 +kerning first=282 second=109 amount=-1 +kerning first=257 second=122 amount=-1 +kerning first=67 second=362 amount=-2 +kerning first=228 second=382 amount=-1 +kerning first=231 second=223 amount=-1 +kerning first=67 second=89 amount=-1 +kerning first=231 second=289 amount=-3 +kerning first=78 second=115 amount=-2 +kerning first=311 second=273 amount=-3 +kerning first=203 second=104 amount=-1 +kerning first=8218 second=318 amount=-1 +kerning first=307 second=248 amount=-1 +kerning first=114 second=115 amount=-1 +kerning first=275 second=273 amount=-1 +kerning first=206 second=353 amount=-2 +kerning first=232 second=241 amount=-2 +kerning first=303 second=223 amount=-1 +kerning first=235 second=248 amount=-1 +kerning first=267 second=223 amount=-1 +kerning first=228 second=380 amount=-1 +kerning first=1065 second=1105 amount=-1 +kerning first=74 second=233 amount=-2 +kerning first=346 second=245 amount=-1 +kerning first=255 second=115 amount=-3 +kerning first=381 second=263 amount=-1 +kerning first=291 second=115 amount=-3 +kerning first=79 second=330 amount=-2 +kerning first=119 second=355 amount=-1 +kerning first=287 second=233 amount=-2 +kerning first=86 second=198 amount=-6 +kerning first=90 second=223 amount=-1 +kerning first=219 second=115 amount=-2 +kerning first=251 second=233 amount=-1 +kerning first=88 second=213 amount=-3 +kerning first=90 second=75 amount=-1 +kerning first=317 second=313 amount=-2 +kerning first=323 second=233 amount=-2 +kerning first=121 second=365 amount=-1 +kerning first=327 second=115 amount=-2 +kerning first=8216 second=337 amount=-3 +kerning first=193 second=213 amount=-3 +kerning first=85 second=365 amount=-1 +kerning first=363 second=115 amount=-2 +kerning first=260 second=355 amount=-1 +kerning first=74 second=350 amount=-1 +kerning first=1027 second=1090 amount=-1 +kerning first=201 second=110 amount=-1 +kerning first=379 second=248 amount=-1 +kerning first=68 second=313 amount=-2 +kerning first=202 second=325 amount=-2 +kerning first=229 second=328 amount=-1 +kerning first=76 second=363 amount=-2 +kerning first=225 second=303 amount=-1 +kerning first=1046 second=1038 amount=-3 +kerning first=197 second=85 amount=-3 +kerning first=45 second=225 amount=-1 +kerning first=112 second=363 amount=-1 +kerning first=274 second=325 amount=-2 +kerning first=84 second=303 amount=-2 +kerning first=81 second=225 amount=-1 +kerning first=120 second=303 amount=-1 +kerning first=363 second=8220 amount=-3 +kerning first=117 second=225 amount=-1 +kerning first=381 second=110 amount=-1 +kerning first=217 second=363 amount=-1 +kerning first=346 second=325 amount=-3 +kerning first=333 second=303 amount=-1 +kerning first=253 second=363 amount=-1 +kerning first=369 second=303 amount=-2 +kerning first=337 second=328 amount=-1 +kerning first=289 second=363 amount=-1 +kerning first=195 second=221 amount=-6 +kerning first=261 second=303 amount=-1 +kerning first=323 second=350 amount=-2 +kerning first=376 second=302 amount=-1 +kerning first=83 second=235 amount=-1 +kerning first=290 second=315 amount=-1 +kerning first=8250 second=207 amount=-5 +kerning first=321 second=338 amount=-1 +kerning first=201 second=45 amount=-2 +kerning first=330 second=225 amount=-2 +kerning first=1073 second=1094 amount=-1 +kerning first=73 second=290 amount=-2 +kerning first=307 second=98 amount=-1 +kerning first=366 second=225 amount=-3 +kerning first=67 second=102 amount=-2 +kerning first=86 second=196 amount=-6 +kerning first=219 second=260 amount=-4 +kerning first=103 second=102 amount=-1 +kerning first=264 second=380 amount=-2 +kerning first=199 second=98 amount=-1 +kerning first=313 second=286 amount=-1 +kerning first=344 second=46 amount=-2 +kerning first=222 second=225 amount=-1 +kerning first=1025 second=1080 amount=-1 +kerning first=72 second=338 amount=-2 +kerning first=8220 second=362 amount=-1 +kerning first=380 second=46 amount=-1 +kerning first=116 second=353 amount=-1 +kerning first=69 second=377 amount=-1 +kerning first=298 second=367 amount=-2 +kerning first=1043 second=1077 amount=-3 +kerning first=364 second=210 amount=-1 +kerning first=226 second=367 amount=-1 +kerning first=65 second=352 amount=-3 +kerning first=201 second=261 amount=-1 +kerning first=350 second=86 amount=-3 +kerning first=242 second=331 amount=-1 +kerning first=206 second=352 amount=-2 +kerning first=121 second=367 amount=-1 +kerning first=256 second=210 amount=-3 +kerning first=354 second=111 amount=-3 +kerning first=354 second=325 amount=-1 +kerning first=202 second=327 amount=-2 +kerning first=282 second=377 amount=-1 +kerning first=269 second=351 amount=-2 +kerning first=220 second=210 amount=-1 +kerning first=337 second=326 amount=-1 +kerning first=278 second=352 amount=-2 +kerning first=377 second=351 amount=-2 +kerning first=302 second=291 amount=-3 +kerning first=210 second=377 amount=-2 +kerning first=85 second=367 amount=-1 +kerning first=88 second=211 amount=-3 +kerning first=119 second=235 amount=-3 +kerning first=381 second=261 amount=-1 +kerning first=370 second=250 amount=-1 +kerning first=346 second=327 amount=-3 +kerning first=119 second=365 amount=-1 +kerning first=1027 second=1092 amount=-3 +kerning first=46 second=171 amount=-3 +kerning first=336 second=112 amount=-1 +kerning first=224 second=235 amount=-1 +kerning first=1072 second=1090 amount=-1 +kerning first=1063 second=1092 amount=-1 +kerning first=82 second=171 amount=-4 +kerning first=65 second=86 amount=-6 +kerning first=260 second=235 amount=-1 +kerning first=1099 second=1092 amount=-1 +kerning first=118 second=171 amount=-4 +kerning first=264 second=112 amount=-3 +kerning first=198 second=302 amount=-2 +kerning first=296 second=235 amount=-2 +kerning first=196 second=287 amount=-3 +kerning first=226 second=250 amount=-1 +kerning first=278 second=86 amount=-1 +kerning first=368 second=235 amount=-2 +kerning first=268 second=287 amount=-3 +kerning first=298 second=250 amount=-2 +kerning first=1074 second=1103 amount=-2 +kerning first=232 second=287 amount=-3 +kerning first=345 second=261 amount=-1 +kerning first=87 second=112 amount=-2 +kerning first=262 second=250 amount=-2 +kerning first=65 second=219 amount=-3 +kerning first=260 second=237 amount=-1 +kerning first=89 second=275 amount=-3 +kerning first=269 second=353 amount=-2 +kerning first=331 second=171 amount=-3 +kerning first=1072 second=1091 amount=-1 +kerning first=224 second=237 amount=-1 +kerning first=274 second=103 amount=-3 +kerning first=304 second=287 amount=-3 +kerning first=255 second=113 amount=-3 +kerning first=305 second=353 amount=-1 +kerning first=367 second=171 amount=-2 +kerning first=194 second=311 amount=-2 +kerning first=219 second=113 amount=-2 +kerning first=121 second=250 amount=-1 +kerning first=119 second=237 amount=-2 +kerning first=376 second=287 amount=-4 +kerning first=377 second=353 amount=-2 +kerning first=85 second=250 amount=-1 +kerning first=370 second=365 amount=-1 +kerning first=83 second=237 amount=-3 +kerning first=307 second=100 amount=-1 +kerning first=298 second=365 amount=-2 +kerning first=363 second=113 amount=-1 +kerning first=197 second=353 amount=-2 +kerning first=200 second=197 amount=-2 +kerning first=259 second=171 amount=-2 +kerning first=379 second=100 amount=-1 +kerning first=201 second=378 amount=-2 +kerning first=262 second=365 amount=-2 +kerning first=199 second=366 amount=-2 +kerning first=327 second=113 amount=-2 +kerning first=233 second=353 amount=-2 +kerning first=295 second=171 amount=-3 +kerning first=226 second=365 amount=-1 +kerning first=350 second=352 amount=-1 +kerning first=1031 second=1117 amount=-1 +kerning first=272 second=197 amount=-4 +kerning first=332 second=87 amount=-2 +kerning first=258 second=45 amount=-4 +kerning first=199 second=100 amount=-2 +kerning first=244 second=249 amount=-1 +kerning first=235 second=100 amount=-1 +kerning first=260 second=87 amount=-6 +kerning first=103 second=249 amount=-1 +kerning first=87 second=262 amount=-3 +kerning first=374 second=275 amount=-3 +kerning first=1067 second=1117 amount=-1 +kerning first=1119 second=1104 amount=-1 +kerning first=313 second=288 amount=-1 +kerning first=375 second=223 amount=-1 +kerning first=266 second=275 amount=-2 +kerning first=45 second=74 amount=-4 +kerning first=352 second=249 amount=-1 +kerning first=192 second=262 amount=-3 +kerning first=339 second=223 amount=-1 +kerning first=78 second=113 amount=-2 +kerning first=81 second=74 amount=-2 +kerning first=8222 second=257 amount=-2 +kerning first=381 second=378 amount=-3 +kerning first=194 second=275 amount=-1 +kerning first=83 second=87 amount=-3 +kerning first=280 second=249 amount=-2 +kerning first=205 second=288 amount=-2 +kerning first=264 second=262 amount=-3 +kerning first=229 second=283 amount=-1 +kerning first=230 second=275 amount=-1 +kerning first=1070 second=1078 amount=-1 +kerning first=316 second=249 amount=-2 +kerning first=1036 second=1091 amount=-2 +kerning first=364 second=262 amount=-1 +kerning first=200 second=314 amount=-1 +kerning first=222 second=217 amount=-1 +kerning first=264 second=288 amount=-3 +kerning first=258 second=217 amount=-3 +kerning first=89 second=243 amount=-3 +kerning first=187 second=196 amount=-4 +kerning first=281 second=101 amount=-1 +kerning first=76 second=87 amount=-3 +kerning first=236 second=314 amount=-2 +kerning first=194 second=243 amount=-1 +kerning first=344 second=314 amount=-3 +kerning first=379 second=80 amount=-1 +kerning first=325 second=333 amount=-2 +kerning first=261 second=113 amount=-1 +kerning first=97 second=269 amount=-1 +kerning first=289 second=333 amount=-2 +kerning first=87 second=288 amount=-3 +kerning first=225 second=113 amount=-1 +kerning first=1053 second=1072 amount=-1 +kerning first=380 second=314 amount=-2 +kerning first=192 second=288 amount=-3 +kerning first=120 second=113 amount=-2 +kerning first=66 second=366 amount=-3 +kerning first=245 second=307 amount=-1 +kerning first=310 second=269 amount=-2 +kerning first=108 second=224 amount=-2 +kerning first=8216 second=121 amount=-1 +kerning first=354 second=281 amount=-3 +kerning first=281 second=307 amount=-2 +kerning first=382 second=255 amount=-2 +kerning first=72 second=224 amount=-2 +kerning first=204 second=210 amount=-2 +kerning first=346 second=255 amount=-2 +kerning first=213 second=224 amount=-1 +kerning first=313 second=198 amount=-2 +kerning first=353 second=307 amount=-2 +kerning first=346 second=269 amount=-1 +kerning first=220 second=262 amount=-1 +kerning first=335 second=314 amount=-2 +kerning first=230 second=243 amount=-1 +kerning first=256 second=262 amount=-3 +kerning first=379 second=326 amount=-1 +kerning first=81 second=217 amount=-1 +kerning first=351 second=120 amount=-3 +kerning first=225 second=99 amount=-1 +kerning first=336 second=274 amount=-2 +kerning first=230 second=229 amount=-2 +kerning first=85 second=101 amount=-2 +kerning first=222 second=203 amount=-2 +kerning first=89 second=229 amount=-5 +kerning first=121 second=101 amount=-3 +kerning first=264 second=274 amount=-3 +kerning first=261 second=99 amount=-1 +kerning first=323 second=118 amount=-2 +kerning first=338 second=229 amount=-1 +kerning first=369 second=99 amount=-1 +kerning first=226 second=101 amount=-1 +kerning first=290 second=75 amount=-1 +kerning first=1056 second=1076 amount=-1 +kerning first=364 second=248 amount=-2 +kerning first=287 second=118 amount=-1 +kerning first=243 second=120 amount=-3 +kerning first=374 second=229 amount=-5 +kerning first=262 second=101 amount=-2 +kerning first=45 second=203 amount=-5 +kerning first=256 second=248 amount=-1 +kerning first=279 second=120 amount=-2 +kerning first=266 second=229 amount=-2 +kerning first=298 second=101 amount=-2 +kerning first=81 second=203 amount=-2 +kerning first=66 second=284 amount=-3 +kerning first=315 second=120 amount=-1 +kerning first=302 second=229 amount=-2 +kerning first=339 second=121 amount=-2 +kerning first=200 second=68 amount=-2 +kerning first=370 second=101 amount=-2 +kerning first=199 second=80 amount=-3 +kerning first=110 second=118 amount=-3 +kerning first=328 second=8220 amount=-4 +kerning first=280 second=316 amount=-1 +kerning first=354 second=267 amount=-3 +kerning first=251 second=118 amount=-3 +kerning first=8220 second=85 amount=-1 +kerning first=66 second=106 amount=-3 +kerning first=194 second=242 amount=-1 +kerning first=76 second=73 amount=-2 +kerning first=256 second=8220 amount=-5 +kerning first=346 second=241 amount=-1 +kerning first=315 second=106 amount=-2 +kerning first=351 second=106 amount=-1 +kerning first=74 second=118 amount=-1 +kerning first=120 second=99 amount=-2 +kerning first=115 second=8220 amount=-2 +kerning first=243 second=106 amount=-2 +kerning first=307 second=116 amount=-1 +kerning first=84 second=99 amount=-3 +kerning first=382 second=241 amount=-2 +kerning first=79 second=8220 amount=-2 +kerning first=279 second=106 amount=-2 +kerning first=253 second=361 amount=-1 +kerning first=105 second=267 amount=-1 +kerning first=233 second=111 amount=-1 +kerning first=316 second=363 amount=-2 +kerning first=269 second=111 amount=-1 +kerning first=325 second=361 amount=-2 +kerning first=289 second=361 amount=-1 +kerning first=192 second=316 amount=-2 +kerning first=228 second=316 amount=-1 +kerning first=199 second=66 amount=-3 +kerning first=1055 second=1116 amount=-1 +kerning first=264 second=316 amount=-1 +kerning first=369 second=248 amount=-1 +kerning first=67 second=368 amount=-2 +kerning first=313 second=212 amount=-1 +kerning first=246 second=8220 amount=-2 +kerning first=374 second=257 amount=-5 +kerning first=278 second=350 amount=-2 +kerning first=205 second=212 amount=-2 +kerning first=197 second=111 amount=-1 +kerning first=208 second=368 amount=-1 +kerning first=287 second=104 amount=-2 +kerning first=115 second=44 amount=-2 +kerning first=251 second=104 amount=-2 +kerning first=69 second=323 amount=-2 +kerning first=200 second=82 amount=-2 +kerning first=220 second=44 amount=-5 +kerning first=1030 second=1057 amount=-1 +kerning first=76 second=361 amount=-2 +kerning first=377 second=111 amount=-1 +kerning first=352 second=368 amount=-3 +kerning first=8216 second=339 amount=-3 +kerning first=311 second=228 amount=-2 +kerning first=79 second=44 amount=-3 +kerning first=290 second=89 amount=-3 +kerning first=112 second=361 amount=-1 +kerning first=210 second=323 amount=-2 +kerning first=379 second=66 amount=-1 +kerning first=87 second=274 amount=-1 +kerning first=1102 second=1113 amount=-2 +kerning first=324 second=171 amount=-3 +kerning first=356 second=250 amount=-2 +kerning first=199 second=326 amount=-1 +kerning first=187 second=205 amount=-5 +kerning first=80 second=278 amount=-1 +kerning first=282 second=323 amount=-2 +kerning first=1102 second=1099 amount=-1 +kerning first=377 second=97 amount=-1 +kerning first=235 second=326 amount=-2 +kerning first=325 second=347 amount=-2 +kerning first=221 second=278 amount=-1 +kerning first=74 second=378 amount=-1 +kerning first=87 second=302 amount=-1 +kerning first=269 second=97 amount=-2 +kerning first=289 second=347 amount=-3 +kerning first=105 second=281 amount=-1 +kerning first=354 second=323 amount=-1 +kerning first=84 second=362 amount=-1 +kerning first=305 second=97 amount=-1 +kerning first=307 second=326 amount=-2 +kerning first=253 second=347 amount=-3 +kerning first=233 second=371 amount=-2 +kerning first=217 second=347 amount=-2 +kerning first=82 second=231 amount=-3 +kerning first=269 second=371 amount=-2 +kerning first=82 second=233 amount=-3 +kerning first=8216 second=353 amount=-2 +kerning first=284 second=250 amount=-1 +kerning first=305 second=371 amount=-1 +kerning first=112 second=347 amount=-2 +kerning first=248 second=250 amount=-1 +kerning first=1030 second=1099 amount=-1 +kerning first=76 second=347 amount=-1 +kerning first=323 second=378 amount=-1 +kerning first=302 second=257 amount=-2 +kerning first=254 second=103 amount=-2 +kerning first=287 second=378 amount=-3 +kerning first=338 second=257 amount=-1 +kerning first=259 second=233 amount=-1 +kerning first=230 second=271 amount=-1 +kerning first=379 second=354 amount=-2 +kerning first=107 second=250 amount=-1 +kerning first=230 second=257 amount=-2 +kerning first=253 second=333 amount=-3 +kerning first=367 second=233 amount=-1 +kerning first=71 second=250 amount=-1 +kerning first=100 second=226 amount=-1 +kerning first=266 second=257 amount=-2 +kerning first=217 second=333 amount=-2 +kerning first=1102 second=1085 amount=-1 +kerning first=1048 second=1092 amount=-1 +kerning first=336 second=302 amount=-2 +kerning first=361 second=45 amount=-2 +kerning first=77 second=103 amount=-3 +kerning first=187 second=219 amount=-4 +kerning first=1084 second=1092 amount=-1 +kerning first=356 second=264 amount=-3 +kerning first=205 second=226 amount=-2 +kerning first=325 second=45 amount=-4 +kerning first=1030 second=1085 amount=-1 +kerning first=251 second=378 amount=-2 +kerning first=264 second=302 amount=-3 +kerning first=241 second=226 amount=-1 +kerning first=82 second=219 amount=-3 +kerning first=277 second=226 amount=-2 +kerning first=89 second=257 amount=-5 +kerning first=200 second=110 amount=-1 +kerning first=113 second=363 amount=-2 +kerning first=8216 second=196 amount=-8 +kerning first=212 second=194 amount=-4 +kerning first=79 second=220 amount=-1 +kerning first=70 second=65 amount=-3 +kerning first=236 second=110 amount=-2 +kerning first=1063 second=1114 amount=-1 +kerning first=277 second=240 amount=-1 +kerning first=356 second=212 amount=-3 +kerning first=71 second=194 amount=-3 +kerning first=218 second=363 amount=-1 +kerning first=1059 second=1089 amount=-4 +kerning first=254 second=363 amount=-1 +kerning first=8220 second=221 amount=-1 +kerning first=205 second=240 amount=-2 +kerning first=315 second=310 amount=-2 +kerning first=1114 second=1078 amount=-2 +kerning first=211 second=65 amount=-4 +kerning first=290 second=363 amount=-1 +kerning first=303 second=259 amount=-2 +kerning first=115 second=318 amount=-2 +kerning first=256 second=220 amount=-3 +kerning first=8217 second=225 amount=-6 +kerning first=379 second=284 amount=-1 +kerning first=380 second=110 amount=-2 +kerning first=326 second=363 amount=-1 +kerning first=267 second=259 amount=-2 +kerning first=77 second=117 amount=-2 +kerning first=362 second=363 amount=-1 +kerning first=375 second=259 amount=-3 +kerning first=197 second=214 amount=-3 +kerning first=8250 second=241 amount=-2 +kerning first=339 second=259 amount=-2 +kerning first=256 second=318 amount=-2 +kerning first=354 second=77 amount=-1 +kerning first=264 second=330 amount=-3 +kerning first=250 second=116 amount=-1 +kerning first=90 second=259 amount=-1 +kerning first=328 second=318 amount=-1 +kerning first=282 second=77 amount=-2 +kerning first=370 second=375 amount=-1 +kerning first=66 second=324 amount=-3 +kerning first=268 second=369 amount=-2 +kerning first=231 second=259 amount=-2 +kerning first=232 second=369 amount=-2 +kerning first=356 second=194 amount=-6 +kerning first=100 second=240 amount=-1 +kerning first=1025 second=1030 amount=-1 +kerning first=336 second=330 amount=-2 +kerning first=284 second=194 amount=-3 +kerning first=100 second=254 amount=-1 +kerning first=315 second=324 amount=-1 +kerning first=258 second=374 amount=-6 +kerning first=8250 second=255 amount=-3 +kerning first=85 second=375 amount=-1 +kerning first=79 second=304 amount=-2 +kerning first=279 second=324 amount=-2 +kerning first=222 second=374 amount=-2 +kerning first=8220 second=235 amount=-3 +kerning first=303 second=273 amount=-3 +kerning first=365 second=335 amount=-1 +kerning first=241 second=254 amount=-2 +kerning first=351 second=324 amount=-2 +kerning first=209 second=279 amount=-2 +kerning first=1059 second=1103 amount=-5 +kerning first=381 second=253 amount=-3 +kerning first=298 second=375 amount=-2 +kerning first=87 second=330 amount=-1 +kerning first=231 second=273 amount=-1 +kerning first=81 second=374 amount=-2 +kerning first=218 second=377 amount=-1 +kerning first=262 second=375 amount=-1 +kerning first=102 second=324 amount=-1 +kerning first=336 second=344 amount=-2 +kerning first=304 second=369 amount=-2 +kerning first=226 second=375 amount=-3 +kerning first=243 second=324 amount=-1 +kerning first=376 second=369 amount=-2 +kerning first=256 second=234 amount=-1 +kerning first=199 second=284 amount=-3 +kerning first=1061 second=1058 amount=-3 +kerning first=362 second=377 amount=-1 +kerning first=88 second=332 amount=-3 +kerning first=380 second=171 amount=-3 +kerning first=66 second=310 amount=-4 +kerning first=199 second=298 amount=-3 +kerning first=232 second=355 amount=-1 +kerning first=1076 second=1108 amount=-1 +kerning first=209 second=45 amount=-4 +kerning first=262 second=367 amount=-2 +kerning first=193 second=332 amount=-3 +kerning first=196 second=355 amount=-1 +kerning first=1055 second=1074 amount=-1 +kerning first=264 second=344 amount=-3 +kerning first=90 second=287 amount=-3 +kerning first=110 second=250 amount=-1 +kerning first=1027 second=1100 amount=-2 +kerning first=281 second=279 amount=-1 +kerning first=376 second=355 amount=-1 +kerning first=1063 second=1100 amount=-1 +kerning first=1051 second=1077 amount=-1 +kerning first=195 second=287 amount=-3 +kerning first=379 second=298 amount=-1 +kerning first=220 second=234 amount=-2 +kerning first=87 second=344 amount=-1 +kerning first=1087 second=1077 amount=-1 +kerning first=77 second=363 amount=-2 +kerning first=316 second=108 amount=-2 +kerning first=203 second=313 amount=-2 +kerning first=267 second=287 amount=-3 +kerning first=195 second=8217 amount=-5 +kerning first=280 second=108 amount=-1 +kerning first=220 second=290 amount=-1 +kerning first=362 second=335 amount=-2 +kerning first=231 second=287 amount=-3 +kerning first=231 second=8217 amount=-2 +kerning first=256 second=290 amount=-3 +kerning first=339 second=287 amount=-3 +kerning first=267 second=8217 amount=-2 +kerning first=352 second=108 amount=-2 +kerning first=303 second=287 amount=-1 +kerning first=351 second=380 amount=-2 +kerning first=282 second=105 amount=-1 +kerning first=66 second=338 amount=-3 +kerning first=67 second=197 amount=-3 +kerning first=218 second=335 amount=-2 +kerning first=375 second=287 amount=-3 +kerning first=314 second=242 amount=-1 +kerning first=210 second=105 amount=-1 +kerning first=246 second=105 amount=-1 +kerning first=83 second=315 amount=-3 +kerning first=208 second=197 amount=-4 +kerning first=207 second=380 amount=-1 +kerning first=105 second=105 amount=-1 +kerning first=1055 second=1060 amount=-1 +kerning first=220 second=248 amount=-2 +kerning first=1059 second=1117 amount=-4 +kerning first=350 second=242 amount=-1 +kerning first=243 second=380 amount=-2 +kerning first=280 second=197 amount=-2 +kerning first=279 second=380 amount=-2 +kerning first=201 second=225 amount=-1 +kerning first=77 second=335 amount=-2 +kerning first=339 second=231 amount=-1 +kerning first=377 second=228 amount=-1 +kerning first=315 second=380 amount=-3 +kerning first=69 second=105 amount=-1 +kerning first=113 second=335 amount=-1 +kerning first=1040 second=1038 amount=-4 +kerning first=375 second=231 amount=-3 +kerning first=352 second=197 amount=-4 +kerning first=199 second=270 amount=-3 +kerning first=339 second=8217 amount=-2 +kerning first=305 second=228 amount=-1 +kerning first=103 second=108 amount=-3 +kerning first=66 second=380 amount=-4 +kerning first=332 second=315 amount=-2 +kerning first=219 second=119 amount=-2 +kerning first=269 second=228 amount=-2 +kerning first=244 second=108 amount=-2 +kerning first=102 second=380 amount=-1 +kerning first=80 second=74 amount=-3 +kerning first=255 second=119 amount=-1 +kerning first=233 second=228 amount=-2 +kerning first=291 second=119 amount=-1 +kerning first=365 second=46 amount=-2 +kerning first=244 second=122 amount=-2 +kerning first=90 second=231 amount=-1 +kerning first=109 second=102 amount=-1 +kerning first=66 second=352 amount=-4 +kerning first=221 second=74 amount=-4 +kerning first=208 second=122 amount=-2 +kerning first=363 second=119 amount=-3 +kerning first=1006 second=1007 amount=-2 +kerning first=366 second=346 amount=-3 +kerning first=103 second=122 amount=-3 +kerning first=221 second=46 amount=-5 +kerning first=210 second=77 amount=-2 +kerning first=267 second=231 amount=-1 +kerning first=104 second=307 amount=-1 +kerning first=90 second=204 amount=-1 +kerning first=352 second=122 amount=-2 +kerning first=303 second=231 amount=-3 +kerning first=199 second=256 amount=-3 +kerning first=345 second=225 amount=-1 +kerning first=316 second=122 amount=-1 +kerning first=195 second=231 amount=-1 +kerning first=69 second=77 amount=-2 +kerning first=315 second=352 amount=-1 +kerning first=1101 second=1097 amount=-1 +kerning first=381 second=225 amount=-1 +kerning first=280 second=122 amount=-2 +kerning first=84 second=344 amount=-1 +kerning first=75 second=350 amount=-2 +kerning first=267 second=245 amount=-1 +kerning first=80 second=46 amount=-4 +kerning first=379 second=256 amount=-1 +kerning first=231 second=245 amount=-1 +kerning first=315 second=366 amount=-3 +kerning first=195 second=245 amount=-1 +kerning first=45 second=331 amount=-2 +kerning first=205 second=367 amount=-2 +kerning first=266 second=45 amount=-4 +kerning first=8250 second=230 amount=-1 +kerning first=201 second=211 amount=-1 +kerning first=250 second=102 amount=-1 +kerning first=381 second=211 amount=-1 +kerning first=67 second=122 amount=-2 +kerning first=286 second=102 amount=-2 +kerning first=375 second=245 amount=-3 +kerning first=1063 second=1086 amount=-1 +kerning first=8250 second=227 amount=-1 +kerning first=8220 second=193 amount=-8 +kerning first=303 second=245 amount=-3 +kerning first=199 second=248 amount=-2 +kerning first=221 second=112 amount=-2 +kerning first=283 second=107 amount=-2 +kerning first=76 second=8221 amount=-4 +kerning first=193 second=171 amount=-4 +kerning first=258 second=86 amount=-6 +kerning first=116 second=112 amount=-1 +kerning first=229 second=171 amount=-2 +kerning first=222 second=86 amount=-2 +kerning first=8220 second=368 amount=-1 +kerning first=106 second=107 amount=-1 +kerning first=112 second=8221 amount=-2 +kerning first=347 second=105 amount=-2 +kerning first=1056 second=1038 amount=-1 +kerning first=88 second=171 amount=-4 +kerning first=361 second=8221 amount=-3 +kerning first=275 second=105 amount=-2 +kerning first=1090 second=1072 amount=-1 +kerning first=316 second=235 amount=-1 +kerning first=75 second=352 amount=-2 +kerning first=8222 second=87 amount=-6 +kerning first=304 second=67 amount=-2 +kerning first=317 second=209 amount=-2 +kerning first=352 second=235 amount=-1 +kerning first=268 second=67 amount=-3 +kerning first=203 second=105 amount=-1 +kerning first=203 second=81 amount=-1 +kerning first=267 second=45 amount=-2 +kerning first=226 second=227 amount=-1 +kerning first=229 second=100 amount=-1 +kerning first=282 second=85 amount=-2 +kerning first=196 second=67 amount=-3 +kerning first=98 second=105 amount=-1 +kerning first=1098 second=1098 amount=-1 +kerning first=1052 second=1117 amount=-1 +kerning first=214 second=296 amount=-2 +kerning first=1062 second=1098 amount=-1 +kerning first=369 second=375 amount=-3 +kerning first=111 second=251 amount=-1 +kerning first=81 second=86 amount=-2 +kerning first=370 second=228 amount=-3 +kerning first=75 second=251 amount=-3 +kerning first=45 second=86 amount=-4 +kerning first=259 second=275 amount=-1 +kerning first=99 second=353 amount=-2 +kerning first=1100 second=1097 amount=-1 +kerning first=369 second=122 amount=-2 +kerning first=1036 second=1079 amount=-1 +kerning first=368 second=249 amount=-1 +kerning first=88 second=100 amount=-2 +kerning first=353 second=46 amount=-2 +kerning first=1072 second=1079 amount=-1 +kerning first=204 second=353 amount=-2 +kerning first=288 second=251 amount=-1 +kerning first=193 second=100 amount=-1 +kerning first=86 second=206 amount=-1 +kerning first=220 second=350 amount=-3 +kerning first=1080 second=1105 amount=-1 +kerning first=203 second=379 amount=-1 +kerning first=118 second=275 amount=-3 +kerning first=370 second=248 amount=-2 +kerning first=262 second=204 amount=-3 +kerning first=73 second=334 amount=-2 +kerning first=45 second=311 amount=-1 +kerning first=376 second=67 amount=-3 +kerning first=1044 second=1105 amount=-1 +kerning first=334 second=204 amount=-2 +kerning first=354 second=365 amount=-2 +kerning first=378 second=230 amount=-1 +kerning first=111 second=223 amount=-1 +kerning first=67 second=211 amount=-3 +kerning first=218 second=237 amount=-2 +kerning first=83 second=249 amount=-1 +kerning first=8217 second=212 amount=-2 +kerning first=68 second=304 amount=-2 +kerning first=313 second=268 amount=-1 +kerning first=350 second=277 amount=-1 +kerning first=234 second=230 amount=-2 +kerning first=224 second=249 amount=-1 +kerning first=204 second=83 amount=-2 +kerning first=187 second=307 amount=-1 +kerning first=260 second=249 amount=-3 +kerning first=280 second=211 amount=-1 +kerning first=119 second=249 amount=-1 +kerning first=205 second=268 amount=-2 +kerning first=367 second=275 amount=-1 +kerning first=198 second=230 amount=-1 +kerning first=1025 second=1055 amount=-1 +kerning first=350 second=256 amount=-4 +kerning first=288 second=289 amount=-3 +kerning first=86 second=244 amount=-3 +kerning first=381 second=187 amount=-1 +kerning first=199 second=106 amount=-1 +kerning first=117 second=114 amount=-1 +kerning first=122 second=244 amount=-1 +kerning first=203 second=109 amount=-1 +kerning first=352 second=374 amount=-3 +kerning first=211 second=192 amount=-4 +kerning first=278 second=284 amount=-1 +kerning first=45 second=114 amount=-2 +kerning first=227 second=244 amount=-1 +kerning first=1105 second=1084 amount=-1 +kerning first=80 second=344 amount=-1 +kerning first=263 second=244 amount=-1 +kerning first=317 second=237 amount=-2 +kerning first=206 second=284 amount=-2 +kerning first=88 second=199 amount=-3 +kerning first=370 second=232 amount=-2 +kerning first=283 second=339 amount=-1 +kerning first=70 second=192 amount=-3 +kerning first=281 second=237 amount=-2 +kerning first=8250 second=311 amount=-1 +kerning first=245 second=237 amount=-1 +kerning first=193 second=199 amount=-3 +kerning first=371 second=244 amount=-3 +kerning first=115 second=114 amount=-1 +kerning first=69 second=89 amount=-1 +kerning first=249 second=351 amount=-2 +kerning first=98 second=109 amount=-1 +kerning first=262 second=232 amount=-2 +kerning first=116 second=116 amount=-1 +kerning first=226 second=232 amount=-1 +kerning first=8222 second=361 amount=-1 +kerning first=8217 second=264 amount=-2 +kerning first=368 second=277 amount=-2 +kerning first=104 second=237 amount=-1 +kerning first=221 second=116 amount=-1 +kerning first=203 second=365 amount=-2 +kerning first=68 second=237 amount=-1 +kerning first=350 second=279 amount=-1 +kerning first=298 second=232 amount=-2 +kerning first=111 second=289 amount=-2 +kerning first=198 second=282 amount=-2 +kerning first=193 second=346 amount=-3 +kerning first=260 second=277 amount=-1 +kerning first=97 second=305 amount=-1 +kerning first=219 second=194 amount=-4 +kerning first=216 second=289 amount=-1 +kerning first=317 second=110 amount=-1 +kerning first=328 second=8217 amount=-4 +kerning first=1047 second=1034 amount=-2 +kerning first=121 second=232 amount=-3 +kerning first=296 second=277 amount=-2 +kerning first=81 second=350 amount=-1 +kerning first=83 second=277 amount=-1 +kerning first=268 second=327 amount=-3 +kerning first=203 second=351 amount=-1 +kerning first=198 second=202 amount=-2 +kerning first=311 second=351 amount=-2 +kerning first=45 second=350 amount=-3 +kerning first=378 second=254 amount=-1 +kerning first=379 second=278 amount=-1 +kerning first=119 second=277 amount=-3 +kerning first=275 second=351 amount=-2 +kerning first=8217 second=117 amount=-1 +kerning first=258 second=350 amount=-3 +kerning first=376 second=327 amount=-1 +kerning first=70 second=79 amount=-1 +kerning first=1098 second=1102 amount=-1 +kerning first=355 second=367 amount=-1 +kerning first=99 second=121 amount=-2 +kerning first=1044 second=1095 amount=-3 +kerning first=198 second=254 amount=-1 +kerning first=119 second=305 amount=-2 +kerning first=222 second=350 amount=-1 +kerning first=283 second=367 amount=-2 +kerning first=234 second=254 amount=-2 +kerning first=70 second=233 amount=-1 +kerning first=68 second=209 amount=-2 +kerning first=224 second=305 amount=-1 +kerning first=113 second=117 amount=-2 +kerning first=216 second=261 amount=-1 +kerning first=65 second=284 amount=-3 +kerning first=230 second=269 amount=-1 +kerning first=330 second=350 amount=-2 +kerning first=254 second=117 amount=-1 +kerning first=252 second=261 amount=-1 +kerning first=70 second=367 amount=-1 +kerning first=1051 second=1119 amount=-1 +kerning first=327 second=286 amount=-2 +kerning first=296 second=305 amount=-1 +kerning first=366 second=350 amount=-3 +kerning first=350 second=76 amount=-3 +kerning first=218 second=117 amount=-1 +kerning first=288 second=261 amount=-1 +kerning first=106 second=367 amount=-1 +kerning first=260 second=305 amount=-1 +kerning first=199 second=260 amount=-3 +kerning first=326 second=117 amount=-1 +kerning first=368 second=305 amount=-2 +kerning first=278 second=76 amount=-2 +kerning first=290 second=117 amount=-1 +kerning first=332 second=305 amount=-1 +kerning first=347 second=351 amount=-3 +kerning first=75 second=261 amount=-1 +kerning first=1052 second=1089 amount=-1 +kerning first=221 second=344 amount=-1 +kerning first=193 second=374 amount=-6 +kerning first=362 second=117 amount=-1 +kerning first=111 second=261 amount=-1 +kerning first=8216 second=115 amount=-2 +kerning first=112 second=291 amount=-2 +kerning first=1091 second=1101 amount=-1 +kerning first=274 second=311 amount=-1 +kerning first=84 second=317 amount=-1 +kerning first=286 second=362 amount=-1 +kerning first=76 second=291 amount=-3 +kerning first=198 second=286 amount=-1 +kerning first=105 second=337 amount=-1 +kerning first=8217 second=268 amount=-2 +kerning first=376 second=331 amount=-3 +kerning first=202 second=311 amount=-1 +kerning first=118 second=271 amount=-3 +kerning first=379 second=260 amount=-1 +kerning first=104 second=241 amount=-1 +kerning first=194 second=240 amount=-1 +kerning first=354 second=337 amount=-3 +kerning first=280 second=382 amount=-2 +kerning first=365 second=316 amount=-2 +kerning first=316 second=382 amount=-1 +kerning first=272 second=356 amount=-2 +kerning first=352 second=382 amount=-2 +kerning first=214 second=362 amount=-1 +kerning first=268 second=331 amount=-1 +kerning first=69 second=361 amount=-2 +kerning first=310 second=100 amount=-2 +kerning first=65 second=252 amount=-3 +kerning first=253 second=337 amount=-3 +kerning first=1077 second=1082 amount=-1 +kerning first=101 second=252 amount=-2 +kerning first=105 second=361 amount=-1 +kerning first=74 second=221 amount=-1 +kerning first=246 second=361 amount=-1 +kerning first=120 second=45 amount=-3 +kerning first=321 second=266 amount=-1 +kerning first=8218 second=121 amount=-1 +kerning first=1069 second=1056 amount=-1 +kerning first=382 second=311 amount=-2 +kerning first=1051 second=1087 amount=-1 +kerning first=282 second=361 amount=-2 +kerning first=116 second=316 amount=-1 +kerning first=70 second=103 amount=-3 +kerning first=350 second=252 amount=-1 +kerning first=310 second=227 amount=-1 +kerning first=332 second=45 amount=-1 +kerning first=1058 second=1101 amount=-1 +kerning first=374 second=201 amount=-1 +kerning first=208 second=207 amount=-2 +kerning first=274 second=227 amount=-1 +kerning first=66 second=78 amount=-4 +kerning first=336 second=70 amount=-2 +kerning first=254 second=226 amount=-1 +kerning first=338 second=201 amount=-2 +kerning first=280 second=207 amount=-2 +kerning first=202 second=227 amount=-1 +kerning first=328 second=44 amount=-1 +kerning first=206 second=252 amount=-1 +kerning first=1113 second=1078 amount=-2 +kerning first=224 second=121 amount=-3 +kerning first=284 second=8249 amount=-3 +kerning first=242 second=252 amount=-1 +kerning first=363 second=246 amount=-1 +kerning first=278 second=252 amount=-2 +kerning first=67 second=207 amount=-3 +kerning first=382 second=227 amount=-1 +kerning first=307 second=353 amount=-2 +kerning first=364 second=44 amount=-5 +kerning first=314 second=252 amount=-2 +kerning first=346 second=227 amount=-2 +kerning first=1043 second=1095 amount=-3 +kerning first=291 second=246 amount=-2 +kerning first=8222 second=378 amount=-3 +kerning first=231 second=109 amount=-2 +kerning first=89 second=201 amount=-1 +kerning first=200 second=356 amount=-1 +kerning first=1099 second=1104 amount=-1 +kerning first=80 second=84 amount=-1 +kerning first=103 second=382 amount=-3 +kerning first=255 second=246 amount=-3 +kerning first=198 second=226 amount=-1 +kerning first=355 second=103 amount=-2 +kerning first=65 second=336 amount=-3 +kerning first=222 second=90 amount=-2 +kerning first=1063 second=1104 amount=-1 +kerning first=1045 second=1107 amount=-1 +kerning first=219 second=246 amount=-2 +kerning first=234 second=226 amount=-2 +kerning first=80 second=267 amount=-1 +kerning first=1027 second=1104 amount=-3 +kerning first=208 second=382 amount=-2 +kerning first=283 second=103 amount=-3 +kerning first=325 second=291 amount=-3 +kerning first=244 second=382 amount=-2 +kerning first=224 second=45 amount=-2 +kerning first=206 second=336 amount=-2 +kerning first=289 second=291 amount=-2 +kerning first=78 second=246 amount=-2 +kerning first=1047 second=1062 amount=-2 +kerning first=211 second=103 amount=-1 +kerning first=352 second=207 amount=-3 +kerning first=97 second=227 amount=-1 +kerning first=253 second=291 amount=-3 +kerning first=347 second=109 amount=-2 +kerning first=378 second=226 amount=-1 +kerning first=278 second=336 amount=-1 +kerning first=217 second=291 amount=-4 +kerning first=106 second=103 amount=-3 +kerning first=67 second=382 amount=-2 +kerning first=1074 second=1116 amount=-1 +kerning first=259 second=243 amount=-1 +kerning first=102 second=314 amount=3 +kerning first=317 second=213 amount=-1 +kerning first=74 second=193 amount=-5 +kerning first=121 second=115 amount=-3 +kerning first=81 second=90 amount=-2 +kerning first=253 second=263 amount=-3 +kerning first=45 second=90 amount=-4 +kerning first=82 second=243 amount=-3 +kerning first=289 second=263 amount=-2 +kerning first=279 second=314 amount=-3 +kerning first=118 second=243 amount=-3 +kerning first=325 second=263 amount=-2 +kerning first=367 second=100 amount=-1 +kerning first=243 second=314 amount=-2 +kerning first=85 second=115 amount=-2 +kerning first=88 second=370 amount=-2 +kerning first=76 second=117 amount=-2 +kerning first=87 second=70 amount=-1 +kerning first=351 second=314 amount=-2 +kerning first=298 second=115 amount=-2 +kerning first=200 second=120 amount=-1 +kerning first=315 second=314 amount=-2 +kerning first=236 second=120 amount=-1 +kerning first=282 second=365 amount=-2 +kerning first=376 second=303 amount=-2 +kerning first=226 second=115 amount=-1 +kerning first=272 second=120 amount=-1 +kerning first=246 second=365 amount=-1 +kerning first=268 second=303 amount=-1 +kerning first=76 second=8249 amount=-1 +kerning first=209 second=269 amount=-2 +kerning first=262 second=115 amount=-2 +kerning first=217 second=263 amount=-2 +kerning first=315 second=78 amount=-2 +kerning first=304 second=303 amount=-1 +kerning first=264 second=70 amount=-3 +kerning first=198 second=198 amount=-2 +kerning first=367 second=243 amount=-1 +kerning first=210 second=45 amount=-1 +kerning first=8250 second=122 amount=-5 +kerning first=281 second=269 amount=-1 +kerning first=369 second=345 amount=-1 +kerning first=105 second=365 amount=-1 +kerning first=115 second=224 amount=-1 +kerning first=209 second=213 amount=-2 +kerning first=370 second=115 amount=-2 +kerning first=69 second=365 amount=-2 +kerning first=338 second=338 amount=-1 +kerning first=8217 second=240 amount=-3 +kerning first=220 second=224 amount=-3 +kerning first=330 second=118 amount=-2 +kerning first=97 second=255 amount=-3 +kerning first=192 second=98 amount=-2 +kerning first=339 second=101 amount=-1 +kerning first=1119 second=1086 amount=-1 +kerning first=328 second=224 amount=-1 +kerning first=8250 second=307 amount=-1 +kerning first=264 second=98 amount=-1 +kerning first=361 second=8249 amount=-2 +kerning first=211 second=75 amount=-2 +kerning first=366 second=118 amount=-2 +kerning first=228 second=98 amount=-1 +kerning first=8220 second=227 amount=-3 +kerning first=278 second=280 amount=-2 +kerning first=364 second=224 amount=-3 +kerning first=103 second=235 amount=-2 +kerning first=236 second=328 amount=-2 +kerning first=289 second=8249 amount=-3 +kerning first=252 second=244 amount=-1 +kerning first=196 second=303 amount=-1 +kerning first=117 second=118 amount=-3 +kerning first=200 second=328 amount=-1 +kerning first=325 second=8249 amount=-4 +kerning first=1090 second=1076 amount=-2 +kerning first=350 second=280 amount=-3 +kerning first=380 second=120 amount=-1 +kerning first=232 second=303 amount=-2 +kerning first=258 second=118 amount=-3 +kerning first=199 second=232 amount=-2 +kerning first=1054 second=1076 amount=-1 +kerning first=212 second=65 amount=-4 +kerning first=253 second=8249 amount=-4 +kerning first=197 second=101 amount=-1 +kerning first=1088 second=1093 amount=-1 +kerning first=83 second=73 amount=-3 +kerning first=380 second=328 amount=-2 +kerning first=233 second=101 amount=-1 +kerning first=353 second=241 amount=-2 +kerning first=1092 second=1118 amount=-1 +kerning first=269 second=101 amount=-1 +kerning first=8216 second=83 amount=-1 +kerning first=193 second=370 amount=-3 +kerning first=314 second=250 amount=-2 +kerning first=196 second=84 amount=-6 +kerning first=45 second=118 amount=-3 +kerning first=1058 second=1073 amount=-1 +kerning first=97 second=283 amount=-1 +kerning first=311 second=226 amount=-2 +kerning first=245 second=241 amount=-1 +kerning first=377 second=101 amount=-1 +kerning first=382 second=283 amount=-1 +kerning first=82 second=249 amount=-2 +kerning first=67 second=324 amount=-1 +kerning first=346 second=283 amount=-1 +kerning first=317 second=241 amount=-1 +kerning first=310 second=283 amount=-2 +kerning first=70 second=196 amount=-3 +kerning first=281 second=241 amount=-2 +kerning first=1059 second=1082 amount=-4 +kerning first=8250 second=223 amount=-2 +kerning first=339 second=241 amount=-2 +kerning first=213 second=8220 amount=-2 +kerning first=45 second=193 amount=-4 +kerning first=225 second=335 amount=-1 +kerning first=344 second=338 amount=-3 +kerning first=303 second=241 amount=-2 +kerning first=261 second=335 amount=-1 +kerning first=67 second=118 amount=-1 +kerning first=287 second=108 amount=-3 +kerning first=86 second=290 amount=-3 +kerning first=108 second=8220 amount=-3 +kerning first=8218 second=117 amount=-1 +kerning first=251 second=108 amount=-2 +kerning first=375 second=241 amount=-2 +kerning first=113 second=345 amount=-1 +kerning first=290 second=85 amount=-1 +kerning first=214 second=380 amount=-2 +kerning first=222 second=193 amount=-4 +kerning first=200 second=338 amount=-1 +kerning first=218 second=345 amount=-1 +kerning first=81 second=193 amount=-4 +kerning first=84 second=335 amount=-3 +kerning first=286 second=380 amount=-1 +kerning first=365 second=355 amount=-1 +kerning first=267 second=241 amount=-2 +kerning first=254 second=345 amount=-1 +kerning first=120 second=335 amount=-2 +kerning first=364 second=286 amount=-1 +kerning first=1101 second=1087 amount=-1 +kerning first=256 second=286 amount=-3 +kerning first=1069 second=1038 amount=-3 +kerning first=366 second=193 amount=-4 +kerning first=73 second=380 amount=-1 +kerning first=362 second=345 amount=-1 +kerning first=326 second=331 amount=-1 +kerning first=109 second=380 amount=-1 +kerning first=113 second=361 amount=-2 +kerning first=90 second=241 amount=-1 +kerning first=69 second=304 amount=-2 +kerning first=362 second=331 amount=-2 +kerning first=249 second=248 amount=-1 +kerning first=220 second=286 amount=-1 +kerning first=1058 second=1083 amount=-2 +kerning first=1073 second=1113 amount=-2 +kerning first=254 second=331 amount=-1 +kerning first=108 second=248 amount=-1 +kerning first=305 second=115 amount=-1 +kerning first=8216 second=97 amount=-3 +kerning first=272 second=78 amount=-2 +kerning first=76 second=323 amount=-2 +kerning first=110 second=108 amount=-1 +kerning first=346 second=231 amount=-1 +kerning first=233 second=115 amount=-2 +kerning first=218 second=331 amount=-2 +kerning first=72 second=248 amount=-2 +kerning first=382 second=231 amount=-1 +kerning first=269 second=115 amount=-2 +kerning first=74 second=122 amount=-1 +kerning first=267 second=255 amount=-2 +kerning first=272 second=352 amount=-1 +kerning first=231 second=255 amount=-2 +kerning first=113 second=331 amount=-2 +kerning first=382 second=245 amount=-1 +kerning first=195 second=255 amount=-3 +kerning first=344 second=352 amount=-3 +kerning first=97 second=307 amount=-1 +kerning first=115 second=252 amount=-1 +kerning first=310 second=245 amount=-2 +kerning first=332 second=73 amount=-2 +kerning first=251 second=122 amount=-2 +kerning first=90 second=255 amount=-3 +kerning first=264 second=298 amount=-3 +kerning first=97 second=231 amount=-1 +kerning first=76 second=77 amount=-2 +kerning first=362 second=71 amount=-1 +kerning first=87 second=278 amount=-1 +kerning first=110 second=122 amount=-1 +kerning first=222 second=207 amount=-2 +kerning first=97 second=245 amount=-1 +kerning first=243 second=328 amount=-1 +kerning first=364 second=252 amount=-1 +kerning first=89 second=233 amount=-3 +kerning first=98 second=8220 amount=-2 +kerning first=264 second=278 amount=-3 +kerning first=356 second=192 amount=-6 +kerning first=1058 second=1097 amount=-2 +kerning first=194 second=233 amount=-1 +kerning first=336 second=278 amount=-2 +kerning first=102 second=328 amount=-1 +kerning first=335 second=316 amount=-2 +kerning first=45 second=207 amount=-5 +kerning first=302 second=233 amount=-2 +kerning first=220 second=252 amount=-1 +kerning first=1025 second=1040 amount=-2 +kerning first=81 second=207 amount=-2 +kerning first=369 second=335 amount=-1 +kerning first=351 second=328 amount=-2 +kerning first=256 second=252 amount=-3 +kerning first=374 second=233 amount=-3 +kerning first=200 second=352 amount=-2 +kerning first=315 second=328 amount=-1 +kerning first=1065 second=1073 amount=-1 +kerning first=279 second=328 amount=-2 +kerning first=328 second=252 amount=-1 +kerning first=66 second=110 amount=-3 +kerning first=102 second=110 amount=-1 +kerning first=296 second=333 amount=-2 +kerning first=250 second=106 amount=-2 +kerning first=326 second=318 amount=-1 +kerning first=240 second=46 amount=-3 +kerning first=286 second=106 amount=-1 +kerning first=282 second=87 amount=-1 +kerning first=199 second=288 amount=-3 +kerning first=291 second=259 amount=-3 +kerning first=368 second=333 amount=-2 +kerning first=243 second=110 amount=-1 +kerning first=330 second=378 amount=-1 +kerning first=210 second=87 amount=-2 +kerning first=279 second=110 amount=-2 +kerning first=119 second=333 amount=-3 +kerning first=69 second=87 amount=-1 +kerning first=315 second=110 amount=-1 +kerning first=260 second=333 amount=-1 +kerning first=107 second=118 amount=-1 +kerning first=351 second=110 amount=-2 +kerning first=366 second=378 amount=-3 +kerning first=224 second=333 amount=-1 +kerning first=71 second=198 amount=-3 +kerning first=217 second=281 amount=-2 +kerning first=376 second=99 amount=-3 +kerning first=218 second=65 amount=-4 +kerning first=8220 second=225 amount=-3 +kerning first=253 second=281 amount=-3 +kerning first=1030 second=1081 amount=-1 +kerning first=382 second=307 amount=-1 +kerning first=1057 second=1033 amount=-1 +kerning first=1059 second=1099 amount=-4 +kerning first=8216 second=192 amount=-8 +kerning first=105 second=347 amount=-2 +kerning first=289 second=281 amount=-2 +kerning first=290 second=65 amount=-3 +kerning first=212 second=198 amount=-4 +kerning first=381 second=243 amount=-1 +kerning first=321 second=262 amount=-1 +kerning first=69 second=347 amount=-1 +kerning first=325 second=281 amount=-2 +kerning first=242 second=326 amount=-1 +kerning first=362 second=65 amount=-4 +kerning first=197 second=210 amount=-3 +kerning first=278 second=326 amount=-1 +kerning first=379 second=288 amount=-1 +kerning first=314 second=326 amount=-1 +kerning first=8250 second=237 amount=-1 +kerning first=350 second=326 amount=-1 +kerning first=230 second=249 amount=-2 +kerning first=105 second=351 amount=-2 +kerning first=214 second=120 amount=-1 +kerning first=250 second=120 amount=-2 +kerning first=199 second=274 amount=-3 +kerning first=282 second=261 amount=-1 +kerning first=87 second=80 amount=-1 +kerning first=291 second=291 amount=-2 +kerning first=315 second=68 amount=-2 +kerning first=282 second=73 amount=-2 +kerning first=201 second=229 amount=-1 +kerning first=232 second=99 amount=-1 +kerning first=284 second=198 amount=-3 +kerning first=379 second=274 amount=-1 +kerning first=220 second=346 amount=-3 +kerning first=84 second=377 amount=-3 +kerning first=109 second=120 amount=-1 +kerning first=354 second=73 amount=-1 +kerning first=84 second=255 amount=-3 +kerning first=304 second=99 amount=-2 +kerning first=356 second=198 amount=-6 +kerning first=268 second=99 amount=-2 +kerning first=116 second=365 amount=-1 +kerning first=287 second=273 amount=-2 +kerning first=289 second=267 amount=-2 +kerning first=316 second=118 amount=-3 +kerning first=232 second=113 amount=-1 +kerning first=325 second=267 amount=-2 +kerning first=336 second=80 amount=-2 +kerning first=219 second=235 amount=-2 +kerning first=280 second=118 amount=-1 +kerning first=80 second=263 amount=-1 +kerning first=66 second=68 amount=-4 +kerning first=196 second=113 amount=-1 +kerning first=210 second=73 amount=-2 +kerning first=217 second=267 amount=-2 +kerning first=1058 second=1077 amount=-1 +kerning first=253 second=267 amount=-3 +kerning first=352 second=118 amount=-3 +kerning first=1094 second=1077 amount=-1 +kerning first=376 second=113 amount=-3 +kerning first=214 second=106 amount=-1 +kerning first=103 second=118 amount=-1 +kerning first=321 second=8220 amount=-4 +kerning first=252 second=333 amount=-1 +kerning first=287 second=107 amount=-2 +kerning first=244 second=118 amount=-2 +kerning first=304 second=113 amount=-2 +kerning first=109 second=106 amount=-2 +kerning first=69 second=73 amount=-2 +kerning first=200 second=332 amount=-1 +kerning first=264 second=80 amount=-3 +kerning first=377 second=196 amount=-1 +kerning first=266 second=65 amount=-3 +kerning first=97 second=287 amount=-2 +kerning first=216 second=219 amount=-1 +kerning first=256 second=244 amount=-1 +kerning first=99 second=111 amount=-1 +kerning first=313 second=264 amount=-1 +kerning first=304 second=74 amount=-1 +kerning first=202 second=287 amount=-3 +kerning first=204 second=111 amount=-2 +kerning first=1073 second=1119 amount=-1 +kerning first=344 second=332 amount=-3 +kerning first=75 second=219 amount=-2 +kerning first=364 second=244 amount=-2 +kerning first=200 second=86 amount=-1 +kerning first=8217 second=83 amount=-3 +kerning first=77 second=339 amount=-2 +kerning first=108 second=242 amount=-1 +kerning first=274 second=287 amount=-3 +kerning first=263 second=234 amount=-1 +kerning first=258 second=199 amount=-3 +kerning first=81 second=364 amount=-1 +kerning first=113 second=339 amount=-1 +kerning first=205 second=264 amount=-2 +kerning first=224 second=8217 amount=-3 +kerning first=45 second=364 amount=-4 +kerning first=8222 second=291 amount=-1 +kerning first=346 second=287 amount=-3 +kerning first=260 second=8217 amount=-5 +kerning first=330 second=199 amount=-2 +kerning first=310 second=287 amount=-2 +kerning first=371 second=234 amount=-3 +kerning first=197 second=121 amount=-3 +kerning first=104 second=289 amount=-2 +kerning first=315 second=334 amount=-1 +kerning first=74 second=374 amount=-1 +kerning first=258 second=364 amount=-3 +kerning first=249 second=242 amount=-1 +kerning first=382 second=287 amount=-2 +kerning first=209 second=289 amount=-3 +kerning first=106 second=333 amount=-1 +kerning first=1105 second=1094 amount=-1 +kerning first=245 second=289 amount=-2 +kerning first=107 second=254 amount=-1 +kerning first=281 second=289 amount=-3 +kerning first=350 second=66 amount=-3 +kerning first=317 second=289 amount=-3 +kerning first=353 second=289 amount=-3 +kerning first=187 second=209 amount=-5 +kerning first=278 second=66 amount=-2 +kerning first=85 second=119 amount=-2 +kerning first=248 second=254 amount=-1 +kerning first=121 second=119 amount=-1 +kerning first=220 second=244 amount=-2 +kerning first=333 second=117 amount=-1 +kerning first=8220 second=231 amount=-3 +kerning first=78 second=8249 amount=-4 +kerning first=71 second=330 amount=-1 +kerning first=339 second=261 amount=-2 +kerning first=204 second=97 amount=-2 +kerning first=288 second=205 amount=-1 +kerning first=364 second=230 amount=-3 +kerning first=226 second=119 amount=-3 +kerning first=240 second=97 amount=-1 +kerning first=192 second=354 amount=-6 +kerning first=262 second=119 amount=-1 +kerning first=99 second=97 amount=-2 +kerning first=199 second=76 amount=-3 +kerning first=1058 second=1080 amount=-2 +kerning first=200 second=72 amount=-2 +kerning first=298 second=119 amount=-2 +kerning first=264 second=354 amount=-1 +kerning first=221 second=243 amount=-3 +kerning first=313 second=250 amount=-2 +kerning first=305 second=121 amount=-2 +kerning first=272 second=72 amount=-2 +kerning first=8216 second=103 amount=-4 +kerning first=220 second=230 amount=-3 +kerning first=370 second=119 amount=-2 +kerning first=336 second=354 amount=-2 +kerning first=277 second=250 amount=-2 +kerning first=245 second=8220 amount=-2 +kerning first=269 second=121 amount=-2 +kerning first=281 second=275 amount=-1 +kerning first=79 second=230 amount=-1 +kerning first=1061 second=1054 amount=-4 +kerning first=264 second=74 amount=-2 +kerning first=233 second=121 amount=-2 +kerning first=116 second=369 amount=-1 +kerning first=115 second=230 amount=-1 +kerning first=1025 second=1054 amount=-1 +kerning first=344 second=86 amount=-3 +kerning first=366 second=199 amount=-1 +kerning first=269 second=107 amount=-2 +kerning first=336 second=74 amount=-2 +kerning first=311 second=100 amount=-3 +kerning first=117 second=378 amount=-2 +kerning first=233 second=107 amount=-2 +kerning first=100 second=250 amount=-1 +kerning first=272 second=86 amount=-2 +kerning first=84 second=117 amount=-2 +kerning first=83 second=333 amount=-1 +kerning first=241 second=250 amount=-1 +kerning first=83 second=8217 amount=-2 +kerning first=222 second=378 amount=-2 +kerning first=356 second=240 amount=-3 +kerning first=205 second=250 amount=-2 +kerning first=8217 second=350 amount=-3 +kerning first=120 second=117 amount=-3 +kerning first=379 second=76 amount=-1 +kerning first=261 second=117 amount=-1 +kerning first=81 second=378 amount=-2 +kerning first=197 second=107 amount=-2 +kerning first=288 second=219 amount=-1 +kerning first=121 second=45 amount=-4 +kerning first=225 second=117 amount=-1 +kerning first=45 second=378 amount=-5 +kerning first=283 second=363 amount=-2 +kerning first=286 second=310 amount=-1 +kerning first=66 second=116 amount=-2 +kerning first=313 second=194 amount=-2 +kerning first=108 second=318 amount=-2 +kerning first=107 second=240 amount=-3 +kerning first=355 second=363 amount=-1 +kerning first=214 second=310 amount=-2 +kerning first=379 second=330 amount=-1 +kerning first=347 second=355 amount=-2 +kerning first=102 second=116 amount=-1 +kerning first=1030 second=1089 amount=-1 +kerning first=249 second=318 amount=-2 +kerning first=298 second=214 amount=-2 +kerning first=8249 second=221 amount=-3 +kerning first=86 second=220 amount=-1 +kerning first=87 second=298 amount=-1 +kerning first=1048 second=1088 amount=-1 +kerning first=321 second=318 amount=-2 +kerning first=370 second=214 amount=-1 +kerning first=296 second=259 amount=-2 +kerning first=218 second=71 amount=-1 +kerning first=85 second=214 amount=-1 +kerning first=351 second=116 amount=-2 +kerning first=305 second=375 amount=-2 +kerning first=323 second=122 amount=-1 +kerning first=98 second=369 amount=-1 +kerning first=368 second=259 amount=-3 +kerning first=269 second=375 amount=-2 +kerning first=283 second=231 amount=-1 +kerning first=287 second=122 amount=-3 +kerning first=332 second=259 amount=-1 +kerning first=233 second=375 amount=-2 +kerning first=77 second=71 amount=-2 +kerning first=369 second=337 amount=-1 +kerning first=119 second=259 amount=-3 +kerning first=243 second=116 amount=-1 +kerning first=80 second=296 amount=-1 +kerning first=83 second=259 amount=-2 +kerning first=199 second=330 amount=-3 +kerning first=224 second=259 amount=-1 +kerning first=1030 second=1075 amount=-1 +kerning first=321 second=304 amount=-2 +kerning first=279 second=116 amount=-1 +kerning first=377 second=375 amount=-3 +kerning first=334 second=228 amount=-1 +kerning first=213 second=304 amount=-2 +kerning first=82 second=251 amount=-2 +kerning first=347 second=369 amount=-1 +kerning first=374 second=253 amount=-3 +kerning first=8217 second=115 amount=-2 +kerning first=298 second=228 amount=-2 +kerning first=379 second=344 amount=-1 +kerning first=311 second=369 amount=-1 +kerning first=221 second=296 amount=-1 +kerning first=262 second=228 amount=-2 +kerning first=75 second=279 amount=-2 +kerning first=187 second=251 amount=-1 +kerning first=226 second=228 amount=-1 +kerning first=71 second=254 amount=-1 +kerning first=250 second=324 amount=-1 +kerning first=1039 second=1089 amount=-1 +kerning first=199 second=344 amount=-3 +kerning first=252 second=351 amount=-2 +kerning first=259 second=251 amount=-1 +kerning first=203 second=369 amount=-2 +kerning first=197 second=375 amount=-3 +kerning first=121 second=228 amount=-3 +kerning first=223 second=251 amount=-1 +kerning first=85 second=228 amount=-3 +kerning first=331 second=251 amount=-1 +kerning first=275 second=369 amount=-2 +kerning first=109 second=324 amount=-1 +kerning first=1043 second=1097 amount=-2 +kerning first=295 second=251 amount=-1 +kerning first=224 second=273 amount=-1 +kerning first=368 second=100 amount=-2 +kerning first=86 second=234 amount=-3 +kerning first=198 second=206 amount=-2 +kerning first=367 second=251 amount=-1 +kerning first=98 second=355 amount=-1 +kerning first=119 second=273 amount=-3 +kerning first=122 second=234 amount=-1 +kerning first=89 second=253 amount=-3 +kerning first=374 second=252 amount=-1 +kerning first=70 second=363 amount=-1 +kerning first=227 second=234 amount=-1 +kerning first=194 second=253 amount=-3 +kerning first=192 second=284 amount=-3 +kerning first=106 second=363 amount=-1 +kerning first=311 second=355 amount=-1 +kerning first=1047 second=1024 amount=-2 +kerning first=230 second=253 amount=-2 +kerning first=211 second=45 amount=-1 +kerning first=275 second=355 amount=-1 +kerning first=266 second=253 amount=-1 +kerning first=252 second=279 amount=-1 +kerning first=87 second=284 amount=-3 +kerning first=70 second=83 amount=-3 +kerning first=302 second=253 amount=-2 +kerning first=8220 second=382 amount=-1 +kerning first=1048 second=1074 amount=-1 +kerning first=242 second=318 amount=-2 +kerning first=45 second=370 amount=-4 +kerning first=296 second=263 amount=-2 +kerning first=98 second=365 amount=-1 +kerning first=75 second=213 amount=-3 +kerning first=211 second=83 amount=-1 +kerning first=376 second=313 amount=-1 +kerning first=80 second=310 amount=-1 +kerning first=314 second=318 amount=-2 +kerning first=198 second=268 amount=-1 +kerning first=268 second=313 amount=-3 +kerning first=368 second=263 amount=-2 +kerning first=81 second=370 amount=-1 +kerning first=90 second=315 amount=-1 +kerning first=83 second=263 amount=-1 +kerning first=356 second=216 amount=-3 +kerning first=222 second=370 amount=-1 +kerning first=8222 second=105 amount=-1 +kerning first=221 second=310 amount=-1 +kerning first=224 second=263 amount=-1 +kerning first=258 second=370 amount=-3 +kerning first=354 second=355 amount=-1 +kerning first=256 second=268 amount=-3 +kerning first=1087 second=1105 amount=-1 +kerning first=203 second=303 amount=-1 +kerning first=283 second=353 amount=-2 +kerning first=75 second=275 amount=-2 +kerning first=278 second=270 amount=-2 +kerning first=98 second=303 amount=-1 +kerning first=355 second=353 amount=-1 +kerning first=1051 second=1105 amount=-1 +kerning first=103 second=225 amount=-3 +kerning first=347 second=365 amount=-1 +kerning first=1062 second=1060 amount=-1 +kerning first=311 second=365 amount=-1 +kerning first=347 second=303 amount=-2 +kerning first=106 second=353 amount=-2 +kerning first=1039 second=1087 amount=-1 +kerning first=212 second=45 amount=-1 +kerning first=275 second=365 amount=-2 +kerning first=203 second=250 amount=-2 +kerning first=198 second=220 amount=-2 +kerning first=316 second=225 amount=-2 +kerning first=1105 second=1098 amount=-1 +kerning first=1025 second=1048 amount=-1 +kerning first=352 second=225 amount=-2 +kerning first=1051 second=1095 amount=-1 +kerning first=290 second=257 amount=-1 +kerning first=365 second=98 amount=-2 +kerning first=1037 second=1105 amount=-1 +kerning first=379 second=280 amount=-1 +kerning first=290 second=259 amount=-1 +kerning first=363 second=228 amount=-1 +kerning first=225 second=8249 amount=-2 +kerning first=362 second=74 amount=-3 +kerning first=350 second=270 amount=-3 +kerning first=327 second=228 amount=-2 +kerning first=116 second=98 amount=-1 +kerning first=8220 second=217 amount=-1 +kerning first=208 second=225 amount=-1 +kerning first=298 second=212 amount=-2 +kerning first=193 second=350 amount=-3 +kerning first=291 second=228 amount=-3 +kerning first=257 second=98 amount=-1 +kerning first=244 second=225 amount=-1 +kerning first=255 second=228 amount=-3 +kerning first=280 second=225 amount=-1 +kerning first=353 second=44 amount=-2 +kerning first=88 second=350 amount=-2 +kerning first=381 second=235 amount=-1 +kerning first=257 second=102 amount=-1 +kerning first=214 second=46 amount=-3 +kerning first=334 second=218 amount=-1 +kerning first=1105 second=1102 amount=-1 +kerning first=99 second=363 amount=-2 +kerning first=250 second=46 amount=-2 +kerning first=114 second=228 amount=-1 +kerning first=289 second=273 amount=-2 +kerning first=187 second=218 amount=-4 +kerning first=286 second=46 amount=-3 +kerning first=262 second=218 amount=-2 +kerning first=78 second=228 amount=-2 +kerning first=253 second=273 amount=-3 +kerning first=365 second=102 amount=-1 +kerning first=204 second=363 amount=-2 +kerning first=90 second=305 amount=-1 +kerning first=240 second=363 amount=-1 +kerning first=65 second=318 amount=-2 +kerning first=1062 second=1108 amount=-1 +kerning first=203 second=252 amount=-2 +kerning first=73 second=46 amount=-1 +kerning first=101 second=318 amount=-3 +kerning first=332 second=325 amount=-2 +kerning first=105 second=355 amount=-1 +kerning first=109 second=46 amount=-1 +kerning first=303 second=305 amount=-2 +kerning first=199 second=280 amount=-3 +kerning first=1057 second=1025 amount=-1 +kerning first=221 second=102 amount=-1 +kerning first=267 second=305 amount=-2 +kerning first=282 second=81 amount=-1 +kerning first=193 second=86 amount=-6 +kerning first=198 second=216 amount=-1 +kerning first=375 second=305 amount=-2 +kerning first=331 second=261 amount=-1 +kerning first=323 second=211 amount=-2 +kerning first=339 second=305 amount=-2 +kerning first=235 second=291 amount=-3 +kerning first=8250 second=287 amount=-3 +kerning first=367 second=261 amount=-1 +kerning first=1045 second=1117 amount=-1 +kerning first=286 second=112 amount=-1 +kerning first=84 second=67 amount=-3 +kerning first=88 second=86 amount=-2 +kerning first=250 second=112 amount=-2 +kerning first=253 second=230 amount=-3 +kerning first=8217 second=198 amount=-6 +kerning first=278 second=260 amount=-2 +kerning first=214 second=112 amount=-1 +kerning first=203 second=381 amount=-1 +kerning first=187 second=261 amount=-1 +kerning first=108 second=232 amount=-1 +kerning first=8222 second=103 amount=-1 +kerning first=350 second=260 amount=-4 +kerning first=223 second=261 amount=-1 +kerning first=192 second=240 amount=-1 +kerning first=78 second=119 amount=-2 +kerning first=259 second=261 amount=-1 +kerning first=1114 second=1076 amount=-2 +kerning first=295 second=261 amount=-1 +kerning first=216 second=209 amount=-2 +kerning first=344 second=171 amount=-4 +kerning first=84 second=327 amount=-1 +kerning first=283 second=121 amount=-2 +kerning first=377 second=204 amount=-1 +kerning first=376 second=105 amount=-2 +kerning first=268 second=105 amount=-1 +kerning first=277 second=254 amount=-2 +kerning first=246 second=331 amount=-1 +kerning first=330 second=100 amount=-2 +kerning first=69 second=81 amount=-1 +kerning first=304 second=105 amount=-1 +kerning first=200 second=171 amount=-2 +kerning first=313 second=254 amount=-2 +kerning first=366 second=100 amount=-2 +kerning first=196 second=105 amount=-1 +kerning first=236 second=171 amount=-3 +kerning first=288 second=209 amount=-1 +kerning first=232 second=105 amount=-2 +kerning first=272 second=171 amount=-1 +kerning first=227 second=230 amount=-1 +kerning first=231 second=249 amount=-2 +kerning first=200 second=346 amount=-2 +kerning first=263 second=230 amount=-2 +kerning first=267 second=249 amount=-2 +kerning first=86 second=282 amount=-1 +kerning first=122 second=230 amount=-1 +kerning first=66 second=334 amount=-3 +kerning first=268 second=379 amount=-2 +kerning first=258 second=100 amount=-1 +kerning first=195 second=249 amount=-3 +kerning first=70 second=353 amount=-2 +kerning first=375 second=249 amount=-1 +kerning first=344 second=346 amount=-3 +kerning first=86 second=230 amount=-5 +kerning first=353 second=223 amount=-1 +kerning first=252 second=275 amount=-1 +kerning first=1065 second=1079 amount=-1 +kerning first=303 second=249 amount=-1 +kerning first=272 second=346 amount=-1 +kerning first=68 second=289 amount=-1 +kerning first=1088 second=1103 amount=-2 +kerning first=207 second=334 amount=-2 +kerning first=376 second=379 amount=-3 +kerning first=1056 second=1072 amount=-1 +kerning first=117 second=100 amount=-1 +kerning first=245 second=223 amount=-1 +kerning first=99 second=107 amount=-2 +kerning first=302 second=305 amount=-1 +kerning first=231 second=113 amount=-1 +kerning first=317 second=223 amount=-1 +kerning first=218 second=339 amount=-2 +kerning first=1054 second=1058 amount=-1 +kerning first=281 second=223 amount=-1 +kerning first=193 second=244 amount=-1 +kerning first=371 second=230 amount=-2 +kerning first=321 second=256 amount=-2 +kerning first=90 second=249 amount=-3 +kerning first=1052 second=1054 amount=-1 +kerning first=260 second=252 amount=-3 +kerning first=74 second=211 amount=-2 +kerning first=362 second=339 amount=-2 +kerning first=213 second=256 amount=-4 +kerning first=8217 second=250 amount=-1 +kerning first=211 second=89 amount=-2 +kerning first=76 second=69 amount=-2 +kerning first=289 second=255 amount=-1 +kerning first=251 second=114 amount=-1 +kerning first=72 second=44 amount=-1 +kerning first=350 second=374 amount=-3 +kerning first=192 second=84 amount=-6 +kerning first=376 second=109 amount=-3 +kerning first=362 second=79 amount=-1 +kerning first=374 second=187 amount=-3 +kerning first=74 second=114 amount=-1 +kerning first=268 second=109 amount=-1 +kerning first=382 second=237 amount=-1 +kerning first=109 second=314 amount=-1 +kerning first=113 second=114 amount=-1 +kerning first=232 second=109 amount=-2 +kerning first=346 second=237 amount=-3 +kerning first=282 second=8249 amount=-2 +kerning first=1098 second=1116 amount=-1 +kerning first=117 second=104 amount=-2 +kerning first=230 second=187 amount=-2 +kerning first=363 second=232 amount=-1 +kerning first=274 second=237 amount=-1 +kerning first=311 second=99 amount=-3 +kerning first=210 second=8249 amount=-1 +kerning first=45 second=104 amount=-1 +kerning first=286 second=314 amount=-1 +kerning first=275 second=99 amount=-1 +kerning first=280 second=217 amount=-2 +kerning first=1105 second=1119 amount=-1 +kerning first=202 second=237 amount=-1 +kerning first=250 second=314 amount=-2 +kerning first=353 second=227 amount=-1 +kerning first=105 second=8249 amount=-3 +kerning first=255 second=232 amount=-3 +kerning first=8220 second=261 amount=-3 +kerning first=352 second=217 amount=-3 +kerning first=258 second=104 amount=-2 +kerning first=97 second=237 amount=-1 +kerning first=249 second=44 amount=-2 +kerning first=327 second=232 amount=-2 +kerning first=86 second=224 amount=-4 +kerning first=69 second=8249 amount=-2 +kerning first=291 second=232 amount=-2 +kerning first=252 second=269 amount=-1 +kerning first=89 second=187 amount=-3 +kerning first=78 second=232 amount=-2 +kerning first=253 second=277 amount=-3 +kerning first=69 second=351 amount=-1 +kerning first=71 second=203 amount=-1 +kerning first=82 second=257 amount=-2 +kerning first=101 second=326 amount=-2 +kerning first=217 second=277 amount=-2 +kerning first=122 second=224 amount=-1 +kerning first=1047 second=1076 amount=-2 +kerning first=325 second=277 amount=-2 +kerning first=263 second=224 amount=-2 +kerning first=1043 second=1051 amount=-5 +kerning first=289 second=277 amount=-2 +kerning first=221 second=302 amount=-1 +kerning first=227 second=224 amount=-1 +kerning first=8250 second=104 amount=-1 +kerning first=354 second=347 amount=-3 +kerning first=335 second=224 amount=-1 +kerning first=99 second=371 amount=-2 +kerning first=313 second=202 amount=-2 +kerning first=354 second=8249 amount=-5 +kerning first=282 second=347 amount=-1 +kerning first=80 second=302 amount=-1 +kerning first=98 second=361 amount=-1 +kerning first=371 second=224 amount=-2 +kerning first=99 second=101 amount=-1 +kerning first=77 second=79 amount=-2 +kerning first=354 second=351 amount=-3 +kerning first=8217 second=194 amount=-6 +kerning first=204 second=101 amount=-2 +kerning first=107 second=333 amount=-3 +kerning first=83 second=267 amount=-1 +kerning first=198 second=212 amount=-1 +kerning first=331 second=257 amount=-1 +kerning first=82 second=261 amount=-2 +kerning first=240 second=367 amount=-1 +kerning first=119 second=267 amount=-3 +kerning first=367 second=257 amount=-1 +kerning first=118 second=261 amount=-3 +kerning first=1113 second=1096 amount=-1 +kerning first=246 second=351 amount=-2 +kerning first=259 second=257 amount=-1 +kerning first=1043 second=1047 amount=-1 +kerning first=368 second=267 amount=-2 +kerning first=295 second=257 amount=-1 +kerning first=204 second=367 amount=-2 +kerning first=260 second=267 amount=-1 +kerning first=228 second=103 amount=-2 +kerning first=187 second=257 amount=-1 +kerning first=287 second=114 amount=-1 +kerning first=290 second=364 amount=-1 +kerning first=350 second=8220 amount=-2 +kerning first=218 second=79 amount=-1 +kerning first=282 second=351 amount=-1 +kerning first=223 second=257 amount=-1 +kerning first=99 second=367 amount=-2 +kerning first=107 second=246 amount=-3 +kerning first=282 second=291 amount=-3 +kerning first=202 second=241 amount=-1 +kerning first=287 second=382 amount=-3 +kerning first=67 second=221 amount=-1 +kerning first=246 second=291 amount=-2 +kerning first=323 second=382 amount=-1 +kerning first=278 second=266 amount=-1 +kerning first=1058 second=1087 amount=-2 +kerning first=375 second=311 amount=-2 +kerning first=252 second=271 amount=-1 +kerning first=210 second=291 amount=-1 +kerning first=274 second=241 amount=-1 +kerning first=339 second=311 amount=-2 +kerning first=221 second=362 amount=-1 +kerning first=206 second=266 amount=-2 +kerning first=1044 second=1057 amount=-1 +kerning first=331 second=8221 amount=-4 +kerning first=280 second=352 amount=-2 +kerning first=303 second=311 amount=-1 +kerning first=105 second=291 amount=-3 +kerning first=217 second=337 amount=-2 +kerning first=110 second=382 amount=-1 +kerning first=122 second=226 amount=-1 +kerning first=65 second=266 amount=-3 +kerning first=83 second=8221 amount=-2 +kerning first=267 second=311 amount=-2 +kerning first=69 second=291 amount=-3 +kerning first=231 second=311 amount=-2 +kerning first=97 second=241 amount=-1 +kerning first=369 second=331 amount=-1 +kerning first=227 second=226 amount=-1 +kerning first=1069 second=1042 amount=-1 +kerning first=195 second=311 amount=-2 +kerning first=251 second=382 amount=-2 +kerning first=84 second=113 amount=-3 +kerning first=224 second=8221 amount=-3 +kerning first=260 second=8221 amount=-5 +kerning first=203 second=361 amount=-2 +kerning first=325 second=337 amount=-2 +kerning first=333 second=331 amount=-1 +kerning first=311 second=361 amount=-1 +kerning first=289 second=337 amount=-2 +kerning first=225 second=331 amount=-1 +kerning first=1048 second=1082 amount=-1 +kerning first=275 second=361 amount=-2 +kerning first=109 second=316 amount=-1 +kerning first=261 second=331 amount=-1 +kerning first=352 second=221 amount=-3 +kerning first=120 second=331 amount=-1 +kerning first=81 second=368 amount=-1 +kerning first=347 second=361 amount=-1 +kerning first=280 second=221 amount=-1 +kerning first=250 second=316 amount=-2 +kerning first=332 second=8221 amount=-2 +kerning first=122 second=45 amount=-3 +kerning first=286 second=316 amount=-1 +kerning first=84 second=331 amount=-3 +kerning first=208 second=221 amount=-2 +kerning first=45 second=368 amount=-4 +kerning first=200 second=78 amount=-2 +kerning first=240 second=103 amount=-2 +kerning first=258 second=368 amount=-3 +kerning first=219 second=97 amount=-3 +kerning first=204 second=103 amount=-3 +kerning first=249 second=252 amount=-1 +kerning first=104 second=227 amount=-1 +kerning first=231 second=45 amount=-2 +kerning first=199 second=70 amount=-3 +kerning first=1102 second=1081 amount=-1 +kerning first=83 second=323 amount=-3 +kerning first=68 second=227 amount=-1 +kerning first=195 second=353 amount=-2 +kerning first=99 second=103 amount=-3 +kerning first=222 second=368 amount=-1 +kerning first=376 second=317 amount=-1 +kerning first=1051 second=1101 amount=-1 +kerning first=1048 second=1119 amount=-1 +kerning first=202 second=379 amount=-1 +kerning first=281 second=227 amount=-2 +kerning first=375 second=45 amount=-4 +kerning first=307 second=244 amount=-1 +kerning first=108 second=252 amount=-2 +kerning first=245 second=227 amount=-1 +kerning first=379 second=70 amount=-1 +kerning first=86 second=257 amount=-5 +kerning first=209 second=227 amount=-2 +kerning first=332 second=323 amount=-2 +kerning first=303 second=307 amount=-1 +kerning first=199 second=336 amount=-3 +kerning first=377 second=381 amount=-1 +kerning first=268 second=317 amount=-3 +kerning first=335 second=226 amount=-1 +kerning first=1052 second=1107 amount=-1 +kerning first=356 second=246 amount=-3 +kerning first=194 second=246 amount=-1 +kerning first=187 second=201 amount=-5 +kerning first=371 second=226 amount=-2 +kerning first=255 second=339 amount=-3 +kerning first=193 second=356 amount=-6 +kerning first=199 second=278 amount=-3 +kerning first=74 second=382 amount=-1 +kerning first=90 second=45 amount=-3 +kerning first=1088 second=1107 amount=-1 +kerning first=88 second=356 amount=-2 +kerning first=379 second=336 amount=-1 +kerning first=354 second=291 amount=-4 +kerning first=195 second=45 amount=-4 +kerning first=280 second=223 amount=-1 +kerning first=1024 second=1057 amount=-1 +kerning first=214 second=356 amount=-2 +kerning first=1059 second=1095 amount=-3 +kerning first=117 second=382 amount=-2 +kerning first=236 second=116 amount=-1 +kerning first=203 second=45 amount=-2 +kerning first=113 second=369 amount=-2 +kerning first=268 second=103 amount=-3 +kerning first=205 second=246 amount=-2 +kerning first=279 second=103 amount=-3 +kerning first=281 second=259 amount=-2 +kerning first=218 second=369 amount=-1 +kerning first=196 second=103 amount=-3 +kerning first=100 second=246 amount=-1 +kerning first=1047 second=1056 amount=-2 +kerning first=338 second=249 amount=-2 +kerning first=344 second=362 amount=-3 +kerning first=347 second=45 amount=-1 +kerning first=82 second=253 amount=-3 +kerning first=311 second=45 amount=-3 +kerning first=77 second=369 amount=-2 +kerning first=104 second=259 amount=-1 +kerning first=199 second=262 amount=-3 +kerning first=81 second=382 amount=-2 +kerning first=187 second=253 amount=-3 +kerning first=90 second=279 amount=-1 +kerning first=326 second=109 amount=-1 +kerning first=245 second=303 amount=-1 +kerning first=204 second=375 amount=-2 +kerning first=200 second=362 amount=-2 +kerning first=69 second=67 amount=-1 +kerning first=363 second=226 amount=-1 +kerning first=84 second=65 amount=-6 +kerning first=196 second=363 amount=-3 +kerning first=222 second=122 amount=-2 +kerning first=1069 second=1076 amount=-1 +kerning first=1077 second=1102 amount=-1 +kerning first=195 second=279 amount=-1 +kerning first=232 second=363 amount=-2 +kerning first=99 second=375 amount=-2 +kerning first=272 second=362 amount=-1 +kerning first=1113 second=1102 amount=-1 +kerning first=1037 second=1075 amount=-1 +kerning first=268 second=363 amount=-2 +kerning first=117 second=122 amount=-2 +kerning first=362 second=109 amount=-2 +kerning first=230 second=113 amount=-1 +kerning first=86 second=266 amount=-3 +kerning first=304 second=363 amount=-2 +kerning first=326 second=369 amount=-1 +kerning first=380 second=116 amount=-1 +kerning first=290 second=369 amount=-1 +kerning first=330 second=382 amount=-1 +kerning first=98 second=305 amount=-1 +kerning first=344 second=116 amount=-3 +kerning first=286 second=356 amount=-3 +kerning first=376 second=363 amount=-2 +kerning first=330 second=122 amount=-1 +kerning first=366 second=382 amount=-3 +kerning first=254 second=109 amount=-1 +kerning first=1055 second=1082 amount=-1 +kerning first=362 second=369 amount=-1 +kerning first=203 second=305 amount=-1 +kerning first=218 second=109 amount=-2 +kerning first=240 second=375 amount=-3 +kerning first=66 second=298 amount=-4 +kerning first=8222 second=287 amount=-1 +kerning first=254 second=355 amount=-1 +kerning first=1039 second=1095 amount=-1 +kerning first=1025 second=1036 amount=-1 +kerning first=275 second=305 amount=-2 +kerning first=240 second=115 amount=-2 +kerning first=214 second=370 amount=-1 +kerning first=87 second=336 amount=-3 +kerning first=1047 second=1070 amount=-2 +kerning first=347 second=305 amount=-2 +kerning first=113 second=355 amount=-1 +kerning first=267 second=279 amount=-1 +kerning first=286 second=370 amount=-1 +kerning first=205 second=232 amount=-2 +kerning first=192 second=336 amount=-3 +kerning first=231 second=279 amount=-1 +kerning first=105 second=339 amount=-1 +kerning first=196 second=89 amount=-6 +kerning first=8250 second=261 amount=-1 +kerning first=339 second=279 amount=-1 +kerning first=1055 second=1096 amount=-1 +kerning first=277 second=232 amount=-1 +kerning first=264 second=336 amount=-3 +kerning first=303 second=279 amount=-3 +kerning first=268 second=89 amount=-1 +kerning first=223 second=253 amount=-3 +kerning first=259 second=253 amount=-3 +kerning first=87 second=380 amount=-3 +kerning first=295 second=253 amount=-2 +kerning first=100 second=232 amount=-1 +kerning first=252 second=248 amount=-1 +kerning first=331 second=253 amount=-2 +kerning first=1073 second=1103 amount=-2 +kerning first=367 second=253 amount=-3 +kerning first=286 second=82 amount=-1 +kerning first=80 second=66 amount=-1 +kerning first=66 second=332 amount=-3 +kerning first=366 second=230 amount=-3 +kerning first=277 second=246 amount=-1 +kerning first=82 second=225 amount=-2 +kerning first=45 second=108 amount=-1 +kerning first=118 second=225 amount=-3 +kerning first=262 second=196 amount=-3 +kerning first=187 second=225 amount=-1 +kerning first=370 second=196 amount=-4 +kerning first=117 second=108 amount=-2 +kerning first=223 second=225 amount=-1 +kerning first=196 second=335 amount=-1 +kerning first=376 second=75 amount=-1 +kerning first=207 second=332 amount=-2 +kerning first=315 second=332 amount=-1 +kerning first=282 second=315 amount=-2 +kerning first=85 second=196 amount=-4 +kerning first=354 second=315 amount=-1 +kerning first=258 second=108 amount=-2 +kerning first=280 second=203 amount=-2 +kerning first=379 second=46 amount=-1 +kerning first=245 second=8217 amount=-2 +kerning first=206 second=45 amount=-4 +kerning first=208 second=203 amount=-2 +kerning first=86 second=280 amount=-1 +kerning first=321 second=286 amount=-1 +kerning first=220 second=242 amount=-2 +kerning first=220 second=326 amount=-2 +kerning first=317 second=8217 amount=-4 +kerning first=200 second=102 amount=-2 +kerning first=281 second=273 amount=-1 +kerning first=313 second=218 amount=-3 +kerning first=259 second=225 amount=-1 +kerning first=281 second=231 amount=-1 +kerning first=371 second=112 amount=-1 +kerning first=235 second=46 amount=-3 +kerning first=204 second=115 amount=-2 +kerning first=295 second=225 amount=-1 +kerning first=97 second=8221 amount=-3 +kerning first=86 second=269 amount=-3 +kerning first=68 second=8217 amount=-2 +kerning first=256 second=242 amount=-1 +kerning first=331 second=225 amount=-1 +kerning first=209 second=231 amount=-2 +kerning first=307 second=46 amount=-2 +kerning first=364 second=242 amount=-2 +kerning first=99 second=115 amount=-2 +kerning first=367 second=225 amount=-1 +kerning first=67 second=203 amount=-3 +kerning first=218 second=81 amount=-1 +kerning first=72 second=286 amount=-2 +kerning first=281 second=245 amount=-1 +kerning first=217 second=67 amount=-1 +kerning first=231 second=307 amount=-2 +kerning first=267 second=307 amount=-2 +kerning first=209 second=245 amount=-2 +kerning first=197 second=119 amount=-3 +kerning first=199 second=46 amount=-1 +kerning first=85 second=210 amount=-1 +kerning first=76 second=67 amount=-1 +kerning first=81 second=122 amount=-2 +kerning first=233 second=119 amount=-2 +kerning first=8250 second=289 amount=-3 +kerning first=107 second=232 amount=-3 +kerning first=227 second=261 amount=-1 +kerning first=236 second=102 amount=-2 +kerning first=45 second=122 amount=-5 +kerning first=269 second=119 amount=-2 +kerning first=375 second=307 amount=-2 +kerning first=67 second=217 amount=-2 +kerning first=305 second=119 amount=-3 +kerning first=310 second=8221 amount=-2 +kerning first=65 second=8217 amount=-5 +kerning first=263 second=252 amount=-2 +kerning first=376 second=335 amount=-3 +kerning first=377 second=119 amount=-2 +kerning first=1056 second=1062 amount=-1 +kerning first=1047 second=1042 amount=-2 +kerning first=1046 second=1113 amount=-2 +kerning first=335 second=252 amount=-1 +kerning first=313 second=204 amount=-2 +kerning first=371 second=252 amount=-1 +kerning first=310 second=250 amount=-3 +kerning first=86 second=252 amount=-1 +kerning first=232 second=335 amount=-1 +kerning first=353 second=259 amount=-1 +kerning first=119 second=269 amount=-3 +kerning first=122 second=252 amount=-2 +kerning first=268 second=335 amount=-2 +kerning first=1067 second=1086 amount=-1 +kerning first=83 second=269 amount=-1 +kerning first=325 second=67 amount=-2 +kerning first=304 second=335 amount=-2 +kerning first=224 second=269 amount=-1 +kerning first=1051 second=1097 amount=-1 +kerning first=77 second=81 amount=-2 +kerning first=227 second=252 amount=-1 +kerning first=109 second=328 amount=-1 +kerning first=1070 second=1118 amount=-1 +kerning first=333 second=353 amount=-2 +kerning first=296 second=269 amount=-2 +kerning first=337 second=378 amount=-2 +kerning first=369 second=365 amount=-1 +kerning first=369 second=353 amount=-2 +kerning first=260 second=269 amount=-1 +kerning first=333 second=365 amount=-1 +kerning first=346 second=378 amount=-2 +kerning first=283 second=113 amount=-1 +kerning first=368 second=269 amount=-2 +kerning first=193 second=366 amount=-3 +kerning first=198 second=262 amount=-1 +kerning first=261 second=365 amount=-1 +kerning first=351 second=112 amount=-3 +kerning first=251 second=171 amount=-2 +kerning first=225 second=365 amount=-1 +kerning first=315 second=112 amount=-2 +kerning first=225 second=353 amount=-1 +kerning first=287 second=171 amount=-3 +kerning first=279 second=100 amount=-1 +kerning first=8217 second=244 amount=-3 +kerning first=279 second=112 amount=-1 +kerning first=261 second=353 amount=-1 +kerning first=323 second=171 amount=-4 +kerning first=120 second=365 amount=-3 +kerning first=243 second=112 amount=-1 +kerning first=229 second=378 amount=-1 +kerning first=1057 second=1072 amount=-1 +kerning first=382 second=249 amount=-2 +kerning first=66 second=100 amount=-1 +kerning first=278 second=288 amount=-1 +kerning first=382 second=275 amount=-1 +kerning first=203 second=87 amount=-1 +kerning first=102 second=100 amount=-1 +kerning first=1084 second=1086 amount=-1 +kerning first=310 second=249 amount=-3 +kerning first=84 second=353 amount=-3 +kerning first=1048 second=1086 amount=-1 +kerning first=346 second=249 amount=-1 +kerning first=120 second=353 amount=-3 +kerning first=1102 second=1091 amount=-1 +kerning first=207 second=100 amount=-2 +kerning first=80 second=354 amount=-1 +kerning first=221 second=352 amount=-3 +kerning first=370 second=210 amount=-1 +kerning first=263 second=171 amount=-2 +kerning first=82 second=211 amount=-3 +kerning first=88 second=366 amount=-2 +kerning first=266 second=223 amount=-1 +kerning first=97 second=275 amount=-1 +kerning first=106 second=248 amount=-1 +kerning first=374 second=223 amount=-3 +kerning first=298 second=210 amount=-2 +kerning first=206 second=288 amount=-2 +kerning first=70 second=113 amount=-1 +kerning first=338 second=223 amount=-1 +kerning first=262 second=210 amount=-3 +kerning first=87 second=296 amount=-1 +kerning first=279 second=114 amount=-1 +kerning first=97 second=249 amount=-1 +kerning first=234 second=248 amount=-1 +kerning first=89 second=223 amount=-3 +kerning first=230 second=223 amount=-1 +kerning first=229 second=380 amount=-1 +kerning first=270 second=8220 amount=-2 +kerning first=369 second=339 amount=-1 +kerning first=243 second=114 amount=-1 +kerning first=234 second=8220 amount=-2 +kerning first=264 second=296 amount=-3 +kerning first=102 second=114 amount=-1 +kerning first=278 second=274 amount=-2 +kerning first=274 second=249 amount=-2 +kerning first=97 second=289 amount=-2 +kerning first=1058 second=1079 amount=-1 +kerning first=336 second=296 amount=-2 +kerning first=1073 second=1117 amount=-1 +kerning first=202 second=249 amount=-2 +kerning first=202 second=289 amount=-3 +kerning first=76 second=327 amount=-2 +kerning first=66 second=114 amount=-3 +kerning first=1037 second=1117 amount=-1 +kerning first=219 second=198 amount=-4 +kerning first=84 second=365 amount=-2 +kerning first=374 second=237 amount=-2 +kerning first=310 second=263 amount=-2 +kerning first=382 second=8249 amount=-3 +kerning first=338 second=237 amount=-1 +kerning first=346 second=263 amount=-1 +kerning first=274 second=8249 amount=-2 +kerning first=109 second=363 amount=-1 +kerning first=302 second=237 amount=-1 +kerning first=231 second=275 amount=-1 +kerning first=350 second=274 amount=-3 +kerning first=382 second=263 amount=-1 +kerning first=310 second=8249 amount=-4 +kerning first=210 second=315 amount=-2 +kerning first=266 second=237 amount=-1 +kerning first=1091 second=1079 amount=-1 +kerning first=97 second=263 amount=-1 +kerning first=202 second=8249 amount=-2 +kerning first=367 second=232 amount=-1 +kerning first=261 second=339 amount=-1 +kerning first=1030 second=1105 amount=-1 +kerning first=283 second=99 amount=-1 +kerning first=76 second=313 amount=-2 +kerning first=84 second=379 amount=-3 +kerning first=194 second=237 amount=-1 +kerning first=97 second=8249 amount=-2 +kerning first=69 second=315 amount=-2 +kerning first=313 second=206 amount=-2 +kerning first=268 second=75 amount=-3 +kerning first=89 second=237 amount=-2 +kerning first=203 second=73 amount=-2 +kerning first=8217 second=216 amount=-2 +kerning first=84 second=381 amount=-3 +kerning first=1102 second=1119 amount=-1 +kerning first=234 second=44 amount=-3 +kerning first=1058 second=1081 amount=-2 +kerning first=378 second=234 amount=-1 +kerning first=77 second=83 amount=-2 +kerning first=78 second=212 amount=-2 +kerning first=323 second=199 amount=-2 +kerning first=70 second=111 amount=-1 +kerning first=310 second=277 amount=-2 +kerning first=1058 second=1051 amount=-4 +kerning first=66 second=86 amount=-3 +kerning first=374 second=209 amount=-1 +kerning first=228 second=263 amount=-1 +kerning first=8217 second=246 amount=-3 +kerning first=350 second=302 amount=-3 +kerning first=234 second=234 amount=-1 +kerning first=338 second=209 amount=-2 +kerning first=382 second=277 amount=-1 +kerning first=1030 second=1119 amount=-1 +kerning first=346 second=277 amount=-1 +kerning first=278 second=302 amount=-2 +kerning first=315 second=72 amount=-2 +kerning first=225 second=351 amount=-1 +kerning first=268 second=323 amount=-3 +kerning first=198 second=264 amount=-1 +kerning first=283 second=111 amount=-1 +kerning first=362 second=83 amount=-3 +kerning first=97 second=277 amount=-1 +kerning first=274 second=289 amount=-3 +kerning first=87 second=76 amount=-1 +kerning first=310 second=289 amount=-2 +kerning first=261 second=351 amount=-1 +kerning first=346 second=289 amount=-3 +kerning first=89 second=209 amount=-1 +kerning first=382 second=289 amount=-2 +kerning first=106 second=111 amount=-1 +kerning first=327 second=212 amount=-2 +kerning first=74 second=199 amount=-2 +kerning first=376 second=323 amount=-1 +kerning first=120 second=351 amount=-3 +kerning first=219 second=212 amount=-1 +kerning first=351 second=114 amount=-1 +kerning first=333 second=367 amount=-1 +kerning first=84 second=351 amount=-3 +kerning first=193 second=364 amount=-3 +kerning first=225 second=367 amount=-1 +kerning first=346 second=291 amount=-3 +kerning first=202 second=261 amount=-1 +kerning first=261 second=367 amount=-1 +kerning first=98 second=311 amount=-1 +kerning first=209 second=233 amount=-2 +kerning first=78 second=226 amount=-2 +kerning first=120 second=367 amount=-3 +kerning first=274 second=291 amount=-3 +kerning first=114 second=226 amount=-1 +kerning first=274 second=261 amount=-1 +kerning first=281 second=233 amount=-1 +kerning first=212 second=8217 amount=-2 +kerning first=336 second=76 amount=-2 +kerning first=211 second=97 amount=-1 +kerning first=369 second=351 amount=-2 +kerning first=202 second=291 amount=-3 +kerning first=120 second=337 amount=-2 +kerning first=1058 second=1074 amount=-2 +kerning first=219 second=226 amount=-3 +kerning first=84 second=367 amount=-2 +kerning first=365 second=326 amount=-1 +kerning first=45 second=110 amount=-2 +kerning first=333 second=351 amount=-2 +kerning first=84 second=337 amount=-3 +kerning first=264 second=76 amount=-3 +kerning first=106 second=97 amount=-2 +kerning first=311 second=242 amount=-3 +kerning first=97 second=291 amount=-2 +kerning first=291 second=226 amount=-3 +kerning first=97 second=261 amount=-1 +kerning first=117 second=110 amount=-1 +kerning first=327 second=226 amount=-2 +kerning first=355 second=97 amount=-1 +kerning first=1054 second=1040 amount=-3 +kerning first=74 second=171 amount=-4 +kerning first=65 second=316 amount=-2 +kerning first=8217 second=232 amount=-3 +kerning first=221 second=326 amount=-3 +kerning first=110 second=171 amount=-3 +kerning first=200 second=350 amount=-2 +kerning first=101 second=316 amount=-3 +kerning first=283 second=97 amount=-2 +kerning first=257 second=326 amount=-1 +kerning first=225 second=337 amount=-1 +kerning first=171 second=86 amount=-3 +kerning first=1069 second=1050 amount=-1 +kerning first=224 second=229 amount=-1 +kerning first=1062 second=1092 amount=-1 +kerning first=1057 second=1064 amount=-1 +kerning first=310 second=261 amount=-1 +kerning first=242 second=316 amount=-2 +kerning first=346 second=261 amount=-2 +kerning first=346 second=370 amount=-3 +kerning first=366 second=110 amount=-2 +kerning first=344 second=350 amount=-3 +kerning first=278 second=316 amount=-1 +kerning first=382 second=261 amount=-1 +kerning first=1113 second=1116 amount=-1 +kerning first=314 second=316 amount=-2 +kerning first=234 second=250 amount=-2 +kerning first=315 second=86 amount=-3 +kerning first=1077 second=1116 amount=-1 +kerning first=272 second=350 amount=-1 +kerning first=350 second=316 amount=-2 +kerning first=198 second=250 amount=-2 +kerning first=212 second=200 amount=-2 +kerning first=281 second=271 amount=-1 +kerning first=1051 second=1057 amount=-1 +kerning first=99 second=117 amount=-2 +kerning first=290 second=381 amount=-2 +kerning first=69 second=331 amount=-1 +kerning first=362 second=381 amount=-1 +kerning first=376 second=337 amount=-3 +kerning first=211 second=8217 amount=-2 +kerning first=356 second=200 amount=-1 +kerning first=282 second=352 amount=-2 +kerning first=90 second=291 amount=-3 +kerning first=1051 second=1081 amount=-1 +kerning first=213 second=260 amount=-4 +kerning first=240 second=117 amount=-1 +kerning first=284 second=200 amount=-1 +kerning first=321 second=260 amount=-2 +kerning first=75 second=85 amount=-2 +kerning first=376 second=361 amount=-2 +kerning first=97 second=8220 amount=-3 +kerning first=227 second=240 amount=-1 +kerning first=105 second=331 amount=-2 +kerning first=282 second=115 amount=-1 +kerning first=86 second=240 amount=-3 +kerning first=327 second=214 amount=-2 +kerning first=266 second=207 amount=-3 +kerning first=122 second=240 amount=-1 +kerning first=335 second=237 amount=-1 +kerning first=236 second=382 amount=-1 +kerning first=78 second=214 amount=-2 +kerning first=371 second=240 amount=-3 +kerning first=263 second=240 amount=-1 +kerning first=199 second=290 amount=-3 +kerning first=89 second=207 amount=-1 +kerning first=272 second=90 amount=-2 +kerning first=66 second=84 amount=-3 +kerning first=288 second=378 amount=-1 +kerning first=350 second=304 amount=-3 +kerning first=214 second=330 amount=-2 +kerning first=377 second=194 amount=-1 +kerning first=313 second=220 amount=-3 +kerning first=330 second=67 amount=-2 +kerning first=69 second=71 amount=-1 +kerning first=213 second=298 amount=-2 +kerning first=278 second=304 amount=-2 +kerning first=67 second=201 amount=-3 +kerning first=375 second=291 amount=-3 +kerning first=216 second=227 amount=-1 +kerning first=339 second=291 amount=-3 +kerning first=76 second=287 amount=-3 +kerning first=1047 second=1030 amount=-2 +kerning first=338 second=207 amount=-2 +kerning first=303 second=291 amount=-1 +kerning first=77 second=97 amount=-2 +kerning first=321 second=298 amount=-2 +kerning first=374 second=207 amount=-1 +kerning first=1037 second=1077 amount=-1 +kerning first=171 second=84 amount=-3 +kerning first=286 second=330 amount=-1 +kerning first=75 second=227 amount=-1 +kerning first=1047 second=1058 amount=-1 +kerning first=231 second=291 amount=-3 +kerning first=108 second=116 amount=-1 +kerning first=259 second=122 amount=-1 +kerning first=195 second=291 amount=-3 +kerning first=196 second=337 amount=-1 +kerning first=253 second=287 amount=-3 +kerning first=264 second=290 amount=-3 +kerning first=77 second=350 amount=-2 +kerning first=365 second=324 amount=-1 +kerning first=282 second=71 amount=-1 +kerning first=254 second=97 amount=-1 +kerning first=217 second=287 amount=-4 +kerning first=260 second=311 amount=-2 +kerning first=1044 second=1101 amount=-1 +kerning first=315 second=84 amount=-3 +kerning first=113 second=97 amount=-2 +kerning first=1105 second=1088 amount=-1 +kerning first=224 second=311 amount=-1 +kerning first=203 second=317 amount=-2 +kerning first=84 second=77 amount=-1 +kerning first=354 second=71 amount=-3 +kerning first=289 second=287 amount=-2 +kerning first=1116 second=1101 amount=-1 +kerning first=362 second=97 amount=-3 +kerning first=119 second=311 amount=-2 +kerning first=221 second=324 amount=-3 +kerning first=304 second=337 amount=-2 +kerning first=83 second=311 amount=-2 +kerning first=200 second=90 amount=-1 +kerning first=290 second=97 amount=-1 +kerning first=218 second=381 amount=-1 +kerning first=232 second=337 amount=-1 +kerning first=354 second=204 amount=-1 +kerning first=257 second=324 amount=-1 +kerning first=117 second=120 amount=-2 +kerning first=90 second=263 amount=-1 +kerning first=268 second=365 amount=-2 +kerning first=232 second=365 amount=-2 +kerning first=222 second=120 amount=-1 +kerning first=195 second=263 amount=-1 +kerning first=196 second=365 amount=-3 +kerning first=381 second=193 amount=-1 +kerning first=231 second=263 amount=-1 +kerning first=76 second=325 amount=-2 +kerning first=354 second=303 amount=-2 +kerning first=266 second=197 amount=-3 +kerning first=106 second=339 amount=-1 +kerning first=86 second=268 amount=-3 +kerning first=226 second=241 amount=-1 +kerning first=326 second=353 amount=-1 +kerning first=286 second=70 amount=-1 +kerning first=82 second=213 amount=-3 +kerning first=45 second=120 amount=-3 +kerning first=87 second=310 amount=-1 +kerning first=362 second=353 amount=-2 +kerning first=8218 second=107 amount=-1 +kerning first=66 second=74 amount=-4 +kerning first=81 second=120 amount=-1 +kerning first=221 second=78 amount=-1 +kerning first=214 second=70 amount=-2 +kerning first=336 second=310 amount=-2 +kerning first=1048 second=1100 amount=-1 +kerning first=80 second=78 amount=-1 +kerning first=370 second=262 amount=-1 +kerning first=209 second=275 amount=-2 +kerning first=113 second=353 amount=-2 +kerning first=196 second=248 amount=-1 +kerning first=1007 second=1003 amount=-2 +kerning first=105 second=303 amount=-1 +kerning first=344 second=118 amount=-3 +kerning first=228 second=109 amount=-1 +kerning first=99 second=113 amount=-1 +kerning first=207 second=74 amount=-1 +kerning first=264 second=310 amount=-3 +kerning first=218 second=353 amount=-2 +kerning first=1055 second=1080 amount=-1 +kerning first=116 second=314 amount=-1 +kerning first=254 second=353 amount=-2 +kerning first=352 second=201 amount=-3 +kerning first=203 second=85 amount=-2 +kerning first=246 second=303 amount=-1 +kerning first=236 second=118 amount=-3 +kerning first=315 second=74 amount=-1 +kerning first=376 second=365 amount=-2 +kerning first=282 second=303 amount=-1 +kerning first=200 second=118 amount=-1 +kerning first=280 second=201 amount=-2 +kerning first=366 second=120 amount=-2 +kerning first=286 second=366 amount=-1 +kerning first=304 second=365 amount=-2 +kerning first=210 second=303 amount=-1 +kerning first=77 second=353 amount=-2 +kerning first=257 second=314 amount=-1 +kerning first=208 second=201 amount=-2 +kerning first=1102 second=1093 amount=-1 +kerning first=266 second=235 amount=-2 +kerning first=195 second=8249 amount=-4 +kerning first=365 second=314 amount=-2 +kerning first=119 second=283 amount=-3 +kerning first=302 second=235 amount=-2 +kerning first=330 second=380 amount=-1 +kerning first=231 second=8249 amount=-2 +kerning first=367 second=241 amount=-1 +kerning first=83 second=283 amount=-1 +kerning first=8216 second=227 amount=-3 +kerning first=366 second=380 amount=-3 +kerning first=90 second=8249 amount=-3 +kerning first=120 second=105 amount=-1 +kerning first=258 second=355 amount=-1 +kerning first=374 second=235 amount=-3 +kerning first=213 second=270 amount=-2 +kerning first=198 second=224 amount=-1 +kerning first=117 second=380 amount=-2 +kerning first=339 second=249 amount=-2 +kerning first=1073 second=1087 amount=-1 +kerning first=259 second=241 amount=-1 +kerning first=296 second=283 amount=-2 +kerning first=264 second=338 amount=-3 +kerning first=250 second=98 amount=-2 +kerning first=223 second=241 amount=-1 +kerning first=260 second=283 amount=-1 +kerning first=222 second=380 amount=-2 +kerning first=331 second=241 amount=-1 +kerning first=224 second=283 amount=-1 +kerning first=234 second=224 amount=-2 +kerning first=356 second=228 amount=-4 +kerning first=192 second=338 amount=-3 +kerning first=1037 second=1087 amount=-1 +kerning first=295 second=241 amount=-1 +kerning first=378 second=171 amount=-3 +kerning first=284 second=228 amount=-1 +kerning first=277 second=248 amount=-1 +kerning first=248 second=228 amount=-1 +kerning first=45 second=380 amount=-5 +kerning first=187 second=241 amount=-2 +kerning first=70 second=101 amount=-1 +kerning first=368 second=283 amount=-2 +kerning first=66 second=112 amount=-4 +kerning first=378 second=224 amount=-1 +kerning first=212 second=228 amount=-1 +kerning first=81 second=380 amount=-2 +kerning first=251 second=102 amount=-1 +kerning first=118 second=241 amount=-2 +kerning first=106 second=101 amount=-1 +kerning first=267 second=263 amount=-1 +kerning first=205 second=248 amount=-2 +kerning first=89 second=235 amount=-3 +kerning first=235 second=318 amount=-3 +kerning first=303 second=263 amount=-3 +kerning first=354 second=331 amount=-3 +kerning first=107 second=228 amount=-2 +kerning first=375 second=8249 amount=-4 +kerning first=201 second=193 amount=-2 +kerning first=339 second=263 amount=-1 +kerning first=100 second=248 amount=-1 +kerning first=71 second=228 amount=-1 +kerning first=307 second=318 amount=-2 +kerning first=267 second=8249 amount=-2 +kerning first=1061 second=1038 amount=-3 +kerning first=375 second=263 amount=-3 +kerning first=282 second=331 amount=-1 +kerning first=230 second=235 amount=-1 +kerning first=283 second=101 amount=-1 +kerning first=368 second=281 amount=-2 +kerning first=1040 second=1072 amount=-1 +kerning first=281 second=97 amount=-2 +kerning first=1036 second=1047 amount=-2 +kerning first=352 second=205 amount=-3 +kerning first=252 second=231 amount=-1 +kerning first=220 second=256 amount=-4 +kerning first=356 second=230 amount=-5 +kerning first=80 second=82 amount=-1 +kerning first=224 second=281 amount=-1 +kerning first=248 second=230 amount=-1 +kerning first=1044 second=1073 amount=-1 +kerning first=1048 second=1098 amount=-1 +kerning first=260 second=281 amount=-1 +kerning first=208 second=205 amount=-2 +kerning first=284 second=230 amount=-1 +kerning first=252 second=255 amount=-3 +kerning first=296 second=281 amount=-2 +kerning first=97 second=251 amount=-1 +kerning first=88 second=108 amount=-1 +kerning first=8220 second=253 amount=-1 +kerning first=212 second=230 amount=-1 +kerning first=311 second=347 amount=-2 +kerning first=67 second=205 amount=-3 +kerning first=111 second=255 amount=-3 +kerning first=202 second=251 amount=-2 +kerning first=75 second=8217 amount=-2 +kerning first=275 second=347 amount=-2 +kerning first=83 second=281 amount=-1 +kerning first=75 second=255 amount=-3 +kerning first=111 second=8217 amount=-2 +kerning first=119 second=281 amount=-3 +kerning first=274 second=251 amount=-2 +kerning first=85 second=378 amount=-3 +kerning first=203 second=347 amount=-1 +kerning first=8222 second=303 amount=-1 +kerning first=369 second=107 amount=-2 +kerning first=205 second=216 amount=-2 +kerning first=346 second=251 amount=-1 +kerning first=369 second=105 amount=-2 +kerning first=98 second=347 amount=-2 +kerning first=310 second=251 amount=-3 +kerning first=283 second=371 amount=-2 +kerning first=210 second=193 amount=-4 +kerning first=313 second=216 amount=-1 +kerning first=75 second=231 amount=-2 +kerning first=225 second=107 amount=-1 +kerning first=382 second=251 amount=-2 +kerning first=355 second=371 amount=-1 +kerning first=88 second=106 amount=-1 +kerning first=88 second=368 amount=-2 +kerning first=268 second=333 amount=-2 +kerning first=286 second=68 amount=-1 +kerning first=232 second=333 amount=-1 +kerning first=354 second=67 amount=-3 +kerning first=275 second=345 amount=-1 +kerning first=214 second=68 amount=-2 +kerning first=84 second=81 amount=-3 +kerning first=221 second=80 amount=-1 +kerning first=304 second=333 amount=-2 +kerning first=282 second=67 amount=-1 +kerning first=347 second=345 amount=-1 +kerning first=88 second=374 amount=-2 +kerning first=207 second=346 amount=-2 +kerning first=201 second=217 amount=-2 +kerning first=79 second=282 amount=-2 +kerning first=352 second=203 amount=-3 +kerning first=193 second=368 amount=-3 +kerning first=196 second=333 amount=-1 +kerning first=364 second=102 amount=-1 +kerning first=229 second=106 amount=-1 +kerning first=66 second=346 amount=-4 +kerning first=209 second=243 amount=-2 +kerning first=71 second=230 amount=-1 +kerning first=71 second=204 amount=-1 +kerning first=199 second=244 amount=-2 +kerning first=107 second=230 amount=-2 +kerning first=315 second=346 amount=-1 +kerning first=212 second=204 amount=-2 +kerning first=281 second=243 amount=-1 +kerning first=337 second=106 amount=-2 +kerning first=119 second=307 amount=-2 +kerning first=8216 second=101 amount=-3 +kerning first=284 second=204 amount=-1 +kerning first=1063 second=1090 amount=-1 +kerning first=224 second=307 amount=-1 +kerning first=376 second=333 amount=-3 +kerning first=356 second=204 amount=-1 +kerning first=278 second=278 amount=-2 +kerning first=79 second=256 amount=-4 +kerning first=210 second=69 amount=-2 +kerning first=283 second=369 amount=-2 +kerning first=346 second=380 amount=-2 +kerning first=315 second=344 amount=-2 +kerning first=192 second=334 amount=-3 +kerning first=101 second=44 amount=-3 +kerning first=229 second=104 amount=-1 +kerning first=355 second=369 amount=-1 +kerning first=111 second=259 amount=-1 +kerning first=242 second=44 amount=-3 +kerning first=193 second=104 amount=-2 +kerning first=75 second=259 amount=-1 +kerning first=206 second=44 amount=-1 +kerning first=1025 second=1034 amount=-1 +kerning first=333 second=109 amount=-1 +kerning first=106 second=369 amount=-1 +kerning first=315 second=374 amount=-3 +kerning first=69 second=69 amount=-2 +kerning first=70 second=369 amount=-1 +kerning first=377 second=192 amount=-1 +kerning first=337 second=104 amount=-1 +kerning first=369 second=109 amount=-1 +kerning first=100 second=244 amount=-1 +kerning first=260 second=279 amount=-1 +kerning first=111 second=229 amount=-1 +kerning first=324 second=227 amount=-1 +kerning first=120 second=109 amount=-1 +kerning first=288 second=227 amount=-1 +kerning first=261 second=109 amount=-1 +kerning first=252 second=227 amount=-1 +kerning first=296 second=279 amount=-2 +kerning first=364 second=284 amount=-1 +kerning first=1051 second=1085 amount=-1 +kerning first=75 second=229 amount=-1 +kerning first=1055 second=1084 amount=-1 +kerning first=83 second=279 amount=-1 +kerning first=256 second=284 amount=-3 +kerning first=356 second=232 amount=-3 +kerning first=1057 second=1054 amount=-1 +kerning first=288 second=229 amount=-1 +kerning first=278 second=44 amount=-1 +kerning first=324 second=229 amount=-1 +kerning first=105 second=305 amount=-2 +kerning first=84 second=109 amount=-3 +kerning first=216 second=229 amount=-1 +kerning first=69 second=305 amount=-1 +kerning first=119 second=279 amount=-3 +kerning first=220 second=284 amount=-1 +kerning first=87 second=334 amount=-3 +kerning first=350 second=44 amount=-4 +kerning first=252 second=229 amount=-1 +kerning first=210 second=305 amount=-1 +kerning first=339 second=267 amount=-1 +kerning first=252 second=257 amount=-1 +kerning first=225 second=249 amount=-1 +kerning first=268 second=65 amount=-3 +kerning first=375 second=267 amount=-3 +kerning first=106 second=371 amount=-1 +kerning first=288 second=257 amount=-1 +kerning first=282 second=305 amount=-1 +kerning first=267 second=267 amount=-1 +kerning first=255 second=118 amount=-1 +kerning first=246 second=305 amount=-1 +kerning first=303 second=267 amount=-3 +kerning first=216 second=257 amount=-1 +kerning first=8216 second=113 amount=-3 +kerning first=354 second=305 amount=-2 +kerning first=376 second=65 amount=-6 +kerning first=235 second=8250 amount=-2 +kerning first=232 second=361 amount=-2 +kerning first=75 second=257 amount=-1 +kerning first=212 second=202 amount=-2 +kerning first=368 second=279 amount=-2 +kerning first=196 second=361 amount=-3 +kerning first=111 second=257 amount=-1 +kerning first=71 second=202 amount=-1 +kerning first=201 second=219 amount=-2 +kerning first=304 second=361 amount=-2 +kerning first=347 second=347 amount=-3 +kerning first=214 second=209 amount=-2 +kerning first=268 second=361 amount=-2 +kerning first=171 second=374 amount=-3 +kerning first=362 second=121 amount=-1 +kerning first=356 second=202 amount=-1 +kerning first=256 second=254 amount=-2 +kerning first=205 second=244 amount=-2 +kerning first=326 second=121 amount=-2 +kerning first=66 second=374 amount=-3 +kerning first=284 second=202 amount=-1 +kerning first=328 second=254 amount=-2 +kerning first=277 second=244 amount=-1 +kerning first=254 second=121 amount=-3 +kerning first=84 second=79 amount=-3 +kerning first=354 second=69 amount=-1 +kerning first=286 second=66 amount=-1 +kerning first=195 second=267 amount=-1 +kerning first=231 second=267 amount=-1 +kerning first=115 second=254 amount=-2 +kerning first=282 second=69 amount=-2 +kerning first=214 second=66 amount=-2 +kerning first=90 second=267 amount=-1 +kerning first=113 second=121 amount=-1 +kerning first=324 second=257 amount=-1 +kerning first=77 second=121 amount=-2 +kerning first=1048 second=1116 amount=-1 +kerning first=315 second=82 amount=-2 +kerning first=87 second=66 amount=-1 +kerning first=257 second=353 amount=-1 +kerning first=73 second=332 amount=-2 +kerning first=8220 second=115 amount=-2 +kerning first=369 second=250 amount=-1 +kerning first=270 second=8221 amount=-2 +kerning first=203 second=69 amount=-2 +kerning first=264 second=66 amount=-3 +kerning first=201 second=209 amount=-2 +kerning first=379 second=302 amount=-1 +kerning first=199 second=316 amount=-1 +kerning first=338 second=205 amount=-2 +kerning first=366 second=347 amount=-2 +kerning first=214 second=72 amount=-2 +kerning first=78 second=216 amount=-2 +kerning first=67 second=199 amount=-3 +kerning first=370 second=192 amount=-4 +kerning first=1098 second=1096 amount=-1 +kerning first=221 second=76 amount=-1 +kerning first=286 second=72 amount=-1 +kerning first=376 second=79 amount=-3 +kerning first=334 second=192 amount=-4 +kerning first=374 second=205 amount=-1 +kerning first=66 second=82 amount=-4 +kerning first=193 second=339 amount=-1 +kerning first=336 second=66 amount=-2 +kerning first=122 second=242 amount=-1 +kerning first=187 second=229 amount=-1 +kerning first=262 second=192 amount=-3 +kerning first=86 second=242 amount=-3 +kerning first=223 second=229 amount=-1 +kerning first=80 second=76 amount=-1 +kerning first=266 second=205 amount=-3 +kerning first=227 second=242 amount=-1 +kerning first=82 second=229 amount=-2 +kerning first=280 second=199 amount=-1 +kerning first=118 second=229 amount=-3 +kerning first=310 second=8217 amount=-2 +kerning first=1037 second=1099 amount=-1 +kerning first=212 second=226 amount=-1 +kerning first=263 second=242 amount=-1 +kerning first=74 second=8249 amount=-4 +kerning first=248 second=226 amount=-1 +kerning first=290 second=382 amount=-1 +kerning first=89 second=205 amount=-1 +kerning first=371 second=242 amount=-3 +kerning first=284 second=226 amount=-1 +kerning first=68 second=8221 amount=-2 +kerning first=286 second=86 amount=-3 +kerning first=374 second=219 amount=-1 +kerning first=281 second=8221 amount=-2 +kerning first=219 second=216 amount=-1 +kerning first=356 second=226 amount=-5 +kerning first=99 second=119 amount=-2 +kerning first=338 second=219 amount=-2 +kerning first=317 second=8221 amount=-4 +kerning first=228 second=326 amount=-1 +kerning first=1043 second=1033 amount=-5 +kerning first=264 second=326 amount=-1 +kerning first=204 second=119 amount=-2 +kerning first=266 second=219 amount=-2 +kerning first=245 second=8221 amount=-2 +kerning first=327 second=216 amount=-2 +kerning first=240 second=119 amount=-2 +kerning first=235 second=316 amount=-3 +kerning first=1055 second=1092 amount=-1 +kerning first=84 second=103 amount=-4 +kerning first=194 second=219 amount=-3 +kerning first=1091 second=1092 amount=-2 +kerning first=381 second=209 amount=-1 +kerning first=354 second=333 amount=-3 +kerning first=307 second=316 amount=-2 +kerning first=87 second=326 amount=-3 +kerning first=89 second=219 amount=-1 +kerning first=199 second=302 amount=-3 +kerning first=105 second=333 amount=-1 +kerning first=214 second=86 amount=-2 +kerning first=71 second=226 amount=-1 +kerning first=8218 second=237 amount=-1 +kerning first=221 second=334 amount=-3 +kerning first=107 second=226 amount=-2 +kerning first=346 second=259 amount=-2 +kerning first=296 second=289 amount=-3 +kerning first=8217 second=231 amount=-3 +kerning first=378 second=246 amount=-1 +kerning first=310 second=259 amount=-1 +kerning first=1073 second=1085 amount=-1 +kerning first=337 second=116 amount=-1 +kerning first=369 second=103 amount=-3 +kerning first=315 second=356 amount=-3 +kerning first=84 second=369 amount=-2 +kerning first=1037 second=1085 amount=-1 +kerning first=75 second=253 amount=-3 +kerning first=283 second=375 amount=-2 +kerning first=333 second=103 amount=-2 +kerning first=231 second=269 amount=-1 +kerning first=84 second=363 amount=-2 +kerning first=382 second=259 amount=-1 +kerning first=371 second=363 amount=-1 +kerning first=111 second=253 amount=-3 +kerning first=337 second=122 amount=-2 +kerning first=69 second=45 amount=-2 +kerning first=195 second=269 amount=-1 +kerning first=120 second=363 amount=-3 +kerning first=287 second=263 amount=-2 +kerning first=1098 second=1082 amount=-1 +kerning first=261 second=103 amount=-1 +kerning first=234 second=246 amount=-1 +kerning first=303 second=269 amount=-3 +kerning first=109 second=112 amount=-1 +kerning first=193 second=116 amount=-1 +kerning first=225 second=103 amount=-2 +kerning first=267 second=269 amount=-1 +kerning first=225 second=363 amount=-1 +kerning first=274 second=259 amount=-1 +kerning first=252 second=253 amount=-3 +kerning first=282 second=45 amount=-2 +kerning first=375 second=269 amount=-3 +kerning first=261 second=363 amount=-1 +kerning first=378 second=252 amount=-2 +kerning first=120 second=103 amount=-2 +kerning first=8250 second=251 amount=-1 +kerning first=339 second=269 amount=-1 +kerning first=66 second=362 amount=-3 +kerning first=333 second=369 amount=-1 +kerning first=1055 second=1086 amount=-1 +kerning first=333 second=363 amount=-1 +kerning first=337 second=382 amount=-2 +kerning first=346 second=275 amount=-1 +kerning first=369 second=363 amount=-1 +kerning first=97 second=259 amount=-1 +kerning first=220 second=266 amount=-1 +kerning first=369 second=369 amount=-1 +kerning first=256 second=266 amount=-3 +kerning first=1044 second=1089 amount=-1 +kerning first=120 second=369 amount=-3 +kerning first=261 second=369 amount=-1 +kerning first=229 second=382 amount=-1 +kerning first=106 second=375 amount=-3 +kerning first=1116 second=1089 amount=-2 +kerning first=229 second=122 amount=-1 +kerning first=225 second=369 amount=-1 +kerning first=1080 second=1089 amount=-1 +kerning first=321 second=284 amount=-1 +kerning first=120 second=355 amount=-1 +kerning first=313 second=361 amount=-2 +kerning first=310 second=279 amount=-2 +kerning first=84 second=355 amount=-1 +kerning first=106 second=109 amount=-2 +kerning first=221 second=336 amount=-3 +kerning first=70 second=115 amount=-2 +kerning first=315 second=370 amount=-3 +kerning first=382 second=279 amount=-1 +kerning first=97 second=273 amount=-1 +kerning first=106 second=115 amount=-2 +kerning first=346 second=279 amount=-1 +kerning first=330 second=213 amount=-2 +kerning first=8217 second=214 amount=-2 +kerning first=261 second=355 amount=-1 +kerning first=355 second=115 amount=-1 +kerning first=97 second=279 amount=-1 +kerning first=70 second=109 amount=-1 +kerning first=79 second=280 amount=-2 +kerning first=378 second=232 amount=-1 +kerning first=283 second=115 amount=-2 +kerning first=199 second=296 amount=-3 +kerning first=1060 second=1070 amount=-1 +kerning first=1091 second=1086 amount=-2 +kerning first=1039 second=1097 amount=-1 +kerning first=229 second=108 amount=-1 +kerning first=324 second=253 amount=-2 +kerning first=193 second=108 amount=-2 +kerning first=89 second=380 amount=-3 +kerning first=8250 second=361 amount=-1 +kerning first=369 second=355 amount=-1 +kerning first=1045 second=1119 amount=-1 +kerning first=379 second=296 amount=-1 +kerning first=234 second=232 amount=-1 +kerning first=88 second=116 amount=-1 +kerning first=71 second=206 amount=-1 +kerning first=66 second=370 amount=-3 +kerning first=337 second=108 amount=-2 +kerning first=66 second=296 amount=-4 +kerning first=45 second=323 amount=-5 +kerning first=211 second=193 amount=-4 +kerning first=90 second=46 amount=-1 +kerning first=73 second=338 amount=-2 +kerning first=212 second=206 amount=-2 +kerning first=289 second=303 amount=-2 +kerning first=321 second=290 amount=-1 +kerning first=257 second=328 amount=-1 +kerning first=73 second=83 amount=-2 +kerning first=200 second=98 amount=-1 +kerning first=221 second=328 amount=-3 +kerning first=284 second=206 amount=-1 +kerning first=217 second=303 amount=-2 +kerning first=282 second=325 amount=-2 +kerning first=356 second=206 amount=-1 +kerning first=89 second=213 amount=-3 +kerning first=325 second=303 amount=-1 +kerning first=84 second=83 amount=-3 +kerning first=365 second=328 amount=-1 +kerning first=1073 second=1107 amount=-1 +kerning first=1037 second=1107 amount=-1 +kerning first=333 second=328 amount=-1 +kerning first=266 second=225 amount=-2 +kerning first=380 second=380 amount=-2 +kerning first=380 second=98 amount=-1 +kerning first=1067 second=1102 amount=-1 +kerning first=344 second=364 amount=-3 +kerning first=79 second=344 amount=-2 +kerning first=302 second=225 amount=-2 +kerning first=219 second=196 amount=-4 +kerning first=376 second=85 amount=-1 +kerning first=203 second=323 amount=-2 +kerning first=338 second=225 amount=-1 +kerning first=1091 second=1077 amount=-2 +kerning first=72 second=290 amount=-2 +kerning first=1030 second=1117 amount=-1 +kerning first=374 second=225 amount=-5 +kerning first=382 second=273 amount=-1 +kerning first=310 second=108 amount=-1 +kerning first=89 second=225 amount=-5 +kerning first=236 second=380 amount=-1 +kerning first=236 second=98 amount=-1 +kerning first=1073 second=1093 amount=-2 +kerning first=268 second=85 amount=-2 +kerning first=379 second=290 amount=-1 +kerning first=278 second=286 amount=-1 +kerning first=272 second=380 amount=-2 +kerning first=344 second=98 amount=-3 +kerning first=69 second=325 amount=-2 +kerning first=196 second=85 amount=-3 +kerning first=230 second=225 amount=-2 +kerning first=75 second=233 amount=-2 +kerning first=206 second=286 amount=-2 +kerning first=246 second=311 amount=-1 +kerning first=203 second=77 amount=-2 +kerning first=243 second=102 amount=-1 +kerning first=268 second=71 amount=-3 +kerning first=228 second=46 amount=-1 +kerning first=89 second=211 amount=-3 +kerning first=279 second=102 amount=-2 +kerning first=327 second=210 amount=-2 +kerning first=379 second=282 amount=-1 +kerning first=1105 second=1080 amount=-1 +kerning first=1113 second=1118 amount=-2 +kerning first=214 second=8217 amount=-2 +kerning first=105 second=311 amount=-1 +kerning first=351 second=102 amount=-2 +kerning first=304 second=71 amount=-2 +kerning first=336 second=46 amount=-3 +kerning first=252 second=233 amount=-1 +kerning first=69 second=311 amount=-1 +kerning first=1047 second=1040 amount=-2 +kerning first=66 second=102 amount=-3 +kerning first=219 second=210 amount=-1 +kerning first=65 second=286 amount=-3 +kerning first=73 second=352 amount=-2 +kerning first=266 second=211 amount=-3 +kerning first=102 second=102 amount=-1 +kerning first=87 second=46 amount=-5 +kerning first=214 second=352 amount=-1 +kerning first=196 second=71 amount=-3 +kerning first=76 second=317 amount=-2 +kerning first=194 second=211 amount=-3 +kerning first=78 second=210 amount=-2 +kerning first=187 second=221 amount=-4 +kerning first=374 second=211 amount=-3 +kerning first=264 second=45 amount=-4 +kerning first=82 second=235 amount=-3 +kerning first=272 second=112 amount=-1 +kerning first=1098 second=1090 amount=-1 +kerning first=82 second=221 amount=-3 +kerning first=118 second=235 amount=-3 +kerning first=302 second=211 amount=-2 +kerning first=198 second=252 amount=-2 +kerning first=236 second=112 amount=-1 +kerning first=344 second=366 amount=-3 +kerning first=338 second=211 amount=-1 +kerning first=234 second=252 amount=-2 +kerning first=200 second=112 amount=-2 +kerning first=207 second=350 amount=-2 +kerning first=259 second=235 amount=-1 +kerning first=334 second=200 amount=-2 +kerning first=376 second=71 amount=-3 +kerning first=364 second=234 amount=-2 +kerning first=229 second=110 amount=-1 +kerning first=66 second=350 amount=-4 +kerning first=1062 second=1090 amount=-1 +kerning first=1065 second=1086 amount=-1 +kerning first=282 second=311 amount=-1 +kerning first=262 second=200 amount=-3 +kerning first=195 second=275 amount=-1 +kerning first=196 second=353 amount=-2 +kerning first=315 second=350 amount=-1 +kerning first=187 second=237 amount=-1 +kerning first=122 second=250 amount=-2 +kerning first=337 second=110 amount=-1 +kerning first=200 second=378 amount=-2 +kerning first=232 second=353 amount=-2 +kerning first=118 second=237 amount=-2 +kerning first=86 second=250 amount=-2 +kerning first=218 second=113 amount=-2 +kerning first=330 second=171 amount=-4 +kerning first=256 second=112 amount=-3 +kerning first=90 second=275 amount=-1 +kerning first=268 second=353 amount=-2 +kerning first=227 second=250 amount=-1 +kerning first=366 second=171 amount=-5 +kerning first=272 second=378 amount=-2 +kerning first=304 second=353 amount=-2 +kerning first=113 second=113 amount=-1 +kerning first=79 second=260 amount=-4 +kerning first=380 second=100 amount=-1 +kerning first=117 second=171 amount=-2 +kerning first=362 second=113 amount=-2 +kerning first=362 second=365 amount=-1 +kerning first=1031 second=1073 amount=-1 +kerning first=380 second=112 amount=-3 +kerning first=213 second=8221 amount=-2 +kerning first=222 second=171 amount=-1 +kerning first=326 second=365 amount=-1 +kerning first=200 second=366 amount=-2 +kerning first=344 second=112 amount=-1 +kerning first=258 second=171 amount=-4 +kerning first=290 second=365 amount=-1 +kerning first=245 second=249 amount=-1 +kerning first=286 second=352 amount=-2 +kerning first=236 second=100 amount=-1 +kerning first=279 second=235 amount=-1 +kerning first=268 second=87 amount=-1 +kerning first=281 second=249 amount=-2 +kerning first=220 second=260 amount=-4 +kerning first=362 second=228 amount=-3 +kerning first=196 second=87 amount=-6 +kerning first=209 second=249 amount=-1 +kerning first=344 second=100 amount=-3 +kerning first=1098 second=1076 amount=-2 +kerning first=339 second=275 amount=-1 +kerning first=194 second=100 amount=-1 +kerning first=1069 second=1078 amount=-1 +kerning first=8250 second=257 amount=-1 +kerning first=77 second=113 amount=-2 +kerning first=1048 second=1102 amount=-1 +kerning first=375 second=275 amount=-3 +kerning first=364 second=260 amount=-4 +kerning first=286 second=354 amount=-3 +kerning first=86 second=262 amount=-3 +kerning first=1047 second=1052 amount=-2 +kerning first=267 second=275 amount=-1 +kerning first=1073 second=1091 amount=-2 +kerning first=303 second=275 amount=-3 +kerning first=72 second=288 amount=-2 +kerning first=1116 second=1077 amount=-2 +kerning first=85 second=198 amount=-4 +kerning first=268 second=339 amount=-2 +kerning first=371 second=248 amount=-3 +kerning first=211 second=377 amount=-2 +kerning first=272 second=364 amount=-1 +kerning first=304 second=339 amount=-2 +kerning first=263 second=248 amount=-1 +kerning first=367 second=223 amount=-1 +kerning first=1044 second=1077 amount=-1 +kerning first=196 second=339 amount=-1 +kerning first=362 second=99 amount=-2 +kerning first=1080 second=1077 amount=-1 +kerning first=195 second=289 amount=-3 +kerning first=232 second=339 amount=-1 +kerning first=69 second=327 amount=-2 +kerning first=118 second=223 amount=-1 +kerning first=371 second=8220 amount=-3 +kerning first=104 second=249 amount=-1 +kerning first=335 second=8220 amount=-2 +kerning first=1102 second=1117 amount=-1 +kerning first=267 second=289 amount=-3 +kerning first=321 second=288 amount=-1 +kerning first=86 second=248 amount=-3 +kerning first=223 second=223 amount=-1 +kerning first=303 second=289 amount=-1 +kerning first=210 second=327 amount=-2 +kerning first=122 second=248 amount=-1 +kerning first=187 second=223 amount=-2 +kerning first=45 second=84 amount=-4 +kerning first=263 second=8220 amount=-2 +kerning first=236 second=114 amount=-1 +kerning first=376 second=339 amount=-3 +kerning first=74 second=223 amount=-1 +kerning first=83 second=287 amount=-3 +kerning first=354 second=313 amount=-1 +kerning first=376 second=73 amount=-1 +kerning first=254 second=365 amount=-1 +kerning first=282 second=327 amount=-2 +kerning first=209 second=263 amount=-2 +kerning first=218 second=365 amount=-1 +kerning first=213 second=274 amount=-2 +kerning first=77 second=99 amount=-2 +kerning first=282 second=313 amount=-2 +kerning first=76 second=315 amount=-2 +kerning first=354 second=327 amount=-1 +kerning first=119 second=287 amount=-3 +kerning first=367 second=237 amount=-2 +kerning first=281 second=263 amount=-1 +kerning first=113 second=365 amount=-2 +kerning first=290 second=379 amount=-2 +kerning first=260 second=287 amount=-3 +kerning first=331 second=237 amount=-1 +kerning first=210 second=313 amount=-2 +kerning first=262 second=198 amount=-3 +kerning first=203 second=75 amount=-2 +kerning first=77 second=365 amount=-2 +kerning first=376 second=353 amount=-3 +kerning first=224 second=287 amount=-2 +kerning first=113 second=99 amount=-1 +kerning first=295 second=237 amount=-1 +kerning first=268 second=73 amount=-3 +kerning first=362 second=379 amount=-1 +kerning first=332 second=287 amount=-1 +kerning first=259 second=237 amount=-1 +kerning first=334 second=198 amount=-4 +kerning first=225 second=109 amount=-1 +kerning first=321 second=274 amount=-2 +kerning first=296 second=287 amount=-3 +kerning first=218 second=99 amount=-2 +kerning first=223 second=237 amount=-1 +kerning first=370 second=198 amount=-4 +kerning first=1102 second=1103 amount=-2 +kerning first=324 second=237 amount=-1 +kerning first=244 second=187 amount=-2 +kerning first=200 second=104 amount=-1 +kerning first=368 second=287 amount=-4 +kerning first=205 second=234 amount=-2 +kerning first=252 second=237 amount=-2 +kerning first=216 second=237 amount=-1 +kerning first=277 second=234 amount=-1 +kerning first=1055 second=1094 amount=-1 +kerning first=1116 second=1091 amount=-2 +kerning first=66 second=354 amount=-3 +kerning first=344 second=104 amount=-3 +kerning first=111 second=237 amount=-1 +kerning first=171 second=354 amount=-3 +kerning first=45 second=226 amount=-1 +kerning first=82 second=117 amount=-2 +kerning first=235 second=44 amount=-3 +kerning first=1116 second=1072 amount=-1 +kerning first=344 second=374 amount=-3 +kerning first=100 second=234 amount=-1 +kerning first=234 second=244 amount=-1 +kerning first=1098 second=1084 amount=-1 +kerning first=199 second=44 amount=-1 +kerning first=236 second=104 amount=-1 +kerning first=303 second=277 amount=-3 +kerning first=223 second=227 amount=-1 +kerning first=113 second=111 amount=-1 +kerning first=267 second=277 amount=-1 +kerning first=274 second=77 amount=-2 +kerning first=111 second=120 amount=-3 +kerning first=187 second=227 amount=-1 +kerning first=280 second=237 amount=-1 +kerning first=262 second=194 amount=-3 +kerning first=251 second=100 amount=-1 +kerning first=315 second=354 amount=-3 +kerning first=118 second=227 amount=-3 +kerning first=218 second=111 amount=-2 +kerning first=339 second=277 amount=-1 +kerning first=8250 second=259 amount=-1 +kerning first=73 second=74 amount=-1 +kerning first=82 second=227 amount=-2 +kerning first=367 second=227 amount=-1 +kerning first=90 second=277 amount=-1 +kerning first=331 second=227 amount=-1 +kerning first=1040 second=1054 amount=-3 +kerning first=85 second=194 amount=-4 +kerning first=231 second=277 amount=-1 +kerning first=192 second=314 amount=-2 +kerning first=214 second=74 amount=-2 +kerning first=295 second=227 amount=-1 +kerning first=1084 second=1104 amount=-1 +kerning first=195 second=277 amount=-1 +kerning first=259 second=227 amount=-1 +kerning first=77 second=111 amount=-2 +kerning first=1048 second=1104 amount=-1 +kerning first=376 second=351 amount=-3 +kerning first=264 second=314 amount=-1 +kerning first=286 second=74 amount=-1 +kerning first=332 second=8249 amount=-1 +kerning first=227 second=249 amount=-1 +kerning first=120 second=361 amount=-3 +kerning first=228 second=314 amount=-1 +kerning first=261 second=361 amount=-1 +kerning first=97 second=267 amount=-1 +kerning first=314 second=122 amount=-1 +kerning first=68 second=261 amount=-1 +kerning first=290 second=367 amount=-1 +kerning first=260 second=8249 amount=-4 +kerning first=106 second=121 amount=-3 +kerning first=66 second=364 amount=-3 +kerning first=203 second=327 amount=-2 +kerning first=353 second=257 amount=-1 +kerning first=104 second=261 amount=-1 +kerning first=326 second=367 amount=-1 +kerning first=1037 second=1089 amount=-1 +kerning first=1105 second=1074 amount=-1 +kerning first=333 second=361 amount=-1 +kerning first=346 second=267 amount=-1 +kerning first=245 second=257 amount=-1 +kerning first=218 second=367 amount=-1 +kerning first=263 second=254 amount=-2 +kerning first=315 second=364 amount=-3 +kerning first=196 second=351 amount=-2 +kerning first=281 second=257 amount=-2 +kerning first=254 second=367 amount=-1 +kerning first=224 second=8249 amount=-2 +kerning first=304 second=351 amount=-2 +kerning first=100 second=224 amount=-1 +kerning first=337 second=114 amount=-1 +kerning first=113 second=367 amount=-2 +kerning first=202 second=260 amount=-2 +kerning first=362 second=111 amount=-2 +kerning first=335 second=254 amount=-1 +kerning first=369 second=361 amount=-1 +kerning first=268 second=351 amount=-2 +kerning first=209 second=257 amount=-2 +kerning first=119 second=8249 amount=-4 +kerning first=371 second=254 amount=-1 +kerning first=45 second=327 amount=-5 +kerning first=205 second=224 amount=-2 +kerning first=1101 second=1117 amount=-1 +kerning first=283 second=117 amount=-2 +kerning first=272 second=374 amount=-2 +kerning first=353 second=261 amount=-1 +kerning first=77 second=367 amount=-2 +kerning first=78 second=105 amount=-1 +kerning first=8222 second=255 amount=-1 +kerning first=122 second=254 amount=-1 +kerning first=277 second=224 amount=-2 +kerning first=355 second=117 amount=-1 +kerning first=200 second=374 amount=-1 +kerning first=241 second=224 amount=-1 +kerning first=378 second=244 amount=-1 +kerning first=81 second=171 amount=-1 +kerning first=380 second=104 amount=-2 +kerning first=227 second=254 amount=-1 +kerning first=286 second=344 amount=-1 +kerning first=88 second=114 amount=1 +kerning first=1058 second=1057 amount=-1 +kerning first=209 second=261 amount=-2 +kerning first=263 second=250 amount=-2 +kerning first=84 second=361 amount=-2 +kerning first=245 second=261 amount=-1 +kerning first=371 second=250 amount=-1 +kerning first=281 second=261 amount=-2 +kerning first=335 second=250 amount=-1 +kerning first=77 second=101 amount=-2 +kerning first=338 second=221 amount=-1 +kerning first=113 second=101 amount=-1 +kerning first=311 second=337 amount=-3 +kerning first=378 second=240 amount=-1 +kerning first=347 second=331 amount=-2 +kerning first=275 second=337 amount=-1 +kerning first=266 second=221 amount=-1 +kerning first=333 second=97 amount=-1 +kerning first=218 second=101 amount=-2 +kerning first=275 second=331 amount=-2 +kerning first=1054 second=1038 amount=-3 +kerning first=369 second=97 amount=-1 +kerning first=1030 second=1107 amount=-1 +kerning first=278 second=290 amount=-1 +kerning first=194 second=221 amount=-6 +kerning first=106 second=117 amount=-1 +kerning first=70 second=117 amount=-1 +kerning first=362 second=101 amount=-2 +kerning first=98 second=331 amount=-1 +kerning first=279 second=98 amount=-2 +kerning first=1057 second=1062 amount=-1 +kerning first=97 second=271 amount=-1 +kerning first=221 second=338 amount=-3 +kerning first=243 second=98 amount=-1 +kerning first=356 second=214 amount=-3 +kerning first=206 second=290 amount=-2 +kerning first=104 second=251 amount=-1 +kerning first=351 second=98 amount=-2 +kerning first=364 second=264 amount=-1 +kerning first=328 second=8221 amount=-4 +kerning first=315 second=98 amount=-2 +kerning first=209 second=251 amount=-2 +kerning first=102 second=98 amount=4 +kerning first=234 second=240 amount=-1 +kerning first=66 second=98 amount=-3 +kerning first=337 second=380 amount=-2 +kerning first=281 second=251 amount=-2 +kerning first=1100 second=1113 amount=-1 +kerning first=256 second=264 amount=-3 +kerning first=1063 second=1084 amount=-1 +kerning first=65 second=290 amount=-3 +kerning first=245 second=251 amount=-1 +kerning first=220 second=264 amount=-1 +kerning first=283 second=109 amount=-2 +kerning first=382 second=271 amount=-1 +kerning first=80 second=330 amount=-1 +kerning first=290 second=378 amount=-1 +kerning first=278 second=298 amount=-2 +kerning first=112 second=311 amount=-1 +kerning first=282 second=317 amount=-2 +kerning first=317 second=251 amount=-2 +kerning first=66 second=90 amount=-4 +kerning first=1098 second=1080 amount=-1 +kerning first=76 second=311 amount=-2 +kerning first=284 second=249 amount=-1 +kerning first=201 second=201 amount=-2 +kerning first=350 second=298 amount=-3 +kerning first=203 second=71 amount=-1 +kerning first=268 second=77 amount=-3 +kerning first=381 second=207 amount=-1 +kerning first=354 second=317 amount=-1 +kerning first=71 second=220 amount=-1 +kerning first=379 second=310 amount=-1 +kerning first=284 second=220 amount=-1 +kerning first=370 second=194 amount=-4 +kerning first=201 second=207 amount=-2 +kerning first=212 second=220 amount=-1 +kerning first=351 second=46 amount=-2 +kerning first=210 second=317 amount=-2 +kerning first=368 second=291 amount=-4 +kerning first=221 second=330 amount=-1 +kerning first=376 second=77 amount=-1 +kerning first=334 second=194 amount=-4 +kerning first=332 second=291 amount=-1 +kerning first=194 second=213 amount=-3 +kerning first=228 second=324 amount=-1 +kerning first=272 second=368 amount=-1 +kerning first=84 second=97 amount=-5 +kerning first=296 second=291 amount=-3 +kerning first=362 second=226 amount=-3 +kerning first=214 second=84 amount=-2 +kerning first=120 second=97 amount=-2 +kerning first=260 second=291 amount=-3 +kerning first=266 second=213 amount=-3 +kerning first=356 second=220 amount=-1 +kerning first=200 second=368 amount=-2 +kerning first=310 second=347 amount=-1 +kerning first=224 second=291 amount=-2 +kerning first=264 second=324 amount=-1 +kerning first=274 second=316 amount=-1 +kerning first=211 second=381 amount=-2 +kerning first=69 second=317 amount=-2 +kerning first=338 second=213 amount=-1 +kerning first=119 second=45 amount=-4 +kerning first=261 second=97 amount=-1 +kerning first=289 second=311 amount=-2 +kerning first=119 second=291 amount=-3 +kerning first=302 second=213 amount=-2 +kerning first=352 second=187 amount=-1 +kerning first=1037 second=1101 amount=-1 +kerning first=253 second=311 amount=-2 +kerning first=83 second=291 amount=-3 +kerning first=344 second=368 amount=-3 +kerning first=1098 second=1088 amount=-1 +kerning first=374 second=213 amount=-3 +kerning first=87 second=324 amount=-3 +kerning first=286 second=84 amount=-3 +kerning first=225 second=97 amount=-1 +kerning first=213 second=278 amount=-2 +kerning first=218 second=375 amount=-1 +kerning first=100 second=228 amount=-1 +kerning first=280 second=193 amount=-2 +kerning first=209 second=253 amount=-2 +kerning first=284 second=218 amount=-1 +kerning first=8220 second=111 amount=-3 +kerning first=97 second=311 amount=-1 +kerning first=245 second=253 amount=-3 +kerning first=113 second=375 amount=-1 +kerning first=344 second=263 amount=-3 +kerning first=208 second=193 amount=-4 +kerning first=281 second=253 amount=-2 +kerning first=77 second=375 amount=-2 +kerning first=212 second=218 amount=-1 +kerning first=1051 second=1075 amount=-1 +kerning first=317 second=253 amount=-3 +kerning first=362 second=375 amount=-1 +kerning first=80 second=70 amount=-1 +kerning first=321 second=278 amount=-2 +kerning first=353 second=253 amount=-3 +kerning first=326 second=375 amount=-2 +kerning first=252 second=243 amount=-1 +kerning first=362 second=103 amount=-4 +kerning first=310 second=242 amount=-2 +kerning first=286 second=78 amount=-1 +kerning first=352 second=193 amount=-4 +kerning first=326 second=103 amount=-2 +kerning first=254 second=375 amount=-3 +kerning first=356 second=218 amount=-1 +kerning first=76 second=45 amount=-1 +kerning first=290 second=103 amount=-3 +kerning first=381 second=203 amount=-1 +kerning first=214 second=78 amount=-2 +kerning first=337 second=120 amount=-3 +kerning first=199 second=310 amount=-3 +kerning first=1073 second=1095 amount=-1 +kerning first=208 second=45 amount=-1 +kerning first=1037 second=1095 amount=-1 +kerning first=221 second=70 amount=-1 +kerning first=1055 second=1100 amount=-1 +kerning first=381 second=201 amount=-1 +kerning first=232 second=345 amount=-1 +kerning first=70 second=213 amount=-1 +kerning first=229 second=120 amount=-1 +kerning first=71 second=218 amount=-1 +kerning first=228 second=253 amount=-3 +kerning first=196 second=104 amount=-2 +kerning first=171 second=356 amount=-3 +kerning first=104 second=253 amount=-2 +kerning first=201 second=203 amount=-2 +kerning first=380 second=108 amount=-2 +kerning first=362 second=105 amount=-2 +kerning first=229 second=118 amount=-3 +kerning first=344 second=370 amount=-3 +kerning first=344 second=108 amount=-3 +kerning first=193 second=118 amount=-3 +kerning first=112 second=305 amount=-1 +kerning first=75 second=245 amount=-2 +kerning first=203 second=65 amount=-2 +kerning first=76 second=305 amount=-2 +kerning first=326 second=105 amount=-1 +kerning first=217 second=305 amount=-2 +kerning first=195 second=283 amount=-1 +kerning first=1084 second=1108 amount=-1 +kerning first=218 second=105 amount=-2 +kerning first=79 second=270 amount=-2 +kerning first=213 second=280 amount=-2 +kerning first=1048 second=1108 amount=-1 +kerning first=254 second=105 amount=-1 +kerning first=289 second=305 amount=-1 +kerning first=252 second=245 amount=-1 +kerning first=90 second=283 amount=-1 +kerning first=364 second=266 amount=-1 +kerning first=113 second=105 amount=-1 +kerning first=339 second=245 amount=-1 +kerning first=253 second=305 amount=-2 +kerning first=1047 second=1048 amount=-2 +kerning first=88 second=118 amount=-3 +kerning first=192 second=318 amount=-2 +kerning first=252 second=241 amount=-1 +kerning first=339 second=283 amount=-1 +kerning first=1051 second=1073 amount=-1 +kerning first=275 second=335 amount=-1 +kerning first=77 second=105 amount=-1 +kerning first=311 second=335 amount=-3 +kerning first=324 second=241 amount=-1 +kerning first=267 second=283 amount=-1 +kerning first=202 second=365 amount=-2 +kerning first=231 second=283 amount=-1 +kerning first=277 second=228 amount=-2 +kerning first=236 second=108 amount=-2 +kerning first=200 second=370 amount=-2 +kerning first=200 second=108 amount=-1 +kerning first=307 second=230 amount=-2 +kerning first=205 second=228 amount=-2 +kerning first=225 second=105 amount=-1 +kerning first=111 second=241 amount=-1 +kerning first=375 second=283 amount=-3 +kerning first=67 second=193 amount=-3 +kerning first=231 second=281 amount=-1 +kerning first=367 second=242 amount=-1 +kerning first=45 second=224 amount=-1 +kerning first=113 second=107 amount=-2 +kerning first=303 second=281 amount=-3 +kerning first=86 second=256 amount=-6 +kerning first=254 second=107 amount=-1 +kerning first=221 second=66 amount=-1 +kerning first=339 second=281 amount=-1 +kerning first=118 second=231 amount=-3 +kerning first=1073 second=1097 amount=-1 +kerning first=90 second=281 amount=-1 +kerning first=230 second=261 amount=-2 +kerning first=1065 second=1047 amount=-1 +kerning first=353 second=255 amount=-3 +kerning first=259 second=231 amount=-1 +kerning first=381 second=205 amount=-1 +kerning first=1037 second=1097 amount=-1 +kerning first=221 second=332 amount=-3 +kerning first=321 second=280 amount=-2 +kerning first=201 second=205 amount=-2 +kerning first=242 second=8250 amount=-2 +kerning first=268 second=81 amount=-3 +kerning first=281 second=255 amount=-2 +kerning first=326 second=371 amount=-1 +kerning first=104 second=257 amount=-1 +kerning first=1055 second=1098 amount=-1 +kerning first=203 second=67 amount=-1 +kerning first=245 second=255 amount=-3 +kerning first=376 second=347 amount=-3 +kerning first=209 second=255 amount=-2 +kerning first=304 second=81 amount=-2 +kerning first=310 second=345 amount=1 +kerning first=304 second=347 amount=-2 +kerning first=113 second=371 amount=-2 +kerning first=67 second=304 amount=-3 +kerning first=104 second=255 amount=-2 +kerning first=268 second=347 amount=-2 +kerning first=290 second=107 amount=-1 +kerning first=376 second=81 amount=-3 +kerning first=232 second=347 amount=-2 +kerning first=196 second=347 amount=-2 +kerning first=254 second=371 amount=-1 +kerning first=350 second=8250 amount=-1 +kerning first=331 second=229 amount=-1 +kerning first=80 second=68 amount=-1 +kerning first=295 second=291 amount=-2 +kerning first=85 second=192 amount=-4 +kerning first=367 second=229 amount=-1 +kerning first=376 second=345 amount=-1 +kerning first=194 second=217 amount=-3 +kerning first=286 second=80 amount=-1 +kerning first=75 second=334 amount=-3 +kerning first=259 second=229 amount=-1 +kerning first=234 second=242 amount=-1 +kerning first=295 second=229 amount=-1 +kerning first=321 second=282 amount=-2 +kerning first=266 second=217 amount=-2 +kerning first=73 second=346 amount=-2 +kerning first=8217 second=224 amount=-6 +kerning first=274 second=318 amount=-1 +kerning first=338 second=217 amount=-2 +kerning first=213 second=282 amount=-2 +kerning first=196 second=81 amount=-3 +kerning first=374 second=217 amount=-1 +kerning first=214 second=8221 amount=-2 +kerning first=221 second=68 amount=-1 +kerning first=214 second=80 amount=-2 +kerning first=241 second=230 amount=-1 +kerning first=70 second=119 amount=-1 +kerning first=214 second=346 amount=-1 +kerning first=75 second=243 amount=-2 +kerning first=344 second=106 amount=-1 +kerning first=277 second=230 amount=-2 +kerning first=106 second=119 amount=-3 +kerning first=253 second=307 amount=-2 +kerning first=197 second=244 amount=-1 +kerning first=289 second=307 amount=-2 +kerning first=8250 second=116 amount=-1 +kerning first=272 second=106 amount=-1 +kerning first=205 second=230 amount=-2 +kerning first=275 second=333 amount=-1 +kerning first=375 second=281 amount=-3 +kerning first=365 second=339 amount=-1 +kerning first=100 second=230 amount=-1 +kerning first=283 second=119 amount=-2 +kerning first=380 second=106 amount=-2 +kerning first=311 second=333 amount=-3 +kerning first=286 second=346 amount=-2 +kerning first=89 second=217 amount=-1 +kerning first=355 second=119 amount=-1 +kerning first=314 second=275 amount=-1 +kerning first=382 second=119 amount=-2 +kerning first=89 second=100 amount=-3 +kerning first=112 second=230 amount=-1 +kerning first=367 second=44 amount=-2 +kerning first=367 second=45 amount=-2 +kerning first=66 second=46 amount=-4 +kerning first=350 second=275 amount=-1 +kerning first=80 second=353 amount=-1 +kerning first=356 second=346 amount=-3 +kerning first=333 second=249 amount=-1 +kerning first=213 second=65 amount=-4 +kerning first=66 second=69 amount=-4 +kerning first=321 second=70 amount=-2 +kerning first=66 second=72 amount=-4 +kerning first=84 second=73 amount=-1 +kerning first=78 second=74 amount=-1 +kerning first=98 second=353 amount=-2 +kerning first=66 second=79 amount=-3 +kerning first=321 second=80 amount=-2 +kerning first=76 second=81 amount=-1 +kerning first=199 second=82 amount=-3 +kerning first=381 second=199 amount=-1 +kerning first=193 second=84 amount=-6 +kerning first=213 second=86 amount=-2 +kerning first=66 second=87 amount=-3 +kerning first=363 second=97 amount=-1 +kerning first=110 second=98 amount=-2 +kerning first=235 second=99 amount=-1 +kerning first=377 second=100 amount=-1 +kerning first=66 second=101 amount=-1 +kerning first=193 second=102 amount=-1 +kerning first=351 second=307 amount=-2 +kerning first=88 second=104 amount=-1 +kerning first=187 second=105 amount=-1 +kerning first=102 second=106 amount=-1 +kerning first=66 second=107 amount=-3 +kerning first=235 second=108 amount=-3 +kerning first=8217 second=109 amount=-2 +kerning first=263 second=110 amount=-2 +kerning first=311 second=111 amount=-3 +kerning first=355 second=112 amount=-1 +kerning first=269 second=113 amount=-1 +kerning first=197 second=115 amount=-2 +kerning first=287 second=116 amount=-1 +kerning first=100 second=117 amount=-1 +kerning first=221 second=118 amount=-3 +kerning first=249 second=119 amount=-3 +kerning first=313 second=120 amount=-1 +kerning first=355 second=122 amount=-1 +kerning first=198 second=256 amount=-2 +kerning first=205 second=67 amount=-2 +kerning first=65 second=275 amount=-1 +kerning first=101 second=275 amount=-1 +kerning first=66 second=187 amount=-2 +kerning first=84 second=249 amount=-1 +kerning first=219 second=192 amount=-4 +kerning first=221 second=194 amount=-6 +kerning first=187 second=195 amount=-4 +kerning first=66 second=196 amount=-5 +kerning first=68 second=197 amount=-4 +kerning first=84 second=198 amount=-6 +kerning first=272 second=370 amount=-1 +kerning first=86 second=201 amount=-1 +kerning first=317 second=204 amount=-2 +kerning first=80 second=207 amount=-1 +kerning first=193 second=211 amount=-3 +kerning first=76 second=212 amount=-1 +kerning first=313 second=213 amount=-1 +kerning first=84 second=214 amount=-3 +kerning first=251 second=8217 amount=-3 +kerning first=315 second=218 amount=-3 +kerning first=197 second=219 amount=-3 +kerning first=351 second=223 amount=-1 +kerning first=249 second=224 amount=-1 +kerning first=323 second=225 amount=-2 +kerning first=211 second=227 amount=-1 +kerning first=86 second=228 amount=-4 +kerning first=243 second=229 amount=-1 +kerning first=325 second=230 amount=-2 +kerning first=217 second=231 amount=-2 +kerning first=235 second=233 amount=-1 +kerning first=303 second=234 amount=-3 +kerning first=261 second=235 amount=-1 +kerning first=72 second=237 amount=-1 +kerning first=330 second=45 amount=-4 +kerning first=120 second=240 amount=-2 +kerning first=80 second=242 amount=-1 +kerning first=365 second=243 amount=-1 +kerning first=8217 second=245 amount=-3 +kerning first=112 second=316 amount=-2 +kerning first=291 second=248 amount=-2 +kerning first=317 second=249 amount=-2 +kerning first=76 second=251 amount=-2 +kerning first=235 second=252 amount=-2 +kerning first=106 second=253 amount=-3 +kerning first=305 second=254 amount=-2 +kerning first=351 second=255 amount=-3 +kerning first=251 second=259 amount=-1 +kerning first=84 second=260 amount=-6 +kerning first=74 second=261 amount=-3 +kerning first=86 second=263 amount=-3 +kerning first=379 second=266 amount=-1 +kerning first=106 second=267 amount=-1 +kerning first=315 second=268 amount=-1 +kerning first=377 second=269 amount=-1 +kerning first=84 second=270 amount=-1 +kerning first=76 second=274 amount=-2 +kerning first=263 second=275 amount=-1 +kerning first=229 second=277 amount=-1 +kerning first=76 second=278 amount=-2 +kerning first=289 second=279 amount=-2 +kerning first=377 second=280 amount=-1 +kerning first=279 second=281 amount=-1 +kerning first=68 second=282 amount=-2 +kerning first=195 second=284 amount=-3 +kerning first=86 second=286 amount=-3 +kerning first=112 second=287 amount=-2 +kerning first=76 second=288 amount=-1 +kerning first=229 second=289 amount=-2 +kerning first=114 second=291 amount=-2 +kerning first=1078 second=1095 amount=-1 +kerning first=217 second=230 amount=-3 +kerning first=76 second=302 amount=-2 +kerning first=377 second=303 amount=-1 +kerning first=379 second=304 amount=-1 +kerning first=321 second=305 amount=-2 +kerning first=225 second=307 amount=-1 +kerning first=353 second=311 amount=-1 +kerning first=321 second=313 amount=-2 +kerning first=263 second=314 amount=-3 +kerning first=249 second=316 amount=-2 +kerning first=224 second=289 amount=-2 +kerning first=314 second=116 amount=-1 +kerning first=313 second=323 amount=-2 +kerning first=261 second=324 amount=-1 +kerning first=347 second=326 amount=-2 +kerning first=313 second=327 amount=-2 +kerning first=350 second=379 amount=-1 +kerning first=337 second=331 amount=-1 +kerning first=86 second=332 amount=-3 +kerning first=371 second=333 amount=-3 +kerning first=323 second=335 amount=-2 +kerning first=8217 second=336 amount=-2 +kerning first=205 second=338 amount=-2 +kerning first=225 second=339 amount=-1 +kerning first=370 second=237 amount=-2 +kerning first=98 second=345 amount=-1 +kerning first=8217 second=346 amount=-3 +kerning first=120 second=347 amount=-3 +kerning first=221 second=350 amount=-3 +kerning first=305 second=351 amount=-1 +kerning first=201 second=352 amount=-2 +kerning first=365 second=353 amount=-2 +kerning first=199 second=354 amount=-1 +kerning first=333 second=355 amount=-1 +kerning first=195 second=356 amount=-6 +kerning first=334 second=237 amount=-1 +kerning first=78 second=361 amount=-2 +kerning first=66 second=363 amount=-3 +kerning first=68 second=364 amount=-1 +kerning first=321 second=365 amount=-2 +kerning first=100 second=367 amount=-1 +kerning first=86 second=368 amount=-1 +kerning first=249 second=371 amount=-1 +kerning first=222 second=313 amount=-2 +kerning first=66 second=375 amount=-3 +kerning first=379 second=378 amount=-3 +kerning first=76 second=382 amount=-3 +kerning first=311 second=339 amount=-3 +kerning first=291 second=303 amount=-2 +kerning first=81 second=313 amount=-2 +kerning first=1062 second=1086 amount=-1 +kerning first=262 second=237 amount=-1 +kerning first=1088 second=1091 amount=-1 +kerning first=235 second=244 amount=-1 +kerning first=207 second=263 amount=-2 +kerning first=226 second=237 amount=-1 +kerning first=69 second=199 amount=-1 +kerning first=1079 second=1084 amount=-1 +kerning first=275 second=339 amount=-1 +kerning first=279 second=263 amount=-1 +kerning first=45 second=313 amount=-5 +kerning first=72 second=334 amount=-2 +kerning first=274 second=379 amount=-1 +kerning first=364 second=365 amount=-1 +kerning first=71 second=346 amount=-2 +kerning first=288 second=270 amount=-1 +kerning first=86 second=225 amount=-5 +kerning first=328 second=365 amount=-1 +kerning first=346 second=379 amount=-1 +kerning first=122 second=225 amount=-1 +kerning first=66 second=263 amount=-1 +kerning first=1080 second=1072 amount=-1 +kerning first=75 second=268 amount=-3 +kerning first=102 second=263 amount=-1 +kerning first=256 second=365 amount=-3 +kerning first=1044 second=1072 amount=-1 +kerning first=1061 second=1098 amount=-3 +kerning first=103 second=251 amount=-1 +kerning first=83 second=289 amount=-3 +kerning first=67 second=251 amount=-2 +kerning first=212 second=346 amount=-1 +kerning first=119 second=289 amount=-3 +kerning first=115 second=365 amount=-1 +kerning first=1045 second=1060 amount=-1 +kerning first=1105 second=1117 amount=-1 +kerning first=216 second=270 amount=-2 +kerning first=377 second=296 amount=-1 +kerning first=311 second=8221 amount=-2 +kerning first=313 second=315 amount=-2 +kerning first=212 second=374 amount=-2 +kerning first=280 second=251 amount=-2 +kerning first=374 second=72 amount=-1 +kerning first=257 second=121 amount=-3 +kerning first=244 second=251 amount=-1 +kerning first=120 second=277 amount=-2 +kerning first=338 second=72 amount=-2 +kerning first=251 second=254 amount=-2 +kerning first=221 second=121 amount=-3 +kerning first=352 second=251 amount=-1 +kerning first=261 second=277 amount=-1 +kerning first=287 second=254 amount=-1 +kerning first=71 second=374 amount=-3 +kerning first=316 second=251 amount=-2 +kerning first=225 second=277 amount=-1 +kerning first=202 second=351 amount=-1 +kerning first=374 second=120 amount=-2 +kerning first=89 second=231 amount=-3 +kerning first=218 second=245 amount=-2 +kerning first=116 second=121 amount=-1 +kerning first=1027 second=1074 amount=-2 +kerning first=266 second=381 amount=-2 +kerning first=1063 second=1074 amount=-1 +kerning first=203 second=79 amount=-1 +kerning first=84 second=277 amount=-3 +kerning first=311 second=367 amount=-1 +kerning first=110 second=254 amount=-2 +kerning first=1025 second=1118 amount=-1 +kerning first=1057 second=1105 amount=-1 +kerning first=83 second=261 amount=-2 +kerning first=219 second=117 amount=-1 +kerning first=1052 second=1119 amount=-1 +kerning first=379 second=244 amount=-1 +kerning first=356 second=114 amount=-1 +kerning first=275 second=367 amount=-2 +kerning first=376 second=76 amount=-1 +kerning first=1108 second=1081 amount=-1 +kerning first=221 second=381 amount=-3 +kerning first=248 second=114 amount=-1 +kerning first=291 second=117 amount=-1 +kerning first=224 second=261 amount=-1 +kerning first=203 second=367 amount=-2 +kerning first=255 second=117 amount=-1 +kerning first=89 second=72 amount=-1 +kerning first=205 second=83 amount=-2 +kerning first=310 second=351 amount=-1 +kerning first=381 second=192 amount=-1 +kerning first=268 second=76 amount=-3 +kerning first=354 second=199 amount=-3 +kerning first=307 second=232 amount=-1 +kerning first=98 second=367 amount=-1 +kerning first=327 second=117 amount=-2 +kerning first=196 second=336 amount=-3 +kerning first=284 second=374 amount=-3 +kerning first=365 second=121 amount=-3 +kerning first=1114 second=1096 amount=-1 +kerning first=382 second=351 amount=-2 +kerning first=1072 second=1081 amount=-1 +kerning first=194 second=108 amount=-2 +kerning first=313 second=83 amount=-1 +kerning first=346 second=351 amount=-1 +kerning first=266 second=72 amount=-3 +kerning first=194 second=8217 amount=-5 +kerning first=268 second=336 amount=-3 +kerning first=66 second=291 amount=-4 +kerning first=212 second=86 amount=-2 +kerning first=347 second=107 amount=-1 +kerning first=256 second=337 amount=-1 +kerning first=8217 second=234 amount=-3 +kerning first=275 second=102 amount=-2 +kerning first=221 second=249 amount=-1 +kerning first=220 second=337 amount=-2 +kerning first=233 second=240 amount=-1 +kerning first=1045 second=1088 amount=-1 +kerning first=210 second=171 amount=-1 +kerning first=269 second=240 amount=-1 +kerning first=317 second=382 amount=-3 +kerning first=203 second=107 amount=-1 +kerning first=353 second=382 amount=-2 +kerning first=8216 second=243 amount=-3 +kerning first=296 second=261 amount=-2 +kerning first=364 second=337 amount=-2 +kerning first=377 second=240 amount=-1 +kerning first=336 second=196 amount=-4 +kerning first=275 second=107 amount=-2 +kerning first=368 second=261 amount=-3 +kerning first=199 second=216 amount=-3 +kerning first=8222 second=370 amount=-3 +kerning first=78 second=117 amount=-2 +kerning first=1108 second=1116 amount=-1 +kerning first=262 second=209 amount=-3 +kerning first=1069 second=1024 amount=-1 +kerning first=1069 second=1025 amount=-1 +kerning first=1069 second=1030 amount=-1 +kerning first=1069 second=1031 amount=-1 +kerning first=1059 second=1033 amount=-5 +kerning first=1069 second=1034 amount=-1 +kerning first=1047 second=1036 amount=-2 +kerning first=1069 second=1037 amount=-1 +kerning first=71 second=86 amount=-3 +kerning first=1069 second=1039 amount=-1 +kerning first=1059 second=1040 amount=-6 +kerning first=1069 second=1041 amount=-1 +kerning first=1069 second=1043 amount=-1 +kerning first=1045 second=1045 amount=-1 +kerning first=379 second=216 amount=-1 +kerning first=1069 second=1048 amount=-1 +kerning first=1069 second=1049 amount=-1 +kerning first=266 second=100 amount=-2 +kerning first=1059 second=1051 amount=-5 +kerning first=1069 second=1052 amount=-1 +kerning first=78 second=382 amount=-1 +kerning first=1059 second=1054 amount=-3 +kerning first=1069 second=1055 amount=-1 +kerning first=1045 second=1056 amount=-1 +kerning first=1059 second=1057 amount=-3 +kerning first=1025 second=1058 amount=-1 +kerning first=1069 second=1059 amount=-3 +kerning first=1043 second=1060 amount=-1 +kerning first=1069 second=1062 amount=-1 +kerning first=1069 second=1063 amount=-2 +kerning first=282 second=171 amount=-2 +kerning first=302 second=100 amount=-2 +kerning first=1025 second=1067 amount=-1 +kerning first=197 second=240 amount=-1 +kerning first=1069 second=1070 amount=-1 +kerning first=1059 second=1072 amount=-4 +kerning first=1059 second=1073 amount=-3 +kerning first=1039 second=1074 amount=-1 +kerning first=1059 second=1075 amount=-4 +kerning first=1059 second=1076 amount=-5 +kerning first=1059 second=1077 amount=-4 +kerning first=1059 second=1078 amount=-3 +kerning first=1059 second=1079 amount=-3 +kerning first=1059 second=1080 amount=-4 +kerning first=1077 second=1081 amount=-1 +kerning first=1113 second=1082 amount=-1 +kerning first=76 second=202 amount=-2 +kerning first=1059 second=1084 amount=-4 +kerning first=1059 second=1085 amount=-4 +kerning first=1059 second=1086 amount=-4 +kerning first=334 second=209 amount=-2 +kerning first=1055 second=1088 amount=-1 +kerning first=1119 second=1089 amount=-1 +kerning first=1047 second=1090 amount=-1 +kerning first=1069 second=1091 amount=-1 +kerning first=1059 second=1092 amount=-4 +kerning first=1059 second=1093 amount=-3 +kerning first=1105 second=1095 amount=-1 +kerning first=1059 second=1096 amount=-4 +kerning first=354 second=171 amount=-5 +kerning first=374 second=100 amount=-3 +kerning first=1055 second=1099 amount=-1 +kerning first=1113 second=1100 amount=-1 +kerning first=1027 second=1101 amount=-1 +kerning first=1027 second=1102 amount=-2 +kerning first=1057 second=1103 amount=-1 +kerning first=1059 second=1104 amount=-4 +kerning first=1061 second=1105 amount=-2 +kerning first=1059 second=1107 amount=-4 +kerning first=1039 second=1108 amount=-1 +kerning first=246 second=227 amount=-1 +kerning first=1059 second=1113 amount=-5 +kerning first=1059 second=1114 amount=-4 +kerning first=1059 second=1116 amount=-4 +kerning first=268 second=252 amount=-2 +kerning first=214 second=350 amount=-1 +kerning first=1057 second=1119 amount=-1 +kerning first=353 second=254 amount=-2 +kerning first=210 second=227 amount=-1 +kerning first=304 second=252 amount=-1 +kerning first=73 second=350 amount=-2 +kerning first=105 second=227 amount=-2 +kerning first=376 second=252 amount=-1 +kerning first=120 second=305 amount=-1 +kerning first=362 second=246 amount=-2 +kerning first=1057 second=1031 amount=-1 +kerning first=84 second=305 amount=-2 +kerning first=365 second=8217 amount=-3 +kerning first=354 second=227 amount=-5 +kerning first=374 second=44 amount=-5 +kerning first=225 second=305 amount=-1 +kerning first=1118 second=1076 amount=-3 +kerning first=196 second=252 amount=-3 +kerning first=286 second=350 amount=-2 +kerning first=66 second=207 amount=-4 +kerning first=315 second=206 amount=-2 +kerning first=282 second=227 amount=-1 +kerning first=232 second=252 amount=-2 +kerning first=8217 second=287 amount=-4 +kerning first=264 second=356 amount=-1 +kerning first=218 second=246 amount=-2 +kerning first=74 second=226 amount=-3 +kerning first=261 second=305 amount=-1 +kerning first=209 second=382 amount=-1 +kerning first=351 second=291 amount=-3 +kerning first=332 second=317 amount=-2 +kerning first=110 second=226 amount=-1 +kerning first=369 second=305 amount=-1 +kerning first=200 second=260 amount=-2 +kerning first=245 second=382 amount=-2 +kerning first=315 second=291 amount=-3 +kerning first=225 second=45 amount=-2 +kerning first=192 second=356 amount=-6 +kerning first=218 second=121 amount=-1 +kerning first=113 second=246 amount=-1 +kerning first=333 second=305 amount=-1 +kerning first=281 second=382 amount=-2 +kerning first=279 second=291 amount=-3 +kerning first=112 second=44 amount=-3 +kerning first=201 second=103 amount=-3 +kerning first=77 second=246 amount=-2 +kerning first=272 second=260 amount=-4 +kerning first=243 second=291 amount=-2 +kerning first=321 second=362 amount=-3 +kerning first=69 second=227 amount=-1 +kerning first=251 second=226 amount=-1 +kerning first=207 second=291 amount=-3 +kerning first=315 second=207 amount=-2 +kerning first=261 second=45 amount=-2 +kerning first=287 second=226 amount=-3 +kerning first=68 second=382 amount=-2 +kerning first=369 second=45 amount=-2 +kerning first=323 second=226 amount=-2 +kerning first=104 second=382 amount=-1 +kerning first=102 second=291 amount=-2 +kerning first=304 second=336 amount=-2 +kerning first=8220 second=195 amount=-8 +kerning first=193 second=232 amount=-1 +kerning first=366 second=109 amount=-2 +kerning first=376 second=336 amount=-3 +kerning first=368 second=365 amount=-1 +kerning first=200 second=115 amount=-1 +kerning first=117 second=109 amount=-1 +kerning first=236 second=115 amount=-2 +kerning first=283 second=187 amount=-2 +kerning first=377 second=212 amount=-1 +kerning first=381 second=103 amount=-3 +kerning first=214 second=90 amount=-2 +kerning first=345 second=103 amount=-2 +kerning first=1027 second=1103 amount=-4 +kerning first=344 second=115 amount=-2 +kerning first=232 second=104 amount=-2 +kerning first=380 second=115 amount=-2 +kerning first=230 second=44 amount=-3 +kerning first=350 second=303 amount=-3 +kerning first=380 second=232 amount=-1 +kerning first=197 second=8221 amount=-5 +kerning first=87 second=213 amount=-3 +kerning first=344 second=232 amount=-3 +kerning first=192 second=213 amount=-3 +kerning first=89 second=44 amount=-5 +kerning first=200 second=259 amount=-1 +kerning first=8217 second=259 amount=-6 +kerning first=236 second=232 amount=-1 +kerning first=264 second=213 amount=-3 +kerning first=369 second=277 amount=-1 +kerning first=268 second=104 amount=-1 +kerning first=378 second=8249 amount=-3 +kerning first=101 second=303 amount=-2 +kerning first=87 second=328 amount=-3 +kerning first=201 second=75 amount=-2 +kerning first=187 second=315 amount=-5 +kerning first=65 second=303 amount=-1 +kerning first=283 second=98 amount=-2 +kerning first=1056 second=1048 amount=-1 +kerning first=250 second=118 amount=-3 +kerning first=381 second=75 amount=-1 +kerning first=1043 second=1104 amount=-3 +kerning first=278 second=303 amount=-1 +kerning first=270 second=8249 amount=-1 +kerning first=264 second=328 amount=-1 +kerning first=66 second=235 amount=-1 +kerning first=314 second=303 amount=-1 +kerning first=268 second=280 amount=-3 +kerning first=228 second=328 amount=-1 +kerning first=206 second=303 amount=-1 +kerning first=346 second=337 amount=-1 +kerning first=286 second=118 amount=-1 +kerning first=370 second=120 amount=-2 +kerning first=242 second=303 amount=-1 +kerning first=106 second=98 amount=-1 +kerning first=73 second=118 amount=-2 +kerning first=275 second=283 amount=-1 +kerning first=193 second=89 amount=-6 +kerning first=1118 second=1104 amount=-2 +kerning first=1082 second=1104 amount=-2 +kerning first=1089 second=1107 amount=-1 +kerning first=109 second=118 amount=-3 +kerning first=1046 second=1104 amount=-2 +kerning first=210 second=370 amount=-1 +kerning first=290 second=218 amount=-1 +kerning first=1053 second=1107 amount=-1 +kerning first=8220 second=223 amount=-1 +kerning first=80 second=325 amount=-1 +kerning first=266 second=233 amount=-2 +kerning first=84 second=193 amount=-6 +kerning first=264 second=241 amount=-1 +kerning first=260 second=263 amount=-1 +kerning first=355 second=98 amount=-1 +kerning first=282 second=370 amount=-2 +kerning first=218 second=83 amount=-3 +kerning first=203 second=196 amount=-2 +kerning first=234 second=122 amount=-2 +kerning first=90 second=269 amount=-1 +kerning first=378 second=305 amount=-2 +kerning first=311 second=283 amount=-3 +kerning first=102 second=104 amount=3 +kerning first=354 second=370 amount=-1 +kerning first=1025 second=1042 amount=-1 +kerning first=76 second=314 amount=-2 +kerning first=87 second=241 amount=-3 +kerning first=347 second=311 amount=-1 +kerning first=171 second=87 amount=-3 +kerning first=213 second=362 amount=-1 +kerning first=289 second=246 amount=-2 +kerning first=68 second=370 amount=-1 +kerning first=73 second=266 amount=-2 +kerning first=275 second=311 amount=-2 +kerning first=83 second=317 amount=-3 +kerning first=325 second=286 amount=-2 +kerning first=112 second=314 amount=-2 +kerning first=350 second=331 amount=-1 +kerning first=87 second=269 amount=-3 +kerning first=217 second=286 amount=-1 +kerning first=253 second=314 amount=-2 +kerning first=203 second=311 amount=-1 +kerning first=219 second=8249 amount=-5 +kerning first=231 second=261 amount=-2 +kerning first=278 second=331 amount=-1 +kerning first=1046 second=1108 amount=-2 +kerning first=336 second=356 amount=-2 +kerning first=314 second=331 amount=-1 +kerning first=1093 second=1118 amount=-2 +kerning first=1057 second=1059 amount=-1 +kerning first=289 second=314 amount=-3 +kerning first=354 second=255 amount=-3 +kerning first=207 second=235 amount=-2 +kerning first=83 second=345 amount=-2 +kerning first=212 second=237 amount=-1 +kerning first=267 second=328 amount=-2 +kerning first=264 second=269 amount=-2 +kerning first=376 second=280 amount=-1 +kerning first=119 second=345 amount=-1 +kerning first=228 second=269 amount=-1 +kerning first=76 second=286 amount=-1 +kerning first=258 second=81 amount=-3 +kerning first=101 second=331 amount=-2 +kerning first=222 second=196 amount=-4 +kerning first=246 second=255 amount=-3 +kerning first=98 second=224 amount=-1 +kerning first=337 second=112 amount=-1 +kerning first=330 second=81 amount=-2 +kerning first=1100 second=1090 amount=-1 +kerning first=1086 second=1087 amount=-1 +kerning first=1064 second=1090 amount=-1 +kerning first=203 second=224 amount=-1 +kerning first=105 second=255 amount=-3 +kerning first=311 second=224 amount=-2 +kerning first=366 second=81 amount=-1 +kerning first=368 second=345 amount=-1 +kerning first=275 second=224 amount=-2 +kerning first=193 second=112 amount=-3 +kerning first=281 second=326 amount=-2 +kerning first=66 second=378 amount=-4 +kerning first=1058 second=1078 amount=-3 +kerning first=90 second=205 amount=-1 +kerning first=317 second=326 amount=-1 +kerning first=256 second=250 amount=-3 +kerning first=243 second=347 amount=-2 +kerning first=347 second=224 amount=-1 +kerning first=353 second=326 amount=-2 +kerning first=207 second=347 amount=-2 +kerning first=98 second=255 amount=-3 +kerning first=8218 second=303 amount=-1 +kerning first=228 second=257 amount=-1 +kerning first=328 second=250 amount=-1 +kerning first=102 second=378 amount=-1 +kerning first=220 second=281 amount=-2 +kerning first=84 second=101 amount=-3 +kerning first=104 second=326 amount=-1 +kerning first=115 second=250 amount=-1 +kerning first=102 second=347 amount=-2 +kerning first=120 second=101 amount=-2 +kerning first=1069 second=1033 amount=-3 +kerning first=298 second=352 amount=-2 +kerning first=66 second=347 amount=-3 +kerning first=76 second=344 amount=-2 +kerning first=378 second=371 amount=-2 +kerning first=220 second=250 amount=-1 +kerning first=264 second=71 amount=-3 +kerning first=225 second=101 amount=-1 +kerning first=245 second=326 amount=-1 +kerning first=107 second=231 amount=-3 +kerning first=261 second=101 amount=-1 +kerning first=229 second=257 amount=-1 +kerning first=218 second=333 amount=-2 +kerning first=1119 second=1092 amount=-1 +kerning first=307 second=328 amount=-2 +kerning first=121 second=237 amount=-2 +kerning first=351 second=378 amount=-2 +kerning first=282 second=76 amount=-2 +kerning first=105 second=283 amount=-1 +kerning first=283 second=114 amount=-1 +kerning first=268 second=366 amount=-2 +kerning first=347 second=8220 amount=-2 +kerning first=369 second=101 amount=-1 +kerning first=1058 second=1047 amount=-1 +kerning first=235 second=328 amount=-2 +kerning first=311 second=8220 amount=-2 +kerning first=1030 second=1097 amount=-1 +kerning first=199 second=328 amount=-1 +kerning first=243 second=378 amount=-2 +kerning first=275 second=8220 amount=-2 +kerning first=290 second=302 amount=-1 +kerning first=351 second=345 amount=-1 +kerning first=88 second=257 amount=-1 +kerning first=207 second=378 amount=-1 +kerning first=1039 second=1073 amount=-1 +kerning first=85 second=352 amount=-3 +kerning first=113 second=333 amount=-1 +kerning first=379 second=328 amount=-1 +kerning first=77 second=333 amount=-2 +kerning first=1083 second=1092 amount=-1 +kerning first=1093 second=1090 amount=-1 +kerning first=8220 second=114 amount=-1 +kerning first=204 second=243 amount=-2 +kerning first=272 second=87 amount=-2 +kerning first=316 second=120 amount=-1 +kerning first=97 second=353 amount=-1 +kerning first=200 second=87 amount=-1 +kerning first=74 second=198 amount=-5 +kerning first=362 second=333 amount=-2 +kerning first=87 second=68 amount=-1 +kerning first=325 second=113 amount=-2 +kerning first=112 second=345 amount=-1 +kerning first=289 second=113 amount=-2 +kerning first=193 second=288 amount=-3 +kerning first=45 second=194 amount=-4 +kerning first=253 second=113 amount=-3 +kerning first=99 second=243 amount=-1 +kerning first=217 second=345 amount=-1 +kerning first=217 second=113 amount=-2 +kerning first=85 second=120 amount=-2 +kerning first=1030 second=1094 amount=-1 +kerning first=253 second=345 amount=-1 +kerning first=1039 second=1119 amount=-1 +kerning first=121 second=120 amount=-1 +kerning first=225 second=110 amount=-1 +kerning first=289 second=345 amount=-1 +kerning first=198 second=368 amount=-2 +kerning first=226 second=120 amount=-1 +kerning first=331 second=45 amount=-3 +kerning first=82 second=217 amount=-3 +kerning first=256 second=281 amount=-1 +kerning first=347 second=255 amount=-3 +kerning first=268 second=113 amount=-2 +kerning first=311 second=255 amount=-1 +kerning first=1059 second=1090 amount=-3 +kerning first=356 second=262 amount=-3 +kerning first=209 second=214 amount=-2 +kerning first=1102 second=1094 amount=-1 +kerning first=275 second=255 amount=-2 +kerning first=1074 second=1113 amount=-1 +kerning first=73 second=210 amount=-2 +kerning first=1079 second=1095 amount=-1 +kerning first=364 second=281 amount=-2 +kerning first=101 second=99 amount=-1 +kerning first=68 second=354 amount=-2 +kerning first=88 second=229 amount=-1 +kerning first=269 second=347 amount=-2 +kerning first=381 second=44 amount=-1 +kerning first=347 second=227 amount=-1 +kerning first=1024 second=1054 amount=-1 +kerning first=370 second=324 amount=-2 +kerning first=290 second=274 amount=-1 +kerning first=1039 second=1101 amount=-1 +kerning first=206 second=99 amount=-2 +kerning first=317 second=323 amount=-2 +kerning first=311 second=227 amount=-2 +kerning first=275 second=227 amount=-2 +kerning first=107 second=234 amount=-3 +kerning first=262 second=324 amount=-1 +kerning first=1049 second=1099 amount=-1 +kerning first=226 second=324 amount=-1 +kerning first=345 second=44 amount=-4 +kerning first=350 second=99 amount=-1 +kerning first=317 second=354 amount=-3 +kerning first=314 second=99 amount=-1 +kerning first=229 second=229 amount=-1 +kerning first=90 second=233 amount=-1 +kerning first=113 second=120 amount=-1 +kerning first=231 second=233 amount=-1 +kerning first=356 second=234 amount=-3 +kerning first=195 second=233 amount=-1 +kerning first=110 second=106 amount=-2 +kerning first=281 second=267 amount=-1 +kerning first=337 second=229 amount=-1 +kerning first=303 second=233 amount=-3 +kerning first=267 second=233 amount=-1 +kerning first=381 second=279 amount=-1 +kerning first=375 second=233 amount=-3 +kerning first=251 second=106 amount=-2 +kerning first=79 second=382 amount=-2 +kerning first=203 second=227 amount=-1 +kerning first=104 second=380 amount=-1 +kerning first=283 second=291 amount=-3 +kerning first=339 second=233 amount=-1 +kerning first=98 second=227 amount=-1 +kerning first=344 second=87 amount=-3 +kerning first=76 second=110 amount=-1 +kerning first=326 second=361 amount=-1 +kerning first=1047 second=1064 amount=-2 +kerning first=71 second=45 amount=-3 +kerning first=68 second=66 amount=-2 +kerning first=302 second=243 amount=-2 +kerning first=88 second=316 amount=-1 +kerning first=112 second=110 amount=-1 +kerning first=290 second=361 amount=-1 +kerning first=378 second=111 amount=-1 +kerning first=193 second=316 amount=-2 +kerning first=217 second=110 amount=-2 +kerning first=1074 second=1085 amount=-1 +kerning first=362 second=361 amount=-1 +kerning first=229 second=316 amount=-1 +kerning first=195 second=264 amount=-3 +kerning first=204 second=212 amount=-2 +kerning first=209 second=267 amount=-2 +kerning first=87 second=65 amount=-6 +kerning first=99 second=271 amount=-1 +kerning first=196 second=364 amount=-3 +kerning first=289 second=110 amount=-1 +kerning first=90 second=264 amount=-1 +kerning first=234 second=111 amount=-1 +kerning first=337 second=316 amount=-2 +kerning first=337 second=257 amount=-1 +kerning first=333 second=104 amount=-1 +kerning first=264 second=65 amount=-3 +kerning first=1065 second=1098 amount=-1 +kerning first=262 second=89 amount=-1 +kerning first=1038 second=1057 amount=-3 +kerning first=261 second=104 amount=-1 +kerning first=77 second=361 amount=-2 +kerning first=330 second=336 amount=-2 +kerning first=336 second=65 amount=-4 +kerning first=317 second=66 amount=-2 +kerning first=268 second=364 amount=-2 +kerning first=76 second=82 amount=-2 +kerning first=225 second=104 amount=-1 +kerning first=334 second=89 amount=-2 +kerning first=254 second=361 amount=-1 +kerning first=369 second=104 amount=-2 +kerning first=1116 second=1090 amount=-1 +kerning first=218 second=361 amount=-1 +kerning first=376 second=364 amount=-1 +kerning first=259 second=97 amount=-1 +kerning first=317 second=122 amount=-3 +kerning first=295 second=97 amount=-1 +kerning first=370 second=117 amount=-1 +kerning first=201 second=72 amount=-2 +kerning first=281 second=122 amount=-2 +kerning first=328 second=46 amount=-1 +kerning first=187 second=97 amount=-1 +kerning first=69 second=370 amount=-2 +kerning first=242 second=102 amount=-1 +kerning first=1063 second=1102 amount=-1 +kerning first=245 second=122 amount=-2 +kerning first=364 second=46 amount=-5 +kerning first=223 second=97 amount=-1 +kerning first=278 second=102 amount=-2 +kerning first=209 second=122 amount=-1 +kerning first=85 second=377 amount=-1 +kerning first=206 second=71 amount=-2 +kerning first=364 second=225 amount=-3 +kerning first=381 second=72 amount=-1 +kerning first=84 second=76 amount=-1 +kerning first=339 second=116 amount=-1 +kerning first=250 second=121 amount=-3 +kerning first=87 second=227 amount=-5 +kerning first=303 second=116 amount=-1 +kerning first=331 second=97 amount=-1 +kerning first=278 second=71 amount=-1 +kerning first=65 second=102 amount=-1 +kerning first=220 second=46 amount=-5 +kerning first=367 second=97 amount=-1 +kerning first=101 second=102 amount=-2 +kerning first=353 second=122 amount=-2 +kerning first=375 second=116 amount=-1 +kerning first=109 second=121 amount=-2 +kerning first=262 second=377 amount=-2 +kerning first=85 second=117 amount=-1 +kerning first=350 second=219 amount=-3 +kerning first=259 second=245 amount=-1 +kerning first=1058 second=1103 amount=-4 +kerning first=121 second=117 amount=-1 +kerning first=79 second=46 amount=-3 +kerning first=278 second=219 amount=-2 +kerning first=314 second=102 amount=-1 +kerning first=262 second=117 amount=-2 +kerning first=201 second=332 amount=-1 +kerning first=350 second=102 amount=-3 +kerning first=226 second=117 amount=-1 +kerning first=104 second=122 amount=-1 +kerning first=334 second=377 amount=-2 +kerning first=104 second=8217 amount=-4 +kerning first=107 second=287 amount=-2 +kerning first=68 second=122 amount=-2 +kerning first=71 second=287 amount=-3 +kerning first=367 second=245 amount=-1 +kerning first=198 second=200 amount=-2 +kerning first=352 second=364 amount=-3 +kerning first=381 second=332 amount=-1 +kerning first=212 second=287 amount=-1 +kerning first=1077 second=1114 amount=-1 +kerning first=204 second=240 amount=-2 +kerning first=356 second=259 amount=-5 +kerning first=82 second=242 amount=-3 +kerning first=284 second=287 amount=-3 +kerning first=248 second=287 amount=-2 +kerning first=278 second=249 amount=-2 +kerning first=99 second=240 amount=-1 +kerning first=1055 second=1114 amount=-1 +kerning first=356 second=287 amount=-4 +kerning first=108 second=8221 amount=-3 +kerning first=1074 second=1088 amount=-1 +kerning first=201 second=220 amount=-2 +kerning first=118 second=242 amount=-3 +kerning first=212 second=259 amount=-1 +kerning first=259 second=242 amount=-1 +kerning first=381 second=304 amount=-1 +kerning first=68 second=298 amount=-2 +kerning first=198 second=284 amount=-1 +kerning first=82 second=214 amount=-3 +kerning first=284 second=259 amount=-1 +kerning first=261 second=8220 amount=-3 +kerning first=305 second=8221 amount=-2 +kerning first=251 second=369 amount=-1 +kerning first=85 second=324 amount=-2 +kerning first=195 second=116 amount=-1 +kerning first=250 second=380 amount=-2 +kerning first=351 second=375 amount=-3 +kerning first=116 second=8249 amount=-1 +kerning first=315 second=375 amount=-3 +kerning first=323 second=369 amount=-2 +kerning first=267 second=116 amount=-1 +kerning first=198 second=197 amount=-2 +kerning first=377 second=377 amount=-1 +kerning first=364 second=194 amount=-4 +kerning first=65 second=71 amount=-3 +kerning first=279 second=375 amount=-2 +kerning first=287 second=369 amount=-1 +kerning first=121 second=324 amount=-2 +kerning first=231 second=116 amount=-1 +kerning first=82 second=97 amount=-2 +kerning first=104 second=119 amount=-3 +kerning first=217 second=45 amount=-5 +kerning first=118 second=97 amount=-3 +kerning first=256 second=350 amount=-3 +kerning first=201 second=304 amount=-2 +kerning first=209 second=119 amount=-2 +kerning first=90 second=116 amount=-1 +kerning first=220 second=194 amount=-4 +kerning first=245 second=119 amount=-2 +kerning first=110 second=369 amount=-1 +kerning first=290 second=330 amount=-1 +kerning first=281 second=119 amount=-2 +kerning first=381 second=248 amount=-1 +kerning first=79 second=74 amount=-2 +kerning first=234 second=228 amount=-2 +kerning first=1027 second=1105 amount=-3 +kerning first=328 second=253 amount=-2 +kerning first=317 second=119 amount=-3 +kerning first=284 second=203 amount=-1 +kerning first=192 second=232 amount=-1 +kerning first=198 second=228 amount=-1 +kerning first=364 second=253 amount=-1 +kerning first=367 second=273 amount=-1 +kerning first=220 second=74 amount=-3 +kerning first=243 second=375 amount=-3 +kerning first=1077 second=1080 amount=-1 +kerning first=259 second=273 amount=-1 +kerning first=287 second=223 amount=-1 +kerning first=251 second=223 amount=-1 +kerning first=1099 second=1105 amount=-1 +kerning first=102 second=375 amount=-1 +kerning first=364 second=74 amount=-3 +kerning first=240 second=355 amount=-1 +kerning first=118 second=273 amount=-3 +kerning first=264 second=68 amount=-3 +kerning first=268 second=328 amount=-1 +kerning first=204 second=268 amount=-2 +kerning first=259 second=244 amount=-1 +kerning first=221 second=196 amount=-6 +kerning first=99 second=355 amount=-1 +kerning first=198 second=80 amount=-2 +kerning first=115 second=253 amount=-3 +kerning first=317 second=298 amount=-2 +kerning first=220 second=253 amount=-1 +kerning first=336 second=68 amount=-2 +kerning first=256 second=253 amount=-3 +kerning first=356 second=203 amount=-1 +kerning first=201 second=363 amount=-2 +kerning first=68 second=270 amount=-2 +kerning first=381 second=335 amount=-1 +kerning first=98 second=8217 amount=-2 +kerning first=234 second=108 amount=-3 +kerning first=274 second=298 amount=-2 +kerning first=74 second=338 amount=-2 +kerning first=208 second=381 amount=-2 +kerning first=356 second=290 amount=-3 +kerning first=364 second=105 amount=-2 +kerning first=381 second=363 amount=-3 +kerning first=118 second=245 amount=-3 +kerning first=335 second=249 amount=-1 +kerning first=378 second=108 amount=-2 +kerning first=248 second=318 amount=-2 +kerning first=82 second=245 amount=-3 +kerning first=284 second=318 amount=-1 +kerning first=328 second=105 amount=-1 +kerning first=76 second=85 amount=-3 +kerning first=262 second=380 amount=-2 +kerning first=256 second=105 amount=-1 +kerning first=356 second=231 amount=-3 +kerning first=8218 second=362 amount=-3 +kerning first=290 second=318 amount=-1 +kerning first=298 second=380 amount=-1 +kerning first=115 second=105 amount=-2 +kerning first=1038 second=1060 amount=-3 +kerning first=334 second=380 amount=-2 +kerning first=1091 second=1083 amount=-3 +kerning first=108 second=331 amount=-1 +kerning first=328 second=225 amount=-1 +kerning first=307 second=8217 amount=-2 +kerning first=370 second=380 amount=-3 +kerning first=111 second=316 amount=-2 +kerning first=85 second=380 amount=-3 +kerning first=323 second=338 amount=-2 +kerning first=378 second=228 amount=-1 +kerning first=79 second=105 amount=-1 +kerning first=275 second=8217 amount=-2 +kerning first=79 second=225 amount=-1 +kerning first=98 second=119 amount=-2 +kerning first=121 second=380 amount=-3 +kerning first=317 second=270 amount=-2 +kerning first=115 second=225 amount=-1 +kerning first=198 second=108 amount=-1 +kerning first=347 second=8217 amount=-2 +kerning first=313 second=350 amount=-1 +kerning first=226 second=380 amount=-1 +kerning first=330 second=351 amount=-2 +kerning first=234 second=225 amount=-2 +kerning first=201 second=221 amount=-1 +kerning first=110 second=251 amount=-1 +kerning first=371 second=228 amount=-2 +kerning first=8217 second=262 amount=-2 +kerning first=251 second=251 amount=-1 +kerning first=335 second=228 amount=-1 +kerning first=376 second=282 amount=-1 +kerning first=1051 second=1100 amount=-1 +kerning first=108 second=303 amount=-1 +kerning first=240 second=98 amount=-1 +kerning first=323 second=251 amount=-2 +kerning first=263 second=228 amount=-2 +kerning first=236 second=235 amount=-1 +kerning first=1114 second=1093 amount=-2 +kerning first=287 second=251 amount=-1 +kerning first=227 second=228 amount=-1 +kerning first=278 second=192 amount=-2 +kerning first=1042 second=1093 amount=-3 +kerning first=72 second=303 amount=-1 +kerning first=122 second=228 amount=-1 +kerning first=198 second=225 amount=-1 +kerning first=278 second=46 amount=-1 +kerning first=252 second=273 amount=-1 +kerning first=220 second=102 amount=-1 +kerning first=262 second=206 amount=-3 +kerning first=256 second=102 amount=-1 +kerning first=350 second=46 amount=-4 +kerning first=8216 second=87 amount=-1 +kerning first=214 second=325 amount=-2 +kerning first=334 second=206 amount=-2 +kerning first=109 second=365 amount=-1 +kerning first=328 second=102 amount=-1 +kerning first=101 second=46 amount=-3 +kerning first=71 second=83 amount=-2 +kerning first=45 second=310 amount=-5 +kerning first=378 second=225 amount=-1 +kerning first=286 second=325 amount=-1 +kerning first=84 second=280 amount=-1 +kerning first=206 second=46 amount=-1 +kerning first=277 second=287 amount=-3 +kerning first=115 second=102 amount=-2 +kerning first=212 second=83 amount=-1 +kerning first=106 second=355 amount=-1 +kerning first=315 second=266 amount=-1 +kerning first=338 second=363 amount=-2 +kerning first=258 second=112 amount=-3 +kerning first=290 second=46 amount=-3 +kerning first=284 second=83 amount=-2 +kerning first=374 second=363 amount=-2 +kerning first=222 second=112 amount=-1 +kerning first=241 second=318 amount=-1 +kerning first=280 second=378 amount=-2 +kerning first=79 second=362 amount=-1 +kerning first=277 second=318 amount=-3 +kerning first=356 second=83 amount=-3 +kerning first=117 second=112 amount=-2 +kerning first=313 second=318 amount=-2 +kerning first=250 second=289 amount=-3 +kerning first=81 second=112 amount=-1 +kerning first=317 second=214 amount=-1 +kerning first=207 second=266 amount=-2 +kerning first=45 second=112 amount=-2 +kerning first=377 second=210 amount=-1 +kerning first=66 second=266 amount=-3 +kerning first=268 second=311 amount=-1 +kerning first=344 second=235 amount=-3 +kerning first=378 second=259 amount=-1 +kerning first=321 second=105 amount=-2 +kerning first=380 second=235 amount=-1 +kerning first=1025 second=1084 amount=-1 +kerning first=88 second=81 amount=-3 +kerning first=249 second=105 amount=-2 +kerning first=99 second=98 amount=-2 +kerning first=378 second=248 amount=-1 +kerning first=234 second=259 amount=-2 +kerning first=198 second=259 amount=-1 +kerning first=213 second=105 amount=-1 +kerning first=366 second=112 amount=-2 +kerning first=197 second=67 amount=-3 +kerning first=1037 second=1081 amount=-1 +kerning first=72 second=105 amount=-1 +kerning first=330 second=112 amount=-1 +kerning first=108 second=105 amount=-1 +kerning first=282 second=230 amount=-1 +kerning first=1064 second=1079 amount=-1 +kerning first=66 second=204 amount=-4 +kerning first=259 second=100 amount=-1 +kerning first=67 second=282 amount=-3 +kerning first=304 second=249 amount=-1 +kerning first=90 second=379 amount=-1 +kerning first=1118 second=1079 amount=-1 +kerning first=219 second=346 amount=-3 +kerning first=210 second=230 amount=-1 +kerning first=377 second=327 amount=-1 +kerning first=1064 second=1075 amount=-1 +kerning first=232 second=249 amount=-2 +kerning first=246 second=230 amount=-1 +kerning first=1046 second=1079 amount=-1 +kerning first=1104 second=1098 amount=-1 +kerning first=268 second=249 amount=-2 +kerning first=307 second=275 amount=-1 +kerning first=105 second=230 amount=-2 +kerning first=65 second=334 amount=-3 +kerning first=82 second=100 amount=-3 +kerning first=1061 second=1095 amount=-3 +kerning first=118 second=100 amount=-3 +kerning first=1025 second=1095 amount=-2 +kerning first=235 second=275 amount=-1 +kerning first=315 second=204 amount=-2 +kerning first=376 second=249 amount=-1 +kerning first=327 second=346 amount=-2 +kerning first=69 second=230 amount=-1 +kerning first=196 second=107 amount=-2 +kerning first=381 second=256 amount=-1 +kerning first=354 second=339 amount=-3 +kerning first=217 second=8249 amount=-5 +kerning first=381 second=223 amount=-1 +kerning first=232 second=305 amount=-2 +kerning first=268 second=107 amount=-1 +kerning first=196 second=305 amount=-1 +kerning first=232 second=107 amount=-2 +kerning first=84 second=333 amount=-3 +kerning first=304 second=305 amount=-1 +kerning first=66 second=260 amount=-5 +kerning first=298 second=268 amount=-2 +kerning first=8218 second=250 amount=-1 +kerning first=268 second=305 amount=-1 +kerning first=354 second=230 amount=-5 +kerning first=313 second=256 amount=-2 +kerning first=376 second=305 amount=-2 +kerning first=75 second=211 amount=-3 +kerning first=257 second=316 amount=-1 +kerning first=201 second=223 amount=-1 +kerning first=370 second=268 amount=-1 +kerning first=1025 second=1039 amount=-1 +kerning first=369 second=8217 amount=-3 +kerning first=192 second=244 amount=-1 +kerning first=374 second=192 amount=-6 +kerning first=228 second=244 amount=-1 +kerning first=338 second=192 amount=-2 +kerning first=250 second=263 amount=-1 +kerning first=108 second=365 amount=-2 +kerning first=1086 second=1084 amount=-1 +kerning first=1098 second=1117 amount=-1 +kerning first=262 second=268 amount=-3 +kerning first=71 second=315 amount=-1 +kerning first=264 second=244 amount=-2 +kerning first=72 second=365 amount=-2 +kerning first=315 second=260 amount=-2 +kerning first=8220 second=226 amount=-3 +kerning first=266 second=192 amount=-3 +kerning first=363 second=237 amount=-2 +kerning first=84 second=218 amount=-1 +kerning first=327 second=237 amount=-1 +kerning first=203 second=199 amount=-1 +kerning first=261 second=8217 amount=-3 +kerning first=73 second=263 amount=-2 +kerning first=291 second=237 amount=-2 +kerning first=255 second=237 amount=-2 +kerning first=333 second=8217 amount=-2 +kerning first=89 second=192 amount=-6 +kerning first=228 second=353 amount=-1 +kerning first=219 second=237 amount=-2 +kerning first=214 second=366 amount=-1 +kerning first=73 second=121 amount=-2 +kerning first=199 second=275 amount=-2 +kerning first=264 second=353 amount=-2 +kerning first=206 second=334 amount=-2 +kerning first=375 second=101 amount=-3 +kerning first=284 second=315 amount=-1 +kerning first=112 second=289 amount=-2 +kerning first=278 second=334 amount=-1 +kerning first=78 second=237 amount=-1 +kerning first=280 second=282 amount=-2 +kerning first=356 second=315 amount=-1 +kerning first=1057 second=1034 amount=-1 +kerning first=217 second=289 amount=-4 +kerning first=78 second=346 amount=-2 +kerning first=87 second=353 amount=-3 +kerning first=8250 second=354 amount=-4 +kerning first=208 second=282 amount=-2 +kerning first=87 second=244 amount=-3 +kerning first=220 second=268 amount=-1 +kerning first=1060 second=1051 amount=-3 +kerning first=88 second=232 amount=-2 +kerning first=104 second=351 amount=-1 +kerning first=72 second=99 amount=-2 +kerning first=248 second=371 amount=-1 +kerning first=74 second=257 amount=-3 +kerning first=229 second=232 amount=-1 +kerning first=1025 second=1065 amount=-1 +kerning first=362 second=277 amount=-2 +kerning first=110 second=257 amount=-1 +kerning first=279 second=249 amount=-2 +kerning first=1103 second=1089 amount=-1 +kerning first=371 second=8249 amount=-2 +kerning first=113 second=277 amount=-1 +kerning first=108 second=99 amount=-1 +kerning first=214 second=381 amount=-2 +kerning first=71 second=8249 amount=-3 +kerning first=70 second=361 amount=-1 +kerning first=337 second=347 amount=-2 +kerning first=332 second=202 amount=-2 +kerning first=218 second=277 amount=-2 +kerning first=107 second=371 amount=-1 +kerning first=286 second=381 amount=-2 +kerning first=84 second=336 amount=-3 +kerning first=353 second=351 amount=-3 +kerning first=252 second=267 amount=-1 +kerning first=288 second=69 amount=-1 +kerning first=376 second=367 amount=-2 +kerning first=317 second=351 amount=-1 +kerning first=370 second=212 amount=-1 +kerning first=77 second=277 amount=-2 +kerning first=69 second=79 amount=-1 +kerning first=262 second=212 amount=-3 +kerning first=216 second=69 amount=-2 +kerning first=304 second=367 amount=-2 +kerning first=1118 second=1113 amount=-3 +kerning first=1049 second=1096 amount=-1 +kerning first=1101 second=1081 amount=-1 +kerning first=209 second=351 amount=-2 +kerning first=323 second=257 amount=-2 +kerning first=232 second=367 amount=-2 +kerning first=354 second=79 amount=-3 +kerning first=268 second=367 amount=-2 +kerning first=281 second=351 amount=-2 +kerning first=85 second=212 amount=-1 +kerning first=251 second=257 amount=-1 +kerning first=1037 second=1100 amount=-1 +kerning first=277 second=114 amount=-1 +kerning first=245 second=351 amount=-2 +kerning first=282 second=79 amount=-1 +kerning first=287 second=257 amount=-3 +kerning first=196 second=367 amount=-3 +kerning first=236 second=291 amount=-3 +kerning first=122 second=337 amount=-1 +kerning first=258 second=316 amount=-2 +kerning first=267 second=261 amount=-2 +kerning first=200 second=291 amount=-3 +kerning first=86 second=337 amount=-3 +kerning first=261 second=229 amount=-1 +kerning first=303 second=261 amount=-2 +kerning first=206 second=216 amount=-2 +kerning first=8250 second=298 amount=-5 +kerning first=375 second=261 amount=-3 +kerning first=119 second=314 amount=-2 +kerning first=75 second=267 amount=-2 +kerning first=67 second=226 amount=-2 +kerning first=233 second=271 amount=-1 +kerning first=90 second=261 amount=-1 +kerning first=216 second=382 amount=-2 +kerning first=263 second=337 amount=-1 +kerning first=83 second=314 amount=-2 +kerning first=103 second=226 amount=-3 +kerning first=269 second=271 amount=-1 +kerning first=252 second=382 amount=-2 +kerning first=227 second=337 amount=-1 +kerning first=224 second=314 amount=-1 +kerning first=1045 second=1057 amount=-1 +kerning first=378 second=281 amount=-1 +kerning first=288 second=382 amount=-1 +kerning first=1053 second=1104 amount=-1 +kerning first=65 second=216 amount=-3 +kerning first=208 second=226 amount=-1 +kerning first=324 second=382 amount=-1 +kerning first=295 second=326 amount=-1 +kerning first=253 second=171 amount=-4 +kerning first=260 second=314 amount=-2 +kerning first=106 second=361 amount=-1 +kerning first=331 second=326 amount=-1 +kerning first=229 second=347 amount=-1 +kerning first=289 second=171 amount=-3 +kerning first=371 second=337 amount=-3 +kerning first=1067 second=1082 amount=-1 +kerning first=367 second=326 amount=-1 +kerning first=1088 second=1116 amount=-1 +kerning first=193 second=347 amount=-2 +kerning first=234 second=281 amount=-1 +kerning first=325 second=171 amount=-4 +kerning first=45 second=316 amount=-1 +kerning first=1052 second=1116 amount=-1 +kerning first=361 second=171 amount=-2 +kerning first=106 second=255 amount=-3 +kerning first=88 second=288 amount=-3 +kerning first=278 second=216 amount=-1 +kerning first=69 second=224 amount=-1 +kerning first=118 second=326 amount=-2 +kerning first=76 second=171 amount=-1 +kerning first=83 second=202 amount=-3 +kerning first=283 second=361 amount=-2 +kerning first=117 second=316 amount=-2 +kerning first=187 second=326 amount=-2 +kerning first=235 second=269 amount=-1 +kerning first=1042 second=1037 amount=-2 +kerning first=241 second=8221 amount=-4 +kerning first=223 second=326 amount=-1 +kerning first=105 second=224 amount=-2 +kerning first=355 second=361 amount=-1 +kerning first=259 second=326 amount=-1 +kerning first=307 second=269 amount=-1 +kerning first=217 second=171 amount=-5 +kerning first=304 second=45 amount=-4 +kerning first=246 second=224 amount=-1 +kerning first=268 second=45 amount=-4 +kerning first=8220 second=279 amount=-3 +kerning first=210 second=224 amount=-1 +kerning first=379 second=269 amount=-1 +kerning first=89 second=103 amount=-4 +kerning first=98 second=115 amount=-2 +kerning first=229 second=371 amount=-1 +kerning first=67 second=78 amount=-3 +kerning first=275 second=252 amount=-2 +kerning first=282 second=224 amount=-1 +kerning first=1108 second=1082 amount=-1 +kerning first=253 second=227 amount=-3 +kerning first=354 second=224 amount=-4 +kerning first=217 second=227 amount=-3 +kerning first=317 second=206 amount=-2 +kerning first=98 second=252 amount=-1 +kerning first=222 second=201 amount=-2 +kerning first=112 second=227 amount=-1 +kerning first=286 second=207 amount=-1 +kerning first=244 second=226 amount=-1 +kerning first=232 second=101 amount=-1 +kerning first=280 second=226 amount=-1 +kerning first=283 second=246 amount=-1 +kerning first=268 second=101 amount=-2 +kerning first=81 second=201 amount=-2 +kerning first=1025 second=1101 amount=-1 +kerning first=316 second=226 amount=-2 +kerning first=374 second=103 amount=-4 +kerning first=114 second=44 amount=-4 +kerning first=304 second=101 amount=-2 +kerning first=45 second=201 amount=-5 +kerning first=1061 second=1101 amount=-1 +kerning first=221 second=90 amount=-3 +kerning first=338 second=103 amount=-3 +kerning first=110 second=316 amount=-1 +kerning first=311 second=252 amount=-1 +kerning first=302 second=103 amount=-3 +kerning first=344 second=291 amount=-3 +kerning first=347 second=252 amount=-1 +kerning first=376 second=101 amount=-3 +kerning first=266 second=103 amount=-3 +kerning first=106 second=246 amount=-1 +kerning first=214 second=207 amount=-2 +kerning first=90 second=317 amount=-1 +kerning first=256 second=362 amount=-3 +kerning first=230 second=103 amount=-3 +kerning first=1116 second=1105 amount=-2 +kerning first=196 second=45 amount=-4 +kerning first=80 second=356 amount=-1 +kerning first=194 second=103 amount=-3 +kerning first=82 second=44 amount=-2 +kerning first=199 second=213 amount=-3 +kerning first=200 second=84 amount=-1 +kerning first=347 second=104 amount=-1 +kerning first=1047 second=1067 amount=-2 +kerning first=212 second=89 amount=-2 +kerning first=368 second=74 amount=-3 +kerning first=118 second=44 amount=-5 +kerning first=354 second=283 amount=-3 +kerning first=284 second=89 amount=-3 +kerning first=228 second=367 amount=-1 +kerning first=287 second=109 amount=-1 +kerning first=71 second=89 amount=-3 +kerning first=344 second=84 amount=-3 +kerning first=362 second=338 amount=-1 +kerning first=66 second=115 amount=-3 +kerning first=8217 second=111 amount=-3 +kerning first=344 second=356 amount=-3 +kerning first=268 second=193 amount=-3 +kerning first=203 second=370 amount=-2 +kerning first=272 second=84 amount=-2 +kerning first=379 second=213 amount=-1 +kerning first=207 second=115 amount=-2 +kerning first=110 second=109 amount=-1 +kerning first=321 second=303 amount=-2 +kerning first=243 second=115 amount=-2 +kerning first=240 second=187 amount=-2 +kerning first=74 second=109 amount=-1 +kerning first=352 second=78 amount=-3 +kerning first=213 second=303 amount=-1 +kerning first=102 second=115 amount=-2 +kerning first=122 second=8249 amount=-3 +kerning first=325 second=227 amount=-2 +kerning first=249 second=303 amount=-2 +kerning first=1045 second=1113 amount=-1 +kerning first=289 second=227 amount=-3 +kerning first=280 second=78 amount=-2 +kerning first=351 second=115 amount=-3 +kerning first=259 second=44 amount=-1 +kerning first=256 second=346 amount=-3 +kerning first=223 second=44 amount=-3 +kerning first=8216 second=240 amount=-3 +kerning first=86 second=8249 amount=-5 +kerning first=208 second=78 amount=-2 +kerning first=279 second=115 amount=-2 +kerning first=331 second=44 amount=-1 +kerning first=315 second=115 amount=-1 +kerning first=295 second=44 amount=-1 +kerning first=67 second=75 amount=-3 +kerning first=69 second=374 amount=-1 +kerning first=313 second=368 amount=-3 +kerning first=305 second=120 amount=-1 +kerning first=201 second=78 amount=-2 +kerning first=279 second=378 amount=-2 +kerning first=313 second=203 amount=-2 +kerning first=234 second=46 amount=-3 +kerning first=379 second=68 amount=-1 +kerning first=73 second=375 amount=-2 +kerning first=374 second=248 amount=-3 +kerning first=1069 second=1064 amount=-1 +kerning first=367 second=361 amount=-1 +kerning first=351 second=118 amount=-3 +kerning first=208 second=75 amount=-2 +kerning first=216 second=323 amount=-2 +kerning first=8218 second=105 amount=-1 +kerning first=218 second=8249 amount=-5 +kerning first=8222 second=230 amount=-2 +kerning first=366 second=198 amount=-4 +kerning first=302 second=248 amount=-2 +kerning first=233 second=120 amount=-2 +kerning first=86 second=278 amount=-1 +kerning first=288 second=323 amount=-1 +kerning first=269 second=120 amount=-2 +kerning first=210 second=85 amount=-1 +kerning first=108 second=253 amount=-3 +kerning first=243 second=118 amount=-2 +kerning first=1031 second=1085 amount=-1 +kerning first=296 second=113 amount=-2 +kerning first=207 second=118 amount=-2 +kerning first=346 second=298 amount=-3 +kerning first=352 second=75 amount=-3 +kerning first=376 second=196 amount=-6 +kerning first=8220 second=257 amount=-3 +kerning first=315 second=118 amount=-3 +kerning first=224 second=113 amount=-1 +kerning first=249 second=253 amount=-3 +kerning first=279 second=118 amount=-2 +kerning first=280 second=75 amount=-2 +kerning first=97 second=233 amount=-1 +kerning first=66 second=118 amount=-3 +kerning first=77 second=382 amount=-1 +kerning first=268 second=196 amount=-3 +kerning first=365 second=112 amount=-2 +kerning first=321 second=253 amount=-3 +kerning first=86 second=80 amount=-1 +kerning first=310 second=233 amount=-2 +kerning first=199 second=68 amount=-3 +kerning first=368 second=113 amount=-2 +kerning first=1067 second=1085 amount=-1 +kerning first=100 second=108 amount=-1 +kerning first=382 second=233 amount=-1 +kerning first=78 second=290 amount=-2 +kerning first=1057 second=1087 amount=-1 +kerning first=325 second=283 amount=-2 +kerning first=316 second=335 amount=-1 +kerning first=257 second=241 amount=-1 +kerning first=346 second=233 amount=-1 +kerning first=280 second=338 amount=-1 +kerning first=289 second=283 amount=-2 +kerning first=352 second=335 amount=-1 +kerning first=365 second=241 amount=-1 +kerning first=253 second=283 amount=-3 +kerning first=1042 second=1040 amount=-2 +kerning first=350 second=328 amount=-1 +kerning first=83 second=110 amount=-1 +kerning first=219 second=290 amount=-1 +kerning first=217 second=283 amount=-2 +kerning first=354 second=85 amount=-1 +kerning first=277 second=108 amount=-3 +kerning first=103 second=335 amount=-2 +kerning first=119 second=110 amount=-2 +kerning first=269 second=380 amount=-2 +kerning first=354 second=286 amount=-3 +kerning first=241 second=108 amount=-1 +kerning first=8220 second=220 amount=-1 +kerning first=105 second=251 amount=-1 +kerning first=305 second=380 amount=-1 +kerning first=204 second=67 amount=-2 +kerning first=221 second=241 amount=-3 +kerning first=224 second=110 amount=-1 +kerning first=282 second=286 amount=-1 +kerning first=313 second=108 amount=-2 +kerning first=377 second=380 amount=-3 +kerning first=73 second=115 amount=-2 +kerning first=230 second=248 amount=-1 +kerning first=219 second=231 amount=-2 +kerning first=379 second=331 amount=-1 +kerning first=109 second=115 amount=-1 +kerning first=199 second=65 amount=-3 +kerning first=255 second=231 amount=-3 +kerning first=69 second=286 amount=-1 +kerning first=368 second=110 amount=-2 +kerning first=1072 second=1102 amount=-1 +kerning first=307 second=331 amount=-2 +kerning first=67 second=335 amount=-2 +kerning first=203 second=193 amount=-2 +kerning first=194 second=248 amount=-1 +kerning first=233 second=380 amount=-2 +kerning first=199 second=331 amount=-1 +kerning first=250 second=115 amount=-2 +kerning first=363 second=231 amount=-1 +kerning first=235 second=331 amount=-2 +kerning first=84 second=70 amount=-1 +kerning first=89 second=248 amount=-3 +kerning first=379 second=65 amount=-1 +kerning first=291 second=231 amount=-2 +kerning first=381 second=78 amount=-1 +kerning first=327 second=231 amount=-2 +kerning first=1046 second=1073 amount=-3 +kerning first=304 second=255 amount=-2 +kerning first=111 second=326 amount=-1 +kerning first=380 second=347 amount=-2 +kerning first=211 second=302 amount=-2 +kerning first=1082 second=1073 amount=-1 +kerning first=81 second=257 amount=-1 +kerning first=344 second=347 amount=-2 +kerning first=379 second=324 amount=-1 +kerning first=1118 second=1073 amount=-1 +kerning first=332 second=205 amount=-2 +kerning first=232 second=255 amount=-2 +kerning first=8217 second=196 amount=-6 +kerning first=1075 second=1076 amount=-2 +kerning first=229 second=242 amount=-1 +kerning first=230 second=307 amount=-2 +kerning first=252 second=326 amount=-1 +kerning first=1061 second=1113 amount=-2 +kerning first=83 second=205 amount=-3 +kerning first=249 second=289 amount=-3 +kerning first=249 second=250 amount=-1 +kerning first=236 second=347 amount=-2 +kerning first=8222 second=289 amount=-1 +kerning first=78 second=231 amount=-2 +kerning first=200 second=347 amount=-1 +kerning first=337 second=8250 amount=-2 +kerning first=205 second=262 amount=-2 +kerning first=241 second=371 amount=-1 +kerning first=321 second=250 amount=-2 +kerning first=277 second=371 amount=-2 +kerning first=8250 second=316 amount=-1 +kerning first=1084 second=1077 amount=-1 +kerning first=366 second=257 amount=-3 +kerning first=250 second=378 amount=-2 +kerning first=197 second=212 amount=-3 +kerning first=72 second=250 amount=-2 +kerning first=280 second=196 amount=-2 +kerning first=214 second=378 amount=-2 +kerning first=101 second=328 amount=-2 +kerning first=81 second=366 amount=-1 +kerning first=1070 second=1052 amount=-1 +kerning first=78 second=352 amount=-2 +kerning first=45 second=366 amount=-4 +kerning first=100 second=371 amount=-1 +kerning first=330 second=257 amount=-2 +kerning first=286 second=378 amount=-1 +kerning first=108 second=250 amount=-2 +kerning first=107 second=361 amount=-1 +kerning first=67 second=332 amount=-3 +kerning first=222 second=257 amount=-1 +kerning first=73 second=378 amount=-1 +kerning first=314 second=328 amount=-1 +kerning first=1059 second=1097 amount=-4 +kerning first=278 second=328 amount=-1 +kerning first=258 second=366 amount=-3 +kerning first=117 second=257 amount=-1 +kerning first=242 second=328 amount=-1 +kerning first=222 second=366 amount=-1 +kerning first=1051 second=1047 amount=-1 +kerning first=219 second=352 amount=-3 +kerning first=109 second=378 amount=-1 +kerning first=246 second=119 amount=-2 +kerning first=1025 second=1045 amount=-1 +kerning first=352 second=254 amount=-2 +kerning first=369 second=333 amount=-1 +kerning first=200 second=288 amount=-1 +kerning first=232 second=8220 amount=-2 +kerning first=122 second=98 amount=-1 +kerning first=105 second=345 amount=-1 +kerning first=1040 second=1092 amount=-2 +kerning first=70 second=243 amount=-1 +kerning first=1031 second=1107 amount=-1 +kerning first=114 second=287 amount=-2 +kerning first=222 second=106 amount=-1 +kerning first=280 second=332 amount=-1 +kerning first=106 second=243 amount=-1 +kerning first=78 second=287 amount=-3 +kerning first=261 second=333 amount=-1 +kerning first=1086 second=1090 amount=-1 +kerning first=246 second=345 amount=-1 +kerning first=119 second=113 amount=-3 +kerning first=76 second=378 amount=-3 +kerning first=225 second=333 amount=-1 +kerning first=1050 second=1090 amount=-3 +kerning first=83 second=113 amount=-1 +kerning first=89 second=242 amount=-3 +kerning first=291 second=287 amount=-2 +kerning first=1045 second=1116 amount=-1 +kerning first=354 second=345 amount=-1 +kerning first=263 second=281 amount=-1 +kerning first=75 second=217 amount=-2 +kerning first=1058 second=1105 amount=-1 +kerning first=363 second=287 amount=-3 +kerning first=313 second=262 amount=-1 +kerning first=327 second=287 amount=-3 +kerning first=196 second=255 amount=-3 +kerning first=266 second=242 amount=-2 +kerning first=222 second=198 amount=-4 +kerning first=371 second=281 amount=-3 +kerning first=216 second=217 amount=-1 +kerning first=230 second=242 amount=-1 +kerning first=86 second=281 amount=-3 +kerning first=219 second=287 amount=-4 +kerning first=315 second=210 amount=-1 +kerning first=122 second=281 amount=-1 +kerning first=288 second=217 amount=-1 +kerning first=302 second=242 amount=-2 +kerning first=8222 second=224 amount=-2 +kerning first=344 second=288 amount=-3 +kerning first=105 second=8217 amount=-2 +kerning first=324 second=326 amount=-1 +kerning first=1061 second=1090 amount=-3 +kerning first=376 second=255 amount=-3 +kerning first=227 second=281 amount=-1 +kerning first=75 second=119 amount=-3 +kerning first=81 second=198 amount=-4 +kerning first=283 second=243 amount=-1 +kerning first=313 second=197 amount=-2 +kerning first=111 second=119 amount=-2 +kerning first=67 second=279 amount=-2 +kerning first=202 second=354 amount=-1 +kerning first=45 second=254 amount=-1 +kerning first=72 second=45 amount=-4 +kerning first=269 second=324 amount=-2 +kerning first=313 second=374 amount=-3 +kerning first=203 second=249 amount=-2 +kerning first=233 second=324 amount=-2 +kerning first=84 second=274 amount=-1 +kerning first=284 second=291 amount=-3 +kerning first=332 second=379 amount=-2 +kerning first=117 second=254 amount=-2 +kerning first=252 second=119 amount=-3 +kerning first=103 second=279 amount=-2 +kerning first=310 second=354 amount=-2 +kerning first=98 second=249 amount=-1 +kerning first=86 second=74 amount=-4 +kerning first=288 second=119 amount=-1 +kerning first=346 second=354 amount=-3 +kerning first=1053 second=1054 amount=-1 +kerning first=324 second=119 amount=-3 +kerning first=258 second=369 amount=-3 +kerning first=199 second=334 amount=-3 +kerning first=272 second=344 amount=-2 +kerning first=8217 second=256 amount=-6 +kerning first=366 second=369 amount=-1 +kerning first=65 second=233 amount=-1 +kerning first=8250 second=351 amount=-1 +kerning first=330 second=369 amount=-2 +kerning first=1039 second=1079 amount=-1 +kerning first=105 second=289 amount=-3 +kerning first=377 second=214 amount=-1 +kerning first=74 second=264 amount=-2 +kerning first=352 second=279 amount=-1 +kerning first=8217 second=371 amount=-1 +kerning first=217 second=339 amount=-2 +kerning first=219 second=234 amount=-2 +kerning first=1092 second=1074 amount=-1 +kerning first=255 second=234 amount=-3 +kerning first=200 second=229 amount=-1 +kerning first=200 second=344 amount=-2 +kerning first=379 second=86 amount=-2 +kerning first=236 second=229 amount=-2 +kerning first=81 second=106 amount=-1 +kerning first=107 second=255 amount=-1 +kerning first=325 second=339 amount=-2 +kerning first=86 second=284 amount=-3 +kerning first=117 second=106 amount=-2 +kerning first=377 second=324 amount=-1 +kerning first=368 second=97 amount=-3 +kerning first=316 second=279 amount=-1 +kerning first=253 second=339 amount=-3 +kerning first=78 second=234 amount=-2 +kerning first=344 second=229 amount=-2 +kerning first=45 second=106 amount=-2 +kerning first=289 second=339 amount=-2 +kerning first=1057 second=1084 amount=-1 +kerning first=380 second=229 amount=-1 +kerning first=232 second=8217 amount=-2 +kerning first=205 second=111 amount=-2 +kerning first=365 second=244 amount=-1 +kerning first=196 second=199 amount=-3 +kerning first=199 second=219 amount=-2 +kerning first=368 second=264 amount=-1 +kerning first=377 second=209 amount=-1 +kerning first=277 second=111 amount=-1 +kerning first=268 second=199 amount=-3 +kerning first=296 second=264 amount=-2 +kerning first=8216 second=246 amount=-3 +kerning first=1076 second=1089 amount=-1 +kerning first=304 second=199 amount=-2 +kerning first=327 second=234 amount=-2 +kerning first=205 second=339 amount=-2 +kerning first=260 second=264 amount=-3 +kerning first=1040 second=1089 amount=-2 +kerning first=354 second=82 amount=-1 +kerning first=363 second=234 amount=-1 +kerning first=376 second=199 amount=-3 +kerning first=196 second=8217 amount=-5 +kerning first=100 second=111 amount=-1 +kerning first=379 second=334 amount=-1 +kerning first=243 second=121 amount=-3 +kerning first=203 second=364 amount=-2 +kerning first=252 second=251 amount=-1 +kerning first=210 second=289 amount=-1 +kerning first=207 second=121 amount=-2 +kerning first=210 second=82 amount=-2 +kerning first=216 second=66 amount=-2 +kerning first=1114 second=1099 amount=-1 +kerning first=246 second=289 amount=-2 +kerning first=80 second=244 amount=-1 +kerning first=282 second=289 amount=-3 +kerning first=282 second=82 amount=-2 +kerning first=1076 second=1086 amount=-1 +kerning first=354 second=289 amount=-4 +kerning first=221 second=244 amount=-3 +kerning first=258 second=254 amount=-2 +kerning first=257 second=244 amount=-1 +kerning first=69 second=82 amount=-2 +kerning first=288 second=66 amount=-1 +kerning first=371 second=225 amount=-2 +kerning first=269 second=117 amount=-2 +kerning first=67 second=72 amount=-3 +kerning first=89 second=97 amount=-5 +kerning first=211 second=296 amount=-2 +kerning first=233 second=117 amount=-2 +kerning first=313 second=200 amount=-2 +kerning first=111 second=122 amount=-2 +kerning first=290 second=76 amount=-1 +kerning first=108 second=102 amount=-1 +kerning first=374 second=245 amount=-3 +kerning first=45 second=251 amount=-1 +kerning first=227 second=225 amount=-1 +kerning first=266 second=97 amount=-2 +kerning first=314 second=244 amount=-1 +kerning first=85 second=227 amount=-3 +kerning first=324 second=122 amount=-1 +kerning first=263 second=225 amount=-2 +kerning first=377 second=117 amount=-3 +kerning first=208 second=72 amount=-2 +kerning first=302 second=97 amount=-2 +kerning first=86 second=77 amount=-1 +kerning first=351 second=121 amount=-3 +kerning first=117 second=251 amount=-1 +kerning first=288 second=122 amount=-1 +kerning first=328 second=347 amount=-1 +kerning first=379 second=71 amount=-1 +kerning first=315 second=121 amount=-3 +kerning first=258 second=251 amount=-3 +kerning first=252 second=122 amount=-2 +kerning first=335 second=225 amount=-1 +kerning first=280 second=72 amount=-2 +kerning first=279 second=121 amount=-2 +kerning first=216 second=122 amount=-2 +kerning first=194 second=245 amount=-1 +kerning first=330 second=251 amount=-2 +kerning first=213 second=46 amount=-3 +kerning first=338 second=97 amount=-1 +kerning first=89 second=245 amount=-3 +kerning first=89 second=363 amount=-2 +kerning first=1045 second=1063 amount=-2 +kerning first=374 second=97 amount=-5 +kerning first=283 second=240 amount=-1 +kerning first=8222 second=371 amount=-1 +kerning first=366 second=251 amount=-1 +kerning first=375 second=44 amount=-5 +kerning first=8222 second=227 amount=-2 +kerning first=302 second=245 amount=-2 +kerning first=230 second=363 amount=-2 +kerning first=249 second=102 amount=-1 +kerning first=197 second=117 amount=-3 +kerning first=377 second=206 amount=-1 +kerning first=266 second=245 amount=-2 +kerning first=327 second=290 amount=-2 +kerning first=72 second=46 amount=-1 +kerning first=100 second=318 amount=-1 +kerning first=230 second=245 amount=-1 +kerning first=302 second=363 amount=-2 +kerning first=222 second=310 amount=-2 +kerning first=78 second=83 amount=-2 +kerning first=355 second=355 amount=-1 +kerning first=83 second=116 amount=-1 +kerning first=1060 second=1033 amount=-3 +kerning first=283 second=355 amount=-1 +kerning first=81 second=310 amount=-2 +kerning first=219 second=83 amount=-3 +kerning first=1057 second=1048 amount=-1 +kerning first=213 second=194 amount=-4 +kerning first=117 second=267 amount=-1 +kerning first=202 second=298 amount=-2 +kerning first=70 second=240 amount=-1 +kerning first=310 second=255 amount=-3 +kerning first=327 second=83 amount=-2 +kerning first=1098 second=1114 amount=-1 +kerning first=72 second=253 amount=-2 +kerning first=1042 second=1043 amount=-2 +kerning first=106 second=240 amount=-1 +kerning first=117 second=369 amount=-1 +kerning first=241 second=259 amount=-1 +kerning first=8218 second=382 amount=-3 +kerning first=1067 second=1088 amount=-1 +kerning first=84 second=330 amount=-1 +kerning first=208 second=220 amount=-1 +kerning first=205 second=259 amount=-2 +kerning first=67 second=220 amount=-2 +kerning first=218 second=230 amount=-3 +kerning first=1059 second=1094 amount=-4 +kerning first=374 second=304 amount=-1 +kerning first=1101 second=1075 amount=-1 +kerning first=109 second=375 amount=-2 +kerning first=277 second=259 amount=-2 +kerning first=199 second=71 amount=-3 +kerning first=75 second=214 amount=-3 +kerning first=1031 second=1088 amount=-1 +kerning first=286 second=219 amount=-1 +kerning first=352 second=220 amount=-3 +kerning first=119 second=116 amount=-1 +kerning first=338 second=304 amount=-2 +kerning first=45 second=369 amount=-1 +kerning first=260 second=116 amount=-1 +kerning first=1070 second=1049 amount=-1 +kerning first=321 second=194 amount=-2 +kerning first=280 second=220 amount=-2 +kerning first=1077 second=1095 amount=-1 +kerning first=266 second=304 amount=-3 +kerning first=336 second=90 amount=-2 +kerning first=66 second=201 amount=-4 +kerning first=1027 second=1108 amount=-3 +kerning first=346 second=317 amount=-3 +kerning first=89 second=298 amount=-1 +kerning first=365 second=291 amount=-3 +kerning first=76 second=76 amount=-2 +kerning first=1114 second=1082 amount=-1 +kerning first=1099 second=1108 amount=-1 +kerning first=278 second=77 amount=-2 +kerning first=67 second=290 amount=-3 +kerning first=1063 second=1108 amount=-1 +kerning first=119 second=227 amount=-3 +kerning first=78 second=240 amount=-2 +kerning first=1057 second=1037 amount=-1 +kerning first=257 second=291 amount=-2 +kerning first=65 second=337 amount=-1 +kerning first=202 second=317 amount=-2 +kerning first=83 second=227 amount=-2 +kerning first=288 second=304 amount=-1 +kerning first=266 second=298 amount=-3 +kerning first=87 second=350 amount=-3 +kerning first=201 second=97 amount=-1 +kerning first=221 second=291 amount=-4 +kerning first=377 second=330 amount=-1 +kerning first=298 second=100 amount=-2 +kerning first=269 second=279 amount=-1 +kerning first=274 second=317 amount=-2 +kerning first=216 second=304 amount=-2 +kerning first=338 second=298 amount=-2 +kerning first=283 second=324 amount=-2 +kerning first=232 second=110 amount=-2 +kerning first=80 second=291 amount=-3 +kerning first=264 second=350 amount=-3 +kerning first=345 second=97 amount=-1 +kerning first=268 second=110 amount=-1 +kerning first=333 second=311 amount=-1 +kerning first=87 second=90 amount=-3 +kerning first=284 second=280 amount=-1 +kerning first=104 second=8221 amount=-4 +kerning first=101 second=337 amount=-1 +kerning first=261 second=311 amount=-1 +kerning first=333 second=187 amount=-2 +kerning first=106 second=324 amount=-2 +kerning first=376 second=110 amount=-3 +kerning first=225 second=311 amount=-1 +kerning first=70 second=324 amount=-1 +kerning first=198 second=318 amount=-1 +kerning first=350 second=337 amount=-1 +kerning first=264 second=90 amount=-2 +kerning first=107 second=259 amount=-2 +kerning first=234 second=318 amount=-3 +kerning first=381 second=97 amount=-1 +kerning first=314 second=337 amount=-1 +kerning first=336 second=350 amount=-1 +kerning first=256 second=71 amount=-3 +kerning first=65 second=213 amount=-3 +kerning first=233 second=234 amount=-1 +kerning first=246 second=104 amount=-1 +kerning first=1067 second=1107 amount=-1 +kerning first=289 second=250 amount=-1 +kerning first=199 second=381 amount=-2 +kerning first=269 second=234 amount=-1 +kerning first=68 second=374 amount=-2 +kerning first=354 second=334 amount=-3 +kerning first=288 second=44 amount=-3 +kerning first=364 second=303 amount=-2 +kerning first=105 second=104 amount=-1 +kerning first=214 second=260 amount=-4 +kerning first=206 second=213 amount=-2 +kerning first=286 second=260 amount=-3 +kerning first=379 second=381 amount=-1 +kerning first=66 second=325 amount=-4 +kerning first=8218 second=356 amount=-6 +kerning first=84 second=187 amount=-3 +kerning first=111 second=44 amount=-3 +kerning first=1086 second=1081 amount=-1 +kerning first=305 second=289 amount=-2 +kerning first=278 second=213 amount=-1 +kerning first=282 second=104 amount=-1 +kerning first=262 second=374 amount=-1 +kerning first=274 second=85 amount=-2 +kerning first=119 second=351 amount=-3 +kerning first=296 second=227 amount=-2 +kerning first=374 second=298 amount=-1 +kerning first=275 second=241 amount=-2 +kerning first=219 second=111 amount=-2 +kerning first=115 second=303 amount=-2 +kerning first=83 second=351 amount=-1 +kerning first=198 second=194 amount=-2 +kerning first=255 second=111 amount=-3 +kerning first=202 second=85 amount=-2 +kerning first=224 second=351 amount=-1 +kerning first=224 second=227 amount=-1 +kerning first=377 second=70 amount=-1 +kerning first=315 second=201 amount=-2 +kerning first=291 second=111 amount=-2 +kerning first=275 second=277 amount=-1 +kerning first=327 second=111 amount=-2 +kerning first=79 second=303 amount=-1 +kerning first=69 second=104 amount=-1 +kerning first=1077 second=1074 amount=-1 +kerning first=44 second=8217 amount=-5 +kerning first=324 second=44 amount=-1 +kerning first=356 second=284 amount=-3 +kerning first=346 second=204 amount=-3 +kerning first=78 second=111 amount=-2 +kerning first=1113 second=1074 amount=-1 +kerning first=368 second=227 amount=-3 +kerning first=220 second=303 amount=-2 +kerning first=332 second=227 amount=-1 +kerning first=335 second=355 amount=-1 +kerning first=256 second=303 amount=-1 +kerning first=248 second=380 amount=-2 +kerning first=107 second=8249 amount=-3 +kerning first=376 second=362 amount=-1 +kerning first=332 second=8220 amount=-2 +kerning first=261 second=283 amount=-1 +kerning first=284 second=380 amount=-1 +kerning first=266 second=270 amount=-3 +kerning first=8222 second=252 amount=-1 +kerning first=87 second=118 amount=-3 +kerning first=206 second=105 amount=-1 +kerning first=225 second=283 amount=-1 +kerning first=374 second=270 amount=-1 +kerning first=228 second=118 amount=-3 +kerning first=65 second=105 amount=-1 +kerning first=260 second=8220 amount=-5 +kerning first=313 second=377 amount=-3 +kerning first=74 second=248 amount=-2 +kerning first=356 second=380 amount=-3 +kerning first=338 second=270 amount=-2 +kerning first=192 second=118 amount=-3 +kerning first=101 second=105 amount=-2 +kerning first=224 second=8220 amount=-3 +kerning first=120 second=283 amount=-2 +kerning first=71 second=380 amount=-1 +kerning first=314 second=241 amount=-1 +kerning first=376 second=206 amount=-1 +kerning first=122 second=287 amount=-2 +kerning first=89 second=270 amount=-1 +kerning first=364 second=228 amount=-3 +kerning first=278 second=241 amount=-1 +kerning first=369 second=283 amount=-1 +kerning first=86 second=287 amount=-4 +kerning first=346 second=85 amount=-3 +kerning first=259 second=105 amount=-1 +kerning first=328 second=228 amount=-1 +kerning first=83 second=8220 amount=-2 +kerning first=227 second=287 amount=-2 +kerning first=310 second=85 amount=-2 +kerning first=212 second=380 amount=-2 +kerning first=350 second=241 amount=-1 +kerning first=1058 second=1100 amount=-2 +kerning first=110 second=112 amount=-1 +kerning first=198 second=44 amount=-1 +kerning first=365 second=263 amount=-1 +kerning first=1108 second=1074 amount=-1 +kerning first=74 second=112 amount=-2 +kerning first=220 second=228 amount=-3 +kerning first=101 second=241 amount=-2 +kerning first=263 second=287 amount=-3 +kerning first=70 second=193 amount=-3 +kerning first=242 second=241 amount=-1 +kerning first=371 second=287 amount=-1 +kerning first=1073 second=1102 amount=-1 +kerning first=115 second=228 amount=-1 +kerning first=315 second=325 amount=-2 +kerning first=335 second=287 amount=-2 +kerning first=287 second=248 amount=-2 +kerning first=79 second=228 amount=-1 +kerning first=221 second=263 amount=-3 +kerning first=257 second=263 amount=-1 +kerning first=98 second=104 amount=-1 +kerning first=212 second=8249 amount=-1 +kerning first=88 second=235 amount=-2 +kerning first=229 second=103 amount=-2 +kerning first=328 second=331 amount=-1 +kerning first=251 second=248 amount=-1 +kerning first=213 second=197 amount=-4 +kerning first=364 second=331 amount=-2 +kerning first=307 second=365 amount=-1 +kerning first=368 second=255 amount=-1 +kerning first=374 second=366 amount=-1 +kerning first=79 second=200 amount=-2 +kerning first=211 second=221 amount=-2 +kerning first=321 second=197 amount=-2 +kerning first=378 second=318 amount=-2 +kerning first=296 second=255 amount=-2 +kerning first=323 second=112 amount=-1 +kerning first=260 second=255 amount=-3 +kerning first=266 second=366 amount=-2 +kerning first=220 second=331 amount=-2 +kerning first=197 second=262 amount=-3 +kerning first=248 second=289 amount=-2 +kerning first=224 second=255 amount=-3 +kerning first=251 second=112 amount=-2 +kerning first=115 second=331 amount=-2 +kerning first=83 second=255 amount=-2 +kerning first=198 second=290 amount=-1 +kerning first=199 second=74 amount=-2 +kerning first=193 second=338 amount=-3 +kerning first=197 second=98 amount=-2 +kerning first=1050 second=1063 amount=-4 +kerning first=305 second=98 amount=-2 +kerning first=231 second=314 amount=-3 +kerning first=88 second=338 amount=-3 +kerning first=1072 second=1087 amount=-1 +kerning first=290 second=352 amount=-2 +kerning first=269 second=98 amount=-2 +kerning first=195 second=314 amount=-2 +kerning first=1108 second=1087 amount=-1 +kerning first=202 second=214 amount=-1 +kerning first=303 second=314 amount=-2 +kerning first=89 second=65 amount=-6 +kerning first=314 second=105 amount=-1 +kerning first=1063 second=1080 amount=-1 +kerning first=84 second=283 amount=-3 +kerning first=325 second=214 amount=-2 +kerning first=267 second=314 amount=-3 +kerning first=211 second=352 amount=-1 +kerning first=350 second=105 amount=-3 +kerning first=194 second=366 amount=-3 +kerning first=1027 second=1080 amount=-2 +kerning first=274 second=214 amount=-1 +kerning first=375 second=314 amount=-2 +kerning first=242 second=105 amount=-1 +kerning first=339 second=314 amount=-3 +kerning first=278 second=105 amount=-1 +kerning first=89 second=366 amount=-1 +kerning first=8217 second=114 amount=-2 +kerning first=259 second=307 amount=-1 +kerning first=204 second=333 amount=-2 +kerning first=85 second=346 amount=-3 +kerning first=230 second=106 amount=-2 +kerning first=213 second=68 amount=-2 +kerning first=295 second=307 amount=-1 +kerning first=213 second=80 amount=-2 +kerning first=248 second=8221 amount=-2 +kerning first=331 second=307 amount=-1 +kerning first=284 second=8221 amount=-1 +kerning first=112 second=224 amount=-1 +kerning first=367 second=307 amount=-2 +kerning first=218 second=67 amount=-1 +kerning first=298 second=346 amount=-2 +kerning first=253 second=224 amount=-3 +kerning first=321 second=68 amount=-2 +kerning first=68 second=217 amount=-1 +kerning first=1047 second=1059 amount=-3 +kerning first=262 second=346 amount=-3 +kerning first=217 second=224 amount=-3 +kerning first=280 second=81 amount=-1 +kerning first=266 second=106 amount=-1 +kerning first=325 second=224 amount=-2 +kerning first=99 second=333 amount=-1 +kerning first=77 second=67 amount=-2 +kerning first=326 second=45 amount=-3 +kerning first=71 second=256 amount=-3 +kerning first=85 second=243 amount=-2 +kerning first=231 second=230 amount=-2 +kerning first=121 second=243 amount=-3 +kerning first=370 second=346 amount=-3 +kerning first=90 second=230 amount=-1 +kerning first=334 second=346 amount=-1 +kerning first=197 second=369 amount=-3 +kerning first=226 second=243 amount=-1 +kerning first=212 second=256 amount=-4 +kerning first=118 second=307 amount=-2 +kerning first=275 second=101 amount=-1 +kerning first=1088 second=1097 amount=-1 +kerning first=67 second=81 amount=-3 +kerning first=311 second=101 amount=-3 +kerning first=1118 second=1105 amount=-2 +kerning first=1074 second=1095 amount=-1 +kerning first=101 second=361 amount=-2 +kerning first=362 second=67 amount=-1 +kerning first=262 second=109 amount=-1 +kerning first=327 second=268 amount=-2 +kerning first=86 second=334 amount=-3 +kerning first=1042 second=1034 amount=-2 +kerning first=1059 second=1060 amount=-3 +kerning first=316 second=229 amount=-2 +kerning first=68 second=69 amount=-2 +kerning first=212 second=120 amount=-1 +kerning first=1030 second=1072 amount=-1 +kerning first=89 second=251 amount=-2 +kerning first=262 second=243 amount=-2 +kerning first=255 second=225 amount=-3 +kerning first=8218 second=225 amount=-2 +kerning first=298 second=243 amount=-2 +kerning first=81 second=204 amount=-2 +kerning first=194 second=251 amount=-3 +kerning first=219 second=268 amount=-1 +kerning first=45 second=204 amount=-5 +kerning first=236 second=246 amount=-1 +kerning first=370 second=243 amount=-2 +kerning first=187 second=192 amount=-4 +kerning first=266 second=251 amount=-2 +kerning first=1063 second=1098 amount=-1 +kerning first=230 second=251 amount=-2 +kerning first=244 second=229 amount=-1 +kerning first=268 second=79 amount=-3 +kerning first=78 second=268 amount=-2 +kerning first=317 second=217 amount=-3 +kerning first=338 second=251 amount=-2 +kerning first=103 second=229 amount=-3 +kerning first=368 second=380 amount=-3 +kerning first=302 second=251 amount=-2 +kerning first=381 second=282 amount=-1 +kerning first=248 second=120 amount=-3 +kerning first=1101 second=1084 amount=-1 +kerning first=352 second=229 amount=-2 +kerning first=8220 second=100 amount=-3 +kerning first=264 second=118 amount=-1 +kerning first=374 second=251 amount=-2 +kerning first=86 second=203 amount=-1 +kerning first=280 second=229 amount=-1 +kerning first=207 second=244 amount=-2 +kerning first=1045 second=1047 amount=-1 +kerning first=356 second=120 amount=-2 +kerning first=316 second=257 amount=-2 +kerning first=258 second=232 amount=-1 +kerning first=90 second=202 amount=-1 +kerning first=212 second=368 amount=-1 +kerning first=1092 second=1096 amount=-1 +kerning first=352 second=257 amount=-2 +kerning first=366 second=232 amount=-2 +kerning first=278 second=264 amount=-1 +kerning first=85 second=231 amount=-2 +kerning first=244 second=257 amount=-1 +kerning first=330 second=232 amount=-2 +kerning first=367 second=267 amount=-1 +kerning first=280 second=257 amount=-1 +kerning first=117 second=232 amount=-1 +kerning first=77 second=336 amount=-2 +kerning first=325 second=79 amount=-2 +kerning first=356 second=368 amount=-1 +kerning first=208 second=257 amount=-1 +kerning first=86 second=219 amount=-1 +kerning first=66 second=8250 amount=-2 +kerning first=240 second=361 amount=-1 +kerning first=67 second=257 amount=-2 +kerning first=367 second=279 amount=-1 +kerning first=218 second=336 amount=-1 +kerning first=204 second=361 amount=-2 +kerning first=103 second=257 amount=-3 +kerning first=72 second=244 amount=-2 +kerning first=307 second=121 amount=-3 +kerning first=82 second=267 amount=-3 +kerning first=201 second=254 amount=-1 +kerning first=108 second=244 amount=-1 +kerning first=118 second=267 amount=-3 +kerning first=198 second=278 amount=-2 +kerning first=235 second=121 amount=-2 +kerning first=8222 second=116 amount=-2 +kerning first=362 second=336 amount=-1 +kerning first=199 second=121 amount=-1 +kerning first=236 second=318 amount=-2 +kerning first=1025 second=1031 amount=-1 +kerning first=249 second=244 amount=-1 +kerning first=259 second=267 amount=-1 +kerning first=317 second=69 amount=-2 +kerning first=217 second=79 amount=-1 +kerning first=76 second=79 amount=-1 +kerning first=90 second=66 amount=-1 +kerning first=205 second=117 amount=-2 +kerning first=204 second=246 amount=-2 +kerning first=76 second=107 amount=-2 +kerning first=223 second=382 amount=-2 +kerning first=90 second=82 amount=-1 +kerning first=45 second=347 amount=-1 +kerning first=259 second=382 amount=-1 +kerning first=1052 second=1057 amount=-1 +kerning first=277 second=117 amount=-2 +kerning first=99 second=246 amount=-1 +kerning first=1045 second=1085 amount=-1 +kerning first=295 second=382 amount=-1 +kerning first=8218 second=253 amount=-1 +kerning first=72 second=216 amount=-2 +kerning first=241 second=117 amount=-1 +kerning first=112 second=107 amount=-1 +kerning first=331 second=382 amount=-1 +kerning first=339 second=230 amount=-2 +kerning first=313 second=117 amount=-2 +kerning first=375 second=230 amount=-3 +kerning first=1052 second=1085 amount=-1 +kerning first=205 second=281 amount=-2 +kerning first=267 second=230 amount=-2 +kerning first=379 second=121 amount=-3 +kerning first=118 second=382 amount=-3 +kerning first=317 second=205 amount=-2 +kerning first=303 second=230 amount=-2 +kerning first=1037 second=1047 amount=-1 +kerning first=303 second=115 amount=-2 +kerning first=277 second=281 amount=-1 +kerning first=187 second=382 amount=-5 +kerning first=255 second=240 amount=-3 +kerning first=321 second=216 amount=-1 +kerning first=68 second=205 amount=-2 +kerning first=291 second=240 amount=-2 +kerning first=363 second=371 amount=-1 +kerning first=330 second=347 amount=-2 +kerning first=243 second=8250 amount=-2 +kerning first=313 second=217 amount=-3 +kerning first=219 second=240 amount=-2 +kerning first=100 second=281 amount=-1 +kerning first=310 second=89 amount=-2 +kerning first=279 second=8250 amount=-2 +kerning first=258 second=347 amount=-2 +kerning first=354 second=81 amount=-3 +kerning first=253 second=107 amount=-2 +kerning first=367 second=382 amount=-2 +kerning first=8250 second=217 amount=-4 +kerning first=327 second=240 amount=-2 +kerning first=1074 second=1082 amount=-1 +kerning first=255 second=371 amount=-1 +kerning first=121 second=271 amount=-3 +kerning first=363 second=240 amount=-1 +kerning first=1040 second=1095 amount=-3 +kerning first=117 second=347 amount=-2 +kerning first=289 second=107 amount=-2 +kerning first=291 second=371 amount=-1 +kerning first=80 second=80 amount=-1 +kerning first=88 second=226 amount=-1 +kerning first=70 second=336 amount=-1 +kerning first=211 second=305 amount=-1 +kerning first=350 second=65 amount=-4 +kerning first=69 second=252 amount=-2 +kerning first=8220 second=84 amount=-1 +kerning first=1077 second=1083 amount=-1 +kerning first=229 second=226 amount=-1 +kerning first=105 second=252 amount=-1 +kerning first=283 second=305 amount=-2 +kerning first=187 second=122 amount=-5 +kerning first=275 second=249 amount=-2 +kerning first=278 second=207 amount=-2 +kerning first=118 second=122 amount=-3 +kerning first=337 second=226 amount=-1 +kerning first=256 second=219 amount=-3 +kerning first=115 second=305 amount=-2 +kerning first=199 second=266 amount=-3 +kerning first=381 second=245 amount=-1 +kerning first=8218 second=365 amount=-1 +kerning first=354 second=252 amount=-1 +kerning first=274 second=202 amount=-2 +kerning first=88 second=261 amount=-1 +kerning first=243 second=316 amount=-2 +kerning first=79 second=219 amount=-1 +kerning first=279 second=316 amount=-3 +kerning first=202 second=202 amount=-2 +kerning first=298 second=259 amount=-2 +kerning first=315 second=316 amount=-2 +kerning first=365 second=8221 amount=-3 +kerning first=262 second=259 amount=-2 +kerning first=351 second=316 amount=-2 +kerning first=331 second=98 amount=-2 +kerning first=370 second=259 amount=-3 +kerning first=346 second=69 amount=-3 +kerning first=246 second=252 amount=-1 +kerning first=282 second=252 amount=-2 +kerning first=346 second=202 amount=-3 +kerning first=121 second=259 amount=-3 +kerning first=74 second=332 amount=-2 +kerning first=106 second=45 amount=-3 +kerning first=201 second=369 amount=-2 +kerning first=85 second=259 amount=-3 +kerning first=112 second=116 amount=-1 +kerning first=88 second=364 amount=-2 +kerning first=89 second=382 amount=-3 +kerning first=269 second=246 amount=-1 +kerning first=1045 second=1082 amount=-1 +kerning first=70 second=45 amount=-3 +kerning first=287 second=103 amount=-2 +kerning first=253 second=116 amount=-1 +kerning first=233 second=246 amount=-1 +kerning first=365 second=375 amount=-3 +kerning first=251 second=103 amount=-3 +kerning first=197 second=246 amount=-1 +kerning first=101 second=253 amount=-2 +kerning first=352 second=109 amount=-1 +kerning first=231 second=231 amount=-1 +kerning first=110 second=103 amount=-2 +kerning first=194 second=266 amount=-3 +kerning first=323 second=332 amount=-2 +kerning first=206 second=253 amount=-2 +kerning first=355 second=45 amount=-1 +kerning first=1052 second=1074 amount=-1 +kerning first=1108 second=1075 amount=-1 +kerning first=242 second=253 amount=-3 +kerning first=244 second=109 amount=-1 +kerning first=331 second=122 amount=-1 +kerning first=1072 second=1075 amount=-1 +kerning first=374 second=382 amount=-3 +kerning first=264 second=362 amount=-2 +kerning first=116 second=375 amount=-1 +kerning first=118 second=279 amount=-3 +kerning first=295 second=122 amount=-1 +kerning first=8218 second=378 amount=-3 +kerning first=8222 second=364 amount=-3 +kerning first=202 second=331 amount=-1 +kerning first=259 second=279 amount=-1 +kerning first=314 second=101 amount=-1 +kerning first=336 second=362 amount=-1 +kerning first=280 second=109 amount=-1 +kerning first=223 second=122 amount=-2 +kerning first=321 second=356 amount=-3 +kerning first=105 second=8221 amount=-2 +kerning first=67 second=109 amount=-1 +kerning first=381 second=369 amount=-3 +kerning first=230 second=382 amount=-2 +kerning first=87 second=362 amount=-1 +kerning first=289 second=116 amount=-1 +kerning first=266 second=382 amount=-2 +kerning first=257 second=375 amount=-3 +kerning first=274 second=351 amount=-1 +kerning first=82 second=279 amount=-3 +kerning first=1100 second=1081 amount=-1 +kerning first=213 second=356 amount=-2 +kerning first=302 second=382 amount=-1 +kerning first=222 second=302 amount=-2 +kerning first=192 second=362 amount=-3 +kerning first=221 second=375 amount=-3 +kerning first=367 second=122 amount=-2 +kerning first=338 second=382 amount=-2 +kerning first=368 second=213 amount=-1 +kerning first=381 second=242 amount=-1 +kerning first=257 second=115 amount=-1 +kerning first=67 second=374 amount=-1 +kerning first=350 second=68 amount=-3 +kerning first=79 second=80 amount=-2 +kerning first=1116 second=1086 amount=-2 +kerning first=260 second=370 amount=-3 +kerning first=278 second=68 amount=-2 +kerning first=221 second=115 amount=-3 +kerning first=82 second=119 amount=-3 +kerning first=315 second=313 amount=-2 +kerning first=118 second=119 amount=-1 +kerning first=8216 second=352 amount=-1 +kerning first=187 second=119 amount=-3 +kerning first=368 second=225 amount=-3 +kerning first=361 second=8217 amount=-3 +kerning first=223 second=119 amount=-2 +kerning first=69 second=280 amount=-2 +kerning first=365 second=115 amount=-2 +kerning first=259 second=119 amount=-3 +kerning first=284 second=108 amount=-1 +kerning first=350 second=318 amount=-2 +kerning first=1079 second=1090 amount=-1 +kerning first=295 second=119 amount=-3 +kerning first=248 second=108 amount=-2 +kerning first=8218 second=257 amount=-2 +kerning first=1043 second=1090 amount=-1 +kerning first=314 second=253 amount=-3 +kerning first=211 second=73 amount=-2 +kerning first=66 second=313 amount=-4 +kerning first=350 second=253 amount=-2 +kerning first=367 second=119 amount=-3 +kerning first=1085 second=1105 amount=-1 +kerning first=79 second=315 amount=-2 +kerning first=8220 second=112 amount=-1 +kerning first=254 second=369 amount=-1 +kerning first=83 second=370 amount=-3 +kerning first=377 second=246 amount=-1 +kerning first=73 second=269 amount=-2 +kerning first=1049 second=1105 amount=-1 +kerning first=381 second=71 amount=-1 +kerning first=370 second=231 amount=-2 +kerning first=1060 second=1041 amount=-1 +kerning first=1052 second=1097 amount=-1 +kerning first=321 second=328 amount=-1 +kerning first=206 second=225 amount=-2 +kerning first=1100 second=1093 amount=-2 +kerning first=242 second=225 amount=-1 +kerning first=251 second=335 amount=-1 +kerning first=250 second=269 amount=-1 +kerning first=1040 second=1098 amount=-2 +kerning first=249 second=328 amount=-1 +kerning first=226 second=371 amount=-1 +kerning first=278 second=225 amount=-1 +kerning first=84 second=196 amount=-6 +kerning first=71 second=108 amount=-1 +kerning first=110 second=363 amount=-1 +kerning first=74 second=335 amount=-2 +kerning first=101 second=225 amount=-2 +kerning first=198 second=203 amount=-2 +kerning first=251 second=363 amount=-1 +kerning first=197 second=218 amount=-3 +kerning first=378 second=46 amount=-1 +kerning first=287 second=363 amount=-1 +kerning first=1083 second=1086 amount=-1 +kerning first=192 second=102 amount=-1 +kerning first=195 second=8221 amount=-5 +kerning first=216 second=8249 amount=-1 +kerning first=109 second=44 amount=-1 +kerning first=210 second=280 amount=-2 +kerning first=323 second=363 amount=-2 +kerning first=228 second=102 amount=-1 +kerning first=264 second=102 amount=-2 +kerning first=338 second=378 amount=-2 +kerning first=1113 second=1083 amount=-1 +kerning first=198 second=46 amount=-1 +kerning first=282 second=280 amount=-2 +kerning first=226 second=231 amount=-1 +kerning first=80 second=115 amount=-1 +kerning first=314 second=225 amount=-2 +kerning first=212 second=8221 amount=-2 +kerning first=313 second=82 amount=-2 +kerning first=262 second=231 amount=-2 +kerning first=116 second=115 amount=-1 +kerning first=350 second=225 amount=-2 +kerning first=71 second=8221 amount=-1 +kerning first=270 second=46 amount=-3 +kerning first=354 second=280 amount=-1 +kerning first=121 second=231 amount=-3 +kerning first=1104 second=1076 amount=-2 +kerning first=107 second=8221 amount=-2 +kerning first=76 second=8217 amount=-4 +kerning first=87 second=102 amount=-1 +kerning first=330 second=235 amount=-2 +kerning first=203 second=261 amount=-1 +kerning first=119 second=367 amount=-1 +kerning first=1114 second=1118 amount=-2 +kerning first=195 second=211 amount=-3 +kerning first=366 second=235 amount=-2 +kerning first=1078 second=1118 amount=-2 +kerning first=224 second=257 amount=-1 +kerning first=200 second=210 amount=-1 +kerning first=275 second=261 amount=-2 +kerning first=90 second=211 amount=-1 +kerning first=311 second=261 amount=-2 +kerning first=83 second=367 amount=-1 +kerning first=361 second=8220 amount=-3 +kerning first=375 second=326 amount=-2 +kerning first=350 second=250 amount=-1 +kerning first=1061 second=1092 amount=-2 +kerning first=290 second=296 amount=-1 +kerning first=98 second=261 amount=-1 +kerning first=1097 second=1092 amount=-1 +kerning first=356 second=235 amount=-3 +kerning first=244 second=112 amount=-1 +kerning first=231 second=326 amount=-2 +kerning first=242 second=250 amount=-1 +kerning first=230 second=227 amount=-2 +kerning first=208 second=112 amount=-1 +kerning first=267 second=326 amount=-2 +kerning first=206 second=250 amount=-2 +kerning first=225 second=171 amount=-2 +kerning first=344 second=231 amount=-3 +kerning first=303 second=326 amount=-2 +kerning first=290 second=327 amount=-1 +kerning first=76 second=8220 amount=-4 +kerning first=103 second=112 amount=-1 +kerning first=117 second=235 amount=-1 +kerning first=339 second=326 amount=-2 +kerning first=278 second=250 amount=-2 +kerning first=116 second=378 amount=-1 +kerning first=8217 second=120 amount=-1 +kerning first=67 second=112 amount=-3 +kerning first=65 second=250 amount=-3 +kerning first=347 second=261 amount=-1 +kerning first=90 second=201 amount=-1 +kerning first=90 second=326 amount=-1 +kerning first=108 second=328 amount=-1 +kerning first=258 second=235 amount=-1 +kerning first=1044 second=1047 amount=-1 +kerning first=334 second=86 amount=-2 +kerning first=101 second=250 amount=-2 +kerning first=120 second=171 amount=-3 +kerning first=99 second=237 amount=-2 +kerning first=66 second=288 amount=-3 +kerning first=323 second=100 amount=-2 +kerning first=350 second=365 amount=-1 +kerning first=1043 second=1093 amount=-3 +kerning first=201 second=366 amount=-2 +kerning first=365 second=378 amount=-2 +kerning first=314 second=365 amount=-2 +kerning first=278 second=365 amount=-2 +kerning first=311 second=113 amount=-3 +kerning first=262 second=262 amount=-3 +kerning first=242 second=365 amount=-1 +kerning first=85 second=83 amount=-3 +kerning first=298 second=262 amount=-2 +kerning first=257 second=378 amount=-1 +kerning first=206 second=365 amount=-2 +kerning first=1060 second=1113 amount=-2 +kerning first=352 second=112 amount=-3 +kerning first=221 second=378 amount=-3 +kerning first=369 second=171 amount=-2 +kerning first=222 second=76 amount=-2 +kerning first=316 second=112 amount=-1 +kerning first=90 second=323 amount=-1 +kerning first=8250 second=69 amount=-5 +kerning first=287 second=100 amount=-2 +kerning first=262 second=83 amount=-3 +kerning first=222 second=87 amount=-2 +kerning first=327 second=45 amount=-4 +kerning first=264 second=275 amount=-2 +kerning first=298 second=83 amount=-2 +kerning first=258 second=87 amount=-6 +kerning first=354 second=249 amount=-1 +kerning first=1057 second=1065 amount=-1 +kerning first=337 second=223 amount=-1 +kerning first=204 second=352 amount=-2 +kerning first=334 second=83 amount=-1 +kerning first=288 second=193 amount=-3 +kerning first=246 second=249 amount=-1 +kerning first=8222 second=84 amount=-6 +kerning first=74 second=100 amount=-2 +kerning first=192 second=275 amount=-1 +kerning first=370 second=83 amount=-3 +kerning first=282 second=249 amount=-2 +kerning first=203 second=286 amount=-1 +kerning first=228 second=275 amount=-1 +kerning first=199 second=353 amount=-2 +kerning first=207 second=210 amount=-2 +kerning first=45 second=87 amount=-4 +kerning first=275 second=113 amount=-1 +kerning first=1074 second=1091 amount=-2 +kerning first=87 second=275 amount=-3 +kerning first=81 second=87 amount=-2 +kerning first=207 second=288 amount=-2 +kerning first=379 second=203 amount=-1 +kerning first=315 second=288 amount=-1 +kerning first=344 second=210 amount=-3 +kerning first=197 second=316 amount=-2 +kerning first=85 second=262 amount=-1 +kerning first=370 second=114 amount=-1 +kerning first=99 second=324 amount=-2 +kerning first=354 second=364 amount=-1 +kerning first=368 second=339 amount=-2 +kerning first=67 second=84 amount=-1 +kerning first=253 second=233 amount=-3 +kerning first=260 second=339 amount=-1 +kerning first=217 second=233 amount=-2 +kerning first=228 second=337 amount=-1 +kerning first=98 second=289 amount=-2 +kerning first=296 second=339 amount=-2 +kerning first=325 second=233 amount=-2 +kerning first=262 second=114 amount=-1 +kerning first=289 second=233 amount=-2 +kerning first=203 second=289 amount=-3 +kerning first=121 second=114 amount=-1 +kerning first=208 second=84 amount=-2 +kerning first=105 second=249 amount=-1 +kerning first=275 second=289 amount=-3 +kerning first=98 second=110 amount=-1 +kerning first=87 second=99 amount=-3 +kerning first=85 second=234 amount=-2 +kerning first=121 second=234 amount=-3 +kerning first=45 second=205 amount=-5 +kerning first=268 second=274 amount=-3 +kerning first=203 second=110 amount=-1 +kerning first=1024 second=1116 amount=-1 +kerning first=192 second=99 amount=-1 +kerning first=352 second=84 amount=-3 +kerning first=381 second=86 amount=-2 +kerning first=76 second=379 amount=-3 +kerning first=217 second=379 amount=-1 +kerning first=275 second=110 amount=-2 +kerning first=264 second=99 amount=-2 +kerning first=240 second=237 amount=-1 +kerning first=240 second=324 amount=-1 +kerning first=228 second=99 amount=-1 +kerning first=224 second=339 amount=-1 +kerning first=204 second=237 amount=-1 +kerning first=347 second=110 amount=-2 +kerning first=83 second=339 amount=-1 +kerning first=199 second=350 amount=-3 +kerning first=376 second=274 amount=-1 +kerning first=232 second=187 amount=-2 +kerning first=119 second=339 amount=-3 +kerning first=370 second=234 amount=-2 +kerning first=379 second=350 amount=-1 +kerning first=77 second=212 amount=-2 +kerning first=354 second=277 amount=-3 +kerning first=1074 second=1119 amount=-1 +kerning first=89 second=197 amount=-6 +kerning first=80 second=260 amount=-4 +kerning first=107 second=111 amount=-3 +kerning first=226 second=234 amount=-1 +kerning first=8220 second=229 amount=-3 +kerning first=262 second=234 amount=-2 +kerning first=268 second=302 amount=-3 +kerning first=298 second=234 amount=-2 +kerning first=66 second=316 amount=-3 +kerning first=102 second=316 amount=3 +kerning first=325 second=264 amount=-2 +kerning first=221 second=260 amount=-6 +kerning first=1025 second=1064 amount=-1 +kerning first=211 second=76 amount=-2 +kerning first=69 second=364 amount=-2 +kerning first=289 second=351 amount=-3 +kerning first=311 second=289 amount=-2 +kerning first=356 second=111 amount=-3 +kerning first=253 second=351 amount=-3 +kerning first=330 second=8249 amount=-4 +kerning first=90 second=354 amount=-2 +kerning first=217 second=264 amount=-1 +kerning first=368 second=367 amount=-1 +kerning first=1049 second=1102 amount=-1 +kerning first=1046 second=1054 amount=-4 +kerning first=105 second=277 amount=-1 +kerning first=325 second=351 amount=-2 +kerning first=84 second=199 amount=-3 +kerning first=195 second=354 amount=-6 +kerning first=112 second=351 amount=-2 +kerning first=71 second=377 amount=-2 +kerning first=296 second=367 amount=-2 +kerning first=1043 second=1081 amount=-2 +kerning first=8220 second=109 amount=-1 +kerning first=210 second=364 amount=-1 +kerning first=76 second=351 amount=-1 +kerning first=76 second=264 amount=-1 +kerning first=106 second=259 amount=-2 +kerning first=379 second=267 amount=-1 +kerning first=217 second=351 amount=-2 +kerning first=224 second=367 amount=-1 +kerning first=1117 second=1105 amount=-1 +kerning first=218 second=212 amount=-1 +kerning first=260 second=367 amount=-3 +kerning first=266 second=267 amount=-2 +kerning first=316 second=254 amount=-1 +kerning first=241 second=8249 amount=-3 +kerning first=370 second=111 amount=-2 +kerning first=69 second=264 amount=-1 +kerning first=303 second=351 amount=-2 +kerning first=302 second=267 amount=-2 +kerning first=8222 second=249 amount=-1 +kerning first=87 second=121 amount=-3 +kerning first=284 second=377 amount=-2 +kerning first=68 second=45 amount=-1 +kerning first=267 second=351 amount=-2 +kerning first=197 second=361 amount=-3 +kerning first=194 second=267 amount=-1 +kerning first=381 second=257 amount=-1 +kerning first=354 second=367 amount=-2 +kerning first=1099 second=1077 amount=-1 +kerning first=375 second=351 amount=-3 +kerning first=230 second=267 amount=-1 +kerning first=370 second=44 amount=-5 +kerning first=212 second=377 amount=-2 +kerning first=339 second=351 amount=-2 +kerning first=269 second=361 amount=-2 +kerning first=88 second=246 amount=-2 +kerning first=282 second=367 amount=-2 +kerning first=226 second=111 amount=-1 +kerning first=1027 second=1077 amount=-3 +kerning first=233 second=361 amount=-2 +kerning first=345 second=257 amount=-1 +kerning first=100 second=8249 amount=-2 +kerning first=262 second=111 amount=-2 +kerning first=1063 second=1077 amount=-1 +kerning first=363 second=114 amount=-1 +kerning first=90 second=351 amount=-2 +kerning first=244 second=254 amount=-1 +kerning first=344 second=337 amount=-3 +kerning first=298 second=111 amount=-2 +kerning first=255 second=114 amount=-1 +kerning first=231 second=351 amount=-2 +kerning first=305 second=361 amount=-1 +kerning first=374 second=267 amount=-3 +kerning first=280 second=254 amount=-1 +kerning first=246 second=367 amount=-1 +kerning first=356 second=377 amount=-3 +kerning first=291 second=114 amount=-1 +kerning first=195 second=351 amount=-2 +kerning first=261 second=105 amount=-1 +kerning first=253 second=261 amount=-3 +kerning first=206 second=244 amount=-2 +kerning first=356 second=117 amount=-2 +kerning first=289 second=261 amount=-3 +kerning first=203 second=274 amount=-2 +kerning first=219 second=114 amount=-1 +kerning first=104 second=44 amount=-1 +kerning first=67 second=254 amount=-1 +kerning first=325 second=261 amount=-2 +kerning first=87 second=381 amount=-3 +kerning first=234 second=287 amount=-3 +kerning first=289 second=104 amount=-2 +kerning first=103 second=254 amount=-1 +kerning first=119 second=120 amount=-1 +kerning first=69 second=367 amount=-2 +kerning first=198 second=287 amount=-3 +kerning first=222 second=344 amount=-2 +kerning first=350 second=244 amount=-1 +kerning first=8220 second=103 amount=-4 +kerning first=220 second=351 amount=-2 +kerning first=112 second=261 amount=-1 +kerning first=1074 second=1094 amount=-1 +kerning first=213 second=374 amount=-2 +kerning first=8220 second=232 amount=-3 +kerning first=313 second=8249 amount=-1 +kerning first=228 second=121 amount=-3 +kerning first=264 second=381 amount=-2 +kerning first=378 second=287 amount=-2 +kerning first=217 second=261 amount=-3 +kerning first=305 second=237 amount=-1 +kerning first=363 second=271 amount=-1 +kerning first=246 second=107 amount=-1 +kerning first=203 second=171 amount=-2 +kerning first=1067 second=1104 amount=-1 +kerning first=192 second=250 amount=-3 +kerning first=1031 second=1104 amount=-1 +kerning first=1056 second=1037 amount=-1 +kerning first=235 second=378 amount=-2 +kerning first=219 second=249 amount=-1 +kerning first=107 second=117 amount=-1 +kerning first=370 second=240 amount=-2 +kerning first=264 second=250 amount=-2 +kerning first=74 second=347 amount=-2 +kerning first=282 second=107 amount=-1 +kerning first=71 second=117 amount=-1 +kerning first=69 second=107 amount=-1 +kerning first=8218 second=219 amount=-3 +kerning first=368 second=230 amount=-3 +kerning first=83 second=354 amount=-3 +kerning first=284 second=117 amount=-1 +kerning first=87 second=250 amount=-2 +kerning first=107 second=281 amount=-3 +kerning first=105 second=107 amount=-1 +kerning first=248 second=117 amount=-1 +kerning first=85 second=240 amount=-2 +kerning first=377 second=361 amount=-3 +kerning first=121 second=240 amount=-3 +kerning first=201 second=257 amount=-1 +kerning first=354 second=264 amount=-3 +kerning first=381 second=100 amount=-1 +kerning first=221 second=288 amount=-3 +kerning first=260 second=354 amount=-6 +kerning first=379 second=263 amount=-1 +kerning first=1030 second=1047 amount=-1 +kerning first=282 second=264 amount=-1 +kerning first=257 second=339 amount=-1 +kerning first=262 second=240 amount=-2 +kerning first=307 second=378 amount=-1 +kerning first=206 second=74 amount=-1 +kerning first=347 second=171 amount=-1 +kerning first=76 second=364 amount=-3 +kerning first=332 second=354 amount=-2 +kerning first=377 second=67 amount=-1 +kerning first=298 second=240 amount=-2 +kerning first=255 second=271 amount=-3 +kerning first=323 second=347 amount=-2 +kerning first=97 second=314 amount=-1 +kerning first=121 second=371 amount=-1 +kerning first=291 second=271 amount=-2 +kerning first=287 second=347 amount=-3 +kerning first=278 second=74 amount=-1 +kerning first=226 second=240 amount=-1 +kerning first=251 second=347 amount=-2 +kerning first=321 second=252 amount=-2 +kerning first=1103 second=1104 amount=-1 +kerning first=204 second=105 amount=-1 +kerning first=199 second=90 amount=-2 +kerning first=310 second=314 amount=-1 +kerning first=113 second=311 amount=-2 +kerning first=272 second=207 amount=-2 +kerning first=274 second=314 amount=-1 +kerning first=222 second=220 amount=-1 +kerning first=200 second=201 amount=-2 +kerning first=382 second=314 amount=-2 +kerning first=81 second=220 amount=-1 +kerning first=213 second=77 amount=-2 +kerning first=317 second=317 amount=-2 +kerning first=195 second=214 amount=-3 +kerning first=346 second=314 amount=-2 +kerning first=225 second=371 amount=-1 +kerning first=302 second=338 amount=-2 +kerning first=8250 second=202 amount=-5 +kerning first=119 second=224 amount=-3 +kerning first=1057 second=1040 amount=-2 +kerning first=68 second=317 amount=-2 +kerning first=83 second=224 amount=-1 +kerning first=317 second=304 amount=-2 +kerning first=258 second=220 amount=-3 +kerning first=224 second=224 amount=-1 +kerning first=72 second=71 amount=-2 +kerning first=379 second=90 amount=-1 +kerning first=286 second=291 amount=-3 +kerning first=200 second=207 amount=-2 +kerning first=321 second=77 amount=-2 +kerning first=250 second=291 amount=-3 +kerning first=72 second=337 amount=-2 +kerning first=122 second=318 amount=-2 +kerning first=296 second=224 amount=-2 +kerning first=214 second=291 amount=-1 +kerning first=113 second=324 amount=-2 +kerning first=208 second=97 amount=-1 +kerning first=110 second=44 amount=-1 +kerning first=321 second=213 amount=-1 +kerning first=81 second=84 amount=-2 +kerning first=254 second=324 amount=-1 +kerning first=227 second=318 amount=-1 +kerning first=67 second=97 amount=-2 +kerning first=368 second=224 amount=-3 +kerning first=109 second=291 amount=-2 +kerning first=218 second=324 amount=-2 +kerning first=263 second=318 amount=-3 +kerning first=332 second=224 amount=-1 +kerning first=1047 second=1101 amount=-2 +kerning first=1088 second=1088 amount=-1 +kerning first=8250 second=66 amount=-5 +kerning first=73 second=291 amount=-3 +kerning first=249 second=337 amount=-1 +kerning first=316 second=97 amount=-2 +kerning first=321 second=71 amount=-1 +kerning first=290 second=311 amount=-1 +kerning first=200 second=380 amount=-2 +kerning first=335 second=318 amount=-2 +kerning first=352 second=97 amount=-2 +kerning first=254 second=311 amount=-1 +kerning first=74 second=196 amount=-5 +kerning first=258 second=84 amount=-6 +kerning first=66 second=328 amount=-3 +kerning first=105 second=101 amount=-1 +kerning first=244 second=97 amount=-1 +kerning first=382 second=267 amount=-1 +kerning first=187 second=298 amount=-5 +kerning first=1052 second=1088 amount=-1 +kerning first=222 second=84 amount=-2 +kerning first=108 second=337 amount=-1 +kerning first=280 second=97 amount=-1 +kerning first=76 second=104 amount=-2 +kerning first=313 second=284 amount=-1 +kerning first=362 second=193 amount=-4 +kerning first=336 second=381 amount=-2 +kerning first=81 second=344 amount=-2 +kerning first=99 second=234 amount=-1 +kerning first=335 second=303 amount=-1 +kerning first=290 second=193 amount=-3 +kerning first=375 second=227 amount=-3 +kerning first=339 second=227 amount=-2 +kerning first=204 second=234 amount=-2 +kerning first=263 second=303 amount=-2 +kerning first=253 second=104 amount=-2 +kerning first=72 second=213 amount=-2 +kerning first=200 second=325 amount=-2 +kerning first=326 second=324 amount=-1 +kerning first=354 second=101 amount=-3 +kerning first=205 second=284 amount=-2 +kerning first=1038 second=1107 amount=-4 +kerning first=281 second=44 amount=-3 +kerning first=222 second=78 amount=-2 +kerning first=254 second=187 amount=-2 +kerning first=112 second=104 amount=-1 +kerning first=362 second=324 amount=-2 +kerning first=272 second=310 amount=-2 +kerning first=8216 second=253 amount=-1 +kerning first=90 second=227 amount=-1 +kerning first=85 second=111 amount=-2 +kerning first=304 second=277 amount=-2 +kerning first=257 second=335 amount=-1 +kerning first=201 second=251 amount=-2 +kerning first=200 second=310 amount=-2 +kerning first=121 second=111 amount=-3 +kerning first=45 second=78 amount=-5 +kerning first=1101 second=1100 amount=-1 +kerning first=81 second=78 amount=-2 +kerning first=376 second=277 amount=-3 +kerning first=303 second=227 amount=-2 +kerning first=86 second=194 amount=-6 +kerning first=122 second=303 amount=-1 +kerning first=196 second=277 amount=-1 +kerning first=267 second=227 amount=-2 +kerning first=45 second=220 amount=-4 +kerning first=68 second=381 amount=-2 +kerning first=195 second=85 amount=-3 +kerning first=231 second=227 amount=-2 +kerning first=1092 second=1093 amount=-1 +kerning first=268 second=277 amount=-2 +kerning first=1056 second=1093 amount=-1 +kerning first=86 second=303 amount=-2 +kerning first=232 second=277 amount=-1 +kerning first=272 second=201 amount=-2 +kerning first=267 second=345 amount=-1 +kerning first=307 second=105 amount=-1 +kerning first=74 second=245 amount=-2 +kerning first=381 second=251 amount=-3 +kerning first=303 second=345 amount=-1 +kerning first=257 second=118 amount=-3 +kerning first=339 second=345 amount=-1 +kerning first=235 second=105 amount=-2 +kerning first=365 second=118 amount=-3 +kerning first=201 second=270 amount=-2 +kerning first=375 second=345 amount=-1 +kerning first=268 second=283 amount=-2 +kerning first=251 second=245 amount=-1 +kerning first=232 second=283 amount=-1 +kerning first=199 second=105 amount=-1 +kerning first=196 second=283 amount=-1 +kerning first=326 second=328 amount=-1 +kerning first=203 second=280 amount=-2 +kerning first=307 second=241 amount=-2 +kerning first=376 second=283 amount=-3 +kerning first=193 second=335 amount=-1 +kerning first=8220 second=87 amount=-1 +kerning first=1063 second=1105 amount=-1 +kerning first=229 second=335 amount=-1 +kerning first=255 second=108 amount=-2 +kerning first=1027 second=1083 amount=-3 +kerning first=76 second=370 amount=-3 +kerning first=304 second=283 amount=-2 +kerning first=249 second=228 amount=-1 +kerning first=213 second=228 amount=-1 +kerning first=291 second=108 amount=-3 +kerning first=381 second=270 amount=-1 +kerning first=108 second=228 amount=-2 +kerning first=235 second=241 amount=-2 +kerning first=72 second=228 amount=-2 +kerning first=88 second=335 amount=-2 +kerning first=356 second=330 amount=-1 +kerning first=363 second=108 amount=-2 +kerning first=199 second=241 amount=-1 +kerning first=90 second=73 amount=-1 +kerning first=233 second=231 amount=-1 +kerning first=381 second=122 amount=-3 +kerning first=219 second=256 amount=-4 +kerning first=350 second=362 amount=-3 +kerning first=269 second=231 amount=-1 +kerning first=206 second=305 amount=-1 +kerning first=321 second=331 amount=-1 +kerning first=313 second=278 amount=-2 +kerning first=197 second=231 amount=-1 +kerning first=8222 second=379 amount=-1 +kerning first=377 second=231 amount=-1 +kerning first=249 second=331 amount=-1 +kerning first=1045 second=1097 amount=-1 +kerning first=325 second=255 amount=-2 +kerning first=1061 second=1073 amount=-3 +kerning first=334 second=196 amount=-4 +kerning first=347 second=116 amount=-2 +kerning first=199 second=356 amount=-1 +kerning first=278 second=362 amount=-2 +kerning first=311 second=116 amount=-1 +kerning first=1043 second=1087 amount=-2 +kerning first=323 second=81 amount=-2 +kerning first=217 second=255 amount=-1 +kerning first=1079 second=1087 amount=-1 +kerning first=65 second=362 amount=-3 +kerning first=323 second=245 amount=-2 +kerning first=70 second=67 amount=-1 +kerning first=214 second=8249 amount=-1 +kerning first=112 second=255 amount=-3 +kerning first=1047 second=1095 amount=-2 +kerning first=287 second=245 amount=-2 +kerning first=76 second=255 amount=-3 +kerning first=221 second=266 amount=-3 +kerning first=78 second=211 amount=-2 +kerning first=201 second=122 amount=-2 +kerning first=379 second=105 amount=-1 +kerning first=231 second=345 amount=-1 +kerning first=374 second=282 amount=-1 +kerning first=113 second=305 amount=-2 +kerning first=253 second=316 amount=-2 +kerning first=338 second=282 amount=-2 +kerning first=77 second=305 amount=-1 +kerning first=350 second=80 amount=-3 +kerning first=1027 second=1099 amount=-2 +kerning first=323 second=229 amount=-2 +kerning first=218 second=305 amount=-2 +kerning first=74 second=81 amount=-2 +kerning first=70 second=333 amount=-1 +kerning first=266 second=282 amount=-3 +kerning first=202 second=217 amount=-2 +kerning first=321 second=65 amount=-2 +kerning first=254 second=305 amount=-1 +kerning first=274 second=217 amount=-2 +kerning first=362 second=305 amount=-2 +kerning first=79 second=68 amount=-2 +kerning first=310 second=217 amount=-2 +kerning first=364 second=216 amount=-1 +kerning first=89 second=282 amount=-1 +kerning first=326 second=305 amount=-1 +kerning first=346 second=217 amount=-3 +kerning first=278 second=80 amount=-2 +kerning first=296 second=230 amount=-2 +kerning first=111 second=307 amount=-1 +kerning first=332 second=230 amount=-1 +kerning first=8222 second=367 amount=-1 +kerning first=224 second=230 amount=-1 +kerning first=197 second=346 amount=-3 +kerning first=119 second=230 amount=-3 +kerning first=356 second=281 amount=-3 +kerning first=283 second=333 amount=-1 +kerning first=324 second=307 amount=-1 +kerning first=68 second=90 amount=-2 +kerning first=83 second=230 amount=-2 +kerning first=274 second=69 amount=-2 +kerning first=221 second=257 amount=-5 +kerning first=211 second=218 amount=-1 +kerning first=192 second=112 amount=-3 +kerning first=260 second=79 amount=-3 +kerning first=377 second=243 amount=-1 +kerning first=202 second=69 amount=-2 +kerning first=79 second=203 amount=-2 +kerning first=364 second=334 amount=-1 +kerning first=374 second=109 amount=-3 +kerning first=1030 second=1060 amount=-1 +kerning first=1045 second=1040 amount=-2 +kerning first=368 second=79 amount=-1 +kerning first=197 second=243 amount=-1 +kerning first=65 second=244 amount=-1 +kerning first=233 second=243 amount=-1 +kerning first=296 second=79 amount=-2 +kerning first=356 second=268 amount=-3 +kerning first=269 second=243 amount=-1 +kerning first=74 second=229 amount=-3 +kerning first=8217 second=290 amount=-2 +kerning first=355 second=228 amount=-1 +kerning first=255 second=120 amount=-1 +kerning first=258 second=332 amount=-3 +kerning first=1108 second=1084 amount=-1 +kerning first=110 second=229 amount=-1 +kerning first=291 second=120 amount=-2 +kerning first=288 second=192 amount=-3 +kerning first=1072 second=1084 amount=-1 +kerning first=8250 second=314 amount=-1 +kerning first=330 second=332 amount=-2 +kerning first=363 second=120 amount=-2 +kerning first=216 second=192 amount=-4 +kerning first=251 second=229 amount=-1 +kerning first=46 second=8217 amount=-5 +kerning first=67 second=242 amount=-2 +kerning first=287 second=229 amount=-3 +kerning first=366 second=332 amount=-1 +kerning first=220 second=334 amount=-1 +kerning first=219 second=120 amount=-2 +kerning first=103 second=242 amount=-2 +kerning first=231 second=339 amount=-1 +kerning first=1114 second=1090 amount=-1 +kerning first=1092 second=1099 amount=-1 +kerning first=374 second=279 amount=-3 +kerning first=8218 second=314 amount=-1 +kerning first=267 second=339 amount=-1 +kerning first=232 second=289 amount=-3 +kerning first=68 second=192 amount=-4 +kerning first=316 second=242 amount=-1 +kerning first=268 second=289 amount=-3 +kerning first=195 second=339 amount=-1 +kerning first=288 second=291 amount=-3 +kerning first=222 second=229 amount=-1 +kerning first=304 second=289 amount=-3 +kerning first=375 second=339 amount=-3 +kerning first=287 second=232 amount=-2 +kerning first=1063 second=1096 amount=-1 +kerning first=67 second=106 amount=-1 +kerning first=230 second=279 amount=-1 +kerning first=379 second=99 amount=-1 +kerning first=251 second=232 amount=-1 +kerning first=194 second=279 amount=-1 +kerning first=352 second=242 amount=-1 +kerning first=376 second=289 amount=-4 +kerning first=303 second=339 amount=-3 +kerning first=330 second=229 amount=-2 +kerning first=377 second=89 amount=-2 +kerning first=302 second=279 amount=-2 +kerning first=8222 second=261 amount=-2 +kerning first=339 second=339 amount=-1 +kerning first=323 second=232 amount=-2 +kerning first=366 second=229 amount=-3 +kerning first=1027 second=1096 amount=-2 +kerning first=89 second=119 amount=-3 +kerning first=266 second=279 amount=-2 +kerning first=210 second=379 amount=-2 +kerning first=244 second=106 amount=-2 +kerning first=187 second=282 amount=-5 +kerning first=74 second=232 amount=-1 +kerning first=194 second=119 amount=-3 +kerning first=278 second=200 amount=-2 +kerning first=282 second=379 amount=-1 +kerning first=230 second=119 amount=-2 +kerning first=8216 second=221 amount=-1 +kerning first=380 second=263 amount=-1 +kerning first=1050 second=1059 amount=-3 +kerning first=208 second=106 amount=-1 +kerning first=266 second=119 amount=-1 +kerning first=354 second=379 amount=-3 +kerning first=302 second=119 amount=-2 +kerning first=1061 second=1079 amount=-1 +kerning first=90 second=339 amount=-1 +kerning first=338 second=119 amount=-1 +kerning first=316 second=106 amount=-3 +kerning first=374 second=119 amount=-3 +kerning first=204 second=346 amount=-2 +kerning first=352 second=106 amount=-1 +kerning first=1025 second=1079 amount=-1 +kerning first=211 second=209 amount=-2 +kerning first=202 second=66 amount=-2 +kerning first=90 second=79 amount=-1 +kerning first=317 second=202 amount=-2 +kerning first=80 second=269 amount=-1 +kerning first=305 second=8217 amount=-2 +kerning first=221 second=269 amount=-3 +kerning first=1025 second=1076 amount=-2 +kerning first=1071 second=1087 amount=-1 +kerning first=200 second=316 amount=-1 +kerning first=346 second=66 amount=-3 +kerning first=236 second=316 amount=-2 +kerning first=1067 second=1119 amount=-1 +kerning first=257 second=269 amount=-1 +kerning first=274 second=66 amount=-2 +kerning first=195 second=79 amount=-3 +kerning first=274 second=205 amount=-2 +kerning first=77 second=199 amount=-2 +kerning first=365 second=269 amount=-1 +kerning first=90 second=69 amount=-1 +kerning first=8217 second=281 amount=-3 +kerning first=81 second=72 amount=-2 +kerning first=346 second=205 amount=-3 +kerning first=222 second=72 amount=-2 +kerning first=220 second=216 amount=-1 +kerning first=218 second=199 amount=-1 +kerning first=1061 second=1076 amount=-1 +kerning first=197 second=89 amount=-6 +kerning first=256 second=216 amount=-3 +kerning first=81 second=229 amount=-1 +kerning first=317 second=192 amount=-2 +kerning first=1090 second=1089 amount=-1 +kerning first=117 second=229 amount=-1 +kerning first=115 second=109 amount=-2 +kerning first=202 second=205 amount=-2 +kerning first=210 second=8217 amount=-2 +kerning first=201 second=282 amount=-2 +kerning first=362 second=199 amount=-1 +kerning first=45 second=229 amount=-1 +kerning first=246 second=8217 amount=-2 +kerning first=232 second=103 amount=-3 +kerning first=307 second=102 amount=-2 +kerning first=196 second=286 amount=-3 +kerning first=330 second=226 amount=-2 +kerning first=192 second=353 amount=-2 +kerning first=379 second=102 amount=-3 +kerning first=103 second=245 amount=-2 +kerning first=263 second=46 amount=-3 +kerning first=381 second=382 amount=-3 +kerning first=352 second=245 amount=-1 +kerning first=1090 second=1086 amount=-1 +kerning first=199 second=102 amount=-2 +kerning first=363 second=8221 amount=-3 +kerning first=316 second=245 amount=-1 +kerning first=8220 second=248 amount=-3 +kerning first=235 second=102 amount=-2 +kerning first=45 second=72 amount=-5 +kerning first=1070 second=1083 amount=-2 +kerning first=1086 second=1088 amount=-1 +kerning first=86 second=46 amount=-5 +kerning first=208 second=103 amount=-1 +kerning first=321 second=219 amount=-3 +kerning first=290 second=45 amount=-3 +kerning first=68 second=202 amount=-2 +kerning first=344 second=316 amount=-3 +kerning first=217 second=252 amount=-1 +kerning first=330 second=335 amount=-2 +kerning first=8250 second=317 amount=-5 +kerning first=380 second=316 amount=-2 +kerning first=235 second=303 amount=-2 +kerning first=103 second=103 amount=-2 +kerning first=196 second=213 amount=-3 +kerning first=253 second=252 amount=-1 +kerning first=366 second=335 amount=-2 +kerning first=67 second=103 amount=-3 +kerning first=289 second=252 amount=-1 +kerning first=81 second=226 amount=-1 +kerning first=117 second=335 amount=-1 +kerning first=117 second=226 amount=-1 +kerning first=363 second=259 amount=-1 +kerning first=76 second=252 amount=-2 +kerning first=112 second=252 amount=-1 +kerning first=258 second=335 amount=-1 +kerning first=278 second=356 amount=-1 +kerning first=211 second=206 amount=-2 +kerning first=67 second=369 amount=-2 +kerning first=255 second=259 amount=-3 +kerning first=1079 second=1114 amount=-1 +kerning first=264 second=375 amount=-1 +kerning first=219 second=259 amount=-3 +kerning first=199 second=253 amount=-1 +kerning first=228 second=375 amount=-3 +kerning first=370 second=246 amount=-2 +kerning first=327 second=259 amount=-2 +kerning first=354 second=116 amount=-1 +kerning first=374 second=122 amount=-3 +kerning first=235 second=253 amount=-2 +kerning first=103 second=369 amount=-1 +kerning first=1052 second=1082 amount=-1 +kerning first=352 second=103 amount=-3 +kerning first=1079 second=1075 amount=-1 +kerning first=325 second=252 amount=-1 +kerning first=298 second=246 amount=-2 +kerning first=78 second=259 amount=-2 +kerning first=105 second=116 amount=-1 +kerning first=65 second=356 amount=-6 +kerning first=316 second=103 amount=-3 +kerning first=1043 second=1075 amount=-2 +kerning first=307 second=253 amount=-3 +kerning first=77 second=45 amount=-4 +kerning first=262 second=246 amount=-2 +kerning first=246 second=116 amount=-1 +kerning first=111 second=97 amount=-1 +kerning first=217 second=241 amount=-2 +kerning first=280 second=103 amount=-3 +kerning first=218 second=45 amount=-5 +kerning first=226 second=246 amount=-1 +kerning first=244 second=103 amount=-2 +kerning first=1102 second=1097 amount=-1 +kerning first=114 second=259 amount=-1 +kerning first=268 second=83 amount=-3 +kerning first=1037 second=1119 amount=-1 +kerning first=8220 second=378 amount=-1 +kerning first=121 second=246 amount=-3 +kerning first=264 second=266 amount=-3 +kerning first=85 second=246 amount=-2 +kerning first=197 second=83 amount=-3 +kerning first=89 second=122 amount=-3 +kerning first=1057 second=1056 amount=-1 +kerning first=192 second=266 amount=-3 +kerning first=89 second=279 amount=-3 +kerning first=338 second=122 amount=-2 +kerning first=244 second=369 amount=-1 +kerning first=202 second=323 amount=-2 +kerning first=201 second=109 amount=-1 +kerning first=302 second=122 amount=-1 +kerning first=87 second=266 amount=-3 +kerning first=87 second=375 amount=-3 +kerning first=350 second=356 amount=-3 +kerning first=316 second=369 amount=-2 +kerning first=274 second=323 amount=-2 +kerning first=201 second=382 amount=-2 +kerning first=377 second=83 amount=-1 +kerning first=230 second=122 amount=-2 +kerning first=335 second=117 amount=-1 +kerning first=280 second=369 amount=-2 +kerning first=204 second=336 amount=-2 +kerning first=87 second=115 amount=-3 +kerning first=207 second=305 amount=-1 +kerning first=230 second=46 amount=-3 +kerning first=78 second=380 amount=-1 +kerning first=346 second=323 amount=-3 +kerning first=316 second=248 amount=-1 +kerning first=364 second=213 amount=-1 +kerning first=83 second=233 amount=-1 +kerning first=272 second=198 amount=-4 +kerning first=230 second=273 amount=-1 +kerning first=1056 second=1105 amount=-1 +kerning first=192 second=115 amount=-2 +kerning first=219 second=380 amount=-3 +kerning first=264 second=115 amount=-2 +kerning first=233 second=355 amount=-1 +kerning first=103 second=248 amount=-2 +kerning first=45 second=223 amount=-2 +kerning first=119 second=233 amount=-3 +kerning first=197 second=355 amount=-1 +kerning first=211 second=330 amount=-2 +kerning first=8220 second=97 amount=-3 +kerning first=260 second=233 amount=-1 +kerning first=364 second=259 amount=-3 +kerning first=70 second=102 amount=-1 +kerning first=117 second=223 amount=-1 +kerning first=224 second=233 amount=-1 +kerning first=366 second=338 amount=-1 +kerning first=67 second=248 amount=-2 +kerning first=278 second=90 amount=-1 +kerning first=377 second=355 amount=-1 +kerning first=192 second=8217 amount=-5 +kerning first=199 second=365 amount=-2 +kerning first=86 second=315 amount=-1 +kerning first=296 second=233 amount=-2 +kerning first=264 second=263 amount=-2 +kerning first=45 second=75 amount=-5 +kerning first=261 second=244 amount=-1 +kerning first=368 second=233 amount=-2 +kerning first=269 second=355 amount=-1 +kerning first=69 second=110 amount=-1 +kerning first=272 second=313 amount=-2 +kerning first=65 second=350 amount=-3 +kerning first=105 second=110 amount=-2 +kerning first=1036 second=1090 amount=-3 +kerning first=256 second=213 amount=-3 +kerning first=8220 second=245 amount=-3 +kerning first=87 second=263 amount=-3 +kerning first=220 second=213 amount=-1 +kerning first=216 second=298 amount=-2 +kerning first=222 second=75 amount=-2 +kerning first=1108 second=1090 amount=-1 +kerning first=246 second=110 amount=-1 +kerning first=288 second=298 amount=-1 +kerning first=220 second=328 amount=-2 +kerning first=282 second=110 amount=-1 +kerning first=362 second=196 amount=-4 +kerning first=198 second=303 amount=-1 +kerning first=252 second=316 amount=-2 +kerning first=67 second=363 amount=-2 +kerning first=234 second=303 amount=-2 +kerning first=115 second=328 amount=-2 +kerning first=354 second=110 amount=-3 +kerning first=103 second=363 amount=-1 +kerning first=72 second=225 amount=-2 +kerning first=206 second=350 amount=-2 +kerning first=83 second=85 amount=-3 +kerning first=108 second=225 amount=-2 +kerning first=364 second=328 amount=-2 +kerning first=205 second=290 amount=-2 +kerning first=218 second=196 amount=-4 +kerning first=328 second=328 amount=-1 +kerning first=244 second=363 amount=-1 +kerning first=378 second=303 amount=-1 +kerning first=86 second=200 amount=-1 +kerning first=87 second=260 amount=-6 +kerning first=280 second=363 amount=-2 +kerning first=290 second=196 amount=-3 +kerning first=350 second=350 amount=-1 +kerning first=313 second=290 amount=-1 +kerning first=74 second=235 amount=-1 +kerning first=1090 second=1103 amount=-2 +kerning first=330 second=338 amount=-2 +kerning first=352 second=363 amount=-1 +kerning first=264 second=260 amount=-3 +kerning first=258 second=338 amount=-3 +kerning first=272 second=45 amount=-1 +kerning first=376 second=286 amount=-3 +kerning first=196 second=369 amount=-3 +kerning first=85 second=345 amount=-1 +kerning first=264 second=256 amount=-3 +kerning first=336 second=260 amount=-4 +kerning first=255 second=380 amount=-3 +kerning first=304 second=286 amount=-2 +kerning first=1027 second=1093 amount=-3 +kerning first=291 second=380 amount=-3 +kerning first=332 second=85 amount=-1 +kerning first=213 second=225 amount=-1 +kerning first=121 second=98 amount=-1 +kerning first=8220 second=242 amount=-3 +kerning first=327 second=380 amount=-1 +kerning first=371 second=46 amount=-2 +kerning first=249 second=225 amount=-1 +kerning first=262 second=98 amount=-1 +kerning first=363 second=380 amount=-2 +kerning first=260 second=85 amount=-3 +kerning first=268 second=286 amount=-3 +kerning first=1092 second=1102 amount=-1 +kerning first=69 second=261 amount=-1 +kerning first=289 second=367 amount=-1 +kerning first=105 second=261 amount=-2 +kerning first=325 second=367 amount=-2 +kerning first=74 second=87 amount=-1 +kerning first=217 second=367 amount=-1 +kerning first=377 second=86 amount=-2 +kerning first=210 second=261 amount=-1 +kerning first=253 second=367 amount=-1 +kerning first=112 second=367 amount=-1 +kerning first=274 second=326 amount=-1 +kerning first=8216 second=333 amount=-3 +kerning first=363 second=111 amount=-1 +kerning first=260 second=351 amount=-2 +kerning first=211 second=327 amount=-2 +kerning first=202 second=211 amount=-1 +kerning first=197 second=352 amount=-3 +kerning first=368 second=351 amount=-2 +kerning first=193 second=210 amount=-3 +kerning first=346 second=326 amount=-1 +kerning first=328 second=230 amount=-1 +kerning first=76 second=367 amount=-2 +kerning first=219 second=377 amount=-1 +kerning first=382 second=326 amount=-2 +kerning first=88 second=210 amount=-3 +kerning first=381 second=112 amount=-1 +kerning first=8217 second=284 amount=-2 +kerning first=352 second=366 amount=-3 +kerning first=345 second=112 amount=1 +kerning first=210 second=8220 amount=-2 +kerning first=202 second=326 amount=-1 +kerning first=1090 second=1092 amount=-1 +kerning first=280 second=366 amount=-2 +kerning first=251 second=235 amount=-1 +kerning first=274 second=211 amount=-1 +kerning first=246 second=261 amount=-1 +kerning first=105 second=8220 amount=-2 +kerning first=287 second=235 amount=-2 +kerning first=235 second=250 amount=-2 +kerning first=323 second=263 amount=-2 +kerning first=323 second=235 amount=-2 +kerning first=199 second=250 amount=-2 +kerning first=84 second=302 amount=-1 +kerning first=1057 second=1053 amount=-1 +kerning first=201 second=112 amount=-2 +kerning first=307 second=250 amount=-1 +kerning first=354 second=261 amount=-5 +kerning first=197 second=86 amount=-6 +kerning first=241 second=287 amount=-2 +kerning first=67 second=366 amount=-2 +kerning first=72 second=245 amount=-2 +kerning first=80 second=275 amount=-1 +kerning first=242 second=353 amount=-2 +kerning first=269 second=237 amount=-2 +kerning first=264 second=378 amount=-2 +kerning first=313 second=287 amount=-3 +kerning first=278 second=353 amount=-1 +kerning first=327 second=262 amount=-2 +kerning first=233 second=237 amount=-2 +kerning first=1067 second=1116 amount=-1 +kerning first=314 second=353 amount=-2 +kerning first=197 second=237 amount=-1 +kerning first=336 second=378 amount=-2 +kerning first=350 second=353 amount=-1 +kerning first=196 second=171 amount=-4 +kerning first=316 second=100 amount=-1 +kerning first=65 second=353 amount=-2 +kerning first=86 second=197 amount=-6 +kerning first=87 second=378 amount=-3 +kerning first=208 second=366 amount=-1 +kerning first=352 second=100 amount=-1 +kerning first=8222 second=107 amount=-1 +kerning first=101 second=353 amount=-2 +kerning first=228 second=378 amount=-1 +kerning first=268 second=171 amount=-4 +kerning first=69 second=379 amount=-1 +kerning first=304 second=171 amount=-4 +kerning first=45 second=198 amount=-4 +kerning first=354 second=113 amount=-3 +kerning first=235 second=365 amount=-2 +kerning first=262 second=248 amount=-2 +kerning first=377 second=352 amount=-1 +kerning first=217 second=249 amount=-1 +kerning first=8216 second=218 amount=-1 +kerning first=201 second=44 amount=-1 +kerning first=76 second=249 amount=-2 +kerning first=112 second=249 amount=-1 +kerning first=374 second=346 amount=-3 +kerning first=365 second=275 amount=-1 +kerning first=78 second=262 amount=-2 +kerning first=325 second=249 amount=-1 +kerning first=73 second=288 amount=-2 +kerning first=257 second=275 amount=-1 +kerning first=72 second=74 amount=-1 +kerning first=366 second=223 amount=-2 +kerning first=8250 second=205 amount=-5 +kerning first=1038 second=1104 amount=-4 +kerning first=105 second=113 amount=-1 +kerning first=253 second=249 amount=-1 +kerning first=67 second=100 amount=-2 +kerning first=219 second=262 amount=-1 +kerning first=1043 second=1078 amount=-3 +kerning first=289 second=249 amount=-1 +kerning first=103 second=100 amount=-2 +kerning first=221 second=275 amount=-3 +kerning first=213 second=74 amount=-2 +kerning first=1045 second=1091 amount=-1 +kerning first=1079 second=1078 amount=-1 +kerning first=195 second=217 amount=-3 +kerning first=208 second=87 amount=-2 +kerning first=104 second=314 amount=-1 +kerning first=67 second=87 amount=-1 +kerning first=381 second=288 amount=-1 +kerning first=245 second=314 amount=-2 +kerning first=8222 second=218 amount=-3 +kerning first=252 second=113 amount=-1 +kerning first=260 second=217 amount=-3 +kerning first=298 second=333 amount=-2 +kerning first=317 second=314 amount=-2 +kerning first=262 second=333 amount=-2 +kerning first=88 second=269 amount=-2 +kerning first=281 second=314 amount=-3 +kerning first=334 second=80 amount=-2 +kerning first=321 second=210 amount=-1 +kerning first=75 second=366 amount=-2 +kerning first=370 second=333 amount=-2 +kerning first=229 second=269 amount=-1 +kerning first=8250 second=192 amount=-4 +kerning first=281 second=46 amount=-3 +kerning first=193 second=269 amount=-1 +kerning first=201 second=288 amount=-1 +kerning first=353 second=314 amount=-2 +kerning first=327 second=281 amount=-2 +kerning first=236 second=307 amount=-1 +kerning first=214 second=198 amount=-4 +kerning first=363 second=281 amount=-1 +kerning first=70 second=262 amount=-1 +kerning first=99 second=224 amount=-2 +kerning first=355 second=255 amount=-1 +kerning first=286 second=198 amount=-3 +kerning first=240 second=224 amount=-1 +kerning first=204 second=224 amount=-2 +kerning first=72 second=210 amount=-2 +kerning first=380 second=307 amount=-1 +kerning first=283 second=255 amount=-2 +kerning first=193 second=369 amount=-3 +kerning first=352 second=326 amount=-1 +kerning first=219 second=281 amount=-2 +kerning first=275 second=243 amount=-1 +kerning first=255 second=281 amount=-3 +kerning first=311 second=243 amount=-3 +kerning first=291 second=281 amount=-2 +kerning first=8220 second=263 amount=-3 +kerning first=1039 second=1054 amount=-1 +kerning first=378 second=120 amount=-1 +kerning first=334 second=73 amount=-2 +kerning first=321 second=203 amount=-2 +kerning first=221 second=229 amount=-5 +kerning first=68 second=75 amount=-2 +kerning first=213 second=203 amount=-2 +kerning first=80 second=229 amount=-1 +kerning first=234 second=99 amount=-1 +kerning first=116 second=229 amount=-1 +kerning first=314 second=118 amount=-3 +kerning first=198 second=120 amount=-1 +kerning first=317 second=75 amount=-2 +kerning first=217 second=101 amount=-2 +kerning first=278 second=118 amount=-1 +kerning first=234 second=120 amount=-2 +kerning first=253 second=101 amount=-3 +kerning first=274 second=382 amount=-2 +kerning first=229 second=248 amount=-1 +kerning first=257 second=229 amount=-1 +kerning first=350 second=118 amount=-3 +kerning first=262 second=73 amount=-3 +kerning first=378 second=99 amount=-1 +kerning first=325 second=101 amount=-2 +kerning first=101 second=118 amount=-2 +kerning first=216 second=106 amount=-1 +kerning first=315 second=90 amount=-3 +kerning first=242 second=118 amount=-2 +kerning first=375 second=347 amount=-3 +kerning first=283 second=8220 amount=-2 +kerning first=75 second=106 amount=-1 +kerning first=86 second=68 amount=-1 +kerning first=206 second=118 amount=-2 +kerning first=381 second=267 amount=-1 +kerning first=111 second=106 amount=-2 +kerning first=211 second=8220 amount=-2 +kerning first=324 second=106 amount=-2 +kerning first=337 second=241 amount=-1 +kerning first=121 second=355 amount=-1 +kerning first=352 second=87 amount=-3 +kerning first=65 second=118 amount=-3 +kerning first=268 second=121 amount=-1 +kerning first=106 second=8220 amount=-2 +kerning first=252 second=106 amount=-2 +kerning first=117 second=240 amount=-1 +kerning first=288 second=106 amount=-1 +kerning first=280 second=87 amount=-1 +kerning first=262 second=361 amount=-2 +kerning first=83 second=364 amount=-3 +kerning first=226 second=361 amount=-1 +kerning first=203 second=264 amount=-1 +kerning first=236 second=333 amount=-1 +kerning first=8220 second=291 amount=-4 +kerning first=376 second=212 amount=-3 +kerning first=298 second=361 amount=-2 +kerning first=227 second=303 amount=-1 +kerning first=65 second=111 amount=-1 +kerning first=260 second=364 amount=-3 +kerning first=201 second=316 amount=-1 +kerning first=304 second=212 amount=-2 +kerning first=370 second=361 amount=-1 +kerning first=101 second=111 amount=-1 +kerning first=196 second=212 amount=-3 +kerning first=365 second=257 amount=-1 +kerning first=67 second=66 amount=-3 +kerning first=206 second=111 amount=-2 +kerning first=65 second=8249 amount=-4 +kerning first=199 second=368 amount=-2 +kerning first=68 second=82 amount=-2 +kerning first=260 second=104 amount=-2 +kerning first=280 second=66 amount=-2 +kerning first=266 second=335 amount=-2 +kerning first=332 second=364 amount=-1 +kerning first=224 second=104 amount=-1 +kerning first=229 second=44 amount=-1 +kerning first=1039 second=1057 amount=-1 +kerning first=208 second=66 amount=-2 +kerning first=85 second=361 amount=-1 +kerning first=88 second=44 amount=-1 +kerning first=121 second=361 amount=-1 +kerning first=201 second=323 amount=-2 +kerning first=376 second=205 amount=-1 +kerning first=352 second=66 amount=-3 +kerning first=352 second=347 amount=-1 +kerning first=332 second=97 amount=-1 +kerning first=316 second=347 amount=-2 +kerning first=1057 second=1078 amount=-1 +kerning first=374 second=8250 amount=-3 +kerning first=71 second=278 amount=-1 +kerning first=244 second=326 amount=-1 +kerning first=280 second=347 amount=-1 +kerning first=78 second=281 amount=-2 +kerning first=381 second=323 amount=-1 +kerning first=268 second=205 amount=-3 +kerning first=212 second=278 amount=-2 +kerning first=67 second=354 amount=-1 +kerning first=244 second=347 amount=-2 +kerning first=264 second=351 amount=-2 +kerning first=296 second=97 amount=-2 +kerning first=316 second=326 amount=-1 +kerning first=365 second=250 amount=-1 +kerning first=242 second=371 amount=-1 +kerning first=284 second=278 amount=-1 +kerning first=208 second=354 amount=-2 +kerning first=116 second=250 amount=-1 +kerning first=103 second=347 amount=-3 +kerning first=356 second=278 amount=-1 +kerning first=103 second=326 amount=-1 +kerning first=257 second=250 amount=-1 +kerning first=67 second=347 amount=-2 +kerning first=1057 second=1099 amount=-1 +kerning first=280 second=354 amount=-1 +kerning first=221 second=250 amount=-2 +kerning first=268 second=233 amount=-2 +kerning first=121 second=333 amount=-3 +kerning first=314 second=378 amount=-1 +kerning first=245 second=103 amount=-2 +kerning first=1059 second=1047 amount=-3 +kerning first=232 second=233 amount=-1 +kerning first=266 second=82 amount=-3 +kerning first=101 second=371 amount=-2 +kerning first=85 second=333 amount=-2 +kerning first=278 second=378 amount=-2 +kerning first=350 second=90 amount=-1 +kerning first=209 second=103 amount=-3 +kerning first=352 second=354 amount=-3 +kerning first=73 second=226 amount=-2 +kerning first=275 second=271 amount=-1 +kerning first=226 second=333 amount=-1 +kerning first=304 second=233 amount=-2 +kerning first=109 second=226 amount=-1 +kerning first=311 second=271 amount=-3 +kerning first=350 second=378 amount=-2 +kerning first=104 second=103 amount=-2 +kerning first=100 second=365 amount=-1 +kerning first=116 second=257 amount=-1 +kerning first=214 second=219 amount=-1 +kerning first=377 second=203 amount=-1 +kerning first=68 second=103 amount=-1 +kerning first=376 second=233 amount=-3 +kerning first=214 second=226 amount=-1 +kerning first=1075 second=1092 amount=-1 +kerning first=230 second=8250 amount=-2 +kerning first=101 second=378 amount=-2 +kerning first=334 second=45 amount=-1 +kerning first=250 second=226 amount=-1 +kerning first=89 second=8250 amount=-3 +kerning first=242 second=378 amount=-2 +kerning first=222 second=204 amount=-2 +kerning first=1039 second=1085 amount=-1 +kerning first=104 second=110 amount=-1 +kerning first=286 second=226 amount=-1 +kerning first=80 second=257 amount=-1 +kerning first=206 second=378 amount=-1 +kerning first=104 second=363 amount=-1 +kerning first=232 second=240 amount=-1 +kerning first=296 second=214 amount=-2 +kerning first=88 second=220 amount=-2 +kerning first=268 second=240 amount=-2 +kerning first=260 second=214 amount=-3 +kerning first=245 second=110 amount=-1 +kerning first=209 second=363 amount=-2 +kerning first=84 second=72 amount=-1 +kerning first=79 second=65 amount=-4 +kerning first=368 second=214 amount=-1 +kerning first=281 second=110 amount=-2 +kerning first=245 second=363 amount=-1 +kerning first=196 second=240 amount=-1 +kerning first=200 second=304 amount=-2 +kerning first=281 second=363 amount=-2 +kerning first=73 second=257 amount=-2 +kerning first=106 second=318 amount=-2 +kerning first=317 second=363 amount=-2 +kerning first=1085 second=1108 amount=-1 +kerning first=220 second=65 amount=-4 +kerning first=370 second=284 amount=-1 +kerning first=353 second=363 amount=-1 +kerning first=304 second=240 amount=-2 +kerning first=262 second=284 amount=-3 +kerning first=193 second=220 amount=-3 +kerning first=187 second=270 amount=-5 +kerning first=337 second=371 amount=-1 +kerning first=90 second=334 amount=-1 +kerning first=298 second=284 amount=-2 +kerning first=187 second=369 amount=-1 +kerning first=283 second=318 amount=-3 +kerning first=364 second=65 amount=-4 +kerning first=118 second=117 amount=-1 +kerning first=118 second=369 amount=-1 +kerning first=99 second=259 amount=-2 +kerning first=223 second=116 amount=-1 +kerning first=198 second=71 amount=-1 +kerning first=379 second=375 amount=-3 +kerning first=259 second=369 amount=-1 +kerning first=240 second=259 amount=-1 +kerning first=355 second=318 amount=-1 +kerning first=223 second=369 amount=-1 +kerning first=204 second=259 amount=-2 +kerning first=112 second=8217 amount=-2 +kerning first=82 second=116 amount=-3 +kerning first=1070 second=1030 amount=-1 +kerning first=224 second=97 amount=-1 +kerning first=82 second=369 amount=-2 +kerning first=83 second=97 amount=-2 +kerning first=118 second=116 amount=-1 +kerning first=206 second=228 amount=-2 +kerning first=109 second=254 amount=-2 +kerning first=1064 second=1102 amount=-1 +kerning first=1086 second=1075 amount=-1 +kerning first=264 second=253 amount=-1 +kerning first=1100 second=1102 amount=-1 +kerning first=1056 second=1055 amount=-1 +kerning first=101 second=228 amount=-2 +kerning first=236 second=279 amount=-1 +kerning first=8222 second=382 amount=-3 +kerning first=250 second=254 amount=-2 +kerning first=378 second=324 amount=-2 +kerning first=1100 second=1074 amount=-1 +kerning first=307 second=375 amount=-3 +kerning first=331 second=369 amount=-1 +kerning first=198 second=324 amount=-1 +kerning first=8220 second=326 amount=-1 +kerning first=100 second=355 amount=-1 +kerning first=90 second=81 amount=-1 +kerning first=295 second=369 amount=-1 +kerning first=1050 second=1104 amount=-2 +kerning first=117 second=273 amount=-1 +kerning first=86 second=377 amount=-3 +kerning first=235 second=375 amount=-2 +kerning first=381 second=344 amount=-1 +kerning first=199 second=375 amount=-1 +kerning first=367 second=369 amount=-1 +kerning first=234 second=324 amount=-2 +kerning first=67 second=298 amount=-3 +kerning first=187 second=380 amount=-5 +kerning first=277 second=355 amount=-1 +kerning first=283 second=234 amount=-1 +kerning first=201 second=344 amount=-2 +kerning first=1049 second=1108 amount=-1 +kerning first=85 second=284 amount=-1 +kerning first=1064 second=1074 amount=-1 +kerning first=1086 second=1103 amount=-2 +kerning first=208 second=298 amount=-2 +kerning first=99 second=287 amount=-3 +kerning first=90 second=224 amount=-1 +kerning first=70 second=234 amount=-1 +kerning first=274 second=332 amount=-1 +kerning first=87 second=253 amount=-3 +kerning first=106 second=234 amount=-1 +kerning first=280 second=298 amount=-2 +kerning first=1053 second=1119 amount=-1 +kerning first=216 second=310 amount=-2 +kerning first=1072 second=1100 amount=-1 +kerning first=380 second=279 amount=-1 +kerning first=8218 second=371 amount=-1 +kerning first=1108 second=1100 amount=-1 +kerning first=344 second=279 amount=-3 +kerning first=192 second=253 amount=-3 +kerning first=1070 second=1058 amount=-1 +kerning first=310 second=332 amount=-3 +kerning first=352 second=298 amount=-3 +kerning first=67 second=249 amount=-2 +kerning first=8217 second=67 amount=-2 +kerning first=74 second=242 amount=-1 +kerning first=288 second=85 amount=-1 +kerning first=240 second=287 amount=-2 +kerning first=8218 second=90 amount=-1 +kerning first=307 second=108 amount=-2 +kerning first=240 second=8217 amount=-2 +kerning first=77 second=46 amount=-1 +kerning first=216 second=85 amount=-1 +kerning first=1049 second=1086 amount=-1 +kerning first=67 second=270 amount=-3 +kerning first=251 second=242 amount=-1 +kerning first=291 second=105 amount=-2 +kerning first=75 second=338 amount=-3 +kerning first=368 second=210 amount=-1 +kerning first=327 second=105 amount=-1 +kerning first=209 second=335 amount=-2 +kerning first=378 second=380 amount=-2 +kerning first=323 second=242 amount=-2 +kerning first=70 second=290 amount=-1 +kerning first=99 second=8217 amount=-2 +kerning first=287 second=242 amount=-2 +kerning first=255 second=105 amount=-2 +kerning first=281 second=335 amount=-1 +kerning first=218 second=382 amount=-3 +kerning first=350 second=333 amount=-1 +kerning first=1104 second=1117 amount=-1 +kerning first=1046 second=1060 amount=-4 +kerning first=1092 second=1083 amount=-2 +kerning first=1067 second=1094 amount=-1 +kerning first=199 second=197 amount=-3 +kerning first=198 second=380 amount=-2 +kerning first=352 second=270 amount=-3 +kerning first=193 second=248 amount=-1 +kerning first=1031 second=1094 amount=-1 +kerning first=234 second=380 amount=-2 +kerning first=228 second=225 amount=-1 +kerning first=69 second=119 amount=-1 +kerning first=264 second=225 amount=-2 +kerning first=88 second=248 amount=-2 +kerning first=105 second=119 amount=-3 +kerning first=350 second=228 amount=-1 +kerning first=199 second=108 amount=-1 +kerning first=208 second=270 amount=-2 +kerning first=314 second=228 amount=-2 +kerning first=379 second=197 amount=-1 +kerning first=1042 second=1049 amount=-2 +kerning first=278 second=228 amount=-1 +kerning first=71 second=74 amount=-1 +kerning first=280 second=270 amount=-2 +kerning first=242 second=228 amount=-1 +kerning first=118 second=351 amount=-3 +kerning first=87 second=225 amount=-5 +kerning first=1056 second=1083 amount=-2 +kerning first=296 second=103 amount=-3 +kerning first=282 second=119 amount=-1 +kerning first=8216 second=283 amount=-3 +kerning first=253 second=122 amount=-3 +kerning first=118 second=98 amount=-1 +kerning first=356 second=46 amount=-5 +kerning first=100 second=102 amount=-1 +kerning first=99 second=231 amount=-1 +kerning first=350 second=200 amount=-3 +kerning first=217 second=122 amount=-3 +kerning first=354 second=119 amount=-3 +kerning first=212 second=74 amount=-2 +kerning first=85 second=256 amount=-4 +kerning first=198 second=352 amount=-2 +kerning first=317 second=199 amount=-1 +kerning first=112 second=122 amount=-2 +kerning first=284 second=74 amount=-1 +kerning first=1049 second=1080 amount=-1 +kerning first=69 second=211 amount=-1 +kerning first=212 second=46 amount=-3 +kerning first=336 second=225 amount=-1 +kerning first=352 second=119 amount=-3 +kerning first=367 second=116 amount=-1 +kerning first=262 second=256 amount=-3 +kerning first=325 second=122 amount=-1 +kerning first=1074 second=1097 amount=-1 +kerning first=284 second=46 amount=-3 +kerning first=8217 second=334 amount=-2 +kerning first=204 second=231 amount=-2 +kerning first=282 second=318 amount=-1 +kerning first=289 second=122 amount=-3 +kerning first=258 second=245 amount=-1 +kerning first=288 second=366 amount=-1 +kerning first=282 second=211 amount=-1 +kerning first=187 second=379 amount=-4 +kerning first=119 second=316 amount=-2 +kerning first=71 second=46 amount=-3 +kerning first=244 second=380 amount=-2 +kerning first=107 second=46 amount=-1 +kerning first=370 second=256 amount=-4 +kerning first=216 second=366 amount=-1 +kerning first=117 second=245 amount=-1 +kerning first=334 second=256 amount=-4 +kerning first=241 second=102 amount=-1 +kerning first=76 second=122 amount=-3 +kerning first=277 second=102 amount=-2 +kerning first=366 second=245 amount=-2 +kerning first=90 second=80 amount=-1 +kerning first=330 second=245 amount=-2 +kerning first=8218 second=118 amount=-3 +kerning first=354 second=211 amount=-3 +kerning first=230 second=112 amount=-1 +kerning first=321 second=86 amount=-3 +kerning first=352 second=337 amount=-1 +kerning first=310 second=107 amount=-1 +kerning first=194 second=112 amount=-3 +kerning first=374 second=81 amount=-3 +kerning first=374 second=198 amount=-6 +kerning first=274 second=107 amount=-1 +kerning first=202 second=171 amount=-2 +kerning first=344 second=216 amount=-3 +kerning first=1061 second=1086 amount=-2 +kerning first=382 second=107 amount=-2 +kerning first=325 second=211 amount=-2 +kerning first=1025 second=1117 amount=-1 +kerning first=89 second=112 amount=-2 +kerning first=346 second=107 amount=-2 +kerning first=274 second=171 amount=-2 +kerning first=333 second=261 amount=-1 +kerning first=369 second=261 amount=-1 +kerning first=97 second=107 amount=-1 +kerning first=226 second=8221 amount=-3 +kerning first=200 second=216 amount=-1 +kerning first=356 second=105 amount=-2 +kerning first=8249 second=87 amount=-3 +kerning first=202 second=107 amount=-1 +kerning first=97 second=171 amount=-2 +kerning first=89 second=81 amount=-3 +kerning first=334 second=8221 amount=-2 +kerning first=1081 second=1072 amount=-1 +kerning first=346 second=100 amount=-1 +kerning first=313 second=67 amount=-1 +kerning first=307 second=235 amount=-1 +kerning first=1053 second=1098 amount=-1 +kerning first=290 second=209 amount=-1 +kerning first=212 second=105 amount=-1 +kerning first=266 second=336 amount=-3 +kerning first=1098 second=1074 amount=-1 +kerning first=248 second=105 amount=-1 +kerning first=379 second=235 amount=-1 +kerning first=1117 second=1072 amount=-1 +kerning first=374 second=112 amount=-2 +kerning first=266 second=81 amount=-3 +kerning first=66 second=251 amount=-3 +kerning first=376 second=203 amount=-1 +kerning first=310 second=171 amount=-4 +kerning first=338 second=112 amount=-2 +kerning first=346 second=171 amount=-3 +kerning first=8250 second=75 amount=-5 +kerning first=302 second=112 amount=-1 +kerning first=338 second=81 amount=-1 +kerning first=8249 second=354 amount=-3 +kerning first=382 second=171 amount=-3 +kerning first=313 second=296 amount=-2 +kerning first=266 second=112 amount=-3 +kerning first=302 second=81 amount=-2 +kerning first=1045 second=1041 amount=-1 +kerning first=102 second=251 amount=-1 +kerning first=379 second=228 amount=-1 +kerning first=250 second=275 amount=-1 +kerning first=108 second=353 amount=-2 +kerning first=243 second=251 amount=-1 +kerning first=1045 second=1079 amount=-1 +kerning first=207 second=251 amount=-2 +kerning first=84 second=230 amount=-5 +kerning first=269 second=249 amount=-2 +kerning first=89 second=379 amount=-3 +kerning first=97 second=100 amount=-1 +kerning first=76 second=204 amount=-2 +kerning first=305 second=249 amount=-1 +kerning first=8216 second=231 amount=-3 +kerning first=199 second=204 amount=-3 +kerning first=249 second=353 amount=-2 +kerning first=279 second=251 amount=-2 +kerning first=279 second=223 amount=-1 +kerning first=1071 second=1105 amount=-1 +kerning first=195 second=281 amount=-1 +kerning first=73 second=275 amount=-2 +kerning first=243 second=223 amount=-1 +kerning first=1107 second=1105 amount=-1 +kerning first=351 second=251 amount=-1 +kerning first=266 second=379 amount=-2 +kerning first=379 second=204 amount=-1 +kerning first=290 second=206 amount=-1 +kerning first=315 second=223 amount=-1 +kerning first=72 second=353 amount=-2 +kerning first=66 second=8249 amount=-3 +kerning first=363 second=365 amount=-1 +kerning first=102 second=223 amount=-1 +kerning first=304 second=268 amount=-2 +kerning first=382 second=339 amount=-1 +kerning first=76 second=211 amount=-1 +kerning first=369 second=230 amount=-1 +kerning first=66 second=223 amount=-3 +kerning first=268 second=268 amount=-3 +kerning first=376 second=268 amount=-3 +kerning first=310 second=339 amount=-2 +kerning first=8250 second=323 amount=-5 +kerning first=122 second=229 amount=-1 +kerning first=72 second=83 amount=-2 +kerning first=333 second=230 amount=-1 +kerning first=197 second=249 amount=-3 +kerning first=338 second=313 amount=-2 +kerning first=225 second=230 amount=-1 +kerning first=233 second=249 amount=-2 +kerning first=374 second=313 amount=-1 +kerning first=219 second=291 amount=-4 +kerning first=261 second=230 amount=-1 +kerning first=213 second=83 amount=-1 +kerning first=266 second=313 amount=-3 +kerning first=377 second=256 amount=-1 +kerning first=120 second=230 amount=-2 +kerning first=196 second=268 amount=-3 +kerning first=217 second=211 amount=-1 +kerning first=86 second=76 amount=-1 +kerning first=377 second=284 amount=-1 +kerning first=80 second=283 amount=-1 +kerning first=230 second=109 amount=-2 +kerning first=333 second=289 amount=-2 +kerning first=321 second=83 amount=-1 +kerning first=355 second=375 amount=-1 +kerning first=1097 second=1089 amount=-1 +kerning first=274 second=192 amount=-2 +kerning first=369 second=289 amount=-3 +kerning first=338 second=84 amount=-1 +kerning first=89 second=344 amount=-1 +kerning first=266 second=109 amount=-1 +kerning first=236 second=244 amount=-1 +kerning first=202 second=192 amount=-2 +kerning first=263 second=97 amount=-2 +kerning first=326 second=237 amount=-1 +kerning first=1024 second=1091 amount=-1 +kerning first=246 second=187 amount=-2 +kerning first=379 second=232 amount=-1 +kerning first=1060 second=1091 amount=-1 +kerning first=254 second=237 amount=-1 +kerning first=344 second=244 amount=-3 +kerning first=110 second=324 amount=-1 +kerning first=197 second=284 amount=-3 +kerning first=202 second=199 amount=-1 +kerning first=89 second=109 amount=-3 +kerning first=380 second=244 amount=-1 +kerning first=338 second=379 amount=-1 +kerning first=336 second=194 amount=-4 +kerning first=97 second=250 amount=-1 +kerning first=315 second=282 amount=-2 +kerning first=89 second=116 amount=-1 +kerning first=235 second=232 amount=-1 +kerning first=377 second=277 amount=-1 +kerning first=113 second=237 amount=-1 +kerning first=230 second=116 amount=-1 +kerning first=264 second=194 amount=-3 +kerning first=315 second=89 amount=-3 +kerning first=77 second=237 amount=-1 +kerning first=205 second=334 amount=-2 +kerning first=194 second=116 amount=-1 +kerning first=84 second=289 amount=-4 +kerning first=120 second=289 amount=-2 +kerning first=269 second=277 amount=-1 +kerning first=233 second=277 amount=-1 +kerning first=87 second=194 amount=-6 +kerning first=225 second=289 amount=-2 +kerning first=1056 second=1034 amount=-1 +kerning first=79 second=346 amount=-1 +kerning first=66 second=282 amount=-4 +kerning first=261 second=289 amount=-1 +kerning first=8216 second=259 amount=-3 +kerning first=230 second=351 amount=-2 +kerning first=279 second=254 amount=-2 +kerning first=8250 second=103 amount=-3 +kerning first=79 second=374 amount=-2 +kerning first=321 second=121 amount=-3 +kerning first=194 second=351 amount=-2 +kerning first=274 second=72 amount=-2 +kerning first=315 second=254 amount=-2 +kerning first=197 second=277 amount=-1 +kerning first=302 second=351 amount=-2 +kerning first=351 second=254 amount=-2 +kerning first=249 second=121 amount=-3 +kerning first=266 second=351 amount=-2 +kerning first=72 second=350 amount=-2 +kerning first=288 second=325 amount=-1 +kerning first=1071 second=1102 amount=-1 +kerning first=102 second=254 amount=4 +kerning first=382 second=367 amount=-2 +kerning first=1089 second=1095 amount=-1 +kerning first=321 second=350 amount=-1 +kerning first=108 second=121 amount=-3 +kerning first=274 second=367 amount=-2 +kerning first=1053 second=1095 amount=-1 +kerning first=213 second=350 amount=-1 +kerning first=72 second=121 amount=-2 +kerning first=310 second=367 amount=-3 +kerning first=1071 second=1074 amount=-1 +kerning first=89 second=351 amount=-3 +kerning first=243 second=254 amount=-1 +kerning first=233 second=305 amount=-2 +kerning first=202 second=367 amount=-2 +kerning first=1079 second=1096 amount=-1 +kerning first=122 second=117 amount=-2 +kerning first=315 second=213 amount=-1 +kerning first=197 second=305 amount=-1 +kerning first=338 second=344 amount=-2 +kerning first=274 second=199 amount=-1 +kerning first=225 second=261 amount=-1 +kerning first=274 second=79 amount=-1 +kerning first=86 second=117 amount=-2 +kerning first=1024 second=1119 amount=-1 +kerning first=305 second=305 amount=-1 +kerning first=374 second=344 amount=-1 +kerning first=332 second=366 amount=-1 +kerning first=261 second=261 amount=-1 +kerning first=97 second=367 amount=-1 +kerning first=227 second=117 amount=-1 +kerning first=269 second=305 amount=-2 +kerning first=67 second=260 amount=-3 +kerning first=202 second=79 amount=-1 +kerning first=1043 second=1096 amount=-2 +kerning first=377 second=76 amount=-1 +kerning first=66 second=254 amount=-3 +kerning first=377 second=305 amount=-1 +kerning first=208 second=260 amount=-4 +kerning first=249 second=114 amount=-1 +kerning first=374 second=351 amount=-3 +kerning first=256 second=374 amount=-6 +kerning first=338 second=351 amount=-1 +kerning first=263 second=117 amount=-2 +kerning first=81 second=192 amount=-4 +kerning first=280 second=260 amount=-2 +kerning first=84 second=261 amount=-5 +kerning first=310 second=79 amount=-3 +kerning first=371 second=117 amount=-1 +kerning first=1061 second=1089 amount=-2 +kerning first=252 second=44 amount=-2 +kerning first=209 second=117 amount=-2 +kerning first=266 second=344 amount=-3 +kerning first=356 second=379 amount=-3 +kerning first=120 second=261 amount=-2 +kerning first=202 second=72 amount=-2 +kerning first=241 second=228 amount=-1 +kerning first=346 second=192 amount=-4 +kerning first=219 second=337 amount=-2 +kerning first=194 second=316 amount=-2 +kerning first=103 second=291 amount=-2 +kerning first=377 second=336 amount=-1 +kerning first=283 second=311 amount=-2 +kerning first=363 second=361 amount=-1 +kerning first=230 second=316 amount=-3 +kerning first=67 second=291 amount=-3 +kerning first=366 second=44 amount=-5 +kerning first=313 second=362 amount=-3 +kerning first=266 second=316 amount=-1 +kerning first=78 second=337 amount=-2 +kerning first=245 second=361 amount=-1 +kerning first=363 second=337 amount=-1 +kerning first=253 second=382 amount=-3 +kerning first=338 second=316 amount=-1 +kerning first=313 second=331 amount=-1 +kerning first=327 second=337 amount=-2 +kerning first=289 second=382 amount=-3 +kerning first=106 second=311 amount=-1 +kerning first=232 second=271 amount=-1 +kerning first=291 second=337 amount=-2 +kerning first=115 second=8221 amount=-2 +kerning first=67 second=267 amount=-2 +kerning first=241 second=331 amount=-1 +kerning first=66 second=226 amount=-3 +kerning first=255 second=337 amount=-3 +kerning first=1046 second=1057 amount=-4 +kerning first=103 second=267 amount=-2 +kerning first=277 second=331 amount=-2 +kerning first=84 second=286 amount=-3 +kerning first=102 second=226 amount=-2 +kerning first=260 second=221 amount=-6 +kerning first=1104 second=1082 amount=-1 +kerning first=8222 second=119 amount=-3 +kerning first=288 second=310 amount=-1 +kerning first=330 second=266 amount=-2 +kerning first=100 second=331 amount=-1 +kerning first=366 second=266 amount=-1 +kerning first=1114 second=1087 amount=-1 +kerning first=255 second=361 amount=-1 +kerning first=83 second=221 amount=-3 +kerning first=258 second=266 amount=-3 +kerning first=1042 second=1056 amount=-2 +kerning first=1070 second=1037 amount=-1 +kerning first=219 second=361 amount=-1 +kerning first=327 second=361 amount=-2 +kerning first=1089 second=1119 amount=-1 +kerning first=291 second=361 amount=-1 +kerning first=1031 second=1101 amount=-1 +kerning first=199 second=207 amount=-3 +kerning first=377 second=45 amount=-3 +kerning first=1067 second=1101 amount=-1 +kerning first=283 second=227 amount=-2 +kerning first=377 second=252 amount=-3 +kerning first=337 second=44 amount=-3 +kerning first=197 second=252 amount=-3 +kerning first=119 second=104 amount=-2 +kerning first=221 second=201 amount=-1 +kerning first=233 second=252 amount=-2 +kerning first=83 second=104 amount=-2 +kerning first=269 second=252 amount=-2 +kerning first=354 second=246 amount=-3 +kerning first=355 second=227 amount=-1 +kerning first=8216 second=234 amount=-3 +kerning first=305 second=252 amount=-1 +kerning first=298 second=231 amount=-2 +kerning first=80 second=201 amount=-1 +kerning first=213 second=381 amount=-2 +kerning first=1090 second=1104 amount=-1 +kerning first=382 second=103 amount=-2 +kerning first=112 second=382 amount=-2 +kerning first=213 second=90 amount=-2 +kerning first=207 second=226 amount=-2 +kerning first=346 second=103 amount=-3 +kerning first=8250 second=72 amount=-5 +kerning first=321 second=90 amount=-3 +kerning first=243 second=226 amount=-1 +kerning first=310 second=103 amount=-2 +kerning first=352 second=291 amount=-3 +kerning first=217 second=382 amount=-3 +kerning first=321 second=381 amount=-3 +kerning first=8250 second=363 amount=-1 +kerning first=316 second=291 amount=-3 +kerning first=197 second=336 amount=-3 +kerning first=216 second=317 amount=-2 +kerning first=266 second=84 amount=-1 +kerning first=262 second=78 amount=-3 +kerning first=105 second=246 amount=-1 +kerning first=1064 second=1081 amount=-1 +kerning first=280 second=291 amount=-3 +kerning first=379 second=207 amount=-1 +kerning first=106 second=227 amount=-2 +kerning first=197 second=45 amount=-4 +kerning first=351 second=226 amount=-1 +kerning first=202 second=103 amount=-3 +kerning first=244 second=291 amount=-2 +kerning first=66 second=105 amount=-3 +kerning first=288 second=317 amount=-1 +kerning first=194 second=84 amount=-6 +kerning first=208 second=291 amount=-1 +kerning first=269 second=45 amount=-2 +kerning first=97 second=103 amount=-2 +kerning first=232 second=243 amount=-1 +kerning first=374 second=288 amount=-3 +kerning first=268 second=243 amount=-2 +kerning first=66 second=198 amount=-5 +kerning first=111 second=314 amount=-2 +kerning first=1092 second=1090 amount=-1 +kerning first=304 second=243 amount=-2 +kerning first=344 second=213 amount=-3 +kerning first=1070 second=1065 amount=-1 +kerning first=75 second=314 amount=-1 +kerning first=83 second=193 amount=-4 +kerning first=266 second=288 amount=-3 +kerning first=1086 second=1096 amount=-1 +kerning first=282 second=218 amount=-2 +kerning first=332 second=193 amount=-4 +kerning first=338 second=288 amount=-1 +kerning first=288 second=314 amount=-1 +kerning first=75 second=345 amount=1 +kerning first=316 second=263 amount=-1 +kerning first=328 second=249 amount=-1 +kerning first=302 second=288 amount=-2 +kerning first=252 second=314 amount=-2 +kerning first=111 second=345 amount=-1 +kerning first=352 second=263 amount=-1 +kerning first=210 second=218 amount=-1 +kerning first=8220 second=347 amount=-2 +kerning first=121 second=8249 amount=-4 +kerning first=67 second=263 amount=-2 +kerning first=327 second=365 amount=-2 +kerning first=324 second=314 amount=-1 +kerning first=307 second=115 amount=-2 +kerning first=227 second=120 amount=-1 +kerning first=103 second=263 amount=-2 +kerning first=291 second=365 amount=-1 +kerning first=288 second=78 amount=-1 +kerning first=277 second=303 amount=-2 +kerning first=199 second=115 amount=-2 +kerning first=263 second=120 amount=-2 +kerning first=252 second=345 amount=-1 +kerning first=255 second=365 amount=-1 +kerning first=70 second=224 amount=-1 +kerning first=368 second=193 amount=-4 +kerning first=85 second=8249 amount=-5 +kerning first=313 second=303 amount=-2 +kerning first=235 second=115 amount=-2 +kerning first=219 second=365 amount=-1 +kerning first=236 second=269 amount=-1 +kerning first=216 second=78 amount=-2 +kerning first=376 second=243 amount=-3 +kerning first=344 second=269 amount=-3 +kerning first=321 second=353 amount=-1 +kerning first=106 second=224 amount=-2 +kerning first=232 second=326 amount=-2 +kerning first=86 second=120 amount=-2 +kerning first=377 second=73 amount=-1 +kerning first=380 second=335 amount=-1 +kerning first=200 second=213 amount=-1 +kerning first=379 second=115 amount=-2 +kerning first=122 second=120 amount=-1 +kerning first=380 second=269 amount=-1 +kerning first=211 second=224 amount=-1 +kerning first=315 second=198 amount=-2 +kerning first=274 second=75 amount=-2 +kerning first=283 second=224 amount=-2 +kerning first=321 second=118 amount=-3 +kerning first=370 second=8249 amount=-5 +kerning first=255 second=98 amount=-1 +kerning first=78 second=46 amount=-1 +kerning first=202 second=75 amount=-2 +kerning first=303 second=365 amount=-1 +kerning first=355 second=224 amount=-1 +kerning first=1045 second=1048 amount=-1 +kerning first=205 second=303 amount=-1 +kerning first=83 second=101 amount=-1 +kerning first=335 second=120 amount=-3 +kerning first=227 second=328 amount=-1 +kerning first=334 second=8249 amount=-1 +kerning first=241 second=303 amount=-1 +kerning first=119 second=101 amount=-3 +kerning first=377 second=221 amount=-2 +kerning first=371 second=120 amount=-1 +kerning first=226 second=8249 amount=-2 +kerning first=100 second=303 amount=-1 +kerning first=199 second=235 amount=-2 +kerning first=332 second=221 amount=-2 +kerning first=122 second=328 amount=-2 +kerning first=346 second=75 amount=-3 +kerning first=262 second=8249 amount=-4 +kerning first=8217 second=355 amount=-1 +kerning first=224 second=101 amount=-1 +kerning first=235 second=235 amount=-1 +kerning first=1045 second=1076 amount=-2 +kerning first=249 second=118 amount=-3 +kerning first=86 second=328 amount=-3 +kerning first=380 second=241 amount=-2 +kerning first=260 second=101 amount=-1 +kerning first=8222 second=122 amount=-3 +kerning first=371 second=328 amount=-2 +kerning first=45 second=325 amount=-5 +kerning first=296 second=101 amount=-2 +kerning first=202 second=370 amount=-2 +kerning first=1101 second=1118 amount=-1 +kerning first=335 second=328 amount=-1 +kerning first=81 second=325 amount=-2 +kerning first=106 second=283 amount=-1 +kerning first=1056 second=1031 amount=-1 +kerning first=310 second=370 amount=-2 +kerning first=108 second=118 amount=-3 +kerning first=368 second=101 amount=-2 +kerning first=70 second=283 amount=-1 +kerning first=274 second=370 amount=-2 +kerning first=354 second=218 amount=-1 +kerning first=72 second=118 amount=-2 +kerning first=263 second=328 amount=-2 +kerning first=236 second=241 amount=-2 +kerning first=222 second=325 amount=-2 +kerning first=291 second=98 amount=-1 +kerning first=283 second=283 amount=-1 +kerning first=379 second=241 amount=-1 +kerning first=363 second=98 amount=-2 +kerning first=269 second=263 amount=-1 +kerning first=252 second=335 amount=-1 +kerning first=317 second=338 amount=-1 +kerning first=362 second=283 amount=-2 +kerning first=77 second=290 amount=-2 +kerning first=99 second=8220 amount=-2 +kerning first=1024 second=1045 amount=-1 +kerning first=278 second=108 amount=-1 +kerning first=366 second=241 amount=-2 +kerning first=317 second=85 amount=-3 +kerning first=1060 second=1045 amount=-1 +kerning first=242 second=108 amount=-2 +kerning first=1027 second=1114 amount=-2 +kerning first=209 second=338 amount=-2 +kerning first=350 second=108 amount=-2 +kerning first=314 second=289 amount=-3 +kerning first=75 second=335 amount=-2 +kerning first=117 second=241 amount=-1 +kerning first=72 second=363 amount=-2 +kerning first=314 second=108 amount=-2 +kerning first=241 second=380 amount=-1 +kerning first=8217 second=365 amount=-1 +kerning first=245 second=345 amount=-1 +kerning first=83 second=196 amount=-4 +kerning first=277 second=380 amount=-2 +kerning first=1049 second=1090 amount=-1 +kerning first=90 second=193 amount=-1 +kerning first=281 second=345 amount=-1 +kerning first=313 second=380 amount=-3 +kerning first=1060 second=1038 amount=-3 +kerning first=65 second=368 amount=-3 +kerning first=206 second=115 amount=-2 +kerning first=353 second=345 amount=-1 +kerning first=330 second=248 amount=-2 +kerning first=352 second=352 amount=-1 +kerning first=281 second=283 amount=-1 +kerning first=65 second=115 amount=-2 +kerning first=100 second=380 amount=-1 +kerning first=352 second=228 amount=-1 +kerning first=371 second=331 amount=-2 +kerning first=101 second=115 amount=-2 +kerning first=45 second=241 amount=-2 +kerning first=258 second=248 amount=-1 +kerning first=263 second=331 amount=-2 +kerning first=70 second=286 amount=-1 +kerning first=314 second=115 amount=-2 +kerning first=117 second=248 amount=-1 +kerning first=350 second=115 amount=-1 +kerning first=278 second=368 amount=-2 +kerning first=221 second=366 amount=-1 +kerning first=242 second=115 amount=-2 +kerning first=67 second=323 amount=-3 +kerning first=101 second=108 amount=-3 +kerning first=227 second=331 amount=-1 +kerning first=317 second=78 amount=-2 +kerning first=278 second=115 amount=-1 +kerning first=1024 second=1038 amount=-3 +kerning first=65 second=108 amount=-2 +kerning first=86 second=331 amount=-3 +kerning first=240 second=255 amount=-3 +kerning first=83 second=122 amount=-2 +kerning first=106 second=252 amount=-1 +kerning first=204 second=255 amount=-2 +kerning first=213 second=200 amount=-2 +kerning first=208 second=323 amount=-2 +kerning first=99 second=255 amount=-2 +kerning first=350 second=368 amount=-3 +kerning first=229 second=307 amount=-1 +kerning first=106 second=231 amount=-1 +kerning first=1042 second=1052 amount=-2 +kerning first=280 second=323 amount=-2 +kerning first=224 second=122 amount=-1 +kerning first=337 second=307 amount=-1 +kerning first=321 second=200 amount=-2 +kerning first=119 second=122 amount=-3 +kerning first=70 second=231 amount=-1 +kerning first=8220 second=260 amount=-8 +kerning first=1104 second=1085 amount=-1 +kerning first=234 second=328 amount=-2 +kerning first=213 second=207 amount=-2 +kerning first=88 second=245 amount=-2 +kerning first=362 second=290 amount=-1 +kerning first=198 second=328 amount=-1 +kerning first=187 second=366 amount=-4 +kerning first=1031 second=1097 amount=-1 +kerning first=1072 second=1118 amount=-1 +kerning first=376 second=346 amount=-3 +kerning first=256 second=214 amount=-3 +kerning first=1067 second=1097 amount=-1 +kerning first=1092 second=1080 amount=-1 +kerning first=1036 second=1118 amount=-2 +kerning first=321 second=207 amount=-2 +kerning first=82 second=366 amount=-3 +kerning first=1070 second=1040 amount=-3 +kerning first=86 second=352 amount=-3 +kerning first=378 second=328 amount=-2 +kerning first=311 second=233 amount=-3 +kerning first=218 second=290 amount=-1 +kerning first=283 second=252 amount=-2 +kerning first=229 second=326 amount=-1 +kerning first=218 second=283 amount=-2 +kerning first=275 second=233 amount=-1 +kerning first=229 second=245 amount=-1 +kerning first=1038 second=1073 amount=-3 +kerning first=193 second=245 amount=-1 +kerning first=1052 second=1105 amount=-1 +kerning first=355 second=252 amount=-1 +kerning first=113 second=283 amount=-1 +kerning first=332 second=217 amount=-1 +kerning first=218 second=257 amount=-3 +kerning first=331 second=106 amount=-2 +kerning first=367 second=106 amount=-2 +kerning first=111 second=110 amount=-1 +kerning first=316 second=324 amount=-1 +kerning first=259 second=106 amount=-1 +kerning first=377 second=333 amount=-1 +kerning first=295 second=106 amount=-2 +kerning first=82 second=113 amount=-3 +kerning first=197 second=333 amount=-1 +kerning first=321 second=378 amount=-3 +kerning first=370 second=281 amount=-2 +kerning first=86 second=65 amount=-6 +kerning first=252 second=110 amount=-1 +kerning first=201 second=87 amount=-1 +kerning first=67 second=288 amount=-3 +kerning first=98 second=107 amount=-1 +kerning first=233 second=333 amount=-1 +kerning first=324 second=110 amount=-1 +kerning first=204 second=262 amount=-2 +kerning first=80 second=198 amount=-4 +kerning first=201 second=347 amount=-1 +kerning first=226 second=281 amount=-1 +kerning first=8218 second=374 amount=-6 +kerning first=262 second=281 amount=-2 +kerning first=1100 second=1078 amount=-2 +kerning first=83 second=217 amount=-3 +kerning first=298 second=281 amount=-2 +kerning first=221 second=198 amount=-6 +kerning first=278 second=210 amount=-1 +kerning first=354 second=243 amount=-3 +kerning first=66 second=120 amount=-3 +kerning first=280 second=288 amount=-1 +kerning first=251 second=326 amount=-1 +kerning first=85 second=281 amount=-2 +kerning first=206 second=210 amount=-2 +kerning first=105 second=243 amount=-1 +kerning first=99 second=361 amount=-2 +kerning first=202 second=218 amount=-2 +kerning first=287 second=326 amount=-1 +kerning first=121 second=281 amount=-3 +kerning first=262 second=274 amount=-3 +kerning first=241 second=120 amount=-1 +kerning first=1042 second=1031 amount=-2 +kerning first=277 second=120 amount=-2 +kerning first=350 second=203 amount=-3 +kerning first=100 second=99 amount=-1 +kerning first=278 second=203 amount=-2 +kerning first=205 second=99 amount=-2 +kerning first=100 second=120 amount=-1 +kerning first=228 second=229 amount=-1 +kerning first=315 second=304 amount=-2 +kerning first=366 second=248 amount=-2 +kerning first=334 second=274 amount=-2 +kerning first=87 second=229 amount=-5 +kerning first=277 second=99 amount=-1 +kerning first=198 second=377 amount=-1 +kerning first=259 second=113 amount=-1 +kerning first=307 second=118 amount=-3 +kerning first=316 second=267 amount=-1 +kerning first=336 second=229 amount=-1 +kerning first=288 second=75 amount=-1 +kerning first=352 second=267 amount=-1 +kerning first=120 second=8249 amount=-3 +kerning first=187 second=345 amount=-2 +kerning first=1085 second=1077 amount=-1 +kerning first=379 second=118 amount=-2 +kerning first=264 second=229 amount=-2 +kerning first=118 second=113 amount=-3 +kerning first=216 second=75 amount=-2 +kerning first=332 second=196 amount=-4 +kerning first=1049 second=1077 amount=-1 +kerning first=367 second=113 amount=-1 +kerning first=223 second=106 amount=-2 +kerning first=235 second=118 amount=-2 +kerning first=82 second=106 amount=-1 +kerning first=381 second=87 amount=-2 +kerning first=209 second=332 amount=-2 +kerning first=198 second=68 amount=-2 +kerning first=199 second=118 amount=-1 +kerning first=321 second=316 amount=-2 +kerning first=240 second=8220 amount=-2 +kerning first=118 second=106 amount=-2 +kerning first=317 second=332 amount=-1 +kerning first=376 second=264 amount=-3 +kerning first=376 second=209 amount=-1 +kerning first=106 second=287 amount=-3 +kerning first=249 second=365 amount=-1 +kerning first=108 second=111 amount=-1 +kerning first=90 second=199 amount=-1 +kerning first=70 second=287 amount=-3 +kerning first=304 second=264 amount=-2 +kerning first=211 second=287 amount=-1 +kerning first=66 second=219 amount=-3 +kerning first=268 second=264 amount=-3 +kerning first=195 second=199 amount=-3 +kerning first=268 second=209 amount=-3 +kerning first=66 second=121 amount=-3 +kerning first=283 second=287 amount=-3 +kerning first=196 second=264 amount=-3 +kerning first=352 second=224 amount=-1 +kerning first=377 second=347 amount=-2 +kerning first=1024 second=1094 amount=-1 +kerning first=362 second=234 amount=-2 +kerning first=233 second=8217 amount=-2 +kerning first=355 second=287 amount=-2 +kerning first=117 second=242 amount=-1 +kerning first=269 second=8217 amount=-2 +kerning first=258 second=242 amount=-1 +kerning first=77 second=289 amount=-3 +kerning first=65 second=374 amount=-6 +kerning first=274 second=82 amount=-2 +kerning first=347 second=314 amount=-2 +kerning first=101 second=121 amount=-2 +kerning first=259 second=8221 amount=-3 +kerning first=330 second=242 amount=-2 +kerning first=65 second=121 amount=-3 +kerning first=195 second=364 amount=-3 +kerning first=218 second=289 amount=-4 +kerning first=346 second=82 amount=-3 +kerning first=249 second=111 amount=-1 +kerning first=116 second=254 amount=-1 +kerning first=254 second=289 amount=-2 +kerning first=88 second=244 amount=-2 +kerning first=352 second=223 amount=-1 +kerning first=366 second=242 amount=-2 +kerning first=76 second=119 amount=-3 +kerning first=290 second=289 amount=-3 +kerning first=112 second=119 amount=-2 +kerning first=326 second=289 amount=-2 +kerning first=290 second=73 amount=-1 +kerning first=366 second=67 amount=-1 +kerning first=278 second=197 amount=-2 +kerning first=257 second=254 amount=-1 +kerning first=362 second=289 amount=-4 +kerning first=229 second=244 amount=-1 +kerning first=202 second=82 amount=-2 +kerning first=8218 second=381 amount=-1 +kerning first=355 second=230 amount=-1 +kerning first=217 second=119 amount=-2 +kerning first=350 second=197 amount=-4 +kerning first=231 second=97 amount=-2 +kerning first=262 second=76 amount=-3 +kerning first=253 second=119 amount=-1 +kerning first=8217 second=99 amount=-3 +kerning first=201 second=354 amount=-1 +kerning first=90 second=97 amount=-1 +kerning first=283 second=230 amount=-2 +kerning first=289 second=119 amount=-1 +kerning first=378 second=117 amount=-2 +kerning first=350 second=121 amount=-2 +kerning first=339 second=97 amount=-2 +kerning first=211 second=230 amount=-1 +kerning first=317 second=72 amount=-2 +kerning first=344 second=275 amount=-3 +kerning first=314 second=121 amount=-3 +kerning first=219 second=74 amount=-3 +kerning first=84 second=205 amount=-1 +kerning first=286 second=250 amount=-1 +kerning first=380 second=275 amount=-1 +kerning first=267 second=97 amount=-2 +kerning first=106 second=230 amount=-2 +kerning first=381 second=354 amount=-2 +kerning first=242 second=121 amount=-3 +kerning first=303 second=97 amount=-2 +kerning first=206 second=121 amount=-2 +kerning first=327 second=74 amount=-1 +kerning first=1051 second=1108 amount=-1 +kerning first=232 second=311 amount=-2 +kerning first=260 second=107 amount=-2 +kerning first=109 second=250 amount=-1 +kerning first=108 second=378 amount=-1 +kerning first=224 second=107 amount=-1 +kerning first=311 second=240 amount=-3 +kerning first=334 second=366 amount=-1 +kerning first=250 second=250 amount=-1 +kerning first=249 second=378 amount=-2 +kerning first=213 second=378 amount=-2 +kerning first=198 second=117 amount=-2 +kerning first=83 second=107 amount=-2 +kerning first=315 second=219 amount=-3 +kerning first=68 second=72 amount=-2 +kerning first=202 second=89 amount=-1 +kerning first=73 second=250 amount=-2 +kerning first=72 second=378 amount=-1 +kerning first=334 second=76 amount=-2 +kerning first=234 second=117 amount=-2 +kerning first=119 second=107 amount=-2 +kerning first=75 second=116 amount=-1 +kerning first=274 second=363 amount=-2 +kerning first=99 second=318 amount=-3 +kerning first=338 second=302 amount=-2 +kerning first=8220 second=267 amount=-3 +kerning first=310 second=363 amount=-3 +kerning first=379 second=355 amount=-1 +kerning first=346 second=363 amount=-1 +kerning first=334 second=330 amount=-2 +kerning first=356 second=355 amount=-1 +kerning first=111 second=116 amount=-1 +kerning first=286 second=194 amount=-3 +kerning first=382 second=363 amount=-2 +kerning first=187 second=310 amount=-5 +kerning first=240 second=318 amount=-2 +kerning first=8222 second=221 amount=-6 +kerning first=275 second=240 amount=-1 +kerning first=214 second=194 amount=-4 +kerning first=1025 second=1114 amount=-1 +kerning first=1075 second=1089 amount=-1 +kerning first=201 second=298 amount=-2 +kerning first=314 second=375 amount=-3 +kerning first=305 second=259 amount=-1 +kerning first=76 second=214 amount=-1 +kerning first=248 second=259 amount=-1 +kerning first=269 second=259 amount=-2 +kerning first=368 second=122 amount=-3 +kerning first=1039 second=1088 amount=-1 +kerning first=217 second=214 amount=-1 +kerning first=242 second=375 amount=-3 +kerning first=332 second=122 amount=-2 +kerning first=206 second=375 amount=-2 +kerning first=200 second=220 amount=-2 +kerning first=89 second=369 amount=-2 +kerning first=296 second=122 amount=-1 +kerning first=252 second=116 amount=-1 +kerning first=71 second=296 amount=-1 +kerning first=262 second=330 amount=-3 +kerning first=334 second=77 amount=-2 +kerning first=1057 second=1075 amount=-1 +kerning first=233 second=259 amount=-2 +kerning first=262 second=77 amount=-3 +kerning first=350 second=375 amount=-2 +kerning first=344 second=220 amount=-3 +kerning first=86 second=71 amount=-3 +kerning first=365 second=253 amount=-3 +kerning first=374 second=369 amount=-2 +kerning first=222 second=304 amount=-2 +kerning first=73 second=251 amount=-2 +kerning first=377 second=237 amount=-1 +kerning first=338 second=369 amount=-2 +kerning first=1043 second=1100 amount=-2 +kerning first=352 second=344 amount=-3 +kerning first=212 second=296 amount=-2 +kerning first=307 second=228 amount=-2 +kerning first=66 second=279 amount=-1 +kerning first=323 second=351 amount=-2 +kerning first=1079 second=1100 amount=-1 +kerning first=277 second=324 amount=-2 +kerning first=1086 second=1099 amount=-1 +kerning first=278 second=374 amount=-1 +kerning first=235 second=228 amount=-2 +kerning first=241 second=324 amount=-1 +kerning first=230 second=369 amount=-2 +kerning first=250 second=251 amount=-1 +kerning first=101 second=375 amount=-2 +kerning first=194 second=369 amount=-3 +kerning first=119 second=245 amount=-3 +kerning first=208 second=344 amount=-2 +kerning first=8216 second=255 amount=-1 +kerning first=356 second=296 amount=-1 +kerning first=81 second=304 amount=-2 +kerning first=65 second=375 amount=-3 +kerning first=302 second=369 amount=-2 +kerning first=1052 second=1104 amount=-1 +kerning first=100 second=324 amount=-1 +kerning first=84 second=206 amount=-1 +kerning first=266 second=369 amount=-2 +kerning first=251 second=273 amount=-1 +kerning first=280 second=344 amount=-2 +kerning first=286 second=251 amount=-1 +kerning first=376 second=240 amount=-3 +kerning first=113 second=234 amount=-1 +kerning first=327 second=284 amount=-2 +kerning first=279 second=279 amount=-1 +kerning first=107 second=355 amount=-1 +kerning first=68 second=85 amount=-1 +kerning first=218 second=234 amount=-2 +kerning first=116 second=253 amount=-1 +kerning first=67 second=344 amount=-3 +kerning first=221 second=253 amount=-3 +kerning first=381 second=298 amount=-1 +kerning first=97 second=363 amount=-1 +kerning first=102 second=279 amount=-1 +kerning first=257 second=253 amount=-3 +kerning first=219 second=284 amount=-1 +kerning first=313 second=324 amount=-1 +kerning first=248 second=355 amount=-1 +kerning first=79 second=83 amount=-1 +kerning first=78 second=284 amount=-2 +kerning first=202 second=363 amount=-2 +kerning first=77 second=234 amount=-2 +kerning first=207 second=279 amount=-2 +kerning first=1072 second=1080 amount=-1 +kerning first=1057 second=1074 amount=-1 +kerning first=233 second=318 amount=-3 +kerning first=107 second=365 amount=-1 +kerning first=84 second=268 amount=-3 +kerning first=269 second=318 amount=-3 +kerning first=71 second=365 amount=-1 +kerning first=220 second=83 amount=-3 +kerning first=291 second=355 amount=-1 +kerning first=89 second=310 amount=-1 +kerning first=66 second=213 amount=-3 +kerning first=305 second=318 amount=-1 +kerning first=336 second=298 amount=-2 +kerning first=256 second=83 amount=-3 +kerning first=255 second=355 amount=-1 +kerning first=207 second=213 amount=-2 +kerning first=74 second=263 amount=-2 +kerning first=195 second=370 amount=-3 +kerning first=187 second=313 amount=-5 +kerning first=364 second=83 amount=-3 +kerning first=266 second=310 amount=-3 +kerning first=1047 second=1063 amount=-3 +kerning first=76 second=218 amount=-3 +kerning first=363 second=355 amount=-1 +kerning first=66 second=275 amount=-1 +kerning first=66 second=220 amount=-3 +kerning first=1078 second=1105 amount=-2 +kerning first=212 second=303 amount=-1 +kerning first=102 second=275 amount=-1 +kerning first=328 second=353 amount=-1 +kerning first=248 second=303 amount=-1 +kerning first=364 second=353 amount=-2 +kerning first=356 second=365 amount=-2 +kerning first=1070 second=1055 amount=-1 +kerning first=374 second=310 amount=-1 +kerning first=211 second=8249 amount=-1 +kerning first=338 second=310 amount=-2 +kerning first=115 second=353 amount=-3 +kerning first=284 second=365 amount=-1 +kerning first=1053 second=1060 amount=-1 +kerning first=356 second=303 amount=-2 +kerning first=248 second=365 amount=-1 +kerning first=101 second=365 amount=-2 +kerning first=379 second=82 amount=-1 +kerning first=220 second=353 amount=-2 +kerning first=256 second=353 amount=-2 +kerning first=240 second=8250 amount=-2 +kerning first=284 second=98 amount=-1 +kerning first=334 second=280 amount=-2 +kerning first=100 second=105 amount=-1 +kerning first=192 second=235 amount=-1 +kerning first=379 second=225 amount=-1 +kerning first=228 second=235 amount=-1 +kerning first=1024 second=1095 amount=-2 +kerning first=71 second=102 amount=-2 +kerning first=264 second=235 amount=-2 +kerning first=1086 second=1093 amount=-1 +kerning first=1073 second=1083 amount=-2 +kerning first=336 second=228 amount=-1 +kerning first=303 second=361 amount=-1 +kerning first=199 second=225 amount=-2 +kerning first=107 second=98 amount=-1 +kerning first=235 second=225 amount=-2 +kerning first=248 second=98 amount=-1 +kerning first=264 second=228 amount=-2 +kerning first=1086 second=1100 amount=-1 +kerning first=8218 second=375 amount=-1 +kerning first=79 second=350 amount=-1 +kerning first=228 second=228 amount=-1 +kerning first=90 second=363 amount=-3 +kerning first=316 second=273 amount=-1 +kerning first=284 second=102 amount=-2 +kerning first=241 second=46 amount=-1 +kerning first=1114 second=1102 amount=-1 +kerning first=1046 second=1063 amount=-4 +kerning first=1101 second=1078 amount=-1 +kerning first=277 second=46 amount=-3 +kerning first=195 second=363 amount=-3 +kerning first=87 second=228 amount=-4 +kerning first=356 second=102 amount=-1 +kerning first=107 second=44 amount=-1 +kerning first=231 second=363 amount=-2 +kerning first=99 second=305 amount=-2 +kerning first=346 second=311 amount=-2 +kerning first=1045 second=1081 amount=-1 +kerning first=267 second=363 amount=-2 +kerning first=240 second=305 amount=-1 +kerning first=1107 second=1108 amount=-1 +kerning first=303 second=363 amount=-1 +kerning first=103 second=273 amount=-2 +kerning first=204 second=305 amount=-1 +kerning first=1071 second=1108 amount=-1 +kerning first=339 second=363 amount=-2 +kerning first=8250 second=345 amount=-2 +kerning first=74 second=260 amount=-5 +kerning first=262 second=280 amount=-3 +kerning first=375 second=363 amount=-1 +kerning first=248 second=102 amount=-1 +kerning first=1038 second=1054 amount=-3 +kerning first=367 second=112 amount=-2 +kerning first=1024 second=1107 amount=-1 +kerning first=198 second=67 amount=-1 +kerning first=260 second=211 amount=-3 +kerning first=331 second=112 amount=-1 +kerning first=376 second=261 amount=-5 +kerning first=207 second=216 amount=-2 +kerning first=296 second=211 amount=-2 +kerning first=79 second=86 amount=-2 +kerning first=295 second=112 amount=-1 +kerning first=68 second=171 amount=-1 +kerning first=104 second=171 amount=-3 +kerning first=303 second=107 amount=-1 +kerning first=223 second=112 amount=-1 +kerning first=350 second=243 amount=-1 +kerning first=267 second=107 amount=-2 +kerning first=187 second=112 amount=-2 +kerning first=381 second=81 amount=-1 +kerning first=8220 second=287 amount=-4 +kerning first=232 second=261 amount=-2 +kerning first=256 second=86 amount=-6 +kerning first=375 second=107 amount=-2 +kerning first=118 second=112 amount=-2 +kerning first=268 second=261 amount=-2 +kerning first=66 second=216 amount=-3 +kerning first=339 second=107 amount=-2 +kerning first=82 second=112 amount=-1 +kerning first=304 second=261 amount=-2 +kerning first=368 second=211 amount=-1 +kerning first=243 second=345 amount=-1 +kerning first=317 second=171 amount=-1 +kerning first=354 second=232 amount=-3 +kerning first=278 second=204 amount=-2 +kerning first=353 second=171 amount=-1 +kerning first=377 second=346 amount=-1 +kerning first=224 second=279 amount=-1 +kerning first=313 second=105 amount=-2 +kerning first=350 second=204 amount=-3 +kerning first=84 second=209 amount=-1 +kerning first=198 second=327 amount=-2 +kerning first=339 second=100 amount=-1 +kerning first=315 second=216 amount=-1 +kerning first=286 second=254 amount=-1 +kerning first=8250 second=82 amount=-5 +kerning first=241 second=105 amount=-1 +kerning first=375 second=100 amount=-3 +kerning first=277 second=105 amount=-2 +kerning first=209 second=171 amount=-4 +kerning first=327 second=263 amount=-2 +kerning first=201 second=81 amount=-1 +kerning first=1024 second=1098 amount=-3 +kerning first=205 second=105 amount=-1 +kerning first=1043 second=1103 amount=-4 +kerning first=195 second=100 amount=-1 +kerning first=254 second=230 amount=-1 +kerning first=231 second=100 amount=-1 +kerning first=113 second=230 amount=-2 +kerning first=1074 second=1079 amount=-1 +kerning first=267 second=100 amount=-1 +kerning first=86 second=346 amount=-3 +kerning first=303 second=100 amount=-3 +kerning first=204 second=249 amount=-1 +kerning first=279 second=275 amount=-1 +kerning first=77 second=230 amount=-2 +kerning first=1038 second=1079 amount=-3 +kerning first=90 second=100 amount=-1 +kerning first=207 second=275 amount=-2 +kerning first=1079 second=1103 amount=-2 +kerning first=236 second=223 amount=-1 +kerning first=281 second=339 amount=-1 +kerning first=231 second=107 amount=-2 +kerning first=264 second=78 amount=-3 +kerning first=195 second=107 amount=-2 +kerning first=209 second=339 amount=-2 +kerning first=362 second=230 amount=-3 +kerning first=1060 second=1039 amount=-1 +kerning first=99 second=249 amount=-2 +kerning first=290 second=230 amount=-1 +kerning first=200 second=223 amount=-1 +kerning first=1024 second=1039 amount=-1 +kerning first=326 second=230 amount=-1 +kerning first=242 second=114 amount=-1 +kerning first=367 second=109 amount=-1 +kerning first=83 second=325 amount=-3 +kerning first=67 second=69 amount=-3 +kerning first=331 second=109 amount=-1 +kerning first=317 second=79 amount=-1 +kerning first=375 second=104 amount=-2 +kerning first=201 second=84 amount=-1 +kerning first=81 second=44 amount=-3 +kerning first=256 second=89 amount=-6 +kerning first=339 second=104 amount=-2 +kerning first=1097 second=1104 amount=-1 +kerning first=223 second=109 amount=-1 +kerning first=101 second=114 amount=-1 +kerning first=1061 second=1104 amount=-2 +kerning first=381 second=84 amount=-2 +kerning first=187 second=109 amount=-2 +kerning first=353 second=119 amount=-3 +kerning first=355 second=237 amount=-1 +kerning first=118 second=314 amount=-2 +kerning first=295 second=109 amount=-1 +kerning first=79 second=89 amount=-2 +kerning first=82 second=314 amount=-3 +kerning first=1052 second=1108 amount=-1 +kerning first=90 second=192 amount=-1 +kerning first=283 second=237 amount=-2 +kerning first=223 second=314 amount=-2 +kerning first=1089 second=1116 amount=-1 +kerning first=330 second=44 amount=-1 +kerning first=377 second=262 amount=-1 +kerning first=290 second=72 amount=-1 +kerning first=187 second=314 amount=-1 +kerning first=1053 second=1116 amount=-1 +kerning first=327 second=8249 amount=-4 +kerning first=211 second=237 amount=-1 +kerning first=295 second=314 amount=-1 +kerning first=118 second=109 amount=-2 +kerning first=102 second=269 amount=-1 +kerning first=325 second=336 amount=-2 +kerning first=259 second=314 amount=-1 +kerning first=275 second=187 amount=-2 +kerning first=255 second=8249 amount=-4 +kerning first=66 second=269 amount=-1 +kerning first=378 second=245 amount=-1 +kerning first=106 second=237 amount=-1 +kerning first=367 second=314 amount=-2 +kerning first=228 second=232 amount=-1 +kerning first=303 second=104 amount=-1 +kerning first=114 second=8249 amount=-1 +kerning first=207 second=269 amount=-2 +kerning first=331 second=314 amount=-1 +kerning first=267 second=104 amount=-2 +kerning first=272 second=282 amount=-2 +kerning first=356 second=99 amount=-3 +kerning first=117 second=44 amount=-2 +kerning first=77 second=224 amount=-2 +kerning first=231 second=104 amount=-2 +kerning first=279 second=269 amount=-1 +kerning first=98 second=380 amount=-2 +kerning first=264 second=232 amount=-2 +kerning first=195 second=104 amount=-2 +kerning first=200 second=282 amount=-2 +kerning first=98 second=187 amount=-2 +kerning first=222 second=44 amount=-3 +kerning first=262 second=277 amount=-2 +kerning first=214 second=344 amount=-2 +kerning first=109 second=257 amount=-1 +kerning first=377 second=317 amount=-1 +kerning first=226 second=277 amount=-1 +kerning first=284 second=302 amount=-1 +kerning first=113 second=224 amount=-2 +kerning first=74 second=326 amount=-1 +kerning first=201 second=351 amount=-1 +kerning first=254 second=224 amount=-1 +kerning first=110 second=326 amount=-1 +kerning first=298 second=277 amount=-2 +kerning first=212 second=302 amount=-2 +kerning first=218 second=224 amount=-3 +kerning first=87 second=232 amount=-3 +kerning first=381 second=347 amount=-2 +kerning first=85 second=277 amount=-2 +kerning first=326 second=224 amount=-1 +kerning first=71 second=361 amount=-1 +kerning first=108 second=371 amount=-2 +kerning first=290 second=224 amount=-1 +kerning first=71 second=302 amount=-1 +kerning first=375 second=367 amount=-1 +kerning first=363 second=8249 amount=-2 +kerning first=268 second=202 amount=-3 +kerning first=121 second=277 amount=-3 +kerning first=362 second=224 amount=-3 +kerning first=107 second=99 amount=-3 +kerning first=90 second=101 amount=-1 +kerning first=375 second=97 amount=-3 +kerning first=303 second=367 amount=-1 +kerning first=352 second=69 amount=-3 +kerning first=381 second=351 amount=-2 +kerning first=339 second=367 amount=-2 +kerning first=195 second=101 amount=-1 +kerning first=376 second=202 amount=-1 +kerning first=231 second=367 amount=-2 +kerning first=280 second=69 amount=-2 +kerning first=231 second=101 amount=-1 +kerning first=267 second=367 amount=-2 +kerning first=267 second=101 amount=-1 +kerning first=286 second=257 amount=-1 +kerning first=208 second=69 amount=-2 +kerning first=323 second=267 amount=-2 +kerning first=84 second=212 amount=-3 +kerning first=303 second=101 amount=-3 +kerning first=1052 second=1047 amount=-1 +kerning first=195 second=367 amount=-3 +kerning first=380 second=226 amount=-1 +kerning first=345 second=351 amount=-1 +kerning first=214 second=257 amount=-1 +kerning first=350 second=114 amount=-2 +kerning first=209 second=79 amount=-2 +kerning first=356 second=302 amount=-1 +kerning first=250 second=257 amount=-1 +kerning first=90 second=367 amount=-3 +kerning first=287 second=267 amount=-2 +kerning first=331 second=316 amount=-1 +kerning first=229 second=241 amount=-1 +kerning first=76 second=221 amount=-3 +kerning first=120 second=271 amount=-2 +kerning first=71 second=362 amount=-1 +kerning first=296 second=382 amount=-1 +kerning first=367 second=316 amount=-2 +kerning first=332 second=382 amount=-2 +kerning first=225 second=271 amount=-1 +kerning first=201 second=291 amount=-3 +kerning first=1049 second=1087 amount=-1 +kerning first=368 second=382 amount=-3 +kerning first=362 second=286 amount=-1 +kerning first=261 second=271 amount=-1 +kerning first=212 second=362 amount=-1 +kerning first=1053 second=1057 amount=-1 +kerning first=74 second=266 amount=-2 +kerning first=226 second=337 amount=-1 +kerning first=119 second=382 amount=-3 +kerning first=303 second=255 amount=-2 +kerning first=200 second=226 amount=-1 +kerning first=1024 second=1042 amount=-1 +kerning first=240 second=311 amount=-1 +kerning first=369 second=271 amount=-1 +kerning first=121 second=337 amount=-3 +kerning first=224 second=382 amount=-1 +kerning first=218 second=286 amount=-1 +kerning first=1060 second=1042 amount=-1 +kerning first=378 second=331 amount=-2 +kerning first=272 second=226 amount=-1 +kerning first=296 second=119 amount=-2 +kerning first=85 second=337 amount=-2 +kerning first=77 second=286 amount=-2 +kerning first=1089 second=1113 amount=-1 +kerning first=233 second=8221 amount=-2 +kerning first=248 second=361 amount=-1 +kerning first=203 second=331 amount=-1 +kerning first=109 second=289 amount=-2 +kerning first=228 second=318 amount=-1 +kerning first=71 second=98 amount=-1 +kerning first=82 second=316 amount=-3 +kerning first=198 second=331 amount=-1 +kerning first=298 second=337 amount=-2 +kerning first=118 second=316 amount=-2 +kerning first=234 second=331 amount=-2 +kerning first=284 second=361 amount=-1 +kerning first=262 second=337 amount=-2 +kerning first=187 second=316 amount=-1 +kerning first=223 second=316 amount=-2 +kerning first=356 second=361 amount=-2 +kerning first=259 second=316 amount=-1 +kerning first=323 second=266 amount=-2 +kerning first=295 second=316 amount=-1 +kerning first=231 second=103 amount=-3 +kerning first=218 second=256 amount=-4 +kerning first=204 second=252 amount=-1 +kerning first=226 second=45 amount=-2 +kerning first=364 second=90 amount=-1 +kerning first=195 second=103 amount=-3 +kerning first=113 second=227 amount=-2 +kerning first=334 second=70 amount=-2 +kerning first=240 second=252 amount=-1 +kerning first=77 second=227 amount=-2 +kerning first=90 second=103 amount=-3 +kerning first=381 second=229 amount=-1 +kerning first=213 second=368 amount=-1 +kerning first=262 second=70 amount=-3 +kerning first=1103 second=1086 amount=-1 +kerning first=326 second=227 amount=-1 +kerning first=1024 second=1101 amount=-1 +kerning first=68 second=78 amount=-2 +kerning first=290 second=227 amount=-1 +kerning first=278 second=381 amount=-1 +kerning first=85 second=336 amount=-1 +kerning first=338 second=65 amount=-2 +kerning first=321 second=368 amount=-3 +kerning first=99 second=252 amount=-2 +kerning first=286 second=201 amount=-1 +kerning first=218 second=227 amount=-3 +kerning first=79 second=90 amount=-2 +kerning first=214 second=201 amount=-2 +kerning first=99 second=311 amount=-2 +kerning first=262 second=278 amount=-3 +kerning first=262 second=336 amount=-3 +kerning first=256 second=356 amount=-6 +kerning first=1025 second=1107 amount=-1 +kerning first=311 second=246 amount=-3 +kerning first=298 second=336 amount=-2 +kerning first=83 second=382 amount=-2 +kerning first=275 second=246 amount=-1 +kerning first=105 second=171 amount=-3 +kerning first=334 second=278 amount=-2 +kerning first=220 second=90 amount=-1 +kerning first=339 second=103 amount=-3 +kerning first=370 second=336 amount=-1 +kerning first=105 second=233 amount=-1 +kerning first=1074 second=1084 amount=-1 +kerning first=284 second=362 amount=-1 +kerning first=303 second=103 amount=-1 +kerning first=79 second=356 amount=-2 +kerning first=187 second=317 amount=-5 +kerning first=345 second=291 amount=-2 +kerning first=8220 second=273 amount=-3 +kerning first=356 second=362 amount=-1 +kerning first=295 second=103 amount=-2 +kerning first=268 second=246 amount=-2 +kerning first=245 second=116 amount=-1 +kerning first=104 second=369 amount=-1 +kerning first=259 second=103 amount=-2 +kerning first=232 second=246 amount=-1 +kerning first=245 second=369 amount=-1 +kerning first=223 second=103 amount=-2 +kerning first=196 second=246 amount=-1 +kerning first=231 second=382 amount=-2 +kerning first=209 second=369 amount=-2 +kerning first=254 second=259 amount=-1 +kerning first=281 second=116 amount=-1 +kerning first=267 second=382 amount=-2 +kerning first=118 second=103 amount=-3 +kerning first=1070 second=1043 amount=-1 +kerning first=1056 second=1056 amount=-1 +kerning first=82 second=103 amount=-3 +kerning first=73 second=253 amount=-2 +kerning first=113 second=259 amount=-2 +kerning first=82 second=363 amount=-2 +kerning first=109 second=253 amount=-2 +kerning first=77 second=259 amount=-2 +kerning first=1047 second=1078 amount=-3 +kerning first=118 second=363 amount=-1 +kerning first=90 second=382 amount=-3 +kerning first=1046 second=1089 amount=-2 +kerning first=267 second=122 amount=-2 +kerning first=317 second=109 amount=-1 +kerning first=187 second=363 amount=-1 +kerning first=1056 second=1108 amount=-1 +kerning first=231 second=122 amount=-2 +kerning first=281 second=109 amount=-2 +kerning first=200 second=266 amount=-1 +kerning first=223 second=363 amount=-1 +kerning first=90 second=338 amount=-1 +kerning first=1060 second=1076 amount=-1 +kerning first=330 second=367 amount=-2 +kerning first=1086 second=1102 amount=-1 +kerning first=8250 second=364 amount=-4 +kerning first=259 second=363 amount=-1 +kerning first=1024 second=1076 amount=-2 +kerning first=108 second=375 amount=-3 +kerning first=1082 second=1089 amount=-2 +kerning first=353 second=109 amount=-2 +kerning first=295 second=363 amount=-1 +kerning first=198 second=65 amount=-2 +kerning first=72 second=375 amount=-2 +kerning first=317 second=369 amount=-2 +kerning first=331 second=363 amount=-1 +kerning first=303 second=382 amount=-1 +kerning first=86 second=362 amount=-1 +kerning first=375 second=122 amount=-3 +kerning first=353 second=116 amount=-2 +kerning first=313 second=356 amount=-3 +kerning first=367 second=363 amount=-1 +kerning first=315 second=67 amount=-1 +kerning first=8250 second=357 amount=-1 +kerning first=339 second=382 amount=-2 +kerning first=321 second=375 amount=-3 +kerning first=339 second=122 amount=-2 +kerning first=367 second=103 amount=-3 +kerning first=245 second=109 amount=-1 +kerning first=375 second=382 amount=-3 +kerning first=248 second=305 amount=-1 +kerning first=303 second=122 amount=-1 +kerning first=331 second=103 amount=-2 +kerning first=1104 second=1095 amount=-1 +kerning first=212 second=305 amount=-1 +kerning first=249 second=375 amount=-3 +kerning first=82 second=370 amount=-3 +kerning first=263 second=355 amount=-1 +kerning first=321 second=115 amount=-1 +kerning first=83 second=76 amount=-3 +kerning first=8250 second=97 amount=-1 +kerning first=1073 second=1075 amount=-1 +kerning first=361 second=44 amount=-2 +kerning first=187 second=370 amount=-4 +kerning first=78 second=336 amount=-2 +kerning first=249 second=115 amount=-2 +kerning first=122 second=355 amount=-1 +kerning first=356 second=305 amount=-2 +kerning first=1070 second=1036 amount=-1 +kerning first=1042 second=1062 amount=-2 +kerning first=371 second=355 amount=-1 +kerning first=219 second=336 amount=-1 +kerning first=258 second=279 amount=-1 +kerning first=313 second=89 amount=-3 +kerning first=366 second=279 amount=-2 +kerning first=330 second=279 amount=-2 +kerning first=323 second=248 amount=-2 +kerning first=327 second=336 amount=-2 +kerning first=321 second=108 amount=-2 +kerning first=250 second=253 amount=-3 +kerning first=73 second=232 amount=-2 +kerning first=1042 second=1055 amount=-2 +kerning first=100 second=259 amount=-1 +kerning first=1100 second=1103 amount=-2 +kerning first=376 second=246 amount=-3 +kerning first=89 second=66 amount=-1 +kerning first=75 second=332 amount=-3 +kerning first=1060 second=1048 amount=-1 +kerning first=304 second=246 amount=-2 +kerning first=1024 second=1048 amount=-1 +kerning first=73 second=225 amount=-2 +kerning first=82 second=335 amount=-3 +kerning first=109 second=225 amount=-1 +kerning first=1053 second=1086 amount=-1 +kerning first=118 second=335 amount=-3 +kerning first=108 second=108 amount=-2 +kerning first=376 second=218 amount=-1 +kerning first=362 second=231 amount=-2 +kerning first=313 second=328 amount=-1 +kerning first=1071 second=1072 amount=-1 +kerning first=214 second=225 amount=-1 +kerning first=66 second=344 amount=-4 +kerning first=249 second=108 amount=-2 +kerning first=380 second=273 amount=-1 +kerning first=254 second=8217 amount=-2 +kerning first=86 second=102 amount=-1 +kerning first=88 second=242 amount=-2 +kerning first=290 second=8217 amount=-1 +kerning first=122 second=102 amount=-2 +kerning first=76 second=196 amount=-2 +kerning first=199 second=203 amount=-3 +kerning first=326 second=8217 amount=-4 +kerning first=193 second=242 amount=-1 +kerning first=77 second=231 amount=-2 +kerning first=262 second=46 amount=-1 +kerning first=86 second=355 amount=-1 +kerning first=236 second=273 amount=-1 +kerning first=250 second=225 amount=-1 +kerning first=268 second=218 amount=-2 +kerning first=106 second=8221 amount=-2 +kerning first=286 second=225 amount=-1 +kerning first=290 second=280 amount=-1 +kerning first=113 second=8217 amount=-3 +kerning first=218 second=231 amount=-2 +kerning first=72 second=115 amount=-2 +kerning first=196 second=218 amount=-3 +kerning first=370 second=46 amount=-5 +kerning first=204 second=286 amount=-2 +kerning first=108 second=115 amount=-2 +kerning first=73 second=279 amount=-2 +kerning first=1042 second=1083 amount=-1 +kerning first=209 second=81 amount=-2 +kerning first=371 second=102 amount=-2 +kerning first=262 second=67 amount=-3 +kerning first=196 second=211 amount=-3 +kerning first=83 second=119 amount=-3 +kerning first=121 second=46 amount=-5 +kerning first=199 second=210 amount=-3 +kerning first=283 second=8221 amount=-2 +kerning first=1114 second=1083 amount=-1 +kerning first=236 second=245 amount=-1 +kerning first=226 second=46 amount=-1 +kerning first=211 second=8221 amount=-2 +kerning first=90 second=122 amount=-3 +kerning first=224 second=119 amount=-3 +kerning first=227 second=102 amount=-1 +kerning first=85 second=67 amount=-1 +kerning first=260 second=119 amount=-3 +kerning first=317 second=81 amount=-1 +kerning first=1056 second=1049 amount=-1 +kerning first=344 second=266 amount=-3 +kerning first=263 second=102 amount=-2 +kerning first=376 second=211 amount=-3 +kerning first=380 second=245 amount=-1 +kerning first=76 second=217 amount=-3 +kerning first=268 second=211 amount=-3 +kerning first=344 second=245 amount=-3 +kerning first=335 second=102 amount=-1 +kerning first=304 second=211 amount=-2 +kerning first=367 second=335 amount=-1 +kerning first=368 second=119 amount=-2 +kerning first=100 second=328 amount=-1 +kerning first=254 second=252 amount=-1 +kerning first=230 second=311 amount=-2 +kerning first=290 second=252 amount=-1 +kerning first=214 second=204 amount=-2 +kerning first=326 second=252 amount=-1 +kerning first=311 second=8217 amount=-2 +kerning first=1078 second=1090 amount=-1 +kerning first=362 second=252 amount=-1 +kerning first=286 second=204 amount=-1 +kerning first=1042 second=1090 amount=-1 +kerning first=362 second=259 amount=-3 +kerning first=277 second=328 amount=-2 +kerning first=77 second=252 amount=-1 +kerning first=259 second=335 amount=-1 +kerning first=326 second=259 amount=-1 +kerning first=241 second=328 amount=-1 +kerning first=113 second=252 amount=-2 +kerning first=370 second=67 amount=-1 +kerning first=74 second=269 amount=-2 +kerning first=1079 second=1118 amount=-2 +kerning first=1024 second=1097 amount=-1 +kerning first=266 second=248 amount=-2 +kerning first=218 second=252 amount=-1 +kerning first=298 second=67 amount=-2 +kerning first=364 second=378 amount=-3 +kerning first=84 second=262 amount=-3 +kerning first=382 second=113 amount=-1 +kerning first=287 second=269 amount=-2 +kerning first=328 second=378 amount=-1 +kerning first=346 second=113 amount=-1 +kerning first=274 second=366 amount=-2 +kerning first=378 second=365 amount=-2 +kerning first=251 second=269 amount=-1 +kerning first=74 second=288 amount=-2 +kerning first=66 second=250 amount=-3 +kerning first=310 second=113 amount=-2 +kerning first=378 second=353 amount=-2 +kerning first=120 second=249 amount=-3 +kerning first=1060 second=1030 amount=-1 +kerning first=202 second=366 amount=-2 +kerning first=88 second=263 amount=-2 +kerning first=323 second=269 amount=-2 +kerning first=275 second=378 amount=-2 +kerning first=220 second=378 amount=-3 +kerning first=260 second=171 amount=-4 +kerning first=252 second=100 amount=-1 +kerning first=324 second=112 amount=-1 +kerning first=338 second=87 amount=-1 +kerning first=288 second=112 amount=-1 +kerning first=198 second=353 amount=-1 +kerning first=234 second=365 amount=-2 +kerning first=332 second=171 amount=-1 +kerning first=252 second=112 amount=-2 +kerning first=234 second=353 amount=-2 +kerning first=198 second=365 amount=-2 +kerning first=368 second=171 amount=-5 +kerning first=216 second=112 amount=-1 +kerning first=346 second=366 amount=-3 +kerning first=75 second=100 amount=-2 +kerning first=323 second=288 amount=-2 +kerning first=272 second=366 amount=-1 +kerning first=194 second=87 amount=-6 +kerning first=1045 second=1054 amount=-1 +kerning first=355 second=249 amount=-1 +kerning first=212 second=352 amount=-1 +kerning first=1075 second=1086 amount=-1 +kerning first=193 second=275 amount=-1 +kerning first=379 second=210 amount=-1 +kerning first=76 second=192 amount=-2 +kerning first=229 second=275 amount=-1 +kerning first=284 second=352 amount=-2 +kerning first=194 second=354 amount=-6 +kerning first=88 second=275 amount=-2 +kerning first=1071 second=1080 amount=-1 +kerning first=328 second=121 amount=-2 +kerning first=97 second=113 amount=-1 +kerning first=356 second=352 amount=-3 +kerning first=314 second=8221 amount=-3 +kerning first=207 second=248 amount=-2 +kerning first=264 second=198 amount=-3 +kerning first=121 second=97 amount=-3 +kerning first=220 second=380 amount=-3 +kerning first=8217 second=193 amount=-6 +kerning first=106 second=249 amount=-1 +kerning first=288 second=379 amount=-2 +kerning first=70 second=8249 amount=-3 +kerning first=369 second=8220 amount=-3 +kerning first=234 second=114 amount=-1 +kerning first=336 second=198 amount=-4 +kerning first=221 second=223 amount=-3 +kerning first=1093 second=1105 amount=-2 +kerning first=333 second=8220 amount=-2 +kerning first=120 second=248 amount=-2 +kerning first=346 second=364 amount=-3 +kerning first=381 second=116 amount=-1 +kerning first=87 second=198 amount=-6 +kerning first=70 second=289 amount=-3 +kerning first=66 second=248 amount=-1 +kerning first=374 second=338 amount=-3 +kerning first=283 second=249 amount=-2 +kerning first=378 second=98 amount=-1 +kerning first=225 second=8220 amount=-3 +kerning first=79 second=380 amount=-2 +kerning first=1067 second=1079 amount=-1 +kerning first=354 second=361 amount=-2 +kerning first=115 second=380 amount=-2 +kerning first=211 second=289 amount=-1 +kerning first=352 second=313 amount=-3 +kerning first=120 second=8220 amount=-2 +kerning first=1025 second=1113 amount=-1 +kerning first=347 second=237 amount=-2 +kerning first=187 second=75 amount=-5 +kerning first=75 second=339 amount=-2 +kerning first=377 second=274 amount=-1 +kerning first=1031 second=1079 amount=-1 +kerning first=284 second=73 amount=-1 +kerning first=280 second=313 amount=-2 +kerning first=275 second=237 amount=-2 +kerning first=334 second=46 amount=-3 +kerning first=256 second=99 amount=-1 +kerning first=8216 second=256 amount=-8 +kerning first=356 second=73 amount=-1 +kerning first=220 second=99 amount=-2 +kerning first=208 second=313 amount=-2 +kerning first=203 second=237 amount=-1 +kerning first=71 second=73 amount=-1 +kerning first=252 second=339 amount=-1 +kerning first=67 second=313 amount=-3 +kerning first=193 second=263 amount=-1 +kerning first=334 second=327 amount=-2 +kerning first=279 second=248 amount=-1 +kerning first=98 second=237 amount=-1 +kerning first=229 second=263 amount=-1 +kerning first=106 second=8249 amount=-3 +kerning first=268 second=206 amount=-3 +kerning first=216 second=379 amount=-2 +kerning first=212 second=73 amount=-2 +kerning first=364 second=99 amount=-2 +kerning first=83 second=187 amount=-1 +kerning first=1049 second=1081 amount=-1 +kerning first=260 second=199 amount=-3 +kerning first=211 second=350 amount=-1 +kerning first=198 second=381 amount=-1 +kerning first=369 second=234 amount=-1 +kerning first=203 second=209 amount=-2 +kerning first=69 second=212 amount=-1 +kerning first=296 second=199 amount=-2 +kerning first=86 second=83 amount=-3 +kerning first=258 second=67 amount=-3 +kerning first=120 second=234 amount=-2 +kerning first=377 second=302 amount=-1 +kerning first=368 second=199 amount=-1 +kerning first=283 second=277 amount=-1 +kerning first=225 second=234 amount=-1 +kerning first=236 second=227 amount=-2 +kerning first=187 second=323 amount=-5 +kerning first=261 second=234 amount=-1 +kerning first=256 second=111 amount=-1 +kerning first=106 second=277 amount=-1 +kerning first=288 second=72 amount=-1 +kerning first=283 second=289 amount=-3 +kerning first=8217 second=333 amount=-3 +kerning first=364 second=111 amount=-2 +kerning first=8250 second=198 amount=-4 +kerning first=84 second=264 amount=-3 +kerning first=355 second=289 amount=-2 +kerning first=310 second=364 amount=-2 +kerning first=77 second=233 amount=-2 +kerning first=274 second=364 amount=-2 +kerning first=354 second=212 amount=-3 +kerning first=70 second=277 amount=-1 +kerning first=111 second=351 amount=-2 +kerning first=288 second=367 amount=-1 +kerning first=220 second=111 amount=-2 +kerning first=202 second=364 amount=-2 +kerning first=113 second=233 amount=-1 +kerning first=282 second=212 amount=-1 +kerning first=266 second=354 amount=-1 +kerning first=106 second=261 amount=-2 +kerning first=79 second=287 amount=-1 +kerning first=218 second=233 amount=-2 +kerning first=87 second=226 amount=-5 +kerning first=252 second=367 amount=-1 +kerning first=338 second=354 amount=-1 +kerning first=315 second=220 amount=-3 +kerning first=211 second=261 amount=-1 +kerning first=111 second=367 amount=-1 +kerning first=229 second=291 amount=-2 +kerning first=380 second=105 amount=-1 +kerning first=202 second=97 amount=-1 +kerning first=338 second=326 amount=-1 +kerning first=228 second=226 amount=-1 +kerning first=193 second=291 amount=-3 +kerning first=324 second=351 amount=-1 +kerning first=374 second=326 amount=-3 +kerning first=362 second=233 amount=-2 +kerning first=264 second=226 amount=-2 +kerning first=75 second=367 amount=-3 +kerning first=97 second=97 amount=-1 +kerning first=90 second=110 amount=-1 +kerning first=88 second=291 amount=-2 +kerning first=216 second=72 amount=-2 +kerning first=336 second=226 amount=-1 +kerning first=70 second=261 amount=-2 +kerning first=83 second=171 amount=-3 +kerning first=346 second=97 amount=-2 +kerning first=315 second=250 amount=-2 +kerning first=70 second=267 amount=-1 +kerning first=119 second=171 amount=-4 +kerning first=264 second=83 amount=-3 +kerning first=230 second=326 amount=-2 +kerning first=279 second=250 amount=-2 +kerning first=198 second=86 amount=-1 +kerning first=115 second=378 amount=-2 +kerning first=1042 second=1050 amount=-2 +kerning first=266 second=326 amount=-1 +kerning first=267 second=110 amount=-2 +kerning first=234 second=337 amount=-1 +kerning first=380 second=248 amount=-1 +kerning first=79 second=378 amount=-2 +kerning first=224 second=171 amount=-2 +kerning first=86 second=350 amount=-3 +kerning first=310 second=97 amount=-1 +kerning first=351 second=250 amount=-1 +kerning first=251 second=316 amount=-2 +kerning first=339 second=110 amount=-2 +kerning first=283 second=261 amount=-2 +kerning first=287 second=316 amount=-3 +kerning first=102 second=250 amount=-1 +kerning first=291 second=234 amount=-2 +kerning first=89 second=326 amount=-3 +kerning first=243 second=250 amount=-1 +kerning first=1104 second=1116 amount=-1 +kerning first=355 second=261 amount=-1 +kerning first=378 second=337 amount=-1 +kerning first=207 second=250 amount=-2 +kerning first=108 second=117 amount=-2 +kerning first=221 second=200 amount=-1 +kerning first=81 second=260 amount=-4 +kerning first=1104 second=1107 amount=-1 +kerning first=72 second=117 amount=-2 +kerning first=315 second=75 amount=-2 +kerning first=120 second=339 amount=-2 +kerning first=1070 second=1031 amount=-1 +kerning first=80 second=200 amount=-1 +kerning first=249 second=117 amount=-1 +kerning first=69 second=221 amount=-1 +kerning first=222 second=260 amount=-4 +kerning first=90 second=330 amount=-1 +kerning first=262 second=317 amount=-3 +kerning first=321 second=117 amount=-2 +kerning first=1114 second=1081 amount=-1 +kerning first=362 second=264 amount=-1 +kerning first=262 second=290 amount=-3 +kerning first=282 second=214 amount=-1 +kerning first=298 second=290 amount=-2 +kerning first=366 second=260 amount=-4 +kerning first=241 second=98 amount=-2 +kerning first=77 second=240 amount=-2 +kerning first=354 second=214 amount=-3 +kerning first=221 second=207 amount=-1 +kerning first=370 second=290 amount=-1 +kerning first=113 second=240 amount=-1 +kerning first=218 second=264 amount=-1 +kerning first=85 second=290 amount=-1 +kerning first=113 second=271 amount=-1 +kerning first=362 second=240 amount=-2 +kerning first=69 second=214 amount=-1 +kerning first=213 second=377 amount=-2 +kerning first=240 second=118 amount=-2 +kerning first=282 second=221 amount=-1 +kerning first=77 second=264 amount=-2 +kerning first=75 second=84 amount=-2 +kerning first=321 second=377 amount=-3 +kerning first=222 second=298 amount=-2 +kerning first=328 second=110 amount=-1 +kerning first=366 second=291 amount=-4 +kerning first=350 second=194 amount=-4 +kerning first=214 second=220 amount=-1 +kerning first=330 second=291 amount=-3 +kerning first=68 second=97 amount=-1 +kerning first=266 second=317 amount=-3 +kerning first=216 second=84 amount=-2 +kerning first=104 second=97 amount=-1 +kerning first=278 second=194 amount=-2 +kerning first=120 second=227 amount=-2 +kerning first=313 second=330 amount=-2 +kerning first=240 second=353 amount=-2 +kerning first=368 second=289 amount=-4 +kerning first=258 second=291 amount=-3 +kerning first=121 second=287 amount=-3 +kerning first=84 second=227 amount=-5 +kerning first=338 second=317 amount=-2 +kerning first=1064 second=1077 amount=-1 +kerning first=222 second=291 amount=-1 +kerning first=85 second=287 amount=-4 +kerning first=374 second=317 amount=-1 +kerning first=356 second=324 amount=-3 +kerning first=245 second=97 amount=-1 +kerning first=226 second=287 amount=-2 +kerning first=89 second=317 amount=-1 +kerning first=117 second=291 amount=-3 +kerning first=100 second=337 amount=-1 +kerning first=269 second=311 amount=-2 +kerning first=81 second=291 amount=-1 +kerning first=298 second=287 amount=-3 +kerning first=233 second=311 amount=-2 +kerning first=288 second=84 amount=-3 +kerning first=84 second=234 amount=-3 +kerning first=327 second=71 amount=-2 +kerning first=209 second=97 amount=-2 +kerning first=262 second=287 amount=-3 +kerning first=197 second=311 amount=-2 +kerning first=1024 second=1088 amount=-1 +kerning first=86 second=90 amount=-3 +kerning first=370 second=287 amount=-4 +kerning first=86 second=381 amount=-3 +kerning first=78 second=71 amount=-2 +kerning first=277 second=337 amount=-1 +kerning first=334 second=287 amount=-1 +kerning first=1053 second=1094 amount=-1 +kerning first=80 second=197 amount=-4 +kerning first=45 second=298 amount=-5 +kerning first=219 second=71 amount=-1 +kerning first=198 second=77 amount=-2 +kerning first=248 second=324 amount=-1 +kerning first=81 second=298 amount=-2 +kerning first=205 second=337 amount=-2 +kerning first=277 second=365 amount=-2 +kerning first=374 second=78 amount=-1 +kerning first=222 second=382 amount=-2 +kerning first=117 second=263 amount=-1 +kerning first=241 second=365 amount=-1 +kerning first=221 second=197 amount=-6 +kerning first=218 second=268 amount=-1 +kerning first=213 second=120 amount=-1 +kerning first=205 second=365 amount=-2 +kerning first=73 second=213 amount=-2 +kerning first=354 second=193 amount=-6 +kerning first=1024 second=1060 amount=-1 +kerning first=249 second=120 amount=-2 +kerning first=375 second=113 amount=-3 +kerning first=379 second=230 amount=-1 +kerning first=327 second=303 amount=-1 +kerning first=201 second=310 amount=-2 +kerning first=367 second=8217 amount=-3 +kerning first=77 second=268 amount=-2 +kerning first=266 second=78 amount=-3 +kerning first=335 second=353 amount=-2 +kerning first=362 second=243 amount=-2 +kerning first=208 second=325 amount=-2 +kerning first=371 second=353 amount=-2 +kerning first=1089 second=1094 amount=-1 +kerning first=108 second=120 amount=-1 +kerning first=338 second=85 amount=-2 +kerning first=195 second=113 amount=-1 +kerning first=371 second=118 amount=-3 +kerning first=45 second=270 amount=-5 +kerning first=122 second=353 amount=-2 +kerning first=335 second=118 amount=-2 +kerning first=89 second=78 amount=-1 +kerning first=78 second=303 amount=-1 +kerning first=236 second=275 amount=-1 +kerning first=266 second=85 amount=-2 +kerning first=1064 second=1080 amount=-1 +kerning first=198 second=74 amount=-1 +kerning first=313 second=70 amount=-2 +kerning first=335 second=46 amount=-3 +kerning first=379 second=201 amount=-1 +kerning first=350 second=227 amount=-2 +kerning first=1056 second=1065 amount=-1 +kerning first=81 second=270 amount=-2 +kerning first=263 second=353 amount=-2 +kerning first=194 second=85 amount=-3 +kerning first=339 second=113 amount=-1 +kerning first=227 second=118 amount=-3 +kerning first=230 second=314 amount=-3 +kerning first=219 second=303 amount=-2 +kerning first=321 second=120 amount=-1 +kerning first=1100 second=1080 amount=-1 +kerning first=194 second=314 amount=-2 +kerning first=255 second=303 amount=-2 +kerning first=89 second=345 amount=-1 +kerning first=89 second=85 amount=-1 +kerning first=267 second=113 amount=-1 +kerning first=8250 second=206 amount=-5 +kerning first=249 second=273 amount=-1 +kerning first=313 second=365 amount=-2 +kerning first=263 second=118 amount=-2 +kerning first=381 second=310 amount=-1 +kerning first=266 second=314 amount=-1 +kerning first=199 second=201 amount=-3 +kerning first=86 second=353 amount=-3 +kerning first=353 second=251 amount=-1 +kerning first=234 second=105 amount=-2 +kerning first=257 second=235 amount=-1 +kerning first=197 second=283 amount=-1 +kerning first=1057 second=1093 amount=-1 +kerning first=381 second=338 amount=-1 +kerning first=8250 second=209 amount=-5 +kerning first=338 second=314 amount=-1 +kerning first=8222 second=217 amount=-3 +kerning first=321 second=380 amount=-3 +kerning first=84 second=224 amount=-4 +kerning first=122 second=118 amount=-2 +kerning first=317 second=324 amount=-1 +kerning first=86 second=118 amount=-3 +kerning first=198 second=105 amount=-1 +kerning first=365 second=235 amount=-1 +kerning first=313 second=98 amount=-2 +kerning first=222 second=270 amount=-2 +kerning first=1064 second=1087 amount=-1 +kerning first=250 second=241 amount=-1 +kerning first=108 second=380 amount=-1 +kerning first=277 second=98 amount=-2 +kerning first=120 second=224 amount=-2 +kerning first=1100 second=1087 amount=-1 +kerning first=261 second=224 amount=-1 +kerning first=365 second=228 amount=-1 +kerning first=201 second=338 amount=-1 +kerning first=71 second=352 amount=-2 +kerning first=200 second=198 amount=-2 +kerning first=269 second=283 amount=-1 +kerning first=213 second=380 amount=-2 +kerning first=374 second=85 amount=-1 +kerning first=225 second=224 amount=-1 +kerning first=1042 second=1063 amount=-3 +kerning first=233 second=283 amount=-1 +kerning first=249 second=380 amount=-2 +kerning first=333 second=224 amount=-1 +kerning first=280 second=325 amount=-2 +kerning first=260 second=86 amount=-6 +kerning first=89 second=338 amount=-3 +kerning first=257 second=228 amount=-1 +kerning first=111 second=112 amount=-1 +kerning first=1057 second=1108 amount=-1 +kerning first=221 second=228 amount=-4 +kerning first=8250 second=369 amount=-1 +kerning first=121 second=318 amount=-2 +kerning first=352 second=325 amount=-3 +kerning first=369 second=224 amount=-1 +kerning first=69 second=193 amount=-2 +kerning first=109 second=241 amount=-1 +kerning first=377 second=283 amount=-1 +kerning first=72 second=380 amount=-1 +kerning first=278 second=45 amount=-2 +kerning first=352 second=8250 amount=-1 +kerning first=116 second=228 amount=-1 +kerning first=226 second=318 amount=-1 +kerning first=97 second=101 amount=-1 +kerning first=80 second=235 amount=-1 +kerning first=363 second=331 amount=-1 +kerning first=80 second=228 amount=-1 +kerning first=262 second=318 amount=-1 +kerning first=88 second=84 amount=-2 +kerning first=250 second=248 amount=-1 +kerning first=330 second=263 amount=-2 +kerning first=255 second=331 amount=-2 +kerning first=313 second=209 amount=-2 +kerning first=366 second=263 amount=-2 +kerning first=291 second=331 amount=-1 +kerning first=221 second=235 amount=-3 +kerning first=1089 second=1097 amount=-1 +kerning first=377 second=281 amount=-1 +kerning first=378 second=237 amount=-1 +kerning first=73 second=216 amount=-2 +kerning first=118 second=101 amount=-3 +kerning first=310 second=101 amount=-2 +kerning first=1103 second=1072 amount=-1 +kerning first=347 second=230 amount=-1 +kerning first=225 second=231 amount=-1 +kerning first=346 second=101 amount=-1 +kerning first=369 second=255 amount=-3 +kerning first=211 second=256 amount=-4 +kerning first=1067 second=1072 amount=-1 +kerning first=261 second=231 amount=-1 +kerning first=1053 second=1097 amount=-1 +kerning first=89 second=82 amount=-1 +kerning first=382 second=101 amount=-1 +kerning first=333 second=255 amount=-3 +kerning first=1053 second=1073 amount=-1 +kerning first=275 second=230 amount=-2 +kerning first=233 second=281 amount=-1 +kerning first=1031 second=1114 amount=-1 +kerning first=311 second=230 amount=-2 +kerning first=1039 second=1098 amount=-1 +kerning first=269 second=281 amount=-1 +kerning first=289 second=224 amount=-3 +kerning first=261 second=255 amount=-2 +kerning first=88 second=251 amount=-3 +kerning first=203 second=230 amount=-1 +kerning first=115 second=108 amount=-2 +kerning first=369 second=231 amount=-1 +kerning first=225 second=255 amount=-3 +kerning first=193 second=251 amount=-3 +kerning first=338 second=347 amount=-1 +kerning first=78 second=67 amount=-2 +kerning first=120 second=255 amount=-3 +kerning first=99 second=8221 amount=-2 +kerning first=302 second=347 amount=-2 +kerning first=211 second=280 amount=-2 +kerning first=288 second=107 amount=-1 +kerning first=288 second=311 amount=-1 +kerning first=266 second=347 amount=-2 +kerning first=120 second=8217 amount=-2 +kerning first=229 second=251 amount=-1 +kerning first=76 second=205 amount=-2 +kerning first=230 second=347 amount=-2 +kerning first=197 second=281 amount=-1 +kerning first=337 second=251 amount=-1 +kerning first=120 second=231 amount=-2 +kerning first=194 second=347 amount=-2 +kerning first=378 second=105 amount=-1 +kerning first=111 second=107 amount=-1 +kerning first=83 second=318 amount=-2 +kerning first=89 second=347 amount=-3 +kerning first=328 second=371 amount=-1 +kerning first=252 second=107 amount=-2 +kerning first=84 second=231 amount=-3 +kerning first=97 second=106 amount=-1 +kerning first=212 second=80 amount=-2 +kerning first=277 second=333 amount=-1 +kerning first=75 second=81 amount=-3 +kerning first=230 second=345 amount=-1 +kerning first=266 second=345 amount=-1 +kerning first=284 second=80 amount=-1 +kerning first=187 second=357 amount=-1 +kerning first=327 second=67 amount=-2 +kerning first=69 second=217 amount=-2 +kerning first=256 second=368 amount=-3 +kerning first=100 second=333 amount=-1 +kerning first=374 second=345 amount=-1 +kerning first=198 second=346 amount=-2 +kerning first=310 second=106 amount=-1 +kerning first=219 second=67 amount=-1 +kerning first=210 second=217 amount=-1 +kerning first=313 second=68 amount=-2 +kerning first=205 second=333 amount=-2 +kerning first=71 second=80 amount=-1 +kerning first=282 second=217 amount=-2 +kerning first=216 second=256 amount=-4 +kerning first=98 second=230 amount=-1 +kerning first=80 second=204 amount=-1 +kerning first=218 second=243 amount=-2 +kerning first=346 second=106 amount=-1 +kerning first=381 second=249 amount=-3 +kerning first=8217 second=328 amount=-2 +kerning first=382 second=106 amount=-2 +kerning first=263 second=335 amount=-1 +kerning first=1113 second=1117 amount=-1 +kerning first=110 second=307 amount=-1 +kerning first=356 second=80 amount=-1 +kerning first=362 second=268 amount=-1 +kerning first=221 second=204 amount=-1 +kerning first=71 second=260 amount=-3 +kerning first=70 second=256 amount=-3 +kerning first=251 second=307 amount=-2 +kerning first=334 second=374 amount=-2 +kerning first=77 second=243 amount=-2 +kerning first=8216 second=289 amount=-4 +kerning first=83 second=65 amount=-4 +kerning first=287 second=307 amount=-2 +kerning first=1056 second=1033 amount=-2 +kerning first=113 second=243 amount=-1 +kerning first=201 second=69 amount=-2 +kerning first=310 second=104 amount=-1 +kerning first=310 second=369 amount=-3 +kerning first=219 second=334 amount=-1 +kerning first=70 second=284 amount=-1 +kerning first=274 second=104 amount=-1 +kerning first=274 second=369 amount=-2 +kerning first=288 second=344 amount=-1 +kerning first=382 second=369 amount=-2 +kerning first=120 second=259 amount=-2 +kerning first=251 second=44 amount=-2 +kerning first=377 second=278 amount=-1 +kerning first=202 second=104 amount=-1 +kerning first=346 second=369 amount=-1 +kerning first=84 second=259 amount=-5 +kerning first=324 second=109 amount=-1 +kerning first=1024 second=1085 amount=-1 +kerning first=368 second=192 amount=-4 +kerning first=327 second=334 amount=-2 +kerning first=382 second=104 amount=-2 +kerning first=332 second=192 amount=-4 +kerning first=74 second=44 amount=-1 +kerning first=1070 second=1034 amount=-1 +kerning first=355 second=108 amount=-1 +kerning first=73 second=244 amount=-2 +kerning first=202 second=369 amount=-2 +kerning first=216 second=344 amount=-2 +kerning first=251 second=279 amount=-1 +kerning first=333 second=227 amount=-1 +kerning first=111 second=109 amount=-1 +kerning first=207 second=229 amount=-2 +kerning first=354 second=217 amount=-1 +kerning first=323 second=279 amount=-2 +kerning first=66 second=229 amount=-3 +kerning first=261 second=227 amount=-1 +kerning first=1100 second=1084 amount=-1 +kerning first=287 second=279 amount=-2 +kerning first=102 second=229 amount=-2 +kerning first=225 second=227 amount=-1 +kerning first=1064 second=1084 amount=-1 +kerning first=74 second=279 amount=-2 +kerning first=83 second=192 amount=-4 +kerning first=323 second=44 amount=-1 +kerning first=365 second=232 amount=-1 +kerning first=351 second=229 amount=-1 +kerning first=97 second=104 amount=-1 +kerning first=287 second=44 amount=-3 +kerning first=1049 second=1074 amount=-1 +kerning first=78 second=305 amount=-1 +kerning first=8250 second=366 amount=-4 +kerning first=279 second=229 amount=-2 +kerning first=78 second=334 amount=-2 +kerning first=369 second=227 amount=-1 +kerning first=330 second=267 amount=-2 +kerning first=243 second=257 amount=-1 +kerning first=221 second=232 amount=-3 +kerning first=212 second=344 amount=-2 +kerning first=77 second=283 amount=-2 +kerning first=366 second=267 amount=-2 +kerning first=115 second=371 amount=-1 +kerning first=279 second=257 amount=-2 +kerning first=202 second=67 amount=-1 +kerning first=100 second=361 amount=-1 +kerning first=258 second=267 amount=-1 +kerning first=313 second=65 amount=-2 +kerning first=255 second=305 amount=-2 +kerning first=336 second=219 amount=-1 +kerning first=219 second=305 amount=-2 +kerning first=207 second=257 amount=-2 +kerning first=257 second=232 amount=-1 +kerning first=205 second=361 amount=-2 +kerning first=327 second=305 amount=-1 +kerning first=66 second=257 amount=-3 +kerning first=264 second=219 amount=-2 +kerning first=244 second=8250 amount=-2 +kerning first=203 second=202 amount=-2 +kerning first=291 second=305 amount=-1 +kerning first=102 second=257 amount=-2 +kerning first=277 second=361 amount=-2 +kerning first=203 second=324 amount=-1 +kerning first=266 second=230 amount=-2 +kerning first=192 second=219 amount=-3 +kerning first=241 second=361 amount=-1 +kerning first=363 second=305 amount=-1 +kerning first=80 second=232 amount=-1 +kerning first=382 second=252 amount=-2 +kerning first=199 second=206 amount=-3 +kerning first=87 second=219 amount=-1 +kerning first=335 second=121 amount=-3 +kerning first=338 second=82 amount=-2 +kerning first=374 second=82 amount=-1 +kerning first=1079 second=1083 amount=-1 +kerning first=337 second=254 amount=-1 +kerning first=263 second=121 amount=-2 +kerning first=227 second=121 amount=-3 +kerning first=381 second=69 amount=-1 +kerning first=88 second=254 amount=-1 +kerning first=122 second=121 amount=-2 +kerning first=1071 second=1099 amount=-1 +kerning first=197 second=8217 amount=-5 +kerning first=187 second=66 amount=-5 +kerning first=193 second=254 amount=-2 +kerning first=351 second=257 amount=-1 +kerning first=75 second=79 amount=-3 +kerning first=288 second=82 amount=-1 +kerning first=338 second=69 amount=-2 +kerning first=1039 second=1116 amount=-1 +kerning first=69 second=209 amount=-2 +kerning first=374 second=69 amount=-1 +kerning first=266 second=69 amount=-3 +kerning first=203 second=212 amount=-1 +kerning first=82 second=332 amount=-3 +kerning first=86 second=326 amount=-3 +kerning first=106 second=8217 amount=-2 +kerning first=82 second=79 amount=-3 +kerning first=282 second=209 amount=-2 +kerning first=103 second=316 amount=-3 +kerning first=1104 second=1119 amount=-1 +kerning first=210 second=209 amount=-2 +kerning first=216 second=82 amount=-2 +kerning first=89 second=69 amount=-1 +kerning first=201 second=66 amount=-2 +kerning first=187 second=72 amount=-5 +kerning first=284 second=76 amount=-1 +kerning first=198 second=89 amount=-1 +kerning first=87 second=216 amount=-3 +kerning first=76 second=199 amount=-1 +kerning first=8217 second=71 amount=-2 +kerning first=1071 second=1096 amount=-1 +kerning first=381 second=66 amount=-1 +kerning first=212 second=76 amount=-2 +kerning first=8216 second=281 amount=-3 +kerning first=192 second=216 amount=-3 +kerning first=203 second=205 amount=-2 +kerning first=217 second=199 amount=-1 +kerning first=214 second=229 amount=-1 +kerning first=217 second=192 amount=-4 +kerning first=71 second=76 amount=-1 +kerning first=73 second=229 amount=-2 +kerning first=236 second=242 amount=-1 +kerning first=283 second=8217 amount=-2 +kerning first=109 second=229 amount=-1 +kerning first=202 second=70 amount=-2 +kerning first=1048 second=1077 amount=-1 +kerning first=325 second=199 amount=-2 +kerning first=381 second=326 amount=-1 +kerning first=221 second=226 amount=-5 +kerning first=113 second=8221 amount=-3 +kerning first=313 second=86 amount=-3 +kerning first=257 second=226 amount=-1 +kerning first=1100 second=1099 amount=-1 +kerning first=380 second=242 amount=-1 +kerning first=68 second=257 amount=-1 +kerning first=1064 second=1099 amount=-1 +kerning first=344 second=242 amount=-3 +kerning first=201 second=326 amount=-1 +kerning first=254 second=8221 amount=-2 +kerning first=365 second=226 amount=-1 +kerning first=290 second=8221 amount=-1 +kerning first=264 second=216 amount=-3 +kerning first=90 second=119 amount=-2 +kerning first=356 second=76 amount=-1 +kerning first=1070 second=1033 amount=-3 +kerning first=195 second=119 amount=-3 +kerning first=291 second=333 amount=-2 +kerning first=244 second=316 amount=-2 +kerning first=86 second=216 amount=-3 +kerning first=111 second=103 amount=-2 +kerning first=1082 second=1092 amount=-2 +kerning first=231 second=119 amount=-2 +kerning first=255 second=333 amount=-3 +kerning first=75 second=103 amount=-2 +kerning first=221 second=219 amount=-1 +kerning first=210 second=202 amount=-2 +kerning first=1118 second=1092 amount=-2 +kerning first=334 second=302 amount=-2 +kerning first=267 second=119 amount=-2 +kerning first=363 second=333 amount=-1 +kerning first=316 second=316 amount=-2 +kerning first=69 second=202 amount=-2 +kerning first=303 second=119 amount=-3 +kerning first=352 second=316 amount=-2 +kerning first=262 second=302 amount=-3 +kerning first=339 second=119 amount=-2 +kerning first=375 second=119 amount=-1 +kerning first=354 second=202 amount=-1 +kerning first=219 second=333 amount=-2 +kerning first=80 second=226 amount=-1 +kerning first=1031 second=1119 amount=-1 +kerning first=337 second=291 amount=-2 +kerning first=116 second=226 amount=-1 +kerning first=282 second=202 amount=-2 +kerning first=382 second=116 amount=-1 +kerning first=117 second=269 amount=-1 +kerning first=369 second=246 amount=-1 +kerning first=364 second=375 amount=-1 +kerning first=75 second=284 amount=-3 +kerning first=382 second=122 amount=-2 +kerning first=66 second=253 amount=-3 +kerning first=328 second=375 amount=-2 +kerning first=283 second=259 amount=-2 +kerning first=346 second=122 amount=-2 +kerning first=102 second=253 amount=-1 +kerning first=75 second=369 amount=-3 +kerning first=114 second=45 amount=-1 +kerning first=75 second=363 amount=-3 +kerning first=324 second=103 amount=-2 +kerning first=261 second=246 amount=-1 +kerning first=256 second=375 amount=-3 +kerning first=1053 second=1082 amount=-1 +kerning first=78 second=45 amount=-4 +kerning first=198 second=356 amount=-1 +kerning first=111 second=363 amount=-1 +kerning first=288 second=103 amount=-3 +kerning first=225 second=246 amount=-1 +kerning first=207 second=253 amount=-2 +kerning first=261 second=252 amount=-1 +kerning first=1089 second=1082 amount=-1 +kerning first=219 second=45 amount=-5 +kerning first=258 second=269 amount=-1 +kerning first=252 second=103 amount=-3 +kerning first=243 second=253 amount=-3 +kerning first=310 second=116 amount=-1 +kerning first=366 second=269 amount=-2 +kerning first=216 second=103 amount=-1 +kerning first=120 second=246 amount=-2 +kerning first=1071 second=1075 amount=-1 +kerning first=279 second=253 amount=-2 +kerning first=333 second=252 amount=-1 +kerning first=291 second=45 amount=-3 +kerning first=330 second=269 amount=-2 +kerning first=252 second=363 amount=-1 +kerning first=84 second=246 amount=-3 +kerning first=315 second=253 amount=-3 +kerning first=369 second=252 amount=-1 +kerning first=211 second=259 amount=-1 +kerning first=288 second=363 amount=-1 +kerning first=97 second=122 amount=-1 +kerning first=1046 second=1086 amount=-2 +kerning first=324 second=369 amount=-1 +kerning first=324 second=363 amount=-1 +kerning first=346 second=382 amount=-2 +kerning first=288 second=369 amount=-1 +kerning first=382 second=382 amount=-2 +kerning first=70 second=259 amount=-2 +kerning first=198 second=362 amount=-2 +kerning first=274 second=122 amount=-2 +kerning first=220 second=375 amount=-1 +kerning first=1053 second=1089 amount=-1 +kerning first=193 second=266 amount=-3 +kerning first=202 second=382 amount=-2 +kerning first=274 second=109 amount=-1 +kerning first=8217 second=331 amount=-2 +kerning first=111 second=369 amount=-1 +kerning first=262 second=327 amount=-3 +kerning first=202 second=122 amount=-2 +kerning first=382 second=109 amount=-2 +kerning first=115 second=375 amount=-3 +kerning first=252 second=369 amount=-1 +kerning first=88 second=266 amount=-3 +kerning first=45 second=278 amount=-5 +kerning first=346 second=109 amount=-1 +kerning first=119 second=97 amount=-3 +kerning first=229 second=273 amount=-1 +kerning first=220 second=115 amount=-2 +kerning first=216 second=370 amount=-1 +kerning first=97 second=109 amount=-1 +kerning first=8222 second=311 amount=-1 +kerning first=115 second=115 amount=-3 +kerning first=288 second=370 amount=-1 +kerning first=202 second=109 amount=-1 +kerning first=8217 second=352 amount=-3 +kerning first=328 second=115 amount=-1 +kerning first=364 second=115 amount=-2 +kerning first=88 second=279 amount=-2 +kerning first=234 second=355 amount=-1 +kerning first=356 second=336 amount=-3 +kerning first=256 second=115 amount=-2 +kerning first=1118 second=1086 amount=-2 +kerning first=229 second=279 amount=-1 +kerning first=1082 second=1086 amount=-2 +kerning first=193 second=279 amount=-1 +kerning first=245 second=259 amount=-1 +kerning first=207 second=232 amount=-2 +kerning first=351 second=253 amount=-3 +kerning first=262 second=296 amount=-3 +kerning first=378 second=355 amount=-1 +kerning first=279 second=232 amount=-1 +kerning first=334 second=296 amount=-2 +kerning first=356 second=353 amount=-3 +kerning first=256 second=108 amount=-2 +kerning first=8217 second=337 amount=-3 +kerning first=75 second=370 amount=-2 +kerning first=328 second=108 amount=-1 +kerning first=83 second=69 amount=-3 +kerning first=263 second=8249 amount=-2 +kerning first=203 second=206 amount=-2 +kerning first=66 second=232 amount=-1 +kerning first=313 second=8221 amount=-4 +kerning first=334 second=315 amount=-2 +kerning first=187 second=85 amount=-4 +kerning first=262 second=303 amount=-1 +kerning first=82 second=338 amount=-3 +kerning first=248 second=328 amount=-1 +kerning first=298 second=303 amount=-1 +kerning first=1104 second=1113 amount=-2 +kerning first=82 second=85 amount=-3 +kerning first=201 second=325 amount=-2 +kerning first=266 second=75 amount=-3 +kerning first=226 second=303 amount=-1 +kerning first=282 second=196 amount=-2 +kerning first=204 second=290 amount=-2 +kerning first=356 second=328 amount=-3 +kerning first=262 second=315 amount=-3 +kerning first=354 second=196 amount=-6 +kerning first=334 second=303 amount=-1 +kerning first=268 second=221 amount=-1 +kerning first=381 second=325 amount=-1 +kerning first=370 second=303 amount=-2 +kerning first=198 second=83 amount=-2 +kerning first=257 second=225 amount=-1 +kerning first=243 second=261 amount=-1 +kerning first=89 second=323 amount=-1 +kerning first=69 second=196 amount=-2 +kerning first=371 second=380 amount=-1 +kerning first=371 second=98 amount=-1 +kerning first=1039 second=1117 amount=-1 +kerning first=210 second=196 amount=-4 +kerning first=8217 second=65 amount=-6 +kerning first=365 second=225 amount=-1 +kerning first=85 second=303 amount=-2 +kerning first=263 second=98 amount=-2 +kerning first=363 second=46 amount=-2 +kerning first=80 second=225 amount=-1 +kerning first=377 second=286 amount=-1 +kerning first=266 second=323 amount=-3 +kerning first=227 second=380 amount=-1 +kerning first=227 second=98 amount=-1 +kerning first=116 second=225 amount=-1 +kerning first=374 second=323 amount=-1 +kerning first=263 second=380 amount=-2 +kerning first=335 second=98 amount=-1 +kerning first=338 second=323 amount=-2 +kerning first=221 second=225 amount=-5 +kerning first=262 second=226 amount=-2 +kerning first=255 second=311 amount=-2 +kerning first=219 second=46 amount=-5 +kerning first=212 second=77 amount=-2 +kerning first=1050 second=1118 amount=-2 +kerning first=255 second=46 amount=-5 +kerning first=264 second=210 amount=-3 +kerning first=208 second=317 amount=-2 +kerning first=291 second=46 amount=-3 +kerning first=313 second=71 amount=-1 +kerning first=120 second=233 amount=-2 +kerning first=327 second=46 amount=-1 +kerning first=71 second=77 amount=-1 +kerning first=197 second=286 amount=-3 +kerning first=1086 second=1118 amount=-1 +kerning first=261 second=233 amount=-1 +kerning first=192 second=210 amount=-3 +kerning first=356 second=77 amount=-1 +kerning first=1056 second=1040 amount=-4 +kerning first=225 second=233 amount=-1 +kerning first=1114 second=1080 amount=-1 +kerning first=205 second=71 amount=-2 +kerning first=87 second=210 amount=-3 +kerning first=114 second=46 amount=-4 +kerning first=284 second=77 amount=-1 +kerning first=1105 second=1078 amount=-1 +kerning first=203 second=211 amount=-1 +kerning first=198 second=102 amount=-2 +kerning first=67 second=317 amount=-3 +kerning first=79 second=197 amount=-4 +kerning first=205 second=352 amount=-2 +kerning first=73 second=235 amount=-2 +kerning first=84 second=252 amount=-1 +kerning first=317 second=112 amount=-2 +kerning first=196 second=221 amount=-6 +kerning first=369 second=233 amount=-1 +kerning first=120 second=252 amount=-3 +kerning first=281 second=112 amount=-1 +kerning first=199 second=200 amount=-3 +kerning first=97 second=110 amount=-1 +kerning first=245 second=112 amount=-1 +kerning first=225 second=252 amount=-1 +kerning first=209 second=112 amount=-1 +kerning first=202 second=110 amount=-1 +kerning first=378 second=102 amount=-2 +kerning first=250 second=235 amount=-1 +kerning first=379 second=200 amount=-1 +kerning first=198 second=350 amount=-2 +kerning first=363 second=311 amount=-2 +kerning first=104 second=112 amount=-1 +kerning first=274 second=110 amount=-1 +kerning first=1071 second=1090 amount=-1 +kerning first=68 second=112 amount=-1 +kerning first=291 second=311 amount=-2 +kerning first=81 second=196 amount=-4 +kerning first=196 second=237 amount=-1 +kerning first=346 second=110 amount=-1 +kerning first=227 second=378 amount=-1 +kerning first=205 second=353 amount=-2 +kerning first=267 second=171 amount=-2 +kerning first=218 second=262 amount=-1 +kerning first=382 second=110 amount=-2 +kerning first=241 second=353 amount=-1 +kerning first=209 second=113 amount=-2 +kerning first=236 second=250 amount=-1 +kerning first=277 second=353 amount=-2 +kerning first=68 second=366 amount=-1 +kerning first=223 second=291 amount=-2 +kerning first=122 second=249 amount=-2 +kerning first=200 second=250 amount=-2 +kerning first=263 second=378 amount=-2 +kerning first=313 second=353 amount=-1 +kerning first=375 second=171 amount=-4 +kerning first=362 second=262 amount=-1 +kerning first=1089 second=1076 amount=-1 +kerning first=284 second=65 amount=-3 +kerning first=371 second=365 amount=-1 +kerning first=253 second=289 amount=-3 +kerning first=122 second=378 amount=-2 +kerning first=100 second=353 amount=-1 +kerning first=195 second=171 amount=-4 +kerning first=335 second=365 amount=-1 +kerning first=86 second=378 amount=-3 +kerning first=231 second=171 amount=-2 +kerning first=353 second=112 amount=-3 +kerning first=381 second=109 amount=-1 +kerning first=82 second=354 amount=-3 +kerning first=254 second=249 amount=-1 +kerning first=313 second=352 amount=-1 +kerning first=281 second=100 amount=-1 +kerning first=290 second=249 amount=-1 +kerning first=258 second=288 amount=-3 +kerning first=187 second=354 amount=-4 +kerning first=1053 second=1101 amount=-1 +kerning first=218 second=249 amount=-1 +kerning first=330 second=275 amount=-2 +kerning first=1042 second=1078 amount=-3 +kerning first=1057 second=1102 amount=-1 +kerning first=335 second=378 amount=-2 +kerning first=1046 second=1091 amount=-2 +kerning first=187 second=87 amount=-4 +kerning first=77 second=262 amount=-2 +kerning first=1056 second=1052 amount=-1 +kerning first=1082 second=1091 amount=-2 +kerning first=209 second=100 amount=-2 +kerning first=362 second=249 amount=-1 +kerning first=82 second=87 amount=-3 +kerning first=344 second=248 amount=-3 +kerning first=1064 second=1105 amount=-1 +kerning first=317 second=364 amount=-3 +kerning first=1107 second=1077 amount=-1 +kerning first=99 second=289 amount=-3 +kerning first=220 second=377 amount=-1 +kerning first=250 second=223 amount=-1 +kerning first=86 second=380 amount=-3 +kerning first=79 second=377 amount=-2 +kerning first=335 second=114 amount=-1 +kerning first=199 second=198 amount=-3 +kerning first=204 second=289 amount=-3 +kerning first=259 second=339 amount=-1 +kerning first=8250 second=106 amount=-2 +kerning first=122 second=380 amount=-2 +kerning first=75 second=45 amount=-4 +kerning first=1071 second=1077 amount=-1 +kerning first=1042 second=1065 amount=-2 +kerning first=371 second=114 amount=-1 +kerning first=240 second=289 amount=-2 +kerning first=89 second=330 amount=-1 +kerning first=77 second=249 amount=-1 +kerning first=263 second=114 amount=-1 +kerning first=326 second=8220 amount=-4 +kerning first=236 second=248 amount=-1 +kerning first=364 second=377 amount=-1 +kerning first=367 second=339 amount=-1 +kerning first=290 second=8220 amount=-1 +kerning first=366 second=288 amount=-1 +kerning first=254 second=8220 amount=-2 +kerning first=1025 second=1103 amount=-2 +kerning first=263 second=365 amount=-2 +kerning first=86 second=114 amount=-1 +kerning first=381 second=313 amount=-1 +kerning first=68 second=379 amount=-2 +kerning first=227 second=365 amount=-1 +kerning first=1024 second=1064 amount=-1 +kerning first=86 second=99 amount=-3 +kerning first=8217 second=291 amount=-4 +kerning first=113 second=8220 amount=-3 +kerning first=8250 second=107 amount=-1 +kerning first=197 second=287 amount=-3 +kerning first=236 second=263 amount=-1 +kerning first=1060 second=1064 amount=-1 +kerning first=376 second=237 amount=-2 +kerning first=196 second=289 amount=-3 +kerning first=122 second=365 amount=-2 +kerning first=118 second=339 amount=-3 +kerning first=201 second=313 amount=-2 +kerning first=317 second=82 amount=-2 +kerning first=269 second=287 amount=-3 +kerning first=86 second=365 amount=-2 +kerning first=122 second=99 amount=-1 +kerning first=304 second=237 amount=-1 +kerning first=334 second=378 amount=-2 +kerning first=1024 second=1079 amount=-1 +kerning first=236 second=234 amount=-1 +kerning first=263 second=99 amount=-1 +kerning first=268 second=237 amount=-1 +kerning first=1051 second=1094 amount=-1 +kerning first=89 second=75 amount=-1 +kerning first=227 second=99 amount=-1 +kerning first=82 second=339 amount=-3 +kerning first=1088 second=1119 amount=-1 +kerning first=317 second=379 amount=-3 +kerning first=305 second=287 amount=-2 +kerning first=208 second=229 amount=-1 +kerning first=379 second=198 amount=-1 +kerning first=280 second=44 amount=-1 +kerning first=356 second=334 amount=-3 +kerning first=333 second=237 amount=-1 +kerning first=187 second=344 amount=-5 +kerning first=377 second=287 amount=-3 +kerning first=196 second=234 amount=-1 +kerning first=352 second=44 amount=-4 +kerning first=87 second=197 amount=-6 +kerning first=232 second=234 amount=-1 +kerning first=261 second=237 amount=-1 +kerning first=66 second=244 amount=-1 +kerning first=307 second=44 amount=-2 +kerning first=204 second=284 amount=-2 +kerning first=268 second=234 amount=-2 +kerning first=225 second=237 amount=-1 +kerning first=317 second=104 amount=-2 +kerning first=103 second=44 amount=-3 +kerning first=363 second=324 amount=-1 +kerning first=75 second=354 amount=-2 +kerning first=281 second=104 amount=-2 +kerning first=120 second=237 amount=-1 +kerning first=218 second=267 amount=-2 +kerning first=245 second=104 amount=-1 +kerning first=208 second=44 amount=-3 +kerning first=264 second=197 amount=-3 +kerning first=84 second=237 amount=-2 +kerning first=112 second=187 amount=-2 +kerning first=216 second=354 amount=-2 +kerning first=232 second=227 amount=-2 +kerning first=1071 second=1084 amount=-1 +kerning first=336 second=197 amount=-4 +kerning first=199 second=194 amount=-3 +kerning first=122 second=111 amount=-1 +kerning first=90 second=337 amount=-1 +kerning first=288 second=354 amount=-3 +kerning first=227 second=111 amount=-1 +kerning first=209 second=237 amount=-1 +kerning first=82 second=351 amount=-2 +kerning first=376 second=227 amount=-5 +kerning first=1067 second=1054 amount=-1 +kerning first=304 second=234 amount=-2 +kerning first=99 second=277 amount=-1 +kerning first=1031 second=1054 amount=-1 +kerning first=205 second=74 amount=-1 +kerning first=288 second=87 amount=-3 +kerning first=304 second=227 amount=-2 +kerning first=376 second=234 amount=-3 +kerning first=1075 second=1104 amount=-1 +kerning first=204 second=277 amount=-2 +kerning first=268 second=227 amount=-2 +kerning first=216 second=87 amount=-2 +kerning first=86 second=111 amount=-3 +kerning first=353 second=367 amount=-1 +kerning first=380 second=254 amount=-1 +kerning first=198 second=361 amount=-2 +kerning first=193 second=267 amount=-1 +kerning first=220 second=121 amount=-1 +kerning first=313 second=74 amount=-1 +kerning first=367 second=351 amount=-2 +kerning first=380 second=257 amount=-1 +kerning first=229 second=267 amount=-1 +kerning first=331 second=351 amount=-1 +kerning first=201 second=314 amount=-1 +kerning first=77 second=261 amount=-2 +kerning first=281 second=367 amount=-2 +kerning first=88 second=267 amount=-2 +kerning first=115 second=121 amount=-3 +kerning first=75 second=364 amount=-2 +kerning first=70 second=264 amount=-1 +kerning first=113 second=261 amount=-2 +kerning first=317 second=367 amount=-2 +kerning first=234 second=361 amount=-2 +kerning first=269 second=8249 amount=-2 +kerning first=212 second=327 amount=-2 +kerning first=1114 second=1074 amount=-1 +kerning first=344 second=257 amount=-2 +kerning first=209 second=367 amount=-2 +kerning first=236 second=254 amount=-1 +kerning first=223 second=351 amount=-2 +kerning first=236 second=257 amount=-2 +kerning first=1042 second=1059 amount=-3 +kerning first=245 second=367 amount=-1 +kerning first=197 second=8249 amount=-4 +kerning first=284 second=327 amount=-1 +kerning first=288 second=364 amount=-1 +kerning first=187 second=351 amount=-1 +kerning first=272 second=257 amount=-1 +kerning first=104 second=367 amount=-1 +kerning first=8250 second=109 amount=-2 +kerning first=295 second=351 amount=-1 +kerning first=344 second=254 amount=-3 +kerning first=378 second=361 amount=-2 +kerning first=356 second=327 amount=-1 +kerning first=364 second=114 amount=-1 +kerning first=216 second=364 amount=-1 +kerning first=259 second=351 amount=-1 +kerning first=200 second=257 amount=-1 +kerning first=326 second=261 amount=-1 +kerning first=279 second=244 amount=-1 +kerning first=232 second=224 amount=-2 +kerning first=362 second=261 amount=-3 +kerning first=106 second=289 amount=-3 +kerning first=1055 second=1108 amount=-1 +kerning first=256 second=117 amount=-3 +kerning first=304 second=224 amount=-2 +kerning first=353 second=104 amount=-1 +kerning first=200 second=254 amount=-1 +kerning first=220 second=114 amount=-1 +kerning first=1038 second=1051 amount=-5 +kerning first=328 second=117 amount=-1 +kerning first=364 second=121 amount=-1 +kerning first=1067 second=1057 amount=-1 +kerning first=376 second=224 amount=-4 +kerning first=218 second=261 amount=-3 +kerning first=121 second=347 amount=-3 +kerning first=1031 second=1057 amount=-1 +kerning first=254 second=261 amount=-1 +kerning first=380 second=250 amount=-2 +kerning first=377 second=8249 amount=-3 +kerning first=290 second=261 amount=-1 +kerning first=344 second=250 amount=-2 +kerning first=211 second=274 amount=-2 +kerning first=369 second=237 amount=-2 +kerning first=356 second=337 amount=-3 +kerning first=369 second=240 amount=-1 +kerning first=1053 second=1088 amount=-1 +kerning first=356 second=331 amount=-3 +kerning first=209 second=101 amount=-2 +kerning first=324 second=97 amount=-1 +kerning first=1049 second=1082 amount=-1 +kerning first=1045 second=1038 amount=-3 +kerning first=1039 second=1107 amount=-1 +kerning first=274 second=268 amount=-1 +kerning first=8220 second=197 amount=-8 +kerning first=203 second=221 amount=-1 +kerning first=115 second=117 amount=-1 +kerning first=220 second=117 amount=-1 +kerning first=87 second=200 amount=-1 +kerning first=377 second=290 amount=-1 +kerning first=106 second=271 amount=-1 +kerning first=1024 second=1067 amount=-1 +kerning first=1045 second=1067 amount=-1 +kerning first=234 second=98 amount=-2 +kerning first=84 second=240 amount=-3 +kerning first=194 second=338 amount=-3 +kerning first=197 second=290 amount=-3 +kerning first=67 second=114 amount=-1 +kerning first=87 second=207 amount=-1 +kerning first=256 second=199 amount=-3 +kerning first=283 second=271 amount=-1 +kerning first=225 second=240 amount=-1 +kerning first=364 second=380 amount=-3 +kerning first=203 second=214 amount=-1 +kerning first=346 second=219 amount=-3 +kerning first=261 second=240 amount=-1 +kerning first=198 second=98 amount=-1 +kerning first=236 second=251 amount=-1 +kerning first=1060 second=1067 amount=-1 +kerning first=344 second=251 amount=-2 +kerning first=336 second=207 amount=-2 +kerning first=313 second=77 amount=-2 +kerning first=264 second=201 amount=-3 +kerning first=381 second=317 amount=-1 +kerning first=380 second=251 amount=-2 +kerning first=1107 second=1086 amount=-1 +kerning first=198 second=90 amount=-1 +kerning first=82 second=84 amount=-3 +kerning first=1070 second=1024 amount=-1 +kerning first=352 second=304 amount=-3 +kerning first=284 second=330 amount=-1 +kerning first=379 second=194 amount=-1 +kerning first=87 second=201 amount=-1 +kerning first=221 second=220 amount=-1 +kerning first=201 second=317 amount=-2 +kerning first=280 second=304 amount=-2 +kerning first=264 second=207 amount=-3 +kerning first=323 second=291 amount=-3 +kerning first=1118 second=1101 amount=-1 +kerning first=219 second=324 amount=-2 +kerning first=79 second=381 amount=-2 +kerning first=1071 second=1081 amount=-1 +kerning first=75 second=97 amount=-1 +kerning first=336 second=200 amount=-2 +kerning first=8250 second=110 amount=-2 +kerning first=287 second=291 amount=-2 +kerning first=350 second=234 amount=-1 +kerning first=240 second=107 amount=-1 +kerning first=251 second=291 amount=-3 +kerning first=291 second=324 amount=-1 +kerning first=260 second=213 amount=-3 +kerning first=264 second=200 amount=-3 +kerning first=221 second=213 amount=-3 +kerning first=255 second=324 amount=-2 +kerning first=220 second=381 amount=-1 +kerning first=118 second=233 amount=-3 +kerning first=262 second=311 amount=-1 +kerning first=252 second=97 amount=-1 +kerning first=226 second=311 amount=-1 +kerning first=110 second=291 amount=-2 +kerning first=288 second=97 amount=-1 +kerning first=74 second=291 amount=-3 +kerning first=107 second=337 amount=-3 +kerning first=1089 second=1088 amount=-1 +kerning first=356 second=71 amount=-3 +kerning first=121 second=311 amount=-2 +kerning first=1082 second=1101 amount=-1 +kerning first=364 second=381 amount=-1 +kerning first=1039 second=1114 amount=-1 +kerning first=216 second=97 amount=-1 +kerning first=263 second=226 amount=-2 +kerning first=369 second=243 amount=-1 +kerning first=227 second=375 amount=-3 +kerning first=87 second=203 amount=-1 +kerning first=73 second=228 amount=-2 +kerning first=228 second=8220 amount=-3 +kerning first=217 second=193 amount=-4 +kerning first=236 second=253 amount=-3 +kerning first=122 second=375 amount=-2 +kerning first=79 second=120 amount=-1 +kerning first=1086 second=1114 amount=-1 +kerning first=86 second=375 amount=-3 +kerning first=203 second=218 amount=-2 +kerning first=115 second=120 amount=-3 +kerning first=225 second=243 amount=-1 +kerning first=71 second=70 amount=-1 +kerning first=371 second=375 amount=-2 +kerning first=261 second=243 amount=-1 +kerning first=1089 second=1085 amount=-1 +kerning first=344 second=253 amount=-3 +kerning first=335 second=375 amount=-3 +kerning first=353 second=103 amount=-3 +kerning first=1053 second=1085 amount=-1 +kerning first=380 second=253 amount=-2 +kerning first=317 second=103 amount=-3 +kerning first=1031 second=1060 amount=-1 +kerning first=263 second=375 amount=-2 +kerning first=326 second=249 amount=-1 +kerning first=281 second=103 amount=-3 +kerning first=1067 second=1060 amount=-1 +kerning first=208 second=310 amount=-2 +kerning first=70 second=268 amount=-1 +kerning first=268 second=245 amount=-2 +kerning first=328 second=120 amount=-1 +kerning first=284 second=70 amount=-1 +kerning first=364 second=120 amount=-2 +kerning first=1082 second=1095 amount=-1 +kerning first=336 second=203 amount=-2 +kerning first=1046 second=1095 amount=-3 +kerning first=67 second=310 amount=-3 +kerning first=212 second=70 amount=-2 +kerning first=356 second=68 amount=-1 +kerning first=187 second=78 amount=-5 +kerning first=352 second=310 amount=-3 +kerning first=1064 second=1100 amount=-1 +kerning first=264 second=203 amount=-3 +kerning first=364 second=118 amount=-2 +kerning first=223 second=345 amount=-1 +kerning first=1100 second=1100 amount=-1 +kerning first=194 second=286 amount=-3 +kerning first=328 second=118 amount=-3 +kerning first=220 second=120 amount=-2 +kerning first=280 second=310 amount=-2 +kerning first=356 second=70 amount=-1 +kerning first=80 second=196 amount=-4 +kerning first=1056 second=1043 amount=-1 +kerning first=336 second=201 amount=-2 +kerning first=371 second=105 amount=-1 +kerning first=220 second=118 amount=-2 +kerning first=102 second=245 amount=-1 +kerning first=371 second=108 amount=-2 +kerning first=8250 second=112 amount=-2 +kerning first=121 second=305 amount=-2 +kerning first=66 second=245 amount=-1 +kerning first=85 second=305 amount=-2 +kerning first=335 second=105 amount=-1 +kerning first=199 second=304 amount=-3 +kerning first=256 second=118 amount=-3 +kerning first=204 second=283 amount=-2 +kerning first=226 second=305 amount=-1 +kerning first=227 second=105 amount=-1 +kerning first=45 second=379 amount=-4 +kerning first=374 second=335 amount=-3 +kerning first=1058 second=1117 amount=-2 +kerning first=263 second=105 amount=-2 +kerning first=279 second=245 amount=-1 +kerning first=351 second=241 amount=-2 +kerning first=99 second=283 amount=-1 +kerning first=298 second=305 amount=-1 +kerning first=122 second=105 amount=-1 +kerning first=115 second=118 amount=-3 +kerning first=1107 second=1083 amount=-3 +kerning first=262 second=305 amount=-1 +kerning first=356 second=65 amount=-6 +kerning first=207 second=245 amount=-2 +kerning first=89 second=334 amount=-3 +kerning first=370 second=305 amount=-2 +kerning first=262 second=86 amount=-1 +kerning first=230 second=335 amount=-1 +kerning first=243 second=241 amount=-1 +kerning first=334 second=305 amount=-1 +kerning first=86 second=105 amount=-2 +kerning first=255 second=318 amount=-2 +kerning first=376 second=231 amount=-3 +kerning first=325 second=244 amount=-2 +kerning first=291 second=318 amount=-3 +kerning first=315 second=241 amount=-1 +kerning first=1024 second=1070 amount=-1 +kerning first=122 second=108 amount=-2 +kerning first=279 second=241 amount=-2 +kerning first=286 second=228 amount=-1 +kerning first=263 second=108 amount=-3 +kerning first=363 second=318 amount=-2 +kerning first=66 second=241 amount=-3 +kerning first=250 second=228 amount=-1 +kerning first=227 second=108 amount=-1 +kerning first=89 second=335 amount=-3 +kerning first=214 second=228 amount=-1 +kerning first=335 second=108 amount=-2 +kerning first=76 second=193 amount=-2 +kerning first=194 second=335 amount=-1 +kerning first=102 second=241 amount=-1 +kerning first=118 second=347 amount=-3 +kerning first=82 second=347 amount=-2 +kerning first=266 second=66 amount=-3 +kerning first=1042 second=1058 amount=-1 +kerning first=354 second=205 amount=-1 +kerning first=304 second=231 amount=-2 +kerning first=376 second=230 amount=-5 +kerning first=362 second=256 amount=-4 +kerning first=8250 second=379 amount=-4 +kerning first=362 second=380 amount=-3 +kerning first=99 second=281 amount=-1 +kerning first=1038 second=1047 amount=-3 +kerning first=362 second=255 amount=-1 +kerning first=232 second=231 amount=-1 +kerning first=374 second=66 amount=-1 +kerning first=304 second=230 amount=-2 +kerning first=89 second=332 amount=-3 +kerning first=290 second=256 amount=-3 +kerning first=326 second=255 amount=-2 +kerning first=268 second=231 amount=-2 +kerning first=103 second=307 amount=-2 +kerning first=338 second=66 amount=-2 +kerning first=210 second=205 amount=-2 +kerning first=221 second=216 amount=-3 +kerning first=1082 second=1098 amount=-1 +kerning first=194 second=332 amount=-3 +kerning first=263 second=371 amount=-2 +kerning first=254 second=255 amount=-3 +kerning first=8217 second=74 amount=-3 +kerning first=1046 second=1098 amount=-3 +kerning first=218 second=255 amount=-1 +kerning first=367 second=347 amount=-2 +kerning first=336 second=45 amount=-1 +kerning first=266 second=332 amount=-3 +kerning first=335 second=371 amount=-1 +kerning first=380 second=102 amount=-2 +kerning first=331 second=347 amount=-1 +kerning first=371 second=371 amount=-1 +kerning first=241 second=112 amount=-1 +kerning first=113 second=255 amount=-1 +kerning first=295 second=347 amount=-1 +kerning first=317 second=107 amount=-2 +kerning first=338 second=332 amount=-1 +kerning first=77 second=255 amount=-2 +kerning first=381 second=346 amount=-1 +kerning first=281 second=107 amount=-2 +kerning first=1052 second=1094 amount=-1 +kerning first=302 second=332 amount=-2 +kerning first=122 second=371 amount=-2 +kerning first=66 second=242 amount=-1 +kerning first=223 second=347 amount=-2 +kerning first=69 second=205 amount=-2 +kerning first=187 second=347 amount=-1 +kerning first=353 second=107 amount=-1 +kerning first=374 second=332 amount=-3 +kerning first=227 second=371 amount=-1 +kerning first=71 second=68 amount=-1 +kerning first=66 second=249 amount=-3 +kerning first=264 second=204 amount=-3 +kerning first=367 second=345 amount=-1 +kerning first=203 second=217 amount=-2 +kerning first=1027 second=1033 amount=-5 +kerning first=250 second=229 amount=-1 +kerning first=8216 second=277 amount=-3 +kerning first=336 second=204 amount=-2 +kerning first=207 second=242 amount=-2 +kerning first=286 second=229 amount=-1 +kerning first=356 second=67 amount=-3 +kerning first=104 second=106 amount=-2 +kerning first=82 second=81 amount=-3 +kerning first=279 second=242 amount=-1 +kerning first=252 second=289 amount=-3 +kerning first=284 second=68 amount=-1 +kerning first=222 second=282 amount=-2 +kerning first=68 second=106 amount=-1 +kerning first=212 second=68 amount=-2 +kerning first=281 second=106 amount=-2 +kerning first=232 second=230 amount=-2 +kerning first=81 second=282 amount=-2 +kerning first=84 second=243 amount=-3 +kerning first=205 second=346 amount=-2 +kerning first=317 second=106 amount=-2 +kerning first=268 second=230 amount=-2 +kerning first=97 second=119 amount=-3 +kerning first=45 second=282 amount=-5 +kerning first=120 second=243 amount=-2 +kerning first=244 second=307 amount=-1 +kerning first=245 second=106 amount=-2 +kerning first=202 second=119 amount=-1 +kerning first=316 second=307 amount=-1 +kerning first=109 second=8217 amount=-4 +kerning first=87 second=204 amount=-1 +kerning first=223 second=287 amount=-2 +kerning first=274 second=119 amount=-1 +kerning first=313 second=346 amount=-1 +kerning first=353 second=106 amount=-1 +kerning first=310 second=119 amount=-3 +kerning first=1039 second=1047 amount=-1 +kerning first=346 second=119 amount=-3 +kerning first=90 second=361 amount=-3 +kerning first=103 second=230 amount=-3 +kerning first=213 second=327 amount=-2 +kerning first=233 second=275 amount=-1 +kerning first=89 second=353 amount=-3 +kerning first=310 second=199 amount=-3 +kerning first=378 second=249 amount=-2 +kerning first=269 second=275 amount=-1 +kerning first=67 second=230 amount=-2 +kerning first=321 second=327 amount=-2 +kerning first=307 second=223 amount=-1 +kerning first=1107 second=1072 amount=-1 +kerning first=197 second=275 amount=-1 +kerning first=248 second=229 amount=-1 +kerning first=84 second=45 amount=-5 +kerning first=8250 second=302 amount=-5 +kerning first=72 second=81 amount=-2 +kerning first=321 second=67 amount=-1 +kerning first=310 second=111 amount=-2 +kerning first=84 second=256 amount=-6 +kerning first=199 second=223 amount=-1 +kerning first=368 second=268 amount=-1 +kerning first=218 second=211 amount=-1 +kerning first=374 second=339 amount=-3 +kerning first=77 second=211 amount=-2 +kerning first=352 second=230 amount=-2 +kerning first=235 second=223 amount=-1 +kerning first=86 second=264 amount=-3 +kerning first=88 second=87 amount=-2 +kerning first=280 second=230 amount=-1 +kerning first=8250 second=368 amount=-4 +kerning first=296 second=268 amount=-2 +kerning first=198 second=249 amount=-2 +kerning first=377 second=275 amount=-1 +kerning first=208 second=230 amount=-1 +kerning first=260 second=268 amount=-3 +kerning first=234 second=249 amount=-2 +kerning first=244 second=230 amount=-1 +kerning first=68 second=204 amount=-2 +kerning first=86 second=209 amount=-1 +kerning first=233 second=289 amount=-3 +kerning first=379 second=237 amount=-1 +kerning first=68 second=218 amount=-1 +kerning first=269 second=289 amount=-3 +kerning first=194 second=339 amount=-1 +kerning first=119 second=380 amount=-3 +kerning first=67 second=244 amount=-2 +kerning first=378 second=263 amount=-1 +kerning first=214 second=315 amount=-2 +kerning first=307 second=237 amount=-1 +kerning first=1053 second=1081 amount=-1 +kerning first=1025 second=1091 amount=-1 +kerning first=103 second=244 amount=-2 +kerning first=213 second=313 amount=-2 +kerning first=89 second=339 amount=-3 +kerning first=1061 second=1091 amount=-2 +kerning first=68 second=259 amount=-1 +kerning first=377 second=289 amount=-3 +kerning first=235 second=237 amount=-2 +kerning first=1101 second=1088 amount=-1 +kerning first=199 second=237 amount=-1 +kerning first=234 second=263 amount=-1 +kerning first=230 second=339 amount=-1 +kerning first=78 second=199 amount=-2 +kerning first=332 second=282 amount=-2 +kerning first=1052 second=1084 amount=-1 +kerning first=266 second=339 amount=-2 +kerning first=316 second=244 amount=-1 +kerning first=338 second=353 amount=-1 +kerning first=337 second=365 amount=-1 +kerning first=374 second=353 amount=-3 +kerning first=83 second=296 amount=-3 +kerning first=350 second=361 amount=-1 +kerning first=102 second=8249 amount=-3 +kerning first=77 second=225 amount=-2 +kerning first=204 second=334 amount=-2 +kerning first=113 second=225 amount=-2 +kerning first=377 second=249 amount=-3 +kerning first=1097 second=1105 amount=-1 +kerning first=1069 second=1065 amount=-1 +kerning first=229 second=365 amount=-1 +kerning first=1052 second=1098 amount=-1 +kerning first=194 second=353 amount=-2 +kerning first=83 second=282 amount=-3 +kerning first=193 second=365 amount=-3 +kerning first=240 second=8221 amount=-2 +kerning first=230 second=353 amount=-2 +kerning first=203 second=346 amount=-2 +kerning first=266 second=353 amount=-2 +kerning first=88 second=365 amount=-3 +kerning first=1062 second=1079 amount=-1 +kerning first=197 second=289 amount=-3 +kerning first=302 second=353 amount=-2 +kerning first=332 second=296 amount=-2 +kerning first=352 second=202 amount=-3 +kerning first=335 second=305 amount=-1 +kerning first=193 second=351 amount=-2 +kerning first=307 second=251 amount=-1 +kerning first=203 second=374 amount=-1 +kerning first=266 second=121 amount=-1 +kerning first=224 second=254 amount=-1 +kerning first=45 second=105 amount=-1 +kerning first=230 second=121 amount=-2 +kerning first=280 second=202 amount=-2 +kerning first=260 second=254 amount=-2 +kerning first=210 second=206 amount=-2 +kerning first=194 second=121 amount=-3 +kerning first=234 second=277 amount=-1 +kerning first=229 second=351 amount=-1 +kerning first=282 second=206 amount=-2 +kerning first=89 second=121 amount=-3 +kerning first=1072 second=1074 amount=-1 +kerning first=194 second=79 amount=-3 +kerning first=83 second=254 amount=-2 +kerning first=338 second=367 amount=-2 +kerning first=354 second=206 amount=-1 +kerning first=1042 second=1103 amount=-2 +kerning first=89 second=381 amount=-3 +kerning first=119 second=254 amount=-1 +kerning first=286 second=69 amount=-1 +kerning first=374 second=367 amount=-2 +kerning first=89 second=79 amount=-3 +kerning first=266 second=367 amount=-2 +kerning first=302 second=79 amount=-2 +kerning first=352 second=244 amount=-1 +kerning first=228 second=117 amount=-1 +kerning first=274 second=344 amount=-2 +kerning first=214 second=69 amount=-2 +kerning first=302 second=367 amount=-2 +kerning first=338 second=79 amount=-1 +kerning first=219 second=199 amount=-1 +kerning first=1051 second=1096 amount=-1 +kerning first=347 second=114 amount=-1 +kerning first=192 second=117 amount=-3 +kerning first=194 second=367 amount=-3 +kerning first=209 second=234 amount=-2 +kerning first=8220 second=99 amount=-3 +kerning first=346 second=344 amount=-3 +kerning first=84 second=284 amount=-3 +kerning first=233 second=261 amount=-2 +kerning first=230 second=367 amount=-2 +kerning first=266 second=79 amount=-3 +kerning first=82 second=336 amount=-3 +kerning first=275 second=114 amount=-1 +kerning first=264 second=117 amount=-2 +kerning first=203 second=72 amount=-2 +kerning first=214 second=83 amount=-1 +kerning first=268 second=255 amount=-1 +kerning first=89 second=367 amount=-2 +kerning first=327 second=199 amount=-2 +kerning first=338 second=381 amount=-1 +kerning first=336 second=192 amount=-4 +kerning first=374 second=121 amount=-3 +kerning first=286 second=83 amount=-2 +kerning first=187 second=76 amount=-5 +kerning first=204 second=121 amount=-2 +kerning first=374 second=79 amount=-3 +kerning first=1063 second=1081 amount=-1 +kerning first=202 second=344 amount=-2 +kerning first=1025 second=1119 amount=-1 +kerning first=364 second=71 amount=-1 +kerning first=264 second=192 amount=-3 +kerning first=1027 second=1081 amount=-2 +kerning first=98 second=114 amount=-1 +kerning first=302 second=121 amount=-2 +kerning first=1078 second=1089 amount=-2 +kerning first=1072 second=1088 amount=-1 +kerning first=296 second=240 amount=-2 +kerning first=1108 second=1088 amount=-1 +kerning first=338 second=107 amount=-1 +kerning first=78 second=171 amount=-4 +kerning first=229 second=337 amount=-1 +kerning first=280 second=216 amount=-1 +kerning first=114 second=171 amount=-1 +kerning first=193 second=337 amount=-1 +kerning first=224 second=240 amount=-1 +kerning first=203 second=86 amount=-1 +kerning first=8220 second=113 amount=-3 +kerning first=260 second=240 amount=-1 +kerning first=269 second=261 amount=-2 +kerning first=230 second=107 amount=-2 +kerning first=326 second=382 amount=-1 +kerning first=67 second=216 amount=-3 +kerning first=305 second=261 amount=-1 +kerning first=194 second=107 amount=-2 +kerning first=362 second=382 amount=-3 +kerning first=321 second=287 amount=-3 +kerning first=368 second=240 amount=-2 +kerning first=377 second=261 amount=-1 +kerning first=266 second=107 amount=-1 +kerning first=252 second=109 amount=-1 +kerning first=1027 second=1095 amount=-3 +kerning first=363 second=171 amount=-2 +kerning first=67 second=202 amount=-3 +kerning first=346 second=330 amount=-3 +kerning first=8250 second=274 amount=-5 +kerning first=199 second=209 amount=-3 +kerning first=274 second=330 amount=-2 +kerning first=208 second=202 amount=-2 +kerning first=219 second=171 amount=-5 +kerning first=275 second=100 amount=-1 +kerning first=119 second=240 amount=-3 +kerning first=255 second=171 amount=-4 +kerning first=1024 second=1117 amount=-1 +kerning first=379 second=209 amount=-1 +kerning first=291 second=171 amount=-3 +kerning first=1048 second=1075 amount=-1 +kerning first=327 second=171 amount=-4 +kerning first=83 second=240 amount=-1 +kerning first=1067 second=1099 amount=-1 +kerning first=295 second=252 amount=-1 +kerning first=69 second=206 amount=-2 +kerning first=255 second=227 amount=-3 +kerning first=1073 second=1076 amount=-1 +kerning first=205 second=350 amount=-2 +kerning first=331 second=252 amount=-1 +kerning first=219 second=227 amount=-3 +kerning first=353 second=8221 amount=-2 +kerning first=198 second=207 amount=-2 +kerning first=367 second=252 amount=-1 +kerning first=114 second=227 amount=-1 +kerning first=118 second=252 amount=-1 +kerning first=187 second=252 amount=-1 +kerning first=363 second=227 amount=-1 +kerning first=216 second=44 amount=-3 +kerning first=223 second=252 amount=-1 +kerning first=234 second=305 amount=-2 +kerning first=1051 second=1082 amount=-1 +kerning first=327 second=227 amount=-2 +kerning first=281 second=246 amount=-1 +kerning first=100 second=103 amount=-2 +kerning first=259 second=252 amount=-1 +kerning first=198 second=305 amount=-1 +kerning first=291 second=227 amount=-3 +kerning first=1039 second=1082 amount=-1 +kerning first=336 second=103 amount=-1 +kerning first=378 second=291 amount=-2 +kerning first=83 second=226 amount=-2 +kerning first=249 second=271 amount=-1 +kerning first=313 second=90 amount=-3 +kerning first=379 second=251 amount=-3 +kerning first=119 second=226 amount=-3 +kerning first=68 second=260 amount=-4 +kerning first=210 second=74 amount=-2 +kerning first=378 second=378 amount=-2 +kerning first=201 second=241 amount=-1 +kerning first=264 second=103 amount=-3 +kerning first=224 second=226 amount=-1 +kerning first=198 second=45 amount=-2 +kerning first=8250 second=344 amount=-5 +kerning first=78 second=227 amount=-2 +kerning first=192 second=103 amount=-3 +kerning first=234 second=291 amount=-3 +kerning first=88 second=337 amount=-2 +kerning first=198 second=291 amount=-3 +kerning first=296 second=226 amount=-2 +kerning first=270 second=45 amount=-1 +kerning first=87 second=103 amount=-4 +kerning first=332 second=226 amount=-1 +kerning first=378 second=45 amount=-3 +kerning first=113 second=382 amount=-2 +kerning first=235 second=230 amount=-2 +kerning first=368 second=226 amount=-3 +kerning first=317 second=260 amount=-2 +kerning first=307 second=324 amount=-2 +kerning first=346 second=84 amount=-3 +kerning first=327 second=213 amount=-2 +kerning first=249 second=109 amount=-1 +kerning first=310 second=84 amount=-2 +kerning first=274 second=84 amount=-1 +kerning first=192 second=89 amount=-6 +kerning first=321 second=109 amount=-1 +kerning first=105 second=271 amount=-1 +kerning first=108 second=109 amount=-1 +kerning first=209 second=115 amount=-2 +kerning first=368 second=212 amount=-1 +kerning first=245 second=115 amount=-2 +kerning first=260 second=212 amount=-3 +kerning first=104 second=115 amount=-1 +kerning first=208 second=196 amount=-4 +kerning first=296 second=212 amount=-2 +kerning first=275 second=44 amount=-3 +kerning first=353 second=115 amount=-3 +kerning first=332 second=84 amount=-2 +kerning first=332 second=78 amount=-2 +kerning first=281 second=232 amount=-1 +kerning first=100 second=104 amount=-1 +kerning first=1092 second=1076 amount=-2 +kerning first=347 second=44 amount=-2 +kerning first=323 second=303 amount=-1 +kerning first=281 second=115 amount=-2 +kerning first=78 second=213 amount=-2 +kerning first=311 second=44 amount=-1 +kerning first=317 second=115 amount=-1 +kerning first=8216 second=74 amount=-3 +kerning first=73 second=303 amount=-1 +kerning first=98 second=44 amount=-3 +kerning first=346 second=70 amount=-3 +kerning first=264 second=89 amount=-1 +kerning first=313 second=104 amount=-2 +kerning first=1052 second=1079 amount=-1 +kerning first=277 second=104 amount=-2 +kerning first=192 second=267 amount=-1 +kerning first=203 second=44 amount=-1 +kerning first=274 second=70 amount=-2 +kerning first=370 second=277 amount=-2 +kerning first=243 second=369 amount=-1 +kerning first=83 second=78 amount=-3 +kerning first=378 second=277 amount=-1 +kerning first=209 second=232 amount=-2 +kerning first=219 second=213 amount=-1 +kerning first=74 second=303 amount=-2 +kerning first=8218 second=355 amount=-2 +kerning first=284 second=325 amount=-1 +kerning first=110 second=303 amount=-1 +kerning first=202 second=98 amount=-1 +kerning first=286 second=98 amount=-1 +kerning first=310 second=98 amount=-1 +kerning first=315 second=8249 amount=-1 +kerning first=87 second=75 amount=-1 +kerning first=368 second=237 amount=-2 +kerning first=356 second=325 amount=-1 +kerning first=187 second=280 amount=-5 +kerning first=274 second=98 amount=-1 +kerning first=351 second=8249 amount=-1 +kerning first=107 second=283 amount=-3 +kerning first=251 second=303 amount=-2 +kerning first=277 second=118 amount=-2 +kerning first=289 second=120 amount=-2 +kerning first=374 second=196 amount=-6 +kerning first=336 second=75 amount=-2 +kerning first=287 second=303 amount=-2 +kerning first=1045 second=1025 amount=-1 +kerning first=241 second=118 amount=-3 +kerning first=255 second=328 amount=-2 +kerning first=8250 second=330 amount=-5 +kerning first=219 second=328 amount=-2 +kerning first=331 second=120 amount=-1 +kerning first=198 second=73 amount=-2 +kerning first=264 second=75 amount=-3 +kerning first=97 second=98 amount=-1 +kerning first=313 second=118 amount=-3 +kerning first=266 second=196 amount=-3 +kerning first=100 second=118 amount=-2 +kerning first=1098 second=1093 amount=-2 +kerning first=208 second=287 amount=-1 +kerning first=272 second=80 amount=-2 +kerning first=272 second=204 amount=-2 +kerning first=381 second=291 amount=-3 +kerning first=338 second=196 amount=-2 +kerning first=1098 second=1107 amount=-1 +kerning first=205 second=118 amount=-2 +kerning first=363 second=328 amount=-1 +kerning first=317 second=218 amount=-3 +kerning first=1037 second=1104 amount=-1 +kerning first=382 second=98 amount=-1 +kerning first=291 second=241 amount=-1 +kerning first=204 second=338 amount=-2 +kerning first=346 second=98 amount=-2 +kerning first=255 second=241 amount=-2 +kerning first=356 second=283 amount=-3 +kerning first=363 second=241 amount=-1 +kerning first=212 second=325 amount=-2 +kerning first=1037 second=1090 amount=-1 +kerning first=8218 second=369 amount=-1 +kerning first=280 second=286 amount=-1 +kerning first=82 second=266 amount=-3 +kerning first=1113 second=1087 amount=-1 +kerning first=219 second=241 amount=-2 +kerning first=284 second=311 amount=-1 +kerning first=374 second=210 amount=-3 +kerning first=248 second=311 amount=-1 +kerning first=102 second=8221 amount=3 +kerning first=226 second=314 amount=-1 +kerning first=302 second=210 amount=-2 +kerning first=287 second=331 amount=-1 +kerning first=89 second=304 amount=-1 +kerning first=288 second=171 amount=-3 +kerning first=266 second=210 amount=-3 +kerning first=83 second=353 amount=-1 +kerning first=66 second=8221 amount=-4 +kerning first=1102 second=1118 amount=-1 +kerning first=74 second=345 amount=-1 +kerning first=363 second=255 amount=-3 +kerning first=234 second=235 amount=-1 +kerning first=279 second=8221 amount=-2 +kerning first=194 second=210 amount=-3 +kerning first=251 second=331 amount=-1 +kerning first=327 second=255 amount=-2 +kerning first=258 second=334 amount=-3 +kerning first=315 second=8221 amount=-4 +kerning first=219 second=269 amount=-2 +kerning first=382 second=112 amount=-3 +kerning first=110 second=331 amount=-1 +kerning first=291 second=255 amount=-1 +kerning first=89 second=210 amount=-3 +kerning first=346 second=112 amount=-3 +kerning first=82 second=252 amount=-2 +kerning first=89 second=224 amount=-4 +kerning first=97 second=99 amount=-1 +kerning first=243 second=8221 amount=-2 +kerning first=291 second=269 amount=-2 +kerning first=310 second=112 amount=-1 +kerning first=251 second=345 amount=-1 +kerning first=321 second=81 amount=-1 +kerning first=219 second=255 amount=-1 +kerning first=230 second=224 amount=-2 +kerning first=378 second=235 amount=-1 +kerning first=208 second=378 amount=-2 +kerning first=274 second=112 amount=-2 +kerning first=72 second=67 amount=-2 +kerning first=287 second=345 amount=-1 +kerning first=198 second=221 amount=-1 +kerning first=1077 second=1087 amount=-1 +kerning first=363 second=269 amount=-1 +kerning first=302 second=224 amount=-2 +kerning first=351 second=8221 amount=-2 +kerning first=202 second=112 amount=-2 +kerning first=78 second=255 amount=-2 +kerning first=266 second=224 amount=-2 +kerning first=374 second=224 amount=-4 +kerning first=88 second=281 amount=-2 +kerning first=284 second=256 amount=-3 +kerning first=217 second=352 amount=-3 +kerning first=371 second=279 amount=-3 +kerning first=326 second=326 amount=-1 +kerning first=338 second=224 amount=-1 +kerning first=68 second=302 amount=-2 +kerning first=118 second=380 amount=-3 +kerning first=75 second=101 amount=-2 +kerning first=362 second=326 amount=-2 +kerning first=234 second=347 amount=-2 +kerning first=193 second=281 amount=-1 +kerning first=337 second=250 amount=-1 +kerning first=198 second=347 amount=-1 +kerning first=229 second=281 amount=-1 +kerning first=67 second=259 amount=-2 +kerning first=113 second=326 amount=-2 +kerning first=121 second=328 amount=-2 +kerning first=279 second=371 amount=-2 +kerning first=88 second=250 amount=-3 +kerning first=221 second=231 amount=-3 +kerning first=76 second=250 amount=-2 +kerning first=325 second=352 amount=-2 +kerning first=252 second=101 amount=-1 +kerning first=228 second=307 amount=-1 +kerning first=218 second=326 amount=-2 +kerning first=80 second=231 amount=-1 +kerning first=351 second=371 amount=-1 +kerning first=193 second=250 amount=-3 +kerning first=254 second=326 amount=-1 +kerning first=227 second=333 amount=-1 +kerning first=260 second=366 amount=-3 +kerning first=1073 second=1118 amount=-2 +kerning first=102 second=371 amount=-1 +kerning first=220 second=257 amount=-3 +kerning first=78 second=283 amount=-2 +kerning first=262 second=328 amount=-1 +kerning first=1031 second=1047 amount=-1 +kerning first=228 second=351 amount=-1 +kerning first=226 second=328 amount=-1 +kerning first=1067 second=1047 amount=-1 +kerning first=115 second=257 amount=-1 +kerning first=263 second=333 amount=-1 +kerning first=317 second=302 amount=-2 +kerning first=243 second=371 amount=-1 +kerning first=291 second=283 amount=-2 +kerning first=234 second=378 amount=-2 +kerning first=97 second=369 amount=-1 +kerning first=230 second=8220 amount=-2 +kerning first=255 second=283 amount=-3 +kerning first=198 second=378 amount=-2 +kerning first=1038 second=1092 amount=-4 +kerning first=1048 second=1073 amount=-1 +kerning first=79 second=257 amount=-1 +kerning first=122 second=333 amount=-1 +kerning first=194 second=8220 amount=-5 +kerning first=219 second=283 amount=-2 +kerning first=378 second=347 amount=-2 +kerning first=370 second=328 amount=-2 +kerning first=86 second=333 amount=-3 +kerning first=76 second=352 amount=-1 +kerning first=268 second=217 amount=-2 +kerning first=1102 second=1090 amount=-1 +kerning first=103 second=113 amount=-2 +kerning first=310 second=288 amount=-3 +kerning first=67 second=113 amount=-2 +kerning first=249 second=243 amount=-1 +kerning first=367 second=235 amount=-1 +kerning first=332 second=106 amount=-1 +kerning first=105 second=269 amount=-1 +kerning first=83 second=198 amount=-4 +kerning first=376 second=217 amount=-1 +kerning first=85 second=45 amount=-5 +kerning first=202 second=288 amount=-1 +kerning first=83 second=366 amount=-3 +kerning first=67 second=345 amount=-1 +kerning first=1118 second=1093 amount=-1 +kerning first=103 second=345 amount=-1 +kerning first=113 second=245 amount=-1 +kerning first=274 second=288 amount=-1 +kerning first=72 second=243 amount=-2 +kerning first=1030 second=1090 amount=-1 +kerning first=108 second=243 amount=-1 +kerning first=244 second=345 amount=-1 +kerning first=112 second=120 amount=-3 +kerning first=332 second=198 amount=-4 +kerning first=368 second=198 amount=-4 +kerning first=203 second=262 amount=-1 +kerning first=217 second=120 amount=-2 +kerning first=352 second=345 amount=-2 +kerning first=201 second=79 amount=-1 +kerning first=356 second=255 amount=-3 +kerning first=84 second=368 amount=-1 +kerning first=253 second=120 amount=-1 +kerning first=8250 second=218 amount=-4 +kerning first=196 second=217 amount=-3 +kerning first=248 second=255 amount=-3 +kerning first=1057 second=1094 amount=-1 +kerning first=1047 second=1113 amount=-1 +kerning first=76 second=120 amount=-1 +kerning first=317 second=274 amount=-2 +kerning first=1051 second=1054 amount=-1 +kerning first=228 second=279 amount=-1 +kerning first=79 second=229 amount=-1 +kerning first=74 second=99 amount=-2 +kerning first=356 second=227 amount=-5 +kerning first=192 second=279 amount=-1 +kerning first=200 second=323 amount=-2 +kerning first=115 second=229 amount=-1 +kerning first=1048 second=1101 amount=-1 +kerning first=284 second=227 amount=-1 +kerning first=264 second=279 amount=-2 +kerning first=272 second=323 amount=-2 +kerning first=287 second=99 amount=-2 +kerning first=198 second=104 amount=-1 +kerning first=211 second=278 amount=-2 +kerning first=282 second=44 amount=-1 +kerning first=253 second=324 amount=-2 +kerning first=251 second=99 amount=-1 +kerning first=106 second=273 amount=-1 +kerning first=246 second=44 amount=-3 +kerning first=217 second=324 amount=-2 +kerning first=99 second=233 amount=-1 +kerning first=290 second=354 amount=-3 +kerning first=354 second=44 amount=-5 +kerning first=323 second=99 amount=-2 +kerning first=87 second=279 amount=-3 +kerning first=289 second=324 amount=-1 +kerning first=204 second=233 amount=-2 +kerning first=71 second=227 amount=-1 +kerning first=380 second=267 amount=-1 +kerning first=83 second=106 amount=-1 +kerning first=311 second=234 amount=-3 +kerning first=119 second=106 amount=-2 +kerning first=325 second=382 amount=-1 +kerning first=66 second=111 amount=-1 +kerning first=328 second=229 amount=-1 +kerning first=344 second=267 amount=-3 +kerning first=102 second=111 amount=-1 +kerning first=364 second=229 amount=-3 +kerning first=86 second=226 amount=-5 +kerning first=248 second=227 amount=-1 +kerning first=280 second=317 amount=-2 +kerning first=212 second=227 amount=-1 +kerning first=352 second=317 amount=-3 +kerning first=112 second=117 amount=-1 +kerning first=107 second=227 amount=-2 +kerning first=85 second=110 amount=-2 +kerning first=1049 second=1075 amount=-1 +kerning first=224 second=106 amount=-1 +kerning first=275 second=234 amount=-1 +kerning first=121 second=110 amount=-2 +kerning first=335 second=361 amount=-1 +kerning first=97 second=316 amount=-1 +kerning first=334 second=82 amount=-2 +kerning first=258 second=264 amount=-3 +kerning first=226 second=110 amount=-1 +kerning first=202 second=316 amount=-1 +kerning first=262 second=110 amount=-1 +kerning first=371 second=361 amount=-1 +kerning first=195 second=212 amount=-3 +kerning first=236 second=267 amount=-1 +kerning first=364 second=257 amount=-3 +kerning first=282 second=290 amount=-1 +kerning first=286 second=224 amount=-1 +kerning first=310 second=316 amount=-1 +kerning first=108 second=271 amount=-1 +kerning first=207 second=111 amount=-2 +kerning first=201 second=65 amount=-2 +kerning first=370 second=110 amount=-2 +kerning first=90 second=212 amount=-1 +kerning first=346 second=316 amount=-2 +kerning first=262 second=82 amount=-3 +kerning first=1058 second=1040 amount=-3 +kerning first=382 second=316 amount=-2 +kerning first=279 second=111 amount=-1 +kerning first=328 second=257 amount=-1 +kerning first=105 second=44 amount=-2 +kerning first=313 second=364 amount=-3 +kerning first=69 second=44 amount=-1 +kerning first=379 second=89 amount=-2 +kerning first=86 second=361 amount=-2 +kerning first=210 second=44 amount=-3 +kerning first=381 second=65 amount=-1 +kerning first=234 second=104 amount=-2 +kerning first=290 second=66 amount=-1 +kerning first=76 second=381 amount=-3 +kerning first=99 second=261 amount=-2 +kerning first=122 second=361 amount=-2 +kerning first=68 second=274 amount=-2 +kerning first=263 second=361 amount=-2 +kerning first=199 second=89 amount=-1 +kerning first=378 second=104 amount=-2 +kerning first=227 second=361 amount=-1 +kerning first=250 second=97 amount=-1 +kerning first=290 second=122 amount=-1 +kerning first=323 second=71 amount=-2 +kerning first=283 second=46 amount=-3 +kerning first=379 second=117 amount=-3 +kerning first=197 second=102 amount=-1 +kerning first=286 second=97 amount=-1 +kerning first=254 second=122 amount=-2 +kerning first=367 second=121 amount=-3 +kerning first=210 second=72 amount=-2 +kerning first=216 second=76 amount=-2 +kerning first=233 second=102 amount=-2 +kerning first=218 second=122 amount=-3 +kerning first=118 second=251 amount=-1 +kerning first=331 second=121 amount=-2 +kerning first=339 second=8250 amount=-2 +kerning first=269 second=102 amount=-2 +kerning first=214 second=97 amount=-1 +kerning first=295 second=121 amount=-2 +kerning first=187 second=278 amount=-5 +kerning first=282 second=72 amount=-2 +kerning first=355 second=225 amount=-1 +kerning first=106 second=46 amount=-2 +kerning first=259 second=121 amount=-3 +kerning first=8250 second=98 amount=-1 +kerning first=223 second=121 amount=-3 +kerning first=354 second=72 amount=-1 +kerning first=211 second=46 amount=-3 +kerning first=187 second=121 amount=-3 +kerning first=326 second=122 amount=-1 +kerning first=82 second=98 amount=-3 +kerning first=1050 second=1108 amount=-2 +kerning first=90 second=8250 amount=-1 +kerning first=210 second=325 amount=-2 +kerning first=199 second=377 amount=-2 +kerning first=375 second=240 amount=-3 +kerning first=250 second=245 amount=-1 +kerning first=66 second=200 amount=-4 +kerning first=305 second=105 amount=-1 +kerning first=70 second=46 amount=-3 +kerning first=69 second=332 amount=-1 +kerning first=316 second=243 amount=-1 +kerning first=113 second=122 amount=-2 +kerning first=235 second=117 amount=-2 +kerning first=69 second=72 amount=-2 +kerning first=315 second=200 amount=-2 +kerning first=77 second=122 amount=-1 +kerning first=199 second=117 amount=-2 +kerning first=87 second=363 amount=-2 +kerning first=116 second=287 amount=-2 +kerning first=282 second=332 amount=-1 +kerning first=379 second=377 amount=-1 +kerning first=80 second=287 amount=-3 +kerning first=330 second=264 amount=-2 +kerning first=288 second=76 amount=-1 +kerning first=221 second=287 amount=-4 +kerning first=310 second=366 amount=-2 +kerning first=221 second=339 amount=-3 +kerning first=332 second=310 amount=-2 +kerning first=195 second=240 amount=-1 +kerning first=365 second=259 amount=-1 +kerning first=66 second=255 amount=-3 +kerning first=90 second=240 amount=-1 +kerning first=257 second=287 amount=-2 +kerning first=73 second=214 amount=-2 +kerning first=303 second=240 amount=-3 +kerning first=257 second=259 amount=-1 +kerning first=196 second=242 amount=-1 +kerning first=339 second=240 amount=-1 +kerning first=221 second=259 amount=-5 +kerning first=232 second=100 amount=-1 +kerning first=231 second=240 amount=-1 +kerning first=1060 second=1053 amount=-1 +kerning first=268 second=242 amount=-2 +kerning first=84 second=197 amount=-6 +kerning first=267 second=240 amount=-1 +kerning first=69 second=220 amount=-2 +kerning first=232 second=242 amount=-1 +kerning first=278 second=369 amount=-2 +kerning first=80 second=259 amount=-1 +kerning first=379 second=253 amount=-3 +kerning first=76 second=324 amount=-1 +kerning first=242 second=369 amount=-1 +kerning first=354 second=304 amount=-1 +kerning first=304 second=242 amount=-2 +kerning first=350 second=369 amount=-1 +kerning first=74 second=71 amount=-2 +kerning first=324 second=375 amount=-2 +kerning first=210 second=220 amount=-1 +kerning first=314 second=369 amount=-2 +kerning first=116 second=259 amount=-1 +kerning first=240 second=116 amount=-1 +kerning first=282 second=304 amount=-2 +kerning first=376 second=242 amount=-3 +kerning first=112 second=324 amount=-1 +kerning first=118 second=289 amount=-3 +kerning first=73 second=97 amount=-2 +kerning first=101 second=369 amount=-2 +kerning first=1042 second=1030 amount=-2 +kerning first=109 second=97 amount=-1 +kerning first=65 second=369 amount=-3 +kerning first=210 second=304 amount=-2 +kerning first=200 second=119 amount=-1 +kerning first=206 second=369 amount=-2 +kerning first=86 second=211 amount=-3 +kerning first=354 second=220 amount=-1 +kerning first=317 second=330 amount=-2 +kerning first=236 second=119 amount=-3 +kerning first=1089 second=1100 amount=-1 +kerning first=70 second=74 amount=-4 +kerning first=102 second=107 amount=3 +kerning first=75 second=375 amount=-3 +kerning first=350 second=223 amount=-1 +kerning first=350 second=89 amount=-3 +kerning first=243 second=228 amount=-1 +kerning first=344 second=119 amount=-3 +kerning first=8220 second=230 amount=-3 +kerning first=207 second=228 amount=-2 +kerning first=211 second=74 amount=-2 +kerning first=380 second=119 amount=-2 +kerning first=203 second=203 amount=-2 +kerning first=1086 second=1080 amount=-1 +kerning first=223 second=307 amount=-1 +kerning first=252 second=375 amount=-3 +kerning first=68 second=330 amount=-2 +kerning first=250 second=273 amount=-1 +kerning first=122 second=331 amount=-2 +kerning first=66 second=228 amount=-3 +kerning first=278 second=223 amount=-1 +kerning first=111 second=375 amount=-3 +kerning first=242 second=223 amount=-1 +kerning first=1090 second=1105 amount=-1 +kerning first=249 second=355 amount=-1 +kerning first=195 second=268 amount=-3 +kerning first=304 second=103 amount=-3 +kerning first=84 second=80 amount=-1 +kerning first=101 second=223 amount=-1 +kerning first=352 second=113 amount=-1 +kerning first=108 second=355 amount=-1 +kerning first=290 second=298 amount=-1 +kerning first=331 second=46 amount=-1 +kerning first=1053 second=1079 amount=-1 +kerning first=1053 second=1100 amount=-1 +kerning first=83 second=310 amount=-3 +kerning first=90 second=268 amount=-1 +kerning first=283 second=253 amount=-2 +kerning first=71 second=8217 amount=-1 +kerning first=261 second=108 amount=-1 +kerning first=192 second=363 amount=-3 +kerning first=352 second=85 amount=-3 +kerning first=1046 second=1092 amount=-2 +kerning first=284 second=296 amount=-1 +kerning first=107 second=8217 amount=-2 +kerning first=225 second=108 amount=-1 +kerning first=228 second=363 amount=-1 +kerning first=333 second=108 amount=-2 +kerning first=264 second=363 amount=-2 +kerning first=332 second=303 amount=-1 +kerning first=280 second=85 amount=-2 +kerning first=98 second=318 amount=-2 +kerning first=8220 second=345 amount=-1 +kerning first=79 second=313 amount=-2 +kerning first=315 second=315 amount=-2 +kerning first=1025 second=1063 amount=-2 +kerning first=264 second=335 amount=-2 +kerning first=208 second=85 amount=-1 +kerning first=203 second=318 amount=-1 +kerning first=337 second=105 amount=-1 +kerning first=369 second=108 amount=-2 +kerning first=8250 second=70 amount=-5 +kerning first=66 second=315 amount=-4 +kerning first=1057 second=1038 amount=-1 +kerning first=73 second=245 amount=-2 +kerning first=275 second=318 amount=-3 +kerning first=1061 second=1063 amount=-4 +kerning first=203 second=290 amount=-1 +kerning first=211 second=225 amount=-1 +kerning first=87 second=335 amount=-3 +kerning first=347 second=318 amount=-2 +kerning first=193 second=105 amount=-1 +kerning first=253 second=380 amount=-3 +kerning first=1046 second=1083 amount=-2 +kerning first=365 second=231 amount=-1 +kerning first=105 second=248 amount=-1 +kerning first=229 second=105 amount=-1 +kerning first=289 second=380 amount=-3 +kerning first=283 second=225 amount=-2 +kerning first=192 second=335 amount=-1 +kerning first=347 second=228 amount=-1 +kerning first=257 second=231 amount=-1 +kerning first=325 second=380 amount=-1 +kerning first=1118 second=1083 amount=-3 +kerning first=228 second=335 amount=-1 +kerning first=1065 second=1060 amount=-1 +kerning first=368 second=338 amount=-1 +kerning first=248 second=8217 amount=-2 +kerning first=345 second=45 amount=-1 +kerning first=76 second=380 amount=-3 +kerning first=284 second=8217 amount=-1 +kerning first=70 second=225 amount=-2 +kerning first=296 second=338 amount=-2 +kerning first=112 second=380 amount=-2 +kerning first=106 second=225 amount=-2 +kerning first=260 second=338 amount=-3 +kerning first=351 second=228 amount=-1 +kerning first=120 second=108 amount=-1 +kerning first=290 second=270 amount=-1 +kerning first=217 second=380 amount=-3 +kerning first=1107 second=1103 amount=-2 +kerning first=243 second=367 amount=-1 +kerning first=375 second=98 amount=-1 +kerning first=225 second=225 amount=-1 +kerning first=216 second=280 amount=-2 +kerning first=339 second=98 amount=-2 +kerning first=261 second=225 amount=-1 +kerning first=101 second=251 amount=-2 +kerning first=1024 second=1100 amount=-1 +kerning first=86 second=235 amount=-3 +kerning first=344 second=228 amount=-2 +kerning first=242 second=251 amount=-1 +kerning first=288 second=280 amount=-1 +kerning first=122 second=235 amount=-1 +kerning first=333 second=225 amount=-1 +kerning first=206 second=251 amount=-2 +kerning first=8216 second=233 amount=-3 +kerning first=117 second=303 amount=-2 +kerning first=231 second=98 amount=-2 +kerning first=272 second=228 amount=-1 +kerning first=314 second=251 amount=-2 +kerning first=76 second=206 amount=-2 +kerning first=227 second=235 amount=-1 +kerning first=1105 second=1093 amount=-1 +kerning first=195 second=98 amount=-2 +kerning first=236 second=228 amount=-2 +kerning first=84 second=225 amount=-5 +kerning first=278 second=251 amount=-2 +kerning first=268 second=270 amount=-3 +kerning first=263 second=235 amount=-1 +kerning first=45 second=303 amount=-1 +kerning first=303 second=98 amount=-1 +kerning first=200 second=228 amount=-1 +kerning first=120 second=225 amount=-2 +kerning first=376 second=270 amount=-1 +kerning first=81 second=303 amount=-1 +kerning first=267 second=98 amount=-2 +kerning first=350 second=251 amount=-1 +kerning first=8217 second=255 amount=-1 +kerning first=284 second=370 amount=-1 +kerning first=279 second=273 amount=-1 +kerning first=305 second=46 amount=-2 +kerning first=356 second=370 amount=-1 +kerning first=216 second=218 amount=-1 +kerning first=283 second=102 amount=-2 +kerning first=321 second=289 amount=-3 +kerning first=377 second=46 amount=-1 +kerning first=256 second=355 amount=-1 +kerning first=102 second=273 amount=-1 +kerning first=369 second=225 amount=-1 +kerning first=313 second=325 amount=-2 +kerning first=1045 second=1070 amount=-1 +kerning first=106 second=102 amount=-2 +kerning first=1105 second=1107 amount=-1 +kerning first=65 second=253 amount=-3 +kerning first=233 second=46 amount=-3 +kerning first=115 second=355 amount=-2 +kerning first=275 second=303 amount=-2 +kerning first=303 second=112 amount=-1 +kerning first=221 second=83 amount=-3 +kerning first=364 second=81 amount=-1 +kerning first=365 second=363 amount=-1 +kerning first=267 second=112 amount=-1 +kerning first=65 second=67 amount=-3 +kerning first=232 second=318 amount=-3 +kerning first=231 second=112 amount=-1 +kerning first=268 second=318 amount=-1 +kerning first=295 second=8221 amount=-4 +kerning first=195 second=112 amount=-3 +kerning first=344 second=214 amount=-3 +kerning first=90 second=112 amount=-1 +kerning first=1024 second=1114 amount=-1 +kerning first=75 second=266 amount=-3 +kerning first=234 second=102 amount=-2 +kerning first=330 second=105 amount=-1 +kerning first=200 second=214 amount=-1 +kerning first=351 second=259 amount=-1 +kerning first=371 second=235 amount=-3 +kerning first=366 second=105 amount=-2 +kerning first=84 second=296 amount=-1 +kerning first=258 second=105 amount=-1 +kerning first=8250 second=370 amount=-4 +kerning first=203 second=117 amount=-2 +kerning first=220 second=81 amount=-1 +kerning first=278 second=67 amount=-1 +kerning first=207 second=259 amount=-2 +kerning first=222 second=105 amount=-1 +kerning first=251 second=267 amount=-1 +kerning first=196 second=233 amount=-1 +kerning first=375 second=112 amount=-2 +kerning first=8217 second=241 amount=-2 +kerning first=81 second=105 amount=-1 +kerning first=206 second=67 amount=-2 +kerning first=279 second=259 amount=-2 +kerning first=376 second=304 amount=-1 +kerning first=256 second=81 amount=-3 +kerning first=117 second=105 amount=-2 +kerning first=243 second=259 amount=-1 +kerning first=277 second=249 amount=-2 +kerning first=282 second=346 amount=-2 +kerning first=268 second=100 amount=-2 +kerning first=1059 second=1098 amount=-3 +kerning first=70 second=246 amount=-1 +kerning first=1104 second=1094 amount=-1 +kerning first=313 second=249 amount=-2 +kerning first=304 second=100 amount=-2 +kerning first=1045 second=1050 amount=-1 +kerning first=71 second=350 amount=-2 +kerning first=350 second=327 amount=-3 +kerning first=205 second=249 amount=-1 +kerning first=210 second=346 amount=-1 +kerning first=370 second=275 amount=-2 +kerning first=201 second=230 amount=-1 +kerning first=241 second=249 amount=-1 +kerning first=376 second=100 amount=-3 +kerning first=1055 second=1079 amount=-1 +kerning first=86 second=45 amount=-5 +kerning first=212 second=350 amount=-1 +kerning first=216 second=204 amount=-2 +kerning first=222 second=379 amount=-2 +kerning first=1043 second=1102 amount=-2 +kerning first=354 second=346 amount=-3 +kerning first=196 second=100 amount=-1 +kerning first=102 second=103 amount=-2 +kerning first=1079 second=1102 amount=-1 +kerning first=288 second=204 amount=-1 +kerning first=262 second=275 amount=-2 +kerning first=1070 second=1053 amount=-1 +kerning first=223 second=107 amount=-1 +kerning first=356 second=350 amount=-3 +kerning first=1104 second=1091 amount=-1 +kerning first=100 second=305 amount=-1 +kerning first=187 second=107 amount=-1 +kerning first=241 second=305 amount=-1 +kerning first=284 second=350 amount=-2 +kerning first=205 second=305 amount=-1 +kerning first=259 second=107 amount=-1 +kerning first=313 second=305 amount=-2 +kerning first=376 second=256 amount=-6 +kerning first=325 second=268 amount=-2 +kerning first=277 second=305 amount=-2 +kerning first=205 second=336 amount=-2 +kerning first=216 second=260 amount=-4 +kerning first=118 second=107 amount=-2 +kerning first=264 second=223 amount=-1 +kerning first=381 second=339 amount=-1 +kerning first=84 second=211 amount=-3 +kerning first=345 second=230 amount=-1 +kerning first=1070 second=1039 amount=-1 +kerning first=82 second=107 amount=-3 +kerning first=268 second=256 amount=-3 +kerning first=381 second=230 amount=-1 +kerning first=288 second=260 amount=-3 +kerning first=334 second=289 amount=-1 +kerning first=205 second=263 amount=-2 +kerning first=370 second=289 amount=-4 +kerning first=221 second=210 amount=-3 +kerning first=381 second=79 amount=-1 +kerning first=87 second=223 amount=-3 +kerning first=277 second=263 amount=-1 +kerning first=117 second=365 amount=-1 +kerning first=350 second=313 amount=-3 +kerning first=217 second=268 amount=-1 +kerning first=381 second=353 amount=-2 +kerning first=234 second=8217 amount=-2 +kerning first=221 second=192 amount=-6 +kerning first=45 second=365 amount=-1 +kerning first=336 second=237 amount=-1 +kerning first=75 second=218 amount=-2 +kerning first=278 second=313 amount=-2 +kerning first=270 second=8217 amount=-2 +kerning first=381 second=244 amount=-1 +kerning first=100 second=263 amount=-1 +kerning first=76 second=268 amount=-1 +kerning first=264 second=237 amount=-1 +kerning first=80 second=192 amount=-4 +kerning first=228 second=237 amount=-1 +kerning first=121 second=275 amount=-3 +kerning first=82 second=121 amount=-3 +kerning first=197 second=334 amount=-3 +kerning first=192 second=237 amount=-1 +kerning first=85 second=289 amount=-4 +kerning first=379 second=249 amount=-3 +kerning first=85 second=275 amount=-2 +kerning first=345 second=353 amount=-1 +kerning first=121 second=289 amount=-3 +kerning first=377 second=334 amount=-1 +kerning first=366 second=365 amount=-1 +kerning first=69 second=346 amount=-2 +kerning first=80 second=315 amount=-1 +kerning first=226 second=289 amount=-2 +kerning first=1050 second=1079 amount=-1 +kerning first=330 second=365 amount=-2 +kerning first=221 second=315 amount=-1 +kerning first=262 second=289 amount=-3 +kerning first=1087 second=1104 amount=-1 +kerning first=201 second=353 amount=-1 +kerning first=298 second=289 amount=-3 +kerning first=258 second=365 amount=-3 +kerning first=278 second=327 amount=-2 +kerning first=206 second=257 amount=-2 +kerning first=97 second=232 amount=-1 +kerning first=242 second=257 amount=-1 +kerning first=1069 second=1051 amount=-3 +kerning first=257 second=371 amount=-1 +kerning first=101 second=257 amount=-2 +kerning first=371 second=277 amount=-3 +kerning first=117 second=99 amount=-1 +kerning first=380 second=8249 amount=-3 +kerning first=364 second=347 amount=-2 +kerning first=187 second=381 amount=-4 +kerning first=263 second=277 amount=-1 +kerning first=227 second=277 amount=-1 +kerning first=90 second=302 amount=-1 +kerning first=324 second=251 amount=-1 +kerning first=116 second=371 amount=-1 +kerning first=344 second=8249 amount=-4 +kerning first=339 second=307 amount=-2 +kerning first=75 second=336 amount=-3 +kerning first=344 second=351 amount=-2 +kerning first=367 second=367 amount=-1 +kerning first=1044 second=1104 amount=-1 +kerning first=364 second=267 amount=-2 +kerning first=315 second=69 amount=-2 +kerning first=279 second=267 amount=-1 +kerning first=86 second=277 amount=-3 +kerning first=376 second=114 amount=-1 +kerning first=295 second=367 amount=-1 +kerning first=380 second=351 amount=-2 +kerning first=331 second=367 amount=-1 +kerning first=207 second=267 amount=-2 +kerning first=200 second=351 amount=-1 +kerning first=1058 second=1096 amount=-2 +kerning first=350 second=257 amount=-2 +kerning first=223 second=367 amount=-1 +kerning first=106 second=113 amount=-1 +kerning first=259 second=367 amount=-1 +kerning first=8217 second=378 amount=-1 +kerning first=217 second=212 amount=-1 +kerning first=1092 second=1081 amount=-1 +kerning first=8217 second=249 amount=-1 +kerning first=278 second=257 amount=-1 +kerning first=232 second=114 amount=-1 +kerning first=118 second=367 amount=-1 +kerning first=236 second=351 amount=-2 +kerning first=314 second=257 amount=-2 +kerning first=268 second=114 amount=-1 +kerning first=1096 second=1092 amount=-1 +kerning first=333 second=382 amount=-2 +kerning first=227 second=291 amount=-2 +kerning first=267 second=316 amount=-3 +kerning first=74 second=216 amount=-2 +kerning first=103 second=109 amount=-1 +kerning first=369 second=382 amount=-2 +kerning first=303 second=316 amount=-2 +kerning first=82 second=367 amount=-2 +kerning first=101 second=271 amount=-1 +kerning first=122 second=291 amount=-2 +kerning first=339 second=316 amount=-3 +kerning first=86 second=291 amount=-4 +kerning first=375 second=316 amount=-2 +kerning first=1053 second=1047 amount=-1 +kerning first=356 second=367 amount=-2 +kerning first=8217 second=263 amount=-3 +kerning first=66 second=267 amount=-1 +kerning first=225 second=382 amount=-1 +kerning first=102 second=267 amount=-1 +kerning first=261 second=382 amount=-1 +kerning first=236 second=337 amount=-1 +kerning first=112 second=226 amount=-1 +kerning first=204 second=261 amount=-2 +kerning first=364 second=197 amount=-4 +kerning first=197 second=314 amount=-2 +kerning first=1097 second=1086 amount=-1 +kerning first=240 second=261 amount=-1 +kerning first=1080 second=1104 amount=-1 +kerning first=256 second=347 amount=-2 +kerning first=102 second=281 amount=-1 +kerning first=85 second=269 amount=-2 +kerning first=109 second=8221 amount=-4 +kerning first=262 second=171 amount=-4 +kerning first=269 second=314 amount=-3 +kerning first=220 second=347 amount=-2 +kerning first=231 second=228 amount=-2 +kerning first=115 second=361 amount=-1 +kerning first=233 second=314 amount=-3 +kerning first=207 second=281 amount=-2 +kerning first=380 second=337 amount=-1 +kerning first=1058 second=1082 amount=-2 +kerning first=334 second=171 amount=-1 +kerning first=256 second=361 amount=-3 +kerning first=376 second=326 amount=-3 +kerning first=1079 second=1116 amount=-1 +kerning first=115 second=347 amount=-3 +kerning first=121 second=269 amount=-3 +kerning first=370 second=171 amount=-5 +kerning first=220 second=361 amount=-1 +kerning first=305 second=314 amount=-1 +kerning first=1043 second=1116 amount=-2 +kerning first=262 second=269 amount=-2 +kerning first=286 second=8221 amount=-1 +kerning first=85 second=171 amount=-5 +kerning first=328 second=361 amount=-1 +kerning first=226 second=269 amount=-1 +kerning first=365 second=371 amount=-1 +kerning first=121 second=171 amount=-4 +kerning first=195 second=316 amount=-2 +kerning first=323 second=216 amount=-2 +kerning first=302 second=67 amount=-2 +kerning first=241 second=97 amount=-1 +kerning first=66 second=281 amount=-1 +kerning first=298 second=269 amount=-2 +kerning first=231 second=316 amount=-3 +kerning first=250 second=8221 amount=-3 +kerning first=226 second=171 amount=-2 +kerning first=364 second=361 amount=-1 +kerning first=8218 second=251 amount=-1 +kerning first=268 second=326 amount=-1 +kerning first=313 second=45 amount=-1 +kerning first=116 second=103 amount=-2 +kerning first=370 second=269 amount=-2 +kerning first=201 second=224 amount=-1 +kerning first=80 second=103 amount=-3 +kerning first=67 second=331 amount=-1 +kerning first=230 second=252 amount=-2 +kerning first=76 second=78 amount=-2 +kerning first=266 second=252 amount=-2 +kerning first=317 second=70 amount=-2 +kerning first=321 second=201 amount=-2 +kerning first=1057 second=1051 amount=-1 +kerning first=262 second=227 amount=-2 +kerning first=344 second=226 amount=-2 +kerning first=345 second=224 amount=-1 +kerning first=233 second=100 amount=-1 +kerning first=275 second=46 amount=-3 +kerning first=82 second=101 amount=-3 +kerning first=213 second=201 amount=-2 +kerning first=89 second=252 amount=-1 +kerning first=121 second=227 amount=-3 +kerning first=382 second=246 amount=-1 +kerning first=217 second=226 amount=-3 +kerning first=346 second=246 amount=-1 +kerning first=253 second=226 amount=-3 +kerning first=380 second=378 amount=-2 +kerning first=310 second=246 amount=-2 +kerning first=313 second=207 amount=-2 +kerning first=222 second=317 amount=-2 +kerning first=259 second=101 amount=-1 +kerning first=84 second=382 amount=-3 +kerning first=289 second=226 amount=-3 +kerning first=365 second=103 amount=-3 +kerning first=8216 second=248 amount=-3 +kerning first=212 second=90 amount=-2 +kerning first=120 second=382 amount=-2 +kerning first=325 second=226 amount=-2 +kerning first=284 second=356 amount=-3 +kerning first=100 second=311 amount=-1 +kerning first=211 second=362 amount=-1 +kerning first=371 second=291 amount=-1 +kerning first=302 second=252 amount=-1 +kerning first=284 second=90 amount=-2 +kerning first=335 second=291 amount=-2 +kerning first=338 second=252 amount=-2 +kerning first=212 second=356 amount=-2 +kerning first=257 second=103 amount=-2 +kerning first=45 second=317 amount=-5 +kerning first=241 second=45 amount=-3 +kerning first=221 second=103 amount=-4 +kerning first=289 second=45 amount=-3 +kerning first=81 second=317 amount=-2 +kerning first=85 second=224 amount=-3 +kerning first=263 second=291 amount=-3 +kerning first=1056 second=1067 amount=-1 +kerning first=298 second=213 amount=-2 +kerning first=363 second=283 amount=-1 +kerning first=8222 second=86 amount=-6 +kerning first=1105 second=1090 amount=-1 +kerning first=262 second=213 amount=-3 +kerning first=327 second=283 amount=-2 +kerning first=66 second=259 amount=-3 +kerning first=68 second=84 amount=-2 +kerning first=284 second=104 amount=-1 +kerning first=370 second=213 amount=-1 +kerning first=278 second=109 amount=-1 +kerning first=80 second=89 amount=-1 +kerning first=75 second=115 amount=-1 +kerning first=74 second=210 amount=-2 +kerning first=71 second=370 amount=-1 +kerning first=242 second=109 amount=-1 +kerning first=317 second=84 amount=-3 +kerning first=214 second=82 amount=-2 +kerning first=212 second=370 amount=-1 +kerning first=350 second=109 amount=-1 +kerning first=8222 second=220 amount=-3 +kerning first=314 second=109 amount=-1 +kerning first=101 second=109 amount=-2 +kerning first=71 second=104 amount=-1 +kerning first=330 second=303 amount=-1 +kerning first=68 second=70 amount=-2 +kerning first=272 second=8249 amount=-1 +kerning first=370 second=227 amount=-3 +kerning first=111 second=115 amount=-2 +kerning first=313 second=193 amount=-2 +kerning first=222 second=303 amount=-1 +kerning first=334 second=227 amount=-1 +kerning first=82 second=220 amount=-3 +kerning first=258 second=303 amount=-1 +kerning first=1054 second=1113 amount=-2 +kerning first=200 second=8249 amount=-2 +kerning first=298 second=227 amount=-2 +kerning first=203 second=334 amount=-1 +kerning first=310 second=232 amount=-2 +kerning first=232 second=44 amount=-3 +kerning first=248 second=104 amount=-1 +kerning first=196 second=368 amount=-3 +kerning first=1048 second=1096 amount=-1 +kerning first=72 second=339 amount=-2 +kerning first=382 second=232 amount=-1 +kerning first=304 second=44 amount=-1 +kerning first=366 second=303 amount=-2 +kerning first=346 second=232 amount=-1 +kerning first=85 second=213 amount=-1 +kerning first=268 second=44 amount=-1 +kerning first=367 second=115 amount=-2 +kerning first=66 second=323 amount=-4 +kerning first=1075 second=1113 amount=-3 +kerning first=282 second=78 amount=-2 +kerning first=1052 second=1081 amount=-1 +kerning first=295 second=115 amount=-1 +kerning first=368 second=120 amount=-2 +kerning first=102 second=318 amount=3 +kerning first=331 second=115 amount=-1 +kerning first=268 second=368 amount=-2 +kerning first=210 second=78 amount=-2 +kerning first=378 second=118 amount=-2 +kerning first=82 second=375 amount=-3 +kerning first=69 second=78 amount=-2 +kerning first=268 second=203 amount=-3 +kerning first=199 second=75 amount=-3 +kerning first=311 second=248 amount=-3 +kerning first=288 second=70 amount=-1 +kerning first=1057 second=1080 amount=-1 +kerning first=376 second=368 amount=-1 +kerning first=224 second=120 amount=-1 +kerning first=315 second=323 amount=-2 +kerning first=350 second=201 amount=-3 +kerning first=234 second=118 amount=-2 +kerning first=323 second=113 amount=-2 +kerning first=99 second=253 amount=-2 +kerning first=379 second=75 amount=-1 +kerning first=201 second=85 amount=-2 +kerning first=290 second=80 amount=-1 +kerning first=198 second=118 amount=-1 +kerning first=287 second=113 amount=-2 +kerning first=278 second=201 amount=-2 +kerning first=236 second=106 amount=-2 +kerning first=251 second=113 amount=-1 +kerning first=204 second=253 amount=-2 +kerning first=86 second=73 amount=-1 +kerning first=375 second=246 amount=-3 +kerning first=290 second=278 amount=-1 +kerning first=240 second=253 amount=-3 +kerning first=84 second=171 amount=-5 +kerning first=106 second=233 amount=-1 +kerning first=339 second=246 amount=-1 +kerning first=8218 second=307 amount=-1 +kerning first=303 second=246 amount=-3 +kerning first=334 second=68 amount=-2 +kerning first=1071 second=1101 amount=-1 +kerning first=267 second=246 amount=-1 +kerning first=197 second=233 amount=-1 +kerning first=231 second=246 amount=-1 +kerning first=262 second=68 amount=-3 +kerning first=283 second=233 amount=-1 +kerning first=69 second=290 amount=-1 +kerning first=1048 second=1087 amount=-1 +kerning first=307 second=335 amount=-1 +kerning first=248 second=241 amount=-1 +kerning first=1087 second=1108 amount=-1 +kerning first=298 second=283 amount=-2 +kerning first=356 second=241 amount=-3 +kerning first=196 second=108 amount=-2 +kerning first=217 second=338 amount=-1 +kerning first=262 second=283 amount=-2 +kerning first=379 second=335 amount=-1 +kerning first=377 second=328 amount=-1 +kerning first=226 second=283 amount=-1 +kerning first=258 second=275 amount=-1 +kerning first=296 second=380 amount=-1 +kerning first=268 second=108 amount=-1 +kerning first=71 second=193 amount=-3 +kerning first=332 second=380 amount=-2 +kerning first=232 second=108 amount=-3 +kerning first=76 second=338 amount=-1 +kerning first=8216 second=362 amount=-1 +kerning first=381 second=286 amount=-1 +kerning first=199 second=335 amount=-2 +kerning first=332 second=120 amount=-1 +kerning first=233 second=110 amount=-2 +kerning first=235 second=335 amount=-1 +kerning first=67 second=65 amount=-3 +kerning first=370 second=283 amount=-2 +kerning first=269 second=110 amount=-2 +kerning first=192 second=231 amount=-1 +kerning first=363 second=105 amount=-2 +kerning first=205 second=287 amount=-3 +kerning first=1040 second=1118 amount=-3 +kerning first=201 second=286 amount=-1 +kerning first=352 second=331 amount=-1 +kerning first=275 second=248 amount=-1 +kerning first=228 second=231 amount=-1 +kerning first=82 second=115 amount=-2 +kerning first=284 second=193 amount=-3 +kerning first=87 second=231 amount=-3 +kerning first=324 second=255 amount=-2 +kerning first=1050 second=1038 amount=-3 +kerning first=208 second=65 amount=-4 +kerning first=1063 second=1095 amount=-1 +kerning first=212 second=193 amount=-4 +kerning first=316 second=331 amount=-1 +kerning first=223 second=115 amount=-2 +kerning first=259 second=115 amount=-1 +kerning first=8218 second=305 amount=-1 +kerning first=244 second=331 amount=-1 +kerning first=264 second=231 amount=-2 +kerning first=118 second=115 amount=-3 +kerning first=352 second=65 amount=-4 +kerning first=1075 second=1083 amount=-3 +kerning first=103 second=331 amount=-1 +kerning first=83 second=380 amount=-2 +kerning first=187 second=115 amount=-1 +kerning first=325 second=338 amount=-2 +kerning first=354 second=78 amount=-1 +kerning first=356 second=193 amount=-6 +kerning first=116 second=307 amount=-1 +kerning first=120 second=326 amount=-1 +kerning first=122 second=257 amount=-1 +kerning first=274 second=302 amount=-2 +kerning first=72 second=257 amount=-2 +kerning first=371 second=347 amount=-2 +kerning first=75 second=210 amount=-3 +kerning first=1055 second=1073 amount=-1 +kerning first=366 second=250 amount=-1 +kerning first=277 second=255 amount=-2 +kerning first=225 second=326 amount=-1 +kerning first=335 second=347 amount=-2 +kerning first=1102 second=1076 amount=-2 +kerning first=1091 second=1073 amount=-1 +kerning first=374 second=8249 amount=-5 +kerning first=202 second=302 amount=-2 +kerning first=241 second=255 amount=-2 +kerning first=257 second=307 amount=-1 +kerning first=261 second=326 amount=-1 +kerning first=354 second=352 amount=-3 +kerning first=205 second=255 amount=-2 +kerning first=263 second=347 amount=-2 +kerning first=1074 second=1078 amount=-1 +kerning first=258 second=250 amount=-3 +kerning first=227 second=347 amount=-1 +kerning first=100 second=255 amount=-2 +kerning first=196 second=262 amount=-3 +kerning first=365 second=307 amount=-2 +kerning first=250 second=371 amount=-1 +kerning first=244 second=223 amount=-1 +kerning first=346 second=8250 amount=-1 +kerning first=330 second=250 amount=-2 +kerning first=84 second=326 amount=-3 +kerning first=122 second=347 amount=-2 +kerning first=251 second=109 amount=-1 +kerning first=1075 second=1077 amount=-1 +kerning first=241 second=378 amount=-1 +kerning first=45 second=250 amount=-1 +kerning first=205 second=378 amount=-1 +kerning first=69 second=352 amount=-2 +kerning first=1104 second=1097 amount=-1 +kerning first=313 second=378 amount=-3 +kerning first=1039 second=1077 amount=-1 +kerning first=117 second=250 amount=-1 +kerning first=277 second=378 amount=-2 +kerning first=278 second=377 amount=-1 +kerning first=76 second=332 amount=-1 +kerning first=213 second=257 amount=-1 +kerning first=1103 second=1092 amount=-1 +kerning first=249 second=257 amount=-1 +kerning first=305 second=328 amount=-1 +kerning first=367 second=8220 amount=-3 +kerning first=121 second=283 amount=-3 +kerning first=1024 second=1047 amount=-1 +kerning first=108 second=257 amount=-2 +kerning first=269 second=328 amount=-2 +kerning first=331 second=8220 amount=-4 +kerning first=85 second=283 amount=-2 +kerning first=1048 second=1094 amount=-1 +kerning first=346 second=302 amount=-3 +kerning first=1060 second=1047 amount=-2 +kerning first=210 second=352 amount=-1 +kerning first=233 second=328 amount=-2 +kerning first=295 second=8220 amount=-4 +kerning first=100 second=378 amount=-1 +kerning first=195 second=366 amount=-3 +kerning first=378 second=333 amount=-1 +kerning first=219 second=339 amount=-2 +kerning first=259 second=8220 amount=-3 +kerning first=267 second=106 amount=-2 +kerning first=217 second=332 amount=-1 +kerning first=1070 second=1045 amount=-1 +kerning first=223 second=8220 amount=-2 +kerning first=209 second=288 amount=-2 +kerning first=303 second=106 amount=3 +kerning first=350 second=377 amount=-1 +kerning first=325 second=332 amount=-2 +kerning first=1031 second=1092 amount=-1 +kerning first=317 second=288 amount=-1 +kerning first=226 second=98 amount=-1 +kerning first=87 second=287 amount=-4 +kerning first=1067 second=1092 amount=-1 +kerning first=231 second=106 amount=-2 +kerning first=228 second=287 amount=-2 +kerning first=234 second=333 amount=-1 +kerning first=82 second=8220 amount=-5 +kerning first=87 second=45 amount=-5 +kerning first=192 second=287 amount=-3 +kerning first=46 second=8220 amount=-5 +kerning first=256 second=87 amount=-6 +kerning first=74 second=113 amount=-2 +kerning first=1072 second=1116 amount=-1 +kerning first=339 second=106 amount=-2 +kerning first=264 second=287 amount=-3 +kerning first=375 second=106 amount=-2 +kerning first=86 second=347 amount=-3 +kerning first=84 second=217 amount=-1 +kerning first=304 second=262 amount=-2 +kerning first=336 second=287 amount=-1 +kerning first=258 second=99 amount=-1 +kerning first=364 second=243 amount=-2 +kerning first=79 second=87 amount=-2 +kerning first=87 second=100 amount=-3 +kerning first=275 second=242 amount=-1 +kerning first=344 second=281 amount=-3 +kerning first=376 second=262 amount=-3 +kerning first=330 second=99 amount=-2 +kerning first=380 second=281 amount=-1 +kerning first=83 second=120 amount=-3 +kerning first=192 second=263 amount=-1 +kerning first=1049 second=1098 amount=-1 +kerning first=333 second=326 amount=-1 +kerning first=220 second=243 amount=-2 +kerning first=8217 second=199 amount=-2 +kerning first=369 second=326 amount=-1 +kerning first=256 second=243 amount=-1 +kerning first=236 second=281 amount=-1 +kerning first=268 second=197 amount=-3 +kerning first=90 second=198 amount=-1 +kerning first=66 second=119 amount=-3 +kerning first=211 second=354 amount=-2 +kerning first=8220 second=331 amount=-1 +kerning first=224 second=324 amount=-1 +kerning first=268 second=374 amount=-1 +kerning first=376 second=197 amount=-6 +kerning first=71 second=249 amount=-1 +kerning first=207 second=119 amount=-2 +kerning first=85 second=334 amount=-1 +kerning first=107 second=249 amount=-1 +kerning first=195 second=254 amount=-2 +kerning first=243 second=119 amount=-2 +kerning first=196 second=374 amount=-6 +kerning first=83 second=324 amount=-1 +kerning first=77 second=74 amount=-1 +kerning first=1044 second=1054 amount=-1 +kerning first=279 second=119 amount=-2 +kerning first=249 second=369 amount=-1 +kerning first=288 second=274 amount=-1 +kerning first=315 second=119 amount=-3 +kerning first=298 second=334 amount=-2 +kerning first=78 second=289 amount=-3 +kerning first=317 second=344 amount=-2 +kerning first=351 second=119 amount=-3 +kerning first=321 second=369 amount=-2 +kerning first=119 second=324 amount=-2 +kerning first=262 second=334 amount=-3 +kerning first=218 second=74 amount=-3 +kerning first=1048 second=1079 amount=-1 +kerning first=379 second=279 amount=-1 +kerning first=68 second=344 amount=-2 +kerning first=335 second=229 amount=-1 +kerning first=333 second=46 amount=-3 +kerning first=227 second=229 amount=-1 +kerning first=8216 second=375 amount=-1 +kerning first=67 second=339 amount=-2 +kerning first=1101 second=1074 amount=-1 +kerning first=263 second=229 amount=-2 +kerning first=103 second=339 amount=-2 +kerning first=218 second=284 amount=-1 +kerning first=235 second=279 amount=-1 +kerning first=316 second=339 amount=-1 +kerning first=77 second=284 amount=-2 +kerning first=199 second=279 amount=-2 +kerning first=368 second=324 amount=-2 +kerning first=287 second=351 amount=-3 +kerning first=352 second=339 amount=-1 +kerning first=1051 second=1079 amount=-1 +kerning first=105 second=234 amount=-1 +kerning first=307 second=279 amount=-1 +kerning first=371 second=229 amount=-2 +kerning first=1057 second=1024 amount=-1 +kerning first=8222 second=226 amount=-2 +kerning first=262 second=219 amount=-2 +kerning first=302 second=244 amount=-2 +kerning first=1030 second=1084 amount=-1 +kerning first=241 second=8217 amount=-4 +kerning first=69 second=86 amount=-1 +kerning first=277 second=8217 amount=-2 +kerning first=205 second=199 amount=-2 +kerning first=374 second=244 amount=-3 +kerning first=250 second=111 amount=-1 +kerning first=313 second=8217 amount=-4 +kerning first=350 second=209 amount=-3 +kerning first=323 second=264 amount=-2 +kerning first=354 second=234 amount=-3 +kerning first=367 second=107 amount=-2 +kerning first=282 second=86 amount=-1 +kerning first=286 second=220 amount=-1 +kerning first=84 second=66 amount=-1 +kerning first=1085 second=1089 amount=-1 +kerning first=1045 second=1064 amount=-1 +kerning first=313 second=199 amount=-1 +kerning first=338 second=254 amount=-1 +kerning first=100 second=8217 amount=-2 +kerning first=1049 second=1089 amount=-1 +kerning first=210 second=86 amount=-2 +kerning first=73 second=111 amount=-2 +kerning first=370 second=334 amount=-1 +kerning first=252 second=121 amount=-3 +kerning first=272 second=82 amount=-2 +kerning first=68 second=76 amount=-2 +kerning first=212 second=364 amount=-1 +kerning first=375 second=254 amount=-1 +kerning first=219 second=289 amount=-4 +kerning first=206 second=289 amount=-3 +kerning first=200 second=241 amount=-1 +kerning first=255 second=289 amount=-3 +kerning first=1024 second=1041 amount=-1 +kerning first=89 second=244 amount=-3 +kerning first=111 second=121 amount=-3 +kerning first=1105 second=1099 amount=-1 +kerning first=71 second=364 amount=-1 +kerning first=377 second=205 amount=-1 +kerning first=75 second=121 amount=-3 +kerning first=356 second=364 amount=-1 +kerning first=231 second=254 amount=-2 +kerning first=278 second=209 amount=-2 +kerning first=194 second=244 amount=-1 +kerning first=363 second=289 amount=-3 +kerning first=267 second=254 amount=-2 +kerning first=230 second=244 amount=-1 +kerning first=284 second=364 amount=-1 +kerning first=303 second=254 amount=-1 +kerning first=261 second=8249 amount=-2 +kerning first=266 second=244 amount=-2 +kerning first=339 second=254 amount=-2 +kerning first=202 second=296 amount=-2 +kerning first=278 second=117 amount=-2 +kerning first=76 second=72 amount=-2 +kerning first=116 second=97 amount=-1 +kerning first=104 second=109 amount=-1 +kerning first=242 second=117 amount=-1 +kerning first=286 second=200 amount=-1 +kerning first=72 second=251 amount=-2 +kerning first=274 second=296 amount=-2 +kerning first=350 second=117 amount=-1 +kerning first=317 second=76 amount=-2 +kerning first=99 second=102 amount=-2 +kerning first=314 second=117 amount=-2 +kerning first=80 second=97 amount=-1 +kerning first=365 second=245 amount=-1 +kerning first=346 second=296 amount=-3 +kerning first=315 second=85 amount=-3 +kerning first=333 second=122 amount=-2 +kerning first=218 second=225 amount=-3 +kerning first=108 second=251 amount=-2 +kerning first=313 second=370 amount=-3 +kerning first=280 second=71 amount=-1 +kerning first=254 second=225 amount=-1 +kerning first=249 second=251 amount=-1 +kerning first=324 second=121 amount=-2 +kerning first=221 second=97 amount=-5 +kerning first=261 second=122 amount=-1 +kerning first=1096 second=1086 amount=-1 +kerning first=290 second=225 amount=-1 +kerning first=257 second=97 amount=-1 +kerning first=225 second=122 amount=-1 +kerning first=326 second=225 amount=-1 +kerning first=321 second=251 amount=-2 +kerning first=310 second=240 amount=-2 +kerning first=99 second=46 amount=-3 +kerning first=83 second=206 amount=-3 +kerning first=365 second=97 amount=-1 +kerning first=80 second=245 amount=-1 +kerning first=116 second=363 amount=-1 +kerning first=88 second=264 amount=-3 +kerning first=1054 second=1063 amount=-2 +kerning first=332 second=206 amount=-2 +kerning first=249 second=103 amount=-3 +kerning first=101 second=117 amount=-2 +kerning first=221 second=363 amount=-2 +kerning first=65 second=117 amount=-3 +kerning first=240 second=102 amount=-1 +kerning first=257 second=363 amount=-1 +kerning first=382 second=240 amount=-1 +kerning first=334 second=219 amount=-1 +kerning first=206 second=117 amount=-2 +kerning first=257 second=245 amount=-1 +kerning first=354 second=290 amount=-3 +kerning first=8250 second=84 amount=-4 +kerning first=221 second=245 amount=-3 +kerning first=87 second=83 amount=-3 +kerning first=315 second=214 amount=-1 +kerning first=98 second=223 amount=-1 +kerning first=288 second=330 amount=-1 +kerning first=192 second=83 amount=-3 +kerning first=222 second=194 amount=-4 +kerning first=90 second=310 amount=-1 +kerning first=207 second=214 amount=-2 +kerning first=81 second=194 amount=-4 +kerning first=211 second=298 amount=-2 +kerning first=1053 second=1114 amount=-1 +kerning first=8220 second=65 amount=-8 +kerning first=336 second=83 amount=-1 +kerning first=97 second=240 amount=-1 +kerning first=1089 second=1114 amount=-1 +kerning first=1038 second=1082 amount=-4 +kerning first=362 second=284 amount=-1 +kerning first=289 second=230 amount=-3 +kerning first=108 second=369 amount=-2 +kerning first=250 second=259 amount=-1 +kerning first=259 second=375 amount=-3 +kerning first=1058 second=1088 amount=-2 +kerning first=72 second=369 amount=-2 +kerning first=214 second=259 amount=-1 +kerning first=223 second=375 amount=-3 +kerning first=272 second=77 amount=-2 +kerning first=363 second=267 amount=-1 +kerning first=76 second=220 amount=-3 +kerning first=1086 second=1094 amount=-1 +kerning first=187 second=375 amount=-3 +kerning first=377 second=344 amount=-1 +kerning first=286 second=259 amount=-1 +kerning first=377 second=116 amount=-1 +kerning first=66 second=214 amount=-3 +kerning first=200 second=77 amount=-2 +kerning first=197 second=116 amount=-1 +kerning first=80 second=313 amount=-1 +kerning first=367 second=375 amount=-3 +kerning first=203 second=304 amount=-2 +kerning first=269 second=116 amount=-1 +kerning first=331 second=375 amount=-2 +kerning first=67 second=71 amount=-3 +kerning first=109 second=259 amount=-1 +kerning first=233 second=116 amount=-1 +kerning first=295 second=375 amount=-2 +kerning first=1025 second=1049 amount=-1 +kerning first=366 second=194 amount=-4 +kerning first=332 second=220 amount=-1 +kerning first=1036 second=1108 amount=-2 +kerning first=327 second=233 amount=-2 +kerning first=332 second=330 amount=-2 +kerning first=1057 second=1045 amount=-1 +kerning first=291 second=233 amount=-2 +kerning first=356 second=291 amount=-4 +kerning first=88 second=214 amount=-3 +kerning first=260 second=220 amount=-3 +kerning first=88 second=71 amount=-3 +kerning first=203 second=298 amount=-2 +kerning first=363 second=233 amount=-1 +kerning first=280 second=86 amount=-1 +kerning first=74 second=337 amount=-2 +kerning first=1043 second=1082 amount=-2 +kerning first=248 second=291 amount=-2 +kerning first=105 second=240 amount=-1 +kerning first=78 second=350 amount=-2 +kerning first=315 second=194 amount=-2 +kerning first=100 second=110 amount=-1 +kerning first=212 second=291 amount=-1 +kerning first=1057 second=1030 amount=-1 +kerning first=70 second=248 amount=-1 +kerning first=87 second=97 amount=-5 +kerning first=107 second=291 amount=-2 +kerning first=251 second=337 amount=-1 +kerning first=219 second=350 amount=-3 +kerning first=377 second=213 amount=-1 +kerning first=84 second=304 amount=-1 +kerning first=198 second=334 amount=-1 +kerning first=241 second=110 amount=-1 +kerning first=71 second=291 amount=-3 +kerning first=274 second=324 amount=-1 +kerning first=336 second=97 amount=-1 +kerning first=277 second=110 amount=-2 +kerning first=260 second=84 amount=-6 +kerning first=382 second=324 amount=-2 +kerning first=228 second=97 amount=-1 +kerning first=305 second=109 amount=-1 +kerning first=313 second=110 amount=-1 +kerning first=234 second=311 amount=-2 +kerning first=346 second=324 amount=-1 +kerning first=264 second=97 amount=-2 +kerning first=198 second=311 amount=-1 +kerning first=120 second=318 amount=-1 +kerning first=193 second=71 amount=-3 +kerning first=97 second=324 amount=-1 +kerning first=323 second=337 amount=-2 +kerning first=225 second=318 amount=-1 +kerning first=1067 second=1114 amount=-1 +kerning first=287 second=337 amount=-2 +kerning first=327 second=350 amount=-2 +kerning first=83 second=330 amount=-3 +kerning first=202 second=324 amount=-1 +kerning first=225 second=44 amount=-1 +kerning first=224 second=234 amount=-1 +kerning first=255 second=104 amount=-2 +kerning first=1113 second=1081 amount=-1 +kerning first=260 second=234 amount=-1 +kerning first=346 second=78 amount=-3 +kerning first=121 second=378 amount=-3 +kerning first=296 second=234 amount=-2 +kerning first=280 second=381 amount=-1 +kerning first=261 second=44 amount=-1 +kerning first=83 second=70 amount=-3 +kerning first=187 second=260 amount=-4 +kerning first=274 second=78 amount=-2 +kerning first=8218 second=363 amount=-1 +kerning first=234 second=187 amount=-2 +kerning first=352 second=381 amount=-1 +kerning first=356 second=277 amount=-3 +kerning first=332 second=70 amount=-2 +kerning first=197 second=213 amount=-3 +kerning first=83 second=234 amount=-1 +kerning first=363 second=104 amount=-2 +kerning first=202 second=78 amount=-2 +kerning first=202 second=310 amount=-2 +kerning first=120 second=44 amount=-1 +kerning first=119 second=234 amount=-3 +kerning first=83 second=344 amount=-3 +kerning first=275 second=116 amount=-1 +kerning first=84 second=44 amount=-5 +kerning first=198 second=325 amount=-2 +kerning first=291 second=104 amount=-2 +kerning first=192 second=111 amount=-1 +kerning first=110 second=351 amount=-1 +kerning first=269 second=227 amount=-2 +kerning first=228 second=111 amount=-1 +kerning first=193 second=303 amount=-1 +kerning first=346 second=310 amount=-3 +kerning first=74 second=351 amount=-2 +kerning first=233 second=227 amount=-2 +kerning first=264 second=111 amount=-2 +kerning first=193 second=85 amount=-3 +kerning first=66 second=194 amount=-5 +kerning first=198 second=81 amount=-1 +kerning first=274 second=310 amount=-2 +kerning first=214 second=377 amount=-2 +kerning first=369 second=44 amount=-2 +kerning first=263 second=119 amount=-2 +kerning first=368 second=234 amount=-2 +kerning first=1086 second=1074 amount=-1 +kerning first=88 second=85 amount=-2 +kerning first=333 second=44 amount=-3 +kerning first=337 second=303 amount=-1 +kerning first=198 second=201 amount=-2 +kerning first=211 second=70 amount=-2 +kerning first=377 second=227 amount=-1 +kerning first=87 second=111 amount=-3 +kerning first=229 second=303 amount=-1 +kerning first=83 second=220 amount=-3 +kerning first=107 second=277 amount=-3 +kerning first=352 second=367 amount=-1 +kerning first=284 second=45 amount=-3 +kerning first=305 second=227 amount=-1 +kerning first=1045 second=1094 amount=-1 +kerning first=119 second=248 amount=-3 +kerning first=80 second=8249 amount=-3 +kerning first=220 second=235 amount=-2 +kerning first=78 second=118 amount=-2 +kerning first=275 second=380 amount=-2 +kerning first=234 second=283 amount=-1 +kerning first=286 second=377 amount=-2 +kerning first=256 second=235 amount=-1 +kerning first=45 second=109 amount=-2 +kerning first=219 second=118 amount=-2 +kerning first=74 second=105 amount=-2 +kerning first=251 second=8220 amount=-3 +kerning first=83 second=248 amount=-1 +kerning first=44 second=8249 amount=-3 +kerning first=110 second=105 amount=-1 +kerning first=347 second=380 amount=-2 +kerning first=1027 second=1087 amount=-2 +kerning first=310 second=338 amount=-3 +kerning first=351 second=367 amount=-1 +kerning first=337 second=228 amount=-1 +kerning first=305 second=241 amount=-1 +kerning first=110 second=8220 amount=-4 +kerning first=378 second=283 amount=-1 +kerning first=337 second=345 amount=-1 +kerning first=236 second=287 amount=-3 +kerning first=1031 second=1100 amount=-1 +kerning first=1083 second=1077 amount=-1 +kerning first=200 second=287 amount=-3 +kerning first=377 second=241 amount=-1 +kerning first=203 second=380 amount=-2 +kerning first=1067 second=1100 amount=-1 +kerning first=203 second=270 amount=-2 +kerning first=82 second=218 amount=-3 +kerning first=229 second=228 amount=-1 +kerning first=204 second=287 amount=-3 +kerning first=356 second=263 amount=-3 +kerning first=272 second=287 amount=-1 +kerning first=233 second=108 amount=-3 +kerning first=220 second=193 amount=-4 +kerning first=380 second=287 amount=-2 +kerning first=368 second=248 amount=-2 +kerning first=269 second=241 amount=-2 +kerning first=269 second=44 amount=-3 +kerning first=79 second=193 amount=-4 +kerning first=344 second=287 amount=-3 +kerning first=88 second=228 amount=-1 +kerning first=233 second=241 amount=-2 +kerning first=1037 second=1074 amount=-1 +kerning first=296 second=248 amount=-2 +kerning first=257 second=8249 amount=-2 +kerning first=364 second=193 amount=-4 +kerning first=201 second=8249 amount=-2 +kerning first=224 second=248 amount=-1 +kerning first=1050 second=1073 amount=-3 +kerning first=260 second=248 amount=-1 +kerning first=221 second=8249 amount=-5 +kerning first=1108 second=1094 amount=-1 +kerning first=377 second=255 amount=-3 +kerning first=346 second=352 amount=-1 +kerning first=333 second=318 amount=-2 +kerning first=368 second=112 amount=-2 +kerning first=1072 second=1094 amount=-1 +kerning first=369 second=318 amount=-2 +kerning first=332 second=112 amount=-1 +kerning first=1027 second=1073 amount=-1 +kerning first=305 second=255 amount=-2 +kerning first=115 second=251 amount=-1 +kerning first=296 second=112 amount=-1 +kerning first=1063 second=1073 amount=-1 +kerning first=229 second=331 amount=-1 +kerning first=256 second=221 amount=-6 +kerning first=269 second=255 amount=-2 +kerning first=260 second=112 amount=-3 +kerning first=1051 second=1104 amount=-1 +kerning first=233 second=255 amount=-2 +kerning first=197 second=255 amount=-3 +kerning first=260 second=262 amount=-3 +kerning first=85 second=74 amount=-3 +kerning first=296 second=262 amount=-2 +kerning first=378 second=311 amount=-2 +kerning first=119 second=112 amount=-2 +kerning first=79 second=221 amount=-2 +kerning first=202 second=338 amount=-1 +kerning first=224 second=98 amount=-1 +kerning first=99 second=314 amount=-3 +kerning first=8218 second=377 amount=-1 +kerning first=79 second=207 amount=-2 +kerning first=240 second=314 amount=-2 +kerning first=262 second=74 amount=-2 +kerning first=260 second=98 amount=-2 +kerning first=298 second=74 amount=-1 +kerning first=193 second=214 amount=-3 +kerning first=79 second=379 amount=-2 +kerning first=334 second=74 amount=-2 +kerning first=323 second=105 amount=-1 +kerning first=202 second=352 amount=-2 +kerning first=370 second=74 amount=-3 +kerning first=203 second=366 amount=-2 +kerning first=310 second=352 amount=-2 +kerning first=119 second=98 amount=-1 +kerning first=251 second=105 amount=-2 +kerning first=1108 second=1080 amount=-1 +kerning first=274 second=352 amount=-2 +kerning first=83 second=98 amount=-2 +kerning first=287 second=105 amount=-2 +kerning first=88 second=345 amount=1 +kerning first=250 second=307 amount=-2 +kerning first=103 second=224 amount=-3 +kerning first=210 second=282 amount=-2 +kerning first=76 second=346 amount=-1 +kerning first=67 second=224 amount=-2 +kerning first=257 second=8221 amount=-3 +kerning first=72 second=242 amount=-2 +kerning first=98 second=106 amount=-2 +kerning first=208 second=224 amount=-1 +kerning first=1024 second=1113 amount=-1 +kerning first=249 second=333 amount=-1 +kerning first=277 second=345 amount=-1 +kerning first=199 second=81 amount=-3 +kerning first=69 second=282 amount=-2 +kerning first=347 second=106 amount=-1 +kerning first=280 second=224 amount=-1 +kerning first=233 second=98 amount=-2 +kerning first=244 second=224 amount=-1 +kerning first=235 second=355 amount=-1 +kerning first=108 second=333 amount=-1 +kerning first=86 second=67 amount=-3 +kerning first=379 second=81 amount=-1 +kerning first=275 second=106 amount=-2 +kerning first=72 second=333 amount=-2 +kerning first=311 second=106 amount=-1 +kerning first=316 second=224 amount=-2 +kerning first=222 second=230 amount=-1 +kerning first=289 second=232 amount=-2 +kerning first=226 second=224 amount=-1 +kerning first=199 second=243 amount=-2 +kerning first=89 second=101 amount=-3 +kerning first=117 second=230 amount=-1 +kerning first=325 second=346 amount=-2 +kerning first=235 second=243 amount=-1 +kerning first=8250 second=326 amount=-2 +kerning first=194 second=101 amount=-1 +kerning first=45 second=230 amount=-1 +kerning first=203 second=256 amount=-2 +kerning first=268 second=378 amount=-2 +kerning first=230 second=101 amount=-1 +kerning first=109 second=307 amount=-1 +kerning first=266 second=101 amount=-2 +kerning first=1025 second=1099 amount=-1 +kerning first=302 second=101 amount=-2 +kerning first=1050 second=1060 amount=-4 +kerning first=77 second=334 amount=-2 +kerning first=98 second=120 amount=-3 +kerning first=282 second=268 amount=-1 +kerning first=374 second=101 amount=-3 +kerning first=218 second=334 amount=-1 +kerning first=280 second=79 amount=-1 +kerning first=203 second=120 amount=-1 +kerning first=72 second=335 amount=-2 +kerning first=354 second=268 amount=-3 +kerning first=307 second=243 amount=-1 +kerning first=362 second=334 amount=-1 +kerning first=1074 second=1098 amount=-1 +kerning first=286 second=192 amount=-3 +kerning first=116 second=251 amount=-1 +kerning first=379 second=243 amount=-1 +kerning first=1038 second=1098 amount=-3 +kerning first=257 second=251 amount=-1 +kerning first=235 second=229 amount=-2 +kerning first=8216 second=354 amount=-1 +kerning first=214 second=192 amount=-4 +kerning first=221 second=251 amount=-2 +kerning first=290 second=217 amount=-1 +kerning first=69 second=268 amount=-1 +kerning first=290 second=203 amount=-1 +kerning first=199 second=229 amount=-2 +kerning first=8250 second=76 amount=-5 +kerning first=379 second=229 amount=-1 +kerning first=291 second=118 amount=-1 +kerning first=365 second=251 amount=-1 +kerning first=354 second=282 amount=-1 +kerning first=70 second=339 amount=-1 +kerning first=275 second=120 amount=-2 +kerning first=195 second=218 amount=-3 +kerning first=1093 second=1072 amount=-1 +kerning first=307 second=229 amount=-2 +kerning first=363 second=118 amount=-3 +kerning first=282 second=282 amount=-2 +kerning first=264 second=121 amount=-1 +kerning first=327 second=118 amount=-2 +kerning first=347 second=120 amount=-3 +kerning first=303 second=232 amount=-3 +kerning first=366 second=244 amount=-2 +kerning first=45 second=202 amount=-5 +kerning first=307 second=257 amount=-2 +kerning first=1101 second=1096 amount=-1 +kerning first=203 second=368 amount=-2 +kerning first=290 second=219 amount=-1 +kerning first=81 second=202 amount=-2 +kerning first=375 second=232 amount=-3 +kerning first=235 second=257 amount=-2 +kerning first=339 second=232 amount=-1 +kerning first=381 second=70 amount=-1 +kerning first=8217 second=110 amount=-2 +kerning first=108 second=361 amount=-2 +kerning first=353 second=369 amount=-1 +kerning first=222 second=202 amount=-2 +kerning first=72 second=361 amount=-2 +kerning first=90 second=232 amount=-1 +kerning first=199 second=257 amount=-2 +kerning first=231 second=232 amount=-1 +kerning first=290 second=205 amount=-1 +kerning first=209 second=336 amount=-2 +kerning first=195 second=232 amount=-1 +kerning first=111 second=8250 amount=-2 +kerning first=84 second=278 amount=-1 +kerning first=73 second=267 amount=-2 +kerning first=316 second=121 amount=-3 +kerning first=197 second=332 amount=-3 +kerning first=8218 second=103 amount=-1 +kerning first=67 second=79 amount=-3 +kerning first=317 second=336 amount=-1 +kerning first=117 second=244 amount=-1 +kerning first=244 second=121 amount=-3 +kerning first=246 second=254 amount=-1 +kerning first=1036 second=1072 amount=-2 +kerning first=282 second=254 amount=-1 +kerning first=250 second=267 amount=-1 +kerning first=76 second=374 amount=-3 +kerning first=332 second=344 amount=-2 +kerning first=272 second=69 amount=-2 +kerning first=1042 second=1036 amount=-2 +kerning first=366 second=275 amount=-2 +kerning first=258 second=244 amount=-1 +kerning first=103 second=121 amount=-1 +kerning first=67 second=121 amount=-1 +kerning first=69 second=254 amount=-1 +kerning first=379 second=257 amount=-1 +kerning first=200 second=69 amount=-2 +kerning first=8250 second=226 amount=-1 +kerning first=371 second=273 amount=-3 +kerning first=330 second=244 amount=-2 +kerning first=105 second=254 amount=-1 +kerning first=204 second=117 amount=-2 +kerning first=195 second=246 amount=-1 +kerning first=235 second=271 amount=-1 +kerning first=72 second=347 amount=-2 +kerning first=67 second=107 amount=-1 +kerning first=232 second=382 amount=-2 +kerning first=268 second=382 amount=-2 +kerning first=90 second=246 amount=-1 +kerning first=307 second=271 amount=-1 +kerning first=1061 second=1057 amount=-4 +kerning first=304 second=382 amount=-1 +kerning first=1025 second=1057 amount=-1 +kerning first=250 second=117 amount=-1 +kerning first=103 second=107 amount=-2 +kerning first=330 second=230 amount=-2 +kerning first=113 second=249 amount=-2 +kerning first=368 second=334 amount=-1 +kerning first=1025 second=1085 amount=-1 +kerning first=234 second=363 amount=-2 +kerning first=8220 second=339 amount=-3 +kerning first=8250 second=78 amount=-5 +kerning first=250 second=281 amount=-1 +kerning first=352 second=121 amount=-2 +kerning first=1046 second=1047 amount=-2 +kerning first=75 second=246 amount=-2 +kerning first=1063 second=1099 amount=-1 +kerning first=249 second=361 amount=-1 +kerning first=330 second=216 amount=-2 +kerning first=352 second=107 amount=-2 +kerning first=74 second=65 amount=-5 +kerning first=321 second=347 amount=-1 +kerning first=73 second=281 amount=-2 +kerning first=8217 second=375 amount=-1 +kerning first=321 second=361 amount=-2 +kerning first=200 second=336 amount=-1 +kerning first=249 second=347 amount=-2 +kerning first=244 second=107 amount=-1 +kerning first=376 second=382 amount=-3 +kerning first=228 second=371 amount=-1 +kerning first=109 second=117 amount=-1 +kerning first=316 second=107 amount=-1 +kerning first=8220 second=353 amount=-2 +kerning first=354 second=240 amount=-3 +kerning first=258 second=216 amount=-3 +kerning first=73 second=117 amount=-2 +kerning first=1049 second=1095 amount=-1 +kerning first=108 second=347 amount=-2 +kerning first=1101 second=1082 amount=-1 +kerning first=280 second=107 amount=-1 +kerning first=97 second=226 amount=-1 +kerning first=1031 second=1102 amount=-1 +kerning first=256 second=305 amount=-1 +kerning first=220 second=305 amount=-2 +kerning first=84 second=46 amount=-5 +kerning first=202 second=226 amount=-1 +kerning first=120 second=378 amount=-2 +kerning first=328 second=305 amount=-1 +kerning first=120 second=46 amount=-1 +kerning first=264 second=245 amount=-2 +kerning first=202 second=336 amount=-1 +kerning first=1104 second=1083 amount=-2 +kerning first=274 second=226 amount=-1 +kerning first=281 second=8250 amount=-2 +kerning first=83 second=72 amount=-3 +kerning first=346 second=76 amount=-3 +kerning first=291 second=102 amount=-1 +kerning first=310 second=226 amount=-1 +kerning first=280 second=266 amount=-1 +kerning first=364 second=305 amount=-2 +kerning first=346 second=226 amount=-2 +kerning first=274 second=76 amount=-2 +kerning first=310 second=336 amount=-3 +kerning first=363 second=102 amount=-1 +kerning first=211 second=219 amount=-1 +kerning first=382 second=226 amount=-1 +kerning first=245 second=8250 amount=-2 +kerning first=364 second=45 amount=-5 +kerning first=79 second=224 amount=-1 +kerning first=379 second=259 amount=-1 +kerning first=269 second=333 amount=-1 +kerning first=8218 second=86 amount=-6 +kerning first=381 second=252 amount=-3 +kerning first=288 second=316 amount=-1 +kerning first=8216 second=197 amount=-8 +kerning first=324 second=316 amount=-1 +kerning first=228 second=245 amount=-1 +kerning first=267 second=257 amount=-2 +kerning first=192 second=245 amount=-1 +kerning first=74 second=79 amount=-2 +kerning first=201 second=252 amount=-2 +kerning first=314 second=335 amount=-1 +kerning first=235 second=259 amount=-2 +kerning first=350 second=335 amount=-1 +kerning first=87 second=245 amount=-3 +kerning first=255 second=269 amount=-3 +kerning first=307 second=259 amount=-2 +kerning first=68 second=46 amount=-3 +kerning first=79 second=45 amount=-1 +kerning first=228 second=369 amount=-1 +kerning first=350 second=103 amount=-3 +kerning first=121 second=116 amount=-1 +kerning first=374 second=375 amount=-3 +kerning first=296 second=246 amount=-2 +kerning first=311 second=277 amount=-3 +kerning first=192 second=369 amount=-3 +kerning first=314 second=103 amount=-3 +kerning first=85 second=232 amount=-2 +kerning first=260 second=246 amount=-1 +kerning first=199 second=259 amount=-2 +kerning first=302 second=375 amount=-2 +kerning first=224 second=246 amount=-1 +kerning first=203 second=382 amount=-2 +kerning first=264 second=369 amount=-2 +kerning first=242 second=103 amount=-2 +kerning first=90 second=266 amount=-1 +kerning first=260 second=332 amount=-3 +kerning first=206 second=103 amount=-3 +kerning first=220 second=45 amount=-5 +kerning first=119 second=246 amount=-3 +kerning first=379 second=109 amount=-1 +kerning first=197 second=253 amount=-3 +kerning first=328 second=45 amount=-3 +kerning first=83 second=246 amount=-1 +kerning first=101 second=103 amount=-3 +kerning first=233 second=253 amount=-2 +kerning first=296 second=332 amount=-2 +kerning first=87 second=369 amount=-2 +kerning first=65 second=103 amount=-3 +kerning first=89 second=375 amount=-3 +kerning first=67 second=266 amount=-3 +kerning first=1063 second=1075 amount=-1 +kerning first=368 second=332 amount=-1 +kerning first=1027 second=1075 amount=-2 +kerning first=235 second=109 amount=-2 +kerning first=304 second=122 amount=-1 +kerning first=105 second=242 amount=-1 +kerning first=268 second=122 amount=-2 +kerning first=117 second=121 amount=-3 +kerning first=307 second=109 amount=-2 +kerning first=232 second=122 amount=-2 +kerning first=266 second=375 amount=-1 +kerning first=230 second=375 amount=-2 +kerning first=275 second=382 amount=-2 +kerning first=194 second=375 amount=-3 +kerning first=199 second=109 amount=-1 +kerning first=8220 second=224 amount=-3 +kerning first=240 second=371 amount=-1 +kerning first=347 second=382 amount=-2 +kerning first=376 second=122 amount=-3 +kerning first=354 second=242 amount=-3 +kerning first=266 second=115 amount=-2 +kerning first=197 second=370 amount=-3 +kerning first=302 second=115 amount=-2 +kerning first=346 second=198 amount=-4 +kerning first=211 second=80 amount=-2 +kerning first=220 second=345 amount=-1 +kerning first=194 second=115 amount=-2 +kerning first=377 second=121 amount=-3 +kerning first=115 second=223 amount=-1 +kerning first=230 second=115 amount=-2 +kerning first=338 second=220 amount=-2 +kerning first=73 second=119 amount=-2 +kerning first=375 second=289 amount=-3 +kerning first=109 second=119 amount=-3 +kerning first=334 second=8217 amount=-2 +kerning first=202 second=198 amount=-2 +kerning first=377 second=68 amount=-1 +kerning first=338 second=115 amount=-1 +kerning first=374 second=115 amount=-3 +kerning first=274 second=198 amount=-2 +kerning first=250 second=119 amount=-3 +kerning first=269 second=253 amount=-2 +kerning first=1052 second=1090 amount=-1 +kerning first=286 second=119 amount=-1 +kerning first=305 second=253 amount=-2 +kerning first=198 second=313 amount=-2 +kerning first=275 second=108 amount=-3 +kerning first=76 second=303 amount=-2 +kerning first=377 second=253 amount=-3 +kerning first=1088 second=1090 amount=-1 +kerning first=347 second=108 amount=-2 +kerning first=1070 second=1059 amount=-3 +kerning first=350 second=75 amount=-3 +kerning first=100 second=269 amount=-1 +kerning first=79 second=73 amount=-2 +kerning first=368 second=246 amount=-2 +kerning first=1076 second=1105 amount=-1 +kerning first=278 second=75 amount=-2 +kerning first=205 second=269 amount=-2 +kerning first=8250 second=310 amount=-5 +kerning first=101 second=335 amount=-1 +kerning first=379 second=231 amount=-1 +kerning first=216 second=196 amount=-4 +kerning first=277 second=269 amount=-1 +kerning first=1067 second=1098 amount=-1 +kerning first=233 second=225 amount=-2 +kerning first=206 second=335 amount=-2 +kerning first=310 second=71 amount=-3 +kerning first=240 second=328 amount=-1 +kerning first=269 second=225 amount=-2 +kerning first=288 second=196 amount=-3 +kerning first=213 second=44 amount=-3 +kerning first=65 second=363 amount=-3 +kerning first=98 second=108 amount=-2 +kerning first=101 second=363 amount=-2 +kerning first=262 second=253 amount=-1 +kerning first=374 second=286 amount=-3 +kerning first=203 second=108 amount=-1 +kerning first=65 second=335 amount=-1 +kerning first=302 second=286 amount=-2 +kerning first=261 second=249 amount=-1 +kerning first=242 second=363 amount=-1 +kerning first=338 second=286 amount=-1 +kerning first=44 second=8221 amount=-5 +kerning first=334 second=120 amount=-1 +kerning first=278 second=363 amount=-2 +kerning first=201 second=280 amount=-2 +kerning first=84 second=203 amount=-1 +kerning first=219 second=102 amount=-1 +kerning first=314 second=363 amount=-2 +kerning first=266 second=286 amount=-3 +kerning first=83 second=218 amount=-3 +kerning first=350 second=363 amount=-1 +kerning first=89 second=115 amount=-3 +kerning first=305 second=225 amount=-1 +kerning first=235 second=231 amount=-1 +kerning first=225 second=46 amount=-1 +kerning first=332 second=218 amount=-1 +kerning first=267 second=378 amount=-2 +kerning first=261 second=46 amount=-1 +kerning first=377 second=225 amount=-1 +kerning first=228 second=273 amount=-1 +kerning first=89 second=286 amount=-3 +kerning first=381 second=280 amount=-1 +kerning first=260 second=218 amount=-3 +kerning first=199 second=231 amount=-2 +kerning first=212 second=261 amount=-1 +kerning first=110 second=367 amount=-1 +kerning first=248 second=261 amount=-1 +kerning first=209 second=210 amount=-2 +kerning first=284 second=261 amount=-1 +kerning first=352 second=8220 amount=-2 +kerning first=68 second=296 amount=-2 +kerning first=316 second=8220 amount=-3 +kerning first=1052 second=1092 amount=-1 +kerning first=67 second=325 amount=-3 +kerning first=71 second=261 amount=-1 +kerning first=363 second=275 amount=-1 +kerning first=86 second=327 amount=-1 +kerning first=107 second=261 amount=-2 +kerning first=244 second=8220 amount=-2 +kerning first=204 second=211 amount=-2 +kerning first=261 second=251 amount=-1 +kerning first=1092 second=1117 amount=-1 +kerning first=90 second=352 amount=-1 +kerning first=208 second=8220 amount=-2 +kerning first=251 second=250 amount=-1 +kerning first=198 second=171 amount=-2 +kerning first=253 second=112 amount=-2 +kerning first=240 second=326 amount=-1 +kerning first=71 second=378 amount=-1 +kerning first=217 second=112 amount=-2 +kerning first=317 second=296 amount=-2 +kerning first=212 second=378 amount=-2 +kerning first=1042 second=1025 amount=-2 +kerning first=323 second=250 amount=-2 +kerning first=270 second=171 amount=-1 +kerning first=90 second=206 amount=-1 +kerning first=72 second=235 amount=-2 +kerning first=287 second=250 amount=-1 +kerning first=232 second=351 amount=-2 +kerning first=112 second=112 amount=-1 +kerning first=108 second=235 amount=-1 +kerning first=356 second=261 amount=-5 +kerning first=76 second=112 amount=-2 +kerning first=99 second=326 amount=-2 +kerning first=99 second=328 amount=-2 +kerning first=249 second=235 amount=-1 +kerning first=1104 second=1096 amount=-1 +kerning first=75 second=288 amount=-3 +kerning first=108 second=237 amount=-1 +kerning first=193 second=113 amount=-1 +kerning first=217 second=262 amount=-1 +kerning first=323 second=365 amount=-2 +kerning first=210 second=366 amount=-1 +kerning first=374 second=113 amount=-3 +kerning first=287 second=365 amount=-1 +kerning first=1057 second=1081 amount=-1 +kerning first=251 second=365 amount=-1 +kerning first=284 second=378 amount=-1 +kerning first=244 second=353 amount=-2 +kerning first=325 second=262 amount=-2 +kerning first=232 second=98 amount=-2 +kerning first=81 second=45 amount=-1 +kerning first=280 second=353 amount=-1 +kerning first=224 second=100 amount=-1 +kerning first=1079 second=1094 amount=-1 +kerning first=354 second=366 amount=-1 +kerning first=356 second=378 amount=-3 +kerning first=316 second=353 amount=-2 +kerning first=260 second=100 amount=-1 +kerning first=110 second=365 amount=-1 +kerning first=325 second=112 amount=-1 +kerning first=199 second=83 amount=-3 +kerning first=352 second=353 amount=-1 +kerning first=296 second=100 amount=-2 +kerning first=282 second=366 amount=-2 +kerning first=289 second=112 amount=-1 +kerning first=321 second=87 amount=-3 +kerning first=291 second=275 amount=-2 +kerning first=67 second=353 amount=-2 +kerning first=327 second=249 amount=-1 +kerning first=200 second=85 amount=-2 +kerning first=213 second=87 amount=-2 +kerning first=327 second=275 amount=-2 +kerning first=103 second=353 amount=-3 +kerning first=364 second=223 amount=-2 +kerning first=195 second=352 amount=-3 +kerning first=363 second=249 amount=-1 +kerning first=219 second=275 amount=-2 +kerning first=83 second=100 amount=-1 +kerning first=1045 second=1078 amount=-2 +kerning first=255 second=249 amount=-1 +kerning first=255 second=275 amount=-3 +kerning first=1047 second=1091 amount=-1 +kerning first=119 second=100 amount=-3 +kerning first=291 second=249 amount=-1 +kerning first=379 second=83 amount=-1 +kerning first=302 second=113 amount=-2 +kerning first=69 second=366 amount=-2 +kerning first=220 second=223 amount=-2 +kerning first=266 second=113 amount=-2 +kerning first=76 second=262 amount=-1 +kerning first=85 second=233 amount=-2 +kerning first=310 second=275 amount=-2 +kerning first=78 second=275 amount=-2 +kerning first=317 second=210 amount=-1 +kerning first=194 second=113 amount=-1 +kerning first=90 second=324 amount=-1 +kerning first=88 second=361 amount=-3 +kerning first=321 second=89 amount=-3 +kerning first=67 second=44 amount=-1 +kerning first=121 second=233 amount=-3 +kerning first=352 second=379 amount=-1 +kerning first=76 second=84 amount=-3 +kerning first=71 second=289 amount=-3 +kerning first=287 second=339 amount=-2 +kerning first=262 second=233 amount=-2 +kerning first=107 second=289 amount=-2 +kerning first=323 second=339 amount=-2 +kerning first=226 second=233 amount=-1 +kerning first=217 second=114 amount=-1 +kerning first=245 second=107 amount=-1 +kerning first=203 second=194 amount=-2 +kerning first=253 second=114 amount=-1 +kerning first=298 second=233 amount=-2 +kerning first=187 second=274 amount=-5 +kerning first=72 second=252 amount=-1 +kerning first=1100 second=1082 amount=-1 +kerning first=112 second=114 amount=-1 +kerning first=78 second=249 amount=-1 +kerning first=284 second=289 amount=-3 +kerning first=370 second=233 amount=-2 +kerning first=213 second=89 amount=-2 +kerning first=67 second=379 amount=-2 +kerning first=74 second=339 amount=-2 +kerning first=375 second=324 amount=-2 +kerning first=321 second=237 amount=-2 +kerning first=267 second=324 amount=-2 +kerning first=248 second=110 amount=-1 +kerning first=8250 second=83 amount=-3 +kerning first=262 second=350 amount=-3 +kerning first=251 second=339 amount=-1 +kerning first=231 second=324 amount=-2 +kerning first=67 second=381 amount=-2 +kerning first=249 second=237 amount=-2 +kerning first=1051 second=1116 amount=-1 +kerning first=277 second=187 amount=-2 +kerning first=339 second=324 amount=-2 +kerning first=213 second=237 amount=-1 +kerning first=303 second=324 amount=-2 +kerning first=280 second=379 amount=-1 +kerning first=356 second=110 amount=-3 +kerning first=370 second=350 amount=-3 +kerning first=321 second=209 amount=-2 +kerning first=363 second=277 amount=-1 +kerning first=333 second=345 amount=-1 +kerning first=346 second=8217 amount=-2 +kerning first=80 second=111 amount=-1 +kerning first=89 second=260 amount=-6 +kerning first=1093 second=1108 amount=-2 +kerning first=334 second=350 amount=-1 +kerning first=376 second=119 amount=-3 +kerning first=213 second=209 amount=-2 +kerning first=255 second=277 amount=-3 +kerning first=217 second=234 amount=-2 +kerning first=219 second=277 amount=-2 +kerning first=76 second=86 amount=-3 +kerning first=327 second=277 amount=-2 +kerning first=75 second=316 amount=-1 +kerning first=289 second=234 amount=-2 +kerning first=266 second=260 amount=-3 +kerning first=291 second=277 amount=-2 +kerning first=187 second=302 amount=-5 +kerning first=325 second=234 amount=-2 +kerning first=78 second=277 amount=-2 +kerning first=280 second=351 amount=-1 +kerning first=327 second=44 amount=-1 +kerning first=280 second=264 amount=-1 +kerning first=202 second=76 amount=-2 +kerning first=338 second=260 amount=-2 +kerning first=1037 second=1054 amount=-1 +kerning first=356 second=289 amount=-4 +kerning first=244 second=351 amount=-2 +kerning first=365 second=111 amount=-1 +kerning first=1056 second=1089 amount=-1 +kerning first=352 second=351 amount=-1 +kerning first=332 second=72 amount=-2 +kerning first=317 second=212 amount=-1 +kerning first=1037 second=1072 amount=-1 +kerning first=316 second=351 amount=-2 +kerning first=1058 second=1102 amount=-2 +kerning first=187 second=103 amount=-3 +kerning first=374 second=260 amount=-6 +kerning first=103 second=351 amount=-3 +kerning first=287 second=367 amount=-1 +kerning first=67 second=351 amount=-2 +kerning first=67 second=264 amount=-3 +kerning first=221 second=111 amount=-3 +kerning first=323 second=367 amount=-2 +kerning first=198 second=199 amount=-1 +kerning first=321 second=74 amount=-1 +kerning first=272 second=291 amount=-1 +kerning first=251 second=367 amount=-1 +kerning first=1052 second=1075 amount=-1 +kerning first=209 second=212 amount=-2 +kerning first=262 second=364 amount=-2 +kerning first=257 second=267 amount=-1 +kerning first=1043 second=1074 amount=-2 +kerning first=286 second=8249 amount=-3 +kerning first=65 second=361 amount=-3 +kerning first=258 second=351 amount=-2 +kerning first=206 second=361 amount=-2 +kerning first=100 second=277 amount=-1 +kerning first=366 second=351 amount=-2 +kerning first=1090 second=1077 amount=-1 +kerning first=8250 second=85 amount=-4 +kerning first=221 second=267 amount=-3 +kerning first=221 second=377 amount=-3 +kerning first=354 second=114 amount=-1 +kerning first=73 second=8249 amount=-4 +kerning first=278 second=361 amount=-2 +kerning first=117 second=351 amount=-2 +kerning first=235 second=111 amount=-1 +kerning first=109 second=8249 amount=-3 +kerning first=242 second=361 amount=-1 +kerning first=336 second=257 amount=-1 +kerning first=201 second=367 amount=-2 +kerning first=334 second=364 amount=-1 +kerning first=253 second=254 amount=-1 +kerning first=307 second=111 amount=-1 +kerning first=66 second=287 amount=-4 +kerning first=314 second=361 amount=-2 +kerning first=365 second=267 amount=-1 +kerning first=289 second=254 amount=-1 +kerning first=264 second=257 amount=-2 +kerning first=262 second=261 amount=-2 +kerning first=365 second=117 amount=-1 +kerning first=298 second=261 amount=-2 +kerning first=251 second=244 amount=-1 +kerning first=102 second=287 amount=-2 +kerning first=334 second=261 amount=-1 +kerning first=287 second=244 amount=-2 +kerning first=381 second=121 amount=-3 +kerning first=76 second=254 amount=-2 +kerning first=282 second=374 amount=-1 +kerning first=113 second=44 amount=-2 +kerning first=243 second=287 amount=-2 +kerning first=370 second=261 amount=-3 +kerning first=323 second=244 amount=-2 +kerning first=112 second=254 amount=-1 +kerning first=89 second=274 amount=-1 +kerning first=207 second=287 amount=-3 +kerning first=85 second=261 amount=-3 +kerning first=1101 second=1094 amount=-1 +kerning first=8217 second=269 amount=-3 +kerning first=210 second=374 amount=-2 +kerning first=369 second=273 amount=-1 +kerning first=374 second=274 amount=-1 +kerning first=315 second=287 amount=-3 +kerning first=121 second=261 amount=-3 +kerning first=201 second=381 amount=-1 +kerning first=279 second=287 amount=-3 +kerning first=88 second=112 amount=-1 +kerning first=350 second=237 amount=-3 +kerning first=226 second=261 amount=-1 +kerning first=338 second=210 amount=-1 +kerning first=314 second=237 amount=-1 +kerning first=8216 second=219 amount=-1 +kerning first=266 second=274 amount=-3 +kerning first=351 second=287 amount=-3 +kerning first=212 second=171 amount=-1 +kerning first=1058 second=1104 amount=-1 +kerning first=242 second=347 amount=-2 +kerning first=70 second=197 amount=-3 +kerning first=201 second=250 amount=-2 +kerning first=206 second=347 amount=-2 +kerning first=221 second=281 amount=-3 +kerning first=201 second=107 amount=-1 +kerning first=366 second=337 amount=-2 +kerning first=379 second=97 amount=-1 +kerning first=116 second=117 amount=-1 +kerning first=226 second=378 amount=-1 +kerning first=257 second=281 amount=-1 +kerning first=330 second=337 amount=-2 +kerning first=101 second=347 amount=-2 +kerning first=211 second=197 amount=-4 +kerning first=221 second=117 amount=-2 +kerning first=65 second=347 amount=-2 +kerning first=71 second=171 amount=-3 +kerning first=282 second=220 amount=-2 +kerning first=107 second=171 amount=-3 +kerning first=80 second=281 amount=-1 +kerning first=350 second=207 amount=-3 +kerning first=257 second=117 amount=-1 +kerning first=89 second=288 amount=-3 +kerning first=197 second=354 amount=-6 +kerning first=381 second=264 amount=-1 +kerning first=268 second=82 amount=-3 +kerning first=235 second=371 amount=-2 +kerning first=194 second=288 amount=-3 +kerning first=354 second=100 amount=-3 +kerning first=8218 second=229 amount=-2 +kerning first=81 second=379 amount=-2 +kerning first=307 second=371 amount=-1 +kerning first=87 second=257 amount=-5 +kerning first=356 second=171 amount=-5 +kerning first=290 second=304 amount=-1 +kerning first=228 second=271 amount=-1 +kerning first=298 second=378 amount=-1 +kerning first=105 second=100 amount=-1 +kerning first=289 second=240 amount=-2 +kerning first=106 second=314 amount=-2 +kerning first=350 second=347 amount=-1 +kerning first=377 second=354 amount=-2 +kerning first=325 second=240 amount=-2 +kerning first=201 second=264 amount=-1 +kerning first=314 second=347 amount=-2 +kerning first=374 second=243 amount=-3 +kerning first=217 second=240 amount=-2 +kerning first=1030 second=1054 amount=-1 +kerning first=114 second=289 amount=-2 +kerning first=1094 second=1104 amount=-1 +kerning first=278 second=347 amount=-1 +kerning first=253 second=240 amount=-3 +kerning first=200 second=317 amount=-2 +kerning first=195 second=220 amount=-3 +kerning first=222 second=77 amount=-2 +kerning first=284 second=379 amount=-2 +kerning first=283 second=314 amount=-3 +kerning first=258 second=214 amount=-3 +kerning first=272 second=317 amount=-2 +kerning first=268 second=298 amount=-3 +kerning first=258 second=71 amount=-3 +kerning first=355 second=314 amount=-1 +kerning first=262 second=90 amount=-2 +kerning first=86 second=207 amount=-1 +kerning first=370 second=90 amount=-1 +kerning first=110 second=224 amount=-1 +kerning first=1042 second=1024 amount=-2 +kerning first=74 second=224 amount=-2 +kerning first=376 second=298 amount=-1 +kerning first=1065 second=1108 amount=-1 +kerning first=313 second=291 amount=-3 +kerning first=1025 second=1024 amount=-1 +kerning first=277 second=291 amount=-3 +kerning first=195 second=84 amount=-6 +kerning first=113 second=318 amount=-2 +kerning first=287 second=224 amount=-3 +kerning first=241 second=291 amount=-2 +kerning first=199 second=97 amount=-2 +kerning first=204 second=213 amount=-2 +kerning first=251 second=224 amount=-1 +kerning first=205 second=291 amount=-3 +kerning first=104 second=324 amount=-1 +kerning first=259 second=287 amount=-2 +kerning first=90 second=84 amount=-2 +kerning first=256 second=85 amount=-3 +kerning first=245 second=324 amount=-1 +kerning first=200 second=200 amount=-2 +kerning first=371 second=311 amount=-1 +kerning first=254 second=318 amount=-2 +kerning first=323 second=224 amount=-2 +kerning first=100 second=291 amount=-2 +kerning first=307 second=97 amount=-2 +kerning first=81 second=77 amount=-2 +kerning first=366 second=71 amount=-1 +kerning first=335 second=311 amount=-1 +kerning first=258 second=337 amount=-1 +kerning first=1074 second=1114 amount=-1 +kerning first=45 second=77 amount=-5 +kerning first=330 second=71 amount=-2 +kerning first=376 second=245 amount=-3 +kerning first=235 second=97 amount=-2 +kerning first=263 second=311 amount=-2 +kerning first=1043 second=1088 amount=-2 +kerning first=227 second=311 amount=-1 +kerning first=85 second=90 amount=-1 +kerning first=117 second=337 amount=-1 +kerning first=1079 second=1088 amount=-1 +kerning first=81 second=85 amount=-1 +kerning first=304 second=284 amount=-2 +kerning first=1024 second=1025 amount=-1 +kerning first=335 second=187 amount=-2 +kerning first=362 second=44 amount=-5 +kerning first=45 second=85 amount=-4 +kerning first=90 second=344 amount=-1 +kerning first=90 second=234 amount=-1 +kerning first=326 second=44 amount=-1 +kerning first=381 second=381 amount=-1 +kerning first=107 second=271 amount=-3 +kerning first=86 second=325 amount=-1 +kerning first=236 second=303 amount=-1 +kerning first=268 second=284 amount=-3 +kerning first=1060 second=1025 amount=-1 +kerning first=1044 second=1086 amount=-1 +kerning first=195 second=234 amount=-1 +kerning first=1101 second=1090 amount=-1 +kerning first=262 second=104 amount=-1 +kerning first=218 second=44 amount=-5 +kerning first=226 second=104 amount=-1 +kerning first=196 second=284 amount=-3 +kerning first=68 second=310 amount=-2 +kerning first=381 second=101 amount=-1 +kerning first=290 second=44 amount=-3 +kerning first=380 second=303 amount=-1 +kerning first=90 second=70 amount=-1 +kerning first=121 second=104 amount=-2 +kerning first=310 second=81 amount=-3 +kerning first=254 second=44 amount=-3 +kerning first=272 second=194 amount=-4 +kerning first=87 second=251 amount=-2 +kerning first=375 second=234 amount=-3 +kerning first=99 second=227 amount=-2 +kerning first=1070 second=1067 amount=-1 +kerning first=200 second=194 amount=-2 +kerning first=192 second=251 amount=-3 +kerning first=45 second=351 amount=-1 +kerning first=86 second=187 amount=-3 +kerning first=1074 second=1100 amount=-1 +kerning first=199 second=111 amount=-2 +kerning first=258 second=85 amount=-3 +kerning first=264 second=251 amount=-2 +kerning first=205 second=277 amount=-2 +kerning first=231 second=234 amount=-1 +kerning first=222 second=85 amount=-1 +kerning first=228 second=251 amount=-1 +kerning first=267 second=234 amount=-1 +kerning first=200 second=303 amount=-1 +kerning first=286 second=45 amount=-3 +kerning first=240 second=227 amount=-1 +kerning first=376 second=284 amount=-3 +kerning first=277 second=277 amount=-1 +kerning first=204 second=227 amount=-2 +kerning first=317 second=310 amount=-2 +kerning first=339 second=234 amount=-1 +kerning first=1047 second=1093 amount=-3 +kerning first=316 second=105 amount=-1 +kerning first=8218 second=87 amount=-6 +kerning first=284 second=118 amount=-1 +kerning first=334 second=370 amount=-1 +kerning first=65 second=245 amount=-1 +kerning first=100 second=283 amount=-1 +kerning first=89 second=114 amount=-1 +kerning first=352 second=105 amount=-3 +kerning first=248 second=118 amount=-2 +kerning first=69 second=368 amount=-2 +kerning first=244 second=105 amount=-1 +kerning first=356 second=118 amount=-3 +kerning first=366 second=345 amount=-1 +kerning first=280 second=105 amount=-1 +kerning first=210 second=270 amount=-2 +kerning first=1090 second=1083 amount=-3 +kerning first=89 second=280 amount=-1 +kerning first=277 second=283 amount=-1 +kerning first=210 second=368 amount=-1 +kerning first=208 second=105 amount=-1 +kerning first=364 second=335 amount=-2 +kerning first=71 second=118 amount=-1 +kerning first=206 second=245 amount=-2 +kerning first=67 second=105 amount=-1 +kerning first=69 second=270 amount=-2 +kerning first=205 second=283 amount=-2 +kerning first=103 second=105 amount=-2 +kerning first=101 second=245 amount=-1 +kerning first=88 second=351 amount=-1 +kerning first=366 second=228 amount=-3 +kerning first=1098 second=1078 amount=-2 +kerning first=354 second=368 amount=-1 +kerning first=330 second=228 amount=-2 +kerning first=220 second=335 amount=-2 +kerning first=262 second=241 amount=-1 +kerning first=105 second=108 amount=-2 +kerning first=256 second=335 amount=-1 +kerning first=370 second=241 amount=-2 +kerning first=246 second=108 amount=-2 +kerning first=282 second=368 amount=-2 +kerning first=1054 second=1083 amount=-2 +kerning first=222 second=228 amount=-1 +kerning first=121 second=241 amount=-2 +kerning first=282 second=270 amount=-2 +kerning first=85 second=241 amount=-2 +kerning first=282 second=108 amount=-1 +kerning first=117 second=228 amount=-1 +kerning first=86 second=193 amount=-6 +kerning first=262 second=370 amount=-2 +kerning first=81 second=228 amount=-1 +kerning first=354 second=270 amount=-1 +kerning first=369 second=324 amount=-1 +kerning first=354 second=122 amount=-3 +kerning first=366 second=331 amount=-2 +kerning first=268 second=278 amount=-3 +kerning first=282 second=256 amount=-2 +kerning first=334 second=356 amount=-2 +kerning first=282 second=122 amount=-2 +kerning first=210 second=256 amount=-4 +kerning first=246 second=122 amount=-2 +kerning first=206 second=231 amount=-2 +kerning first=262 second=356 amount=-1 +kerning first=236 second=363 amount=-1 +kerning first=197 second=362 amount=-3 +kerning first=248 second=116 amount=-1 +kerning first=376 second=278 amount=-1 +kerning first=298 second=255 amount=-2 +kerning first=117 second=331 amount=-1 +kerning first=356 second=116 amount=-1 +kerning first=314 second=231 amount=-1 +kerning first=354 second=256 amount=-6 +kerning first=262 second=255 amount=-1 +kerning first=350 second=231 amount=-1 +kerning first=8222 second=98 amount=-1 +kerning first=226 second=255 amount=-3 +kerning first=266 second=280 amount=-3 +kerning first=338 second=266 amount=-1 +kerning first=278 second=81 amount=-1 +kerning first=350 second=245 amount=-1 +kerning first=374 second=266 amount=-3 +kerning first=338 second=280 amount=-2 +kerning first=314 second=245 amount=-1 +kerning first=266 second=266 amount=-3 +kerning first=85 second=255 amount=-1 +kerning first=374 second=280 amount=-1 +kerning first=1075 second=1103 amount=-2 +kerning first=302 second=266 amount=-2 +kerning first=210 second=122 amount=-2 +kerning first=65 second=231 amount=-1 +kerning first=117 second=345 amount=-1 +kerning first=1074 second=1101 amount=-1 +kerning first=367 second=271 amount=-1 +kerning first=1047 second=1098 amount=-1 +kerning first=101 second=231 amount=-1 +kerning first=45 second=65 amount=-4 +kerning first=105 second=122 amount=-1 +kerning first=81 second=65 amount=-4 +kerning first=89 second=266 amount=-3 +kerning first=366 second=214 amount=-1 +kerning first=69 second=122 amount=-2 +kerning first=8217 second=277 amount=-3 +kerning first=377 second=80 amount=-1 +kerning first=222 second=65 amount=-4 +kerning first=364 second=67 amount=-1 +kerning first=314 second=229 amount=-2 +kerning first=350 second=229 amount=-2 +kerning first=314 second=279 amount=-1 +kerning first=211 second=217 amount=-1 +kerning first=210 second=106 amount=-1 +kerning first=263 second=305 amount=-2 +kerning first=203 second=282 amount=-2 +kerning first=246 second=106 amount=-2 +kerning first=256 second=67 amount=-3 +kerning first=98 second=103 amount=-2 +kerning first=1043 second=1084 amount=-2 +kerning first=227 second=305 amount=-1 +kerning first=83 second=346 amount=-1 +kerning first=366 second=65 amount=-4 +kerning first=211 second=68 amount=-2 +kerning first=105 second=106 amount=-2 +kerning first=220 second=67 amount=-1 +kerning first=206 second=81 amount=-2 +kerning first=8222 second=380 amount=-3 +kerning first=8216 second=328 amount=-1 +kerning first=323 second=230 amount=-2 +kerning first=296 second=346 amount=-2 +kerning first=364 second=333 amount=-2 +kerning first=235 second=353 amount=-2 +kerning first=302 second=346 amount=-2 +kerning first=371 second=305 amount=-2 +kerning first=260 second=346 amount=-3 +kerning first=251 second=230 amount=-1 +kerning first=303 second=109 amount=-2 +kerning first=287 second=230 amount=-3 +kerning first=260 second=289 amount=-3 +kerning first=65 second=243 amount=-1 +kerning first=381 second=82 amount=-1 +kerning first=202 second=204 amount=-2 +kerning first=243 second=307 amount=-1 +kerning first=8217 second=289 amount=-4 +kerning first=365 second=281 amount=-1 +kerning first=69 second=256 amount=-2 +kerning first=74 second=230 amount=-3 +kerning first=274 second=204 amount=-2 +kerning first=368 second=346 amount=-3 +kerning first=311 second=275 amount=-3 +kerning first=1025 second=1070 amount=-1 +kerning first=209 second=259 amount=-2 +kerning first=110 second=230 amount=-1 +kerning first=332 second=346 amount=-1 +kerning first=256 second=333 amount=-1 +kerning first=8216 second=225 amount=-3 +kerning first=211 second=203 amount=-2 +kerning first=314 second=243 amount=-1 +kerning first=346 second=104 amount=-2 +kerning first=90 second=332 amount=-1 +kerning first=101 second=243 amount=-1 +kerning first=74 second=244 amount=-2 +kerning first=1057 second=1060 amount=-1 +kerning first=195 second=332 amount=-3 +kerning first=279 second=307 amount=-2 +kerning first=310 second=218 amount=-2 +kerning first=206 second=243 amount=-2 +kerning first=313 second=334 amount=-1 +kerning first=8217 second=275 amount=-3 +kerning first=323 second=79 amount=-2 +kerning first=274 second=218 amount=-2 +kerning first=246 second=120 amount=-3 +kerning first=315 second=192 amount=-2 +kerning first=198 second=374 amount=-1 +kerning first=282 second=120 amount=-1 +kerning first=101 second=229 amount=-2 +kerning first=327 second=333 amount=-2 +kerning first=1045 second=1084 amount=-1 +kerning first=354 second=120 amount=-2 +kerning first=251 second=263 amount=-1 +kerning first=203 second=268 amount=-1 +kerning first=69 second=120 amount=-1 +kerning first=105 second=120 amount=-1 +kerning first=278 second=229 amount=-1 +kerning first=70 second=334 amount=-1 +kerning first=8222 second=366 amount=-3 +kerning first=345 second=347 amount=-1 +kerning first=66 second=192 amount=-5 +kerning first=210 second=120 amount=-1 +kerning first=206 second=229 amount=-2 +kerning first=365 second=279 amount=-1 +kerning first=253 second=242 amount=-3 +kerning first=249 second=229 amount=-1 +kerning first=205 second=289 amount=-3 +kerning first=258 second=339 amount=-1 +kerning first=368 second=232 amount=-2 +kerning first=217 second=242 amount=-2 +kerning first=241 second=289 amount=-2 +kerning first=117 second=339 amount=-1 +kerning first=325 second=242 amount=-2 +kerning first=352 second=99 amount=-1 +kerning first=87 second=109 amount=-3 +kerning first=277 second=289 amount=-3 +kerning first=289 second=242 amount=-2 +kerning first=213 second=229 amount=-1 +kerning first=316 second=99 amount=-1 +kerning first=313 second=289 amount=-3 +kerning first=366 second=339 amount=-2 +kerning first=260 second=232 amount=-1 +kerning first=221 second=279 amount=-3 +kerning first=1072 second=1096 amount=-1 +kerning first=76 second=106 amount=-2 +kerning first=278 second=89 amount=-1 +kerning first=224 second=232 amount=-1 +kerning first=1108 second=1096 amount=-1 +kerning first=268 second=282 amount=-3 +kerning first=330 second=339 amount=-2 +kerning first=116 second=119 amount=-1 +kerning first=296 second=232 amount=-2 +kerning first=257 second=279 amount=-1 +kerning first=201 second=379 amount=-1 +kerning first=83 second=232 amount=-1 +kerning first=253 second=106 amount=-2 +kerning first=221 second=119 amount=-3 +kerning first=90 second=346 amount=-1 +kerning first=112 second=106 amount=-2 +kerning first=257 second=119 amount=-3 +kerning first=1038 second=1072 amount=-4 +kerning first=119 second=232 amount=-3 +kerning first=103 second=99 amount=-2 +kerning first=8220 second=218 amount=-1 +kerning first=365 second=119 amount=-3 +kerning first=8222 second=254 amount=-1 +kerning first=67 second=99 amount=-2 +kerning first=377 second=82 amount=-1 +kerning first=1058 second=1116 amount=-2 +kerning first=203 second=344 amount=-2 +kerning first=100 second=289 amount=-2 +kerning first=381 second=379 amount=-1 +kerning first=368 second=275 amount=-2 +kerning first=195 second=346 amount=-3 +kerning first=68 second=44 amount=-3 +kerning first=89 second=361 amount=-2 +kerning first=211 second=66 amount=-2 +kerning first=107 second=267 amount=-3 +kerning first=274 second=212 amount=-1 +kerning first=107 second=269 amount=-3 +kerning first=104 second=316 amount=-1 +kerning first=1043 second=1072 amount=-3 +kerning first=258 second=79 amount=-3 +kerning first=8222 second=381 amount=-1 +kerning first=222 second=69 amount=-2 +kerning first=245 second=316 amount=-2 +kerning first=90 second=72 amount=-1 +kerning first=81 second=69 amount=-2 +kerning first=366 second=79 amount=-1 +kerning first=86 second=199 amount=-3 +kerning first=193 second=216 amount=-3 +kerning first=356 second=269 amount=-3 +kerning first=1063 second=1089 amount=-1 +kerning first=1088 second=1076 amount=-2 +kerning first=363 second=8217 amount=-3 +kerning first=1027 second=1089 amount=-3 +kerning first=330 second=79 amount=-2 +kerning first=72 second=229 amount=-2 +kerning first=1099 second=1089 amount=-1 +kerning first=272 second=192 amount=-4 +kerning first=108 second=229 amount=-2 +kerning first=90 second=76 amount=-1 +kerning first=65 second=89 amount=-6 +kerning first=310 second=212 amount=-3 +kerning first=211 second=205 amount=-2 +kerning first=88 second=216 amount=-3 +kerning first=200 second=192 amount=-2 +kerning first=192 second=8221 amount=-5 +kerning first=235 second=245 amount=-1 +kerning first=267 second=226 amount=-2 +kerning first=8222 second=368 amount=-3 +kerning first=228 second=8221 amount=-3 +kerning first=218 second=46 amount=-5 +kerning first=199 second=245 amount=-2 +kerning first=303 second=226 amount=-2 +kerning first=370 second=102 amount=-1 +kerning first=8250 second=324 amount=-2 +kerning first=339 second=226 amount=-2 +kerning first=82 second=286 amount=-3 +kerning first=375 second=226 amount=-3 +kerning first=242 second=229 amount=-1 +kerning first=381 second=266 amount=-1 +kerning first=1117 second=1086 amount=-1 +kerning first=379 second=245 amount=-1 +kerning first=216 second=46 amount=-3 +kerning first=1081 second=1086 amount=-1 +kerning first=1025 second=1083 amount=-1 +kerning first=226 second=102 amount=-1 +kerning first=307 second=245 amount=-1 +kerning first=1061 second=1083 amount=-2 +kerning first=262 second=102 amount=-2 +kerning first=216 second=296 amount=-2 +kerning first=317 second=316 amount=-2 +kerning first=263 second=45 amount=-2 +kerning first=288 second=296 amount=-1 +kerning first=353 second=316 amount=-2 +kerning first=371 second=45 amount=-2 +kerning first=280 second=252 amount=-2 +kerning first=272 second=202 amount=-2 +kerning first=84 second=290 amount=-3 +kerning first=108 second=335 amount=-1 +kerning first=200 second=202 amount=-2 +kerning first=67 second=252 amount=-2 +kerning first=249 second=335 amount=-1 +kerning first=231 second=226 amount=-2 +kerning first=103 second=252 amount=-1 +kerning first=202 second=206 amount=-2 +kerning first=264 second=259 amount=-2 +kerning first=291 second=116 amount=-1 +kerning first=85 second=253 amount=-1 +kerning first=284 second=171 amount=-3 +kerning first=255 second=116 amount=-1 +kerning first=197 second=356 amount=-6 +kerning first=274 second=206 amount=-2 +kerning first=336 second=259 amount=-1 +kerning first=363 second=116 amount=-1 +kerning first=379 second=103 amount=-3 +kerning first=325 second=246 amount=-2 +kerning first=377 second=200 amount=-1 +kerning first=226 second=253 amount=-3 +kerning first=196 second=79 amount=-3 +kerning first=346 second=206 amount=-3 +kerning first=87 second=259 amount=-5 +kerning first=316 second=252 amount=-2 +kerning first=307 second=103 amount=-3 +kerning first=230 second=100 amount=-1 +kerning first=1079 second=1082 amount=-1 +kerning first=253 second=246 amount=-3 +kerning first=352 second=252 amount=-1 +kerning first=217 second=246 amount=-2 +kerning first=381 second=375 amount=-3 +kerning first=65 second=83 amount=-3 +kerning first=235 second=103 amount=-3 +kerning first=212 second=323 amount=-2 +kerning first=203 second=122 amount=-2 +kerning first=246 second=382 amount=-2 +kerning first=379 second=369 amount=-3 +kerning first=282 second=382 amount=-2 +kerning first=206 second=83 amount=-2 +kerning first=98 second=122 amount=-2 +kerning first=201 second=266 amount=-1 +kerning first=262 second=362 amount=-2 +kerning first=354 second=382 amount=-3 +kerning first=80 second=279 amount=-1 +kerning first=278 second=83 amount=-2 +kerning first=347 second=122 amount=-2 +kerning first=69 second=382 amount=-2 +kerning first=235 second=369 amount=-2 +kerning first=377 second=356 amount=-2 +kerning first=105 second=382 amount=-1 +kerning first=199 second=369 amount=-2 +kerning first=90 second=336 amount=-1 +kerning first=350 second=83 amount=-1 +kerning first=275 second=122 amount=-2 +kerning first=307 second=369 amount=-1 +kerning first=264 second=109 amount=-1 +kerning first=210 second=382 amount=-2 +kerning first=195 second=336 amount=-3 +kerning first=1119 second=1105 amount=-1 +kerning first=253 second=248 amount=-3 +kerning first=69 second=380 amount=-2 +kerning first=1079 second=1080 amount=-1 +kerning first=289 second=248 amount=-2 +kerning first=105 second=380 amount=-1 +kerning first=257 second=273 amount=-1 +kerning first=1083 second=1105 amount=-1 +kerning first=317 second=198 amount=-2 +kerning first=217 second=248 amount=-2 +kerning first=249 second=223 amount=-1 +kerning first=210 second=380 amount=-2 +kerning first=363 second=263 amount=-1 +kerning first=68 second=198 amount=-4 +kerning first=202 second=330 amount=-2 +kerning first=269 second=233 amount=-1 +kerning first=1077 second=1107 amount=-1 +kerning first=201 second=115 amount=-1 +kerning first=101 second=355 amount=-1 +kerning first=233 second=233 amount=-1 +kerning first=65 second=355 amount=-1 +kerning first=219 second=263 amount=-2 +kerning first=321 second=73 amount=-2 +kerning first=350 second=355 amount=-1 +kerning first=255 second=263 amount=-3 +kerning first=103 second=365 amount=-1 +kerning first=314 second=355 amount=-1 +kerning first=291 second=263 amount=-2 +kerning first=67 second=365 amount=-2 +kerning first=84 second=298 amount=-1 +kerning first=200 second=315 amount=-2 +kerning first=345 second=115 amount=-1 +kerning first=377 second=233 amount=-1 +kerning first=381 second=115 amount=-2 +kerning first=242 second=355 amount=-1 +kerning first=1045 second=1090 amount=-3 +kerning first=78 second=263 amount=-2 +kerning first=213 second=73 amount=-2 +kerning first=213 second=75 amount=-2 +kerning first=219 second=110 amount=-2 +kerning first=325 second=248 amount=-2 +kerning first=255 second=110 amount=-2 +kerning first=86 second=313 amount=-1 +kerning first=1044 second=1092 amount=-1 +kerning first=291 second=110 amount=-1 +kerning first=376 second=290 amount=-3 +kerning first=207 second=303 amount=-1 +kerning first=112 second=98 amount=-1 +kerning first=1091 second=1108 amount=-2 +kerning first=99 second=225 amount=-2 +kerning first=363 second=110 amount=-1 +kerning first=66 second=303 amount=-3 +kerning first=197 second=350 amount=-3 +kerning first=106 second=328 amount=-2 +kerning first=76 second=98 amount=-2 +kerning first=321 second=75 amount=-2 +kerning first=199 second=363 amount=-2 +kerning first=70 second=328 amount=-1 +kerning first=235 second=363 amount=-2 +kerning first=272 second=315 amount=-2 +kerning first=268 second=290 amount=-3 +kerning first=321 second=221 amount=-3 +kerning first=351 second=303 amount=-2 +kerning first=307 second=363 amount=-1 +kerning first=65 second=235 amount=-1 +kerning first=317 second=196 amount=-2 +kerning first=243 second=303 amount=-1 +kerning first=283 second=328 amount=-2 +kerning first=73 second=248 amount=-2 +kerning first=101 second=235 amount=-1 +kerning first=279 second=303 amount=-2 +kerning first=377 second=350 amount=-1 +kerning first=379 second=363 amount=-3 +kerning first=68 second=196 amount=-4 +kerning first=201 second=260 amount=-2 +kerning first=85 second=102 amount=-1 +kerning first=196 second=290 amount=-3 +kerning first=1054 second=1093 amount=-1 +kerning first=326 second=46 amount=-1 +kerning first=204 second=225 amount=-2 +kerning first=246 second=380 amount=-2 +kerning first=195 second=338 amount=-3 +kerning first=362 second=46 amount=-5 +kerning first=240 second=225 amount=-1 +kerning first=282 second=380 amount=-2 +kerning first=289 second=98 amount=-1 +kerning first=316 second=237 amount=-1 +kerning first=79 second=325 amount=-2 +kerning first=365 second=273 amount=-1 +kerning first=253 second=98 amount=-1 +kerning first=354 second=380 amount=-3 +kerning first=381 second=260 amount=-1 +kerning first=1101 second=1102 amount=-1 +kerning first=69 second=112 amount=-2 +kerning first=1061 second=1077 amount=-2 +kerning first=87 second=377 amount=-3 +kerning first=8222 second=374 amount=-6 +kerning first=280 second=367 amount=-2 +kerning first=1097 second=1077 amount=-1 +kerning first=65 second=87 amount=-6 +kerning first=78 second=261 amount=-2 +kerning first=316 second=367 amount=-2 +kerning first=196 second=318 amount=-2 +kerning first=79 second=327 amount=-2 +kerning first=114 second=261 amount=-1 +kerning first=8217 second=283 amount=-3 +kerning first=332 second=86 amount=-2 +kerning first=1057 second=1052 amount=-1 +kerning first=83 second=352 amount=-1 +kerning first=244 second=367 amount=-1 +kerning first=310 second=210 amount=-3 +kerning first=264 second=377 amount=-2 +kerning first=103 second=367 amount=-1 +kerning first=274 second=210 amount=-1 +kerning first=283 second=326 amount=-2 +kerning first=251 second=351 amount=-2 +kerning first=70 second=211 amount=-1 +kerning first=296 second=352 amount=-2 +kerning first=202 second=210 amount=-1 +kerning first=260 second=352 amount=-3 +kerning first=67 second=367 amount=-2 +kerning first=288 second=302 amount=-1 +kerning first=70 second=326 amount=-1 +kerning first=363 second=261 amount=-1 +kerning first=354 second=112 amount=-2 +kerning first=352 second=250 amount=-1 +kerning first=206 second=235 amount=-2 +kerning first=106 second=326 amount=-2 +kerning first=216 second=302 amount=-2 +kerning first=336 second=377 amount=-2 +kerning first=73 second=287 amount=-3 +kerning first=1081 second=1092 amount=-1 +kerning first=100 second=171 amount=-2 +kerning first=282 second=112 amount=-2 +kerning first=264 second=255 amount=-1 +kerning first=1117 second=1092 amount=-1 +kerning first=246 second=112 amount=-1 +kerning first=244 second=250 amount=-1 +kerning first=8216 second=217 amount=-1 +kerning first=314 second=235 amount=-1 +kerning first=219 second=261 amount=-3 +kerning first=210 second=112 amount=-1 +kerning first=350 second=235 amount=-1 +kerning first=109 second=287 amount=-2 +kerning first=255 second=261 amount=-3 +kerning first=316 second=250 amount=-2 +kerning first=1092 second=1103 amount=-2 +kerning first=250 second=287 amount=-3 +kerning first=291 second=261 amount=-3 +kerning first=105 second=112 amount=-1 +kerning first=280 second=250 amount=-2 +kerning first=1056 second=1103 amount=-3 +kerning first=214 second=287 amount=-1 +kerning first=118 second=257 amount=-3 +kerning first=67 second=250 amount=-2 +kerning first=291 second=378 amount=-3 +kerning first=76 second=366 amount=-3 +kerning first=282 second=262 amount=-1 +kerning first=278 second=237 amount=-1 +kerning first=251 second=353 amount=-2 +kerning first=255 second=378 amount=-3 +kerning first=242 second=237 amount=-1 +kerning first=286 second=287 amount=-3 +kerning first=107 second=275 amount=-3 +kerning first=287 second=353 amount=-3 +kerning first=363 second=378 amount=-2 +kerning first=354 second=262 amount=-3 +kerning first=206 second=237 amount=-1 +kerning first=323 second=353 amount=-2 +kerning first=103 second=250 amount=-1 +kerning first=327 second=378 amount=-1 +kerning first=352 second=365 amount=-1 +kerning first=325 second=100 amount=-2 +kerning first=352 second=369 amount=-1 +kerning first=316 second=365 amount=-2 +kerning first=101 second=237 amount=-2 +kerning first=74 second=353 amount=-2 +kerning first=1116 second=1095 amount=-1 +kerning first=78 second=378 amount=-1 +kerning first=280 second=365 amount=-2 +kerning first=83 second=45 amount=-3 +kerning first=65 second=237 amount=-1 +kerning first=199 second=277 amount=-2 +kerning first=110 second=353 amount=-1 +kerning first=241 second=171 amount=-3 +kerning first=219 second=378 amount=-3 +kerning first=244 second=365 amount=-1 +kerning first=381 second=113 amount=-1 +kerning first=218 second=197 amount=-4 +kerning first=313 second=171 amount=-1 +kerning first=350 second=87 amount=-3 +kerning first=368 second=352 amount=-3 +kerning first=1049 second=1117 amount=-1 +kerning first=217 second=100 amount=-2 +kerning first=198 second=85 amount=-2 +kerning first=226 second=249 amount=-1 +kerning first=332 second=352 amount=-1 +kerning first=315 second=338 amount=-1 +kerning first=290 second=197 amount=-3 +kerning first=253 second=100 amount=-3 +kerning first=278 second=87 amount=-1 +kerning first=85 second=249 amount=-1 +kerning first=289 second=100 amount=-2 +kerning first=121 second=249 amount=-1 +kerning first=69 second=262 amount=-1 +kerning first=356 second=275 amount=-3 +kerning first=362 second=197 amount=-4 +kerning first=1065 second=1104 amount=-1 +kerning first=82 second=288 amount=-3 +kerning first=370 second=249 amount=-1 +kerning first=263 second=115 amount=-2 +kerning first=321 second=223 amount=-1 +kerning first=262 second=249 amount=-2 +kerning first=1088 second=1078 amount=-1 +kerning first=298 second=249 amount=-1 +kerning first=1054 second=1091 amount=-1 +kerning first=204 second=74 amount=-1 +kerning first=282 second=288 amount=-1 +kerning first=66 second=113 amount=-1 +kerning first=199 second=87 amount=-1 +kerning first=1100 second=1096 amount=-1 +kerning first=107 second=243 amount=-3 +kerning first=113 second=314 amount=-2 +kerning first=354 second=288 amount=-3 +kerning first=369 second=106 amount=-2 +kerning first=254 second=314 amount=-2 +kerning first=8217 second=118 amount=-1 +kerning first=8216 second=114 amount=-1 +kerning first=1030 second=1092 amount=-1 +kerning first=307 second=333 amount=-1 +kerning first=326 second=314 amount=-1 +kerning first=69 second=288 amount=-1 +kerning first=207 second=113 amount=-2 +kerning first=290 second=314 amount=-1 +kerning first=366 second=210 amount=-1 +kerning first=379 second=333 amount=-1 +kerning first=267 second=281 amount=-1 +kerning first=84 second=366 amount=-1 +kerning first=256 second=269 amount=-1 +kerning first=330 second=210 amount=-2 +kerning first=1074 second=1118 amount=-2 +kerning first=102 second=113 amount=-1 +kerning first=220 second=269 amount=-2 +kerning first=227 second=307 amount=-1 +kerning first=263 second=307 amount=-2 +kerning first=364 second=255 amount=-1 +kerning first=8220 second=375 amount=-1 +kerning first=84 second=120 amount=-2 +kerning first=196 second=83 amount=-3 +kerning first=328 second=255 amount=-2 +kerning first=231 second=224 amount=-2 +kerning first=120 second=120 amount=-1 +kerning first=82 second=268 amount=-3 +kerning first=335 second=307 amount=-1 +kerning first=364 second=269 amount=-2 +kerning first=192 second=281 amount=-1 +kerning first=202 second=262 amount=-1 +kerning first=371 second=307 amount=-1 +kerning first=256 second=255 amount=-3 +kerning first=303 second=224 amount=-2 +kerning first=1086 second=1078 amount=-1 +kerning first=281 second=244 amount=-1 +kerning first=267 second=224 amount=-2 +kerning first=264 second=281 amount=-2 +kerning first=274 second=262 amount=-1 +kerning first=375 second=224 amount=-3 +kerning first=356 second=243 amount=-3 +kerning first=310 second=262 amount=-3 +kerning first=115 second=255 amount=-3 +kerning first=339 second=224 amount=-2 +kerning first=187 second=198 amount=-4 +kerning first=207 second=99 amount=-2 +kerning first=67 second=101 amount=-2 +kerning first=369 second=120 amount=-2 +kerning first=103 second=101 amount=-2 +kerning first=74 second=331 amount=-1 +kerning first=376 second=275 amount=-3 +kerning first=354 second=274 amount=-1 +kerning first=212 second=229 amount=-1 +kerning first=279 second=99 amount=-1 +kerning first=382 second=248 amount=-1 +kerning first=71 second=229 amount=-1 +kerning first=282 second=274 amount=-2 +kerning first=107 second=229 amount=-2 +kerning first=202 second=362 amount=-2 +kerning first=8216 second=100 amount=-3 +kerning first=8220 second=122 amount=-1 +kerning first=310 second=248 amount=-2 +kerning first=225 second=120 amount=-1 +kerning first=272 second=75 amount=-2 +kerning first=346 second=248 amount=-1 +kerning first=305 second=118 amount=-3 +kerning first=261 second=120 amount=-1 +kerning first=356 second=229 amount=-5 +kerning first=316 second=101 amount=-1 +kerning first=199 second=73 amount=-3 +kerning first=352 second=101 amount=-1 +kerning first=200 second=75 amount=-2 +kerning first=377 second=118 amount=-2 +kerning first=333 second=120 amount=-3 +kerning first=284 second=229 amount=-1 +kerning first=346 second=8220 amount=-2 +kerning first=197 second=118 amount=-3 +kerning first=310 second=8220 amount=-2 +kerning first=269 second=118 amount=-2 +kerning first=279 second=113 amount=-1 +kerning first=366 second=196 amount=-4 +kerning first=233 second=118 amount=-2 +kerning first=364 second=241 amount=-2 +kerning first=81 second=230 amount=-1 +kerning first=328 second=241 amount=-1 +kerning first=333 second=106 amount=-2 +kerning first=379 second=87 amount=-2 +kerning first=102 second=99 amount=-1 +kerning first=290 second=68 amount=-1 +kerning first=225 second=106 amount=-1 +kerning first=66 second=99 amount=-1 +kerning first=261 second=106 amount=3 +kerning first=76 second=80 amount=-2 +kerning first=374 second=364 amount=-1 +kerning first=259 second=271 amount=-1 +kerning first=227 second=248 amount=-1 +kerning first=251 second=111 amount=-1 +kerning first=259 second=109 amount=-1 +kerning first=235 second=361 amount=-2 +kerning first=69 second=316 amount=-1 +kerning first=194 second=264 amount=-3 +kerning first=287 second=111 amount=-2 +kerning first=105 second=316 amount=-2 +kerning first=323 second=111 amount=-2 +kerning first=307 second=361 amount=-1 +kerning first=89 second=264 amount=-3 +kerning first=1073 second=1116 amount=-1 +kerning first=74 second=111 amount=-2 +kerning first=1037 second=1116 amount=-1 +kerning first=379 second=361 amount=-3 +kerning first=246 second=316 amount=-2 +kerning first=290 second=82 amount=-1 +kerning first=337 second=118 amount=-2 +kerning first=197 second=364 amount=-3 +kerning first=228 second=267 amount=-1 +kerning first=76 second=66 amount=-2 +kerning first=356 second=257 amount=-5 +kerning first=264 second=267 amount=-2 +kerning first=269 second=104 amount=-2 +kerning first=75 second=351 amount=-1 +kerning first=1101 second=1116 amount=-1 +kerning first=202 second=44 amount=-1 +kerning first=344 second=89 amount=-3 +kerning first=233 second=104 amount=-2 +kerning first=1069 second=1093 amount=-1 +kerning first=197 second=104 amount=-2 +kerning first=274 second=44 amount=-1 +kerning first=1048 second=1057 amount=-1 +kerning first=8216 second=346 amount=-1 +kerning first=313 second=205 amount=-2 +kerning first=200 second=89 amount=-1 +kerning first=379 second=44 amount=-1 +kerning first=87 second=323 amount=-1 +kerning first=210 second=274 amount=-2 +kerning first=199 second=361 amount=-2 +kerning first=97 second=44 amount=-1 +kerning first=272 second=89 amount=-2 +kerning first=8216 second=86 amount=-1 +kerning first=334 second=368 amount=-1 +kerning first=323 second=97 amount=-2 +kerning first=217 second=326 amount=-2 +kerning first=338 second=250 amount=-2 +kerning first=210 second=302 amount=-2 +kerning first=331 second=226 amount=-1 +kerning first=253 second=326 amount=-2 +kerning first=307 second=347 amount=-2 +kerning first=264 second=323 amount=-3 +kerning first=302 second=250 amount=-2 +kerning first=367 second=226 amount=-1 +kerning first=1050 second=1054 amount=-4 +kerning first=251 second=97 amount=-1 +kerning first=289 second=326 amount=-1 +kerning first=87 second=281 amount=-3 +kerning first=203 second=278 amount=-2 +kerning first=76 second=354 amount=-3 +kerning first=275 second=8250 amount=-2 +kerning first=287 second=97 amount=-3 +kerning first=235 second=347 amount=-2 +kerning first=336 second=323 amount=-2 +kerning first=374 second=250 amount=-2 +kerning first=69 second=302 amount=-2 +kerning first=224 second=244 amount=-1 +kerning first=103 second=97 amount=-3 +kerning first=199 second=347 amount=-2 +kerning first=194 second=250 amount=-3 +kerning first=68 second=323 amount=-2 +kerning first=76 second=326 amount=-1 +kerning first=251 second=371 amount=-1 +kerning first=8216 second=374 amount=-1 +kerning first=112 second=326 amount=-1 +kerning first=205 second=233 amount=-2 +kerning first=266 second=250 amount=-2 +kerning first=287 second=371 amount=-1 +kerning first=1102 second=1078 amount=-1 +kerning first=230 second=250 amount=-2 +kerning first=1048 second=1099 amount=-1 +kerning first=277 second=233 amount=-1 +kerning first=82 second=212 amount=-3 +kerning first=272 second=103 amount=-1 +kerning first=231 second=110 amount=-2 +kerning first=377 second=90 amount=-1 +kerning first=284 second=257 amount=-1 +kerning first=236 second=103 amount=-3 +kerning first=269 second=378 amount=-2 +kerning first=199 second=45 amount=-4 +kerning first=235 second=333 amount=-1 +kerning first=200 second=103 amount=-3 +kerning first=313 second=219 amount=-3 +kerning first=89 second=250 amount=-2 +kerning first=377 second=378 amount=-3 +kerning first=82 second=226 amount=-2 +kerning first=212 second=257 amount=-1 +kerning first=199 second=333 amount=-2 +kerning first=118 second=226 amount=-3 +kerning first=248 second=257 amount=-1 +kerning first=374 second=264 amount=-3 +kerning first=354 second=302 amount=-1 +kerning first=187 second=226 amount=-1 +kerning first=379 second=45 amount=-3 +kerning first=338 second=264 amount=-1 +kerning first=223 second=226 amount=-1 +kerning first=113 second=110 amount=-2 +kerning first=1048 second=1085 amount=-1 +kerning first=302 second=264 amount=-2 +kerning first=233 second=378 amount=-2 +kerning first=282 second=302 amount=-2 +kerning first=259 second=226 amount=-1 +kerning first=379 second=347 amount=-2 +kerning first=266 second=264 amount=-3 +kerning first=97 second=8217 amount=-3 +kerning first=295 second=226 amount=-1 +kerning first=71 second=257 amount=-1 +kerning first=218 second=110 amount=-2 +kerning first=1045 second=1114 amount=-1 +kerning first=254 second=110 amount=-1 +kerning first=259 second=240 amount=-1 +kerning first=315 second=362 amount=-3 +kerning first=200 second=363 amount=-2 +kerning first=118 second=240 amount=-3 +kerning first=1073 second=1088 amount=-1 +kerning first=89 second=194 amount=-6 +kerning first=254 second=227 amount=-1 +kerning first=326 second=110 amount=-1 +kerning first=65 second=210 amount=-3 +kerning first=323 second=214 amount=-2 +kerning first=362 second=110 amount=-2 +kerning first=367 second=240 amount=-1 +kerning first=8216 second=351 amount=-2 +kerning first=202 second=220 amount=-2 +kerning first=206 second=275 amount=-2 +kerning first=1094 second=1108 amount=-1 +kerning first=1037 second=1088 amount=-1 +kerning first=74 second=214 amount=-2 +kerning first=8216 second=242 amount=-3 +kerning first=344 second=363 amount=-2 +kerning first=202 second=318 amount=-1 +kerning first=325 second=284 amount=-2 +kerning first=380 second=363 amount=-2 +kerning first=66 second=71 amount=-3 +kerning first=346 second=220 amount=-3 +kerning first=108 second=259 amount=-2 +kerning first=310 second=318 amount=-1 +kerning first=232 second=116 amount=-1 +kerning first=336 second=77 amount=-2 +kerning first=282 second=330 amount=-2 +kerning first=286 second=369 amount=-1 +kerning first=249 second=259 amount=-1 +kerning first=346 second=318 amount=-2 +kerning first=100 second=8221 amount=-2 +kerning first=274 second=220 amount=-2 +kerning first=84 second=324 amount=-3 +kerning first=250 second=369 amount=-1 +kerning first=213 second=259 amount=-1 +kerning first=382 second=318 amount=-2 +kerning first=264 second=77 amount=-3 +kerning first=352 second=375 amount=-2 +kerning first=346 second=304 amount=-3 +kerning first=210 second=330 amount=-2 +kerning first=338 second=194 amount=-2 +kerning first=82 second=240 amount=-3 +kerning first=374 second=194 amount=-6 +kerning first=274 second=304 amount=-2 +kerning first=74 second=97 amount=-3 +kerning first=109 second=369 amount=-1 +kerning first=72 second=259 amount=-2 +kerning first=196 second=116 amount=-1 +kerning first=266 second=194 amount=-3 +kerning first=110 second=97 amount=-1 +kerning first=73 second=369 amount=-2 +kerning first=202 second=304 amount=-2 +kerning first=354 second=330 amount=-1 +kerning first=1037 second=1102 amount=-1 +kerning first=122 second=279 amount=-1 +kerning first=118 second=254 amount=-1 +kerning first=333 second=324 amount=-1 +kerning first=86 second=279 amount=-3 +kerning first=291 second=253 amount=-1 +kerning first=103 second=375 amount=-1 +kerning first=187 second=254 amount=-1 +kerning first=227 second=279 amount=-1 +kerning first=327 second=253 amount=-2 +kerning first=67 second=375 amount=-1 +kerning first=1047 second=1055 amount=-2 +kerning first=110 second=228 amount=-1 +kerning first=223 second=254 amount=-1 +kerning first=363 second=253 amount=-3 +kerning first=74 second=228 amount=-2 +kerning first=259 second=254 amount=-1 +kerning first=200 second=377 amount=-1 +kerning first=194 second=81 amount=-3 +kerning first=316 second=375 amount=-3 +kerning first=69 second=330 amount=-2 +kerning first=354 second=344 amount=-1 +kerning first=120 second=324 amount=-1 +kerning first=244 second=375 amount=-3 +kerning first=108 second=273 amount=-1 +kerning first=364 second=117 amount=-1 +kerning first=82 second=254 amount=-3 +kerning first=225 second=324 amount=-1 +kerning first=217 second=284 amount=-1 +kerning first=316 second=253 amount=-3 +kerning first=76 second=298 amount=-2 +kerning first=310 second=234 amount=-2 +kerning first=210 second=344 amount=-2 +kerning first=84 second=310 amount=-1 +kerning first=315 second=251 amount=-2 +kerning first=70 second=332 amount=-1 +kerning first=250 second=355 amount=-1 +kerning first=346 second=234 amount=-1 +kerning first=1058 second=1108 amount=-1 +kerning first=272 second=377 amount=-2 +kerning first=1113 second=1103 amount=-2 +kerning first=382 second=234 amount=-1 +kerning first=282 second=344 amount=-2 +kerning first=1077 second=1103 amount=-1 +kerning first=371 second=378 amount=-1 +kerning first=97 second=234 amount=-1 +kerning first=108 second=287 amount=-3 +kerning first=78 second=253 amount=-2 +kerning first=1045 second=1100 amount=-1 +kerning first=263 second=279 amount=-1 +kerning first=76 second=284 amount=-1 +kerning first=72 second=287 amount=-3 +kerning first=69 second=344 amount=-2 +kerning first=213 second=287 amount=-1 +kerning first=198 second=8249 amount=-2 +kerning first=1098 second=1119 amount=-1 +kerning first=219 second=253 amount=-1 +kerning first=344 second=335 amount=-3 +kerning first=83 second=242 amount=-1 +kerning first=202 second=290 amount=-1 +kerning first=221 second=313 amount=-1 +kerning first=249 second=287 amount=-3 +kerning first=8250 second=249 amount=-1 +kerning first=213 second=8217 amount=-2 +kerning first=76 second=270 amount=-2 +kerning first=278 second=315 amount=-2 +kerning first=249 second=8217 amount=-3 +kerning first=112 second=109 amount=-1 +kerning first=274 second=290 amount=-1 +kerning first=84 second=338 amount=-3 +kerning first=310 second=121 amount=-3 +kerning first=119 second=242 amount=-3 +kerning first=260 second=242 amount=-1 +kerning first=336 second=105 amount=-1 +kerning first=236 second=335 amount=-1 +kerning first=196 second=101 amount=-1 +kerning first=224 second=242 amount=-1 +kerning first=369 second=380 amount=-2 +kerning first=228 second=105 amount=-1 +kerning first=347 second=367 amount=-1 +kerning first=85 second=197 amount=-4 +kerning first=264 second=105 amount=-1 +kerning first=1055 second=1057 amount=-1 +kerning first=108 second=8217 amount=-3 +kerning first=296 second=242 amount=-2 +kerning first=335 second=116 amount=-1 +kerning first=114 second=225 amount=-1 +kerning first=1037 second=1060 amount=-1 +kerning first=274 second=327 amount=-2 +kerning first=192 second=105 amount=-1 +kerning first=1058 second=1094 amount=-2 +kerning first=76 second=353 amount=-1 +kerning first=1077 second=1117 amount=-1 +kerning first=368 second=242 amount=-2 +kerning first=225 second=380 amount=-1 +kerning first=219 second=225 amount=-3 +kerning first=225 second=226 amount=-1 +kerning first=262 second=197 amount=-3 +kerning first=261 second=380 amount=-1 +kerning first=87 second=105 amount=-2 +kerning first=97 second=248 amount=-1 +kerning first=350 second=315 amount=-3 +kerning first=201 second=119 amount=-1 +kerning first=321 second=8217 amount=-4 +kerning first=334 second=197 amount=-4 +kerning first=323 second=228 amount=-2 +kerning first=370 second=197 amount=-4 +kerning first=287 second=228 amount=-3 +kerning first=262 second=108 amount=-1 +kerning first=84 second=380 amount=-3 +kerning first=78 second=225 amount=-2 +kerning first=8220 second=101 amount=-3 +kerning first=1047 second=1083 amount=-1 +kerning first=251 second=228 amount=-1 +kerning first=226 second=108 amount=-1 +kerning first=120 second=380 amount=-2 +kerning first=45 second=221 amount=-4 +kerning first=226 second=122 amount=-1 +kerning first=72 second=231 amount=-2 +kerning first=347 second=46 amount=-2 +kerning first=203 second=74 amount=-1 +kerning first=381 second=119 amount=-2 +kerning first=76 second=256 amount=-2 +kerning first=84 second=352 amount=-3 +kerning first=121 second=122 amount=-3 +kerning first=196 second=102 amount=-1 +kerning first=75 second=240 amount=-2 +kerning first=85 second=122 amount=-3 +kerning first=232 second=102 amount=-2 +kerning first=69 second=289 amount=-3 +kerning first=291 second=225 amount=-3 +kerning first=370 second=122 amount=-3 +kerning first=249 second=231 amount=-1 +kerning first=203 second=46 amount=-1 +kerning first=327 second=225 amount=-2 +kerning first=334 second=122 amount=-2 +kerning first=207 second=71 amount=-2 +kerning first=376 second=116 amount=-1 +kerning first=334 second=313 amount=-2 +kerning first=363 second=225 amount=-1 +kerning first=298 second=122 amount=-1 +kerning first=307 second=117 amount=-1 +kerning first=315 second=71 amount=-1 +kerning first=122 second=307 amount=-1 +kerning first=217 second=256 amount=-4 +kerning first=262 second=122 amount=-2 +kerning first=311 second=46 amount=-1 +kerning first=87 second=77 amount=-1 +kerning first=228 second=250 amount=-1 +kerning first=249 second=245 amount=-1 +kerning first=98 second=46 amount=-3 +kerning first=120 second=281 amount=-2 +kerning first=219 second=211 amount=-1 +kerning first=83 second=379 amount=-1 +kerning first=209 second=44 amount=-1 +kerning first=108 second=245 amount=-1 +kerning first=310 second=290 amount=-3 +kerning first=268 second=102 amount=-2 +kerning first=219 second=347 amount=-2 +kerning first=1045 second=1098 amount=-3 +kerning first=327 second=211 amount=-2 +kerning first=376 second=102 amount=-1 +kerning first=317 second=216 amount=-1 +kerning first=106 second=171 amount=-3 +kerning first=203 second=112 amount=-2 +kerning first=1052 second=1086 amount=-1 +kerning first=211 second=171 amount=-1 +kerning first=98 second=112 amount=-1 +kerning first=103 second=223 amount=-1 +kerning first=370 second=211 amount=-1 +kerning first=337 second=107 amount=-1 +kerning first=204 second=382 amount=-1 +kerning first=209 second=216 amount=-2 +kerning first=88 second=107 amount=-1 +kerning first=235 second=8221 amount=-2 +kerning first=229 second=107 amount=-1 +kerning first=70 second=171 amount=-3 +kerning first=193 second=107 amount=-2 +kerning first=365 second=105 amount=-2 +kerning first=377 second=257 amount=-1 +kerning first=298 second=235 amount=-2 +kerning first=257 second=105 amount=-1 +kerning first=67 second=70 amount=-3 +kerning first=1044 second=1098 amount=-1 +kerning first=370 second=235 amount=-2 +kerning first=307 second=8221 amount=-2 +kerning first=221 second=105 amount=-2 +kerning first=1116 second=1098 amount=-1 +kerning first=347 second=112 amount=-3 +kerning first=221 second=81 amount=-3 +kerning first=1056 second=1077 amount=-1 +kerning first=116 second=105 amount=-1 +kerning first=311 second=112 amount=-1 +kerning first=8222 second=354 amount=-6 +kerning first=355 second=171 amount=-1 +kerning first=283 second=100 amount=-1 +kerning first=275 second=112 amount=-1 +kerning first=268 second=296 amount=-3 +kerning first=1054 second=1041 amount=-1 +kerning first=73 second=67 amount=-2 +kerning first=214 second=327 amount=-2 +kerning first=350 second=249 amount=-1 +kerning first=376 second=296 amount=-1 +kerning first=234 second=251 amount=-2 +kerning first=277 second=275 amount=-1 +kerning first=117 second=353 amount=-2 +kerning first=198 second=251 amount=-2 +kerning first=8217 second=233 amount=-3 +kerning first=195 second=117 amount=-3 +kerning first=106 second=100 amount=-1 +kerning first=208 second=204 amount=-2 +kerning first=314 second=249 amount=-2 +kerning first=205 second=275 amount=-2 +kerning first=111 second=380 amount=-2 +kerning first=211 second=346 amount=-1 +kerning first=378 second=251 amount=-2 +kerning first=1062 second=1105 amount=-1 +kerning first=280 second=204 amount=-2 +kerning first=83 second=256 amount=-4 +kerning first=100 second=275 amount=-1 +kerning first=234 second=223 amount=-1 +kerning first=352 second=204 amount=-3 +kerning first=221 second=379 amount=-3 +kerning first=45 second=353 amount=-1 +kerning first=85 second=211 amount=-1 +kerning first=377 second=259 amount=-1 +kerning first=65 second=249 amount=-3 +kerning first=266 second=44 amount=-1 +kerning first=45 second=83 amount=-3 +kerning first=288 second=230 amount=-1 +kerning first=198 second=223 amount=-1 +kerning first=81 second=83 amount=-1 +kerning first=324 second=230 amount=-1 +kerning first=206 second=249 amount=-1 +kerning first=262 second=211 amount=-3 +kerning first=216 second=230 amount=-1 +kerning first=242 second=249 amount=-1 +kerning first=298 second=211 amount=-2 +kerning first=252 second=230 amount=-1 +kerning first=67 second=204 amount=-3 +kerning first=222 second=83 amount=-1 +kerning first=1073 second=1099 amount=-1 +kerning first=111 second=230 amount=-1 +kerning first=258 second=83 amount=-3 +kerning first=332 second=256 amount=-4 +kerning first=1113 second=1075 amount=-1 +kerning first=221 second=109 amount=-3 +kerning first=368 second=284 amount=-1 +kerning first=330 second=83 amount=-2 +kerning first=99 second=114 amount=-1 +kerning first=8217 second=271 amount=-3 +kerning first=366 second=83 amount=-3 +kerning first=371 second=237 amount=-1 +kerning first=296 second=284 amount=-2 +kerning first=209 second=244 amount=-2 +kerning first=257 second=109 amount=-1 +kerning first=378 second=289 amount=-2 +kerning first=70 second=199 amount=-1 +kerning first=229 second=339 amount=-1 +kerning first=1051 second=1084 amount=-1 +kerning first=263 second=237 amount=-2 +kerning first=260 second=284 amount=-3 +kerning first=352 second=232 amount=-1 +kerning first=203 second=362 amount=-2 +kerning first=227 second=237 amount=-1 +kerning first=1105 second=1091 amount=-1 +kerning first=1072 second=1095 amount=-2 +kerning first=122 second=237 amount=-1 +kerning first=196 second=334 amount=-3 +kerning first=98 second=116 amount=-1 +kerning first=86 second=237 amount=-2 +kerning first=346 second=274 amount=-3 +kerning first=288 second=282 amount=-1 +kerning first=381 second=194 amount=-1 +kerning first=316 second=232 amount=-1 +kerning first=268 second=334 amount=-3 +kerning first=84 second=345 amount=-1 +kerning first=216 second=282 amount=-2 +kerning first=67 second=232 amount=-2 +kerning first=201 second=194 amount=-2 +kerning first=192 second=350 amount=-3 +kerning first=304 second=334 amount=-2 +kerning first=198 second=289 amount=-3 +kerning first=70 second=346 amount=-3 +kerning first=314 second=277 amount=-1 +kerning first=103 second=232 amount=-2 +kerning first=376 second=334 amount=-3 +kerning first=288 second=202 amount=-1 +kerning first=252 second=254 amount=-2 +kerning first=101 second=277 amount=-1 +kerning first=257 second=351 amount=-1 +kerning first=330 second=121 amount=-2 +kerning first=288 second=254 amount=-1 +kerning first=65 second=277 amount=-1 +kerning first=221 second=351 amount=-3 +kerning first=286 second=327 amount=-1 +kerning first=324 second=254 amount=-2 +kerning first=206 second=277 amount=-2 +kerning first=258 second=121 amount=-3 +kerning first=1038 second=1090 amount=-3 +kerning first=337 second=367 amount=-1 +kerning first=75 second=254 amount=-1 +kerning first=65 second=305 amount=-1 +kerning first=80 second=351 amount=-1 +kerning first=277 second=311 amount=-2 +kerning first=113 second=273 amount=-1 +kerning first=111 second=254 amount=-1 +kerning first=1098 second=1095 amount=-2 +kerning first=204 second=350 amount=-2 +kerning first=117 second=275 amount=-1 +kerning first=350 second=69 amount=-3 +kerning first=1070 second=1113 amount=-2 +kerning first=45 second=121 amount=-3 +kerning first=198 second=261 amount=-1 +kerning first=193 second=367 amount=-3 +kerning first=242 second=305 amount=-1 +kerning first=307 second=99 amount=-1 +kerning first=1088 second=1096 amount=-1 +kerning first=234 second=261 amount=-2 +kerning first=229 second=367 amount=-1 +kerning first=278 second=69 amount=-2 +kerning first=88 second=367 amount=-3 +kerning first=314 second=305 amount=-1 +kerning first=1027 second=1076 amount=-3 +kerning first=196 second=245 amount=-1 +kerning first=236 second=117 amount=-1 +kerning first=193 second=79 amount=-3 +kerning first=8217 second=243 amount=-3 +kerning first=278 second=305 amount=-1 +kerning first=76 second=260 amount=-2 +kerning first=200 second=117 amount=-2 +kerning first=240 second=114 amount=-1 +kerning first=8216 second=224 amount=-3 +kerning first=217 second=260 amount=-4 +kerning first=332 second=76 amount=-2 +kerning first=350 second=305 amount=-3 +kerning first=365 second=351 amount=-2 +kerning first=211 second=72 amount=-2 +kerning first=211 second=374 amount=-2 +kerning first=380 second=117 amount=-2 +kerning first=367 second=101 amount=-1 +kerning first=344 second=117 amount=-2 +kerning first=203 second=316 amount=-1 +kerning first=1043 second=1094 amount=-2 +kerning first=66 second=317 amount=-4 +kerning first=368 second=336 amount=-1 +kerning first=192 second=337 amount=-1 +kerning first=268 second=362 amount=-2 +kerning first=275 second=316 amount=-3 +kerning first=256 second=311 amount=-2 +kerning first=122 second=241 amount=-2 +kerning first=87 second=337 amount=-3 +kerning first=100 second=271 amount=-1 +kerning first=86 second=241 amount=-3 +kerning first=370 second=378 amount=-3 +kerning first=347 second=316 amount=-2 +kerning first=262 second=382 amount=-2 +kerning first=82 second=248 amount=-3 +kerning first=290 second=356 amount=-3 +kerning first=298 second=382 amount=-1 +kerning first=115 second=311 amount=-1 +kerning first=199 second=267 amount=-2 +kerning first=334 second=382 amount=-2 +kerning first=75 second=226 amount=-1 +kerning first=264 second=337 amount=-2 +kerning first=250 second=331 amount=-1 +kerning first=75 second=286 amount=-3 +kerning first=111 second=226 amount=-1 +kerning first=277 second=271 amount=-1 +kerning first=196 second=362 amount=-3 +kerning first=109 second=331 amount=-1 +kerning first=87 second=361 amount=-2 +kerning first=197 second=221 amount=-6 +kerning first=192 second=361 amount=-3 +kerning first=83 second=252 amount=-1 +kerning first=119 second=252 amount=-1 +kerning first=1025 second=1037 amount=-1 +kerning first=1105 second=1087 amount=-1 +kerning first=228 second=361 amount=-1 +kerning first=98 second=316 amount=-2 +kerning first=195 second=266 amount=-3 +kerning first=107 second=263 amount=-3 +kerning first=328 second=227 amount=-1 +kerning first=1040 second=1101 amount=-1 +kerning first=84 second=78 amount=-1 +kerning first=366 second=121 amount=-1 +kerning first=368 second=252 amount=-1 +kerning first=262 second=207 amount=-3 +kerning first=354 second=70 amount=-1 +kerning first=356 second=201 amount=-1 +kerning first=220 second=227 amount=-3 +kerning first=45 second=381 amount=-4 +kerning first=346 second=44 amount=-4 +kerning first=284 second=201 amount=-1 +kerning first=81 second=381 amount=-2 +kerning first=381 second=246 amount=-1 +kerning first=310 second=44 amount=-1 +kerning first=224 second=252 amount=-1 +kerning first=1027 second=1107 amount=-2 +kerning first=212 second=201 amount=-2 +kerning first=364 second=227 amount=-3 +kerning first=382 second=44 amount=-1 +kerning first=296 second=252 amount=-1 +kerning first=222 second=381 amount=-2 +kerning first=1081 second=1104 amount=-1 +kerning first=85 second=382 amount=-3 +kerning first=65 second=45 amount=-4 +kerning first=1057 second=1036 amount=-1 +kerning first=1063 second=1107 amount=-1 +kerning first=121 second=382 amount=-3 +kerning first=216 second=226 amount=-1 +kerning first=337 second=103 amount=-2 +kerning first=71 second=201 amount=-1 +kerning first=379 second=291 amount=-3 +kerning first=252 second=226 amount=-1 +kerning first=226 second=382 amount=-1 +kerning first=288 second=226 amount=-1 +kerning first=366 second=381 amount=-1 +kerning first=307 second=291 amount=-3 +kerning first=365 second=109 amount=-1 +kerning first=263 second=259 amount=-2 +kerning first=324 second=226 amount=-1 +kerning first=1055 second=1081 amount=-1 +kerning first=110 second=378 amount=-1 +kerning first=115 second=227 amount=-1 +kerning first=193 second=103 amount=-3 +kerning first=260 second=336 amount=-3 +kerning first=79 second=227 amount=-1 +kerning first=203 second=84 amount=-1 +kerning first=315 second=317 amount=-2 +kerning first=296 second=336 amount=-2 +kerning first=199 second=291 amount=-3 +kerning first=88 second=103 amount=-2 +kerning first=201 second=218 amount=-2 +kerning first=277 second=243 amount=-1 +kerning first=1039 second=1092 amount=-1 +kerning first=1100 second=1094 amount=-1 +kerning first=8250 second=220 amount=-4 +kerning first=1065 second=1090 amount=-1 +kerning first=103 second=115 amount=-3 +kerning first=235 second=263 amount=-1 +kerning first=100 second=243 amount=-1 +kerning first=120 second=314 amount=-1 +kerning first=66 second=345 amount=-3 +kerning first=307 second=263 amount=-1 +kerning first=261 second=314 amount=-1 +kerning first=67 second=115 amount=-2 +kerning first=205 second=243 amount=-2 +kerning first=229 second=250 amount=-1 +kerning first=225 second=314 amount=-1 +kerning first=280 second=115 amount=-1 +kerning first=333 second=314 amount=-2 +kerning first=316 second=115 amount=-2 +kerning first=218 second=120 amount=-2 +kerning first=264 second=365 amount=-2 +kerning first=199 second=8249 amount=-4 +kerning first=122 second=269 amount=-1 +kerning first=377 second=193 amount=-1 +kerning first=254 second=120 amount=-3 +kerning first=228 second=365 amount=-1 +kerning first=263 second=269 amount=-1 +kerning first=244 second=115 amount=-2 +kerning first=279 second=345 amount=-1 +kerning first=199 second=263 amount=-2 +kerning first=192 second=365 amount=-3 +kerning first=350 second=278 amount=-3 +kerning first=196 second=338 amount=-3 +kerning first=69 second=70 amount=-2 +kerning first=369 second=314 amount=-2 +kerning first=216 second=198 amount=-4 +kerning first=258 second=353 amount=-2 +kerning first=282 second=70 amount=-2 +kerning first=86 second=213 amount=-3 +kerning first=204 second=113 amount=-2 +kerning first=350 second=73 amount=-3 +kerning first=87 second=365 amount=-2 +kerning first=97 second=224 amount=-1 +kerning first=352 second=115 amount=-1 +kerning first=1083 second=1072 amount=-1 +kerning first=352 second=45 amount=-3 +kerning first=330 second=353 amount=-2 +kerning first=210 second=70 amount=-2 +kerning first=202 second=224 amount=-1 +kerning first=366 second=353 amount=-2 +kerning first=371 second=269 amount=-3 +kerning first=321 second=325 amount=-2 +kerning first=310 second=224 amount=-1 +kerning first=274 second=224 amount=-1 +kerning first=105 second=98 amount=-1 +kerning first=382 second=224 amount=-1 +kerning first=246 second=98 amount=-1 +kerning first=379 second=8249 amount=-3 +kerning first=278 second=73 amount=-2 +kerning first=346 second=224 amount=-1 +kerning first=85 second=235 amount=-2 +kerning first=90 second=278 amount=-1 +kerning first=74 second=101 amount=-2 +kerning first=326 second=120 amount=-1 +kerning first=214 second=303 amount=-1 +kerning first=121 second=235 amount=-3 +kerning first=218 second=328 amount=-2 +kerning first=307 second=8249 amount=-3 +kerning first=362 second=120 amount=-2 +kerning first=219 second=331 amount=-2 +kerning first=250 second=303 amount=-2 +kerning first=1108 second=1076 amount=-1 +kerning first=332 second=280 amount=-2 +kerning first=346 second=367 amount=-1 +kerning first=109 second=303 amount=-1 +kerning first=226 second=235 amount=-1 +kerning first=113 second=328 amount=-2 +kerning first=69 second=98 amount=-1 +kerning first=262 second=235 amount=-2 +kerning first=1036 second=1076 amount=-1 +kerning first=251 second=101 amount=-1 +kerning first=220 second=283 amount=-2 +kerning first=211 second=370 amount=-1 +kerning first=371 second=241 amount=-2 +kerning first=287 second=101 amount=-2 +kerning first=368 second=103 amount=-4 +kerning first=335 second=241 amount=-1 +kerning first=323 second=101 amount=-2 +kerning first=1046 second=1118 amount=-2 +kerning first=99 second=118 amount=-2 +kerning first=254 second=328 amount=-1 +kerning first=364 second=283 amount=-2 +kerning first=227 second=241 amount=-1 +kerning first=113 second=109 amount=-2 +kerning first=213 second=325 amount=-2 +kerning first=282 second=98 amount=-1 +kerning first=256 second=283 amount=-1 +kerning first=263 second=241 amount=-2 +kerning first=83 second=280 amount=-3 +kerning first=207 second=335 amount=-2 +kerning first=197 second=108 amount=-2 +kerning first=376 second=380 amount=-3 +kerning first=371 second=283 amount=-3 +kerning first=195 second=8220 amount=-5 +kerning first=321 second=241 amount=-1 +kerning first=279 second=335 amount=-1 +kerning first=269 second=108 amount=-3 +kerning first=1077 second=1119 amount=-1 +kerning first=344 second=85 amount=-3 +kerning first=374 second=362 amount=-1 +kerning first=263 second=283 amount=-1 +kerning first=1069 second=1045 amount=-1 +kerning first=232 second=380 amount=-2 +kerning first=272 second=85 amount=-1 +kerning first=66 second=335 amount=-1 +kerning first=305 second=108 amount=-1 +kerning first=268 second=380 amount=-2 +kerning first=102 second=335 amount=-1 +kerning first=310 second=286 amount=-3 +kerning first=304 second=380 amount=-1 +kerning first=236 second=345 amount=-1 +kerning first=77 second=338 amount=-2 +kerning first=249 second=241 amount=-1 +kerning first=274 second=196 amount=-2 +kerning first=122 second=46 amount=-1 +kerning first=303 second=248 amount=-3 +kerning first=256 second=231 amount=-1 +kerning first=110 second=115 amount=-1 +kerning first=77 second=351 amount=-2 +kerning first=274 second=286 amount=-1 +kerning first=376 second=259 amount=-5 +kerning first=231 second=248 amount=-1 +kerning first=108 second=241 amount=-1 +kerning first=315 second=249 amount=-2 +kerning first=267 second=248 amount=-1 +kerning first=202 second=286 amount=-1 +kerning first=220 second=231 amount=-2 +kerning first=74 second=115 amount=-2 +kerning first=380 second=331 amount=-2 +kerning first=287 second=115 amount=-3 +kerning first=1091 second=1113 amount=-3 +kerning first=195 second=248 amount=-1 +kerning first=323 second=115 amount=-2 +kerning first=200 second=331 amount=-1 +kerning first=90 second=248 amount=-1 +kerning first=1114 second=1075 amount=-1 +kerning first=251 second=115 amount=-2 +kerning first=76 second=70 amount=-2 +kerning first=290 second=78 amount=-1 +kerning first=197 second=368 amount=-3 +kerning first=1063 second=1101 amount=-1 +kerning first=236 second=331 amount=-2 +kerning first=249 second=255 amount=-3 +kerning first=218 second=352 amount=-3 +kerning first=97 second=252 amount=-1 +kerning first=222 second=200 amount=-2 +kerning first=337 second=351 amount=-2 +kerning first=364 second=245 amount=-2 +kerning first=69 second=278 amount=-2 +kerning first=115 second=307 amount=-2 +kerning first=8216 second=350 amount=-1 +kerning first=376 second=366 amount=-1 +kerning first=202 second=252 amount=-2 +kerning first=199 second=323 amount=-3 +kerning first=108 second=255 amount=-3 +kerning first=84 second=328 amount=-3 +kerning first=354 second=8250 amount=-3 +kerning first=269 second=122 amount=-2 +kerning first=72 second=255 amount=-2 +kerning first=362 second=352 amount=-3 +kerning first=233 second=122 amount=-2 +kerning first=344 second=71 amount=-3 +kerning first=90 second=262 amount=-1 +kerning first=379 second=323 amount=-1 +kerning first=210 second=278 amount=-2 +kerning first=328 second=307 amount=-1 +kerning first=107 second=233 amount=-3 +kerning first=196 second=366 amount=-3 +kerning first=317 second=290 amount=-1 +kerning first=261 second=328 amount=-1 +kerning first=282 second=278 amount=-2 +kerning first=313 second=338 amount=-1 +kerning first=225 second=328 amount=-1 +kerning first=354 second=278 amount=-1 +kerning first=1101 second=1080 amount=-1 +kerning first=120 second=328 amount=-1 +kerning first=1045 second=1118 amount=-1 +kerning first=77 second=352 amount=-2 +kerning first=227 second=283 amount=-1 +kerning first=81 second=200 amount=-2 +kerning first=256 second=245 amount=-1 +kerning first=209 second=290 amount=-2 +kerning first=369 second=328 amount=-1 +kerning first=274 second=252 amount=-2 +kerning first=1043 second=1040 amount=-4 +kerning first=45 second=200 amount=-5 +kerning first=356 second=233 amount=-3 +kerning first=220 second=245 amount=-2 +kerning first=122 second=283 amount=-1 +kerning first=310 second=252 amount=-3 +kerning first=1113 second=1085 amount=-1 +kerning first=346 second=252 amount=-1 +kerning first=314 second=333 amount=-1 +kerning first=68 second=86 amount=-2 +kerning first=1057 second=1043 amount=-1 +kerning first=336 second=87 amount=-2 +kerning first=84 second=110 amount=-3 +kerning first=268 second=106 amount=-1 +kerning first=120 second=110 amount=-1 +kerning first=264 second=87 amount=-1 +kerning first=217 second=288 amount=-1 +kerning first=252 second=223 amount=-1 +kerning first=193 second=81 amount=-3 +kerning first=379 second=281 amount=-1 +kerning first=101 second=333 amount=-1 +kerning first=73 second=113 amount=-2 +kerning first=192 second=87 amount=-6 +kerning first=280 second=84 amount=-1 +kerning first=261 second=110 amount=-1 +kerning first=1069 second=1113 amount=-2 +kerning first=333 second=110 amount=-1 +kerning first=192 second=347 amount=-2 +kerning first=199 second=281 amount=-2 +kerning first=200 second=65 amount=-2 +kerning first=255 second=243 amount=-3 +kerning first=195 second=262 amount=-3 +kerning first=368 second=326 amount=-2 +kerning first=369 second=110 amount=-1 +kerning first=235 second=281 amount=-1 +kerning first=89 second=198 amount=-6 +kerning first=291 second=243 amount=-2 +kerning first=217 second=196 amount=-4 +kerning first=87 second=347 amount=-3 +kerning first=272 second=65 amount=-4 +kerning first=1077 second=1099 amount=-1 +kerning first=323 second=210 amount=-2 +kerning first=327 second=243 amount=-2 +kerning first=307 second=281 amount=-1 +kerning first=289 second=114 amount=-1 +kerning first=363 second=243 amount=-1 +kerning first=116 second=291 amount=-2 +kerning first=197 second=217 amount=-3 +kerning first=78 second=243 amount=-2 +kerning first=325 second=288 amount=-2 +kerning first=224 second=326 amount=-1 +kerning first=1058 second=1076 amount=-2 +kerning first=321 second=255 amount=-3 +kerning first=69 second=354 amount=-1 +kerning first=219 second=243 amount=-2 +kerning first=232 second=120 amount=-2 +kerning first=78 second=229 amount=-2 +kerning first=1050 second=1047 amount=-2 +kerning first=199 second=269 amount=-2 +kerning first=378 second=275 amount=-1 +kerning first=73 second=99 amount=-2 +kerning first=69 second=80 amount=-2 +kerning first=219 second=229 amount=-3 +kerning first=264 second=73 amount=-3 +kerning first=8217 second=351 amount=-2 +kerning first=255 second=229 amount=-3 +kerning first=66 second=377 amount=-4 +kerning first=266 second=198 amount=-3 +kerning first=375 second=248 amount=-3 +kerning first=114 second=229 amount=-1 +kerning first=199 second=103 amount=-3 +kerning first=66 second=75 amount=-4 +kerning first=250 second=99 amount=-1 +kerning first=338 second=198 amount=-2 +kerning first=298 second=118 amount=-2 +kerning first=363 second=229 amount=-1 +kerning first=8218 second=249 amount=-1 +kerning first=71 second=311 amount=-1 +kerning first=87 second=73 amount=-1 +kerning first=307 second=267 amount=-1 +kerning first=354 second=80 amount=-1 +kerning first=262 second=118 amount=-1 +kerning first=84 second=68 amount=-1 +kerning first=250 second=113 amount=-1 +kerning first=370 second=118 amount=-2 +kerning first=291 second=229 amount=-3 +kerning first=1076 second=1077 amount=-1 +kerning first=235 second=267 amount=-1 +kerning first=327 second=229 amount=-2 +kerning first=121 second=118 amount=-1 +kerning first=339 second=8220 amount=-2 +kerning first=376 second=120 amount=-2 +kerning first=210 second=80 amount=-2 +kerning first=85 second=118 amount=-2 +kerning first=232 second=106 amount=-2 +kerning first=77 second=332 amount=-2 +kerning first=226 second=118 amount=-3 +kerning first=267 second=8220 amount=-2 +kerning first=71 second=90 amount=-2 +kerning first=218 second=332 amount=-1 +kerning first=282 second=80 amount=-2 +kerning first=315 second=377 amount=-3 +kerning first=231 second=8220 amount=-2 +kerning first=314 second=271 amount=-1 +kerning first=115 second=287 amount=-3 +kerning first=198 second=219 amount=-2 +kerning first=350 second=171 amount=-3 +kerning first=350 second=8217 amount=-2 +kerning first=117 second=111 amount=-1 +kerning first=257 second=271 amount=-1 +kerning first=288 second=256 amount=-3 +kerning first=220 second=287 amount=-4 +kerning first=310 second=244 amount=-2 +kerning first=362 second=332 amount=-1 +kerning first=346 second=244 amount=-1 +kerning first=1055 second=1119 amount=-1 +kerning first=204 second=199 amount=-2 +kerning first=90 second=242 amount=-1 +kerning first=281 second=234 amount=-1 +kerning first=382 second=244 amount=-1 +kerning first=1037 second=1108 amount=-1 +kerning first=256 second=287 amount=-3 +kerning first=195 second=242 amount=-1 +kerning first=364 second=287 amount=-4 +kerning first=242 second=8217 amount=-2 +kerning first=328 second=287 amount=-2 +kerning first=121 second=303 amount=-2 +kerning first=82 second=264 amount=-3 +kerning first=1027 second=1040 amount=-4 +kerning first=267 second=242 amount=-1 +kerning first=86 second=289 amount=-4 +kerning first=231 second=242 amount=-1 +kerning first=110 second=121 amount=-2 +kerning first=122 second=289 amount=-2 +kerning first=339 second=242 amount=-1 +kerning first=1070 second=1091 amount=-1 +kerning first=8250 second=224 amount=-1 +kerning first=83 second=66 amount=-3 +kerning first=303 second=242 amount=-3 +kerning first=227 second=289 amount=-2 +kerning first=258 second=111 amount=-1 +kerning first=263 second=289 amount=-3 +kerning first=332 second=66 amount=-2 +kerning first=375 second=242 amount=-3 +kerning first=67 second=119 amount=-1 +kerning first=97 second=244 amount=-1 +kerning first=194 second=254 amount=-2 +kerning first=103 second=119 amount=-1 +kerning first=330 second=111 amount=-2 +kerning first=230 second=254 amount=-2 +kerning first=335 second=289 amount=-2 +kerning first=210 second=66 amount=-2 +kerning first=211 second=82 amount=-2 +kerning first=366 second=111 amount=-2 +kerning first=266 second=254 amount=-1 +kerning first=371 second=289 amount=-1 +kerning first=346 second=230 amount=-2 +kerning first=377 second=197 amount=-1 +kerning first=315 second=117 amount=-2 +kerning first=382 second=230 amount=-1 +kerning first=244 second=119 amount=-2 +kerning first=222 second=97 amount=-1 +kerning first=279 second=117 amount=-2 +kerning first=274 second=230 amount=-1 +kerning first=280 second=119 amount=-1 +kerning first=81 second=97 amount=-1 +kerning first=210 second=354 amount=-2 +kerning first=310 second=230 amount=-1 +kerning first=316 second=119 amount=-3 +kerning first=117 second=97 amount=-1 +kerning first=371 second=275 amount=-3 +kerning first=202 second=230 amount=-1 +kerning first=330 second=97 amount=-2 +kerning first=282 second=354 amount=-1 +kerning first=331 second=250 amount=-1 +kerning first=323 second=121 amount=-2 +kerning first=366 second=97 amount=-3 +kerning first=1073 second=1078 amount=-2 +kerning first=295 second=250 amount=-1 +kerning first=1113 second=1099 amount=-1 +kerning first=97 second=326 amount=-1 +kerning first=287 second=121 amount=-1 +kerning first=97 second=230 amount=-1 +kerning first=1043 second=1054 amount=-1 +kerning first=251 second=121 amount=-3 +kerning first=198 second=205 amount=-2 +kerning first=282 second=74 amount=-1 +kerning first=367 second=250 amount=-1 +kerning first=204 second=378 amount=-1 +kerning first=374 second=240 amount=-3 +kerning first=187 second=250 amount=-1 +kerning first=251 second=107 amount=-2 +kerning first=354 second=74 amount=-4 +kerning first=118 second=250 amount=-1 +kerning first=316 second=378 amount=-1 +kerning first=302 second=240 amount=-2 +kerning first=65 second=333 amount=-1 +kerning first=259 second=250 amount=-1 +kerning first=290 second=86 amount=-3 +kerning first=66 second=117 amount=-3 +kerning first=199 second=338 amount=-3 +kerning first=240 second=378 amount=-2 +kerning first=223 second=250 amount=-1 +kerning first=101 second=8217 amount=-2 +kerning first=102 second=117 amount=-1 +kerning first=99 second=378 amount=-2 +kerning first=82 second=250 amount=-2 +kerning first=243 second=117 amount=-1 +kerning first=207 second=117 amount=-2 +kerning first=8216 second=370 amount=-1 +kerning first=84 second=116 amount=-1 +kerning first=89 second=240 amount=-3 +kerning first=268 second=310 amount=-3 +kerning first=337 second=363 amount=-1 +kerning first=195 second=318 amount=-2 +kerning first=120 second=116 amount=-1 +kerning first=231 second=318 amount=-3 +kerning first=68 second=220 amount=-1 +kerning first=230 second=240 amount=-1 +kerning first=69 second=298 amount=-2 +kerning first=1052 second=1114 amount=-1 +kerning first=267 second=318 amount=-3 +kerning first=280 second=214 amount=-1 +kerning first=266 second=240 amount=-2 +kerning first=187 second=194 amount=-4 +kerning first=1088 second=1114 amount=-1 +kerning first=303 second=318 amount=-2 +kerning first=376 second=310 amount=-1 +kerning first=1084 second=1089 amount=-1 +kerning first=339 second=318 amount=-3 +kerning first=210 second=298 amount=-2 +kerning first=1048 second=1089 amount=-1 +kerning first=1102 second=1088 amount=-1 +kerning first=375 second=318 amount=-2 +kerning first=314 second=259 amount=-2 +kerning first=323 second=375 amount=-2 +kerning first=278 second=259 amount=-1 +kerning first=369 second=116 amount=-1 +kerning first=199 second=77 amount=-3 +kerning first=287 second=375 amount=-1 +kerning first=377 second=122 amount=-3 +kerning first=1030 second=1088 amount=-1 +kerning first=200 second=71 amount=-1 +kerning first=67 second=214 amount=-3 +kerning first=249 second=99 amount=-1 +kerning first=90 second=171 amount=-3 +kerning first=251 second=375 amount=-3 +kerning first=1025 second=1041 amount=-1 +kerning first=76 second=330 amount=-2 +kerning first=350 second=259 amount=-2 +kerning first=305 second=122 amount=-1 +kerning first=261 second=116 amount=-1 +kerning first=379 second=77 amount=-1 +kerning first=108 second=231 amount=-1 +kerning first=101 second=259 amount=-2 +kerning first=45 second=97 amount=-1 +kerning first=317 second=220 amount=-3 +kerning first=242 second=259 amount=-1 +kerning first=333 second=116 amount=-1 +kerning first=203 second=296 amount=-2 +kerning first=1072 second=1099 amount=-1 +kerning first=206 second=259 amount=-2 +kerning first=8222 second=108 amount=-1 +kerning first=365 second=369 amount=-1 +kerning first=356 second=253 amount=-3 +kerning first=111 second=105 amount=-1 +kerning first=1052 second=1100 amount=-1 +kerning first=377 second=374 amount=-2 +kerning first=316 second=228 amount=-2 +kerning first=90 second=304 amount=-1 +kerning first=268 second=324 amount=-1 +kerning first=1088 second=1100 amount=-1 +kerning first=100 second=251 amount=-1 +kerning first=232 second=324 amount=-2 +kerning first=244 second=228 amount=-1 +kerning first=8216 second=356 amount=-1 +kerning first=241 second=251 amount=-1 +kerning first=221 second=369 amount=-2 +kerning first=208 second=228 amount=-1 +kerning first=205 second=251 amount=-2 +kerning first=314 second=273 amount=-1 +kerning first=110 second=375 amount=-2 +kerning first=382 second=281 amount=-1 +kerning first=313 second=251 amount=-2 +kerning first=197 second=374 amount=-6 +kerning first=103 second=228 amount=-3 +kerning first=277 second=251 amount=-2 +kerning first=257 second=369 amount=-1 +kerning first=67 second=228 amount=-2 +kerning first=216 second=206 amount=-2 +kerning first=8217 second=261 amount=-6 +kerning first=1102 second=1074 amount=-1 +kerning first=116 second=355 amount=-1 +kerning first=282 second=298 amount=-2 +kerning first=66 second=70 amount=-4 +kerning first=354 second=284 amount=-3 +kerning first=288 second=206 amount=-1 +kerning first=101 second=273 amount=-1 +kerning first=107 second=253 amount=-1 +kerning first=187 second=217 amount=-4 +kerning first=354 second=298 amount=-1 +kerning first=378 second=279 amount=-1 +kerning first=282 second=284 amount=-1 +kerning first=88 second=363 amount=-3 +kerning first=87 second=290 amount=-3 +kerning first=248 second=253 amount=-3 +kerning first=8217 second=226 amount=-6 +kerning first=193 second=363 amount=-3 +kerning first=8218 second=311 amount=-1 +kerning first=1030 second=1074 amount=-1 +kerning first=353 second=45 amount=-1 +kerning first=1025 second=1038 amount=-3 +kerning first=69 second=284 amount=-1 +kerning first=229 second=363 amount=-1 +kerning first=221 second=355 amount=-1 +kerning first=376 second=324 amount=-3 +kerning first=196 second=8249 amount=-4 +kerning first=88 second=83 amount=-2 +kerning first=234 second=279 amount=-1 +kerning first=224 second=318 amount=-1 +kerning first=336 second=220 amount=-1 +kerning first=260 second=318 amount=-2 +kerning first=316 second=113 amount=-1 +kerning first=193 second=83 amount=-3 +kerning first=248 second=237 amount=-1 +kerning first=314 second=263 amount=-1 +kerning first=350 second=263 amount=-1 +kerning first=286 second=313 amount=-1 +kerning first=65 second=263 amount=-1 +kerning first=8217 second=195 amount=-6 +kerning first=208 second=218 amount=-1 +kerning first=101 second=263 amount=-1 +kerning first=214 second=313 amount=-2 +kerning first=206 second=263 amount=-2 +kerning first=67 second=218 amount=-2 +kerning first=69 second=218 amount=-2 +kerning first=203 second=310 amount=-2 +kerning first=221 second=303 amount=-2 +kerning first=75 second=220 amount=-2 +kerning first=317 second=255 amount=-3 +kerning first=257 second=303 amount=-1 +kerning first=337 second=353 amount=-2 +kerning first=321 second=315 amount=-2 +kerning first=365 second=365 amount=-1 +kerning first=116 second=303 amount=-1 +kerning first=85 second=225 amount=-3 +kerning first=365 second=303 amount=-2 +kerning first=213 second=315 amount=-2 +kerning first=257 second=365 amount=-1 +kerning first=288 second=220 amount=-1 +kerning first=193 second=353 amount=-2 +kerning first=85 second=114 amount=-1 +kerning first=221 second=365 amount=-2 +kerning first=229 second=353 amount=-1 +kerning first=216 second=220 amount=-1 +kerning first=1044 second=1060 amount=-1 +kerning first=83 second=270 amount=-3 +kerning first=78 second=235 amount=-2 +kerning first=311 second=98 amount=-1 +kerning first=354 second=209 amount=-1 +kerning first=73 second=105 amount=-1 +kerning first=298 second=225 amount=-2 +kerning first=354 second=45 amount=-5 +kerning first=275 second=98 amount=-2 +kerning first=109 second=105 amount=-1 +kerning first=334 second=225 amount=-1 +kerning first=381 second=228 amount=-1 +kerning first=1044 second=1108 amount=-1 +kerning first=370 second=225 amount=-3 +kerning first=345 second=228 amount=-1 +kerning first=1113 second=1093 amount=-2 +kerning first=347 second=98 amount=-2 +kerning first=255 second=235 amount=-3 +kerning first=121 second=225 amount=-3 +kerning first=291 second=235 amount=-2 +kerning first=98 second=98 amount=-1 +kerning first=332 second=270 amount=-2 +kerning first=327 second=235 amount=-2 +kerning first=226 second=225 amount=-1 +kerning first=70 second=350 amount=-3 +kerning first=201 second=228 amount=-1 +kerning first=1051 second=1102 amount=-1 +kerning first=203 second=98 amount=-1 +kerning first=45 second=363 amount=-1 +kerning first=336 second=84 amount=-2 +kerning first=262 second=225 amount=-2 +kerning first=72 second=305 amount=-1 +kerning first=1088 second=1084 amount=-1 +kerning first=352 second=218 amount=-3 +kerning first=365 second=223 amount=-1 +kerning first=1070 second=1093 amount=-1 +kerning first=307 second=273 amount=-1 +kerning first=8220 second=335 amount=-3 +kerning first=117 second=363 amount=-1 +kerning first=232 second=46 amount=-3 +kerning first=280 second=218 amount=-2 +kerning first=347 second=102 amount=-2 +kerning first=268 second=46 amount=-1 +kerning first=108 second=305 amount=-1 +kerning first=278 second=325 amount=-2 +kerning first=76 second=280 amount=-2 +kerning first=235 second=273 amount=-1 +kerning first=68 second=194 amount=-4 +kerning first=304 second=46 amount=-1 +kerning first=249 second=305 amount=-1 +kerning first=192 second=355 amount=-1 +kerning first=98 second=102 amount=-1 +kerning first=258 second=363 amount=-3 +kerning first=213 second=305 amount=-1 +kerning first=310 second=356 amount=-2 +kerning first=1058 second=1075 amount=-2 +kerning first=1080 second=1108 amount=-1 +kerning first=119 second=318 amount=-2 +kerning first=100 second=233 amount=-1 +kerning first=87 second=355 amount=-1 +kerning first=203 second=102 amount=-2 +kerning first=330 second=363 amount=-2 +kerning first=83 second=260 amount=-4 +kerning first=71 second=200 amount=-1 +kerning first=366 second=363 amount=-1 +kerning first=1049 second=1047 amount=-1 +kerning first=1063 second=1117 amount=-1 +kerning first=207 second=67 amount=-2 +kerning first=211 second=86 amount=-2 +kerning first=310 second=117 amount=-3 +kerning first=1027 second=1117 amount=-2 +kerning first=304 second=112 amount=-1 +kerning first=264 second=81 amount=-3 +kerning first=8216 second=193 amount=-8 +kerning first=268 second=112 amount=-3 +kerning first=197 second=211 amount=-3 +kerning first=77 second=171 amount=-4 +kerning first=232 second=112 amount=-1 +kerning first=66 second=67 amount=-3 +kerning first=113 second=171 amount=-2 +kerning first=368 second=260 amount=-4 +kerning first=205 second=261 amount=-2 +kerning first=196 second=112 amount=-3 +kerning first=332 second=260 amount=-4 +kerning first=377 second=291 amount=-3 +kerning first=381 second=283 amount=-1 +kerning first=241 second=261 amount=-1 +kerning first=258 second=107 amount=-2 +kerning first=1031 second=1084 amount=-1 +kerning first=75 second=216 amount=-3 +kerning first=377 second=211 amount=-1 +kerning first=327 second=289 amount=-3 +kerning first=326 second=171 amount=-3 +kerning first=198 second=209 amount=-2 +kerning first=66 second=327 amount=-4 +kerning first=362 second=171 amount=-5 +kerning first=1088 second=1082 amount=-1 +kerning first=250 second=105 amount=-2 +kerning first=295 second=254 amount=-2 +kerning first=87 second=81 amount=-3 +kerning first=218 second=171 amount=-5 +kerning first=331 second=254 amount=-2 +kerning first=1051 second=1098 amount=-1 +kerning first=367 second=254 amount=-2 +kerning first=315 second=327 amount=-2 +kerning first=376 second=112 amount=-2 +kerning first=192 second=81 amount=-3 +kerning first=214 second=105 amount=-1 +kerning first=290 second=171 amount=-3 +kerning first=218 second=346 amount=-3 +kerning first=252 second=115 amount=-2 +kerning first=204 second=100 amount=-2 +kerning first=209 second=230 amount=-2 +kerning first=249 second=249 amount=-1 +kerning first=245 second=230 amount=-1 +kerning first=108 second=249 amount=-2 +kerning first=8217 second=257 amount=-6 +kerning first=104 second=230 amount=-1 +kerning first=77 second=346 amount=-2 +kerning first=88 second=353 amount=-1 +kerning first=78 second=333 amount=-2 +kerning first=362 second=346 amount=-3 +kerning first=234 second=275 amount=-1 +kerning first=1036 second=1058 amount=-3 +kerning first=84 second=334 amount=-3 +kerning first=286 second=379 amount=-2 +kerning first=1047 second=1079 amount=-2 +kerning first=68 second=230 amount=-1 +kerning first=290 second=346 amount=-2 +kerning first=99 second=100 amount=-1 +kerning first=321 second=249 amount=-2 +kerning first=1070 second=1103 amount=-1 +kerning first=263 second=223 amount=-1 +kerning first=364 second=350 amount=-3 +kerning first=272 second=325 amount=-2 +kerning first=117 second=107 amount=-2 +kerning first=90 second=296 amount=-1 +kerning first=236 second=339 amount=-1 +kerning first=90 second=256 amount=-1 +kerning first=335 second=223 amount=-1 +kerning first=86 second=223 amount=-3 +kerning first=353 second=230 amount=-1 +kerning first=72 second=249 amount=-1 +kerning first=77 second=226 amount=-2 +kerning first=45 second=107 amount=-1 +kerning first=281 second=230 amount=-2 +kerning first=1064 second=1101 amount=-1 +kerning first=344 second=339 amount=-3 +kerning first=233 second=114 amount=-1 +kerning first=282 second=84 amount=-1 +kerning first=1054 second=1059 amount=-3 +kerning first=269 second=114 amount=-1 +kerning first=379 second=275 amount=-1 +kerning first=1098 second=1094 amount=-1 +kerning first=210 second=84 amount=-2 +kerning first=90 second=44 amount=-1 +kerning first=344 second=79 amount=-3 +kerning first=366 second=192 amount=-4 +kerning first=8218 second=357 amount=-2 +kerning first=356 second=187 amount=-3 +kerning first=362 second=237 amount=-2 +kerning first=364 second=237 amount=-2 +kerning first=88 second=89 amount=-2 +kerning first=222 second=192 amount=-4 +kerning first=328 second=237 amount=-1 +kerning first=250 second=109 amount=-1 +kerning first=232 second=314 amount=-3 +kerning first=257 second=99 amount=-1 +kerning first=339 second=44 amount=-3 +kerning first=381 second=232 amount=-1 +kerning first=368 second=262 amount=-1 +kerning first=256 second=237 amount=-1 +kerning first=196 second=314 amount=-2 +kerning first=1031 second=1082 amount=-1 +kerning first=221 second=99 amount=-3 +kerning first=336 second=8249 amount=-1 +kerning first=338 second=118 amount=-1 +kerning first=99 second=104 amount=-2 +kerning first=315 second=378 amount=-3 +kerning first=220 second=237 amount=-2 +kerning first=109 second=109 amount=-1 +kerning first=262 second=217 amount=-2 +kerning first=45 second=192 amount=-4 +kerning first=268 second=314 amount=-1 +kerning first=371 second=227 amount=-2 +kerning first=248 second=187 amount=-2 +kerning first=264 second=8249 amount=-4 +kerning first=115 second=237 amount=-2 +kerning first=317 second=282 amount=-2 +kerning first=334 second=217 amount=-1 +kerning first=379 second=277 amount=-1 +kerning first=79 second=237 amount=-1 +kerning first=365 second=99 amount=-1 +kerning first=192 second=8249 amount=-4 +kerning first=68 second=224 amount=-1 +kerning first=267 second=44 amount=-3 +kerning first=240 second=104 amount=-1 +kerning first=234 second=269 amount=-1 +kerning first=108 second=261 amount=-2 +kerning first=8220 second=121 amount=-1 +kerning first=87 second=8249 amount=-5 +kerning first=87 second=351 amount=-3 +kerning first=100 second=257 amount=-1 +kerning first=244 second=324 amount=-1 +kerning first=235 second=277 amount=-1 +kerning first=8217 second=251 amount=-1 +kerning first=104 second=224 amount=-1 +kerning first=187 second=202 amount=-5 +kerning first=1101 second=1076 amount=-2 +kerning first=354 second=207 amount=-1 +kerning first=83 second=326 amount=-1 +kerning first=192 second=351 amount=-2 +kerning first=245 second=224 amount=-1 +kerning first=119 second=326 amount=-2 +kerning first=307 second=277 amount=-1 +kerning first=203 second=302 amount=-2 +kerning first=378 second=269 amount=-1 +kerning first=209 second=224 amount=-2 +kerning first=80 second=99 amount=-1 +kerning first=117 second=371 amount=-1 +kerning first=281 second=224 amount=-2 +kerning first=264 second=347 amount=-2 +kerning first=260 second=253 amount=-3 +kerning first=228 second=347 amount=-1 +kerning first=353 second=224 amount=-1 +kerning first=325 second=44 amount=-1 +kerning first=206 second=267 amount=-2 +kerning first=366 second=367 amount=-1 +kerning first=119 second=275 amount=-3 +kerning first=379 second=69 amount=-1 +kerning first=117 second=101 amount=-1 +kerning first=65 second=267 amount=-1 +kerning first=100 second=261 amount=-1 +kerning first=258 second=367 amount=-3 +kerning first=101 second=267 amount=-1 +kerning first=45 second=371 amount=-1 +kerning first=314 second=267 amount=-1 +kerning first=75 second=212 amount=-3 +kerning first=277 second=257 amount=-2 +kerning first=1025 second=1047 amount=-1 +kerning first=199 second=69 amount=-3 +kerning first=258 second=101 amount=-1 +kerning first=8216 second=220 amount=-1 +kerning first=1061 second=1047 amount=-2 +kerning first=205 second=257 amount=-2 +kerning first=330 second=101 amount=-2 +kerning first=200 second=79 amount=-1 +kerning first=241 second=257 amount=-1 +kerning first=117 second=367 amount=-1 +kerning first=366 second=101 amount=-2 +kerning first=220 second=241 amount=-2 +kerning first=269 second=382 amount=-2 +kerning first=260 second=266 amount=-3 +kerning first=89 second=246 amount=-3 +kerning first=264 second=291 amount=-3 +kerning first=305 second=382 amount=-1 +kerning first=296 second=266 amount=-2 +kerning first=228 second=291 amount=-2 +kerning first=234 second=271 amount=-1 +kerning first=192 second=291 amount=-3 +kerning first=377 second=382 amount=-3 +kerning first=68 second=226 amount=-1 +kerning first=1062 second=1057 amount=-1 +kerning first=235 second=337 amount=-1 +kerning first=8217 second=253 amount=-1 +kerning first=104 second=226 amount=-1 +kerning first=321 second=311 amount=-2 +kerning first=87 second=291 amount=-4 +kerning first=199 second=337 amount=-2 +kerning first=65 second=8221 amount=-5 +kerning first=317 second=286 amount=-1 +kerning first=115 second=241 amount=-2 +kerning first=351 second=331 amount=-2 +kerning first=209 second=226 amount=-2 +kerning first=374 second=255 amount=-3 +kerning first=209 second=286 amount=-2 +kerning first=249 second=311 amount=-2 +kerning first=378 second=271 amount=-1 +kerning first=233 second=382 amount=-2 +kerning first=245 second=226 amount=-1 +kerning first=338 second=228 amount=-1 +kerning first=221 second=361 amount=-2 +kerning first=379 second=337 amount=-1 +kerning first=279 second=331 amount=-2 +kerning first=1098 second=1113 amount=-1 +kerning first=315 second=331 amount=-1 +kerning first=242 second=8221 amount=-2 +kerning first=307 second=337 amount=-1 +kerning first=101 second=8221 amount=-2 +kerning first=257 second=361 amount=-1 +kerning first=243 second=331 amount=-1 +kerning first=334 second=221 amount=-2 +kerning first=1030 second=1082 amount=-1 +kerning first=365 second=361 amount=-1 +kerning first=196 second=316 amount=-2 +kerning first=102 second=331 amount=-1 +kerning first=350 second=8221 amount=-2 +kerning first=232 second=316 amount=-3 +kerning first=8222 second=104 amount=-1 +kerning first=262 second=221 amount=-1 +kerning first=1102 second=1082 amount=-1 +kerning first=268 second=316 amount=-1 +kerning first=66 second=331 amount=-3 +kerning first=368 second=266 amount=-1 +kerning first=231 second=252 amount=-2 +kerning first=249 second=45 amount=-2 +kerning first=222 second=103 amount=-1 +kerning first=267 second=252 amount=-2 +kerning first=122 second=227 amount=-1 +kerning first=213 second=45 amount=-1 +kerning first=303 second=252 amount=-1 +kerning first=86 second=227 amount=-5 +kerning first=321 second=45 amount=-1 +kerning first=117 second=103 amount=-3 +kerning first=66 second=210 amount=-3 +kerning first=8218 second=116 amount=-2 +kerning first=81 second=103 amount=-1 +kerning first=335 second=227 amount=-1 +kerning first=45 second=103 amount=-3 +kerning first=310 second=229 amount=-1 +kerning first=90 second=252 amount=-3 +kerning first=278 second=323 amount=-2 +kerning first=76 second=336 amount=-1 +kerning first=263 second=227 amount=-2 +kerning first=195 second=252 amount=-3 +kerning first=227 second=227 amount=-1 +kerning first=350 second=323 amount=-3 +kerning first=281 second=226 amount=-2 +kerning first=217 second=336 amount=-1 +kerning first=287 second=112 amount=-1 +kerning first=369 second=263 amount=-1 +kerning first=374 second=246 amount=-3 +kerning first=377 second=207 amount=-1 +kerning first=108 second=311 amount=-1 +kerning first=286 second=317 amount=-1 +kerning first=269 second=46 amount=-3 +kerning first=353 second=226 amount=-1 +kerning first=78 second=233 amount=-2 +kerning first=302 second=246 amount=-2 +kerning first=211 second=356 amount=-2 +kerning first=375 second=252 amount=-1 +kerning first=266 second=246 amount=-2 +kerning first=366 second=103 amount=-4 +kerning first=211 second=90 amount=-2 +kerning first=69 second=84 amount=-1 +kerning first=230 second=246 amount=-1 +kerning first=330 second=103 amount=-3 +kerning first=255 second=233 amount=-3 +kerning first=336 second=291 amount=-1 +kerning first=219 second=233 amount=-2 +kerning first=80 second=339 amount=-1 +kerning first=214 second=317 amount=-2 +kerning first=259 second=246 amount=-1 +kerning first=254 second=116 amount=-1 +kerning first=371 second=121 amount=-2 +kerning first=1073 second=1082 amount=-1 +kerning first=286 second=103 amount=-3 +kerning first=116 second=45 amount=-1 +kerning first=196 second=356 amount=-6 +kerning first=122 second=259 amount=-1 +kerning first=279 second=347 amount=-2 +kerning first=257 second=45 amount=-2 +kerning first=236 second=369 amount=-1 +kerning first=214 second=103 amount=-1 +kerning first=118 second=246 amount=-3 +kerning first=366 second=375 amount=-1 +kerning first=221 second=45 amount=-5 +kerning first=200 second=369 amount=-2 +kerning first=227 second=259 amount=-1 +kerning first=82 second=246 amount=-3 +kerning first=1039 second=1086 amount=-1 +kerning first=109 second=103 amount=-2 +kerning first=8216 second=347 amount=-2 +kerning first=1025 second=1043 amount=-1 +kerning first=73 second=103 amount=-3 +kerning first=224 second=331 amount=-1 +kerning first=100 second=253 amount=-2 +kerning first=73 second=363 amount=-2 +kerning first=86 second=259 amount=-5 +kerning first=113 second=116 amount=-1 +kerning first=365 second=45 amount=-2 +kerning first=1055 second=1089 amount=-1 +kerning first=345 second=226 amount=-1 +kerning first=108 second=279 amount=-1 +kerning first=66 second=65 amount=-5 +kerning first=209 second=266 amount=-2 +kerning first=381 second=226 amount=-1 +kerning first=1059 second=1102 amount=-4 +kerning first=72 second=279 amount=-2 +kerning first=240 second=122 amount=-2 +kerning first=380 second=109 amount=-2 +kerning first=290 second=362 amount=-1 +kerning first=1055 second=1075 amount=-1 +kerning first=250 second=363 amount=-1 +kerning first=204 second=122 amount=-1 +kerning first=45 second=375 amount=-3 +kerning first=1091 second=1089 amount=-2 +kerning first=286 second=363 amount=-1 +kerning first=199 second=119 amount=-1 +kerning first=257 second=305 amount=-1 +kerning first=236 second=109 amount=-2 +kerning first=258 second=375 amount=-3 +kerning first=80 second=45 amount=-3 +kerning first=315 second=65 amount=-2 +kerning first=380 second=369 amount=-2 +kerning first=1085 second=1072 amount=-1 +kerning first=221 second=305 amount=-2 +kerning first=200 second=109 amount=-1 +kerning first=44 second=45 amount=-3 +kerning first=268 second=356 amount=-1 +kerning first=1113 second=1095 amount=-2 +kerning first=1037 second=1082 amount=-1 +kerning first=344 second=369 amount=-2 +kerning first=330 second=115 amount=-2 +kerning first=1037 second=1096 amount=-1 +kerning first=236 second=355 amount=-1 +kerning first=366 second=115 amount=-2 +kerning first=196 second=370 amount=-3 +kerning first=69 second=336 amount=-1 +kerning first=258 second=115 amount=-2 +kerning first=310 second=231 amount=-2 +kerning first=365 second=305 amount=-1 +kerning first=250 second=328 amount=-1 +kerning first=268 second=370 amount=-2 +kerning first=371 second=8217 amount=-3 +kerning first=380 second=355 amount=-1 +kerning first=214 second=89 amount=-2 +kerning first=249 second=279 amount=-1 +kerning first=200 second=364 amount=-2 +kerning first=1056 second=1053 amount=-1 +kerning first=1073 second=1096 amount=-1 +kerning first=344 second=355 amount=-3 +kerning first=259 second=232 amount=-1 +kerning first=282 second=336 amount=-1 +kerning first=196 second=249 amount=-3 +kerning first=205 second=253 amount=-2 +kerning first=362 second=225 amount=-3 +kerning first=241 second=253 amount=-2 +kerning first=354 second=336 amount=-3 +kerning first=277 second=253 amount=-2 +kerning first=118 second=232 amount=-3 +kerning first=321 second=291 amount=-3 +kerning first=82 second=232 amount=-3 +kerning first=1091 second=1103 amount=-4 +kerning first=8250 second=254 amount=-1 +kerning first=367 second=246 amount=-1 +kerning first=84 second=332 amount=-3 +kerning first=376 second=82 amount=-1 +kerning first=376 second=328 amount=-3 +kerning first=100 second=225 amount=-1 +kerning first=257 second=111 amount=-1 +kerning first=99 second=108 amount=-3 +kerning first=371 second=231 amount=-3 +kerning first=1039 second=1104 amount=-1 +kerning first=205 second=225 amount=-2 +kerning first=352 second=196 amount=-4 +kerning first=336 second=315 amount=-2 +kerning first=279 second=228 amount=-2 +kerning first=240 second=108 amount=-2 +kerning first=262 second=203 amount=-3 +kerning first=73 second=224 amount=-2 +kerning first=97 second=242 amount=-1 +kerning first=122 second=231 amount=-1 +kerning first=376 second=370 amount=-1 +kerning first=68 second=280 amount=-2 +kerning first=45 second=115 amount=-1 +kerning first=263 second=8217 amount=-2 +kerning first=113 second=102 amount=-2 +kerning first=321 second=374 amount=-3 +kerning first=67 second=196 amount=-3 +kerning first=86 second=231 amount=-3 +kerning first=79 second=8221 amount=-2 +kerning first=263 second=273 amount=-1 +kerning first=241 second=225 amount=-1 +kerning first=289 second=46 amount=-3 +kerning first=227 second=273 amount=-1 +kerning first=277 second=225 amount=-2 +kerning first=325 second=46 amount=-1 +kerning first=346 second=242 amount=-1 +kerning first=310 second=350 amount=-2 +kerning first=227 second=231 amount=-1 +kerning first=361 second=46 amount=-2 +kerning first=317 second=280 amount=-2 +kerning first=195 second=286 amount=-3 +kerning first=1065 second=1101 amount=-1 +kerning first=122 second=273 amount=-1 +kerning first=117 second=115 amount=-2 +kerning first=263 second=231 amount=-1 +kerning first=256 second=8221 amount=-5 +kerning first=305 second=326 amount=-1 +kerning first=205 second=211 amount=-2 +kerning first=249 second=307 amount=-2 +kerning first=1069 second=1083 amount=-2 +kerning first=90 second=286 amount=-1 +kerning first=382 second=242 amount=-1 +kerning first=263 second=245 amount=-1 +kerning first=234 second=371 amount=-2 +kerning first=200 second=81 amount=-1 +kerning first=74 second=119 amount=-1 +kerning first=1105 second=1083 amount=-2 +kerning first=227 second=245 amount=-1 +kerning first=199 second=67 amount=-3 +kerning first=110 second=119 amount=-3 +kerning first=246 second=314 amount=-2 +kerning first=217 second=46 amount=-5 +kerning first=67 second=210 amount=-3 +kerning first=367 second=231 amount=-1 +kerning first=317 second=266 amount=-1 +kerning first=218 second=102 amount=-1 +kerning first=99 second=122 amount=-2 +kerning first=1047 second=1049 amount=-2 +kerning first=254 second=102 amount=-1 +kerning first=344 second=81 amount=-3 +kerning first=251 second=119 amount=-3 +kerning first=8250 second=282 amount=-5 +kerning first=290 second=102 amount=-2 +kerning first=371 second=245 amount=-3 +kerning first=287 second=119 amount=-1 +kerning first=326 second=102 amount=-1 +kerning first=313 second=211 amount=-1 +kerning first=314 second=255 amount=-3 +kerning first=323 second=119 amount=-2 +kerning first=354 second=187 amount=-3 +kerning first=245 second=252 amount=-1 +kerning first=281 second=252 amount=-2 +kerning first=317 second=252 amount=-2 +kerning first=1051 second=1090 amount=-1 +kerning first=353 second=252 amount=-1 +kerning first=101 second=269 amount=-1 +kerning first=122 second=245 amount=-1 +kerning first=1105 second=1097 amount=-1 +kerning first=335 second=259 amount=-1 +kerning first=232 second=328 amount=-2 +kerning first=86 second=245 amount=-3 +kerning first=379 second=67 amount=-1 +kerning first=381 second=305 amount=-1 +kerning first=104 second=252 amount=-1 +kerning first=250 second=335 amount=-1 +kerning first=216 second=68 amount=-2 +kerning first=108 second=307 amount=-1 +kerning first=206 second=269 amount=-2 +kerning first=1088 second=1118 amount=-1 +kerning first=209 second=252 amount=-1 +kerning first=371 second=259 amount=-2 +kerning first=75 second=262 amount=-3 +kerning first=355 second=378 amount=-1 +kerning first=315 second=353 amount=-1 +kerning first=1096 second=1104 amount=-1 +kerning first=351 second=353 amount=-3 +kerning first=73 second=335 amount=-2 +kerning first=350 second=269 amount=-1 +kerning first=75 second=250 amount=-3 +kerning first=249 second=326 amount=-1 +kerning first=351 second=365 amount=-1 +kerning first=314 second=269 amount=-1 +kerning first=315 second=365 amount=-2 +kerning first=325 second=305 amount=-1 +kerning first=369 second=112 amount=-2 +kerning first=211 second=366 amount=-1 +kerning first=261 second=100 amount=-1 +kerning first=248 second=225 amount=-1 +kerning first=211 second=378 amount=-2 +kerning first=279 second=365 amount=-2 +kerning first=333 second=112 amount=-1 +kerning first=269 second=171 amount=-2 +kerning first=243 second=365 amount=-1 +kerning first=207 second=353 amount=-2 +kerning first=305 second=171 amount=-3 +kerning first=314 second=111 amount=-1 +kerning first=283 second=378 amount=-2 +kerning first=207 second=365 amount=-2 +kerning first=243 second=353 amount=-2 +kerning first=369 second=100 amount=-1 +kerning first=279 second=353 amount=-2 +kerning first=377 second=171 amount=-3 +kerning first=84 second=100 amount=-3 +kerning first=120 second=100 amount=-2 +kerning first=296 second=288 amount=-2 +kerning first=364 second=275 amount=-2 +kerning first=1036 second=1054 amount=-4 +kerning first=256 second=275 amount=-1 +kerning first=66 second=353 amount=-3 +kerning first=225 second=100 amount=-1 +kerning first=203 second=352 amount=-2 +kerning first=368 second=288 amount=-1 +kerning first=364 second=249 amount=-1 +kerning first=102 second=353 amount=-2 +kerning first=80 second=87 amount=-1 +kerning first=1030 second=1086 amount=-1 +kerning first=229 second=113 amount=-1 +kerning first=220 second=275 amount=-2 +kerning first=203 second=354 amount=-1 +kerning first=280 second=210 amount=-1 +kerning first=260 second=288 amount=-3 +kerning first=356 second=223 amount=-3 +kerning first=8216 second=368 amount=-1 +kerning first=88 second=113 amount=-2 +kerning first=83 second=365 amount=-1 +kerning first=83 second=274 amount=-3 +kerning first=315 second=379 amount=-3 +kerning first=69 second=296 amount=-2 +kerning first=333 second=114 amount=-1 +kerning first=196 second=231 amount=-1 +kerning first=211 second=380 amount=-2 +kerning first=79 second=8249 amount=-1 +kerning first=115 second=249 amount=-1 +kerning first=210 second=296 amount=-2 +kerning first=248 second=223 amount=-1 +kerning first=324 second=8220 amount=-4 +kerning first=381 second=198 amount=-1 +kerning first=283 second=380 amount=-2 +kerning first=288 second=8220 amount=-1 +kerning first=79 second=289 amount=-1 +kerning first=282 second=296 amount=-2 +kerning first=379 second=313 amount=-1 +kerning first=252 second=8220 amount=-3 +kerning first=256 second=249 amount=-3 +kerning first=115 second=289 amount=-3 +kerning first=192 second=217 amount=-3 +kerning first=75 second=248 amount=-2 +kerning first=216 second=8220 amount=-2 +kerning first=354 second=296 amount=-1 +kerning first=1055 second=1117 amount=-1 +kerning first=201 second=198 amount=-2 +kerning first=70 second=380 amount=-2 +kerning first=8216 second=122 amount=-1 +kerning first=220 second=289 amount=-4 +kerning first=84 second=114 amount=-1 +kerning first=106 second=380 amount=-1 +kerning first=111 second=8220 amount=-2 +kerning first=220 second=249 amount=-1 +kerning first=103 second=328 amount=-1 +kerning first=102 second=339 amount=-1 +kerning first=193 second=99 amount=-1 +kerning first=102 second=365 amount=-1 +kerning first=75 second=8220 amount=-2 +kerning first=66 second=365 amount=-3 +kerning first=364 second=346 amount=-3 +kerning first=1040 second=1079 amount=-1 +kerning first=199 second=327 amount=-3 +kerning first=332 second=274 amount=-2 +kerning first=364 second=263 amount=-2 +kerning first=264 second=315 amount=-3 +kerning first=187 second=206 amount=-5 +kerning first=66 second=379 amount=-4 +kerning first=66 second=339 amount=-1 +kerning first=229 second=99 amount=-1 +kerning first=328 second=8249 amount=-3 +kerning first=199 second=313 amount=-3 +kerning first=279 second=339 amount=-1 +kerning first=1048 second=1105 amount=-1 +kerning first=80 second=73 amount=-1 +kerning first=220 second=8249 amount=-5 +kerning first=83 second=112 amount=-3 +kerning first=1084 second=1105 amount=-1 +kerning first=256 second=8249 amount=-4 +kerning first=286 second=75 amount=-1 +kerning first=207 second=339 amount=-2 +kerning first=220 second=263 amount=-2 +kerning first=115 second=8249 amount=-1 +kerning first=87 second=315 amount=-1 +kerning first=379 second=327 amount=-1 +kerning first=261 second=378 amount=-1 +kerning first=256 second=263 amount=-1 +kerning first=214 second=75 amount=-2 +kerning first=212 second=209 amount=-2 +kerning first=201 second=212 amount=-1 +kerning first=229 second=254 amount=-1 +kerning first=8222 second=355 amount=-2 +kerning first=371 second=111 amount=-3 +kerning first=200 second=83 amount=-2 +kerning first=377 second=199 amount=-1 +kerning first=332 second=302 amount=-2 +kerning first=356 second=209 amount=-1 +kerning first=1062 second=1089 amount=-1 +kerning first=256 second=277 amount=-1 +kerning first=315 second=381 amount=-3 +kerning first=214 second=323 amount=-2 +kerning first=88 second=99 amount=-2 +kerning first=272 second=83 amount=-1 +kerning first=364 second=277 amount=-2 +kerning first=252 second=234 amount=-1 +kerning first=284 second=209 amount=-1 +kerning first=256 second=289 amount=-3 +kerning first=286 second=323 amount=-1 +kerning first=344 second=83 amount=-3 +kerning first=207 second=351 amount=-2 +kerning first=69 second=76 amount=-2 +kerning first=1100 second=1118 amount=-2 +kerning first=328 second=289 amount=-2 +kerning first=220 second=277 amount=-2 +kerning first=279 second=351 amount=-2 +kerning first=381 second=212 amount=-1 +kerning first=364 second=289 amount=-4 +kerning first=75 second=264 amount=-3 +kerning first=243 second=351 amount=-2 +kerning first=8220 second=194 amount=-8 +kerning first=88 second=111 amount=-2 +kerning first=71 second=209 amount=-1 +kerning first=86 second=233 amount=-3 +kerning first=369 second=114 amount=-1 +kerning first=193 second=111 amount=-1 +kerning first=279 second=367 amount=-2 +kerning first=102 second=351 amount=-2 +kerning first=211 second=364 amount=-1 +kerning first=229 second=111 amount=-1 +kerning first=315 second=367 amount=-2 +kerning first=122 second=233 amount=-1 +kerning first=66 second=351 amount=-3 +kerning first=223 second=8250 amount=-2 +kerning first=197 second=199 amount=-3 +kerning first=364 second=291 amount=-4 +kerning first=115 second=261 amount=-1 +kerning first=207 second=367 amount=-2 +kerning first=263 second=233 amount=-1 +kerning first=328 second=291 amount=-2 +kerning first=88 second=97 amount=-1 +kerning first=227 second=233 amount=-1 +kerning first=354 second=76 amount=-1 +kerning first=220 second=261 amount=-3 +kerning first=102 second=367 amount=-1 +kerning first=256 second=291 amount=-3 +kerning first=220 second=291 amount=-4 +kerning first=1080 second=1092 amount=-1 +kerning first=201 second=226 amount=-1 +kerning first=229 second=97 amount=-1 +kerning first=351 second=351 amount=-3 +kerning first=102 second=337 amount=-1 +kerning first=356 second=199 amount=-3 +kerning first=66 second=367 amount=-3 +kerning first=371 second=233 amount=-3 +kerning first=315 second=351 amount=-1 +kerning first=115 second=291 amount=-3 +kerning first=66 second=337 amount=-1 +kerning first=210 second=76 amount=-2 +kerning first=79 second=291 amount=-1 +kerning first=79 second=261 amount=-1 +kerning first=99 second=110 amount=-2 +kerning first=83 second=316 amount=-2 +kerning first=324 second=250 amount=-1 +kerning first=279 second=337 amount=-1 +kerning first=288 second=250 amount=-1 +kerning first=69 second=68 amount=-2 +kerning first=203 second=326 amount=-1 +kerning first=8250 second=119 amount=-3 +kerning first=106 second=378 amount=-1 +kerning first=325 second=287 amount=-3 +kerning first=197 second=171 amount=-4 +kerning first=224 second=316 amount=-1 +kerning first=250 second=103 amount=-3 +kerning first=70 second=378 amount=-2 +kerning first=83 second=302 amount=-3 +kerning first=337 second=97 amount=-1 +kerning first=275 second=326 amount=-2 +kerning first=290 second=350 amount=-2 +kerning first=260 second=316 amount=-2 +kerning first=205 second=380 amount=-1 +kerning first=111 second=250 amount=-1 +kerning first=328 second=261 amount=-1 +kerning first=199 second=261 amount=-2 +kerning first=218 second=350 amount=-3 +kerning first=252 second=250 amount=-1 +kerning first=364 second=261 amount=-3 +kerning first=212 second=289 amount=-1 +kerning first=98 second=326 amount=-1 +kerning first=66 second=381 amount=-4 +kerning first=353 second=8217 amount=-2 +kerning first=117 second=117 amount=-1 +kerning first=272 second=381 amount=-2 +kerning first=1113 second=1107 amount=-1 +kerning first=1071 second=1117 amount=-1 +kerning first=228 second=331 amount=-1 +kerning first=362 second=350 amount=-3 +kerning first=371 second=271 amount=-3 +kerning first=89 second=200 amount=-1 +kerning first=87 second=331 amount=-3 +kerning first=90 second=260 amount=-1 +kerning first=221 second=82 amount=-1 +kerning first=338 second=200 amount=-2 +kerning first=381 second=214 amount=-1 +kerning first=258 second=117 amount=-3 +kerning first=78 second=248 amount=-2 +kerning first=350 second=311 amount=-2 +kerning first=366 second=117 amount=-1 +kerning first=266 second=200 amount=-3 +kerning first=1047 second=1031 amount=-2 +kerning first=314 second=311 amount=-1 +kerning first=1105 second=1081 amount=-1 +kerning first=330 second=117 amount=-2 +kerning first=211 second=196 amount=-4 +kerning first=209 second=240 amount=-2 +kerning first=69 second=338 amount=-1 +kerning first=317 second=264 amount=-1 +kerning first=325 second=290 amount=-2 +kerning first=212 second=207 amount=-2 +kerning first=196 second=98 amount=-2 +kerning first=8220 second=196 amount=-8 +kerning first=122 second=271 amount=-1 +kerning first=76 second=290 amount=-1 +kerning first=209 second=264 amount=-2 +kerning first=203 second=259 amount=-1 +kerning first=45 second=377 amount=-4 +kerning first=201 second=214 amount=-1 +kerning first=227 second=271 amount=-1 +kerning first=45 second=117 amount=-1 +kerning first=281 second=240 amount=-1 +kerning first=81 second=377 amount=-2 +kerning first=263 second=271 amount=-1 +kerning first=217 second=290 amount=-1 +kerning first=71 second=207 amount=-1 +kerning first=332 second=304 amount=-2 +kerning first=290 second=90 amount=-2 +kerning first=268 second=330 amount=-3 +kerning first=45 second=217 amount=-4 +kerning first=222 second=377 amount=-2 +kerning first=98 second=324 amount=-1 +kerning first=187 second=220 amount=-4 +kerning first=362 second=90 amount=-1 +kerning first=8217 second=230 amount=-6 +kerning first=84 second=122 amount=-3 +kerning first=280 second=331 amount=-1 +kerning first=1038 second=1086 amount=-4 +kerning first=376 second=330 amount=-1 +kerning first=284 second=207 amount=-1 +kerning first=198 second=227 amount=-1 +kerning first=8217 second=347 amount=-2 +kerning first=69 second=303 amount=-1 +kerning first=122 second=305 amount=-2 +kerning first=8250 second=280 amount=-5 +kerning first=1047 second=1037 amount=-2 +kerning first=366 second=377 amount=-1 +kerning first=83 second=304 amount=-3 +kerning first=356 second=207 amount=-1 +kerning first=249 second=291 amount=-3 +kerning first=1055 second=1077 amount=-1 +kerning first=213 second=291 amount=-1 +kerning first=278 second=311 amount=-1 +kerning first=80 second=317 amount=-1 +kerning first=347 second=324 amount=-2 +kerning first=236 second=97 amount=-2 +kerning first=235 second=287 amount=-3 +kerning first=356 second=310 amount=-1 +kerning first=242 second=311 amount=-1 +kerning first=377 second=187 amount=-1 +kerning first=108 second=291 amount=-3 +kerning first=272 second=97 amount=-1 +kerning first=199 second=287 amount=-3 +kerning first=1062 second=1101 amount=-1 +kerning first=66 second=77 amount=-4 +kerning first=72 second=291 amount=-3 +kerning first=73 second=337 amount=-2 +kerning first=307 second=287 amount=-3 +kerning first=221 second=317 amount=-1 +kerning first=75 second=234 amount=-2 +kerning first=374 second=200 amount=-1 +kerning first=200 second=97 amount=-1 +kerning first=101 second=311 amount=-2 +kerning first=315 second=77 amount=-2 +kerning first=8222 second=365 amount=-1 +kerning first=380 second=97 amount=-1 +kerning first=379 second=287 amount=-3 +kerning first=89 second=290 amount=-3 +kerning first=65 second=311 amount=-2 +kerning first=233 second=187 amount=-2 +kerning first=87 second=71 amount=-3 +kerning first=193 second=235 amount=-1 +kerning first=71 second=197 amount=-3 +kerning first=275 second=324 amount=-2 +kerning first=218 second=90 amount=-1 +kerning first=250 second=337 amount=-1 +kerning first=90 second=298 amount=-1 +kerning first=1024 second=1040 amount=-2 +kerning first=192 second=71 amount=-3 +kerning first=74 second=84 amount=-1 +kerning first=108 second=263 amount=-1 +kerning first=286 second=365 amount=-1 +kerning first=212 second=197 amount=-4 +kerning first=375 second=277 amount=-3 +kerning first=250 second=365 amount=-1 +kerning first=209 second=268 amount=-2 +kerning first=221 second=100 amount=-3 +kerning first=240 second=120 amount=-3 +kerning first=317 second=268 amount=-1 +kerning first=284 second=197 amount=-3 +kerning first=249 second=263 amount=-1 +kerning first=336 second=303 amount=-1 +kerning first=344 second=353 amount=-2 +kerning first=268 second=70 amount=-3 +kerning first=356 second=197 amount=-6 +kerning first=371 second=243 amount=-3 +kerning first=73 second=365 amount=-2 +kerning first=8216 second=382 amount=-1 +kerning first=380 second=353 amount=-2 +kerning first=1043 second=1108 amount=-3 +kerning first=69 second=310 amount=-2 +kerning first=199 second=325 amount=-3 +kerning first=205 second=213 amount=-2 +kerning first=84 second=74 amount=-4 +kerning first=99 second=120 amount=-2 +kerning first=72 second=263 amount=-2 +kerning first=203 second=78 amount=-2 +kerning first=227 second=275 amount=-1 +kerning first=362 second=118 amount=-2 +kerning first=376 second=70 amount=-1 +kerning first=1030 second=1100 amount=-1 +kerning first=264 second=46 amount=-1 +kerning first=200 second=353 amount=-1 +kerning first=282 second=310 amount=-2 +kerning first=87 second=303 amount=-2 +kerning first=122 second=275 amount=-1 +kerning first=236 second=353 amount=-2 +kerning first=1073 second=1080 amount=-1 +kerning first=117 second=113 amount=-1 +kerning first=1102 second=1100 amount=-1 +kerning first=1047 second=1065 amount=-2 +kerning first=1037 second=1080 amount=-1 +kerning first=98 second=314 amount=-2 +kerning first=334 second=201 amount=-2 +kerning first=90 second=270 amount=-1 +kerning first=210 second=310 amount=-2 +kerning first=221 second=85 amount=-1 +kerning first=218 second=118 amount=-2 +kerning first=74 second=234 amount=-2 +kerning first=366 second=113 amount=-2 +kerning first=228 second=303 amount=-1 +kerning first=86 second=275 amount=-3 +kerning first=203 second=314 amount=-1 +kerning first=262 second=201 amount=-3 +kerning first=330 second=113 amount=-2 +kerning first=264 second=303 amount=-1 +kerning first=290 second=118 amount=-1 +kerning first=254 second=118 amount=-2 +kerning first=275 second=314 amount=-3 +kerning first=258 second=113 amount=-1 +kerning first=354 second=310 amount=-1 +kerning first=192 second=303 amount=-1 +kerning first=243 second=105 amount=-1 +kerning first=8250 second=252 amount=-1 +kerning first=206 second=283 amount=-2 +kerning first=365 second=8249 amount=-2 +kerning first=213 second=8249 amount=-1 +kerning first=279 second=105 amount=-2 +kerning first=113 second=118 amount=-3 +kerning first=354 second=338 amount=-3 +kerning first=72 second=8249 amount=-4 +kerning first=260 second=275 amount=-1 +kerning first=101 second=283 amount=-1 +kerning first=111 second=224 amount=-1 +kerning first=77 second=118 amount=-2 +kerning first=108 second=8249 amount=-3 +kerning first=207 second=105 amount=-1 +kerning first=279 second=104 amount=-2 +kerning first=65 second=283 amount=-1 +kerning first=75 second=224 amount=-1 +kerning first=282 second=338 amount=-1 +kerning first=277 second=241 amount=-2 +kerning first=350 second=283 amount=-1 +kerning first=216 second=224 amount=-1 +kerning first=280 second=228 amount=-1 +kerning first=268 second=98 amount=-1 +kerning first=241 second=241 amount=-1 +kerning first=314 second=283 amount=-1 +kerning first=374 second=228 amount=-4 +kerning first=240 second=380 amount=-2 +kerning first=1069 second=1053 amount=-1 +kerning first=288 second=224 amount=-1 +kerning first=1055 second=1087 amount=-1 +kerning first=313 second=241 amount=-1 +kerning first=252 second=224 amount=-1 +kerning first=367 second=248 amount=-1 +kerning first=302 second=228 amount=-2 +kerning first=209 second=283 amount=-2 +kerning first=100 second=241 amount=-1 +kerning first=266 second=228 amount=-2 +kerning first=76 second=318 amount=-2 +kerning first=120 second=112 amount=-3 +kerning first=324 second=224 amount=-1 +kerning first=230 second=228 amount=-2 +kerning first=112 second=318 amount=-2 +kerning first=84 second=112 amount=-2 +kerning first=99 second=380 amount=-2 +kerning first=1042 second=1118 amount=-1 +kerning first=379 second=325 amount=-1 +kerning first=321 second=8249 amount=-1 +kerning first=88 second=101 amount=-2 +kerning first=259 second=248 amount=-1 +kerning first=107 second=235 amount=-3 +kerning first=253 second=318 amount=-2 +kerning first=118 second=248 amount=-3 +kerning first=289 second=318 amount=-3 +kerning first=249 second=8249 amount=-2 +kerning first=193 second=101 amount=-1 +kerning first=264 second=331 amount=-1 +kerning first=229 second=101 amount=-1 +kerning first=219 second=193 amount=-4 +kerning first=375 second=279 amount=-3 +kerning first=82 second=365 amount=-2 +kerning first=1098 second=1097 amount=-1 +kerning first=346 second=256 amount=-4 +kerning first=1058 second=1072 amount=-2 +kerning first=334 second=205 amount=-2 +kerning first=272 second=303 amount=-1 +kerning first=1054 second=1047 amount=-2 +kerning first=376 second=66 amount=-1 +kerning first=338 second=230 amount=-1 +kerning first=378 second=255 amount=-2 +kerning first=82 second=216 amount=-3 +kerning first=234 second=231 amount=-1 +kerning first=274 second=256 amount=-2 +kerning first=374 second=230 amount=-5 +kerning first=339 second=252 amount=-2 +kerning first=8217 second=213 amount=-2 +kerning first=279 second=226 amount=-2 +kerning first=1062 second=1073 amount=-1 +kerning first=302 second=230 amount=-2 +kerning first=1030 second=1098 amount=-1 +kerning first=234 second=255 amount=-2 +kerning first=378 second=231 amount=-1 +kerning first=314 second=281 amount=-1 +kerning first=262 second=205 amount=-3 +kerning first=230 second=230 amount=-2 +kerning first=106 second=108 amount=-2 +kerning first=1102 second=1098 amount=-1 +kerning first=350 second=281 amount=-1 +kerning first=351 second=107 amount=-1 +kerning first=202 second=280 amount=-2 +kerning first=310 second=99 amount=-2 +kerning first=65 second=281 amount=-1 +kerning first=315 second=107 amount=-2 +kerning first=101 second=281 amount=-1 +kerning first=256 second=251 amount=-3 +kerning first=274 second=280 amount=-2 +kerning first=257 second=347 amount=-1 +kerning first=325 second=289 amount=-3 +kerning first=221 second=347 amount=-3 +kerning first=206 second=281 amount=-2 +kerning first=249 second=8221 amount=-3 +kerning first=346 second=280 amount=-3 +kerning first=116 second=347 amount=-1 +kerning first=279 second=107 amount=-2 +kerning first=315 second=105 amount=-2 +kerning first=80 second=347 amount=-1 +kerning first=243 second=107 amount=-1 +kerning first=364 second=251 amount=-1 +kerning first=351 second=105 amount=-2 +kerning first=203 second=80 amount=-2 +kerning first=250 second=333 amount=-1 +kerning first=221 second=345 amount=-1 +kerning first=66 second=81 amount=-3 +kerning first=106 second=106 amount=-2 +kerning first=274 second=282 amount=-2 +kerning first=374 second=204 amount=-1 +kerning first=97 second=318 amount=-1 +kerning first=268 second=68 amount=-3 +kerning first=321 second=8221 amount=-4 +kerning first=378 second=229 amount=-1 +kerning first=381 second=196 amount=-1 +kerning first=202 second=282 amount=-2 +kerning first=264 second=67 amount=-3 +kerning first=73 second=333 amount=-2 +kerning first=376 second=68 amount=-1 +kerning first=283 second=106 amount=-2 +kerning first=192 second=67 amount=-3 +kerning first=363 second=235 amount=-1 +kerning first=8216 second=110 amount=-1 +kerning first=207 second=81 amount=-2 +kerning first=334 second=203 amount=-2 +kerning first=315 second=81 amount=-1 +kerning first=211 second=106 amount=-1 +kerning first=211 second=368 amount=-1 +kerning first=87 second=67 amount=-3 +kerning first=89 second=230 amount=-5 +kerning first=89 second=204 amount=-1 +kerning first=1003 second=1007 amount=-2 +kerning first=8216 second=380 amount=-1 +kerning first=227 second=243 amount=-1 +kerning first=222 second=226 amount=-1 +kerning first=263 second=243 amount=-1 +kerning first=83 second=278 amount=-3 +kerning first=101 second=307 amount=-2 +kerning first=266 second=204 amount=-3 +kerning first=202 second=256 amount=-2 +kerning first=256 second=121 amount=-3 +kerning first=338 second=204 amount=-2 +kerning first=86 second=243 amount=-3 +kerning first=242 second=307 amount=-1 +kerning first=1047 second=1033 amount=-1 +kerning first=122 second=243 amount=-1 +kerning first=119 second=44 amount=-5 +kerning first=332 second=278 amount=-2 +kerning first=83 second=44 amount=-4 +kerning first=283 second=104 amount=-2 +kerning first=315 second=79 amount=-1 +kerning first=219 second=90 amount=-1 +kerning first=282 second=334 amount=-1 +kerning first=224 second=44 amount=-1 +kerning first=362 second=81 amount=-1 +kerning first=207 second=79 amount=-2 +kerning first=87 second=69 amount=-1 +kerning first=337 second=369 amount=-1 +kerning first=351 second=109 amount=-2 +kerning first=199 second=362 amount=-2 +kerning first=88 second=369 amount=-3 +kerning first=315 second=109 amount=-1 +kerning first=229 second=369 amount=-1 +kerning first=82 second=244 amount=-3 +kerning first=1057 second=1055 amount=-1 +kerning first=1105 second=1085 amount=-1 +kerning first=198 second=229 amount=-1 +kerning first=272 second=200 amount=-2 +kerning first=279 second=109 amount=-2 +kerning first=310 second=284 amount=-3 +kerning first=234 second=227 amount=-2 +kerning first=1073 second=1084 amount=-1 +kerning first=374 second=232 amount=-3 +kerning first=74 second=192 amount=-5 +kerning first=8217 second=211 amount=-2 +kerning first=204 second=380 amount=-1 +kerning first=1037 second=1084 amount=-1 +kerning first=101 second=279 amount=-1 +kerning first=252 second=8249 amount=-2 +kerning first=1048 second=1095 amount=-1 +kerning first=106 second=104 amount=-1 +kerning first=65 second=279 amount=-1 +kerning first=274 second=284 amount=-1 +kerning first=368 second=44 amount=-5 +kerning first=234 second=229 amount=-2 +kerning first=87 second=305 amount=-2 +kerning first=102 second=109 amount=-1 +kerning first=346 second=282 amount=-3 +kerning first=69 second=334 amount=-1 +kerning first=332 second=44 amount=-3 +kerning first=378 second=227 amount=-1 +kerning first=66 second=109 amount=-3 +kerning first=214 second=65 amount=-4 +kerning first=230 second=232 amount=-1 +kerning first=192 second=305 amount=-1 +kerning first=194 second=232 amount=-1 +kerning first=286 second=65 amount=-3 +kerning first=302 second=232 amount=-2 +kerning first=109 second=361 amount=-1 +kerning first=249 second=267 amount=-1 +kerning first=198 second=257 amount=-1 +kerning first=264 second=305 amount=-1 +kerning first=266 second=232 amount=-2 +kerning first=73 second=361 amount=-2 +kerning first=1102 second=1096 amount=-1 +kerning first=234 second=257 amount=-2 +kerning first=219 second=214 amount=-1 +kerning first=228 second=305 amount=-1 +kerning first=382 second=254 amount=-1 +kerning first=336 second=305 amount=-1 +kerning first=112 second=8250 amount=-2 +kerning first=286 second=361 amount=-1 +kerning first=89 second=232 amount=-3 +kerning first=250 second=361 amount=-1 +kerning first=365 second=229 amount=-1 +kerning first=89 second=202 amount=-1 +kerning first=365 second=347 amount=-2 +kerning first=118 second=244 amount=-3 +kerning first=380 second=121 amount=-2 +kerning first=344 second=121 amount=-3 +kerning first=338 second=202 amount=-2 +kerning first=274 second=254 amount=-1 +kerning first=310 second=254 amount=-1 +kerning first=221 second=325 amount=-1 +kerning first=266 second=202 amount=-3 +kerning first=346 second=254 amount=-2 +kerning first=8216 second=378 amount=-1 +kerning first=236 second=121 amount=-3 +kerning first=336 second=69 amount=-2 +kerning first=268 second=66 amount=-3 +kerning first=1030 second=1096 amount=-1 +kerning first=203 second=82 amount=-2 +kerning first=97 second=254 amount=-1 +kerning first=367 second=244 amount=-1 +kerning first=1098 second=1099 amount=-1 +kerning first=72 second=267 amount=-2 +kerning first=374 second=202 amount=-1 +kerning first=264 second=69 amount=-3 +kerning first=108 second=267 amount=-1 +kerning first=378 second=257 amount=-1 +kerning first=202 second=254 amount=-1 +kerning first=302 second=212 amount=-2 +kerning first=8222 second=357 amount=-2 +kerning first=370 second=199 amount=-1 +kerning first=338 second=212 amount=-1 +kerning first=79 second=8217 amount=-2 +kerning first=187 second=69 amount=-5 +kerning first=69 second=66 amount=-2 +kerning first=1039 second=1102 amount=-1 +kerning first=381 second=202 amount=-1 +kerning first=115 second=8217 amount=-2 +kerning first=1102 second=1116 amount=-1 +kerning first=73 second=79 amount=-2 +kerning first=266 second=212 amount=-3 +kerning first=196 second=99 amount=-1 +kerning first=196 second=332 amount=-3 +kerning first=84 second=82 amount=-1 +kerning first=221 second=69 amount=-1 +kerning first=1113 second=1119 amount=-1 +kerning first=282 second=66 amount=-2 +kerning first=194 second=212 amount=-3 +kerning first=76 second=316 amount=-2 +kerning first=80 second=69 amount=-1 +kerning first=1094 second=1086 amount=-1 +kerning first=268 second=332 amount=-3 +kerning first=1092 second=1088 amount=-1 +kerning first=307 second=225 amount=-2 +kerning first=89 second=212 amount=-3 +kerning first=356 second=205 amount=-1 +kerning first=304 second=332 amount=-2 +kerning first=352 second=192 amount=-4 +kerning first=332 second=82 amount=-2 +kerning first=203 second=76 amount=-2 +kerning first=85 second=199 amount=-1 +kerning first=268 second=72 amount=-3 +kerning first=201 second=216 amount=-1 +kerning first=8217 second=102 amount=-1 +kerning first=376 second=332 amount=-3 +kerning first=280 second=192 amount=-2 +kerning first=212 second=205 amount=-2 +kerning first=208 second=192 amount=-4 +kerning first=205 second=229 amount=-2 +kerning first=90 second=290 amount=-1 +kerning first=187 second=203 amount=-5 +kerning first=1119 second=1077 amount=-1 +kerning first=256 second=8217 amount=-5 +kerning first=262 second=199 amount=-3 +kerning first=284 second=205 amount=-1 +kerning first=374 second=212 amount=-3 +kerning first=298 second=199 amount=-2 +kerning first=376 second=72 amount=-1 +kerning first=209 second=242 amount=-2 +kerning first=100 second=229 amount=-1 +kerning first=194 second=235 amount=-1 +kerning first=354 second=326 amount=-3 +kerning first=230 second=226 amount=-2 +kerning first=281 second=242 amount=-1 +kerning first=266 second=226 amount=-2 +kerning first=268 second=86 amount=-1 +kerning first=302 second=226 amount=-2 +kerning first=71 second=205 amount=-1 +kerning first=338 second=226 amount=-1 +kerning first=45 second=119 amount=-3 +kerning first=263 second=8221 amount=-2 +kerning first=1040 second=1108 amount=-2 +kerning first=374 second=226 amount=-5 +kerning first=246 second=326 amount=-1 +kerning first=356 second=219 amount=-1 +kerning first=8220 second=198 amount=-8 +kerning first=282 second=326 amount=-1 +kerning first=117 second=119 amount=-3 +kerning first=1063 second=1087 amount=-1 +kerning first=69 second=74 amount=-1 +kerning first=284 second=219 amount=-1 +kerning first=117 second=279 amount=-1 +kerning first=66 second=103 amount=-4 +kerning first=69 second=326 amount=-1 +kerning first=258 second=119 amount=-3 +kerning first=264 second=333 amount=-2 +kerning first=201 second=202 amount=-2 +kerning first=105 second=326 amount=-2 +kerning first=289 second=316 amount=-3 +kerning first=66 second=305 amount=-3 +kerning first=330 second=119 amount=-2 +kerning first=371 second=8221 amount=-3 +kerning first=339 second=248 amount=-1 +kerning first=366 second=119 amount=-2 +kerning first=71 second=219 amount=-1 +kerning first=196 second=86 amount=-6 +kerning first=87 second=333 amount=-3 +kerning first=89 second=226 amount=-5 +kerning first=228 second=333 amount=-1 +kerning first=1116 second=1073 amount=-1 +kerning first=8218 second=291 amount=-1 +kerning first=192 second=333 amount=-1 +kerning first=1037 second=1092 amount=-1 +kerning first=290 second=377 amount=-2 +kerning first=108 second=269 amount=-1 +kerning first=328 second=259 amount=-1 +kerning first=355 second=116 amount=-1 +kerning first=72 second=269 amount=-2 +kerning first=337 second=375 amount=-3 +kerning first=351 second=103 amount=-3 +kerning first=66 second=369 amount=-3 +kerning first=70 second=382 amount=-2 +kerning first=1055 second=1085 amount=-1 +kerning first=315 second=103 amount=-3 +kerning first=102 second=363 amount=-1 +kerning first=106 second=382 amount=-1 +kerning first=1040 second=1063 amount=-5 +kerning first=192 second=45 amount=-4 +kerning first=252 second=246 amount=-1 +kerning first=252 second=252 amount=-1 +kerning first=243 second=103 amount=-2 +kerning first=249 second=269 amount=-1 +kerning first=207 second=363 amount=-2 +kerning first=115 second=259 amount=-1 +kerning first=1098 second=1075 amount=-1 +kerning first=234 second=253 amount=-2 +kerning first=288 second=252 amount=-1 +kerning first=207 second=103 amount=-3 +kerning first=317 second=366 amount=-3 +kerning first=243 second=363 amount=-1 +kerning first=283 second=116 amount=-1 +kerning first=324 second=252 amount=-1 +kerning first=228 second=45 amount=-2 +kerning first=279 second=363 amount=-2 +kerning first=220 second=259 amount=-3 +kerning first=8217 second=235 amount=-3 +kerning first=106 second=122 amount=-1 +kerning first=1037 second=1086 amount=-1 +kerning first=1054 second=1043 amount=-1 +kerning first=315 second=363 amount=-2 +kerning first=216 second=74 amount=-2 +kerning first=315 second=369 amount=-2 +kerning first=274 second=266 amount=-1 +kerning first=70 second=122 amount=-2 +kerning first=351 second=363 amount=-1 +kerning first=279 second=369 amount=-2 +kerning first=355 second=382 amount=-1 +kerning first=310 second=266 amount=-3 +kerning first=257 second=257 amount=-1 +kerning first=376 second=378 amount=-3 +kerning first=202 second=266 amount=-1 +kerning first=351 second=369 amount=-1 +kerning first=77 second=232 amount=-2 +kerning first=283 second=122 amount=-2 +kerning first=229 second=375 amount=-3 +kerning first=102 second=369 amount=-1 +kerning first=211 second=382 amount=-2 +kerning first=193 second=375 amount=-3 +kerning first=211 second=122 amount=-2 +kerning first=8218 second=108 amount=-1 +kerning first=370 second=352 amount=-3 +kerning first=103 second=233 amount=-2 +kerning first=337 second=109 amount=-1 +kerning first=1087 second=1072 amount=-1 +kerning first=207 second=369 amount=-2 +kerning first=283 second=382 amount=-2 +kerning first=69 second=313 amount=-2 +kerning first=88 second=375 amount=-3 +kerning first=68 second=206 amount=-2 +kerning first=102 second=355 amount=-1 +kerning first=193 second=115 amount=-2 +kerning first=256 second=279 amount=-1 +kerning first=66 second=355 amount=-2 +kerning first=203 second=336 amount=-1 +kerning first=229 second=115 amount=-1 +kerning first=229 second=109 amount=-1 +kerning first=88 second=115 amount=-1 +kerning first=328 second=303 amount=-1 +kerning first=1097 second=1108 amount=-1 +kerning first=8222 second=318 amount=-1 +kerning first=279 second=355 amount=-1 +kerning first=337 second=115 amount=-2 +kerning first=243 second=355 amount=-1 +kerning first=76 second=296 amount=-2 +kerning first=220 second=279 amount=-2 +kerning first=378 second=253 amount=-2 +kerning first=252 second=232 amount=-1 +kerning first=351 second=355 amount=-2 +kerning first=106 second=116 amount=-1 +kerning first=283 second=108 amount=-3 +kerning first=89 second=206 amount=-1 +kerning first=84 second=370 amount=-1 +kerning first=45 second=89 amount=-4 +kerning first=75 second=232 amount=-2 +kerning first=187 second=73 amount=-5 +kerning first=266 second=206 amount=-3 +kerning first=87 second=325 amount=-1 +kerning first=275 second=328 amount=-2 +kerning first=87 second=313 amount=-1 +kerning first=1113 second=1113 amount=-1 +kerning first=338 second=206 amount=-2 +kerning first=203 second=328 amount=-1 +kerning first=214 second=73 amount=-2 +kerning first=1077 second=1113 amount=-1 +kerning first=71 second=225 amount=-1 +kerning first=199 second=303 amount=-1 +kerning first=113 second=98 amount=-2 +kerning first=199 second=352 amount=-3 +kerning first=379 second=315 amount=-1 +kerning first=264 second=325 amount=-3 +kerning first=379 second=303 amount=-1 +kerning first=199 second=315 amount=-3 +kerning first=364 second=235 amount=-2 +kerning first=381 second=289 amount=-3 +kerning first=195 second=290 amount=-3 +kerning first=66 second=83 amount=-4 +kerning first=336 second=325 amount=-2 +kerning first=307 second=303 amount=-1 +kerning first=1025 second=1025 amount=-1 +kerning first=347 second=328 amount=-2 +kerning first=1055 second=1107 amount=-1 +kerning first=313 second=255 amount=-3 +kerning first=313 second=221 amount=-3 +kerning first=284 second=225 amount=-1 +kerning first=326 second=380 amount=-1 +kerning first=207 second=83 amount=-2 +kerning first=80 second=323 amount=-1 +kerning first=1048 second=1117 amount=-1 +kerning first=356 second=225 amount=-5 +kerning first=201 second=196 amount=-2 +kerning first=304 second=338 amount=-2 +kerning first=311 second=249 amount=-1 +kerning first=315 second=83 amount=-1 +kerning first=330 second=214 amount=-2 +kerning first=107 second=225 amount=-2 +kerning first=368 second=286 amount=-1 +kerning first=268 second=338 amount=-3 +kerning first=254 second=98 amount=-1 +kerning first=286 second=85 amount=-1 +kerning first=218 second=380 amount=-3 +kerning first=258 second=263 amount=-1 +kerning first=212 second=225 amount=-1 +kerning first=296 second=286 amount=-2 +kerning first=254 second=380 amount=-2 +kerning first=326 second=98 amount=-2 +kerning first=214 second=85 amount=-1 +kerning first=221 second=8250 amount=-3 +kerning first=290 second=380 amount=-1 +kerning first=290 second=98 amount=-1 +kerning first=225 second=102 amount=-1 +kerning first=246 second=46 amount=-3 +kerning first=264 second=311 amount=-1 +kerning first=221 second=77 amount=-1 +kerning first=261 second=102 amount=-1 +kerning first=282 second=46 amount=-1 +kerning first=8220 second=192 amount=-8 +kerning first=260 second=286 amount=-3 +kerning first=228 second=311 amount=-1 +kerning first=199 second=317 amount=-3 +kerning first=192 second=311 amount=-2 +kerning first=333 second=102 amount=-1 +kerning first=354 second=46 amount=-5 +kerning first=1051 second=1080 amount=-1 +kerning first=80 second=77 amount=-1 +kerning first=201 second=210 amount=-1 +kerning first=69 second=46 amount=-1 +kerning first=84 second=102 amount=-1 +kerning first=73 second=71 amount=-2 +kerning first=105 second=46 amount=-2 +kerning first=234 second=233 amount=-1 +kerning first=120 second=102 amount=-1 +kerning first=210 second=46 amount=-3 +kerning first=196 second=352 amount=-3 +kerning first=326 second=112 amount=-1 +kerning first=356 second=211 amount=-3 +kerning first=75 second=252 amount=-3 +kerning first=290 second=112 amount=-1 +kerning first=208 second=200 amount=-2 +kerning first=70 second=110 amount=-1 +kerning first=378 second=233 amount=-1 +kerning first=100 second=235 amount=-1 +kerning first=111 second=252 amount=-1 +kerning first=254 second=112 amount=-1 +kerning first=106 second=110 amount=-2 +kerning first=371 second=253 amount=-2 +kerning first=208 second=46 amount=-3 +kerning first=218 second=112 amount=-2 +kerning first=324 second=289 amount=-2 +kerning first=205 second=235 amount=-2 +kerning first=369 second=102 amount=-1 +kerning first=98 second=328 amount=-1 +kerning first=352 second=200 amount=-3 +kerning first=277 second=235 amount=-1 +kerning first=77 second=112 amount=-1 +kerning first=1044 second=1090 amount=-1 +kerning first=283 second=110 amount=-2 +kerning first=84 second=350 amount=-3 +kerning first=280 second=200 amount=-2 +kerning first=236 second=113 amount=-1 +kerning first=218 second=378 amount=-3 +kerning first=205 second=237 amount=-1 +kerning first=104 second=250 amount=-1 +kerning first=1037 second=1094 amount=-1 +kerning first=317 second=262 amount=-1 +kerning first=72 second=275 amount=-2 +kerning first=250 second=353 amount=-2 +kerning first=100 second=237 amount=-1 +kerning first=209 second=250 amount=-2 +kerning first=108 second=275 amount=-1 +kerning first=380 second=113 amount=-1 +kerning first=99 second=171 amount=-2 +kerning first=380 second=365 amount=-2 +kerning first=362 second=100 amount=-2 +kerning first=344 second=113 amount=-3 +kerning first=344 second=365 amount=-2 +kerning first=290 second=366 amount=-1 +kerning first=200 second=251 amount=-2 +kerning first=106 second=99 amount=-1 +kerning first=113 second=378 amount=-2 +kerning first=73 second=353 amount=-2 +kerning first=369 second=117 amount=-1 +kerning first=362 second=112 amount=-2 +kerning first=77 second=378 amount=-1 +kerning first=109 second=353 amount=-1 +kerning first=284 second=254 amount=-1 +kerning first=286 second=87 amount=-3 +kerning first=195 second=288 amount=-3 +kerning first=263 second=249 amount=-2 +kerning first=274 second=260 amount=-2 +kerning first=304 second=352 amount=-2 +kerning first=218 second=100 amount=-2 +kerning first=268 second=352 amount=-3 +kerning first=1065 second=1054 amount=-1 +kerning first=362 second=227 amount=-3 +kerning first=216 second=70 amount=-2 +kerning first=214 second=87 amount=-2 +kerning first=196 second=243 amount=-1 +kerning first=346 second=260 amount=-4 +kerning first=376 second=352 amount=-3 +kerning first=196 second=354 amount=-6 +kerning first=8220 second=244 amount=-3 +kerning first=1030 second=1102 amount=-1 +kerning first=362 second=378 amount=-3 +kerning first=268 second=354 amount=-1 +kerning first=326 second=378 amount=-1 +kerning first=77 second=100 amount=-2 +kerning first=1102 second=1102 amount=-1 +kerning first=90 second=288 amount=-1 +kerning first=249 second=275 amount=-1 +kerning first=113 second=100 amount=-1 +kerning first=381 second=210 amount=-1 +kerning first=209 second=262 amount=-2 +kerning first=371 second=249 amount=-1 +kerning first=1055 second=1105 amount=-1 +kerning first=72 second=289 amount=-3 +kerning first=277 second=223 amount=-1 +kerning first=344 second=99 amount=-3 +kerning first=1091 second=1105 amount=-2 +kerning first=108 second=289 amount=-3 +kerning first=362 second=114 amount=-1 +kerning first=208 second=198 amount=-4 +kerning first=77 second=380 amount=-1 +kerning first=213 second=289 amount=-1 +kerning first=250 second=339 amount=-1 +kerning first=281 second=248 amount=-1 +kerning first=313 second=223 amount=-1 +kerning first=113 second=380 amount=-2 +kerning first=380 second=99 amount=-1 +kerning first=1062 second=1077 amount=-1 +kerning first=1054 second=1053 amount=-1 +kerning first=87 second=327 amount=-1 +kerning first=86 second=249 amount=-1 +kerning first=209 second=248 amount=-2 +kerning first=90 second=274 amount=-1 +kerning first=353 second=8220 amount=-2 +kerning first=218 second=114 amount=-1 +kerning first=1047 second=1039 amount=-2 +kerning first=371 second=263 amount=-3 +kerning first=317 second=8220 amount=-4 +kerning first=254 second=114 amount=-1 +kerning first=67 second=198 amount=-3 +kerning first=281 second=8220 amount=-2 +kerning first=122 second=263 amount=-1 +kerning first=236 second=365 amount=-1 +kerning first=264 second=327 amount=-3 +kerning first=65 second=287 amount=-3 +kerning first=200 second=365 amount=-2 +kerning first=227 second=263 amount=-1 +kerning first=336 second=327 amount=-2 +kerning first=1091 second=1078 amount=-1 +kerning first=263 second=263 amount=-1 +kerning first=200 second=379 amount=-1 +kerning first=101 second=287 amount=-3 +kerning first=104 second=8220 amount=-4 +kerning first=280 second=198 amount=-2 +kerning first=221 second=75 amount=-1 +kerning first=242 second=287 amount=-2 +kerning first=68 second=8220 amount=-2 +kerning first=286 second=73 amount=-1 +kerning first=272 second=379 amount=-2 +kerning first=206 second=287 amount=-3 +kerning first=202 second=259 amount=-1 +kerning first=313 second=237 amount=-2 +kerning first=264 second=313 amount=-3 +kerning first=352 second=198 amount=-4 +kerning first=314 second=287 amount=-3 +kerning first=277 second=237 amount=-2 +kerning first=80 second=75 amount=-1 +kerning first=73 second=339 amount=-2 +kerning first=305 second=324 amount=-1 +kerning first=278 second=287 amount=-3 +kerning first=236 second=99 amount=-1 +kerning first=241 second=237 amount=-1 +kerning first=8250 second=256 amount=-4 +kerning first=8222 second=316 amount=-1 +kerning first=118 second=234 amount=-3 +kerning first=253 second=44 amount=-5 +kerning first=113 second=104 amount=-2 +kerning first=350 second=287 amount=-3 +kerning first=1098 second=1091 amount=-2 +kerning first=307 second=233 amount=-1 +kerning first=234 second=237 amount=-2 +kerning first=225 second=244 amount=-1 +kerning first=259 second=234 amount=-1 +kerning first=75 second=244 amount=-2 +kerning first=198 second=237 amount=-1 +kerning first=290 second=104 amount=-1 +kerning first=8220 second=351 amount=-2 +kerning first=219 second=197 amount=-4 +kerning first=354 second=324 amount=-3 +kerning first=217 second=44 amount=-5 +kerning first=254 second=104 amount=-1 +kerning first=206 second=279 amount=-2 +kerning first=82 second=234 amount=-3 +kerning first=192 second=332 amount=-3 +kerning first=208 second=194 amount=-4 +kerning first=205 second=227 amount=-2 +kerning first=249 second=277 amount=-1 +kerning first=335 second=331 amount=-1 +kerning first=109 second=351 amount=-1 +kerning first=202 second=368 amount=-2 +kerning first=100 second=227 amount=-1 +kerning first=236 second=111 amount=-1 +kerning first=266 second=46 amount=-1 +kerning first=73 second=351 amount=-2 +kerning first=1058 second=1054 amount=-1 +kerning first=206 second=380 amount=-1 +kerning first=283 second=351 amount=-2 +kerning first=108 second=277 amount=-1 +kerning first=69 second=314 amount=-1 +kerning first=67 second=194 amount=-3 +kerning first=315 second=87 amount=-3 +kerning first=72 second=277 amount=-2 +kerning first=250 second=8249 amount=-2 +kerning first=367 second=234 amount=-1 +kerning first=277 second=227 amount=-2 +kerning first=1030 second=1104 amount=-1 +kerning first=105 second=314 amount=-2 +kerning first=268 second=74 amount=-2 +kerning first=241 second=227 amount=-1 +kerning first=314 second=8249 amount=-3 +kerning first=229 second=121 amount=-3 +kerning first=207 second=361 amount=-2 +kerning first=220 second=267 amount=-2 +kerning first=80 second=327 amount=-1 +kerning first=371 second=257 amount=-2 +kerning first=344 second=367 amount=-2 +kerning first=350 second=8249 amount=-3 +kerning first=193 second=121 amount=-3 +kerning first=256 second=267 amount=-1 +kerning first=380 second=367 amount=-2 +kerning first=1051 second=1074 amount=-1 +kerning first=84 second=364 amount=-1 +kerning first=376 second=74 amount=-4 +kerning first=278 second=8249 amount=-2 +kerning first=88 second=121 amount=-3 +kerning first=243 second=361 amount=-1 +kerning first=221 second=327 amount=-1 +kerning first=335 second=257 amount=-1 +kerning first=86 second=261 amount=-5 +kerning first=245 second=254 amount=-1 +kerning first=351 second=361 amount=-1 +kerning first=335 second=230 amount=-1 +kerning first=227 second=257 amount=-1 +kerning first=200 second=367 amount=-2 +kerning first=206 second=8249 amount=-4 +kerning first=281 second=254 amount=-2 +kerning first=315 second=361 amount=-2 +kerning first=263 second=257 amount=-2 +kerning first=236 second=367 amount=-1 +kerning first=344 second=111 amount=-3 +kerning first=317 second=254 amount=-2 +kerning first=118 second=224 amount=-3 +kerning first=380 second=111 amount=-1 +kerning first=250 second=351 amount=-2 +kerning first=82 second=224 amount=-2 +kerning first=1093 second=1086 amount=-2 +kerning first=1047 second=1051 amount=-1 +kerning first=290 second=374 amount=-3 +kerning first=223 second=224 amount=-1 +kerning first=104 second=254 amount=-2 +kerning first=187 second=224 amount=-1 +kerning first=335 second=261 amount=-1 +kerning first=214 second=200 amount=-2 +kerning first=295 second=224 amount=-1 +kerning first=371 second=261 amount=-2 +kerning first=337 second=117 amount=-1 +kerning first=259 second=224 amount=-1 +kerning first=8218 second=102 amount=-1 +kerning first=268 second=344 amount=-3 +kerning first=367 second=224 amount=-1 +kerning first=281 second=250 amount=-2 +kerning first=1040 second=1057 amount=-3 +kerning first=337 second=121 amount=-3 +kerning first=90 second=284 amount=-1 +kerning first=369 second=249 amount=-1 +kerning first=1031 second=1072 amount=-1 +kerning first=331 second=224 amount=-1 +kerning first=106 second=114 amount=-1 +kerning first=274 second=274 amount=-2 +kerning first=245 second=250 amount=-1 +kerning first=102 second=361 amount=-1 +kerning first=353 second=250 amount=-1 +kerning first=66 second=361 amount=-3 +kerning first=376 second=344 amount=-1 +kerning first=263 second=261 amount=-2 +kerning first=202 second=274 amount=-2 +kerning first=317 second=250 amount=-2 +kerning first=1003 second=997 amount=-2 +kerning first=365 second=331 amount=-1 +kerning first=236 second=101 amount=-1 +kerning first=257 second=337 amount=-1 +kerning first=257 second=331 amount=-1 +kerning first=284 second=221 amount=-3 +kerning first=1047 second=1041 amount=-2 +kerning first=351 second=97 amount=-1 +kerning first=1048 second=1107 amount=-1 +kerning first=221 second=337 amount=-3 +kerning first=317 second=370 amount=-3 +kerning first=296 second=290 amount=-2 +kerning first=212 second=221 amount=-2 +kerning first=88 second=117 amount=-3 +kerning first=344 second=101 amount=-3 +kerning first=201 second=200 amount=-2 +kerning first=221 second=331 amount=-3 +kerning first=229 second=117 amount=-1 +kerning first=380 second=101 amount=-1 +kerning first=368 second=290 amount=-1 +kerning first=193 second=117 amount=-3 +kerning first=365 second=337 amount=-1 +kerning first=1098 second=1087 amount=-1 +kerning first=261 second=98 amount=-1 +kerning first=374 second=214 amount=-3 +kerning first=267 second=291 amount=-3 +kerning first=8217 second=229 amount=-6 +kerning first=369 second=98 amount=-2 +kerning first=122 second=251 amount=-2 +kerning first=203 second=338 amount=-1 +kerning first=333 second=98 amount=-1 +kerning first=260 second=290 amount=-3 +kerning first=86 second=251 amount=-2 +kerning first=120 second=98 amount=-3 +kerning first=8218 second=104 amount=-1 +kerning first=266 second=214 amount=-3 +kerning first=227 second=251 amount=-1 +kerning first=310 second=264 amount=-3 +kerning first=355 second=380 amount=-1 +kerning first=252 second=240 amount=-1 +kerning first=274 second=264 amount=-1 +kerning first=225 second=98 amount=-1 +kerning first=375 second=273 amount=-3 +kerning first=338 second=214 amount=-1 +kerning first=1069 second=1067 amount=-1 +kerning first=302 second=214 amount=-2 +kerning first=263 second=251 amount=-2 +kerning first=202 second=264 amount=-1 +kerning first=272 second=68 amount=-2 +kerning first=89 second=214 amount=-3 +kerning first=264 second=317 amount=-3 +kerning first=371 second=251 amount=-1 +kerning first=89 second=220 amount=-1 +kerning first=286 second=77 amount=-1 +kerning first=335 second=251 amount=-1 +kerning first=194 second=231 amount=-1 +kerning first=221 second=71 amount=-3 +kerning first=70 second=210 amount=-1 +kerning first=194 second=214 amount=-3 +kerning first=336 second=317 amount=-2 +kerning first=332 second=298 amount=-2 +kerning first=214 second=77 amount=-2 +kerning first=352 second=194 amount=-4 +kerning first=67 second=303 amount=-1 +kerning first=87 second=317 amount=-1 +kerning first=266 second=220 amount=-2 +kerning first=280 second=194 amount=-2 +kerning first=1056 second=1059 amount=-1 +kerning first=194 second=220 amount=-3 +kerning first=228 second=252 amount=-1 +kerning first=350 second=291 amount=-3 +kerning first=203 second=330 amount=-2 +kerning first=268 second=84 amount=-1 +kerning first=66 second=97 amount=-3 +kerning first=381 second=200 amount=-1 +kerning first=314 second=291 amount=-3 +kerning first=246 second=324 amount=-1 +kerning first=290 second=368 amount=-1 +kerning first=102 second=97 amount=-2 +kerning first=278 second=291 amount=-3 +kerning first=71 second=221 amount=-3 +kerning first=1069 second=1103 amount=-1 +kerning first=242 second=291 amount=-2 +kerning first=307 second=311 amount=-1 +kerning first=1098 second=1081 amount=-1 +kerning first=206 second=291 amount=-3 +kerning first=282 second=324 amount=-1 +kerning first=1102 second=1114 amount=-1 +kerning first=243 second=97 amount=-1 +kerning first=69 second=324 amount=-1 +kerning first=83 second=298 amount=-3 +kerning first=279 second=97 amount=-2 +kerning first=235 second=311 amount=-2 +kerning first=101 second=291 amount=-3 +kerning first=1030 second=1114 amount=-1 +kerning first=1055 second=1101 amount=-1 +kerning first=199 second=311 amount=-1 +kerning first=65 second=291 amount=-3 +kerning first=80 second=337 amount=-1 +kerning first=207 second=97 amount=-2 +kerning first=356 second=213 amount=-3 +kerning first=105 second=324 amount=-2 +kerning first=236 second=375 amount=-3 +kerning first=118 second=228 amount=-3 +kerning first=364 second=8249 amount=-5 +kerning first=334 second=193 amount=-4 +kerning first=227 second=253 amount=-3 +kerning first=266 second=218 amount=-2 +kerning first=82 second=228 amount=-2 +kerning first=378 second=243 amount=-1 +kerning first=1105 second=1075 amount=-1 +kerning first=70 second=120 amount=-1 +kerning first=263 second=253 amount=-2 +kerning first=262 second=193 amount=-3 +kerning first=106 second=120 amount=-1 +kerning first=194 second=218 amount=-3 +kerning first=376 second=78 amount=-1 +kerning first=335 second=253 amount=-3 +kerning first=380 second=375 amount=-2 +kerning first=1098 second=1085 amount=-1 +kerning first=380 second=103 amount=-2 +kerning first=8250 second=260 amount=-4 +kerning first=202 second=268 amount=-1 +kerning first=344 second=375 amount=-3 +kerning first=234 second=243 amount=-1 +kerning first=370 second=193 amount=-4 +kerning first=344 second=103 amount=-3 +kerning first=310 second=268 amount=-3 +kerning first=374 second=218 amount=-1 +kerning first=1058 second=1060 amount=-1 +kerning first=338 second=218 amount=-2 +kerning first=1047 second=1045 amount=-2 +kerning first=268 second=78 amount=-3 +kerning first=1055 second=1095 amount=-1 +kerning first=355 second=120 amount=-1 +kerning first=203 second=70 amount=-2 +kerning first=76 second=310 amount=-2 +kerning first=1073 second=1100 amount=-1 +kerning first=1047 second=1043 amount=-2 +kerning first=355 second=118 amount=-1 +kerning first=211 second=120 amount=-1 +kerning first=89 second=218 amount=-1 +kerning first=250 second=345 amount=-1 +kerning first=350 second=45 amount=-3 +kerning first=86 second=253 amount=-3 +kerning first=283 second=120 amount=-2 +kerning first=122 second=253 amount=-2 +kerning first=80 second=65 amount=-4 +kerning first=202 second=270 amount=-2 +kerning first=248 second=326 amount=-1 +kerning first=283 second=118 amount=-2 +kerning first=1054 second=1051 amount=-3 +kerning first=71 second=78 amount=-1 +kerning first=221 second=65 amount=-6 +kerning first=274 second=270 amount=-2 +kerning first=90 second=280 amount=-1 +kerning first=236 second=105 amount=-1 +kerning first=1065 second=1089 amount=-1 +kerning first=199 second=305 amount=-1 +kerning first=378 second=241 amount=-2 +kerning first=109 second=251 amount=-1 +kerning first=8217 second=227 amount=-6 +kerning first=83 second=8250 amount=-1 +kerning first=334 second=90 amount=-2 +kerning first=1030 second=1108 amount=-1 +kerning first=272 second=105 amount=-1 +kerning first=101 second=324 amount=-2 +kerning first=69 second=318 amount=-1 +kerning first=1098 second=1083 amount=-1 +kerning first=106 second=118 amount=-3 +kerning first=105 second=318 amount=-2 +kerning first=234 second=245 amount=-1 +kerning first=108 second=283 amount=-1 +kerning first=200 second=105 amount=-1 +kerning first=70 second=118 amount=-1 +kerning first=235 second=305 amount=-2 +kerning first=72 second=283 amount=-2 +kerning first=221 second=335 amount=-3 +kerning first=234 second=241 amount=-2 +kerning first=87 second=171 amount=-5 +kerning first=1092 second=1084 amount=-1 +kerning first=307 second=305 amount=-2 +kerning first=198 second=241 amount=-1 +kerning first=8218 second=287 amount=-1 +kerning first=380 second=291 amount=-2 +kerning first=8217 second=100 amount=-3 +kerning first=8217 second=223 amount=-2 +kerning first=367 second=228 amount=-1 +kerning first=379 second=305 amount=-1 +kerning first=331 second=228 amount=-1 +kerning first=249 second=283 amount=-1 +kerning first=295 second=228 amount=-1 +kerning first=254 second=108 amount=-2 +kerning first=346 second=270 amount=-3 +kerning first=80 second=335 amount=-1 +kerning first=259 second=228 amount=-1 +kerning first=67 second=200 amount=-3 +kerning first=223 second=228 amount=-1 +kerning first=326 second=108 amount=-1 +kerning first=85 second=193 amount=-4 +kerning first=290 second=370 amount=-1 +kerning first=290 second=108 amount=-1 +kerning first=249 second=281 amount=-1 +kerning first=205 second=231 amount=-2 +kerning first=73 second=347 amount=-2 +kerning first=236 second=107 amount=-1 +kerning first=203 second=66 amount=-2 +kerning first=100 second=231 amount=-1 +kerning first=68 second=256 amount=-4 +kerning first=200 second=107 amount=-1 +kerning first=1055 second=1097 amount=-1 +kerning first=72 second=281 amount=-2 +kerning first=1094 second=1092 amount=-1 +kerning first=369 second=113 amount=-1 +kerning first=307 second=231 amount=-1 +kerning first=108 second=281 amount=-1 +kerning first=317 second=256 amount=-2 +kerning first=1047 second=1047 amount=-2 +kerning first=1037 second=1098 amount=-1 +kerning first=331 second=230 amount=-1 +kerning first=371 second=255 amount=-2 +kerning first=1051 second=1072 amount=-1 +kerning first=367 second=230 amount=-1 +kerning first=335 second=255 amount=-3 +kerning first=277 second=231 amount=-1 +kerning first=1100 second=1114 amount=-1 +kerning first=221 second=67 amount=-3 +kerning first=203 second=332 amount=-1 +kerning first=313 second=253 amount=-3 +kerning first=266 second=216 amount=-3 +kerning first=263 second=255 amount=-2 +kerning first=302 second=216 amount=-2 +kerning first=227 second=255 amount=-3 +kerning first=227 second=353 amount=-1 +kerning first=310 second=346 amount=-2 +kerning first=338 second=216 amount=-1 +kerning first=380 second=371 amount=-2 +kerning first=122 second=255 amount=-2 +kerning first=225 second=242 amount=-1 +kerning first=89 second=216 amount=-3 +kerning first=86 second=255 amount=-3 +kerning first=8222 second=314 amount=-1 +kerning first=250 second=347 amount=-2 +kerning first=380 second=107 amount=-2 +kerning first=262 second=378 amount=-2 +kerning first=194 second=216 amount=-3 +kerning first=236 second=371 amount=-1 +kerning first=344 second=107 amount=-3 +kerning first=67 second=192 amount=-3 +kerning first=80 second=333 amount=-1 +kerning first=212 second=217 amount=-1 +kerning first=221 second=333 amount=-3 +kerning first=241 second=229 amount=-1 +kerning first=252 second=242 amount=-1 +kerning first=1054 second=1033 amount=-3 +kerning first=376 second=80 amount=-1 +kerning first=277 second=229 amount=-2 +kerning first=73 second=81 amount=-2 +kerning first=113 second=106 amount=4 +kerning first=284 second=217 amount=-1 +kerning first=374 second=216 amount=-3 +kerning first=70 second=212 amount=-1 +kerning first=381 second=204 amount=-1 +kerning first=356 second=217 amount=-1 +kerning first=268 second=80 amount=-3 +kerning first=199 second=251 amount=-2 +kerning first=203 second=68 amount=-2 +kerning first=290 second=106 amount=-1 +kerning first=259 second=230 amount=-1 +kerning first=88 second=119 amount=-3 +kerning first=90 second=282 amount=-1 +kerning first=326 second=106 amount=-2 +kerning first=295 second=230 amount=-1 +kerning first=196 second=346 amount=-3 +kerning first=187 second=230 amount=-1 +kerning first=193 second=119 amount=-3 +kerning first=235 second=307 amount=-2 +kerning first=254 second=106 amount=-2 +kerning first=223 second=230 amount=-1 +kerning first=229 second=119 amount=-3 +kerning first=82 second=230 amount=-2 +kerning first=8218 second=289 amount=-1 +kerning first=307 second=307 amount=-1 +kerning first=118 second=230 amount=-3 +kerning first=257 second=333 amount=-1 +kerning first=337 second=119 amount=-2 +kerning first=365 second=333 amount=-1 +kerning first=304 second=346 amount=-2 +kerning first=201 second=204 amount=-2 +kerning first=71 second=217 amount=-1 +kerning first=268 second=346 amount=-3 +kerning first=75 second=230 amount=-1 diff --git a/jme3-examples/src/main/resources/jme3test/font/FreeSerif64I1.png b/jme3-examples/src/main/resources/jme3test/font/FreeSerif64I1.png new file mode 100644 index 000000000..ecf37a03d Binary files /dev/null and b/jme3-examples/src/main/resources/jme3test/font/FreeSerif64I1.png differ diff --git a/jme3-examples/src/main/resources/jme3test/font/FreeSerif64I2.png b/jme3-examples/src/main/resources/jme3test/font/FreeSerif64I2.png new file mode 100644 index 000000000..502d04d95 Binary files /dev/null and b/jme3-examples/src/main/resources/jme3test/font/FreeSerif64I2.png differ diff --git a/jme3-examples/src/main/resources/jme3test/font/Native-FreeSerif16I.fnt b/jme3-examples/src/main/resources/jme3test/font/Native-FreeSerif16I.fnt new file mode 100644 index 000000000..e5efc1d75 --- /dev/null +++ b/jme3-examples/src/main/resources/jme3test/font/Native-FreeSerif16I.fnt @@ -0,0 +1,18131 @@ +info face="Free Serif Italic" size=16 bold=0 italic=1 charset="" unicode=0 stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=0,0 +common lineHeight=22 base=16 scaleW=512 scaleH=512 pages=1 packed=0 +page id=0 file="Native-FreeSerif16I.png" +chars count=754 +char id=0 x=0 y=0 width=17 height=22 xoffset=1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=13 x=0 y=0 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=0 +char id=32 x=0 y=0 width=0 height=0 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=0 +char id=33 x=17 y=0 width=10 height=22 xoffset=0 yoffset=0 xadvance=5 page=0 chnl=0 +char id=34 x=27 y=0 width=12 height=22 xoffset=2 yoffset=0 xadvance=7 page=0 chnl=0 +char id=35 x=39 y=0 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=36 x=52 y=0 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=37 x=65 y=0 width=18 height=22 xoffset=1 yoffset=0 xadvance=13 page=0 chnl=0 +char id=38 x=83 y=0 width=17 height=22 xoffset=1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=39 x=100 y=0 width=8 height=22 xoffset=2 yoffset=0 xadvance=3 page=0 chnl=0 +char id=40 x=108 y=0 width=10 height=22 xoffset=0 yoffset=0 xadvance=5 page=0 chnl=0 +char id=41 x=118 y=0 width=10 height=22 xoffset=0 yoffset=0 xadvance=5 page=0 chnl=0 +char id=42 x=128 y=0 width=13 height=22 xoffset=2 yoffset=0 xadvance=8 page=0 chnl=0 +char id=43 x=141 y=0 width=16 height=22 xoffset=1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=44 x=157 y=0 width=9 height=22 xoffset=-1 yoffset=0 xadvance=4 page=0 chnl=0 +char id=45 x=166 y=0 width=10 height=22 xoffset=0 yoffset=0 xadvance=5 page=0 chnl=0 +char id=46 x=176 y=0 width=9 height=22 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=0 +char id=47 x=185 y=0 width=12 height=22 xoffset=-1 yoffset=0 xadvance=4 page=0 chnl=0 +char id=48 x=197 y=0 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=49 x=210 y=0 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=50 x=223 y=0 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=51 x=236 y=0 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=52 x=249 y=0 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=53 x=262 y=0 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=54 x=275 y=0 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=55 x=288 y=0 width=13 height=22 xoffset=1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=56 x=301 y=0 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=57 x=314 y=0 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=58 x=327 y=0 width=10 height=22 xoffset=0 yoffset=0 xadvance=5 page=0 chnl=0 +char id=59 x=337 y=0 width=10 height=22 xoffset=0 yoffset=0 xadvance=5 page=0 chnl=0 +char id=60 x=347 y=0 width=16 height=22 xoffset=1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=61 x=363 y=0 width=16 height=22 xoffset=1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=62 x=379 y=0 width=16 height=22 xoffset=1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=63 x=395 y=0 width=13 height=22 xoffset=2 yoffset=0 xadvance=8 page=0 chnl=0 +char id=64 x=408 y=0 width=20 height=22 xoffset=1 yoffset=0 xadvance=15 page=0 chnl=0 +char id=65 x=428 y=0 width=15 height=22 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=66 x=443 y=0 width=15 height=22 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=67 x=458 y=0 width=16 height=22 xoffset=1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=68 x=474 y=0 width=17 height=22 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=69 x=491 y=0 width=15 height=22 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=70 x=0 y=22 width=15 height=22 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=71 x=15 y=22 width=17 height=22 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=72 x=32 y=22 width=17 height=22 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=73 x=49 y=22 width=11 height=22 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=74 x=60 y=22 width=12 height=22 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=75 x=72 y=22 width=16 height=22 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=76 x=88 y=22 width=14 height=22 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=77 x=102 y=22 width=18 height=22 xoffset=-1 yoffset=0 xadvance=13 page=0 chnl=0 +char id=78 x=120 y=22 width=16 height=22 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=79 x=136 y=22 width=17 height=22 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=80 x=153 y=22 width=15 height=22 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=81 x=168 y=22 width=17 height=22 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=82 x=185 y=22 width=15 height=22 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=83 x=200 y=22 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=84 x=213 y=22 width=15 height=22 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=85 x=228 y=22 width=17 height=22 xoffset=1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=86 x=245 y=22 width=16 height=22 xoffset=1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=87 x=261 y=22 width=19 height=22 xoffset=1 yoffset=0 xadvance=13 page=0 chnl=0 +char id=88 x=280 y=22 width=15 height=22 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=89 x=295 y=22 width=15 height=22 xoffset=1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=90 x=310 y=22 width=14 height=22 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=91 x=324 y=22 width=11 height=22 xoffset=0 yoffset=0 xadvance=6 page=0 chnl=0 +char id=92 x=335 y=22 width=10 height=22 xoffset=-1 yoffset=0 xadvance=4 page=0 chnl=0 +char id=93 x=345 y=22 width=11 height=22 xoffset=0 yoffset=0 xadvance=6 page=0 chnl=0 +char id=94 x=356 y=22 width=12 height=22 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=95 x=368 y=22 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=96 x=381 y=22 width=13 height=22 xoffset=5 yoffset=0 xadvance=5 page=0 chnl=0 +char id=97 x=394 y=22 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=98 x=407 y=22 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=99 x=420 y=22 width=12 height=22 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=100 x=432 y=22 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=101 x=445 y=22 width=12 height=22 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=102 x=457 y=22 width=13 height=22 xoffset=-3 yoffset=0 xadvance=4 page=0 chnl=0 +char id=103 x=470 y=22 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=104 x=483 y=22 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=105 x=496 y=22 width=9 height=22 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=0 +char id=106 x=0 y=44 width=10 height=22 xoffset=-2 yoffset=0 xadvance=4 page=0 chnl=0 +char id=107 x=10 y=44 width=12 height=22 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=108 x=22 y=44 width=9 height=22 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=0 +char id=109 x=31 y=44 width=17 height=22 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=110 x=48 y=44 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=111 x=61 y=44 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=112 x=74 y=44 width=14 height=22 xoffset=-2 yoffset=0 xadvance=8 page=0 chnl=0 +char id=113 x=88 y=44 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=114 x=101 y=44 width=11 height=22 xoffset=0 yoffset=0 xadvance=6 page=0 chnl=0 +char id=115 x=112 y=44 width=11 height=22 xoffset=0 yoffset=0 xadvance=6 page=0 chnl=0 +char id=116 x=123 y=44 width=9 height=22 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=0 +char id=117 x=132 y=44 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=118 x=145 y=44 width=12 height=22 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=119 x=157 y=44 width=16 height=22 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=0 +char id=120 x=173 y=44 width=12 height=22 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=121 x=185 y=44 width=12 height=22 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=122 x=197 y=44 width=11 height=22 xoffset=0 yoffset=0 xadvance=6 page=0 chnl=0 +char id=123 x=208 y=44 width=11 height=22 xoffset=0 yoffset=0 xadvance=6 page=0 chnl=0 +char id=124 x=219 y=44 width=9 height=22 xoffset=1 yoffset=0 xadvance=4 page=0 chnl=0 +char id=125 x=228 y=44 width=11 height=22 xoffset=0 yoffset=0 xadvance=6 page=0 chnl=0 +char id=126 x=239 y=44 width=14 height=22 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=160 x=0 y=0 width=0 height=0 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=0 +char id=161 x=253 y=44 width=11 height=22 xoffset=0 yoffset=0 xadvance=6 page=0 chnl=0 +char id=162 x=264 y=44 width=13 height=22 xoffset=1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=163 x=277 y=44 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=164 x=290 y=44 width=13 height=22 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=165 x=303 y=44 width=14 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=166 x=317 y=44 width=9 height=22 xoffset=1 yoffset=0 xadvance=4 page=0 chnl=0 +char id=167 x=326 y=44 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=168 x=339 y=44 width=11 height=22 xoffset=1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=169 x=350 y=44 width=17 height=22 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=170 x=367 y=44 width=10 height=22 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=0 +char id=171 x=377 y=44 width=12 height=22 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=172 x=389 y=44 width=16 height=22 xoffset=1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=173 x=405 y=44 width=10 height=22 xoffset=0 yoffset=0 xadvance=5 page=0 chnl=0 +char id=174 x=415 y=44 width=17 height=22 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=175 x=432 y=44 width=11 height=22 xoffset=1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=176 x=443 y=44 width=11 height=22 xoffset=1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=177 x=454 y=44 width=16 height=22 xoffset=1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=178 x=470 y=44 width=11 height=22 xoffset=1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=179 x=481 y=44 width=11 height=22 xoffset=2 yoffset=0 xadvance=5 page=0 chnl=0 +char id=180 x=492 y=44 width=11 height=22 xoffset=3 yoffset=0 xadvance=5 page=0 chnl=0 +char id=181 x=0 y=66 width=13 height=22 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=182 x=13 y=66 width=14 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=183 x=27 y=66 width=9 height=22 xoffset=2 yoffset=0 xadvance=4 page=0 chnl=0 +char id=184 x=36 y=66 width=10 height=22 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=185 x=46 y=66 width=10 height=22 xoffset=1 yoffset=0 xadvance=4 page=0 chnl=0 +char id=186 x=56 y=66 width=10 height=22 xoffset=1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=187 x=66 y=66 width=12 height=22 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=188 x=78 y=66 width=17 height=22 xoffset=1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=189 x=95 y=66 width=17 height=22 xoffset=1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=190 x=112 y=66 width=17 height=22 xoffset=1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=191 x=129 y=66 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=192 x=142 y=66 width=15 height=22 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=193 x=157 y=66 width=15 height=22 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=194 x=172 y=66 width=15 height=22 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=195 x=187 y=66 width=15 height=22 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=196 x=202 y=66 width=15 height=22 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=197 x=217 y=66 width=15 height=22 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=198 x=232 y=66 width=19 height=22 xoffset=-1 yoffset=0 xadvance=14 page=0 chnl=0 +char id=199 x=251 y=66 width=16 height=22 xoffset=1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=200 x=267 y=66 width=15 height=22 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=201 x=282 y=66 width=15 height=22 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=202 x=297 y=66 width=15 height=22 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=203 x=312 y=66 width=15 height=22 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=204 x=327 y=66 width=11 height=22 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=205 x=338 y=66 width=11 height=22 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=206 x=349 y=66 width=12 height=22 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=207 x=361 y=66 width=12 height=22 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=208 x=373 y=66 width=17 height=22 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=209 x=390 y=66 width=16 height=22 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=210 x=406 y=66 width=17 height=22 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=211 x=423 y=66 width=17 height=22 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=212 x=440 y=66 width=17 height=22 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=213 x=457 y=66 width=17 height=22 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=214 x=474 y=66 width=17 height=22 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=215 x=491 y=66 width=16 height=22 xoffset=1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=216 x=0 y=88 width=17 height=22 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=217 x=17 y=88 width=17 height=22 xoffset=1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=218 x=34 y=88 width=17 height=22 xoffset=1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=219 x=51 y=88 width=17 height=22 xoffset=1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=220 x=68 y=88 width=17 height=22 xoffset=1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=221 x=85 y=88 width=15 height=22 xoffset=1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=222 x=100 y=88 width=15 height=22 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=0 +char id=223 x=115 y=88 width=15 height=22 xoffset=-3 yoffset=0 xadvance=8 page=0 chnl=0 +char id=224 x=130 y=88 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=225 x=143 y=88 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=226 x=156 y=88 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=227 x=169 y=88 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=228 x=182 y=88 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=229 x=195 y=88 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=230 x=208 y=88 width=16 height=22 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=0 +char id=231 x=224 y=88 width=12 height=22 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=232 x=236 y=88 width=12 height=22 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=233 x=248 y=88 width=13 height=22 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=234 x=261 y=88 width=12 height=22 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=235 x=273 y=88 width=12 height=22 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=236 x=285 y=88 width=9 height=22 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=0 +char id=237 x=294 y=88 width=10 height=22 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=0 +char id=238 x=304 y=88 width=10 height=22 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=0 +char id=239 x=314 y=88 width=11 height=22 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=0 +char id=240 x=325 y=88 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=241 x=338 y=88 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=242 x=351 y=88 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=243 x=364 y=88 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=244 x=377 y=88 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=245 x=390 y=88 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=246 x=403 y=88 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=247 x=416 y=88 width=16 height=22 xoffset=1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=248 x=432 y=88 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=249 x=445 y=88 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=250 x=458 y=88 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=251 x=471 y=88 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=252 x=484 y=88 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=253 x=497 y=88 width=12 height=22 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=254 x=0 y=110 width=14 height=22 xoffset=-2 yoffset=0 xadvance=8 page=0 chnl=0 +char id=255 x=14 y=110 width=12 height=22 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=256 x=26 y=110 width=15 height=22 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=257 x=41 y=110 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=258 x=54 y=110 width=15 height=22 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=259 x=69 y=110 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=260 x=82 y=110 width=16 height=22 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=261 x=98 y=110 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=262 x=111 y=110 width=16 height=22 xoffset=1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=263 x=127 y=110 width=12 height=22 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=264 x=139 y=110 width=16 height=22 xoffset=1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=265 x=155 y=110 width=12 height=22 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=266 x=167 y=110 width=16 height=22 xoffset=1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=267 x=183 y=110 width=12 height=22 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=268 x=195 y=110 width=16 height=22 xoffset=1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=269 x=211 y=110 width=13 height=22 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=270 x=224 y=110 width=17 height=22 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=271 x=241 y=110 width=16 height=22 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=0 +char id=272 x=373 y=66 width=17 height=22 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=273 x=257 y=110 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=274 x=270 y=110 width=15 height=22 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=275 x=285 y=110 width=12 height=22 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=276 x=297 y=110 width=15 height=22 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=277 x=312 y=110 width=13 height=22 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=278 x=325 y=110 width=15 height=22 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=279 x=340 y=110 width=12 height=22 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=280 x=352 y=110 width=15 height=22 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=281 x=367 y=110 width=12 height=22 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=282 x=379 y=110 width=15 height=22 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=283 x=394 y=110 width=13 height=22 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=284 x=407 y=110 width=17 height=22 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=285 x=424 y=110 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=286 x=437 y=110 width=17 height=22 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=287 x=454 y=110 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=288 x=467 y=110 width=17 height=22 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=289 x=484 y=110 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=290 x=0 y=132 width=17 height=22 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=291 x=497 y=110 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=292 x=17 y=132 width=17 height=22 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=293 x=34 y=132 width=14 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=294 x=48 y=132 width=17 height=22 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=295 x=65 y=132 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=296 x=78 y=132 width=12 height=22 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=297 x=90 y=132 width=11 height=22 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=0 +char id=298 x=101 y=132 width=12 height=22 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=299 x=113 y=132 width=11 height=22 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=0 +char id=300 x=124 y=132 width=12 height=22 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=301 x=136 y=132 width=11 height=22 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=0 +char id=302 x=147 y=132 width=11 height=22 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=303 x=158 y=132 width=9 height=22 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=0 +char id=304 x=167 y=132 width=11 height=22 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=305 x=178 y=132 width=9 height=22 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=0 +char id=306 x=187 y=132 width=17 height=22 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=307 x=204 y=132 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=308 x=217 y=132 width=14 height=22 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=309 x=231 y=132 width=12 height=22 xoffset=-2 yoffset=0 xadvance=4 page=0 chnl=0 +char id=310 x=243 y=132 width=16 height=22 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=311 x=259 y=132 width=12 height=22 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=312 x=271 y=132 width=12 height=22 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=313 x=283 y=132 width=14 height=22 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=314 x=297 y=132 width=11 height=22 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=0 +char id=315 x=308 y=132 width=14 height=22 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=316 x=322 y=132 width=9 height=22 xoffset=-1 yoffset=0 xadvance=4 page=0 chnl=0 +char id=317 x=331 y=132 width=15 height=22 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=318 x=346 y=132 width=12 height=22 xoffset=0 yoffset=0 xadvance=6 page=0 chnl=0 +char id=319 x=358 y=132 width=14 height=22 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=320 x=372 y=132 width=10 height=22 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=0 +char id=321 x=382 y=132 width=14 height=22 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=322 x=396 y=132 width=9 height=22 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=0 +char id=323 x=405 y=132 width=16 height=22 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=324 x=421 y=132 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=325 x=434 y=132 width=16 height=22 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=326 x=450 y=132 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=327 x=463 y=132 width=16 height=22 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=328 x=479 y=132 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=329 x=492 y=132 width=14 height=22 xoffset=1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=330 x=0 y=154 width=17 height=22 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=331 x=17 y=154 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=332 x=30 y=154 width=17 height=22 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=333 x=47 y=154 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=334 x=60 y=154 width=17 height=22 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=335 x=77 y=154 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=336 x=90 y=154 width=17 height=22 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=337 x=107 y=154 width=15 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=338 x=122 y=154 width=20 height=22 xoffset=0 yoffset=0 xadvance=15 page=0 chnl=0 +char id=339 x=142 y=154 width=16 height=22 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=0 +char id=340 x=158 y=154 width=15 height=22 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=341 x=173 y=154 width=11 height=22 xoffset=0 yoffset=0 xadvance=6 page=0 chnl=0 +char id=342 x=184 y=154 width=15 height=22 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=343 x=199 y=154 width=11 height=22 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=344 x=210 y=154 width=15 height=22 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=345 x=225 y=154 width=12 height=22 xoffset=0 yoffset=0 xadvance=6 page=0 chnl=0 +char id=346 x=237 y=154 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=347 x=250 y=154 width=11 height=22 xoffset=0 yoffset=0 xadvance=6 page=0 chnl=0 +char id=348 x=261 y=154 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=349 x=274 y=154 width=11 height=22 xoffset=0 yoffset=0 xadvance=6 page=0 chnl=0 +char id=350 x=285 y=154 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=351 x=298 y=154 width=11 height=22 xoffset=0 yoffset=0 xadvance=6 page=0 chnl=0 +char id=352 x=309 y=154 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=353 x=322 y=154 width=12 height=22 xoffset=0 yoffset=0 xadvance=6 page=0 chnl=0 +char id=354 x=334 y=154 width=15 height=22 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=355 x=349 y=154 width=9 height=22 xoffset=-1 yoffset=0 xadvance=4 page=0 chnl=0 +char id=356 x=358 y=154 width=15 height=22 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=357 x=373 y=154 width=13 height=22 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=358 x=386 y=154 width=15 height=22 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=359 x=401 y=154 width=9 height=22 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=0 +char id=360 x=410 y=154 width=17 height=22 xoffset=1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=361 x=427 y=154 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=362 x=440 y=154 width=17 height=22 xoffset=1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=363 x=457 y=154 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=364 x=470 y=154 width=17 height=22 xoffset=1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=365 x=487 y=154 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=366 x=0 y=176 width=17 height=22 xoffset=1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=367 x=17 y=176 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=368 x=30 y=176 width=17 height=22 xoffset=1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=369 x=47 y=176 width=14 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=370 x=61 y=176 width=17 height=22 xoffset=1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=371 x=78 y=176 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=372 x=91 y=176 width=19 height=22 xoffset=1 yoffset=0 xadvance=13 page=0 chnl=0 +char id=373 x=110 y=176 width=16 height=22 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=0 +char id=374 x=126 y=176 width=15 height=22 xoffset=1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=375 x=141 y=176 width=12 height=22 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=376 x=153 y=176 width=15 height=22 xoffset=1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=377 x=168 y=176 width=14 height=22 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=378 x=500 y=154 width=11 height=22 xoffset=0 yoffset=0 xadvance=6 page=0 chnl=0 +char id=379 x=182 y=176 width=14 height=22 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=380 x=196 y=176 width=11 height=22 xoffset=0 yoffset=0 xadvance=6 page=0 chnl=0 +char id=381 x=207 y=176 width=14 height=22 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=382 x=221 y=176 width=12 height=22 xoffset=0 yoffset=0 xadvance=6 page=0 chnl=0 +char id=383 x=233 y=176 width=13 height=22 xoffset=-3 yoffset=0 xadvance=4 page=0 chnl=0 +char id=884 x=503 y=44 width=8 height=22 xoffset=0 yoffset=0 xadvance=3 page=0 chnl=0 +char id=885 x=246 y=176 width=8 height=22 xoffset=0 yoffset=0 xadvance=3 page=0 chnl=0 +char id=890 x=254 y=176 width=10 height=22 xoffset=0 yoffset=0 xadvance=5 page=0 chnl=0 +char id=894 x=264 y=176 width=10 height=22 xoffset=0 yoffset=0 xadvance=5 page=0 chnl=0 +char id=900 x=274 y=176 width=9 height=22 xoffset=1 yoffset=0 xadvance=4 page=0 chnl=0 +char id=901 x=283 y=176 width=12 height=22 xoffset=2 yoffset=0 xadvance=5 page=0 chnl=0 +char id=902 x=295 y=176 width=16 height=22 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=0 +char id=903 x=311 y=176 width=9 height=22 xoffset=2 yoffset=0 xadvance=4 page=0 chnl=0 +char id=904 x=320 y=176 width=18 height=22 xoffset=2 yoffset=0 xadvance=13 page=0 chnl=0 +char id=905 x=338 y=176 width=21 height=22 xoffset=2 yoffset=0 xadvance=15 page=0 chnl=0 +char id=906 x=359 y=176 width=14 height=22 xoffset=2 yoffset=0 xadvance=9 page=0 chnl=0 +char id=908 x=373 y=176 width=18 height=22 xoffset=2 yoffset=0 xadvance=13 page=0 chnl=0 +char id=910 x=391 y=176 width=20 height=22 xoffset=2 yoffset=0 xadvance=14 page=0 chnl=0 +char id=911 x=411 y=176 width=19 height=22 xoffset=2 yoffset=0 xadvance=14 page=0 chnl=0 +char id=912 x=430 y=176 width=10 height=22 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=0 +char id=913 x=440 y=176 width=16 height=22 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=0 +char id=914 x=456 y=176 width=14 height=22 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=915 x=470 y=176 width=15 height=22 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=0 +char id=916 x=485 y=176 width=16 height=22 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=0 +char id=917 x=491 y=0 width=15 height=22 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=918 x=0 y=198 width=15 height=22 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=919 x=15 y=198 width=18 height=22 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=920 x=33 y=198 width=16 height=22 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=0 +char id=921 x=49 y=198 width=11 height=22 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=922 x=72 y=22 width=16 height=22 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=923 x=60 y=198 width=15 height=22 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=924 x=102 y=22 width=18 height=22 xoffset=-1 yoffset=0 xadvance=13 page=0 chnl=0 +char id=925 x=120 y=22 width=16 height=22 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=926 x=75 y=198 width=16 height=22 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=0 +char id=927 x=91 y=198 width=16 height=22 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=0 +char id=928 x=107 y=198 width=17 height=22 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=929 x=153 y=22 width=15 height=22 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=931 x=124 y=198 width=16 height=22 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=932 x=213 y=22 width=15 height=22 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=0 +char id=933 x=140 y=198 width=16 height=22 xoffset=1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=934 x=156 y=198 width=17 height=22 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=935 x=280 y=22 width=15 height=22 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=936 x=173 y=198 width=19 height=22 xoffset=1 yoffset=0 xadvance=13 page=0 chnl=0 +char id=937 x=192 y=198 width=17 height=22 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=938 x=209 y=198 width=12 height=22 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=939 x=221 y=198 width=16 height=22 xoffset=1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=940 x=237 y=198 width=14 height=22 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=941 x=251 y=198 width=12 height=22 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=942 x=263 y=198 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=943 x=501 y=176 width=10 height=22 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=0 +char id=944 x=276 y=198 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=945 x=289 y=198 width=14 height=22 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=946 x=303 y=198 width=13 height=22 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=947 x=316 y=198 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=948 x=329 y=198 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=949 x=342 y=198 width=12 height=22 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=950 x=354 y=198 width=11 height=22 xoffset=0 yoffset=0 xadvance=6 page=0 chnl=0 +char id=951 x=365 y=198 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=952 x=378 y=198 width=14 height=22 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=953 x=392 y=198 width=9 height=22 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=0 +char id=954 x=401 y=198 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=955 x=414 y=198 width=13 height=22 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=956 x=427 y=198 width=13 height=22 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=957 x=440 y=198 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=958 x=453 y=198 width=12 height=22 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=959 x=465 y=198 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=960 x=478 y=198 width=15 height=22 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=961 x=493 y=198 width=13 height=22 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=962 x=0 y=220 width=12 height=22 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=963 x=12 y=220 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=964 x=25 y=220 width=12 height=22 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=965 x=37 y=220 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=966 x=50 y=220 width=15 height=22 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=0 +char id=967 x=65 y=220 width=13 height=22 xoffset=-2 yoffset=0 xadvance=7 page=0 chnl=0 +char id=968 x=78 y=220 width=16 height=22 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=0 +char id=969 x=94 y=220 width=16 height=22 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=0 +char id=970 x=110 y=220 width=10 height=22 xoffset=-1 yoffset=0 xadvance=4 page=0 chnl=0 +char id=971 x=120 y=220 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=972 x=133 y=220 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=973 x=146 y=220 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=974 x=159 y=220 width=16 height=22 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=0 +char id=976 x=175 y=220 width=14 height=22 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=977 x=189 y=220 width=14 height=22 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=978 x=203 y=220 width=15 height=22 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=0 +char id=979 x=218 y=220 width=19 height=22 xoffset=1 yoffset=0 xadvance=13 page=0 chnl=0 +char id=980 x=237 y=220 width=16 height=22 xoffset=1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=981 x=253 y=220 width=15 height=22 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=0 +char id=982 x=268 y=220 width=16 height=22 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=0 +char id=983 x=284 y=220 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=984 x=297 y=220 width=15 height=22 xoffset=1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=985 x=312 y=220 width=14 height=22 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=986 x=326 y=220 width=14 height=22 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=987 x=340 y=220 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=988 x=353 y=220 width=15 height=22 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=0 +char id=989 x=368 y=220 width=14 height=22 xoffset=-2 yoffset=0 xadvance=8 page=0 chnl=0 +char id=990 x=382 y=220 width=15 height=22 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=0 +char id=991 x=397 y=220 width=12 height=22 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=992 x=409 y=220 width=16 height=22 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=993 x=425 y=220 width=14 height=22 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1008 x=439 y=220 width=14 height=22 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1009 x=453 y=220 width=14 height=22 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1010 x=467 y=220 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1011 x=0 y=44 width=10 height=22 xoffset=-2 yoffset=0 xadvance=4 page=0 chnl=0 +char id=1012 x=480 y=220 width=17 height=22 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1013 x=497 y=220 width=9 height=22 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=0 +char id=1014 x=0 y=242 width=9 height=22 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=0 +char id=1015 x=100 y=88 width=15 height=22 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1016 x=9 y=242 width=13 height=22 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1017 x=22 y=242 width=16 height=22 xoffset=1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1018 x=38 y=242 width=18 height=22 xoffset=-1 yoffset=0 xadvance=13 page=0 chnl=0 +char id=1019 x=56 y=242 width=16 height=22 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1020 x=72 y=242 width=16 height=22 xoffset=-3 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1021 x=88 y=242 width=16 height=22 xoffset=1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1022 x=104 y=242 width=16 height=22 xoffset=1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1023 x=120 y=242 width=16 height=22 xoffset=1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1024 x=136 y=242 width=15 height=22 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1025 x=151 y=242 width=15 height=22 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1026 x=166 y=242 width=16 height=22 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1027 x=182 y=242 width=15 height=22 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1028 x=197 y=242 width=16 height=22 xoffset=1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1029 x=200 y=22 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1030 x=213 y=242 width=11 height=22 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=1031 x=224 y=242 width=12 height=22 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=1032 x=236 y=242 width=12 height=22 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=1033 x=248 y=242 width=21 height=22 xoffset=-1 yoffset=0 xadvance=16 page=0 chnl=0 +char id=1034 x=269 y=242 width=21 height=22 xoffset=-1 yoffset=0 xadvance=16 page=0 chnl=0 +char id=1035 x=290 y=242 width=16 height=22 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1036 x=306 y=242 width=16 height=22 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1037 x=322 y=242 width=17 height=22 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1038 x=339 y=242 width=17 height=22 xoffset=1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1039 x=356 y=242 width=17 height=22 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1040 x=428 y=0 width=15 height=22 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1041 x=373 y=242 width=15 height=22 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1042 x=443 y=0 width=15 height=22 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1043 x=470 y=176 width=15 height=22 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1044 x=388 y=242 width=17 height=22 xoffset=-2 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1045 x=491 y=0 width=15 height=22 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1046 x=405 y=242 width=21 height=22 xoffset=-1 yoffset=0 xadvance=16 page=0 chnl=0 +char id=1047 x=426 y=242 width=14 height=22 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1048 x=440 y=242 width=17 height=22 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1049 x=457 y=242 width=17 height=22 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1050 x=474 y=242 width=16 height=22 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1051 x=490 y=242 width=17 height=22 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1052 x=102 y=22 width=18 height=22 xoffset=-1 yoffset=0 xadvance=13 page=0 chnl=0 +char id=1053 x=32 y=22 width=17 height=22 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1054 x=136 y=22 width=17 height=22 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1055 x=107 y=198 width=17 height=22 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1056 x=153 y=22 width=15 height=22 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1057 x=458 y=0 width=16 height=22 xoffset=1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1058 x=213 y=22 width=15 height=22 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1059 x=0 y=264 width=17 height=22 xoffset=1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1060 x=156 y=198 width=17 height=22 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1061 x=280 y=22 width=15 height=22 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1062 x=17 y=264 width=17 height=22 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1063 x=34 y=264 width=16 height=22 xoffset=1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1064 x=50 y=264 width=21 height=22 xoffset=-1 yoffset=0 xadvance=16 page=0 chnl=0 +char id=1065 x=71 y=264 width=21 height=22 xoffset=-1 yoffset=0 xadvance=16 page=0 chnl=0 +char id=1066 x=92 y=264 width=16 height=22 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1067 x=108 y=264 width=19 height=22 xoffset=-1 yoffset=0 xadvance=14 page=0 chnl=0 +char id=1068 x=127 y=264 width=15 height=22 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1069 x=142 y=264 width=15 height=22 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1070 x=157 y=264 width=21 height=22 xoffset=-1 yoffset=0 xadvance=16 page=0 chnl=0 +char id=1071 x=178 y=264 width=16 height=22 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1072 x=394 y=22 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1073 x=194 y=264 width=14 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1074 x=208 y=264 width=12 height=22 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=1075 x=220 y=264 width=11 height=22 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=1076 x=231 y=264 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1077 x=445 y=22 width=12 height=22 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=1078 x=244 y=264 width=20 height=22 xoffset=0 yoffset=0 xadvance=15 page=0 chnl=0 +char id=1079 x=264 y=264 width=11 height=22 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=1080 x=275 y=264 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1081 x=288 y=264 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1082 x=301 y=264 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1083 x=314 y=264 width=13 height=22 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1084 x=327 y=264 width=15 height=22 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1085 x=342 y=264 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1086 x=355 y=264 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1087 x=368 y=264 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1088 x=381 y=264 width=14 height=22 xoffset=-2 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1089 x=395 y=264 width=12 height=22 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=1090 x=31 y=44 width=17 height=22 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1091 x=407 y=264 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1092 x=420 y=264 width=17 height=22 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1093 x=437 y=264 width=12 height=22 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=1094 x=449 y=264 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1095 x=462 y=264 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1096 x=475 y=264 width=17 height=22 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1097 x=492 y=264 width=17 height=22 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1098 x=0 y=286 width=14 height=22 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1099 x=14 y=286 width=16 height=22 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1100 x=30 y=286 width=12 height=22 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=1101 x=42 y=286 width=12 height=22 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=1102 x=54 y=286 width=16 height=22 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1103 x=70 y=286 width=13 height=22 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1104 x=83 y=286 width=12 height=22 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=1105 x=95 y=286 width=12 height=22 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=1106 x=107 y=286 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1107 x=120 y=286 width=11 height=22 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=1108 x=131 y=286 width=12 height=22 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=1109 x=143 y=286 width=11 height=22 xoffset=0 yoffset=0 xadvance=6 page=0 chnl=0 +char id=1110 x=154 y=286 width=9 height=22 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=0 +char id=1111 x=163 y=286 width=10 height=22 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=0 +char id=1112 x=0 y=44 width=10 height=22 xoffset=-2 yoffset=0 xadvance=4 page=0 chnl=0 +char id=1113 x=173 y=286 width=16 height=22 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1114 x=189 y=286 width=16 height=22 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1115 x=205 y=286 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1116 x=218 y=286 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1117 x=231 y=286 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1118 x=244 y=286 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1119 x=257 y=286 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1120 x=270 y=286 width=20 height=22 xoffset=0 yoffset=0 xadvance=15 page=0 chnl=0 +char id=1121 x=290 y=286 width=16 height=22 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1122 x=306 y=286 width=16 height=22 xoffset=1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1123 x=322 y=286 width=16 height=22 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1124 x=338 y=286 width=21 height=22 xoffset=-1 yoffset=0 xadvance=16 page=0 chnl=0 +char id=1125 x=359 y=286 width=15 height=22 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1126 x=374 y=286 width=18 height=22 xoffset=-1 yoffset=0 xadvance=13 page=0 chnl=0 +char id=1127 x=392 y=286 width=15 height=22 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1128 x=407 y=286 width=23 height=22 xoffset=-1 yoffset=0 xadvance=18 page=0 chnl=0 +char id=1129 x=430 y=286 width=18 height=22 xoffset=0 yoffset=0 xadvance=13 page=0 chnl=0 +char id=1130 x=448 y=286 width=20 height=22 xoffset=-1 yoffset=0 xadvance=15 page=0 chnl=0 +char id=1131 x=468 y=286 width=17 height=22 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1132 x=485 y=286 width=25 height=22 xoffset=-1 yoffset=0 xadvance=20 page=0 chnl=0 +char id=1133 x=0 y=308 width=19 height=22 xoffset=0 yoffset=0 xadvance=14 page=0 chnl=0 +char id=1134 x=19 y=308 width=14 height=22 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1135 x=33 y=308 width=12 height=22 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=1136 x=45 y=308 width=20 height=22 xoffset=2 yoffset=0 xadvance=13 page=0 chnl=0 +char id=1137 x=65 y=308 width=17 height=22 xoffset=1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1138 x=82 y=308 width=17 height=22 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1139 x=99 y=308 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1140 x=112 y=308 width=17 height=22 xoffset=1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1141 x=129 y=308 width=14 height=22 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1142 x=143 y=308 width=17 height=22 xoffset=1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1143 x=160 y=308 width=14 height=22 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1144 x=174 y=308 width=24 height=22 xoffset=0 yoffset=0 xadvance=19 page=0 chnl=0 +char id=1145 x=198 y=308 width=20 height=22 xoffset=0 yoffset=0 xadvance=15 page=0 chnl=0 +char id=1146 x=218 y=308 width=19 height=22 xoffset=0 yoffset=0 xadvance=14 page=0 chnl=0 +char id=1147 x=237 y=308 width=15 height=22 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1148 x=252 y=308 width=20 height=22 xoffset=0 yoffset=0 xadvance=15 page=0 chnl=0 +char id=1149 x=272 y=308 width=16 height=22 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1150 x=288 y=308 width=20 height=22 xoffset=0 yoffset=0 xadvance=15 page=0 chnl=0 +char id=1151 x=308 y=308 width=16 height=22 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1152 x=324 y=308 width=14 height=22 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1153 x=338 y=308 width=12 height=22 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=1154 x=350 y=308 width=10 height=22 xoffset=0 yoffset=0 xadvance=5 page=0 chnl=0 +char id=1155 x=360 y=308 width=10 height=22 xoffset=-4 yoffset=0 xadvance=0 page=0 chnl=0 +char id=1156 x=370 y=308 width=11 height=22 xoffset=-5 yoffset=0 xadvance=0 page=0 chnl=0 +char id=1157 x=381 y=308 width=7 height=22 xoffset=-1 yoffset=0 xadvance=0 page=0 chnl=0 +char id=1158 x=388 y=308 width=7 height=22 xoffset=-1 yoffset=0 xadvance=0 page=0 chnl=0 +char id=1159 x=395 y=308 width=14 height=22 xoffset=-7 yoffset=0 xadvance=0 page=0 chnl=0 +char id=1160 x=409 y=308 width=19 height=22 xoffset=-12 yoffset=0 xadvance=0 page=0 chnl=0 +char id=1161 x=428 y=308 width=22 height=22 xoffset=-13 yoffset=0 xadvance=0 page=0 chnl=0 +char id=1162 x=450 y=308 width=17 height=22 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1163 x=467 y=308 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1164 x=480 y=308 width=15 height=22 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1165 x=495 y=308 width=12 height=22 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=1166 x=0 y=330 width=15 height=22 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1167 x=15 y=330 width=14 height=22 xoffset=-2 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1168 x=29 y=330 width=15 height=22 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1169 x=44 y=330 width=12 height=22 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=1170 x=56 y=330 width=15 height=22 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1171 x=71 y=330 width=12 height=22 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=1172 x=83 y=330 width=15 height=22 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1173 x=98 y=330 width=12 height=22 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=1174 x=110 y=330 width=21 height=22 xoffset=-1 yoffset=0 xadvance=16 page=0 chnl=0 +char id=1175 x=131 y=330 width=20 height=22 xoffset=0 yoffset=0 xadvance=15 page=0 chnl=0 +char id=1176 x=151 y=330 width=14 height=22 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1177 x=165 y=330 width=11 height=22 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=1178 x=176 y=330 width=16 height=22 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1179 x=192 y=330 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1180 x=205 y=330 width=16 height=22 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1181 x=221 y=330 width=14 height=22 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1182 x=235 y=330 width=16 height=22 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1183 x=251 y=330 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1184 x=264 y=330 width=17 height=22 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1185 x=281 y=330 width=16 height=22 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1186 x=297 y=330 width=17 height=22 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1187 x=314 y=330 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1188 x=327 y=330 width=20 height=22 xoffset=-1 yoffset=0 xadvance=15 page=0 chnl=0 +char id=1189 x=347 y=330 width=16 height=22 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1190 x=363 y=330 width=22 height=22 xoffset=0 yoffset=0 xadvance=17 page=0 chnl=0 +char id=1191 x=385 y=330 width=16 height=22 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1192 x=401 y=330 width=17 height=22 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1193 x=418 y=330 width=14 height=22 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1194 x=432 y=330 width=16 height=22 xoffset=1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1195 x=448 y=330 width=12 height=22 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=1196 x=460 y=330 width=15 height=22 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1197 x=475 y=330 width=17 height=22 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1198 x=492 y=330 width=15 height=22 xoffset=1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1199 x=0 y=352 width=14 height=22 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1200 x=14 y=352 width=15 height=22 xoffset=1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1201 x=29 y=352 width=14 height=22 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1202 x=43 y=352 width=16 height=22 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1203 x=59 y=352 width=12 height=22 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=1204 x=71 y=352 width=19 height=22 xoffset=0 yoffset=0 xadvance=13 page=0 chnl=0 +char id=1205 x=90 y=352 width=14 height=22 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1206 x=104 y=352 width=16 height=22 xoffset=1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1207 x=120 y=352 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1208 x=133 y=352 width=16 height=22 xoffset=1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1209 x=149 y=352 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1210 x=162 y=352 width=15 height=22 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1211 x=177 y=352 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1212 x=190 y=352 width=18 height=22 xoffset=0 yoffset=0 xadvance=13 page=0 chnl=0 +char id=1213 x=208 y=352 width=14 height=22 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1214 x=222 y=352 width=18 height=22 xoffset=0 yoffset=0 xadvance=13 page=0 chnl=0 +char id=1215 x=240 y=352 width=14 height=22 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1216 x=254 y=352 width=11 height=22 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=1217 x=265 y=352 width=21 height=22 xoffset=-1 yoffset=0 xadvance=16 page=0 chnl=0 +char id=1218 x=286 y=352 width=20 height=22 xoffset=0 yoffset=0 xadvance=15 page=0 chnl=0 +char id=1219 x=306 y=352 width=16 height=22 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1220 x=322 y=352 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1221 x=335 y=352 width=17 height=22 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1222 x=352 y=352 width=13 height=22 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1223 x=365 y=352 width=17 height=22 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1224 x=382 y=352 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1225 x=395 y=352 width=17 height=22 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1226 x=412 y=352 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1227 x=425 y=352 width=16 height=22 xoffset=1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1228 x=441 y=352 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1229 x=454 y=352 width=18 height=22 xoffset=-1 yoffset=0 xadvance=13 page=0 chnl=0 +char id=1230 x=472 y=352 width=15 height=22 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1231 x=487 y=352 width=11 height=22 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=1232 x=0 y=374 width=15 height=22 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1233 x=498 y=352 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1234 x=15 y=374 width=15 height=22 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1235 x=30 y=374 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1236 x=43 y=374 width=19 height=22 xoffset=-1 yoffset=0 xadvance=14 page=0 chnl=0 +char id=1237 x=62 y=374 width=16 height=22 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1238 x=78 y=374 width=15 height=22 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1239 x=93 y=374 width=13 height=22 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=1240 x=106 y=374 width=17 height=22 xoffset=1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1241 x=123 y=374 width=12 height=22 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=1242 x=135 y=374 width=17 height=22 xoffset=1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1243 x=152 y=374 width=12 height=22 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=1244 x=164 y=374 width=21 height=22 xoffset=-1 yoffset=0 xadvance=16 page=0 chnl=0 +char id=1245 x=185 y=374 width=20 height=22 xoffset=0 yoffset=0 xadvance=15 page=0 chnl=0 +char id=1246 x=205 y=374 width=14 height=22 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1247 x=219 y=374 width=11 height=22 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=1248 x=230 y=374 width=14 height=22 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1249 x=244 y=374 width=12 height=22 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=1250 x=256 y=374 width=17 height=22 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1251 x=273 y=374 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1252 x=286 y=374 width=17 height=22 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1253 x=303 y=374 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1254 x=316 y=374 width=17 height=22 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1255 x=333 y=374 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1256 x=346 y=374 width=17 height=22 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1257 x=363 y=374 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1258 x=376 y=374 width=17 height=22 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1259 x=393 y=374 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1260 x=406 y=374 width=15 height=22 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1261 x=421 y=374 width=12 height=22 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=1262 x=433 y=374 width=17 height=22 xoffset=1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1263 x=450 y=374 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1264 x=463 y=374 width=17 height=22 xoffset=1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1265 x=480 y=374 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1266 x=493 y=374 width=17 height=22 xoffset=1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1267 x=0 y=396 width=14 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1268 x=14 y=396 width=16 height=22 xoffset=1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1269 x=30 y=396 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1270 x=43 y=396 width=15 height=22 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1271 x=58 y=396 width=12 height=22 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=1272 x=70 y=396 width=19 height=22 xoffset=-1 yoffset=0 xadvance=14 page=0 chnl=0 +char id=1273 x=89 y=396 width=16 height=22 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1296 x=105 y=396 width=14 height=22 xoffset=1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1297 x=119 y=396 width=12 height=22 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=1298 x=131 y=396 width=17 height=22 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1299 x=148 y=396 width=13 height=22 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1306 x=161 y=396 width=17 height=22 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1307 x=178 y=396 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1308 x=191 y=396 width=19 height=22 xoffset=1 yoffset=0 xadvance=13 page=0 chnl=0 +char id=1309 x=210 y=396 width=16 height=22 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1310 x=226 y=396 width=16 height=22 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1311 x=242 y=396 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=8192 x=0 y=0 width=0 height=0 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=8193 x=0 y=0 width=0 height=0 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=0 +char id=8194 x=0 y=0 width=0 height=0 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=8195 x=0 y=0 width=0 height=0 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=0 +char id=8196 x=0 y=0 width=0 height=0 xoffset=0 yoffset=0 xadvance=5 page=0 chnl=0 +char id=8197 x=0 y=0 width=0 height=0 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=0 +char id=8198 x=0 y=0 width=0 height=0 xoffset=0 yoffset=0 xadvance=3 page=0 chnl=0 +char id=8199 x=0 y=0 width=0 height=0 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=8200 x=0 y=0 width=0 height=0 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=0 +char id=8201 x=0 y=0 width=0 height=0 xoffset=0 yoffset=0 xadvance=3 page=0 chnl=0 +char id=8202 x=0 y=0 width=0 height=0 xoffset=0 yoffset=0 xadvance=2 page=0 chnl=0 +char id=8203 x=0 y=0 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=0 +char id=8204 x=0 y=0 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=0 +char id=8210 x=255 y=396 width=14 height=22 xoffset=1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=8211 x=269 y=396 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=8212 x=282 y=396 width=21 height=22 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=0 +char id=8213 x=303 y=396 width=22 height=22 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=0 +char id=8214 x=325 y=396 width=10 height=22 xoffset=0 yoffset=0 xadvance=5 page=0 chnl=0 +char id=8215 x=335 y=396 width=12 height=22 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=8216 x=347 y=396 width=9 height=22 xoffset=2 yoffset=0 xadvance=4 page=0 chnl=0 +char id=8217 x=356 y=396 width=9 height=22 xoffset=2 yoffset=0 xadvance=4 page=0 chnl=0 +char id=8218 x=365 y=396 width=9 height=22 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=0 +char id=8219 x=374 y=396 width=9 height=22 xoffset=2 yoffset=0 xadvance=4 page=0 chnl=0 +char id=8220 x=383 y=396 width=12 height=22 xoffset=2 yoffset=0 xadvance=7 page=0 chnl=0 +char id=8221 x=395 y=396 width=13 height=22 xoffset=3 yoffset=0 xadvance=7 page=0 chnl=0 +char id=8222 x=408 y=396 width=12 height=22 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=8223 x=420 y=396 width=13 height=22 xoffset=3 yoffset=0 xadvance=7 page=0 chnl=0 +char id=8224 x=433 y=396 width=13 height=22 xoffset=1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=8225 x=446 y=396 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=8226 x=459 y=396 width=11 height=22 xoffset=1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=8230 x=470 y=396 width=19 height=22 xoffset=0 yoffset=0 xadvance=14 page=0 chnl=0 +char id=8239 x=0 y=0 width=0 height=0 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=0 +char id=8240 x=489 y=396 width=21 height=22 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=0 +char id=8242 x=0 y=418 width=10 height=22 xoffset=2 yoffset=0 xadvance=4 page=0 chnl=0 +char id=8243 x=10 y=418 width=13 height=22 xoffset=2 yoffset=0 xadvance=7 page=0 chnl=0 +char id=8244 x=23 y=418 width=16 height=22 xoffset=2 yoffset=0 xadvance=10 page=0 chnl=0 +char id=8249 x=39 y=418 width=9 height=22 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=0 +char id=8250 x=48 y=418 width=9 height=22 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=0 +char id=8252 x=57 y=418 width=16 height=22 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=0 +char id=8254 x=73 y=418 width=15 height=22 xoffset=2 yoffset=0 xadvance=8 page=0 chnl=0 +char id=8260 x=88 y=418 width=15 height=22 xoffset=-3 yoffset=0 xadvance=3 page=0 chnl=0 +char id=8286 x=103 y=418 width=9 height=22 xoffset=0 yoffset=0 xadvance=3 page=0 chnl=0 +char id=8352 x=112 y=418 width=16 height=22 xoffset=2 yoffset=0 xadvance=11 page=0 chnl=0 +char id=8353 x=128 y=418 width=17 height=22 xoffset=1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=8354 x=145 y=418 width=16 height=22 xoffset=1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=8355 x=161 y=418 width=15 height=22 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=0 +char id=8356 x=176 y=418 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=8357 x=189 y=418 width=17 height=22 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=8358 x=206 y=418 width=16 height=22 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=8359 x=222 y=418 width=21 height=22 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=0 +char id=8360 x=243 y=418 width=20 height=22 xoffset=-1 yoffset=0 xadvance=15 page=0 chnl=0 +char id=8361 x=263 y=418 width=19 height=22 xoffset=0 yoffset=0 xadvance=13 page=0 chnl=0 +char id=8363 x=282 y=418 width=15 height=22 xoffset=1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=8364 x=297 y=418 width=18 height=22 xoffset=1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=8365 x=315 y=418 width=17 height=22 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=8366 x=332 y=418 width=16 height=22 xoffset=1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=8367 x=348 y=418 width=26 height=22 xoffset=0 yoffset=0 xadvance=21 page=0 chnl=0 +char id=8368 x=374 y=418 width=13 height=22 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=8369 x=387 y=418 width=15 height=22 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=8370 x=402 y=418 width=15 height=22 xoffset=1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=8371 x=417 y=418 width=17 height=22 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=8372 x=434 y=418 width=14 height=22 xoffset=1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=8373 x=448 y=418 width=15 height=22 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=0 +kernings count=17372 +kerning first=1051 second=1052 amount=-1 +kerning first=1049 second=1107 amount=-1 +kerning first=354 second=233 amount=-1 +kerning first=8249 second=217 amount=-1 +kerning first=66 second=79 amount=-1 +kerning first=284 second=44 amount=-1 +kerning first=109 second=45 amount=-1 +kerning first=197 second=46 amount=-1 +kerning first=280 second=288 amount=-1 +kerning first=375 second=291 amount=-1 +kerning first=339 second=291 amount=-1 +kerning first=211 second=65 amount=-1 +kerning first=72 second=66 amount=-1 +kerning first=327 second=67 amount=-1 +kerning first=205 second=68 amount=-1 +kerning first=202 second=70 amount=-1 +kerning first=8217 second=71 amount=-1 +kerning first=217 second=72 amount=-1 +kerning first=370 second=73 amount=-1 +kerning first=219 second=74 amount=-1 +kerning first=71 second=75 amount=-1 +kerning first=83 second=76 amount=-1 +kerning first=79 second=77 amount=-1 +kerning first=286 second=78 amount=-1 +kerning first=330 second=80 amount=-1 +kerning first=310 second=81 amount=-1 +kerning first=266 second=82 amount=-1 +kerning first=268 second=83 amount=-1 +kerning first=214 second=84 amount=-1 +kerning first=8222 second=85 amount=-1 +kerning first=231 second=291 amount=-1 +kerning first=80 second=87 amount=-1 +kerning first=79 second=89 amount=-1 +kerning first=45 second=90 amount=-1 +kerning first=99 second=97 amount=-1 +kerning first=70 second=98 amount=-1 +kerning first=277 second=100 amount=-1 +kerning first=117 second=101 amount=-1 +kerning first=217 second=102 amount=-1 +kerning first=234 second=103 amount=-1 +kerning first=8218 second=104 amount=-1 +kerning first=88 second=105 amount=-1 +kerning first=337 second=106 amount=-1 +kerning first=234 second=107 amount=-1 +kerning first=1041 second=1046 amount=-1 +kerning first=325 second=109 amount=-1 +kerning first=77 second=110 amount=-1 +kerning first=234 second=111 amount=-1 +kerning first=99 second=112 amount=-1 +kerning first=109 second=113 amount=-1 +kerning first=279 second=114 amount=-1 +kerning first=262 second=115 amount=-1 +kerning first=8250 second=116 amount=-1 +kerning first=119 second=117 amount=-1 +kerning first=88 second=118 amount=-1 +kerning first=8250 second=119 amount=-1 +kerning first=255 second=120 amount=-1 +kerning first=192 second=121 amount=-1 +kerning first=66 second=122 amount=-1 +kerning first=336 second=8218 amount=-1 +kerning first=1067 second=1079 amount=-1 +kerning first=8220 second=65 amount=-2 +kerning first=325 second=81 amount=-1 +kerning first=1064 second=1049 amount=-1 +kerning first=351 second=171 amount=-1 +kerning first=209 second=187 amount=-1 +kerning first=287 second=8221 amount=-2 +kerning first=8220 second=192 amount=-2 +kerning first=45 second=193 amount=-1 +kerning first=68 second=194 amount=-1 +kerning first=220 second=196 amount=-1 +kerning first=8217 second=197 amount=-2 +kerning first=87 second=198 amount=-1 +kerning first=266 second=199 amount=-1 +kerning first=205 second=200 amount=-1 +kerning first=71 second=201 amount=-1 +kerning first=209 second=202 amount=-1 +kerning first=67 second=203 amount=-1 +kerning first=268 second=204 amount=-1 +kerning first=325 second=205 amount=-1 +kerning first=213 second=206 amount=-1 +kerning first=207 second=207 amount=-1 +kerning first=81 second=209 amount=-1 +kerning first=8217 second=210 amount=-1 +kerning first=8218 second=211 amount=-1 +kerning first=199 second=212 amount=-1 +kerning first=8222 second=213 amount=-1 +kerning first=338 second=214 amount=-1 +kerning first=205 second=216 amount=-1 +kerning first=323 second=217 amount=-1 +kerning first=80 second=218 amount=-1 +kerning first=207 second=219 amount=-1 +kerning first=45 second=220 amount=-1 +kerning first=194 second=223 amount=-1 +kerning first=323 second=224 amount=-1 +kerning first=99 second=225 amount=-1 +kerning first=74 second=226 amount=-1 +kerning first=89 second=227 amount=-1 +kerning first=99 second=228 amount=-1 +kerning first=8217 second=229 amount=-1 +kerning first=314 second=231 amount=-1 +kerning first=206 second=234 amount=-1 +kerning first=264 second=8218 amount=-1 +kerning first=8217 second=241 amount=-1 +kerning first=266 second=242 amount=-1 +kerning first=264 second=243 amount=-1 +kerning first=73 second=244 amount=-1 +kerning first=103 second=245 amount=-1 +kerning first=251 second=246 amount=-1 +kerning first=325 second=248 amount=-1 +kerning first=198 second=249 amount=-1 +kerning first=197 second=250 amount=-1 +kerning first=66 second=251 amount=-1 +kerning first=193 second=252 amount=-1 +kerning first=193 second=253 amount=-1 +kerning first=197 second=254 amount=-1 +kerning first=194 second=255 amount=-1 +kerning first=68 second=258 amount=-1 +kerning first=8216 second=260 amount=-2 +kerning first=354 second=261 amount=-1 +kerning first=187 second=377 amount=-1 +kerning first=356 second=263 amount=-1 +kerning first=274 second=264 amount=-1 +kerning first=99 second=267 amount=-1 +kerning first=8250 second=268 amount=-1 +kerning first=8217 second=269 amount=-1 +kerning first=80 second=270 amount=-1 +kerning first=8217 second=271 amount=-1 +kerning first=304 second=273 amount=-1 +kerning first=198 second=274 amount=-1 +kerning first=369 second=275 amount=-1 +kerning first=354 second=277 amount=-1 +kerning first=45 second=278 amount=-1 +kerning first=117 second=279 amount=-1 +kerning first=220 second=280 amount=-1 +kerning first=231 second=281 amount=-1 +kerning first=325 second=282 amount=-1 +kerning first=267 second=283 amount=-1 +kerning first=209 second=284 amount=-1 +kerning first=335 second=287 amount=-1 +kerning first=202 second=268 amount=-1 +kerning first=333 second=289 amount=-1 +kerning first=219 second=290 amount=-1 +kerning first=1062 second=1104 amount=-1 +kerning first=355 second=279 amount=-1 +kerning first=278 second=296 amount=-1 +kerning first=213 second=298 amount=-1 +kerning first=68 second=187 amount=-1 +kerning first=217 second=302 amount=-1 +kerning first=197 second=303 amount=-1 +kerning first=206 second=304 amount=-1 +kerning first=269 second=305 amount=-1 +kerning first=287 second=307 amount=-1 +kerning first=296 second=310 amount=-1 +kerning first=281 second=311 amount=-1 +kerning first=78 second=313 amount=-1 +kerning first=234 second=314 amount=-1 +kerning first=199 second=315 amount=-1 +kerning first=74 second=317 amount=-1 +kerning first=283 second=318 amount=-1 +kerning first=302 second=323 amount=-1 +kerning first=289 second=324 amount=-1 +kerning first=330 second=325 amount=-1 +kerning first=269 second=326 amount=-1 +kerning first=270 second=327 amount=-1 +kerning first=263 second=328 amount=-1 +kerning first=74 second=316 amount=-1 +kerning first=323 second=330 amount=-1 +kerning first=72 second=331 amount=-1 +kerning first=327 second=332 amount=-1 +kerning first=89 second=333 amount=-1 +kerning first=221 second=334 amount=-1 +kerning first=84 second=335 amount=-1 +kerning first=198 second=336 amount=-1 +kerning first=199 second=337 amount=-1 +kerning first=366 second=338 amount=-1 +kerning first=225 second=339 amount=-1 +kerning first=78 second=206 amount=-1 +kerning first=210 second=66 amount=-1 +kerning first=82 second=364 amount=-1 +kerning first=350 second=344 amount=-1 +kerning first=100 second=345 amount=-1 +kerning first=220 second=346 amount=-1 +kerning first=87 second=347 amount=-1 +kerning first=204 second=264 amount=-1 +kerning first=268 second=350 amount=-1 +kerning first=272 second=351 amount=-1 +kerning first=317 second=354 amount=-1 +kerning first=325 second=355 amount=-1 +kerning first=81 second=356 amount=-1 +kerning first=204 second=357 amount=-1 +kerning first=324 second=283 amount=-1 +kerning first=346 second=361 amount=-1 +kerning first=298 second=362 amount=-1 +kerning first=264 second=364 amount=-1 +kerning first=244 second=108 amount=-1 +kerning first=8220 second=366 amount=-1 +kerning first=195 second=367 amount=-1 +kerning first=282 second=187 amount=-1 +kerning first=231 second=369 amount=-1 +kerning first=284 second=370 amount=-1 +kerning first=364 second=371 amount=-1 +kerning first=103 second=108 amount=-1 +kerning first=76 second=374 amount=-1 +kerning first=192 second=375 amount=-1 +kerning first=325 second=261 amount=-1 +kerning first=45 second=377 amount=-1 +kerning first=266 second=378 amount=-1 +kerning first=205 second=380 amount=-1 +kerning first=282 second=367 amount=-1 +kerning first=225 second=382 amount=-1 +kerning first=219 second=193 amount=-1 +kerning first=298 second=368 amount=-1 +kerning first=73 second=257 amount=-1 +kerning first=69 second=367 amount=-1 +kerning first=246 second=380 amount=-1 +kerning first=1067 second=1027 amount=-1 +kerning first=354 second=380 amount=-1 +kerning first=68 second=200 amount=-1 +kerning first=8250 second=325 amount=-1 +kerning first=356 second=245 amount=-1 +kerning first=203 second=205 amount=-1 +kerning first=286 second=270 amount=-1 +kerning first=316 second=108 amount=-1 +kerning first=81 second=197 amount=-1 +kerning first=70 second=99 amount=-1 +kerning first=45 second=197 amount=-1 +kerning first=1054 second=1030 amount=-1 +kerning first=262 second=368 amount=-1 +kerning first=350 second=209 amount=-1 +kerning first=338 second=78 amount=-1 +kerning first=355 second=8221 amount=-1 +kerning first=213 second=44 amount=-1 +kerning first=302 second=78 amount=-1 +kerning first=298 second=355 amount=-1 +kerning first=220 second=252 amount=-1 +kerning first=344 second=214 amount=-1 +kerning first=262 second=355 amount=-1 +kerning first=1054 second=1043 amount=-1 +kerning first=307 second=8222 amount=-1 +kerning first=1030 second=1071 amount=-1 +kerning first=1046 second=1116 amount=-1 +kerning first=8250 second=250 amount=-1 +kerning first=71 second=325 amount=-1 +kerning first=364 second=252 amount=-1 +kerning first=366 second=197 amount=-1 +kerning first=266 second=78 amount=-1 +kerning first=85 second=355 amount=-1 +kerning first=212 second=325 amount=-1 +kerning first=366 second=8249 amount=-2 +kerning first=217 second=248 amount=-1 +kerning first=277 second=117 amount=-1 +kerning first=75 second=8250 amount=-1 +kerning first=1118 second=1116 amount=-1 +kerning first=270 second=282 amount=-1 +kerning first=1051 second=1039 amount=-1 +kerning first=1091 second=1096 amount=-1 +kerning first=72 second=44 amount=-1 +kerning first=200 second=214 amount=-1 +kerning first=121 second=367 amount=-1 +kerning first=8218 second=363 amount=-1 +kerning first=370 second=355 amount=-1 +kerning first=203 second=218 amount=-1 +kerning first=68 second=347 amount=-1 +kerning first=1046 second=1059 amount=-1 +kerning first=69 second=220 amount=-1 +kerning first=304 second=350 amount=-1 +kerning first=1038 second=1072 amount=-1 +kerning first=1041 second=1059 amount=-1 +kerning first=229 second=333 amount=-1 +kerning first=73 second=77 amount=-1 +kerning first=1118 second=1103 amount=-1 +kerning first=274 second=214 amount=-1 +kerning first=112 second=382 amount=-1 +kerning first=81 second=362 amount=-1 +kerning first=354 second=246 amount=-1 +kerning first=1054 second=1056 amount=-1 +kerning first=217 second=382 amount=-1 +kerning first=119 second=289 amount=-1 +kerning first=1048 second=1048 amount=-1 +kerning first=86 second=100 amount=-1 +kerning first=250 second=103 amount=-1 +kerning first=284 second=327 amount=-1 +kerning first=350 second=330 amount=-1 +kerning first=224 second=289 amount=-1 +kerning first=282 second=77 amount=-1 +kerning first=1051 second=1065 amount=-1 +kerning first=258 second=171 amount=-1 +kerning first=1049 second=1094 amount=-1 +kerning first=109 second=103 amount=-1 +kerning first=286 second=77 amount=-1 +kerning first=105 second=246 amount=-1 +kerning first=65 second=356 amount=-1 +kerning first=1062 second=1091 amount=-1 +kerning first=326 second=281 amount=-1 +kerning first=210 second=220 amount=-1 +kerning first=214 second=77 amount=-1 +kerning first=366 second=171 amount=-2 +kerning first=362 second=281 amount=-1 +kerning first=244 second=378 amount=-1 +kerning first=296 second=109 amount=-1 +kerning first=87 second=120 amount=-1 +kerning first=220 second=85 amount=-1 +kerning first=66 second=44 amount=-1 +kerning first=79 second=85 amount=-1 +kerning first=298 second=72 amount=-1 +kerning first=72 second=211 amount=-1 +kerning first=264 second=120 amount=-1 +kerning first=1038 second=1079 amount=-1 +kerning first=77 second=281 amount=-1 +kerning first=253 second=382 amount=-1 +kerning first=275 second=339 amount=-1 +kerning first=202 second=332 amount=-1 +kerning first=289 second=382 amount=-1 +kerning first=231 second=275 amount=-1 +kerning first=325 second=382 amount=-1 +kerning first=74 second=290 amount=-1 +kerning first=1060 second=1025 amount=-1 +kerning first=268 second=339 amount=-1 +kerning first=8250 second=374 amount=-2 +kerning first=281 second=347 amount=-1 +kerning first=310 second=332 amount=-1 +kerning first=1048 second=1074 amount=-1 +kerning first=1071 second=1051 amount=-1 +kerning first=274 second=332 amount=-1 +kerning first=209 second=347 amount=-1 +kerning first=1065 second=1108 amount=-1 +kerning first=264 second=313 amount=-1 +kerning first=1091 second=1076 amount=-1 +kerning first=267 second=111 amount=-1 +kerning first=310 second=8250 amount=-1 +kerning first=263 second=254 amount=-1 +kerning first=279 second=337 amount=-1 +kerning first=274 second=8250 amount=-1 +kerning first=233 second=357 amount=-1 +kerning first=205 second=113 amount=-1 +kerning first=302 second=271 amount=-1 +kerning first=370 second=195 amount=-1 +kerning first=266 second=271 amount=-1 +kerning first=1055 second=1076 amount=-1 +kerning first=334 second=195 amount=-1 +kerning first=202 second=8250 amount=-1 +kerning first=327 second=219 amount=-1 +kerning first=205 second=323 amount=-1 +kerning first=374 second=271 amount=-1 +kerning first=219 second=219 amount=-1 +kerning first=1047 second=1041 amount=-1 +kerning first=97 second=8250 amount=-1 +kerning first=1053 second=1118 amount=-1 +kerning first=197 second=357 amount=-1 +kerning first=8216 second=368 amount=-1 +kerning first=187 second=76 amount=-1 +kerning first=269 second=107 amount=-1 +kerning first=221 second=211 amount=-1 +kerning first=1059 second=1071 amount=-1 +kerning first=248 second=8217 amount=-2 +kerning first=193 second=212 amount=-1 +kerning first=284 second=8217 amount=-1 +kerning first=78 second=219 amount=-1 +kerning first=356 second=8217 amount=-1 +kerning first=1039 second=1075 amount=-1 +kerning first=71 second=8217 amount=-1 +kerning first=364 second=85 amount=-1 +kerning first=1067 second=1107 amount=-1 +kerning first=107 second=8217 amount=-1 +kerning first=197 second=262 amount=-1 +kerning first=202 second=310 amount=-1 +kerning first=88 second=212 amount=-1 +kerning first=231 second=111 amount=-1 +kerning first=194 second=366 amount=-1 +kerning first=217 second=68 amount=-1 +kerning first=330 second=331 amount=-1 +kerning first=278 second=8250 amount=-1 +kerning first=325 second=68 amount=-1 +kerning first=366 second=331 amount=-1 +kerning first=67 second=314 amount=-1 +kerning first=224 second=263 amount=-1 +kerning first=275 second=365 amount=-1 +kerning first=1041 second=1025 amount=-1 +kerning first=1033 second=1027 amount=-1 +kerning first=1040 second=1028 amount=-1 +kerning first=1049 second=1030 amount=-1 +kerning first=1041 second=1031 amount=-1 +kerning first=1041 second=1034 amount=-1 +kerning first=316 second=314 amount=-1 +kerning first=1041 second=1036 amount=-1 +kerning first=296 second=263 amount=-1 +kerning first=1068 second=1038 amount=-2 +kerning first=1055 second=1039 amount=-1 +kerning first=1056 second=1040 amount=-1 +kerning first=1049 second=1041 amount=-1 +kerning first=1060 second=1042 amount=-1 +kerning first=1030 second=1043 amount=-1 +kerning first=1033 second=1044 amount=-1 +kerning first=1041 second=1045 amount=-1 +kerning first=1048 second=1047 amount=-1 +kerning first=1033 second=1048 amount=-1 +kerning first=1069 second=1049 amount=-1 +kerning first=1041 second=1050 amount=-1 +kerning first=1052 second=1051 amount=-1 +kerning first=1067 second=1052 amount=-1 +kerning first=1051 second=1053 amount=-1 +kerning first=1059 second=1054 amount=-1 +kerning first=1051 second=1055 amount=-1 +kerning first=1053 second=1056 amount=-1 +kerning first=1052 second=1057 amount=-1 +kerning first=304 second=203 amount=-1 +kerning first=1040 second=1060 amount=-1 +kerning first=1041 second=1061 amount=-1 +kerning first=1068 second=1062 amount=-1 +kerning first=1066 second=1063 amount=-2 +kerning first=1070 second=1064 amount=-1 +kerning first=1030 second=1065 amount=-1 +kerning first=262 second=67 amount=-1 +kerning first=1051 second=1068 amount=-1 +kerning first=85 second=195 amount=-1 +kerning first=1049 second=1070 amount=-1 +kerning first=1041 second=1071 amount=-1 +kerning first=1056 second=1072 amount=-1 +kerning first=1031 second=1073 amount=-1 +kerning first=1027 second=1074 amount=-1 +kerning first=8250 second=70 amount=-1 +kerning first=1105 second=1076 amount=-1 +kerning first=1027 second=1077 amount=-1 +kerning first=1104 second=1078 amount=-1 +kerning first=1118 second=1079 amount=-1 +kerning first=1040 second=1080 amount=-1 +kerning first=1041 second=1081 amount=-1 +kerning first=1118 second=1082 amount=-1 +kerning first=1051 second=1083 amount=-1 +kerning first=1056 second=1084 amount=-1 +kerning first=1041 second=1085 amount=-1 +kerning first=1071 second=1086 amount=-1 +kerning first=1050 second=1087 amount=-1 +kerning first=1071 second=1089 amount=-1 +kerning first=1041 second=1090 amount=-1 +kerning first=1057 second=1091 amount=-1 +kerning first=8218 second=307 amount=-1 +kerning first=1077 second=1093 amount=-1 +kerning first=1071 second=1094 amount=-1 +kerning first=1076 second=1095 amount=-1 +kerning first=1059 second=1096 amount=-1 +kerning first=1040 second=1097 amount=-1 +kerning first=1052 second=1098 amount=-1 +kerning first=1048 second=1099 amount=-1 +kerning first=1071 second=1100 amount=-1 +kerning first=1044 second=1101 amount=-1 +kerning first=1118 second=1102 amount=-1 +kerning first=1091 second=1103 amount=-1 +kerning first=1027 second=1104 amount=-1 +kerning first=207 second=229 amount=-1 +kerning first=1027 second=1107 amount=-1 +kerning first=1049 second=1108 amount=-1 +kerning first=266 second=366 amount=-1 +kerning first=1076 second=1113 amount=-1 +kerning first=89 second=271 amount=-1 +kerning first=268 second=203 amount=-1 +kerning first=344 second=374 amount=-1 +kerning first=1076 second=1117 amount=-1 +kerning first=1105 second=1118 amount=-1 +kerning first=1040 second=1119 amount=-1 +kerning first=194 second=104 amount=-1 +kerning first=230 second=104 amount=-1 +kerning first=256 second=46 amount=-1 +kerning first=87 second=192 amount=-1 +kerning first=296 second=70 amount=-1 +kerning first=73 second=378 amount=-1 +kerning first=68 second=46 amount=-1 +kerning first=207 second=101 amount=-1 +kerning first=209 second=46 amount=-1 +kerning first=83 second=70 amount=-1 +kerning first=279 second=101 amount=-1 +kerning first=281 second=46 amount=-1 +kerning first=270 second=76 amount=-1 +kerning first=1064 second=1075 amount=-1 +kerning first=67 second=262 amount=-1 +kerning first=69 second=207 amount=-1 +kerning first=8218 second=261 amount=-1 +kerning first=198 second=76 amount=-1 +kerning first=280 second=262 amount=-1 +kerning first=207 second=286 amount=-1 +kerning first=73 second=296 amount=-1 +kerning first=201 second=8217 amount=-1 +kerning first=66 second=216 amount=-1 +kerning first=368 second=70 amount=-1 +kerning first=1059 second=1087 amount=-1 +kerning first=258 second=357 amount=-1 +kerning first=286 second=296 amount=-1 +kerning first=266 second=104 amount=-1 +kerning first=366 second=357 amount=-1 +kerning first=97 second=345 amount=-1 +kerning first=214 second=296 amount=-1 +kerning first=212 second=204 amount=-1 +kerning first=196 second=311 amount=-1 +kerning first=232 second=311 amount=-1 +kerning first=202 second=345 amount=-1 +kerning first=78 second=366 amount=-1 +kerning first=253 second=369 amount=-1 +kerning first=8250 second=262 amount=-1 +kerning first=274 second=280 amount=-1 +kerning first=274 second=345 amount=-1 +kerning first=217 second=369 amount=-1 +kerning first=368 second=122 amount=-1 +kerning first=366 second=210 amount=-1 +kerning first=354 second=259 amount=-1 +kerning first=8217 second=100 amount=-1 +kerning first=310 second=345 amount=-1 +kerning first=70 second=8218 amount=-2 +kerning first=213 second=198 amount=-1 +kerning first=346 second=280 amount=-1 +kerning first=346 second=345 amount=-1 +kerning first=112 second=287 amount=-1 +kerning first=1053 second=1105 amount=-1 +kerning first=296 second=122 amount=-1 +kerning first=284 second=204 amount=-1 +kerning first=221 second=225 amount=-1 +kerning first=330 second=210 amount=-1 +kerning first=8250 second=109 amount=-1 +kerning first=1056 second=1096 amount=-1 +kerning first=210 second=207 amount=-1 +kerning first=66 second=210 amount=-1 +kerning first=258 second=210 amount=-1 +kerning first=65 second=318 amount=-1 +kerning first=289 second=287 amount=-1 +kerning first=263 second=113 amount=-1 +kerning first=282 second=207 amount=-1 +kerning first=253 second=287 amount=-1 +kerning first=268 second=283 amount=-1 +kerning first=1030 second=1113 amount=-1 +kerning first=327 second=366 amount=-1 +kerning first=45 second=210 amount=-1 +kerning first=1038 second=1114 amount=-1 +kerning first=201 second=67 amount=-1 +kerning first=219 second=366 amount=-1 +kerning first=227 second=113 amount=-1 +kerning first=252 second=337 amount=-1 +kerning first=205 second=336 amount=-1 +kerning first=270 second=256 amount=-1 +kerning first=8218 second=279 amount=-1 +kerning first=74 second=195 amount=-1 +kerning first=346 second=8250 amount=-1 +kerning first=279 second=281 amount=-1 +kerning first=109 second=244 amount=-1 +kerning first=79 second=278 amount=-1 +kerning first=200 second=73 amount=-1 +kerning first=220 second=347 amount=-1 +kerning first=272 second=73 amount=-1 +kerning first=207 second=268 amount=-1 +kerning first=1048 second=1108 amount=-1 +kerning first=235 second=8220 amount=-2 +kerning first=344 second=86 amount=-1 +kerning first=79 second=347 amount=-1 +kerning first=220 second=278 amount=-1 +kerning first=323 second=97 amount=-1 +kerning first=307 second=8220 amount=-1 +kerning first=272 second=86 amount=-1 +kerning first=66 second=268 amount=-1 +kerning first=271 second=8220 amount=-1 +kerning first=204 second=277 amount=-1 +kerning first=281 second=365 amount=-1 +kerning first=364 second=278 amount=-1 +kerning first=99 second=277 amount=-1 +kerning first=364 second=323 amount=-1 +kerning first=1030 second=1099 amount=-1 +kerning first=250 second=267 amount=-1 +kerning first=203 second=77 amount=-1 +kerning first=8250 second=122 amount=-1 +kerning first=217 second=235 amount=-1 +kerning first=207 second=281 amount=-1 +kerning first=240 second=277 amount=-1 +kerning first=369 second=283 amount=-1 +kerning first=259 second=269 amount=-1 +kerning first=80 second=79 amount=-1 +kerning first=70 second=253 amount=-1 +kerning first=8217 second=267 amount=-1 +kerning first=1038 second=1081 amount=-1 +kerning first=225 second=283 amount=-1 +kerning first=103 second=246 amount=-1 +kerning first=275 second=231 amount=-1 +kerning first=261 second=283 amount=-1 +kerning first=84 second=380 amount=-1 +kerning first=219 second=65 amount=-1 +kerning first=187 second=338 amount=-1 +kerning first=367 second=269 amount=-1 +kerning first=85 second=260 amount=-1 +kerning first=379 second=8220 amount=-1 +kerning first=82 second=338 amount=-1 +kerning first=196 second=363 amount=-1 +kerning first=8250 second=290 amount=-1 +kerning first=232 second=363 amount=-1 +kerning first=201 second=286 amount=-1 +kerning first=327 second=72 amount=-1 +kerning first=364 second=347 amount=-1 +kerning first=334 second=8250 amount=-1 +kerning first=235 second=367 amount=-1 +kerning first=264 second=261 amount=-1 +kerning first=67 second=275 amount=-1 +kerning first=85 second=85 amount=-1 +kerning first=207 second=114 amount=-1 +kerning first=1036 second=1097 amount=-1 +kerning first=334 second=260 amount=-1 +kerning first=201 second=80 amount=-1 +kerning first=370 second=260 amount=-1 +kerning first=375 second=8222 amount=-1 +kerning first=264 second=82 amount=-1 +kerning first=103 second=275 amount=-1 +kerning first=82 second=217 amount=-1 +kerning first=66 second=114 amount=-1 +kerning first=334 second=368 amount=-1 +kerning first=81 second=344 amount=-1 +kerning first=88 second=251 amount=-1 +kerning first=267 second=8222 amount=-1 +kerning first=231 second=8222 amount=-1 +kerning first=68 second=115 amount=-1 +kerning first=8220 second=193 amount=-2 +kerning first=78 second=353 amount=-1 +kerning first=288 second=310 amount=-1 +kerning first=1051 second=1070 amount=-1 +kerning first=193 second=251 amount=-1 +kerning first=264 second=205 amount=-1 +kerning first=281 second=115 amount=-1 +kerning first=263 second=244 amount=-1 +kerning first=219 second=353 amount=-1 +kerning first=1056 second=1027 amount=-1 +kerning first=89 second=258 amount=-1 +kerning first=205 second=284 amount=-1 +kerning first=1031 second=1053 amount=-1 +kerning first=291 second=353 amount=-1 +kerning first=1067 second=1053 amount=-1 +kerning first=200 second=81 amount=-1 +kerning first=289 second=235 amount=-1 +kerning first=375 second=252 amount=-1 +kerning first=325 second=235 amount=-1 +kerning first=197 second=249 amount=-1 +kerning first=1055 second=1037 amount=-1 +kerning first=233 second=249 amount=-1 +kerning first=288 second=362 amount=-1 +kerning first=1030 second=1092 amount=-1 +kerning first=232 second=242 amount=-1 +kerning first=316 second=380 amount=-1 +kerning first=268 second=242 amount=-1 +kerning first=8218 second=107 amount=-1 +kerning first=8222 second=311 amount=-1 +kerning first=1027 second=1116 amount=-1 +kerning first=248 second=106 amount=-1 +kerning first=209 second=200 amount=-1 +kerning first=74 second=97 amount=-1 +kerning first=304 second=242 amount=-1 +kerning first=366 second=223 amount=-1 +kerning first=330 second=223 amount=-1 +kerning first=1034 second=1044 amount=-1 +kerning first=324 second=248 amount=-1 +kerning first=269 second=249 amount=-1 +kerning first=75 second=362 amount=-1 +kerning first=231 second=252 amount=-1 +kerning first=339 second=252 amount=-1 +kerning first=204 second=71 amount=-1 +kerning first=364 second=226 amount=-1 +kerning first=316 second=275 amount=-1 +kerning first=71 second=270 amount=-1 +kerning first=235 second=233 amount=-1 +kerning first=370 second=67 amount=-1 +kerning first=271 second=233 amount=-1 +kerning first=45 second=223 amount=-1 +kerning first=70 second=364 amount=-1 +kerning first=199 second=233 amount=-1 +kerning first=199 second=302 amount=-1 +kerning first=258 second=223 amount=-1 +kerning first=115 second=291 amount=-1 +kerning first=307 second=233 amount=-1 +kerning first=67 second=327 amount=-1 +kerning first=200 second=361 amount=-1 +kerning first=250 second=101 amount=-1 +kerning first=1048 second=1113 amount=-1 +kerning first=224 second=122 amount=-1 +kerning first=369 second=335 amount=-1 +kerning first=234 second=243 amount=-1 +kerning first=327 second=232 amount=-1 +kerning first=291 second=232 amount=-1 +kerning first=119 second=122 amount=-1 +kerning first=1101 second=1083 amount=-1 +kerning first=209 second=8217 amount=-1 +kerning first=218 second=284 amount=-1 +kerning first=219 second=232 amount=-1 +kerning first=1058 second=1080 amount=-1 +kerning first=110 second=8221 amount=-2 +kerning first=280 second=327 amount=-1 +kerning first=255 second=187 amount=-1 +kerning first=8218 second=382 amount=-1 +kerning first=264 second=107 amount=-1 +kerning first=352 second=327 amount=-1 +kerning first=268 second=311 amount=-1 +kerning first=251 second=8221 amount=-1 +kerning first=363 second=232 amount=-1 +kerning first=207 second=337 amount=-1 +kerning first=1048 second=1094 amount=-1 +kerning first=338 second=250 amount=-1 +kerning first=1051 second=1077 amount=-1 +kerning first=204 second=225 amount=-1 +kerning first=45 second=211 amount=-1 +kerning first=8222 second=363 amount=-1 +kerning first=70 second=318 amount=-1 +kerning first=225 second=335 amount=-1 +kerning first=1059 second=1113 amount=-1 +kerning first=220 second=72 amount=-1 +kerning first=270 second=89 amount=-1 +kerning first=79 second=72 amount=-1 +kerning first=78 second=232 amount=-1 +kerning first=71 second=76 amount=-1 +kerning first=261 second=335 amount=-1 +kerning first=1075 second=1088 amount=-1 +kerning first=1051 second=1104 amount=-1 +kerning first=353 second=46 amount=-1 +kerning first=364 second=72 amount=-1 +kerning first=1049 second=1055 amount=-1 +kerning first=267 second=98 amount=-1 +kerning first=231 second=98 amount=-1 +kerning first=263 second=267 amount=-1 +kerning first=195 second=98 amount=-1 +kerning first=8222 second=107 amount=-1 +kerning first=88 second=199 amount=-1 +kerning first=366 second=344 amount=-1 +kerning first=1053 second=1036 amount=-1 +kerning first=193 second=199 amount=-1 +kerning first=375 second=98 amount=-1 +kerning first=86 second=267 amount=-1 +kerning first=339 second=98 amount=-1 +kerning first=324 second=267 amount=-1 +kerning first=362 second=212 amount=-1 +kerning first=1056 second=1070 amount=-1 +kerning first=8218 second=235 amount=-1 +kerning first=218 second=212 amount=-1 +kerning first=337 second=114 amount=-1 +kerning first=1036 second=1028 amount=-1 +kerning first=67 second=206 amount=-1 +kerning first=252 second=267 amount=-1 +kerning first=105 second=118 amount=-1 +kerning first=229 second=114 amount=-1 +kerning first=1053 second=1079 amount=-1 +kerning first=118 second=115 amount=-1 +kerning first=352 second=206 amount=-1 +kerning first=193 second=114 amount=-1 +kerning first=374 second=268 amount=-1 +kerning first=287 second=46 amount=-1 +kerning first=101 second=111 amount=-1 +kerning first=77 second=212 amount=-1 +kerning first=1118 second=1096 amount=-1 +kerning first=219 second=258 amount=-1 +kerning first=282 second=315 amount=-1 +kerning first=355 second=8249 amount=-1 +kerning first=280 second=206 amount=-1 +kerning first=206 second=111 amount=-1 +kerning first=8222 second=242 amount=-1 +kerning first=73 second=352 amount=-1 +kerning first=314 second=111 amount=-1 +kerning first=88 second=114 amount=-1 +kerning first=74 second=368 amount=-1 +kerning first=302 second=310 amount=-1 +kerning first=235 second=263 amount=-1 +kerning first=8217 second=336 amount=-1 +kerning first=266 second=310 amount=-1 +kerning first=271 second=263 amount=-1 +kerning first=70 second=197 amount=-1 +kerning first=67 second=370 amount=-1 +kerning first=8250 second=117 amount=-1 +kerning first=307 second=263 amount=-1 +kerning first=211 second=197 amount=-1 +kerning first=220 second=263 amount=-1 +kerning first=70 second=8249 amount=-2 +kerning first=87 second=365 amount=-1 +kerning first=106 second=8249 amount=-1 +kerning first=240 second=8221 amount=-2 +kerning first=255 second=8222 amount=-1 +kerning first=70 second=331 amount=-1 +kerning first=264 second=68 amount=-1 +kerning first=1033 second=1037 amount=-1 +kerning first=209 second=72 amount=-1 +kerning first=352 second=370 amount=-1 +kerning first=1069 second=1037 amount=-1 +kerning first=368 second=8249 amount=-2 +kerning first=115 second=8250 amount=-1 +kerning first=280 second=370 amount=-1 +kerning first=204 second=199 amount=-1 +kerning first=121 second=106 amount=-1 +kerning first=70 second=361 amount=-1 +kerning first=1064 second=1101 amount=-1 +kerning first=338 second=310 amount=-1 +kerning first=202 second=67 amount=-1 +kerning first=80 second=203 amount=-1 +kerning first=364 second=8222 amount=-2 +kerning first=362 second=346 amount=-1 +kerning first=70 second=227 amount=-1 +kerning first=68 second=282 amount=-1 +kerning first=218 second=346 amount=-1 +kerning first=266 second=327 amount=-1 +kerning first=73 second=207 amount=-1 +kerning first=302 second=327 amount=-1 +kerning first=115 second=8222 amount=-1 +kerning first=338 second=327 amount=-1 +kerning first=79 second=8222 amount=-1 +kerning first=77 second=346 amount=-1 +kerning first=80 second=350 amount=-1 +kerning first=219 second=288 amount=-1 +kerning first=116 second=337 amount=-1 +kerning first=65 second=81 amount=-1 +kerning first=78 second=288 amount=-1 +kerning first=80 second=337 amount=-1 +kerning first=242 second=291 amount=-1 +kerning first=346 second=44 amount=-1 +kerning first=219 second=8218 amount=-2 +kerning first=327 second=288 amount=-1 +kerning first=206 second=81 amount=-1 +kerning first=1066 second=1046 amount=-1 +kerning first=197 second=318 amount=-1 +kerning first=192 second=253 amount=-1 +kerning first=233 second=318 amount=-1 +kerning first=290 second=75 amount=-1 +kerning first=269 second=318 amount=-1 +kerning first=1033 second=1050 amount=-1 +kerning first=1053 second=1098 amount=-1 +kerning first=218 second=75 amount=-1 +kerning first=84 second=46 amount=-1 +kerning first=365 second=337 amount=-1 +kerning first=234 second=187 amount=-1 +kerning first=1058 second=1119 amount=-1 +kerning first=270 second=187 amount=-1 +kerning first=1060 second=1064 amount=-1 +kerning first=77 second=75 amount=-1 +kerning first=277 second=245 amount=-1 +kerning first=257 second=337 amount=-1 +kerning first=241 second=245 amount=-1 +kerning first=198 second=187 amount=-1 +kerning first=221 second=337 amount=-1 +kerning first=205 second=245 amount=-1 +kerning first=356 second=230 amount=-1 +kerning first=330 second=279 amount=-1 +kerning first=1039 second=1036 amount=-1 +kerning first=80 second=66 amount=-1 +kerning first=366 second=279 amount=-1 +kerning first=345 second=226 amount=-1 +kerning first=268 second=199 amount=-1 +kerning first=268 second=234 amount=-1 +kerning first=305 second=8250 amount=-1 +kerning first=199 second=243 amount=-1 +kerning first=8218 second=339 amount=-1 +kerning first=196 second=105 amount=-1 +kerning first=1066 second=1059 amount=-2 +kerning first=362 second=75 amount=-1 +kerning first=262 second=316 amount=-1 +kerning first=82 second=8217 amount=-1 +kerning first=205 second=202 amount=-1 +kerning first=187 second=90 amount=-1 +kerning first=118 second=8217 amount=-2 +kerning first=86 second=8250 amount=-1 +kerning first=374 second=117 amount=-1 +kerning first=323 second=264 amount=-1 +kerning first=201 second=362 amount=-1 +kerning first=345 second=8220 amount=-1 +kerning first=338 second=117 amount=-1 +kerning first=270 second=351 amount=-1 +kerning first=234 second=351 amount=-1 +kerning first=1071 second=1025 amount=-1 +kerning first=8222 second=105 amount=-1 +kerning first=88 second=307 amount=-1 +kerning first=233 second=108 amount=-1 +kerning first=74 second=264 amount=-1 +kerning first=280 second=69 amount=-1 +kerning first=1057 second=1073 amount=-1 +kerning first=325 second=8217 amount=-1 +kerning first=1068 second=1034 amount=-1 +kerning first=193 second=307 amount=-1 +kerning first=330 second=82 amount=-1 +kerning first=284 second=364 amount=-1 +kerning first=364 second=73 amount=-1 +kerning first=197 second=108 amount=-1 +kerning first=223 second=8217 amount=-2 +kerning first=212 second=364 amount=-1 +kerning first=1069 second=1050 amount=-1 +kerning first=338 second=323 amount=-1 +kerning first=366 second=82 amount=-1 +kerning first=356 second=273 amount=-1 +kerning first=266 second=323 amount=-1 +kerning first=201 second=338 amount=-1 +kerning first=71 second=364 amount=-1 +kerning first=262 second=286 amount=-1 +kerning first=84 second=103 amount=-1 +kerning first=200 second=310 amount=-1 +kerning first=8250 second=194 amount=-1 +kerning first=298 second=286 amount=-1 +kerning first=1062 second=1117 amount=-1 +kerning first=249 second=113 amount=-1 +kerning first=67 second=69 amount=-1 +kerning first=268 second=262 amount=-1 +kerning first=268 second=171 amount=-1 +kerning first=187 second=325 amount=-1 +kerning first=370 second=286 amount=-1 +kerning first=74 second=355 amount=-1 +kerning first=1047 second=1067 amount=-1 +kerning first=85 second=286 amount=-1 +kerning first=335 second=316 amount=-1 +kerning first=197 second=314 amount=-1 +kerning first=81 second=82 amount=-1 +kerning first=68 second=72 amount=-1 +kerning first=197 second=171 amount=-1 +kerning first=1073 second=1078 amount=-1 +kerning first=108 second=113 amount=-1 +kerning first=73 second=8250 amount=-1 +kerning first=1040 second=1069 amount=-1 +kerning first=325 second=317 amount=-1 +kerning first=269 second=314 amount=-1 +kerning first=233 second=314 amount=-1 +kerning first=8222 second=229 amount=-1 +kerning first=323 second=355 amount=-1 +kerning first=287 second=355 amount=-1 +kerning first=230 second=117 amount=-1 +kerning first=209 second=282 amount=-1 +kerning first=121 second=316 amount=-1 +kerning first=194 second=117 amount=-1 +kerning first=1048 second=1100 amount=-1 +kerning first=235 second=289 amount=-1 +kerning first=264 second=339 amount=-1 +kerning first=268 second=229 amount=-1 +kerning first=307 second=289 amount=-1 +kerning first=195 second=356 amount=-1 +kerning first=1049 second=1042 amount=-1 +kerning first=271 second=289 amount=-1 +kerning first=304 second=229 amount=-1 +kerning first=269 second=171 amount=-1 +kerning first=1053 second=1049 amount=-1 +kerning first=232 second=101 amount=-1 +kerning first=365 second=246 amount=-1 +kerning first=369 second=103 amount=-1 +kerning first=364 second=304 amount=-1 +kerning first=333 second=103 amount=-1 +kerning first=304 second=101 amount=-1 +kerning first=368 second=194 amount=-1 +kerning first=66 second=315 amount=-1 +kerning first=257 second=246 amount=-1 +kerning first=240 second=333 amount=-1 +kerning first=203 second=296 amount=-1 +kerning first=362 second=246 amount=-1 +kerning first=221 second=246 amount=-1 +kerning first=225 second=103 amount=-1 +kerning first=220 second=304 amount=-1 +kerning first=199 second=220 amount=-1 +kerning first=1051 second=1091 amount=-1 +kerning first=116 second=246 amount=-1 +kerning first=120 second=103 amount=-1 +kerning first=80 second=246 amount=-1 +kerning first=275 second=120 amount=-1 +kerning first=69 second=315 amount=-1 +kerning first=202 second=211 amount=-1 +kerning first=72 second=109 amount=-1 +kerning first=79 second=304 amount=-1 +kerning first=81 second=86 amount=-1 +kerning first=325 second=313 amount=-1 +kerning first=347 second=8218 amount=-1 +kerning first=195 second=85 amount=-1 +kerning first=311 second=8218 amount=-1 +kerning first=288 second=202 amount=-1 +kerning first=229 second=281 amount=-1 +kerning first=101 second=382 amount=-1 +kerning first=87 second=339 amount=-1 +kerning first=101 second=287 amount=-1 +kerning first=206 second=382 amount=-1 +kerning first=304 second=298 amount=-1 +kerning first=85 second=216 amount=-1 +kerning first=234 second=347 amount=-1 +kerning first=8217 second=332 amount=-1 +kerning first=274 second=211 amount=-1 +kerning first=335 second=8250 amount=-1 +kerning first=262 second=290 amount=-1 +kerning first=68 second=65 amount=-1 +kerning first=98 second=120 amount=-1 +kerning first=305 second=242 amount=-1 +kerning first=8250 second=198 amount=-1 +kerning first=298 second=290 amount=-1 +kerning first=242 second=287 amount=-1 +kerning first=263 second=8250 amount=-1 +kerning first=310 second=211 amount=-1 +kerning first=258 second=86 amount=-1 +kerning first=370 second=290 amount=-1 +kerning first=1046 second=1090 amount=-1 +kerning first=289 second=339 amount=-1 +kerning first=289 second=107 amount=-1 +kerning first=83 second=302 amount=-1 +kerning first=253 second=107 amount=-1 +kerning first=246 second=289 amount=-1 +kerning first=325 second=339 amount=-1 +kerning first=83 second=8220 amount=-1 +kerning first=8217 second=362 amount=-1 +kerning first=1052 second=1067 amount=-1 +kerning first=338 second=219 amount=-1 +kerning first=356 second=234 amount=-1 +kerning first=1118 second=1090 amount=-1 +kerning first=252 second=101 amount=-1 +kerning first=68 second=278 amount=-1 +kerning first=70 second=223 amount=-1 +kerning first=217 second=339 amount=-1 +kerning first=8222 second=268 amount=-1 +kerning first=119 second=8220 amount=-2 +kerning first=302 second=219 amount=-1 +kerning first=194 second=219 amount=-1 +kerning first=79 second=330 amount=-1 +kerning first=103 second=232 amount=-1 +kerning first=106 second=8222 amount=-1 +kerning first=220 second=330 amount=-1 +kerning first=67 second=232 amount=-1 +kerning first=279 second=365 amount=-1 +kerning first=271 second=122 amount=-1 +kerning first=1059 second=1057 amount=-1 +kerning first=1042 second=1118 amount=-1 +kerning first=209 second=278 amount=-1 +kerning first=72 second=280 amount=-1 +kerning first=316 second=232 amount=-1 +kerning first=199 second=122 amount=-1 +kerning first=253 second=187 amount=-1 +kerning first=205 second=74 amount=-1 +kerning first=1046 second=1101 amount=-1 +kerning first=66 second=298 amount=-1 +kerning first=1046 second=1094 amount=-1 +kerning first=68 second=76 amount=-1 +kerning first=1060 second=1047 amount=-1 +kerning first=323 second=225 amount=-1 +kerning first=66 second=363 amount=-1 +kerning first=187 second=89 amount=-2 +kerning first=1027 second=1094 amount=-1 +kerning first=263 second=228 amount=-1 +kerning first=350 second=85 amount=-1 +kerning first=101 second=246 amount=-1 +kerning first=352 second=8217 amount=-1 +kerning first=370 second=296 amount=-1 +kerning first=8218 second=314 amount=-1 +kerning first=279 second=363 amount=-1 +kerning first=278 second=85 amount=-1 +kerning first=77 second=216 amount=-1 +kerning first=260 second=8220 amount=-2 +kerning first=234 second=46 amount=-1 +kerning first=224 second=8220 amount=-2 +kerning first=206 second=85 amount=-1 +kerning first=332 second=8220 amount=-2 +kerning first=74 second=225 amount=-1 +kerning first=1051 second=1028 amount=-1 +kerning first=65 second=85 amount=-1 +kerning first=205 second=241 amount=-1 +kerning first=74 second=260 amount=-1 +kerning first=368 second=8220 amount=-1 +kerning first=368 second=302 amount=-1 +kerning first=355 second=283 amount=-1 +kerning first=267 second=114 amount=-1 +kerning first=105 second=289 amount=-1 +kerning first=296 second=302 amount=-1 +kerning first=1060 second=1038 amount=-1 +kerning first=72 second=70 amount=-1 +kerning first=202 second=250 amount=-1 +kerning first=287 second=109 amount=-1 +kerning first=261 second=378 amount=-1 +kerning first=78 second=262 amount=-1 +kerning first=80 second=207 amount=-1 +kerning first=225 second=378 amount=-1 +kerning first=277 second=104 amount=-1 +kerning first=213 second=70 amount=-1 +kerning first=1053 second=1075 amount=-1 +kerning first=352 second=366 amount=-1 +kerning first=346 second=250 amount=-1 +kerning first=310 second=250 amount=-1 +kerning first=280 second=366 amount=-1 +kerning first=210 second=192 amount=-1 +kerning first=274 second=250 amount=-1 +kerning first=219 second=262 amount=-1 +kerning first=333 second=378 amount=-1 +kerning first=8218 second=231 amount=-1 +kerning first=218 second=216 amount=-1 +kerning first=283 second=357 amount=-1 +kerning first=1053 second=1070 amount=-1 +kerning first=1042 second=1053 amount=-1 +kerning first=324 second=8221 amount=-2 +kerning first=209 second=76 amount=-1 +kerning first=304 second=225 amount=-1 +kerning first=362 second=216 amount=-1 +kerning first=1046 second=1073 amount=-1 +kerning first=84 second=378 amount=-1 +kerning first=83 second=369 amount=-1 +kerning first=45 second=253 amount=-1 +kerning first=272 second=201 amount=-1 +kerning first=218 second=251 amount=-1 +kerning first=1086 second=1084 amount=-1 +kerning first=200 second=201 amount=-1 +kerning first=97 second=113 amount=-1 +kerning first=73 second=116 amount=-1 +kerning first=362 second=251 amount=-1 +kerning first=8220 second=353 amount=-1 +kerning first=250 second=45 amount=-1 +kerning first=80 second=242 amount=-1 +kerning first=199 second=259 amount=-1 +kerning first=201 second=204 amount=-1 +kerning first=255 second=250 amount=-1 +kerning first=68 second=44 amount=-1 +kerning first=202 second=116 amount=-1 +kerning first=257 second=242 amount=-1 +kerning first=196 second=268 amount=-1 +kerning first=87 second=369 amount=-1 +kerning first=206 second=317 amount=-1 +kerning first=275 second=8218 amount=-1 +kerning first=267 second=8217 amount=-2 +kerning first=278 second=317 amount=-1 +kerning first=187 second=256 amount=-1 +kerning first=197 second=210 amount=-1 +kerning first=67 second=366 amount=-1 +kerning first=350 second=317 amount=-1 +kerning first=1060 second=1061 amount=-1 +kerning first=304 second=268 amount=-1 +kerning first=192 second=369 amount=-1 +kerning first=365 second=242 amount=-1 +kerning first=1073 second=1113 amount=-1 +kerning first=324 second=171 amount=-1 +kerning first=218 second=207 amount=-1 +kerning first=369 second=244 amount=-1 +kerning first=325 second=209 amount=-1 +kerning first=78 second=327 amount=-1 +kerning first=224 second=233 amount=-1 +kerning first=305 second=279 amount=-1 +kerning first=1105 second=1080 amount=-1 +kerning first=368 second=371 amount=-1 +kerning first=217 second=209 amount=-1 +kerning first=233 second=279 amount=-1 +kerning first=219 second=327 amount=-1 +kerning first=8250 second=302 amount=-1 +kerning first=269 second=279 amount=-1 +kerning first=368 second=233 amount=-1 +kerning first=302 second=288 amount=-1 +kerning first=87 second=235 amount=-1 +kerning first=198 second=213 amount=-1 +kerning first=338 second=288 amount=-1 +kerning first=298 second=280 amount=-1 +kerning first=327 second=327 amount=-1 +kerning first=296 second=233 amount=-1 +kerning first=207 second=335 amount=-1 +kerning first=220 second=200 amount=-1 +kerning first=266 second=288 amount=-1 +kerning first=228 second=235 amount=-1 +kerning first=83 second=371 amount=-1 +kerning first=264 second=235 amount=-1 +kerning first=86 second=224 amount=-1 +kerning first=79 second=200 amount=-1 +kerning first=344 second=266 amount=-1 +kerning first=374 second=288 amount=-1 +kerning first=321 second=370 amount=-1 +kerning first=73 second=284 amount=-1 +kerning first=99 second=8221 amount=-2 +kerning first=334 second=84 amount=-1 +kerning first=264 second=231 amount=-1 +kerning first=1053 second=1077 amount=-1 +kerning first=250 second=283 amount=-1 +kerning first=286 second=218 amount=-1 +kerning first=80 second=380 amount=-1 +kerning first=263 second=224 amount=-1 +kerning first=214 second=218 amount=-1 +kerning first=364 second=196 amount=-1 +kerning first=272 second=270 amount=-1 +kerning first=87 second=231 amount=-1 +kerning first=73 second=283 amount=-1 +kerning first=257 second=380 amount=-1 +kerning first=206 second=248 amount=-1 +kerning first=109 second=283 amount=-1 +kerning first=73 second=218 amount=-1 +kerning first=221 second=380 amount=-1 +kerning first=314 second=248 amount=-1 +kerning first=1031 second=1027 amount=-1 +kerning first=213 second=280 amount=-1 +kerning first=228 second=231 amount=-1 +kerning first=79 second=196 amount=-1 +kerning first=268 second=66 amount=-1 +kerning first=282 second=79 amount=-1 +kerning first=368 second=367 amount=-1 +kerning first=74 second=323 amount=-1 +kerning first=84 second=244 amount=-1 +kerning first=66 second=266 amount=-1 +kerning first=69 second=79 amount=-1 +kerning first=72 second=218 amount=-1 +kerning first=8217 second=228 amount=-1 +kerning first=200 second=270 amount=-1 +kerning first=225 second=244 amount=-1 +kerning first=261 second=244 amount=-1 +kerning first=1039 second=1062 amount=-1 +kerning first=83 second=367 amount=-1 +kerning first=326 second=45 amount=-1 +kerning first=259 second=99 amount=-1 +kerning first=85 second=80 amount=-1 +kerning first=362 second=114 amount=-1 +kerning first=332 second=8250 amount=-1 +kerning first=362 second=45 amount=-2 +kerning first=241 second=283 amount=-1 +kerning first=198 second=217 amount=-1 +kerning first=210 second=354 amount=-1 +kerning first=119 second=367 amount=-1 +kerning first=290 second=45 amount=-1 +kerning first=217 second=205 amount=-1 +kerning first=298 second=80 amount=-1 +kerning first=65 second=252 amount=-1 +kerning first=254 second=114 amount=-1 +kerning first=270 second=217 amount=-1 +kerning first=266 second=284 amount=-1 +kerning first=262 second=80 amount=-1 +kerning first=187 second=69 amount=-1 +kerning first=8249 second=364 amount=-1 +kerning first=326 second=114 amount=-1 +kerning first=338 second=284 amount=-1 +kerning first=101 second=252 amount=-1 +kerning first=304 second=66 amount=-1 +kerning first=302 second=284 amount=-1 +kerning first=72 second=232 amount=-1 +kerning first=77 second=114 amount=-1 +kerning first=1027 second=1098 amount=-1 +kerning first=89 second=284 amount=-1 +kerning first=1052 second=1072 amount=-1 +kerning first=108 second=243 amount=-1 +kerning first=302 second=353 amount=-1 +kerning first=194 second=284 amount=-1 +kerning first=266 second=353 amount=-1 +kerning first=72 second=345 amount=-1 +kerning first=374 second=353 amount=-1 +kerning first=108 second=345 amount=-1 +kerning first=262 second=268 amount=-1 +kerning first=234 second=115 amount=-1 +kerning first=270 second=115 amount=-1 +kerning first=249 second=345 amount=-1 +kerning first=364 second=45 amount=-2 +kerning first=1031 second=1054 amount=-1 +kerning first=108 second=250 amount=-1 +kerning first=45 second=249 amount=-1 +kerning first=200 second=266 amount=-1 +kerning first=73 second=214 amount=-1 +kerning first=1049 second=1077 amount=-1 +kerning first=104 second=243 amount=-1 +kerning first=193 second=71 amount=-1 +kerning first=204 second=368 amount=-1 +kerning first=209 second=243 amount=-1 +kerning first=364 second=200 amount=-1 +kerning first=231 second=226 amount=-1 +kerning first=281 second=243 amount=-1 +kerning first=75 second=336 amount=-1 +kerning first=205 second=310 amount=-1 +kerning first=267 second=226 amount=-1 +kerning first=269 second=275 amount=-1 +kerning first=272 second=197 amount=-1 +kerning first=233 second=275 amount=-1 +kerning first=362 second=288 amount=-1 +kerning first=370 second=80 amount=-1 +kerning first=314 second=252 amount=-1 +kerning first=334 second=80 amount=-1 +kerning first=278 second=252 amount=-1 +kerning first=1030 second=1089 amount=-1 +kerning first=374 second=8220 amount=-1 +kerning first=305 second=275 amount=-1 +kerning first=73 second=270 amount=-1 +kerning first=350 second=252 amount=-1 +kerning first=218 second=45 amount=-2 +kerning first=88 second=71 amount=-1 +kerning first=77 second=45 amount=-1 +kerning first=1046 second=1087 amount=-1 +kerning first=258 second=249 amount=-1 +kerning first=113 second=45 amount=-1 +kerning first=1046 second=1086 amount=-1 +kerning first=374 second=275 amount=-1 +kerning first=85 second=71 amount=-1 +kerning first=8217 second=338 amount=-1 +kerning first=233 second=353 amount=-1 +kerning first=317 second=217 amount=-1 +kerning first=102 second=45 amount=-1 +kerning first=77 second=97 amount=-1 +kerning first=230 second=275 amount=-1 +kerning first=262 second=71 amount=-1 +kerning first=274 second=8249 amount=-1 +kerning first=209 second=79 amount=-1 +kerning first=269 second=353 amount=-1 +kerning first=302 second=275 amount=-1 +kerning first=266 second=275 amount=-1 +kerning first=1052 second=1068 amount=-1 +kerning first=217 second=66 amount=-1 +kerning first=302 second=362 amount=-1 +kerning first=67 second=318 amount=-1 +kerning first=1047 second=1045 amount=-1 +kerning first=246 second=122 amount=-1 +kerning first=219 second=223 amount=-1 +kerning first=8217 second=224 amount=-1 +kerning first=103 second=318 amount=-1 +kerning first=362 second=97 amount=-1 +kerning first=1042 second=1062 amount=-1 +kerning first=187 second=80 amount=-1 +kerning first=338 second=362 amount=-1 +kerning first=89 second=275 amount=-1 +kerning first=1058 second=1097 amount=-1 +kerning first=244 second=318 amount=-1 +kerning first=218 second=97 amount=-1 +kerning first=327 second=223 amount=-1 +kerning first=316 second=318 amount=-1 +kerning first=291 second=223 amount=-1 +kerning first=211 second=315 amount=-1 +kerning first=187 second=200 amount=-1 +kerning first=240 second=234 amount=-1 +kerning first=324 second=232 amount=-1 +kerning first=206 second=226 amount=-1 +kerning first=8222 second=354 amount=-1 +kerning first=1038 second=1085 amount=-1 +kerning first=78 second=223 amount=-1 +kerning first=75 second=249 amount=-1 +kerning first=194 second=362 amount=-1 +kerning first=364 second=209 amount=-1 +kerning first=264 second=283 amount=-1 +kerning first=368 second=198 amount=-1 +kerning first=197 second=266 amount=-1 +kerning first=86 second=371 amount=-1 +kerning first=370 second=71 amount=-1 +kerning first=1077 second=1076 amount=-1 +kerning first=1042 second=1079 amount=-1 +kerning first=298 second=71 amount=-1 +kerning first=283 second=249 amount=-1 +kerning first=75 second=332 amount=-1 +kerning first=68 second=217 amount=-1 +kerning first=66 second=45 amount=-1 +kerning first=197 second=8250 amount=-1 +kerning first=70 second=249 amount=-1 +kerning first=209 second=217 amount=-1 +kerning first=289 second=98 amount=-1 +kerning first=366 second=361 amount=-1 +kerning first=270 second=206 amount=-1 +kerning first=253 second=98 amount=-1 +kerning first=8250 second=66 amount=-1 +kerning first=205 second=267 amount=-1 +kerning first=258 second=361 amount=-1 +kerning first=241 second=267 amount=-1 +kerning first=201 second=250 amount=-1 +kerning first=1042 second=1051 amount=-1 +kerning first=277 second=267 amount=-1 +kerning first=1047 second=1042 amount=-1 +kerning first=1050 second=1080 amount=-1 +kerning first=69 second=216 amount=-1 +kerning first=199 second=345 amount=-1 +kerning first=100 second=267 amount=-1 +kerning first=235 second=345 amount=-1 +kerning first=8250 second=380 amount=-1 +kerning first=271 second=345 amount=-1 +kerning first=1071 second=1107 amount=-1 +kerning first=207 second=225 amount=-1 +kerning first=1064 second=1079 amount=-1 +kerning first=1036 second=1080 amount=-1 +kerning first=219 second=323 amount=-1 +kerning first=72 second=241 amount=-1 +kerning first=1041 second=1063 amount=-1 +kerning first=80 second=302 amount=-1 +kerning first=78 second=323 amount=-1 +kerning first=240 second=114 amount=-1 +kerning first=262 second=171 amount=-1 +kerning first=272 second=344 amount=-1 +kerning first=325 second=378 amount=-1 +kerning first=327 second=323 amount=-1 +kerning first=69 second=250 amount=-1 +kerning first=78 second=310 amount=-1 +kerning first=289 second=378 amount=-1 +kerning first=78 second=370 amount=-1 +kerning first=99 second=114 amount=-1 +kerning first=202 second=336 amount=-1 +kerning first=253 second=378 amount=-1 +kerning first=326 second=103 amount=-1 +kerning first=327 second=370 amount=-1 +kerning first=282 second=250 amount=-1 +kerning first=274 second=336 amount=-1 +kerning first=74 second=199 amount=-1 +kerning first=213 second=207 amount=-1 +kerning first=219 second=378 amount=-1 +kerning first=310 second=336 amount=-1 +kerning first=65 second=46 amount=-1 +kerning first=86 second=284 amount=-1 +kerning first=282 second=216 amount=-1 +kerning first=45 second=361 amount=-1 +kerning first=1039 second=1071 amount=-1 +kerning first=207 second=259 amount=-1 +kerning first=323 second=199 amount=-1 +kerning first=327 second=310 amount=-1 +kerning first=217 second=378 amount=-1 +kerning first=270 second=72 amount=-1 +kerning first=1044 second=1054 amount=-1 +kerning first=200 second=344 amount=-1 +kerning first=112 second=378 amount=-1 +kerning first=1056 second=1105 amount=-1 +kerning first=219 second=310 amount=-1 +kerning first=302 second=210 amount=-1 +kerning first=258 second=314 amount=-1 +kerning first=45 second=288 amount=-1 +kerning first=207 second=346 amount=-1 +kerning first=307 second=235 amount=-1 +kerning first=195 second=334 amount=-1 +kerning first=220 second=282 amount=-1 +kerning first=67 second=331 amount=-1 +kerning first=66 second=346 amount=-1 +kerning first=321 second=87 amount=-1 +kerning first=1052 second=1055 amount=-1 +kerning first=67 second=220 amount=-1 +kerning first=258 second=288 amount=-1 +kerning first=362 second=110 amount=-1 +kerning first=368 second=109 amount=-1 +kerning first=79 second=282 amount=-1 +kerning first=1058 second=1095 amount=-1 +kerning first=219 second=344 amount=-1 +kerning first=110 second=119 amount=-1 +kerning first=336 second=187 amount=-1 +kerning first=307 second=333 amount=-1 +kerning first=116 second=101 amount=-1 +kerning first=80 second=101 amount=-1 +kerning first=209 second=230 amount=-1 +kerning first=221 second=101 amount=-1 +kerning first=8250 second=220 amount=-1 +kerning first=289 second=291 amount=-1 +kerning first=262 second=296 amount=-1 +kerning first=104 second=263 amount=-1 +kerning first=198 second=325 amount=-1 +kerning first=257 second=101 amount=-1 +kerning first=354 second=337 amount=-1 +kerning first=67 second=245 amount=-1 +kerning first=112 second=291 amount=-1 +kerning first=74 second=212 amount=-1 +kerning first=8217 second=211 amount=-1 +kerning first=261 second=279 amount=-1 +kerning first=1070 second=1061 amount=-1 +kerning first=304 second=344 amount=-1 +kerning first=286 second=8218 amount=-1 +kerning first=1034 second=1061 amount=-1 +kerning first=84 second=99 amount=-1 +kerning first=88 second=303 amount=-1 +kerning first=369 second=279 amount=-1 +kerning first=1066 second=1098 amount=-1 +kerning first=1030 second=1098 amount=-1 +kerning first=105 second=337 amount=-1 +kerning first=264 second=296 amount=-1 +kerning first=193 second=303 amount=-1 +kerning first=1049 second=1064 amount=-1 +kerning first=261 second=99 amount=-1 +kerning first=366 second=288 amount=-1 +kerning first=1055 second=1119 amount=-1 +kerning first=231 second=187 amount=-1 +kerning first=1091 second=1119 amount=-1 +kerning first=316 second=245 amount=-1 +kerning first=1039 second=1118 amount=-1 +kerning first=80 second=75 amount=-1 +kerning first=225 second=99 amount=-1 +kerning first=216 second=8250 amount=-1 +kerning first=330 second=288 amount=-1 +kerning first=339 second=187 amount=-1 +kerning first=214 second=8218 amount=-1 +kerning first=352 second=363 amount=-1 +kerning first=84 second=279 amount=-1 +kerning first=212 second=221 amount=-1 +kerning first=307 second=243 amount=-1 +kerning first=291 second=117 amount=-1 +kerning first=80 second=226 amount=-1 +kerning first=365 second=8220 amount=-1 +kerning first=1071 second=1065 amount=-1 +kerning first=296 second=380 amount=-1 +kerning first=255 second=117 amount=-1 +kerning first=219 second=117 amount=-1 +kerning first=267 second=287 amount=-1 +kerning first=275 second=248 amount=-1 +kerning first=368 second=380 amount=-1 +kerning first=231 second=287 amount=-1 +kerning first=325 second=218 amount=-1 +kerning first=267 second=363 amount=-1 +kerning first=99 second=307 amount=-1 +kerning first=298 second=264 amount=-1 +kerning first=1068 second=1030 amount=-1 +kerning first=262 second=264 amount=-1 +kerning first=291 second=171 amount=-1 +kerning first=198 second=278 amount=-1 +kerning first=296 second=66 amount=-1 +kerning first=201 second=364 amount=-1 +kerning first=116 second=8220 amount=-1 +kerning first=194 second=121 amount=-1 +kerning first=220 second=209 amount=-1 +kerning first=80 second=8220 amount=-1 +kerning first=85 second=264 amount=-1 +kerning first=196 second=367 amount=-1 +kerning first=266 second=202 amount=-1 +kerning first=119 second=380 amount=-1 +kerning first=264 second=270 amount=-1 +kerning first=79 second=209 amount=-1 +kerning first=83 second=66 amount=-1 +kerning first=270 second=278 amount=-1 +kerning first=327 second=69 amount=-1 +kerning first=257 second=8220 amount=-2 +kerning first=89 second=74 amount=-1 +kerning first=302 second=202 amount=-1 +kerning first=270 second=325 amount=-1 +kerning first=78 second=69 amount=-1 +kerning first=208 second=8220 amount=-2 +kerning first=362 second=330 amount=-1 +kerning first=201 second=202 amount=-1 +kerning first=219 second=69 amount=-1 +kerning first=1040 second=1091 amount=-1 +kerning first=352 second=203 amount=-1 +kerning first=302 second=74 amount=-1 +kerning first=264 second=311 amount=-1 +kerning first=364 second=330 amount=-1 +kerning first=234 second=252 amount=-1 +kerning first=374 second=74 amount=-1 +kerning first=275 second=252 amount=-1 +kerning first=198 second=252 amount=-1 +kerning first=206 second=261 amount=-1 +kerning first=368 second=66 amount=-1 +kerning first=280 second=313 amount=-1 +kerning first=73 second=227 amount=-1 +kerning first=217 second=218 amount=-1 +kerning first=235 second=44 amount=-1 +kerning first=288 second=78 amount=-1 +kerning first=366 second=214 amount=-1 +kerning first=1055 second=1057 amount=-1 +kerning first=330 second=214 amount=-1 +kerning first=76 second=218 amount=-1 +kerning first=8217 second=284 amount=-1 +kerning first=368 second=281 amount=-1 +kerning first=269 second=112 amount=-1 +kerning first=204 second=68 amount=-1 +kerning first=204 second=355 amount=-1 +kerning first=1104 second=1103 amount=-1 +kerning first=1043 second=1082 amount=-1 +kerning first=364 second=282 amount=-1 +kerning first=307 second=44 amount=-1 +kerning first=200 second=365 amount=-1 +kerning first=82 second=286 amount=-1 +kerning first=103 second=117 amount=-1 +kerning first=200 second=171 amount=-1 +kerning first=70 second=252 amount=-1 +kerning first=368 second=204 amount=-1 +kerning first=103 second=112 amount=-1 +kerning first=316 second=117 amount=-1 +kerning first=116 second=229 amount=-1 +kerning first=1051 second=1108 amount=-1 +kerning first=1049 second=1051 amount=-1 +kerning first=280 second=117 amount=-1 +kerning first=80 second=229 amount=-1 +kerning first=344 second=171 amount=-1 +kerning first=364 second=68 amount=-1 +kerning first=380 second=171 amount=-1 +kerning first=212 second=192 amount=-1 +kerning first=362 second=8218 amount=-2 +kerning first=240 second=287 amount=-1 +kerning first=83 second=220 amount=-1 +kerning first=1052 second=1042 amount=-1 +kerning first=352 second=117 amount=-1 +kerning first=195 second=361 amount=-1 +kerning first=227 second=263 amount=-1 +kerning first=197 second=374 amount=-1 +kerning first=1054 second=1039 amount=-1 +kerning first=77 second=298 amount=-1 +kerning first=263 second=263 amount=-1 +kerning first=304 second=246 amount=-1 +kerning first=72 second=100 amount=-1 +kerning first=279 second=251 amount=-1 +kerning first=268 second=246 amount=-1 +kerning first=339 second=382 amount=-1 +kerning first=232 second=246 amount=-1 +kerning first=1054 second=1034 amount=-1 +kerning first=375 second=382 amount=-1 +kerning first=283 second=103 amount=-1 +kerning first=325 second=77 amount=-1 +kerning first=296 second=220 amount=-1 +kerning first=1047 second=1062 amount=-1 +kerning first=368 second=220 amount=-1 +kerning first=212 second=206 amount=-1 +kerning first=325 second=304 amount=-1 +kerning first=107 second=316 amount=-1 +kerning first=209 second=330 amount=-1 +kerning first=8217 second=198 amount=-2 +kerning first=106 second=103 amount=-1 +kerning first=248 second=316 amount=-1 +kerning first=279 second=333 amount=-1 +kerning first=193 second=118 amount=-1 +kerning first=79 second=68 amount=-1 +kerning first=365 second=281 amount=-1 +kerning first=8250 second=207 amount=-1 +kerning first=207 second=333 amount=-1 +kerning first=328 second=248 amount=-1 +kerning first=325 second=8222 amount=-1 +kerning first=217 second=304 amount=-1 +kerning first=1051 second=1048 amount=-1 +kerning first=289 second=8222 amount=-1 +kerning first=86 second=211 amount=-1 +kerning first=253 second=8222 amount=-1 +kerning first=334 second=221 amount=-1 +kerning first=193 second=255 amount=-1 +kerning first=8217 second=83 amount=-1 +kerning first=80 second=331 amount=-1 +kerning first=217 second=8222 amount=-2 +kerning first=1044 second=1087 amount=-1 +kerning first=267 second=382 amount=-1 +kerning first=262 second=310 amount=-1 +kerning first=82 second=221 amount=-1 +kerning first=286 second=313 amount=-1 +kerning first=195 second=375 amount=-1 +kerning first=187 second=221 amount=-2 +kerning first=67 second=210 amount=-1 +kerning first=206 second=339 amount=-1 +kerning first=213 second=315 amount=-1 +kerning first=354 second=242 amount=-1 +kerning first=72 second=233 amount=-1 +kerning first=104 second=111 amount=-1 +kerning first=108 second=233 amount=-1 +kerning first=83 second=280 amount=-1 +kerning first=209 second=111 amount=-1 +kerning first=305 second=245 amount=-1 +kerning first=206 second=205 amount=-1 +kerning first=214 second=313 amount=-1 +kerning first=269 second=245 amount=-1 +kerning first=249 second=233 amount=-1 +kerning first=1048 second=1057 amount=-1 +kerning first=101 second=120 amount=-1 +kerning first=364 second=230 amount=-1 +kerning first=68 second=330 amount=-1 +kerning first=314 second=339 amount=-1 +kerning first=72 second=315 amount=-1 +kerning first=296 second=280 amount=-1 +kerning first=220 second=230 amount=-1 +kerning first=368 second=280 amount=-1 +kerning first=80 second=317 amount=-1 +kerning first=262 second=212 amount=-1 +kerning first=218 second=298 amount=-1 +kerning first=110 second=8217 amount=-2 +kerning first=298 second=212 amount=-1 +kerning first=220 second=76 amount=-1 +kerning first=290 second=298 amount=-1 +kerning first=79 second=76 amount=-1 +kerning first=370 second=212 amount=-1 +kerning first=251 second=8217 amount=-1 +kerning first=85 second=212 amount=-1 +kerning first=362 second=298 amount=-1 +kerning first=45 second=344 amount=-1 +kerning first=75 second=118 amount=-1 +kerning first=1055 second=1113 amount=-1 +kerning first=8222 second=367 amount=-1 +kerning first=345 second=46 amount=-1 +kerning first=281 second=111 amount=-1 +kerning first=233 second=245 amount=-1 +kerning first=325 second=85 amount=-1 +kerning first=194 second=254 amount=-1 +kerning first=116 second=289 amount=-1 +kerning first=230 second=254 amount=-1 +kerning first=266 second=254 amount=-1 +kerning first=217 second=85 amount=-1 +kerning first=287 second=8217 amount=-2 +kerning first=323 second=8217 amount=-1 +kerning first=76 second=85 amount=-1 +kerning first=257 second=289 amount=-1 +kerning first=80 second=216 amount=-1 +kerning first=89 second=262 amount=-1 +kerning first=267 second=46 amount=-1 +kerning first=1055 second=1099 amount=-1 +kerning first=375 second=46 amount=-1 +kerning first=302 second=218 amount=-1 +kerning first=339 second=46 amount=-1 +kerning first=302 second=262 amount=-1 +kerning first=187 second=67 amount=-1 +kerning first=224 second=8250 amount=-1 +kerning first=266 second=262 amount=-1 +kerning first=70 second=116 amount=-1 +kerning first=221 second=216 amount=-1 +kerning first=374 second=262 amount=-1 +kerning first=82 second=67 amount=-1 +kerning first=1104 second=1095 amount=-1 +kerning first=338 second=262 amount=-1 +kerning first=197 second=366 amount=-1 +kerning first=83 second=345 amount=-1 +kerning first=45 second=206 amount=-1 +kerning first=272 second=304 amount=-1 +kerning first=274 second=70 amount=-1 +kerning first=204 second=110 amount=-1 +kerning first=355 second=353 amount=-1 +kerning first=214 second=192 amount=-1 +kerning first=8217 second=380 amount=-1 +kerning first=235 second=250 amount=-1 +kerning first=346 second=70 amount=-1 +kerning first=224 second=345 amount=-1 +kerning first=8250 second=75 amount=-1 +kerning first=67 second=104 amount=-1 +kerning first=362 second=225 amount=-1 +kerning first=364 second=76 amount=-1 +kerning first=77 second=229 amount=-1 +kerning first=1039 second=1084 amount=-1 +kerning first=231 second=46 amount=-1 +kerning first=197 second=253 amount=-1 +kerning first=350 second=274 amount=-1 +kerning first=368 second=345 amount=-1 +kerning first=302 second=224 amount=-1 +kerning first=206 second=366 amount=-1 +kerning first=366 second=206 amount=-1 +kerning first=217 second=44 amount=-2 +kerning first=193 second=368 amount=-1 +kerning first=8220 second=362 amount=-1 +kerning first=68 second=317 amount=-1 +kerning first=296 second=207 amount=-1 +kerning first=1031 second=1105 amount=-1 +kerning first=86 second=271 amount=-1 +kerning first=194 second=375 amount=-1 +kerning first=330 second=206 amount=-1 +kerning first=88 second=8221 amount=-1 +kerning first=368 second=207 amount=-1 +kerning first=195 second=369 amount=-1 +kerning first=209 second=317 amount=-1 +kerning first=97 second=122 amount=-1 +kerning first=193 second=8221 amount=-2 +kerning first=211 second=201 amount=-1 +kerning first=263 second=271 amount=-1 +kerning first=229 second=8221 amount=-2 +kerning first=88 second=368 amount=-1 +kerning first=70 second=201 amount=-1 +kerning first=1054 second=1047 amount=-1 +kerning first=1108 second=1093 amount=-1 +kerning first=212 second=256 amount=-1 +kerning first=228 second=378 amount=-1 +kerning first=283 second=116 amount=-1 +kerning first=100 second=113 amount=-1 +kerning first=337 second=8221 amount=-2 +kerning first=1056 second=1031 amount=-1 +kerning first=304 second=122 amount=-1 +kerning first=87 second=378 amount=-1 +kerning first=214 second=270 amount=-1 +kerning first=85 second=204 amount=-1 +kerning first=78 second=267 amount=-1 +kerning first=88 second=219 amount=-1 +kerning first=370 second=204 amount=-1 +kerning first=304 second=259 amount=-1 +kerning first=1067 second=1105 amount=-1 +kerning first=334 second=204 amount=-1 +kerning first=268 second=259 amount=-1 +kerning first=298 second=204 amount=-1 +kerning first=83 second=207 amount=-1 +kerning first=264 second=378 amount=-1 +kerning first=280 second=210 amount=-1 +kerning first=214 second=86 amount=-1 +kerning first=80 second=281 amount=-1 +kerning first=1041 second=1068 amount=-1 +kerning first=8250 second=280 amount=-1 +kerning first=1055 second=1091 amount=-1 +kerning first=221 second=281 amount=-1 +kerning first=257 second=281 amount=-1 +kerning first=365 second=333 amount=-1 +kerning first=206 second=347 amount=-1 +kerning first=199 second=350 amount=-1 +kerning first=275 second=235 amount=-1 +kerning first=218 second=290 amount=-1 +kerning first=101 second=347 amount=-1 +kerning first=370 second=277 amount=-1 +kerning first=86 second=198 amount=-1 +kerning first=1051 second=1056 amount=-1 +kerning first=366 second=73 amount=-1 +kerning first=330 second=73 amount=-1 +kerning first=88 second=268 amount=-1 +kerning first=351 second=8220 amount=-2 +kerning first=333 second=8218 amount=-1 +kerning first=196 second=253 amount=-1 +kerning first=375 second=369 amount=-1 +kerning first=204 second=282 amount=-1 +kerning first=352 second=8249 amount=-1 +kerning first=327 second=82 amount=-1 +kerning first=8250 second=328 amount=-1 +kerning first=275 second=108 amount=-1 +kerning first=218 second=363 amount=-1 +kerning first=85 second=277 amount=-1 +kerning first=249 second=235 amount=-1 +kerning first=45 second=73 amount=-1 +kerning first=1027 second=1072 amount=-1 +kerning first=298 second=277 amount=-1 +kerning first=99 second=246 amount=-1 +kerning first=362 second=363 amount=-1 +kerning first=262 second=277 amount=-1 +kerning first=77 second=290 amount=-1 +kerning first=226 second=277 amount=-1 +kerning first=81 second=73 amount=-1 +kerning first=353 second=103 amount=-1 +kerning first=1068 second=1041 amount=-1 +kerning first=67 second=8249 amount=-1 +kerning first=78 second=73 amount=-1 +kerning first=103 second=8249 amount=-1 +kerning first=199 second=79 amount=-1 +kerning first=78 second=82 amount=-1 +kerning first=219 second=82 amount=-1 +kerning first=289 second=231 amount=-1 +kerning first=325 second=231 amount=-1 +kerning first=275 second=283 amount=-1 +kerning first=209 second=338 amount=-1 +kerning first=67 second=242 amount=-1 +kerning first=316 second=8249 amount=-1 +kerning first=1048 second=1065 amount=-1 +kerning first=217 second=196 amount=-1 +kerning first=199 second=66 amount=-1 +kerning first=73 second=235 amount=-1 +kerning first=69 second=345 amount=-1 +kerning first=109 second=235 amount=-1 +kerning first=105 second=345 amount=-1 +kerning first=87 second=248 amount=-1 +kerning first=330 second=270 amount=-1 +kerning first=246 second=345 amount=-1 +kerning first=325 second=283 amount=-1 +kerning first=282 second=345 amount=-1 +kerning first=217 second=283 amount=-1 +kerning first=1030 second=1076 amount=-1 +kerning first=72 second=79 amount=-1 +kerning first=8216 second=370 amount=-1 +kerning first=1033 second=1067 amount=-1 +kerning first=221 second=367 amount=-1 +kerning first=1069 second=1067 amount=-1 +kerning first=235 second=380 amount=-1 +kerning first=286 second=205 amount=-1 +kerning first=78 second=337 amount=-1 +kerning first=220 second=274 amount=-1 +kerning first=272 second=192 amount=-1 +kerning first=79 second=274 amount=-1 +kerning first=67 second=323 amount=-1 +kerning first=72 second=336 amount=-1 +kerning first=1047 second=1080 amount=-1 +kerning first=204 second=310 amount=-1 +kerning first=84 second=257 amount=-1 +kerning first=195 second=249 amount=-1 +kerning first=288 second=70 amount=-1 +kerning first=332 second=44 amount=-1 +kerning first=73 second=205 amount=-1 +kerning first=368 second=44 amount=-2 +kerning first=260 second=44 amount=-1 +kerning first=101 second=231 amount=-1 +kerning first=214 second=205 amount=-1 +kerning first=70 second=244 amount=-1 +kerning first=106 second=244 amount=-1 +kerning first=1048 second=1052 amount=-1 +kerning first=352 second=323 amount=-1 +kerning first=365 second=235 amount=-1 +kerning first=364 second=274 amount=-1 +kerning first=280 second=323 amount=-1 +kerning first=70 second=314 amount=-1 +kerning first=1055 second=1054 amount=-1 +kerning first=283 second=244 amount=-1 +kerning first=264 second=218 amount=-1 +kerning first=197 second=355 amount=-1 +kerning first=355 second=244 amount=-1 +kerning first=192 second=218 amount=-1 +kerning first=228 second=248 amount=-1 +kerning first=206 second=231 amount=-1 +kerning first=288 second=327 amount=-1 +kerning first=83 second=44 amount=-1 +kerning first=187 second=290 amount=-1 +kerning first=264 second=248 amount=-1 +kerning first=119 second=44 amount=-1 +kerning first=364 second=217 amount=-1 +kerning first=1039 second=1049 amount=-1 +kerning first=219 second=275 amount=-1 +kerning first=1046 second=1081 amount=-1 +kerning first=356 second=243 amount=-1 +kerning first=327 second=275 amount=-1 +kerning first=207 second=110 amount=-1 +kerning first=352 second=223 amount=-1 +kerning first=283 second=314 amount=-1 +kerning first=291 second=275 amount=-1 +kerning first=117 second=8220 amount=-1 +kerning first=1036 second=1088 amount=-1 +kerning first=70 second=214 amount=-1 +kerning first=196 second=45 amount=-1 +kerning first=1038 second=1107 amount=-1 +kerning first=78 second=275 amount=-1 +kerning first=200 second=249 amount=-1 +kerning first=8222 second=259 amount=-1 +kerning first=1069 second=1031 amount=-1 +kerning first=330 second=298 amount=-1 +kerning first=1118 second=1081 amount=-1 +kerning first=103 second=223 amount=-1 +kerning first=1105 second=1097 amount=-1 +kerning first=71 second=80 amount=-1 +kerning first=207 second=97 amount=-1 +kerning first=67 second=223 amount=-1 +kerning first=268 second=45 amount=-1 +kerning first=194 second=370 amount=-1 +kerning first=284 second=80 amount=-1 +kerning first=103 second=353 amount=-1 +kerning first=280 second=223 amount=-1 +kerning first=101 second=122 amount=-1 +kerning first=67 second=353 amount=-1 +kerning first=212 second=80 amount=-1 +kerning first=1028 second=1091 amount=-1 +kerning first=105 second=101 amount=-1 +kerning first=69 second=200 amount=-1 +kerning first=277 second=232 amount=-1 +kerning first=366 second=266 amount=-1 +kerning first=270 second=200 amount=-1 +kerning first=330 second=266 amount=-1 +kerning first=205 second=232 amount=-1 +kerning first=1049 second=1072 amount=-1 +kerning first=205 second=362 amount=-1 +kerning first=198 second=200 amount=-1 +kerning first=325 second=226 amount=-1 +kerning first=217 second=296 amount=-1 +kerning first=77 second=225 amount=-1 +kerning first=220 second=8222 amount=-2 +kerning first=277 second=8250 amount=-1 +kerning first=219 second=122 amount=-1 +kerning first=258 second=266 amount=-1 +kerning first=313 second=362 amount=-1 +kerning first=310 second=371 amount=-1 +kerning first=74 second=234 amount=-1 +kerning first=45 second=266 amount=-1 +kerning first=79 second=217 amount=-1 +kerning first=274 second=371 amount=-1 +kerning first=89 second=251 amount=-1 +kerning first=100 second=8250 amount=-1 +kerning first=207 second=209 amount=-1 +kerning first=315 second=354 amount=-1 +kerning first=110 second=234 amount=-1 +kerning first=8217 second=219 amount=-1 +kerning first=220 second=217 amount=-1 +kerning first=100 second=232 amount=-1 +kerning first=251 second=234 amount=-1 +kerning first=1044 second=1089 amount=-1 +kerning first=203 second=264 amount=-1 +kerning first=363 second=275 amount=-1 +kerning first=210 second=88 amount=-1 +kerning first=70 second=274 amount=-1 +kerning first=323 second=71 amount=-1 +kerning first=323 second=234 amount=-1 +kerning first=287 second=234 amount=-1 +kerning first=1069 second=1065 amount=-1 +kerning first=1047 second=1037 amount=-1 +kerning first=262 second=380 amount=-1 +kerning first=207 second=203 amount=-1 +kerning first=115 second=287 amount=-1 +kerning first=282 second=8220 amount=-1 +kerning first=203 second=313 amount=-1 +kerning first=69 second=8221 amount=-1 +kerning first=368 second=315 amount=-1 +kerning first=220 second=111 amount=-1 +kerning first=1042 second=1070 amount=-1 +kerning first=84 second=8218 amount=-1 +kerning first=354 second=8220 amount=-1 +kerning first=328 second=287 amount=-1 +kerning first=1033 second=1024 amount=-1 +kerning first=211 second=374 amount=-1 +kerning first=328 second=111 amount=-1 +kerning first=66 second=203 amount=-1 +kerning first=364 second=111 amount=-1 +kerning first=8218 second=248 amount=-1 +kerning first=83 second=315 amount=-1 +kerning first=289 second=120 amount=-1 +kerning first=1064 second=1054 amount=-1 +kerning first=374 second=267 amount=-1 +kerning first=1050 second=1028 amount=-1 +kerning first=8216 second=364 amount=-1 +kerning first=323 second=114 amount=-1 +kerning first=296 second=315 amount=-1 +kerning first=196 second=118 amount=-1 +kerning first=230 second=267 amount=-1 +kerning first=204 second=212 amount=-1 +kerning first=105 second=8220 amount=-1 +kerning first=266 second=267 amount=-1 +kerning first=187 second=220 amount=-1 +kerning first=69 second=8220 amount=-1 +kerning first=302 second=267 amount=-1 +kerning first=338 second=370 amount=-1 +kerning first=110 second=114 amount=-1 +kerning first=76 second=356 amount=-1 +kerning first=85 second=199 amount=-1 +kerning first=206 second=68 amount=-1 +kerning first=266 second=370 amount=-1 +kerning first=8217 second=113 amount=-1 +kerning first=251 second=114 amount=-1 +kerning first=78 second=74 amount=-1 +kerning first=302 second=370 amount=-1 +kerning first=72 second=263 amount=-1 +kerning first=330 second=242 amount=-1 +kerning first=108 second=263 amount=-1 +kerning first=270 second=75 amount=-1 +kerning first=262 second=199 amount=-1 +kerning first=210 second=194 amount=-1 +kerning first=74 second=114 amount=-1 +kerning first=1069 second=1059 amount=-1 +kerning first=298 second=199 amount=-1 +kerning first=220 second=81 amount=-1 +kerning first=249 second=263 amount=-1 +kerning first=352 second=310 amount=-1 +kerning first=327 second=74 amount=-1 +kerning first=370 second=199 amount=-1 +kerning first=197 second=361 amount=-1 +kerning first=99 second=106 amount=-1 +kerning first=280 second=310 amount=-1 +kerning first=364 second=81 amount=-1 +kerning first=218 second=382 amount=-1 +kerning first=278 second=68 amount=-1 +kerning first=298 second=269 amount=-1 +kerning first=45 second=65 amount=-1 +kerning first=350 second=68 amount=-1 +kerning first=226 second=269 amount=-1 +kerning first=1107 second=1116 amount=-1 +kerning first=67 second=310 amount=-1 +kerning first=209 second=315 amount=-1 +kerning first=206 second=334 amount=-1 +kerning first=197 second=288 amount=-1 +kerning first=366 second=65 amount=-1 +kerning first=1050 second=1101 amount=-1 +kerning first=1051 second=1043 amount=-1 +kerning first=1041 second=1055 amount=-1 +kerning first=68 second=325 amount=-1 +kerning first=193 second=84 amount=-1 +kerning first=255 second=318 amount=-1 +kerning first=8220 second=370 amount=-1 +kerning first=84 second=227 amount=-1 +kerning first=304 second=346 amount=-1 +kerning first=268 second=346 amount=-1 +kerning first=1069 second=1051 amount=-1 +kerning first=209 second=325 amount=-1 +kerning first=283 second=108 amount=-1 +kerning first=219 second=245 amount=-1 +kerning first=235 second=337 amount=-1 +kerning first=364 second=187 amount=-2 +kerning first=98 second=318 amount=-1 +kerning first=228 second=291 amount=-1 +kerning first=256 second=187 amount=-1 +kerning first=333 second=122 amount=-1 +kerning first=78 second=245 amount=-1 +kerning first=1027 second=1085 amount=-1 +kerning first=8250 second=315 amount=-1 +kerning first=281 second=351 amount=-1 +kerning first=196 second=251 amount=-1 +kerning first=345 second=8217 amount=-1 +kerning first=232 second=251 amount=-1 +kerning first=381 second=8217 amount=-1 +kerning first=73 second=99 amount=-1 +kerning first=304 second=75 amount=-1 +kerning first=217 second=274 amount=-1 +kerning first=109 second=99 amount=-1 +kerning first=268 second=75 amount=-1 +kerning first=363 second=245 amount=-1 +kerning first=250 second=99 amount=-1 +kerning first=327 second=245 amount=-1 +kerning first=220 second=187 amount=-2 +kerning first=1044 second=1119 amount=-1 +kerning first=291 second=245 amount=-1 +kerning first=79 second=187 amount=-1 +kerning first=307 second=337 amount=-1 +kerning first=65 second=334 amount=-1 +kerning first=1064 second=1027 amount=-1 +kerning first=115 second=187 amount=-1 +kerning first=271 second=337 amount=-1 +kerning first=197 second=375 amount=-1 +kerning first=275 second=99 amount=-1 +kerning first=271 second=242 amount=-1 +kerning first=277 second=122 amount=-1 +kerning first=70 second=330 amount=-1 +kerning first=375 second=347 amount=-1 +kerning first=1054 second=1069 amount=-1 +kerning first=307 second=242 amount=-1 +kerning first=325 second=334 amount=-1 +kerning first=77 second=268 amount=-1 +kerning first=199 second=242 amount=-1 +kerning first=268 second=281 amount=-1 +kerning first=235 second=242 amount=-1 +kerning first=304 second=281 amount=-1 +kerning first=85 second=362 amount=-1 +kerning first=231 second=347 amount=-1 +kerning first=218 second=268 amount=-1 +kerning first=79 second=325 amount=-1 +kerning first=85 second=364 amount=-1 +kerning first=97 second=233 amount=-1 +kerning first=323 second=277 amount=-1 +kerning first=287 second=277 amount=-1 +kerning first=74 second=197 amount=-1 +kerning first=327 second=202 amount=-1 +kerning first=8222 second=118 amount=-1 +kerning first=364 second=325 amount=-1 +kerning first=78 second=202 amount=-1 +kerning first=219 second=202 amount=-1 +kerning first=201 second=264 amount=-1 +kerning first=1071 second=1073 amount=-1 +kerning first=262 second=8217 amount=-1 +kerning first=339 second=337 amount=-1 +kerning first=105 second=267 amount=-1 +kerning first=302 second=69 amount=-1 +kerning first=370 second=364 amount=-1 +kerning first=81 second=193 amount=-1 +kerning first=266 second=69 amount=-1 +kerning first=1070 second=1083 amount=-1 +kerning first=334 second=8217 amount=-2 +kerning first=334 second=364 amount=-1 +kerning first=280 second=82 amount=-1 +kerning first=298 second=364 amount=-1 +kerning first=88 second=290 amount=-1 +kerning first=356 second=351 amount=-1 +kerning first=338 second=69 amount=-1 +kerning first=85 second=8217 amount=-1 +kerning first=262 second=364 amount=-1 +kerning first=121 second=8217 amount=-2 +kerning first=352 second=82 amount=-1 +kerning first=193 second=290 amount=-1 +kerning first=374 second=338 amount=-1 +kerning first=110 second=277 amount=-1 +kerning first=1065 second=1091 amount=-1 +kerning first=226 second=8217 amount=-2 +kerning first=355 second=103 amount=-1 +kerning first=198 second=338 amount=-1 +kerning first=234 second=273 amount=-1 +kerning first=1056 second=1061 amount=-1 +kerning first=193 second=355 amount=-1 +kerning first=70 second=266 amount=-1 +kerning first=1051 second=1113 amount=-1 +kerning first=251 second=277 amount=-1 +kerning first=289 second=380 amount=-1 +kerning first=88 second=355 amount=-1 +kerning first=366 second=193 amount=-1 +kerning first=217 second=334 amount=-1 +kerning first=1042 second=1059 amount=-2 +kerning first=212 second=351 amount=-1 +kerning first=77 second=333 amount=-1 +kerning first=290 second=203 amount=-1 +kerning first=355 second=171 amount=-1 +kerning first=45 second=122 amount=-1 +kerning first=291 second=112 amount=-1 +kerning first=1093 second=1095 amount=-1 +kerning first=362 second=203 amount=-1 +kerning first=197 second=117 amount=-1 +kerning first=80 second=73 amount=-1 +kerning first=218 second=333 amount=-1 +kerning first=218 second=203 amount=-1 +kerning first=258 second=374 amount=-1 +kerning first=97 second=263 amount=-1 +kerning first=72 second=220 amount=-1 +kerning first=269 second=117 amount=-1 +kerning first=8222 second=216 amount=-1 +kerning first=70 second=171 amount=-2 +kerning first=233 second=117 amount=-1 +kerning first=81 second=374 amount=-1 +kerning first=106 second=171 amount=-1 +kerning first=8222 second=251 amount=-1 +kerning first=70 second=206 amount=-1 +kerning first=65 second=367 amount=-1 +kerning first=344 second=264 amount=-1 +kerning first=275 second=44 amount=-1 +kerning first=323 second=212 amount=-1 +kerning first=354 second=229 amount=-1 +kerning first=321 second=220 amount=-1 +kerning first=8250 second=87 amount=-2 +kerning first=278 second=304 amount=-1 +kerning first=77 second=368 amount=-1 +kerning first=220 second=382 amount=-1 +kerning first=118 second=316 amount=-1 +kerning first=350 second=304 amount=-1 +kerning first=192 second=356 amount=-1 +kerning first=279 second=246 amount=-1 +kerning first=211 second=206 amount=-1 +kerning first=1056 second=1118 amount=-1 +kerning first=366 second=103 amount=-1 +kerning first=223 second=316 amount=-1 +kerning first=112 second=120 amount=-1 +kerning first=207 second=246 amount=-1 +kerning first=364 second=382 amount=-1 +kerning first=217 second=120 amount=-1 +kerning first=77 second=8221 amount=-1 +kerning first=213 second=220 amount=-1 +kerning first=259 second=316 amount=-1 +kerning first=253 second=120 amount=-1 +kerning first=221 second=197 amount=-1 +kerning first=80 second=194 amount=-1 +kerning first=362 second=368 amount=-1 +kerning first=75 second=211 amount=-1 +kerning first=199 second=109 amount=-1 +kerning first=218 second=8221 amount=-1 +kerning first=117 second=103 amount=-1 +kerning first=1060 second=1051 amount=-1 +kerning first=378 second=8220 amount=-1 +kerning first=326 second=333 amount=-1 +kerning first=254 second=8221 amount=-2 +kerning first=221 second=194 amount=-1 +kerning first=120 second=8218 amount=-1 +kerning first=362 second=333 amount=-1 +kerning first=290 second=8221 amount=-1 +kerning first=218 second=368 amount=-1 +kerning first=326 second=8221 amount=-2 +kerning first=270 second=330 amount=-1 +kerning first=362 second=8221 amount=-1 +kerning first=1064 second=1092 amount=-1 +kerning first=290 second=368 amount=-1 +kerning first=1050 second=1088 amount=-1 +kerning first=214 second=197 amount=-1 +kerning first=192 second=85 amount=-1 +kerning first=269 second=223 amount=-1 +kerning first=327 second=210 amount=-1 +kerning first=101 second=98 amount=-1 +kerning first=65 second=98 amount=-1 +kerning first=367 second=243 amount=-1 +kerning first=197 second=223 amount=-1 +kerning first=85 second=234 amount=-1 +kerning first=219 second=210 amount=-1 +kerning first=1050 second=1108 amount=-1 +kerning first=78 second=210 amount=-1 +kerning first=199 second=280 amount=-1 +kerning first=289 second=326 amount=-1 +kerning first=282 second=302 amount=-1 +kerning first=72 second=122 amount=-1 +kerning first=339 second=339 amount=-1 +kerning first=275 second=107 amount=-1 +kerning first=108 second=122 amount=-1 +kerning first=210 second=302 amount=-1 +kerning first=264 second=213 amount=-1 +kerning first=69 second=302 amount=-1 +kerning first=259 second=243 amount=-1 +kerning first=88 second=363 amount=-1 +kerning first=267 second=339 amount=-1 +kerning first=193 second=363 amount=-1 +kerning first=288 second=219 amount=-1 +kerning first=231 second=339 amount=-1 +kerning first=75 second=284 amount=-1 +kerning first=1033 second=1059 amount=-2 +kerning first=269 second=8249 amount=-1 +kerning first=368 second=350 amount=-1 +kerning first=89 second=232 amount=-1 +kerning first=8218 second=218 amount=-1 +kerning first=75 second=219 amount=-1 +kerning first=305 second=8249 amount=-1 +kerning first=251 second=235 amount=-1 +kerning first=205 second=78 amount=-1 +kerning first=86 second=46 amount=-1 +kerning first=262 second=68 amount=-1 +kerning first=73 second=335 amount=-1 +kerning first=302 second=232 amount=-1 +kerning first=266 second=232 amount=-1 +kerning first=230 second=232 amount=-1 +kerning first=109 second=335 amount=-1 +kerning first=296 second=350 amount=-1 +kerning first=317 second=89 amount=-1 +kerning first=262 second=234 amount=-1 +kerning first=8250 second=79 amount=-1 +kerning first=252 second=281 amount=-1 +kerning first=69 second=262 amount=-1 +kerning first=263 second=241 amount=-1 +kerning first=226 second=234 amount=-1 +kerning first=291 second=116 amount=-1 +kerning first=70 second=344 amount=-1 +kerning first=1071 second=1081 amount=-1 +kerning first=196 second=354 amount=-1 +kerning first=211 second=344 amount=-1 +kerning first=278 second=8222 amount=-1 +kerning first=298 second=234 amount=-1 +kerning first=232 second=289 amount=-1 +kerning first=117 second=171 amount=-1 +kerning first=1030 second=1068 amount=-1 +kerning first=370 second=234 amount=-1 +kerning first=1067 second=1075 amount=-1 +kerning first=68 second=89 amount=-1 +kerning first=264 second=85 amount=-1 +kerning first=1031 second=1075 amount=-1 +kerning first=197 second=8249 amount=-1 +kerning first=1066 second=1068 amount=-1 +kerning first=296 second=79 amount=-1 +kerning first=258 second=366 amount=-1 +kerning first=196 second=216 amount=-1 +kerning first=115 second=46 amount=-1 +kerning first=1062 second=1108 amount=-1 +kerning first=304 second=216 amount=-1 +kerning first=323 second=204 amount=-1 +kerning first=368 second=79 amount=-1 +kerning first=268 second=216 amount=-1 +kerning first=368 second=250 amount=-1 +kerning first=81 second=366 amount=-1 +kerning first=89 second=332 amount=-1 +kerning first=86 second=241 amount=-1 +kerning first=98 second=378 amount=-1 +kerning first=1056 second=1053 amount=-1 +kerning first=350 second=8222 amount=-1 +kerning first=45 second=366 amount=-1 +kerning first=1046 second=1038 amount=-1 +kerning first=218 second=195 amount=-1 +kerning first=266 second=332 amount=-1 +kerning first=1064 second=1084 amount=-1 +kerning first=233 second=380 amount=-1 +kerning first=198 second=67 amount=-1 +kerning first=83 second=250 amount=-1 +kerning first=291 second=104 amount=-1 +kerning first=194 second=332 amount=-1 +kerning first=369 second=99 amount=-1 +kerning first=362 second=195 amount=-1 +kerning first=255 second=104 amount=-1 +kerning first=374 second=332 amount=-1 +kerning first=79 second=46 amount=-1 +kerning first=330 second=366 amount=-1 +kerning first=338 second=332 amount=-1 +kerning first=366 second=366 amount=-1 +kerning first=302 second=332 amount=-1 +kerning first=1078 second=1105 amount=-1 +kerning first=220 second=317 amount=-1 +kerning first=366 second=201 amount=-1 +kerning first=101 second=369 amount=-1 +kerning first=291 second=110 amount=-1 +kerning first=221 second=259 amount=-1 +kerning first=279 second=311 amount=-1 +kerning first=344 second=116 amount=-1 +kerning first=65 second=369 amount=-1 +kerning first=330 second=201 amount=-1 +kerning first=187 second=381 amount=-1 +kerning first=314 second=369 amount=-1 +kerning first=364 second=317 amount=-1 +kerning first=278 second=369 amount=-1 +kerning first=99 second=316 amount=-1 +kerning first=282 second=355 amount=-1 +kerning first=1049 second=1062 amount=-1 +kerning first=74 second=204 amount=-1 +kerning first=8218 second=356 amount=-1 +kerning first=88 second=119 amount=-1 +kerning first=252 second=113 amount=-1 +kerning first=275 second=378 amount=-1 +kerning first=45 second=201 amount=-1 +kerning first=242 second=8222 amount=-1 +kerning first=81 second=201 amount=-1 +kerning first=1039 second=1041 amount=-1 +kerning first=362 second=268 amount=-1 +kerning first=116 second=259 amount=-1 +kerning first=101 second=8222 amount=-1 +kerning first=1041 second=1027 amount=-1 +kerning first=80 second=259 amount=-1 +kerning first=79 second=317 amount=-1 +kerning first=1059 second=1044 amount=-1 +kerning first=78 second=331 amount=-1 +kerning first=200 second=116 amount=-1 +kerning first=205 second=262 amount=-1 +kerning first=1062 second=1095 amount=-1 +kerning first=74 second=256 amount=-1 +kerning first=99 second=311 amount=-1 +kerning first=233 second=116 amount=-1 +kerning first=205 second=271 amount=-1 +kerning first=73 second=313 amount=-1 +kerning first=197 second=116 amount=-1 +kerning first=89 second=198 amount=-1 +kerning first=334 second=8221 amount=-2 +kerning first=83 second=363 amount=-1 +kerning first=364 second=357 amount=-1 +kerning first=362 second=67 amount=-1 +kerning first=119 second=363 amount=-1 +kerning first=187 second=110 amount=-1 +kerning first=66 second=195 amount=-1 +kerning first=375 second=378 amount=-1 +kerning first=370 second=268 amount=-1 +kerning first=77 second=207 amount=-1 +kerning first=339 second=378 amount=-1 +kerning first=187 second=317 amount=-1 +kerning first=354 second=113 amount=-1 +kerning first=218 second=67 amount=-1 +kerning first=346 second=366 amount=-1 +kerning first=205 second=210 amount=-1 +kerning first=298 second=268 amount=-1 +kerning first=266 second=296 amount=-1 +kerning first=310 second=366 amount=-1 +kerning first=1030 second=1081 amount=-1 +kerning first=8222 second=97 amount=-1 +kerning first=202 second=366 amount=-1 +kerning first=77 second=67 amount=-1 +kerning first=8250 second=249 amount=-1 +kerning first=370 second=115 amount=-1 +kerning first=85 second=268 amount=-1 +kerning first=374 second=8250 amount=-1 +kerning first=1086 second=1093 amount=-1 +kerning first=288 second=302 amount=-1 +kerning first=338 second=8250 amount=-1 +kerning first=75 second=8220 amount=-1 +kerning first=199 second=101 amount=-1 +kerning first=281 second=107 amount=-1 +kerning first=327 second=73 amount=-1 +kerning first=266 second=8250 amount=-1 +kerning first=271 second=101 amount=-1 +kerning first=230 second=8250 amount=-1 +kerning first=111 second=8220 amount=-2 +kerning first=235 second=101 amount=-1 +kerning first=194 second=8250 amount=-1 +kerning first=252 second=8220 amount=-1 +kerning first=78 second=8218 amount=-1 +kerning first=211 second=219 amount=-1 +kerning first=216 second=8220 amount=-2 +kerning first=287 second=351 amount=-1 +kerning first=307 second=101 amount=-1 +kerning first=89 second=8250 amount=-1 +kerning first=268 second=277 amount=-1 +kerning first=221 second=266 amount=-1 +kerning first=232 second=277 amount=-1 +kerning first=70 second=219 amount=-1 +kerning first=111 second=122 amount=-1 +kerning first=1056 second=1089 amount=-1 +kerning first=220 second=334 amount=-1 +kerning first=374 second=198 amount=-1 +kerning first=89 second=345 amount=-1 +kerning first=350 second=296 amount=-1 +kerning first=219 second=73 amount=-1 +kerning first=1038 second=1102 amount=-1 +kerning first=194 second=345 amount=-1 +kerning first=304 second=277 amount=-1 +kerning first=225 second=235 amount=-1 +kerning first=261 second=235 amount=-1 +kerning first=233 second=283 amount=-1 +kerning first=269 second=283 amount=-1 +kerning first=369 second=235 amount=-1 +kerning first=1041 second=1047 amount=-1 +kerning first=339 second=231 amount=-1 +kerning first=204 second=338 amount=-1 +kerning first=364 second=286 amount=-1 +kerning first=8217 second=328 amount=-1 +kerning first=8250 second=256 amount=-1 +kerning first=310 second=79 amount=-1 +kerning first=324 second=8220 amount=-2 +kerning first=231 second=351 amount=-1 +kerning first=288 second=8220 amount=-1 +kerning first=367 second=263 amount=-1 +kerning first=68 second=197 amount=-1 +kerning first=1064 second=1076 amount=-1 +kerning first=192 second=86 amount=-1 +kerning first=68 second=274 amount=-1 +kerning first=375 second=351 amount=-1 +kerning first=205 second=83 amount=-1 +kerning first=202 second=79 amount=-1 +kerning first=339 second=351 amount=-1 +kerning first=1062 second=1074 amount=-1 +kerning first=274 second=79 amount=-1 +kerning first=257 second=8250 amount=-1 +kerning first=267 second=351 amount=-1 +kerning first=1043 second=1051 amount=-1 +kerning first=264 second=347 amount=-1 +kerning first=258 second=104 amount=-1 +kerning first=212 second=8220 amount=-2 +kerning first=374 second=171 amount=-2 +kerning first=71 second=278 amount=-1 +kerning first=268 second=70 amount=-1 +kerning first=8250 second=323 amount=-1 +kerning first=70 second=192 amount=-1 +kerning first=231 second=244 amount=-1 +kerning first=8216 second=115 amount=-1 +kerning first=267 second=244 amount=-1 +kerning first=284 second=278 amount=-1 +kerning first=209 second=274 amount=-1 +kerning first=339 second=244 amount=-1 +kerning first=45 second=121 amount=-1 +kerning first=1034 second=1065 amount=-1 +kerning first=8250 second=216 amount=-1 +kerning first=108 second=382 amount=-1 +kerning first=1070 second=1065 amount=-1 +kerning first=1057 second=1094 amount=-1 +kerning first=231 second=231 amount=-1 +kerning first=325 second=201 amount=-1 +kerning first=267 second=231 amount=-1 +kerning first=194 second=171 amount=-1 +kerning first=219 second=100 amount=-1 +kerning first=304 second=70 amount=-1 +kerning first=327 second=100 amount=-1 +kerning first=84 second=235 amount=-1 +kerning first=266 second=171 amount=-1 +kerning first=206 second=269 amount=-1 +kerning first=45 second=86 amount=-2 +kerning first=338 second=171 amount=-1 +kerning first=217 second=201 amount=-1 +kerning first=101 second=269 amount=-1 +kerning first=192 second=266 amount=-1 +kerning first=70 second=65 amount=-1 +kerning first=1053 second=1071 amount=-1 +kerning first=264 second=266 amount=-1 +kerning first=280 second=214 amount=-1 +kerning first=8250 second=363 amount=-1 +kerning first=1064 second=1048 amount=-1 +kerning first=8222 second=250 amount=-1 +kerning first=194 second=318 amount=-1 +kerning first=71 second=45 amount=-1 +kerning first=1107 second=1090 amount=-1 +kerning first=70 second=353 amount=-1 +kerning first=87 second=266 amount=-1 +kerning first=266 second=318 amount=-1 +kerning first=220 second=313 amount=-1 +kerning first=316 second=171 amount=-1 +kerning first=264 second=200 amount=-1 +kerning first=324 second=275 amount=-1 +kerning first=210 second=200 amount=-1 +kerning first=218 second=260 amount=-1 +kerning first=214 second=370 amount=-1 +kerning first=214 second=8222 amount=-1 +kerning first=107 second=45 amount=-1 +kerning first=73 second=370 amount=-1 +kerning first=114 second=240 amount=-1 +kerning first=261 second=243 amount=-1 +kerning first=1044 second=1097 amount=-1 +kerning first=356 second=45 amount=-1 +kerning first=199 second=362 amount=-1 +kerning first=73 second=8222 amount=-1 +kerning first=362 second=260 amount=-1 +kerning first=1051 second=1050 amount=-1 +kerning first=263 second=100 amount=-1 +kerning first=1038 second=1092 amount=-1 +kerning first=284 second=45 amount=-1 +kerning first=375 second=187 amount=-1 +kerning first=252 second=275 amount=-1 +kerning first=67 second=214 amount=-1 +kerning first=286 second=370 amount=-1 +kerning first=80 second=71 amount=-1 +kerning first=330 second=257 amount=-1 +kerning first=194 second=357 amount=-1 +kerning first=73 second=223 amount=-1 +kerning first=366 second=257 amount=-1 +kerning first=270 second=209 amount=-1 +kerning first=363 second=267 amount=-1 +kerning first=198 second=209 amount=-1 +kerning first=268 second=97 amount=-1 +kerning first=229 second=267 amount=-1 +kerning first=286 second=223 amount=-1 +kerning first=304 second=97 amount=-1 +kerning first=218 second=234 amount=-1 +kerning first=195 second=217 amount=-1 +kerning first=337 second=380 amount=-1 +kerning first=101 second=243 amount=-1 +kerning first=1048 second=1027 amount=-1 +kerning first=206 second=243 amount=-1 +kerning first=213 second=258 amount=-1 +kerning first=314 second=243 amount=-1 +kerning first=8218 second=224 amount=-1 +kerning first=71 second=72 amount=-1 +kerning first=232 second=8221 amount=-2 +kerning first=1030 second=1119 amount=-1 +kerning first=8222 second=277 amount=-1 +kerning first=268 second=8221 amount=-1 +kerning first=266 second=345 amount=-1 +kerning first=217 second=335 amount=-1 +kerning first=302 second=345 amount=-1 +kerning first=338 second=345 amount=-1 +kerning first=296 second=242 amount=-1 +kerning first=374 second=345 amount=-1 +kerning first=284 second=72 amount=-1 +kerning first=1030 second=1054 amount=-1 +kerning first=250 second=245 amount=-1 +kerning first=224 second=242 amount=-1 +kerning first=220 second=352 amount=-1 +kerning first=354 second=99 amount=-1 +kerning first=325 second=335 amount=-1 +kerning first=356 second=225 amount=-1 +kerning first=97 second=232 amount=-1 +kerning first=370 second=211 amount=-1 +kerning first=326 second=234 amount=-1 +kerning first=368 second=242 amount=-1 +kerning first=364 second=352 amount=-1 +kerning first=327 second=267 amount=-1 +kerning first=362 second=234 amount=-1 +kerning first=193 second=105 amount=-1 +kerning first=103 second=241 amount=-1 +kerning first=296 second=336 amount=-1 +kerning first=249 second=8221 amount=-1 +kerning first=1039 second=1028 amount=-1 +kerning first=77 second=233 amount=-1 +kerning first=275 second=98 amount=-1 +kerning first=296 second=216 amount=-1 +kerning first=209 second=80 amount=-1 +kerning first=368 second=336 amount=-1 +kerning first=201 second=199 amount=-1 +kerning first=1042 second=1045 amount=-1 +kerning first=85 second=115 amount=-1 +kerning first=1102 second=1093 amount=-1 +kerning first=271 second=114 amount=-1 +kerning first=326 second=233 amount=-1 +kerning first=368 second=216 amount=-1 +kerning first=1043 second=1077 amount=-1 +kerning first=218 second=233 amount=-1 +kerning first=1050 second=1079 amount=-1 +kerning first=267 second=378 amount=-1 +kerning first=8218 second=227 amount=-1 +kerning first=1077 second=1080 amount=-1 +kerning first=330 second=284 amount=-1 +kerning first=67 second=241 amount=-1 +kerning first=231 second=378 amount=-1 +kerning first=1041 second=1080 amount=-1 +kerning first=1067 second=1113 amount=-1 +kerning first=235 second=114 amount=-1 +kerning first=362 second=233 amount=-1 +kerning first=205 second=344 amount=-1 +kerning first=286 second=8222 amount=-1 +kerning first=199 second=114 amount=-1 +kerning first=366 second=284 amount=-1 +kerning first=1033 second=1046 amount=-1 +kerning first=89 second=224 amount=-1 +kerning first=79 second=78 amount=-1 +kerning first=200 second=327 amount=-1 +kerning first=87 second=44 amount=-1 +kerning first=352 second=361 amount=-1 +kerning first=272 second=327 amount=-1 +kerning first=258 second=284 amount=-1 +kerning first=211 second=353 amount=-1 +kerning first=280 second=361 amount=-1 +kerning first=266 second=224 amount=-1 +kerning first=283 second=353 amount=-1 +kerning first=86 second=332 amount=-1 +kerning first=232 second=250 amount=-1 +kerning first=201 second=8222 amount=-1 +kerning first=298 second=115 amount=-1 +kerning first=344 second=81 amount=-1 +kerning first=196 second=250 amount=-1 +kerning first=334 second=115 amount=-1 +kerning first=196 second=8221 amount=-2 +kerning first=45 second=284 amount=-1 +kerning first=351 second=8221 amount=-2 +kerning first=70 second=218 amount=-1 +kerning first=77 second=273 amount=-1 +kerning first=196 second=44 amount=-1 +kerning first=374 second=224 amount=-1 +kerning first=232 second=44 amount=-1 +kerning first=281 second=355 amount=-1 +kerning first=203 second=8249 amount=-1 +kerning first=70 second=78 amount=-1 +kerning first=209 second=355 amount=-1 +kerning first=350 second=282 amount=-1 +kerning first=325 second=227 amount=-1 +kerning first=1049 second=1104 amount=-1 +kerning first=77 second=380 amount=-1 +kerning first=311 second=8249 amount=-1 +kerning first=67 second=267 amount=-1 +kerning first=103 second=267 amount=-1 +kerning first=1043 second=1104 amount=-1 +kerning first=206 second=282 amount=-1 +kerning first=201 second=72 amount=-1 +kerning first=80 second=346 amount=-1 +kerning first=104 second=248 amount=-1 +kerning first=253 second=291 amount=-1 +kerning first=279 second=273 amount=-1 +kerning first=211 second=218 amount=-1 +kerning first=1059 second=1079 amount=-1 +kerning first=209 second=248 amount=-1 +kerning first=1036 second=1089 amount=-1 +kerning first=1052 second=1119 amount=-1 +kerning first=116 second=224 amount=-1 +kerning first=74 second=337 amount=-1 +kerning first=290 second=114 amount=-1 +kerning first=1051 second=1031 amount=-1 +kerning first=1049 second=1086 amount=-1 +kerning first=344 second=288 amount=-1 +kerning first=83 second=8222 amount=-1 +kerning first=323 second=230 amount=-1 +kerning first=1051 second=1073 amount=-1 +kerning first=8250 second=324 amount=-1 +kerning first=89 second=279 amount=-1 +kerning first=272 second=206 amount=-1 +kerning first=70 second=337 amount=-1 +kerning first=248 second=291 amount=-1 +kerning first=74 second=230 amount=-1 +kerning first=8222 second=71 amount=-1 +kerning first=219 second=361 amount=-1 +kerning first=200 second=206 amount=-1 +kerning first=207 second=368 amount=-1 +kerning first=107 second=291 amount=-1 +kerning first=66 second=8221 amount=-2 +kerning first=217 second=227 amount=-1 +kerning first=344 second=8218 amount=-1 +kerning first=1027 second=1117 amount=-1 +kerning first=8217 second=275 amount=-1 +kerning first=323 second=337 amount=-1 +kerning first=1030 second=1080 amount=-1 +kerning first=315 second=368 amount=-1 +kerning first=287 second=337 amount=-1 +kerning first=251 second=337 amount=-1 +kerning first=243 second=8221 amount=-2 +kerning first=66 second=368 amount=-1 +kerning first=279 second=8221 amount=-2 +kerning first=187 second=84 amount=-1 +kerning first=200 second=288 amount=-1 +kerning first=315 second=8221 amount=-1 +kerning first=171 second=368 amount=-1 +kerning first=110 second=337 amount=-1 +kerning first=121 second=187 amount=-1 +kerning first=304 second=211 amount=-1 +kerning first=375 second=107 amount=-1 +kerning first=268 second=211 amount=-1 +kerning first=325 second=200 amount=-1 +kerning first=85 second=187 amount=-2 +kerning first=78 second=99 amount=-1 +kerning first=291 second=99 amount=-1 +kerning first=334 second=187 amount=-1 +kerning first=278 second=270 amount=-1 +kerning first=296 second=362 amount=-1 +kerning first=217 second=200 amount=-1 +kerning first=200 second=8218 amount=-1 +kerning first=226 second=187 amount=-1 +kerning first=8250 second=336 amount=-1 +kerning first=219 second=99 amount=-1 +kerning first=206 second=270 amount=-1 +kerning first=196 second=211 amount=-1 +kerning first=203 second=266 amount=-1 +kerning first=196 second=71 amount=-1 +kerning first=98 second=8222 amount=-1 +kerning first=266 second=279 amount=-1 +kerning first=337 second=8218 amount=-1 +kerning first=302 second=279 amount=-1 +kerning first=363 second=99 amount=-1 +kerning first=230 second=279 amount=-1 +kerning first=171 second=218 amount=-1 +kerning first=304 second=71 amount=-1 +kerning first=268 second=71 amount=-1 +kerning first=67 second=202 amount=-1 +kerning first=83 second=362 amount=-1 +kerning first=374 second=279 amount=-1 +kerning first=263 second=367 amount=-1 +kerning first=68 second=80 amount=-1 +kerning first=187 second=209 amount=-1 +kerning first=89 second=371 amount=-1 +kerning first=120 second=108 amount=-1 +kerning first=74 second=364 amount=-1 +kerning first=194 second=371 amount=-1 +kerning first=72 second=350 amount=-1 +kerning first=1030 second=1107 amount=-1 +kerning first=352 second=202 amount=-1 +kerning first=1055 second=1068 amount=-1 +kerning first=314 second=122 amount=-1 +kerning first=218 second=380 amount=-1 +kerning first=347 second=8249 amount=-1 +kerning first=220 second=205 amount=-1 +kerning first=333 second=108 amount=-1 +kerning first=362 second=273 amount=-1 +kerning first=79 second=205 amount=-1 +kerning first=338 second=270 amount=-1 +kerning first=205 second=69 amount=-1 +kerning first=225 second=108 amount=-1 +kerning first=201 second=334 amount=-1 +kerning first=196 second=303 amount=-1 +kerning first=350 second=270 amount=-1 +kerning first=254 second=380 amount=-1 +kerning first=261 second=108 amount=-1 +kerning first=362 second=380 amount=-1 +kerning first=364 second=205 amount=-1 +kerning first=218 second=273 amount=-1 +kerning first=187 second=117 amount=-1 +kerning first=323 second=364 amount=-1 +kerning first=198 second=68 amount=-1 +kerning first=220 second=8221 amount=-1 +kerning first=270 second=68 amount=-1 +kerning first=85 second=229 amount=-1 +kerning first=73 second=82 amount=-1 +kerning first=100 second=263 amount=-1 +kerning first=209 second=286 amount=-1 +kerning first=205 second=263 amount=-1 +kerning first=366 second=365 amount=-1 +kerning first=241 second=263 amount=-1 +kerning first=258 second=365 amount=-1 +kerning first=86 second=194 amount=-1 +kerning first=277 second=263 amount=-1 +kerning first=214 second=82 amount=-1 +kerning first=298 second=229 amount=-1 +kerning first=370 second=229 amount=-1 +kerning first=1054 second=1051 amount=-1 +kerning first=45 second=365 amount=-1 +kerning first=262 second=229 amount=-1 +kerning first=366 second=219 amount=-1 +kerning first=323 second=203 amount=-1 +kerning first=1030 second=1091 amount=-1 +kerning first=1051 second=1100 amount=-1 +kerning first=45 second=77 amount=-1 +kerning first=1027 second=1076 amount=-1 +kerning first=1064 second=1083 amount=-1 +kerning first=81 second=77 amount=-1 +kerning first=356 second=333 amount=-1 +kerning first=279 second=316 amount=-1 +kerning first=73 second=330 amount=-1 +kerning first=243 second=316 amount=-1 +kerning first=202 second=220 amount=-1 +kerning first=351 second=316 amount=-1 +kerning first=328 second=339 amount=-1 +kerning first=270 second=368 amount=-1 +kerning first=72 second=323 amount=-1 +kerning first=326 second=246 amount=-1 +kerning first=1043 second=1090 amount=-1 +kerning first=1056 second=1048 amount=-1 +kerning first=245 second=382 amount=-1 +kerning first=1091 second=1102 amount=-1 +kerning first=281 second=382 amount=-1 +kerning first=1030 second=1079 amount=-1 +kerning first=364 second=339 amount=-1 +kerning first=366 second=77 amount=-1 +kerning first=218 second=246 amount=-1 +kerning first=8216 second=256 amount=-2 +kerning first=314 second=103 amount=-1 +kerning first=286 second=330 amount=-1 +kerning first=1049 second=1034 amount=-1 +kerning first=1049 second=1099 amount=-1 +kerning first=1073 second=1093 amount=-1 +kerning first=213 second=323 amount=-1 +kerning first=8220 second=197 amount=-2 +kerning first=242 second=103 amount=-1 +kerning first=330 second=77 amount=-1 +kerning first=67 second=100 amount=-1 +kerning first=270 second=356 amount=-1 +kerning first=206 second=103 amount=-1 +kerning first=199 second=281 amount=-1 +kerning first=203 second=304 amount=-1 +kerning first=350 second=315 amount=-1 +kerning first=310 second=220 amount=-1 +kerning first=235 second=281 amount=-1 +kerning first=274 second=220 amount=-1 +kerning first=101 second=103 amount=-1 +kerning first=271 second=281 amount=-1 +kerning first=307 second=281 amount=-1 +kerning first=346 second=220 amount=-1 +kerning first=283 second=245 amount=-1 +kerning first=284 second=85 amount=-1 +kerning first=78 second=280 amount=-1 +kerning first=87 second=196 amount=-1 +kerning first=374 second=210 amount=-1 +kerning first=219 second=280 amount=-1 +kerning first=212 second=85 amount=-1 +kerning first=283 second=120 amount=-1 +kerning first=326 second=119 amount=-1 +kerning first=106 second=245 amount=-1 +kerning first=85 second=256 amount=-1 +kerning first=261 second=314 amount=-1 +kerning first=337 second=8217 amount=-2 +kerning first=338 second=210 amount=-1 +kerning first=70 second=245 amount=-1 +kerning first=225 second=314 amount=-1 +kerning first=298 second=216 amount=-1 +kerning first=317 second=221 amount=-1 +kerning first=1059 second=1114 amount=-1 +kerning first=266 second=210 amount=-1 +kerning first=327 second=280 amount=-1 +kerning first=120 second=314 amount=-1 +kerning first=77 second=315 amount=-1 +kerning first=112 second=8222 amount=-1 +kerning first=209 second=313 amount=-1 +kerning first=194 second=210 amount=-1 +kerning first=8250 second=255 amount=-1 +kerning first=310 second=118 amount=-1 +kerning first=333 second=314 amount=-1 +kerning first=223 second=8218 amount=-1 +kerning first=370 second=246 amount=-1 +kerning first=89 second=210 amount=-1 +kerning first=220 second=339 amount=-1 +kerning first=72 second=271 amount=-1 +kerning first=68 second=313 amount=-1 +kerning first=70 second=120 amount=-1 +kerning first=289 second=283 amount=-1 +kerning first=355 second=245 amount=-1 +kerning first=327 second=8250 amount=-1 +kerning first=266 second=352 amount=-1 +kerning first=1059 second=1107 amount=-1 +kerning first=370 second=256 amount=-1 +kerning first=1043 second=1117 amount=-1 +kerning first=255 second=8250 amount=-1 +kerning first=199 second=254 amount=-1 +kerning first=74 second=203 amount=-1 +kerning first=1066 second=1042 amount=-1 +kerning first=219 second=8250 amount=-2 +kerning first=367 second=111 amount=-1 +kerning first=235 second=254 amount=-1 +kerning first=350 second=76 amount=-1 +kerning first=272 second=219 amount=-1 +kerning first=114 second=8250 amount=-1 +kerning first=78 second=8250 amount=-1 +kerning first=278 second=76 amount=-1 +kerning first=200 second=219 amount=-1 +kerning first=205 second=327 amount=-1 +kerning first=192 second=374 amount=-1 +kerning first=243 second=289 amount=-1 +kerning first=1101 second=1084 amount=-1 +kerning first=224 second=101 amount=-1 +kerning first=206 second=76 amount=-1 +kerning first=291 second=305 amount=-1 +kerning first=1058 second=1101 amount=-1 +kerning first=316 second=367 amount=-1 +kerning first=221 second=212 amount=-1 +kerning first=296 second=101 amount=-1 +kerning first=193 second=8217 amount=-2 +kerning first=279 second=289 amount=-1 +kerning first=8217 second=367 amount=-1 +kerning first=261 second=114 amount=-1 +kerning first=229 second=8217 amount=-2 +kerning first=368 second=101 amount=-1 +kerning first=351 second=289 amount=-1 +kerning first=80 second=212 amount=-1 +kerning first=259 second=111 amount=-1 +kerning first=362 second=315 amount=-1 +kerning first=88 second=8217 amount=-1 +kerning first=1040 second=1059 amount=-2 +kerning first=302 second=280 amount=-1 +kerning first=1028 second=1044 amount=-1 +kerning first=266 second=280 amount=-1 +kerning first=264 second=335 amount=-1 +kerning first=8217 second=79 amount=-1 +kerning first=338 second=280 amount=-1 +kerning first=267 second=120 amount=-1 +kerning first=86 second=232 amount=-1 +kerning first=324 second=233 amount=-1 +kerning first=1060 second=1067 amount=-1 +kerning first=45 second=326 amount=-1 +kerning first=1071 second=1099 amount=-1 +kerning first=369 second=263 amount=-1 +kerning first=261 second=287 amount=-1 +kerning first=225 second=287 amount=-1 +kerning first=262 second=46 amount=-1 +kerning first=277 second=8220 amount=-2 +kerning first=82 second=85 amount=-1 +kerning first=104 second=339 amount=-1 +kerning first=241 second=8220 amount=-2 +kerning first=120 second=287 amount=-1 +kerning first=334 second=46 amount=-1 +kerning first=264 second=98 amount=-1 +kerning first=269 second=241 amount=-1 +kerning first=296 second=271 amount=-1 +kerning first=313 second=8220 amount=-1 +kerning first=369 second=287 amount=-1 +kerning first=87 second=335 amount=-1 +kerning first=192 second=98 amount=-1 +kerning first=205 second=302 amount=-1 +kerning first=368 second=271 amount=-1 +kerning first=228 second=335 amount=-1 +kerning first=88 second=67 amount=-1 +kerning first=242 second=378 amount=-1 +kerning first=266 second=83 amount=-1 +kerning first=206 second=378 amount=-1 +kerning first=302 second=83 amount=-1 +kerning first=1065 second=1090 amount=-1 +kerning first=101 second=378 amount=-1 +kerning first=262 second=311 amount=-1 +kerning first=288 second=344 amount=-1 +kerning first=121 second=46 amount=-1 +kerning first=198 second=80 amount=-1 +kerning first=254 second=289 amount=-1 +kerning first=201 second=278 amount=-1 +kerning first=85 second=46 amount=-2 +kerning first=314 second=378 amount=-1 +kerning first=1042 second=1114 amount=-1 +kerning first=326 second=289 amount=-1 +kerning first=325 second=76 amount=-1 +kerning first=217 second=76 amount=-1 +kerning first=366 second=353 amount=-1 +kerning first=199 second=216 amount=-1 +kerning first=330 second=353 amount=-1 +kerning first=1054 second=1061 amount=-1 +kerning first=70 second=284 amount=-1 +kerning first=1036 second=1105 amount=-1 +kerning first=1059 second=1118 amount=-1 +kerning first=203 second=357 amount=-1 +kerning first=296 second=74 amount=-1 +kerning first=275 second=357 amount=-1 +kerning first=240 second=246 amount=-1 +kerning first=257 second=113 amount=-1 +kerning first=368 second=74 amount=-1 +kerning first=86 second=259 amount=-1 +kerning first=264 second=201 amount=-1 +kerning first=231 second=269 amount=-1 +kerning first=45 second=116 amount=-1 +kerning first=1064 second=1071 amount=-1 +kerning first=221 second=113 amount=-1 +kerning first=194 second=253 amount=-1 +kerning first=80 second=113 amount=-1 +kerning first=339 second=269 amount=-1 +kerning first=263 second=259 amount=-1 +kerning first=258 second=116 amount=-1 +kerning first=220 second=204 amount=-1 +kerning first=267 second=269 amount=-1 +kerning first=218 second=117 amount=-1 +kerning first=370 second=302 amount=-1 +kerning first=270 second=317 amount=-1 +kerning first=1058 second=1085 amount=-1 +kerning first=200 second=330 amount=-1 +kerning first=364 second=204 amount=-1 +kerning first=193 second=334 amount=-1 +kerning first=272 second=65 amount=-1 +kerning first=1048 second=1069 amount=-1 +kerning first=212 second=200 amount=-1 +kerning first=259 second=187 amount=-1 +kerning first=200 second=369 amount=-1 +kerning first=362 second=350 amount=-1 +kerning first=193 second=67 amount=-1 +kerning first=101 second=244 amount=-1 +kerning first=365 second=113 amount=-1 +kerning first=323 second=268 amount=-1 +kerning first=374 second=103 amount=-1 +kerning first=278 second=278 amount=-1 +kerning first=75 second=210 amount=-1 +kerning first=86 second=122 amount=-1 +kerning first=1052 second=1094 amount=-1 +kerning first=365 second=277 amount=-1 +kerning first=298 second=225 amount=-1 +kerning first=1042 second=1087 amount=-1 +kerning first=206 second=351 amount=-1 +kerning first=1034 second=1053 amount=-1 +kerning first=85 second=213 amount=-1 +kerning first=74 second=268 amount=-1 +kerning first=280 second=73 amount=-1 +kerning first=101 second=351 amount=-1 +kerning first=200 second=262 amount=-1 +kerning first=330 second=219 amount=-1 +kerning first=86 second=199 amount=-1 +kerning first=198 second=317 amount=-1 +kerning first=374 second=110 amount=-1 +kerning first=352 second=73 amount=-1 +kerning first=298 second=213 amount=-1 +kerning first=116 second=277 amount=-1 +kerning first=258 second=219 amount=-1 +kerning first=262 second=213 amount=-1 +kerning first=80 second=277 amount=-1 +kerning first=286 second=82 amount=-1 +kerning first=201 second=251 amount=-1 +kerning first=366 second=116 amount=-1 +kerning first=344 second=262 amount=-1 +kerning first=335 second=122 amount=-1 +kerning first=330 second=116 amount=-1 +kerning first=283 second=8218 amount=-1 +kerning first=1027 second=1102 amount=-1 +kerning first=81 second=219 amount=-1 +kerning first=263 second=122 amount=-1 +kerning first=257 second=277 amount=-1 +kerning first=1052 second=1076 amount=-1 +kerning first=193 second=311 amount=-1 +kerning first=370 second=213 amount=-1 +kerning first=221 second=277 amount=-1 +kerning first=1065 second=1117 amount=-1 +kerning first=1041 second=1038 amount=-1 +kerning first=45 second=219 amount=-1 +kerning first=227 second=122 amount=-1 +kerning first=204 second=380 amount=-1 +kerning first=217 second=270 amount=-1 +kerning first=8217 second=232 amount=-1 +kerning first=364 second=231 amount=-1 +kerning first=80 second=8221 amount=-1 +kerning first=282 second=75 amount=-1 +kerning first=338 second=202 amount=-1 +kerning first=117 second=283 amount=-1 +kerning first=367 second=248 amount=-1 +kerning first=1058 second=1089 amount=-1 +kerning first=221 second=8221 amount=-1 +kerning first=210 second=75 amount=-1 +kerning first=220 second=231 amount=-1 +kerning first=197 second=218 amount=-1 +kerning first=257 second=382 amount=-1 +kerning first=257 second=8221 amount=-2 +kerning first=72 second=242 amount=-1 +kerning first=259 second=248 amount=-1 +kerning first=325 second=270 amount=-1 +kerning first=108 second=242 amount=-1 +kerning first=69 second=75 amount=-1 +kerning first=209 second=209 amount=-1 +kerning first=204 second=66 amount=-1 +kerning first=365 second=8221 amount=-1 +kerning first=199 second=336 amount=-1 +kerning first=249 second=242 amount=-1 +kerning first=68 second=209 amount=-1 +kerning first=330 second=283 amount=-1 +kerning first=356 second=226 amount=-1 +kerning first=366 second=283 amount=-1 +kerning first=8249 second=85 amount=-1 +kerning first=99 second=380 amount=-1 +kerning first=86 second=79 amount=-1 +kerning first=268 second=268 amount=-1 +kerning first=210 second=8220 amount=-2 +kerning first=206 second=244 amount=-1 +kerning first=207 second=233 amount=-1 +kerning first=70 second=327 amount=-1 +kerning first=347 second=8222 amount=-1 +kerning first=270 second=274 amount=-1 +kerning first=311 second=8222 amount=-1 +kerning first=345 second=45 amount=-1 +kerning first=366 second=192 amount=-1 +kerning first=211 second=327 amount=-1 +kerning first=1056 second=1113 amount=-1 +kerning first=203 second=8222 amount=-1 +kerning first=75 second=367 amount=-1 +kerning first=279 second=233 amount=-1 +kerning first=81 second=192 amount=-1 +kerning first=354 second=44 amount=-1 +kerning first=246 second=44 amount=-1 +kerning first=70 second=261 amount=-1 +kerning first=45 second=192 amount=-1 +kerning first=198 second=211 amount=-1 +kerning first=327 second=337 amount=-1 +kerning first=1046 second=1060 amount=-1 +kerning first=1028 second=1071 amount=-1 +kerning first=68 second=205 amount=-1 +kerning first=78 second=224 amount=-1 +kerning first=366 second=310 amount=-1 +kerning first=330 second=310 amount=-1 +kerning first=197 second=214 amount=-1 +kerning first=327 second=224 amount=-1 +kerning first=254 second=8218 amount=-1 +kerning first=219 second=224 amount=-1 +kerning first=206 second=332 amount=-1 +kerning first=81 second=353 amount=-1 +kerning first=289 second=248 amount=-1 +kerning first=272 second=84 amount=-1 +kerning first=205 second=224 amount=-1 +kerning first=67 second=277 amount=-1 +kerning first=81 second=310 amount=-1 +kerning first=217 second=243 amount=-1 +kerning first=282 second=71 amount=-1 +kerning first=116 second=243 amount=-1 +kerning first=187 second=252 amount=-1 +kerning first=205 second=275 amount=-1 +kerning first=118 second=252 amount=-1 +kerning first=277 second=275 amount=-1 +kerning first=210 second=362 amount=-1 +kerning first=270 second=80 amount=-1 +kerning first=241 second=275 amount=-1 +kerning first=69 second=71 amount=-1 +kerning first=282 second=362 amount=-1 +kerning first=369 second=242 amount=-1 +kerning first=245 second=106 amount=-1 +kerning first=1052 second=1107 amount=-1 +kerning first=281 second=106 amount=-1 +kerning first=100 second=275 amount=-1 +kerning first=193 second=354 amount=-1 +kerning first=1077 second=1081 amount=-1 +kerning first=221 second=97 amount=-1 +kerning first=1055 second=1097 amount=-1 +kerning first=65 second=217 amount=-1 +kerning first=1091 second=1097 amount=-1 +kerning first=229 second=234 amount=-1 +kerning first=8218 second=98 amount=-1 +kerning first=206 second=217 amount=-1 +kerning first=80 second=97 amount=-1 +kerning first=203 second=223 amount=-1 +kerning first=69 second=362 amount=-1 +kerning first=116 second=97 amount=-1 +kerning first=316 second=267 amount=-1 +kerning first=278 second=217 amount=-1 +kerning first=325 second=243 amount=-1 +kerning first=350 second=217 amount=-1 +kerning first=263 second=232 amount=-1 +kerning first=289 second=243 amount=-1 +kerning first=325 second=266 amount=-1 +kerning first=223 second=46 amount=-1 +kerning first=227 second=232 amount=-1 +kerning first=1046 second=1098 amount=-1 +kerning first=75 second=371 amount=-1 +kerning first=196 second=368 amount=-1 +kerning first=1071 second=1072 amount=-1 +kerning first=203 second=200 amount=-1 +kerning first=217 second=266 amount=-1 +kerning first=330 second=68 amount=-1 +kerning first=205 second=345 amount=-1 +kerning first=241 second=345 amount=-1 +kerning first=277 second=345 amount=-1 +kerning first=199 second=263 amount=-1 +kerning first=220 second=325 amount=-1 +kerning first=1118 second=1098 amount=-1 +kerning first=211 second=8218 amount=-1 +kerning first=80 second=109 amount=-1 +kerning first=194 second=86 amount=-1 +kerning first=366 second=245 amount=-1 +kerning first=270 second=221 amount=-1 +kerning first=106 second=8218 amount=-1 +kerning first=366 second=120 amount=-1 +kerning first=330 second=245 amount=-1 +kerning first=355 second=8218 amount=-1 +kerning first=219 second=197 amount=-1 +kerning first=272 second=370 amount=-1 +kerning first=268 second=368 amount=-1 +kerning first=270 second=313 amount=-1 +kerning first=1065 second=1116 amount=-1 +kerning first=304 second=368 amount=-1 +kerning first=200 second=370 amount=-1 +kerning first=1059 second=1092 amount=-1 +kerning first=221 second=109 amount=-1 +kerning first=117 second=245 amount=-1 +kerning first=1052 second=1037 amount=-1 +kerning first=335 second=378 amount=-1 +kerning first=66 second=288 amount=-1 +kerning first=70 second=108 amount=-1 +kerning first=187 second=199 amount=-1 +kerning first=275 second=249 amount=-1 +kerning first=8218 second=266 amount=-1 +kerning first=45 second=120 amount=-1 +kerning first=344 second=370 amount=-1 +kerning first=198 second=313 amount=-1 +kerning first=350 second=72 amount=-1 +kerning first=1047 second=1101 amount=-1 +kerning first=89 second=361 amount=-1 +kerning first=368 second=275 amount=-1 +kerning first=85 second=45 amount=-2 +kerning first=99 second=105 amount=-1 +kerning first=121 second=45 amount=-1 +kerning first=1038 second=1086 amount=-1 +kerning first=233 second=267 amount=-1 +kerning first=269 second=267 amount=-1 +kerning first=217 second=217 amount=-1 +kerning first=370 second=72 amount=-1 +kerning first=305 second=267 amount=-1 +kerning first=1030 second=1097 amount=-1 +kerning first=1041 second=1042 amount=-1 +kerning first=325 second=217 amount=-1 +kerning first=282 second=212 amount=-1 +kerning first=1053 second=1113 amount=-1 +kerning first=282 second=114 amount=-1 +kerning first=1030 second=1042 amount=-1 +kerning first=268 second=205 amount=-1 +kerning first=264 second=102 amount=-1 +kerning first=69 second=212 amount=-1 +kerning first=228 second=8249 amount=-1 +kerning first=105 second=114 amount=-1 +kerning first=86 second=258 amount=-1 +kerning first=264 second=8249 amount=-1 +kerning first=246 second=114 amount=-1 +kerning first=287 second=115 amount=-1 +kerning first=73 second=262 amount=-1 +kerning first=264 second=331 amount=-1 +kerning first=88 second=332 amount=-1 +kerning first=8217 second=193 amount=-2 +kerning first=1071 second=1098 amount=-1 +kerning first=74 second=115 amount=-1 +kerning first=69 second=114 amount=-1 +kerning first=87 second=331 amount=-1 +kerning first=66 second=260 amount=-1 +kerning first=366 second=78 amount=-1 +kerning first=234 second=355 amount=-1 +kerning first=1042 second=1061 amount=-1 +kerning first=198 second=355 amount=-1 +kerning first=277 second=318 amount=-1 +kerning first=80 second=44 amount=-2 +kerning first=1052 second=1064 amount=-1 +kerning first=70 second=288 amount=-1 +kerning first=45 second=218 amount=-1 +kerning first=1031 second=1074 amount=-1 +kerning first=330 second=78 amount=-1 +kerning first=221 second=44 amount=-1 +kerning first=229 second=380 amount=-1 +kerning first=81 second=78 amount=-1 +kerning first=45 second=78 amount=-1 +kerning first=234 second=248 amount=-1 +kerning first=221 second=345 amount=-1 +kerning first=85 second=72 amount=-1 +kerning first=1047 second=1036 amount=-1 +kerning first=1066 second=1055 amount=-1 +kerning first=366 second=218 amount=-1 +kerning first=334 second=72 amount=-1 +kerning first=67 second=332 amount=-1 +kerning first=1039 second=1068 amount=-1 +kerning first=258 second=218 amount=-1 +kerning first=99 second=230 amount=-1 +kerning first=114 second=224 amount=-1 +kerning first=87 second=227 amount=-1 +kerning first=264 second=8222 amount=-1 +kerning first=280 second=332 amount=-1 +kerning first=100 second=279 amount=-1 +kerning first=119 second=104 amount=-1 +kerning first=1067 second=1092 amount=-1 +kerning first=241 second=279 amount=-1 +kerning first=87 second=8222 amount=-2 +kerning first=367 second=291 amount=-1 +kerning first=277 second=279 amount=-1 +kerning first=338 second=361 amount=-1 +kerning first=1048 second=1070 amount=-1 +kerning first=227 second=267 amount=-1 +kerning first=374 second=361 amount=-1 +kerning first=1040 second=1073 amount=-1 +kerning first=205 second=279 amount=-1 +kerning first=259 second=291 amount=-1 +kerning first=323 second=187 amount=-1 +kerning first=223 second=291 amount=-1 +kerning first=240 second=337 amount=-1 +kerning first=79 second=207 amount=-1 +kerning first=204 second=337 amount=-1 +kerning first=1036 second=1079 amount=-1 +kerning first=118 second=291 amount=-1 +kerning first=287 second=187 amount=-1 +kerning first=264 second=227 amount=-1 +kerning first=99 second=337 amount=-1 +kerning first=8217 second=283 amount=-1 +kerning first=8222 second=368 amount=-1 +kerning first=274 second=323 amount=-1 +kerning first=336 second=8222 amount=-1 +kerning first=206 second=352 amount=-1 +kerning first=202 second=323 amount=-1 +kerning first=270 second=84 amount=-1 +kerning first=73 second=81 amount=-1 +kerning first=206 second=325 amount=-1 +kerning first=1046 second=1072 amount=-1 +kerning first=193 second=338 amount=-1 +kerning first=278 second=325 amount=-1 +kerning first=346 second=323 amount=-1 +kerning first=88 second=338 amount=-1 +kerning first=350 second=325 amount=-1 +kerning first=1101 second=1078 amount=-1 +kerning first=105 second=281 amount=-1 +kerning first=80 second=211 amount=-1 +kerning first=103 second=99 amount=-1 +kerning first=325 second=347 amount=-1 +kerning first=316 second=99 amount=-1 +kerning first=255 second=251 amount=-1 +kerning first=352 second=8250 amount=-1 +kerning first=234 second=382 amount=-1 +kerning first=1048 second=1043 amount=-1 +kerning first=8218 second=335 amount=-1 +kerning first=253 second=347 amount=-1 +kerning first=1075 second=1116 amount=-1 +kerning first=282 second=214 amount=-1 +kerning first=289 second=347 amount=-1 +kerning first=280 second=8250 amount=-1 +kerning first=70 second=369 amount=-1 +kerning first=244 second=8250 amount=-1 +kerning first=198 second=290 amount=-1 +kerning first=8218 second=243 amount=-1 +kerning first=217 second=347 amount=-1 +kerning first=208 second=8250 amount=-1 +kerning first=113 second=316 amount=-1 +kerning first=1053 second=1097 amount=-1 +kerning first=283 second=369 amount=-1 +kerning first=8250 second=212 amount=-1 +kerning first=204 second=268 amount=-1 +kerning first=103 second=8250 amount=-1 +kerning first=278 second=334 amount=-1 +kerning first=1059 second=1051 amount=-1 +kerning first=103 second=305 amount=-1 +kerning first=67 second=8250 amount=-1 +kerning first=8250 second=379 amount=-1 +kerning first=217 second=351 amount=-1 +kerning first=346 second=203 amount=-1 +kerning first=310 second=117 amount=-1 +kerning first=99 second=8217 amount=-2 +kerning first=274 second=117 amount=-1 +kerning first=233 second=104 amount=-1 +kerning first=282 second=202 amount=-1 +kerning first=269 second=104 amount=-1 +kerning first=325 second=351 amount=-1 +kerning first=289 second=351 amount=-1 +kerning first=82 second=264 amount=-1 +kerning first=364 second=366 amount=-1 +kerning first=197 second=104 amount=-1 +kerning first=253 second=351 amount=-1 +kerning first=203 second=82 amount=-1 +kerning first=1051 second=1030 amount=-1 +kerning first=8218 second=336 amount=-1 +kerning first=72 second=101 amount=-1 +kerning first=86 second=193 amount=-1 +kerning first=1034 second=1049 amount=-1 +kerning first=288 second=69 amount=-1 +kerning first=70 second=121 amount=-1 +kerning first=79 second=296 amount=-1 +kerning first=249 second=101 amount=-1 +kerning first=1054 second=1052 amount=-1 +kerning first=105 second=277 amount=-1 +kerning first=240 second=8217 amount=-2 +kerning first=204 second=364 amount=-1 +kerning first=198 second=286 amount=-1 +kerning first=1065 second=1074 amount=-1 +kerning first=112 second=103 amount=-1 +kerning first=283 second=365 amount=-1 +kerning first=252 second=263 amount=-1 +kerning first=75 second=171 amount=-1 +kerning first=204 second=220 amount=-1 +kerning first=8217 second=366 amount=-1 +kerning first=324 second=263 amount=-1 +kerning first=364 second=296 amount=-1 +kerning first=83 second=298 amount=-1 +kerning first=87 second=8249 amount=-2 +kerning first=1070 second=1049 amount=-1 +kerning first=252 second=171 amount=-1 +kerning first=209 second=68 amount=-1 +kerning first=288 second=171 amount=-1 +kerning first=296 second=298 amount=-1 +kerning first=70 second=365 amount=-1 +kerning first=1067 second=1071 amount=-1 +kerning first=368 second=298 amount=-1 +kerning first=250 second=287 amount=-1 +kerning first=364 second=46 amount=-2 +kerning first=202 second=117 amount=-1 +kerning first=109 second=287 amount=-1 +kerning first=45 second=282 amount=-1 +kerning first=204 second=203 amount=-1 +kerning first=233 second=100 amount=-1 +kerning first=1054 second=1025 amount=-1 +kerning first=78 second=83 amount=-1 +kerning first=367 second=333 amount=-1 +kerning first=269 second=100 amount=-1 +kerning first=219 second=83 amount=-1 +kerning first=1053 second=1083 amount=-1 +kerning first=85 second=278 amount=-1 +kerning first=209 second=339 amount=-1 +kerning first=323 second=229 amount=-1 +kerning first=327 second=83 amount=-1 +kerning first=281 second=339 amount=-1 +kerning first=187 second=356 amount=-1 +kerning first=203 second=330 amount=-1 +kerning first=264 second=304 amount=-1 +kerning first=68 second=68 amount=-1 +kerning first=229 second=246 amount=-1 +kerning first=80 second=267 amount=-1 +kerning first=325 second=103 amount=-1 +kerning first=72 second=74 amount=-1 +kerning first=354 second=281 amount=-1 +kerning first=1051 second=1057 amount=-1 +kerning first=370 second=278 amount=-1 +kerning first=253 second=103 amount=-1 +kerning first=334 second=278 amount=-1 +kerning first=217 second=103 amount=-1 +kerning first=206 second=296 amount=-1 +kerning first=298 second=278 amount=-1 +kerning first=248 second=382 amount=-1 +kerning first=200 second=8222 amount=-1 +kerning first=287 second=246 amount=-1 +kerning first=205 second=100 amount=-1 +kerning first=8222 second=87 amount=-2 +kerning first=199 second=298 amount=-1 +kerning first=228 second=103 amount=-1 +kerning first=356 second=382 amount=-1 +kerning first=220 second=269 amount=-1 +kerning first=272 second=77 amount=-1 +kerning first=205 second=220 amount=-1 +kerning first=1048 second=1091 amount=-1 +kerning first=313 second=220 amount=-1 +kerning first=198 second=330 amount=-1 +kerning first=74 second=246 amount=-1 +kerning first=200 second=77 amount=-1 +kerning first=79 second=356 amount=-1 +kerning first=364 second=269 amount=-1 +kerning first=212 second=68 amount=-1 +kerning first=1053 second=1062 amount=-1 +kerning first=213 second=194 amount=-1 +kerning first=199 second=211 amount=-1 +kerning first=251 second=333 amount=-1 +kerning first=110 second=333 amount=-1 +kerning first=284 second=68 amount=-1 +kerning first=352 second=365 amount=-1 +kerning first=280 second=365 amount=-1 +kerning first=344 second=8222 amount=-1 +kerning first=1070 second=1048 amount=-1 +kerning first=316 second=365 amount=-1 +kerning first=1034 second=1048 amount=-1 +kerning first=229 second=289 amount=-1 +kerning first=272 second=8222 amount=-1 +kerning first=323 second=333 amount=-1 +kerning first=234 second=339 amount=-1 +kerning first=72 second=281 amount=-1 +kerning first=350 second=313 amount=-1 +kerning first=108 second=281 amount=-1 +kerning first=80 second=315 amount=-1 +kerning first=70 second=202 amount=-1 +kerning first=214 second=193 amount=-1 +kerning first=8217 second=220 amount=-1 +kerning first=249 second=281 amount=-1 +kerning first=206 second=313 amount=-1 +kerning first=85 second=111 amount=-1 +kerning first=267 second=224 amount=-1 +kerning first=214 second=347 amount=-1 +kerning first=278 second=313 amount=-1 +kerning first=65 second=86 amount=-1 +kerning first=1036 second=1087 amount=-1 +kerning first=8222 second=336 amount=-1 +kerning first=1040 second=1057 amount=-1 +kerning first=77 second=364 amount=-1 +kerning first=1040 second=1117 amount=-1 +kerning first=263 second=324 amount=-1 +kerning first=73 second=347 amount=-1 +kerning first=1069 second=1042 amount=-1 +kerning first=230 second=271 amount=-1 +kerning first=211 second=202 amount=-1 +kerning first=209 second=264 amount=-1 +kerning first=1044 second=1088 amount=-1 +kerning first=214 second=325 amount=-1 +kerning first=346 second=69 amount=-1 +kerning first=85 second=251 amount=-1 +kerning first=121 second=251 amount=-1 +kerning first=370 second=251 amount=-1 +kerning first=243 second=8217 amount=-2 +kerning first=207 second=212 amount=-1 +kerning first=1048 second=1118 amount=-1 +kerning first=279 second=8217 amount=-2 +kerning first=315 second=8217 amount=-1 +kerning first=107 second=46 amount=-1 +kerning first=220 second=102 amount=-1 +kerning first=66 second=8217 amount=-2 +kerning first=105 second=8221 amount=-1 +kerning first=199 second=271 amount=-1 +kerning first=66 second=212 amount=-1 +kerning first=8250 second=367 amount=-1 +kerning first=210 second=8221 amount=-2 +kerning first=246 second=8221 amount=-2 +kerning first=270 second=85 amount=-1 +kerning first=261 second=245 amount=-1 +kerning first=225 second=245 amount=-1 +kerning first=198 second=85 amount=-1 +kerning first=97 second=242 amount=-1 +kerning first=354 second=8221 amount=-1 +kerning first=280 second=334 amount=-1 +kerning first=351 second=8217 amount=-2 +kerning first=195 second=221 amount=-1 +kerning first=370 second=111 amount=-1 +kerning first=84 second=245 amount=-1 +kerning first=363 second=263 amount=-1 +kerning first=103 second=365 amount=-1 +kerning first=362 second=8217 amount=-1 +kerning first=85 second=231 amount=-1 +kerning first=337 second=289 amount=-1 +kerning first=1039 second=1024 amount=-1 +kerning first=204 second=67 amount=-1 +kerning first=288 second=366 amount=-1 +kerning first=203 second=288 amount=-1 +kerning first=304 second=109 amount=-1 +kerning first=1069 second=1064 amount=-1 +kerning first=221 second=195 amount=-1 +kerning first=264 second=357 amount=-1 +kerning first=304 second=233 amount=-1 +kerning first=364 second=102 amount=-1 +kerning first=83 second=78 amount=-1 +kerning first=78 second=263 amount=-1 +kerning first=232 second=233 amount=-1 +kerning first=99 second=45 amount=-1 +kerning first=205 second=280 amount=-1 +kerning first=214 second=374 amount=-1 +kerning first=268 second=233 amount=-1 +kerning first=8222 second=232 amount=-1 +kerning first=264 second=76 amount=-1 +kerning first=1036 second=1059 amount=-1 +kerning first=192 second=357 amount=-1 +kerning first=291 second=263 amount=-1 +kerning first=1058 second=1084 amount=-1 +kerning first=327 second=263 amount=-1 +kerning first=204 second=267 amount=-1 +kerning first=302 second=122 amount=-1 +kerning first=282 second=363 amount=-1 +kerning first=230 second=122 amount=-1 +kerning first=201 second=317 amount=-1 +kerning first=258 second=375 amount=-1 +kerning first=266 second=122 amount=-1 +kerning first=323 second=213 amount=-1 +kerning first=231 second=107 amount=-1 +kerning first=304 second=207 amount=-1 +kerning first=218 second=250 amount=-1 +kerning first=195 second=107 amount=-1 +kerning first=268 second=207 amount=-1 +kerning first=68 second=204 amount=-1 +kerning first=121 second=311 amount=-1 +kerning first=232 second=8250 amount=-1 +kerning first=89 second=122 amount=-1 +kerning first=203 second=201 amount=-1 +kerning first=296 second=232 amount=-1 +kerning first=219 second=116 amount=-1 +kerning first=198 second=282 amount=-1 +kerning first=310 second=216 amount=-1 +kerning first=8218 second=103 amount=-1 +kerning first=209 second=204 amount=-1 +kerning first=304 second=337 amount=-1 +kerning first=75 second=366 amount=-1 +kerning first=1052 second=1081 amount=-1 +kerning first=78 second=116 amount=-1 +kerning first=217 second=244 amount=-1 +kerning first=281 second=378 amount=-1 +kerning first=368 second=259 amount=-1 +kerning first=245 second=378 amount=-1 +kerning first=327 second=116 amount=-1 +kerning first=289 second=244 amount=-1 +kerning first=209 second=378 amount=-1 +kerning first=296 second=259 amount=-1 +kerning first=1058 second=1102 amount=-1 +kerning first=325 second=244 amount=-1 +kerning first=70 second=262 amount=-1 +kerning first=1042 second=1024 amount=-1 +kerning first=1051 second=1096 amount=-1 +kerning first=1058 second=1094 amount=-1 +kerning first=86 second=210 amount=-1 +kerning first=75 second=345 amount=-1 +kerning first=278 second=290 amount=-1 +kerning first=111 second=345 amount=-1 +kerning first=1042 second=1049 amount=-1 +kerning first=346 second=302 amount=-1 +kerning first=275 second=369 amount=-1 +kerning first=339 second=107 amount=-1 +kerning first=274 second=302 amount=-1 +kerning first=74 second=213 amount=-1 +kerning first=252 second=345 amount=-1 +kerning first=203 second=369 amount=-1 +kerning first=267 second=335 amount=-1 +kerning first=267 second=107 amount=-1 +kerning first=288 second=345 amount=-1 +kerning first=73 second=206 amount=-1 +kerning first=231 second=335 amount=-1 +kerning first=202 second=302 amount=-1 +kerning first=324 second=345 amount=-1 +kerning first=286 second=206 amount=-1 +kerning first=339 second=335 amount=-1 +kerning first=78 second=46 amount=-1 +kerning first=197 second=219 amount=-1 +kerning first=214 second=206 amount=-1 +kerning first=209 second=231 amount=-1 +kerning first=218 second=277 amount=-1 +kerning first=270 second=193 amount=-1 +kerning first=277 second=254 amount=-1 +kerning first=281 second=231 amount=-1 +kerning first=209 second=351 amount=-1 +kerning first=78 second=218 amount=-1 +kerning first=80 second=368 amount=-1 +kerning first=362 second=277 amount=-1 +kerning first=205 second=73 amount=-1 +kerning first=326 second=277 amount=-1 +kerning first=347 second=103 amount=-1 +kerning first=201 second=290 amount=-1 +kerning first=370 second=338 amount=-1 +kerning first=1066 second=1067 amount=-1 +kerning first=74 second=345 amount=-1 +kerning first=262 second=338 amount=-1 +kerning first=70 second=82 amount=-1 +kerning first=75 second=79 amount=-1 +kerning first=298 second=338 amount=-1 +kerning first=211 second=82 amount=-1 +kerning first=200 second=8249 amount=-1 +kerning first=283 second=283 amount=-1 +kerning first=278 second=286 amount=-1 +kerning first=77 second=277 amount=-1 +kerning first=1047 second=1097 amount=-1 +kerning first=85 second=338 amount=-1 +kerning first=68 second=351 amount=-1 +kerning first=344 second=8249 amount=-1 +kerning first=70 second=283 amount=-1 +kerning first=1027 second=1086 amount=-1 +kerning first=76 second=217 amount=-1 +kerning first=380 second=8249 amount=-1 +kerning first=106 second=283 amount=-1 +kerning first=1048 second=1031 amount=-1 +kerning first=187 second=274 amount=-1 +kerning first=262 second=45 amount=-1 +kerning first=67 second=171 amount=-1 +kerning first=1033 second=1068 amount=-1 +kerning first=103 second=171 amount=-1 +kerning first=206 second=286 amount=-1 +kerning first=368 second=113 amount=-1 +kerning first=8222 second=233 amount=-1 +kerning first=226 second=45 amount=-1 +kerning first=296 second=113 amount=-1 +kerning first=87 second=371 amount=-1 +kerning first=74 second=333 amount=-1 +kerning first=280 second=171 amount=-1 +kerning first=70 second=235 amount=-1 +kerning first=224 second=113 amount=-1 +kerning first=65 second=286 amount=-1 +kerning first=106 second=235 amount=-1 +kerning first=352 second=171 amount=-1 +kerning first=70 second=73 amount=-1 +kerning first=210 second=70 amount=-1 +kerning first=282 second=70 amount=-1 +kerning first=352 second=280 amount=-1 +kerning first=8217 second=192 amount=-2 +kerning first=283 second=235 amount=-1 +kerning first=214 second=221 amount=-1 +kerning first=69 second=363 amount=-1 +kerning first=269 second=240 amount=-1 +kerning first=355 second=235 amount=-1 +kerning first=217 second=273 amount=-1 +kerning first=1051 second=1069 amount=-1 +kerning first=1068 second=1056 amount=-1 +kerning first=211 second=310 amount=-1 +kerning first=121 second=252 amount=-1 +kerning first=280 second=344 amount=-1 +kerning first=1070 second=1027 amount=-1 +kerning first=85 second=252 amount=-1 +kerning first=327 second=284 amount=-1 +kerning first=1091 second=1085 amount=-1 +kerning first=1034 second=1027 amount=-1 +kerning first=352 second=344 amount=-1 +kerning first=278 second=205 amount=-1 +kerning first=78 second=284 amount=-1 +kerning first=262 second=331 amount=-1 +kerning first=219 second=284 amount=-1 +kerning first=1044 second=1080 amount=-1 +kerning first=314 second=283 amount=-1 +kerning first=234 second=106 amount=-1 +kerning first=302 second=214 amount=-1 +kerning first=266 second=214 amount=-1 +kerning first=290 second=315 amount=-1 +kerning first=192 second=365 amount=-1 +kerning first=234 second=231 amount=-1 +kerning first=192 second=217 amount=-1 +kerning first=366 second=46 amount=-2 +kerning first=187 second=112 amount=-1 +kerning first=264 second=217 amount=-1 +kerning first=288 second=223 amount=-1 +kerning first=212 second=89 amount=-1 +kerning first=374 second=214 amount=-1 +kerning first=220 second=243 amount=-1 +kerning first=197 second=332 amount=-1 +kerning first=110 second=45 amount=-1 +kerning first=375 second=287 amount=-1 +kerning first=339 second=122 amount=-1 +kerning first=77 second=71 amount=-1 +kerning first=73 second=353 amount=-1 +kerning first=117 second=235 amount=-1 +kerning first=364 second=243 amount=-1 +kerning first=214 second=353 amount=-1 +kerning first=194 second=214 amount=-1 +kerning first=287 second=45 amount=-1 +kerning first=328 second=243 amount=-1 +kerning first=199 second=70 amount=-1 +kerning first=249 second=275 amount=-1 +kerning first=89 second=214 amount=-1 +kerning first=1049 second=1076 amount=-1 +kerning first=218 second=71 amount=-1 +kerning first=1053 second=1028 amount=-1 +kerning first=251 second=45 amount=-1 +kerning first=370 second=252 amount=-1 +kerning first=328 second=269 amount=-1 +kerning first=354 second=97 amount=-1 +kerning first=200 second=223 amount=-1 +kerning first=202 second=362 amount=-1 +kerning first=278 second=80 amount=-1 +kerning first=366 second=235 amount=-1 +kerning first=1039 second=1050 amount=-1 +kerning first=72 second=275 amount=-1 +kerning first=85 second=8250 amount=-2 +kerning first=323 second=44 amount=-1 +kerning first=274 second=362 amount=-1 +kerning first=206 second=80 amount=-1 +kerning first=344 second=223 amount=-1 +kerning first=346 second=362 amount=-1 +kerning first=350 second=80 amount=-1 +kerning first=72 second=302 amount=-1 +kerning first=304 second=234 amount=-1 +kerning first=69 second=336 amount=-1 +kerning first=101 second=107 amount=-1 +kerning first=8218 second=244 amount=-1 +kerning first=78 second=122 amount=-1 +kerning first=65 second=107 amount=-1 +kerning first=363 second=234 amount=-1 +kerning first=211 second=370 amount=-1 +kerning first=66 second=364 amount=-1 +kerning first=196 second=119 amount=-1 +kerning first=229 second=337 amount=-1 +kerning first=1047 second=1079 amount=-1 +kerning first=198 second=199 amount=-1 +kerning first=85 second=225 amount=-1 +kerning first=280 second=8249 amount=-1 +kerning first=282 second=336 amount=-1 +kerning first=289 second=267 amount=-1 +kerning first=262 second=317 amount=-1 +kerning first=209 second=224 amount=-1 +kerning first=269 second=8250 amount=-1 +kerning first=87 second=249 amount=-1 +kerning first=338 second=116 amount=-1 +kerning first=98 second=314 amount=-1 +kerning first=302 second=116 amount=-1 +kerning first=192 second=249 amount=-1 +kerning first=266 second=116 amount=-1 +kerning first=374 second=241 amount=-1 +kerning first=287 second=105 amount=-1 +kerning first=1039 second=1105 amount=-1 +kerning first=327 second=122 amount=-1 +kerning first=1056 second=1071 amount=-1 +kerning first=275 second=314 amount=-1 +kerning first=45 second=327 amount=-1 +kerning first=85 second=110 amount=-1 +kerning first=81 second=327 amount=-1 +kerning first=232 second=234 amount=-1 +kerning first=1052 second=1054 amount=-1 +kerning first=77 second=382 amount=-1 +kerning first=364 second=335 amount=-1 +kerning first=101 second=345 amount=-1 +kerning first=323 second=72 amount=-1 +kerning first=328 second=335 amount=-1 +kerning first=1065 second=1087 amount=-1 +kerning first=89 second=241 amount=-1 +kerning first=262 second=110 amount=-1 +kerning first=1031 second=1049 amount=-1 +kerning first=347 second=314 amount=-1 +kerning first=171 second=374 amount=-1 +kerning first=1067 second=1049 amount=-1 +kerning first=202 second=216 amount=-1 +kerning first=330 second=327 amount=-1 +kerning first=302 second=241 amount=-1 +kerning first=298 second=110 amount=-1 +kerning first=366 second=327 amount=-1 +kerning first=266 second=241 amount=-1 +kerning first=302 second=245 amount=-1 +kerning first=274 second=216 amount=-1 +kerning first=270 second=205 amount=-1 +kerning first=370 second=110 amount=-1 +kerning first=74 second=254 amount=-1 +kerning first=362 second=250 amount=-1 +kerning first=257 second=114 amount=-1 +kerning first=1041 second=1097 amount=-1 +kerning first=99 second=115 amount=-1 +kerning first=118 second=46 amount=-1 +kerning first=75 second=262 amount=-1 +kerning first=82 second=46 amount=-1 +kerning first=1064 second=1045 amount=-1 +kerning first=204 second=115 amount=-1 +kerning first=111 second=318 amount=-1 +kerning first=199 second=207 amount=-1 +kerning first=213 second=302 amount=-1 +kerning first=70 second=370 amount=-1 +kerning first=220 second=335 amount=-1 +kerning first=97 second=101 amount=-1 +kerning first=67 second=261 amount=-1 +kerning first=221 second=114 amount=-1 +kerning first=1047 second=1046 amount=-1 +kerning first=330 second=267 amount=-1 +kerning first=370 second=225 amount=-1 +kerning first=83 second=187 amount=-1 +kerning first=366 second=267 amount=-1 +kerning first=230 second=347 amount=-1 +kerning first=203 second=81 amount=-1 +kerning first=82 second=355 amount=-1 +kerning first=352 second=44 amount=-1 +kerning first=1033 second=1055 amount=-1 +kerning first=204 second=273 amount=-1 +kerning first=209 second=296 amount=-1 +kerning first=99 second=273 amount=-1 +kerning first=8218 second=217 amount=-1 +kerning first=264 second=284 amount=-1 +kerning first=289 second=103 amount=-1 +kerning first=254 second=44 amount=-1 +kerning first=290 second=44 amount=-1 +kerning first=110 second=243 amount=-1 +kerning first=262 second=204 amount=-1 +kerning first=218 second=44 amount=-2 +kerning first=1038 second=1098 amount=-1 +kerning first=98 second=287 amount=-1 +kerning first=82 second=334 amount=-1 +kerning first=257 second=291 amount=-1 +kerning first=201 second=114 amount=-1 +kerning first=8217 second=117 amount=-1 +kerning first=74 second=72 amount=-1 +kerning first=187 second=355 amount=-1 +kerning first=264 second=282 amount=-1 +kerning first=275 second=287 amount=-1 +kerning first=199 second=346 amount=-1 +kerning first=67 second=83 amount=-1 +kerning first=73 second=288 amount=-1 +kerning first=288 second=8250 amount=-1 +kerning first=98 second=8220 amount=-2 +kerning first=258 second=311 amount=-1 +kerning first=80 second=199 amount=-1 +kerning first=347 second=287 amount=-1 +kerning first=1050 second=1089 amount=-1 +kerning first=369 second=245 amount=-1 +kerning first=311 second=287 amount=-1 +kerning first=74 second=278 amount=-1 +kerning first=224 second=8249 amount=-1 +kerning first=217 second=352 amount=-1 +kerning first=1031 second=1118 amount=-1 +kerning first=234 second=291 amount=-1 +kerning first=67 second=233 amount=-1 +kerning first=325 second=352 amount=-1 +kerning first=8222 second=119 amount=-1 +kerning first=347 second=108 amount=-1 +kerning first=78 second=257 amount=-1 +kerning first=120 second=44 amount=-1 +kerning first=1059 second=1091 amount=-1 +kerning first=316 second=279 amount=-1 +kerning first=352 second=371 amount=-1 +kerning first=323 second=278 amount=-1 +kerning first=69 second=211 amount=-1 +kerning first=311 second=108 amount=-1 +kerning first=356 second=187 amount=-1 +kerning first=296 second=100 amount=-1 +kerning first=268 second=116 amount=-1 +kerning first=366 second=8218 amount=-2 +kerning first=344 second=355 amount=-1 +kerning first=71 second=187 amount=-1 +kerning first=209 second=269 amount=-1 +kerning first=267 second=252 amount=-1 +kerning first=233 second=99 amount=-1 +kerning first=213 second=75 amount=-1 +kerning first=118 second=382 amount=-1 +kerning first=229 second=316 amount=-1 +kerning first=362 second=71 amount=-1 +kerning first=193 second=316 amount=-1 +kerning first=103 second=279 amount=-1 +kerning first=248 second=187 amount=-1 +kerning first=223 second=382 amount=-1 +kerning first=1055 second=1098 amount=-1 +kerning first=45 second=357 amount=-1 +kerning first=284 second=187 amount=-1 +kerning first=282 second=211 amount=-1 +kerning first=269 second=99 amount=-1 +kerning first=81 second=8218 amount=-1 +kerning first=187 second=313 amount=-1 +kerning first=214 second=65 amount=-1 +kerning first=67 second=279 amount=-1 +kerning first=212 second=187 amount=-1 +kerning first=280 second=371 amount=-1 +kerning first=337 second=316 amount=-1 +kerning first=268 second=380 amount=-1 +kerning first=272 second=196 amount=-1 +kerning first=267 second=248 amount=-1 +kerning first=232 second=380 amount=-1 +kerning first=66 second=66 amount=-1 +kerning first=80 second=260 amount=-1 +kerning first=231 second=248 amount=-1 +kerning first=364 second=270 amount=-1 +kerning first=304 second=380 amount=-1 +kerning first=86 second=117 amount=-1 +kerning first=187 second=334 amount=-1 +kerning first=302 second=225 amount=-1 +kerning first=73 second=261 amount=-1 +kerning first=77 second=44 amount=-1 +kerning first=221 second=260 amount=-1 +kerning first=280 second=202 amount=-1 +kerning first=81 second=202 amount=-1 +kerning first=45 second=202 amount=-1 +kerning first=198 second=264 amount=-1 +kerning first=108 second=8220 amount=-1 +kerning first=72 second=8220 amount=-1 +kerning first=201 second=209 amount=-1 +kerning first=213 second=8220 amount=-2 +kerning first=350 second=205 amount=-1 +kerning first=258 second=121 amount=-1 +kerning first=193 second=364 amount=-1 +kerning first=79 second=270 amount=-1 +kerning first=108 second=367 amount=-1 +kerning first=330 second=202 amount=-1 +kerning first=219 second=257 amount=-1 +kerning first=248 second=345 amount=-1 +kerning first=88 second=364 amount=-1 +kerning first=98 second=108 amount=-1 +kerning first=207 second=66 amount=-1 +kerning first=327 second=257 amount=-1 +kerning first=220 second=270 amount=-1 +kerning first=217 second=325 amount=-1 +kerning first=323 second=216 amount=-1 +kerning first=366 second=202 amount=-1 +kerning first=326 second=8217 amount=-2 +kerning first=197 second=121 amount=-1 +kerning first=192 second=108 amount=-1 +kerning first=315 second=364 amount=-1 +kerning first=272 second=82 amount=-1 +kerning first=364 second=351 amount=-1 +kerning first=1051 second=1047 amount=-1 +kerning first=89 second=193 amount=-1 +kerning first=279 second=277 amount=-1 +kerning first=207 second=364 amount=-1 +kerning first=213 second=69 amount=-1 +kerning first=323 second=338 amount=-1 +kerning first=207 second=277 amount=-1 +kerning first=254 second=8217 amount=-2 +kerning first=287 second=251 amount=-1 +kerning first=8222 second=212 amount=-1 +kerning first=290 second=8217 amount=-1 +kerning first=1038 second=1060 amount=-1 +kerning first=370 second=273 amount=-1 +kerning first=201 second=355 amount=-1 +kerning first=76 second=86 amount=-1 +kerning first=374 second=193 amount=-1 +kerning first=79 second=351 amount=-1 +kerning first=298 second=273 amount=-1 +kerning first=199 second=8221 amount=-1 +kerning first=262 second=273 amount=-1 +kerning first=74 second=338 amount=-1 +kerning first=72 second=69 amount=-1 +kerning first=271 second=8221 amount=-1 +kerning first=1055 second=1064 amount=-1 +kerning first=282 second=334 amount=-1 +kerning first=201 second=203 amount=-1 +kerning first=307 second=8221 amount=-1 +kerning first=327 second=78 amount=-1 +kerning first=220 second=351 amount=-1 +kerning first=227 second=242 amount=-1 +kerning first=85 second=273 amount=-1 +kerning first=379 second=8221 amount=-1 +kerning first=200 second=82 amount=-1 +kerning first=117 second=99 amount=-1 +kerning first=75 second=117 amount=-1 +kerning first=219 second=171 amount=-2 +kerning first=251 second=8249 amount=-1 +kerning first=255 second=171 amount=-1 +kerning first=67 second=229 amount=-1 +kerning first=255 second=98 amount=-1 +kerning first=311 second=314 amount=-1 +kerning first=263 second=242 amount=-1 +kerning first=269 second=108 amount=-1 +kerning first=214 second=8220 amount=-2 +kerning first=70 second=104 amount=-1 +kerning first=1071 second=1064 amount=-1 +kerning first=363 second=171 amount=-1 +kerning first=226 second=333 amount=-1 +kerning first=286 second=282 amount=-1 +kerning first=85 second=333 amount=-1 +kerning first=78 second=78 amount=-1 +kerning first=214 second=282 amount=-1 +kerning first=302 second=100 amount=-1 +kerning first=221 second=233 amount=-1 +kerning first=266 second=100 amount=-1 +kerning first=80 second=233 amount=-1 +kerning first=77 second=8217 amount=-1 +kerning first=374 second=100 amount=-1 +kerning first=70 second=357 amount=-1 +kerning first=73 second=282 amount=-1 +kerning first=1071 second=1039 amount=-1 +kerning first=283 second=104 amount=-1 +kerning first=365 second=233 amount=-1 +kerning first=78 second=171 amount=-1 +kerning first=264 second=325 amount=-1 +kerning first=257 second=233 amount=-1 +kerning first=315 second=87 amount=-1 +kerning first=282 second=298 amount=-1 +kerning first=222 second=8221 amount=-2 +kerning first=217 second=330 amount=-1 +kerning first=194 second=220 amount=-1 +kerning first=264 second=103 amount=-1 +kerning first=302 second=220 amount=-1 +kerning first=68 second=356 amount=-1 +kerning first=266 second=220 amount=-1 +kerning first=298 second=246 amount=-1 +kerning first=311 second=103 amount=-1 +kerning first=262 second=246 amount=-1 +kerning first=89 second=100 amount=-1 +kerning first=79 second=362 amount=-1 +kerning first=89 second=263 amount=-1 +kerning first=226 second=246 amount=-1 +kerning first=230 second=100 amount=-1 +kerning first=218 second=109 amount=-1 +kerning first=1051 second=1074 amount=-1 +kerning first=99 second=289 amount=-1 +kerning first=85 second=246 amount=-1 +kerning first=370 second=333 amount=-1 +kerning first=233 second=365 amount=-1 +kerning first=262 second=333 amount=-1 +kerning first=269 second=224 amount=-1 +kerning first=269 second=365 amount=-1 +kerning first=208 second=8218 amount=-1 +kerning first=362 second=109 amount=-1 +kerning first=187 second=193 amount=-1 +kerning first=187 second=68 amount=-1 +kerning first=1070 second=1113 amount=-1 +kerning first=197 second=365 amount=-1 +kerning first=240 second=289 amount=-1 +kerning first=338 second=220 amount=-1 +kerning first=1069 second=1024 amount=-1 +kerning first=1056 second=1046 amount=-1 +kerning first=352 second=8218 amount=-1 +kerning first=224 second=281 amount=-1 +kerning first=368 second=211 amount=-1 +kerning first=275 second=347 amount=-1 +kerning first=122 second=8220 amount=-1 +kerning first=68 second=85 amount=-1 +kerning first=203 second=371 amount=-1 +kerning first=86 second=8220 amount=-1 +kerning first=296 second=281 amount=-1 +kerning first=268 second=315 amount=-1 +kerning first=242 second=120 amount=-1 +kerning first=196 second=255 amount=-1 +kerning first=304 second=315 amount=-1 +kerning first=296 second=72 amount=-1 +kerning first=302 second=357 amount=-1 +kerning first=8218 second=216 amount=-1 +kerning first=77 second=109 amount=-1 +kerning first=103 second=8218 amount=-1 +kerning first=263 second=8220 amount=-2 +kerning first=1065 second=1057 amount=-1 +kerning first=67 second=8218 amount=-1 +kerning first=1040 second=1095 amount=-1 +kerning first=368 second=338 amount=-1 +kerning first=335 second=8220 amount=-2 +kerning first=67 second=116 amount=-1 +kerning first=367 second=339 amount=-1 +kerning first=272 second=202 amount=-1 +kerning first=211 second=77 amount=-1 +kerning first=333 second=120 amount=-1 +kerning first=364 second=264 amount=-1 +kerning first=1039 second=1083 amount=-1 +kerning first=259 second=339 amount=-1 +kerning first=233 second=111 amount=-1 +kerning first=1042 second=1088 amount=-1 +kerning first=69 second=298 amount=-1 +kerning first=317 second=356 amount=-1 +kerning first=210 second=298 amount=-1 +kerning first=220 second=264 amount=-1 +kerning first=280 second=219 amount=-1 +kerning first=192 second=81 amount=-1 +kerning first=108 second=232 amount=-1 +kerning first=369 second=8249 amount=-1 +kerning first=210 second=368 amount=-1 +kerning first=1071 second=1060 amount=-1 +kerning first=1050 second=1105 amount=-1 +kerning first=112 second=8250 amount=-1 +kerning first=203 second=76 amount=-1 +kerning first=67 second=219 amount=-1 +kerning first=334 second=89 amount=-1 +kerning first=101 second=335 amount=-1 +kerning first=217 second=357 amount=-1 +kerning first=325 second=357 amount=-1 +kerning first=249 second=232 amount=-1 +kerning first=206 second=335 amount=-1 +kerning first=69 second=368 amount=-1 +kerning first=289 second=357 amount=-1 +kerning first=327 second=241 amount=-1 +kerning first=354 second=271 amount=-1 +kerning first=1064 second=1067 amount=-1 +kerning first=1042 second=1044 amount=-1 +kerning first=291 second=241 amount=-1 +kerning first=1052 second=1086 amount=-1 +kerning first=266 second=344 amount=-1 +kerning first=317 second=85 amount=-1 +kerning first=84 second=8249 amount=-1 +kerning first=207 second=234 amount=-1 +kerning first=45 second=262 amount=-1 +kerning first=120 second=8249 amount=-1 +kerning first=282 second=368 amount=-1 +kerning first=338 second=344 amount=-1 +kerning first=365 second=8249 amount=-1 +kerning first=302 second=344 amount=-1 +kerning first=209 second=85 amount=-1 +kerning first=225 second=8249 amount=-1 +kerning first=261 second=8249 amount=-1 +kerning first=1059 second=1075 amount=-1 +kerning first=313 second=366 amount=-1 +kerning first=364 second=80 amount=-1 +kerning first=212 second=46 amount=-1 +kerning first=323 second=67 amount=-1 +kerning first=263 second=275 amount=-1 +kerning first=194 second=266 amount=-1 +kerning first=227 second=275 amount=-1 +kerning first=280 second=298 amount=-1 +kerning first=219 second=241 amount=-1 +kerning first=219 second=345 amount=-1 +kerning first=205 second=366 amount=-1 +kerning first=86 second=275 amount=-1 +kerning first=1027 second=1081 amount=-1 +kerning first=78 second=241 amount=-1 +kerning first=187 second=213 amount=-1 +kerning first=74 second=67 amount=-1 +kerning first=362 second=229 amount=-1 +kerning first=210 second=195 amount=-1 +kerning first=288 second=280 amount=-1 +kerning first=345 second=225 amount=-1 +kerning first=72 second=73 amount=-1 +kerning first=1047 second=1084 amount=-1 +kerning first=197 second=284 amount=-1 +kerning first=71 second=46 amount=-1 +kerning first=207 second=216 amount=-1 +kerning first=218 second=229 amount=-1 +kerning first=221 second=363 amount=-1 +kerning first=1046 second=1077 amount=-1 +kerning first=272 second=353 amount=-1 +kerning first=72 second=216 amount=-1 +kerning first=279 second=250 amount=-1 +kerning first=79 second=80 amount=-1 +kerning first=287 second=311 amount=-1 +kerning first=284 second=317 amount=-1 +kerning first=70 second=375 amount=-1 +kerning first=280 second=116 amount=-1 +kerning first=204 second=213 amount=-1 +kerning first=66 second=250 amount=-1 +kerning first=262 second=111 amount=-1 +kerning first=1042 second=1071 amount=-1 +kerning first=286 second=201 amount=-1 +kerning first=87 second=244 amount=-1 +kerning first=1089 second=1093 amount=-1 +kerning first=314 second=171 amount=-1 +kerning first=72 second=259 amount=-1 +kerning first=214 second=201 amount=-1 +kerning first=1055 second=1062 amount=-1 +kerning first=271 second=113 amount=-1 +kerning first=228 second=244 amount=-1 +kerning first=307 second=113 amount=-1 +kerning first=333 second=8222 amount=-1 +kerning first=220 second=378 amount=-1 +kerning first=264 second=244 amount=-1 +kerning first=199 second=113 amount=-1 +kerning first=66 second=207 amount=-1 +kerning first=235 second=113 amount=-1 +kerning first=8218 second=249 amount=-1 +kerning first=73 second=201 amount=-1 +kerning first=8250 second=362 amount=-1 +kerning first=270 second=204 amount=-1 +kerning first=364 second=378 amount=-1 +kerning first=120 second=8222 amount=-1 +kerning first=1034 second=1063 amount=-2 +kerning first=304 second=345 amount=-1 +kerning first=198 second=204 amount=-1 +kerning first=84 second=8222 amount=-1 +kerning first=212 second=317 amount=-1 +kerning first=362 second=256 amount=-1 +kerning first=201 second=268 amount=-1 +kerning first=310 second=210 amount=-1 +kerning first=258 second=262 amount=-1 +kerning first=81 second=195 amount=-1 +kerning first=366 second=262 amount=-1 +kerning first=1064 second=1050 amount=-1 +kerning first=1041 second=1102 amount=-1 +kerning first=330 second=262 amount=-1 +kerning first=274 second=210 amount=-1 +kerning first=218 second=256 amount=-1 +kerning first=202 second=210 amount=-1 +kerning first=1062 second=1096 amount=-1 +kerning first=45 second=332 amount=-1 +kerning first=314 second=335 amount=-1 +kerning first=330 second=332 amount=-1 +kerning first=8222 second=255 amount=-1 +kerning first=205 second=122 amount=-1 +kerning first=325 second=80 amount=-1 +kerning first=219 second=198 amount=-1 +kerning first=8250 second=118 amount=-1 +kerning first=258 second=332 amount=-1 +kerning first=100 second=122 amount=-1 +kerning first=302 second=73 amount=-1 +kerning first=266 second=73 amount=-1 +kerning first=1048 second=1053 amount=-1 +kerning first=352 second=219 amount=-1 +kerning first=338 second=73 amount=-1 +kerning first=366 second=332 amount=-1 +kerning first=83 second=75 amount=-1 +kerning first=193 second=213 amount=-1 +kerning first=89 second=196 amount=-1 +kerning first=84 second=283 amount=-1 +kerning first=206 second=200 amount=-1 +kerning first=327 second=279 amount=-1 +kerning first=221 second=336 amount=-1 +kerning first=88 second=213 amount=-1 +kerning first=279 second=254 amount=-1 +kerning first=201 second=187 amount=-1 +kerning first=363 second=279 amount=-1 +kerning first=72 second=362 amount=-1 +kerning first=213 second=362 amount=-1 +kerning first=258 second=8250 amount=-1 +kerning first=288 second=323 amount=-1 +kerning first=222 second=8250 amount=-1 +kerning first=325 second=344 amount=-1 +kerning first=1039 second=1045 amount=-1 +kerning first=275 second=244 amount=-1 +kerning first=219 second=371 amount=-1 +kerning first=368 second=75 amount=-1 +kerning first=73 second=266 amount=-1 +kerning first=81 second=8250 amount=-1 +kerning first=305 second=113 amount=-1 +kerning first=296 second=75 amount=-1 +kerning first=207 second=71 amount=-1 +kerning first=209 second=288 amount=-1 +kerning first=192 second=314 amount=-1 +kerning first=291 second=279 amount=-1 +kerning first=350 second=200 amount=-1 +kerning first=1036 second=1119 amount=-1 +kerning first=278 second=200 amount=-1 +kerning first=205 second=79 amount=-1 +kerning first=218 second=66 amount=-1 +kerning first=1069 second=1036 amount=-1 +kerning first=264 second=314 amount=-1 +kerning first=220 second=248 amount=-1 +kerning first=1033 second=1036 amount=-1 +kerning first=84 second=261 amount=-1 +kerning first=228 second=314 amount=-1 +kerning first=74 second=110 amount=-1 +kerning first=77 second=66 amount=-1 +kerning first=8222 second=228 amount=-1 +kerning first=310 second=367 amount=-1 +kerning first=274 second=367 amount=-1 +kerning first=344 second=218 amount=-1 +kerning first=1055 second=1030 amount=-1 +kerning first=287 second=110 amount=-1 +kerning first=104 second=242 amount=-1 +kerning first=346 second=367 amount=-1 +kerning first=66 second=380 amount=-1 +kerning first=323 second=110 amount=-1 +kerning first=227 second=318 amount=-1 +kerning first=284 second=274 amount=-1 +kerning first=263 second=318 amount=-1 +kerning first=202 second=367 amount=-1 +kerning first=243 second=380 amount=-1 +kerning first=362 second=66 amount=-1 +kerning first=67 second=257 amount=-1 +kerning first=207 second=380 amount=-1 +kerning first=212 second=274 amount=-1 +kerning first=335 second=318 amount=-1 +kerning first=86 second=101 amount=-1 +kerning first=307 second=8249 amount=-1 +kerning first=1056 second=1049 amount=-1 +kerning first=279 second=380 amount=-1 +kerning first=193 second=8249 amount=-1 +kerning first=327 second=344 amount=-1 +kerning first=1055 second=1042 amount=-1 +kerning first=8218 second=81 amount=-1 +kerning first=263 second=101 amount=-1 +kerning first=250 second=8249 amount=-1 +kerning first=196 second=114 amount=-1 +kerning first=227 second=101 amount=-1 +kerning first=286 second=8249 amount=-1 +kerning first=1049 second=1098 amount=-1 +kerning first=67 second=284 amount=-1 +kerning first=85 second=315 amount=-1 +kerning first=316 second=283 amount=-1 +kerning first=259 second=231 amount=-1 +kerning first=1036 second=1091 amount=-1 +kerning first=118 second=106 amount=-1 +kerning first=270 second=296 amount=-1 +kerning first=187 second=106 amount=-1 +kerning first=203 second=217 amount=-1 +kerning first=1078 second=1077 amount=-1 +kerning first=223 second=106 amount=-1 +kerning first=78 second=344 amount=-1 +kerning first=198 second=296 amount=-1 +kerning first=327 second=214 amount=-1 +kerning first=272 second=310 amount=-1 +kerning first=73 second=8249 amount=-1 +kerning first=219 second=214 amount=-1 +kerning first=109 second=8249 amount=-1 +kerning first=366 second=330 amount=-1 +kerning first=339 second=243 amount=-1 +kerning first=289 second=249 amount=-1 +kerning first=233 second=235 amount=-1 +kerning first=363 second=8221 amount=-1 +kerning first=269 second=235 amount=-1 +kerning first=86 second=345 amount=-1 +kerning first=305 second=235 amount=-1 +kerning first=97 second=275 amount=-1 +kerning first=227 second=345 amount=-1 +kerning first=228 second=287 amount=-1 +kerning first=217 second=249 amount=-1 +kerning first=263 second=345 amount=-1 +kerning first=335 second=345 amount=-1 +kerning first=73 second=69 amount=-1 +kerning first=321 second=362 amount=-1 +kerning first=8217 second=103 amount=-1 +kerning first=1033 second=1063 amount=-2 +kerning first=1091 second=1080 amount=-1 +kerning first=1055 second=1080 amount=-1 +kerning first=280 second=284 amount=-1 +kerning first=82 second=219 amount=-1 +kerning first=209 second=226 amount=-1 +kerning first=267 second=243 amount=-1 +kerning first=1069 second=1063 amount=-1 +kerning first=80 second=336 amount=-1 +kerning first=84 second=353 amount=-1 +kerning first=199 second=97 amount=-1 +kerning first=8220 second=198 amount=-2 +kerning first=214 second=304 amount=-1 +kerning first=1058 second=1079 amount=-1 +kerning first=218 second=337 amount=-1 +kerning first=204 second=278 amount=-1 +kerning first=330 second=370 amount=-1 +kerning first=104 second=291 amount=-1 +kerning first=209 second=199 amount=-1 +kerning first=366 second=370 amount=-1 +kerning first=75 second=361 amount=-1 +kerning first=86 second=74 amount=-1 +kerning first=77 second=337 amount=-1 +kerning first=263 second=107 amount=-1 +kerning first=73 second=304 amount=-1 +kerning first=78 second=100 amount=-1 +kerning first=1034 second=1043 amount=-1 +kerning first=364 second=313 amount=-1 +kerning first=1043 second=1096 amount=-1 +kerning first=1049 second=1049 amount=-1 +kerning first=257 second=187 amount=-1 +kerning first=234 second=269 amount=-1 +kerning first=79 second=221 amount=-1 +kerning first=305 second=8218 amount=-1 +kerning first=362 second=337 amount=-1 +kerning first=1066 second=1037 amount=-1 +kerning first=280 second=278 amount=-1 +kerning first=269 second=8218 amount=-1 +kerning first=287 second=283 amount=-1 +kerning first=326 second=337 amount=-1 +kerning first=1043 second=1116 amount=-1 +kerning first=233 second=8218 amount=-1 +kerning first=195 second=286 amount=-1 +kerning first=207 second=109 amount=-1 +kerning first=274 second=8220 amount=-1 +kerning first=204 second=72 amount=-1 +kerning first=79 second=313 amount=-1 +kerning first=82 second=8218 amount=-1 +kerning first=346 second=8220 amount=-1 +kerning first=262 second=203 amount=-1 +kerning first=70 second=267 amount=-1 +kerning first=310 second=8220 amount=-1 +kerning first=298 second=203 amount=-1 +kerning first=356 second=111 amount=-1 +kerning first=382 second=8220 amount=-1 +kerning first=1060 second=1055 amount=-1 +kerning first=85 second=203 amount=-1 +kerning first=328 second=8220 amount=-2 +kerning first=283 second=267 amount=-1 +kerning first=81 second=370 amount=-1 +kerning first=207 second=315 amount=-1 +kerning first=230 second=263 amount=-1 +kerning first=1055 second=1107 amount=-1 +kerning first=355 second=267 amount=-1 +kerning first=8217 second=101 amount=-1 +kerning first=302 second=263 amount=-1 +kerning first=45 second=370 amount=-1 +kerning first=1104 second=1094 amount=-1 +kerning first=106 second=267 amount=-1 +kerning first=346 second=371 amount=-1 +kerning first=196 second=212 amount=-1 +kerning first=97 second=8220 amount=-2 +kerning first=268 second=114 amount=-1 +kerning first=374 second=263 amount=-1 +kerning first=232 second=114 amount=-1 +kerning first=1052 second=1097 amount=-1 +kerning first=268 second=212 amount=-1 +kerning first=202 second=8220 amount=-1 +kerning first=8218 second=108 amount=-1 +kerning first=304 second=212 amount=-1 +kerning first=304 second=114 amount=-1 +kerning first=1044 second=1085 amount=-1 +kerning first=254 second=46 amount=-1 +kerning first=202 second=69 amount=-1 +kerning first=351 second=44 amount=-1 +kerning first=362 second=364 amount=-1 +kerning first=274 second=69 amount=-1 +kerning first=116 second=99 amount=-1 +kerning first=290 second=364 amount=-1 +kerning first=323 second=273 amount=-1 +kerning first=87 second=81 amount=-1 +kerning first=99 second=251 amount=-1 +kerning first=206 second=227 amount=-1 +kerning first=240 second=44 amount=-1 +kerning first=218 second=364 amount=-1 +kerning first=272 second=218 amount=-1 +kerning first=1030 second=1064 amount=-1 +kerning first=291 second=103 amount=-1 +kerning first=1028 second=1061 amount=-1 +kerning first=352 second=78 amount=-1 +kerning first=200 second=218 amount=-1 +kerning first=1066 second=1064 amount=-1 +kerning first=366 second=302 amount=-1 +kerning first=74 second=273 amount=-1 +kerning first=279 second=44 amount=-1 +kerning first=198 second=334 amount=-1 +kerning first=364 second=248 amount=-1 +kerning first=243 second=44 amount=-1 +kerning first=8217 second=345 amount=-1 +kerning first=280 second=78 amount=-1 +kerning first=197 second=370 amount=-1 +kerning first=67 second=78 amount=-1 +kerning first=330 second=99 amount=-1 +kerning first=252 second=242 amount=-1 +kerning first=370 second=230 amount=-1 +kerning first=366 second=99 amount=-1 +kerning first=82 second=199 amount=-1 +kerning first=262 second=230 amount=-1 +kerning first=203 second=282 amount=-1 +kerning first=1071 second=1092 amount=-1 +kerning first=264 second=352 amount=-1 +kerning first=86 second=367 amount=-1 +kerning first=324 second=242 amount=-1 +kerning first=187 second=241 amount=-1 +kerning first=85 second=230 amount=-1 +kerning first=196 second=87 amount=-1 +kerning first=212 second=84 amount=-1 +kerning first=368 second=346 amount=-1 +kerning first=353 second=291 amount=-1 +kerning first=296 second=346 amount=-1 +kerning first=1034 second=1031 amount=-1 +kerning first=325 second=44 amount=-1 +kerning first=281 second=291 amount=-1 +kerning first=105 second=233 amount=-1 +kerning first=245 second=291 amount=-1 +kerning first=171 second=217 amount=-1 +kerning first=364 second=346 amount=-1 +kerning first=8217 second=214 amount=-1 +kerning first=1049 second=1117 amount=-1 +kerning first=67 second=81 amount=-1 +kerning first=1058 second=1107 amount=-1 +kerning first=73 second=230 amount=-1 +kerning first=1060 second=1052 amount=-1 +kerning first=88 second=45 amount=-1 +kerning first=204 second=224 amount=-1 +kerning first=277 second=337 amount=-1 +kerning first=117 second=291 amount=-1 +kerning first=77 second=334 amount=-1 +kerning first=99 second=224 amount=-1 +kerning first=327 second=8218 amount=-1 +kerning first=205 second=337 amount=-1 +kerning first=199 second=288 amount=-1 +kerning first=195 second=84 amount=-1 +kerning first=1043 second=1098 amount=-1 +kerning first=362 second=334 amount=-1 +kerning first=86 second=227 amount=-1 +kerning first=280 second=81 amount=-1 +kerning first=218 second=187 amount=-2 +kerning first=220 second=99 amount=-1 +kerning first=254 second=187 amount=-1 +kerning first=332 second=8221 amount=-2 +kerning first=103 second=328 amount=-1 +kerning first=275 second=245 amount=-1 +kerning first=1056 second=1095 amount=-1 +kerning first=362 second=187 amount=-2 +kerning first=8217 second=281 amount=-1 +kerning first=364 second=99 amount=-1 +kerning first=187 second=270 amount=-1 +kerning first=255 second=8218 amount=-1 +kerning first=290 second=187 amount=-1 +kerning first=321 second=218 amount=-1 +kerning first=81 second=203 amount=-1 +kerning first=328 second=99 amount=-1 +kerning first=366 second=241 amount=-1 +kerning first=220 second=279 amount=-1 +kerning first=194 second=105 amount=-1 +kerning first=328 second=279 amount=-1 +kerning first=274 second=366 amount=-1 +kerning first=77 second=187 amount=-1 +kerning first=1071 second=1104 amount=-1 +kerning first=364 second=279 amount=-1 +kerning first=212 second=278 amount=-1 +kerning first=327 second=66 amount=-1 +kerning first=323 second=209 amount=-1 +kerning first=101 second=316 amount=-1 +kerning first=196 second=364 amount=-1 +kerning first=74 second=196 amount=-1 +kerning first=65 second=316 amount=-1 +kerning first=1077 second=1096 amount=-1 +kerning first=195 second=264 amount=-1 +kerning first=219 second=66 amount=-1 +kerning first=76 second=368 amount=-1 +kerning first=353 second=187 amount=-1 +kerning first=235 second=108 amount=-1 +kerning first=350 second=69 amount=-1 +kerning first=207 second=202 amount=-1 +kerning first=242 second=316 amount=-1 +kerning first=1059 second=1073 amount=-1 +kerning first=330 second=275 amount=-1 +kerning first=291 second=367 amount=-1 +kerning first=78 second=66 amount=-1 +kerning first=74 second=209 amount=-1 +kerning first=1059 second=1086 amount=-1 +kerning first=264 second=206 amount=-1 +kerning first=199 second=108 amount=-1 +kerning first=314 second=316 amount=-1 +kerning first=206 second=69 amount=-1 +kerning first=266 second=205 amount=-1 +kerning first=325 second=368 amount=-1 +kerning first=278 second=69 amount=-1 +kerning first=345 second=8218 amount=-1 +kerning first=354 second=273 amount=-1 +kerning first=304 second=364 amount=-1 +kerning first=213 second=197 amount=-1 +kerning first=302 second=205 amount=-1 +kerning first=217 second=368 amount=-1 +kerning first=268 second=364 amount=-1 +kerning first=87 second=193 amount=-1 +kerning first=338 second=205 amount=-1 +kerning first=283 second=252 amount=-1 +kerning first=222 second=44 amount=-1 +kerning first=258 second=44 amount=-1 +kerning first=119 second=316 amount=-1 +kerning first=71 second=218 amount=-1 +kerning first=77 second=234 amount=-1 +kerning first=289 second=355 amount=-1 +kerning first=374 second=249 amount=-1 +kerning first=231 second=8249 amount=-1 +kerning first=370 second=248 amount=-1 +kerning first=366 second=44 amount=-2 +kerning first=267 second=8249 amount=-1 +kerning first=203 second=325 amount=-1 +kerning first=375 second=8249 amount=-1 +kerning first=86 second=214 amount=-1 +kerning first=219 second=120 amount=-1 +kerning first=232 second=117 amount=-1 +kerning first=365 second=171 amount=-1 +kerning first=298 second=248 amount=-1 +kerning first=196 second=117 amount=-1 +kerning first=1044 second=1077 amount=-1 +kerning first=277 second=314 amount=-1 +kerning first=262 second=248 amount=-1 +kerning first=1091 second=1116 amount=-1 +kerning first=235 second=122 amount=-1 +kerning first=207 second=282 amount=-1 +kerning first=80 second=78 amount=-1 +kerning first=1042 second=1039 amount=-1 +kerning first=284 second=218 amount=-1 +kerning first=81 second=44 amount=-1 +kerning first=8217 second=361 amount=-1 +kerning first=66 second=282 amount=-1 +kerning first=212 second=218 amount=-1 +kerning first=85 second=248 amount=-1 +kerning first=78 second=220 amount=-1 +kerning first=187 second=77 amount=-1 +kerning first=362 second=100 amount=-1 +kerning first=77 second=248 amount=-1 +kerning first=220 second=333 amount=-1 +kerning first=327 second=362 amount=-1 +kerning first=67 second=382 amount=-1 +kerning first=103 second=382 amount=-1 +kerning first=356 second=339 amount=-1 +kerning first=328 second=333 amount=-1 +kerning first=363 second=246 amount=-1 +kerning first=205 second=350 amount=-1 +kerning first=110 second=289 amount=-1 +kerning first=364 second=333 amount=-1 +kerning first=327 second=246 amount=-1 +kerning first=1039 second=1048 amount=-1 +kerning first=244 second=382 amount=-1 +kerning first=251 second=289 amount=-1 +kerning first=277 second=103 amount=-1 +kerning first=77 second=100 amount=-1 +kerning first=241 second=103 amount=-1 +kerning first=1042 second=1065 amount=-1 +kerning first=205 second=103 amount=-1 +kerning first=219 second=246 amount=-1 +kerning first=287 second=289 amount=-1 +kerning first=231 second=171 amount=-1 +kerning first=100 second=103 amount=-1 +kerning first=267 second=171 amount=-1 +kerning first=334 second=194 amount=-1 +kerning first=78 second=246 amount=-1 +kerning first=219 second=220 amount=-1 +kerning first=218 second=100 amount=-1 +kerning first=1047 second=1068 amount=-1 +kerning first=370 second=194 amount=-1 +kerning first=327 second=220 amount=-1 +kerning first=375 second=171 amount=-1 +kerning first=296 second=290 amount=-1 +kerning first=323 second=109 amount=-1 +kerning first=263 second=307 amount=-1 +kerning first=204 second=211 amount=-1 +kerning first=248 second=120 amount=-1 +kerning first=204 second=304 amount=-1 +kerning first=193 second=85 amount=-1 +kerning first=203 second=338 amount=-1 +kerning first=85 second=97 amount=-1 +kerning first=257 second=245 amount=-1 +kerning first=291 second=120 amount=-1 +kerning first=66 second=202 amount=-1 +kerning first=193 second=332 amount=-1 +kerning first=327 second=313 amount=-1 +kerning first=1069 second=1025 amount=-1 +kerning first=1033 second=1025 amount=-1 +kerning first=255 second=114 amount=-1 +kerning first=8217 second=335 amount=-1 +kerning first=266 second=298 amount=-1 +kerning first=1068 second=1059 amount=-2 +kerning first=1078 second=1117 amount=-1 +kerning first=272 second=347 amount=-1 +kerning first=338 second=298 amount=-1 +kerning first=264 second=8250 amount=-1 +kerning first=74 second=109 amount=-1 +kerning first=219 second=313 amount=-1 +kerning first=117 second=45 amount=-1 +kerning first=302 second=298 amount=-1 +kerning first=1038 second=1108 amount=-1 +kerning first=187 second=324 amount=-1 +kerning first=296 second=357 amount=-1 +kerning first=1118 second=1076 amount=-1 +kerning first=229 second=8250 amount=-1 +kerning first=368 second=357 amount=-1 +kerning first=1054 second=1083 amount=-1 +kerning first=282 second=219 amount=-1 +kerning first=330 second=111 amount=-1 +kerning first=193 second=8250 amount=-1 +kerning first=1046 second=1076 amount=-1 +kerning first=275 second=271 amount=-1 +kerning first=207 second=232 amount=-1 +kerning first=366 second=111 amount=-1 +kerning first=310 second=212 amount=-1 +kerning first=214 second=323 amount=-1 +kerning first=210 second=219 amount=-1 +kerning first=214 second=76 amount=-1 +kerning first=88 second=8250 amount=-1 +kerning first=1056 second=1041 amount=-1 +kerning first=1062 second=1118 amount=-1 +kerning first=73 second=323 amount=-1 +kerning first=202 second=212 amount=-1 +kerning first=280 second=315 amount=-1 +kerning first=275 second=8217 amount=-2 +kerning first=69 second=219 amount=-1 +kerning first=73 second=76 amount=-1 +kerning first=286 second=323 amount=-1 +kerning first=65 second=262 amount=-1 +kerning first=347 second=8217 amount=-2 +kerning first=206 second=262 amount=-1 +kerning first=101 second=113 amount=-1 +kerning first=1030 second=1075 amount=-1 +kerning first=98 second=8217 amount=-2 +kerning first=192 second=119 amount=-1 +kerning first=117 second=111 amount=-1 +kerning first=278 second=262 amount=-1 +kerning first=356 second=46 amount=-1 +kerning first=352 second=315 amount=-1 +kerning first=203 second=8217 amount=-1 +kerning first=77 second=280 amount=-1 +kerning first=304 second=204 amount=-1 +kerning first=110 second=263 amount=-1 +kerning first=112 second=314 amount=-1 +kerning first=334 second=68 amount=-1 +kerning first=80 second=366 amount=-1 +kerning first=298 second=68 amount=-1 +kerning first=85 second=68 amount=-1 +kerning first=251 second=263 amount=-1 +kerning first=287 second=263 amount=-1 +kerning first=218 second=280 amount=-1 +kerning first=289 second=314 amount=-1 +kerning first=323 second=263 amount=-1 +kerning first=253 second=314 amount=-1 +kerning first=72 second=110 amount=-1 +kerning first=85 second=194 amount=-1 +kerning first=290 second=280 amount=-1 +kerning first=325 second=67 amount=-1 +kerning first=1065 second=1105 amount=-1 +kerning first=8218 second=232 amount=-1 +kerning first=1065 second=1028 amount=-1 +kerning first=217 second=67 amount=-1 +kerning first=1027 second=1084 amount=-1 +kerning first=1066 second=1101 amount=-1 +kerning first=338 second=213 amount=-1 +kerning first=1069 second=1046 amount=-1 +kerning first=1053 second=1024 amount=-1 +kerning first=370 second=68 amount=-1 +kerning first=1033 second=1101 amount=-1 +kerning first=251 second=103 amount=-1 +kerning first=187 second=378 amount=-1 +kerning first=118 second=378 amount=-1 +kerning first=219 second=192 amount=-1 +kerning first=72 second=357 amount=-1 +kerning first=323 second=70 amount=-1 +kerning first=77 second=46 amount=-1 +kerning first=218 second=46 amount=-2 +kerning first=74 second=70 amount=-1 +kerning first=259 second=378 amount=-1 +kerning first=290 second=46 amount=-1 +kerning first=223 second=378 amount=-1 +kerning first=368 second=195 amount=-1 +kerning first=327 second=274 amount=-1 +kerning first=327 second=46 amount=-1 +kerning first=78 second=207 amount=-1 +kerning first=81 second=65 amount=-1 +kerning first=1055 second=1075 amount=-1 +kerning first=87 second=8217 amount=-1 +kerning first=217 second=262 amount=-1 +kerning first=324 second=101 amount=-1 +kerning first=270 second=201 amount=-1 +kerning first=192 second=8217 amount=-2 +kerning first=1062 second=1101 amount=-1 +kerning first=228 second=8217 amount=-2 +kerning first=198 second=201 amount=-1 +kerning first=1050 second=1072 amount=-1 +kerning first=8218 second=121 amount=-1 +kerning first=198 second=216 amount=-1 +kerning first=325 second=262 amount=-1 +kerning first=99 second=250 amount=-1 +kerning first=70 second=345 amount=-1 +kerning first=316 second=369 amount=-1 +kerning first=264 second=267 amount=-1 +kerning first=280 second=369 amount=-1 +kerning first=114 second=259 amount=-1 +kerning first=69 second=366 amount=-1 +kerning first=117 second=246 amount=-1 +kerning first=81 second=198 amount=-1 +kerning first=66 second=256 amount=-1 +kerning first=78 second=259 amount=-1 +kerning first=1048 second=1089 amount=-1 +kerning first=80 second=204 amount=-1 +kerning first=1088 second=1084 amount=-1 +kerning first=45 second=198 amount=-1 +kerning first=118 second=311 amount=-1 +kerning first=121 second=287 amount=-1 +kerning first=1062 second=1105 amount=-1 +kerning first=283 second=345 amount=-1 +kerning first=327 second=259 amount=-1 +kerning first=287 second=122 amount=-1 +kerning first=1038 second=1054 amount=-1 +kerning first=219 second=259 amount=-1 +kerning first=323 second=122 amount=-1 +kerning first=1065 second=1096 amount=-1 +kerning first=218 second=85 amount=-1 +kerning first=219 second=207 amount=-1 +kerning first=226 second=287 amount=-1 +kerning first=282 second=366 amount=-1 +kerning first=264 second=67 amount=-1 +kerning first=73 second=271 amount=-1 +kerning first=195 second=210 amount=-1 +kerning first=198 second=116 amount=-1 +kerning first=210 second=366 amount=-1 +kerning first=192 second=67 amount=-1 +kerning first=268 second=264 amount=-1 +kerning first=204 second=83 amount=-1 +kerning first=196 second=336 amount=-1 +kerning first=204 second=317 amount=-1 +kerning first=87 second=67 amount=-1 +kerning first=337 second=8250 amount=-1 +kerning first=268 second=336 amount=-1 +kerning first=324 second=281 amount=-1 +kerning first=205 second=244 amount=-1 +kerning first=241 second=244 amount=-1 +kerning first=242 second=46 amount=-1 +kerning first=121 second=8220 amount=-2 +kerning first=104 second=171 amount=-1 +kerning first=277 second=244 amount=-1 +kerning first=1056 second=1056 amount=-1 +kerning first=85 second=8220 amount=-1 +kerning first=1062 second=1090 amount=-1 +kerning first=200 second=213 amount=-1 +kerning first=70 second=347 amount=-1 +kerning first=75 second=268 amount=-1 +kerning first=84 second=74 amount=-1 +kerning first=262 second=8220 amount=-1 +kerning first=8218 second=119 amount=-1 +kerning first=231 second=277 amount=-1 +kerning first=344 second=213 amount=-1 +kerning first=70 second=380 amount=-1 +kerning first=366 second=198 amount=-1 +kerning first=85 second=235 amount=-1 +kerning first=334 second=356 amount=-1 +kerning first=284 second=77 amount=-1 +kerning first=73 second=269 amount=-1 +kerning first=339 second=277 amount=-1 +kerning first=212 second=77 amount=-1 +kerning first=272 second=296 amount=-1 +kerning first=226 second=235 amount=-1 +kerning first=71 second=77 amount=-1 +kerning first=267 second=277 amount=-1 +kerning first=262 second=235 amount=-1 +kerning first=1065 second=1081 amount=-1 +kerning first=89 second=79 amount=-1 +kerning first=1089 second=1078 amount=-1 +kerning first=194 second=79 amount=-1 +kerning first=187 second=296 amount=-1 +kerning first=264 second=286 amount=-1 +kerning first=87 second=65 amount=-1 +kerning first=206 second=82 amount=-1 +kerning first=1047 second=1094 amount=-1 +kerning first=1053 second=1065 amount=-1 +kerning first=356 second=231 amount=-1 +kerning first=118 second=363 amount=-1 +kerning first=278 second=82 amount=-1 +kerning first=374 second=79 amount=-1 +kerning first=219 second=274 amount=-1 +kerning first=187 second=363 amount=-1 +kerning first=87 second=286 amount=-1 +kerning first=304 second=351 amount=-1 +kerning first=268 second=351 amount=-1 +kerning first=73 second=338 amount=-1 +kerning first=192 second=286 amount=-1 +kerning first=232 second=351 amount=-1 +kerning first=1050 second=1085 amount=-1 +kerning first=210 second=77 amount=-1 +kerning first=355 second=347 amount=-1 +kerning first=266 second=79 amount=-1 +kerning first=78 second=274 amount=-1 +kerning first=266 second=337 amount=-1 +kerning first=291 second=382 amount=-1 +kerning first=302 second=79 amount=-1 +kerning first=283 second=347 amount=-1 +kerning first=338 second=79 amount=-1 +kerning first=100 second=244 amount=-1 +kerning first=217 second=260 amount=-1 +kerning first=72 second=290 amount=-1 +kerning first=1064 second=1042 amount=-1 +kerning first=282 second=80 amount=-1 +kerning first=250 second=279 amount=-1 +kerning first=234 second=114 amount=-1 +kerning first=219 second=261 amount=-1 +kerning first=8217 second=227 amount=-1 +kerning first=210 second=80 amount=-1 +kerning first=327 second=205 amount=-1 +kerning first=199 second=275 amount=-1 +kerning first=327 second=261 amount=-1 +kerning first=8218 second=67 amount=-1 +kerning first=338 second=66 amount=-1 +kerning first=88 second=361 amount=-1 +kerning first=280 second=367 amount=-1 +kerning first=73 second=217 amount=-1 +kerning first=302 second=66 amount=-1 +kerning first=72 second=344 amount=-1 +kerning first=266 second=66 amount=-1 +kerning first=72 second=113 amount=-1 +kerning first=198 second=114 amount=-1 +kerning first=214 second=217 amount=-1 +kerning first=77 second=115 amount=-1 +kerning first=103 second=367 amount=-1 +kerning first=78 second=205 amount=-1 +kerning first=286 second=217 amount=-1 +kerning first=344 second=357 amount=-1 +kerning first=274 second=251 amount=-1 +kerning first=207 second=310 amount=-1 +kerning first=202 second=251 amount=-1 +kerning first=374 second=284 amount=-1 +kerning first=78 second=261 amount=-1 +kerning first=69 second=80 amount=-1 +kerning first=66 second=310 amount=-1 +kerning first=362 second=209 amount=-1 +kerning first=310 second=251 amount=-1 +kerning first=205 second=333 amount=-1 +kerning first=346 second=251 amount=-1 +kerning first=219 second=205 amount=-1 +kerning first=275 second=106 amount=-1 +kerning first=298 second=235 amount=-1 +kerning first=119 second=249 amount=-1 +kerning first=366 second=252 amount=-1 +kerning first=100 second=242 amount=-1 +kerning first=202 second=266 amount=-1 +kerning first=370 second=235 amount=-1 +kerning first=310 second=266 amount=-1 +kerning first=98 second=106 amount=-1 +kerning first=241 second=242 amount=-1 +kerning first=229 second=287 amount=-1 +kerning first=277 second=242 amount=-1 +kerning first=117 second=267 amount=-1 +kerning first=272 second=200 amount=-1 +kerning first=205 second=242 amount=-1 +kerning first=83 second=249 amount=-1 +kerning first=200 second=200 amount=-1 +kerning first=115 second=45 amount=-1 +kerning first=45 second=252 amount=-1 +kerning first=305 second=8220 amount=-1 +kerning first=72 second=71 amount=-1 +kerning first=99 second=8222 amount=-1 +kerning first=274 second=71 amount=-1 +kerning first=217 second=226 amount=-1 +kerning first=264 second=101 amount=-1 +kerning first=206 second=97 amount=-1 +kerning first=85 second=242 amount=-1 +kerning first=258 second=252 amount=-1 +kerning first=271 second=275 amount=-1 +kerning first=328 second=45 amount=-1 +kerning first=75 second=214 amount=-1 +kerning first=235 second=275 amount=-1 +kerning first=85 second=233 amount=-1 +kerning first=220 second=45 amount=-2 +kerning first=368 second=249 amount=-1 +kerning first=1049 second=1028 amount=-1 +kerning first=256 second=45 amount=-1 +kerning first=355 second=291 amount=-1 +kerning first=304 second=336 amount=-1 +kerning first=226 second=233 amount=-1 +kerning first=274 second=199 amount=-1 +kerning first=198 second=332 amount=-1 +kerning first=262 second=233 amount=-1 +kerning first=310 second=199 amount=-1 +kerning first=283 second=291 amount=-1 +kerning first=201 second=315 amount=-1 +kerning first=220 second=363 amount=-1 +kerning first=171 second=87 amount=-1 +kerning first=262 second=302 amount=-1 +kerning first=80 second=258 amount=-1 +kerning first=105 second=234 amount=-1 +kerning first=298 second=302 amount=-1 +kerning first=71 second=85 amount=-1 +kerning first=289 second=104 amount=-1 +kerning first=267 second=223 amount=-1 +kerning first=106 second=291 amount=-1 +kerning first=231 second=223 amount=-1 +kerning first=298 second=233 amount=-1 +kerning first=1105 second=1103 amount=-1 +kerning first=195 second=223 amount=-1 +kerning first=264 second=232 amount=-1 +kerning first=45 second=356 amount=-1 +kerning first=207 second=243 amount=-1 +kerning first=199 second=327 amount=-1 +kerning first=1067 second=1080 amount=-1 +kerning first=228 second=232 amount=-1 +kerning first=1031 second=1080 amount=-1 +kerning first=1041 second=1095 amount=-1 +kerning first=206 second=225 amount=-1 +kerning first=119 second=8221 amount=-2 +kerning first=324 second=337 amount=-1 +kerning first=310 second=262 amount=-1 +kerning first=1033 second=1079 amount=-1 +kerning first=74 second=122 amount=-1 +kerning first=221 second=258 amount=-1 +kerning first=224 second=8221 amount=-2 +kerning first=8217 second=382 amount=-1 +kerning first=260 second=8221 amount=-2 +kerning first=291 second=328 amount=-1 +kerning first=1068 second=1039 amount=-1 +kerning first=220 second=216 amount=-1 +kerning first=217 second=233 amount=-1 +kerning first=231 second=225 amount=-1 +kerning first=314 second=287 amount=-1 +kerning first=8220 second=351 amount=-1 +kerning first=267 second=225 amount=-1 +kerning first=65 second=370 amount=-1 +kerning first=252 second=335 amount=-1 +kerning first=115 second=318 amount=-1 +kerning first=211 second=72 amount=-1 +kerning first=87 second=232 amount=-1 +kerning first=70 second=72 amount=-1 +kerning first=1034 second=1071 amount=-1 +kerning first=291 second=105 amount=-1 +kerning first=1070 second=1071 amount=-1 +kerning first=209 second=8222 amount=-1 +kerning first=1048 second=1096 amount=-1 +kerning first=362 second=46 amount=-2 +kerning first=213 second=344 amount=-1 +kerning first=354 second=234 amount=-1 +kerning first=278 second=370 amount=-1 +kerning first=258 second=98 amount=-1 +kerning first=206 second=370 amount=-1 +kerning first=114 second=97 amount=-1 +kerning first=8218 second=286 amount=-1 +kerning first=193 second=89 amount=-1 +kerning first=199 second=44 amount=-1 +kerning first=202 second=199 amount=-1 +kerning first=207 second=241 amount=-1 +kerning first=350 second=370 amount=-1 +kerning first=202 second=361 amount=-1 +kerning first=194 second=314 amount=-1 +kerning first=1030 second=1062 amount=-1 +kerning first=369 second=267 amount=-1 +kerning first=1048 second=1086 amount=-1 +kerning first=67 second=243 amount=-1 +kerning first=1047 second=1070 amount=-1 +kerning first=364 second=114 amount=-1 +kerning first=1043 second=1083 amount=-1 +kerning first=217 second=206 amount=-1 +kerning first=328 second=114 amount=-1 +kerning first=274 second=361 amount=-1 +kerning first=8218 second=365 amount=-1 +kerning first=225 second=267 amount=-1 +kerning first=310 second=361 amount=-1 +kerning first=261 second=267 amount=-1 +kerning first=291 second=8250 amount=-1 +kerning first=325 second=206 amount=-1 +kerning first=1044 second=1079 amount=-1 +kerning first=220 second=114 amount=-1 +kerning first=210 second=258 amount=-1 +kerning first=206 second=368 amount=-1 +kerning first=109 second=245 amount=-1 +kerning first=1058 second=1092 amount=-1 +kerning first=218 second=275 amount=-1 +kerning first=328 second=8249 amount=-1 +kerning first=232 second=115 amount=-1 +kerning first=197 second=213 amount=-1 +kerning first=327 second=315 amount=-1 +kerning first=364 second=8249 amount=-2 +kerning first=207 second=351 amount=-1 +kerning first=278 second=368 amount=-1 +kerning first=268 second=115 amount=-1 +kerning first=86 second=212 amount=-1 +kerning first=205 second=352 amount=-1 +kerning first=364 second=331 amount=-1 +kerning first=235 second=316 amount=-1 +kerning first=283 second=254 amount=-1 +kerning first=305 second=111 amount=-1 +kerning first=65 second=368 amount=-1 +kerning first=1081 second=1095 amount=-1 +kerning first=1045 second=1095 amount=-1 +kerning first=226 second=263 amount=-1 +kerning first=220 second=331 amount=-1 +kerning first=262 second=263 amount=-1 +kerning first=298 second=263 amount=-1 +kerning first=201 second=365 amount=-1 +kerning first=116 second=263 amount=-1 +kerning first=74 second=194 amount=-1 +kerning first=370 second=263 amount=-1 +kerning first=304 second=115 amount=-1 +kerning first=1030 second=1055 amount=-1 +kerning first=115 second=8249 amount=-1 +kerning first=201 second=68 amount=-1 +kerning first=350 second=368 amount=-1 +kerning first=80 second=310 amount=-1 +kerning first=220 second=8249 amount=-2 +kerning first=200 second=72 amount=-1 +kerning first=218 second=102 amount=-1 +kerning first=1067 second=1067 amount=-1 +kerning first=212 second=203 amount=-1 +kerning first=1060 second=1037 amount=-1 +kerning first=325 second=370 amount=-1 +kerning first=284 second=203 amount=-1 +kerning first=1059 second=1088 amount=-1 +kerning first=84 second=267 amount=-1 +kerning first=362 second=102 amount=-1 +kerning first=112 second=106 amount=-1 +kerning first=85 second=263 amount=-1 +kerning first=1055 second=1101 amount=-1 +kerning first=1027 second=1118 amount=-1 +kerning first=272 second=72 amount=-1 +kerning first=71 second=203 amount=-1 +kerning first=1091 second=1101 amount=-1 +kerning first=253 second=106 amount=-1 +kerning first=1064 second=1024 amount=-1 +kerning first=80 second=327 amount=-1 +kerning first=337 second=8222 amount=-1 +kerning first=1038 second=1028 amount=-1 +kerning first=77 second=282 amount=-1 +kerning first=65 second=84 amount=-1 +kerning first=1071 second=1052 amount=-1 +kerning first=209 second=346 amount=-1 +kerning first=1047 second=1117 amount=-1 +kerning first=88 second=8222 amount=-1 +kerning first=88 second=334 amount=-1 +kerning first=305 second=291 amount=-1 +kerning first=269 second=291 amount=-1 +kerning first=89 second=337 amount=-1 +kerning first=69 second=288 amount=-1 +kerning first=233 second=291 amount=-1 +kerning first=351 second=187 amount=-1 +kerning first=266 second=350 amount=-1 +kerning first=302 second=350 amount=-1 +kerning first=101 second=318 amount=-1 +kerning first=350 second=73 amount=-1 +kerning first=282 second=288 amount=-1 +kerning first=66 second=187 amount=-1 +kerning first=242 second=318 amount=-1 +kerning first=104 second=99 amount=-1 +kerning first=198 second=270 amount=-1 +kerning first=314 second=318 amount=-1 +kerning first=209 second=75 amount=-1 +kerning first=1067 second=1119 amount=-1 +kerning first=243 second=187 amount=-1 +kerning first=8217 second=266 amount=-1 +kerning first=302 second=337 amount=-1 +kerning first=281 second=99 amount=-1 +kerning first=279 second=187 amount=-1 +kerning first=1051 second=1064 amount=-1 +kerning first=1051 second=1027 amount=-1 +kerning first=230 second=337 amount=-1 +kerning first=209 second=99 amount=-1 +kerning first=270 second=270 amount=-1 +kerning first=79 second=203 amount=-1 +kerning first=339 second=279 amount=-1 +kerning first=1048 second=1036 amount=-1 +kerning first=231 second=279 amount=-1 +kerning first=266 second=187 amount=-1 +kerning first=269 second=328 amount=-1 +kerning first=267 second=279 amount=-1 +kerning first=1039 second=1074 amount=-1 +kerning first=218 second=332 amount=-1 +kerning first=116 second=232 amount=-1 +kerning first=368 second=262 amount=-1 +kerning first=323 second=8222 amount=-1 +kerning first=214 second=278 amount=-1 +kerning first=268 second=202 amount=-1 +kerning first=364 second=277 amount=-1 +kerning first=362 second=332 amount=-1 +kerning first=66 second=351 amount=-1 +kerning first=328 second=277 amount=-1 +kerning first=109 second=8217 amount=-2 +kerning first=77 second=8250 amount=-1 +kerning first=304 second=202 amount=-1 +kerning first=289 second=316 amount=-1 +kerning first=278 second=264 amount=-1 +kerning first=279 second=351 amount=-1 +kerning first=274 second=116 amount=-1 +kerning first=206 second=264 amount=-1 +kerning first=283 second=8221 amount=-2 +kerning first=291 second=267 amount=-1 +kerning first=288 second=73 amount=-1 +kerning first=209 second=115 amount=-1 +kerning first=325 second=69 amount=-1 +kerning first=203 second=323 amount=-1 +kerning first=1048 second=1073 amount=-1 +kerning first=65 second=264 amount=-1 +kerning first=219 second=279 amount=-1 +kerning first=119 second=108 amount=-1 +kerning first=1052 second=1030 amount=-1 +kerning first=214 second=8217 amount=-2 +kerning first=264 second=338 amount=-1 +kerning first=220 second=277 amount=-1 +kerning first=250 second=8217 amount=-1 +kerning first=1060 second=1050 amount=-1 +kerning first=171 second=350 amount=-1 +kerning first=1052 second=1060 amount=-1 +kerning first=286 second=8217 amount=-1 +kerning first=192 second=338 amount=-1 +kerning first=194 second=356 amount=-1 +kerning first=310 second=307 amount=-1 +kerning first=217 second=69 amount=-1 +kerning first=80 second=364 amount=-1 +kerning first=8217 second=212 amount=-1 +kerning first=255 second=8249 amount=-1 +kerning first=8217 second=347 amount=-1 +kerning first=330 second=113 amount=-1 +kerning first=111 second=103 amount=-1 +kerning first=116 second=333 amount=-1 +kerning first=73 second=325 amount=-1 +kerning first=366 second=113 amount=-1 +kerning first=325 second=286 amount=-1 +kerning first=221 second=273 amount=-1 +kerning first=116 second=242 amount=-1 +kerning first=101 second=355 amount=-1 +kerning first=1067 second=1025 amount=-1 +kerning first=65 second=171 amount=-1 +kerning first=65 second=355 amount=-1 +kerning first=286 second=325 amount=-1 +kerning first=80 second=273 amount=-1 +kerning first=304 second=78 amount=-1 +kerning first=76 second=370 amount=-1 +kerning first=217 second=193 amount=-1 +kerning first=1031 second=1039 amount=-1 +kerning first=217 second=286 amount=-1 +kerning first=101 second=314 amount=-1 +kerning first=117 second=113 amount=-1 +kerning first=1067 second=1039 amount=-1 +kerning first=65 second=314 amount=-1 +kerning first=279 second=335 amount=-1 +kerning first=1055 second=1047 amount=-1 +kerning first=334 second=317 amount=-1 +kerning first=1034 second=1056 amount=-1 +kerning first=314 second=314 amount=-1 +kerning first=1027 second=1082 amount=-1 +kerning first=370 second=317 amount=-1 +kerning first=1049 second=1069 amount=-1 +kerning first=1070 second=1056 amount=-1 +kerning first=217 second=81 amount=-1 +kerning first=362 second=282 amount=-1 +kerning first=242 second=314 amount=-1 +kerning first=368 second=8221 amount=-1 +kerning first=290 second=282 amount=-1 +kerning first=171 second=364 amount=-1 +kerning first=1039 second=1119 amount=-1 +kerning first=278 second=355 amount=-1 +kerning first=221 second=117 amount=-1 +kerning first=218 second=282 amount=-1 +kerning first=112 second=316 amount=-1 +kerning first=270 second=77 amount=-1 +kerning first=279 second=100 amount=-1 +kerning first=198 second=77 amount=-1 +kerning first=121 second=289 amount=-1 +kerning first=367 second=234 amount=-1 +kerning first=1039 second=1100 amount=-1 +kerning first=339 second=333 amount=-1 +kerning first=226 second=289 amount=-1 +kerning first=286 second=76 amount=-1 +kerning first=100 second=101 amount=-1 +kerning first=263 second=305 amount=-1 +kerning first=205 second=101 amount=-1 +kerning first=278 second=171 amount=-1 +kerning first=280 second=220 amount=-1 +kerning first=374 second=246 amount=-1 +kerning first=277 second=101 amount=-1 +kerning first=350 second=171 amount=-1 +kerning first=352 second=220 amount=-1 +kerning first=241 second=101 amount=-1 +kerning first=302 second=246 amount=-1 +kerning first=324 second=103 amount=-1 +kerning first=311 second=8217 amount=-1 +kerning first=266 second=246 amount=-1 +kerning first=231 second=333 amount=-1 +kerning first=291 second=246 amount=-1 +kerning first=230 second=246 amount=-1 +kerning first=1046 second=1054 amount=-1 +kerning first=267 second=333 amount=-1 +kerning first=79 second=192 amount=-1 +kerning first=1067 second=1065 amount=-1 +kerning first=207 second=100 amount=-1 +kerning first=1104 second=1096 amount=-1 +kerning first=284 second=325 amount=-1 +kerning first=89 second=246 amount=-1 +kerning first=87 second=338 amount=-1 +kerning first=88 second=211 amount=-1 +kerning first=78 second=315 amount=-1 +kerning first=230 second=8218 amount=-1 +kerning first=266 second=120 amount=-1 +kerning first=302 second=296 amount=-1 +kerning first=1046 second=1074 amount=-1 +kerning first=193 second=211 amount=-1 +kerning first=219 second=315 amount=-1 +kerning first=374 second=120 amount=-1 +kerning first=97 second=281 amount=-1 +kerning first=374 second=8218 amount=-2 +kerning first=352 second=313 amount=-1 +kerning first=338 second=8218 amount=-1 +kerning first=1038 second=1084 amount=-1 +kerning first=290 second=207 amount=-1 +kerning first=262 second=225 amount=-1 +kerning first=205 second=298 amount=-1 +kerning first=199 second=290 amount=-1 +kerning first=233 second=382 amount=-1 +kerning first=8250 second=221 amount=-2 +kerning first=253 second=114 amount=-1 +kerning first=362 second=8250 amount=-2 +kerning first=269 second=382 amount=-1 +kerning first=89 second=8218 amount=-2 +kerning first=287 second=287 amount=-1 +kerning first=89 second=120 amount=-1 +kerning first=290 second=8250 amount=-1 +kerning first=251 second=287 amount=-1 +kerning first=213 second=86 amount=-1 +kerning first=67 second=313 amount=-1 +kerning first=254 second=8250 amount=-1 +kerning first=352 second=204 amount=-1 +kerning first=218 second=8250 amount=-2 +kerning first=221 second=234 amount=-1 +kerning first=298 second=339 amount=-1 +kerning first=262 second=339 amount=-1 +kerning first=74 second=302 amount=-1 +kerning first=370 second=339 amount=-1 +kerning first=262 second=107 amount=-1 +kerning first=257 second=234 amount=-1 +kerning first=365 second=234 amount=-1 +kerning first=85 second=339 amount=-1 +kerning first=321 second=354 amount=-1 +kerning first=226 second=339 amount=-1 +kerning first=77 second=278 amount=-1 +kerning first=110 second=8220 amount=-2 +kerning first=362 second=243 amount=-1 +kerning first=370 second=122 amount=-1 +kerning first=290 second=278 amount=-1 +kerning first=262 second=122 amount=-1 +kerning first=211 second=330 amount=-1 +kerning first=1051 second=1118 amount=-1 +kerning first=298 second=122 amount=-1 +kerning first=73 second=74 amount=-1 +kerning first=218 second=278 amount=-1 +kerning first=204 second=280 amount=-1 +kerning first=325 second=232 amount=-1 +kerning first=289 second=232 amount=-1 +kerning first=121 second=107 amount=-1 +kerning first=80 second=219 amount=-1 +kerning first=226 second=122 amount=-1 +kerning first=116 second=234 amount=-1 +kerning first=85 second=122 amount=-1 +kerning first=335 second=103 amount=-1 +kerning first=80 second=234 amount=-1 +kerning first=217 second=232 amount=-1 +kerning first=121 second=122 amount=-1 +kerning first=362 second=278 amount=-1 +kerning first=227 second=335 amount=-1 +kerning first=1066 second=1039 amount=-1 +kerning first=1036 second=1094 amount=-1 +kerning first=268 second=241 amount=-1 +kerning first=304 second=209 amount=-1 +kerning first=263 second=335 amount=-1 +kerning first=275 second=269 amount=-1 +kerning first=1031 second=1083 amount=-1 +kerning first=198 second=363 amount=-1 +kerning first=323 second=115 amount=-1 +kerning first=234 second=363 amount=-1 +kerning first=288 second=298 amount=-1 +kerning first=323 second=85 amount=-1 +kerning first=368 second=344 amount=-1 +kerning first=251 second=8220 amount=-1 +kerning first=72 second=202 amount=-1 +kerning first=279 second=46 amount=-1 +kerning first=205 second=229 amount=-1 +kerning first=217 second=65 amount=-1 +kerning first=243 second=46 amount=-1 +kerning first=287 second=8220 amount=-2 +kerning first=323 second=302 amount=-1 +kerning first=351 second=46 amount=-1 +kerning first=1040 second=1081 amount=-1 +kerning first=74 second=85 amount=-1 +kerning first=338 second=114 amount=-1 +kerning first=1076 second=1081 amount=-1 +kerning first=283 second=98 amount=-1 +kerning first=291 second=316 amount=-1 +kerning first=86 second=335 amount=-1 +kerning first=1069 second=1038 amount=-1 +kerning first=203 second=67 amount=-1 +kerning first=262 second=284 amount=-1 +kerning first=213 second=195 amount=-1 +kerning first=352 second=274 amount=-1 +kerning first=193 second=250 amount=-1 +kerning first=374 second=192 amount=-1 +kerning first=87 second=262 amount=-1 +kerning first=88 second=250 amount=-1 +kerning first=234 second=378 amount=-1 +kerning first=8250 second=112 amount=-1 +kerning first=204 second=70 amount=-1 +kerning first=192 second=262 amount=-1 +kerning first=289 second=8218 amount=-1 +kerning first=102 second=46 amount=-1 +kerning first=264 second=262 amount=-1 +kerning first=266 second=207 amount=-1 +kerning first=66 second=46 amount=-1 +kerning first=1075 second=1085 amount=-1 +kerning first=86 second=251 amount=-1 +kerning first=310 second=357 amount=-1 +kerning first=1069 second=1053 amount=-1 +kerning first=209 second=216 amount=-1 +kerning first=233 second=8250 amount=-1 +kerning first=1102 second=1078 amount=-1 +kerning first=274 second=357 amount=-1 +kerning first=224 second=171 amount=-1 +kerning first=272 second=76 amount=-1 +kerning first=346 second=200 amount=-1 +kerning first=326 second=243 amount=-1 +kerning first=1033 second=1053 amount=-1 +kerning first=87 second=277 amount=-1 +kerning first=214 second=310 amount=-1 +kerning first=187 second=369 amount=-1 +kerning first=263 second=251 amount=-1 +kerning first=1064 second=1117 amount=-1 +kerning first=8250 second=344 amount=-1 +kerning first=103 second=314 amount=-1 +kerning first=280 second=68 amount=-1 +kerning first=202 second=357 amount=-1 +kerning first=187 second=116 amount=-1 +kerning first=250 second=335 amount=-1 +kerning first=1041 second=1084 amount=-1 +kerning first=209 second=201 amount=-1 +kerning first=68 second=201 amount=-1 +kerning first=70 second=113 amount=-1 +kerning first=82 second=116 amount=-1 +kerning first=106 second=113 amount=-1 +kerning first=8218 second=316 amount=-1 +kerning first=100 second=8220 amount=-1 +kerning first=210 second=204 amount=-1 +kerning first=1054 second=1044 amount=-1 +kerning first=118 second=351 amount=-1 +kerning first=89 second=242 amount=-1 +kerning first=84 second=271 amount=-1 +kerning first=69 second=204 amount=-1 +kerning first=67 second=259 amount=-1 +kerning first=338 second=207 amount=-1 +kerning first=205 second=268 amount=-1 +kerning first=302 second=207 amount=-1 +kerning first=278 second=210 amount=-1 +kerning first=282 second=204 amount=-1 +kerning first=8216 second=194 amount=-2 +kerning first=199 second=366 amount=-1 +kerning first=206 second=210 amount=-1 +kerning first=291 second=369 amount=-1 +kerning first=374 second=242 amount=-1 +kerning first=255 second=369 amount=-1 +kerning first=355 second=113 amount=-1 +kerning first=219 second=369 amount=-1 +kerning first=302 second=242 amount=-1 +kerning first=1076 second=1096 amount=-1 +kerning first=283 second=113 amount=-1 +kerning first=304 second=226 amount=-1 +kerning first=74 second=233 amount=-1 +kerning first=267 second=97 amount=-1 +kerning first=1118 second=1113 amount=-1 +kerning first=324 second=244 amount=-1 +kerning first=110 second=233 amount=-1 +kerning first=206 second=279 amount=-1 +kerning first=370 second=209 amount=-1 +kerning first=69 second=327 amount=-1 +kerning first=101 second=279 amount=-1 +kerning first=251 second=233 amount=-1 +kerning first=298 second=209 amount=-1 +kerning first=314 second=279 amount=-1 +kerning first=287 second=233 amount=-1 +kerning first=76 second=84 amount=-1 +kerning first=253 second=171 amount=-1 +kerning first=210 second=327 amount=-1 +kerning first=231 second=97 amount=-1 +kerning first=1042 second=1080 amount=-1 +kerning first=232 second=187 amount=-1 +kerning first=282 second=327 amount=-1 +kerning first=79 second=75 amount=-1 +kerning first=268 second=187 amount=-1 +kerning first=211 second=200 amount=-1 +kerning first=323 second=233 amount=-1 +kerning first=196 second=187 amount=-1 +kerning first=74 second=371 amount=-1 +kerning first=77 second=224 amount=-1 +kerning first=70 second=200 amount=-1 +kerning first=228 second=339 amount=-1 +kerning first=1052 second=1045 amount=-1 +kerning first=1067 second=1070 amount=-1 +kerning first=70 second=44 amount=-2 +kerning first=277 second=283 amount=-1 +kerning first=209 second=270 amount=-1 +kerning first=364 second=75 amount=-1 +kerning first=195 second=318 amount=-1 +kerning first=205 second=283 amount=-1 +kerning first=187 second=218 amount=-1 +kerning first=362 second=224 amount=-1 +kerning first=267 second=318 amount=-1 +kerning first=251 second=248 amount=-1 +kerning first=283 second=44 amount=-1 +kerning first=107 second=8221 amount=-1 +kerning first=82 second=218 amount=-1 +kerning first=356 second=380 amount=-1 +kerning first=220 second=75 amount=-1 +kerning first=339 second=318 amount=-1 +kerning first=323 second=248 amount=-1 +kerning first=211 second=44 amount=-1 +kerning first=375 second=318 amount=-1 +kerning first=287 second=248 amount=-1 +kerning first=74 second=248 amount=-1 +kerning first=67 second=274 amount=-1 +kerning first=85 second=209 amount=-1 +kerning first=327 second=79 amount=-1 +kerning first=110 second=248 amount=-1 +kerning first=233 second=246 amount=-1 +kerning first=78 second=79 amount=-1 +kerning first=356 second=257 amount=-1 +kerning first=233 second=367 amount=-1 +kerning first=8218 second=354 amount=-1 +kerning first=1067 second=1084 amount=-1 +kerning first=68 second=270 amount=-1 +kerning first=280 second=205 amount=-1 +kerning first=374 second=261 amount=-1 +kerning first=353 second=45 amount=-1 +kerning first=367 second=8217 amount=-1 +kerning first=197 second=367 amount=-1 +kerning first=8250 second=201 amount=-1 +kerning first=83 second=344 amount=-1 +kerning first=66 second=115 amount=-1 +kerning first=245 second=114 amount=-1 +kerning first=8217 second=251 amount=-1 +kerning first=209 second=114 amount=-1 +kerning first=226 second=248 amount=-1 +kerning first=352 second=205 amount=-1 +kerning first=296 second=344 amount=-1 +kerning first=8222 second=364 amount=-1 +kerning first=1056 second=1097 amount=-1 +kerning first=281 second=114 amount=-1 +kerning first=199 second=80 amount=-1 +kerning first=89 second=261 amount=-1 +kerning first=206 second=206 amount=-1 +kerning first=8249 second=218 amount=-1 +kerning first=279 second=115 amount=-1 +kerning first=203 second=284 amount=-1 +kerning first=45 second=345 amount=-1 +kerning first=275 second=353 amount=-1 +kerning first=214 second=89 amount=-1 +kerning first=1031 second=1048 amount=-1 +kerning first=266 second=261 amount=-1 +kerning first=330 second=109 amount=-1 +kerning first=350 second=206 amount=-1 +kerning first=117 second=345 amount=-1 +kerning first=278 second=206 amount=-1 +kerning first=207 second=115 amount=-1 +kerning first=67 second=205 amount=-1 +kerning first=258 second=345 amount=-1 +kerning first=310 second=71 amount=-1 +kerning first=86 second=266 amount=-1 +kerning first=344 second=362 amount=-1 +kerning first=330 second=345 amount=-1 +kerning first=1046 second=1089 amount=-1 +kerning first=366 second=345 amount=-1 +kerning first=286 second=44 amount=-1 +kerning first=77 second=243 amount=-1 +kerning first=202 second=71 amount=-1 +kerning first=99 second=226 amount=-1 +kerning first=218 second=243 amount=-1 +kerning first=304 second=310 amount=-1 +kerning first=291 second=291 amount=-1 +kerning first=321 second=8221 amount=-1 +kerning first=220 second=286 amount=-1 +kerning first=204 second=226 amount=-1 +kerning first=1071 second=1037 amount=-1 +kerning first=205 second=214 amount=-1 +kerning first=66 second=336 amount=-1 +kerning first=233 second=252 amount=-1 +kerning first=197 second=252 amount=-1 +kerning first=224 second=275 amount=-1 +kerning first=207 second=336 amount=-1 +kerning first=269 second=252 amount=-1 +kerning first=296 second=275 amount=-1 +kerning first=87 second=263 amount=-1 +kerning first=220 second=223 amount=-1 +kerning first=108 second=249 amount=-1 +kerning first=209 second=45 amount=-1 +kerning first=200 second=362 amount=-1 +kerning first=8218 second=262 amount=-1 +kerning first=104 second=45 amount=-1 +kerning first=272 second=362 amount=-1 +kerning first=364 second=223 amount=-1 +kerning first=101 second=353 amount=-1 +kerning first=1056 second=1051 amount=-1 +kerning first=198 second=45 amount=-1 +kerning first=365 second=275 amount=-1 +kerning first=272 second=217 amount=-1 +kerning first=268 second=327 amount=-1 +kerning first=304 second=327 amount=-1 +kerning first=369 second=8217 amount=-1 +kerning first=344 second=217 amount=-1 +kerning first=78 second=350 amount=-1 +kerning first=310 second=249 amount=-1 +kerning first=314 second=106 amount=-1 +kerning first=221 second=275 amount=-1 +kerning first=346 second=249 amount=-1 +kerning first=199 second=71 amount=-1 +kerning first=378 second=45 amount=-1 +kerning first=354 second=243 amount=-1 +kerning first=257 second=275 amount=-1 +kerning first=268 second=80 amount=-1 +kerning first=264 second=223 amount=-1 +kerning first=327 second=350 amount=-1 +kerning first=8250 second=253 amount=-1 +kerning first=1069 second=1062 amount=-1 +kerning first=112 second=318 amount=-1 +kerning first=1031 second=1097 amount=-1 +kerning first=192 second=223 amount=-1 +kerning first=8218 second=210 amount=-1 +kerning first=80 second=275 amount=-1 +kerning first=344 second=284 amount=-1 +kerning first=219 second=350 amount=-1 +kerning first=304 second=80 amount=-1 +kerning first=1060 second=1034 amount=-1 +kerning first=249 second=234 amount=-1 +kerning first=369 second=232 amount=-1 +kerning first=210 second=87 amount=-1 +kerning first=8250 second=73 amount=-1 +kerning first=73 second=200 amount=-1 +kerning first=231 second=8221 amount=-2 +kerning first=69 second=278 amount=-1 +kerning first=368 second=266 amount=-1 +kerning first=1047 second=1085 amount=-1 +kerning first=87 second=223 amount=-1 +kerning first=323 second=226 amount=-1 +kerning first=203 second=362 amount=-1 +kerning first=207 second=70 amount=-1 +kerning first=84 second=232 amount=-1 +kerning first=202 second=249 amount=-1 +kerning first=291 second=283 amount=-1 +kerning first=8218 second=277 amount=-1 +kerning first=296 second=266 amount=-1 +kerning first=274 second=249 amount=-1 +kerning first=220 second=296 amount=-1 +kerning first=218 second=371 amount=-1 +kerning first=219 second=283 amount=-1 +kerning first=108 second=234 amount=-1 +kerning first=261 second=232 amount=-1 +kerning first=78 second=283 amount=-1 +kerning first=66 second=332 amount=-1 +kerning first=72 second=234 amount=-1 +kerning first=225 second=232 amount=-1 +kerning first=286 second=200 amount=-1 +kerning first=200 second=217 amount=-1 +kerning first=362 second=371 amount=-1 +kerning first=214 second=200 amount=-1 +kerning first=85 second=8249 amount=-2 +kerning first=187 second=85 amount=-1 +kerning first=374 second=335 amount=-1 +kerning first=207 second=332 amount=-1 +kerning first=1050 second=1063 amount=-1 +kerning first=1034 second=1041 amount=-1 +kerning first=8250 second=211 amount=-1 +kerning first=204 second=241 amount=-1 +kerning first=67 second=345 amount=-1 +kerning first=103 second=345 amount=-1 +kerning first=204 second=350 amount=-1 +kerning first=1104 second=1076 amount=-1 +kerning first=201 second=216 amount=-1 +kerning first=366 second=217 amount=-1 +kerning first=75 second=105 amount=-1 +kerning first=109 second=267 amount=-1 +kerning first=244 second=345 amount=-1 +kerning first=284 second=302 amount=-1 +kerning first=89 second=335 amount=-1 +kerning first=339 second=114 amount=-1 +kerning first=280 second=345 amount=-1 +kerning first=1052 second=1028 amount=-1 +kerning first=316 second=345 amount=-1 +kerning first=212 second=302 amount=-1 +kerning first=80 second=115 amount=-1 +kerning first=1091 second=1079 amount=-1 +kerning first=352 second=345 amount=-1 +kerning first=73 second=171 amount=-1 +kerning first=116 second=115 amount=-1 +kerning first=375 second=114 amount=-1 +kerning first=1055 second=1079 amount=-1 +kerning first=103 second=98 amount=-1 +kerning first=266 second=335 amount=-1 +kerning first=195 second=114 amount=-1 +kerning first=99 second=241 amount=-1 +kerning first=67 second=98 amount=-1 +kerning first=230 second=335 amount=-1 +kerning first=1071 second=1067 amount=-1 +kerning first=1049 second=1050 amount=-1 +kerning first=323 second=46 amount=-1 +kerning first=71 second=302 amount=-1 +kerning first=302 second=335 amount=-1 +kerning first=231 second=114 amount=-1 +kerning first=65 second=119 amount=-1 +kerning first=81 second=207 amount=-1 +kerning first=370 second=378 amount=-1 +kerning first=192 second=370 amount=-1 +kerning first=200 second=284 amount=-1 +kerning first=255 second=103 amount=-1 +kerning first=45 second=207 amount=-1 +kerning first=258 second=81 amount=-1 +kerning first=69 second=310 amount=-1 +kerning first=298 second=378 amount=-1 +kerning first=193 second=336 amount=-1 +kerning first=262 second=378 amount=-1 +kerning first=264 second=323 amount=-1 +kerning first=8217 second=244 amount=-1 +kerning first=366 second=81 amount=-1 +kerning first=221 second=115 amount=-1 +kerning first=330 second=207 amount=-1 +kerning first=264 second=370 amount=-1 +kerning first=201 second=368 amount=-1 +kerning first=235 second=8218 amount=-1 +kerning first=79 second=315 amount=-1 +kerning first=231 second=314 amount=-1 +kerning first=1068 second=1063 amount=-2 +kerning first=195 second=314 amount=-1 +kerning first=187 second=264 amount=-1 +kerning first=195 second=79 amount=-1 +kerning first=296 second=199 amount=-1 +kerning first=242 second=106 amount=-1 +kerning first=1049 second=1037 amount=-1 +kerning first=375 second=314 amount=-1 +kerning first=368 second=199 amount=-1 +kerning first=86 second=110 amount=-1 +kerning first=1070 second=1041 amount=-1 +kerning first=282 second=310 amount=-1 +kerning first=211 second=89 amount=-1 +kerning first=8216 second=218 amount=-1 +kerning first=121 second=378 amount=-1 +kerning first=1048 second=1071 amount=-1 +kerning first=210 second=310 amount=-1 +kerning first=101 second=106 amount=-1 +kerning first=72 second=288 amount=-1 +kerning first=263 second=110 amount=-1 +kerning first=204 second=334 amount=-1 +kerning first=8250 second=266 amount=-1 +kerning first=66 second=78 amount=-1 +kerning first=1052 second=1101 amount=-1 +kerning first=80 second=221 amount=-1 +kerning first=1033 second=1042 amount=-1 +kerning first=289 second=122 amount=-1 +kerning first=1077 second=1078 amount=-1 +kerning first=89 second=101 amount=-1 +kerning first=274 second=286 amount=-1 +kerning first=230 second=101 amount=-1 +kerning first=316 second=291 amount=-1 +kerning first=45 second=81 amount=-1 +kerning first=280 second=114 amount=-1 +kerning first=302 second=101 amount=-1 +kerning first=244 second=291 amount=-1 +kerning first=289 second=246 amount=-1 +kerning first=8218 second=370 amount=-1 +kerning first=217 second=362 amount=-1 +kerning first=266 second=101 amount=-1 +kerning first=374 second=101 amount=-1 +kerning first=219 second=296 amount=-1 +kerning first=363 second=337 amount=-1 +kerning first=234 second=279 amount=-1 +kerning first=103 second=291 amount=-1 +kerning first=317 second=84 amount=-1 +kerning first=291 second=337 amount=-1 +kerning first=78 second=296 amount=-1 +kerning first=310 second=303 amount=-1 +kerning first=219 second=337 amount=-1 +kerning first=121 second=8250 amount=-1 +kerning first=327 second=296 amount=-1 +kerning first=365 second=114 amount=-1 +kerning first=68 second=84 amount=-1 +kerning first=212 second=75 amount=-1 +kerning first=351 second=8250 amount=-1 +kerning first=234 second=99 amount=-1 +kerning first=1028 second=1119 amount=-1 +kerning first=325 second=245 amount=-1 +kerning first=279 second=8250 amount=-1 +kerning first=1064 second=1119 amount=-1 +kerning first=45 second=328 amount=-1 +kerning first=243 second=8250 amount=-1 +kerning first=220 second=261 amount=-1 +kerning first=277 second=8218 amount=-1 +kerning first=217 second=245 amount=-1 +kerning first=1065 second=1094 amount=-1 +kerning first=99 second=287 amount=-1 +kerning first=66 second=8250 amount=-1 +kerning first=356 second=8220 amount=-1 +kerning first=323 second=380 amount=-1 +kerning first=80 second=202 amount=-1 +kerning first=298 second=317 amount=-1 +kerning first=287 second=380 amount=-1 +kerning first=282 second=117 amount=-1 +kerning first=1055 second=1025 amount=-1 +kerning first=77 second=83 amount=-1 +kerning first=204 second=246 amount=-1 +kerning first=370 second=218 amount=-1 +kerning first=334 second=218 amount=-1 +kerning first=298 second=218 amount=-1 +kerning first=218 second=83 amount=-1 +kerning first=284 second=75 amount=-1 +kerning first=262 second=218 amount=-1 +kerning first=1041 second=1030 amount=-1 +kerning first=325 second=264 amount=-1 +kerning first=208 second=187 amount=-1 +kerning first=374 second=122 amount=-1 +kerning first=210 second=364 amount=-1 +kerning first=362 second=83 amount=-1 +kerning first=66 second=278 amount=-1 +kerning first=107 second=8220 amount=-1 +kerning first=74 second=380 amount=-1 +kerning first=217 second=264 amount=-1 +kerning first=71 second=8220 amount=-1 +kerning first=201 second=270 amount=-1 +kerning first=69 second=364 amount=-1 +kerning first=209 second=257 amount=-1 +kerning first=264 second=69 amount=-1 +kerning first=284 second=8220 amount=-1 +kerning first=112 second=44 amount=-1 +kerning first=207 second=278 amount=-1 +kerning first=248 second=8220 amount=-2 +kerning first=263 second=103 amount=-1 +kerning first=227 second=103 amount=-1 +kerning first=1056 second=1039 amount=-1 +kerning first=8250 second=199 amount=-1 +kerning first=113 second=8221 amount=-2 +kerning first=268 second=273 amount=-1 +kerning first=205 second=227 amount=-1 +kerning first=86 second=103 amount=-1 +kerning first=305 second=171 amount=-1 +kerning first=187 second=278 amount=-1 +kerning first=232 second=273 amount=-1 +kerning first=288 second=205 amount=-1 +kerning first=1070 second=1034 amount=-1 +kerning first=87 second=269 amount=-1 +kerning first=104 second=8220 amount=-2 +kerning first=1034 second=1034 amount=-1 +kerning first=8217 second=110 amount=-1 +kerning first=70 second=258 amount=-1 +kerning first=1065 second=1102 amount=-1 +kerning first=339 second=355 amount=-1 +kerning first=1067 second=1043 amount=-1 +kerning first=192 second=316 amount=-1 +kerning first=85 second=218 amount=-1 +kerning first=67 second=44 amount=-1 +kerning first=1031 second=1043 amount=-1 +kerning first=264 second=269 amount=-1 +kerning first=103 second=44 amount=-1 +kerning first=330 second=261 amount=-1 +kerning first=264 second=316 amount=-1 +kerning first=356 second=248 amount=-1 +kerning first=287 second=382 amount=-1 +kerning first=228 second=316 amount=-1 +kerning first=195 second=355 amount=-1 +kerning first=244 second=44 amount=-1 +kerning first=69 second=117 amount=-1 +kerning first=366 second=261 amount=-1 +kerning first=207 second=78 amount=-1 +kerning first=302 second=229 amount=-1 +kerning first=73 second=286 amount=-1 +kerning first=326 second=263 amount=-1 +kerning first=266 second=229 amount=-1 +kerning first=362 second=263 amount=-1 +kerning first=374 second=229 amount=-1 +kerning first=8217 second=352 amount=-1 +kerning first=316 second=382 amount=-1 +kerning first=353 second=171 amount=-1 +kerning first=1030 second=1030 amount=-1 +kerning first=291 second=8218 amount=-1 +kerning first=235 second=117 amount=-1 +kerning first=1064 second=1100 amount=-1 +kerning first=364 second=203 amount=-1 +kerning first=77 second=263 amount=-1 +kerning first=220 second=203 amount=-1 +kerning first=97 second=108 amount=-1 +kerning first=75 second=251 amount=-1 +kerning first=316 second=252 amount=-1 +kerning first=1066 second=1025 amount=-1 +kerning first=218 second=263 amount=-1 +kerning first=1030 second=1025 amount=-1 +kerning first=1047 second=1050 amount=-1 +kerning first=277 second=246 amount=-1 +kerning first=241 second=246 amount=-1 +kerning first=334 second=77 amount=-1 +kerning first=121 second=8222 amount=-1 +kerning first=205 second=246 amount=-1 +kerning first=370 second=77 amount=-1 +kerning first=1069 second=1113 amount=-1 +kerning first=330 second=382 amount=-1 +kerning first=85 second=8222 amount=-2 +kerning first=1055 second=1060 amount=-1 +kerning first=262 second=77 amount=-1 +kerning first=366 second=382 amount=-1 +kerning first=259 second=8249 amount=-1 +kerning first=298 second=77 amount=-1 +kerning first=99 second=100 amount=-1 +kerning first=212 second=356 amount=-1 +kerning first=355 second=337 amount=-1 +kerning first=262 second=304 amount=-1 +kerning first=204 second=100 amount=-1 +kerning first=298 second=304 amount=-1 +kerning first=85 second=77 amount=-1 +kerning first=334 second=304 amount=-1 +kerning first=97 second=103 amount=-1 +kerning first=98 second=316 amount=-1 +kerning first=8250 second=361 amount=-1 +kerning first=370 second=304 amount=-1 +kerning first=85 second=304 amount=-1 +kerning first=78 second=242 amount=-1 +kerning first=374 second=281 amount=-1 +kerning first=362 second=211 amount=-1 +kerning first=268 second=101 amount=-1 +kerning first=311 second=316 amount=-1 +kerning first=275 second=316 amount=-1 +kerning first=334 second=8222 amount=-1 +kerning first=234 second=333 amount=-1 +kerning first=1042 second=1048 amount=-1 +kerning first=211 second=73 amount=-1 +kerning first=351 second=45 amount=-1 +kerning first=347 second=316 amount=-1 +kerning first=262 second=8222 amount=-1 +kerning first=257 second=248 amount=-1 +kerning first=218 second=211 amount=-1 +kerning first=187 second=194 amount=-1 +kerning first=219 second=242 amount=-1 +kerning first=110 second=339 amount=-1 +kerning first=1031 second=1024 amount=-1 +kerning first=217 second=210 amount=-1 +kerning first=196 second=221 amount=-1 +kerning first=251 second=339 amount=-1 +kerning first=1067 second=1024 amount=-1 +kerning first=327 second=242 amount=-1 +kerning first=210 second=8250 amount=-1 +kerning first=363 second=242 amount=-1 +kerning first=99 second=233 amount=-1 +kerning first=307 second=269 amount=-1 +kerning first=304 second=110 amount=-1 +kerning first=74 second=280 amount=-1 +kerning first=74 second=339 amount=-1 +kerning first=314 second=245 amount=-1 +kerning first=330 second=315 amount=-1 +kerning first=205 second=313 amount=-1 +kerning first=366 second=315 amount=-1 +kerning first=240 second=233 amount=-1 +kerning first=217 second=370 amount=-1 +kerning first=355 second=240 amount=-1 +kerning first=268 second=219 amount=-1 +kerning first=233 second=120 amount=-1 +kerning first=304 second=219 amount=-1 +kerning first=204 second=233 amount=-1 +kerning first=269 second=120 amount=-1 +kerning first=355 second=230 amount=-1 +kerning first=196 second=219 amount=-1 +kerning first=323 second=280 amount=-1 +kerning first=323 second=339 amount=-1 +kerning first=78 second=279 amount=-1 +kerning first=81 second=315 amount=-1 +kerning first=287 second=339 amount=-1 +kerning first=324 second=118 amount=-1 +kerning first=80 second=206 amount=-1 +kerning first=1027 second=1101 amount=-1 +kerning first=1076 second=1118 amount=-1 +kerning first=45 second=315 amount=-1 +kerning first=1040 second=1118 amount=-1 +kerning first=101 second=8217 amount=-2 +kerning first=211 second=76 amount=-1 +kerning first=8217 second=290 amount=-1 +kerning first=70 second=76 amount=-1 +kerning first=242 second=8217 amount=-2 +kerning first=198 second=206 amount=-1 +kerning first=73 second=213 amount=-1 +kerning first=65 second=8217 amount=-2 +kerning first=207 second=224 amount=-1 +kerning first=368 second=117 amount=-1 +kerning first=370 second=85 amount=-1 +kerning first=334 second=85 amount=-1 +kerning first=350 second=327 amount=-1 +kerning first=1036 second=1060 amount=-1 +kerning first=298 second=85 amount=-1 +kerning first=107 second=289 amount=-1 +kerning first=262 second=85 amount=-1 +kerning first=101 second=245 amount=-1 +kerning first=275 second=254 amount=-1 +kerning first=278 second=8217 amount=-1 +kerning first=8222 second=273 amount=-1 +kerning first=314 second=8217 amount=-1 +kerning first=1041 second=1119 amount=-1 +kerning first=350 second=8217 amount=-1 +kerning first=217 second=331 amount=-1 +kerning first=1071 second=1113 amount=-1 +kerning first=248 second=289 amount=-1 +kerning first=368 second=366 amount=-1 +kerning first=258 second=318 amount=-1 +kerning first=296 second=366 amount=-1 +kerning first=203 second=262 amount=-1 +kerning first=1059 second=1095 amount=-1 +kerning first=250 second=113 amount=-1 +kerning first=280 second=79 amount=-1 +kerning first=194 second=311 amount=-1 +kerning first=73 second=67 amount=-1 +kerning first=1095 second=1095 amount=-1 +kerning first=197 second=307 amount=-1 +kerning first=339 second=287 amount=-1 +kerning first=362 second=317 amount=-1 +kerning first=253 second=104 amount=-1 +kerning first=209 second=225 amount=-1 +kerning first=321 second=84 amount=-1 +kerning first=197 second=345 amount=-1 +kerning first=1102 second=1084 amount=-1 +kerning first=241 second=337 amount=-1 +kerning first=233 second=345 amount=-1 +kerning first=269 second=345 amount=-1 +kerning first=99 second=46 amount=-1 +kerning first=1030 second=1084 amount=-1 +kerning first=305 second=345 amount=-1 +kerning first=240 second=46 amount=-1 +kerning first=370 second=250 amount=-1 +kerning first=118 second=107 amount=-1 +kerning first=45 second=369 amount=-1 +kerning first=220 second=368 amount=-1 +kerning first=77 second=317 amount=-1 +kerning first=364 second=201 amount=-1 +kerning first=229 second=122 amount=-1 +kerning first=244 second=314 amount=-1 +kerning first=97 second=8221 amount=-2 +kerning first=77 second=336 amount=-1 +kerning first=77 second=203 amount=-1 +kerning first=218 second=317 amount=-1 +kerning first=121 second=250 amount=-1 +kerning first=105 second=335 amount=-1 +kerning first=220 second=201 amount=-1 +kerning first=85 second=250 amount=-1 +kerning first=79 second=368 amount=-1 +kerning first=79 second=201 amount=-1 +kerning first=218 second=336 amount=-1 +kerning first=274 second=8221 amount=-1 +kerning first=73 second=113 amount=-1 +kerning first=221 second=256 amount=-1 +kerning first=310 second=8221 amount=-1 +kerning first=83 second=366 amount=-1 +kerning first=199 second=204 amount=-1 +kerning first=8216 second=197 amount=-2 +kerning first=346 second=8221 amount=-1 +kerning first=220 second=116 amount=-1 +kerning first=1066 second=1038 amount=-2 +kerning first=382 second=8221 amount=-1 +kerning first=362 second=336 amount=-1 +kerning first=287 second=326 amount=-1 +kerning first=71 second=68 amount=-1 +kerning first=1062 second=1086 amount=-1 +kerning first=325 second=210 amount=-1 +kerning first=364 second=368 amount=-1 +kerning first=80 second=256 amount=-1 +kerning first=1047 second=1031 amount=-1 +kerning first=337 second=122 amount=-1 +kerning first=364 second=116 amount=-1 +kerning first=104 second=114 amount=-1 +kerning first=205 second=259 amount=-1 +kerning first=310 second=268 amount=-1 +kerning first=274 second=268 amount=-1 +kerning first=220 second=97 amount=-1 +kerning first=89 second=281 amount=-1 +kerning first=280 second=8220 amount=-1 +kerning first=8216 second=85 amount=-1 +kerning first=286 second=304 amount=-1 +kerning first=8222 second=221 amount=-2 +kerning first=1038 second=1116 amount=-1 +kerning first=230 second=281 amount=-1 +kerning first=269 second=347 amount=-1 +kerning first=266 second=281 amount=-1 +kerning first=119 second=187 amount=-1 +kerning first=302 second=281 amount=-1 +kerning first=213 second=73 amount=-1 +kerning first=366 second=369 amount=-1 +kerning first=233 second=347 amount=-1 +kerning first=202 second=8221 amount=-1 +kerning first=258 second=369 amount=-1 +kerning first=356 second=235 amount=-1 +kerning first=262 second=8218 amount=-1 +kerning first=1052 second=1069 amount=-1 +kerning first=364 second=97 amount=-1 +kerning first=107 second=287 amount=-1 +kerning first=231 second=382 amount=-1 +kerning first=225 second=279 amount=-1 +kerning first=313 second=86 amount=-1 +kerning first=272 second=198 amount=-1 +kerning first=89 second=283 amount=-1 +kerning first=8222 second=219 amount=-1 +kerning first=226 second=231 amount=-1 +kerning first=210 second=351 amount=-1 +kerning first=262 second=231 amount=-1 +kerning first=325 second=277 amount=-1 +kerning first=281 second=363 amount=-1 +kerning first=1036 second=1072 amount=-1 +kerning first=289 second=277 amount=-1 +kerning first=86 second=290 amount=-1 +kerning first=354 second=351 amount=-1 +kerning first=217 second=277 amount=-1 +kerning first=344 second=338 amount=-1 +kerning first=86 second=244 amount=-1 +kerning first=1051 second=1081 amount=-1 +kerning first=374 second=283 amount=-1 +kerning first=266 second=355 amount=-1 +kerning first=227 second=244 amount=-1 +kerning first=266 second=283 amount=-1 +kerning first=200 second=338 amount=-1 +kerning first=298 second=231 amount=-1 +kerning first=268 second=109 amount=-1 +kerning first=302 second=283 amount=-1 +kerning first=253 second=8249 amount=-1 +kerning first=289 second=8249 amount=-1 +kerning first=370 second=231 amount=-1 +kerning first=194 second=354 amount=-1 +kerning first=230 second=283 amount=-1 +kerning first=325 second=8249 amount=-1 +kerning first=67 second=79 amount=-1 +kerning first=78 second=345 amount=-1 +kerning first=67 second=66 amount=-1 +kerning first=85 second=196 amount=-1 +kerning first=258 second=79 amount=-1 +kerning first=278 second=8220 amount=-1 +kerning first=248 second=46 amount=-1 +kerning first=268 second=332 amount=-1 +kerning first=334 second=196 amount=-1 +kerning first=374 second=367 amount=-1 +kerning first=88 second=371 amount=-1 +kerning first=255 second=345 amount=-1 +kerning first=259 second=235 amount=-1 +kerning first=370 second=196 amount=-1 +kerning first=338 second=367 amount=-1 +kerning first=196 second=332 amount=-1 +kerning first=193 second=371 amount=-1 +kerning first=327 second=345 amount=-1 +kerning first=363 second=345 amount=-1 +kerning first=121 second=380 amount=-1 +kerning first=367 second=235 amount=-1 +kerning first=230 second=367 amount=-1 +kerning first=85 second=380 amount=-1 +kerning first=194 second=367 amount=-1 +kerning first=211 second=274 amount=-1 +kerning first=1042 second=1091 amount=-1 +kerning first=226 second=380 amount=-1 +kerning first=85 second=368 amount=-1 +kerning first=66 second=70 amount=-1 +kerning first=304 second=332 amount=-1 +kerning first=352 second=66 amount=-1 +kerning first=298 second=380 amount=-1 +kerning first=330 second=79 amount=-1 +kerning first=280 second=66 amount=-1 +kerning first=105 second=287 amount=-1 +kerning first=85 second=226 amount=-1 +kerning first=366 second=79 amount=-1 +kerning first=370 second=380 amount=-1 +kerning first=284 second=270 amount=-1 +kerning first=204 second=209 amount=-1 +kerning first=1056 second=1080 amount=-1 +kerning first=204 second=336 amount=-1 +kerning first=89 second=367 amount=-1 +kerning first=86 second=192 amount=-1 +kerning first=217 second=323 amount=-1 +kerning first=327 second=99 amount=-1 +kerning first=269 second=44 amount=-1 +kerning first=200 second=252 amount=-1 +kerning first=110 second=231 amount=-1 +kerning first=1049 second=1045 amount=-1 +kerning first=205 second=205 amount=-1 +kerning first=268 second=355 amount=-1 +kerning first=97 second=244 amount=-1 +kerning first=195 second=119 amount=-1 +kerning first=350 second=201 amount=-1 +kerning first=278 second=201 amount=-1 +kerning first=1070 second=1063 amount=-1 +kerning first=221 second=120 amount=-1 +kerning first=323 second=231 amount=-1 +kerning first=66 second=327 amount=-1 +kerning first=206 second=201 amount=-1 +kerning first=202 second=214 amount=-1 +kerning first=207 second=327 amount=-1 +kerning first=201 second=218 amount=-1 +kerning first=197 second=44 amount=-1 +kerning first=233 second=44 amount=-1 +kerning first=257 second=8217 amount=-2 +kerning first=251 second=231 amount=-1 +kerning first=115 second=314 amount=-1 +kerning first=8217 second=246 amount=-1 +kerning first=310 second=214 amount=-1 +kerning first=339 second=106 amount=-1 +kerning first=289 second=353 amount=-1 +kerning first=375 second=106 amount=-1 +kerning first=1048 second=1049 amount=-1 +kerning first=257 second=243 amount=-1 +kerning first=253 second=353 amount=-1 +kerning first=82 second=45 amount=-1 +kerning first=325 second=223 amount=-1 +kerning first=365 second=243 amount=-1 +kerning first=8249 second=346 amount=-1 +kerning first=289 second=223 amount=-1 +kerning first=325 second=353 amount=-1 +kerning first=231 second=106 amount=-1 +kerning first=259 second=45 amount=-1 +kerning first=267 second=106 amount=-1 +kerning first=75 second=114 amount=-1 +kerning first=263 second=249 amount=-1 +kerning first=118 second=45 amount=-1 +kerning first=105 second=275 amount=-1 +kerning first=80 second=80 amount=-1 +kerning first=1078 second=1097 amount=-1 +kerning first=367 second=45 amount=-1 +kerning first=1091 second=1114 amount=-1 +kerning first=195 second=363 amount=-1 +kerning first=231 second=363 amount=-1 +kerning first=307 second=275 amount=-1 +kerning first=1050 second=1054 amount=-1 +kerning first=78 second=101 amount=-1 +kerning first=80 second=243 amount=-1 +kerning first=203 second=370 amount=-1 +kerning first=339 second=363 amount=-1 +kerning first=217 second=353 amount=-1 +kerning first=280 second=325 amount=-1 +kerning first=217 second=250 amount=-1 +kerning first=226 second=111 amount=-1 +kerning first=375 second=363 amount=-1 +kerning first=1042 second=1097 amount=-1 +kerning first=212 second=87 amount=-1 +kerning first=73 second=362 amount=-1 +kerning first=219 second=101 amount=-1 +kerning first=368 second=234 amount=-1 +kerning first=250 second=232 amount=-1 +kerning first=214 second=362 amount=-1 +kerning first=327 second=101 amount=-1 +kerning first=298 second=226 amount=-1 +kerning first=291 second=101 amount=-1 +kerning first=286 second=362 amount=-1 +kerning first=370 second=226 amount=-1 +kerning first=363 second=101 amount=-1 +kerning first=268 second=8250 amount=-1 +kerning first=365 second=245 amount=-1 +kerning first=8218 second=245 amount=-1 +kerning first=67 second=296 amount=-1 +kerning first=1068 second=1098 amount=-1 +kerning first=364 second=241 amount=-1 +kerning first=72 second=266 amount=-1 +kerning first=103 second=283 amount=-1 +kerning first=70 second=217 amount=-1 +kerning first=280 second=296 amount=-1 +kerning first=86 second=249 amount=-1 +kerning first=1099 second=1095 amount=-1 +kerning first=67 second=283 amount=-1 +kerning first=211 second=217 amount=-1 +kerning first=218 second=334 amount=-1 +kerning first=109 second=232 amount=-1 +kerning first=224 second=234 amount=-1 +kerning first=73 second=232 amount=-1 +kerning first=296 second=71 amount=-1 +kerning first=230 second=242 amount=-1 +kerning first=296 second=234 amount=-1 +kerning first=106 second=111 amount=-1 +kerning first=258 second=214 amount=-1 +kerning first=296 second=317 amount=-1 +kerning first=286 second=72 amount=-1 +kerning first=1069 second=1070 amount=-1 +kerning first=1034 second=1062 amount=-1 +kerning first=1033 second=1070 amount=-1 +kerning first=104 second=283 amount=-1 +kerning first=381 second=8220 amount=-1 +kerning first=283 second=111 amount=-1 +kerning first=75 second=8218 amount=-1 +kerning first=66 second=83 amount=-1 +kerning first=337 second=287 amount=-1 +kerning first=263 second=105 amount=-1 +kerning first=355 second=111 amount=-1 +kerning first=334 second=205 amount=-1 +kerning first=101 second=46 amount=-1 +kerning first=171 second=83 amount=-1 +kerning first=219 second=370 amount=-1 +kerning first=207 second=83 amount=-1 +kerning first=368 second=83 amount=-1 +kerning first=8250 second=369 amount=-1 +kerning first=350 second=114 amount=-1 +kerning first=1055 second=1041 amount=-1 +kerning first=187 second=286 amount=-1 +kerning first=275 second=267 amount=-1 +kerning first=8216 second=196 amount=-2 +kerning first=85 second=378 amount=-1 +kerning first=70 second=111 amount=-1 +kerning first=70 second=81 amount=-1 +kerning first=210 second=115 amount=-1 +kerning first=206 second=114 amount=-1 +kerning first=74 second=68 amount=-1 +kerning first=304 second=278 amount=-1 +kerning first=1044 second=1092 amount=-1 +kerning first=87 second=74 amount=-1 +kerning first=268 second=278 amount=-1 +kerning first=278 second=114 amount=-1 +kerning first=83 second=200 amount=-1 +kerning first=199 second=199 amount=-1 +kerning first=99 second=263 amount=-1 +kerning first=101 second=114 amount=-1 +kerning first=204 second=263 amount=-1 +kerning first=259 second=242 amount=-1 +kerning first=1066 second=1079 amount=-1 +kerning first=65 second=114 amount=-1 +kerning first=240 second=263 amount=-1 +kerning first=1044 second=1116 amount=-1 +kerning first=370 second=117 amount=-1 +kerning first=187 second=365 amount=-1 +kerning first=206 second=331 amount=-1 +kerning first=354 second=115 amount=-1 +kerning first=199 second=310 amount=-1 +kerning first=73 second=72 amount=-1 +kerning first=1055 second=1065 amount=-1 +kerning first=118 second=365 amount=-1 +kerning first=368 second=361 amount=-1 +kerning first=325 second=269 amount=-1 +kerning first=338 second=371 amount=-1 +kerning first=323 second=68 amount=-1 +kerning first=1070 second=1036 amount=-1 +kerning first=77 second=78 amount=-1 +kerning first=1034 second=1036 amount=-1 +kerning first=323 second=334 amount=-1 +kerning first=218 second=78 amount=-1 +kerning first=367 second=99 amount=-1 +kerning first=1043 second=1071 amount=-1 +kerning first=368 second=288 amount=-1 +kerning first=364 second=355 amount=-1 +kerning first=1041 second=1101 amount=-1 +kerning first=248 second=380 amount=-1 +kerning first=1042 second=1043 amount=-1 +kerning first=296 second=288 amount=-1 +kerning first=1034 second=1070 amount=-1 +kerning first=8250 second=71 amount=-1 +kerning first=79 second=260 amount=-1 +kerning first=194 second=199 amount=-1 +kerning first=228 second=318 amount=-1 +kerning first=84 second=230 amount=-1 +kerning first=220 second=260 amount=-1 +kerning first=79 second=84 amount=-1 +kerning first=249 second=8220 amount=-1 +kerning first=1107 second=1082 amount=-1 +kerning first=1105 second=1094 amount=-1 +kerning first=200 second=325 amount=-1 +kerning first=363 second=291 amount=-1 +kerning first=338 second=357 amount=-1 +kerning first=364 second=260 amount=-1 +kerning first=272 second=325 amount=-1 +kerning first=228 second=245 amount=-1 +kerning first=315 second=218 amount=-1 +kerning first=337 second=187 amount=-1 +kerning first=255 second=291 amount=-1 +kerning first=334 second=8220 amount=-2 +kerning first=198 second=367 amount=-1 +kerning first=281 second=279 amount=-1 +kerning first=1036 second=1085 amount=-1 +kerning first=87 second=245 amount=-1 +kerning first=72 second=212 amount=-1 +kerning first=103 second=337 amount=-1 +kerning first=67 second=337 amount=-1 +kerning first=264 second=8217 amount=-1 +kerning first=277 second=251 amount=-1 +kerning first=103 second=120 amount=-1 +kerning first=363 second=114 amount=-1 +kerning first=336 second=8217 amount=-2 +kerning first=298 second=67 amount=-1 +kerning first=104 second=269 amount=-1 +kerning first=220 second=68 amount=-1 +kerning first=210 second=221 amount=-1 +kerning first=103 second=242 amount=-1 +kerning first=187 second=75 amount=-1 +kerning first=209 second=279 amount=-1 +kerning first=193 second=187 amount=-1 +kerning first=1053 second=1119 amount=-1 +kerning first=229 second=187 amount=-1 +kerning first=1071 second=1057 amount=-1 +kerning first=316 second=337 amount=-1 +kerning first=104 second=279 amount=-1 +kerning first=88 second=187 amount=-1 +kerning first=264 second=245 amount=-1 +kerning first=74 second=334 amount=-1 +kerning first=1067 second=1056 amount=-1 +kerning first=316 second=242 amount=-1 +kerning first=346 second=73 amount=-1 +kerning first=205 second=281 amount=-1 +kerning first=86 second=268 amount=-1 +kerning first=1053 second=1043 amount=-1 +kerning first=241 second=281 amount=-1 +kerning first=370 second=334 amount=-1 +kerning first=330 second=347 amount=-1 +kerning first=1041 second=1082 amount=-1 +kerning first=277 second=281 amount=-1 +kerning first=8222 second=375 amount=-1 +kerning first=356 second=99 amount=-1 +kerning first=70 second=325 amount=-1 +kerning first=211 second=198 amount=-1 +kerning first=89 second=229 amount=-1 +kerning first=310 second=290 amount=-1 +kerning first=211 second=325 amount=-1 +kerning first=213 second=115 amount=-1 +kerning first=81 second=347 amount=-1 +kerning first=218 second=366 amount=-1 +kerning first=231 second=318 amount=-1 +kerning first=313 second=8217 amount=-1 +kerning first=264 second=264 amount=-1 +kerning first=202 second=73 amount=-1 +kerning first=69 second=202 amount=-1 +kerning first=1056 second=1083 amount=-1 +kerning first=274 second=296 amount=-1 +kerning first=210 second=202 amount=-1 +kerning first=229 second=233 amount=-1 +kerning first=274 second=73 amount=-1 +kerning first=100 second=281 amount=-1 +kerning first=217 second=82 amount=-1 +kerning first=87 second=264 amount=-1 +kerning first=289 second=8217 amount=-2 +kerning first=355 second=101 amount=-1 +kerning first=268 second=337 amount=-1 +kerning first=77 second=283 amount=-1 +kerning first=1064 second=1065 amount=-1 +kerning first=1050 second=1117 amount=-1 +kerning first=206 second=277 amount=-1 +kerning first=112 second=8217 amount=-2 +kerning first=335 second=108 amount=-1 +kerning first=325 second=82 amount=-1 +kerning first=1068 second=1052 amount=-1 +kerning first=202 second=290 amount=-1 +kerning first=203 second=69 amount=-1 +kerning first=227 second=108 amount=-1 +kerning first=101 second=277 amount=-1 +kerning first=198 second=69 amount=-1 +kerning first=217 second=8217 amount=-1 +kerning first=1038 second=1091 amount=-1 +kerning first=263 second=108 amount=-1 +kerning first=274 second=290 amount=-1 +kerning first=253 second=8217 amount=-2 +kerning first=85 second=334 amount=-1 +kerning first=268 second=224 amount=-1 +kerning first=1049 second=1092 amount=-1 +kerning first=220 second=355 amount=-1 +kerning first=116 second=351 amount=-1 +kerning first=1041 second=1053 amount=-1 +kerning first=1060 second=1113 amount=-1 +kerning first=80 second=351 amount=-1 +kerning first=119 second=291 amount=-1 +kerning first=290 second=78 amount=-1 +kerning first=262 second=334 amount=-1 +kerning first=217 second=282 amount=-1 +kerning first=298 second=334 amount=-1 +kerning first=362 second=78 amount=-1 +kerning first=203 second=286 amount=-1 +kerning first=221 second=351 amount=-1 +kerning first=104 second=333 amount=-1 +kerning first=1048 second=1095 amount=-1 +kerning first=114 second=229 amount=-1 +kerning first=328 second=171 amount=-1 +kerning first=8218 second=318 amount=-1 +kerning first=364 second=171 amount=-2 +kerning first=219 second=229 amount=-1 +kerning first=1084 second=1095 amount=-1 +kerning first=281 second=333 amount=-1 +kerning first=68 second=203 amount=-1 +kerning first=291 second=122 amount=-1 +kerning first=209 second=333 amount=-1 +kerning first=78 second=229 amount=-1 +kerning first=344 second=290 amount=-1 +kerning first=83 second=117 amount=-1 +kerning first=1043 second=1074 amount=-1 +kerning first=209 second=203 amount=-1 +kerning first=321 second=374 amount=-1 +kerning first=213 second=374 amount=-1 +kerning first=229 second=263 amount=-1 +kerning first=1053 second=1100 amount=-1 +kerning first=76 second=8217 amount=-1 +kerning first=327 second=229 amount=-1 +kerning first=115 second=171 amount=-1 +kerning first=79 second=206 amount=-1 +kerning first=296 second=212 amount=-1 +kerning first=1034 second=1039 amount=-1 +kerning first=274 second=298 amount=-1 +kerning first=1054 second=1042 amount=-1 +kerning first=278 second=213 amount=-1 +kerning first=220 second=171 amount=-2 +kerning first=368 second=212 amount=-1 +kerning first=256 second=171 amount=-1 +kerning first=220 second=206 amount=-1 +kerning first=68 second=368 amount=-1 +kerning first=258 second=220 amount=-1 +kerning first=323 second=304 amount=-1 +kerning first=370 second=109 amount=-1 +kerning first=324 second=246 amount=-1 +kerning first=366 second=220 amount=-1 +kerning first=283 second=382 amount=-1 +kerning first=330 second=220 amount=-1 +kerning first=364 second=206 amount=-1 +kerning first=74 second=304 amount=-1 +kerning first=8218 second=375 amount=-1 +kerning first=1051 second=1086 amount=-1 +kerning first=252 second=246 amount=-1 +kerning first=1043 second=1095 amount=-1 +kerning first=1030 second=1060 amount=-1 +kerning first=81 second=220 amount=-1 +kerning first=86 second=8221 amount=-1 +kerning first=302 second=282 amount=-1 +kerning first=249 second=103 amount=-1 +kerning first=244 second=120 amount=-1 +kerning first=219 second=46 amount=-2 +kerning first=1067 second=1048 amount=-1 +kerning first=82 second=220 amount=-1 +kerning first=1051 second=1051 amount=-1 +kerning first=216 second=8218 amount=-1 +kerning first=263 second=8221 amount=-2 +kerning first=108 second=103 amount=-1 +kerning first=8250 second=204 amount=-1 +kerning first=207 second=211 amount=-1 +kerning first=85 second=109 amount=-1 +kerning first=111 second=8218 amount=-1 +kerning first=105 second=255 amount=-1 +kerning first=266 second=313 amount=-1 +kerning first=234 second=365 amount=-1 +kerning first=298 second=109 amount=-1 +kerning first=1056 second=1034 amount=-1 +kerning first=338 second=313 amount=-1 +kerning first=66 second=211 amount=-1 +kerning first=70 second=382 amount=-1 +kerning first=198 second=365 amount=-1 +kerning first=262 second=109 amount=-1 +kerning first=317 second=368 amount=-1 +kerning first=201 second=85 amount=-1 +kerning first=278 second=223 amount=-1 +kerning first=8222 second=365 amount=-1 +kerning first=206 second=223 amount=-1 +kerning first=85 second=280 amount=-1 +kerning first=264 second=210 amount=-1 +kerning first=1070 second=1053 amount=-1 +kerning first=288 second=304 amount=-1 +kerning first=269 second=98 amount=-1 +kerning first=192 second=210 amount=-1 +kerning first=1046 second=1057 amount=-1 +kerning first=350 second=223 amount=-1 +kerning first=262 second=280 amount=-1 +kerning first=197 second=98 amount=-1 +kerning first=210 second=256 amount=-1 +kerning first=87 second=210 amount=-1 +kerning first=1078 second=1092 amount=-1 +kerning first=241 second=335 amount=-1 +kerning first=334 second=280 amount=-1 +kerning first=1036 second=1077 amount=-1 +kerning first=99 second=122 amount=-1 +kerning first=205 second=335 amount=-1 +kerning first=72 second=380 amount=-1 +kerning first=201 second=302 amount=-1 +kerning first=277 second=335 amount=-1 +kerning first=370 second=280 amount=-1 +kerning first=268 second=243 amount=-1 +kerning first=282 second=371 amount=-1 +kerning first=315 second=219 amount=-1 +kerning first=232 second=243 amount=-1 +kerning first=65 second=223 amount=-1 +kerning first=99 second=339 amount=-1 +kerning first=8217 second=268 amount=-1 +kerning first=70 second=271 amount=-1 +kerning first=240 second=339 amount=-1 +kerning first=219 second=78 amount=-1 +kerning first=304 second=243 amount=-1 +kerning first=1070 second=1047 amount=-1 +kerning first=204 second=339 amount=-1 +kerning first=346 second=298 amount=-1 +kerning first=8222 second=224 amount=-1 +kerning first=272 second=89 amount=-1 +kerning first=171 second=219 amount=-1 +kerning first=278 second=8249 amount=-1 +kerning first=330 second=76 amount=-1 +kerning first=314 second=8249 amount=-1 +kerning first=66 second=219 amount=-1 +kerning first=1060 second=1059 amount=-1 +kerning first=210 second=323 amount=-1 +kerning first=364 second=363 amount=-1 +kerning first=1070 second=1039 amount=-1 +kerning first=8218 second=264 amount=-1 +kerning first=275 second=232 amount=-1 +kerning first=344 second=89 amount=-1 +kerning first=45 second=76 amount=-1 +kerning first=100 second=335 amount=-1 +kerning first=81 second=76 amount=-1 +kerning first=235 second=234 amount=-1 +kerning first=8217 second=112 amount=-1 +kerning first=118 second=289 amount=-1 +kerning first=199 second=234 amount=-1 +kerning first=259 second=289 amount=-1 +kerning first=218 second=241 amount=-1 +kerning first=307 second=234 amount=-1 +kerning first=202 second=344 amount=-1 +kerning first=223 second=289 amount=-1 +kerning first=291 second=98 amount=-1 +kerning first=271 second=234 amount=-1 +kerning first=8250 second=355 amount=-1 +kerning first=74 second=120 amount=-1 +kerning first=65 second=8249 amount=-1 +kerning first=274 second=344 amount=-1 +kerning first=313 second=354 amount=-1 +kerning first=1058 second=1075 amount=-1 +kerning first=362 second=241 amount=-1 +kerning first=346 second=344 amount=-1 +kerning first=367 second=289 amount=-1 +kerning first=81 second=274 amount=-1 +kerning first=193 second=46 amount=-1 +kerning first=1071 second=1091 amount=-1 +kerning first=187 second=216 amount=-1 +kerning first=1071 second=1108 amount=-1 +kerning first=45 second=274 amount=-1 +kerning first=296 second=204 amount=-1 +kerning first=213 second=366 amount=-1 +kerning first=369 second=113 amount=-1 +kerning first=337 second=46 amount=-1 +kerning first=80 second=332 amount=-1 +kerning first=1034 second=1038 amount=-2 +kerning first=197 second=79 amount=-1 +kerning first=363 second=283 amount=-1 +kerning first=1091 second=1084 amount=-1 +kerning first=1075 second=1087 amount=-1 +kerning first=364 second=225 amount=-1 +kerning first=1055 second=1084 amount=-1 +kerning first=330 second=274 amount=-1 +kerning first=221 second=332 amount=-1 +kerning first=366 second=274 amount=-1 +kerning first=75 second=357 amount=-1 +kerning first=86 second=195 amount=-1 +kerning first=287 second=250 amount=-1 +kerning first=264 second=104 amount=-1 +kerning first=321 second=366 amount=-1 +kerning first=88 second=46 amount=-1 +kerning first=366 second=76 amount=-1 +kerning first=82 second=216 amount=-1 +kerning first=192 second=104 amount=-1 +kerning first=77 second=70 amount=-1 +kerning first=352 second=207 amount=-1 +kerning first=197 second=369 amount=-1 +kerning first=302 second=259 amount=-1 +kerning first=1051 second=1105 amount=-1 +kerning first=8250 second=345 amount=-1 +kerning first=203 second=213 amount=-1 +kerning first=1047 second=1053 amount=-1 +kerning first=121 second=347 amount=-1 +kerning first=240 second=122 amount=-1 +kerning first=278 second=323 amount=-1 +kerning first=8217 second=122 amount=-1 +kerning first=290 second=70 amount=-1 +kerning first=283 second=271 amount=-1 +kerning first=206 second=323 amount=-1 +kerning first=269 second=369 amount=-1 +kerning first=204 second=122 amount=-1 +kerning first=374 second=259 amount=-1 +kerning first=70 second=198 amount=-1 +kerning first=233 second=369 amount=-1 +kerning first=225 second=113 amount=-1 +kerning first=83 second=204 amount=-1 +kerning first=356 second=378 amount=-1 +kerning first=261 second=113 amount=-1 +kerning first=287 second=8222 amount=-1 +kerning first=350 second=323 amount=-1 +kerning first=80 second=83 amount=-1 +kerning first=67 second=207 amount=-1 +kerning first=248 second=378 amount=-1 +kerning first=1048 second=1041 amount=-1 +kerning first=198 second=75 amount=-1 +kerning first=72 second=46 amount=-1 +kerning first=1038 second=1099 amount=-1 +kerning first=84 second=113 amount=-1 +kerning first=281 second=116 amount=-1 +kerning first=280 second=207 amount=-1 +kerning first=89 second=259 amount=-1 +kerning first=89 second=197 amount=-1 +kerning first=8217 second=249 amount=-1 +kerning first=209 second=116 amount=-1 +kerning first=328 second=119 amount=-1 +kerning first=278 second=116 amount=-1 +kerning first=85 second=201 amount=-1 +kerning first=88 second=366 amount=-1 +kerning first=78 second=113 amount=-1 +kerning first=245 second=314 amount=-1 +kerning first=206 second=116 amount=-1 +kerning first=204 second=204 amount=-1 +kerning first=1057 second=1081 amount=-1 +kerning first=101 second=271 amount=-1 +kerning first=74 second=363 amount=-1 +kerning first=105 second=253 amount=-1 +kerning first=355 second=259 amount=-1 +kerning first=353 second=314 amount=-1 +kerning first=1071 second=1084 amount=-1 +kerning first=281 second=314 amount=-1 +kerning first=268 second=110 amount=-1 +kerning first=287 second=363 amount=-1 +kerning first=332 second=187 amount=-1 +kerning first=327 second=113 amount=-1 +kerning first=209 second=67 amount=-1 +kerning first=368 second=256 amount=-1 +kerning first=363 second=113 amount=-1 +kerning first=69 second=82 amount=-1 +kerning first=101 second=116 amount=-1 +kerning first=75 second=369 amount=-1 +kerning first=70 second=259 amount=-1 +kerning first=65 second=116 amount=-1 +kerning first=291 second=113 amount=-1 +kerning first=268 second=317 amount=-1 +kerning first=193 second=366 amount=-1 +kerning first=8218 second=240 amount=-1 +kerning first=304 second=317 amount=-1 +kerning first=73 second=210 amount=-1 +kerning first=219 second=113 amount=-1 +kerning first=87 second=213 amount=-1 +kerning first=103 second=101 amount=-1 +kerning first=282 second=73 amount=-1 +kerning first=8217 second=234 amount=-1 +kerning first=67 second=101 amount=-1 +kerning first=366 second=271 amount=-1 +kerning first=119 second=254 amount=-1 +kerning first=207 second=302 amount=-1 +kerning first=330 second=271 amount=-1 +kerning first=66 second=302 amount=-1 +kerning first=274 second=219 amount=-1 +kerning first=310 second=219 amount=-1 +kerning first=116 second=8250 amount=-1 +kerning first=199 second=268 amount=-1 +kerning first=202 second=219 amount=-1 +kerning first=243 second=8220 amount=-2 +kerning first=80 second=8250 amount=-1 +kerning first=77 second=296 amount=-1 +kerning first=316 second=101 amount=-1 +kerning first=279 second=122 amount=-1 +kerning first=259 second=277 amount=-1 +kerning first=1038 second=1113 amount=-1 +kerning first=198 second=262 amount=-1 +kerning first=339 second=311 amount=-1 +kerning first=69 second=73 amount=-1 +kerning first=323 second=317 amount=-1 +kerning first=207 second=122 amount=-1 +kerning first=203 second=290 amount=-1 +kerning first=243 second=122 amount=-1 +kerning first=334 second=203 amount=-1 +kerning first=281 second=380 amount=-1 +kerning first=68 second=218 amount=-1 +kerning first=367 second=277 amount=-1 +kerning first=195 second=311 amount=-1 +kerning first=98 second=345 amount=-1 +kerning first=1047 second=1102 amount=-1 +kerning first=231 second=311 amount=-1 +kerning first=210 second=73 amount=-1 +kerning first=1058 second=1087 amount=-1 +kerning first=234 second=235 amount=-1 +kerning first=296 second=283 amount=-1 +kerning first=268 second=290 amount=-1 +kerning first=8218 second=267 amount=-1 +kerning first=304 second=290 amount=-1 +kerning first=224 second=283 amount=-1 +kerning first=198 second=82 amount=-1 +kerning first=187 second=82 amount=-1 +kerning first=305 second=114 amount=-1 +kerning first=245 second=287 amount=-1 +kerning first=85 second=269 amount=-1 +kerning first=195 second=338 amount=-1 +kerning first=270 second=82 amount=-1 +kerning first=68 second=8222 amount=-1 +kerning first=104 second=287 amount=-1 +kerning first=315 second=8220 amount=-1 +kerning first=204 second=351 amount=-1 +kerning first=353 second=287 amount=-1 +kerning first=1053 second=1031 amount=-1 +kerning first=1044 second=1091 amount=-1 +kerning first=100 second=187 amount=-1 +kerning first=99 second=351 amount=-1 +kerning first=281 second=287 amount=-1 +kerning first=262 second=278 amount=-1 +kerning first=291 second=347 amount=-1 +kerning first=327 second=347 amount=-1 +kerning first=304 second=83 amount=-1 +kerning first=70 second=286 amount=-1 +kerning first=219 second=347 amount=-1 +kerning first=368 second=283 amount=-1 +kerning first=196 second=290 amount=-1 +kerning first=255 second=347 amount=-1 +kerning first=8217 second=81 amount=-1 +kerning first=347 second=171 amount=-1 +kerning first=267 second=104 amount=-1 +kerning first=187 second=70 amount=-1 +kerning first=228 second=333 amount=-1 +kerning first=1052 second=1099 amount=-1 +kerning first=87 second=333 amount=-1 +kerning first=195 second=104 amount=-1 +kerning first=117 second=244 amount=-1 +kerning first=80 second=278 amount=-1 +kerning first=231 second=104 amount=-1 +kerning first=272 second=274 amount=-1 +kerning first=1068 second=1101 amount=-1 +kerning first=264 second=333 amount=-1 +kerning first=200 second=274 amount=-1 +kerning first=330 second=244 amount=-1 +kerning first=1030 second=1094 amount=-1 +kerning first=366 second=244 amount=-1 +kerning first=259 second=8217 amount=-2 +kerning first=240 second=231 amount=-1 +kerning first=334 second=201 amount=-1 +kerning first=370 second=201 amount=-1 +kerning first=212 second=195 amount=-1 +kerning first=262 second=201 amount=-1 +kerning first=203 second=171 amount=-1 +kerning first=298 second=201 amount=-1 +kerning first=315 second=89 amount=-1 +kerning first=8250 second=310 amount=-1 +kerning first=339 second=104 amount=-1 +kerning first=99 second=231 amount=-1 +kerning first=311 second=171 amount=-1 +kerning first=354 second=100 amount=-1 +kerning first=287 second=316 amount=-1 +kerning first=374 second=71 amount=-1 +kerning first=305 second=269 amount=-1 +kerning first=1065 second=1088 amount=-1 +kerning first=280 second=362 amount=-1 +kerning first=338 second=71 amount=-1 +kerning first=283 second=106 amount=-1 +kerning first=79 second=65 amount=-1 +kerning first=270 second=87 amount=-1 +kerning first=233 second=269 amount=-1 +kerning first=352 second=362 amount=-1 +kerning first=266 second=71 amount=-1 +kerning first=219 second=266 amount=-1 +kerning first=8217 second=288 amount=-1 +kerning first=368 second=310 amount=-1 +kerning first=327 second=200 amount=-1 +kerning first=89 second=245 amount=-1 +kerning first=220 second=65 amount=-1 +kerning first=275 second=318 amount=-1 +kerning first=78 second=266 amount=-1 +kerning first=311 second=318 amount=-1 +kerning first=347 second=318 amount=-1 +kerning first=223 second=8222 amount=-1 +kerning first=364 second=65 amount=-1 +kerning first=68 second=260 amount=-1 +kerning first=67 second=362 amount=-1 +kerning first=118 second=8222 amount=-1 +kerning first=82 second=370 amount=-1 +kerning first=203 second=45 amount=-1 +kerning first=199 second=214 amount=-1 +kerning first=82 second=8222 amount=-1 +kerning first=207 second=275 amount=-1 +kerning first=194 second=71 amount=-1 +kerning first=103 second=231 amount=-1 +kerning first=69 second=199 amount=-1 +kerning first=279 second=275 amount=-1 +kerning first=311 second=45 amount=-1 +kerning first=89 second=71 amount=-1 +kerning first=347 second=45 amount=-1 +kerning first=196 second=371 amount=-1 +kerning first=354 second=226 amount=-1 +kerning first=235 second=8221 amount=-2 +kerning first=82 second=223 amount=-1 +kerning first=45 second=217 amount=-1 +kerning first=86 second=234 amount=-1 +kerning first=227 second=234 amount=-1 +kerning first=364 second=380 amount=-1 +kerning first=219 second=200 amount=-1 +kerning first=258 second=217 amount=-1 +kerning first=355 second=232 amount=-1 +kerning first=251 second=243 amount=-1 +kerning first=221 second=251 amount=-1 +kerning first=78 second=200 amount=-1 +kerning first=330 second=217 amount=-1 +kerning first=283 second=232 amount=-1 +kerning first=226 second=8220 amount=-2 +kerning first=323 second=243 amount=-1 +kerning first=327 second=266 amount=-1 +kerning first=287 second=243 amount=-1 +kerning first=65 second=89 amount=-1 +kerning first=203 second=345 amount=-1 +kerning first=70 second=232 amount=-1 +kerning first=241 second=8221 amount=-2 +kerning first=103 second=335 amount=-1 +kerning first=214 second=8250 amount=-1 +kerning first=275 second=345 amount=-1 +kerning first=277 second=8221 amount=-2 +kerning first=70 second=352 amount=-1 +kerning first=1054 second=1037 amount=-1 +kerning first=313 second=8221 amount=-1 +kerning first=73 second=44 amount=-1 +kerning first=310 second=105 amount=-1 +kerning first=233 second=242 amount=-1 +kerning first=283 second=99 amount=-1 +kerning first=203 second=72 amount=-1 +kerning first=269 second=242 amount=-1 +kerning first=106 second=232 amount=-1 +kerning first=228 second=267 amount=-1 +kerning first=230 second=98 amount=-1 +kerning first=199 second=241 amount=-1 +kerning first=268 second=344 amount=-1 +kerning first=263 second=234 amount=-1 +kerning first=194 second=98 amount=-1 +kerning first=74 second=336 amount=-1 +kerning first=1046 second=1096 amount=-1 +kerning first=104 second=233 amount=-1 +kerning first=87 second=267 amount=-1 +kerning first=368 second=284 amount=-1 +kerning first=67 second=335 amount=-1 +kerning first=1030 second=1028 amount=-1 +kerning first=266 second=98 amount=-1 +kerning first=323 second=336 amount=-1 +kerning first=281 second=233 amount=-1 +kerning first=218 second=80 amount=-1 +kerning first=99 second=378 amount=-1 +kerning first=1033 second=1045 amount=-1 +kerning first=298 second=114 amount=-1 +kerning first=209 second=233 amount=-1 +kerning first=210 second=46 amount=-1 +kerning first=282 second=199 amount=-1 +kerning first=77 second=80 amount=-1 +kerning first=1041 second=1079 amount=-1 +kerning first=1069 second=1045 amount=-1 +kerning first=362 second=80 amount=-1 +kerning first=240 second=378 amount=-1 +kerning first=121 second=114 amount=-1 +kerning first=246 second=46 amount=-1 +kerning first=1040 second=1094 amount=-1 +kerning first=290 second=80 amount=-1 +kerning first=204 second=378 amount=-1 +kerning first=354 second=46 amount=-1 +kerning first=366 second=268 amount=-1 +kerning first=226 second=114 amount=-1 +kerning first=1042 second=1046 amount=-1 +kerning first=8250 second=364 amount=-1 +kerning first=80 second=224 amount=-1 +kerning first=195 second=284 amount=-1 +kerning first=289 second=318 amount=-1 +kerning first=228 second=108 amount=-1 +kerning first=85 second=114 amount=-1 +kerning first=8217 second=261 amount=-1 +kerning first=83 second=310 amount=-1 +kerning first=220 second=353 amount=-1 +kerning first=199 second=115 amount=-1 +kerning first=74 second=216 amount=-1 +kerning first=356 second=115 amount=-1 +kerning first=235 second=115 amount=-1 +kerning first=187 second=250 amount=-1 +kerning first=100 second=8221 amount=-1 +kerning first=85 second=290 amount=-1 +kerning first=118 second=250 amount=-1 +kerning first=221 second=224 amount=-1 +kerning first=364 second=353 amount=-1 +kerning first=274 second=78 amount=-1 +kerning first=277 second=44 amount=-1 +kerning first=86 second=273 amount=-1 +kerning first=80 second=45 amount=-1 +kerning first=346 second=78 amount=-1 +kerning first=71 second=8249 amount=-1 +kerning first=1051 second=1098 amount=-1 +kerning first=107 second=8249 amount=-1 +kerning first=100 second=283 amount=-1 +kerning first=200 second=355 amount=-1 +kerning first=330 second=352 amount=-1 +kerning first=323 second=282 amount=-1 +kerning first=284 second=8249 amount=-1 +kerning first=366 second=352 amount=-1 +kerning first=199 second=8220 amount=-1 +kerning first=264 second=72 amount=-1 +kerning first=364 second=218 amount=-1 +kerning first=362 second=248 amount=-1 +kerning first=1052 second=1104 amount=-1 +kerning first=326 second=248 amount=-1 +kerning first=262 second=102 amount=-1 +kerning first=74 second=282 amount=-1 +kerning first=220 second=218 amount=-1 +kerning first=102 second=44 amount=-1 +kerning first=218 second=248 amount=-1 +kerning first=370 second=102 amount=-1 +kerning first=267 second=263 amount=-1 +kerning first=1027 second=1089 amount=-1 +kerning first=334 second=87 amount=-1 +kerning first=68 second=75 amount=-1 +kerning first=68 second=206 amount=-1 +kerning first=229 second=101 amount=-1 +kerning first=1042 second=1031 amount=-1 +kerning first=347 second=291 amount=-1 +kerning first=69 second=361 amount=-1 +kerning first=311 second=291 amount=-1 +kerning first=1054 second=1024 amount=-1 +kerning first=282 second=361 amount=-1 +kerning first=275 second=291 amount=-1 +kerning first=271 second=279 amount=-1 +kerning first=119 second=345 amount=-1 +kerning first=206 second=230 amount=-1 +kerning first=209 second=206 amount=-1 +kerning first=1059 second=1100 amount=-1 +kerning first=86 second=288 amount=-1 +kerning first=335 second=8218 amount=-1 +kerning first=1039 second=1080 amount=-1 +kerning first=75 second=8221 amount=-1 +kerning first=368 second=337 amount=-1 +kerning first=111 second=8221 amount=-2 +kerning first=263 second=8218 amount=-1 +kerning first=262 second=8221 amount=-1 +kerning first=75 second=81 amount=-1 +kerning first=296 second=337 amount=-1 +kerning first=216 second=8221 amount=-2 +kerning first=1064 second=1095 amount=-1 +kerning first=67 second=227 amount=-1 +kerning first=252 second=8221 amount=-1 +kerning first=224 second=337 amount=-1 +kerning first=1054 second=1064 amount=-1 +kerning first=288 second=8221 amount=-1 +kerning first=1052 second=1079 amount=-1 +kerning first=80 second=197 amount=-1 +kerning first=198 second=368 amount=-1 +kerning first=45 second=325 amount=-1 +kerning first=302 second=266 amount=-1 +kerning first=197 second=362 amount=-1 +kerning first=199 second=187 amount=-1 +kerning first=70 second=351 amount=-1 +kerning first=266 second=266 amount=-1 +kerning first=352 second=200 amount=-1 +kerning first=204 second=262 amount=-1 +kerning first=374 second=266 amount=-1 +kerning first=81 second=325 amount=-1 +kerning first=87 second=99 amount=-1 +kerning first=338 second=266 amount=-1 +kerning first=85 second=75 amount=-1 +kerning first=280 second=200 amount=-1 +kerning first=307 second=187 amount=-1 +kerning first=1052 second=1077 amount=-1 +kerning first=89 second=266 amount=-1 +kerning first=235 second=187 amount=-1 +kerning first=228 second=99 amount=-1 +kerning first=86 second=8218 amount=-2 +kerning first=271 second=187 amount=-1 +kerning first=264 second=99 amount=-1 +kerning first=266 second=219 amount=-1 +kerning first=107 second=8222 amount=-1 +kerning first=366 second=325 amount=-1 +kerning first=205 second=71 amount=-1 +kerning first=71 second=8222 amount=-1 +kerning first=275 second=279 amount=-1 +kerning first=231 second=353 amount=-1 +kerning first=199 second=202 amount=-1 +kerning first=326 second=275 amount=-1 +kerning first=370 second=75 amount=-1 +kerning first=334 second=75 amount=-1 +kerning first=298 second=75 amount=-1 +kerning first=266 second=8218 amount=-1 +kerning first=362 second=275 amount=-1 +kerning first=262 second=75 amount=-1 +kerning first=187 second=192 amount=-1 +kerning first=263 second=245 amount=-1 +kerning first=211 second=78 amount=-1 +kerning first=346 second=66 amount=-1 +kerning first=1052 second=1052 amount=-1 +kerning first=274 second=66 amount=-1 +kerning first=221 second=371 amount=-1 +kerning first=69 second=334 amount=-1 +kerning first=286 second=69 amount=-1 +kerning first=111 second=108 amount=-1 +kerning first=202 second=66 amount=-1 +kerning first=366 second=249 amount=-1 +kerning first=1039 second=1107 amount=-1 +kerning first=200 second=367 amount=-1 +kerning first=1064 second=1068 amount=-1 +kerning first=209 second=380 amount=-1 +kerning first=67 second=200 amount=-1 +kerning first=211 second=205 amount=-1 +kerning first=70 second=205 amount=-1 +kerning first=323 second=270 amount=-1 +kerning first=214 second=69 amount=-1 +kerning first=206 second=257 amount=-1 +kerning first=245 second=380 amount=-1 +kerning first=310 second=284 amount=-1 +kerning first=263 second=273 amount=-1 +kerning first=366 second=350 amount=-1 +kerning first=1071 second=1030 amount=-1 +kerning first=70 second=193 amount=-1 +kerning first=368 second=364 amount=-1 +kerning first=211 second=193 amount=-1 +kerning first=86 second=261 amount=-1 +kerning first=268 second=209 amount=-1 +kerning first=296 second=364 amount=-1 +kerning first=218 second=194 amount=-1 +kerning first=344 second=286 amount=-1 +kerning first=73 second=355 amount=-1 +kerning first=207 second=68 amount=-1 +kerning first=339 second=365 amount=-1 +kerning first=200 second=286 amount=-1 +kerning first=8217 second=273 amount=-1 +kerning first=375 second=365 amount=-1 +kerning first=232 second=263 amount=-1 +kerning first=267 second=365 amount=-1 +kerning first=81 second=298 amount=-1 +kerning first=109 second=171 amount=-1 +kerning first=268 second=263 amount=-1 +kerning first=66 second=68 amount=-1 +kerning first=45 second=298 amount=-1 +kerning first=304 second=263 amount=-1 +kerning first=195 second=365 amount=-1 +kerning first=350 second=203 amount=-1 +kerning first=231 second=365 amount=-1 +kerning first=323 second=351 amount=-1 +kerning first=69 second=332 amount=-1 +kerning first=99 second=117 amount=-1 +kerning first=351 second=8218 amount=-1 +kerning first=199 second=229 amount=-1 +kerning first=282 second=332 amount=-1 +kerning first=1042 second=1085 amount=-1 +kerning first=1046 second=1108 amount=-1 +kerning first=278 second=203 amount=-1 +kerning first=366 second=298 amount=-1 +kerning first=1073 second=1083 amount=-1 +kerning first=8217 second=217 amount=-1 +kerning first=210 second=69 amount=-1 +kerning first=211 second=220 amount=-1 +kerning first=219 second=332 amount=-1 +kerning first=267 second=242 amount=-1 +kerning first=81 second=323 amount=-1 +kerning first=88 second=217 amount=-1 +kerning first=1047 second=1048 amount=-1 +kerning first=1052 second=1025 amount=-1 +kerning first=45 second=323 amount=-1 +kerning first=70 second=220 amount=-1 +kerning first=214 second=66 amount=-1 +kerning first=263 second=246 amount=-1 +kerning first=315 second=356 amount=-1 +kerning first=227 second=246 amount=-1 +kerning first=67 second=281 amount=-1 +kerning first=305 second=103 amount=-1 +kerning first=103 second=281 amount=-1 +kerning first=82 second=211 amount=-1 +kerning first=233 second=103 amount=-1 +kerning first=86 second=246 amount=-1 +kerning first=212 second=304 amount=-1 +kerning first=205 second=330 amount=-1 +kerning first=362 second=194 amount=-1 +kerning first=199 second=100 amount=-1 +kerning first=104 second=119 amount=-1 +kerning first=284 second=304 amount=-1 +kerning first=366 second=323 amount=-1 +kerning first=316 second=281 amount=-1 +kerning first=330 second=323 amount=-1 +kerning first=235 second=100 amount=-1 +kerning first=71 second=304 amount=-1 +kerning first=1058 second=1077 amount=-1 +kerning first=220 second=245 amount=-1 +kerning first=187 second=109 amount=-1 +kerning first=210 second=280 amount=-1 +kerning first=74 second=231 amount=-1 +kerning first=1030 second=1067 amount=-1 +kerning first=282 second=280 amount=-1 +kerning first=364 second=8217 amount=-1 +kerning first=80 second=85 amount=-1 +kerning first=80 second=110 amount=-1 +kerning first=203 second=210 amount=-1 +kerning first=272 second=313 amount=-1 +kerning first=221 second=110 amount=-1 +kerning first=8217 second=369 amount=-1 +kerning first=229 second=339 amount=-1 +kerning first=8218 second=213 amount=-1 +kerning first=287 second=324 amount=-1 +kerning first=354 second=8250 amount=-1 +kerning first=364 second=245 amount=-1 +kerning first=328 second=245 amount=-1 +kerning first=200 second=313 amount=-1 +kerning first=282 second=8250 amount=-1 +kerning first=70 second=118 amount=-1 +kerning first=205 second=357 amount=-1 +kerning first=1077 second=1118 amount=-1 +kerning first=277 second=357 amount=-1 +kerning first=105 second=8250 amount=-1 +kerning first=374 second=212 amount=-1 +kerning first=69 second=8250 amount=-1 +kerning first=255 second=8220 amount=-2 +kerning first=234 second=289 amount=-1 +kerning first=1049 second=1101 amount=-1 +kerning first=254 second=120 amount=-1 +kerning first=314 second=101 amount=-1 +kerning first=8250 second=270 amount=-1 +kerning first=269 second=101 amount=-1 +kerning first=8218 second=86 amount=-2 +kerning first=81 second=296 amount=-1 +kerning first=266 second=212 amount=-1 +kerning first=220 second=8217 amount=-1 +kerning first=45 second=296 amount=-1 +kerning first=302 second=212 amount=-1 +kerning first=256 second=8217 amount=-2 +kerning first=73 second=111 amount=-1 +kerning first=338 second=212 amount=-1 +kerning first=109 second=111 amount=-1 +kerning first=89 second=212 amount=-1 +kerning first=67 second=254 amount=-1 +kerning first=69 second=280 amount=-1 +kerning first=79 second=8217 amount=-2 +kerning first=250 second=111 amount=-1 +kerning first=194 second=212 amount=-1 +kerning first=103 second=254 amount=-1 +kerning first=115 second=8217 amount=-2 +kerning first=291 second=335 amount=-1 +kerning first=67 second=347 amount=-1 +kerning first=366 second=296 amount=-1 +kerning first=368 second=241 amount=-1 +kerning first=363 second=335 amount=-1 +kerning first=330 second=296 amount=-1 +kerning first=345 second=228 amount=-1 +kerning first=327 second=335 amount=-1 +kerning first=296 second=241 amount=-1 +kerning first=304 second=85 amount=-1 +kerning first=1052 second=1080 amount=-1 +kerning first=268 second=85 amount=-1 +kerning first=196 second=85 amount=-1 +kerning first=1031 second=1056 amount=-1 +kerning first=234 second=287 amount=-1 +kerning first=196 second=8220 amount=-2 +kerning first=192 second=364 amount=-1 +kerning first=219 second=231 amount=-1 +kerning first=235 second=46 amount=-1 +kerning first=268 second=8220 amount=-1 +kerning first=89 second=65 amount=-1 +kerning first=77 second=339 amount=-1 +kerning first=72 second=229 amount=-1 +kerning first=269 second=271 amount=-1 +kerning first=268 second=302 amount=-1 +kerning first=249 second=243 amount=-1 +kerning first=233 second=271 amount=-1 +kerning first=73 second=225 amount=-1 +kerning first=304 second=302 amount=-1 +kerning first=78 second=335 amount=-1 +kerning first=364 second=83 amount=-1 +kerning first=1057 second=1096 amount=-1 +kerning first=219 second=335 amount=-1 +kerning first=245 second=187 amount=-1 +kerning first=364 second=284 amount=-1 +kerning first=204 second=206 amount=-1 +kerning first=66 second=80 amount=-1 +kerning first=104 second=289 amount=-1 +kerning first=245 second=289 amount=-1 +kerning first=321 second=86 amount=-1 +kerning first=8250 second=78 amount=-1 +kerning first=207 second=344 amount=-1 +kerning first=220 second=284 amount=-1 +kerning first=281 second=289 amount=-1 +kerning first=207 second=80 amount=-1 +kerning first=323 second=378 amount=-1 +kerning first=199 second=46 amount=-1 +kerning first=352 second=76 amount=-1 +kerning first=1038 second=1094 amount=-1 +kerning first=202 second=207 amount=-1 +kerning first=287 second=378 amount=-1 +kerning first=353 second=289 amount=-1 +kerning first=287 second=353 amount=-1 +kerning first=280 second=76 amount=-1 +kerning first=193 second=79 amount=-1 +kerning first=267 second=353 amount=-1 +kerning first=100 second=114 amount=-1 +kerning first=375 second=353 amount=-1 +kerning first=195 second=89 amount=-1 +kerning first=339 second=353 amount=-1 +kerning first=370 second=337 amount=-1 +kerning first=282 second=278 amount=-1 +kerning first=74 second=378 amount=-1 +kerning first=230 second=357 amount=-1 +kerning first=8217 second=350 amount=-1 +kerning first=262 second=216 amount=-1 +kerning first=80 second=280 amount=-1 +kerning first=249 second=246 amount=-1 +kerning first=66 second=344 amount=-1 +kerning first=67 second=76 amount=-1 +kerning first=266 second=357 amount=-1 +kerning first=1104 second=1118 amount=-1 +kerning first=266 second=113 amount=-1 +kerning first=302 second=113 amount=-1 +kerning first=1060 second=1084 amount=-1 +kerning first=218 second=114 amount=-1 +kerning first=230 second=113 amount=-1 +kerning first=201 second=201 amount=-1 +kerning first=117 second=269 amount=-1 +kerning first=1055 second=1094 amount=-1 +kerning first=89 second=113 amount=-1 +kerning first=330 second=269 amount=-1 +kerning first=1091 second=1094 amount=-1 +kerning first=214 second=198 amount=-1 +kerning first=366 second=269 amount=-1 +kerning first=195 second=116 amount=-1 +kerning first=65 second=104 amount=-1 +kerning first=274 second=207 amount=-1 +kerning first=1066 second=1045 amount=-1 +kerning first=253 second=8220 amount=-2 +kerning first=346 second=207 amount=-1 +kerning first=213 second=256 amount=-1 +kerning first=364 second=67 amount=-1 +kerning first=368 second=268 amount=-1 +kerning first=333 second=287 amount=-1 +kerning first=374 second=113 amount=-1 +kerning first=86 second=369 amount=-1 +kerning first=77 second=366 amount=-1 +kerning first=220 second=67 amount=-1 +kerning first=279 second=107 amount=-1 +kerning first=77 second=122 amount=-1 +kerning first=1046 second=1102 amount=-1 +kerning first=270 second=260 amount=-1 +kerning first=356 second=277 amount=-1 +kerning first=263 second=250 amount=-1 +kerning first=199 second=73 amount=-1 +kerning first=66 second=317 amount=-1 +kerning first=209 second=262 amount=-1 +kerning first=207 second=317 amount=-1 +kerning first=74 second=351 amount=-1 +kerning first=321 second=219 amount=-1 +kerning first=69 second=251 amount=-1 +kerning first=213 second=219 amount=-1 +kerning first=339 second=116 amount=-1 +kerning first=65 second=375 amount=-1 +kerning first=362 second=122 amount=-1 +kerning first=1036 second=1102 amount=-1 +kerning first=267 second=326 amount=-1 +kerning first=1043 second=1076 amount=-1 +kerning first=254 second=122 amount=-1 +kerning first=231 second=326 amount=-1 +kerning first=8222 second=356 amount=-1 +kerning first=66 second=218 amount=-1 +kerning first=1056 second=1117 amount=-1 +kerning first=1050 second=1038 amount=-1 +kerning first=282 second=251 amount=-1 +kerning first=72 second=219 amount=-1 +kerning first=218 second=122 amount=-1 +kerning first=1068 second=1061 amount=-1 +kerning first=8250 second=219 amount=-1 +kerning first=350 second=218 amount=-1 +kerning first=262 second=270 amount=-1 +kerning first=304 second=248 amount=-1 +kerning first=89 second=8221 amount=-1 +kerning first=72 second=283 amount=-1 +kerning first=267 second=380 amount=-1 +kerning first=278 second=218 amount=-1 +kerning first=108 second=283 amount=-1 +kerning first=231 second=380 amount=-1 +kerning first=194 second=8221 amount=-2 +kerning first=1049 second=1089 amount=-1 +kerning first=339 second=380 amount=-1 +kerning first=370 second=270 amount=-1 +kerning first=206 second=218 amount=-1 +kerning first=117 second=242 amount=-1 +kerning first=230 second=8221 amount=-2 +kerning first=201 second=75 amount=-1 +kerning first=229 second=231 amount=-1 +kerning first=266 second=8221 amount=-1 +kerning first=85 second=336 amount=-1 +kerning first=298 second=270 amount=-1 +kerning first=268 second=248 amount=-1 +kerning first=114 second=44 amount=-1 +kerning first=375 second=380 amount=-1 +kerning first=334 second=270 amount=-1 +kerning first=65 second=218 amount=-1 +kerning first=232 second=248 amount=-1 +kerning first=338 second=8221 amount=-1 +kerning first=200 second=79 amount=-1 +kerning first=218 second=209 amount=-1 +kerning first=374 second=8221 amount=-1 +kerning first=212 second=196 amount=-1 +kerning first=221 second=226 amount=-1 +kerning first=262 second=336 amount=-1 +kerning first=298 second=336 amount=-1 +kerning first=77 second=209 amount=-1 +kerning first=8250 second=241 amount=-1 +kerning first=80 second=225 amount=-1 +kerning first=370 second=336 amount=-1 +kerning first=85 second=270 amount=-1 +kerning first=249 second=283 amount=-1 +kerning first=366 second=242 amount=-1 +kerning first=364 second=257 amount=-1 +kerning first=233 second=244 amount=-1 +kerning first=269 second=244 amount=-1 +kerning first=272 second=205 amount=-1 +kerning first=305 second=244 amount=-1 +kerning first=71 second=70 amount=-1 +kerning first=78 second=209 amount=-1 +kerning first=8222 second=275 amount=-1 +kerning first=1101 second=1113 amount=-1 +kerning first=72 second=199 amount=-1 +kerning first=284 second=8222 amount=-1 +kerning first=344 second=79 amount=-1 +kerning first=202 second=327 amount=-1 +kerning first=248 second=8222 amount=-1 +kerning first=212 second=8222 amount=-1 +kerning first=274 second=327 amount=-1 +kerning first=106 second=8220 amount=-1 +kerning first=115 second=8221 amount=-2 +kerning first=213 second=192 amount=-1 +kerning first=327 second=44 amount=-1 +kerning first=346 second=327 amount=-1 +kerning first=261 second=8217 amount=-2 +kerning first=291 second=318 amount=-1 +kerning first=255 second=44 amount=-1 +kerning first=104 second=235 amount=-1 +kerning first=193 second=44 amount=-1 +kerning first=291 second=44 amount=-1 +kerning first=99 second=110 amount=-1 +kerning first=200 second=205 amount=-1 +kerning first=209 second=235 amount=-1 +kerning first=374 second=227 amount=-1 +kerning first=212 second=70 amount=-1 +kerning first=281 second=235 amount=-1 +kerning first=302 second=227 amount=-1 +kerning first=270 second=347 amount=-1 +kerning first=284 second=70 amount=-1 +kerning first=266 second=227 amount=-1 +kerning first=100 second=171 amount=-1 +kerning first=219 second=71 amount=-1 +kerning first=85 second=363 amount=-1 +kerning first=117 second=289 amount=-1 +kerning first=121 second=363 amount=-1 +kerning first=67 second=266 amount=-1 +kerning first=78 second=71 amount=-1 +kerning first=368 second=214 amount=-1 +kerning first=368 second=115 amount=-1 +kerning first=198 second=370 amount=-1 +kerning first=85 second=243 amount=-1 +kerning first=304 second=275 amount=-1 +kerning first=213 second=310 amount=-1 +kerning first=354 second=224 amount=-1 +kerning first=296 second=214 amount=-1 +kerning first=226 second=243 amount=-1 +kerning first=370 second=363 amount=-1 +kerning first=87 second=45 amount=-2 +kerning first=268 second=275 amount=-1 +kerning first=219 second=362 amount=-1 +kerning first=270 second=370 amount=-1 +kerning first=232 second=275 amount=-1 +kerning first=284 second=223 amount=-1 +kerning first=228 second=45 amount=-1 +kerning first=1104 second=1081 amount=-1 +kerning first=264 second=45 amount=-1 +kerning first=221 second=199 amount=-1 +kerning first=277 second=249 amount=-1 +kerning first=192 second=45 amount=-1 +kerning first=1028 second=1097 amount=-1 +kerning first=71 second=223 amount=-1 +kerning first=1064 second=1097 amount=-1 +kerning first=97 second=234 amount=-1 +kerning first=241 second=235 amount=-1 +kerning first=220 second=257 amount=-1 +kerning first=1055 second=1028 amount=-1 +kerning first=338 second=216 amount=-1 +kerning first=1056 second=1063 amount=-1 +kerning first=217 second=267 amount=-1 +kerning first=197 second=217 amount=-1 +kerning first=78 second=362 amount=-1 +kerning first=290 second=209 amount=-1 +kerning first=325 second=267 amount=-1 +kerning first=338 second=200 amount=-1 +kerning first=298 second=243 amount=-1 +kerning first=1089 second=1095 amount=-1 +kerning first=82 second=368 amount=-1 +kerning first=302 second=200 amount=-1 +kerning first=262 second=243 amount=-1 +kerning first=73 second=345 amount=-1 +kerning first=266 second=200 amount=-1 +kerning first=66 second=371 amount=-1 +kerning first=109 second=345 amount=-1 +kerning first=45 second=379 amount=-1 +kerning first=1044 second=1072 amount=-1 +kerning first=187 second=368 amount=-1 +kerning first=356 second=97 amount=-1 +kerning first=100 second=248 amount=-1 +kerning first=250 second=345 amount=-1 +kerning first=280 second=266 amount=-1 +kerning first=286 second=345 amount=-1 +kerning first=8218 second=99 amount=-1 +kerning first=1030 second=1049 amount=-1 +kerning first=202 second=8218 amount=-1 +kerning first=339 second=245 amount=-1 +kerning first=315 second=221 amount=-1 +kerning first=8218 second=378 amount=-1 +kerning first=68 second=370 amount=-1 +kerning first=346 second=8218 amount=-1 +kerning first=267 second=245 amount=-1 +kerning first=66 second=221 amount=-1 +kerning first=274 second=315 amount=-1 +kerning first=210 second=197 amount=-1 +kerning first=317 second=370 amount=-1 +kerning first=310 second=8218 amount=-1 +kerning first=231 second=245 amount=-1 +kerning first=209 second=370 amount=-1 +kerning first=274 second=8218 amount=-1 +kerning first=1067 second=1073 amount=-1 +kerning first=171 second=221 amount=-1 +kerning first=202 second=315 amount=-1 +kerning first=84 second=111 amount=-1 +kerning first=362 second=258 amount=-1 +kerning first=1050 second=1092 amount=-1 +kerning first=350 second=46 amount=-1 +kerning first=196 second=199 amount=-1 +kerning first=1038 second=1101 amount=-1 +kerning first=338 second=249 amount=-1 +kerning first=200 second=45 amount=-1 +kerning first=231 second=117 amount=-1 +kerning first=304 second=199 amount=-1 +kerning first=89 second=249 amount=-1 +kerning first=1065 second=1086 amount=-1 +kerning first=267 second=230 amount=-1 +kerning first=1056 second=1024 amount=-1 +kerning first=194 second=249 amount=-1 +kerning first=70 second=350 amount=-1 +kerning first=314 second=267 amount=-1 +kerning first=280 second=217 amount=-1 +kerning first=1053 second=1068 amount=-1 +kerning first=219 second=212 amount=-1 +kerning first=352 second=217 amount=-1 +kerning first=101 second=267 amount=-1 +kerning first=8222 second=226 amount=-1 +kerning first=277 second=271 amount=-1 +kerning first=327 second=212 amount=-1 +kerning first=206 second=267 amount=-1 +kerning first=201 second=8249 amount=-1 +kerning first=72 second=310 amount=-1 +kerning first=245 second=122 amount=-1 +kerning first=78 second=212 amount=-1 +kerning first=225 second=111 amount=-1 +kerning first=296 second=115 amount=-1 +kerning first=346 second=315 amount=-1 +kerning first=8222 second=253 amount=-1 +kerning first=261 second=111 amount=-1 +kerning first=218 second=258 amount=-1 +kerning first=1039 second=1101 amount=-1 +kerning first=345 second=8249 amount=-1 +kerning first=240 second=242 amount=-1 +kerning first=194 second=67 amount=-1 +kerning first=1062 second=1098 amount=-1 +kerning first=369 second=111 amount=-1 +kerning first=119 second=115 amount=-1 +kerning first=255 second=254 amount=-1 +kerning first=291 second=254 amount=-1 +kerning first=194 second=44 amount=-1 +kerning first=195 second=218 amount=-1 +kerning first=1050 second=1119 amount=-1 +kerning first=270 second=323 amount=-1 +kerning first=205 second=81 amount=-1 +kerning first=89 second=44 amount=-1 +kerning first=220 second=380 amount=-1 +kerning first=272 second=193 amount=-1 +kerning first=279 second=248 amount=-1 +kerning first=230 second=44 amount=-1 +kerning first=1068 second=1027 amount=-1 +kerning first=1039 second=1117 amount=-1 +kerning first=266 second=44 amount=-1 +kerning first=66 second=209 amount=-1 +kerning first=370 second=282 amount=-1 +kerning first=314 second=337 amount=-1 +kerning first=72 second=78 amount=-1 +kerning first=334 second=282 amount=-1 +kerning first=213 second=78 amount=-1 +kerning first=298 second=282 amount=-1 +kerning first=1067 second=1097 amount=-1 +kerning first=207 second=248 amount=-1 +kerning first=262 second=282 amount=-1 +kerning first=325 second=72 amount=-1 +kerning first=8250 second=214 amount=-1 +kerning first=325 second=202 amount=-1 +kerning first=1055 second=1055 amount=-1 +kerning first=78 second=227 amount=-1 +kerning first=85 second=282 amount=-1 +kerning first=1053 second=1041 amount=-1 +kerning first=73 second=279 amount=-1 +kerning first=109 second=279 amount=-1 +kerning first=218 second=224 amount=-1 +kerning first=231 second=230 amount=-1 +kerning first=221 second=361 amount=-1 +kerning first=199 second=332 amount=-1 +kerning first=1067 second=1054 amount=-1 +kerning first=274 second=187 amount=-1 +kerning first=274 second=288 amount=-1 +kerning first=327 second=330 amount=-1 +kerning first=70 second=323 amount=-1 +kerning first=206 second=278 amount=-1 +kerning first=327 second=227 amount=-1 +kerning first=374 second=44 amount=-1 +kerning first=224 second=187 amount=-1 +kerning first=212 second=270 amount=-1 +kerning first=108 second=337 amount=-1 +kerning first=202 second=288 amount=-1 +kerning first=260 second=187 amount=-1 +kerning first=109 second=291 amount=-1 +kerning first=72 second=337 amount=-1 +kerning first=219 second=227 amount=-1 +kerning first=1067 second=1094 amount=-1 +kerning first=1067 second=1057 amount=-1 +kerning first=8249 second=368 amount=-1 +kerning first=310 second=288 amount=-1 +kerning first=368 second=187 amount=-2 +kerning first=211 second=323 amount=-1 +kerning first=345 second=8222 amount=-1 +kerning first=220 second=338 amount=-1 +kerning first=1055 second=1067 amount=-1 +kerning first=8222 second=199 amount=-1 +kerning first=118 second=314 amount=-1 +kerning first=1051 second=1034 amount=-1 +kerning first=194 second=303 amount=-1 +kerning first=84 second=259 amount=-1 +kerning first=217 second=99 amount=-1 +kerning first=78 second=281 amount=-1 +kerning first=65 second=8250 amount=-1 +kerning first=325 second=99 amount=-1 +kerning first=66 second=290 amount=-1 +kerning first=259 second=314 amount=-1 +kerning first=202 second=369 amount=-1 +kerning first=72 second=268 amount=-1 +kerning first=296 second=73 amount=-1 +kerning first=1091 second=1082 amount=-1 +kerning first=223 second=314 amount=-1 +kerning first=83 second=202 amount=-1 +kerning first=289 second=99 amount=-1 +kerning first=1046 second=1091 amount=-1 +kerning first=307 second=8250 amount=-1 +kerning first=368 second=73 amount=-1 +kerning first=207 second=290 amount=-1 +kerning first=333 second=382 amount=-1 +kerning first=271 second=8250 amount=-1 +kerning first=298 second=279 amount=-1 +kerning first=235 second=8250 amount=-1 +kerning first=346 second=369 amount=-1 +kerning first=199 second=8250 amount=-1 +kerning first=310 second=369 amount=-1 +kerning first=245 second=316 amount=-1 +kerning first=1067 second=1089 amount=-1 +kerning first=274 second=369 amount=-1 +kerning first=103 second=347 amount=-1 +kerning first=98 second=103 amount=-1 +kerning first=80 second=334 amount=-1 +kerning first=121 second=351 amount=-1 +kerning first=296 second=202 amount=-1 +kerning first=72 second=364 amount=-1 +kerning first=85 second=351 amount=-1 +kerning first=83 second=73 amount=-1 +kerning first=368 second=202 amount=-1 +kerning first=90 second=8217 amount=-1 +kerning first=1067 second=1100 amount=-1 +kerning first=187 second=382 amount=-1 +kerning first=334 second=351 amount=-1 +kerning first=298 second=351 amount=-1 +kerning first=262 second=351 amount=-1 +kerning first=73 second=264 amount=-1 +kerning first=212 second=82 amount=-1 +kerning first=339 second=8217 amount=-2 +kerning first=1053 second=1092 amount=-1 +kerning first=284 second=82 amount=-1 +kerning first=375 second=8217 amount=-2 +kerning first=272 second=374 amount=-1 +kerning first=321 second=364 amount=-1 +kerning first=1043 second=1091 amount=-1 +kerning first=364 second=338 amount=-1 +kerning first=70 second=296 amount=-1 +kerning first=366 second=101 amount=-1 +kerning first=231 second=8217 amount=-2 +kerning first=213 second=364 amount=-1 +kerning first=330 second=101 amount=-1 +kerning first=277 second=108 amount=-1 +kerning first=290 second=68 amount=-1 +kerning first=207 second=263 amount=-1 +kerning first=66 second=194 amount=-1 +kerning first=364 second=365 amount=-1 +kerning first=84 second=171 amount=-1 +kerning first=211 second=296 amount=-1 +kerning first=229 second=45 amount=-1 +kerning first=120 second=171 amount=-1 +kerning first=362 second=68 amount=-1 +kerning first=279 second=263 amount=-1 +kerning first=67 second=103 amount=-1 +kerning first=1048 second=1039 amount=-1 +kerning first=338 second=330 amount=-1 +kerning first=1053 second=1076 amount=-1 +kerning first=225 second=171 amount=-1 +kerning first=302 second=330 amount=-1 +kerning first=220 second=365 amount=-1 +kerning first=261 second=171 amount=-1 +kerning first=227 second=281 amount=-1 +kerning first=218 second=68 amount=-1 +kerning first=71 second=82 amount=-1 +kerning first=209 second=97 amount=-1 +kerning first=370 second=351 amount=-1 +kerning first=259 second=287 amount=-1 +kerning first=223 second=287 amount=-1 +kerning first=193 second=117 amount=-1 +kerning first=187 second=66 amount=-1 +kerning first=118 second=287 amount=-1 +kerning first=88 second=117 amount=-1 +kerning first=362 second=339 amount=-1 +kerning first=326 second=339 amount=-1 +kerning first=367 second=287 amount=-1 +kerning first=281 second=316 amount=-1 +kerning first=1031 second=1031 amount=-1 +kerning first=305 second=283 amount=-1 +kerning first=330 second=103 amount=-1 +kerning first=69 second=66 amount=-1 +kerning first=353 second=316 amount=-1 +kerning first=218 second=339 amount=-1 +kerning first=368 second=100 amount=-1 +kerning first=296 second=229 amount=-1 +kerning first=84 second=382 amount=-1 +kerning first=368 second=229 amount=-1 +kerning first=196 second=356 amount=-1 +kerning first=344 second=220 amount=-1 +kerning first=199 second=278 amount=-1 +kerning first=1043 second=1118 amount=-1 +kerning first=219 second=281 amount=-1 +kerning first=77 second=68 amount=-1 +kerning first=266 second=330 amount=-1 +kerning first=291 second=281 amount=-1 +kerning first=74 second=311 amount=-1 +kerning first=73 second=333 amount=-1 +kerning first=1044 second=1060 amount=-1 +kerning first=350 second=77 amount=-1 +kerning first=327 second=281 amount=-1 +kerning first=200 second=220 amount=-1 +kerning first=1067 second=1031 amount=-1 +kerning first=316 second=103 amount=-1 +kerning first=278 second=77 amount=-1 +kerning first=97 second=246 amount=-1 +kerning first=272 second=220 amount=-1 +kerning first=244 second=103 amount=-1 +kerning first=250 second=333 amount=-1 +kerning first=201 second=304 amount=-1 +kerning first=323 second=362 amount=-1 +kerning first=1047 second=1065 amount=-1 +kerning first=70 second=269 amount=-1 +kerning first=67 second=298 amount=-1 +kerning first=296 second=246 amount=-1 +kerning first=1047 second=1063 amount=-1 +kerning first=232 second=100 amount=-1 +kerning first=193 second=356 amount=-1 +kerning first=8218 second=230 amount=-1 +kerning first=8249 second=87 amount=-1 +kerning first=330 second=74 amount=-1 +kerning first=224 second=246 amount=-1 +kerning first=304 second=100 amount=-1 +kerning first=366 second=74 amount=-1 +kerning first=219 second=330 amount=-1 +kerning first=214 second=220 amount=-1 +kerning first=241 second=171 amount=-1 +kerning first=268 second=100 amount=-1 +kerning first=1031 second=1117 amount=-1 +kerning first=106 second=269 amount=-1 +kerning first=352 second=298 amount=-1 +kerning first=78 second=103 amount=-1 +kerning first=209 second=77 amount=-1 +kerning first=355 second=269 amount=-1 +kerning first=206 second=333 amount=-1 +kerning first=364 second=109 amount=-1 +kerning first=8222 second=334 amount=-1 +kerning first=209 second=304 amount=-1 +kerning first=298 second=211 amount=-1 +kerning first=283 second=269 amount=-1 +kerning first=101 second=333 amount=-1 +kerning first=262 second=211 amount=-1 +kerning first=1031 second=1096 amount=-1 +kerning first=115 second=289 amount=-1 +kerning first=270 second=65 amount=-1 +kerning first=98 second=382 amount=-1 +kerning first=217 second=365 amount=-1 +kerning first=281 second=8222 amount=-1 +kerning first=68 second=304 amount=-1 +kerning first=85 second=211 amount=-1 +kerning first=80 second=68 amount=-1 +kerning first=253 second=365 amount=-1 +kerning first=314 second=333 amount=-1 +kerning first=187 second=260 amount=-1 +kerning first=252 second=244 amount=-1 +kerning first=207 second=339 amount=-1 +kerning first=117 second=281 amount=-1 +kerning first=264 second=353 amount=-1 +kerning first=197 second=86 amount=-1 +kerning first=279 second=339 amount=-1 +kerning first=277 second=347 amount=-1 +kerning first=338 second=315 amount=-1 +kerning first=220 second=109 amount=-1 +kerning first=1071 second=1074 amount=-1 +kerning first=205 second=347 amount=-1 +kerning first=330 second=281 amount=-1 +kerning first=266 second=315 amount=-1 +kerning first=1043 second=1108 amount=-1 +kerning first=196 second=307 amount=-1 +kerning first=1048 second=1051 amount=-1 +kerning first=366 second=281 amount=-1 +kerning first=302 second=315 amount=-1 +kerning first=346 second=202 amount=-1 +kerning first=1059 second=1083 amount=-1 +kerning first=380 second=8221 amount=-1 +kerning first=282 second=290 amount=-1 +kerning first=1067 second=1117 amount=-1 +kerning first=1049 second=1057 amount=-1 +kerning first=193 second=119 amount=-1 +kerning first=78 second=330 amount=-1 +kerning first=68 second=77 amount=-1 +kerning first=200 second=264 amount=-1 +kerning first=235 second=251 amount=-1 +kerning first=277 second=120 amount=-1 +kerning first=274 second=202 amount=-1 +kerning first=8218 second=242 amount=-1 +kerning first=363 second=103 amount=-1 +kerning first=83 second=219 amount=-1 +kerning first=78 second=76 amount=-1 +kerning first=234 second=8217 amount=-2 +kerning first=228 second=269 amount=-1 +kerning first=264 second=77 amount=-1 +kerning first=1057 second=1118 amount=-1 +kerning first=270 second=8217 amount=-2 +kerning first=78 second=8221 amount=-1 +kerning first=325 second=274 amount=-1 +kerning first=114 second=8221 amount=-1 +kerning first=67 second=271 amount=-1 +kerning first=75 second=212 amount=-1 +kerning first=206 second=345 amount=-1 +kerning first=219 second=8221 amount=-1 +kerning first=217 second=111 amount=-1 +kerning first=315 second=85 amount=-1 +kerning first=291 second=8221 amount=-2 +kerning first=258 second=254 amount=-1 +kerning first=289 second=111 amount=-1 +kerning first=234 second=245 amount=-1 +kerning first=73 second=103 amount=-1 +kerning first=70 second=242 amount=-1 +kerning first=325 second=111 amount=-1 +kerning first=207 second=85 amount=-1 +kerning first=106 second=242 amount=-1 +kerning first=209 second=331 amount=-1 +kerning first=171 second=85 amount=-1 +kerning first=378 second=8217 amount=-1 +kerning first=355 second=242 amount=-1 +kerning first=70 second=279 amount=-1 +kerning first=66 second=85 amount=-1 +kerning first=283 second=242 amount=-1 +kerning first=354 second=263 amount=-1 +kerning first=89 second=195 amount=-1 +kerning first=1071 second=1101 amount=-1 +kerning first=195 second=67 amount=-1 +kerning first=328 second=289 amount=-1 +kerning first=1048 second=1024 amount=-1 +kerning first=315 second=366 amount=-1 +kerning first=194 second=288 amount=-1 +kerning first=264 second=203 amount=-1 +kerning first=1051 second=1095 amount=-1 +kerning first=89 second=288 amount=-1 +kerning first=99 second=335 amount=-1 +kerning first=1055 second=1036 amount=-1 +kerning first=219 second=357 amount=-1 +kerning first=367 second=233 amount=-1 +kerning first=374 second=195 amount=-1 +kerning first=313 second=374 amount=-1 +kerning first=105 second=263 amount=-1 +kerning first=327 second=357 amount=-1 +kerning first=259 second=233 amount=-1 +kerning first=327 second=76 amount=-1 +kerning first=291 second=345 amount=-1 +kerning first=291 second=357 amount=-1 +kerning first=73 second=220 amount=-1 +kerning first=268 second=280 amount=-1 +kerning first=78 second=357 amount=-1 +kerning first=8222 second=214 amount=-1 +kerning first=304 second=280 amount=-1 +kerning first=1049 second=1084 amount=-1 +kerning first=219 second=76 amount=-1 +kerning first=368 second=246 amount=-1 +kerning first=201 second=363 amount=-1 +kerning first=199 second=224 amount=-1 +kerning first=257 second=122 amount=-1 +kerning first=210 second=317 amount=-1 +kerning first=362 second=378 amount=-1 +kerning first=205 second=207 amount=-1 +kerning first=282 second=317 amount=-1 +kerning first=253 second=311 amount=-1 +kerning first=1030 second=1104 amount=-1 +kerning first=221 second=122 amount=-1 +kerning first=284 second=201 amount=-1 +kerning first=289 second=311 amount=-1 +kerning first=80 second=122 amount=-1 +kerning first=99 second=107 amount=-1 +kerning first=212 second=201 amount=-1 +kerning first=1055 second=1072 amount=-1 +kerning first=199 second=269 amount=-1 +kerning first=171 second=366 amount=-1 +kerning first=1046 second=1118 amount=-1 +kerning first=67 second=244 amount=-1 +kerning first=192 second=116 amount=-1 +kerning first=77 second=378 amount=-1 +kerning first=207 second=366 amount=-1 +kerning first=103 second=244 amount=-1 +kerning first=218 second=204 amount=-1 +kerning first=66 second=366 amount=-1 +kerning first=1043 second=1081 amount=-1 +kerning first=213 second=354 amount=-1 +kerning first=8222 second=100 amount=-1 +kerning first=68 second=78 amount=-1 +kerning first=254 second=378 amount=-1 +kerning first=362 second=204 amount=-1 +kerning first=218 second=378 amount=-1 +kerning first=269 second=259 amount=-1 +kerning first=69 second=317 amount=-1 +kerning first=264 second=116 amount=-1 +kerning first=344 second=210 amount=-1 +kerning first=8222 second=307 amount=-1 +kerning first=1044 second=1102 amount=-1 +kerning first=72 second=75 amount=-1 +kerning first=200 second=210 amount=-1 +kerning first=1078 second=1095 amount=-1 +kerning first=220 second=262 amount=-1 +kerning first=1051 second=1049 amount=-1 +kerning first=268 second=73 amount=-1 +kerning first=117 second=335 amount=-1 +kerning first=364 second=262 amount=-1 +kerning first=187 second=206 amount=-1 +kerning first=225 second=345 amount=-1 +kerning first=65 second=213 amount=-1 +kerning first=230 second=369 amount=-1 +kerning first=261 second=345 amount=-1 +kerning first=368 second=219 amount=-1 +kerning first=1027 second=1040 amount=-1 +kerning first=194 second=369 amount=-1 +kerning first=304 second=73 amount=-1 +kerning first=327 second=207 amount=-1 +kerning first=330 second=335 amount=-1 +kerning first=221 second=268 amount=-1 +kerning first=333 second=345 amount=-1 +kerning first=296 second=219 amount=-1 +kerning first=105 second=244 amount=-1 +kerning first=369 second=345 amount=-1 +kerning first=374 second=369 amount=-1 +kerning first=206 second=213 amount=-1 +kerning first=366 second=335 amount=-1 +kerning first=338 second=369 amount=-1 +kerning first=80 second=268 amount=-1 +kerning first=217 second=198 amount=-1 +kerning first=213 second=88 amount=-1 +kerning first=8249 second=86 amount=-1 +kerning first=218 second=231 amount=-1 +kerning first=284 second=368 amount=-1 +kerning first=218 second=351 amount=-1 +kerning first=209 second=277 amount=-1 +kerning first=1030 second=1077 amount=-1 +kerning first=264 second=318 amount=-1 +kerning first=104 second=277 amount=-1 +kerning first=71 second=368 amount=-1 +kerning first=69 second=290 amount=-1 +kerning first=362 second=351 amount=-1 +kerning first=1071 second=1047 amount=-1 +kerning first=77 second=231 amount=-1 +kerning first=268 second=226 amount=-1 +kerning first=325 second=338 amount=-1 +kerning first=212 second=368 amount=-1 +kerning first=201 second=8220 amount=-1 +kerning first=104 second=8249 amount=-1 +kerning first=334 second=200 amount=-1 +kerning first=220 second=82 amount=-1 +kerning first=209 second=8249 amount=-1 +kerning first=198 second=364 amount=-1 +kerning first=217 second=338 amount=-1 +kerning first=1039 second=1031 amount=-1 +kerning first=77 second=351 amount=-1 +kerning first=362 second=231 amount=-1 +kerning first=67 second=217 amount=-1 +kerning first=97 second=283 amount=-1 +kerning first=353 second=8249 amount=-1 +kerning first=1038 second=1089 amount=-1 +kerning first=240 second=8222 amount=-1 +kerning first=253 second=45 amount=-1 +kerning first=214 second=274 amount=-1 +kerning first=289 second=45 amount=-1 +kerning first=207 second=298 amount=-1 +kerning first=197 second=286 amount=-1 +kerning first=1042 second=1068 amount=-1 +kerning first=73 second=274 amount=-1 +kerning first=217 second=171 amount=-2 +kerning first=217 second=45 amount=-2 +kerning first=368 second=192 amount=-1 +kerning first=289 second=171 amount=-1 +kerning first=233 second=113 amount=-1 +kerning first=325 second=45 amount=-1 +kerning first=269 second=113 amount=-1 +kerning first=281 second=104 amount=-1 +kerning first=201 second=70 amount=-1 +kerning first=220 second=235 amount=-1 +kerning first=328 second=235 amount=-1 +kerning first=218 second=315 amount=-1 +kerning first=364 second=235 amount=-1 +kerning first=1060 second=1069 amount=-1 +kerning first=286 second=274 amount=-1 +kerning first=207 second=226 amount=-1 +kerning first=333 second=318 amount=-1 +kerning first=199 second=344 amount=-1 +kerning first=69 second=355 amount=-1 +kerning first=206 second=337 amount=-1 +kerning first=45 second=367 amount=-1 +kerning first=207 second=231 amount=-1 +kerning first=217 second=252 amount=-1 +kerning first=1053 second=1053 amount=-1 +kerning first=87 second=284 amount=-1 +kerning first=1054 second=1059 amount=-1 +kerning first=289 second=252 amount=-1 +kerning first=74 second=80 amount=-1 +kerning first=192 second=284 amount=-1 +kerning first=253 second=252 amount=-1 +kerning first=1030 second=1108 amount=-1 +kerning first=205 second=261 amount=-1 +kerning first=78 second=217 amount=-1 +kerning first=333 second=106 amount=-1 +kerning first=346 second=310 amount=-1 +kerning first=217 second=223 amount=-1 +kerning first=279 second=231 amount=-1 +kerning first=219 second=217 amount=-1 +kerning first=274 second=310 amount=-1 +kerning first=229 second=243 amount=-1 +kerning first=86 second=71 amount=-1 +kerning first=8218 second=311 amount=-1 +kerning first=118 second=353 amount=-1 +kerning first=85 second=81 amount=-1 +kerning first=65 second=45 amount=-1 +kerning first=278 second=45 amount=-1 +kerning first=255 second=249 amount=-1 +kerning first=81 second=221 amount=-1 +kerning first=296 second=332 amount=-1 +kerning first=314 second=45 amount=-1 +kerning first=291 second=249 amount=-1 +kerning first=325 second=330 amount=-1 +kerning first=80 second=214 amount=-1 +kerning first=231 second=235 amount=-1 +kerning first=1044 second=1028 amount=-1 +kerning first=267 second=235 amount=-1 +kerning first=231 second=240 amount=-1 +kerning first=99 second=275 amount=-1 +kerning first=1066 second=1050 amount=-1 +kerning first=323 second=80 amount=-1 +kerning first=267 second=240 amount=-1 +kerning first=211 second=362 amount=-1 +kerning first=1058 second=1040 amount=-1 +kerning first=339 second=235 amount=-1 +kerning first=1030 second=1050 amount=-1 +kerning first=204 second=275 amount=-1 +kerning first=368 second=332 amount=-1 +kerning first=8218 second=84 amount=-1 +kerning first=209 second=223 amount=-1 +kerning first=345 second=97 amount=-1 +kerning first=66 second=338 amount=-1 +kerning first=305 second=232 amount=-1 +kerning first=272 second=323 amount=-1 +kerning first=269 second=232 amount=-1 +kerning first=1053 second=1080 amount=-1 +kerning first=74 second=107 amount=-1 +kerning first=233 second=232 amount=-1 +kerning first=66 second=199 amount=-1 +kerning first=200 second=323 amount=-1 +kerning first=187 second=119 amount=-1 +kerning first=66 second=258 amount=-1 +kerning first=199 second=317 amount=-1 +kerning first=201 second=336 amount=-1 +kerning first=287 second=107 amount=-1 +kerning first=89 second=250 amount=-1 +kerning first=207 second=199 amount=-1 +kerning first=1057 second=1044 amount=-1 +kerning first=364 second=370 amount=-1 +kerning first=187 second=326 amount=-1 +kerning first=260 second=8250 amount=-1 +kerning first=334 second=256 amount=-1 +kerning first=116 second=226 amount=-1 +kerning first=107 second=314 amount=-1 +kerning first=195 second=368 amount=-1 +kerning first=100 second=234 amount=-1 +kerning first=201 second=325 amount=-1 +kerning first=275 second=116 amount=-1 +kerning first=119 second=8250 amount=-1 +kerning first=192 second=311 amount=-1 +kerning first=219 second=249 amount=-1 +kerning first=205 second=234 amount=-1 +kerning first=83 second=8250 amount=-1 +kerning first=1048 second=1105 amount=-1 +kerning first=73 second=331 amount=-1 +kerning first=227 second=233 amount=-1 +kerning first=354 second=122 amount=-1 +kerning first=1105 second=1119 amount=-1 +kerning first=277 second=234 amount=-1 +kerning first=1062 second=1088 amount=-1 +kerning first=248 second=314 amount=-1 +kerning first=72 second=327 amount=-1 +kerning first=241 second=234 amount=-1 +kerning first=221 second=241 amount=-1 +kerning first=199 second=110 amount=-1 +kerning first=327 second=217 amount=-1 +kerning first=213 second=327 amount=-1 +kerning first=263 second=98 amount=-1 +kerning first=231 second=267 amount=-1 +kerning first=278 second=72 amount=-1 +kerning first=80 second=241 amount=-1 +kerning first=8218 second=338 amount=-1 +kerning first=193 second=216 amount=-1 +kerning first=1067 second=1036 amount=-1 +kerning first=1044 second=1094 amount=-1 +kerning first=1031 second=1036 amount=-1 +kerning first=254 second=316 amount=-1 +kerning first=284 second=114 amount=-1 +kerning first=1050 second=1097 amount=-1 +kerning first=1036 second=1114 amount=-1 +kerning first=248 second=114 amount=-1 +kerning first=70 second=101 amount=-1 +kerning first=281 second=250 amount=-1 +kerning first=1041 second=1062 amount=-1 +kerning first=374 second=109 amount=-1 +kerning first=217 second=225 amount=-1 +kerning first=70 second=335 amount=-1 +kerning first=267 second=267 amount=-1 +kerning first=204 second=302 amount=-1 +kerning first=325 second=225 amount=-1 +kerning first=79 second=370 amount=-1 +kerning first=196 second=46 amount=-1 +kerning first=106 second=101 amount=-1 +kerning first=71 second=114 amount=-1 +kerning first=8250 second=192 amount=-1 +kerning first=339 second=267 amount=-1 +kerning first=225 second=318 amount=-1 +kerning first=283 second=335 amount=-1 +kerning first=261 second=318 amount=-1 +kerning first=268 second=46 amount=-1 +kerning first=89 second=290 amount=-1 +kerning first=283 second=101 amount=-1 +kerning first=194 second=81 amount=-1 +kerning first=206 second=353 amount=-1 +kerning first=89 second=81 amount=-1 +kerning first=302 second=81 amount=-1 +kerning first=368 second=78 amount=-1 +kerning first=338 second=81 amount=-1 +kerning first=200 second=296 amount=-1 +kerning first=72 second=273 amount=-1 +kerning first=346 second=364 amount=-1 +kerning first=1068 second=1064 amount=-1 +kerning first=266 second=81 amount=-1 +kerning first=263 second=44 amount=-1 +kerning first=269 second=8222 amount=-1 +kerning first=8218 second=284 amount=-1 +kerning first=86 second=281 amount=-1 +kerning first=1065 second=1098 amount=-1 +kerning first=374 second=81 amount=-1 +kerning first=296 second=78 amount=-1 +kerning first=106 second=44 amount=-1 +kerning first=1041 second=1114 amount=-1 +kerning first=8250 second=332 amount=-1 +kerning first=206 second=72 amount=-1 +kerning first=335 second=44 amount=-1 +kerning first=366 second=227 amount=-1 +kerning first=328 second=291 amount=-1 +kerning first=330 second=227 amount=-1 +kerning first=298 second=346 amount=-1 +kerning first=1048 second=1107 amount=-1 +kerning first=201 second=282 amount=-1 +kerning first=262 second=346 amount=-1 +kerning first=248 second=287 amount=-1 +kerning first=205 second=288 amount=-1 +kerning first=1055 second=1100 amount=-1 +kerning first=67 second=352 amount=-1 +kerning first=85 second=346 amount=-1 +kerning first=281 second=252 amount=-1 +kerning first=199 second=83 amount=-1 +kerning first=1047 second=1119 amount=-1 +kerning first=97 second=337 amount=-1 +kerning first=83 second=278 amount=-1 +kerning first=369 second=291 amount=-1 +kerning first=333 second=291 amount=-1 +kerning first=264 second=230 amount=-1 +kerning first=261 second=291 amount=-1 +kerning first=225 second=291 amount=-1 +kerning first=370 second=346 amount=-1 +kerning first=120 second=291 amount=-1 +kerning first=87 second=230 amount=-1 +kerning first=87 second=257 amount=-1 +kerning first=81 second=200 amount=-1 +kerning first=1047 second=1055 amount=-1 +kerning first=289 second=279 amount=-1 +kerning first=70 second=74 amount=-1 +kerning first=108 second=246 amount=-1 +kerning first=368 second=278 amount=-1 +kerning first=45 second=200 amount=-1 +kerning first=325 second=279 amount=-1 +kerning first=72 second=246 amount=-1 +kerning first=72 second=115 amount=-1 +kerning first=266 second=108 amount=-1 +kerning first=217 second=279 amount=-1 +kerning first=290 second=317 amount=-1 +kerning first=296 second=278 amount=-1 +kerning first=1104 second=1091 amount=-1 +kerning first=352 second=325 amount=-1 +kerning first=70 second=362 amount=-1 +kerning first=8222 second=361 amount=-1 +kerning first=192 second=84 amount=-1 +kerning first=217 second=231 amount=-1 +kerning first=80 second=187 amount=-1 +kerning first=115 second=316 amount=-1 +kerning first=73 second=382 amount=-1 +kerning first=206 second=99 amount=-1 +kerning first=204 second=75 amount=-1 +kerning first=330 second=200 amount=-1 +kerning first=1076 second=1103 amount=-1 +kerning first=101 second=99 amount=-1 +kerning first=213 second=8218 amount=-1 +kerning first=204 second=109 amount=-1 +kerning first=314 second=99 amount=-1 +kerning first=75 second=266 amount=-1 +kerning first=1080 second=1095 amount=-1 +kerning first=187 second=65 amount=-1 +kerning first=72 second=8218 amount=-1 +kerning first=221 second=187 amount=-1 +kerning first=259 second=380 amount=-1 +kerning first=223 second=380 amount=-1 +kerning first=112 second=8220 amount=-2 +kerning first=1041 second=1098 amount=-1 +kerning first=240 second=248 amount=-1 +kerning first=268 second=334 amount=-1 +kerning first=277 second=367 amount=-1 +kerning first=1059 second=1108 amount=-1 +kerning first=213 second=202 amount=-1 +kerning first=196 second=334 amount=-1 +kerning first=86 second=44 amount=-1 +kerning first=270 second=218 amount=-1 +kerning first=212 second=260 amount=-1 +kerning first=230 second=333 amount=-1 +kerning first=362 second=117 amount=-1 +kerning first=323 second=218 amount=-1 +kerning first=289 second=281 amount=-1 +kerning first=198 second=218 amount=-1 +kerning first=204 second=248 amount=-1 +kerning first=304 second=334 amount=-1 +kerning first=99 second=8220 amount=-2 +kerning first=310 second=364 amount=-1 +kerning first=282 second=209 amount=-1 +kerning first=1055 second=1092 amount=-1 +kerning first=274 second=364 amount=-1 +kerning first=258 second=367 amount=-1 +kerning first=80 second=193 amount=-1 +kerning first=67 second=325 amount=-1 +kerning first=210 second=209 amount=-1 +kerning first=366 second=367 amount=-1 +kerning first=202 second=364 amount=-1 +kerning first=288 second=66 amount=-1 +kerning first=264 second=257 amount=-1 +kerning first=194 second=108 amount=-1 +kerning first=1068 second=1042 amount=-1 +kerning first=195 second=121 amount=-1 +kerning first=240 second=8220 amount=-2 +kerning first=200 second=69 amount=-1 +kerning first=230 second=108 amount=-1 +kerning first=69 second=209 amount=-1 +kerning first=187 second=380 amount=-1 +kerning first=224 second=232 amount=-1 +kerning first=338 second=68 amount=-1 +kerning first=68 second=196 amount=-1 +kerning first=45 second=212 amount=-1 +kerning first=272 second=69 amount=-1 +kerning first=1053 second=1107 amount=-1 +kerning first=366 second=69 amount=-1 +kerning first=353 second=8217 amount=-2 +kerning first=255 second=108 amount=-1 +kerning first=80 second=290 amount=-1 +kerning first=330 second=69 amount=-1 +kerning first=288 second=364 amount=-1 +kerning first=70 second=264 amount=-1 +kerning first=83 second=251 amount=-1 +kerning first=119 second=251 amount=-1 +kerning first=221 second=290 amount=-1 +kerning first=208 second=8221 amount=-2 +kerning first=278 second=338 amount=-1 +kerning first=1049 second=1039 amount=-1 +kerning first=234 second=277 amount=-1 +kerning first=368 second=251 amount=-1 +kerning first=245 second=8217 amount=-2 +kerning first=231 second=316 amount=-1 +kerning first=206 second=338 amount=-1 +kerning first=67 second=8221 amount=-1 +kerning first=1058 second=1072 amount=-1 +kerning first=317 second=8217 amount=-1 +kerning first=1051 second=1079 amount=-1 +kerning first=103 second=8221 amount=-2 +kerning first=45 second=69 amount=-1 +kerning first=330 second=286 amount=-1 +kerning first=267 second=316 amount=-1 +kerning first=366 second=286 amount=-1 +kerning first=375 second=316 amount=-1 +kerning first=339 second=316 amount=-1 +kerning first=235 second=273 amount=-1 +kerning first=81 second=69 amount=-1 +kerning first=65 second=338 amount=-1 +kerning first=280 second=8221 amount=-1 +kerning first=199 second=273 amount=-1 +kerning first=84 second=225 amount=-1 +kerning first=316 second=8221 amount=-1 +kerning first=68 second=82 amount=-1 +kerning first=231 second=99 amount=-1 +kerning first=374 second=347 amount=-1 +kerning first=209 second=82 amount=-1 +kerning first=8218 second=225 amount=-1 +kerning first=258 second=286 amount=-1 +kerning first=210 second=78 amount=-1 +kerning first=66 second=117 amount=-1 +kerning first=228 second=171 amount=-1 +kerning first=1048 second=1056 amount=-1 +kerning first=264 second=171 amount=-1 +kerning first=282 second=78 amount=-1 +kerning first=1071 second=1069 amount=-1 +kerning first=1044 second=1086 amount=-1 +kerning first=217 second=333 amount=-1 +kerning first=243 second=114 amount=-1 +kerning first=1058 second=1082 amount=-1 +kerning first=264 second=355 amount=-1 +kerning first=69 second=78 amount=-1 +kerning first=187 second=282 amount=-1 +kerning first=290 second=73 amount=-1 +kerning first=68 second=8217 amount=-2 +kerning first=219 second=325 amount=-1 +kerning first=279 second=117 amount=-1 +kerning first=8250 second=278 amount=-1 +kerning first=204 second=346 amount=-1 +kerning first=356 second=233 amount=-1 +kerning first=87 second=171 amount=-2 +kerning first=192 second=171 amount=-1 +kerning first=327 second=325 amount=-1 +kerning first=325 second=362 amount=-1 +kerning first=87 second=382 amount=-1 +kerning first=203 second=220 amount=-1 +kerning first=80 second=100 amount=-1 +kerning first=278 second=216 amount=-1 +kerning first=280 second=330 amount=-1 +kerning first=327 second=298 amount=-1 +kerning first=228 second=382 amount=-1 +kerning first=67 second=330 amount=-1 +kerning first=307 second=246 amount=-1 +kerning first=198 second=304 amount=-1 +kerning first=264 second=382 amount=-1 +kerning first=266 second=103 amount=-1 +kerning first=271 second=246 amount=-1 +kerning first=80 second=263 amount=-1 +kerning first=230 second=103 amount=-1 +kerning first=235 second=246 amount=-1 +kerning first=270 second=304 amount=-1 +kerning first=111 second=120 amount=-1 +kerning first=221 second=100 amount=-1 +kerning first=199 second=246 amount=-1 +kerning first=364 second=77 amount=-1 +kerning first=307 second=8218 amount=-1 +kerning first=74 second=211 amount=-1 +kerning first=230 second=245 amount=-1 +kerning first=89 second=103 amount=-1 +kerning first=350 second=365 amount=-1 +kerning first=368 second=224 amount=-1 +kerning first=304 second=68 amount=-1 +kerning first=289 second=333 amount=-1 +kerning first=67 second=82 amount=-1 +kerning first=325 second=333 amount=-1 +kerning first=8222 second=366 amount=-1 +kerning first=278 second=365 amount=-1 +kerning first=296 second=224 amount=-1 +kerning first=267 second=289 amount=-1 +kerning first=330 second=313 amount=-1 +kerning first=1043 second=1113 amount=-1 +kerning first=325 second=203 amount=-1 +kerning first=231 second=289 amount=-1 +kerning first=366 second=313 amount=-1 +kerning first=211 second=86 amount=-1 +kerning first=339 second=289 amount=-1 +kerning first=65 second=365 amount=-1 +kerning first=268 second=68 amount=-1 +kerning first=101 second=365 amount=-1 +kerning first=98 second=8250 amount=-1 +kerning first=302 second=347 amount=-1 +kerning first=113 second=8220 amount=-2 +kerning first=233 second=281 amount=-1 +kerning first=1103 second=1095 amount=-1 +kerning first=77 second=85 amount=-1 +kerning first=77 second=8220 amount=-1 +kerning first=269 second=281 amount=-1 +kerning first=87 second=111 amount=-1 +kerning first=218 second=8220 amount=-1 +kerning first=305 second=281 amount=-1 +kerning first=305 second=118 amount=-1 +kerning first=266 second=347 amount=-1 +kerning first=290 second=8220 amount=-1 +kerning first=187 second=255 amount=-1 +kerning first=45 second=313 amount=-1 +kerning first=228 second=111 amount=-1 +kerning first=254 second=8220 amount=-2 +kerning first=289 second=369 amount=-1 +kerning first=81 second=313 amount=-1 +kerning first=323 second=211 amount=-1 +kerning first=264 second=111 amount=-1 +kerning first=362 second=8220 amount=-1 +kerning first=1031 second=1095 amount=-1 +kerning first=89 second=347 amount=-1 +kerning first=326 second=8220 amount=-2 +kerning first=1038 second=1057 amount=-1 +kerning first=1071 second=1042 amount=-1 +kerning first=370 second=233 amount=-1 +kerning first=220 second=77 amount=-1 +kerning first=1049 second=1119 amount=-1 +kerning first=232 second=339 amount=-1 +kerning first=1048 second=1083 amount=-1 +kerning first=78 second=298 amount=-1 +kerning first=205 second=315 amount=-1 +kerning first=219 second=298 amount=-1 +kerning first=304 second=339 amount=-1 +kerning first=71 second=206 amount=-1 +kerning first=268 second=310 amount=-1 +kerning first=8250 second=251 amount=-1 +kerning first=197 second=118 amount=-1 +kerning first=284 second=206 amount=-1 +kerning first=78 second=271 amount=-1 +kerning first=266 second=76 amount=-1 +kerning first=378 second=8249 amount=-1 +kerning first=65 second=284 amount=-1 +kerning first=117 second=232 amount=-1 +kerning first=1059 second=1105 amount=-1 +kerning first=76 second=89 amount=-1 +kerning first=280 second=357 amount=-1 +kerning first=1118 second=1118 amount=-1 +kerning first=366 second=232 amount=-1 +kerning first=219 second=271 amount=-1 +kerning first=330 second=232 amount=-1 +kerning first=233 second=335 amount=-1 +kerning first=327 second=271 amount=-1 +kerning first=264 second=225 amount=-1 +kerning first=323 second=242 amount=-1 +kerning first=1071 second=1054 amount=-1 +kerning first=362 second=85 amount=-1 +kerning first=1043 second=1086 amount=-1 +kerning first=252 second=234 amount=-1 +kerning first=277 second=98 amount=-1 +kerning first=201 second=213 amount=-1 +kerning first=290 second=85 amount=-1 +kerning first=324 second=234 amount=-1 +kerning first=198 second=8249 amount=-1 +kerning first=272 second=8218 amount=-1 +kerning first=330 second=235 amount=-1 +kerning first=86 second=229 amount=-1 +kerning first=375 second=289 amount=-1 +kerning first=368 second=197 amount=-1 +kerning first=221 second=46 amount=-1 +kerning first=1031 second=1068 amount=-1 +kerning first=268 second=366 amount=-1 +kerning first=233 second=101 amount=-1 +kerning first=199 second=68 amount=-1 +kerning first=66 second=280 amount=-1 +kerning first=1078 second=1119 amount=-1 +kerning first=196 second=366 amount=-1 +kerning first=278 second=67 amount=-1 +kerning first=8222 second=314 amount=-1 +kerning first=8218 second=226 amount=-1 +kerning first=80 second=344 amount=-1 +kerning first=206 second=67 amount=-1 +kerning first=103 second=357 amount=-1 +kerning first=65 second=67 amount=-1 +kerning first=234 second=250 amount=-1 +kerning first=67 second=357 amount=-1 +kerning first=207 second=280 amount=-1 +kerning first=203 second=365 amount=-1 +kerning first=1055 second=1077 amount=-1 +kerning first=278 second=284 amount=-1 +kerning first=198 second=250 amount=-1 +kerning first=219 second=195 amount=-1 +kerning first=1042 second=1090 amount=-1 +kerning first=68 second=353 amount=-1 +kerning first=263 second=229 amount=-1 +kerning first=209 second=353 amount=-1 +kerning first=80 second=46 amount=-2 +kerning first=1047 second=1114 amount=-1 +kerning first=330 second=259 amount=-1 +kerning first=259 second=333 amount=-1 +kerning first=281 second=353 amount=-1 +kerning first=302 second=76 amount=-1 +kerning first=206 second=284 amount=-1 +kerning first=338 second=76 amount=-1 +kerning first=288 second=207 amount=-1 +kerning first=370 second=70 amount=-1 +kerning first=366 second=259 amount=-1 +kerning first=325 second=116 amount=-1 +kerning first=289 second=116 amount=-1 +kerning first=195 second=213 amount=-1 +kerning first=65 second=311 amount=-1 +kerning first=1051 second=1071 amount=-1 +kerning first=277 second=369 amount=-1 +kerning first=101 second=311 amount=-1 +kerning first=1064 second=1053 amount=-1 +kerning first=262 second=70 amount=-1 +kerning first=232 second=122 amount=-1 +kerning first=1042 second=1117 amount=-1 +kerning first=78 second=244 amount=-1 +kerning first=298 second=70 amount=-1 +kerning first=268 second=122 amount=-1 +kerning first=334 second=70 amount=-1 +kerning first=187 second=203 amount=-1 +kerning first=229 second=378 amount=-1 +kerning first=219 second=244 amount=-1 +kerning first=316 second=113 amount=-1 +kerning first=66 second=204 amount=-1 +kerning first=8218 second=252 amount=-1 +kerning first=270 second=8222 amount=-1 +kerning first=291 second=244 amount=-1 +kerning first=187 second=201 amount=-1 +kerning first=234 second=8222 amount=-1 +kerning first=327 second=244 amount=-1 +kerning first=103 second=113 amount=-1 +kerning first=212 second=366 amount=-1 +kerning first=217 second=116 amount=-1 +kerning first=198 second=8222 amount=-1 +kerning first=363 second=244 amount=-1 +kerning first=337 second=378 amount=-1 +kerning first=207 second=204 amount=-1 +kerning first=225 second=316 amount=-1 +kerning first=67 second=113 amount=-1 +kerning first=88 second=85 amount=-1 +kerning first=195 second=262 amount=-1 +kerning first=250 second=244 amount=-1 +kerning first=1042 second=1102 amount=-1 +kerning first=108 second=108 amount=-1 +kerning first=362 second=302 amount=-1 +kerning first=1050 second=1102 amount=-1 +kerning first=220 second=71 amount=-1 +kerning first=1055 second=1050 amount=-1 +kerning first=1058 second=1104 amount=-1 +kerning first=290 second=302 amount=-1 +kerning first=1036 second=1038 amount=-1 +kerning first=72 second=332 amount=-1 +kerning first=86 second=256 amount=-1 +kerning first=282 second=268 amount=-1 +kerning first=218 second=302 amount=-1 +kerning first=305 second=335 amount=-1 +kerning first=70 second=210 amount=-1 +kerning first=77 second=302 amount=-1 +kerning first=210 second=278 amount=-1 +kerning first=269 second=335 amount=-1 +kerning first=193 second=107 amount=-1 +kerning first=1047 second=1087 amount=-1 +kerning first=8220 second=347 amount=-1 +kerning first=1039 second=1053 amount=-1 +kerning first=69 second=268 amount=-1 +kerning first=72 second=83 amount=-1 +kerning first=206 second=77 amount=-1 +kerning first=45 second=362 amount=-1 +kerning first=74 second=75 amount=-1 +kerning first=211 second=354 amount=-1 +kerning first=1071 second=1070 amount=-1 +kerning first=210 second=187 amount=-1 +kerning first=246 second=187 amount=-1 +kerning first=89 second=244 amount=-1 +kerning first=370 second=97 amount=-1 +kerning first=45 second=75 amount=-1 +kerning first=213 second=8250 amount=-1 +kerning first=1041 second=1067 amount=-1 +kerning first=230 second=244 amount=-1 +kerning first=258 second=362 amount=-1 +kerning first=8250 second=197 amount=-1 +kerning first=220 second=213 amount=-1 +kerning first=266 second=244 amount=-1 +kerning first=1067 second=1041 amount=-1 +kerning first=87 second=279 amount=-1 +kerning first=302 second=244 amount=-1 +kerning first=72 second=8250 amount=-1 +kerning first=1031 second=1041 amount=-1 +kerning first=227 second=283 amount=-1 +kerning first=86 second=283 amount=-1 +kerning first=374 second=244 amount=-1 +kerning first=83 second=327 amount=-1 +kerning first=205 second=266 amount=-1 +kerning first=364 second=213 amount=-1 +kerning first=105 second=187 amount=-1 +kerning first=264 second=279 amount=-1 +kerning first=8217 second=120 amount=-1 +kerning first=187 second=211 amount=-1 +kerning first=69 second=187 amount=-1 +kerning first=228 second=279 amount=-1 +kerning first=1075 second=1102 amount=-1 +kerning first=80 second=209 amount=-1 +kerning first=116 second=113 amount=-1 +kerning first=296 second=327 amount=-1 +kerning first=195 second=288 amount=-1 +kerning first=362 second=115 amount=-1 +kerning first=368 second=327 amount=-1 +kerning first=1042 second=1036 amount=-1 +kerning first=283 second=367 amount=-1 +kerning first=69 second=371 amount=-1 +kerning first=270 second=196 amount=-1 +kerning first=73 second=79 amount=-1 +kerning first=263 second=283 amount=-1 +kerning first=317 second=218 amount=-1 +kerning first=296 second=110 amount=-1 +kerning first=70 second=367 amount=-1 +kerning first=330 second=205 amount=-1 +kerning first=85 second=70 amount=-1 +kerning first=204 second=270 amount=-1 +kerning first=368 second=110 amount=-1 +kerning first=275 second=335 amount=-1 +kerning first=325 second=257 amount=-1 +kerning first=203 second=274 amount=-1 +kerning first=234 second=380 amount=-1 +kerning first=85 second=317 amount=-1 +kerning first=366 second=205 amount=-1 +kerning first=338 second=296 amount=-1 +kerning first=219 second=367 amount=-1 +kerning first=82 second=114 amount=-1 +kerning first=192 second=252 amount=-1 +kerning first=1049 second=1047 amount=-1 +kerning first=187 second=114 amount=-1 +kerning first=362 second=226 amount=-1 +kerning first=217 second=284 amount=-1 +kerning first=1030 second=1072 amount=-1 +kerning first=118 second=114 amount=-1 +kerning first=367 second=8249 amount=-1 +kerning first=1040 second=1098 amount=-1 +kerning first=45 second=205 amount=-1 +kerning first=81 second=205 amount=-1 +kerning first=232 second=231 amount=-1 +kerning first=268 second=231 amount=-1 +kerning first=194 second=217 amount=-1 +kerning first=304 second=231 amount=-1 +kerning first=266 second=217 amount=-1 +kerning first=69 second=214 amount=-1 +kerning first=69 second=344 amount=-1 +kerning first=302 second=217 amount=-1 +kerning first=210 second=344 amount=-1 +kerning first=338 second=217 amount=-1 +kerning first=87 second=252 amount=-1 +kerning first=282 second=344 amount=-1 +kerning first=118 second=8249 amount=-1 +kerning first=280 second=249 amount=-1 +kerning first=206 second=235 amount=-1 +kerning first=316 second=249 amount=-1 +kerning first=243 second=8218 amount=-1 +kerning first=270 second=353 amount=-1 +kerning first=352 second=249 amount=-1 +kerning first=365 second=248 amount=-1 +kerning first=1052 second=1089 amount=-1 +kerning first=234 second=353 amount=-1 +kerning first=1050 second=1091 amount=-1 +kerning first=103 second=249 amount=-1 +kerning first=200 second=345 amount=-1 +kerning first=75 second=71 amount=-1 +kerning first=229 second=275 amount=-1 +kerning first=366 second=362 amount=-1 +kerning first=204 second=80 amount=-1 +kerning first=330 second=362 amount=-1 +kerning first=344 second=345 amount=-1 +kerning first=262 second=97 amount=-1 +kerning first=99 second=243 amount=-1 +kerning first=298 second=97 amount=-1 +kerning first=231 second=45 amount=-1 +kerning first=77 second=226 amount=-1 +kerning first=325 second=284 amount=-1 +kerning first=296 second=83 amount=-1 +kerning first=198 second=223 amount=-1 +kerning first=377 second=8217 amount=-1 +kerning first=1064 second=1080 amount=-1 +kerning first=72 second=278 amount=-1 +kerning first=8250 second=381 amount=-1 +kerning first=8250 second=366 amount=-1 +kerning first=1028 second=1080 amount=-1 +kerning first=218 second=226 amount=-1 +kerning first=240 second=243 amount=-1 +kerning first=1042 second=1063 amount=-1 +kerning first=77 second=199 amount=-1 +kerning first=104 second=245 amount=-1 +kerning first=1049 second=1079 amount=-1 +kerning first=263 second=337 amount=-1 +kerning first=86 second=120 amount=-1 +kerning first=213 second=278 amount=-1 +kerning first=227 second=337 amount=-1 +kerning first=192 second=107 amount=-1 +kerning first=1078 second=1079 amount=-1 +kerning first=368 second=8218 amount=-2 +kerning first=66 second=361 amount=-1 +kerning first=86 second=337 amount=-1 +kerning first=263 second=120 amount=-1 +kerning first=362 second=199 amount=-1 +kerning first=8250 second=327 amount=-1 +kerning first=119 second=8218 amount=-1 +kerning first=84 second=269 amount=-1 +kerning first=83 second=8218 amount=-1 +kerning first=332 second=8218 amount=-1 +kerning first=281 second=245 amount=-1 +kerning first=98 second=291 amount=-1 +kerning first=80 second=88 amount=-1 +kerning first=261 second=269 amount=-1 +kerning first=209 second=245 amount=-1 +kerning first=193 second=221 amount=-1 +kerning first=1036 second=1092 amount=-1 +kerning first=99 second=324 amount=-1 +kerning first=352 second=330 amount=-1 +kerning first=369 second=269 amount=-1 +kerning first=8250 second=110 amount=-1 +kerning first=258 second=118 amount=-1 +kerning first=217 second=203 amount=-1 +kerning first=70 second=313 amount=-1 +kerning first=275 second=111 amount=-1 +kerning first=337 second=8220 amount=-2 +kerning first=212 second=65 amount=-1 +kerning first=233 second=254 amount=-1 +kerning first=356 second=8222 amount=-1 +kerning first=194 second=374 amount=-1 +kerning first=335 second=120 amount=-1 +kerning first=374 second=337 amount=-1 +kerning first=221 second=263 amount=-1 +kerning first=328 second=267 amount=-1 +kerning first=367 second=114 amount=-1 +kerning first=350 second=8249 amount=-1 +kerning first=257 second=263 amount=-1 +kerning first=364 second=267 amount=-1 +kerning first=1077 second=1094 amount=-1 +kerning first=1064 second=1107 amount=-1 +kerning first=45 second=118 amount=-1 +kerning first=205 second=212 amount=-1 +kerning first=259 second=114 amount=-1 +kerning first=365 second=263 amount=-1 +kerning first=88 second=8220 amount=-1 +kerning first=267 second=314 amount=-1 +kerning first=223 second=114 amount=-1 +kerning first=280 second=264 amount=-1 +kerning first=8217 second=364 amount=-1 +kerning first=220 second=267 amount=-1 +kerning first=288 second=315 amount=-1 +kerning first=193 second=8220 amount=-2 +kerning first=195 second=370 amount=-1 +kerning first=211 second=69 amount=-1 +kerning first=86 second=361 amount=-1 +kerning first=8250 second=354 amount=-1 +kerning first=368 second=273 amount=-1 +kerning first=8220 second=217 amount=-1 +kerning first=8222 second=370 amount=-1 +kerning first=1049 second=1052 amount=-1 +kerning first=219 second=81 amount=-1 +kerning first=296 second=273 amount=-1 +kerning first=78 second=81 amount=-1 +kerning first=108 second=251 amount=-1 +kerning first=70 second=69 amount=-1 +kerning first=86 second=45 amount=-2 +kerning first=218 second=355 amount=-1 +kerning first=327 second=81 amount=-1 +kerning first=75 second=44 amount=-1 +kerning first=84 second=281 amount=-1 +kerning first=66 second=334 amount=-1 +kerning first=275 second=355 amount=-1 +kerning first=209 second=218 amount=-1 +kerning first=8218 second=89 amount=-2 +kerning first=203 second=355 amount=-1 +kerning first=207 second=334 amount=-1 +kerning first=89 second=8217 amount=-1 +kerning first=199 second=78 amount=-1 +kerning first=229 second=248 amount=-1 +kerning first=198 second=72 amount=-1 +kerning first=288 second=44 amount=-1 +kerning first=1054 second=1027 amount=-1 +kerning first=216 second=44 amount=-1 +kerning first=225 second=242 amount=-1 +kerning first=339 second=99 amount=-1 +kerning first=78 second=352 amount=-1 +kerning first=261 second=242 amount=-1 +kerning first=74 second=346 amount=-1 +kerning first=267 second=99 amount=-1 +kerning first=219 second=352 amount=-1 +kerning first=1034 second=1024 amount=-1 +kerning first=217 second=230 amount=-1 +kerning first=1070 second=1024 amount=-1 +kerning first=325 second=230 amount=-1 +kerning first=214 second=187 amount=-1 +kerning first=8222 second=339 amount=-1 +kerning first=71 second=282 amount=-1 +kerning first=323 second=290 amount=-1 +kerning first=264 second=8221 amount=-1 +kerning first=327 second=352 amount=-1 +kerning first=78 second=332 amount=-1 +kerning first=323 second=346 amount=-1 +kerning first=82 second=87 amount=-1 +kerning first=8218 second=333 amount=-1 +kerning first=187 second=87 amount=-2 +kerning first=75 second=288 amount=-1 +kerning first=1031 second=1107 amount=-1 +kerning first=205 second=230 amount=-1 +kerning first=1033 second=1052 amount=-1 +kerning first=264 second=233 amount=-1 +kerning first=262 second=288 amount=-1 +kerning first=298 second=288 amount=-1 +kerning first=8218 second=220 amount=-1 +kerning first=304 second=333 amount=-1 +kerning first=249 second=291 amount=-1 +kerning first=68 second=87 amount=-1 +kerning first=1069 second=1052 amount=-1 +kerning first=199 second=81 amount=-1 +kerning first=1059 second=1046 amount=-1 +kerning first=108 second=291 amount=-1 +kerning first=231 second=224 amount=-1 +kerning first=250 second=337 amount=-1 +kerning first=354 second=8218 amount=-1 +kerning first=86 second=334 amount=-1 +kerning first=1066 second=1061 amount=-1 +kerning first=218 second=227 amount=-1 +kerning first=1034 second=1098 amount=-1 +kerning first=109 second=337 amount=-1 +kerning first=1042 second=1027 amount=-1 +kerning first=73 second=337 amount=-1 +kerning first=85 second=288 amount=-1 +kerning first=81 second=84 amount=-1 +kerning first=77 second=227 amount=-1 +kerning first=78 second=70 amount=-1 +kerning first=45 second=84 amount=-1 +kerning first=1051 second=1119 amount=-1 +kerning first=229 second=99 amount=-1 +kerning first=105 second=8218 amount=-1 +kerning first=269 second=8221 amount=-2 +kerning first=233 second=106 amount=-1 +kerning first=69 second=8218 amount=-1 +kerning first=305 second=8221 amount=-1 +kerning first=1053 second=1064 amount=-1 +kerning first=302 second=111 amount=-1 +kerning first=1047 second=1095 amount=-1 +kerning first=75 second=218 amount=-1 +kerning first=377 second=8221 amount=-1 +kerning first=282 second=8218 amount=-1 +kerning first=246 second=8218 amount=-1 +kerning first=210 second=8218 amount=-1 +kerning first=335 second=187 amount=-1 +kerning first=368 second=196 amount=-1 +kerning first=229 second=279 amount=-1 +kerning first=1044 second=1104 amount=-1 +kerning first=209 second=171 amount=-1 +kerning first=86 second=187 amount=-1 +kerning first=289 second=328 amount=-1 +kerning first=1042 second=1041 amount=-1 +kerning first=296 second=209 amount=-1 +kerning first=205 second=364 amount=-1 +kerning first=258 second=264 amount=-1 +kerning first=264 second=66 amount=-1 +kerning first=195 second=371 amount=-1 +kerning first=199 second=261 amount=-1 +kerning first=197 second=316 amount=-1 +kerning first=67 second=368 amount=-1 +kerning first=267 second=311 amount=-1 +kerning first=323 second=69 amount=-1 +kerning first=226 second=108 amount=-1 +kerning first=272 second=364 amount=-1 +kerning first=262 second=209 amount=-1 +kerning first=269 second=316 amount=-1 +kerning first=83 second=209 amount=-1 +kerning first=192 second=367 amount=-1 +kerning first=1050 second=1073 amount=-1 +kerning first=198 second=202 amount=-1 +kerning first=233 second=316 amount=-1 +kerning first=304 second=257 amount=-1 +kerning first=45 second=264 amount=-1 +kerning first=121 second=108 amount=-1 +kerning first=1052 second=1031 amount=-1 +kerning first=1050 second=1086 amount=-1 +kerning first=268 second=257 amount=-1 +kerning first=270 second=202 amount=-1 +kerning first=201 second=116 amount=-1 +kerning first=280 second=368 amount=-1 +kerning first=264 second=380 amount=-1 +kerning first=1049 second=1027 amount=-1 +kerning first=352 second=368 amount=-1 +kerning first=268 second=270 amount=-1 +kerning first=87 second=367 amount=-1 +kerning first=1031 second=1113 amount=-1 +kerning first=304 second=270 amount=-1 +kerning first=270 second=203 amount=-1 +kerning first=104 second=281 amount=-1 +kerning first=327 second=273 amount=-1 +kerning first=1119 second=1095 amount=-1 +kerning first=313 second=364 amount=-1 +kerning first=74 second=69 amount=-1 +kerning first=368 second=209 amount=-1 +kerning first=1039 second=1034 amount=-1 +kerning first=219 second=273 amount=-1 +kerning first=231 second=44 amount=-1 +kerning first=274 second=252 amount=-1 +kerning first=267 second=44 amount=-1 +kerning first=99 second=8249 amount=-1 +kerning first=280 second=355 amount=-1 +kerning first=346 second=252 amount=-1 +kerning first=78 second=273 amount=-1 +kerning first=362 second=214 amount=-1 +kerning first=310 second=252 amount=-1 +kerning first=375 second=44 amount=-1 +kerning first=212 second=78 amount=-1 +kerning first=87 second=380 amount=-1 +kerning first=80 second=205 amount=-1 +kerning first=228 second=380 amount=-1 +kerning first=284 second=78 amount=-1 +kerning first=67 second=355 amount=-1 +kerning first=362 second=227 amount=-1 +kerning first=213 second=8221 amount=-2 +kerning first=1071 second=1076 amount=-1 +kerning first=235 second=248 amount=-1 +kerning first=1047 second=1082 amount=-1 +kerning first=266 second=325 amount=-1 +kerning first=77 second=214 amount=-1 +kerning first=199 second=248 amount=-1 +kerning first=1033 second=1039 amount=-1 +kerning first=8218 second=233 amount=-1 +kerning first=70 second=346 amount=-1 +kerning first=307 second=248 amount=-1 +kerning first=338 second=325 amount=-1 +kerning first=71 second=78 amount=-1 +kerning first=271 second=248 amount=-1 +kerning first=67 second=224 amount=-1 +kerning first=317 second=87 amount=-1 +kerning first=202 second=252 amount=-1 +kerning first=218 second=214 amount=-1 +kerning first=187 second=357 amount=-1 +kerning first=283 second=333 amount=-1 +kerning first=86 second=347 amount=-1 +kerning first=85 second=352 amount=-1 +kerning first=192 second=220 amount=-1 +kerning first=1056 second=1042 amount=-1 +kerning first=1031 second=1092 amount=-1 +kerning first=1044 second=1117 amount=-1 +kerning first=73 second=350 amount=-1 +kerning first=8250 second=317 amount=-1 +kerning first=365 second=339 amount=-1 +kerning first=1066 second=1048 amount=-1 +kerning first=8217 second=334 amount=-1 +kerning first=199 second=382 amount=-1 +kerning first=101 second=289 amount=-1 +kerning first=1030 second=1048 amount=-1 +kerning first=355 second=333 amount=-1 +kerning first=235 second=382 amount=-1 +kerning first=242 second=289 amount=-1 +kerning first=304 second=103 amount=-1 +kerning first=99 second=171 amount=-1 +kerning first=368 second=330 amount=-1 +kerning first=268 second=103 amount=-1 +kerning first=264 second=246 amount=-1 +kerning first=209 second=100 amount=-1 +kerning first=314 second=289 amount=-1 +kerning first=232 second=103 amount=-1 +kerning first=228 second=246 amount=-1 +kerning first=8222 second=332 amount=-1 +kerning first=281 second=100 amount=-1 +kerning first=72 second=270 amount=-1 +kerning first=264 second=220 amount=-1 +kerning first=70 second=333 amount=-1 +kerning first=304 second=77 amount=-1 +kerning first=368 second=201 amount=-1 +kerning first=106 second=333 amount=-1 +kerning first=87 second=246 amount=-1 +kerning first=350 second=82 amount=-1 +kerning first=8222 second=378 amount=-1 +kerning first=1056 second=1068 amount=-1 +kerning first=296 second=330 amount=-1 +kerning first=268 second=77 amount=-1 +kerning first=67 second=273 amount=-1 +kerning first=274 second=85 amount=-1 +kerning first=275 second=333 amount=-1 +kerning first=266 second=338 amount=-1 +kerning first=202 second=85 amount=-1 +kerning first=213 second=304 amount=-1 +kerning first=194 second=338 amount=-1 +kerning first=271 second=8249 amount=-1 +kerning first=374 second=8217 amount=-1 +kerning first=246 second=120 amount=-1 +kerning first=89 second=338 amount=-1 +kerning first=195 second=211 amount=-1 +kerning first=72 second=304 amount=-1 +kerning first=282 second=313 amount=-1 +kerning first=220 second=332 amount=-1 +kerning first=271 second=382 amount=-1 +kerning first=1039 second=1065 amount=-1 +kerning first=187 second=364 amount=-1 +kerning first=221 second=339 amount=-1 +kerning first=203 second=298 amount=-1 +kerning first=1042 second=1025 amount=-1 +kerning first=242 second=8221 amount=-2 +kerning first=364 second=332 amount=-1 +kerning first=80 second=339 amount=-1 +kerning first=193 second=86 amount=-1 +kerning first=206 second=109 amount=-1 +kerning first=263 second=347 amount=-1 +kerning first=1030 second=1074 amount=-1 +kerning first=210 second=313 amount=-1 +kerning first=366 second=264 amount=-1 +kerning first=197 second=290 amount=-1 +kerning first=330 second=264 amount=-1 +kerning first=116 second=339 amount=-1 +kerning first=249 second=111 amount=-1 +kerning first=363 second=45 amount=-1 +kerning first=287 second=357 amount=-1 +kerning first=8222 second=231 amount=-1 +kerning first=1027 second=1083 amount=-1 +kerning first=256 second=8250 amount=-1 +kerning first=281 second=254 amount=-1 +kerning first=220 second=8250 amount=-2 +kerning first=69 second=313 amount=-1 +kerning first=323 second=357 amount=-1 +kerning first=73 second=203 amount=-1 +kerning first=187 second=323 amount=-1 +kerning first=79 second=8250 amount=-1 +kerning first=74 second=357 amount=-1 +kerning first=356 second=271 amount=-1 +kerning first=1071 second=1118 amount=-1 +kerning first=205 second=76 amount=-1 +kerning first=201 second=219 amount=-1 +kerning first=230 second=8217 amount=-2 +kerning first=217 second=315 amount=-1 +kerning first=266 second=8217 amount=-1 +kerning first=338 second=8217 amount=-1 +kerning first=74 second=262 amount=-1 +kerning first=217 second=97 amount=-1 +kerning first=108 second=111 amount=-1 +kerning first=235 second=363 amount=-1 +kerning first=346 second=85 amount=-1 +kerning first=99 second=104 amount=-1 +kerning first=194 second=8217 amount=-2 +kerning first=220 second=73 amount=-1 +kerning first=8218 second=367 amount=-1 +kerning first=325 second=315 amount=-1 +kerning first=70 second=212 amount=-1 +kerning first=77 second=330 amount=-1 +kerning first=68 second=280 amount=-1 +kerning first=101 second=263 amount=-1 +kerning first=8222 second=103 amount=-1 +kerning first=71 second=366 amount=-1 +kerning first=206 second=263 amount=-1 +kerning first=205 second=204 amount=-1 +kerning first=45 second=110 amount=-1 +kerning first=204 second=331 amount=-1 +kerning first=85 second=366 amount=-1 +kerning first=209 second=280 amount=-1 +kerning first=314 second=263 amount=-1 +kerning first=304 second=347 amount=-1 +kerning first=262 second=314 amount=-1 +kerning first=195 second=316 amount=-1 +kerning first=220 second=66 amount=-1 +kerning first=221 second=365 amount=-1 +kerning first=226 second=314 amount=-1 +kerning first=286 second=203 amount=-1 +kerning first=1071 second=1055 amount=-1 +kerning first=356 second=8249 amount=-1 +kerning first=327 second=8221 amount=-1 +kerning first=366 second=110 amount=-1 +kerning first=84 second=229 amount=-1 +kerning first=330 second=110 amount=-1 +kerning first=67 second=67 amount=-1 +kerning first=101 second=291 amount=-1 +kerning first=214 second=203 amount=-1 +kerning first=284 second=366 amount=-1 +kerning first=339 second=250 amount=-1 +kerning first=78 second=67 amount=-1 +kerning first=1047 second=1024 amount=-1 +kerning first=278 second=70 amount=-1 +kerning first=84 second=101 amount=-1 +kerning first=267 second=250 amount=-1 +kerning first=76 second=354 amount=-1 +kerning first=231 second=250 amount=-1 +kerning first=8222 second=290 amount=-1 +kerning first=350 second=70 amount=-1 +kerning first=8217 second=115 amount=-1 +kerning first=304 second=378 amount=-1 +kerning first=261 second=101 amount=-1 +kerning first=263 second=46 amount=-1 +kerning first=268 second=378 amount=-1 +kerning first=288 second=76 amount=-1 +kerning first=225 second=101 amount=-1 +kerning first=375 second=250 amount=-1 +kerning first=232 second=378 amount=-1 +kerning first=206 second=70 amount=-1 +kerning first=78 second=8217 amount=-1 +kerning first=114 second=8217 amount=-1 +kerning first=325 second=325 amount=-1 +kerning first=262 second=262 amount=-1 +kerning first=344 second=366 amount=-1 +kerning first=1039 second=1030 amount=-1 +kerning first=369 second=101 amount=-1 +kerning first=219 second=8217 amount=-1 +kerning first=1041 second=1087 amount=-1 +kerning first=195 second=250 amount=-1 +kerning first=304 second=296 amount=-1 +kerning first=352 second=367 amount=-1 +kerning first=1059 second=1072 amount=-1 +kerning first=207 second=201 amount=-1 +kerning first=298 second=262 amount=-1 +kerning first=268 second=296 amount=-1 +kerning first=45 second=375 amount=-1 +kerning first=370 second=262 amount=-1 +kerning first=73 second=45 amount=-1 +kerning first=99 second=249 amount=-1 +kerning first=45 second=354 amount=-1 +kerning first=8218 second=246 amount=-1 +kerning first=66 second=201 amount=-1 +kerning first=246 second=291 amount=-1 +kerning first=220 second=345 amount=-1 +kerning first=235 second=369 amount=-1 +kerning first=87 second=259 amount=-1 +kerning first=204 second=113 amount=-1 +kerning first=207 second=116 amount=-1 +kerning first=364 second=280 amount=-1 +kerning first=70 second=207 amount=-1 +kerning first=221 second=8250 amount=-1 +kerning first=1071 second=1105 amount=-1 +kerning first=338 second=204 amount=-1 +kerning first=1043 second=1084 amount=-1 +kerning first=328 second=345 amount=-1 +kerning first=302 second=204 amount=-1 +kerning first=364 second=345 amount=-1 +kerning first=266 second=204 amount=-1 +kerning first=264 second=259 amount=-1 +kerning first=118 second=103 amount=-1 +kerning first=307 second=287 amount=-1 +kerning first=204 second=210 amount=-1 +kerning first=230 second=345 amount=-1 +kerning first=271 second=287 amount=-1 +kerning first=278 second=274 amount=-1 +kerning first=281 second=113 amount=-1 +kerning first=264 second=207 amount=-1 +kerning first=235 second=287 amount=-1 +kerning first=72 second=317 amount=-1 +kerning first=82 second=336 amount=-1 +kerning first=209 second=113 amount=-1 +kerning first=219 second=67 amount=-1 +kerning first=201 second=366 amount=-1 +kerning first=213 second=317 amount=-1 +kerning first=187 second=336 amount=-1 +kerning first=104 second=113 amount=-1 +kerning first=364 second=8250 amount=-2 +kerning first=66 second=116 amount=-1 +kerning first=76 second=8220 amount=-1 +kerning first=218 second=73 amount=-1 +kerning first=232 second=244 amount=-1 +kerning first=369 second=281 amount=-1 +kerning first=1047 second=1056 amount=-1 +kerning first=1089 second=1103 amount=-1 +kerning first=268 second=244 amount=-1 +kerning first=269 second=97 amount=-1 +kerning first=304 second=244 amount=-1 +kerning first=362 second=73 amount=-1 +kerning first=274 second=278 amount=-1 +kerning first=325 second=8220 amount=-1 +kerning first=8217 second=216 amount=-1 +kerning first=86 second=213 amount=-1 +kerning first=289 second=8220 amount=-2 +kerning first=202 second=278 amount=-1 +kerning first=88 second=216 amount=-1 +kerning first=272 second=88 amount=-1 +kerning first=117 second=277 amount=-1 +kerning first=1050 second=1060 amount=-1 +kerning first=206 second=209 amount=-1 +kerning first=346 second=278 amount=-1 +kerning first=366 second=277 amount=-1 +kerning first=77 second=73 amount=-1 +kerning first=330 second=277 amount=-1 +kerning first=100 second=269 amount=-1 +kerning first=199 second=235 amount=-1 +kerning first=225 second=281 amount=-1 +kerning first=80 second=77 amount=-1 +kerning first=235 second=235 amount=-1 +kerning first=261 second=281 amount=-1 +kerning first=74 second=82 amount=-1 +kerning first=1056 second=1081 amount=-1 +kerning first=241 second=269 amount=-1 +kerning first=305 second=45 amount=-1 +kerning first=277 second=269 amount=-1 +kerning first=279 second=283 amount=-1 +kerning first=203 second=79 amount=-1 +kerning first=205 second=269 amount=-1 +kerning first=344 second=219 amount=-1 +kerning first=257 second=231 amount=-1 +kerning first=207 second=283 amount=-1 +kerning first=205 second=338 amount=-1 +kerning first=330 second=290 amount=-1 +kerning first=323 second=82 amount=-1 +kerning first=1047 second=1038 amount=-2 +kerning first=327 second=286 amount=-1 +kerning first=366 second=290 amount=-1 +kerning first=289 second=113 amount=-1 +kerning first=365 second=231 amount=-1 +kerning first=1053 second=1025 amount=-1 +kerning first=1056 second=1094 amount=-1 +kerning first=210 second=274 amount=-1 +kerning first=78 second=286 amount=-1 +kerning first=45 second=382 amount=-1 +kerning first=277 second=351 amount=-1 +kerning first=330 second=378 amount=-1 +kerning first=204 second=85 amount=-1 +kerning first=219 second=286 amount=-1 +kerning first=1059 second=1085 amount=-1 +kerning first=205 second=351 amount=-1 +kerning first=69 second=274 amount=-1 +kerning first=45 second=290 amount=-1 +kerning first=362 second=382 amount=-1 +kerning first=85 second=275 amount=-1 +kerning first=253 second=367 amount=-1 +kerning first=201 second=310 amount=-1 +kerning first=86 second=115 amount=-1 +kerning first=225 second=114 amount=-1 +kerning first=217 second=367 amount=-1 +kerning first=333 second=114 amount=-1 +kerning first=219 second=80 amount=-1 +kerning first=275 second=104 amount=-1 +kerning first=289 second=367 amount=-1 +kerning first=70 second=251 amount=-1 +kerning first=205 second=217 amount=-1 +kerning first=203 second=66 amount=-1 +kerning first=213 second=8222 amount=-1 +kerning first=327 second=80 amount=-1 +kerning first=270 second=310 amount=-1 +kerning first=80 second=231 amount=-1 +kerning first=69 second=205 amount=-1 +kerning first=116 second=231 amount=-1 +kerning first=283 second=251 amount=-1 +kerning first=209 second=213 amount=-1 +kerning first=198 second=310 amount=-1 +kerning first=65 second=121 amount=-1 +kerning first=221 second=231 amount=-1 +kerning first=8220 second=220 amount=-1 +kerning first=354 second=339 amount=-1 +kerning first=82 second=284 amount=-1 +kerning first=263 second=115 amount=-1 +kerning first=1071 second=1034 amount=-1 +kerning first=282 second=205 amount=-1 +kerning first=78 second=80 amount=-1 +kerning first=187 second=284 amount=-1 +kerning first=210 second=205 amount=-1 +kerning first=1049 second=1053 amount=-1 +kerning first=270 second=362 amount=-1 +kerning first=271 second=235 amount=-1 +kerning first=73 second=242 amount=-1 +kerning first=207 second=214 amount=-1 +kerning first=366 second=71 amount=-1 +kerning first=330 second=71 amount=-1 +kerning first=88 second=266 amount=-1 +kerning first=207 second=75 amount=-1 +kerning first=193 second=266 amount=-1 +kerning first=109 second=242 amount=-1 +kerning first=230 second=106 amount=-1 +kerning first=284 second=46 amount=-1 +kerning first=370 second=275 amount=-1 +kerning first=286 second=310 amount=-1 +kerning first=45 second=71 amount=-1 +kerning first=70 second=45 amount=-2 +kerning first=108 second=252 amount=-1 +kerning first=106 second=45 amount=-1 +kerning first=262 second=275 amount=-1 +kerning first=287 second=249 amount=-1 +kerning first=66 second=214 amount=-1 +kerning first=226 second=275 amount=-1 +kerning first=258 second=71 amount=-1 +kerning first=98 second=8218 amount=-1 +kerning first=355 second=45 amount=-1 +kerning first=198 second=362 amount=-1 +kerning first=8218 second=259 amount=-1 +kerning first=298 second=275 amount=-1 +kerning first=272 second=315 amount=-1 +kerning first=325 second=302 amount=-1 +kerning first=84 second=337 amount=-1 +kerning first=368 second=313 amount=-1 +kerning first=99 second=223 amount=-1 +kerning first=1068 second=1045 amount=-1 +kerning first=204 second=99 amount=-1 +kerning first=78 second=234 amount=-1 +kerning first=218 second=361 amount=-1 +kerning first=219 second=234 amount=-1 +kerning first=281 second=267 amount=-1 +kerning first=193 second=87 amount=-1 +kerning first=1102 second=1113 amount=-1 +kerning first=1034 second=1046 amount=-1 +kerning first=289 second=233 amount=-1 +kerning first=291 second=234 amount=-1 +kerning first=1070 second=1046 amount=-1 +kerning first=97 second=291 amount=-1 +kerning first=325 second=233 amount=-1 +kerning first=366 second=346 amount=-1 +kerning first=85 second=327 amount=-1 +kerning first=118 second=117 amount=-1 +kerning first=362 second=361 amount=-1 +kerning first=206 second=122 amount=-1 +kerning first=1068 second=1037 amount=-1 +kerning first=214 second=72 amount=-1 +kerning first=324 second=243 amount=-1 +kerning first=369 second=337 amount=-1 +kerning first=1076 second=1080 amount=-1 +kerning first=262 second=327 amount=-1 +kerning first=330 second=357 amount=-1 +kerning first=220 second=224 amount=-1 +kerning first=298 second=327 amount=-1 +kerning first=280 second=204 amount=-1 +kerning first=261 second=337 amount=-1 +kerning first=80 second=352 amount=-1 +kerning first=334 second=327 amount=-1 +kerning first=225 second=337 amount=-1 +kerning first=197 second=8221 amount=-2 +kerning first=212 second=258 amount=-1 +kerning first=72 second=298 amount=-1 +kerning first=233 second=8221 amount=-2 +kerning first=243 second=287 amount=-1 +kerning first=364 second=224 amount=-1 +kerning first=8218 second=380 amount=-1 +kerning first=1044 second=1076 amount=-1 +kerning first=1071 second=1036 amount=-1 +kerning first=268 second=107 amount=-1 +kerning first=366 second=225 amount=-1 +kerning first=202 second=72 amount=-1 +kerning first=330 second=225 amount=-1 +kerning first=1068 second=1044 amount=-1 +kerning first=74 second=370 amount=-1 +kerning first=193 second=318 amount=-1 +kerning first=229 second=318 amount=-1 +kerning first=220 second=211 amount=-1 +kerning first=335 second=46 amount=-1 +kerning first=8250 second=209 amount=-1 +kerning first=346 second=72 amount=-1 +kerning first=104 second=267 amount=-1 +kerning first=1058 second=1071 amount=-1 +kerning first=204 second=344 amount=-1 +kerning first=327 second=234 amount=-1 +kerning first=86 second=113 amount=-1 +kerning first=1031 second=1055 amount=-1 +kerning first=337 second=318 amount=-1 +kerning first=192 second=105 amount=-1 +kerning first=274 second=72 amount=-1 +kerning first=209 second=267 amount=-1 +kerning first=8222 second=244 amount=-1 +kerning first=70 second=199 amount=-1 +kerning first=369 second=114 amount=-1 +kerning first=323 second=370 amount=-1 +kerning first=366 second=199 amount=-1 +kerning first=193 second=361 amount=-1 +kerning first=368 second=111 amount=-1 +kerning first=344 second=212 amount=-1 +kerning first=269 second=311 amount=-1 +kerning first=8220 second=364 amount=-1 +kerning first=1039 second=1086 amount=-1 +kerning first=370 second=264 amount=-1 +kerning first=192 second=118 amount=-1 +kerning first=45 second=270 amount=-1 +kerning first=200 second=212 amount=-1 +kerning first=1052 second=1083 amount=-1 +kerning first=85 second=206 amount=-1 +kerning first=234 second=267 amount=-1 +kerning first=220 second=225 amount=-1 +kerning first=334 second=206 amount=-1 +kerning first=205 second=115 amount=-1 +kerning first=370 second=206 amount=-1 +kerning first=197 second=368 amount=-1 +kerning first=1108 second=1095 amount=-1 +kerning first=262 second=206 amount=-1 +kerning first=283 second=114 amount=-1 +kerning first=277 second=115 amount=-1 +kerning first=298 second=206 amount=-1 +kerning first=224 second=111 amount=-1 +kerning first=8216 second=193 amount=-2 +kerning first=325 second=220 amount=-1 +kerning first=296 second=111 amount=-1 +kerning first=1072 second=1095 amount=-1 +kerning first=362 second=284 amount=-1 +kerning first=70 second=114 amount=-1 +kerning first=1071 second=1079 amount=-1 +kerning first=368 second=81 amount=-1 +kerning first=85 second=370 amount=-1 +kerning first=284 second=310 amount=-1 +kerning first=289 second=263 amount=-1 +kerning first=296 second=81 amount=-1 +kerning first=325 second=263 amount=-1 +kerning first=212 second=310 amount=-1 +kerning first=88 second=8249 amount=-1 +kerning first=210 second=68 amount=-1 +kerning first=262 second=370 amount=-1 +kerning first=1053 second=1095 amount=-1 +kerning first=71 second=310 amount=-1 +kerning first=282 second=68 amount=-1 +kerning first=69 second=365 amount=-1 +kerning first=229 second=8249 amount=-1 +kerning first=45 second=199 amount=-1 +kerning first=316 second=106 amount=-1 +kerning first=370 second=370 amount=-1 +kerning first=203 second=203 amount=-1 +kerning first=278 second=330 amount=-1 +kerning first=298 second=370 amount=-1 +kerning first=334 second=370 amount=-1 +kerning first=315 second=374 amount=-1 +kerning first=258 second=199 amount=-1 +kerning first=244 second=106 amount=-1 +kerning first=1118 second=1101 amount=-1 +kerning first=330 second=199 amount=-1 +kerning first=217 second=263 amount=-1 +kerning first=71 second=327 amount=-1 +kerning first=346 second=8222 amount=-1 +kerning first=204 second=223 amount=-1 +kerning first=212 second=327 amount=-1 +kerning first=89 second=230 amount=-1 +kerning first=77 second=204 amount=-1 +kerning first=286 second=317 amount=-1 +kerning first=202 second=8222 amount=-1 +kerning first=8222 second=227 amount=-1 +kerning first=8250 second=382 amount=-1 +kerning first=202 second=334 amount=-1 +kerning first=204 second=279 amount=-1 +kerning first=99 second=279 amount=-1 +kerning first=310 second=334 amount=-1 +kerning first=65 second=210 amount=-1 +kerning first=201 second=288 amount=-1 +kerning first=364 second=44 amount=-2 +kerning first=79 second=87 amount=-1 +kerning first=288 second=187 amount=-1 +kerning first=325 second=213 amount=-1 +kerning first=274 second=334 amount=-1 +kerning first=224 second=291 amount=-1 +kerning first=74 second=318 amount=-1 +kerning first=1052 second=1056 amount=-1 +kerning first=1054 second=1045 amount=-1 +kerning first=197 second=84 amount=-1 +kerning first=197 second=221 amount=-1 +kerning first=272 second=75 amount=-1 +kerning first=75 second=187 amount=-1 +kerning first=207 second=270 amount=-1 +kerning first=287 second=318 amount=-1 +kerning first=77 second=99 amount=-1 +kerning first=365 second=101 amount=-1 +kerning first=86 second=279 amount=-1 +kerning first=8222 second=234 amount=-1 +kerning first=268 second=352 amount=-1 +kerning first=200 second=75 amount=-1 +kerning first=367 second=245 amount=-1 +kerning first=304 second=352 amount=-1 +kerning first=1060 second=1027 amount=-1 +kerning first=216 second=187 amount=-1 +kerning first=258 second=303 amount=-1 +kerning first=218 second=99 amount=-1 +kerning first=1042 second=1064 amount=-1 +kerning first=1076 second=1119 amount=-1 +kerning first=211 second=192 amount=-1 +kerning first=259 second=245 amount=-1 +kerning first=111 second=187 amount=-1 +kerning first=275 second=337 amount=-1 +kerning first=1053 second=1067 amount=-1 +kerning first=204 second=230 amount=-1 +kerning first=374 second=230 amount=-1 +kerning first=362 second=99 amount=-1 +kerning first=240 second=279 amount=-1 +kerning first=213 second=196 amount=-1 +kerning first=326 second=99 amount=-1 +kerning first=326 second=287 amount=-1 +kerning first=209 second=332 amount=-1 +kerning first=302 second=230 amount=-1 +kerning first=370 second=271 amount=-1 +kerning first=266 second=230 amount=-1 +kerning first=101 second=235 amount=-1 +kerning first=66 second=73 amount=-1 +kerning first=355 second=277 amount=-1 +kerning first=244 second=316 amount=-1 +kerning first=100 second=8217 amount=-1 +kerning first=68 second=8250 amount=-1 +kerning first=298 second=325 amount=-1 +kerning first=8218 second=118 amount=-1 +kerning first=283 second=277 amount=-1 +kerning first=316 second=316 amount=-1 +kerning first=74 second=108 amount=-1 +kerning first=363 second=281 amount=-1 +kerning first=207 second=73 amount=-1 +kerning first=234 second=104 amount=-1 +kerning first=1039 second=1073 amount=-1 +kerning first=67 second=290 amount=-1 +kerning first=203 second=116 amount=-1 +kerning first=197 second=264 amount=-1 +kerning first=70 second=277 amount=-1 +kerning first=85 second=193 amount=-1 +kerning first=334 second=69 amount=-1 +kerning first=212 second=323 amount=-1 +kerning first=338 second=364 amount=-1 +kerning first=249 second=337 amount=-1 +kerning first=327 second=338 amount=-1 +kerning first=302 second=364 amount=-1 +kerning first=1052 second=1084 amount=-1 +kerning first=266 second=364 amount=-1 +kerning first=370 second=69 amount=-1 +kerning first=71 second=323 amount=-1 +kerning first=67 second=350 amount=-1 +kerning first=241 second=8217 amount=-2 +kerning first=194 second=364 amount=-1 +kerning first=277 second=8217 amount=-2 +kerning first=262 second=69 amount=-1 +kerning first=374 second=273 amount=-1 +kerning first=106 second=277 amount=-1 +kerning first=219 second=338 amount=-1 +kerning first=233 second=355 amount=-1 +kerning first=280 second=286 amount=-1 +kerning first=302 second=273 amount=-1 +kerning first=366 second=187 amount=-2 +kerning first=370 second=193 amount=-1 +kerning first=266 second=273 amount=-1 +kerning first=205 second=325 amount=-1 +kerning first=231 second=113 amount=-1 +kerning first=85 second=69 amount=-1 +kerning first=230 second=273 amount=-1 +kerning first=267 second=113 amount=-1 +kerning first=1052 second=1091 amount=-1 +kerning first=110 second=171 amount=-1 +kerning first=204 second=82 amount=-1 +kerning first=334 second=193 amount=-1 +kerning first=74 second=314 amount=-1 +kerning first=80 second=116 amount=-1 +kerning first=187 second=78 amount=-1 +kerning first=70 second=110 amount=-1 +kerning first=1064 second=1047 amount=-1 +kerning first=287 second=314 amount=-1 +kerning first=1052 second=1070 amount=-1 +kerning first=1036 second=1082 amount=-1 +kerning first=67 second=286 amount=-1 +kerning first=194 second=84 amount=-1 +kerning first=103 second=316 amount=-1 +kerning first=67 second=316 amount=-1 +kerning first=1047 second=1043 amount=-1 +kerning first=366 second=333 amount=-1 +kerning first=234 second=100 amount=-1 +kerning first=207 second=77 amount=-1 +kerning first=321 second=356 amount=-1 +kerning first=8217 second=213 amount=-1 +kerning first=1030 second=1100 amount=-1 +kerning first=317 second=219 amount=-1 +kerning first=112 second=289 amount=-1 +kerning first=1055 second=1048 amount=-1 +kerning first=330 second=333 amount=-1 +kerning first=253 second=289 amount=-1 +kerning first=8218 second=122 amount=-1 +kerning first=241 second=231 amount=-1 +kerning first=109 second=101 amount=-1 +kerning first=122 second=8221 amount=-1 +kerning first=366 second=194 amount=-1 +kerning first=1067 second=1042 amount=-1 +kerning first=73 second=101 amount=-1 +kerning first=66 second=77 amount=-1 +kerning first=289 second=289 amount=-1 +kerning first=213 second=356 amount=-1 +kerning first=69 second=68 amount=-1 +kerning first=251 second=171 amount=-1 +kerning first=1071 second=1049 amount=-1 +kerning first=283 second=281 amount=-1 +kerning first=287 second=171 amount=-1 +kerning first=346 second=304 amount=-1 +kerning first=323 second=171 amount=-1 +kerning first=351 second=103 amount=-1 +kerning first=8249 second=89 amount=-1 +kerning first=355 second=281 amount=-1 +kerning first=275 second=246 amount=-1 +kerning first=74 second=270 amount=-1 +kerning first=279 second=103 amount=-1 +kerning first=76 second=220 amount=-1 +kerning first=72 second=330 amount=-1 +kerning first=202 second=304 amount=-1 +kerning first=243 second=103 amount=-1 +kerning first=80 second=296 amount=-1 +kerning first=217 second=220 amount=-1 +kerning first=213 second=330 amount=-1 +kerning first=207 second=103 amount=-1 +kerning first=79 second=280 amount=-1 +kerning first=230 second=46 amount=-1 +kerning first=220 second=246 amount=-1 +kerning first=274 second=304 amount=-1 +kerning first=78 second=338 amount=-1 +kerning first=201 second=345 amount=-1 +kerning first=1055 second=1074 amount=-1 +kerning first=231 second=109 amount=-1 +kerning first=321 second=85 amount=-1 +kerning first=221 second=8218 amount=-2 +kerning first=1064 second=1051 amount=-1 +kerning first=73 second=298 amount=-1 +kerning first=70 second=281 amount=-1 +kerning first=264 second=315 amount=-1 +kerning first=267 second=109 amount=-1 +kerning first=74 second=277 amount=-1 +kerning first=105 second=339 amount=-1 +kerning first=72 second=85 amount=-1 +kerning first=119 second=382 amount=-1 +kerning first=214 second=298 amount=-1 +kerning first=364 second=211 amount=-1 +kerning first=199 second=313 amount=-1 +kerning first=224 second=382 amount=-1 +kerning first=353 second=8250 amount=-1 +kerning first=286 second=298 amount=-1 +kerning first=1038 second=1040 amount=-1 +kerning first=280 second=290 amount=-1 +kerning first=116 second=8218 amount=-1 +kerning first=80 second=120 amount=-1 +kerning first=296 second=382 amount=-1 +kerning first=281 second=8250 amount=-1 +kerning first=228 second=289 amount=-1 +kerning first=326 second=231 amount=-1 +kerning first=80 second=8218 amount=-2 +kerning first=1068 second=1079 amount=-1 +kerning first=245 second=8250 amount=-1 +kerning first=368 second=382 amount=-1 +kerning first=209 second=8250 amount=-1 +kerning first=224 second=287 amount=-1 +kerning first=1024 second=1095 amount=-1 +kerning first=230 second=234 amount=-1 +kerning first=307 second=339 amount=-1 +kerning first=206 second=302 amount=-1 +kerning first=220 second=83 amount=-1 +kerning first=74 second=210 amount=-1 +kerning first=302 second=234 amount=-1 +kerning first=219 second=263 amount=-1 +kerning first=77 second=101 amount=-1 +kerning first=235 second=107 amount=-1 +kerning first=266 second=234 amount=-1 +kerning first=370 second=232 amount=-1 +kerning first=374 second=234 amount=-1 +kerning first=65 second=8220 amount=-2 +kerning first=88 second=223 amount=-1 +kerning first=8250 second=196 amount=-1 +kerning first=1043 second=1114 amount=-1 +kerning first=284 second=219 amount=-1 +kerning first=235 second=339 amount=-1 +kerning first=199 second=339 amount=-1 +kerning first=101 second=8220 amount=-2 +kerning first=83 second=317 amount=-1 +kerning first=212 second=219 amount=-1 +kerning first=73 second=267 amount=-1 +kerning first=323 second=75 amount=-1 +kerning first=8222 second=283 amount=-1 +kerning first=275 second=311 amount=-1 +kerning first=202 second=330 amount=-1 +kerning first=85 second=232 amount=-1 +kerning first=325 second=122 amount=-1 +kerning first=346 second=219 amount=-1 +kerning first=199 second=107 amount=-1 +kerning first=217 second=122 amount=-1 +kerning first=362 second=103 amount=-1 +kerning first=71 second=219 amount=-1 +kerning first=253 second=122 amount=-1 +kerning first=298 second=232 amount=-1 +kerning first=1078 second=1103 amount=-1 +kerning first=112 second=122 amount=-1 +kerning first=72 second=214 amount=-1 +kerning first=262 second=232 amount=-1 +kerning first=89 second=234 amount=-1 +kerning first=226 second=232 amount=-1 +kerning first=218 second=335 amount=-1 +kerning first=8218 second=79 amount=-1 +kerning first=89 second=269 amount=-1 +kerning first=8250 second=210 amount=-1 +kerning first=1066 second=1065 amount=-1 +kerning first=368 second=85 amount=-1 +kerning first=362 second=335 amount=-1 +kerning first=266 second=269 amount=-1 +kerning first=326 second=335 amount=-1 +kerning first=302 second=269 amount=-1 +kerning first=193 second=45 amount=-1 +kerning first=296 second=85 amount=-1 +kerning first=85 second=65 amount=-1 +kerning first=230 second=269 amount=-1 +kerning first=216 second=46 amount=-1 +kerning first=242 second=8220 amount=-2 +kerning first=73 second=229 amount=-1 +kerning first=1102 second=1083 amount=-1 +kerning first=288 second=46 amount=-1 +kerning first=314 second=8220 amount=-1 +kerning first=210 second=8217 amount=-2 +kerning first=83 second=85 amount=-1 +kerning first=374 second=269 amount=-1 +kerning first=1031 second=1081 amount=-1 +kerning first=350 second=302 amount=-1 +kerning first=1067 second=1081 amount=-1 +kerning first=334 second=65 amount=-1 +kerning first=370 second=65 amount=-1 +kerning first=269 second=225 amount=-1 +kerning first=278 second=302 amount=-1 +kerning first=77 second=335 amount=-1 +kerning first=220 second=250 amount=-1 +kerning first=1042 second=1038 amount=-2 +kerning first=279 second=378 amount=-1 +kerning first=243 second=378 amount=-1 +kerning first=89 second=67 amount=-1 +kerning first=202 second=78 amount=-1 +kerning first=83 second=46 amount=-1 +kerning first=207 second=378 amount=-1 +kerning first=187 second=72 amount=-1 +kerning first=1031 second=1071 amount=-1 +kerning first=364 second=250 amount=-1 +kerning first=1071 second=1075 amount=-1 +kerning first=370 second=366 amount=-1 +kerning first=201 second=262 amount=-1 +kerning first=203 second=207 amount=-1 +kerning first=221 second=192 amount=-1 +kerning first=111 second=46 amount=-1 +kerning first=298 second=366 amount=-1 +kerning first=80 second=192 amount=-1 +kerning first=199 second=274 amount=-1 +kerning first=75 second=46 amount=-1 +kerning first=334 second=366 amount=-1 +kerning first=110 second=345 amount=-1 +kerning first=200 second=216 amount=-1 +kerning first=334 second=330 amount=-1 +kerning first=1060 second=1053 amount=-1 +kerning first=325 second=259 amount=-1 +kerning first=354 second=227 amount=-1 +kerning first=1051 second=1076 amount=-1 +kerning first=366 second=195 amount=-1 +kerning first=344 second=216 amount=-1 +kerning first=1091 second=1117 amount=-1 +kerning first=73 second=246 amount=-1 +kerning first=362 second=201 amount=-1 +kerning first=88 second=357 amount=-1 +kerning first=66 second=378 amount=-1 +kerning first=233 second=251 amount=-1 +kerning first=302 second=338 amount=-1 +kerning first=290 second=201 amount=-1 +kerning first=200 second=251 amount=-1 +kerning first=193 second=357 amount=-1 +kerning first=196 second=116 amount=-1 +kerning first=8250 second=356 amount=-1 +kerning first=218 second=201 amount=-1 +kerning first=220 second=113 amount=-1 +kerning first=77 second=201 amount=-1 +kerning first=217 second=259 amount=-1 +kerning first=219 second=204 amount=-1 +kerning first=72 second=207 amount=-1 +kerning first=304 second=116 amount=-1 +kerning first=281 second=187 amount=-1 +kerning first=224 second=108 amount=-1 +kerning first=187 second=375 amount=-1 +kerning first=78 second=204 amount=-1 +kerning first=232 second=116 amount=-1 +kerning first=1058 second=1108 amount=-1 +kerning first=327 second=204 amount=-1 +kerning first=262 second=366 amount=-1 +kerning first=275 second=242 amount=-1 +kerning first=69 second=369 amount=-1 +kerning first=234 second=271 amount=-1 +kerning first=323 second=210 amount=-1 +kerning first=73 second=268 amount=-1 +kerning first=1101 second=1093 amount=-1 +kerning first=78 second=201 amount=-1 +kerning first=1049 second=1096 amount=-1 +kerning first=328 second=113 amount=-1 +kerning first=1039 second=1047 amount=-1 +kerning first=374 second=67 amount=-1 +kerning first=282 second=369 amount=-1 +kerning first=364 second=113 amount=-1 +kerning first=266 second=67 amount=-1 +kerning first=368 second=317 amount=-1 +kerning first=1054 second=1067 amount=-1 +kerning first=302 second=67 amount=-1 +kerning first=8217 second=243 amount=-1 +kerning first=110 second=279 amount=-1 +kerning first=278 second=371 amount=-1 +kerning first=1091 second=1113 amount=-1 +kerning first=279 second=244 amount=-1 +kerning first=101 second=233 amount=-1 +kerning first=1066 second=1030 amount=-1 +kerning first=350 second=371 amount=-1 +kerning first=330 second=97 amount=-1 +kerning first=74 second=279 amount=-1 +kerning first=366 second=97 amount=-1 +kerning first=287 second=279 amount=-1 +kerning first=80 second=257 amount=-1 +kerning first=1039 second=1079 amount=-1 +kerning first=323 second=279 amount=-1 +kerning first=1051 second=1080 amount=-1 +kerning first=201 second=327 amount=-1 +kerning first=251 second=279 amount=-1 +kerning first=199 second=209 amount=-1 +kerning first=206 second=233 amount=-1 +kerning first=274 second=200 amount=-1 +kerning first=1062 second=1102 amount=-1 +kerning first=70 second=75 amount=-1 +kerning first=362 second=266 amount=-1 +kerning first=277 second=187 amount=-1 +kerning first=202 second=200 amount=-1 +kerning first=314 second=233 amount=-1 +kerning first=75 second=213 amount=-1 +kerning first=65 second=371 amount=-1 +kerning first=218 second=266 amount=-1 +kerning first=354 second=235 amount=-1 +kerning first=81 second=8221 amount=-2 +kerning first=304 second=218 amount=-1 +kerning first=98 second=380 amount=-1 +kerning first=290 second=270 amount=-1 +kerning first=232 second=283 amount=-1 +kerning first=99 second=318 amount=-1 +kerning first=368 second=248 amount=-1 +kerning first=79 second=44 amount=-1 +kerning first=218 second=270 amount=-1 +kerning first=354 second=231 amount=-1 +kerning first=196 second=218 amount=-1 +kerning first=8216 second=65 amount=-2 +kerning first=1054 second=1071 amount=-1 +kerning first=284 second=282 amount=-1 +kerning first=275 second=380 amount=-1 +kerning first=105 second=231 amount=-1 +kerning first=220 second=44 amount=-2 +kerning first=224 second=248 amount=-1 +kerning first=256 second=44 amount=-1 +kerning first=307 second=45 amount=-1 +kerning first=362 second=270 amount=-1 +kerning first=211 second=75 amount=-1 +kerning first=115 second=44 amount=-1 +kerning first=296 second=248 amount=-1 +kerning first=286 second=66 amount=-1 +kerning first=1060 second=1071 amount=-1 +kerning first=264 second=79 amount=-1 +kerning first=269 second=269 amount=-1 +kerning first=8218 second=289 amount=-1 +kerning first=87 second=79 amount=-1 +kerning first=278 second=367 amount=-1 +kerning first=8250 second=85 amount=-1 +kerning first=192 second=79 amount=-1 +kerning first=207 second=244 amount=-1 +kerning first=304 second=283 amount=-1 +kerning first=350 second=367 amount=-1 +kerning first=77 second=270 amount=-1 +kerning first=314 second=367 amount=-1 +kerning first=75 second=217 amount=-1 +kerning first=74 second=344 amount=-1 +kerning first=101 second=367 amount=-1 +kerning first=192 second=354 amount=-1 +kerning first=344 second=114 amount=-1 +kerning first=199 second=205 amount=-1 +kerning first=67 second=80 amount=-1 +kerning first=310 second=8222 amount=-1 +kerning first=87 second=261 amount=-1 +kerning first=71 second=8218 amount=-1 +kerning first=288 second=217 amount=-1 +kerning first=280 second=80 amount=-1 +kerning first=74 second=206 amount=-1 +kerning first=200 second=114 amount=-1 +kerning first=380 second=45 amount=-1 +kerning first=323 second=344 amount=-1 +kerning first=119 second=252 amount=-1 +kerning first=1065 second=1097 amount=-1 +kerning first=83 second=252 amount=-1 +kerning first=80 second=261 amount=-1 +kerning first=1025 second=1095 amount=-1 +kerning first=313 second=89 amount=-1 +kerning first=8222 second=218 amount=-1 +kerning first=45 second=368 amount=-1 +kerning first=212 second=353 amount=-1 +kerning first=8250 second=81 amount=-1 +kerning first=81 second=368 amount=-1 +kerning first=1097 second=1095 amount=-1 +kerning first=187 second=379 amount=-1 +kerning first=204 second=216 amount=-1 +kerning first=356 second=353 amount=-1 +kerning first=195 second=345 amount=-1 +kerning first=231 second=345 amount=-1 +kerning first=323 second=206 amount=-1 +kerning first=267 second=345 amount=-1 +kerning first=330 second=368 amount=-1 +kerning first=77 second=266 amount=-1 +kerning first=117 second=8221 amount=-1 +kerning first=366 second=368 amount=-1 +kerning first=339 second=345 amount=-1 +kerning first=1067 second=1077 amount=-1 +kerning first=1040 second=1054 amount=-1 +kerning first=255 second=106 amount=-1 +kerning first=375 second=345 amount=-1 +kerning first=334 second=302 amount=-1 +kerning first=1031 second=1077 amount=-1 +kerning first=86 second=243 amount=-1 +kerning first=258 second=8221 amount=-2 +kerning first=304 second=214 amount=-1 +kerning first=72 second=226 amount=-1 +kerning first=227 second=243 amount=-1 +kerning first=268 second=214 amount=-1 +kerning first=258 second=368 amount=-1 +kerning first=218 second=197 amount=-1 +kerning first=196 second=214 amount=-1 +kerning first=187 second=310 amount=-1 +kerning first=263 second=243 amount=-1 +kerning first=287 second=275 amount=-1 +kerning first=68 second=362 amount=-1 +kerning first=286 second=46 amount=-1 +kerning first=251 second=275 amount=-1 +kerning first=362 second=197 amount=-1 +kerning first=67 second=315 amount=-1 +kerning first=193 second=223 amount=-1 +kerning first=323 second=275 amount=-1 +kerning first=352 second=80 amount=-1 +kerning first=110 second=275 amount=-1 +kerning first=370 second=327 amount=-1 +kerning first=368 second=252 amount=-1 +kerning first=231 second=120 amount=-1 +kerning first=74 second=275 amount=-1 +kerning first=209 second=362 amount=-1 +kerning first=220 second=288 amount=-1 +kerning first=317 second=362 amount=-1 +kerning first=232 second=8220 amount=-2 +kerning first=1064 second=1086 amount=-1 +kerning first=67 second=71 amount=-1 +kerning first=1053 second=1094 amount=-1 +kerning first=356 second=275 amount=-1 +kerning first=74 second=353 amount=-1 +kerning first=225 second=45 amount=-1 +kerning first=78 second=243 amount=-1 +kerning first=84 second=45 amount=-1 +kerning first=219 second=243 amount=-1 +kerning first=120 second=45 amount=-1 +kerning first=1076 second=1097 amount=-1 +kerning first=291 second=243 amount=-1 +kerning first=1068 second=1036 amount=-1 +kerning first=204 second=214 amount=-1 +kerning first=369 second=45 amount=-1 +kerning first=261 second=45 amount=-1 +kerning first=363 second=243 amount=-1 +kerning first=1070 second=1068 amount=-1 +kerning first=323 second=353 amount=-1 +kerning first=205 second=219 amount=-1 +kerning first=327 second=243 amount=-1 +kerning first=1034 second=1068 amount=-1 +kerning first=284 second=362 amount=-1 +kerning first=201 second=223 amount=-1 +kerning first=205 second=80 amount=-1 +kerning first=1060 second=1062 amount=-1 +kerning first=121 second=318 amount=-1 +kerning first=327 second=248 amount=-1 +kerning first=282 second=67 amount=-1 +kerning first=255 second=365 amount=-1 +kerning first=262 second=318 amount=-1 +kerning first=1051 second=1060 amount=-1 +kerning first=1038 second=1082 amount=-1 +kerning first=264 second=350 amount=-1 +kerning first=232 second=46 amount=-1 +kerning first=334 second=258 amount=-1 +kerning first=1071 second=1027 amount=-1 +kerning first=370 second=258 amount=-1 +kerning first=366 second=234 amount=-1 +kerning first=327 second=262 amount=-1 +kerning first=330 second=234 amount=-1 +kerning first=77 second=257 amount=-1 +kerning first=339 second=8250 amount=-1 +kerning first=269 second=103 amount=-1 +kerning first=296 second=226 amount=-1 +kerning first=71 second=362 amount=-1 +kerning first=323 second=266 amount=-1 +kerning first=212 second=362 amount=-1 +kerning first=368 second=226 amount=-1 +kerning first=1059 second=1076 amount=-1 +kerning first=193 second=249 amount=-1 +kerning first=65 second=79 amount=-1 +kerning first=280 second=71 amount=-1 +kerning first=105 second=283 amount=-1 +kerning first=194 second=361 amount=-1 +kerning first=234 second=232 amount=-1 +kerning first=197 second=81 amount=-1 +kerning first=1038 second=1096 amount=-1 +kerning first=88 second=249 amount=-1 +kerning first=74 second=266 amount=-1 +kerning first=267 second=241 amount=-1 +kerning first=1051 second=1089 amount=-1 +kerning first=231 second=241 amount=-1 +kerning first=316 second=244 amount=-1 +kerning first=235 second=98 amount=-1 +kerning first=288 second=72 amount=-1 +kerning first=259 second=267 amount=-1 +kerning first=1041 second=1096 amount=-1 +kerning first=199 second=98 amount=-1 +kerning first=87 second=216 amount=-1 +kerning first=116 second=275 amount=-1 +kerning first=112 second=345 amount=-1 +kerning first=267 second=328 amount=-1 +kerning first=192 second=216 amount=-1 +kerning first=217 second=8249 amount=-2 +kerning first=231 second=328 amount=-1 +kerning first=279 second=243 amount=-1 +kerning first=217 second=345 amount=-1 +kerning first=171 second=352 amount=-1 +kerning first=80 second=335 amount=-1 +kerning first=119 second=46 amount=-1 +kerning first=253 second=345 amount=-1 +kerning first=207 second=352 amount=-1 +kerning first=330 second=114 amount=-1 +kerning first=289 second=345 amount=-1 +kerning first=203 second=302 amount=-1 +kerning first=89 second=115 amount=-1 +kerning first=85 second=258 amount=-1 +kerning first=325 second=345 amount=-1 +kerning first=116 second=335 amount=-1 +kerning first=275 second=8222 amount=-1 +kerning first=257 second=335 amount=-1 +kerning first=221 second=335 amount=-1 +kerning first=260 second=46 amount=-1 +kerning first=1059 second=1061 amount=-1 +kerning first=368 second=46 amount=-2 +kerning first=258 second=114 amount=-1 +kerning first=201 second=370 amount=-1 +kerning first=45 second=114 amount=-1 +kerning first=290 second=344 amount=-1 +kerning first=374 second=115 amount=-1 +kerning first=87 second=250 amount=-1 +kerning first=117 second=114 amount=-1 +kerning first=197 second=119 amount=-1 +kerning first=362 second=344 amount=-1 +kerning first=271 second=378 amount=-1 +kerning first=70 second=8221 amount=-1 +kerning first=220 second=336 amount=-1 +kerning first=1046 second=1079 amount=-1 +kerning first=230 second=115 amount=-1 +kerning first=1107 second=1114 amount=-1 +kerning first=266 second=115 amount=-1 +kerning first=302 second=115 amount=-1 +kerning first=192 second=250 amount=-1 +kerning first=305 second=119 amount=-1 +kerning first=197 second=199 amount=-1 +kerning first=264 second=216 amount=-1 +kerning first=290 second=82 amount=-1 +kerning first=99 second=314 amount=-1 +kerning first=1067 second=1055 amount=-1 +kerning first=235 second=378 amount=-1 +kerning first=199 second=378 amount=-1 +kerning first=1062 second=1054 amount=-1 +kerning first=77 second=344 amount=-1 +kerning first=1038 second=1105 amount=-1 +kerning first=1057 second=1071 amount=-1 +kerning first=218 second=344 amount=-1 +kerning first=187 second=327 amount=-1 +kerning first=1043 second=1088 amount=-1 +kerning first=274 second=282 amount=-1 +kerning first=1043 second=1101 amount=-1 +kerning first=79 second=204 amount=-1 +kerning first=202 second=282 amount=-1 +kerning first=327 second=206 amount=-1 +kerning first=1070 second=1055 amount=-1 +kerning first=274 second=266 amount=-1 +kerning first=1067 second=1096 amount=-1 +kerning first=226 second=337 amount=-1 +kerning first=204 second=288 amount=-1 +kerning first=195 second=87 amount=-1 +kerning first=263 second=230 amount=-1 +kerning first=307 second=291 amount=-1 +kerning first=271 second=291 amount=-1 +kerning first=72 second=81 amount=-1 +kerning first=119 second=106 amount=-1 +kerning first=235 second=291 amount=-1 +kerning first=86 second=230 amount=-1 +kerning first=1055 second=1052 amount=-1 +kerning first=275 second=101 amount=-1 +kerning first=207 second=279 amount=-1 +kerning first=210 second=296 amount=-1 +kerning first=197 second=212 amount=-1 +kerning first=264 second=337 amount=-1 +kerning first=69 second=296 amount=-1 +kerning first=1048 second=1098 amount=-1 +kerning first=228 second=337 amount=-1 +kerning first=8218 second=374 amount=-2 +kerning first=8250 second=120 amount=-1 +kerning first=279 second=279 amount=-1 +kerning first=1031 second=1064 amount=-1 +kerning first=287 second=244 amount=-1 +kerning first=282 second=296 amount=-1 +kerning first=87 second=337 amount=-1 +kerning first=203 second=75 amount=-1 +kerning first=370 second=245 amount=-1 +kerning first=1067 second=1064 amount=-1 +kerning first=279 second=99 amount=-1 +kerning first=213 second=187 amount=-1 +kerning first=298 second=245 amount=-1 +kerning first=270 second=8250 amount=-1 +kerning first=207 second=99 amount=-1 +kerning first=234 second=8250 amount=-1 +kerning first=226 second=245 amount=-1 +kerning first=268 second=8218 amount=-1 +kerning first=232 second=8218 amount=-1 +kerning first=108 second=287 amount=-1 +kerning first=234 second=233 amount=-1 +kerning first=105 second=375 amount=-1 +kerning first=85 second=245 amount=-1 +kerning first=314 second=380 amount=-1 +kerning first=347 second=8220 amount=-2 +kerning first=71 second=202 amount=-1 +kerning first=116 second=248 amount=-1 +kerning first=70 second=255 amount=-1 +kerning first=311 second=8220 amount=-1 +kerning first=212 second=202 amount=-1 +kerning first=282 second=270 amount=-1 +kerning first=250 second=235 amount=-1 +kerning first=1064 second=1025 amount=-1 +kerning first=221 second=248 amount=-1 +kerning first=201 second=117 amount=-1 +kerning first=249 second=287 amount=-1 +kerning first=205 second=116 amount=-1 +kerning first=100 second=246 amount=-1 +kerning first=209 second=83 amount=-1 +kerning first=72 second=8222 amount=-1 +kerning first=72 second=261 amount=-1 +kerning first=80 second=248 amount=-1 +kerning first=1059 second=1081 amount=-1 +kerning first=350 second=66 amount=-1 +kerning first=327 second=97 amount=-1 +kerning first=346 second=209 amount=-1 +kerning first=219 second=364 amount=-1 +kerning first=69 second=270 amount=-1 +kerning first=298 second=69 amount=-1 +kerning first=99 second=108 amount=-1 +kerning first=278 second=66 amount=-1 +kerning first=1028 second=1073 amount=-1 +kerning first=274 second=209 amount=-1 +kerning first=258 second=307 amount=-1 +kerning first=206 second=66 amount=-1 +kerning first=78 second=364 amount=-1 +kerning first=284 second=202 amount=-1 +kerning first=210 second=270 amount=-1 +kerning first=218 second=257 amount=-1 +kerning first=202 second=209 amount=-1 +kerning first=203 second=8220 amount=-1 +kerning first=1064 second=1073 amount=-1 +kerning first=288 second=278 amount=-1 +kerning first=101 second=380 amount=-1 +kerning first=67 second=264 amount=-1 +kerning first=242 second=380 amount=-1 +kerning first=275 second=8220 amount=-2 +kerning first=206 second=380 amount=-1 +kerning first=8217 second=111 amount=-1 +kerning first=205 second=296 amount=-1 +kerning first=254 second=103 amount=-1 +kerning first=338 second=211 amount=-1 +kerning first=207 second=205 amount=-1 +kerning first=45 second=355 amount=-1 +kerning first=218 second=103 amount=-1 +kerning first=8216 second=366 amount=-1 +kerning first=1058 second=1091 amount=-1 +kerning first=304 second=227 amount=-1 +kerning first=1047 second=1039 amount=-1 +kerning first=268 second=227 amount=-1 +kerning first=201 second=69 amount=-1 +kerning first=288 second=325 amount=-1 +kerning first=77 second=103 amount=-1 +kerning first=277 second=273 amount=-1 +kerning first=74 second=193 amount=-1 +kerning first=274 second=330 amount=-1 +kerning first=356 second=74 amount=-1 +kerning first=75 second=252 amount=-1 +kerning first=327 second=364 amount=-1 +kerning first=346 second=330 amount=-1 +kerning first=78 second=269 amount=-1 +kerning first=291 second=269 amount=-1 +kerning first=366 second=355 amount=-1 +kerning first=199 second=218 amount=-1 +kerning first=270 second=78 amount=-1 +kerning first=1030 second=1047 amount=-1 +kerning first=327 second=269 amount=-1 +kerning first=330 second=355 amount=-1 +kerning first=1091 second=1078 amount=-1 +kerning first=74 second=65 amount=-1 +kerning first=258 second=355 amount=-1 +kerning first=1043 second=1073 amount=-1 +kerning first=287 second=112 amount=-1 +kerning first=1042 second=1116 amount=-1 +kerning first=66 second=205 amount=-1 +kerning first=8218 second=250 amount=-1 +kerning first=350 second=8220 amount=-1 +kerning first=363 second=269 amount=-1 +kerning first=253 second=44 amount=-1 +kerning first=198 second=78 amount=-1 +kerning first=346 second=282 amount=-1 +kerning first=289 second=44 amount=-1 +kerning first=218 second=365 amount=-1 +kerning first=218 second=171 amount=-2 +kerning first=121 second=117 amount=-1 +kerning first=45 second=260 amount=-1 +kerning first=85 second=117 amount=-1 +kerning first=81 second=260 amount=-1 +kerning first=290 second=171 amount=-1 +kerning first=205 second=286 amount=-1 +kerning first=326 second=171 amount=-1 +kerning first=1031 second=1051 amount=-1 +kerning first=274 second=68 amount=-1 +kerning first=1067 second=1051 amount=-1 +kerning first=74 second=249 amount=-1 +kerning first=8250 second=274 amount=-1 +kerning first=84 second=333 amount=-1 +kerning first=346 second=68 amount=-1 +kerning first=269 second=307 amount=-1 +kerning first=70 second=203 amount=-1 +kerning first=199 second=351 amount=-1 +kerning first=339 second=100 amount=-1 +kerning first=65 second=220 amount=-1 +kerning first=366 second=260 amount=-1 +kerning first=1070 second=1042 amount=-1 +kerning first=206 second=220 amount=-1 +kerning first=211 second=203 amount=-1 +kerning first=367 second=281 amount=-1 +kerning first=346 second=82 amount=-1 +kerning first=209 second=263 amount=-1 +kerning first=77 second=171 amount=-1 +kerning first=1039 second=1025 amount=-1 +kerning first=8222 second=248 amount=-1 +kerning first=187 second=121 amount=-1 +kerning first=113 second=171 amount=-1 +kerning first=196 second=8250 amount=-1 +kerning first=105 second=333 amount=-1 +kerning first=281 second=263 amount=-1 +kerning first=250 second=246 amount=-1 +kerning first=1064 second=1060 amount=-1 +kerning first=337 second=103 amount=-1 +kerning first=1027 second=1119 amount=-1 +kerning first=8220 second=256 amount=-2 +kerning first=327 second=353 amount=-1 +kerning first=85 second=102 amount=-1 +kerning first=109 second=246 amount=-1 +kerning first=1067 second=1118 amount=-1 +kerning first=229 second=103 amount=-1 +kerning first=199 second=77 amount=-1 +kerning first=231 second=100 amount=-1 +kerning first=278 second=220 amount=-1 +kerning first=350 second=220 amount=-1 +kerning first=267 second=100 amount=-1 +kerning first=1060 second=1083 amount=-1 +kerning first=264 second=109 amount=-1 +kerning first=87 second=242 amount=-1 +kerning first=230 second=316 amount=-1 +kerning first=290 second=310 amount=-1 +kerning first=194 second=316 amount=-1 +kerning first=196 second=369 amount=-1 +kerning first=261 second=333 amount=-1 +kerning first=202 second=68 amount=-1 +kerning first=199 second=304 amount=-1 +kerning first=266 second=316 amount=-1 +kerning first=367 second=267 amount=-1 +kerning first=264 second=242 amount=-1 +kerning first=362 second=365 amount=-1 +kerning first=102 second=8218 amount=-1 +kerning first=369 second=333 amount=-1 +kerning first=235 second=8222 amount=-1 +kerning first=209 second=211 amount=-1 +kerning first=228 second=242 amount=-1 +kerning first=199 second=8222 amount=-1 +kerning first=214 second=194 amount=-1 +kerning first=347 second=289 amount=-1 +kerning first=268 second=313 amount=-1 +kerning first=1051 second=1094 amount=-1 +kerning first=116 second=233 amount=-1 +kerning first=304 second=313 amount=-1 +kerning first=85 second=210 amount=-1 +kerning first=224 second=339 amount=-1 +kerning first=86 second=111 amount=-1 +kerning first=87 second=109 amount=-1 +kerning first=374 second=256 amount=-1 +kerning first=323 second=8220 amount=-1 +kerning first=8222 second=86 amount=-2 +kerning first=323 second=245 amount=-1 +kerning first=74 second=263 amount=-1 +kerning first=227 second=111 amount=-1 +kerning first=287 second=245 amount=-1 +kerning first=263 second=111 amount=-1 +kerning first=206 second=280 amount=-1 +kerning first=119 second=120 amount=-1 +kerning first=1030 second=1057 amount=-1 +kerning first=278 second=280 amount=-1 +kerning first=231 second=233 amount=-1 +kerning first=350 second=280 amount=-1 +kerning first=296 second=339 amount=-1 +kerning first=187 second=219 amount=-1 +kerning first=71 second=274 amount=-1 +kerning first=103 second=104 amount=-1 +kerning first=339 second=233 amount=-1 +kerning first=368 second=339 amount=-1 +kerning first=368 second=120 amount=-1 +kerning first=1049 second=1118 amount=-1 +kerning first=103 second=277 amount=-1 +kerning first=200 second=298 amount=-1 +kerning first=280 second=212 amount=-1 +kerning first=197 second=8217 amount=-2 +kerning first=272 second=298 amount=-1 +kerning first=233 second=8217 amount=-2 +kerning first=269 second=8217 amount=-2 +kerning first=266 second=102 amount=-1 +kerning first=67 second=212 amount=-1 +kerning first=212 second=8217 amount=-2 +kerning first=345 second=230 amount=-1 +kerning first=362 second=357 amount=-1 +kerning first=281 second=369 amount=-1 +kerning first=220 second=344 amount=-1 +kerning first=251 second=245 amount=-1 +kerning first=1038 second=1104 amount=-1 +kerning first=8250 second=334 amount=-1 +kerning first=298 second=331 amount=-1 +kerning first=98 second=289 amount=-1 +kerning first=311 second=289 amount=-1 +kerning first=110 second=245 amount=-1 +kerning first=370 second=331 amount=-1 +kerning first=74 second=245 amount=-1 +kerning first=85 second=331 amount=-1 +kerning first=305 second=8217 amount=-1 +kerning first=313 second=221 amount=-1 +kerning first=199 second=85 amount=-1 +kerning first=275 second=289 amount=-1 +kerning first=244 second=8221 amount=-2 +kerning first=367 second=113 amount=-1 +kerning first=1052 second=1096 amount=-1 +kerning first=1068 second=1049 amount=-1 +kerning first=323 second=366 amount=-1 +kerning first=1050 second=1095 amount=-1 +kerning first=211 second=195 amount=-1 +kerning first=88 second=116 amount=-1 +kerning first=203 second=216 amount=-1 +kerning first=259 second=113 amount=-1 +kerning first=205 second=67 amount=-1 +kerning first=325 second=79 amount=-1 +kerning first=73 second=8218 amount=-1 +kerning first=65 second=345 amount=-1 +kerning first=8222 second=240 amount=-1 +kerning first=70 second=195 amount=-1 +kerning first=289 second=250 amount=-1 +kerning first=262 second=104 amount=-1 +kerning first=253 second=250 amount=-1 +kerning first=121 second=104 amount=-1 +kerning first=1056 second=1119 amount=-1 +kerning first=221 second=249 amount=-1 +kerning first=207 second=269 amount=-1 +kerning first=364 second=70 amount=-1 +kerning first=218 second=357 amount=-1 +kerning first=8218 second=283 amount=-1 +kerning first=79 second=70 amount=-1 +kerning first=368 second=274 amount=-1 +kerning first=374 second=258 amount=-1 +kerning first=314 second=345 amount=-1 +kerning first=346 second=76 amount=-1 +kerning first=296 second=274 amount=-1 +kerning first=77 second=357 amount=-1 +kerning first=220 second=70 amount=-1 +kerning first=213 second=46 amount=-1 +kerning first=274 second=76 amount=-1 +kerning first=211 second=368 amount=-1 +kerning first=206 second=207 amount=-1 +kerning first=1049 second=1105 amount=-1 +kerning first=250 second=291 amount=-1 +kerning first=106 second=8221 amount=-1 +kerning first=278 second=207 amount=-1 +kerning first=67 second=204 amount=-1 +kerning first=211 second=8221 amount=-2 +kerning first=350 second=207 amount=-1 +kerning first=232 second=107 amount=-1 +kerning first=221 second=243 amount=-1 +kerning first=99 second=382 amount=-1 +kerning first=70 second=368 amount=-1 +kerning first=66 second=197 amount=-1 +kerning first=196 second=107 amount=-1 +kerning first=108 second=369 amount=-1 +kerning first=209 second=271 amount=-1 +kerning first=209 second=336 amount=-1 +kerning first=366 second=8250 amount=-2 +kerning first=1053 second=1086 amount=-1 +kerning first=1065 second=1054 amount=-1 +kerning first=74 second=366 amount=-1 +kerning first=281 second=271 amount=-1 +kerning first=8222 second=117 amount=-1 +kerning first=73 second=259 amount=-1 +kerning first=193 second=116 amount=-1 +kerning first=354 second=378 amount=-1 +kerning first=8217 second=252 amount=-1 +kerning first=370 second=210 amount=-1 +kerning first=89 second=256 amount=-1 +kerning first=262 second=210 amount=-1 +kerning first=298 second=200 amount=-1 +kerning first=364 second=122 amount=-1 +kerning first=298 second=210 amount=-1 +kerning first=246 second=378 amount=-1 +kerning first=196 second=86 amount=-1 +kerning first=8218 second=269 amount=-1 +kerning first=302 second=382 amount=-1 +kerning first=202 second=202 amount=-1 +kerning first=209 second=8220 amount=-1 +kerning first=1059 second=1117 amount=-1 +kerning first=1069 second=1083 amount=-1 +kerning first=8250 second=326 amount=-1 +kerning first=1066 second=1044 amount=-1 +kerning first=80 second=235 amount=-1 +kerning first=223 second=187 amount=-1 +kerning first=362 second=207 amount=-1 +kerning first=116 second=235 amount=-1 +kerning first=266 second=209 amount=-1 +kerning first=368 second=347 amount=-1 +kerning first=221 second=235 amount=-1 +kerning first=275 second=281 amount=-1 +kerning first=70 second=97 amount=-1 +kerning first=296 second=347 amount=-1 +kerning first=257 second=235 amount=-1 +kerning first=200 second=290 amount=-1 +kerning first=68 second=198 amount=-1 +kerning first=217 second=350 amount=-1 +kerning first=77 second=211 amount=-1 +kerning first=250 second=277 amount=-1 +kerning first=1033 second=1056 amount=-1 +kerning first=119 second=347 amount=-1 +kerning first=1069 second=1056 amount=-1 +kerning first=205 second=213 amount=-1 +kerning first=1075 second=1090 amount=-1 +kerning first=70 second=268 amount=-1 +kerning first=8218 second=275 amount=-1 +kerning first=355 second=97 amount=-1 +kerning first=1056 second=1077 amount=-1 +kerning first=80 second=283 amount=-1 +kerning first=327 second=351 amount=-1 +kerning first=116 second=283 amount=-1 +kerning first=291 second=351 amount=-1 +kerning first=199 second=231 amount=-1 +kerning first=255 second=351 amount=-1 +kerning first=200 second=363 amount=-1 +kerning first=235 second=231 amount=-1 +kerning first=219 second=351 amount=-1 +kerning first=271 second=231 amount=-1 +kerning first=8249 second=219 amount=-1 +kerning first=325 second=350 amount=-1 +kerning first=1091 second=1087 amount=-1 +kerning first=214 second=88 amount=-1 +kerning first=1042 second=1081 amount=-1 +kerning first=77 second=244 amount=-1 +kerning first=221 second=257 amount=-1 +kerning first=338 second=67 amount=-1 +kerning first=1054 second=1049 amount=-1 +kerning first=1078 second=1081 amount=-1 +kerning first=121 second=8249 amount=-1 +kerning first=1033 second=1064 amount=-1 +kerning first=365 second=283 amount=-1 +kerning first=217 second=79 amount=-1 +kerning first=218 second=244 amount=-1 +kerning first=257 second=283 amount=-1 +kerning first=201 second=82 amount=-1 +kerning first=226 second=8249 amount=-1 +kerning first=307 second=231 amount=-1 +kerning first=73 second=344 amount=-1 +kerning first=65 second=307 amount=-1 +kerning first=86 second=338 amount=-1 +kerning first=78 second=351 amount=-1 +kerning first=326 second=244 amount=-1 +kerning first=221 second=283 amount=-1 +kerning first=362 second=244 amount=-1 +kerning first=82 second=332 amount=-1 +kerning first=87 second=345 amount=-1 +kerning first=200 second=202 amount=-1 +kerning first=314 second=244 amount=-1 +kerning first=72 second=209 amount=-1 +kerning first=105 second=248 amount=-1 +kerning first=192 second=345 amount=-1 +kerning first=1062 second=1089 amount=-1 +kerning first=330 second=218 amount=-1 +kerning first=228 second=345 amount=-1 +kerning first=271 second=283 amount=-1 +kerning first=1048 second=1076 amount=-1 +kerning first=71 second=44 amount=-1 +kerning first=264 second=345 amount=-1 +kerning first=307 second=283 amount=-1 +kerning first=268 second=235 amount=-1 +kerning first=339 second=369 amount=-1 +kerning first=199 second=283 amount=-1 +kerning first=187 second=332 amount=-1 +kerning first=220 second=371 amount=-1 +kerning first=304 second=235 amount=-1 +kerning first=235 second=283 amount=-1 +kerning first=274 second=274 amount=-1 +kerning first=203 second=367 amount=-1 +kerning first=207 second=257 amount=-1 +kerning first=112 second=380 amount=-1 +kerning first=1051 second=1067 amount=-1 +kerning first=202 second=274 amount=-1 +kerning first=275 second=367 amount=-1 +kerning first=108 second=101 amount=-1 +kerning first=362 second=192 amount=-1 +kerning first=217 second=380 amount=-1 +kerning first=89 second=213 amount=-1 +kerning first=85 second=323 amount=-1 +kerning first=325 second=66 amount=-1 +kerning first=106 second=281 amount=-1 +kerning first=253 second=380 amount=-1 +kerning first=218 second=192 amount=-1 +kerning first=213 second=209 amount=-1 +kerning first=199 second=226 amount=-1 +kerning first=1065 second=1080 amount=-1 +kerning first=195 second=336 amount=-1 +kerning first=1036 second=1054 amount=-1 +kerning first=350 second=44 amount=-1 +kerning first=262 second=323 amount=-1 +kerning first=86 second=252 amount=-1 +kerning first=71 second=330 amount=-1 +kerning first=263 second=252 amount=-1 +kerning first=45 second=119 amount=-1 +kerning first=370 second=323 amount=-1 +kerning first=198 second=70 amount=-1 +kerning first=346 second=274 amount=-1 +kerning first=334 second=323 amount=-1 +kerning first=229 second=244 amount=-1 +kerning first=89 second=171 amount=-2 +kerning first=298 second=323 amount=-1 +kerning first=8250 second=68 amount=-1 +kerning first=270 second=70 amount=-1 +kerning first=296 second=231 amount=-1 +kerning first=354 second=248 amount=-1 +kerning first=258 second=119 amount=-1 +kerning first=328 second=8217 amount=-2 +kerning first=296 second=261 amount=-1 +kerning first=290 second=366 amount=-1 +kerning first=65 second=44 amount=-1 +kerning first=282 second=218 amount=-1 +kerning first=323 second=201 amount=-1 +kerning first=368 second=231 amount=-1 +kerning first=193 second=214 amount=-1 +kerning first=1069 second=1055 amount=-1 +kerning first=210 second=218 amount=-1 +kerning first=198 second=327 amount=-1 +kerning first=1068 second=1071 amount=-1 +kerning first=74 second=229 amount=-1 +kerning first=229 second=314 amount=-1 +kerning first=242 second=44 amount=-1 +kerning first=193 second=314 amount=-1 +kerning first=224 second=231 amount=-1 +kerning first=101 second=44 amount=-1 +kerning first=69 second=218 amount=-1 +kerning first=74 second=201 amount=-1 +kerning first=262 second=353 amount=-1 +kerning first=266 second=243 amount=-1 +kerning first=97 second=8249 amount=-1 +kerning first=362 second=249 amount=-1 +kerning first=1028 second=1081 amount=-1 +kerning first=370 second=223 amount=-1 +kerning first=230 second=243 amount=-1 +kerning first=337 second=314 amount=-1 +kerning first=338 second=80 amount=-1 +kerning first=334 second=353 amount=-1 +kerning first=187 second=196 amount=-1 +kerning first=302 second=80 amount=-1 +kerning first=298 second=353 amount=-1 +kerning first=298 second=223 amount=-1 +kerning first=302 second=243 amount=-1 +kerning first=88 second=214 amount=-1 +kerning first=218 second=249 amount=-1 +kerning first=370 second=353 amount=-1 +kerning first=374 second=243 amount=-1 +kerning first=330 second=350 amount=-1 +kerning first=1064 second=1081 amount=-1 +kerning first=370 second=310 amount=-1 +kerning first=1118 second=1114 amount=-1 +kerning first=85 second=223 amount=-1 +kerning first=218 second=72 amount=-1 +kerning first=119 second=287 amount=-1 +kerning first=286 second=45 amount=-1 +kerning first=1064 second=1036 amount=-1 +kerning first=266 second=80 amount=-1 +kerning first=85 second=353 amount=-1 +kerning first=262 second=223 amount=-1 +kerning first=89 second=243 amount=-1 +kerning first=87 second=101 amount=-1 +kerning first=198 second=284 amount=-1 +kerning first=212 second=370 amount=-1 +kerning first=1046 second=1114 amount=-1 +kerning first=84 second=97 amount=-1 +kerning first=71 second=370 amount=-1 +kerning first=366 second=363 amount=-1 +kerning first=121 second=353 amount=-1 +kerning first=116 second=240 amount=-1 +kerning first=1051 second=1097 amount=-1 +kerning first=1065 second=1082 amount=-1 +kerning first=1059 second=1098 amount=-1 +kerning first=82 second=362 amount=-1 +kerning first=259 second=232 amount=-1 +kerning first=228 second=101 amount=-1 +kerning first=288 second=200 amount=-1 +kerning first=1067 second=1072 amount=-1 +kerning first=187 second=362 amount=-1 +kerning first=8222 second=99 amount=-1 +kerning first=1069 second=1027 amount=-1 +kerning first=204 second=266 amount=-1 +kerning first=199 second=296 amount=-1 +kerning first=78 second=347 amount=-1 +kerning first=74 second=258 amount=-1 +kerning first=367 second=232 amount=-1 +kerning first=259 second=8250 amount=-1 +kerning first=223 second=8250 amount=-1 +kerning first=118 second=8250 amount=-1 +kerning first=197 second=71 amount=-1 +kerning first=202 second=217 amount=-1 +kerning first=269 second=234 amount=-1 +kerning first=233 second=234 amount=-1 +kerning first=274 second=217 amount=-1 +kerning first=1031 second=1072 amount=-1 +kerning first=310 second=217 amount=-1 +kerning first=305 second=234 amount=-1 +kerning first=346 second=217 amount=-1 +kerning first=1036 second=1096 amount=-1 +kerning first=228 second=8220 amount=-2 +kerning first=80 second=313 amount=-1 +kerning first=97 second=111 amount=-1 +kerning first=192 second=8220 amount=-2 +kerning first=221 second=229 amount=-1 +kerning first=97 second=287 amount=-1 +kerning first=252 second=235 amount=-1 +kerning first=264 second=8220 amount=-1 +kerning first=234 second=254 amount=-1 +kerning first=205 second=72 amount=-1 +kerning first=66 second=8218 amount=-1 +kerning first=336 second=8220 amount=-2 +kerning first=1051 second=1024 amount=-1 +kerning first=77 second=352 amount=-1 +kerning first=193 second=374 amount=-1 +kerning first=356 second=267 amount=-1 +kerning first=296 second=69 amount=-1 +kerning first=1030 second=1117 amount=-1 +kerning first=366 second=212 amount=-1 +kerning first=218 second=352 amount=-1 +kerning first=339 second=263 amount=-1 +kerning first=377 second=8220 amount=-1 +kerning first=1057 second=1061 amount=-1 +kerning first=205 second=278 amount=-1 +kerning first=266 second=259 amount=-1 +kerning first=278 second=315 amount=-1 +kerning first=362 second=352 amount=-1 +kerning first=1038 second=1083 amount=-1 +kerning first=258 second=212 amount=-1 +kerning first=87 second=8220 amount=-1 +kerning first=101 second=104 amount=-1 +kerning first=206 second=315 amount=-1 +kerning first=197 second=114 amount=-1 +kerning first=83 second=68 amount=-1 +kerning first=67 second=199 amount=-1 +kerning first=219 second=115 amount=-1 +kerning first=269 second=114 amount=-1 +kerning first=255 second=115 amount=-1 +kerning first=233 second=114 amount=-1 +kerning first=291 second=115 amount=-1 +kerning first=87 second=194 amount=-1 +kerning first=316 second=250 amount=-1 +kerning first=323 second=331 amount=-1 +kerning first=280 second=199 amount=-1 +kerning first=78 second=115 amount=-1 +kerning first=231 second=263 amount=-1 +kerning first=202 second=81 amount=-1 +kerning first=334 second=310 amount=-1 +kerning first=232 second=365 amount=-1 +kerning first=298 second=310 amount=-1 +kerning first=368 second=68 amount=-1 +kerning first=45 second=106 amount=-1 +kerning first=67 second=269 amount=-1 +kerning first=74 second=361 amount=-1 +kerning first=103 second=269 amount=-1 +kerning first=196 second=365 amount=-1 +kerning first=316 second=269 amount=-1 +kerning first=327 second=115 amount=-1 +kerning first=252 second=243 amount=-1 +kerning first=8222 second=235 amount=-1 +kerning first=85 second=310 amount=-1 +kerning first=296 second=68 amount=-1 +kerning first=74 second=331 amount=-1 +kerning first=73 second=346 amount=-1 +kerning first=266 second=245 amount=-1 +kerning first=281 second=277 amount=-1 +kerning first=209 second=78 amount=-1 +kerning first=330 second=246 amount=-1 +kerning first=8218 second=229 amount=-1 +kerning first=1048 second=1062 amount=-1 +kerning first=213 second=282 amount=-1 +kerning first=1069 second=1043 amount=-1 +kerning first=368 second=334 amount=-1 +kerning first=366 second=347 amount=-1 +kerning first=8222 second=305 amount=-1 +kerning first=323 second=288 amount=-1 +kerning first=1033 second=1043 amount=-1 +kerning first=283 second=355 amount=-1 +kerning first=70 second=260 amount=-1 +kerning first=207 second=227 amount=-1 +kerning first=211 second=84 amount=-1 +kerning first=8218 second=101 amount=-1 +kerning first=1069 second=1041 amount=-1 +kerning first=72 second=282 amount=-1 +kerning first=1066 second=1052 amount=-1 +kerning first=272 second=8217 amount=-2 +kerning first=211 second=260 amount=-1 +kerning first=1030 second=1052 amount=-1 +kerning first=1078 second=1094 amount=-1 +kerning first=74 second=288 amount=-1 +kerning first=1042 second=1094 amount=-1 +kerning first=346 second=187 amount=-1 +kerning first=217 second=337 amount=-1 +kerning first=362 second=279 amount=-1 +kerning first=193 second=108 amount=-1 +kerning first=65 second=87 amount=-1 +kerning first=310 second=187 amount=-1 +kerning first=229 second=108 amount=-1 +kerning first=269 second=367 amount=-1 +kerning first=255 second=8217 amount=-2 +kerning first=105 second=291 amount=-1 +kerning first=291 second=8217 amount=-2 +kerning first=269 second=111 amount=-1 +kerning first=327 second=8217 amount=-1 +kerning first=337 second=108 amount=-1 +kerning first=363 second=8217 amount=-1 +kerning first=286 second=75 amount=-1 +kerning first=77 second=279 amount=-1 +kerning first=1056 second=1064 amount=-1 +kerning first=214 second=75 amount=-1 +kerning first=370 second=216 amount=-1 +kerning first=202 second=187 amount=-1 +kerning first=362 second=70 amount=-1 +kerning first=268 second=99 amount=-1 +kerning first=218 second=279 amount=-1 +kerning first=325 second=337 amount=-1 +kerning first=304 second=99 amount=-1 +kerning first=196 second=361 amount=-1 +kerning first=368 second=355 amount=-1 +kerning first=97 second=187 amount=-1 +kerning first=289 second=337 amount=-1 +kerning first=105 second=235 amount=-1 +kerning first=73 second=75 amount=-1 +kerning first=232 second=99 amount=-1 +kerning first=200 second=268 amount=-1 +kerning first=289 second=242 amount=-1 +kerning first=258 second=255 amount=-1 +kerning first=325 second=242 amount=-1 +kerning first=225 second=333 amount=-1 +kerning first=221 second=99 amount=-1 +kerning first=1050 second=1082 amount=-1 +kerning first=217 second=242 amount=-1 +kerning first=250 second=281 amount=-1 +kerning first=257 second=99 amount=-1 +kerning first=1065 second=1104 amount=-1 +kerning first=315 second=86 amount=-1 +kerning first=344 second=268 amount=-1 +kerning first=213 second=347 amount=-1 +kerning first=8249 second=370 amount=-1 +kerning first=45 second=255 amount=-1 +kerning first=365 second=99 amount=-1 +kerning first=213 second=89 amount=-1 +kerning first=171 second=86 amount=-1 +kerning first=67 second=364 amount=-1 +kerning first=72 second=347 amount=-1 +kerning first=305 second=277 amount=-1 +kerning first=69 second=77 amount=-1 +kerning first=269 second=277 amount=-1 +kerning first=274 second=325 amount=-1 +kerning first=233 second=277 amount=-1 +kerning first=364 second=198 amount=-1 +kerning first=219 second=264 amount=-1 +kerning first=346 second=325 amount=-1 +kerning first=1053 second=1073 amount=-1 +kerning first=73 second=281 amount=-1 +kerning first=109 second=281 amount=-1 +kerning first=78 second=264 amount=-1 +kerning first=284 second=69 amount=-1 +kerning first=113 second=108 amount=-1 +kerning first=280 second=8217 amount=-1 +kerning first=8222 second=335 amount=-1 +kerning first=209 second=241 amount=-1 +kerning first=316 second=8217 amount=-1 +kerning first=352 second=364 amount=-1 +kerning first=70 second=290 amount=-1 +kerning first=374 second=351 amount=-1 +kerning first=328 second=233 amount=-1 +kerning first=288 second=282 amount=-1 +kerning first=298 second=82 amount=-1 +kerning first=364 second=233 amount=-1 +kerning first=262 second=82 amount=-1 +kerning first=280 second=364 amount=-1 +kerning first=374 second=286 amount=-1 +kerning first=103 second=8217 amount=-2 +kerning first=370 second=82 amount=-1 +kerning first=1041 second=1117 amount=-1 +kerning first=71 second=69 amount=-1 +kerning first=334 second=82 amount=-1 +kerning first=1077 second=1117 amount=-1 +kerning first=212 second=69 amount=-1 +kerning first=208 second=8217 amount=-2 +kerning first=1041 second=1052 amount=-1 +kerning first=254 second=108 amount=-1 +kerning first=244 second=8217 amount=-2 +kerning first=1047 second=1091 amount=-1 +kerning first=105 second=243 amount=-1 +kerning first=266 second=286 amount=-1 +kerning first=89 second=351 amount=-1 +kerning first=66 second=86 amount=-1 +kerning first=222 second=8218 amount=-1 +kerning first=1038 second=1061 amount=-1 +kerning first=338 second=286 amount=-1 +kerning first=302 second=351 amount=-1 +kerning first=70 second=355 amount=-1 +kerning first=89 second=286 amount=-1 +kerning first=266 second=351 amount=-1 +kerning first=75 second=338 amount=-1 +kerning first=230 second=351 amount=-1 +kerning first=1105 second=1078 amount=-1 +kerning first=199 second=334 amount=-1 +kerning first=1064 second=1030 amount=-1 +kerning first=194 second=286 amount=-1 +kerning first=80 second=99 amount=-1 +kerning first=85 second=82 amount=-1 +kerning first=66 second=365 amount=-1 +kerning first=272 second=203 amount=-1 +kerning first=1039 second=1095 amount=-1 +kerning first=87 second=229 amount=-1 +kerning first=1056 second=1043 amount=-1 +kerning first=327 second=103 amount=-1 +kerning first=1041 second=1037 amount=-1 +kerning first=118 second=254 amount=-1 +kerning first=1064 second=1072 amount=-1 +kerning first=74 second=117 amount=-1 +kerning first=200 second=203 amount=-1 +kerning first=1052 second=1074 amount=-1 +kerning first=220 second=80 amount=-1 +kerning first=220 second=122 amount=-1 +kerning first=1042 second=1083 amount=-1 +kerning first=287 second=117 amount=-1 +kerning first=220 second=100 amount=-1 +kerning first=323 second=269 amount=-1 +kerning first=1049 second=1083 amount=-1 +kerning first=88 second=171 amount=-1 +kerning first=70 second=298 amount=-1 +kerning first=67 second=8217 amount=-1 +kerning first=211 second=298 amount=-1 +kerning first=193 second=171 amount=-1 +kerning first=364 second=100 amount=-1 +kerning first=328 second=263 amount=-1 +kerning first=264 second=229 amount=-1 +kerning first=229 second=171 amount=-1 +kerning first=1036 second=1104 amount=-1 +kerning first=364 second=263 amount=-1 +kerning first=369 second=246 amount=-1 +kerning first=1038 second=1118 amount=-1 +kerning first=210 second=356 amount=-1 +kerning first=66 second=75 amount=-1 +kerning first=368 second=369 amount=-1 +kerning first=296 second=304 amount=-1 +kerning first=8217 second=230 amount=-1 +kerning first=261 second=246 amount=-1 +kerning first=368 second=304 amount=-1 +kerning first=73 second=66 amount=-1 +kerning first=225 second=246 amount=-1 +kerning first=83 second=304 amount=-1 +kerning first=1065 second=1118 amount=-1 +kerning first=1039 second=1060 amount=-1 +kerning first=1049 second=1080 amount=-1 +kerning first=199 second=120 amount=-1 +kerning first=1070 second=1031 amount=-1 +kerning first=277 second=316 amount=-1 +kerning first=84 second=246 amount=-1 +kerning first=235 second=120 amount=-1 +kerning first=195 second=220 amount=-1 +kerning first=1078 second=1086 amount=-1 +kerning first=344 second=368 amount=-1 +kerning first=200 second=8221 amount=-1 +kerning first=240 second=103 amount=-1 +kerning first=194 second=221 amount=-1 +kerning first=204 second=103 amount=-1 +kerning first=275 second=382 amount=-1 +kerning first=272 second=8221 amount=-2 +kerning first=279 second=249 amount=-1 +kerning first=99 second=103 amount=-1 +kerning first=200 second=368 amount=-1 +kerning first=289 second=109 amount=-1 +kerning first=344 second=8221 amount=-1 +kerning first=1078 second=1108 amount=-1 +kerning first=288 second=330 amount=-1 +kerning first=339 second=347 amount=-1 +kerning first=1047 second=1034 amount=-1 +kerning first=72 second=68 amount=-1 +kerning first=272 second=368 amount=-1 +kerning first=103 second=307 amount=-1 +kerning first=217 second=109 amount=-1 +kerning first=213 second=68 amount=-1 +kerning first=1046 second=1092 amount=-1 +kerning first=279 second=8218 amount=-1 +kerning first=97 second=382 amount=-1 +kerning first=234 second=116 amount=-1 +kerning first=119 second=98 amount=-1 +kerning first=210 second=85 amount=-1 +kerning first=287 second=223 amount=-1 +kerning first=72 second=339 amount=-1 +kerning first=69 second=85 amount=-1 +kerning first=219 second=256 amount=-1 +kerning first=67 second=234 amount=-1 +kerning first=321 second=8220 amount=-1 +kerning first=1053 second=1081 amount=-1 +kerning first=201 second=210 amount=-1 +kerning first=89 second=199 amount=-1 +kerning first=1070 second=1059 amount=-1 +kerning first=264 second=302 amount=-1 +kerning first=323 second=223 amount=-1 +kerning first=217 second=280 amount=-1 +kerning first=100 second=243 amount=-1 +kerning first=325 second=280 amount=-1 +kerning first=268 second=335 amount=-1 +kerning first=1050 second=1090 amount=-1 +kerning first=232 second=335 amount=-1 +kerning first=205 second=243 amount=-1 +kerning first=356 second=232 amount=-1 +kerning first=367 second=337 amount=-1 +kerning first=70 second=363 amount=-1 +kerning first=304 second=335 amount=-1 +kerning first=277 second=243 amount=-1 +kerning first=241 second=243 amount=-1 +kerning first=74 second=223 amount=-1 +kerning first=108 second=339 amount=-1 +kerning first=249 second=339 amount=-1 +kerning first=270 second=219 amount=-1 +kerning first=283 second=363 amount=-1 +kerning first=70 second=225 amount=-1 +kerning first=198 second=219 amount=-1 +kerning first=287 second=8249 amount=-1 +kerning first=1107 second=1102 amount=-1 +kerning first=323 second=8249 amount=-1 +kerning first=368 second=71 amount=-1 +kerning first=207 second=357 amount=-1 +kerning first=206 second=350 amount=-1 +kerning first=213 second=76 amount=-1 +kerning first=282 second=365 amount=-1 +kerning first=72 second=76 amount=-1 +kerning first=279 second=357 amount=-1 +kerning first=73 second=100 amount=-1 +kerning first=1048 second=1034 amount=-1 +kerning first=214 second=196 amount=-1 +kerning first=109 second=289 amount=-1 +kerning first=250 second=289 amount=-1 +kerning first=267 second=228 amount=-1 +kerning first=316 second=234 amount=-1 +kerning first=214 second=354 amount=-1 +kerning first=204 second=370 amount=-1 +kerning first=8250 second=357 amount=-1 +kerning first=1049 second=1075 amount=-1 +kerning first=1078 second=1080 amount=-1 +kerning first=298 second=111 amount=-1 +kerning first=231 second=228 amount=-1 +kerning first=110 second=8249 amount=-1 +kerning first=1049 second=1074 amount=-1 +kerning first=282 second=85 amount=-1 +kerning first=278 second=79 amount=-1 +kerning first=1044 second=1108 amount=-1 +kerning first=72 second=274 amount=-1 +kerning first=204 second=366 amount=-1 +kerning first=350 second=250 amount=-1 +kerning first=346 second=46 amount=-1 +kerning first=310 second=46 amount=-1 +kerning first=45 second=112 amount=-1 +kerning first=354 second=283 amount=-1 +kerning first=1070 second=1045 amount=-1 +kerning first=80 second=378 amount=-1 +kerning first=368 second=8222 amount=-2 +kerning first=1071 second=1062 amount=-1 +kerning first=324 second=335 amount=-1 +kerning first=1054 second=1050 amount=-1 +kerning first=278 second=8218 amount=-1 +kerning first=8216 second=353 amount=-1 +kerning first=101 second=250 amount=-1 +kerning first=209 second=70 amount=-1 +kerning first=65 second=250 amount=-1 +kerning first=66 second=357 amount=-1 +kerning first=75 second=67 amount=-1 +kerning first=364 second=229 amount=-1 +kerning first=73 second=216 amount=-1 +kerning first=314 second=250 amount=-1 +kerning first=278 second=250 amount=-1 +kerning first=8220 second=115 amount=-1 +kerning first=1049 second=1060 amount=-1 +kerning first=272 second=195 amount=-1 +kerning first=66 second=192 amount=-1 +kerning first=72 second=382 amount=-1 +kerning first=68 second=70 amount=-1 +kerning first=213 second=274 amount=-1 +kerning first=266 second=213 amount=-1 +kerning first=202 second=317 amount=-1 +kerning first=375 second=122 amount=-1 +kerning first=119 second=369 amount=-1 +kerning first=325 second=207 amount=-1 +kerning first=274 second=317 amount=-1 +kerning first=362 second=116 amount=-1 +kerning first=220 second=271 amount=-1 +kerning first=346 second=317 amount=-1 +kerning first=231 second=122 amount=-1 +kerning first=374 second=213 amount=-1 +kerning first=267 second=122 amount=-1 +kerning first=302 second=213 amount=-1 +kerning first=79 second=198 amount=-1 +kerning first=364 second=271 amount=-1 +kerning first=332 second=8222 amount=-1 +kerning first=234 second=113 amount=-1 +kerning first=70 second=119 amount=-1 +kerning first=204 second=201 amount=-1 +kerning first=77 second=116 amount=-1 +kerning first=257 second=378 amount=-1 +kerning first=323 second=323 amount=-1 +kerning first=1027 second=1096 amount=-1 +kerning first=221 second=378 amount=-1 +kerning first=1070 second=1051 amount=-1 +kerning first=8249 second=362 amount=-1 +kerning first=217 second=207 amount=-1 +kerning first=119 second=8222 amount=-1 +kerning first=82 second=262 amount=-1 +kerning first=218 second=116 amount=-1 +kerning first=187 second=262 amount=-1 +kerning first=210 second=315 amount=-1 +kerning first=79 second=366 amount=-1 +kerning first=87 second=113 amount=-1 +kerning first=254 second=314 amount=-1 +kerning first=220 second=259 amount=-1 +kerning first=213 second=204 amount=-1 +kerning first=1048 second=1081 amount=-1 +kerning first=291 second=355 amount=-1 +kerning first=80 second=195 amount=-1 +kerning first=113 second=314 amount=-1 +kerning first=65 second=363 amount=-1 +kerning first=101 second=363 amount=-1 +kerning first=364 second=259 amount=-1 +kerning first=278 second=266 amount=-1 +kerning first=205 second=110 amount=-1 +kerning first=212 second=198 amount=-1 +kerning first=323 second=116 amount=-1 +kerning first=344 second=67 amount=-1 +kerning first=279 second=369 amount=-1 +kerning first=287 second=116 amount=-1 +kerning first=1031 second=1030 amount=-1 +kerning first=278 second=363 amount=-1 +kerning first=67 second=73 amount=-1 +kerning first=200 second=207 amount=-1 +kerning first=200 second=67 amount=-1 +kerning first=350 second=363 amount=-1 +kerning first=205 second=317 amount=-1 +kerning first=323 second=76 amount=-1 +kerning first=272 second=207 amount=-1 +kerning first=66 second=369 amount=-1 +kerning first=264 second=113 amount=-1 +kerning first=187 second=210 amount=-1 +kerning first=8222 second=284 amount=-1 +kerning first=220 second=366 amount=-1 +kerning first=82 second=210 amount=-1 +kerning first=228 second=113 amount=-1 +kerning first=347 second=44 amount=-1 +kerning first=356 second=8250 amount=-1 +kerning first=1104 second=1093 amount=-1 +kerning first=270 second=302 amount=-1 +kerning first=78 second=213 amount=-1 +kerning first=67 second=268 amount=-1 +kerning first=267 second=271 amount=-1 +kerning first=1070 second=1038 amount=-1 +kerning first=284 second=8250 amount=-1 +kerning first=198 second=302 amount=-1 +kerning first=248 second=8250 amount=-1 +kerning first=339 second=271 amount=-1 +kerning first=280 second=268 amount=-1 +kerning first=212 second=8250 amount=-1 +kerning first=72 second=351 amount=-1 +kerning first=217 second=101 amount=-1 +kerning first=272 second=354 amount=-1 +kerning first=219 second=213 amount=-1 +kerning first=269 second=8220 amount=-2 +kerning first=234 second=8220 amount=-2 +kerning first=289 second=101 amount=-1 +kerning first=71 second=8250 amount=-1 +kerning first=198 second=8220 amount=-1 +kerning first=66 second=262 amount=-1 +kerning first=193 second=219 amount=-1 +kerning first=207 second=262 amount=-1 +kerning first=1044 second=1105 amount=-1 +kerning first=327 second=213 amount=-1 +kerning first=83 second=296 amount=-1 +kerning first=234 second=122 amount=-1 +kerning first=254 second=291 amount=-1 +kerning first=368 second=296 amount=-1 +kerning first=72 second=204 amount=-1 +kerning first=71 second=345 amount=-1 +kerning first=262 second=72 amount=-1 +kerning first=296 second=296 amount=-1 +kerning first=201 second=73 amount=-1 +kerning first=1078 second=1072 amount=-1 +kerning first=205 second=290 amount=-1 +kerning first=323 second=283 amount=-1 +kerning first=330 second=338 amount=-1 +kerning first=279 second=235 amount=-1 +kerning first=207 second=82 amount=-1 +kerning first=251 second=283 amount=-1 +kerning first=258 second=338 amount=-1 +kerning first=310 second=286 amount=-1 +kerning first=206 second=355 amount=-1 +kerning first=110 second=283 amount=-1 +kerning first=1067 second=1060 amount=-1 +kerning first=73 second=277 amount=-1 +kerning first=83 second=82 amount=-1 +kerning first=45 second=338 amount=-1 +kerning first=74 second=283 amount=-1 +kerning first=202 second=286 amount=-1 +kerning first=78 second=226 amount=-1 +kerning first=270 second=8220 amount=-2 +kerning first=213 second=351 amount=-1 +kerning first=114 second=226 amount=-1 +kerning first=232 second=367 amount=-1 +kerning first=254 second=287 amount=-1 +kerning first=272 second=260 amount=-1 +kerning first=210 second=86 amount=-1 +kerning first=82 second=8250 amount=-1 +kerning first=219 second=226 amount=-1 +kerning first=354 second=347 amount=-1 +kerning first=220 second=79 amount=-1 +kerning first=66 second=82 amount=-1 +kerning first=77 second=275 amount=-1 +kerning first=327 second=226 amount=-1 +kerning first=72 second=244 amount=-1 +kerning first=345 second=240 amount=-1 +kerning first=356 second=171 amount=-1 +kerning first=108 second=244 amount=-1 +kerning first=219 second=333 amount=-1 +kerning first=214 second=70 amount=-1 +kerning first=78 second=333 amount=-1 +kerning first=286 second=70 amount=-1 +kerning first=249 second=244 amount=-1 +kerning first=327 second=333 amount=-1 +kerning first=1064 second=1056 amount=-1 +kerning first=363 second=333 amount=-1 +kerning first=338 second=278 amount=-1 +kerning first=288 second=220 amount=-1 +kerning first=73 second=70 amount=-1 +kerning first=1055 second=1069 amount=-1 +kerning first=291 second=333 amount=-1 +kerning first=266 second=278 amount=-1 +kerning first=1039 second=1094 amount=-1 +kerning first=217 second=74 amount=-1 +kerning first=1052 second=1065 amount=-1 +kerning first=71 second=171 amount=-1 +kerning first=249 second=231 amount=-1 +kerning first=107 second=171 amount=-1 +kerning first=325 second=74 amount=-1 +kerning first=1031 second=1060 amount=-1 +kerning first=206 second=203 amount=-1 +kerning first=8250 second=76 amount=-1 +kerning first=224 second=269 amount=-1 +kerning first=72 second=231 amount=-1 +kerning first=284 second=171 amount=-1 +kerning first=199 second=201 amount=-1 +kerning first=108 second=231 amount=-1 +kerning first=338 second=252 amount=-1 +kerning first=370 second=214 amount=-1 +kerning first=1071 second=1071 amount=-1 +kerning first=362 second=313 amount=-1 +kerning first=298 second=214 amount=-1 +kerning first=107 second=318 amount=-1 +kerning first=296 second=269 amount=-1 +kerning first=374 second=252 amount=-1 +kerning first=262 second=214 amount=-1 +kerning first=323 second=261 amount=-1 +kerning first=323 second=310 amount=-1 +kerning first=66 second=249 amount=-1 +kerning first=8250 second=90 amount=-1 +kerning first=248 second=318 amount=-1 +kerning first=282 second=200 amount=-1 +kerning first=69 second=266 amount=-1 +kerning first=268 second=8222 amount=-1 +kerning first=212 second=209 amount=-1 +kerning first=232 second=8222 amount=-1 +kerning first=266 second=45 amount=-1 +kerning first=196 second=370 amount=-1 +kerning first=89 second=252 amount=-1 +kerning first=73 second=97 amount=-1 +kerning first=76 second=362 amount=-1 +kerning first=194 second=45 amount=-1 +kerning first=194 second=252 amount=-1 +kerning first=203 second=71 amount=-1 +kerning first=1062 second=1097 amount=-1 +kerning first=374 second=45 amount=-2 +kerning first=304 second=370 amount=-1 +kerning first=78 second=199 amount=-1 +kerning first=234 second=275 amount=-1 +kerning first=230 second=252 amount=-1 +kerning first=338 second=45 amount=-1 +kerning first=217 second=213 amount=-1 +kerning first=365 second=289 amount=-1 +kerning first=196 second=223 amount=-1 +kerning first=288 second=209 amount=-1 +kerning first=1105 second=1081 amount=-1 +kerning first=194 second=251 amount=-1 +kerning first=72 second=217 amount=-1 +kerning first=8250 second=296 amount=-1 +kerning first=304 second=223 amount=-1 +kerning first=204 second=257 amount=-1 +kerning first=77 second=338 amount=-1 +kerning first=268 second=223 amount=-1 +kerning first=364 second=232 amount=-1 +kerning first=213 second=217 amount=-1 +kerning first=1030 second=1027 amount=-1 +kerning first=338 second=251 amount=-1 +kerning first=328 second=232 amount=-1 +kerning first=67 second=108 amount=-1 +kerning first=230 second=251 amount=-1 +kerning first=224 second=243 amount=-1 +kerning first=321 second=217 amount=-1 +kerning first=1066 second=1027 amount=-1 +kerning first=296 second=243 amount=-1 +kerning first=282 second=266 amount=-1 +kerning first=374 second=251 amount=-1 +kerning first=368 second=243 amount=-1 +kerning first=83 second=274 amount=-1 +kerning first=259 second=171 amount=-1 +kerning first=101 second=242 amount=-1 +kerning first=214 second=8221 amount=-2 +kerning first=89 second=225 amount=-1 +kerning first=250 second=8221 amount=-1 +kerning first=284 second=345 amount=-1 +kerning first=235 second=335 amount=-1 +kerning first=286 second=8221 amount=-1 +kerning first=199 second=335 amount=-1 +kerning first=72 second=346 amount=-1 +kerning first=220 second=232 amount=-1 +kerning first=266 second=72 amount=-1 +kerning first=307 second=335 amount=-1 +kerning first=1048 second=1054 amount=-1 +kerning first=266 second=225 amount=-1 +kerning first=302 second=72 amount=-1 +kerning first=271 second=335 amount=-1 +kerning first=197 second=89 amount=-1 +kerning first=374 second=225 amount=-1 +kerning first=8249 second=83 amount=-1 +kerning first=206 second=242 amount=-1 +kerning first=1043 second=1105 amount=-1 +kerning first=1039 second=1052 amount=-1 +kerning first=1065 second=1089 amount=-1 +kerning first=1054 second=1063 amount=-1 +kerning first=65 second=336 amount=-1 +kerning first=204 second=243 amount=-1 +kerning first=262 second=114 amount=-1 +kerning first=1028 second=1117 amount=-1 +kerning first=338 second=72 amount=-1 +kerning first=85 second=241 amount=-1 +kerning first=1055 second=1096 amount=-1 +kerning first=78 second=214 amount=-1 +kerning first=217 second=269 amount=-1 +kerning first=370 second=241 amount=-1 +kerning first=338 second=366 amount=-1 +kerning first=8217 second=196 amount=-2 +kerning first=278 second=336 amount=-1 +kerning first=298 second=241 amount=-1 +kerning first=262 second=241 amount=-1 +kerning first=325 second=114 amount=-1 +kerning first=1060 second=1045 amount=-1 +kerning first=72 second=378 amount=-1 +kerning first=289 second=114 amount=-1 +kerning first=219 second=199 amount=-1 +kerning first=67 second=115 amount=-1 +kerning first=1071 second=1056 amount=-1 +kerning first=103 second=115 amount=-1 +kerning first=114 second=46 amount=-1 +kerning first=1036 second=1076 amount=-1 +kerning first=255 second=46 amount=-1 +kerning first=327 second=199 amount=-1 +kerning first=187 second=344 amount=-1 +kerning first=77 second=81 amount=-1 +kerning first=112 second=114 amount=-1 +kerning first=77 second=327 amount=-1 +kerning first=1049 second=1113 amount=-1 +kerning first=8222 second=249 amount=-1 +kerning first=85 second=361 amount=-1 +kerning first=217 second=114 amount=-1 +kerning first=108 second=378 amount=-1 +kerning first=206 second=79 amount=-1 +kerning first=204 second=284 amount=-1 +kerning first=218 second=327 amount=-1 +kerning first=1053 second=1045 amount=-1 +kerning first=65 second=216 amount=-1 +kerning first=290 second=327 amount=-1 +kerning first=74 second=310 amount=-1 +kerning first=218 second=81 amount=-1 +kerning first=362 second=327 amount=-1 +kerning first=73 second=8221 amount=-1 +kerning first=370 second=361 amount=-1 +kerning first=109 second=8221 amount=-2 +kerning first=206 second=216 amount=-1 +kerning first=362 second=81 amount=-1 +kerning first=88 second=218 amount=-1 +kerning first=333 second=8221 amount=-2 +kerning first=369 second=8221 amount=-1 +kerning first=110 second=246 amount=-1 +kerning first=214 second=44 amount=-1 +kerning first=80 second=8249 amount=-1 +kerning first=356 second=224 amount=-1 +kerning first=1042 second=1098 amount=-1 +kerning first=116 second=8249 amount=-1 +kerning first=78 second=72 amount=-1 +kerning first=221 second=369 amount=-1 +kerning first=221 second=8249 amount=-2 +kerning first=368 second=282 amount=-1 +kerning first=257 second=8249 amount=-1 +kerning first=1069 second=1068 amount=-1 +kerning first=221 second=331 amount=-1 +kerning first=296 second=282 amount=-1 +kerning first=209 second=352 amount=-1 +kerning first=199 second=102 amount=-1 +kerning first=85 second=267 amount=-1 +kerning first=1055 second=1070 amount=-1 +kerning first=219 second=72 amount=-1 +kerning first=1039 second=1055 amount=-1 +kerning first=1055 second=1089 amount=-1 +kerning first=83 second=282 amount=-1 +kerning first=233 second=98 amount=-1 +kerning first=86 second=248 amount=-1 +kerning first=193 second=218 amount=-1 +kerning first=227 second=248 amount=-1 +kerning first=8250 second=217 amount=-1 +kerning first=365 second=345 amount=-1 +kerning first=302 second=199 amount=-1 +kerning first=269 second=230 amount=-1 +kerning first=77 second=206 amount=-1 +kerning first=1067 second=1086 amount=-1 +kerning first=76 second=87 amount=-1 +kerning first=1033 second=1031 amount=-1 +kerning first=1031 second=1086 amount=-1 +kerning first=374 second=199 amount=-1 +kerning first=8217 second=259 amount=-1 +kerning first=290 second=206 amount=-1 +kerning first=230 second=291 amount=-1 +kerning first=201 second=361 amount=-1 +kerning first=218 second=206 amount=-1 +kerning first=77 second=288 amount=-1 +kerning first=1048 second=1080 amount=-1 +kerning first=199 second=227 amount=-1 +kerning first=290 second=8218 amount=-1 +kerning first=84 second=8221 amount=-1 +kerning first=313 second=84 amount=-1 +kerning first=66 second=81 amount=-1 +kerning first=269 second=337 amount=-1 +kerning first=362 second=206 amount=-1 +kerning first=120 second=8221 amount=-1 +kerning first=1091 second=1095 amount=-1 +kerning first=233 second=337 amount=-1 +kerning first=1055 second=1095 amount=-1 +kerning first=225 second=8221 amount=-2 +kerning first=207 second=81 amount=-1 +kerning first=187 second=197 amount=-1 +kerning first=261 second=8221 amount=-2 +kerning first=1043 second=1079 amount=-1 +kerning first=257 second=267 amount=-1 +kerning first=218 second=288 amount=-1 +kerning first=72 second=352 amount=-1 +kerning first=8249 second=221 amount=-1 +kerning first=206 second=362 amount=-1 +kerning first=212 second=197 amount=-1 +kerning first=103 second=187 amount=-1 +kerning first=83 second=270 amount=-1 +kerning first=217 second=75 amount=-1 +kerning first=195 second=219 amount=-1 +kerning first=278 second=362 amount=-1 +kerning first=1055 second=1117 amount=-1 +kerning first=72 second=325 amount=-1 +kerning first=67 second=187 amount=-1 +kerning first=350 second=362 amount=-1 +kerning first=218 second=8218 amount=-2 +kerning first=213 second=325 amount=-1 +kerning first=280 second=187 amount=-1 +kerning first=199 second=200 amount=-1 +kerning first=296 second=270 amount=-1 +kerning first=1075 second=1082 amount=-1 +kerning first=77 second=8218 amount=-1 +kerning first=1060 second=1030 amount=-1 +kerning first=244 second=187 amount=-1 +kerning first=298 second=333 amount=-1 +kerning first=70 second=66 amount=-1 +kerning first=65 second=255 amount=-1 +kerning first=335 second=382 amount=-1 +kerning first=80 second=8222 amount=-2 +kerning first=85 second=202 amount=-1 +kerning first=80 second=266 amount=-1 +kerning first=1036 second=1116 amount=-1 +kerning first=73 second=71 amount=-1 +kerning first=374 second=264 amount=-1 +kerning first=233 second=107 amount=-1 +kerning first=1055 second=1043 amount=-1 +kerning first=338 second=264 amount=-1 +kerning first=330 second=337 amount=-1 +kerning first=217 second=77 amount=-1 +kerning first=281 second=275 amount=-1 +kerning first=325 second=75 amount=-1 +kerning first=302 second=264 amount=-1 +kerning first=65 second=362 amount=-1 +kerning first=266 second=264 amount=-1 +kerning first=356 second=279 amount=-1 +kerning first=218 second=261 amount=-1 +kerning first=205 second=209 amount=-1 +kerning first=194 second=264 amount=-1 +kerning first=281 second=367 amount=-1 +kerning first=81 second=218 amount=-1 +kerning first=197 second=364 amount=-1 +kerning first=375 second=117 amount=-1 +kerning first=89 second=264 amount=-1 +kerning first=362 second=261 amount=-1 +kerning first=78 second=334 amount=-1 +kerning first=298 second=202 amount=-1 +kerning first=211 second=66 amount=-1 +kerning first=330 second=344 amount=-1 +kerning first=262 second=202 amount=-1 +kerning first=370 second=202 amount=-1 +kerning first=323 second=257 amount=-1 +kerning first=334 second=202 amount=-1 +kerning first=1027 second=1091 amount=-1 +kerning first=351 second=108 amount=-1 +kerning first=74 second=257 amount=-1 +kerning first=202 second=205 amount=-1 +kerning first=364 second=193 amount=-1 +kerning first=243 second=108 amount=-1 +kerning first=279 second=108 amount=-1 +kerning first=219 second=334 amount=-1 +kerning first=368 second=270 amount=-1 +kerning first=79 second=193 amount=-1 +kerning first=346 second=205 amount=-1 +kerning first=220 second=193 amount=-1 +kerning first=286 second=171 amount=-1 +kerning first=327 second=334 amount=-1 +kerning first=77 second=261 amount=-1 +kerning first=274 second=205 amount=-1 +kerning first=201 second=323 amount=-1 +kerning first=291 second=307 amount=-1 +kerning first=8218 second=113 amount=-1 +kerning first=8217 second=231 amount=-1 +kerning first=268 second=82 amount=-1 +kerning first=259 second=263 amount=-1 +kerning first=82 second=171 amount=-1 +kerning first=296 second=76 amount=-1 +kerning first=118 second=171 amount=-1 +kerning first=195 second=117 amount=-1 +kerning first=280 second=8218 amount=-1 +kerning first=368 second=351 amount=-1 +kerning first=220 second=46 amount=-2 +kerning first=86 second=286 amount=-1 +kerning first=296 second=351 amount=-1 +kerning first=99 second=365 amount=-1 +kerning first=339 second=117 amount=-1 +kerning first=1058 second=1074 amount=-1 +kerning first=288 second=68 amount=-1 +kerning first=8222 second=111 amount=-1 +kerning first=1055 second=1108 amount=-1 +kerning first=1108 second=1078 amount=-1 +kerning first=267 second=117 amount=-1 +kerning first=201 second=332 amount=-1 +kerning first=8250 second=282 amount=-1 +kerning first=192 second=8249 amount=-1 +kerning first=1031 second=1119 amount=-1 +kerning first=302 second=333 amount=-1 +kerning first=210 second=347 amount=-1 +kerning first=298 second=100 amount=-1 +kerning first=120 second=316 amount=-1 +kerning first=1118 second=1083 amount=-1 +kerning first=86 second=382 amount=-1 +kerning first=83 second=330 amount=-1 +kerning first=261 second=316 amount=-1 +kerning first=220 second=220 amount=-1 +kerning first=266 second=333 amount=-1 +kerning first=1040 second=1047 amount=-1 +kerning first=333 second=316 amount=-1 +kerning first=227 second=382 amount=-1 +kerning first=209 second=205 amount=-1 +kerning first=79 second=220 amount=-1 +kerning first=263 second=382 amount=-1 +kerning first=374 second=333 amount=-1 +kerning first=1067 second=1034 amount=-1 +kerning first=368 second=103 amount=-1 +kerning first=99 second=234 amount=-1 +kerning first=304 second=330 amount=-1 +kerning first=1031 second=1034 amount=-1 +kerning first=1031 second=1099 amount=-1 +kerning first=73 second=211 amount=-1 +kerning first=296 second=103 amount=-1 +kerning first=85 second=100 amount=-1 +kerning first=1065 second=1076 amount=-1 +kerning first=224 second=103 amount=-1 +kerning first=217 second=281 amount=-1 +kerning first=367 second=171 amount=-1 +kerning first=268 second=330 amount=-1 +kerning first=1067 second=1099 amount=-1 +kerning first=119 second=103 amount=-1 +kerning first=262 second=100 amount=-1 +kerning first=8250 second=378 amount=-1 +kerning first=364 second=220 amount=-1 +kerning first=204 second=77 amount=-1 +kerning first=325 second=281 amount=-1 +kerning first=338 second=85 amount=-1 +kerning first=339 second=113 amount=-1 +kerning first=235 second=252 amount=-1 +kerning first=1044 second=1057 amount=-1 +kerning first=302 second=85 amount=-1 +kerning first=80 second=304 amount=-1 +kerning first=266 second=85 amount=-1 +kerning first=1052 second=1092 amount=-1 +kerning first=201 second=280 amount=-1 +kerning first=279 second=314 amount=-1 +kerning first=194 second=85 amount=-1 +kerning first=337 second=120 amount=-1 +kerning first=243 second=314 amount=-1 +kerning first=200 second=315 amount=-1 +kerning first=355 second=8217 amount=-1 +kerning first=88 second=44 amount=-1 +kerning first=89 second=110 amount=-1 +kerning first=351 second=314 amount=-1 +kerning first=328 second=118 amount=-1 +kerning first=253 second=254 amount=-1 +kerning first=302 second=110 amount=-1 +kerning first=66 second=8220 amount=-2 +kerning first=345 second=8250 amount=-1 +kerning first=266 second=110 amount=-1 +kerning first=97 second=339 amount=-1 +kerning first=231 second=271 amount=-1 +kerning first=362 second=219 amount=-1 +kerning first=232 second=357 amount=-1 +kerning first=290 second=219 amount=-1 +kerning first=1048 second=1042 amount=-1 +kerning first=201 second=8250 amount=-1 +kerning first=196 second=357 amount=-1 +kerning first=310 second=85 amount=-1 +kerning first=8217 second=248 amount=-1 +kerning first=304 second=357 amount=-1 +kerning first=368 second=76 amount=-1 +kerning first=218 second=219 amount=-1 +kerning first=268 second=357 amount=-1 +kerning first=289 second=254 amount=-1 +kerning first=205 second=332 amount=-1 +kerning first=210 second=374 amount=-1 +kerning first=101 second=101 amount=-1 +kerning first=216 second=8217 amount=-2 +kerning first=120 second=289 amount=-1 +kerning first=206 second=101 amount=-1 +kerning first=261 second=289 amount=-1 +kerning first=206 second=224 amount=-1 +kerning first=225 second=289 amount=-1 +kerning first=77 second=219 amount=-1 +kerning first=72 second=296 amount=-1 +kerning first=375 second=311 amount=-1 +kerning first=203 second=212 amount=-1 +kerning first=211 second=8217 amount=-2 +kerning first=278 second=81 amount=-1 +kerning first=1038 second=1075 amount=-1 +kerning first=100 second=111 amount=-1 +kerning first=262 second=187 amount=-1 +kerning first=362 second=362 amount=-1 +kerning first=369 second=289 amount=-1 +kerning first=213 second=296 amount=-1 +kerning first=205 second=111 amount=-1 +kerning first=241 second=111 amount=-1 +kerning first=70 second=8217 amount=-1 +kerning first=277 second=111 amount=-1 +kerning first=106 second=8217 amount=-1 +kerning first=284 second=280 amount=-1 +kerning first=323 second=241 amount=-1 +kerning first=354 second=335 amount=-1 +kerning first=287 second=241 amount=-1 +kerning first=81 second=89 amount=-1 +kerning first=313 second=85 amount=-1 +kerning first=296 second=268 amount=-1 +kerning first=1053 second=1099 amount=-1 +kerning first=205 second=85 amount=-1 +kerning first=74 second=241 amount=-1 +kerning first=219 second=8249 amount=-2 +kerning first=244 second=46 amount=-1 +kerning first=118 second=8220 amount=-2 +kerning first=206 second=271 amount=-1 +kerning first=352 second=46 amount=-1 +kerning first=259 second=8220 amount=-2 +kerning first=86 second=339 amount=-1 +kerning first=223 second=8220 amount=-2 +kerning first=114 second=171 amount=-1 +kerning first=351 second=287 amount=-1 +kerning first=187 second=302 amount=-1 +kerning first=8217 second=286 amount=-1 +kerning first=205 second=225 amount=-1 +kerning first=194 second=118 amount=-1 +kerning first=279 second=287 amount=-1 +kerning first=219 second=269 amount=-1 +kerning first=367 second=8220 amount=-1 +kerning first=275 second=250 amount=-1 +kerning first=366 second=229 amount=-1 +kerning first=355 second=225 amount=-1 +kerning first=224 second=378 amount=-1 +kerning first=330 second=229 amount=-1 +kerning first=214 second=195 amount=-1 +kerning first=203 second=250 amount=-1 +kerning first=1047 second=1090 amount=-1 +kerning first=72 second=8221 amount=-1 +kerning first=70 second=67 amount=-1 +kerning first=119 second=378 amount=-1 +kerning first=198 second=344 amount=-1 +kerning first=219 second=278 amount=-1 +kerning first=103 second=46 amount=-1 +kerning first=218 second=8217 amount=-1 +kerning first=193 second=284 amount=-1 +kerning first=368 second=378 amount=-1 +kerning first=67 second=46 amount=-1 +kerning first=270 second=344 amount=-1 +kerning first=1039 second=1043 amount=-1 +kerning first=208 second=46 amount=-1 +kerning first=211 second=207 amount=-1 +kerning first=78 second=278 amount=-1 +kerning first=296 second=378 amount=-1 +kerning first=1027 second=1075 amount=-1 +kerning first=258 second=89 amount=-1 +kerning first=67 second=288 amount=-1 +kerning first=198 second=220 amount=-1 +kerning first=327 second=278 amount=-1 +kerning first=199 second=76 amount=-1 +kerning first=270 second=220 amount=-1 +kerning first=88 second=284 amount=-1 +kerning first=366 second=246 amount=-1 +kerning first=1039 second=1064 amount=-1 +kerning first=206 second=74 amount=-1 +kerning first=71 second=280 amount=-1 +kerning first=1041 second=1118 amount=-1 +kerning first=212 second=280 amount=-1 +kerning first=204 second=114 amount=-1 +kerning first=325 second=216 amount=-1 +kerning first=282 second=201 amount=-1 +kerning first=275 second=113 amount=-1 +kerning first=362 second=369 amount=-1 +kerning first=118 second=104 amount=-1 +kerning first=187 second=198 amount=-1 +kerning first=1051 second=1084 amount=-1 +kerning first=72 second=269 amount=-1 +kerning first=210 second=201 amount=-1 +kerning first=72 second=213 amount=-1 +kerning first=108 second=269 amount=-1 +kerning first=69 second=201 amount=-1 +kerning first=274 second=204 amount=-1 +kerning first=1028 second=1094 amount=-1 +kerning first=1054 second=1113 amount=-1 +kerning first=1064 second=1094 amount=-1 +kerning first=209 second=259 amount=-1 +kerning first=204 second=116 amount=-1 +kerning first=202 second=204 amount=-1 +kerning first=249 second=269 amount=-1 +kerning first=267 second=233 amount=-1 +kerning first=1031 second=1042 amount=-1 +kerning first=218 second=65 amount=-1 +kerning first=74 second=104 amount=-1 +kerning first=235 second=271 amount=-1 +kerning first=317 second=366 amount=-1 +kerning first=99 second=229 amount=-1 +kerning first=74 second=250 amount=-1 +kerning first=346 second=204 amount=-1 +kerning first=197 second=268 amount=-1 +kerning first=288 second=317 amount=-1 +kerning first=1030 second=1069 amount=-1 +kerning first=362 second=65 amount=-1 +kerning first=218 second=369 amount=-1 +kerning first=45 second=256 amount=-1 +kerning first=68 second=366 amount=-1 +kerning first=81 second=256 amount=-1 +kerning first=87 second=283 amount=-1 +kerning first=370 second=382 amount=-1 +kerning first=8218 second=255 amount=-1 +kerning first=262 second=73 amount=-1 +kerning first=77 second=262 amount=-1 +kerning first=334 second=73 amount=-1 +kerning first=298 second=73 amount=-1 +kerning first=8218 second=362 amount=-1 +kerning first=67 second=213 amount=-1 +kerning first=366 second=256 amount=-1 +kerning first=119 second=351 amount=-1 +kerning first=1031 second=1070 amount=-1 +kerning first=283 second=311 amount=-1 +kerning first=99 second=326 amount=-1 +kerning first=280 second=213 amount=-1 +kerning first=218 second=262 amount=-1 +kerning first=304 second=82 amount=-1 +kerning first=219 second=251 amount=-1 +kerning first=204 second=219 amount=-1 +kerning first=1052 second=1053 amount=-1 +kerning first=1046 second=1105 amount=-1 +kerning first=281 second=122 amount=-1 +kerning first=275 second=277 amount=-1 +kerning first=278 second=282 amount=-1 +kerning first=209 second=122 amount=-1 +kerning first=85 second=73 amount=-1 +kerning first=195 second=81 amount=-1 +kerning first=1058 second=1051 amount=-1 +kerning first=70 second=311 amount=-1 +kerning first=291 second=251 amount=-1 +kerning first=362 second=235 amount=-1 +kerning first=364 second=334 amount=-1 +kerning first=98 second=8221 amount=-2 +kerning first=367 second=345 amount=-1 +kerning first=204 second=283 amount=-1 +kerning first=203 second=8221 amount=-1 +kerning first=264 second=75 amount=-1 +kerning first=199 second=270 amount=-1 +kerning first=99 second=283 amount=-1 +kerning first=330 second=380 amount=-1 +kerning first=275 second=8221 amount=-2 +kerning first=197 second=187 amount=-1 +kerning first=311 second=8221 amount=-1 +kerning first=241 second=248 amount=-1 +kerning first=1048 second=1119 amount=-1 +kerning first=89 second=226 amount=-1 +kerning first=347 second=8221 amount=-2 +kerning first=205 second=248 amount=-1 +kerning first=366 second=380 amount=-1 +kerning first=74 second=218 amount=-1 +kerning first=367 second=279 amount=-1 +kerning first=221 second=196 amount=-1 +kerning first=217 second=336 amount=-1 +kerning first=73 second=245 amount=-1 +kerning first=339 second=242 amount=-1 +kerning first=80 second=196 amount=-1 +kerning first=241 second=232 amount=-1 +kerning first=231 second=242 amount=-1 +kerning first=81 second=66 amount=-1 +kerning first=234 second=311 amount=-1 +kerning first=302 second=226 amount=-1 +kerning first=45 second=66 amount=-1 +kerning first=325 second=336 amount=-1 +kerning first=374 second=226 amount=-1 +kerning first=327 second=277 amount=-1 +kerning first=240 second=283 amount=-1 +kerning first=258 second=370 amount=-1 +kerning first=8218 second=228 amount=-1 +kerning first=45 second=380 amount=-1 +kerning first=217 second=194 amount=-1 +kerning first=224 second=244 amount=-1 +kerning first=288 second=274 amount=-1 +kerning first=296 second=244 amount=-1 +kerning first=327 second=45 amount=-1 +kerning first=84 second=233 amount=-1 +kerning first=80 second=227 amount=-1 +kerning first=234 second=367 amount=-1 +kerning first=366 second=66 amount=-1 +kerning first=368 second=244 amount=-1 +kerning first=258 second=363 amount=-1 +kerning first=330 second=66 amount=-1 +kerning first=221 second=8222 amount=-2 +kerning first=225 second=233 amount=-1 +kerning first=261 second=233 amount=-1 +kerning first=116 second=8222 amount=-1 +kerning first=77 second=235 amount=-1 +kerning first=283 second=279 amount=-1 +kerning first=336 second=44 amount=-1 +kerning first=369 second=233 amount=-1 +kerning first=97 second=231 amount=-1 +kerning first=264 second=44 amount=-1 +kerning first=218 second=235 amount=-1 +kerning first=203 second=70 amount=-1 +kerning first=288 second=82 amount=-1 +kerning first=67 second=344 amount=-1 +kerning first=1071 second=1045 amount=-1 +kerning first=326 second=235 amount=-1 +kerning first=118 second=318 amount=-1 +kerning first=1058 second=1116 amount=-1 +kerning first=192 second=71 amount=-1 +kerning first=74 second=214 amount=-1 +kerning first=87 second=71 amount=-1 +kerning first=196 second=249 amount=-1 +kerning first=367 second=275 amount=-1 +kerning first=219 second=206 amount=-1 +kerning first=364 second=258 amount=-1 +kerning first=217 second=363 amount=-1 +kerning first=323 second=214 amount=-1 +kerning first=171 second=370 amount=-1 +kerning first=99 second=353 amount=-1 +kerning first=253 second=363 amount=-1 +kerning first=1050 second=1104 amount=-1 +kerning first=235 second=243 amount=-1 +kerning first=264 second=71 amount=-1 +kerning first=66 second=370 amount=-1 +kerning first=204 second=353 amount=-1 +kerning first=78 second=45 amount=-1 +kerning first=80 second=298 amount=-1 +kerning first=70 second=77 amount=-1 +kerning first=315 second=370 amount=-1 +kerning first=114 second=45 amount=-1 +kerning first=207 second=370 amount=-1 +kerning first=103 second=369 amount=-1 +kerning first=259 second=275 amount=-1 +kerning first=192 second=362 amount=-1 +kerning first=288 second=80 amount=-1 +kerning first=232 second=249 amount=-1 +kerning first=255 second=45 amount=-1 +kerning first=263 second=106 amount=-1 +kerning first=88 second=336 amount=-1 +kerning first=277 second=252 amount=-1 +kerning first=291 second=45 amount=-1 +kerning first=198 second=8250 amount=-1 +kerning first=335 second=106 amount=-1 +kerning first=219 second=45 amount=-2 +kerning first=106 second=234 amount=-1 +kerning first=370 second=267 amount=-1 +kerning first=45 second=250 amount=-1 +kerning first=70 second=234 amount=-1 +kerning first=83 second=217 amount=-1 +kerning first=1046 second=1028 amount=-1 +kerning first=221 second=223 amount=-1 +kerning first=283 second=234 amount=-1 +kerning first=226 second=267 amount=-1 +kerning first=262 second=267 amount=-1 +kerning first=206 second=336 amount=-1 +kerning first=355 second=234 amount=-1 +kerning first=82 second=8220 amount=-1 +kerning first=296 second=217 amount=-1 +kerning first=80 second=223 amount=-1 +kerning first=66 second=206 amount=-1 +kerning first=1064 second=1098 amount=-1 +kerning first=73 second=368 amount=-1 +kerning first=220 second=258 amount=-1 +kerning first=368 second=217 amount=-1 +kerning first=209 second=232 amount=-1 +kerning first=271 second=243 amount=-1 +kerning first=1044 second=1095 amount=-1 +kerning first=82 second=345 amount=-1 +kerning first=207 second=206 amount=-1 +kerning first=104 second=232 amount=-1 +kerning first=1053 second=1072 amount=-1 +kerning first=118 second=345 amount=-1 +kerning first=214 second=368 amount=-1 +kerning first=1116 second=1095 amount=-1 +kerning first=198 second=371 amount=-1 +kerning first=187 second=345 amount=-1 +kerning first=199 second=266 amount=-1 +kerning first=223 second=345 amount=-1 +kerning first=79 second=258 amount=-1 +kerning first=259 second=345 amount=-1 +kerning first=1040 second=1096 amount=-1 +kerning first=281 second=232 amount=-1 +kerning first=80 second=200 amount=-1 +kerning first=1050 second=1077 amount=-1 +kerning first=8218 second=281 amount=-1 +kerning first=70 second=315 amount=-1 +kerning first=77 second=370 amount=-1 +kerning first=88 second=8218 amount=-1 +kerning first=362 second=290 amount=-1 +kerning first=290 second=370 amount=-1 +kerning first=366 second=337 amount=-1 +kerning first=240 second=245 amount=-1 +kerning first=286 second=368 amount=-1 +kerning first=288 second=313 amount=-1 +kerning first=204 second=245 amount=-1 +kerning first=1047 second=1116 amount=-1 +kerning first=218 second=370 amount=-1 +kerning first=284 second=323 amount=-1 +kerning first=1070 second=1037 amount=-1 +kerning first=205 second=199 amount=-1 +kerning first=258 second=105 amount=-1 +kerning first=362 second=370 amount=-1 +kerning first=1065 second=1101 amount=-1 +kerning first=99 second=120 amount=-1 +kerning first=67 second=45 amount=-1 +kerning first=362 second=257 amount=-1 +kerning first=103 second=45 amount=-1 +kerning first=1056 second=1086 amount=-1 +kerning first=366 second=230 amount=-1 +kerning first=330 second=230 amount=-1 +kerning first=251 second=267 amount=-1 +kerning first=1038 second=1076 amount=-1 +kerning first=192 second=318 amount=-1 +kerning first=287 second=267 amount=-1 +kerning first=199 second=217 amount=-1 +kerning first=352 second=72 amount=-1 +kerning first=323 second=267 amount=-1 +kerning first=74 second=267 amount=-1 +kerning first=104 second=118 amount=-1 +kerning first=278 second=345 amount=-1 +kerning first=110 second=267 amount=-1 +kerning first=264 second=212 amount=-1 +kerning first=264 second=114 amount=-1 +kerning first=8222 second=108 amount=-1 +kerning first=99 second=245 amount=-1 +kerning first=233 second=115 amount=-1 +kerning first=364 second=350 amount=-1 +kerning first=269 second=115 amount=-1 +kerning first=87 second=114 amount=-1 +kerning first=282 second=8249 amount=-1 +kerning first=228 second=114 amount=-1 +kerning first=252 second=111 amount=-1 +kerning first=192 second=212 amount=-1 +kerning first=192 second=114 amount=-1 +kerning first=220 second=350 amount=-1 +kerning first=354 second=8249 amount=-1 +kerning first=192 second=254 amount=-1 +kerning first=324 second=111 amount=-1 +kerning first=271 second=333 amount=-1 +kerning first=264 second=254 amount=-1 +kerning first=304 second=81 amount=-1 +kerning first=204 second=218 amount=-1 +kerning first=86 second=231 amount=-1 +kerning first=223 second=318 amount=-1 +kerning first=1059 second=1119 amount=-1 +kerning first=259 second=318 amount=-1 +kerning first=201 second=367 amount=-1 +kerning first=98 second=44 amount=-1 +kerning first=1034 second=1064 amount=-1 +kerning first=268 second=81 amount=-1 +kerning first=314 second=382 amount=-1 +kerning first=368 second=352 amount=-1 +kerning first=311 second=44 amount=-1 +kerning first=70 second=273 amount=-1 +kerning first=75 second=355 amount=-1 +kerning first=345 second=187 amount=-1 +kerning first=283 second=380 amount=-1 +kerning first=1052 second=1062 amount=-1 +kerning first=8218 second=254 amount=-1 +kerning first=108 second=275 amount=-1 +kerning first=1056 second=1059 amount=-1 +kerning first=368 second=258 amount=-1 +kerning first=204 second=78 amount=-1 +kerning first=252 second=248 amount=-1 +kerning first=249 second=289 amount=-1 +kerning first=67 second=72 amount=-1 +kerning first=280 second=72 amount=-1 +kerning first=105 second=113 amount=-1 +kerning first=199 second=282 amount=-1 +kerning first=85 second=332 amount=-1 +kerning first=1064 second=1055 amount=-1 +kerning first=282 second=8222 amount=-1 +kerning first=298 second=332 amount=-1 +kerning first=246 second=8222 amount=-1 +kerning first=262 second=332 amount=-1 +kerning first=210 second=8222 amount=-1 +kerning first=81 second=330 amount=-1 +kerning first=105 second=8222 amount=-1 +kerning first=264 second=346 amount=-1 +kerning first=259 second=279 amount=-1 +kerning first=69 second=8222 amount=-1 +kerning first=1066 second=1070 amount=-1 +kerning first=192 second=87 amount=-1 +kerning first=1030 second=1070 amount=-1 +kerning first=370 second=332 amount=-1 +kerning first=277 second=291 amount=-1 +kerning first=368 second=8250 amount=-2 +kerning first=241 second=291 amount=-1 +kerning first=305 second=187 amount=-1 +kerning first=368 second=263 amount=-1 +kerning first=79 second=323 amount=-1 +kerning first=193 second=288 amount=-1 +kerning first=233 second=187 amount=-1 +kerning first=117 second=337 amount=-1 +kerning first=100 second=291 amount=-1 +kerning first=269 second=187 amount=-1 +kerning first=204 second=231 amount=-1 +kerning first=196 second=81 amount=-1 +kerning first=296 second=352 amount=-1 +kerning first=354 second=8222 amount=-1 +kerning first=220 second=323 amount=-1 +kerning first=1068 second=1050 amount=-1 +kerning first=203 second=211 amount=-1 +kerning first=80 second=86 amount=-1 +kerning first=70 second=338 amount=-1 +kerning first=307 second=46 amount=-1 +kerning first=270 second=198 amount=-1 +kerning first=330 second=268 amount=-1 +kerning first=1067 second=1083 amount=-1 +kerning first=291 second=287 amount=-1 +kerning first=1042 second=1034 amount=-1 +kerning first=296 second=325 amount=-1 +kerning first=87 second=281 amount=-1 +kerning first=368 second=325 amount=-1 +kerning first=85 second=99 amount=-1 +kerning first=1066 second=1043 amount=-1 +kerning first=1041 second=1069 amount=-1 +kerning first=323 second=73 amount=-1 +kerning first=298 second=99 amount=-1 +kerning first=75 second=290 amount=-1 +kerning first=268 second=314 amount=-1 +kerning first=366 second=207 amount=-1 +kerning first=193 second=369 amount=-1 +kerning first=74 second=202 amount=-1 +kerning first=232 second=314 amount=-1 +kerning first=45 second=268 amount=-1 +kerning first=235 second=347 amount=-1 +kerning first=78 second=110 amount=-1 +kerning first=226 second=99 amount=-1 +kerning first=196 second=314 amount=-1 +kerning first=88 second=369 amount=-1 +kerning first=262 second=8250 amount=-1 +kerning first=258 second=268 amount=-1 +kerning first=199 second=347 amount=-1 +kerning first=226 second=8250 amount=-1 +kerning first=370 second=99 amount=-1 +kerning first=8217 second=339 amount=-1 +kerning first=219 second=110 amount=-1 +kerning first=323 second=202 amount=-1 +kerning first=364 second=117 amount=-1 +kerning first=327 second=110 amount=-1 +kerning first=89 second=334 amount=-1 +kerning first=81 second=364 amount=-1 +kerning first=1107 second=1087 amount=-1 +kerning first=264 second=277 amount=-1 +kerning first=45 second=364 amount=-1 +kerning first=79 second=218 amount=-1 +kerning first=74 second=73 amount=-1 +kerning first=228 second=277 amount=-1 +kerning first=81 second=8217 amount=-2 +kerning first=85 second=171 amount=-2 +kerning first=266 second=334 amount=-1 +kerning first=205 second=264 amount=-1 +kerning first=287 second=104 amount=-1 +kerning first=194 second=334 amount=-1 +kerning first=235 second=351 amount=-1 +kerning first=374 second=334 amount=-1 +kerning first=1033 second=1030 amount=-1 +kerning first=270 second=69 amount=-1 +kerning first=193 second=121 amount=-1 +kerning first=1069 second=1030 amount=-1 +kerning first=196 second=108 amount=-1 +kerning first=366 second=8217 amount=-1 +kerning first=302 second=334 amount=-1 +kerning first=366 second=364 amount=-1 +kerning first=231 second=101 amount=-1 +kerning first=338 second=334 amount=-1 +kerning first=330 second=364 amount=-1 +kerning first=1041 second=1065 amount=-1 +kerning first=117 second=8217 amount=-1 +kerning first=1060 second=1070 amount=-1 +kerning first=1052 second=1050 amount=-1 +kerning first=258 second=364 amount=-1 +kerning first=267 second=101 amount=-1 +kerning first=1036 second=1117 amount=-1 +kerning first=118 second=380 amount=-1 +kerning first=222 second=8217 amount=-2 +kerning first=83 second=325 amount=-1 +kerning first=68 second=193 amount=-1 +kerning first=232 second=108 amount=-1 +kerning first=258 second=8217 amount=-2 +kerning first=374 second=187 amount=-1 +kerning first=339 second=101 amount=-1 +kerning first=283 second=273 amount=-1 +kerning first=268 second=108 amount=-1 +kerning first=1047 second=1051 amount=-1 +kerning first=199 second=103 amount=-1 +kerning first=234 second=263 amount=-1 +kerning first=202 second=296 amount=-1 +kerning first=1053 second=1089 amount=-1 +kerning first=198 second=171 amount=-1 +kerning first=193 second=365 amount=-1 +kerning first=1039 second=1039 amount=-1 +kerning first=366 second=203 amount=-1 +kerning first=75 second=286 amount=-1 +kerning first=69 second=8249 amount=-1 +kerning first=1052 second=1049 amount=-1 +kerning first=80 second=82 amount=-1 +kerning first=105 second=8249 amount=-1 +kerning first=346 second=296 amount=-1 +kerning first=206 second=298 amount=-1 +kerning first=1067 second=1068 amount=-1 +kerning first=278 second=298 amount=-1 +kerning first=304 second=241 amount=-1 +kerning first=269 second=229 amount=-1 +kerning first=314 second=363 amount=-1 +kerning first=350 second=298 amount=-1 +kerning first=330 second=203 amount=-1 +kerning first=220 second=117 amount=-1 +kerning first=45 second=203 amount=-1 +kerning first=232 second=287 amount=-1 +kerning first=197 second=211 amount=-1 +kerning first=208 second=44 amount=-1 +kerning first=364 second=369 amount=-1 +kerning first=374 second=8222 amount=-2 +kerning first=74 second=313 amount=-1 +kerning first=68 second=220 amount=-1 +kerning first=1071 second=1083 amount=-1 +kerning first=67 second=278 amount=-1 +kerning first=227 second=339 amount=-1 +kerning first=313 second=356 amount=-1 +kerning first=74 second=77 amount=-1 +kerning first=323 second=100 amount=-1 +kerning first=111 second=382 amount=-1 +kerning first=263 second=339 amount=-1 +kerning first=8218 second=87 amount=-2 +kerning first=355 second=246 amount=-1 +kerning first=1052 second=1118 amount=-1 +kerning first=228 second=281 amount=-1 +kerning first=317 second=220 amount=-1 +kerning first=378 second=171 amount=-1 +kerning first=282 second=304 amount=-1 +kerning first=264 second=281 amount=-1 +kerning first=283 second=246 amount=-1 +kerning first=100 second=333 amount=-1 +kerning first=1067 second=1076 amount=-1 +kerning first=194 second=307 amount=-1 +kerning first=209 second=220 amount=-1 +kerning first=1053 second=1060 amount=-1 +kerning first=69 second=304 amount=-1 +kerning first=1039 second=1092 amount=-1 +kerning first=352 second=278 amount=-1 +kerning first=270 second=194 amount=-1 +kerning first=307 second=103 amount=-1 +kerning first=241 second=333 amount=-1 +kerning first=106 second=246 amount=-1 +kerning first=271 second=103 amount=-1 +kerning first=277 second=333 amount=-1 +kerning first=80 second=330 amount=-1 +kerning first=323 second=77 amount=-1 +kerning first=70 second=246 amount=-1 +kerning first=210 second=304 amount=-1 +kerning first=235 second=103 amount=-1 +kerning first=305 second=246 amount=-1 +kerning first=1064 second=1039 amount=-1 +kerning first=218 second=8222 amount=-2 +kerning first=269 second=246 amount=-1 +kerning first=266 second=382 amount=-1 +kerning first=202 second=223 amount=-1 +kerning first=246 second=103 amount=-1 +kerning first=217 second=298 amount=-1 +kerning first=362 second=77 amount=-1 +kerning first=77 second=8222 amount=-1 +kerning first=374 second=382 amount=-1 +kerning first=210 second=330 amount=-1 +kerning first=105 second=103 amount=-1 +kerning first=290 second=77 amount=-1 +kerning first=362 second=304 amount=-1 +kerning first=282 second=330 amount=-1 +kerning first=97 second=269 amount=-1 +kerning first=218 second=77 amount=-1 +kerning first=325 second=298 amount=-1 +kerning first=233 second=333 amount=-1 +kerning first=1094 second=1095 amount=-1 +kerning first=66 second=65 amount=-1 +kerning first=217 second=211 amount=-1 +kerning first=269 second=333 amount=-1 +kerning first=218 second=304 amount=-1 +kerning first=302 second=68 amount=-1 +kerning first=370 second=365 amount=-1 +kerning first=266 second=68 amount=-1 +kerning first=290 second=304 amount=-1 +kerning first=106 second=289 amount=-1 +kerning first=362 second=8222 amount=-2 +kerning first=228 second=283 amount=-1 +kerning first=305 second=333 amount=-1 +kerning first=87 second=103 amount=-1 +kerning first=290 second=8222 amount=-1 +kerning first=77 second=304 amount=-1 +kerning first=1052 second=1048 amount=-1 +kerning first=254 second=8222 amount=-1 +kerning first=203 second=315 amount=-1 +kerning first=214 second=260 amount=-1 +kerning first=70 second=109 amount=-1 +kerning first=1070 second=1044 amount=-1 +kerning first=252 second=339 amount=-1 +kerning first=257 second=339 amount=-1 +kerning first=211 second=88 amount=-1 +kerning first=266 second=107 amount=-1 +kerning first=268 second=347 amount=-1 +kerning first=267 second=281 amount=-1 +kerning first=67 second=111 amount=-1 +kerning first=325 second=211 amount=-1 +kerning first=1064 second=1031 amount=-1 +kerning first=1052 second=1108 amount=-1 +kerning first=103 second=111 amount=-1 +kerning first=1039 second=1051 amount=-1 +kerning first=210 second=196 amount=-1 +kerning first=339 second=281 amount=-1 +kerning first=296 second=313 amount=-1 +kerning first=232 second=347 amount=-1 +kerning first=77 second=77 amount=-1 +kerning first=305 second=289 amount=-1 +kerning first=8216 second=198 amount=-2 +kerning first=327 second=290 amount=-1 +kerning first=1058 second=1117 amount=-1 +kerning first=83 second=313 amount=-1 +kerning first=1051 second=1042 amount=-1 +kerning first=69 second=330 amount=-1 +kerning first=364 second=69 amount=-1 +kerning first=1047 second=1025 amount=-1 +kerning first=232 second=120 amount=-1 +kerning first=324 second=339 amount=-1 +kerning first=268 second=120 amount=-1 +kerning first=86 second=264 amount=-1 +kerning first=354 second=103 amount=-1 +kerning first=103 second=251 amount=-1 +kerning first=316 second=251 amount=-1 +kerning first=69 second=76 amount=-1 +kerning first=352 second=251 amount=-1 +kerning first=8217 second=264 amount=-1 +kerning first=280 second=251 amount=-1 +kerning first=333 second=8217 amount=-2 +kerning first=226 second=378 amount=-1 +kerning first=84 second=8217 amount=-1 +kerning first=298 second=76 amount=-1 +kerning first=192 second=8221 amount=-2 +kerning first=218 second=225 amount=-1 +kerning first=120 second=8217 amount=-1 +kerning first=228 second=8221 amount=-2 +kerning first=288 second=85 amount=-1 +kerning first=8217 second=351 amount=-1 +kerning first=231 second=254 amount=-1 +kerning first=217 second=271 amount=-1 +kerning first=220 second=242 amount=-1 +kerning first=279 second=245 amount=-1 +kerning first=362 second=331 amount=-1 +kerning first=267 second=254 amount=-1 +kerning first=325 second=271 amount=-1 +kerning first=336 second=8221 amount=-2 +kerning first=87 second=212 amount=-1 +kerning first=207 second=245 amount=-1 +kerning first=339 second=254 amount=-1 +kerning first=213 second=221 amount=-1 +kerning first=328 second=242 amount=-1 +kerning first=375 second=254 amount=-1 +kerning first=75 second=85 amount=-1 +kerning first=364 second=242 amount=-1 +kerning first=218 second=331 amount=-1 +kerning first=321 second=221 amount=-1 +kerning first=283 second=289 amount=-1 +kerning first=327 second=203 amount=-1 +kerning first=121 second=365 amount=-1 +kerning first=258 second=67 amount=-1 +kerning first=1027 second=1113 amount=-1 +kerning first=8216 second=351 amount=-1 +kerning first=355 second=289 amount=-1 +kerning first=1052 second=1075 amount=-1 +kerning first=77 second=331 amount=-1 +kerning first=85 second=365 amount=-1 +kerning first=70 second=229 amount=-1 +kerning first=219 second=203 amount=-1 +kerning first=221 second=288 amount=-1 +kerning first=1046 second=1104 amount=-1 +kerning first=73 second=233 amount=-1 +kerning first=45 second=67 amount=-1 +kerning first=270 second=366 amount=-1 +kerning first=109 second=233 amount=-1 +kerning first=195 second=254 amount=-1 +kerning first=244 second=8220 amount=-2 +kerning first=8250 second=252 amount=-1 +kerning first=78 second=203 amount=-1 +kerning first=187 second=280 amount=-1 +kerning first=250 second=233 amount=-1 +kerning first=263 second=248 amount=-1 +kerning first=339 second=8222 amount=-1 +kerning first=282 second=357 amount=-1 +kerning first=196 second=374 amount=-1 +kerning first=69 second=357 amount=-1 +kerning first=355 second=229 amount=-1 +kerning first=282 second=76 amount=-1 +kerning first=1076 second=1084 amount=-1 +kerning first=1030 second=1118 amount=-1 +kerning first=210 second=76 amount=-1 +kerning first=192 second=363 amount=-1 +kerning first=356 second=122 amount=-1 +kerning first=248 second=122 amount=-1 +kerning first=219 second=317 amount=-1 +kerning first=85 second=224 amount=-1 +kerning first=287 second=114 amount=-1 +kerning first=1053 second=1117 amount=-1 +kerning first=214 second=207 amount=-1 +kerning first=298 second=224 amount=-1 +kerning first=327 second=317 amount=-1 +kerning first=1039 second=1104 amount=-1 +kerning first=200 second=250 amount=-1 +kerning first=1027 second=1087 amount=-1 +kerning first=286 second=207 amount=-1 +kerning first=262 second=224 amount=-1 +kerning first=8250 second=200 amount=-1 +kerning first=67 second=311 amount=-1 +kerning first=86 second=378 amount=-1 +kerning first=1118 second=1093 amount=-1 +kerning first=206 second=259 amount=-1 +kerning first=80 second=201 amount=-1 +kerning first=103 second=311 amount=-1 +kerning first=198 second=366 amount=-1 +kerning first=370 second=224 amount=-1 +kerning first=81 second=354 amount=-1 +kerning first=364 second=216 amount=-1 +kerning first=70 second=256 amount=-1 +kerning first=199 second=244 amount=-1 +kerning first=263 second=378 amount=-1 +kerning first=235 second=244 amount=-1 +kerning first=227 second=378 amount=-1 +kerning first=330 second=67 amount=-1 +kerning first=271 second=244 amount=-1 +kerning first=78 second=317 amount=-1 +kerning first=366 second=67 amount=-1 +kerning first=307 second=244 amount=-1 +kerning first=310 second=8249 amount=-1 +kerning first=1040 second=1063 amount=-2 +kerning first=88 second=262 amount=-1 +kerning first=1065 second=1095 amount=-1 +kerning first=370 second=198 amount=-1 +kerning first=1105 second=1096 amount=-1 +kerning first=302 second=268 amount=-1 +kerning first=314 second=235 amount=-1 +kerning first=193 second=262 amount=-1 +kerning first=334 second=198 amount=-1 +kerning first=266 second=268 amount=-1 +kerning first=101 second=117 amount=-1 +kerning first=209 second=210 amount=-1 +kerning first=1060 second=1049 amount=-1 +kerning first=364 second=302 amount=-1 +kerning first=1105 second=1095 amount=-1 +kerning first=8218 second=97 amount=-1 +kerning first=211 second=256 amount=-1 +kerning first=279 second=98 amount=-1 +kerning first=220 second=302 amount=-1 +kerning first=198 second=345 amount=-1 +kerning first=1051 second=1101 amount=-1 +kerning first=108 second=335 amount=-1 +kerning first=234 second=345 amount=-1 +kerning first=249 second=335 amount=-1 +kerning first=323 second=219 amount=-1 +kerning first=362 second=262 amount=-1 +kerning first=268 second=206 amount=-1 +kerning first=304 second=206 amount=-1 +kerning first=85 second=198 amount=-1 +kerning first=79 second=302 amount=-1 +kerning first=194 second=268 amount=-1 +kerning first=204 second=259 amount=-1 +kerning first=89 second=268 amount=-1 +kerning first=8250 second=313 amount=-1 +kerning first=1055 second=1053 amount=-1 +kerning first=263 second=351 amount=-1 +kerning first=227 second=231 amount=-1 +kerning first=316 second=335 amount=-1 +kerning first=263 second=231 amount=-1 +kerning first=8222 second=374 amount=-2 +kerning first=1064 second=1099 amount=-1 +kerning first=78 second=290 amount=-1 +kerning first=45 second=381 amount=-1 +kerning first=369 second=171 amount=-1 +kerning first=1118 second=1091 amount=-1 +kerning first=205 second=226 amount=-1 +kerning first=81 second=88 amount=-1 +kerning first=187 second=73 amount=-1 +kerning first=203 second=368 amount=-1 +kerning first=85 second=197 amount=-1 +kerning first=280 second=338 amount=-1 +kerning first=1062 second=1119 amount=-1 +kerning first=1056 second=1038 amount=-1 +kerning first=79 second=82 amount=-1 +kerning first=221 second=214 amount=-1 +kerning first=218 second=8249 amount=-2 +kerning first=78 second=8249 amount=-1 +kerning first=1030 second=1031 amount=-1 +kerning first=86 second=351 amount=-1 +kerning first=296 second=286 amount=-1 +kerning first=290 second=8249 amount=-1 +kerning first=199 second=8218 amount=-1 +kerning first=370 second=197 amount=-1 +kerning first=229 second=283 amount=-1 +kerning first=326 second=8249 amount=-1 +kerning first=334 second=197 amount=-1 +kerning first=368 second=286 amount=-1 +kerning first=362 second=8249 amount=-2 +kerning first=1066 second=1031 amount=-1 +kerning first=67 second=338 amount=-1 +kerning first=100 second=245 amount=-1 +kerning first=280 second=45 amount=-1 +kerning first=121 second=171 amount=-1 +kerning first=205 second=274 amount=-1 +kerning first=226 second=171 amount=-1 +kerning first=198 second=79 amount=-1 +kerning first=314 second=113 amount=-1 +kerning first=316 second=45 amount=-1 +kerning first=352 second=45 amount=-1 +kerning first=77 second=8249 amount=-1 +kerning first=250 second=242 amount=-1 +kerning first=229 second=235 amount=-1 +kerning first=264 second=70 amount=-1 +kerning first=8222 second=81 amount=-1 +kerning first=1059 second=1074 amount=-1 +kerning first=255 second=378 amount=-1 +kerning first=1041 second=1064 amount=-1 +kerning first=366 second=8221 amount=-1 +kerning first=74 second=192 amount=-1 +kerning first=1039 second=1077 amount=-1 +kerning first=87 second=363 amount=-1 +kerning first=1058 second=1090 amount=-1 +kerning first=1069 second=1069 amount=-1 +kerning first=271 second=380 amount=-1 +kerning first=196 second=286 amount=-1 +kerning first=1052 second=1027 amount=-1 +kerning first=103 second=252 amount=-1 +kerning first=298 second=344 amount=-1 +kerning first=83 second=205 amount=-1 +kerning first=262 second=344 amount=-1 +kerning first=296 second=205 amount=-1 +kerning first=370 second=344 amount=-1 +kerning first=334 second=344 amount=-1 +kerning first=330 second=115 amount=-1 +kerning first=83 second=80 amount=-1 +kerning first=280 second=252 amount=-1 +kerning first=201 second=284 amount=-1 +kerning first=366 second=115 amount=-1 +kerning first=194 second=89 amount=-1 +kerning first=1031 second=1076 amount=-1 +kerning first=323 second=368 amount=-1 +kerning first=304 second=261 amount=-1 +kerning first=268 second=261 amount=-1 +kerning first=298 second=205 amount=-1 +kerning first=8218 second=111 amount=-1 +kerning first=252 second=231 amount=-1 +kerning first=111 second=106 amount=-1 +kerning first=210 second=217 amount=-1 +kerning first=290 second=204 amount=-1 +kerning first=324 second=231 amount=-1 +kerning first=282 second=217 amount=-1 +kerning first=85 second=344 amount=-1 +kerning first=1038 second=1044 amount=-1 +kerning first=87 second=97 amount=-1 +kerning first=74 second=332 amount=-1 +kerning first=261 second=103 amount=-1 +kerning first=362 second=223 amount=-1 +kerning first=99 second=235 amount=-1 +kerning first=269 second=45 amount=-1 +kerning first=84 second=347 amount=-1 +kerning first=232 second=353 amount=-1 +kerning first=282 second=249 amount=-1 +kerning first=267 second=275 amount=-1 +kerning first=204 second=235 amount=-1 +kerning first=197 second=45 amount=-1 +kerning first=304 second=353 amount=-1 +kerning first=240 second=235 amount=-1 +kerning first=200 second=71 amount=-1 +kerning first=1071 second=1028 amount=-1 +kerning first=339 second=275 amount=-1 +kerning first=268 second=353 amount=-1 +kerning first=1067 second=1028 amount=-1 +kerning first=220 second=362 amount=-1 +kerning first=352 second=252 amount=-1 +kerning first=296 second=80 amount=-1 +kerning first=207 second=111 amount=-1 +kerning first=77 second=223 amount=-1 +kerning first=103 second=234 amount=-1 +kerning first=364 second=362 amount=-1 +kerning first=8218 second=271 amount=-1 +kerning first=264 second=97 amount=-1 +kerning first=290 second=223 amount=-1 +kerning first=99 second=240 amount=-1 +kerning first=68 second=323 amount=-1 +kerning first=97 second=243 amount=-1 +kerning first=218 second=223 amount=-1 +kerning first=368 second=80 amount=-1 +kerning first=8222 second=288 amount=-1 +kerning first=270 second=258 amount=-1 +kerning first=119 second=107 amount=-1 +kerning first=314 second=232 amount=-1 +kerning first=1105 second=1093 amount=-1 +kerning first=87 second=336 amount=-1 +kerning first=1062 second=1080 amount=-1 +kerning first=209 second=323 amount=-1 +kerning first=75 second=199 amount=-1 +kerning first=67 second=317 amount=-1 +kerning first=73 second=357 amount=-1 +kerning first=192 second=336 amount=-1 +kerning first=283 second=337 amount=-1 +kerning first=109 second=119 amount=-1 +kerning first=1065 second=1079 amount=-1 +kerning first=291 second=311 amount=-1 +kerning first=264 second=336 amount=-1 +kerning first=323 second=8250 amount=-1 +kerning first=67 second=225 amount=-1 +kerning first=69 second=249 amount=-1 +kerning first=287 second=8250 amount=-1 +kerning first=213 second=205 amount=-1 +kerning first=337 second=382 amount=-1 +kerning first=187 second=328 amount=-1 +kerning first=109 second=234 amount=-1 +kerning first=220 second=226 amount=-1 +kerning first=73 second=234 amount=-1 +kerning first=1051 second=1041 amount=-1 +kerning first=269 second=105 amount=-1 +kerning first=206 second=232 amount=-1 +kerning first=257 second=314 amount=-1 +kerning first=67 second=110 amount=-1 +kerning first=1091 second=1091 amount=-1 +kerning first=210 second=72 amount=-1 +kerning first=187 second=361 amount=-1 +kerning first=101 second=232 amount=-1 +kerning first=250 second=234 amount=-1 +kerning first=1038 second=1071 amount=-1 +kerning first=1107 second=1088 amount=-1 +kerning first=1040 second=1076 amount=-1 +kerning first=103 second=110 amount=-1 +kerning first=204 second=327 amount=-1 +kerning first=8250 second=288 amount=-1 +kerning first=220 second=198 amount=-1 +kerning first=1053 second=1055 amount=-1 +kerning first=197 second=105 amount=-1 +kerning first=240 second=267 amount=-1 +kerning first=8222 second=261 amount=-1 +kerning first=8250 second=286 amount=-1 +kerning first=209 second=368 amount=-1 +kerning first=283 second=8222 amount=-1 +kerning first=65 second=108 amount=-1 +kerning first=81 second=115 amount=-1 +kerning first=287 second=305 amount=-1 +kerning first=275 second=114 amount=-1 +kerning first=1044 second=1096 amount=-1 +kerning first=1059 second=1097 amount=-1 +kerning first=1027 second=1114 amount=-1 +kerning first=97 second=335 amount=-1 +kerning first=305 second=337 amount=-1 +kerning first=88 second=370 amount=-1 +kerning first=258 second=187 amount=-1 +kerning first=98 second=114 amount=-1 +kerning first=274 second=81 amount=-1 +kerning first=234 second=318 amount=-1 +kerning first=203 second=114 amount=-1 +kerning first=1057 second=1046 amount=-1 +kerning first=277 second=46 amount=-1 +kerning first=221 second=242 amount=-1 +kerning first=68 second=69 amount=-1 +kerning first=328 second=101 amount=-1 +kerning first=366 second=273 amount=-1 +kerning first=356 second=269 amount=-1 +kerning first=8250 second=80 amount=-1 +kerning first=330 second=273 amount=-1 +kerning first=116 second=228 amount=-1 +kerning first=80 second=81 amount=-1 +kerning first=364 second=101 amount=-1 +kerning first=72 second=227 amount=-1 +kerning first=221 second=81 amount=-1 +kerning first=202 second=363 amount=-1 +kerning first=71 second=73 amount=-1 +kerning first=363 second=111 amount=-1 +kerning first=207 second=331 amount=-1 +kerning first=272 second=44 amount=-1 +kerning first=323 second=78 amount=-1 +kerning first=8250 second=205 amount=-1 +kerning first=74 second=78 amount=-1 +kerning first=116 second=287 amount=-1 +kerning first=277 second=355 amount=-1 +kerning first=325 second=296 amount=-1 +kerning first=210 second=44 amount=-1 +kerning first=205 second=355 amount=-1 +kerning first=282 second=282 amount=-1 +kerning first=344 second=44 amount=-1 +kerning first=1068 second=1024 amount=-1 +kerning first=210 second=282 amount=-1 +kerning first=257 second=287 amount=-1 +kerning first=196 second=288 amount=-1 +kerning first=217 second=346 amount=-1 +kerning first=69 second=282 amount=-1 +kerning first=85 second=83 amount=-1 +kerning first=304 second=288 amount=-1 +kerning first=365 second=287 amount=-1 +kerning first=268 second=288 amount=-1 +kerning first=262 second=83 amount=-1 +kerning first=106 second=337 amount=-1 +kerning first=298 second=83 amount=-1 +kerning first=219 second=230 amount=-1 +kerning first=324 second=291 amount=-1 +kerning first=327 second=230 amount=-1 +kerning first=199 second=352 amount=-1 +kerning first=370 second=83 amount=-1 +kerning first=271 second=277 amount=-1 +kerning first=252 second=291 amount=-1 +kerning first=78 second=230 amount=-1 +kerning first=370 second=243 amount=-1 +kerning first=282 second=274 amount=-1 +kerning first=325 second=346 amount=-1 +kerning first=111 second=291 amount=-1 +kerning first=114 second=230 amount=-1 +kerning first=192 second=303 amount=-1 +kerning first=1053 second=1034 amount=-1 +kerning first=199 second=219 amount=-1 +kerning first=370 second=371 amount=-1 +kerning first=72 second=200 amount=-1 +kerning first=338 second=187 amount=-1 +kerning first=85 second=67 amount=-1 +kerning first=87 second=211 amount=-1 +kerning first=257 second=108 amount=-1 +kerning first=226 second=279 amount=-1 +kerning first=314 second=291 amount=-1 +kerning first=220 second=74 amount=-1 +kerning first=1077 second=1091 amount=-1 +kerning first=240 second=8218 amount=-1 +kerning first=262 second=279 amount=-1 +kerning first=86 second=269 amount=-1 +kerning first=70 second=316 amount=-1 +kerning first=370 second=279 amount=-1 +kerning first=364 second=74 amount=-1 +kerning first=290 second=323 amount=-1 +kerning first=327 second=209 amount=-1 +kerning first=89 second=187 amount=-1 +kerning first=85 second=371 amount=-1 +kerning first=227 second=269 amount=-1 +kerning first=263 second=269 amount=-1 +kerning first=100 second=382 amount=-1 +kerning first=74 second=99 amount=-1 +kerning first=344 second=71 amount=-1 +kerning first=110 second=99 amount=-1 +kerning first=192 second=255 amount=-1 +kerning first=205 second=382 amount=-1 +kerning first=192 second=211 amount=-1 +kerning first=323 second=99 amount=-1 +kerning first=283 second=316 amount=-1 +kerning first=221 second=250 amount=-1 +kerning first=194 second=187 amount=-1 +kerning first=277 second=382 amount=-1 +kerning first=264 second=211 amount=-1 +kerning first=213 second=200 amount=-1 +kerning first=99 second=8218 amount=-1 +kerning first=207 second=266 amount=-1 +kerning first=230 second=187 amount=-1 +kerning first=287 second=99 amount=-1 +kerning first=85 second=279 amount=-1 +kerning first=205 second=334 amount=-1 +kerning first=218 second=281 amount=-1 +kerning first=204 second=202 amount=-1 +kerning first=249 second=248 amount=-1 +kerning first=73 second=8217 amount=-1 +kerning first=375 second=8220 amount=-2 +kerning first=346 second=270 amount=-1 +kerning first=1050 second=1116 amount=-1 +kerning first=218 second=196 amount=-1 +kerning first=72 second=248 amount=-1 +kerning first=66 second=352 amount=-1 +kerning first=375 second=367 amount=-1 +kerning first=1041 second=1043 amount=-1 +kerning first=45 second=214 amount=-1 +kerning first=207 second=218 amount=-1 +kerning first=108 second=248 amount=-1 +kerning first=281 second=117 amount=-1 +kerning first=362 second=196 amount=-1 +kerning first=267 second=367 amount=-1 +kerning first=90 second=8220 amount=-1 +kerning first=231 second=367 amount=-1 +kerning first=1047 second=1052 amount=-1 +kerning first=368 second=205 amount=-1 +kerning first=339 second=367 amount=-1 +kerning first=219 second=209 amount=-1 +kerning first=211 second=364 amount=-1 +kerning first=75 second=264 amount=-1 +kerning first=274 second=270 amount=-1 +kerning first=73 second=380 amount=-1 +kerning first=267 second=8220 amount=-2 +kerning first=231 second=8220 amount=-2 +kerning first=1069 second=1084 amount=-1 +kerning first=202 second=270 amount=-1 +kerning first=339 second=8220 amount=-2 +kerning first=1048 second=1097 amount=-1 +kerning first=199 second=325 amount=-1 +kerning first=84 second=277 amount=-1 +kerning first=344 second=8217 amount=-1 +kerning first=197 second=251 amount=-1 +kerning first=323 second=284 amount=-1 +kerning first=246 second=108 amount=-1 +kerning first=380 second=8217 amount=-1 +kerning first=1069 second=1047 amount=-1 +kerning first=194 second=262 amount=-1 +kerning first=362 second=82 amount=-1 +kerning first=1064 second=1034 amount=-1 +kerning first=194 second=290 amount=-1 +kerning first=187 second=217 amount=-1 +kerning first=261 second=277 amount=-1 +kerning first=105 second=242 amount=-1 +kerning first=362 second=202 amount=-1 +kerning first=225 second=277 amount=-1 +kerning first=266 second=290 amount=-1 +kerning first=197 second=338 amount=-1 +kerning first=302 second=290 amount=-1 +kerning first=269 second=251 amount=-1 +kerning first=338 second=290 amount=-1 +kerning first=76 second=8221 amount=-1 +kerning first=258 second=316 amount=-1 +kerning first=84 second=8250 amount=-1 +kerning first=78 second=355 amount=-1 +kerning first=217 second=8221 amount=-1 +kerning first=212 second=193 amount=-1 +kerning first=230 second=311 amount=-1 +kerning first=209 second=242 amount=-1 +kerning first=253 second=8221 amount=-2 +kerning first=240 second=99 amount=-1 +kerning first=289 second=8221 amount=-2 +kerning first=77 second=82 amount=-1 +kerning first=99 second=99 amount=-1 +kerning first=325 second=8221 amount=-1 +kerning first=218 second=82 amount=-1 +kerning first=1052 second=1043 amount=-1 +kerning first=1039 second=1056 amount=-1 +kerning first=67 second=333 amount=-1 +kerning first=201 second=78 amount=-1 +kerning first=281 second=242 amount=-1 +kerning first=72 second=286 amount=-1 +kerning first=345 second=171 amount=-1 +kerning first=1047 second=1030 amount=-1 +kerning first=327 second=355 amount=-1 +kerning first=304 second=282 amount=-1 +kerning first=69 second=325 amount=-1 +kerning first=103 second=333 amount=-1 +kerning first=198 second=117 amount=-1 +kerning first=219 second=355 amount=-1 +kerning first=314 second=114 amount=-1 +kerning first=210 second=325 amount=-1 +kerning first=356 second=100 amount=-1 +kerning first=8217 second=199 amount=-1 +kerning first=282 second=325 amount=-1 +kerning first=193 second=104 amount=-1 +kerning first=275 second=233 amount=-1 +kerning first=201 second=171 amount=-1 +kerning first=1053 second=1039 amount=-1 +kerning first=1064 second=1043 amount=-1 +kerning first=78 second=382 amount=-1 +kerning first=212 second=220 amount=-1 +kerning first=1064 second=1104 amount=-1 +kerning first=199 second=330 amount=-1 +kerning first=364 second=194 amount=-1 +kerning first=365 second=103 amount=-1 +kerning first=284 second=220 amount=-1 +kerning first=219 second=382 amount=-1 +kerning first=71 second=220 amount=-1 +kerning first=255 second=382 amount=-1 +kerning first=316 second=246 amount=-1 +kerning first=66 second=120 amount=-1 +kerning first=257 second=103 amount=-1 +kerning first=207 second=304 amount=-1 +kerning first=220 second=194 amount=-1 +kerning first=221 second=103 amount=-1 +kerning first=327 second=382 amount=-1 +kerning first=74 second=224 amount=-1 +kerning first=65 second=211 amount=-1 +kerning first=116 second=103 amount=-1 +kerning first=1050 second=1057 amount=-1 +kerning first=80 second=103 amount=-1 +kerning first=8217 second=99 amount=-1 +kerning first=1041 second=1048 amount=-1 +kerning first=66 second=304 amount=-1 +kerning first=67 second=246 amount=-1 +kerning first=79 second=194 amount=-1 +kerning first=287 second=365 amount=-1 +kerning first=316 second=333 amount=-1 +kerning first=8249 second=366 amount=-1 +kerning first=8222 second=369 amount=-1 +kerning first=313 second=219 amount=-1 +kerning first=1052 second=1113 amount=-1 +kerning first=99 second=333 amount=-1 +kerning first=1088 second=1113 amount=-1 +kerning first=74 second=365 amount=-1 +kerning first=67 second=120 amount=-1 +kerning first=334 second=8218 amount=-1 +kerning first=80 second=70 amount=-1 +kerning first=75 second=307 amount=-1 +kerning first=213 second=313 amount=-1 +kerning first=78 second=111 amount=-1 +kerning first=221 second=347 amount=-1 +kerning first=245 second=8220 amount=-2 +kerning first=314 second=281 amount=-1 +kerning first=231 second=243 amount=-1 +kerning first=286 second=315 amount=-1 +kerning first=100 second=339 amount=-1 +kerning first=116 second=347 amount=-1 +kerning first=121 second=8218 amount=-1 +kerning first=317 second=8220 amount=-1 +kerning first=219 second=111 amount=-1 +kerning first=206 second=211 amount=-1 +kerning first=85 second=8218 amount=-2 +kerning first=281 second=8220 amount=-2 +kerning first=72 second=313 amount=-1 +kerning first=291 second=111 amount=-1 +kerning first=278 second=211 amount=-1 +kerning first=80 second=347 amount=-1 +kerning first=353 second=8220 amount=-2 +kerning first=327 second=111 amount=-1 +kerning first=217 second=257 amount=-1 +kerning first=218 second=202 amount=-1 +kerning first=243 second=120 amount=-1 +kerning first=1027 second=1090 amount=-1 +kerning first=279 second=120 amount=-1 +kerning first=74 second=113 amount=-1 +kerning first=290 second=202 amount=-1 +kerning first=8250 second=72 amount=-1 +kerning first=310 second=264 amount=-1 +kerning first=210 second=260 amount=-1 +kerning first=241 second=339 amount=-1 +kerning first=193 second=254 amount=-1 +kerning first=101 second=281 amount=-1 +kerning first=214 second=315 amount=-1 +kerning first=205 second=339 amount=-1 +kerning first=68 second=8220 amount=-2 +kerning first=73 second=315 amount=-1 +kerning first=202 second=264 amount=-1 +kerning first=206 second=281 amount=-1 +kerning first=77 second=202 amount=-1 +kerning first=277 second=339 amount=-1 +kerning first=231 second=232 amount=-1 +kerning first=87 second=271 amount=-1 +kerning first=262 second=219 amount=-1 +kerning first=351 second=8249 amount=-1 +kerning first=192 second=368 amount=-1 +kerning first=1055 second=1118 amount=-1 +kerning first=74 second=284 amount=-1 +kerning first=282 second=338 amount=-1 +kerning first=78 second=225 amount=-1 +kerning first=80 second=76 amount=-1 +kerning first=264 second=271 amount=-1 +kerning first=1091 second=1118 amount=-1 +kerning first=235 second=357 amount=-1 +kerning first=85 second=219 amount=-1 +kerning first=114 second=225 amount=-1 +kerning first=1043 second=1040 amount=-1 +kerning first=267 second=232 amount=-1 +kerning first=219 second=225 amount=-1 +kerning first=1055 second=1031 amount=-1 +kerning first=1060 second=1044 amount=-1 +kerning first=261 second=234 amount=-1 +kerning first=66 second=8249 amount=-1 +kerning first=225 second=234 amount=-1 +kerning first=268 second=98 amount=-1 +kerning first=212 second=344 amount=-1 +kerning first=339 second=314 amount=-1 +kerning first=102 second=8249 amount=-1 +kerning first=264 second=368 amount=-1 +kerning first=284 second=344 amount=-1 +kerning first=316 second=243 amount=-1 +kerning first=323 second=332 amount=-1 +kerning first=369 second=234 amount=-1 +kerning first=1039 second=1099 amount=-1 +kerning first=346 second=80 amount=-1 +kerning first=266 second=46 amount=-1 +kerning first=104 second=275 amount=-1 +kerning first=356 second=229 amount=-1 +kerning first=274 second=80 amount=-1 +kerning first=362 second=353 amount=-1 +kerning first=195 second=216 amount=-1 +kerning first=270 second=197 amount=-1 +kerning first=1034 second=1055 amount=-1 +kerning first=209 second=275 amount=-1 +kerning first=1077 second=1097 amount=-1 +kerning first=97 second=378 amount=-1 +kerning first=187 second=366 amount=-1 +kerning first=87 second=195 amount=-1 +kerning first=374 second=46 amount=-1 +kerning first=71 second=344 amount=-1 +kerning first=198 second=280 amount=-1 +kerning first=82 second=366 amount=-1 +kerning first=1058 second=1114 amount=-1 +kerning first=197 second=67 amount=-1 +kerning first=270 second=280 amount=-1 +kerning first=327 second=225 amount=-1 +kerning first=1064 second=1077 amount=-1 +kerning first=77 second=353 amount=-1 +kerning first=199 second=357 amount=-1 +kerning first=202 second=80 amount=-1 +kerning first=203 second=363 amount=-1 +kerning first=89 second=46 amount=-1 +kerning first=275 second=363 amount=-1 +kerning first=194 second=46 amount=-1 +kerning first=218 second=353 amount=-1 +kerning first=330 second=213 amount=-1 +kerning first=66 second=8222 amount=-1 +kerning first=266 second=317 amount=-1 +kerning first=193 second=375 amount=-1 +kerning first=370 second=116 amount=-1 +kerning first=69 second=217 amount=-1 +kerning first=302 second=317 amount=-1 +kerning first=85 second=192 amount=-1 +kerning first=327 second=201 amount=-1 +kerning first=338 second=317 amount=-1 +kerning first=197 second=311 amount=-1 +kerning first=298 second=116 amount=-1 +kerning first=267 second=259 amount=-1 +kerning first=233 second=311 amount=-1 +kerning first=1051 second=1117 amount=-1 +kerning first=1028 second=1046 amount=-1 +kerning first=217 second=70 amount=-1 +kerning first=1105 second=1117 amount=-1 +kerning first=232 second=369 amount=-1 +kerning first=368 second=362 amount=-1 +kerning first=1034 second=1059 amount=-2 +kerning first=304 second=201 amount=-1 +kerning first=223 second=122 amount=-1 +kerning first=366 second=213 amount=-1 +kerning first=325 second=70 amount=-1 +kerning first=259 second=122 amount=-1 +kerning first=282 second=66 amount=-1 +kerning first=85 second=116 amount=-1 +kerning first=325 second=113 amount=-1 +kerning first=351 second=8222 amount=-1 +kerning first=268 second=201 amount=-1 +kerning first=217 second=113 amount=-1 +kerning first=235 second=99 amount=-1 +kerning first=279 second=8222 amount=-1 +kerning first=77 second=246 amount=-1 +kerning first=262 second=116 amount=-1 +kerning first=243 second=8222 amount=-1 +kerning first=231 second=259 amount=-1 +kerning first=288 second=204 amount=-1 +kerning first=192 second=89 amount=-1 +kerning first=354 second=244 amount=-1 +kerning first=1086 second=1078 amount=-1 +kerning first=102 second=8222 amount=-1 +kerning first=364 second=210 amount=-1 +kerning first=219 second=268 amount=-1 +kerning first=1054 second=1062 amount=-1 +kerning first=1069 second=1048 amount=-1 +kerning first=1027 second=1108 amount=-1 +kerning first=272 second=256 amount=-1 +kerning first=1059 second=1102 amount=-1 +kerning first=232 second=98 amount=-1 +kerning first=204 second=332 amount=-1 +kerning first=220 second=210 amount=-1 +kerning first=196 second=98 amount=-1 +kerning first=8217 second=85 amount=-1 +kerning first=327 second=268 amount=-1 +kerning first=1049 second=1025 amount=-1 +kerning first=209 second=302 amount=-1 +kerning first=68 second=302 amount=-1 +kerning first=104 second=8217 amount=-2 +kerning first=118 second=122 amount=-1 +kerning first=369 second=277 amount=-1 +kerning first=187 second=122 amount=-1 +kerning first=296 second=335 amount=-1 +kerning first=1038 second=1087 amount=-1 +kerning first=212 second=73 amount=-1 +kerning first=70 second=257 amount=-1 +kerning first=287 second=231 amount=-1 +kerning first=368 second=335 amount=-1 +kerning first=1030 second=1053 amount=-1 +kerning first=78 second=268 amount=-1 +kerning first=370 second=219 amount=-1 +kerning first=284 second=73 amount=-1 +kerning first=1066 second=1053 amount=-1 +kerning first=255 second=122 amount=-1 +kerning first=298 second=219 amount=-1 +kerning first=45 second=213 amount=-1 +kerning first=334 second=219 amount=-1 +kerning first=291 second=187 amount=-1 +kerning first=198 second=323 amount=-1 +kerning first=327 second=187 amount=-1 +kerning first=203 second=336 amount=-1 +kerning first=80 second=244 amount=-1 +kerning first=219 second=187 amount=-2 +kerning first=70 second=213 amount=-1 +kerning first=116 second=244 amount=-1 +kerning first=302 second=325 amount=-1 +kerning first=311 second=46 amount=-1 +kerning first=8218 second=368 amount=-1 +kerning first=304 second=266 amount=-1 +kerning first=370 second=114 amount=-1 +kerning first=221 second=244 amount=-1 +kerning first=195 second=362 amount=-1 +kerning first=257 second=244 amount=-1 +kerning first=1071 second=1096 amount=-1 +kerning first=218 second=283 amount=-1 +kerning first=1049 second=1071 amount=-1 +kerning first=201 second=371 amount=-1 +kerning first=365 second=244 amount=-1 +kerning first=8216 second=219 amount=-1 +kerning first=350 second=75 amount=-1 +kerning first=74 second=327 amount=-1 +kerning first=196 second=266 amount=-1 +kerning first=278 second=75 amount=-1 +kerning first=114 second=187 amount=-1 +kerning first=206 second=75 amount=-1 +kerning first=368 second=200 amount=-1 +kerning first=220 second=101 amount=-1 +kerning first=78 second=187 amount=-1 +kerning first=74 second=235 amount=-1 +kerning first=296 second=200 amount=-1 +kerning first=97 second=248 amount=-1 +kerning first=323 second=327 amount=-1 +kerning first=302 second=313 amount=-1 +kerning first=323 second=262 amount=-1 +kerning first=200 second=66 amount=-1 +kerning first=333 second=380 amount=-1 +kerning first=1051 second=1036 amount=-1 +kerning first=246 second=314 amount=-1 +kerning first=66 second=196 amount=-1 +kerning first=362 second=283 amount=-1 +kerning first=207 second=261 amount=-1 +kerning first=362 second=218 amount=-1 +kerning first=82 second=79 amount=-1 +kerning first=269 second=110 amount=-1 +kerning first=364 second=367 amount=-1 +kerning first=326 second=283 amount=-1 +kerning first=374 second=371 amount=-1 +kerning first=290 second=218 amount=-1 +kerning first=187 second=79 amount=-1 +kerning first=1064 second=1091 amount=-1 +kerning first=338 second=274 amount=-1 +kerning first=370 second=192 amount=-1 +kerning first=298 second=257 amount=-1 +kerning first=99 second=305 amount=-1 +kerning first=262 second=257 amount=-1 +kerning first=266 second=274 amount=-1 +kerning first=220 second=367 amount=-1 +kerning first=370 second=257 amount=-1 +kerning first=338 second=209 amount=-1 +kerning first=302 second=274 amount=-1 +kerning first=213 second=270 amount=-1 +kerning first=245 second=318 amount=-1 +kerning first=334 second=192 amount=-1 +kerning first=302 second=209 amount=-1 +kerning first=1056 second=1050 amount=-1 +kerning first=281 second=318 amount=-1 +kerning first=249 second=8217 amount=-1 +kerning first=225 second=380 amount=-1 +kerning first=85 second=257 amount=-1 +kerning first=353 second=318 amount=-1 +kerning first=272 second=66 amount=-1 +kerning first=261 second=380 amount=-1 +kerning first=268 second=44 amount=-1 +kerning first=219 second=252 amount=-1 +kerning first=77 second=310 amount=-1 +kerning first=109 second=114 amount=-1 +kerning first=104 second=101 amount=-1 +kerning first=196 second=8249 amount=-1 +kerning first=73 second=114 amount=-1 +kerning first=85 second=284 amount=-1 +kerning first=283 second=115 amount=-1 +kerning first=291 second=252 amount=-1 +kerning first=201 second=211 amount=-1 +kerning first=209 second=101 amount=-1 +kerning first=268 second=8249 amount=-1 +kerning first=1039 second=1072 amount=-1 +kerning first=355 second=115 amount=-1 +kerning first=73 second=109 amount=-1 +kerning first=70 second=115 amount=-1 +kerning first=281 second=101 amount=-1 +kerning first=8216 second=192 amount=-2 +kerning first=72 second=335 amount=-1 +kerning first=1067 second=1098 amount=-1 +kerning first=1031 second=1098 amount=-1 +kerning first=80 second=217 amount=-1 +kerning first=211 second=115 amount=-1 +kerning first=288 second=296 amount=-1 +kerning first=197 second=354 amount=-1 +kerning first=201 second=214 amount=-1 +kerning first=362 second=310 amount=-1 +kerning first=277 second=231 amount=-1 +kerning first=45 second=89 amount=-2 +kerning first=201 second=344 amount=-1 +kerning first=100 second=337 amount=-1 +kerning first=218 second=310 amount=-1 +kerning first=100 second=231 amount=-1 +kerning first=205 second=231 amount=-1 +kerning first=262 second=99 amount=-1 +kerning first=110 second=235 amount=-1 +kerning first=71 second=317 amount=-1 +kerning first=279 second=353 amount=-1 +kerning first=364 second=275 amount=-1 +kerning first=328 second=275 amount=-1 +kerning first=104 second=345 amount=-1 +kerning first=310 second=362 amount=-1 +kerning first=287 second=235 amount=-1 +kerning first=246 second=287 amount=-1 +kerning first=277 second=106 amount=-1 +kerning first=209 second=345 amount=-1 +kerning first=84 second=234 amount=-1 +kerning first=220 second=275 amount=-1 +kerning first=245 second=345 amount=-1 +kerning first=74 second=83 amount=-1 +kerning first=235 second=249 amount=-1 +kerning first=281 second=345 amount=-1 +kerning first=8222 second=380 amount=-1 +kerning first=352 second=296 amount=-1 +kerning first=325 second=97 amount=-1 +kerning first=72 second=80 amount=-1 +kerning first=1036 second=1095 amount=-1 +kerning first=86 second=226 amount=-1 +kerning first=72 second=243 amount=-1 +kerning first=1041 second=1044 amount=-1 +kerning first=258 second=45 amount=-1 +kerning first=207 second=223 amount=-1 +kerning first=298 second=284 amount=-1 +kerning first=323 second=83 amount=-1 +kerning first=81 second=278 amount=-1 +kerning first=366 second=45 amount=-2 +kerning first=370 second=284 amount=-1 +kerning first=289 second=335 amount=-1 +kerning first=66 second=353 amount=-1 +kerning first=263 second=226 amount=-1 +kerning first=296 second=368 amount=-1 +kerning first=213 second=80 amount=-1 +kerning first=66 second=223 amount=-1 +kerning first=227 second=291 amount=-1 +kerning first=68 second=221 amount=-1 +kerning first=1049 second=1081 amount=-1 +kerning first=187 second=253 amount=-1 +kerning first=73 second=212 amount=-1 +kerning first=77 second=245 amount=-1 +kerning first=268 second=304 amount=-1 +kerning first=325 second=380 amount=-1 +kerning first=1054 second=1046 amount=-1 +kerning first=231 second=324 amount=-1 +kerning first=304 second=304 amount=-1 +kerning first=267 second=324 amount=-1 +kerning first=218 second=120 amount=-1 +kerning first=209 second=74 amount=-1 +kerning first=8218 second=212 amount=-1 +kerning first=366 second=278 amount=-1 +kerning first=330 second=278 amount=-1 +kerning first=346 second=313 amount=-1 +kerning first=212 second=72 amount=-1 +kerning first=1042 second=1056 amount=-1 +kerning first=362 second=245 amount=-1 +kerning first=100 second=45 amount=-1 +kerning first=198 second=361 amount=-1 +kerning first=116 second=111 amount=-1 +kerning first=326 second=245 amount=-1 +kerning first=323 second=8218 amount=-1 +kerning first=202 second=313 amount=-1 +kerning first=1118 second=1088 amount=-1 +kerning first=338 second=338 amount=-1 +kerning first=287 second=8218 amount=-1 +kerning first=8222 second=266 amount=-1 +kerning first=274 second=313 amount=-1 +kerning first=218 second=245 amount=-1 +kerning first=1048 second=1037 amount=-1 +kerning first=1027 second=1092 amount=-1 +kerning first=82 second=187 amount=-1 +kerning first=89 second=192 amount=-1 +kerning first=80 second=65 amount=-1 +kerning first=65 second=254 amount=-1 +kerning first=230 second=111 amount=-1 +kerning first=324 second=269 amount=-1 +kerning first=1046 second=1088 amount=-1 +kerning first=280 second=203 amount=-1 +kerning first=81 second=72 amount=-1 +kerning first=101 second=254 amount=-1 +kerning first=266 second=111 amount=-1 +kerning first=195 second=118 amount=-1 +kerning first=221 second=65 amount=-1 +kerning first=103 second=105 amount=-1 +kerning first=330 second=72 amount=-1 +kerning first=352 second=304 amount=-1 +kerning first=1042 second=1055 amount=-1 +kerning first=366 second=72 amount=-1 +kerning first=87 second=260 amount=-1 +kerning first=374 second=111 amount=-1 +kerning first=362 second=120 amount=-1 +kerning first=80 second=374 amount=-1 +kerning first=109 second=118 amount=-1 +kerning first=115 second=8220 amount=-2 +kerning first=286 second=114 amount=-1 +kerning first=289 second=363 amount=-1 +kerning first=79 second=8220 amount=-2 +kerning first=1050 second=1094 amount=-1 +kerning first=250 second=114 amount=-1 +kerning first=1049 second=1073 amount=-1 +kerning first=220 second=8220 amount=-1 +kerning first=89 second=111 amount=-1 +kerning first=45 second=251 amount=-1 +kerning first=220 second=69 amount=-1 +kerning first=368 second=102 amount=-1 +kerning first=368 second=227 amount=-1 +kerning first=333 second=44 amount=-1 +kerning first=344 second=364 amount=-1 +kerning first=296 second=227 amount=-1 +kerning first=268 second=331 amount=-1 +kerning first=258 second=251 amount=-1 +kerning first=305 second=101 amount=-1 +kerning first=304 second=331 amount=-1 +kerning first=269 second=273 amount=-1 +kerning first=69 second=81 amount=-1 +kerning first=233 second=273 amount=-1 +kerning first=79 second=69 amount=-1 +kerning first=240 second=380 amount=-1 +kerning first=200 second=364 amount=-1 +kerning first=370 second=78 amount=-1 +kerning first=366 second=251 amount=-1 +kerning first=302 second=355 amount=-1 +kerning first=1048 second=1064 amount=-1 +kerning first=334 second=78 amount=-1 +kerning first=218 second=218 amount=-1 +kerning first=75 second=334 amount=-1 +kerning first=230 second=355 amount=-1 +kerning first=194 second=355 amount=-1 +kerning first=282 second=81 amount=-1 +kerning first=77 second=218 amount=-1 +kerning first=45 second=72 amount=-1 +kerning first=298 second=78 amount=-1 +kerning first=1062 second=1085 amount=-1 +kerning first=262 second=78 amount=-1 +kerning first=277 second=113 amount=-1 +kerning first=66 second=88 amount=-1 +kerning first=111 second=8250 amount=-1 +kerning first=234 second=242 amount=-1 +kerning first=207 second=288 amount=-1 +kerning first=1056 second=1076 amount=-1 +kerning first=85 second=78 amount=-1 +kerning first=279 second=234 amount=-1 +kerning first=335 second=8221 amount=-2 +kerning first=217 second=313 amount=-1 +kerning first=80 second=282 amount=-1 +kerning first=338 second=355 amount=-1 +kerning first=67 second=230 amount=-1 +kerning first=280 second=274 amount=-1 +kerning first=262 second=79 amount=-1 +kerning first=214 second=87 amount=-1 +kerning first=1036 second=1073 amount=-1 +kerning first=335 second=291 amount=-1 +kerning first=228 second=233 amount=-1 +kerning first=87 second=233 amount=-1 +kerning first=8249 second=220 amount=-1 +kerning first=263 second=291 amount=-1 +kerning first=206 second=346 amount=-1 +kerning first=8222 second=217 amount=-1 +kerning first=1042 second=1052 amount=-1 +kerning first=363 second=233 amount=-1 +kerning first=268 second=230 amount=-1 +kerning first=272 second=87 amount=-1 +kerning first=291 second=233 amount=-1 +kerning first=327 second=233 amount=-1 +kerning first=325 second=288 amount=-1 +kerning first=313 second=217 amount=-1 +kerning first=232 second=235 amount=-1 +kerning first=240 second=291 amount=-1 +kerning first=200 second=334 amount=-1 +kerning first=1068 second=1046 amount=-1 +kerning first=1086 second=1113 amount=-1 +kerning first=99 second=291 amount=-1 +kerning first=354 second=257 amount=-1 +kerning first=209 second=227 amount=-1 +kerning first=213 second=84 amount=-1 +kerning first=330 second=224 amount=-1 +kerning first=217 second=288 amount=-1 +kerning first=344 second=334 amount=-1 +kerning first=1055 second=1049 amount=-1 +kerning first=366 second=224 amount=-1 +kerning first=370 second=81 amount=-1 +kerning first=262 second=81 amount=-1 +kerning first=298 second=81 amount=-1 +kerning first=200 second=187 amount=-1 +kerning first=278 second=8221 amount=-1 +kerning first=314 second=8221 amount=-1 +kerning first=97 second=99 amount=-1 +kerning first=1038 second=1095 amount=-1 +kerning first=221 second=245 amount=-1 +kerning first=344 second=187 amount=-1 +kerning first=205 second=270 amount=-1 +kerning first=116 second=245 amount=-1 +kerning first=272 second=187 amount=-1 +kerning first=80 second=245 amount=-1 +kerning first=103 second=363 amount=-1 +kerning first=201 second=8218 amount=-1 +kerning first=302 second=352 amount=-1 +kerning first=1054 second=1070 amount=-1 +kerning first=76 second=221 amount=-1 +kerning first=97 second=279 amount=-1 +kerning first=281 second=269 amount=-1 +kerning first=1053 second=1104 amount=-1 +kerning first=304 second=230 amount=-1 +kerning first=288 second=75 amount=-1 +kerning first=302 second=331 amount=-1 +kerning first=256 second=8249 amount=-1 +kerning first=214 second=364 amount=-1 +kerning first=85 second=261 amount=-1 +kerning first=210 second=206 amount=-1 +kerning first=69 second=206 amount=-1 +kerning first=114 second=228 amount=-1 +kerning first=73 second=364 amount=-1 +kerning first=201 second=66 amount=-1 +kerning first=298 second=261 amount=-1 +kerning first=262 second=261 amount=-1 +kerning first=258 second=371 amount=-1 +kerning first=253 second=108 amount=-1 +kerning first=205 second=257 amount=-1 +kerning first=370 second=261 amount=-1 +kerning first=81 second=217 amount=-1 +kerning first=72 second=264 amount=-1 +kerning first=112 second=108 amount=-1 +kerning first=368 second=69 amount=-1 +kerning first=282 second=206 amount=-1 +kerning first=302 second=366 amount=-1 +kerning first=1065 second=1119 amount=-1 +kerning first=291 second=380 amount=-1 +kerning first=1030 second=1034 amount=-1 +kerning first=284 second=205 amount=-1 +kerning first=255 second=380 amount=-1 +kerning first=77 second=200 amount=-1 +kerning first=210 second=193 amount=-1 +kerning first=289 second=108 amount=-1 +kerning first=212 second=205 amount=-1 +kerning first=327 second=380 amount=-1 +kerning first=65 second=303 amount=-1 +kerning first=364 second=266 amount=-1 +kerning first=264 second=273 amount=-1 +kerning first=199 second=368 amount=-1 +kerning first=286 second=364 amount=-1 +kerning first=193 second=370 amount=-1 +kerning first=252 second=8217 amount=-1 +kerning first=1066 second=1034 amount=-1 +kerning first=8217 second=114 amount=-1 +kerning first=203 second=8218 amount=-1 +kerning first=253 second=318 amount=-1 +kerning first=72 second=8249 amount=-1 +kerning first=1036 second=1063 amount=-1 +kerning first=108 second=8249 amount=-1 +kerning first=284 second=8221 amount=-1 +kerning first=99 second=44 amount=-1 +kerning first=1041 second=1116 amount=-1 +kerning first=235 second=355 amount=-1 +kerning first=71 second=205 amount=-1 +kerning first=203 second=78 amount=-1 +kerning first=249 second=8249 amount=-1 +kerning first=199 second=355 amount=-1 +kerning first=78 second=380 amount=-1 +kerning first=80 second=325 amount=-1 +kerning first=219 second=380 amount=-1 +kerning first=8250 second=370 amount=-1 +kerning first=70 second=310 amount=-1 +kerning first=1077 second=1103 amount=-1 +kerning first=1062 second=1077 amount=-1 +kerning first=316 second=248 amount=-1 +kerning first=1060 second=1039 amount=-1 +kerning first=338 second=218 amount=-1 +kerning first=344 second=87 amount=-1 +kerning first=88 second=252 amount=-1 +kerning first=67 second=248 amount=-1 +kerning first=266 second=218 amount=-1 +kerning first=202 second=76 amount=-1 +kerning first=209 second=214 amount=-1 +kerning first=194 second=218 amount=-1 +kerning first=103 second=248 amount=-1 +kerning first=1069 second=1039 amount=-1 +kerning first=77 second=347 amount=-1 +kerning first=74 second=330 amount=-1 +kerning first=205 second=77 amount=-1 +kerning first=201 second=220 amount=-1 +kerning first=1050 second=1059 amount=-1 +kerning first=255 second=107 amount=-1 +kerning first=1071 second=1117 amount=-1 +kerning first=85 second=382 amount=-1 +kerning first=374 second=339 amount=-1 +kerning first=121 second=382 amount=-1 +kerning first=367 second=103 amount=-1 +kerning first=226 second=382 amount=-1 +kerning first=108 second=171 amount=-1 +kerning first=269 second=289 amount=-1 +kerning first=1076 second=1094 amount=-1 +kerning first=233 second=289 amount=-1 +kerning first=259 second=103 amount=-1 +kerning first=8222 second=230 amount=-1 +kerning first=288 second=8218 amount=-1 +kerning first=223 second=103 amount=-1 +kerning first=249 second=171 amount=-1 +kerning first=86 second=242 amount=-1 +kerning first=281 second=281 amount=-1 +kerning first=1053 second=1091 amount=-1 +kerning first=330 second=304 amount=-1 +kerning first=97 second=333 amount=-1 +kerning first=366 second=304 amount=-1 +kerning first=258 second=211 amount=-1 +kerning first=1053 second=1051 amount=-1 +kerning first=221 second=338 amount=-1 +kerning first=240 second=187 amount=-1 +kerning first=1048 second=1068 amount=-1 +kerning first=1053 second=1050 amount=-1 +kerning first=330 second=211 amount=-1 +kerning first=211 second=85 amount=-1 +kerning first=1036 second=1057 amount=-1 +kerning first=204 second=242 amount=-1 +kerning first=80 second=114 amount=-1 +kerning first=1060 second=1031 amount=-1 +kerning first=80 second=338 amount=-1 +kerning first=70 second=85 amount=-1 +kerning first=370 second=203 amount=-1 +kerning first=81 second=304 amount=-1 +kerning first=266 second=339 amount=-1 +kerning first=262 second=382 amount=-1 +kerning first=71 second=298 amount=-1 +kerning first=77 second=241 amount=-1 +kerning first=230 second=339 amount=-1 +kerning first=298 second=382 amount=-1 +kerning first=302 second=339 amount=-1 +kerning first=362 second=347 amount=-1 +kerning first=1051 second=1025 amount=-1 +kerning first=70 second=332 amount=-1 +kerning first=65 second=290 amount=-1 +kerning first=89 second=339 amount=-1 +kerning first=366 second=211 amount=-1 +kerning first=212 second=298 amount=-1 +kerning first=201 second=313 amount=-1 +kerning first=206 second=290 amount=-1 +kerning first=110 second=287 amount=-1 +kerning first=79 second=86 amount=-1 +kerning first=204 second=333 amount=-1 +kerning first=218 second=347 amount=-1 +kerning first=83 second=364 amount=-1 +kerning first=284 second=298 amount=-1 +kerning first=1043 second=1085 amount=-1 +kerning first=221 second=271 amount=-1 +kerning first=240 second=111 amount=-1 +kerning first=278 second=357 amount=-1 +kerning first=317 second=374 amount=-1 +kerning first=283 second=8250 amount=-1 +kerning first=8222 second=243 amount=-1 +kerning first=304 second=76 amount=-1 +kerning first=1118 second=1094 amount=-1 +kerning first=211 second=8250 amount=-1 +kerning first=85 second=214 amount=-1 +kerning first=101 second=357 amount=-1 +kerning first=264 second=219 amount=-1 +kerning first=268 second=76 amount=-1 +kerning first=106 second=8250 amount=-1 +kerning first=65 second=357 amount=-1 +kerning first=364 second=212 amount=-1 +kerning first=206 second=357 amount=-1 +kerning first=68 second=374 amount=-1 +kerning first=1044 second=1118 amount=-1 +kerning first=192 second=219 amount=-1 +kerning first=208 second=8222 amount=-1 +kerning first=364 second=82 amount=-1 +kerning first=330 second=317 amount=-1 +kerning first=262 second=315 amount=-1 +kerning first=304 second=323 amount=-1 +kerning first=105 second=119 amount=-1 +kerning first=220 second=212 amount=-1 +kerning first=268 second=323 amount=-1 +kerning first=1048 second=1075 amount=-1 +kerning first=86 second=263 amount=-1 +kerning first=365 second=8217 amount=-1 +kerning first=370 second=315 amount=-1 +kerning first=80 second=8217 amount=-1 +kerning first=8250 second=69 amount=-1 +kerning first=99 second=111 amount=-1 +kerning first=116 second=8217 amount=-1 +kerning first=296 second=262 amount=-1 +kerning first=298 second=315 amount=-1 +kerning first=302 second=261 amount=-1 +kerning first=334 second=315 amount=-1 +kerning first=221 second=8217 amount=-1 +kerning first=199 second=314 amount=-1 +kerning first=203 second=366 amount=-1 +kerning first=286 second=204 amount=-1 +kerning first=338 second=365 amount=-1 +kerning first=374 second=365 amount=-1 +kerning first=214 second=204 amount=-1 +kerning first=233 second=263 amount=-1 +kerning first=67 second=68 amount=-1 +kerning first=269 second=263 amount=-1 +kerning first=200 second=280 amount=-1 +kerning first=1051 second=1092 amount=-1 +kerning first=8218 second=273 amount=-1 +kerning first=305 second=263 amount=-1 +kerning first=194 second=365 amount=-1 +kerning first=70 second=254 amount=-1 +kerning first=272 second=280 amount=-1 +kerning first=235 second=314 amount=-1 +kerning first=230 second=365 amount=-1 +kerning first=1031 second=1067 amount=-1 +kerning first=89 second=365 amount=-1 +kerning first=231 second=110 amount=-1 +kerning first=8249 second=350 amount=-1 +kerning first=1048 second=1101 amount=-1 +kerning first=8222 second=104 amount=-1 +kerning first=199 second=67 amount=-1 +kerning first=1071 second=1024 amount=-1 +kerning first=267 second=110 amount=-1 +kerning first=352 second=68 amount=-1 +kerning first=205 second=203 amount=-1 +kerning first=80 second=271 amount=-1 +kerning first=217 second=195 amount=-1 +kerning first=69 second=67 amount=-1 +kerning first=100 second=378 amount=-1 +kerning first=258 second=250 amount=-1 +kerning first=195 second=357 amount=-1 +kerning first=264 second=274 amount=-1 +kerning first=277 second=378 amount=-1 +kerning first=272 second=46 amount=-1 +kerning first=234 second=101 amount=-1 +kerning first=205 second=378 amount=-1 +kerning first=366 second=250 amount=-1 +kerning first=69 second=8217 amount=-1 +kerning first=199 second=262 amount=-1 +kerning first=1068 second=1067 amount=-1 +kerning first=207 second=76 amount=-1 +kerning first=105 second=8217 amount=-1 +kerning first=255 second=8221 amount=-2 +kerning first=334 second=354 amount=-1 +kerning first=217 second=261 amount=-1 +kerning first=334 second=209 amount=-1 +kerning first=75 second=216 amount=-1 +kerning first=89 second=267 amount=-1 +kerning first=8222 second=257 amount=-1 +kerning first=66 second=76 amount=-1 +kerning first=339 second=357 amount=-1 +kerning first=88 second=345 amount=-1 +kerning first=211 second=280 amount=-1 +kerning first=203 second=204 amount=-1 +kerning first=77 second=113 amount=-1 +kerning first=366 second=317 amount=-1 +kerning first=193 second=345 amount=-1 +kerning first=229 second=345 amount=-1 +kerning first=1070 second=1084 amount=-1 +kerning first=345 second=259 amount=-1 +kerning first=354 second=187 amount=-1 +kerning first=203 second=270 amount=-1 +kerning first=103 second=287 amount=-1 +kerning first=1033 second=1038 amount=-2 +kerning first=337 second=345 amount=-1 +kerning first=1086 second=1083 amount=-1 +kerning first=370 second=369 amount=-1 +kerning first=8217 second=240 amount=-1 +kerning first=362 second=113 amount=-1 +kerning first=201 second=207 amount=-1 +kerning first=316 second=287 amount=-1 +kerning first=370 second=100 amount=-1 +kerning first=45 second=317 amount=-1 +kerning first=1047 second=1096 amount=-1 +kerning first=264 second=366 amount=-1 +kerning first=81 second=317 amount=-1 +kerning first=244 second=287 amount=-1 +kerning first=73 second=336 amount=-1 +kerning first=326 second=113 amount=-1 +kerning first=192 second=366 amount=-1 +kerning first=218 second=113 amount=-1 +kerning first=232 second=271 amount=-1 +kerning first=121 second=369 amount=-1 +kerning first=72 second=210 amount=-1 +kerning first=75 second=116 amount=-1 +kerning first=85 second=369 amount=-1 +kerning first=304 second=271 amount=-1 +kerning first=355 second=8250 amount=-1 +kerning first=268 second=271 amount=-1 +kerning first=67 second=8220 amount=-1 +kerning first=202 second=371 amount=-1 +kerning first=70 second=278 amount=-1 +kerning first=209 second=73 amount=-1 +kerning first=330 second=83 amount=-1 +kerning first=366 second=83 amount=-1 +kerning first=103 second=8220 amount=-2 +kerning first=8218 second=221 amount=-2 +kerning first=259 second=244 amount=-1 +kerning first=218 second=213 amount=-1 +kerning first=317 second=86 amount=-1 +kerning first=198 second=268 amount=-1 +kerning first=97 second=289 amount=-1 +kerning first=296 second=97 amount=-1 +kerning first=73 second=351 amount=-1 +kerning first=211 second=278 amount=-1 +kerning first=316 second=8220 amount=-1 +kerning first=367 second=244 amount=-1 +kerning first=368 second=97 amount=-1 +kerning first=77 second=213 amount=-1 +kerning first=1044 second=1090 amount=-1 +kerning first=302 second=77 amount=-1 +kerning first=1059 second=1099 amount=-1 +kerning first=338 second=77 amount=-1 +kerning first=368 second=82 amount=-1 +kerning first=108 second=277 amount=-1 +kerning first=1059 second=1060 amount=-1 +kerning first=207 second=74 amount=-1 +kerning first=266 second=77 amount=-1 +kerning first=72 second=277 amount=-1 +kerning first=67 second=235 amount=-1 +kerning first=68 second=88 amount=-1 +kerning first=68 second=73 amount=-1 +kerning first=103 second=235 amount=-1 +kerning first=8218 second=219 amount=-1 +kerning first=74 second=251 amount=-1 +kerning first=249 second=277 amount=-1 +kerning first=8218 second=234 amount=-1 +kerning first=1047 second=1081 amount=-1 +kerning first=268 second=269 amount=-1 +kerning first=195 second=290 amount=-1 +kerning first=304 second=269 amount=-1 +kerning first=304 second=338 amount=-1 +kerning first=232 second=269 amount=-1 +kerning first=234 second=283 amount=-1 +kerning first=266 second=231 amount=-1 +kerning first=282 second=286 amount=-1 +kerning first=1048 second=1117 amount=-1 +kerning first=268 second=338 amount=-1 +kerning first=302 second=231 amount=-1 +kerning first=210 second=65 amount=-1 +kerning first=72 second=171 amount=-1 +kerning first=296 second=82 amount=-1 +kerning first=196 second=338 amount=-1 +kerning first=374 second=231 amount=-1 +kerning first=69 second=286 amount=-1 +kerning first=201 second=274 amount=-1 +kerning first=352 second=8220 amount=-1 +kerning first=214 second=351 amount=-1 +kerning first=198 second=203 amount=-1 +kerning first=68 second=86 amount=-1 +kerning first=1050 second=1074 amount=-1 +kerning first=277 second=363 amount=-1 +kerning first=212 second=194 amount=-1 +kerning first=263 second=240 amount=-1 +kerning first=264 second=108 amount=-1 +kerning first=8216 second=347 amount=-1 +kerning first=354 second=353 amount=-1 +kerning first=264 second=80 amount=-1 +kerning first=1027 second=1097 amount=-1 +kerning first=382 second=45 amount=-1 +kerning first=324 second=114 amount=-1 +kerning first=1068 second=1025 amount=-1 +kerning first=366 second=8222 amount=-2 +kerning first=288 second=114 amount=-1 +kerning first=217 second=219 amount=-1 +kerning first=284 second=66 amount=-1 +kerning first=45 second=196 amount=-1 +kerning first=85 second=367 amount=-1 +kerning first=81 second=196 amount=-1 +kerning first=196 second=217 amount=-1 +kerning first=212 second=66 amount=-1 +kerning first=222 second=8222 amount=-1 +kerning first=111 second=114 amount=-1 +kerning first=268 second=217 amount=-1 +kerning first=268 second=284 amount=-1 +kerning first=89 second=231 amount=-1 +kerning first=220 second=251 amount=-1 +kerning first=304 second=217 amount=-1 +kerning first=1047 second=1027 amount=-1 +kerning first=304 second=284 amount=-1 +kerning first=230 second=231 amount=-1 +kerning first=272 second=115 amount=-1 +kerning first=210 second=353 amount=-1 +kerning first=1034 second=1101 amount=-1 +kerning first=196 second=284 amount=-1 +kerning first=1064 second=1028 amount=-1 +kerning first=201 second=205 amount=-1 +kerning first=101 second=249 amount=-1 +kerning first=220 second=266 amount=-1 +kerning first=316 second=235 amount=-1 +kerning first=296 second=264 amount=-1 +kerning first=362 second=200 amount=-1 +kerning first=1064 second=1037 amount=-1 +kerning first=315 second=362 amount=-1 +kerning first=198 second=214 amount=-1 +kerning first=84 second=243 amount=-1 +kerning first=290 second=200 amount=-1 +kerning first=204 second=111 amount=-1 +kerning first=1058 second=1076 amount=-1 +kerning first=218 second=200 amount=-1 +kerning first=8218 second=288 amount=-1 +kerning first=65 second=249 amount=-1 +kerning first=70 second=226 amount=-1 +kerning first=8222 second=271 amount=-1 +kerning first=220 second=370 amount=-1 +kerning first=367 second=242 amount=-1 +kerning first=202 second=45 amount=-1 +kerning first=204 second=97 amount=-1 +kerning first=81 second=8222 amount=-1 +kerning first=97 second=45 amount=-1 +kerning first=99 second=252 amount=-1 +kerning first=278 second=249 amount=-1 +kerning first=310 second=45 amount=-1 +kerning first=314 second=249 amount=-1 +kerning first=66 second=362 amount=-1 +kerning first=8222 second=98 amount=-1 +kerning first=346 second=45 amount=-1 +kerning first=217 second=275 amount=-1 +kerning first=350 second=249 amount=-1 +kerning first=355 second=226 amount=-1 +kerning first=207 second=362 amount=-1 +kerning first=195 second=71 amount=-1 +kerning first=325 second=275 amount=-1 +kerning first=171 second=362 amount=-1 +kerning first=274 second=45 amount=-1 +kerning first=289 second=275 amount=-1 +kerning first=337 second=291 amount=-1 +kerning first=72 second=223 amount=-1 +kerning first=352 second=302 amount=-1 +kerning first=45 second=363 amount=-1 +kerning first=291 second=326 amount=-1 +kerning first=103 second=233 amount=-1 +kerning first=280 second=302 amount=-1 +kerning first=364 second=199 amount=-1 +kerning first=229 second=291 amount=-1 +kerning first=87 second=234 amount=-1 +kerning first=1030 second=1083 amount=-1 +kerning first=228 second=234 amount=-1 +kerning first=8250 second=84 amount=-1 +kerning first=99 second=98 amount=-1 +kerning first=270 second=46 amount=-1 +kerning first=326 second=267 amount=-1 +kerning first=67 second=302 amount=-1 +kerning first=362 second=267 amount=-1 +kerning first=316 second=233 amount=-1 +kerning first=1039 second=1113 amount=-1 +kerning first=281 second=248 amount=-1 +kerning first=8222 second=269 amount=-1 +kerning first=233 second=122 amount=-1 +kerning first=225 second=243 amount=-1 +kerning first=70 second=224 amount=-1 +kerning first=217 second=327 amount=-1 +kerning first=65 second=8221 amount=-2 +kerning first=1062 second=1094 amount=-1 +kerning first=101 second=8221 amount=-2 +kerning first=291 second=107 amount=-1 +kerning first=369 second=243 amount=-1 +kerning first=325 second=327 amount=-1 +kerning first=203 second=249 amount=-1 +kerning first=225 second=269 amount=-1 +kerning first=1038 second=1119 amount=-1 +kerning first=277 second=311 amount=-1 +kerning first=354 second=232 amount=-1 +kerning first=171 second=89 amount=-1 +kerning first=355 second=224 amount=-1 +kerning first=66 second=89 amount=-1 +kerning first=85 second=249 amount=-1 +kerning first=234 second=335 amount=-1 +kerning first=97 second=318 amount=-1 +kerning first=8220 second=218 amount=-1 +kerning first=83 second=370 amount=-1 +kerning first=1052 second=1071 amount=-1 +kerning first=344 second=46 amount=-1 +kerning first=1078 second=1104 amount=-1 +kerning first=226 second=318 amount=-1 +kerning first=218 second=267 amount=-1 +kerning first=368 second=370 amount=-1 +kerning first=8222 second=338 amount=-1 +kerning first=330 second=212 amount=-1 +kerning first=296 second=370 amount=-1 +kerning first=8250 second=82 amount=-1 +kerning first=72 second=225 amount=-1 +kerning first=220 second=199 amount=-1 +kerning first=77 second=267 amount=-1 +kerning first=220 second=361 amount=-1 +kerning first=291 second=277 amount=-1 +kerning first=368 second=269 amount=-1 +kerning first=1068 second=1031 amount=-1 +kerning first=302 second=71 amount=-1 +kerning first=1030 second=1086 amount=-1 +kerning first=364 second=361 amount=-1 +kerning first=199 second=206 amount=-1 +kerning first=207 second=267 amount=-1 +kerning first=209 second=212 amount=-1 +kerning first=346 second=114 amount=-1 +kerning first=68 second=296 amount=-1 +kerning first=279 second=267 amount=-1 +kerning first=1104 second=1117 amount=-1 +kerning first=1062 second=1079 amount=-1 +kerning first=74 second=111 amount=-1 +kerning first=214 second=115 amount=-1 +kerning first=202 second=114 amount=-1 +kerning first=110 second=111 amount=-1 +kerning first=1059 second=1080 amount=-1 +kerning first=346 second=8249 amount=-1 +kerning first=274 second=114 amount=-1 +kerning first=382 second=8249 amount=-1 +kerning first=1027 second=1095 amount=-1 +kerning first=251 second=111 amount=-1 +kerning first=350 second=45 amount=-1 +kerning first=287 second=111 amount=-1 +kerning first=73 second=115 amount=-1 +kerning first=323 second=111 amount=-1 +kerning first=83 second=368 amount=-1 +kerning first=330 second=81 amount=-1 +kerning first=97 second=114 amount=-1 +kerning first=87 second=258 amount=-1 +kerning first=291 second=365 amount=-1 +kerning first=79 second=197 amount=-1 +kerning first=327 second=68 amount=-1 +kerning first=219 second=365 amount=-1 +kerning first=220 second=197 amount=-1 +kerning first=316 second=263 amount=-1 +kerning first=323 second=81 amount=-1 +kerning first=203 second=310 amount=-1 +kerning first=199 second=370 amount=-1 +kerning first=302 second=203 amount=-1 +kerning first=77 second=72 amount=-1 +kerning first=338 second=203 amount=-1 +kerning first=368 second=368 amount=-1 +kerning first=234 second=249 amount=-1 +kerning first=364 second=197 amount=-1 +kerning first=98 second=46 amount=-1 +kerning first=202 second=8249 amount=-1 +kerning first=1042 second=1037 amount=-1 +kerning first=8217 second=346 amount=-1 +kerning first=199 second=364 amount=-1 +kerning first=1041 second=1088 amount=-1 +kerning first=195 second=199 amount=-1 +kerning first=246 second=8220 amount=-2 +kerning first=266 second=203 amount=-1 +kerning first=368 second=290 amount=-1 +kerning first=362 second=72 amount=-1 +kerning first=67 second=263 amount=-1 +kerning first=270 second=374 amount=-1 +kerning first=103 second=263 amount=-1 +kerning first=235 second=106 amount=-1 +kerning first=290 second=72 amount=-1 +kerning first=1054 second=1055 amount=-1 +kerning first=355 second=8222 amount=-1 +kerning first=8216 second=220 amount=-1 +kerning first=116 second=230 amount=-1 +kerning first=203 second=327 amount=-1 +kerning first=80 second=230 amount=-1 +kerning first=1053 second=1052 amount=-1 +kerning first=211 second=8222 amount=-1 +kerning first=217 second=71 amount=-1 +kerning first=211 second=87 amount=-1 +kerning first=1055 second=1104 amount=-1 +kerning first=88 second=288 amount=-1 +kerning first=1030 second=1036 amount=-1 +kerning first=70 second=334 amount=-1 +kerning first=72 second=279 amount=-1 +kerning first=70 second=8222 amount=-2 +kerning first=235 second=333 amount=-1 +kerning first=108 second=279 amount=-1 +kerning first=192 second=288 amount=-1 +kerning first=74 second=81 amount=-1 +kerning first=287 second=291 amount=-1 +kerning first=251 second=291 amount=-1 +kerning first=87 second=288 amount=-1 +kerning first=364 second=227 amount=-1 +kerning first=8217 second=363 amount=-1 +kerning first=337 second=44 amount=-1 +kerning first=206 second=274 amount=-1 +kerning first=333 second=187 amount=-1 +kerning first=255 second=252 amount=-1 +kerning first=196 second=89 amount=-1 +kerning first=110 second=291 amount=-1 +kerning first=71 second=209 amount=-1 +kerning first=263 second=281 amount=-1 +kerning first=119 second=318 amount=-1 +kerning first=264 second=288 amount=-1 +kerning first=220 second=227 amount=-1 +kerning first=224 second=318 amount=-1 +kerning first=1059 second=1090 amount=-1 +kerning first=86 second=99 amount=-1 +kerning first=84 second=187 amount=-1 +kerning first=1042 second=1050 amount=-1 +kerning first=1067 second=1095 amount=-1 +kerning first=356 second=337 amount=-1 +kerning first=227 second=99 amount=-1 +kerning first=225 second=187 amount=-1 +kerning first=195 second=303 amount=-1 +kerning first=304 second=245 amount=-1 +kerning first=263 second=99 amount=-1 +kerning first=261 second=187 amount=-1 +kerning first=268 second=245 amount=-1 +kerning first=65 second=221 amount=-1 +kerning first=232 second=245 amount=-1 +kerning first=1047 second=1113 amount=-1 +kerning first=288 second=270 amount=-1 +kerning first=287 second=328 amount=-1 +kerning first=1066 second=1036 amount=-1 +kerning first=71 second=66 amount=-1 +kerning first=264 second=330 amount=-1 +kerning first=249 second=279 amount=-1 +kerning first=221 second=230 amount=-1 +kerning first=366 second=196 amount=-1 +kerning first=200 second=332 amount=-1 +kerning first=370 second=367 amount=-1 +kerning first=344 second=332 amount=-1 +kerning first=198 second=210 amount=-1 +kerning first=214 second=202 amount=-1 +kerning first=84 second=351 amount=-1 +kerning first=198 second=73 amount=-1 +kerning first=368 second=264 amount=-1 +kerning first=196 second=8217 amount=-2 +kerning first=286 second=202 amount=-1 +kerning first=270 second=73 amount=-1 +kerning first=73 second=202 amount=-1 +kerning first=101 second=108 amount=-1 +kerning first=108 second=8221 amount=-1 +kerning first=1030 second=1073 amount=-1 +kerning first=279 second=104 amount=-1 +kerning first=339 second=248 amount=-1 +kerning first=242 second=108 amount=-1 +kerning first=105 second=121 amount=-1 +kerning first=352 second=201 amount=-1 +kerning first=213 second=82 amount=-1 +kerning first=1034 second=1030 amount=-1 +kerning first=8249 second=352 amount=-1 +kerning first=80 second=323 amount=-1 +kerning first=8250 second=368 amount=-1 +kerning first=232 second=8217 amount=-2 +kerning first=1089 second=1076 amount=-1 +kerning first=203 second=364 amount=-1 +kerning first=1040 second=1038 amount=-2 +kerning first=268 second=8217 amount=-1 +kerning first=314 second=108 amount=-1 +kerning first=199 second=69 amount=-1 +kerning first=97 second=277 amount=-1 +kerning first=375 second=8218 amount=-1 +kerning first=1078 second=1091 amount=-1 +kerning first=275 second=273 amount=-1 +kerning first=8218 second=366 amount=-1 +kerning first=240 second=113 amount=-1 +kerning first=1056 second=1067 amount=-1 +kerning first=1039 second=1067 amount=-1 +kerning first=230 second=116 amount=-1 +kerning first=224 second=314 amount=-1 +kerning first=72 second=82 amount=-1 +kerning first=268 second=325 amount=-1 +kerning first=83 second=171 amount=-1 +kerning first=194 second=116 amount=-1 +kerning first=119 second=171 amount=-1 +kerning first=310 second=114 amount=-1 +kerning first=82 second=44 amount=-1 +kerning first=199 second=286 amount=-1 +kerning first=119 second=314 amount=-1 +kerning first=1118 second=1078 amount=-1 +kerning first=304 second=325 amount=-1 +kerning first=99 second=113 amount=-1 +kerning first=280 second=317 amount=-1 +kerning first=1031 second=1069 amount=-1 +kerning first=267 second=112 amount=-1 +kerning first=1067 second=1069 amount=-1 +kerning first=327 second=264 amount=-1 +kerning first=231 second=112 amount=-1 +kerning first=352 second=317 amount=-1 +kerning first=214 second=78 amount=-1 +kerning first=109 second=339 amount=-1 +kerning first=220 second=110 amount=-1 +kerning first=275 second=117 amount=-1 +kerning first=1038 second=1077 amount=-1 +kerning first=272 second=282 amount=-1 +kerning first=73 second=78 amount=-1 +kerning first=199 second=316 amount=-1 +kerning first=99 second=109 amount=-1 +kerning first=291 second=242 amount=-1 +kerning first=8217 second=256 amount=-2 +kerning first=200 second=282 amount=-1 +kerning first=364 second=110 amount=-1 +kerning first=288 second=77 amount=-1 +kerning first=70 second=71 amount=-1 +kerning first=217 second=8220 amount=-1 +kerning first=103 second=289 amount=-1 +kerning first=1031 second=1094 amount=-1 +kerning first=291 second=339 amount=-1 +kerning first=258 second=356 amount=-1 +kerning first=244 second=289 amount=-1 +kerning first=363 second=339 amount=-1 +kerning first=255 second=311 amount=-1 +kerning first=316 second=289 amount=-1 +kerning first=327 second=339 amount=-1 +kerning first=74 second=382 amount=-1 +kerning first=72 second=333 amount=-1 +kerning first=260 second=171 amount=-1 +kerning first=262 second=220 amount=-1 +kerning first=108 second=333 amount=-1 +kerning first=328 second=281 amount=-1 +kerning first=356 second=246 amount=-1 +kerning first=334 second=220 amount=-1 +kerning first=364 second=281 amount=-1 +kerning first=259 second=101 amount=-1 +kerning first=368 second=171 amount=-2 +kerning first=298 second=220 amount=-1 +kerning first=249 second=333 amount=-1 +kerning first=274 second=212 amount=-1 +kerning first=367 second=101 amount=-1 +kerning first=85 second=220 amount=-1 +kerning first=84 second=100 amount=-1 +kerning first=1049 second=1065 amount=-1 +kerning first=204 second=330 amount=-1 +kerning first=71 second=296 amount=-1 +kerning first=211 second=304 amount=-1 +kerning first=70 second=280 amount=-1 +kerning first=1030 second=1045 amount=-1 +kerning first=284 second=8218 amount=-1 +kerning first=69 second=338 amount=-1 +kerning first=284 second=296 amount=-1 +kerning first=366 second=85 amount=-1 +kerning first=248 second=8218 amount=-1 +kerning first=195 second=86 amount=-1 +kerning first=1064 second=1074 amount=-1 +kerning first=330 second=85 amount=-1 +kerning first=212 second=8218 amount=-1 +kerning first=212 second=296 amount=-1 +kerning first=70 second=304 amount=-1 +kerning first=89 second=382 amount=-1 +kerning first=298 second=313 amount=-1 +kerning first=258 second=85 amount=-1 +kerning first=334 second=313 amount=-1 +kerning first=366 second=109 amount=-1 +kerning first=370 second=220 amount=-1 +kerning first=370 second=313 amount=-1 +kerning first=187 second=298 amount=-1 +kerning first=356 second=8218 amount=-1 +kerning first=220 second=281 amount=-1 +kerning first=81 second=85 amount=-1 +kerning first=78 second=339 amount=-1 +kerning first=45 second=85 amount=-1 +kerning first=279 second=347 amount=-1 +kerning first=219 second=339 amount=-1 +kerning first=262 second=313 amount=-1 +kerning first=344 second=8250 amount=-1 +kerning first=217 second=290 amount=-1 +kerning first=207 second=347 amount=-1 +kerning first=66 second=347 amount=-1 +kerning first=107 second=8218 amount=-1 +kerning first=1051 second=1037 amount=-1 +kerning first=272 second=8250 amount=-1 +kerning first=45 second=109 amount=-1 +kerning first=323 second=382 amount=-1 +kerning first=305 second=287 amount=-1 +kerning first=87 second=225 amount=-1 +kerning first=70 second=83 amount=-1 +kerning first=325 second=290 amount=-1 +kerning first=269 second=287 amount=-1 +kerning first=85 second=313 amount=-1 +kerning first=200 second=8250 amount=-1 +kerning first=233 second=287 amount=-1 +kerning first=200 second=371 amount=-1 +kerning first=67 second=122 amount=-1 +kerning first=67 second=282 amount=-1 +kerning first=1091 second=1090 amount=-1 +kerning first=291 second=289 amount=-1 +kerning first=275 second=234 amount=-1 +kerning first=255 second=289 amount=-1 +kerning first=316 second=339 amount=-1 +kerning first=363 second=289 amount=-1 +kerning first=67 second=339 amount=-1 +kerning first=197 second=8220 amount=-2 +kerning first=206 second=330 amount=-1 +kerning first=1055 second=1105 amount=-1 +kerning first=45 second=280 amount=-1 +kerning first=199 second=232 amount=-1 +kerning first=203 second=219 amount=-1 +kerning first=272 second=278 amount=-1 +kerning first=1039 second=1070 amount=-1 +kerning first=266 second=311 amount=-1 +kerning first=316 second=122 amount=-1 +kerning first=200 second=278 amount=-1 +kerning first=81 second=280 amount=-1 +kerning first=338 second=199 amount=-1 +kerning first=1046 second=1082 amount=-1 +kerning first=8250 second=264 amount=-1 +kerning first=244 second=122 amount=-1 +kerning first=307 second=232 amount=-1 +kerning first=103 second=107 amount=-1 +kerning first=103 second=122 amount=-1 +kerning first=271 second=232 amount=-1 +kerning first=67 second=107 amount=-1 +kerning first=281 second=103 amount=-1 +kerning first=235 second=232 amount=-1 +kerning first=209 second=335 amount=-1 +kerning first=368 second=225 amount=-1 +kerning first=80 second=269 amount=-1 +kerning first=116 second=269 amount=-1 +kerning first=281 second=335 amount=-1 +kerning first=1031 second=1062 amount=-1 +kerning first=75 second=363 amount=-1 +kerning first=89 second=45 amount=-2 +kerning first=199 second=311 amount=-1 +kerning first=281 second=8217 amount=-2 +kerning first=257 second=269 amount=-1 +kerning first=198 second=298 amount=-1 +kerning first=86 second=216 amount=-1 +kerning first=270 second=298 amount=-1 +kerning first=221 second=269 amount=-1 +kerning first=193 second=98 amount=-1 +kerning first=197 second=85 amount=-1 +kerning first=233 second=8220 amount=-2 +kerning first=323 second=101 amount=-1 +kerning first=171 second=346 amount=-1 +kerning first=365 second=269 amount=-1 +kerning first=1058 second=1081 amount=-1 +kerning first=333 second=46 amount=-1 +kerning first=104 second=335 amount=-1 +kerning first=73 second=241 amount=-1 +kerning first=296 second=225 amount=-1 +kerning first=370 second=274 amount=-1 +kerning first=81 second=70 amount=-1 +kerning first=83 second=72 amount=-1 +kerning first=1043 second=1087 amount=-1 +kerning first=221 second=67 amount=-1 +kerning first=298 second=274 amount=-1 +kerning first=71 second=207 amount=-1 +kerning first=268 second=104 amount=-1 +kerning first=80 second=67 amount=-1 +kerning first=334 second=274 amount=-1 +kerning first=70 second=250 amount=-1 +kerning first=196 second=104 amount=-1 +kerning first=262 second=274 amount=-1 +kerning first=232 second=104 amount=-1 +kerning first=283 second=250 amount=-1 +kerning first=120 second=46 amount=-1 +kerning first=212 second=207 amount=-1 +kerning first=325 second=366 amount=-1 +kerning first=368 second=260 amount=-1 +kerning first=45 second=70 amount=-1 +kerning first=370 second=259 amount=-1 +kerning first=282 second=262 amount=-1 +kerning first=204 second=200 amount=-1 +kerning first=267 second=187 amount=-1 +kerning first=362 second=76 amount=-1 +kerning first=298 second=259 amount=-1 +kerning first=375 second=8250 amount=-1 +kerning first=109 second=269 amount=-1 +kerning first=1078 second=1076 amount=-1 +kerning first=262 second=259 amount=-1 +kerning first=1038 second=1074 amount=-1 +kerning first=290 second=76 amount=-1 +kerning first=200 second=357 amount=-1 +kerning first=1118 second=1117 amount=-1 +kerning first=111 second=378 amount=-1 +kerning first=218 second=76 amount=-1 +kerning first=77 second=76 amount=-1 +kerning first=220 second=357 amount=-1 +kerning first=366 second=70 amount=-1 +kerning first=366 second=280 amount=-1 +kerning first=1059 second=1084 amount=-1 +kerning first=229 second=113 amount=-1 +kerning first=330 second=280 amount=-1 +kerning first=352 second=187 amount=-1 +kerning first=277 second=116 amount=-1 +kerning first=1088 second=1083 amount=-1 +kerning first=85 second=259 amount=-1 +kerning first=280 second=75 amount=-1 +kerning first=196 second=375 amount=-1 +kerning first=217 second=366 amount=-1 +kerning first=207 second=271 amount=-1 +kerning first=1067 second=1108 amount=-1 +kerning first=284 second=207 amount=-1 +kerning first=187 second=268 amount=-1 +kerning first=368 second=210 amount=-1 +kerning first=279 second=271 amount=-1 +kerning first=264 second=204 amount=-1 +kerning first=82 second=268 amount=-1 +kerning first=296 second=210 amount=-1 +kerning first=1031 second=1108 amount=-1 +kerning first=214 second=256 amount=-1 +kerning first=1058 second=1096 amount=-1 +kerning first=76 second=366 amount=-1 +kerning first=74 second=198 amount=-1 +kerning first=356 second=242 amount=-1 +kerning first=201 second=369 amount=-1 +kerning first=266 second=257 amount=-1 +kerning first=117 second=333 amount=-1 +kerning first=352 second=209 amount=-1 +kerning first=8217 second=324 amount=-1 +kerning first=302 second=257 amount=-1 +kerning first=1064 second=1113 amount=-1 +kerning first=233 second=233 amount=-1 +kerning first=280 second=209 amount=-1 +kerning first=296 second=279 amount=-1 +kerning first=89 second=257 amount=-1 +kerning first=269 second=233 amount=-1 +kerning first=263 second=316 amount=-1 +kerning first=224 second=279 amount=-1 +kerning first=366 second=114 amount=-1 +kerning first=264 second=327 amount=-1 +kerning first=78 second=235 amount=-1 +kerning first=207 second=213 amount=-1 +kerning first=286 second=187 amount=-1 +kerning first=374 second=380 amount=-1 +kerning first=305 second=233 amount=-1 +kerning first=219 second=235 amount=-1 +kerning first=66 second=213 amount=-1 +kerning first=291 second=235 amount=-1 +kerning first=197 second=371 amount=-1 +kerning first=8222 second=245 amount=-1 +kerning first=327 second=235 amount=-1 +kerning first=1034 second=1045 amount=-1 +kerning first=90 second=8221 amount=-1 +kerning first=363 second=235 amount=-1 +kerning first=313 second=218 amount=-1 +kerning first=89 second=380 amount=-1 +kerning first=291 second=231 amount=-1 +kerning first=195 second=253 amount=-1 +kerning first=108 second=318 amount=-1 +kerning first=116 second=281 amount=-1 +kerning first=259 second=283 amount=-1 +kerning first=8222 second=89 amount=-2 +kerning first=327 second=231 amount=-1 +kerning first=1027 second=1071 amount=-1 +kerning first=346 second=75 amount=-1 +kerning first=205 second=218 amount=-1 +kerning first=73 second=187 amount=-1 +kerning first=1067 second=1104 amount=-1 +kerning first=233 second=248 amount=-1 +kerning first=266 second=380 amount=-1 +kerning first=270 second=88 amount=-1 +kerning first=230 second=380 amount=-1 +kerning first=82 second=357 amount=-1 +kerning first=282 second=8221 amount=-1 +kerning first=305 second=248 amount=-1 +kerning first=202 second=75 amount=-1 +kerning first=1031 second=1104 amount=-1 +kerning first=269 second=248 amount=-1 +kerning first=302 second=380 amount=-1 +kerning first=282 second=220 amount=-1 +kerning first=70 second=196 amount=-1 +kerning first=85 second=274 amount=-1 +kerning first=67 second=209 amount=-1 +kerning first=8250 second=260 amount=-1 +kerning first=114 second=8218 amount=-1 +kerning first=83 second=69 amount=-1 +kerning first=368 second=279 amount=-1 +kerning first=367 second=283 amount=-1 +kerning first=374 second=257 amount=-1 +kerning first=287 second=367 amount=-1 +kerning first=201 second=79 amount=-1 +kerning first=211 second=196 amount=-1 +kerning first=234 second=244 amount=-1 +kerning first=74 second=367 amount=-1 +kerning first=66 second=217 amount=-1 +kerning first=262 second=205 amount=-1 +kerning first=252 second=103 amount=-1 +kerning first=356 second=261 amount=-1 +kerning first=335 second=114 amount=-1 +kerning first=263 second=45 amount=-1 +kerning first=1051 second=1107 amount=-1 +kerning first=207 second=217 amount=-1 +kerning first=84 second=115 amount=-1 +kerning first=74 second=252 amount=-1 +kerning first=227 second=114 amount=-1 +kerning first=206 second=344 amount=-1 +kerning first=315 second=217 amount=-1 +kerning first=217 second=80 amount=-1 +kerning first=1038 second=1097 amount=-1 +kerning first=225 second=8217 amount=-2 +kerning first=1046 second=1063 amount=-1 +kerning first=370 second=205 amount=-1 +kerning first=263 second=114 amount=-1 +kerning first=278 second=344 amount=-1 +kerning first=1043 second=1072 amount=-1 +kerning first=80 second=284 amount=-1 +kerning first=73 second=310 amount=-1 +kerning first=221 second=353 amount=-1 +kerning first=264 second=351 amount=-1 +kerning first=221 second=284 amount=-1 +kerning first=72 second=368 amount=-1 +kerning first=86 second=114 amount=-1 +kerning first=78 second=231 amount=-1 +kerning first=1052 second=1095 amount=-1 +kerning first=99 second=345 amount=-1 +kerning first=85 second=205 amount=-1 +kerning first=197 second=220 amount=-1 +kerning first=368 second=206 amount=-1 +kerning first=367 second=8221 amount=-1 +kerning first=204 second=345 amount=-1 +kerning first=261 second=8250 amount=-1 +kerning first=296 second=206 amount=-1 +kerning first=240 second=345 amount=-1 +kerning first=1036 second=1098 amount=-1 +kerning first=321 second=368 amount=-1 +kerning first=82 second=214 amount=-1 +kerning first=316 second=111 amount=-1 +kerning first=209 second=266 amount=-1 +kerning first=267 second=8221 amount=-2 +kerning first=246 second=106 amount=-1 +kerning first=234 second=281 amount=-1 +kerning first=370 second=325 amount=-1 +kerning first=80 second=353 amount=-1 +kerning first=1053 second=1037 amount=-1 +kerning first=339 second=8221 amount=-2 +kerning first=213 second=368 amount=-1 +kerning first=364 second=71 amount=-1 +kerning first=187 second=214 amount=-1 +kerning first=116 second=353 amount=-1 +kerning first=77 second=362 amount=-1 +kerning first=310 second=223 amount=-1 +kerning first=274 second=223 amount=-1 +kerning first=1031 second=1052 amount=-1 +kerning first=339 second=249 amount=-1 +kerning first=45 second=286 amount=-1 +kerning first=375 second=249 amount=-1 +kerning first=330 second=226 amount=-1 +kerning first=287 second=252 amount=-1 +kerning first=314 second=275 amount=-1 +kerning first=72 second=97 amount=-1 +kerning first=1039 second=1089 amount=-1 +kerning first=366 second=226 amount=-1 +kerning first=101 second=275 amount=-1 +kerning first=218 second=362 amount=-1 +kerning first=310 second=8217 amount=-1 +kerning first=206 second=275 amount=-1 +kerning first=231 second=249 amount=-1 +kerning first=111 second=44 amount=-1 +kerning first=290 second=362 amount=-1 +kerning first=346 second=223 amount=-1 +kerning first=1055 second=1086 amount=-1 +kerning first=267 second=249 amount=-1 +kerning first=122 second=45 amount=-1 +kerning first=119 second=353 amount=-1 +kerning first=87 second=243 amount=-1 +kerning first=290 second=217 amount=-1 +kerning first=345 second=224 amount=-1 +kerning first=286 second=327 amount=-1 +kerning first=228 second=243 amount=-1 +kerning first=75 second=45 amount=-1 +kerning first=302 second=286 amount=-1 +kerning first=362 second=217 amount=-1 +kerning first=86 second=97 amount=-1 +kerning first=324 second=45 amount=-1 +kerning first=296 second=353 amount=-1 +kerning first=195 second=214 amount=-1 +kerning first=364 second=249 amount=-1 +kerning first=258 second=354 amount=-1 +kerning first=252 second=45 amount=-1 +kerning first=368 second=353 amount=-1 +kerning first=288 second=45 amount=-1 +kerning first=275 second=275 amount=-1 +kerning first=219 second=68 amount=-1 +kerning first=279 second=252 amount=-1 +kerning first=214 second=80 amount=-1 +kerning first=1056 second=1045 amount=-1 +kerning first=1062 second=1114 amount=-1 +kerning first=252 second=114 amount=-1 +kerning first=1051 second=1062 amount=-1 +kerning first=1049 second=1097 amount=-1 +kerning first=199 second=318 amount=-1 +kerning first=8222 second=67 amount=-1 +kerning first=235 second=318 amount=-1 +kerning first=86 second=336 amount=-1 +kerning first=69 second=370 amount=-1 +kerning first=45 second=310 amount=-1 +kerning first=286 second=80 amount=-1 +kerning first=282 second=223 amount=-1 +kerning first=263 second=97 amount=-1 +kerning first=72 second=116 amount=-1 +kerning first=267 second=234 amount=-1 +kerning first=231 second=234 amount=-1 +kerning first=212 second=88 amount=-1 +kerning first=86 second=257 amount=-1 +kerning first=339 second=234 amount=-1 +kerning first=1065 second=1085 amount=-1 +kerning first=69 second=223 amount=-1 +kerning first=217 second=258 amount=-1 +kerning first=269 second=226 amount=-1 +kerning first=80 second=362 amount=-1 +kerning first=1054 second=1053 amount=-1 +kerning first=262 second=330 amount=-1 +kerning first=1050 second=1076 amount=-1 +kerning first=206 second=266 amount=-1 +kerning first=220 second=249 amount=-1 +kerning first=207 second=235 amount=-1 +kerning first=1118 second=1084 amount=-1 +kerning first=296 second=211 amount=-1 +kerning first=325 second=71 amount=-1 +kerning first=77 second=217 amount=-1 +kerning first=279 second=232 amount=-1 +kerning first=304 second=200 amount=-1 +kerning first=230 second=382 amount=-1 +kerning first=268 second=200 amount=-1 +kerning first=218 second=217 amount=-1 +kerning first=65 second=266 amount=-1 +kerning first=262 second=98 amount=-1 +kerning first=232 second=267 amount=-1 +kerning first=268 second=267 amount=-1 +kerning first=1052 second=1041 amount=-1 +kerning first=1050 second=1096 amount=-1 +kerning first=304 second=267 amount=-1 +kerning first=121 second=98 amount=-1 +kerning first=192 second=213 amount=-1 +kerning first=85 second=345 amount=-1 +kerning first=113 second=8249 amount=-1 +kerning first=106 second=335 amount=-1 +kerning first=121 second=345 amount=-1 +kerning first=330 second=241 amount=-1 +kerning first=8250 second=206 amount=-1 +kerning first=1078 second=1089 amount=-1 +kerning first=226 second=345 amount=-1 +kerning first=69 second=323 amount=-1 +kerning first=262 second=345 amount=-1 +kerning first=302 second=302 amount=-1 +kerning first=298 second=345 amount=-1 +kerning first=338 second=302 amount=-1 +kerning first=233 second=46 amount=-1 +kerning first=8250 second=193 amount=-1 +kerning first=370 second=345 amount=-1 +kerning first=266 second=302 amount=-1 +kerning first=1027 second=1080 amount=-1 +kerning first=45 second=241 amount=-1 +kerning first=269 second=46 amount=-1 +kerning first=1067 second=1050 amount=-1 +kerning first=1053 second=1069 amount=-1 +kerning first=356 second=335 amount=-1 +kerning first=249 second=114 amount=-1 +kerning first=1031 second=1050 amount=-1 +kerning first=8218 second=364 amount=-1 +kerning first=210 second=370 amount=-1 +kerning first=73 second=110 amount=-1 +kerning first=70 second=336 amount=-1 +kerning first=370 second=200 amount=-1 +kerning first=108 second=114 amount=-1 +kerning first=316 second=378 amount=-1 +kerning first=72 second=114 amount=-1 +kerning first=204 second=81 amount=-1 +kerning first=282 second=323 amount=-1 +kerning first=73 second=80 amount=-1 +kerning first=65 second=199 amount=-1 +kerning first=204 second=207 amount=-1 +kerning first=219 second=250 amount=-1 +kerning first=282 second=370 amount=-1 +kerning first=77 second=284 amount=-1 +kerning first=275 second=115 amount=-1 +kerning first=206 second=199 amount=-1 +kerning first=67 second=378 amount=-1 +kerning first=1053 second=1027 amount=-1 +kerning first=66 second=72 amount=-1 +kerning first=219 second=216 amount=-1 +kerning first=278 second=199 amount=-1 +kerning first=327 second=216 amount=-1 +kerning first=108 second=314 amount=-1 +kerning first=207 second=72 amount=-1 +kerning first=1031 second=1037 amount=-1 +kerning first=68 second=344 amount=-1 +kerning first=1067 second=1037 amount=-1 +kerning first=1053 second=1054 amount=-1 +kerning first=209 second=344 amount=-1 +kerning first=1066 second=1071 amount=-1 +kerning first=264 second=310 amount=-1 +kerning first=103 second=378 amount=-1 +kerning first=214 second=327 amount=-1 +kerning first=209 second=110 amount=-1 +kerning first=108 second=117 amount=-1 +kerning first=45 second=334 amount=-1 +kerning first=86 second=8222 amount=-2 +kerning first=211 second=282 amount=-1 +kerning first=330 second=334 amount=-1 +kerning first=70 second=282 amount=-1 +kerning first=374 second=232 amount=-1 +kerning first=258 second=334 amount=-1 +kerning first=362 second=230 amount=-1 +kerning first=267 second=45 amount=-1 +kerning first=366 second=334 amount=-1 +kerning first=258 second=87 amount=-1 +kerning first=218 second=230 amount=-1 +kerning first=72 second=205 amount=-1 +kerning first=66 second=325 amount=-1 +kerning first=86 second=197 amount=-1 +kerning first=121 second=115 amount=-1 +kerning first=229 second=242 amount=-1 +kerning first=77 second=230 amount=-1 +kerning first=1064 second=1052 amount=-1 +kerning first=81 second=87 amount=-1 +kerning first=226 second=291 amount=-1 +kerning first=45 second=87 amount=-2 +kerning first=201 second=296 amount=-1 +kerning first=121 second=291 amount=-1 +kerning first=252 second=279 amount=-1 +kerning first=356 second=101 amount=-1 +kerning first=206 second=212 amount=-1 +kerning first=339 second=108 amount=-1 +kerning first=375 second=108 amount=-1 +kerning first=194 second=8220 amount=-2 +kerning first=1039 second=1098 amount=-1 +kerning first=1046 second=1117 amount=-1 +kerning first=8217 second=257 amount=-1 +kerning first=65 second=212 amount=-1 +kerning first=324 second=279 amount=-1 +kerning first=333 second=8250 amount=-1 +kerning first=268 second=254 amount=-1 +kerning first=252 second=99 amount=-1 +kerning first=222 second=187 amount=-1 +kerning first=1046 second=1119 amount=-1 +kerning first=81 second=187 amount=-1 +kerning first=307 second=245 amount=-1 +kerning first=99 second=328 amount=-1 +kerning first=225 second=8250 amount=-1 +kerning first=1118 second=1119 amount=-1 +kerning first=271 second=245 amount=-1 +kerning first=220 second=241 amount=-1 +kerning first=235 second=245 amount=-1 +kerning first=117 second=287 amount=-1 +kerning first=199 second=245 amount=-1 +kerning first=230 second=107 amount=-1 +kerning first=242 second=345 amount=-1 +kerning first=81 second=206 amount=-1 +kerning first=324 second=99 amount=-1 +kerning first=224 second=335 amount=-1 +kerning first=118 second=8218 amount=-1 +kerning first=8222 second=254 amount=-1 +kerning first=338 second=8220 amount=-1 +kerning first=269 second=380 amount=-1 +kerning first=203 second=202 amount=-1 +kerning first=266 second=248 amount=-1 +kerning first=230 second=248 amount=-1 +kerning first=260 second=8249 amount=-1 +kerning first=192 second=117 amount=-1 +kerning first=327 second=270 amount=-1 +kerning first=352 second=218 amount=-1 +kerning first=338 second=75 amount=-1 +kerning first=302 second=75 amount=-1 +kerning first=280 second=218 amount=-1 +kerning first=89 second=248 amount=-1 +kerning first=266 second=75 amount=-1 +kerning first=8218 second=305 amount=-1 +kerning first=367 second=231 amount=-1 +kerning first=314 second=242 amount=-1 +kerning first=231 second=307 amount=-1 +kerning first=323 second=66 amount=-1 +kerning first=78 second=270 amount=-1 +kerning first=195 second=307 amount=-1 +kerning first=199 second=264 amount=-1 +kerning first=89 second=8220 amount=-1 +kerning first=1055 second=1073 amount=-1 +kerning first=362 second=171 amount=-2 +kerning first=267 second=307 amount=-1 +kerning first=267 second=108 amount=-1 +kerning first=211 second=209 amount=-1 +kerning first=219 second=270 amount=-1 +kerning first=118 second=367 amount=-1 +kerning first=187 second=202 amount=-1 +kerning first=219 second=196 amount=-1 +kerning first=282 second=69 amount=-1 +kerning first=195 second=108 amount=-1 +kerning first=80 second=74 amount=-1 +kerning first=304 second=205 amount=-1 +kerning first=266 second=8220 amount=-1 +kerning first=231 second=108 amount=-1 +kerning first=74 second=66 amount=-1 +kerning first=70 second=209 amount=-1 +kerning first=230 second=8220 amount=-2 +kerning first=245 second=103 amount=-1 +kerning first=198 second=205 amount=-1 +kerning first=209 second=103 amount=-1 +kerning first=221 second=74 amount=-1 +kerning first=207 second=325 amount=-1 +kerning first=66 second=252 amount=-1 +kerning first=1067 second=1091 amount=-1 +kerning first=104 second=103 amount=-1 +kerning first=1031 second=1091 amount=-1 +kerning first=279 second=8220 amount=-2 +kerning first=105 second=269 amount=-1 +kerning first=106 second=279 amount=-1 +kerning first=1052 second=1034 amount=-1 +kerning first=118 second=187 amount=-1 +kerning first=69 second=69 amount=-1 +kerning first=73 second=273 amount=-1 +kerning first=85 second=44 amount=-2 +kerning first=200 second=304 amount=-1 +kerning first=67 second=218 amount=-1 +kerning first=121 second=44 amount=-1 +kerning first=204 second=261 amount=-1 +kerning first=334 second=44 amount=-1 +kerning first=246 second=316 amount=-1 +kerning first=368 second=193 amount=-1 +kerning first=302 second=248 amount=-1 +kerning first=234 second=316 amount=-1 +kerning first=262 second=44 amount=-1 +kerning first=354 second=269 amount=-1 +kerning first=374 second=248 amount=-1 +kerning first=1071 second=1048 amount=-1 +kerning first=122 second=171 amount=-1 +kerning first=263 second=365 amount=-1 +kerning first=217 second=216 amount=-1 +kerning first=8222 second=101 amount=-1 +kerning first=368 second=65 amount=-1 +kerning first=1030 second=1101 amount=-1 +kerning first=1048 second=1030 amount=-1 +kerning first=1036 second=1074 amount=-1 +kerning first=263 second=171 amount=-1 +kerning first=1038 second=1088 amount=-1 +kerning first=112 second=8221 amount=-2 +kerning first=86 second=365 amount=-1 +kerning first=289 second=117 amount=-1 +kerning first=274 second=203 amount=-1 +kerning first=1027 second=1079 amount=-1 +kerning first=213 second=260 amount=-1 +kerning first=253 second=117 amount=-1 +kerning first=217 second=117 amount=-1 +kerning first=250 second=269 amount=-1 +kerning first=366 second=100 amount=-1 +kerning first=1057 second=1117 amount=-1 +kerning first=74 second=220 amount=-1 +kerning first=330 second=100 amount=-1 +kerning first=202 second=203 amount=-1 +kerning first=367 second=246 amount=-1 +kerning first=115 second=108 amount=-1 +kerning first=196 second=121 amount=-1 +kerning first=1048 second=1025 amount=-1 +kerning first=86 second=171 amount=-2 +kerning first=68 second=298 amount=-1 +kerning first=290 second=330 amount=-1 +kerning first=352 second=77 amount=-1 +kerning first=103 second=8222 amount=-1 +kerning first=362 second=325 amount=-1 +kerning first=364 second=103 amount=-1 +kerning first=67 second=8222 amount=-1 +kerning first=198 second=251 amount=-1 +kerning first=328 second=103 amount=-1 +kerning first=280 second=77 amount=-1 +kerning first=234 second=251 amount=-1 +kerning first=280 second=304 amount=-1 +kerning first=220 second=103 amount=-1 +kerning first=291 second=324 amount=-1 +kerning first=218 second=330 amount=-1 +kerning first=235 second=277 amount=-1 +kerning first=115 second=103 amount=-1 +kerning first=323 second=220 amount=-1 +kerning first=67 second=304 amount=-1 +kerning first=267 second=369 amount=-1 +kerning first=291 second=109 amount=-1 +kerning first=221 second=227 amount=-1 +kerning first=356 second=281 amount=-1 +kerning first=324 second=333 amount=-1 +kerning first=1041 second=1091 amount=-1 +kerning first=327 second=109 amount=-1 +kerning first=70 second=68 amount=-1 +kerning first=1048 second=1092 amount=-1 +kerning first=344 second=211 amount=-1 +kerning first=219 second=109 amount=-1 +kerning first=211 second=68 amount=-1 +kerning first=352 second=8222 amount=-1 +kerning first=252 second=333 amount=-1 +kerning first=257 second=316 amount=-1 +kerning first=1060 second=1048 amount=-1 +kerning first=280 second=8222 amount=-1 +kerning first=8222 second=113 amount=-1 +kerning first=204 second=382 amount=-1 +kerning first=244 second=8222 amount=-1 +kerning first=1047 second=1064 amount=-1 +kerning first=200 second=211 amount=-1 +kerning first=240 second=382 amount=-1 +kerning first=289 second=112 amount=-1 +kerning first=325 second=323 amount=-1 +kerning first=199 second=210 amount=-1 +kerning first=327 second=77 amount=-1 +kerning first=1049 second=1024 amount=-1 +kerning first=204 second=315 amount=-1 +kerning first=281 second=251 amount=-1 +kerning first=233 second=339 amount=-1 +kerning first=220 second=233 amount=-1 +kerning first=77 second=111 amount=-1 +kerning first=302 second=216 amount=-1 +kerning first=368 second=245 amount=-1 +kerning first=117 second=233 amount=-1 +kerning first=259 second=382 amount=-1 +kerning first=218 second=111 amount=-1 +kerning first=296 second=245 amount=-1 +kerning first=78 second=109 amount=-1 +kerning first=1039 second=1057 amount=-1 +kerning first=84 second=44 amount=-1 +kerning first=286 second=219 amount=-1 +kerning first=287 second=120 amount=-1 +kerning first=305 second=339 amount=-1 +kerning first=82 second=290 amount=-1 +kerning first=214 second=219 amount=-1 +kerning first=269 second=339 amount=-1 +kerning first=73 second=219 amount=-1 +kerning first=330 second=233 amount=-1 +kerning first=8218 second=71 amount=-1 +kerning first=1058 second=1118 amount=-1 +kerning first=366 second=233 amount=-1 +kerning first=65 second=374 amount=-1 +kerning first=119 second=8217 amount=-2 +kerning first=209 second=298 amount=-1 +kerning first=84 second=224 amount=-1 +kerning first=325 second=212 amount=-1 +kerning first=224 second=8217 amount=-2 +kerning first=1056 second=1104 amount=-1 +kerning first=260 second=8217 amount=-2 +kerning first=8222 second=121 amount=-1 +kerning first=355 second=228 amount=-1 +kerning first=352 second=369 amount=-1 +kerning first=281 second=357 amount=-1 +kerning first=80 second=357 amount=-1 +kerning first=283 second=8217 amount=-2 +kerning first=217 second=212 amount=-1 +kerning first=83 second=8217 amount=-1 +kerning first=352 second=85 amount=-1 +kerning first=325 second=101 amount=-1 +kerning first=8250 second=65 amount=-1 +kerning first=224 second=245 amount=-1 +kerning first=326 second=111 amount=-1 +kerning first=280 second=85 amount=-1 +kerning first=362 second=111 amount=-1 +kerning first=1051 second=1054 amount=-1 +kerning first=332 second=8217 amount=-2 +kerning first=368 second=8217 amount=-1 +kerning first=199 second=331 amount=-1 +kerning first=67 second=85 amount=-1 +kerning first=230 second=289 amount=-1 +kerning first=89 second=216 amount=-1 +kerning first=304 second=67 amount=-1 +kerning first=70 second=241 amount=-1 +kerning first=1051 second=1075 amount=-1 +kerning first=194 second=216 amount=-1 +kerning first=304 second=113 amount=-1 +kerning first=350 second=366 amount=-1 +kerning first=221 second=262 amount=-1 +kerning first=268 second=67 amount=-1 +kerning first=220 second=195 amount=-1 +kerning first=74 second=274 amount=-1 +kerning first=266 second=216 amount=-1 +kerning first=232 second=113 amount=-1 +kerning first=298 second=79 amount=-1 +kerning first=1041 second=1049 amount=-1 +kerning first=8222 second=286 amount=-1 +kerning first=278 second=366 amount=-1 +kerning first=268 second=113 amount=-1 +kerning first=196 second=67 amount=-1 +kerning first=70 second=216 amount=-1 +kerning first=370 second=79 amount=-1 +kerning first=79 second=195 amount=-1 +kerning first=1077 second=1095 amount=-1 +kerning first=364 second=195 amount=-1 +kerning first=1041 second=1113 amount=-1 +kerning first=235 second=104 amount=-1 +kerning first=263 second=225 amount=-1 +kerning first=8217 second=365 amount=-1 +kerning first=72 second=206 amount=-1 +kerning first=280 second=250 amount=-1 +kerning first=81 second=46 amount=-1 +kerning first=65 second=253 amount=-1 +kerning first=221 second=261 amount=-1 +kerning first=199 second=104 amount=-1 +kerning first=209 second=357 amount=-1 +kerning first=70 second=70 amount=-1 +kerning first=8218 second=257 amount=-1 +kerning first=251 second=345 amount=-1 +kerning first=1048 second=1084 amount=-1 +kerning first=287 second=345 amount=-1 +kerning first=365 second=335 amount=-1 +kerning first=323 second=274 amount=-1 +kerning first=323 second=345 amount=-1 +kerning first=258 second=46 amount=-1 +kerning first=211 second=70 amount=-1 +kerning first=352 second=250 amount=-1 +kerning first=222 second=46 amount=-1 +kerning first=202 second=368 amount=-1 +kerning first=70 second=230 amount=-1 +kerning first=346 second=201 amount=-1 +kerning first=283 second=122 amount=-1 +kerning first=77 second=271 amount=-1 +kerning first=79 second=8221 amount=-2 +kerning first=274 second=368 amount=-1 +kerning first=304 second=213 amount=-1 +kerning first=323 second=207 amount=-1 +kerning first=245 second=46 amount=-1 +kerning first=274 second=201 amount=-1 +kerning first=310 second=368 amount=-1 +kerning first=268 second=213 amount=-1 +kerning first=277 second=107 amount=-1 +kerning first=8222 second=281 amount=-1 +kerning first=70 second=122 amount=-1 +kerning first=200 second=317 amount=-1 +kerning first=202 second=201 amount=-1 +kerning first=103 second=250 amount=-1 +kerning first=99 second=369 amount=-1 +kerning first=256 second=8221 amount=-2 +kerning first=200 second=336 amount=-1 +kerning first=272 second=317 amount=-1 +kerning first=263 second=311 amount=-1 +kerning first=310 second=116 amount=-1 +kerning first=328 second=8221 amount=-2 +kerning first=65 second=366 amount=-1 +kerning first=217 second=204 amount=-1 +kerning first=203 second=252 amount=-1 +kerning first=364 second=8221 amount=-1 +kerning first=374 second=216 amount=-1 +kerning first=198 second=8217 amount=-1 +kerning first=323 second=45 amount=-1 +kerning first=344 second=336 amount=-1 +kerning first=78 second=378 amount=-1 +kerning first=362 second=271 amount=-1 +kerning first=346 second=368 amount=-1 +kerning first=74 second=207 amount=-1 +kerning first=327 second=378 amount=-1 +kerning first=1054 second=1041 amount=-1 +kerning first=325 second=204 amount=-1 +kerning first=291 second=378 amount=-1 +kerning first=80 second=262 amount=-1 +kerning first=362 second=198 amount=-1 +kerning first=87 second=8218 amount=-2 +kerning first=220 second=268 amount=-1 +kerning first=1068 second=1068 amount=-1 +kerning first=187 second=86 amount=-2 +kerning first=89 second=235 amount=-1 +kerning first=339 second=103 amount=-1 +kerning first=323 second=347 amount=-1 +kerning first=82 second=86 amount=-1 +kerning first=364 second=268 amount=-1 +kerning first=230 second=235 amount=-1 +kerning first=287 second=347 amount=-1 +kerning first=266 second=235 amount=-1 +kerning first=302 second=235 amount=-1 +kerning first=209 second=290 amount=-1 +kerning first=67 second=77 amount=-1 +kerning first=74 second=347 amount=-1 +kerning first=262 second=350 amount=-1 +kerning first=374 second=235 amount=-1 +kerning first=218 second=198 amount=-1 +kerning first=1060 second=1056 amount=-1 +kerning first=196 second=213 amount=-1 +kerning first=1070 second=1069 amount=-1 +kerning first=85 second=350 amount=-1 +kerning first=1065 second=1077 amount=-1 +kerning first=86 second=363 amount=-1 +kerning first=199 second=277 amount=-1 +kerning first=1058 second=1073 amount=-1 +kerning first=8217 second=225 amount=-1 +kerning first=8217 second=378 amount=-1 +kerning first=263 second=363 amount=-1 +kerning first=362 second=213 amount=-1 +kerning first=1033 second=1062 amount=-1 +kerning first=298 second=350 amount=-1 +kerning first=307 second=277 amount=-1 +kerning first=370 second=350 amount=-1 +kerning first=362 second=366 amount=-1 +kerning first=1118 second=1087 amount=-1 +kerning first=67 second=231 amount=-1 +kerning first=85 second=79 amount=-1 +kerning first=104 second=244 amount=-1 +kerning first=362 second=338 amount=-1 +kerning first=209 second=244 amount=-1 +kerning first=8222 second=267 amount=-1 +kerning first=356 second=283 amount=-1 +kerning first=199 second=8249 amount=-1 +kerning first=281 second=244 amount=-1 +kerning first=210 second=82 amount=-1 +kerning first=316 second=231 amount=-1 +kerning first=268 second=286 amount=-1 +kerning first=218 second=338 amount=-1 +kerning first=212 second=354 amount=-1 +kerning first=304 second=286 amount=-1 +kerning first=87 second=351 amount=-1 +kerning first=282 second=82 amount=-1 +kerning first=8222 second=289 amount=-1 +kerning first=258 second=8249 amount=-1 +kerning first=100 second=235 amount=-1 +kerning first=204 second=79 amount=-1 +kerning first=354 second=101 amount=-1 +kerning first=85 second=66 amount=-1 +kerning first=370 second=283 amount=-1 +kerning first=205 second=235 amount=-1 +kerning first=45 second=209 amount=-1 +kerning first=78 second=248 amount=-1 +kerning first=304 second=366 amount=-1 +kerning first=298 second=283 amount=-1 +kerning first=277 second=235 amount=-1 +kerning first=70 second=371 amount=-1 +kerning first=325 second=331 amount=-1 +kerning first=74 second=261 amount=-1 +kerning first=226 second=283 amount=-1 +kerning first=262 second=283 amount=-1 +kerning first=1039 second=1076 amount=-1 +kerning first=1042 second=1067 amount=-1 +kerning first=1038 second=1080 amount=-1 +kerning first=103 second=380 amount=-1 +kerning first=244 second=380 amount=-1 +kerning first=45 second=374 amount=-2 +kerning first=1062 second=1076 amount=-1 +kerning first=370 second=66 amount=-1 +kerning first=366 second=209 amount=-1 +kerning first=334 second=66 amount=-1 +kerning first=73 second=46 amount=-1 +kerning first=80 second=213 amount=-1 +kerning first=330 second=209 amount=-1 +kerning first=298 second=66 amount=-1 +kerning first=262 second=66 amount=-1 +kerning first=266 second=270 amount=-1 +kerning first=302 second=270 amount=-1 +kerning first=258 second=336 amount=-1 +kerning first=199 second=323 amount=-1 +kerning first=287 second=44 amount=-1 +kerning first=218 second=252 amount=-1 +kerning first=330 second=336 amount=-1 +kerning first=68 second=192 amount=-1 +kerning first=366 second=336 amount=-1 +kerning first=1067 second=1045 amount=-1 +kerning first=1031 second=1045 amount=-1 +kerning first=67 second=380 amount=-1 +kerning first=362 second=252 amount=-1 +kerning first=286 second=220 amount=-1 +kerning first=116 second=187 amount=-1 +kerning first=187 second=205 amount=-1 +kerning first=220 second=244 amount=-1 +kerning first=305 second=231 amount=-1 +kerning first=296 second=201 amount=-1 +kerning first=327 second=218 amount=-1 +kerning first=363 second=248 amount=-1 +kerning first=220 second=214 amount=-1 +kerning first=366 second=371 amount=-1 +kerning first=212 second=115 amount=-1 +kerning first=258 second=290 amount=-1 +kerning first=375 second=104 amount=-1 +kerning first=328 second=244 amount=-1 +kerning first=364 second=244 amount=-1 +kerning first=1055 second=1045 amount=-1 +kerning first=219 second=218 amount=-1 +kerning first=219 second=248 amount=-1 +kerning first=364 second=214 amount=-1 +kerning first=233 second=231 amount=-1 +kerning first=291 second=248 amount=-1 +kerning first=269 second=231 amount=-1 +kerning first=83 second=201 amount=-1 +kerning first=1041 second=1041 amount=-1 +kerning first=97 second=314 amount=-1 +kerning first=255 second=353 amount=-1 +kerning first=228 second=275 amount=-1 +kerning first=275 second=243 amount=-1 +kerning first=235 second=353 amount=-1 +kerning first=262 second=108 amount=-1 +kerning first=1066 second=1049 amount=-1 +kerning first=221 second=8220 amount=-1 +kerning first=1027 second=1088 amount=-1 +kerning first=264 second=275 amount=-1 +kerning first=241 second=45 amount=-1 +kerning first=65 second=71 amount=-1 +kerning first=1055 second=1081 amount=-1 +kerning first=72 second=366 amount=-1 +kerning first=1091 second=1081 amount=-1 +kerning first=281 second=249 amount=-1 +kerning first=87 second=275 amount=-1 +kerning first=85 second=302 amount=-1 +kerning first=108 second=363 amount=-1 +kerning first=207 second=284 amount=-1 +kerning first=1042 second=1119 amount=-1 +kerning first=199 second=353 amount=-1 +kerning first=80 second=370 amount=-1 +kerning first=199 second=223 amount=-1 +kerning first=203 second=80 amount=-1 +kerning first=267 second=347 amount=-1 +kerning first=74 second=116 amount=-1 +kerning first=268 second=232 amount=-1 +kerning first=345 second=44 amount=-1 +kerning first=1050 second=1098 amount=-1 +kerning first=232 second=232 amount=-1 +kerning first=196 second=362 amount=-1 +kerning first=207 second=200 amount=-1 +kerning first=268 second=362 amount=-1 +kerning first=86 second=225 amount=-1 +kerning first=67 second=226 amount=-1 +kerning first=195 second=266 amount=-1 +kerning first=66 second=200 amount=-1 +kerning first=286 second=8250 amount=-1 +kerning first=304 second=232 amount=-1 +kerning first=304 second=362 amount=-1 +kerning first=85 second=296 amount=-1 +kerning first=101 second=234 amount=-1 +kerning first=278 second=71 amount=-1 +kerning first=278 second=209 amount=-1 +kerning first=8222 second=262 amount=-1 +kerning first=270 second=354 amount=-1 +kerning first=334 second=296 amount=-1 +kerning first=327 second=71 amount=-1 +kerning first=8217 second=279 amount=-1 +kerning first=1054 second=1031 amount=-1 +kerning first=230 second=318 amount=-1 +kerning first=206 second=71 amount=-1 +kerning first=298 second=296 amount=-1 +kerning first=85 second=283 amount=-1 +kerning first=266 second=263 amount=-1 +kerning first=314 second=234 amount=-1 +kerning first=74 second=219 amount=-1 +kerning first=201 second=206 amount=-1 +kerning first=1056 second=1037 amount=-1 +kerning first=219 second=8220 amount=-1 +kerning first=268 second=72 amount=-1 +kerning first=1043 second=1089 amount=-1 +kerning first=323 second=315 amount=-1 +kerning first=106 second=287 amount=-1 +kerning first=212 second=313 amount=-1 +kerning first=291 second=8220 amount=-2 +kerning first=229 second=111 amount=-1 +kerning first=116 second=267 amount=-1 +kerning first=355 second=287 amount=-1 +kerning first=363 second=8220 amount=-1 +kerning first=194 second=213 amount=-1 +kerning first=327 second=8220 amount=-1 +kerning first=304 second=72 amount=-1 +kerning first=283 second=287 amount=-1 +kerning first=334 second=88 amount=-1 +kerning first=1060 second=1024 amount=-1 +kerning first=202 second=298 amount=-1 +kerning first=71 second=313 amount=-1 +kerning first=74 second=315 amount=-1 +kerning first=262 second=120 amount=-1 +kerning first=213 second=85 amount=-1 +kerning first=79 second=374 amount=-1 +kerning first=365 second=267 amount=-1 +kerning first=330 second=263 amount=-1 +kerning first=366 second=263 amount=-1 +kerning first=370 second=120 amount=-1 +kerning first=1059 second=1028 amount=-1 +kerning first=187 second=118 amount=-1 +kerning first=221 second=267 amount=-1 +kerning first=296 second=114 amount=-1 +kerning first=1047 second=1083 amount=-1 +kerning first=217 second=278 amount=-1 +kerning first=195 second=212 amount=-1 +kerning first=114 second=8220 amount=-1 +kerning first=73 second=278 amount=-1 +kerning first=368 second=114 amount=-1 +kerning first=72 second=334 amount=-1 +kerning first=88 second=81 amount=-1 +kerning first=119 second=114 amount=-1 +kerning first=354 second=45 amount=-1 +kerning first=264 second=115 amount=-1 +kerning first=286 second=278 amount=-1 +kerning first=1062 second=1092 amount=-1 +kerning first=224 second=114 amount=-1 +kerning first=296 second=331 amount=-1 +kerning first=255 second=367 amount=-1 +kerning first=217 second=199 amount=-1 +kerning first=117 second=263 amount=-1 +kerning first=368 second=331 amount=-1 +kerning first=87 second=115 amount=-1 +kerning first=83 second=114 amount=-1 +kerning first=193 second=81 amount=-1 +kerning first=219 second=194 amount=-1 +kerning first=325 second=199 amount=-1 +kerning first=1062 second=1116 amount=-1 +kerning first=368 second=363 amount=-1 +kerning first=277 second=365 amount=-1 +kerning first=354 second=74 amount=-1 +kerning first=325 second=310 amount=-1 +kerning first=65 second=361 amount=-1 +kerning first=1042 second=1095 amount=-1 +kerning first=108 second=106 amount=-1 +kerning first=288 second=203 amount=-1 +kerning first=217 second=310 amount=-1 +kerning first=350 second=361 amount=-1 +kerning first=364 second=251 amount=-1 +kerning first=235 second=269 amount=-1 +kerning first=278 second=361 amount=-1 +kerning first=271 second=269 amount=-1 +kerning first=83 second=8221 amount=-1 +kerning first=206 second=288 amount=-1 +kerning first=1052 second=1036 amount=-1 +kerning first=213 second=65 amount=-1 +kerning first=197 second=334 amount=-1 +kerning first=366 second=282 amount=-1 +kerning first=330 second=282 amount=-1 +kerning first=200 second=78 amount=-1 +kerning first=207 second=230 amount=-1 +kerning first=259 second=246 amount=-1 +kerning first=278 second=288 amount=-1 +kerning first=310 second=355 amount=-1 +kerning first=1059 second=1101 amount=-1 +kerning first=1060 second=1043 amount=-1 +kerning first=274 second=355 amount=-1 +kerning first=77 second=325 amount=-1 +kerning first=1068 second=1055 amount=-1 +kerning first=211 second=313 amount=-1 +kerning first=81 second=282 amount=-1 +kerning first=246 second=318 amount=-1 +kerning first=84 second=242 amount=-1 +kerning first=263 second=187 amount=-1 +kerning first=199 second=75 amount=-1 +kerning first=8217 second=333 amount=-1 +kerning first=205 second=346 amount=-1 +kerning first=218 second=325 amount=-1 +kerning first=65 second=288 amount=-1 +kerning first=197 second=87 amount=-1 +kerning first=290 second=325 amount=-1 +kerning first=267 second=291 amount=-1 +kerning first=315 second=220 amount=-1 +kerning first=355 second=187 amount=-1 +kerning first=118 second=251 amount=-1 +kerning first=1055 second=1051 amount=-1 +kerning first=187 second=251 amount=-1 +kerning first=263 second=279 amount=-1 +kerning first=283 second=187 amount=-1 +kerning first=105 second=245 amount=-1 +kerning first=85 second=337 amount=-1 +kerning first=246 second=8217 amount=-2 +kerning first=282 second=8217 amount=-1 +kerning first=354 second=8217 amount=-1 +kerning first=250 second=171 amount=-1 +kerning first=100 second=99 amount=-1 +kerning first=1027 second=1073 amount=-1 +kerning first=67 second=99 amount=-1 +kerning first=192 second=221 amount=-1 +kerning first=205 second=75 amount=-1 +kerning first=277 second=99 amount=-1 +kerning first=211 second=187 amount=-1 +kerning first=354 second=245 amount=-1 +kerning first=1071 second=1119 amount=-1 +kerning first=227 second=279 amount=-1 +kerning first=45 second=68 amount=-1 +kerning first=298 second=337 amount=-1 +kerning first=205 second=99 amount=-1 +kerning first=106 second=187 amount=-1 +kerning first=83 second=206 amount=-1 +kerning first=262 second=337 amount=-1 +kerning first=241 second=99 amount=-1 +kerning first=364 second=261 amount=-1 +kerning first=262 second=242 amount=-1 +kerning first=266 second=99 amount=-1 +kerning first=1071 second=1043 amount=-1 +kerning first=1070 second=1043 amount=-1 +kerning first=298 second=242 amount=-1 +kerning first=302 second=99 amount=-1 +kerning first=1059 second=1082 amount=-1 +kerning first=209 second=281 amount=-1 +kerning first=270 second=86 amount=-1 +kerning first=259 second=281 amount=-1 +kerning first=226 second=242 amount=-1 +kerning first=230 second=99 amount=-1 +kerning first=204 second=347 amount=-1 +kerning first=261 second=382 amount=-1 +kerning first=99 second=347 amount=-1 +kerning first=370 second=242 amount=-1 +kerning first=209 second=268 amount=-1 +kerning first=374 second=99 amount=-1 +kerning first=106 second=233 amount=-1 +kerning first=76 second=364 amount=-1 +kerning first=220 second=120 amount=-1 +kerning first=364 second=290 amount=-1 +kerning first=219 second=77 amount=-1 +kerning first=296 second=277 amount=-1 +kerning first=78 second=77 amount=-1 +kerning first=8218 second=199 amount=-1 +kerning first=282 second=264 amount=-1 +kerning first=70 second=233 amount=-1 +kerning first=224 second=277 amount=-1 +kerning first=79 second=73 amount=-1 +kerning first=365 second=279 amount=-1 +kerning first=283 second=233 amount=-1 +kerning first=269 second=109 amount=-1 +kerning first=1049 second=1056 amount=-1 +kerning first=69 second=264 amount=-1 +kerning first=271 second=8217 amount=-1 +kerning first=199 second=82 amount=-1 +kerning first=307 second=8217 amount=-1 +kerning first=355 second=233 amount=-1 +kerning first=325 second=364 amount=-1 +kerning first=213 second=193 amount=-1 +kerning first=379 second=8217 amount=-1 +kerning first=73 second=224 amount=-1 +kerning first=281 second=108 amount=-1 +kerning first=220 second=290 amount=-1 +kerning first=80 second=69 amount=-1 +kerning first=217 second=364 amount=-1 +kerning first=8250 second=114 amount=-1 +kerning first=199 second=8217 amount=-1 +kerning first=252 second=283 amount=-1 +kerning first=235 second=8217 amount=-2 +kerning first=1056 second=1091 amount=-1 +kerning first=245 second=108 amount=-1 +kerning first=207 second=338 amount=-1 +kerning first=202 second=355 amount=-1 +kerning first=195 second=255 amount=-1 +kerning first=1042 second=1113 amount=-1 +kerning first=353 second=108 amount=-1 +kerning first=1047 second=1061 amount=-1 +kerning first=67 second=334 amount=-1 +kerning first=84 second=273 amount=-1 +kerning first=80 second=286 amount=-1 +kerning first=89 second=99 amount=-1 +kerning first=211 second=347 amount=-1 +kerning first=275 second=351 amount=-1 +kerning first=272 second=78 amount=-1 +kerning first=364 second=8220 amount=-1 +kerning first=1064 second=1070 amount=-1 +kerning first=221 second=286 amount=-1 +kerning first=213 second=87 amount=-1 +kerning first=310 second=171 amount=-1 +kerning first=86 second=333 amount=-1 +kerning first=263 second=112 amount=-1 +kerning first=346 second=171 amount=-1 +kerning first=1030 second=1095 amount=-1 +kerning first=75 second=365 amount=-1 +kerning first=302 second=278 amount=-1 +kerning first=382 second=171 amount=-1 +kerning first=289 second=307 amount=-1 +kerning first=263 second=333 amount=-1 +kerning first=196 second=254 amount=-1 +kerning first=66 second=71 amount=-1 +kerning first=232 second=254 amount=-1 +kerning first=252 second=269 amount=-1 +kerning first=227 second=333 amount=-1 +kerning first=65 second=117 amount=-1 +kerning first=106 second=263 amount=-1 +kerning first=350 second=117 amount=-1 +kerning first=314 second=117 amount=-1 +kerning first=195 second=374 amount=-1 +kerning first=79 second=298 amount=-1 +kerning first=278 second=117 amount=-1 +kerning first=1070 second=1067 amount=-1 +kerning first=97 second=171 amount=-1 +kerning first=1058 second=1083 amount=-1 +kerning first=283 second=100 amount=-1 +kerning first=278 second=212 amount=-1 +kerning first=283 second=263 amount=-1 +kerning first=202 second=171 amount=-1 +kerning first=1052 second=1039 amount=-1 +kerning first=355 second=263 amount=-1 +kerning first=82 second=8249 amount=-1 +kerning first=274 second=171 amount=-1 +kerning first=220 second=298 amount=-1 +kerning first=1047 second=1118 amount=-1 +kerning first=274 second=206 amount=-1 +kerning first=45 second=82 amount=-1 +kerning first=229 second=382 amount=-1 +kerning first=202 second=206 amount=-1 +kerning first=207 second=330 amount=-1 +kerning first=79 second=353 amount=-1 +kerning first=232 second=316 amount=-1 +kerning first=234 second=246 amount=-1 +kerning first=85 second=120 amount=-1 +kerning first=70 second=100 amount=-1 +kerning first=375 second=103 amount=-1 +kerning first=1048 second=1060 amount=-1 +kerning first=196 second=316 amount=-1 +kerning first=121 second=120 amount=-1 +kerning first=1071 second=1077 amount=-1 +kerning first=68 second=8221 amount=-2 +kerning first=66 second=330 amount=-1 +kerning first=268 second=316 amount=-1 +kerning first=70 second=263 amount=-1 +kerning first=346 second=206 amount=-1 +kerning first=104 second=8221 amount=-2 +kerning first=267 second=103 amount=-1 +kerning first=103 second=109 amount=-1 +kerning first=1049 second=1048 amount=-1 +kerning first=234 second=8218 amount=-1 +kerning first=89 second=194 amount=-1 +kerning first=231 second=103 amount=-1 +kerning first=198 second=8218 amount=-1 +kerning first=201 second=252 amount=-1 +kerning first=209 second=8221 amount=-1 +kerning first=304 second=74 amount=-1 +kerning first=366 second=68 amount=-1 +kerning first=245 second=8221 amount=-2 +kerning first=67 second=109 amount=-1 +kerning first=241 second=113 amount=-1 +kerning first=193 second=217 amount=-1 +kerning first=281 second=8221 amount=-2 +kerning first=284 second=313 amount=-1 +kerning first=81 second=68 amount=-1 +kerning first=353 second=8221 amount=-2 +kerning first=270 second=8218 amount=-1 +kerning first=219 second=85 amount=-1 +kerning first=296 second=223 amount=-1 +kerning first=74 second=98 amount=-1 +kerning first=67 second=280 amount=-1 +kerning first=282 second=210 amount=-1 +kerning first=103 second=326 amount=-1 +kerning first=78 second=85 amount=-1 +kerning first=350 second=8250 amount=-1 +kerning first=1064 second=1057 amount=-1 +kerning first=205 second=66 amount=-1 +kerning first=287 second=98 amount=-1 +kerning first=327 second=302 amount=-1 +kerning first=1044 second=1081 amount=-1 +kerning first=219 second=302 amount=-1 +kerning first=69 second=210 amount=-1 +kerning first=368 second=223 amount=-1 +kerning first=330 second=339 amount=-1 +kerning first=73 second=243 amount=-1 +kerning first=259 second=335 amount=-1 +kerning first=355 second=99 amount=-1 +kerning first=280 second=280 amount=-1 +kerning first=365 second=232 amount=-1 +kerning first=74 second=350 amount=-1 +kerning first=78 second=302 amount=-1 +kerning first=366 second=339 amount=-1 +kerning first=194 second=107 amount=-1 +kerning first=109 second=243 amount=-1 +kerning first=250 second=243 amount=-1 +kerning first=117 second=339 amount=-1 +kerning first=367 second=335 amount=-1 +kerning first=83 second=223 amount=-1 +kerning first=1056 second=1055 amount=-1 +kerning first=8222 second=316 amount=-1 +kerning first=274 second=363 amount=-1 +kerning first=323 second=350 amount=-1 +kerning first=66 second=284 amount=-1 +kerning first=310 second=363 amount=-1 +kerning first=364 second=344 amount=-1 +kerning first=346 second=363 amount=-1 +kerning first=364 second=298 amount=-1 +kerning first=296 second=355 amount=-1 +kerning first=1034 second=1042 amount=-1 +kerning first=198 second=357 amount=-1 +kerning first=332 second=46 amount=-1 +kerning first=257 second=232 amount=-1 +kerning first=204 second=76 amount=-1 +kerning first=221 second=232 amount=-1 +kerning first=1065 second=1072 amount=-1 +kerning first=100 second=289 amount=-1 +kerning first=234 second=357 amount=-1 +kerning first=79 second=344 amount=-1 +kerning first=217 second=234 amount=-1 +kerning first=1050 second=1114 amount=-1 +kerning first=1055 second=1027 amount=-1 +kerning first=325 second=234 amount=-1 +kerning first=277 second=289 amount=-1 +kerning first=187 second=354 amount=-1 +kerning first=289 second=234 amount=-1 +kerning first=241 second=289 amount=-1 +kerning first=1049 second=1054 amount=-1 +kerning first=83 second=8249 amount=-1 +kerning first=327 second=85 amount=-1 +kerning first=119 second=8249 amount=-1 +kerning first=1053 second=1108 amount=-1 +kerning first=304 second=262 amount=-1 +kerning first=106 second=46 amount=-1 +kerning first=202 second=280 amount=-1 +kerning first=350 second=204 amount=-1 +kerning first=323 second=79 amount=-1 +kerning first=290 second=66 amount=-1 +kerning first=8250 second=377 amount=-1 +kerning first=195 second=366 amount=-1 +kerning first=78 second=325 amount=-1 +kerning first=211 second=46 amount=-1 +kerning first=278 second=204 amount=-1 +kerning first=283 second=46 amount=-1 +kerning first=279 second=113 amount=-1 +kerning first=89 second=378 amount=-1 +kerning first=207 second=67 amount=-1 +kerning first=1073 second=1084 amount=-1 +kerning first=296 second=345 amount=-1 +kerning first=66 second=67 amount=-1 +kerning first=200 second=70 amount=-1 +kerning first=203 second=332 amount=-1 +kerning first=270 second=192 amount=-1 +kerning first=66 second=87 amount=-1 +kerning first=269 second=250 amount=-1 +kerning first=70 second=46 amount=-2 +kerning first=233 second=250 amount=-1 +kerning first=1056 second=1065 amount=-1 +kerning first=204 second=274 amount=-1 +kerning first=211 second=317 amount=-1 +kerning first=366 second=122 amount=-1 +kerning first=370 second=207 amount=-1 +kerning first=83 second=323 amount=-1 +kerning first=221 second=213 amount=-1 +kerning first=334 second=207 amount=-1 +kerning first=74 second=369 amount=-1 +kerning first=8250 second=106 amount=-1 +kerning first=330 second=122 amount=-1 +kerning first=272 second=70 amount=-1 +kerning first=1088 second=1093 amount=-1 +kerning first=287 second=369 amount=-1 +kerning first=291 second=108 amount=-1 +kerning first=8217 second=368 amount=-1 +kerning first=213 second=201 amount=-1 +kerning first=356 second=259 amount=-1 +kerning first=200 second=8217 amount=-1 +kerning first=207 second=113 amount=-1 +kerning first=305 second=8222 amount=-1 +kerning first=87 second=256 amount=-1 +kerning first=302 second=378 amount=-1 +kerning first=368 second=323 amount=-1 +kerning first=1066 second=1041 amount=-1 +kerning first=233 second=8222 amount=-1 +kerning first=1030 second=1041 amount=-1 +kerning first=72 second=201 amount=-1 +kerning first=85 second=207 amount=-1 +kerning first=230 second=378 amount=-1 +kerning first=296 second=323 amount=-1 +kerning first=104 second=231 amount=-1 +kerning first=8220 second=194 amount=-2 +kerning first=8222 second=362 amount=-1 +kerning first=70 second=317 amount=-1 +kerning first=206 second=204 amount=-1 +kerning first=298 second=207 amount=-1 +kerning first=310 second=119 amount=-1 +kerning first=196 second=262 amount=-1 +kerning first=262 second=207 amount=-1 +kerning first=374 second=378 amount=-1 +kerning first=263 second=314 amount=-1 +kerning first=227 second=314 amount=-1 +kerning first=234 second=369 amount=-1 +kerning first=1039 second=1081 amount=-1 +kerning first=8218 second=100 amount=-1 +kerning first=198 second=369 amount=-1 +kerning first=362 second=355 amount=-1 +kerning first=67 second=201 amount=-1 +kerning first=70 second=366 amount=-1 +kerning first=368 second=116 amount=-1 +kerning first=366 second=204 amount=-1 +kerning first=80 second=198 amount=-1 +kerning first=1058 second=1105 amount=-1 +kerning first=335 second=314 amount=-1 +kerning first=1053 second=1084 amount=-1 +kerning first=330 second=204 amount=-1 +kerning first=221 second=198 amount=-1 +kerning first=296 second=116 amount=-1 +kerning first=197 second=363 amount=-1 +kerning first=73 second=317 amount=-1 +kerning first=268 second=210 amount=-1 +kerning first=233 second=363 amount=-1 +kerning first=68 second=207 amount=-1 +kerning first=304 second=210 amount=-1 +kerning first=366 second=378 amount=-1 +kerning first=269 second=363 amount=-1 +kerning first=209 second=207 amount=-1 +kerning first=196 second=210 amount=-1 +kerning first=325 second=268 amount=-1 +kerning first=214 second=317 amount=-1 +kerning first=1088 second=1078 amount=-1 +kerning first=211 second=366 amount=-1 +kerning first=86 second=67 amount=-1 +kerning first=85 second=101 amount=-1 +kerning first=68 second=354 amount=-1 +kerning first=69 second=213 amount=-1 +kerning first=347 second=8250 amount=-1 +kerning first=264 second=73 amount=-1 +kerning first=364 second=219 amount=-1 +kerning first=84 second=8220 amount=-1 +kerning first=275 second=8250 amount=-1 +kerning first=282 second=213 amount=-1 +kerning first=262 second=101 amount=-1 +kerning first=74 second=296 amount=-1 +kerning first=226 second=101 amount=-1 +kerning first=120 second=8220 amount=-1 +kerning first=203 second=8250 amount=-1 +kerning first=1062 second=1081 amount=-1 +kerning first=217 second=268 amount=-1 +kerning first=8216 second=362 amount=-1 +kerning first=220 second=219 amount=-1 +kerning first=261 second=8220 amount=-2 +kerning first=268 second=298 amount=-1 +kerning first=298 second=101 amount=-1 +kerning first=225 second=8220 amount=-2 +kerning first=275 second=187 amount=-1 +kerning first=277 second=277 amount=-1 +kerning first=370 second=101 amount=-1 +kerning first=241 second=277 amount=-1 +kerning first=225 second=122 amount=-1 +kerning first=279 second=116 amount=-1 +kerning first=205 second=277 amount=-1 +kerning first=232 second=318 amount=-1 +kerning first=79 second=219 amount=-1 +kerning first=261 second=122 amount=-1 +kerning first=8222 second=264 amount=-1 +kerning first=81 second=204 amount=-1 +kerning first=45 second=204 amount=-1 +kerning first=80 second=345 amount=-1 +kerning first=323 second=296 amount=-1 +kerning first=1051 second=1072 amount=-1 +kerning first=84 second=122 amount=-1 +kerning first=207 second=273 amount=-1 +kerning first=88 second=79 amount=-1 +kerning first=324 second=235 amount=-1 +kerning first=227 second=287 amount=-1 +kerning first=100 second=277 amount=-1 +kerning first=363 second=231 amount=-1 +kerning first=206 second=283 amount=-1 +kerning first=366 second=231 amount=-1 +kerning first=101 second=283 amount=-1 +kerning first=72 second=338 amount=-1 +kerning first=333 second=8220 amount=-2 +kerning first=193 second=286 amount=-1 +kerning first=87 second=226 amount=-1 +kerning first=73 second=83 amount=-1 +kerning first=1039 second=1108 amount=-1 +kerning first=77 second=274 amount=-1 +kerning first=81 second=351 amount=-1 +kerning first=263 second=287 amount=-1 +kerning first=369 second=8220 amount=-1 +kerning first=366 second=351 amount=-1 +kerning first=330 second=351 amount=-1 +kerning first=264 second=226 amount=-1 +kerning first=73 second=290 amount=-1 +kerning first=1060 second=1065 amount=-1 +kerning first=1067 second=1047 amount=-1 +kerning first=88 second=286 amount=-1 +kerning first=364 second=192 amount=-1 +kerning first=1031 second=1047 amount=-1 +kerning first=203 second=278 amount=-1 +kerning first=219 second=44 amount=-2 +kerning first=99 second=244 amount=-1 +kerning first=205 second=70 amount=-1 +kerning first=298 second=230 amount=-1 +kerning first=362 second=274 amount=-1 +kerning first=1108 second=1103 amount=-1 +kerning first=220 second=192 amount=-1 +kerning first=8217 second=67 amount=-1 +kerning first=204 second=244 amount=-1 +kerning first=290 second=274 amount=-1 +kerning first=240 second=244 amount=-1 +kerning first=1055 second=1056 amount=-1 +kerning first=354 second=333 amount=-1 +kerning first=218 second=274 amount=-1 +kerning first=8250 second=203 amount=-1 +kerning first=85 second=74 amount=-1 +kerning first=1064 second=1069 amount=-1 +kerning first=80 second=171 amount=-1 +kerning first=116 second=171 amount=-1 +kerning first=264 second=100 amount=-1 +kerning first=1051 second=1099 amount=-1 +kerning first=73 second=327 amount=-1 +kerning first=298 second=74 amount=-1 +kerning first=221 second=171 amount=-2 +kerning first=280 second=201 amount=-1 +kerning first=257 second=171 amount=-1 +kerning first=370 second=74 amount=-1 +kerning first=74 second=269 amount=-1 +kerning first=110 second=269 amount=-1 +kerning first=117 second=231 amount=-1 +kerning first=267 second=8218 amount=-1 +kerning first=334 second=362 amount=-1 +kerning first=218 second=70 amount=-1 +kerning first=201 second=266 amount=-1 +kerning first=1047 second=1088 amount=-1 +kerning first=1078 second=1118 amount=-1 +kerning first=325 second=214 amount=-1 +kerning first=8218 second=253 amount=-1 +kerning first=251 second=269 amount=-1 +kerning first=370 second=362 amount=-1 +kerning first=209 second=69 amount=-1 +kerning first=287 second=269 amount=-1 +kerning first=350 second=310 amount=-1 +kerning first=1036 second=1090 amount=-1 +kerning first=278 second=310 amount=-1 +kerning first=257 second=318 amount=-1 +kerning first=213 second=66 amount=-1 +kerning first=221 second=45 amount=-2 +kerning first=205 second=370 amount=-1 +kerning first=257 second=45 amount=-1 +kerning first=192 second=355 amount=-1 +kerning first=116 second=45 amount=-1 +kerning first=86 second=260 amount=-1 +kerning first=313 second=370 amount=-1 +kerning first=365 second=45 amount=-1 +kerning first=217 second=214 amount=-1 +kerning first=1071 second=1097 amount=-1 +kerning first=1056 second=1062 amount=-1 +kerning first=66 second=382 amount=-1 +kerning first=262 second=362 amount=-1 +kerning first=87 second=199 amount=-1 +kerning first=261 second=275 amount=-1 +kerning first=221 second=252 amount=-1 +kerning first=225 second=275 amount=-1 +kerning first=205 second=223 amount=-1 +kerning first=1048 second=1028 amount=-1 +kerning first=8222 second=210 amount=-1 +kerning first=81 second=258 amount=-1 +kerning first=1062 second=1060 amount=-1 +kerning first=268 second=78 amount=-1 +kerning first=8222 second=84 amount=-1 +kerning first=205 second=97 amount=-1 +kerning first=354 second=267 amount=-1 +kerning first=104 second=234 amount=-1 +kerning first=203 second=251 amount=-1 +kerning first=209 second=234 amount=-1 +kerning first=45 second=79 amount=-1 +kerning first=8250 second=298 amount=-1 +kerning first=204 second=217 amount=-1 +kerning first=269 second=106 amount=-1 +kerning first=366 second=258 amount=-1 +kerning first=1039 second=1027 amount=-1 +kerning first=201 second=200 amount=-1 +kerning first=269 second=243 amount=-1 +kerning first=72 second=257 amount=-1 +kerning first=233 second=243 amount=-1 +kerning first=275 second=251 amount=-1 +kerning first=305 second=243 amount=-1 +kerning first=1068 second=1053 amount=-1 +kerning first=1031 second=1100 amount=-1 +kerning first=223 second=8221 amount=-2 +kerning first=116 second=225 amount=-1 +kerning first=203 second=206 amount=-1 +kerning first=80 second=72 amount=-1 +kerning first=110 second=242 amount=-1 +kerning first=259 second=8221 amount=-2 +kerning first=85 second=335 amount=-1 +kerning first=257 second=345 amount=-1 +kerning first=72 second=187 amount=-1 +kerning first=226 second=335 amount=-1 +kerning first=74 second=242 amount=-1 +kerning first=229 second=232 amount=-1 +kerning first=298 second=335 amount=-1 +kerning first=287 second=242 amount=-1 +kerning first=1039 second=1054 amount=-1 +kerning first=262 second=335 amount=-1 +kerning first=368 second=277 amount=-1 +kerning first=370 second=335 amount=-1 +kerning first=74 second=100 amount=-1 +kerning first=1052 second=1105 amount=-1 +kerning first=117 second=8249 amount=-1 +kerning first=251 second=242 amount=-1 +kerning first=281 second=234 amount=-1 +kerning first=330 second=330 amount=-1 +kerning first=217 second=241 amount=-1 +kerning first=286 second=344 amount=-1 +kerning first=1064 second=1096 amount=-1 +kerning first=113 second=8217 amount=-2 +kerning first=1028 second=1096 amount=-1 +kerning first=197 second=336 amount=-1 +kerning first=325 second=241 amount=-1 +kerning first=355 second=335 amount=-1 +kerning first=86 second=233 amount=-1 +kerning first=289 second=241 amount=-1 +kerning first=1051 second=1045 amount=-1 +kerning first=87 second=46 amount=-1 +kerning first=192 second=199 amount=-1 +kerning first=316 second=114 amount=-1 +kerning first=200 second=80 amount=-1 +kerning first=45 second=378 amount=-1 +kerning first=366 second=200 amount=-1 +kerning first=192 second=46 amount=-1 +kerning first=264 second=199 amount=-1 +kerning first=84 second=275 amount=-1 +kerning first=263 second=233 amount=-1 +kerning first=277 second=250 amount=-1 +kerning first=352 second=114 amount=-1 +kerning first=264 second=46 amount=-1 +kerning first=68 second=327 amount=-1 +kerning first=103 second=114 amount=-1 +kerning first=1058 second=1113 amount=-1 +kerning first=336 second=46 amount=-1 +kerning first=244 second=114 amount=-1 +kerning first=1060 second=1046 amount=-1 +kerning first=272 second=80 amount=-1 +kerning first=277 second=8222 amount=-1 +kerning first=214 second=344 amount=-1 +kerning first=206 second=310 amount=-1 +kerning first=209 second=327 amount=-1 +kerning first=220 second=327 amount=-1 +kerning first=364 second=336 amount=-1 +kerning first=1064 second=1062 amount=-1 +kerning first=217 second=361 amount=-1 +kerning first=67 second=114 amount=-1 +kerning first=1104 second=1080 amount=-1 +kerning first=209 second=81 amount=-1 +kerning first=217 second=115 amount=-1 +kerning first=82 second=8221 amount=-1 +kerning first=253 second=115 amount=-1 +kerning first=118 second=8221 amount=-2 +kerning first=289 second=115 amount=-1 +kerning first=72 second=284 amount=-1 +kerning first=325 second=115 amount=-1 +kerning first=197 second=216 amount=-1 +kerning first=8250 second=284 amount=-1 +kerning first=266 second=331 amount=-1 +kerning first=378 second=8221 amount=-1 +kerning first=223 second=44 amount=-1 +kerning first=1033 second=1098 amount=-1 +kerning first=364 second=78 amount=-1 +kerning first=89 second=8249 amount=-2 +kerning first=204 second=352 amount=-1 +kerning first=187 second=204 amount=-1 +kerning first=194 second=8249 amount=-1 +kerning first=89 second=331 amount=-1 +kerning first=370 second=227 amount=-1 +kerning first=103 second=116 amount=-1 +kerning first=220 second=78 amount=-1 +kerning first=266 second=8249 amount=-1 +kerning first=86 second=380 amount=-1 +kerning first=69 second=72 amount=-1 +kerning first=298 second=227 amount=-1 +kerning first=8217 second=260 amount=-2 +kerning first=266 second=346 amount=-1 +kerning first=282 second=72 amount=-1 +kerning first=346 second=218 amount=-1 +kerning first=310 second=218 amount=-1 +kerning first=199 second=267 amount=-1 +kerning first=204 second=290 amount=-1 +kerning first=274 second=218 amount=-1 +kerning first=1048 second=1055 amount=-1 +kerning first=118 second=44 amount=-1 +kerning first=202 second=218 amount=-1 +kerning first=1043 second=1119 amount=-1 +kerning first=1069 second=1061 amount=-1 +kerning first=74 second=79 amount=-1 +kerning first=1058 second=1086 amount=-1 +kerning first=192 second=361 amount=-1 +kerning first=365 second=291 amount=-1 +kerning first=296 second=230 amount=-1 +kerning first=87 second=361 amount=-1 +kerning first=80 second=279 amount=-1 +kerning first=116 second=279 amount=-1 +kerning first=8217 second=235 amount=-1 +kerning first=302 second=346 amount=-1 +kerning first=1030 second=1056 amount=-1 +kerning first=116 second=291 amount=-1 +kerning first=262 second=227 amount=-1 +kerning first=353 second=8218 amount=-1 +kerning first=1057 second=1080 amount=-1 +kerning first=288 second=368 amount=-1 +kerning first=101 second=187 amount=-1 +kerning first=281 second=8218 amount=-1 +kerning first=1082 second=1095 amount=-1 +kerning first=85 second=227 amount=-1 +kerning first=198 second=8221 amount=-1 +kerning first=75 second=368 amount=-1 +kerning first=1046 second=1095 amount=-1 +kerning first=234 second=8221 amount=-2 +kerning first=196 second=84 amount=-1 +kerning first=289 second=269 amount=-1 +kerning first=87 second=8221 amount=-1 +kerning first=198 second=81 amount=-1 +kerning first=270 second=8221 amount=-2 +kerning first=101 second=337 amount=-1 +kerning first=1034 second=1079 amount=-1 +kerning first=1118 second=1095 amount=-1 +kerning first=68 second=8218 amount=-1 +kerning first=112 second=187 amount=-1 +kerning first=105 second=99 amount=-1 +kerning first=109 second=8220 amount=-2 +kerning first=262 second=200 amount=-1 +kerning first=67 second=75 amount=-1 +kerning first=362 second=44 amount=-2 +kerning first=245 second=8218 amount=-1 +kerning first=204 second=325 amount=-1 +kerning first=289 second=187 amount=-1 +kerning first=197 second=255 amount=-1 +kerning first=209 second=8218 amount=-1 +kerning first=325 second=187 amount=-1 +kerning first=217 second=187 amount=-2 +kerning first=85 second=200 amount=-1 +kerning first=205 second=211 amount=-1 +kerning first=187 second=71 amount=-1 +kerning first=89 second=8222 amount=-2 +kerning first=257 second=279 amount=-1 +kerning first=82 second=71 amount=-1 +kerning first=217 second=202 amount=-1 +kerning first=8217 second=233 amount=-1 +kerning first=221 second=279 amount=-1 +kerning first=259 second=337 amount=-1 +kerning first=352 second=75 amount=-1 +kerning first=327 second=211 amount=-1 +kerning first=111 second=316 amount=-1 +kerning first=206 second=245 amount=-1 +kerning first=74 second=362 amount=-1 +kerning first=8218 second=361 amount=-1 +kerning first=8220 second=219 amount=-1 +kerning first=209 second=261 amount=-1 +kerning first=278 second=364 amount=-1 +kerning first=364 second=66 amount=-1 +kerning first=1070 second=1052 amount=-1 +kerning first=221 second=264 amount=-1 +kerning first=214 second=209 amount=-1 +kerning first=1034 second=1052 amount=-1 +kerning first=206 second=364 amount=-1 +kerning first=362 second=367 amount=-1 +kerning first=296 second=257 amount=-1 +kerning first=268 second=69 amount=-1 +kerning first=80 second=264 amount=-1 +kerning first=73 second=209 amount=-1 +kerning first=65 second=364 amount=-1 +kerning first=368 second=257 amount=-1 +kerning first=304 second=69 amount=-1 +kerning first=79 second=66 amount=-1 +kerning first=218 second=367 amount=-1 +kerning first=227 second=380 amount=-1 +kerning first=77 second=355 amount=-1 +kerning first=338 second=8249 amount=-1 +kerning first=264 second=334 amount=-1 +kerning first=374 second=8249 amount=-2 +kerning first=234 second=108 amount=-1 +kerning first=192 second=334 amount=-1 +kerning first=281 second=273 amount=-1 +kerning first=263 second=380 amount=-1 +kerning first=1064 second=1041 amount=-1 +kerning first=272 second=330 amount=-1 +kerning first=209 second=366 amount=-1 +kerning first=323 second=235 amount=-1 +kerning first=209 second=273 amount=-1 +kerning first=335 second=380 amount=-1 +kerning first=1053 second=1030 amount=-1 +kerning first=338 second=268 amount=-1 +kerning first=350 second=364 amount=-1 +kerning first=374 second=290 amount=-1 +kerning first=266 second=226 amount=-1 +kerning first=286 second=209 amount=-1 +kerning first=82 second=89 amount=-1 +kerning first=1034 second=1050 amount=-1 +kerning first=362 second=286 amount=-1 +kerning first=73 second=263 amount=-1 +kerning first=253 second=249 amount=-1 +kerning first=272 second=194 amount=-1 +kerning first=109 second=263 amount=-1 +kerning first=1027 second=1051 amount=-1 +kerning first=1070 second=1050 amount=-1 +kerning first=221 second=79 amount=-1 +kerning first=87 second=334 amount=-1 +kerning first=45 second=117 amount=-1 +kerning first=218 second=286 amount=-1 +kerning first=101 second=339 amount=-1 +kerning first=250 second=263 amount=-1 +kerning first=205 second=82 amount=-1 +kerning first=1041 second=1094 amount=-1 +kerning first=116 second=8221 amount=-1 +kerning first=1041 second=1039 amount=-1 +kerning first=368 second=203 amount=-1 +kerning first=325 second=229 amount=-1 +kerning first=87 second=332 amount=-1 +kerning first=8222 second=225 amount=-1 +kerning first=77 second=286 amount=-1 +kerning first=108 second=365 amount=-1 +kerning first=204 second=298 amount=-1 +kerning first=269 second=351 amount=-1 +kerning first=1067 second=1074 amount=-1 +kerning first=366 second=117 amount=-1 +kerning first=1064 second=1108 amount=-1 +kerning first=264 second=332 amount=-1 +kerning first=296 second=203 amount=-1 +kerning first=291 second=46 amount=-1 +kerning first=192 second=332 amount=-1 +kerning first=217 second=229 amount=-1 +kerning first=258 second=117 amount=-1 +kerning first=1055 second=1083 amount=-1 +kerning first=370 second=281 amount=-1 +kerning first=72 second=77 amount=-1 +kerning first=325 second=100 amount=-1 +kerning first=1091 second=1083 amount=-1 +kerning first=242 second=382 amount=-1 +kerning first=257 second=333 amount=-1 +kerning first=1070 second=1025 amount=-1 +kerning first=355 second=339 amount=-1 +kerning first=218 second=271 amount=-1 +kerning first=1036 second=1118 amount=-1 +kerning first=1034 second=1025 amount=-1 +kerning first=206 second=229 amount=-1 +kerning first=281 second=246 amount=-1 +kerning first=88 second=220 amount=-1 +kerning first=254 second=382 amount=-1 +kerning first=209 second=246 amount=-1 +kerning first=196 second=171 amount=-1 +kerning first=85 second=281 amount=-1 +kerning first=323 second=103 amount=-1 +kerning first=104 second=246 amount=-1 +kerning first=287 second=103 amount=-1 +kerning first=204 second=323 amount=-1 +kerning first=263 second=369 amount=-1 +kerning first=195 second=364 amount=-1 +kerning first=217 second=100 amount=-1 +kerning first=192 second=307 amount=-1 +kerning first=226 second=281 amount=-1 +kerning first=85 second=262 amount=-1 +kerning first=221 second=333 amount=-1 +kerning first=262 second=281 amount=-1 +kerning first=266 second=304 amount=-1 +kerning first=80 second=333 amount=-1 +kerning first=284 second=209 amount=-1 +kerning first=298 second=281 amount=-1 +kerning first=302 second=304 amount=-1 +kerning first=110 second=103 amount=-1 +kerning first=352 second=69 amount=-1 +kerning first=338 second=304 amount=-1 +kerning first=264 second=81 amount=-1 +kerning first=213 second=77 amount=-1 +kerning first=111 second=314 amount=-1 +kerning first=1108 second=1076 amount=-1 +kerning first=1053 second=1057 amount=-1 +kerning first=1043 second=1092 amount=-1 +kerning first=205 second=109 amount=-1 +kerning first=217 second=256 amount=-1 +kerning first=97 second=245 amount=-1 +kerning first=203 second=85 amount=-1 +kerning first=264 second=280 amount=-1 +kerning first=346 second=8217 amount=-1 +kerning first=272 second=221 amount=-1 +kerning first=1048 second=1067 amount=-1 +kerning first=364 second=120 amount=-1 +kerning first=382 second=8217 amount=-1 +kerning first=221 second=210 amount=-1 +kerning first=344 second=221 amount=-1 +kerning first=68 second=315 amount=-1 +kerning first=218 second=313 amount=-1 +kerning first=1067 second=1101 amount=-1 +kerning first=290 second=313 amount=-1 +kerning first=283 second=339 amount=-1 +kerning first=192 second=44 amount=-1 +kerning first=80 second=210 amount=-1 +kerning first=99 second=248 amount=-1 +kerning first=368 second=230 amount=-1 +kerning first=77 second=313 amount=-1 +kerning first=336 second=8250 amount=-1 +kerning first=99 second=271 amount=-1 +kerning first=106 second=339 amount=-1 +kerning first=269 second=324 amount=-1 +kerning first=70 second=339 amount=-1 +kerning first=204 second=271 amount=-1 +kerning first=1039 second=1042 amount=-1 +kerning first=228 second=8250 amount=-1 +kerning first=304 second=111 amount=-1 +kerning first=8218 second=334 amount=-1 +kerning first=192 second=8250 amount=-1 +kerning first=83 second=203 amount=-1 +kerning first=1052 second=1117 amount=-1 +kerning first=262 second=254 amount=-1 +kerning first=87 second=8250 amount=-1 +kerning first=270 second=195 amount=-1 +kerning first=110 second=101 amount=-1 +kerning first=214 second=258 amount=-1 +kerning first=209 second=219 amount=-1 +kerning first=74 second=101 amount=-1 +kerning first=89 second=273 amount=-1 +kerning first=111 second=289 amount=-1 +kerning first=68 second=219 amount=-1 +kerning first=252 second=289 amount=-1 +kerning first=209 second=350 amount=-1 +kerning first=1031 second=1101 amount=-1 +kerning first=287 second=101 amount=-1 +kerning first=324 second=289 amount=-1 +kerning first=202 second=8217 amount=-1 +kerning first=1033 second=1065 amount=-1 +kerning first=251 second=101 amount=-1 +kerning first=339 second=111 amount=-1 +kerning first=274 second=8217 amount=-1 +kerning first=224 second=380 amount=-1 +kerning first=74 second=76 amount=-1 +kerning first=374 second=331 amount=-1 +kerning first=204 second=296 amount=-1 +kerning first=232 second=111 amount=-1 +kerning first=97 second=8217 amount=-2 +kerning first=268 second=111 amount=-1 +kerning first=121 second=254 amount=-1 +kerning first=269 second=228 amount=-1 +kerning first=268 second=225 amount=-1 +kerning first=70 second=187 amount=-2 +kerning first=106 second=99 amount=-1 +kerning first=77 second=232 amount=-1 +kerning first=8218 second=332 amount=-1 +kerning first=286 second=85 amount=-1 +kerning first=214 second=85 amount=-1 +kerning first=73 second=332 amount=-1 +kerning first=252 second=287 amount=-1 +kerning first=289 second=46 amount=-1 +kerning first=74 second=271 amount=-1 +kerning first=253 second=46 amount=-1 +kerning first=214 second=330 amount=-1 +kerning first=73 second=85 amount=-1 +kerning first=250 second=8220 amount=-1 +kerning first=111 second=287 amount=-1 +kerning first=325 second=46 amount=-1 +kerning first=109 second=277 amount=-1 +kerning first=286 second=302 amount=-1 +kerning first=206 second=241 amount=-1 +kerning first=286 second=8220 amount=-1 +kerning first=370 second=368 amount=-1 +kerning first=324 second=287 amount=-1 +kerning first=214 second=302 amount=-1 +kerning first=323 second=271 amount=-1 +kerning first=1039 second=1096 amount=-1 +kerning first=74 second=243 amount=-1 +kerning first=233 second=378 amount=-1 +kerning first=8250 second=223 amount=-1 +kerning first=230 second=250 amount=-1 +kerning first=227 second=289 amount=-1 +kerning first=194 second=250 amount=-1 +kerning first=231 second=229 amount=-1 +kerning first=112 second=46 amount=-1 +kerning first=202 second=284 amount=-1 +kerning first=274 second=75 amount=-1 +kerning first=263 second=289 amount=-1 +kerning first=87 second=273 amount=-1 +kerning first=8222 second=252 amount=-1 +kerning first=374 second=250 amount=-1 +kerning first=45 second=336 amount=-1 +kerning first=217 second=46 amount=-2 +kerning first=274 second=284 amount=-1 +kerning first=334 second=76 amount=-1 +kerning first=335 second=289 amount=-1 +kerning first=267 second=229 amount=-1 +kerning first=269 second=378 amount=-1 +kerning first=370 second=76 amount=-1 +kerning first=207 second=220 amount=-1 +kerning first=262 second=76 amount=-1 +kerning first=67 second=216 amount=-1 +kerning first=171 second=220 amount=-1 +kerning first=74 second=74 amount=-1 +kerning first=8250 second=218 amount=-1 +kerning first=362 second=259 amount=-1 +kerning first=264 second=278 amount=-1 +kerning first=1027 second=1105 amount=-1 +kerning first=201 second=45 amount=-1 +kerning first=280 second=216 amount=-1 +kerning first=339 second=246 amount=-1 +kerning first=85 second=76 amount=-1 +kerning first=1050 second=1118 amount=-1 +kerning first=203 second=280 amount=-1 +kerning first=267 second=246 amount=-1 +kerning first=321 second=89 amount=-1 +kerning first=231 second=246 amount=-1 +kerning first=66 second=220 amount=-1 +kerning first=323 second=74 amount=-1 +kerning first=204 second=269 amount=-1 +kerning first=262 second=245 amount=-1 +kerning first=345 second=229 amount=-1 +kerning first=240 second=269 amount=-1 +kerning first=77 second=259 amount=-1 +kerning first=70 second=204 amount=-1 +kerning first=99 second=269 amount=-1 +kerning first=1042 second=1084 amount=-1 +kerning first=219 second=201 amount=-1 +kerning first=86 second=65 amount=-1 +kerning first=218 second=259 amount=-1 +kerning first=211 second=204 amount=-1 +kerning first=272 second=366 amount=-1 +kerning first=278 second=268 amount=-1 +kerning first=220 second=207 amount=-1 +kerning first=78 second=8220 amount=-1 +kerning first=200 second=366 amount=-1 +kerning first=206 second=268 amount=-1 +kerning first=1039 second=1069 amount=-1 +kerning first=280 second=67 amount=-1 +kerning first=274 second=67 amount=-1 +kerning first=218 second=110 amount=-1 +kerning first=8217 second=289 amount=-1 +kerning first=364 second=207 amount=-1 +kerning first=310 second=67 amount=-1 +kerning first=74 second=244 amount=-1 +kerning first=207 second=210 amount=-1 +kerning first=1067 second=1062 amount=-1 +kerning first=110 second=244 amount=-1 +kerning first=75 second=303 amount=-1 +kerning first=356 second=113 amount=-1 +kerning first=304 second=224 amount=-1 +kerning first=374 second=277 amount=-1 +kerning first=217 second=73 amount=-1 +kerning first=1054 second=1068 amount=-1 +kerning first=73 second=302 amount=-1 +kerning first=325 second=73 amount=-1 +kerning first=86 second=262 amount=-1 +kerning first=233 second=351 amount=-1 +kerning first=65 second=268 amount=-1 +kerning first=287 second=108 amount=-1 +kerning first=1038 second=1117 amount=-1 +kerning first=89 second=277 amount=-1 +kerning first=230 second=353 amount=-1 +kerning first=192 second=251 amount=-1 +kerning first=199 second=213 amount=-1 +kerning first=87 second=251 amount=-1 +kerning first=302 second=277 amount=-1 +kerning first=266 second=277 amount=-1 +kerning first=230 second=277 amount=-1 +kerning first=205 second=273 amount=-1 +kerning first=368 second=218 amount=-1 +kerning first=187 second=370 amount=-1 +kerning first=71 second=8221 amount=-1 +kerning first=355 second=231 amount=-1 +kerning first=327 second=75 amount=-1 +kerning first=108 second=380 amount=-1 +kerning first=280 second=270 amount=-1 +kerning first=296 second=218 amount=-1 +kerning first=374 second=196 amount=-1 +kerning first=245 second=8222 amount=-1 +kerning first=212 second=8221 amount=-2 +kerning first=262 second=8249 amount=-1 +kerning first=248 second=8221 amount=-2 +kerning first=219 second=75 amount=-1 +kerning first=78 second=216 amount=-1 +kerning first=109 second=248 amount=-1 +kerning first=67 second=336 amount=-1 +kerning first=1031 second=1089 amount=-1 +kerning first=65 second=187 amount=-1 +kerning first=250 second=248 amount=-1 +kerning first=1057 second=1119 amount=-1 +kerning first=283 second=231 amount=-1 +kerning first=83 second=218 amount=-1 +kerning first=99 second=242 amount=-1 +kerning first=356 second=8221 amount=-1 +kerning first=78 second=75 amount=-1 +kerning first=279 second=355 amount=-1 +kerning first=352 second=270 amount=-1 +kerning first=192 second=264 amount=-1 +kerning first=200 second=209 amount=-1 +kerning first=218 second=79 amount=-1 +kerning first=73 second=248 amount=-1 +kerning first=304 second=279 amount=-1 +kerning first=280 second=336 amount=-1 +kerning first=204 second=234 amount=-1 +kerning first=258 second=84 amount=-1 +kerning first=67 second=270 amount=-1 +kerning first=279 second=367 amount=-1 +kerning first=339 second=283 amount=-1 +kerning first=77 second=79 amount=-1 +kerning first=231 second=283 amount=-1 +kerning first=109 second=333 amount=-1 +kerning first=89 second=369 amount=-1 +kerning first=1043 second=1080 amount=-1 +kerning first=362 second=205 amount=-1 +kerning first=251 second=244 amount=-1 +kerning first=79 second=327 amount=-1 +kerning first=338 second=8222 amount=-1 +kerning first=8218 second=369 amount=-1 +kerning first=290 second=205 amount=-1 +kerning first=323 second=244 amount=-1 +kerning first=266 second=8222 amount=-1 +kerning first=362 second=79 amount=-1 +kerning first=207 second=274 amount=-1 +kerning first=230 second=8222 amount=-1 +kerning first=66 second=367 amount=-1 +kerning first=66 second=274 amount=-1 +kerning first=1031 second=1028 amount=-1 +kerning first=252 second=233 amount=-1 +kerning first=338 second=70 amount=-1 +kerning first=364 second=327 amount=-1 +kerning first=70 second=231 amount=-1 +kerning first=86 second=235 amount=-1 +kerning first=106 second=231 amount=-1 +kerning first=1066 second=1062 amount=-1 +kerning first=1055 second=1071 amount=-1 +kerning first=356 second=227 amount=-1 +kerning first=218 second=205 amount=-1 +kerning first=227 second=235 amount=-1 +kerning first=258 second=108 amount=-1 +kerning first=77 second=205 amount=-1 +kerning first=263 second=235 amount=-1 +kerning first=266 second=70 amount=-1 +kerning first=87 second=224 amount=-1 +kerning first=302 second=70 amount=-1 +kerning first=8217 second=65 amount=-2 +kerning first=206 second=214 amount=-1 +kerning first=201 second=71 amount=-1 +kerning first=72 second=353 amount=-1 +kerning first=85 second=266 amount=-1 +kerning first=118 second=249 amount=-1 +kerning first=264 second=224 amount=-1 +kerning first=187 second=249 amount=-1 +kerning first=330 second=70 amount=-1 +kerning first=1038 second=1090 amount=-1 +kerning first=103 second=243 amount=-1 +kerning first=1058 second=1088 amount=-1 +kerning first=1059 second=1104 amount=-1 +kerning first=280 second=363 amount=-1 +kerning first=213 second=353 amount=-1 +kerning first=316 second=363 amount=-1 +kerning first=278 second=214 amount=-1 +kerning first=75 second=370 amount=-1 +kerning first=374 second=223 amount=-1 +kerning first=69 second=45 amount=-1 +kerning first=288 second=370 amount=-1 +kerning first=338 second=223 amount=-1 +kerning first=105 second=45 amount=-1 +kerning first=80 second=232 amount=-1 +kerning first=302 second=223 amount=-1 +kerning first=232 second=252 amount=-1 +kerning first=250 second=275 amount=-1 +kerning first=266 second=223 amount=-1 +kerning first=196 second=252 amount=-1 +kerning first=325 second=8218 amount=-1 +kerning first=240 second=275 amount=-1 +kerning first=65 second=214 amount=-1 +kerning first=1043 second=1107 amount=-1 +kerning first=79 second=354 amount=-1 +kerning first=203 second=199 amount=-1 +kerning first=282 second=45 amount=-1 +kerning first=254 second=106 amount=-1 +kerning first=109 second=275 amount=-1 +kerning first=1050 second=1081 amount=-1 +kerning first=73 second=275 amount=-1 +kerning first=375 second=8221 amount=-2 +kerning first=8217 second=262 amount=-1 +kerning first=1046 second=1097 amount=-1 +kerning first=74 second=217 amount=-1 +kerning first=266 second=97 amount=-1 +kerning first=220 second=234 amount=-1 +kerning first=302 second=97 amount=-1 +kerning first=370 second=288 amount=-1 +kerning first=235 second=267 amount=-1 +kerning first=271 second=267 amount=-1 +kerning first=307 second=267 amount=-1 +kerning first=272 second=209 amount=-1 +kerning first=89 second=97 amount=-1 +kerning first=73 second=8220 amount=-1 +kerning first=364 second=234 amount=-1 +kerning first=89 second=223 amount=-1 +kerning first=8218 second=251 amount=-1 +kerning first=328 second=234 amount=-1 +kerning first=211 second=258 amount=-1 +kerning first=1091 second=1098 amount=-1 +kerning first=288 second=201 amount=-1 +kerning first=288 second=206 amount=-1 +kerning first=1071 second=1095 amount=-1 +kerning first=298 second=266 amount=-1 +kerning first=218 second=232 amount=-1 +kerning first=284 second=200 amount=-1 +kerning first=350 second=345 amount=-1 +kerning first=1062 second=1072 amount=-1 +kerning first=370 second=266 amount=-1 +kerning first=205 second=368 amount=-1 +kerning first=196 second=345 amount=-1 +kerning first=291 second=250 amount=-1 +kerning first=324 second=113 amount=-1 +kerning first=232 second=345 amount=-1 +kerning first=8222 second=279 amount=-1 +kerning first=374 second=97 amount=-1 +kerning first=362 second=232 amount=-1 +kerning first=268 second=345 amount=-1 +kerning first=262 second=266 amount=-1 +kerning first=326 second=232 amount=-1 +kerning first=364 second=79 amount=-1 +kerning first=71 second=200 amount=-1 +kerning first=89 second=109 amount=-1 +kerning first=1059 second=1077 amount=-1 +kerning first=220 second=8218 amount=-2 +kerning first=339 second=120 amount=-1 +kerning first=375 second=120 amount=-1 +kerning first=115 second=8218 amount=-1 +kerning first=87 second=197 amount=-1 +kerning first=79 second=8218 amount=-1 +kerning first=266 second=109 amount=-1 +kerning first=364 second=8218 amount=-2 +kerning first=249 second=245 amount=-1 +kerning first=105 second=111 amount=-1 +kerning first=302 second=109 amount=-1 +kerning first=272 second=258 amount=-1 +kerning first=220 second=315 amount=-1 +kerning first=313 second=368 amount=-1 +kerning first=73 second=199 amount=-1 +kerning first=187 second=367 amount=-1 +kerning first=108 second=245 amount=-1 +kerning first=66 second=313 amount=-1 +kerning first=267 second=105 amount=-1 +kerning first=207 second=313 amount=-1 +kerning first=231 second=105 amount=-1 +kerning first=195 second=105 amount=-1 +kerning first=296 second=267 amount=-1 +kerning first=262 second=217 amount=-1 +kerning first=368 second=267 amount=-1 +kerning first=298 second=217 amount=-1 +kerning first=1071 second=1068 amount=-1 +kerning first=334 second=217 amount=-1 +kerning first=291 second=114 amount=-1 +kerning first=1057 second=1097 amount=-1 +kerning first=370 second=217 amount=-1 +kerning first=326 second=279 amount=-1 +kerning first=219 second=102 amount=-1 +kerning first=1030 second=1037 amount=-1 +kerning first=224 second=267 amount=-1 +kerning first=327 second=114 amount=-1 +kerning first=8220 second=196 amount=-2 +kerning first=72 second=245 amount=-1 +kerning first=78 second=114 amount=-1 +kerning first=317 second=8221 amount=-1 +kerning first=364 second=315 amount=-1 +kerning first=219 second=114 amount=-1 +kerning first=291 second=8249 amount=-1 +kerning first=8222 second=318 amount=-1 +kerning first=201 second=212 amount=-1 +kerning first=70 second=103 amount=-1 +kerning first=279 second=111 amount=-1 +kerning first=274 second=8222 amount=-1 +kerning first=327 second=8249 amount=-1 +kerning first=363 second=8249 amount=-1 +kerning first=101 second=115 amount=-1 +kerning first=1044 second=1098 amount=-1 +kerning first=327 second=331 amount=-1 +kerning first=206 second=115 amount=-1 +kerning first=220 second=273 amount=-1 +kerning first=107 second=44 amount=-1 +kerning first=368 second=261 amount=-1 +kerning first=196 second=318 amount=-1 +kerning first=213 second=218 amount=-1 +kerning first=201 second=77 amount=-1 +kerning first=323 second=352 amount=-1 +kerning first=1033 second=1061 amount=-1 +kerning first=97 second=380 amount=-1 +kerning first=8250 second=89 amount=-2 +kerning first=207 second=355 amount=-1 +kerning first=268 second=318 amount=-1 +kerning first=219 second=331 amount=-1 +kerning first=80 second=288 amount=-1 +kerning first=8220 second=85 amount=-1 +kerning first=1104 second=1119 amount=-1 +kerning first=261 second=248 amount=-1 +kerning first=66 second=355 amount=-1 +kerning first=369 second=248 amount=-1 +kerning first=212 second=44 amount=-1 +kerning first=8222 second=333 amount=-1 +kerning first=362 second=193 amount=-1 +kerning first=248 second=44 amount=-1 +kerning first=354 second=275 amount=-1 +kerning first=1047 second=1059 amount=-2 +kerning first=78 second=346 amount=-1 +kerning first=84 second=248 amount=-1 +kerning first=352 second=282 amount=-1 +kerning first=225 second=248 amount=-1 +kerning first=8216 second=217 amount=-1 +kerning first=280 second=282 amount=-1 +kerning first=199 second=72 amount=-1 +kerning first=325 second=332 amount=-1 +kerning first=291 second=8222 amount=-1 +kerning first=72 second=230 amount=-1 +kerning first=219 second=8222 amount=-2 +kerning first=327 second=346 amount=-1 +kerning first=203 second=361 amount=-1 +kerning first=203 second=117 amount=-1 +kerning first=217 second=332 amount=-1 +kerning first=1071 second=1041 amount=-1 +kerning first=204 second=229 amount=-1 +kerning first=114 second=8222 amount=-1 +kerning first=232 second=279 amount=-1 +kerning first=78 second=8222 amount=-1 +kerning first=268 second=279 amount=-1 +kerning first=219 second=346 amount=-1 +kerning first=8250 second=77 amount=-1 +kerning first=74 second=352 amount=-1 +kerning first=298 second=267 amount=-1 +kerning first=267 second=337 amount=-1 +kerning first=350 second=187 amount=-1 +kerning first=232 second=291 amount=-1 +kerning first=231 second=337 amount=-1 +kerning first=356 second=44 amount=-1 +kerning first=278 second=187 amount=-1 +kerning first=99 second=187 amount=-1 +kerning first=103 second=355 amount=-1 +kerning first=187 second=81 amount=-1 +kerning first=302 second=103 amount=-1 +kerning first=209 second=109 amount=-1 +kerning first=315 second=84 amount=-1 +kerning first=75 second=119 amount=-1 +kerning first=82 second=81 amount=-1 +kerning first=327 second=8222 amount=-1 +kerning first=364 second=288 amount=-1 +kerning first=194 second=211 amount=-1 +kerning first=71 second=204 amount=-1 +kerning first=202 second=338 amount=-1 +kerning first=266 second=211 amount=-1 +kerning first=264 second=362 amount=-1 +kerning first=324 second=119 amount=-1 +kerning first=323 second=325 amount=-1 +kerning first=199 second=99 amount=-1 +kerning first=1033 second=1034 amount=-1 +kerning first=89 second=211 amount=-1 +kerning first=220 second=369 amount=-1 +kerning first=334 second=347 amount=-1 +kerning first=207 second=382 amount=-1 +kerning first=262 second=269 amount=-1 +kerning first=370 second=347 amount=-1 +kerning first=243 second=382 amount=-1 +kerning first=325 second=8250 amount=-1 +kerning first=262 second=347 amount=-1 +kerning first=279 second=382 amount=-1 +kerning first=289 second=8250 amount=-1 +kerning first=298 second=347 amount=-1 +kerning first=271 second=99 amount=-1 +kerning first=253 second=8250 amount=-1 +kerning first=212 second=86 amount=-1 +kerning first=66 second=198 amount=-1 +kerning first=101 second=248 amount=-1 +kerning first=87 second=110 amount=-1 +kerning first=72 second=224 amount=-1 +kerning first=314 second=365 amount=-1 +kerning first=85 second=347 amount=-1 +kerning first=374 second=211 amount=-1 +kerning first=195 second=268 amount=-1 +kerning first=227 second=316 amount=-1 +kerning first=1049 second=1100 amount=-1 +kerning first=1062 second=1087 amount=-1 +kerning first=264 second=110 amount=-1 +kerning first=278 second=202 amount=-1 +kerning first=283 second=117 amount=-1 +kerning first=103 second=351 amount=-1 +kerning first=304 second=264 amount=-1 +kerning first=72 second=8217 amount=-1 +kerning first=219 second=277 amount=-1 +kerning first=67 second=351 amount=-1 +kerning first=350 second=202 amount=-1 +kerning first=108 second=8217 amount=-1 +kerning first=206 second=73 amount=-1 +kerning first=350 second=369 amount=-1 +kerning first=289 second=305 amount=-1 +kerning first=196 second=264 amount=-1 +kerning first=278 second=73 amount=-1 +kerning first=1031 second=1065 amount=-1 +kerning first=363 second=277 amount=-1 +kerning first=203 second=334 amount=-1 +kerning first=206 second=202 amount=-1 +kerning first=1042 second=1030 amount=-1 +kerning first=240 second=8250 amount=-1 +kerning first=321 second=8217 amount=-1 +kerning first=207 second=69 amount=-1 +kerning first=223 second=108 amount=-1 +kerning first=362 second=280 amount=-1 +kerning first=99 second=101 amount=-1 +kerning first=368 second=232 amount=-1 +kerning first=240 second=101 amount=-1 +kerning first=118 second=108 amount=-1 +kerning first=218 second=193 amount=-1 +kerning first=204 second=101 amount=-1 +kerning first=66 second=69 amount=-1 +kerning first=364 second=273 amount=-1 +kerning first=1068 second=1065 amount=-1 +kerning first=8217 second=370 amount=-1 +kerning first=338 second=82 amount=-1 +kerning first=310 second=338 amount=-1 +kerning first=75 second=364 amount=-1 +kerning first=302 second=82 amount=-1 +kerning first=213 second=8217 amount=-2 +kerning first=78 second=277 amount=-1 +kerning first=259 second=108 amount=-1 +kerning first=74 second=325 amount=-1 +kerning first=274 second=338 amount=-1 +kerning first=269 second=254 amount=-1 +kerning first=346 second=365 amount=-1 +kerning first=1056 second=1074 amount=-1 +kerning first=1038 second=1051 amount=-1 +kerning first=121 second=103 amount=-1 +kerning first=272 second=68 amount=-1 +kerning first=225 second=263 amount=-1 +kerning first=85 second=103 amount=-1 +kerning first=274 second=365 amount=-1 +kerning first=74 second=298 amount=-1 +kerning first=66 second=171 amount=-1 +kerning first=1039 second=1097 amount=-1 +kerning first=261 second=263 amount=-1 +kerning first=1075 second=1114 amount=-1 +kerning first=310 second=365 amount=-1 +kerning first=102 second=171 amount=-1 +kerning first=202 second=365 amount=-1 +kerning first=1030 second=1039 amount=-1 +kerning first=66 second=286 amount=-1 +kerning first=114 second=8249 amount=-1 +kerning first=200 second=68 amount=-1 +kerning first=323 second=298 amount=-1 +kerning first=374 second=194 amount=-1 +kerning first=213 second=203 amount=-1 +kerning first=100 second=287 amount=-1 +kerning first=8222 second=211 amount=-1 +kerning first=277 second=287 amount=-1 +kerning first=334 second=374 amount=-1 +kerning first=72 second=203 amount=-1 +kerning first=241 second=287 amount=-1 +kerning first=218 second=199 amount=-1 +kerning first=66 second=270 amount=-1 +kerning first=84 second=263 amount=-1 +kerning first=70 second=117 amount=-1 +kerning first=206 second=100 amount=-1 +kerning first=1054 second=1048 amount=-1 +kerning first=8250 second=202 amount=-1 +kerning first=77 second=220 amount=-1 +kerning first=264 second=83 amount=-1 +kerning first=103 second=324 amount=-1 +kerning first=83 second=77 amount=-1 +kerning first=212 second=330 amount=-1 +kerning first=219 second=304 amount=-1 +kerning first=364 second=246 amount=-1 +kerning first=214 second=356 amount=-1 +kerning first=328 second=246 amount=-1 +kerning first=290 second=220 amount=-1 +kerning first=284 second=330 amount=-1 +kerning first=103 second=339 amount=-1 +kerning first=370 second=103 amount=-1 +kerning first=327 second=304 amount=-1 +kerning first=268 second=218 amount=-1 +kerning first=362 second=220 amount=-1 +kerning first=8250 second=375 amount=-1 +kerning first=368 second=77 amount=-1 +kerning first=298 second=103 amount=-1 +kerning first=69 second=70 amount=-1 +kerning first=78 second=304 amount=-1 +kerning first=1049 second=1031 amount=-1 +kerning first=374 second=197 amount=-1 +kerning first=262 second=103 amount=-1 +kerning first=232 second=333 amount=-1 +kerning first=325 second=278 amount=-1 +kerning first=296 second=77 amount=-1 +kerning first=101 second=100 amount=-1 +kerning first=226 second=103 amount=-1 +kerning first=204 second=74 amount=-1 +kerning first=268 second=333 amount=-1 +kerning first=218 second=220 amount=-1 +kerning first=221 second=382 amount=-1 +kerning first=314 second=246 amount=-1 +kerning first=8217 second=97 amount=-1 +kerning first=85 second=298 amount=-1 +kerning first=211 second=356 amount=-1 +kerning first=339 second=232 amount=-1 +kerning first=1070 second=1030 amount=-1 +kerning first=206 second=246 amount=-1 +kerning first=298 second=298 amount=-1 +kerning first=262 second=298 amount=-1 +kerning first=201 second=330 amount=-1 +kerning first=196 second=220 amount=-1 +kerning first=1039 second=1091 amount=-1 +kerning first=229 second=269 amount=-1 +kerning first=370 second=298 amount=-1 +kerning first=304 second=220 amount=-1 +kerning first=334 second=298 amount=-1 +kerning first=268 second=220 amount=-1 +kerning first=224 second=333 amount=-1 +kerning first=271 second=339 amount=-1 +kerning first=203 second=68 amount=-1 +kerning first=1044 second=1074 amount=-1 +kerning first=1059 second=1040 amount=-1 +kerning first=280 second=211 amount=-1 +kerning first=368 second=333 amount=-1 +kerning first=80 second=382 amount=-1 +kerning first=335 second=8222 amount=-1 +kerning first=45 second=194 amount=-1 +kerning first=235 second=365 amount=-1 +kerning first=296 second=333 amount=-1 +kerning first=81 second=194 amount=-1 +kerning first=263 second=8222 amount=-1 +kerning first=67 second=211 amount=-1 +kerning first=212 second=315 amount=-1 +kerning first=323 second=313 amount=-1 +kerning first=99 second=281 amount=-1 +kerning first=83 second=361 amount=-1 +kerning first=204 second=281 amount=-1 +kerning first=79 second=202 amount=-1 +kerning first=1052 second=1047 amount=-1 +kerning first=261 second=339 amount=-1 +kerning first=240 second=281 amount=-1 +kerning first=8250 second=213 amount=-1 +kerning first=1053 second=1074 amount=-1 +kerning first=284 second=315 amount=-1 +kerning first=89 second=353 amount=-1 +kerning first=268 second=102 amount=-1 +kerning first=1030 second=1051 amount=-1 +kerning first=362 second=264 amount=-1 +kerning first=199 second=111 amount=-1 +kerning first=84 second=339 amount=-1 +kerning first=364 second=202 amount=-1 +kerning first=1041 second=1083 amount=-1 +kerning first=118 second=347 amount=-1 +kerning first=1031 second=1057 amount=-1 +kerning first=118 second=120 amount=-1 +kerning first=68 second=364 amount=-1 +kerning first=187 second=120 amount=-1 +kerning first=218 second=264 amount=-1 +kerning first=314 second=277 amount=-1 +kerning first=223 second=120 amount=-1 +kerning first=220 second=202 amount=-1 +kerning first=1056 second=1025 amount=-1 +kerning first=369 second=339 amount=-1 +kerning first=71 second=315 amount=-1 +kerning first=217 second=251 amount=-1 +kerning first=77 second=264 amount=-1 +kerning first=198 second=212 amount=-1 +kerning first=8218 second=290 amount=-1 +kerning first=65 second=219 amount=-1 +kerning first=70 second=102 amount=-1 +kerning first=288 second=8217 amount=-1 +kerning first=253 second=251 amount=-1 +kerning first=324 second=8217 amount=-2 +kerning first=289 second=251 amount=-1 +kerning first=353 second=8222 amount=-1 +kerning first=85 second=271 amount=-1 +kerning first=75 second=8217 amount=-1 +kerning first=370 second=269 amount=-1 +kerning first=111 second=8217 amount=-2 +kerning first=1043 second=1094 amount=-1 +kerning first=201 second=8221 amount=-1 +kerning first=324 second=245 amount=-1 +kerning first=262 second=271 amount=-1 +kerning first=235 second=111 amount=-1 +kerning first=271 second=111 amount=-1 +kerning first=252 second=245 amount=-1 +kerning first=307 second=111 amount=-1 +kerning first=298 second=271 amount=-1 +kerning first=345 second=8221 amount=-1 +kerning first=207 second=353 amount=-1 +kerning first=381 second=8221 amount=-1 +kerning first=1036 second=1101 amount=-1 +kerning first=1065 second=1092 amount=-1 +kerning first=209 second=334 amount=-1 +kerning first=258 second=221 amount=-1 +kerning first=1053 second=1101 amount=-1 +kerning first=220 second=229 amount=-1 +kerning first=86 second=331 amount=-1 +kerning first=1030 second=1024 amount=-1 +kerning first=1043 second=1075 amount=-1 +kerning first=72 second=67 amount=-1 +kerning first=219 second=267 amount=-1 +kerning first=205 second=233 amount=-1 +kerning first=210 second=203 amount=-1 +kerning first=99 second=254 amount=-1 +kerning first=1056 second=1044 amount=-1 +kerning first=229 second=277 amount=-1 +kerning first=100 second=233 amount=-1 +kerning first=282 second=203 amount=-1 +kerning first=323 second=8221 amount=-1 +kerning first=73 second=280 amount=-1 +kerning first=201 second=357 amount=-1 +kerning first=241 second=233 amount=-1 +kerning first=268 second=274 amount=-1 +kerning first=214 second=280 amount=-1 +kerning first=234 second=117 amount=-1 +kerning first=69 second=203 amount=-1 +kerning first=277 second=233 amount=-1 +kerning first=187 second=374 amount=-2 +kerning first=1066 second=1024 amount=-1 +kerning first=286 second=280 amount=-1 +kerning first=228 second=263 amount=-1 +kerning first=264 second=263 amount=-1 +kerning first=201 second=76 amount=-1 +kerning first=82 second=374 amount=-1 +kerning first=1031 second=1084 amount=-1 +kerning first=219 second=363 amount=-1 +kerning first=187 second=207 amount=-1 +kerning first=198 second=288 amount=-1 +kerning first=255 second=363 amount=-1 +kerning first=302 second=201 amount=-1 +kerning first=291 second=363 amount=-1 +kerning first=368 second=213 amount=-1 +kerning first=338 second=201 amount=-1 +kerning first=275 second=122 amount=-1 +kerning first=327 second=70 amount=-1 +kerning first=235 second=311 amount=-1 +kerning first=374 second=245 amount=-1 +kerning first=264 second=317 amount=-1 +kerning first=266 second=201 amount=-1 +kerning first=325 second=224 amount=-1 +kerning first=1048 second=1104 amount=-1 +kerning first=217 second=224 amount=-1 +kerning first=219 second=103 amount=-1 +kerning first=86 second=250 amount=-1 +kerning first=98 second=122 amount=-1 +kerning first=255 second=316 amount=-1 +kerning first=110 second=113 amount=-1 +kerning first=272 second=204 amount=-1 +kerning first=209 second=382 amount=-1 +kerning first=1091 second=1093 amount=-1 +kerning first=85 second=244 amount=-1 +kerning first=79 second=256 amount=-1 +kerning first=200 second=204 amount=-1 +kerning first=74 second=259 amount=-1 +kerning first=195 second=354 amount=-1 +kerning first=323 second=259 amount=-1 +kerning first=226 second=244 amount=-1 +kerning first=70 second=79 amount=-1 +kerning first=262 second=244 amount=-1 +kerning first=282 second=116 amount=-1 +kerning first=362 second=210 amount=-1 +kerning first=298 second=244 amount=-1 +kerning first=1042 second=1096 amount=-1 +kerning first=364 second=256 amount=-1 +kerning first=218 second=210 amount=-1 +kerning first=1078 second=1096 amount=-1 +kerning first=77 second=210 amount=-1 +kerning first=99 second=363 amount=-1 +kerning first=327 second=283 amount=-1 +kerning first=1096 second=1095 amount=-1 +kerning first=202 second=262 amount=-1 +kerning first=220 second=256 amount=-1 +kerning first=66 second=345 amount=-1 +kerning first=274 second=262 amount=-1 +kerning first=217 second=355 amount=-1 +kerning first=1033 second=1049 amount=-1 +kerning first=234 second=98 amount=-1 +kerning first=264 second=298 amount=-1 +kerning first=1043 second=1102 amount=-1 +kerning first=211 second=302 amount=-1 +kerning first=286 second=73 amount=-1 +kerning first=277 second=248 amount=-1 +kerning first=204 second=335 amount=-1 +kerning first=207 second=345 amount=-1 +kerning first=243 second=345 amount=-1 +kerning first=258 second=107 amount=-1 +kerning first=279 second=345 amount=-1 +kerning first=350 second=219 amount=-1 +kerning first=240 second=335 amount=-1 +kerning first=296 second=213 amount=-1 +kerning first=70 second=302 amount=-1 +kerning first=203 second=268 amount=-1 +kerning first=278 second=219 amount=-1 +kerning first=205 second=206 amount=-1 +kerning first=1068 second=1070 amount=-1 +kerning first=206 second=219 amount=-1 +kerning first=263 second=277 amount=-1 +kerning first=266 second=368 amount=-1 +kerning first=352 second=8221 amount=-1 +kerning first=227 second=277 amount=-1 +kerning first=8249 second=374 amount=-1 +kerning first=302 second=368 amount=-1 +kerning first=338 second=368 amount=-1 +kerning first=73 second=226 amount=-1 +kerning first=86 second=81 amount=-1 +kerning first=87 second=290 amount=-1 +kerning first=85 second=217 amount=-1 +kerning first=73 second=73 amount=-1 +kerning first=1053 second=1047 amount=-1 +kerning first=192 second=290 amount=-1 +kerning first=214 second=73 amount=-1 +kerning first=194 second=368 amount=-1 +kerning first=328 second=283 amount=-1 +kerning first=122 second=8249 amount=-1 +kerning first=217 second=197 amount=-1 +kerning first=1056 second=1092 amount=-1 +kerning first=364 second=283 amount=-1 +kerning first=199 second=338 amount=-1 +kerning first=1054 second=1084 amount=-1 +kerning first=202 second=82 amount=-1 +kerning first=8222 second=246 amount=-1 +kerning first=289 second=245 amount=-1 +kerning first=263 second=8249 amount=-1 +kerning first=86 second=277 amount=-1 +kerning first=1062 second=1057 amount=-1 +kerning first=274 second=82 amount=-1 +kerning first=323 second=286 amount=-1 +kerning first=230 second=120 amount=-1 +kerning first=212 second=282 amount=-1 +kerning first=220 second=283 amount=-1 +kerning first=1036 second=1086 amount=-1 +kerning first=1118 second=1097 amount=-1 +kerning first=251 second=99 amount=-1 +kerning first=271 second=45 amount=-1 +kerning first=1060 second=1068 amount=-1 +kerning first=370 second=244 amount=-1 +kerning first=199 second=45 amount=-1 +kerning first=199 second=171 amount=-1 +kerning first=69 second=116 amount=-1 +kerning first=287 second=113 amount=-1 +kerning first=207 second=79 amount=-1 +kerning first=323 second=113 amount=-1 +kerning first=97 second=235 amount=-1 +kerning first=307 second=171 amount=-1 +kerning first=1053 second=1048 amount=-1 +kerning first=74 second=286 amount=-1 +kerning first=251 second=113 amount=-1 +kerning first=86 second=8249 amount=-2 +kerning first=218 second=350 amount=-1 +kerning first=219 second=70 amount=-1 +kerning first=246 second=8250 amount=-1 +kerning first=263 second=104 amount=-1 +kerning first=304 second=274 amount=-1 +kerning first=77 second=350 amount=-1 +kerning first=1041 second=1056 amount=-1 +kerning first=1048 second=1077 amount=-1 +kerning first=87 second=117 amount=-1 +kerning first=262 second=226 amount=-1 +kerning first=217 second=344 amount=-1 +kerning first=1118 second=1085 amount=-1 +kerning first=282 second=284 amount=-1 +kerning first=375 second=115 amount=-1 +kerning first=84 second=231 amount=-1 +kerning first=220 second=310 amount=-1 +kerning first=351 second=318 amount=-1 +kerning first=1046 second=1085 amount=-1 +kerning first=8217 second=250 amount=-1 +kerning first=74 second=205 amount=-1 +kerning first=8218 second=85 amount=-1 +kerning first=1071 second=1053 amount=-1 +kerning first=79 second=310 amount=-1 +kerning first=231 second=115 amount=-1 +kerning first=323 second=205 amount=-1 +kerning first=69 second=284 amount=-1 +kerning first=267 second=115 amount=-1 +kerning first=339 second=115 amount=-1 +kerning first=243 second=106 amount=-1 +kerning first=369 second=231 amount=-1 +kerning first=279 second=106 amount=-1 +kerning first=1054 second=1036 amount=-1 +kerning first=1105 second=1091 amount=-1 +kerning first=80 second=89 amount=-1 +kerning first=203 second=214 amount=-1 +kerning first=225 second=231 amount=-1 +kerning first=261 second=231 amount=-1 +kerning first=364 second=310 amount=-1 +kerning first=201 second=217 amount=-1 +kerning first=1047 second=1044 amount=-1 +kerning first=83 second=45 amount=-1 +kerning first=119 second=45 amount=-1 +kerning first=78 second=97 amount=-1 +kerning first=88 second=365 amount=-1 +kerning first=72 second=235 amount=-1 +kerning first=287 second=333 amount=-1 +kerning first=283 second=243 amount=-1 +kerning first=65 second=332 amount=-1 +kerning first=108 second=235 amount=-1 +kerning first=260 second=45 amount=-1 +kerning first=355 second=243 amount=-1 +kerning first=205 second=353 amount=-1 +kerning first=232 second=281 amount=-1 +kerning first=278 second=332 amount=-1 +kerning first=366 second=275 amount=-1 +kerning first=1062 second=1028 amount=-1 +kerning first=224 second=45 amount=-1 +kerning first=277 second=353 amount=-1 +kerning first=209 second=71 amount=-1 +kerning first=117 second=275 amount=-1 +kerning first=1048 second=1050 amount=-1 +kerning first=8220 second=368 amount=-1 +kerning first=193 second=362 amount=-1 +kerning first=1034 second=1067 amount=-1 +kerning first=86 second=223 amount=-1 +kerning first=8250 second=67 amount=-1 +kerning first=368 second=45 amount=-2 +kerning first=1030 second=1096 amount=-1 +kerning first=219 second=97 amount=-1 +kerning first=77 second=323 amount=-1 +kerning first=263 second=223 amount=-1 +kerning first=106 second=243 amount=-1 +kerning first=84 second=226 amount=-1 +kerning first=70 second=243 amount=-1 +kerning first=274 second=370 amount=-1 +kerning first=197 second=107 amount=-1 +kerning first=45 second=302 amount=-1 +kerning first=228 second=122 amount=-1 +kerning first=1071 second=1080 amount=-1 +kerning first=310 second=370 amount=-1 +kerning first=323 second=232 amount=-1 +kerning first=81 second=302 amount=-1 +kerning first=87 second=122 amount=-1 +kerning first=202 second=370 amount=-1 +kerning first=364 second=337 amount=-1 +kerning first=287 second=232 amount=-1 +kerning first=78 second=336 amount=-1 +kerning first=218 second=323 amount=-1 +kerning first=328 second=337 amount=-1 +kerning first=251 second=232 amount=-1 +kerning first=117 second=234 amount=-1 +kerning first=268 second=266 amount=-1 +kerning first=219 second=336 amount=-1 +kerning first=346 second=370 amount=-1 +kerning first=220 second=337 amount=-1 +kerning first=217 second=317 amount=-1 +kerning first=362 second=323 amount=-1 +kerning first=241 second=119 amount=-1 +kerning first=8217 second=277 amount=-1 +kerning first=327 second=336 amount=-1 +kerning first=242 second=8250 amount=-1 +kerning first=201 second=249 amount=-1 +kerning first=8222 second=122 amount=-1 +kerning first=1030 second=1105 amount=-1 +kerning first=1060 second=1041 amount=-1 +kerning first=101 second=8250 amount=-1 +kerning first=266 second=314 amount=-1 +kerning first=264 second=122 amount=-1 +kerning first=259 second=234 amount=-1 +kerning first=110 second=232 amount=-1 +kerning first=230 second=314 amount=-1 +kerning first=1047 second=1071 amount=-1 +kerning first=344 second=45 amount=-1 +kerning first=74 second=232 amount=-1 +kerning first=8217 second=242 amount=-1 +kerning first=325 second=171 amount=-1 +kerning first=72 second=267 amount=-1 +kerning first=108 second=267 amount=-1 +kerning first=65 second=105 amount=-1 +kerning first=281 second=98 amount=-1 +kerning first=217 second=110 amount=-1 +kerning first=325 second=110 amount=-1 +kerning first=289 second=110 amount=-1 +kerning first=368 second=72 amount=-1 +kerning first=1049 second=1036 amount=-1 +kerning first=314 second=269 amount=-1 +kerning first=302 second=114 amount=-1 +kerning first=1048 second=1079 amount=-1 +kerning first=199 second=225 amount=-1 +kerning first=266 second=114 amount=-1 +kerning first=72 second=103 amount=-1 +kerning first=264 second=290 amount=-1 +kerning first=374 second=114 amount=-1 +kerning first=1104 second=1097 amount=-1 +kerning first=302 second=211 amount=-1 +kerning first=330 second=302 amount=-1 +kerning first=330 second=231 amount=-1 +kerning first=249 second=267 amount=-1 +kerning first=89 second=114 amount=-1 +kerning first=214 second=46 amount=-1 +kerning first=218 second=115 amount=-1 +kerning first=230 second=114 amount=-1 +kerning first=1038 second=1046 amount=-1 +kerning first=243 second=318 amount=-1 +kerning first=229 second=335 amount=-1 +kerning first=194 second=114 amount=-1 +kerning first=99 second=8250 amount=-1 +kerning first=279 second=318 amount=-1 +kerning first=77 second=69 amount=-1 +kerning first=339 second=273 amount=-1 +kerning first=199 second=380 amount=-1 +kerning first=204 second=227 amount=-1 +kerning first=267 second=273 amount=-1 +kerning first=231 second=273 amount=-1 +kerning first=290 second=296 amount=-1 +kerning first=350 second=78 amount=-1 +kerning first=366 second=102 amount=-1 +kerning first=234 second=337 amount=-1 +kerning first=346 second=117 amount=-1 +kerning first=218 second=296 amount=-1 +kerning first=364 second=364 amount=-1 +kerning first=245 second=44 amount=-1 +kerning first=354 second=111 amount=-1 +kerning first=206 second=78 amount=-1 +kerning first=281 second=44 amount=-1 +kerning first=362 second=296 amount=-1 +kerning first=278 second=78 amount=-1 +kerning first=209 second=44 amount=-1 +kerning first=1047 second=1098 amount=-1 +kerning first=304 second=355 amount=-1 +kerning first=366 second=248 amount=-1 +kerning first=73 second=334 amount=-1 +kerning first=327 second=282 amount=-1 +kerning first=232 second=355 amount=-1 +kerning first=196 second=355 amount=-1 +kerning first=353 second=44 amount=-1 +kerning first=1041 second=1024 amount=-1 +kerning first=219 second=282 amount=-1 +kerning first=230 second=287 amount=-1 +kerning first=187 second=288 amount=-1 +kerning first=45 second=221 amount=-2 +kerning first=1076 second=1091 amount=-1 +kerning first=82 second=288 amount=-1 +kerning first=78 second=282 amount=-1 +kerning first=217 second=8250 amount=-2 +kerning first=354 second=230 amount=-1 +kerning first=67 second=346 amount=-1 +kerning first=8222 second=382 amount=-1 +kerning first=1059 second=1089 amount=-1 +kerning first=217 second=83 amount=-1 +kerning first=1038 second=1073 amount=-1 +kerning first=351 second=291 amount=-1 +kerning first=262 second=352 amount=-1 +kerning first=194 second=87 amount=-1 +kerning first=325 second=83 amount=-1 +kerning first=279 second=291 amount=-1 +kerning first=243 second=291 amount=-1 +kerning first=370 second=352 amount=-1 +kerning first=307 second=99 amount=-1 +kerning first=298 second=352 amount=-1 +kerning first=200 second=76 amount=-1 +kerning first=268 second=282 amount=-1 +kerning first=339 second=8218 amount=-1 +kerning first=334 second=325 amount=-1 +kerning first=307 second=279 amount=-1 +kerning first=199 second=279 amount=-1 +kerning first=347 second=187 amount=-1 +kerning first=350 second=278 amount=-1 +kerning first=248 second=108 amount=-1 +kerning first=231 second=8218 amount=-1 +kerning first=235 second=279 amount=-1 +kerning first=78 second=211 amount=-1 +kerning first=266 second=362 amount=-1 +kerning first=1077 second=1119 amount=-1 +kerning first=70 second=211 amount=-1 +kerning first=78 second=68 amount=-1 +kerning first=77 second=269 amount=-1 +kerning first=210 second=84 amount=-1 +kerning first=8217 second=223 amount=-1 +kerning first=8217 second=226 amount=-1 +kerning first=221 second=71 amount=-1 +kerning first=88 second=362 amount=-1 +kerning first=98 second=187 amount=-1 +kerning first=218 second=269 amount=-1 +kerning first=224 second=99 amount=-1 +kerning first=97 second=316 amount=-1 +kerning first=219 second=211 amount=-1 +kerning first=362 second=269 amount=-1 +kerning first=81 second=75 amount=-1 +kerning first=232 second=382 amount=-1 +kerning first=217 second=371 amount=-1 +kerning first=368 second=99 amount=-1 +kerning first=1044 second=1082 amount=-1 +kerning first=268 second=382 amount=-1 +kerning first=203 second=187 amount=-1 +kerning first=198 second=266 amount=-1 +kerning first=304 second=382 amount=-1 +kerning first=1062 second=1082 amount=-1 +kerning first=296 second=99 amount=-1 +kerning first=326 second=269 amount=-1 +kerning first=8250 second=86 amount=-2 +kerning first=89 second=260 amount=-1 +kerning first=200 second=117 amount=-1 +kerning first=1076 second=1083 amount=-1 +kerning first=366 second=8220 amount=-1 +kerning first=330 second=248 amount=-1 +kerning first=1059 second=1116 amount=-1 +kerning first=277 second=380 amount=-1 +kerning first=66 second=350 amount=-1 +kerning first=288 second=218 amount=-1 +kerning first=1067 second=1030 amount=-1 +kerning first=275 second=103 amount=-1 +kerning first=1068 second=1043 amount=-1 +kerning first=1038 second=1100 amount=-1 +kerning first=366 second=75 amount=-1 +kerning first=330 second=75 amount=-1 +kerning first=117 second=248 amount=-1 +kerning first=207 second=264 amount=-1 +kerning first=374 second=260 amount=-1 +kerning first=264 second=209 amount=-1 +kerning first=81 second=8220 amount=-2 +kerning first=362 second=69 amount=-1 +kerning first=85 second=325 amount=-1 +kerning first=66 second=193 amount=-1 +kerning first=220 second=364 amount=-1 +kerning first=66 second=264 amount=-1 +kerning first=70 second=270 amount=-1 +kerning first=270 second=66 amount=-1 +kerning first=99 second=367 amount=-1 +kerning first=86 second=196 amount=-1 +kerning first=258 second=8220 amount=-2 +kerning first=65 second=251 amount=-1 +kerning first=222 second=8220 amount=-2 +kerning first=218 second=69 amount=-1 +kerning first=79 second=364 amount=-1 +kerning first=198 second=66 amount=-1 +kerning first=262 second=325 amount=-1 +kerning first=211 second=270 amount=-1 +kerning first=226 second=316 amount=-1 +kerning first=100 second=380 amount=-1 +kerning first=107 second=108 amount=-1 +kerning first=1052 second=1073 amount=-1 +kerning first=335 second=8217 amount=-2 +kerning first=193 second=264 amount=-1 +kerning first=350 second=8221 amount=-1 +kerning first=355 second=351 amount=-1 +kerning first=244 second=8218 amount=-1 +kerning first=101 second=251 amount=-1 +kerning first=103 second=103 amount=-1 +kerning first=270 second=364 amount=-1 +kerning first=88 second=264 amount=-1 +kerning first=269 second=122 amount=-1 +kerning first=1055 second=1034 amount=-1 +kerning first=283 second=351 amount=-1 +kerning first=1055 second=1024 amount=-1 +kerning first=350 second=251 amount=-1 +kerning first=204 second=69 amount=-1 +kerning first=296 second=338 amount=-1 +kerning first=252 second=277 amount=-1 +kerning first=108 second=316 amount=-1 +kerning first=278 second=251 amount=-1 +kerning first=263 second=8217 amount=-2 +kerning first=314 second=251 amount=-1 +kerning first=1065 second=1060 amount=-1 +kerning first=252 second=232 amount=-1 +kerning first=325 second=273 amount=-1 +kerning first=1071 second=1050 amount=-1 +kerning first=85 second=8221 amount=-1 +kerning first=72 second=99 amount=-1 +kerning first=121 second=8221 amount=-2 +kerning first=193 second=268 amount=-1 +kerning first=1041 second=1051 amount=-1 +kerning first=226 second=8221 amount=-2 +kerning first=1064 second=1064 amount=-1 +kerning first=221 second=193 amount=-1 +kerning first=249 second=99 amount=-1 +kerning first=211 second=351 amount=-1 +kerning first=204 second=286 amount=-1 +kerning first=218 second=242 amount=-1 +kerning first=108 second=99 amount=-1 +kerning first=77 second=242 amount=-1 +kerning first=356 second=347 amount=-1 +kerning first=326 second=242 amount=-1 +kerning first=8250 second=365 amount=-1 +kerning first=1056 second=1030 amount=-1 +kerning first=282 second=171 amount=-1 +kerning first=362 second=242 amount=-1 +kerning first=1066 second=1056 amount=-1 +kerning first=354 second=171 amount=-1 +kerning first=264 second=78 amount=-1 +kerning first=199 second=333 amount=-1 +kerning first=323 second=246 amount=-1 +kerning first=370 second=113 amount=-1 +kerning first=70 second=8250 amount=-2 +kerning first=65 second=118 amount=-1 +kerning first=78 second=44 amount=-1 +kerning first=205 second=282 amount=-1 +kerning first=330 second=346 amount=-1 +kerning first=275 second=100 amount=-1 +kerning first=230 second=233 amount=-1 +kerning first=8218 second=117 amount=-1 +kerning first=86 second=8217 amount=-1 +kerning first=89 second=233 amount=-1 +kerning first=122 second=8217 amount=-1 +kerning first=1049 second=1091 amount=-1 +kerning first=69 second=171 amount=-1 +kerning first=72 second=111 amount=-1 +kerning first=105 second=171 amount=-1 +kerning first=374 second=233 amount=-1 +kerning first=89 second=117 amount=-1 +kerning first=266 second=233 amount=-1 +kerning first=302 second=233 amount=-1 +kerning first=74 second=71 amount=-1 +kerning first=1056 second=1108 amount=-1 +kerning first=298 second=330 amount=-1 +kerning first=1069 second=1034 amount=-1 +kerning first=325 second=246 amount=-1 +kerning first=73 second=68 amount=-1 +kerning first=356 second=103 amount=-1 +kerning first=289 second=365 amount=-1 +kerning first=80 second=220 amount=-1 +kerning first=246 second=382 amount=-1 +kerning first=1054 second=1065 amount=-1 +kerning first=66 second=374 amount=-1 +kerning first=211 second=194 amount=-1 +kerning first=217 second=246 amount=-1 +kerning first=248 second=103 amount=-1 +kerning first=368 second=365 amount=-1 +kerning first=346 second=77 amount=-1 +kerning first=375 second=45 amount=-1 +kerning first=354 second=382 amount=-1 +kerning first=85 second=330 amount=-1 +kerning first=108 second=289 amount=-1 +kerning first=253 second=316 amount=-1 +kerning first=107 second=103 amount=-1 +kerning first=263 second=109 amount=-1 +kerning first=1078 second=1074 amount=-1 +kerning first=253 second=8218 amount=-1 +kerning first=70 second=194 amount=-1 +kerning first=1068 second=1048 amount=-1 +kerning first=217 second=8218 amount=-2 +kerning first=214 second=68 amount=-1 +kerning first=370 second=330 amount=-1 +kerning first=119 second=365 amount=-1 +kerning first=8220 second=260 amount=-2 +kerning first=271 second=171 amount=-1 +kerning first=286 second=68 amount=-1 +kerning first=83 second=365 amount=-1 +kerning first=296 second=334 amount=-1 +kerning first=73 second=339 amount=-1 +kerning first=204 second=313 amount=-1 +kerning first=251 second=281 amount=-1 +kerning first=1085 second=1095 amount=-1 +kerning first=287 second=281 amount=-1 +kerning first=334 second=86 amount=-1 +kerning first=212 second=347 amount=-1 +kerning first=72 second=355 amount=-1 +kerning first=323 second=281 amount=-1 +kerning first=1033 second=1041 amount=-1 +kerning first=272 second=8220 amount=-2 +kerning first=112 second=8218 amount=-1 +kerning first=86 second=109 amount=-1 +kerning first=87 second=353 amount=-1 +kerning first=380 second=8220 amount=-1 +kerning first=1049 second=1095 amount=-1 +kerning first=344 second=8220 amount=-1 +kerning first=1031 second=1025 amount=-1 +kerning first=316 second=277 amount=-1 +kerning first=274 second=77 amount=-1 +kerning first=234 second=120 amount=-1 +kerning first=202 second=77 amount=-1 +kerning first=187 second=315 amount=-1 +kerning first=250 second=339 amount=-1 +kerning first=8218 second=105 amount=-1 +kerning first=8217 second=326 amount=-1 +kerning first=74 second=281 amount=-1 +kerning first=1052 second=1100 amount=-1 +kerning first=1070 second=1070 amount=-1 +kerning first=110 second=281 amount=-1 +kerning first=110 second=118 amount=-1 +kerning first=201 second=298 amount=-1 +kerning first=272 second=356 amount=-1 +kerning first=68 second=202 amount=-1 +kerning first=1053 second=1042 amount=-1 +kerning first=288 second=8249 amount=-1 +kerning first=78 second=368 amount=-1 +kerning first=204 second=232 amount=-1 +kerning first=302 second=206 amount=-1 +kerning first=105 second=232 amount=-1 +kerning first=324 second=8249 amount=-1 +kerning first=284 second=76 amount=-1 +kerning first=338 second=206 amount=-1 +kerning first=370 second=357 amount=-1 +kerning first=99 second=232 amount=-1 +kerning first=74 second=335 amount=-1 +kerning first=1028 second=1118 amount=-1 +kerning first=219 second=368 amount=-1 +kerning first=212 second=76 amount=-1 +kerning first=266 second=206 amount=-1 +kerning first=76 second=219 amount=-1 +kerning first=262 second=357 amount=-1 +kerning first=8250 second=121 amount=-1 +kerning first=110 second=335 amount=-1 +kerning first=1064 second=1118 amount=-1 +kerning first=251 second=335 amount=-1 +kerning first=240 second=232 amount=-1 +kerning first=298 second=357 amount=-1 +kerning first=203 second=344 amount=-1 +kerning first=8222 second=79 amount=-1 +kerning first=344 second=85 amount=-1 +kerning first=75 second=8249 amount=-1 +kerning first=234 second=234 amount=-1 +kerning first=77 second=332 amount=-1 +kerning first=264 second=241 amount=-1 +kerning first=272 second=85 amount=-1 +kerning first=8250 second=338 amount=-1 +kerning first=67 second=102 amount=-1 +kerning first=72 second=262 amount=-1 +kerning first=200 second=85 amount=-1 +kerning first=327 second=368 amount=-1 +kerning first=1069 second=1044 amount=-1 +kerning first=252 second=8249 amount=-1 +kerning first=368 second=67 amount=-1 +kerning first=1042 second=1042 amount=-1 +kerning first=258 second=216 amount=-1 +kerning first=296 second=67 amount=-1 +kerning first=275 second=46 amount=-1 +kerning first=286 second=366 amount=-1 +kerning first=330 second=216 amount=-1 +kerning first=70 second=378 amount=-1 +kerning first=347 second=46 amount=-1 +kerning first=258 second=213 amount=-1 +kerning first=214 second=366 amount=-1 +kerning first=73 second=366 amount=-1 +kerning first=1036 second=1081 amount=-1 +kerning first=366 second=216 amount=-1 +kerning first=87 second=241 amount=-1 +kerning first=85 second=357 amount=-1 +kerning first=296 second=284 amount=-1 +kerning first=86 second=353 amount=-1 +kerning first=89 second=363 amount=-1 +kerning first=202 second=325 amount=-1 +kerning first=74 second=103 amount=-1 +kerning first=195 second=252 amount=-1 +kerning first=354 second=225 amount=-1 +kerning first=207 second=350 amount=-1 +kerning first=194 second=363 amount=-1 +kerning first=211 second=80 amount=-1 +kerning first=230 second=363 amount=-1 +kerning first=209 second=229 amount=-1 +kerning first=263 second=353 amount=-1 +kerning first=1065 second=1114 amount=-1 +kerning first=45 second=216 amount=-1 +kerning first=70 second=80 amount=-1 +kerning first=75 second=8222 amount=-1 +kerning first=352 second=70 amount=-1 +kerning first=270 second=207 amount=-1 +kerning first=204 second=73 amount=-1 +kerning first=70 second=107 amount=-1 +kerning first=75 second=250 amount=-1 +kerning first=1033 second=1071 amount=-1 +kerning first=256 second=8220 amount=-2 +kerning first=119 second=311 amount=-1 +kerning first=1069 second=1071 amount=-1 +kerning first=8217 second=353 amount=-1 +kerning first=280 second=70 amount=-1 +kerning first=118 second=369 amount=-1 +kerning first=283 second=378 amount=-1 +kerning first=298 second=113 amount=-1 +kerning first=205 second=201 amount=-1 +kerning first=1041 second=1070 amount=-1 +kerning first=310 second=44 amount=-1 +kerning first=226 second=113 amount=-1 +kerning first=288 second=8222 amount=-1 +kerning first=262 second=113 amount=-1 +kerning first=235 second=116 amount=-1 +kerning first=216 second=8222 amount=-1 +kerning first=1049 second=1068 amount=-1 +kerning first=199 second=116 amount=-1 +kerning first=326 second=118 amount=-1 +kerning first=203 second=317 amount=-1 +kerning first=111 second=8222 amount=-1 +kerning first=85 second=113 amount=-1 +kerning first=198 second=207 amount=-1 +kerning first=99 second=259 amount=-1 +kerning first=264 second=268 amount=-1 +kerning first=8217 second=109 amount=-1 +kerning first=192 second=268 amount=-1 +kerning first=1036 second=1108 amount=-1 +kerning first=195 second=332 amount=-1 +kerning first=8217 second=194 amount=-2 +kerning first=263 second=326 amount=-1 +kerning first=272 second=302 amount=-1 +kerning first=1054 second=1038 amount=-1 +kerning first=68 second=256 amount=-1 +kerning first=118 second=98 amount=-1 +kerning first=200 second=302 amount=-1 +kerning first=1053 second=1096 amount=-1 +kerning first=193 second=210 amount=-1 +kerning first=323 second=335 amount=-1 +kerning first=287 second=335 amount=-1 +kerning first=88 second=210 amount=-1 +kerning first=210 second=198 amount=-1 +kerning first=203 second=73 amount=-1 +kerning first=324 second=277 amount=-1 +kerning first=73 second=122 amount=-1 +kerning first=264 second=234 amount=-1 +kerning first=1044 second=1114 amount=-1 +kerning first=87 second=268 amount=-1 +kerning first=325 second=219 amount=-1 +kerning first=283 second=107 amount=-1 +kerning first=202 second=213 amount=-1 +kerning first=264 second=187 amount=-1 +kerning first=194 second=336 amount=-1 +kerning first=79 second=88 amount=-1 +kerning first=192 second=187 amount=-1 +kerning first=66 second=323 amount=-1 +kerning first=354 second=279 amount=-1 +kerning first=266 second=336 amount=-1 +kerning first=228 second=187 amount=-1 +kerning first=263 second=117 amount=-1 +kerning first=302 second=336 amount=-1 +kerning first=74 second=200 amount=-1 +kerning first=81 second=270 amount=-1 +kerning first=204 second=362 amount=-1 +kerning first=241 second=118 amount=-1 +kerning first=338 second=336 amount=-1 +kerning first=310 second=213 amount=-1 +kerning first=8217 second=245 amount=-1 +kerning first=267 second=8250 amount=-1 +kerning first=374 second=336 amount=-1 +kerning first=274 second=213 amount=-1 +kerning first=231 second=8250 amount=-1 +kerning first=1048 second=1045 amount=-1 +kerning first=207 second=323 amount=-1 +kerning first=209 second=283 amount=-1 +kerning first=194 second=119 amount=-1 +kerning first=105 second=279 amount=-1 +kerning first=356 second=244 amount=-1 +kerning first=192 second=371 amount=-1 +kerning first=82 second=266 amount=-1 +kerning first=121 second=314 amount=-1 +kerning first=187 second=266 amount=-1 +kerning first=87 second=187 amount=-1 +kerning first=206 second=327 amount=-1 +kerning first=323 second=200 amount=-1 +kerning first=73 second=204 amount=-1 +kerning first=278 second=327 amount=-1 +kerning first=106 second=248 amount=-1 +kerning first=291 second=314 amount=-1 +kerning first=268 second=79 amount=-1 +kerning first=209 second=66 amount=-1 +kerning first=70 second=248 amount=-1 +kerning first=255 second=314 amount=-1 +kerning first=304 second=79 amount=-1 +kerning first=1060 second=1036 amount=-1 +kerning first=327 second=171 amount=-1 +kerning first=1056 second=1052 amount=-1 +kerning first=206 second=110 amount=-1 +kerning first=68 second=66 amount=-1 +kerning first=1070 second=1062 amount=-1 +kerning first=281 second=283 amount=-1 +kerning first=120 second=318 amount=-1 +kerning first=196 second=79 amount=-1 +kerning first=113 second=318 amount=-1 +kerning first=229 second=245 amount=-1 +kerning first=67 second=70 amount=-1 +kerning first=88 second=367 amount=-1 +kerning first=111 second=380 amount=-1 +kerning first=254 second=318 amount=-1 +kerning first=193 second=367 amount=-1 +kerning first=217 second=192 amount=-1 +kerning first=267 second=305 amount=-1 +kerning first=328 second=231 amount=-1 +kerning first=339 second=44 amount=-1 +kerning first=231 second=305 amount=-1 +kerning first=199 second=257 amount=-1 +kerning first=203 second=209 amount=-1 +kerning first=1064 second=1089 amount=-1 +kerning first=80 second=274 amount=-1 +kerning first=1047 second=1049 amount=-1 +kerning first=366 second=270 amount=-1 +kerning first=197 second=356 amount=-1 +kerning first=1048 second=1072 amount=-1 +kerning first=338 second=363 amount=-1 +kerning first=8217 second=218 amount=-1 +kerning first=374 second=363 amount=-1 +kerning first=68 second=310 amount=-1 +kerning first=205 second=114 amount=-1 +kerning first=282 second=252 amount=-1 +kerning first=241 second=8249 amount=-1 +kerning first=218 second=101 amount=-1 +kerning first=219 second=79 amount=-1 +kerning first=199 second=284 amount=-1 +kerning first=364 second=115 amount=-1 +kerning first=326 second=101 amount=-1 +kerning first=79 second=115 amount=-1 +kerning first=242 second=114 amount=-1 +kerning first=204 second=205 amount=-1 +kerning first=66 second=296 amount=-1 +kerning first=65 second=354 amount=-1 +kerning first=1058 second=1098 amount=-1 +kerning first=71 second=217 amount=-1 +kerning first=362 second=101 amount=-1 +kerning first=220 second=115 amount=-1 +kerning first=192 second=214 amount=-1 +kerning first=250 second=231 amount=-1 +kerning first=1056 second=1036 amount=-1 +kerning first=212 second=217 amount=-1 +kerning first=87 second=214 amount=-1 +kerning first=232 second=106 amount=-1 +kerning first=207 second=296 amount=-1 +kerning first=284 second=217 amount=-1 +kerning first=210 second=89 amount=-1 +kerning first=229 second=8220 amount=-2 +kerning first=73 second=231 amount=-1 +kerning first=109 second=231 amount=-1 +kerning first=193 second=220 amount=-1 +kerning first=264 second=214 amount=-1 +kerning first=264 second=344 amount=-1 +kerning first=209 second=310 amount=-1 +kerning first=69 second=252 amount=-1 +kerning first=100 second=8249 amount=-1 +kerning first=242 second=187 amount=-1 +kerning first=330 second=243 amount=-1 +kerning first=283 second=275 amount=-1 +kerning first=77 second=345 amount=-1 +kerning first=224 second=235 amount=-1 +kerning first=370 second=249 amount=-1 +kerning first=366 second=80 amount=-1 +kerning first=355 second=275 amount=-1 +kerning first=366 second=243 amount=-1 +kerning first=1071 second=1031 amount=-1 +kerning first=108 second=45 amount=-1 +kerning first=198 second=71 amount=-1 +kerning first=1049 second=1043 amount=-1 +kerning first=296 second=235 amount=-1 +kerning first=121 second=249 amount=-1 +kerning first=255 second=287 amount=-1 +kerning first=106 second=275 amount=-1 +kerning first=218 second=345 amount=-1 +kerning first=187 second=223 amount=-1 +kerning first=254 second=345 amount=-1 +kerning first=368 second=235 amount=-1 +kerning first=72 second=45 amount=-1 +kerning first=290 second=345 amount=-1 +kerning first=8218 second=268 amount=-1 +kerning first=326 second=345 amount=-1 +kerning first=362 second=345 amount=-1 +kerning first=81 second=80 amount=-1 +kerning first=363 second=287 amount=-1 +kerning first=70 second=275 amount=-1 +kerning first=206 second=83 amount=-1 +kerning first=45 second=80 amount=-1 +kerning first=249 second=45 amount=-1 +kerning first=67 second=97 amount=-1 +kerning first=1118 second=1080 amount=-1 +kerning first=117 second=243 amount=-1 +kerning first=1046 second=1080 amount=-1 +kerning first=89 second=336 amount=-1 +kerning first=1060 second=1063 amount=-1 +kerning first=75 second=223 amount=-1 +kerning first=281 second=337 amount=-1 +kerning first=68 second=195 amount=-1 +kerning first=205 second=304 amount=-1 +kerning first=82 second=213 amount=-1 +kerning first=86 second=245 amount=-1 +kerning first=1031 second=1079 amount=-1 +kerning first=209 second=337 amount=-1 +kerning first=200 second=199 amount=-1 +kerning first=82 second=212 amount=-1 +kerning first=350 second=8218 amount=-1 +kerning first=104 second=337 amount=-1 +kerning first=77 second=74 amount=-1 +kerning first=245 second=120 amount=-1 +kerning first=282 second=364 amount=-1 +kerning first=87 second=100 amount=-1 +kerning first=344 second=199 amount=-1 +kerning first=281 second=120 amount=-1 +kerning first=218 second=74 amount=-1 +kerning first=211 second=221 amount=-1 +kerning first=45 second=324 amount=-1 +kerning first=101 second=8218 amount=-1 +kerning first=242 second=122 amount=-1 +kerning first=75 second=220 amount=-1 +kerning first=362 second=74 amount=-1 +kerning first=1042 second=1082 amount=-1 +kerning first=279 second=269 amount=-1 +kerning first=242 second=8218 amount=-1 +kerning first=227 second=245 amount=-1 +kerning first=1039 second=1037 amount=-1 +kerning first=119 second=250 amount=-1 +kerning first=199 second=203 amount=-1 +kerning first=283 second=8220 amount=-2 +kerning first=221 second=111 amount=-1 +kerning first=213 second=72 amount=-1 +kerning first=1034 second=1037 amount=-1 +kerning first=257 second=111 amount=-1 +kerning first=72 second=72 amount=-1 +kerning first=355 second=8220 amount=-1 +kerning first=1042 second=1101 amount=-1 +kerning first=1091 second=1088 amount=-1 +kerning first=289 second=105 amount=-1 +kerning first=1078 second=1101 amount=-1 +kerning first=365 second=111 amount=-1 +kerning first=287 second=254 amount=-1 +kerning first=374 second=65 amount=-1 +kerning first=230 second=249 amount=-1 +kerning first=72 second=370 amount=-1 +kerning first=212 second=374 amount=-1 +kerning first=219 second=260 amount=-1 +kerning first=198 second=315 amount=-1 +kerning first=275 second=263 amount=-1 +kerning first=277 second=114 amount=-1 +kerning first=187 second=212 amount=-1 +kerning first=97 second=267 amount=-1 +kerning first=1059 second=1094 amount=-1 +kerning first=241 second=114 amount=-1 +kerning first=1043 second=1097 amount=-1 +kerning first=70 second=8220 amount=-1 +kerning first=80 second=111 amount=-1 +kerning first=211 second=8220 amount=-2 +kerning first=258 second=253 amount=-1 +kerning first=213 second=370 amount=-1 +kerning first=270 second=315 amount=-1 +kerning first=224 second=316 amount=-1 +kerning first=323 second=227 amount=-1 +kerning first=231 second=251 amount=-1 +kerning first=317 second=364 amount=-1 +kerning first=232 second=337 amount=-1 +kerning first=267 second=251 amount=-1 +kerning first=201 second=81 amount=-1 +kerning first=195 second=251 amount=-1 +kerning first=1064 second=1105 amount=-1 +kerning first=209 second=364 amount=-1 +kerning first=375 second=251 amount=-1 +kerning first=206 second=273 amount=-1 +kerning first=101 second=273 amount=-1 +kerning first=205 second=331 amount=-1 +kerning first=339 second=251 amount=-1 +kerning first=270 second=44 amount=-1 +kerning first=268 second=370 amount=-1 +kerning first=283 second=248 amount=-1 +kerning first=217 second=78 amount=-1 +kerning first=80 second=355 amount=-1 +kerning first=325 second=78 amount=-1 +kerning first=355 second=248 amount=-1 +kerning first=234 second=44 amount=-1 +kerning first=290 second=69 amount=-1 +kerning first=1107 second=1085 amount=-1 +kerning first=207 second=242 amount=-1 +kerning first=338 second=282 amount=-1 +kerning first=264 second=202 amount=-1 +kerning first=206 second=113 amount=-1 +kerning first=266 second=282 amount=-1 +kerning first=1049 second=1067 amount=-1 +kerning first=1052 second=1024 amount=-1 +kerning first=8218 second=214 amount=-1 +kerning first=279 second=242 amount=-1 +kerning first=200 second=8220 amount=-1 +kerning first=74 second=227 amount=-1 +kerning first=78 second=233 amount=-1 +kerning first=313 second=87 amount=-1 +kerning first=199 second=230 amount=-1 +kerning first=305 second=99 amount=-1 +kerning first=219 second=233 amount=-1 +kerning first=326 second=291 amount=-1 +kerning first=8222 second=220 amount=-1 diff --git a/jme3-examples/src/main/resources/jme3test/font/Native-FreeSerif16I.png b/jme3-examples/src/main/resources/jme3test/font/Native-FreeSerif16I.png new file mode 100644 index 000000000..240e0c1eb Binary files /dev/null and b/jme3-examples/src/main/resources/jme3test/font/Native-FreeSerif16I.png differ diff --git a/jme3-jbullet/build.gradle b/jme3-jbullet/build.gradle index 0e3967ab2..473f03b04 100644 --- a/jme3-jbullet/build.gradle +++ b/jme3-jbullet/build.gradle @@ -12,9 +12,9 @@ sourceSets { } dependencies { - compile ('java3d:vecmath:1.3.1') - compile files('../lib/jbullet.jar', '../lib/stack-alloc.jar') + compile 'java3d:vecmath:1.3.1' + compile 'jbullet:jbullet' + compile 'stack-alloc:stack-alloc' compile project(':jme3-core') compile project(':jme3-terrain') -// compile project(':jme3-bullet') } diff --git a/jme3-jbullet/src/main/java/com/jme3/bullet/PhysicsSpace.java b/jme3-jbullet/src/main/java/com/jme3/bullet/PhysicsSpace.java index b69332490..9dd64be17 100644 --- a/jme3-jbullet/src/main/java/com/jme3/bullet/PhysicsSpace.java +++ b/jme3-jbullet/src/main/java/com/jme3/bullet/PhysicsSpace.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -63,7 +63,6 @@ import com.bulletphysics.dynamics.constraintsolver.TypedConstraint; import com.bulletphysics.dynamics.vehicle.RaycastVehicle; import com.bulletphysics.extras.gimpact.GImpactCollisionAlgorithm; import com.jme3.app.AppTask; -import com.jme3.asset.AssetManager; import com.jme3.bullet.collision.PhysicsCollisionEvent; import com.jme3.bullet.collision.PhysicsCollisionEventFactory; import com.jme3.bullet.collision.PhysicsCollisionGroupListener; @@ -84,8 +83,8 @@ import com.jme3.math.Transform; import com.jme3.math.Vector3f; import com.jme3.scene.Node; import com.jme3.scene.Spatial; +import com.jme3.util.SafeArrayList; import java.util.ArrayDeque; -import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.LinkedList; @@ -104,9 +103,21 @@ import java.util.logging.Logger; */ public class PhysicsSpace { + /** + * message logger for this class + */ private static final Logger logger = Logger.getLogger(PhysicsSpace.class.getName()); + /** + * index of the X axis + */ public static final int AXIS_X = 0; + /** + * index of the Y axis + */ public static final int AXIS_Y = 1; + /** + * index of the Z axis + */ public static final int AXIS_Z = 2; private static ThreadLocal>> pQueueTL = new ThreadLocal>>() { @@ -129,14 +140,41 @@ public class PhysicsSpace { private Map physicsBodies = new ConcurrentHashMap(); private Map physicsJoints = new ConcurrentHashMap(); private Map physicsVehicles = new ConcurrentHashMap(); + /** + * map from collision groups to registered group listeners + */ private Map collisionGroupListeners = new ConcurrentHashMap(); + /** + * queue of registered tick listeners + */ private ConcurrentLinkedQueue tickListeners = new ConcurrentLinkedQueue(); - private ArrayList collisionListeners = new ArrayList(); + /** + * list of registered collision listeners + */ + final private List collisionListeners + = new SafeArrayList<>(PhysicsCollisionListener.class); + /** + * queue of collision events not yet distributed to listeners + */ private ArrayDeque collisionEvents = new ArrayDeque(); private PhysicsCollisionEventFactory eventFactory = new PhysicsCollisionEventFactory(); + /** + * copy of minimum coordinate values when using AXIS_SWEEP broadphase + * algorithms + */ private Vector3f worldMin = new Vector3f(-10000f, -10000f, -10000f); + /** + * copy of maximum coordinate values when using AXIS_SWEEP broadphase + * algorithms + */ private Vector3f worldMax = new Vector3f(10000f, 10000f, 10000f); + /** + * physics time step (in seconds, >0) + */ private float accuracy = 1f / 60f; + /** + * maximum number of physics steps per frame (≥0, default=4) + */ private int maxSubSteps = 4; private javax.vecmath.Vector3f rayVec1 = new javax.vecmath.Vector3f(); private javax.vecmath.Vector3f rayVec2 = new javax.vecmath.Vector3f(); @@ -227,7 +265,7 @@ public class PhysicsSpace { collides = (bp1.collisionFilterGroup & bp.collisionFilterMask) != 0; } if (collides) { - assert (bp.clientObject instanceof com.bulletphysics.collision.dispatch.CollisionObject && bp.clientObject instanceof com.bulletphysics.collision.dispatch.CollisionObject); + assert (bp.clientObject instanceof com.bulletphysics.collision.dispatch.CollisionObject && bp1.clientObject instanceof com.bulletphysics.collision.dispatch.CollisionObject); com.bulletphysics.collision.dispatch.CollisionObject colOb = (com.bulletphysics.collision.dispatch.CollisionObject) bp.clientObject; com.bulletphysics.collision.dispatch.CollisionObject colOb1 = (com.bulletphysics.collision.dispatch.CollisionObject) bp1.clientObject; assert (colOb.getUserPointer() != null && colOb1.getUserPointer() != null); @@ -827,7 +865,7 @@ public class PhysicsSpace { * when the fps is below the physics fps. Doing this maintains determinism in physics. * For example a maximum number of 2 can compensate for framerates as low as 30fps * when the physics has the default accuracy of 60 fps. Note that setting this - * value too high can make the physics drive down its own fps in case its overloaded. + * value too high can make the physics drive down its own fps in case it's overloaded. * @param steps The maximum number of extra steps, default is 4. */ public void setMaxSubSteps(int steps) { diff --git a/jme3-jbullet/src/main/java/com/jme3/bullet/collision/PhysicsCollisionObject.java b/jme3-jbullet/src/main/java/com/jme3/bullet/collision/PhysicsCollisionObject.java index 0416799b8..56769e61c 100644 --- a/jme3-jbullet/src/main/java/com/jme3/bullet/collision/PhysicsCollisionObject.java +++ b/jme3-jbullet/src/main/java/com/jme3/bullet/collision/PhysicsCollisionObject.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -93,7 +93,7 @@ public abstract class PhysicsCollisionObject implements Savable { * Sets the collision group number for this physics object.
    * The groups are integer bit masks and some pre-made variables are available in CollisionObject. * All physics objects are by default in COLLISION_GROUP_01.
    - * Two object will collide when one of the partys has the + * Two object will collide when one of the parties has the * collisionGroup of the other in its collideWithGroups set. * @param collisionGroup the collisionGroup to set */ @@ -103,7 +103,7 @@ public abstract class PhysicsCollisionObject implements Savable { /** * Add a group that this object will collide with.
    - * Two object will collide when one of the partys has the + * Two object will collide when one of the parties has the * collisionGroup of the other in its collideWithGroups set.
    * @param collisionGroup */ diff --git a/jme3-jbullet/src/main/java/com/jme3/bullet/joints/ConeJoint.java b/jme3-jbullet/src/main/java/com/jme3/bullet/joints/ConeJoint.java index 45afa9d1a..d5c13dc66 100644 --- a/jme3-jbullet/src/main/java/com/jme3/bullet/joints/ConeJoint.java +++ b/jme3-jbullet/src/main/java/com/jme3/bullet/joints/ConeJoint.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -45,7 +45,7 @@ import java.io.IOException; /** * From bullet manual:
    - * To create ragdolls, the conve twist constraint is very useful for limbs like the upper arm. + * To create ragdolls, the cone twist constraint is very useful for limbs like the upper arm. * It is a special point to point constraint that adds cone and twist axis limits. * The x-axis serves as twist axis. * @author normenhansen diff --git a/jme3-jbullet/src/main/java/com/jme3/bullet/joints/HingeJoint.java b/jme3-jbullet/src/main/java/com/jme3/bullet/joints/HingeJoint.java index 96dea1d72..f32f0193a 100644 --- a/jme3-jbullet/src/main/java/com/jme3/bullet/joints/HingeJoint.java +++ b/jme3-jbullet/src/main/java/com/jme3/bullet/joints/HingeJoint.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -99,7 +99,7 @@ public class HingeJoint extends PhysicsJoint { * @param high the high limit in radians. * @param _softness the factor at which the velocity error correction starts operating,i.e a softness of 0.9 means that the vel. corr starts at 90% of the limit range. * @param _biasFactor the magnitude of the position correction. It tells you how strictly the position error (drift ) is corrected. - * @param _relaxationFactor the rate at which velocity errors are corrected. This can be seen as the strength of the limits. A low value will make the the limits more spongy. + * @param _relaxationFactor the rate at which velocity errors are corrected. This can be seen as the strength of the limits. A low value will make the limits more spongy. */ public void setLimit(float low, float high, float _softness, float _biasFactor, float _relaxationFactor) { biasFactor = _biasFactor; @@ -172,5 +172,6 @@ public class HingeJoint extends PhysicsJoint { constraint = new HingeConstraint(nodeA.getObjectId(), nodeB.getObjectId(), Converter.convert(pivotA), Converter.convert(pivotB), Converter.convert(axisA), Converter.convert(axisB)); + ((HingeConstraint) constraint).setAngularOnly(angularOnly); } } diff --git a/jme3-jbullet/src/main/java/com/jme3/bullet/objects/PhysicsCharacter.java b/jme3-jbullet/src/main/java/com/jme3/bullet/objects/PhysicsCharacter.java index c057d99d2..1d7f54038 100644 --- a/jme3-jbullet/src/main/java/com/jme3/bullet/objects/PhysicsCharacter.java +++ b/jme3-jbullet/src/main/java/com/jme3/bullet/objects/PhysicsCharacter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -169,6 +169,26 @@ public class PhysicsCharacter extends PhysicsCollisionObject { return character.getMaxSlope(); } + /** + * Enable/disable this body's contact response. + * + * @param newState true to respond to contacts (default=true) + */ + public void setContactResponse(boolean newState) { + if (!newState) { + throw new UnsupportedOperationException("Not implemented."); + } + } + + /** + * Test whether this body responds to contacts. + * + * @return true if responsive, otherwise false + */ + public boolean isContactResponse() { + return true; + } + public boolean onGround() { return character.onGround(); } @@ -279,6 +299,7 @@ public class PhysicsCharacter extends PhysicsCollisionObject { buildObject(); character = new KinematicCharacterController(gObject, (ConvexShape) collisionShape.getCShape(), stepHeight); setGravity(capsule.readFloat("gravity", 9.8f * 3)); + setContactResponse(capsule.readBoolean("contactResponse", true)); setMaxSlope(capsule.readFloat("maxSlope", 1.0f)); setFallSpeed(capsule.readFloat("fallSpeed", 55.0f)); setJumpSpeed(capsule.readFloat("jumpSpeed", 10.0f)); diff --git a/jme3-jbullet/src/main/java/com/jme3/bullet/objects/PhysicsRigidBody.java b/jme3-jbullet/src/main/java/com/jme3/bullet/objects/PhysicsRigidBody.java index 6798c63fd..2d318e97c 100644 --- a/jme3-jbullet/src/main/java/com/jme3/bullet/objects/PhysicsRigidBody.java +++ b/jme3-jbullet/src/main/java/com/jme3/bullet/objects/PhysicsRigidBody.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -276,6 +276,26 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { return kinematic; } + /** + * Enable/disable this body's contact response. + * + * @param newState true to respond to contacts (default=true) + */ + public void setContactResponse(boolean newState) { + if (!newState) { + throw new UnsupportedOperationException("Not implemented."); + } + } + + /** + * Test whether this body responds to contacts. + * + * @return true if responsive, otherwise false + */ + public boolean isContactResponse() { + return true; + } + public void setCcdSweptSphereRadius(float radius) { rBody.setCcdSweptSphereRadius(radius); } @@ -614,6 +634,12 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { rBody.destroy(); } + /** + * Serialize this body, for example when saving to a J3O file. + * + * @param e exporter (not null) + * @throws IOException from exporter + */ @Override public void write(JmeExporter e) throws IOException { super.write(e); @@ -637,10 +663,18 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { capsule.write(getPhysicsLocation(new Vector3f()), "physicsLocation", new Vector3f()); capsule.write(getPhysicsRotationMatrix(new Matrix3f()), "physicsRotation", new Matrix3f()); + capsule.write(getLinearVelocity(), "linearVelocity", null); + capsule.write(getAngularVelocity(), "angularVelocity", null); capsule.writeSavableArrayList(joints, "joints", null); } + /** + * De-serialize this body, for example when loading from a J3O file. + * + * @param e importer (not null) + * @throws IOException from importer + */ @Override public void read(JmeImporter e) throws IOException { super.read(e); @@ -650,6 +684,7 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { this.mass = mass; rebuildRigidBody(); setGravity((Vector3f) capsule.readSavable("gravity", Vector3f.ZERO.clone())); + setContactResponse(capsule.readBoolean("contactResponse", true)); setFriction(capsule.readFloat("friction", 0.5f)); setKinematic(capsule.readBoolean("kinematic", false)); @@ -662,6 +697,8 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { setPhysicsLocation((Vector3f) capsule.readSavable("physicsLocation", new Vector3f())); setPhysicsRotation((Matrix3f) capsule.readSavable("physicsRotation", new Matrix3f())); + setLinearVelocity((Vector3f) capsule.readSavable("linearVelocity", new Vector3f())); + setAngularVelocity((Vector3f) capsule.readSavable("angularVelocity", new Vector3f())); joints = capsule.readSavableArrayList("joints", null); } diff --git a/jme3-jbullet/src/main/java/com/jme3/bullet/objects/PhysicsVehicle.java b/jme3-jbullet/src/main/java/com/jme3/bullet/objects/PhysicsVehicle.java index 3d5463421..b21fa698c 100644 --- a/jme3-jbullet/src/main/java/com/jme3/bullet/objects/PhysicsVehicle.java +++ b/jme3-jbullet/src/main/java/com/jme3/bullet/objects/PhysicsVehicle.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -275,8 +275,8 @@ public class PhysicsVehicle extends PhysicsRigidBody { } /** - * This vaue caps the maximum suspension force, raise this above the default 6000 if your suspension cannot - * handle the weight of your vehcile. + * This value caps the maximum suspension force, raise this above the default 6000 if your suspension cannot + * handle the weight of your vehicle. * @param maxSuspensionForce */ public void setMaxSuspensionForce(float maxSuspensionForce) { @@ -284,8 +284,8 @@ public class PhysicsVehicle extends PhysicsRigidBody { } /** - * This vaue caps the maximum suspension force, raise this above the default 6000 if your suspension cannot - * handle the weight of your vehcile. + * This value caps the maximum suspension force, raise this above the default 6000 if your suspension cannot + * handle the weight of your vehicle. * @param wheel * @param maxSuspensionForce */ diff --git a/jme3-jbullet/src/main/java/com/jme3/bullet/objects/VehicleWheel.java b/jme3-jbullet/src/main/java/com/jme3/bullet/objects/VehicleWheel.java index efcb79ec7..789e0c682 100644 --- a/jme3-jbullet/src/main/java/com/jme3/bullet/objects/VehicleWheel.java +++ b/jme3-jbullet/src/main/java/com/jme3/bullet/objects/VehicleWheel.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -237,7 +237,7 @@ public class VehicleWheel implements Savable { /** * The maximum suspension force, raise this above the default 6000 if your suspension cannot - * handle the weight of your vehcile. + * handle the weight of your vehicle. * @param maxSuspensionForce */ public void setMaxSuspensionForce(float maxSuspensionForce) { diff --git a/jme3-jogg/src/main/java/com/jme3/audio/plugins/OGGLoader.java b/jme3-jogg/src/main/java/com/jme3/audio/plugins/OGGLoader.java index 8b0006182..2302c5f4e 100644 --- a/jme3-jogg/src/main/java/com/jme3/audio/plugins/OGGLoader.java +++ b/jme3-jogg/src/main/java/com/jme3/audio/plugins/OGGLoader.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -152,7 +152,7 @@ public class OGGLoader implements AssetLoader { // HACK: Reload the logical and vorbis streams from scratch // based on the existing ogg page data. // This fixes an audio discontinuity issue when looping - // an streaming OGG file via setTime(0). + // a streaming OGG file via setTime(0). ls = ((CachedOggStream) ps).reloadLogicalOggStream(); vs = new VorbisStream(ls); endOfStream = false; diff --git a/jme3-jogl/src/main/java/com/jme3/renderer/jogl/JoglGL.java b/jme3-jogl/src/main/java/com/jme3/renderer/jogl/JoglGL.java index e6435e5c5..545bd9c64 100644 --- a/jme3-jogl/src/main/java/com/jme3/renderer/jogl/JoglGL.java +++ b/jme3-jogl/src/main/java/com/jme3/renderer/jogl/JoglGL.java @@ -4,12 +4,11 @@ import com.jme3.renderer.RendererException; import com.jme3.renderer.opengl.GL; import com.jme3.renderer.opengl.GL2; import com.jme3.renderer.opengl.GL3; - -import java.nio.*; - import com.jme3.renderer.opengl.GL4; import com.jogamp.opengl.GLContext; +import java.nio.*; + public class JoglGL implements GL, GL2, GL3, GL4 { private static int getLimitBytes(ByteBuffer buffer) { @@ -628,10 +627,36 @@ public class JoglGL implements GL, GL2, GL3, GL4 { public void glPatchParameter(int count) { GLContext.getCurrentGL().getGL3().glPatchParameteri(com.jogamp.opengl.GL3.GL_PATCH_VERTICES, count); } - + @Override public void glDeleteVertexArrays(IntBuffer arrays) { checkLimit(arrays); GLContext.getCurrentGL().getGL2ES3().glDeleteVertexArrays(arrays.limit(), arrays); } + + @Override + public int glGetUniformBlockIndex(final int program, final String uniformBlockName) { + return GLContext.getCurrentGL().getGL3bc().glGetUniformBlockIndex(program, uniformBlockName); + } + + @Override + public void glBindBufferBase(final int target, final int index, final int buffer) { + GLContext.getCurrentGL().getGL3bc().glBindBufferBase(target, index, buffer); + } + + @Override + public int glGetProgramResourceIndex(final int program, final int programInterface, final String name) { + throw new UnsupportedOperationException(); + //return GLContext.getCurrentGL().getGL4bc().glGetProgramResourceIndex(program, programInterface, name); + } + + @Override + public void glShaderStorageBlockBinding(final int program, final int storageBlockIndex, final int storageBlockBinding) { + GLContext.getCurrentGL().getGL4bc().glShaderStorageBlockBinding(program, storageBlockIndex, storageBlockBinding); + } + + @Override + public void glUniformBlockBinding(final int program, final int uniformBlockIndex, final int uniformBlockBinding) { + GLContext.getCurrentGL().getGL3bc().glUniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding); + } } diff --git a/jme3-jogl/src/main/java/com/jme3/renderer/jogl/TextureUtil.java b/jme3-jogl/src/main/java/com/jme3/renderer/jogl/TextureUtil.java index 8f3c5b156..17bf21bfd 100644 --- a/jme3-jogl/src/main/java/com/jme3/renderer/jogl/TextureUtil.java +++ b/jme3-jogl/src/main/java/com/jme3/renderer/jogl/TextureUtil.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -294,7 +294,7 @@ public class TextureUtil { int[] mipSizes = image.getMipMapSizes(); int pos = 0; - // TODO: Remove unneccessary allocation + // TODO: Remove unnecessary allocation if (mipSizes == null){ if (data != null) mipSizes = new int[]{ data.capacity() }; @@ -473,7 +473,7 @@ public class TextureUtil { int[] mipSizes = image.getMipMapSizes(); int pos = 0; - // TODO: Remove unneccessary allocation + // TODO: Remove unnecessary allocation if (mipSizes == null){ if (data != null) { mipSizes = new int[]{ data.capacity() }; diff --git a/jme3-lwjgl/src/main/java/com/jme3/input/lwjgl/LwjglMouseInput.java b/jme3-lwjgl/src/main/java/com/jme3/input/lwjgl/LwjglMouseInput.java index f3982fd25..b53d93660 100644 --- a/jme3-lwjgl/src/main/java/com/jme3/input/lwjgl/LwjglMouseInput.java +++ b/jme3-lwjgl/src/main/java/com/jme3/input/lwjgl/LwjglMouseInput.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -85,6 +85,10 @@ public class LwjglMouseInput implements MouseInput { } catch (LWJGLException ex) { logger.log(Level.SEVERE, "Error while creating mouse", ex); } + + if (listener != null) { + sendFirstMouseEvent(); + } } public boolean isInitialized(){ @@ -158,8 +162,32 @@ public class LwjglMouseInput implements MouseInput { Mouse.setGrabbed(!visible); } + @Override public void setInputListener(RawInputListener listener) { this.listener = listener; + if (listener != null && Mouse.isCreated()) { + sendFirstMouseEvent(); + } + } + + /** + * Send the input listener a special mouse-motion event with zero deltas in + * order to initialize the listener's cursor position. + */ + private void sendFirstMouseEvent() { + assert listener != null; + assert Mouse.isCreated(); + + int x = Mouse.getX(); + int y = Mouse.getY(); + int xDelta = 0; + int yDelta = 0; + int wheelDelta = 0; + MouseMotionEvent evt = new MouseMotionEvent(x, y, xDelta, yDelta, + curWheel, wheelDelta); + evt.setTime(Mouse.getEventNanoseconds()); + + listener.onMouseMotionEvent(evt); } public long getInputTimeNanos() { diff --git a/jme3-lwjgl/src/main/java/com/jme3/renderer/lwjgl/LwjglGL.java b/jme3-lwjgl/src/main/java/com/jme3/renderer/lwjgl/LwjglGL.java index 5a74e06f0..bca6d0dbb 100644 --- a/jme3-lwjgl/src/main/java/com/jme3/renderer/lwjgl/LwjglGL.java +++ b/jme3-lwjgl/src/main/java/com/jme3/renderer/lwjgl/LwjglGL.java @@ -4,16 +4,12 @@ import com.jme3.renderer.RendererException; import com.jme3.renderer.opengl.GL; import com.jme3.renderer.opengl.GL2; import com.jme3.renderer.opengl.GL3; -import java.nio.Buffer; -import java.nio.ByteBuffer; -import java.nio.FloatBuffer; -import java.nio.IntBuffer; -import java.nio.ShortBuffer; - import com.jme3.renderer.opengl.GL4; import com.jme3.util.BufferUtils; import org.lwjgl.opengl.*; +import java.nio.*; + public final class LwjglGL implements GL, GL2, GL3, GL4 { IntBuffer tmpBuff = BufferUtils.createIntBuffer(1); @@ -487,10 +483,35 @@ public final class LwjglGL implements GL, GL2, GL3, GL4 { public void glPatchParameter(int count) { GL40.glPatchParameteri(GL40.GL_PATCH_VERTICES,count); } - + + @Override + public int glGetProgramResourceIndex(final int program, final int programInterface, final String name) { + return GL43.glGetProgramResourceIndex(program, programInterface, name); + } + + @Override + public void glShaderStorageBlockBinding(final int program, final int storageBlockIndex, final int storageBlockBinding) { + GL43.glShaderStorageBlockBinding(program, storageBlockIndex, storageBlockBinding); + } + @Override public void glDeleteVertexArrays(IntBuffer arrays) { checkLimit(arrays); ARBVertexArrayObject.glDeleteVertexArrays(arrays); } + + @Override + public int glGetUniformBlockIndex(final int program, final String uniformBlockName) { + return GL31.glGetUniformBlockIndex(program, uniformBlockName); + } + + @Override + public void glBindBufferBase(final int target, final int index, final int buffer) { + GL30.glBindBufferBase(target, index, buffer); + } + + @Override + public void glUniformBlockBinding(final int program, final int uniformBlockIndex, final int uniformBlockBinding) { + GL31.glUniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding); + } } diff --git a/jme3-lwjgl/src/main/java/com/jme3/system/lwjgl/LwjglAbstractDisplay.java b/jme3-lwjgl/src/main/java/com/jme3/system/lwjgl/LwjglAbstractDisplay.java index 802b12a0f..e019008f2 100644 --- a/jme3-lwjgl/src/main/java/com/jme3/system/lwjgl/LwjglAbstractDisplay.java +++ b/jme3-lwjgl/src/main/java/com/jme3/system/lwjgl/LwjglAbstractDisplay.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -66,13 +66,13 @@ public abstract class LwjglAbstractDisplay extends LwjglContext implements Runna public abstract Type getType(); /** - * Set the title if its a windowed display + * Set the title if it's a windowed display * @param title */ public abstract void setTitle(String title); /** - * Restart if its a windowed or full-screen display. + * Restart if it's a windowed or full-screen display. */ public abstract void restart(); diff --git a/jme3-lwjgl/src/main/java/com/jme3/system/lwjgl/LwjglSmoothingTimer.java b/jme3-lwjgl/src/main/java/com/jme3/system/lwjgl/LwjglSmoothingTimer.java index bd2e275ed..213d472c5 100644 --- a/jme3-lwjgl/src/main/java/com/jme3/system/lwjgl/LwjglSmoothingTimer.java +++ b/jme3-lwjgl/src/main/java/com/jme3/system/lwjgl/LwjglSmoothingTimer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -76,7 +76,7 @@ public class LwjglSmoothingTimer extends Timer { /** * Constructor builds a Timer object. All values will be - * initialized to it's default values. + * initialized to its default values. */ public LwjglSmoothingTimer() { reset(); @@ -144,7 +144,7 @@ public class LwjglSmoothingTimer extends Timer { if ( oldTime == -1 ) { // For the first frame use 60 fps. This value will not be counted in further averages. // This is done so initialization code between creating the timer and the first - // frame is not counted as a single frame on it's own. + // frame is not counted as a single frame on its own. lastTPF = 1 / 60f; lastFPS = 1f / lastTPF; return; diff --git a/jme3-lwjgl/src/main/java/com/jme3/system/lwjgl/LwjglTimer.java b/jme3-lwjgl/src/main/java/com/jme3/system/lwjgl/LwjglTimer.java index 6adf03323..fb69a5550 100644 --- a/jme3-lwjgl/src/main/java/com/jme3/system/lwjgl/LwjglTimer.java +++ b/jme3-lwjgl/src/main/java/com/jme3/system/lwjgl/LwjglTimer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -63,7 +63,7 @@ public class LwjglTimer extends Timer { /** * Constructor builds a Timer object. All values will be - * initialized to it's default values. + * initialized to its default values. */ public LwjglTimer() { reset(); diff --git a/jme3-lwjgl3/build.gradle b/jme3-lwjgl3/build.gradle index 785ce75de..0ac0a55d2 100644 --- a/jme3-lwjgl3/build.gradle +++ b/jme3-lwjgl3/build.gradle @@ -2,7 +2,7 @@ if (!hasProperty('mainClass')) { ext.mainClass = '' } -def lwjglVersion = '3.1.2' +def lwjglVersion = '3.1.6' sourceCompatibility = '1.8' diff --git a/jme3-lwjgl3/src/main/java/com/jme3/audio/lwjgl/LwjglAL.java b/jme3-lwjgl3/src/main/java/com/jme3/audio/lwjgl/LwjglAL.java index 313bdd5ee..1b1ae2a4b 100644 --- a/jme3-lwjgl3/src/main/java/com/jme3/audio/lwjgl/LwjglAL.java +++ b/jme3-lwjgl3/src/main/java/com/jme3/audio/lwjgl/LwjglAL.java @@ -31,8 +31,6 @@ */package com.jme3.audio.lwjgl; import com.jme3.audio.openal.AL; -import com.jme3.system.NativeLibraryLoader; -import com.jme3.system.Platform; import org.lwjgl.openal.AL10; import org.lwjgl.openal.AL11; @@ -40,101 +38,123 @@ import java.nio.ByteBuffer; import java.nio.FloatBuffer; import java.nio.IntBuffer; +/** + * The LWJGL implementation of {@link AL}. + */ public final class LwjglAL implements AL { public LwjglAL() { } - public String alGetString(int parameter) { + @Override + public String alGetString(final int parameter) { return AL10.alGetString(parameter); } + @Override public int alGenSources() { return AL10.alGenSources(); } + @Override public int alGetError() { return AL10.alGetError(); } - public void alDeleteSources(int numSources, IntBuffer sources) { + @Override + public void alDeleteSources(final int numSources, final IntBuffer sources) { if (sources.position() != 0) throw new AssertionError(); if (sources.limit() != numSources) throw new AssertionError(); AL10.alDeleteSources(sources); } - public void alGenBuffers(int numBuffers, IntBuffer buffers) { + @Override + public void alGenBuffers(final int numBuffers, final IntBuffer buffers) { if (buffers.position() != 0) throw new AssertionError(); if (buffers.limit() != numBuffers) throw new AssertionError(); AL10.alGenBuffers(buffers); } - public void alDeleteBuffers(int numBuffers, IntBuffer buffers) { + @Override + public void alDeleteBuffers(final int numBuffers, final IntBuffer buffers) { if (buffers.position() != 0) throw new AssertionError(); if (buffers.limit() != numBuffers) throw new AssertionError(); AL10.alDeleteBuffers(buffers); } - public void alSourceStop(int source) { + @Override + public void alSourceStop(final int source) { AL10.alSourceStop(source); } - public void alSourcei(int source, int param, int value) { + @Override + public void alSourcei(final int source, final int param, final int value) { AL10.alSourcei(source, param, value); } - public void alBufferData(int buffer, int format, ByteBuffer data, int size, int frequency) { + @Override + public void alBufferData(final int buffer, final int format, final ByteBuffer data, final int size, final int frequency) { if (data.position() != 0) throw new AssertionError(); if (data.limit() != size) throw new AssertionError(); AL10.alBufferData(buffer, format, data, frequency); } - public void alSourcePlay(int source) { + @Override + public void alSourcePlay(final int source) { AL10.alSourcePlay(source); } - public void alSourcePause(int source) { + @Override + public void alSourcePause(final int source) { AL10.alSourcePause(source); } - public void alSourcef(int source, int param, float value) { + @Override + public void alSourcef(final int source, final int param, final float value) { AL10.alSourcef(source, param, value); } - public void alSource3f(int source, int param, float value1, float value2, float value3) { + @Override + public void alSource3f(final int source, final int param, final float value1, final float value2, final float value3) { AL10.alSource3f(source, param, value1, value2, value3); } - public int alGetSourcei(int source, int param) { + @Override + public int alGetSourcei(final int source, final int param) { return AL10.alGetSourcei(source, param); } - public void alSourceUnqueueBuffers(int source, int numBuffers, IntBuffer buffers) { + @Override + public void alSourceUnqueueBuffers(final int source, final int numBuffers, final IntBuffer buffers) { if (buffers.position() != 0) throw new AssertionError(); if (buffers.limit() != numBuffers) throw new AssertionError(); AL10.alSourceUnqueueBuffers(source, buffers); } - public void alSourceQueueBuffers(int source, int numBuffers, IntBuffer buffers) { + @Override + public void alSourceQueueBuffers(final int source, final int numBuffers, final IntBuffer buffers) { if (buffers.position() != 0) throw new AssertionError(); if (buffers.limit() != numBuffers) throw new AssertionError(); AL10.alSourceQueueBuffers(source, buffers); } - public void alListener(int param, FloatBuffer data) { + @Override + public void alListener(final int param, final FloatBuffer data) { AL10.alListenerfv(param, data); } - public void alListenerf(int param, float value) { + @Override + public void alListenerf(final int param, final float value) { AL10.alListenerf(param, value); } - public void alListener3f(int param, float value1, float value2, float value3) { + @Override + public void alListener3f(final int param, final float value1, final float value2, final float value3) { AL10.alListener3f(param, value1, value2, value3); } - public void alSource3i(int source, int param, int value1, int value2, int value3) { + @Override + public void alSource3i(final int source, final int param, final int value1, final int value2, final int value3) { AL11.alSource3i(source, param, value1, value2, value3); } - } diff --git a/jme3-lwjgl3/src/main/java/com/jme3/audio/lwjgl/LwjglALC.java b/jme3-lwjgl3/src/main/java/com/jme3/audio/lwjgl/LwjglALC.java index cd4e428c0..71add8c6e 100644 --- a/jme3-lwjgl3/src/main/java/com/jme3/audio/lwjgl/LwjglALC.java +++ b/jme3-lwjgl3/src/main/java/com/jme3/audio/lwjgl/LwjglALC.java @@ -31,19 +31,27 @@ */ package com.jme3.audio.lwjgl; +import org.lwjgl.openal.*; + import java.nio.ByteBuffer; import java.nio.IntBuffer; -import org.lwjgl.openal.AL; -import org.lwjgl.openal.ALC; -import org.lwjgl.openal.ALC10; -import org.lwjgl.openal.ALCCapabilities; -import org.lwjgl.openal.SOFTPauseDevice; +/** + * The LWJGL implementation of {@link com.jme3.audio.openal.ALC}. + */ public class LwjglALC implements com.jme3.audio.openal.ALC { + /** + * The device id. + */ private long device; + + /** + * The context id. + */ private long context; + @Override public void createALC() { device = ALC10.alcOpenDevice((ByteBuffer) null); ALCCapabilities deviceCaps = ALC.createCapabilities(device); @@ -52,6 +60,7 @@ public class LwjglALC implements com.jme3.audio.openal.ALC { AL.createCapabilities(deviceCaps); } + @Override public void destroyALC() { if (context != 0) { ALC10.alcDestroyContext(context); @@ -64,18 +73,22 @@ public class LwjglALC implements com.jme3.audio.openal.ALC { } } + @Override public boolean isCreated() { return context != 0; } + @Override public String alcGetString(final int parameter) { return ALC10.alcGetString(device, parameter); } + @Override public boolean alcIsExtensionPresent(final String extension) { return ALC10.alcIsExtensionPresent(device, extension); } + @Override public void alcGetInteger(final int param, final IntBuffer buffer, final int size) { if (buffer.position() != 0) { throw new AssertionError(); @@ -86,12 +99,13 @@ public class LwjglALC implements com.jme3.audio.openal.ALC { ALC10.alcGetIntegerv(device, param, buffer); } + @Override public void alcDevicePauseSOFT() { SOFTPauseDevice.alcDevicePauseSOFT(device); } + @Override public void alcDeviceResumeSOFT() { SOFTPauseDevice.alcDeviceResumeSOFT(device); } - } diff --git a/jme3-lwjgl3/src/main/java/com/jme3/audio/lwjgl/LwjglEFX.java b/jme3-lwjgl3/src/main/java/com/jme3/audio/lwjgl/LwjglEFX.java index ecd67211f..2f143a6de 100644 --- a/jme3-lwjgl3/src/main/java/com/jme3/audio/lwjgl/LwjglEFX.java +++ b/jme3-lwjgl3/src/main/java/com/jme3/audio/lwjgl/LwjglEFX.java @@ -36,62 +36,75 @@ import org.lwjgl.openal.EXTEfx; import java.nio.IntBuffer; +/** + * The LWJGL implementation of {@link EFX}. + */ public class LwjglEFX implements EFX { - public void alGenAuxiliaryEffectSlots(int numSlots, IntBuffer buffers) { + @Override + public void alGenAuxiliaryEffectSlots(final int numSlots, final IntBuffer buffers) { if (buffers.position() != 0) throw new AssertionError(); if (buffers.limit() != numSlots) throw new AssertionError(); EXTEfx.alGenAuxiliaryEffectSlots(buffers); } - public void alGenEffects(int numEffects, IntBuffer buffers) { + @Override + public void alGenEffects(final int numEffects, final IntBuffer buffers) { if (buffers.position() != 0) throw new AssertionError(); if (buffers.limit() != numEffects) throw new AssertionError(); EXTEfx.alGenEffects(buffers); } - public void alEffecti(int effect, int param, int value) { + @Override + public void alEffecti(final int effect, final int param, final int value) { EXTEfx.alEffecti(effect, param, value); } - public void alAuxiliaryEffectSloti(int effectSlot, int param, int value) { + @Override + public void alAuxiliaryEffectSloti(final int effectSlot, final int param, final int value) { EXTEfx.alAuxiliaryEffectSloti(effectSlot, param, value); } - public void alDeleteEffects(int numEffects, IntBuffer buffers) { + @Override + public void alDeleteEffects(final int numEffects, final IntBuffer buffers) { if (buffers.position() != 0) throw new AssertionError(); if (buffers.limit() != numEffects) throw new AssertionError(); EXTEfx.alDeleteEffects(buffers); } - public void alDeleteAuxiliaryEffectSlots(int numEffectSlots, IntBuffer buffers) { + @Override + public void alDeleteAuxiliaryEffectSlots(final int numEffectSlots, final IntBuffer buffers) { if (buffers.position() != 0) throw new AssertionError(); if (buffers.limit() != numEffectSlots) throw new AssertionError(); EXTEfx.alDeleteAuxiliaryEffectSlots(buffers); } - public void alGenFilters(int numFilters, IntBuffer buffers) { + @Override + public void alGenFilters(final int numFilters, final IntBuffer buffers) { if (buffers.position() != 0) throw new AssertionError(); if (buffers.limit() != numFilters) throw new AssertionError(); EXTEfx.alGenFilters(buffers); } - public void alFilteri(int filter, int param, int value) { + @Override + public void alFilteri(final int filter, final int param, final int value) { EXTEfx.alFilteri(filter, param, value); } - public void alFilterf(int filter, int param, float value) { + @Override + public void alFilterf(final int filter, final int param, final float value) { EXTEfx.alFilterf(filter, param, value); } - public void alDeleteFilters(int numFilters, IntBuffer buffers) { + @Override + public void alDeleteFilters(final int numFilters, final IntBuffer buffers) { if (buffers.position() != 0) throw new AssertionError(); if (buffers.limit() != numFilters) throw new AssertionError(); EXTEfx.alDeleteFilters(buffers); } - public void alEffectf(int effect, int param, float value) { + @Override + public void alEffectf(final int effect, final int param, final float value) { EXTEfx.alEffectf(effect, param, value); } - } diff --git a/jme3-lwjgl3/src/main/java/com/jme3/input/lwjgl/GlfwJoystickInput.java b/jme3-lwjgl3/src/main/java/com/jme3/input/lwjgl/GlfwJoystickInput.java index 764b38379..d8d61805c 100644 --- a/jme3-lwjgl3/src/main/java/com/jme3/input/lwjgl/GlfwJoystickInput.java +++ b/jme3-lwjgl3/src/main/java/com/jme3/input/lwjgl/GlfwJoystickInput.java @@ -34,17 +34,16 @@ package com.jme3.input.lwjgl; import com.jme3.input.*; import com.jme3.input.event.JoyAxisEvent; import com.jme3.input.event.JoyButtonEvent; -import org.lwjgl.opengl.GL11; - import java.nio.ByteBuffer; import java.nio.FloatBuffer; import java.util.HashMap; import java.util.Map; import java.util.logging.Logger; - import static org.lwjgl.glfw.GLFW.*; /** + * The LWJGL implementation of {@link JoyInput}. + * * @author Daniel Johansson (dannyjo) * @since 3.1 */ @@ -52,11 +51,13 @@ public class GlfwJoystickInput implements JoyInput { private static final Logger LOGGER = Logger.getLogger(InputManager.class.getName()); - private boolean initialized = false; private RawInputListener listener; - private Map joysticks = new HashMap(); + private final Map joysticks = new HashMap<>(); - public void setJoyRumble(int joyId, float amount) { + private boolean initialized = false; + + @Override + public void setJoyRumble(final int joyId, final float amount) { if (joyId >= joysticks.size()) { throw new IllegalArgumentException(); } @@ -111,10 +112,12 @@ public class GlfwJoystickInput implements JoyInput { return String.valueOf(index); } + @Override public void initialize() { initialized = true; } + @Override public void update() { for (final Map.Entry entry : joysticks.entrySet()) { // Axes @@ -135,18 +138,22 @@ public class GlfwJoystickInput implements JoyInput { } } + @Override public void destroy() { initialized = false; } + @Override public boolean isInitialized() { return initialized; } - public void setInputListener(RawInputListener listener) { + @Override + public void setInputListener(final RawInputListener listener) { this.listener = listener; } + @Override public long getInputTimeNanos() { return 0; } @@ -156,7 +163,7 @@ public class GlfwJoystickInput implements JoyInput { private JoystickAxis povAxisX; private JoystickAxis povAxisY; - public GlfwJoystick(InputManager inputManager, JoyInput joyInput, int joyId, String name) { + public GlfwJoystick(final InputManager inputManager, final JoyInput joyInput, final int joyId, final String name) { super(inputManager, joyInput, joyId, name); } @@ -171,7 +178,7 @@ public class GlfwJoystickInput implements JoyInput { } @Override - protected void addButton(JoystickButton button) { + protected void addButton(final JoystickButton button) { super.addButton(button); } diff --git a/jme3-lwjgl3/src/main/java/com/jme3/input/lwjgl/GlfwKeyInput.java b/jme3-lwjgl3/src/main/java/com/jme3/input/lwjgl/GlfwKeyInput.java index 971ee98fc..b8049a8f8 100644 --- a/jme3-lwjgl3/src/main/java/com/jme3/input/lwjgl/GlfwKeyInput.java +++ b/jme3-lwjgl3/src/main/java/com/jme3/input/lwjgl/GlfwKeyInput.java @@ -36,45 +36,61 @@ import com.jme3.input.KeyInput; import com.jme3.input.RawInputListener; import com.jme3.input.event.KeyInputEvent; import com.jme3.system.lwjgl.LwjglWindow; - -import org.lwjgl.glfw.GLFWCharCallback; -import org.lwjgl.glfw.GLFWKeyCallback; - -import java.util.LinkedList; +import java.util.ArrayDeque; import java.util.Queue; import java.util.logging.Logger; +import static org.lwjgl.glfw.GLFW.*; +import org.lwjgl.glfw.GLFWCharCallback; +import org.lwjgl.glfw.GLFWKeyCallback; -import static org.lwjgl.glfw.GLFW.GLFW_KEY_LAST; -import static org.lwjgl.glfw.GLFW.GLFW_KEY_SPACE; -import static org.lwjgl.glfw.GLFW.GLFW_PRESS; -import static org.lwjgl.glfw.GLFW.GLFW_REPEAT; -import static org.lwjgl.glfw.GLFW.glfwGetTime; -import static org.lwjgl.glfw.GLFW.glfwSetCharCallback; -import static org.lwjgl.glfw.GLFW.glfwSetKeyCallback; - +/** + * The LWJGL implementation of {@link KeyInput}. + */ public class GlfwKeyInput implements KeyInput { private static final Logger logger = Logger.getLogger(GlfwKeyInput.class.getName()); - private LwjglWindow context; - private RawInputListener listener; - private boolean initialized; + /** + * The queue of key events. + */ + private final Queue keyInputEvents = new ArrayDeque<>(); + + /** + * The LWJGL context. + */ + private final LwjglWindow context; + + /** + * The key callback. + */ private GLFWKeyCallback keyCallback; + + /** + * The char callback. + */ private GLFWCharCallback charCallback; - private Queue keyInputEvents = new LinkedList(); - public GlfwKeyInput(LwjglWindow context) { + /** + * The raw input listener. + */ + private RawInputListener listener; + + private boolean initialized; + + public GlfwKeyInput(final LwjglWindow context) { this.context = context; } + @Override public void initialize() { + if (!context.isRenderable()) { return; } glfwSetKeyCallback(context.getWindowHandle(), keyCallback = new GLFWKeyCallback() { @Override - public void invoke(long window, int key, int scancode, int action, int mods) { + public void invoke(final long window, final int key, final int scancode, final int action, final int mods) { if (key < 0 || key > GLFW_KEY_LAST) { return; @@ -87,22 +103,11 @@ public class GlfwKeyInput implements KeyInput { keyInputEvents.add(event); } - - @Override - public void close() { - super.close(); - } - - @Override - public void callback(long args) { - super.callback(args); - } }); glfwSetCharCallback(context.getWindowHandle(), charCallback = new GLFWCharCallback() { - @Override - public void invoke(long window, int codepoint) { + public void invoke(final long window, final int codepoint) { final char keyChar = (char) codepoint; @@ -116,16 +121,6 @@ public class GlfwKeyInput implements KeyInput { keyInputEvents.add(released); } - - @Override - public void close() { - super.close(); - } - - @Override - public void callback(long args) { - super.callback(args); - } }); initialized = true; @@ -137,6 +132,7 @@ public class GlfwKeyInput implements KeyInput { return GLFW_KEY_LAST - GLFW_KEY_SPACE; } + @Override public void update() { if (!context.isRenderable()) { return; @@ -147,6 +143,7 @@ public class GlfwKeyInput implements KeyInput { } } + @Override public void destroy() { if (!context.isRenderable()) { return; @@ -157,14 +154,17 @@ public class GlfwKeyInput implements KeyInput { logger.fine("Keyboard destroyed."); } + @Override public boolean isInitialized() { return initialized; } - public void setInputListener(RawInputListener listener) { + @Override + public void setInputListener(final RawInputListener listener) { this.listener = listener; } + @Override public long getInputTimeNanos() { return (long) (glfwGetTime() * 1000000000); } diff --git a/jme3-lwjgl3/src/main/java/com/jme3/input/lwjgl/GlfwKeyMap.java b/jme3-lwjgl3/src/main/java/com/jme3/input/lwjgl/GlfwKeyMap.java index 39592fe60..0c130b9d4 100644 --- a/jme3-lwjgl3/src/main/java/com/jme3/input/lwjgl/GlfwKeyMap.java +++ b/jme3-lwjgl3/src/main/java/com/jme3/input/lwjgl/GlfwKeyMap.java @@ -36,10 +36,10 @@ import static com.jme3.input.KeyInput.*; public class GlfwKeyMap { - private static final int[] glfwToJmeKeyMap = new int[GLFW_KEY_LAST + 1]; + private static final int[] GLFW_TO_JME_KEY_MAP = new int[GLFW_KEY_LAST + 1]; - private static void reg(int jmeKey, int glfwKey) { - glfwToJmeKeyMap[glfwKey] = jmeKey; + private static void reg(final int jmeKey, final int glfwKey) { + GLFW_TO_JME_KEY_MAP[glfwKey] = jmeKey; } static { @@ -165,7 +165,7 @@ public class GlfwKeyMap { reg(KEY_RMETA, GLFW_KEY_RIGHT_SUPER); } - public static int toJmeKeyCode(int glfwKey) { - return glfwToJmeKeyMap[glfwKey]; + public static int toJmeKeyCode(final int glfwKey) { + return GLFW_TO_JME_KEY_MAP[glfwKey]; } } diff --git a/jme3-lwjgl3/src/main/java/com/jme3/input/lwjgl/GlfwMouseInput.java b/jme3-lwjgl3/src/main/java/com/jme3/input/lwjgl/GlfwMouseInput.java index 7e9f70f2d..f198234a6 100644 --- a/jme3-lwjgl3/src/main/java/com/jme3/input/lwjgl/GlfwMouseInput.java +++ b/jme3-lwjgl3/src/main/java/com/jme3/input/lwjgl/GlfwMouseInput.java @@ -29,7 +29,6 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - package com.jme3.input.lwjgl; import com.jme3.cursors.plugins.JmeCursor; @@ -39,26 +38,25 @@ import com.jme3.input.event.MouseButtonEvent; import com.jme3.input.event.MouseMotionEvent; import com.jme3.system.lwjgl.LwjglWindow; import com.jme3.util.BufferUtils; -import org.lwjgl.glfw.GLFWCursorPosCallback; -import org.lwjgl.glfw.GLFWMouseButtonCallback; -import org.lwjgl.glfw.GLFWScrollCallback; - import java.nio.ByteBuffer; +import java.nio.DoubleBuffer; import java.nio.IntBuffer; +import java.util.ArrayDeque; import java.util.HashMap; -import java.util.LinkedList; import java.util.Map; import java.util.Queue; import java.util.logging.Logger; - +import org.lwjgl.glfw.*; import static org.lwjgl.glfw.GLFW.*; -import org.lwjgl.glfw.GLFWImage; +import org.lwjgl.system.MemoryStack; import org.lwjgl.system.MemoryUtil; /** - * Captures mouse input using GLFW callbacks. It then temporarily stores these in event queues which are processed in the - * {@link #update()} method. Due to some of the GLFW button id's there is a conversion method in this class which will - * convert the GLFW left, middle and right mouse button to JME3 left, middle and right button codes. + * Captures mouse input using GLFW callbacks. It then temporarily stores these + * in event queues which are processed in the {@link #update()} method. Due to + * some of the GLFW button id's there is a conversion method in this class which + * will convert the GLFW left, middle and right mouse button to JME3 left, + * middle and right button codes. * * @author Daniel Johansson (dannyjo) * @since 3.1 @@ -69,38 +67,86 @@ public class GlfwMouseInput implements MouseInput { private static final int WHEEL_SCALE = 120; - private LwjglWindow context; + private static long[] createGlfwCursor(final JmeCursor jmeCursor) { + + long[] cursorArray = new long[jmeCursor.getNumImages()]; + + for (int i = 0; i < jmeCursor.getNumImages(); i++) { + + final ByteBuffer buffer = transformCursorImage(jmeCursor.getImagesData(), jmeCursor.getWidth(), jmeCursor.getHeight(), i); + final GLFWImage glfwImage = new GLFWImage(BufferUtils.createByteBuffer(GLFWImage.SIZEOF)); + glfwImage.set(jmeCursor.getWidth(), jmeCursor.getHeight(), buffer); + + final int hotspotX = jmeCursor.getXHotSpot(); + final int hotspotY = jmeCursor.getHeight() - jmeCursor.getYHotSpot(); + + cursorArray[i] = glfwCreateCursor(glfwImage, hotspotX, hotspotY); + } + + return cursorArray; + } + + + private static ByteBuffer transformCursorImage(final IntBuffer imageData, final int width, final int height, + final int index) { + + final ByteBuffer byteBuffer = BufferUtils.createByteBuffer(width * height * 4); + + // Transform image: ARGB -> RGBA, vertical flip + for (int y = height - 1; y >= 0; --y) { + for (int x = 0; x < width; ++x) { + int pixel = imageData.get(width * height * index + y * width + x); + byteBuffer.put((byte) ((pixel >> 16) & 0xFF)); // red + byteBuffer.put((byte) ((pixel >> 8) & 0xFF)); // green + byteBuffer.put((byte) (pixel & 0xFF)); // blue + byteBuffer.put((byte) ((pixel >> 24) & 0xFF)); // alpha + } + } + + byteBuffer.flip(); + + return byteBuffer; + } + + private final Map jmeToGlfwCursorMap = new HashMap<>(); + + private final Queue mouseMotionEvents = new ArrayDeque<>(); + private final Queue mouseButtonEvents = new ArrayDeque<>(); + + private final LwjglWindow context; + private RawInputListener listener; - private boolean cursorVisible = true; - private int mouseX; - private int mouseY; - private int mouseWheel; - private boolean initialized; + + private IntBuffer currentCursorDelays; private GLFWCursorPosCallback cursorPosCallback; private GLFWScrollCallback scrollCallback; private GLFWMouseButtonCallback mouseButtonCallback; - private Queue mouseMotionEvents = new LinkedList(); - private Queue mouseButtonEvents = new LinkedList(); - private Map jmeToGlfwCursorMap = new HashMap(); + private long[] currentCursor; + + private double currentCursorFrameStartTime = 0.0; + + private int currentCursorFrame = 0; + private int mouseX; + private int mouseY; + private int mouseWheel; + private int currentWidth; + private int currentHeight; - public GlfwMouseInput(LwjglWindow context) { + private boolean cursorVisible; + private boolean initialized; + + public GlfwMouseInput(final LwjglWindow context) { this.context = context; + this.cursorVisible = true; } - private void onCursorPos(long window, double xpos, double ypos) { + private void onCursorPos(final long window, final double xpos, final double ypos) { + int xDelta; int yDelta; int x = (int) Math.round(xpos); - int y = context.getSettings().getHeight() - (int) Math.round(ypos); - - if (mouseX == 0) { - mouseX = x; - } - - if (mouseY == 0) { - mouseY = y; - } + int y = currentHeight - (int) Math.round(ypos); xDelta = x - mouseX; yDelta = y - mouseY; @@ -114,7 +160,7 @@ public class GlfwMouseInput implements MouseInput { } } - private void onWheelScroll(long window, double xOffset, double yOffset) { + private void onWheelScroll(final long window, final double xOffset, final double yOffset) { mouseWheel += yOffset; final MouseMotionEvent mouseMotionEvent = new MouseMotionEvent(mouseX, mouseY, 0, 0, mouseWheel, (int) Math.round(yOffset)); mouseMotionEvent.setTime(getInputTimeNanos()); @@ -122,75 +168,117 @@ public class GlfwMouseInput implements MouseInput { } private void onMouseButton(final long window, final int button, final int action, final int mods) { - final MouseButtonEvent mouseButtonEvent = new MouseButtonEvent(convertButton(button), action == GLFW_PRESS, mouseX, mouseY); + final boolean pressed = action == GLFW_PRESS; + final MouseButtonEvent mouseButtonEvent = new MouseButtonEvent(convertButton(button), pressed, mouseX, mouseY); mouseButtonEvent.setTime(getInputTimeNanos()); mouseButtonEvents.add(mouseButtonEvent); } + @Override public void initialize() { - glfwSetCursorPosCallback(context.getWindowHandle(), cursorPosCallback = new GLFWCursorPosCallback() { - @Override - public void invoke(long window, double xpos, double ypos) { - onCursorPos(window, xpos, ypos); - } - @Override - public void close() { - super.close(); - } + final long window = context.getWindowHandle(); + + try (MemoryStack stack = MemoryStack.stackPush()) { + + final IntBuffer width = stack.callocInt(1); + final IntBuffer height = stack.callocInt(1); + + glfwGetWindowSize(window, width, height); + + currentWidth = width.get(); + currentHeight = height.get(); + } + initCurrentMousePosition(window); + glfwSetCursorPosCallback(window, cursorPosCallback = new GLFWCursorPosCallback() { @Override - public void callback(long args) { - super.callback(args); + public void invoke(final long window, final double xpos, final double ypos) { + onCursorPos(window, xpos, ypos); } }); - glfwSetScrollCallback(context.getWindowHandle(), scrollCallback = new GLFWScrollCallback() { + glfwSetScrollCallback(window, scrollCallback = new GLFWScrollCallback() { @Override public void invoke(final long window, final double xOffset, final double yOffset) { onWheelScroll(window, xOffset, yOffset * WHEEL_SCALE); } - @Override - public void close() { - super.close(); - } - - @Override - public void callback(long args) { - super.callback(args); - } }); - glfwSetMouseButtonCallback(context.getWindowHandle(), mouseButtonCallback = new GLFWMouseButtonCallback() { + glfwSetMouseButtonCallback(window, mouseButtonCallback = new GLFWMouseButtonCallback() { @Override public void invoke(final long window, final int button, final int action, final int mods) { onMouseButton(window, button, action, mods); } - @Override - public void close() { - super.close(); - } + }); + glfwSetWindowSizeCallback(window, new GLFWWindowSizeCallback() { @Override - public void callback(long args) { - super.callback(args); + public void invoke(final long window, final int width, final int height) { + currentHeight = height; + currentWidth = width; } }); + if(listener != null) { + sendFirstMouseEvent(); + } + setCursorVisible(cursorVisible); logger.fine("Mouse created."); initialized = true; } + private void initCurrentMousePosition(long window) { + DoubleBuffer x = BufferUtils.createDoubleBuffer(1); + DoubleBuffer y = BufferUtils.createDoubleBuffer(1); + glfwGetCursorPos(window, x, y); + mouseX = (int) Math.round(x.get()); + mouseY = (int) currentHeight - (int) Math.round(y.get()); + } + + /** + * Send the input listener a special mouse-motion event with zero deltas in + * order to initialize the listener's cursor position. + */ + private void sendFirstMouseEvent() { + assert listener != null; + + int xDelta = 0; + int yDelta = 0; + int wheelDelta = 0; + MouseMotionEvent evt = new MouseMotionEvent(mouseX, mouseY, xDelta, yDelta, + mouseWheel, wheelDelta); + evt.setTime(getInputTimeNanos()); + + listener.onMouseMotionEvent(evt); + } + + @Override public boolean isInitialized() { return initialized; } + @Override public int getButtonCount() { return GLFW_MOUSE_BUTTON_LAST + 1; } + @Override public void update() { + + // Manage cursor animation + if (currentCursor != null && currentCursor.length > 1) { + double now = glfwGetTime(); + double frameTime = (glfwGetTime() - currentCursorFrameStartTime) * 1000; + if (currentCursorDelays == null || frameTime >= currentCursorDelays.get(currentCursorFrame)) { + currentCursorFrame = ++currentCursorFrame % currentCursor.length; + currentCursorFrameStartTime = now; + glfwSetCursor(context.getWindowHandle(), currentCursor[currentCursorFrame]); + } + } + + // Process events while (!mouseMotionEvents.isEmpty()) { listener.onMouseMotionEvent(mouseMotionEvents.poll()); } @@ -200,7 +288,9 @@ public class GlfwMouseInput implements MouseInput { } } + @Override public void destroy() { + if (!context.isRenderable()) { return; } @@ -209,13 +299,21 @@ public class GlfwMouseInput implements MouseInput { scrollCallback.close(); mouseButtonCallback.close(); - for (long glfwCursor : jmeToGlfwCursorMap.values()) { - glfwDestroyCursor(glfwCursor); + currentCursor = null; + currentCursorDelays = null; + + for (long[] glfwCursors : jmeToGlfwCursorMap.values()) { + for (long glfwCursor : glfwCursors) { + glfwDestroyCursor(glfwCursor); + } } + jmeToGlfwCursorMap.clear(); + logger.fine("Mouse destroyed."); } + @Override public void setCursorVisible(boolean visible) { cursorVisible = visible; @@ -230,56 +328,39 @@ public class GlfwMouseInput implements MouseInput { } } + @Override public void setInputListener(RawInputListener listener) { this.listener = listener; + if (listener != null && initialized) { + sendFirstMouseEvent(); + } } + @Override public long getInputTimeNanos() { return (long) (glfwGetTime() * 1000000000); } - private ByteBuffer transformCursorImage(IntBuffer imageData, int w, int h) { - ByteBuffer buf = BufferUtils.createByteBuffer(imageData.capacity() * 4); - - // Transform image: ARGB -> RGBA, vertical flip - for (int y = h-1; y >= 0; --y) { - for (int x = 0; x < w; ++x) { - int pixel = imageData.get(y*w + x); - buf.put((byte) ((pixel >> 16) & 0xFF)); // red - buf.put((byte) ((pixel >> 8) & 0xFF)); // green - buf.put((byte) ( pixel & 0xFF)); // blue - buf.put((byte) ((pixel >> 24) & 0xFF)); // alpha - } - } - - buf.flip(); - return buf; - } - - private long createGlfwCursor(JmeCursor jmeCursor) { - // TODO: currently animated cursors are not supported - IntBuffer imageData = jmeCursor.getImagesData(); - ByteBuffer buf = transformCursorImage(imageData, jmeCursor.getWidth(), jmeCursor.getHeight()); + @Override + public void setNativeCursor(final JmeCursor jmeCursor) { + if (jmeCursor != null) { - GLFWImage glfwImage = new GLFWImage(BufferUtils.createByteBuffer(GLFWImage.SIZEOF)); - glfwImage.set(jmeCursor.getWidth(), jmeCursor.getHeight(), buf); + final long[] glfwCursor = jmeToGlfwCursorMap.computeIfAbsent(jmeCursor, GlfwMouseInput::createGlfwCursor); - int hotspotX = jmeCursor.getXHotSpot(); - int hotspotY = jmeCursor.getHeight() - jmeCursor.getYHotSpot(); - return glfwCreateCursor(glfwImage, hotspotX, hotspotY); - } + currentCursorFrame = 0; + currentCursor = glfwCursor; + currentCursorDelays = null; + currentCursorFrameStartTime = glfwGetTime(); - public void setNativeCursor(JmeCursor jmeCursor) { - if (jmeCursor != null) { - Long glfwCursor = jmeToGlfwCursorMap.get(jmeCursor); - - if (glfwCursor == null) { - glfwCursor = createGlfwCursor(jmeCursor); - jmeToGlfwCursorMap.put(jmeCursor, glfwCursor); + if (jmeCursor.getImagesDelay() != null) { + currentCursorDelays = jmeCursor.getImagesDelay(); } - glfwSetCursor(context.getWindowHandle(), glfwCursor); + glfwSetCursor(context.getWindowHandle(), glfwCursor[currentCursorFrame]); + } else { + currentCursor = null; + currentCursorDelays = null; glfwSetCursor(context.getWindowHandle(), MemoryUtil.NULL); } } diff --git a/jme3-lwjgl3/src/main/java/com/jme3/lwjgl3/utils/APIUtil.java b/jme3-lwjgl3/src/main/java/com/jme3/lwjgl3/utils/APIUtil.java index 689659e3b..a36d22211 100644 --- a/jme3-lwjgl3/src/main/java/com/jme3/lwjgl3/utils/APIUtil.java +++ b/jme3-lwjgl3/src/main/java/com/jme3/lwjgl3/utils/APIUtil.java @@ -20,16 +20,22 @@ import java.util.regex.Pattern; */ public final class APIUtil { - private static final ThreadLocal API_BUFFERS = new ThreadLocal() { - @Override - protected APIBuffer initialValue() { - return new APIBuffer(); - } - }; + private static final ThreadLocal API_BUFFERS = ThreadLocal.withInitial(APIBuffer::new); private APIUtil() { } + /** + * Converts dynamic arguments to object array. + * + * @param arguments the list of arguments. + * @return the object array. + */ + @SafeVarargs + public static T[] toArray(T... arguments) { + return arguments; + } + /** * Returns a thread-local {@link APIBuffer} that has been reset. */ diff --git a/jme3-lwjgl3/src/main/java/com/jme3/renderer/lwjgl/LwjglGL.java b/jme3-lwjgl3/src/main/java/com/jme3/renderer/lwjgl/LwjglGL.java index 915b185d1..0d8c32a8d 100644 --- a/jme3-lwjgl3/src/main/java/com/jme3/renderer/lwjgl/LwjglGL.java +++ b/jme3-lwjgl3/src/main/java/com/jme3/renderer/lwjgl/LwjglGL.java @@ -31,449 +31,553 @@ */ package com.jme3.renderer.lwjgl; -import com.jme3.renderer.RendererException; import com.jme3.renderer.opengl.GL; import com.jme3.renderer.opengl.GL2; import com.jme3.renderer.opengl.GL3; import com.jme3.renderer.opengl.GL4; import org.lwjgl.opengl.*; -import java.nio.*; +import java.nio.ByteBuffer; +import java.nio.FloatBuffer; +import java.nio.IntBuffer; +import java.nio.ShortBuffer; -public class LwjglGL implements GL, GL2, GL3, GL4 { +/** + * The LWJGL implementation of interfaces {@link GL}, {@link GL2}, {@link GL3}, {@link GL4}. + */ +public class LwjglGL extends LwjglRender implements GL, GL2, GL3, GL4 { - private static void checkLimit(Buffer buffer) { - if (buffer == null) { - return; - } - if (buffer.limit() == 0) { - throw new RendererException("Attempting to upload empty buffer (limit = 0), that's an error"); - } - if (buffer.remaining() == 0) { - throw new RendererException("Attempting to upload empty buffer (remaining = 0), that's an error"); - } - } - + @Override public void resetStats() { } - - public void glActiveTexture(int param1) { - GL13.glActiveTexture(param1); + + @Override + public void glActiveTexture(final int texture) { + GL13.glActiveTexture(texture); } - public void glAlphaFunc(int param1, float param2) { - GL11.glAlphaFunc(param1, param2); + @Override + public void glAlphaFunc(final int func, final float ref) { + GL11.glAlphaFunc(func, ref); } - public void glAttachShader(int param1, int param2) { - GL20.glAttachShader(param1, param2); + @Override + public void glAttachShader(final int program, final int shader) { + GL20.glAttachShader(program, shader); } @Override - public void glBeginQuery(int target, int query) { + public void glBeginQuery(final int target, final int query) { GL15.glBeginQuery(target, query); } - public void glBindBuffer(int param1, int param2) { - GL15.glBindBuffer(param1, param2); + @Override + public void glBindBuffer(final int target, final int buffer) { + GL15.glBindBuffer(target, buffer); } - public void glBindTexture(int param1, int param2) { - GL11.glBindTexture(param1, param2); + @Override + public void glBindTexture(final int target, final int texture) { + GL11.glBindTexture(target, texture); } - public void glBlendEquationSeparate(int colorMode, int alphaMode){ - GL20.glBlendEquationSeparate(colorMode,alphaMode); + @Override + public void glBlendEquationSeparate(final int colorMode, final int alphaMode) { + GL20.glBlendEquationSeparate(colorMode, alphaMode); } - public void glBlendFunc(int param1, int param2) { - GL11.glBlendFunc(param1, param2); + @Override + public void glBlendFunc(final int sfactor, final int dfactor) { + GL11.glBlendFunc(sfactor, dfactor); } - - public void glBlendFuncSeparate(int param1, int param2, int param3, int param4) { - GL14.glBlendFuncSeparate(param1, param2, param3, param4); + + @Override + public void glBlendFuncSeparate(final int sfactorRGB, final int dfactorRGB, final int sfactorAlpha, + final int dfactorAlpha) { + GL14.glBlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha); } - public void glBufferData(int param1, long param2, int param3) { - GL15.glBufferData(param1, param2, param3); + @Override + public void glBufferData(final int target, final long dataSize, final int usage) { + GL15.glBufferData(target, dataSize, usage); } - - public void glBufferData(int param1, FloatBuffer param2, int param3) { - checkLimit(param2); - GL15.glBufferData(param1, param2, param3); + + @Override + public void glBufferData(final int target, final FloatBuffer data, final int usage) { + checkLimit(data); + GL15.glBufferData(target, data, usage); } - public void glBufferData(int param1, ShortBuffer param2, int param3) { - checkLimit(param2); - GL15.glBufferData(param1, param2, param3); + @Override + public void glBufferData(final int target, final ShortBuffer data, final int usage) { + checkLimit(data); + GL15.glBufferData(target, data, usage); } - public void glBufferData(int param1, ByteBuffer param2, int param3) { - checkLimit(param2); - GL15.glBufferData(param1, param2, param3); + @Override + public void glBufferData(final int target, final ByteBuffer data, final int usage) { + checkLimit(data); + GL15.glBufferData(target, data, usage); } - public void glBufferSubData(int param1, long param2, FloatBuffer param3) { - checkLimit(param3); - GL15.glBufferSubData(param1, param2, param3); + @Override + public void glBufferSubData(final int target, final long offset, final FloatBuffer data) { + checkLimit(data); + GL15.glBufferSubData(target, offset, data); } - public void glBufferSubData(int param1, long param2, ShortBuffer param3) { - checkLimit(param3); - GL15.glBufferSubData(param1, param2, param3); + @Override + public void glBufferSubData(final int target, final long offset, final ShortBuffer data) { + checkLimit(data); + GL15.glBufferSubData(target, offset, data); } - public void glBufferSubData(int param1, long param2, ByteBuffer param3) { - checkLimit(param3); - GL15.glBufferSubData(param1, param2, param3); + @Override + public void glBufferSubData(final int target, final long offset, final ByteBuffer data) { + checkLimit(data); + GL15.glBufferSubData(target, offset, data); } - public void glClear(int param1) { - GL11.glClear(param1); + @Override + public void glClear(final int mask) { + GL11.glClear(mask); } - public void glClearColor(float param1, float param2, float param3, float param4) { - GL11.glClearColor(param1, param2, param3, param4); + @Override + public void glClearColor(final float red, final float green, final float blue, final float alpha) { + GL11.glClearColor(red, green, blue, alpha); } - public void glColorMask(boolean param1, boolean param2, boolean param3, boolean param4) { - GL11.glColorMask(param1, param2, param3, param4); + @Override + public void glColorMask(final boolean red, final boolean green, final boolean blue, final boolean alpha) { + GL11.glColorMask(red, green, blue, alpha); } - public void glCompileShader(int param1) { - GL20.glCompileShader(param1); + @Override + public void glCompileShader(final int shader) { + GL20.glCompileShader(shader); } - public void glCompressedTexImage2D(int param1, int param2, int param3, int param4, int param5, int param6, ByteBuffer param7) { - checkLimit(param7); - GL13.glCompressedTexImage2D(param1, param2, param3, param4, param5, param6, param7); + @Override + public void glCompressedTexImage2D(final int target, final int level, final int internalFormat, final int width, + final int height, final int border, final ByteBuffer data) { + checkLimit(data); + GL13.glCompressedTexImage2D(target, level, internalFormat, width, height, border, data); } - public void glCompressedTexImage3D(int param1, int param2, int param3, int param4, int param5, int param6, int param7, ByteBuffer param8) { - checkLimit(param8); - GL13.glCompressedTexImage3D(param1, param2, param3, param4, param5, param6, param7, param8); + @Override + public void glCompressedTexImage3D(final int target, final int level, final int internalFormat, final int width, + final int height, final int depth, final int border, final ByteBuffer data) { + checkLimit(data); + GL13.glCompressedTexImage3D(target, level, internalFormat, width, height, depth, border, data); } - public void glCompressedTexSubImage2D(int param1, int param2, int param3, int param4, int param5, int param6, int param7, ByteBuffer param8) { - checkLimit(param8); - GL13.glCompressedTexSubImage2D(param1, param2, param3, param4, param5, param6, param7, param8); + @Override + public void glCompressedTexSubImage2D(final int target, final int level, final int xoffset, final int yoffset, + final int width, final int height, final int format, final ByteBuffer data) { + checkLimit(data); + GL13.glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, data); } - public void glCompressedTexSubImage3D(int param1, int param2, int param3, int param4, int param5, int param6, int param7, int param8, int param9, ByteBuffer param10) { - checkLimit(param10); - GL13.glCompressedTexSubImage3D(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10); + @Override + public void glCompressedTexSubImage3D(final int target, final int level, final int xoffset, final int yoffset, + final int zoffset, final int width, final int height, final int depth, + final int format, final ByteBuffer data) { + checkLimit(data); + GL13.glCompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, data); } + @Override public int glCreateProgram() { return GL20.glCreateProgram(); } - public int glCreateShader(int param1) { - return GL20.glCreateShader(param1); + @Override + public int glCreateShader(final int shaderType) { + return GL20.glCreateShader(shaderType); } - public void glCullFace(int param1) { - GL11.glCullFace(param1); + @Override + public void glCullFace(final int mode) { + GL11.glCullFace(mode); } - public void glDeleteBuffers(IntBuffer param1) { - checkLimit(param1); - GL15.glDeleteBuffers(param1); + @Override + public void glDeleteBuffers(final IntBuffer buffers) { + checkLimit(buffers); + GL15.glDeleteBuffers(buffers); } - public void glDeleteProgram(int param1) { - GL20.glDeleteProgram(param1); + @Override + public void glDeleteProgram(final int program) { + GL20.glDeleteProgram(program); } - public void glDeleteShader(int param1) { - GL20.glDeleteShader(param1); + @Override + public void glDeleteShader(final int shader) { + GL20.glDeleteShader(shader); } - public void glDeleteTextures(IntBuffer param1) { - checkLimit(param1); - GL11.glDeleteTextures(param1); + @Override + public void glDeleteTextures(final IntBuffer textures) { + checkLimit(textures); + GL11.glDeleteTextures(textures); } - public void glDepthFunc(int param1) { - GL11.glDepthFunc(param1); + @Override + public void glDepthFunc(final int func) { + GL11.glDepthFunc(func); } - public void glDepthMask(boolean param1) { - GL11.glDepthMask(param1); + @Override + public void glDepthMask(final boolean flag) { + GL11.glDepthMask(flag); } - public void glDepthRange(double param1, double param2) { - GL11.glDepthRange(param1, param2); + @Override + public void glDepthRange(final double nearVal, final double farVal) { + GL11.glDepthRange(nearVal, farVal); } - public void glDetachShader(int param1, int param2) { - GL20.glDetachShader(param1, param2); + @Override + public void glDetachShader(final int program, final int shader) { + GL20.glDetachShader(program, shader); } - public void glDisable(int param1) { - GL11.glDisable(param1); + @Override + public void glDisable(final int cap) { + GL11.glDisable(cap); } - public void glDisableVertexAttribArray(int param1) { - GL20.glDisableVertexAttribArray(param1); + @Override + public void glDisableVertexAttribArray(final int index) { + GL20.glDisableVertexAttribArray(index); } - public void glDrawArrays(int param1, int param2, int param3) { - GL11.glDrawArrays(param1, param2, param3); + @Override + public void glDrawArrays(final int mode, final int first, final int count) { + GL11.glDrawArrays(mode, first, count); } - public void glDrawBuffer(int param1) { - GL11.glDrawBuffer(param1); + @Override + public void glDrawBuffer(final int mode) { + GL11.glDrawBuffer(mode); } - - public void glDrawRangeElements(int param1, int param2, int param3, int param4, int param5, long param6) { - GL12.glDrawRangeElements(param1, param2, param3, param4, param5, param6); + + @Override + public void glDrawRangeElements(final int mode, final int start, final int end, final int count, final int type, + final long indices) { + GL12.glDrawRangeElements(mode, start, end, count, type, indices); } - public void glEnable(int param1) { - GL11.glEnable(param1); + @Override + public void glEnable(final int cap) { + GL11.glEnable(cap); } - public void glEnableVertexAttribArray(int param1) { - GL20.glEnableVertexAttribArray(param1); + @Override + public void glEnableVertexAttribArray(final int index) { + GL20.glEnableVertexAttribArray(index); } @Override - public void glEndQuery(int target) { + public void glEndQuery(final int target) { GL15.glEndQuery(target); } - public void glGenBuffers(IntBuffer param1) { - checkLimit(param1); - GL15.glGenBuffers(param1); + @Override + public void glGenBuffers(final IntBuffer buffers) { + checkLimit(buffers); + GL15.glGenBuffers(buffers); } - public void glGenTextures(IntBuffer param1) { - checkLimit(param1); - GL11.glGenTextures(param1); + @Override + public void glGenTextures(final IntBuffer textures) { + checkLimit(textures); + GL11.glGenTextures(textures); } @Override - public void glGenQueries(int num, IntBuffer ids) { + public void glGenQueries(final int num, final IntBuffer ids) { GL15.glGenQueries(ids); } - public void glGetBoolean(int param1, ByteBuffer param2) { - checkLimit(param2); - GL11.glGetBooleanv(param1, param2); + @Override + public void glGetBoolean(final int pname, final ByteBuffer params) { + checkLimit(params); + GL11.glGetBooleanv(pname, params); } - - public void glGetBufferSubData(int target, long offset, ByteBuffer data) { + + @Override + public void glGetBufferSubData(final int target, final long offset, final ByteBuffer data) { checkLimit(data); GL15.glGetBufferSubData(target, offset, data); } + @Override public int glGetError() { return GL11.glGetError(); } - - public void glGetInteger(int param1, IntBuffer param2) { - checkLimit(param2); - GL11.glGetIntegerv(param1, param2); + + @Override + public void glGetInteger(final int pname, final IntBuffer params) { + checkLimit(params); + GL11.glGetIntegerv(pname, params); } - public void glGetProgram(int param1, int param2, IntBuffer param3) { - checkLimit(param3); - GL20.glGetProgramiv(param1, param2, param3); + @Override + public void glGetProgram(final int program, final int pname, final IntBuffer params) { + checkLimit(params); + GL20.glGetProgramiv(program, pname, params); } - public void glGetShader(int param1, int param2, IntBuffer param3) { - checkLimit(param3); - GL20.glGetShaderiv(param1, param2, param3); + @Override + public void glGetShader(final int shader, final int pname, final IntBuffer params) { + checkLimit(params); + GL20.glGetShaderiv(shader, pname, params); } - public String glGetString(int param1) { - return GL11.glGetString(param1); + @Override + public String glGetString(final int name) { + return GL11.glGetString(name); } - - public String glGetString(int param1, int param2) { - return GL30.glGetStringi(param1, param2); + + @Override + public String glGetString(final int name, final int index) { + return GL30.glGetStringi(name, index); } - public boolean glIsEnabled(int param1) { - return GL11.glIsEnabled(param1); + @Override + public boolean glIsEnabled(final int cap) { + return GL11.glIsEnabled(cap); } - public void glLineWidth(float param1) { - GL11.glLineWidth(param1); + @Override + public void glLineWidth(final float width) { + GL11.glLineWidth(width); } - public void glLinkProgram(int param1) { - GL20.glLinkProgram(param1); + @Override + public void glLinkProgram(final int program) { + GL20.glLinkProgram(program); } - public void glPixelStorei(int param1, int param2) { - GL11.glPixelStorei(param1, param2); + @Override + public void glPixelStorei(final int pname, final int param) { + GL11.glPixelStorei(pname, param); } - public void glPointSize(float param1) { - GL11.glPointSize(param1); + @Override + public void glPointSize(final float size) { + GL11.glPointSize(size); } - public void glPolygonMode(int param1, int param2) { - GL11.glPolygonMode(param1, param2); + @Override + public void glPolygonMode(final int face, final int mode) { + GL11.glPolygonMode(face, mode); } - public void glPolygonOffset(float param1, float param2) { - GL11.glPolygonOffset(param1, param2); + @Override + public void glPolygonOffset(final float factor, final float units) { + GL11.glPolygonOffset(factor, units); } - public void glReadBuffer(int param1) { - GL11.glReadBuffer(param1); + @Override + public void glReadBuffer(final int mode) { + GL11.glReadBuffer(mode); } - public void glReadPixels(int param1, int param2, int param3, int param4, int param5, int param6, ByteBuffer param7) { - checkLimit(param7); - GL11.glReadPixels(param1, param2, param3, param4, param5, param6, param7); + @Override + public void glReadPixels(final int x, final int y, final int width, final int height, final int format, + final int type, final ByteBuffer data) { + checkLimit(data); + GL11.glReadPixels(x, y, width, height, format, type, data); } - - public void glReadPixels(int param1, int param2, int param3, int param4, int param5, int param6, long param7) { - GL11.glReadPixels(param1, param2, param3, param4, param5, param6, param7); + + @Override + public void glReadPixels(final int x, final int y, final int width, final int height, final int format, + final int type, final long offset) { + GL11.glReadPixels(x, y, width, height, format, type, offset); } - public void glScissor(int param1, int param2, int param3, int param4) { - GL11.glScissor(param1, param2, param3, param4); + @Override + public void glScissor(final int x, final int y, final int width, final int height) { + GL11.glScissor(x, y, width, height); } - public void glStencilFuncSeparate(int param1, int param2, int param3, int param4) { - GL20.glStencilFuncSeparate(param1, param2, param3, param4); + @Override + public void glStencilFuncSeparate(final int face, final int func, final int ref, final int mask) { + GL20.glStencilFuncSeparate(face, func, ref, mask); } - public void glStencilOpSeparate(int param1, int param2, int param3, int param4) { - GL20.glStencilOpSeparate(param1, param2, param3, param4); + @Override + public void glStencilOpSeparate(final int face, final int sfail, final int dpfail, final int dppass) { + GL20.glStencilOpSeparate(face, sfail, dpfail, dppass); } - public void glTexImage2D(int param1, int param2, int param3, int param4, int param5, int param6, int param7, int param8, ByteBuffer param9) { - checkLimit(param9); - GL11.glTexImage2D(param1, param2, param3, param4, param5, param6, param7, param8, param9); + @Override + public void glTexImage2D(final int target, final int level, final int internalFormat, final int width, + final int height, final int border, final int format, final int type, + final ByteBuffer data) { + checkLimit(data); + GL11.glTexImage2D(target, level, internalFormat, width, height, border, format, type, data); } - public void glTexImage3D(int param1, int param2, int param3, int param4, int param5, int param6, int param7, int param8, int param9, ByteBuffer param10) { - checkLimit(param10); - GL12.glTexImage3D(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10); + @Override + public void glTexImage3D(final int target, final int level, final int internalFormat, final int width, + final int height, final int depth, final int border, final int format, final int type, + final ByteBuffer data) { + checkLimit(data); + GL12.glTexImage3D(target, level, internalFormat, width, height, depth, border, format, type, data); } - public void glTexParameterf(int param1, int param2, float param3) { - GL11.glTexParameterf(param1, param2, param3); + @Override + public void glTexParameterf(final int target, final int pname, final float param) { + GL11.glTexParameterf(target, pname, param); } - public void glTexParameteri(int param1, int param2, int param3) { - GL11.glTexParameteri(param1, param2, param3); + @Override + public void glTexParameteri(final int target, final int pname, final int param) { + GL11.glTexParameteri(target, pname, param); } - public void glTexSubImage2D(int param1, int param2, int param3, int param4, int param5, int param6, int param7, int param8, ByteBuffer param9) { - checkLimit(param9); - GL11.glTexSubImage2D(param1, param2, param3, param4, param5, param6, param7, param8, param9); + @Override + public void glTexSubImage2D(final int target, final int level, final int xoffset, final int yoffset, + final int width, final int height, final int format, final int type, + final ByteBuffer data) { + checkLimit(data); + GL11.glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, data); } - public void glTexSubImage3D(int param1, int param2, int param3, int param4, int param5, int param6, int param7, int param8, int param9, int param10, ByteBuffer param11) { - checkLimit(param11); - GL12.glTexSubImage3D(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11); + @Override + public void glTexSubImage3D(final int target, final int level, final int xoffset, final int yoffset, + final int zoffset, final int width, final int height, final int depth, final int format, + final int type, final ByteBuffer data) { + checkLimit(data); + GL12.glTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data); } - public void glUniform1(int param1, FloatBuffer param2) { - checkLimit(param2); - GL20.glUniform1fv(param1, param2); + @Override + public void glUniform1(final int location, final FloatBuffer value) { + checkLimit(value); + GL20.glUniform1fv(location, value); } - public void glUniform1(int param1, IntBuffer param2) { - checkLimit(param2); - GL20.glUniform1iv(param1, param2); + @Override + public void glUniform1(final int location, final IntBuffer value) { + checkLimit(value); + GL20.glUniform1iv(location, value); } - public void glUniform1f(int param1, float param2) { - GL20.glUniform1f(param1, param2); + @Override + public void glUniform1f(final int location, final float v0) { + GL20.glUniform1f(location, v0); } - public void glUniform1i(int param1, int param2) { - GL20.glUniform1i(param1, param2); + @Override + public void glUniform1i(final int location, final int v0) { + GL20.glUniform1i(location, v0); } - public void glUniform2(int param1, IntBuffer param2) { - checkLimit(param2); - GL20.glUniform2iv(param1, param2); + @Override + public void glUniform2(final int location, final IntBuffer value) { + checkLimit(value); + GL20.glUniform2iv(location, value); } - public void glUniform2(int param1, FloatBuffer param2) { - checkLimit(param2); - GL20.glUniform2fv(param1, param2); + @Override + public void glUniform2(final int location, final FloatBuffer value) { + checkLimit(value); + GL20.glUniform2fv(location, value); } - public void glUniform2f(int param1, float param2, float param3) { - GL20.glUniform2f(param1, param2, param3); + @Override + public void glUniform2f(final int location, final float v0, final float v1) { + GL20.glUniform2f(location, v0, v1); } - public void glUniform3(int param1, IntBuffer param2) { - checkLimit(param2); - GL20.glUniform3iv(param1, param2); + @Override + public void glUniform3(final int location, final IntBuffer value) { + checkLimit(value); + GL20.glUniform3iv(location, value); } - public void glUniform3(int param1, FloatBuffer param2) { - checkLimit(param2); - GL20.glUniform3fv(param1, param2); + @Override + public void glUniform3(final int location, final FloatBuffer value) { + checkLimit(value); + GL20.glUniform3fv(location, value); } - public void glUniform3f(int param1, float param2, float param3, float param4) { - GL20.glUniform3f(param1, param2, param3, param4); + @Override + public void glUniform3f(final int location, final float v0, final float v1, final float v2) { + GL20.glUniform3f(location, v0, v1, v2); } - public void glUniform4(int param1, FloatBuffer param2) { - checkLimit(param2); - GL20.glUniform4fv(param1, param2); + @Override + public void glUniform4(final int location, final FloatBuffer value) { + checkLimit(value); + GL20.glUniform4fv(location, value); } - public void glUniform4(int param1, IntBuffer param2) { - checkLimit(param2); - GL20.glUniform4iv(param1, param2); + @Override + public void glUniform4(final int location, final IntBuffer value) { + checkLimit(value); + GL20.glUniform4iv(location, value); } - public void glUniform4f(int param1, float param2, float param3, float param4, float param5) { - GL20.glUniform4f(param1, param2, param3, param4, param5); + @Override + public void glUniform4f(final int location, final float v0, final float v1, final float v2, final float v3) { + GL20.glUniform4f(location, v0, v1, v2, v3); } - public void glUniformMatrix3(int param1, boolean param2, FloatBuffer param3) { - checkLimit(param3); - GL20.glUniformMatrix3fv(param1, param2, param3); + @Override + public void glUniformMatrix3(final int location, final boolean transpose, final FloatBuffer value) { + checkLimit(value); + GL20.glUniformMatrix3fv(location, transpose, value); } - public void glUniformMatrix4(int param1, boolean param2, FloatBuffer param3) { - checkLimit(param3); - GL20.glUniformMatrix4fv(param1, param2, param3); + @Override + public void glUniformMatrix4(final int location, final boolean transpose, final FloatBuffer value) { + checkLimit(value); + GL20.glUniformMatrix4fv(location, transpose, value); } - public void glUseProgram(int param1) { - GL20.glUseProgram(param1); + @Override + public void glUseProgram(final int program) { + GL20.glUseProgram(program); } - public void glVertexAttribPointer(int param1, int param2, int param3, boolean param4, int param5, long param6) { - GL20.glVertexAttribPointer(param1, param2, param3, param4, param5, param6); + @Override + public void glVertexAttribPointer(final int index, final int size, final int type, final boolean normalized, + final int stride, final long pointer) { + GL20.glVertexAttribPointer(index, size, type, normalized, stride, pointer); } - public void glViewport(int param1, int param2, int param3, int param4) { - GL11.glViewport(param1, param2, param3, param4); + @Override + public void glViewport(final int x, final int y, final int width, final int height) { + GL11.glViewport(x, y, width, height); } - public int glGetAttribLocation(int param1, String param2) { + @Override + public int glGetAttribLocation(final int program, final String name) { // NOTE: LWJGL requires null-terminated strings - return GL20.glGetAttribLocation(param1, param2 + "\0"); + return GL20.glGetAttribLocation(program, name + "\0"); } - public int glGetUniformLocation(int param1, String param2) { + @Override + public int glGetUniformLocation(final int program, final String name) { // NOTE: LWJGL requires null-terminated strings - return GL20.glGetUniformLocation(param1, param2 + "\0"); + return GL20.glGetUniformLocation(program, name + "\0"); } - public void glShaderSource(int param1, String[] param2, IntBuffer param3) { - checkLimit(param3); - GL20.glShaderSource(param1, param2); + @Override + public void glShaderSource(final int shader, final String[] strings, final IntBuffer length) { + checkLimit(length); + GL20.glShaderSource(shader, strings); } - public String glGetProgramInfoLog(int program, int maxSize) { + @Override + public String glGetProgramInfoLog(final int program, final int maxSize) { return GL20.glGetProgramInfoLog(program, maxSize); } @@ -492,29 +596,54 @@ public class LwjglGL implements GL, GL2, GL3, GL4 { } @Override - public void glBindFragDataLocation(int param1, int param2, String param3) { - GL30.glBindFragDataLocation(param1, param2, param3); + public void glBindFragDataLocation(final int program, final int colorNumber, final String name) { + GL30.glBindFragDataLocation(program, colorNumber, name); } @Override - public void glBindVertexArray(int param1) { - GL30.glBindVertexArray(param1); + public void glBindVertexArray(final int array) { + GL30.glBindVertexArray(array); } @Override - public void glGenVertexArrays(IntBuffer param1) { - checkLimit(param1); - GL30.glGenVertexArrays(param1); + public void glGenVertexArrays(final IntBuffer arrays) { + checkLimit(arrays); + GL30.glGenVertexArrays(arrays); } @Override - public void glPatchParameter(int count) { - GL40.glPatchParameteri(GL40.GL_PATCH_VERTICES,count); + public void glPatchParameter(final int count) { + GL40.glPatchParameteri(GL40.GL_PATCH_VERTICES, count); } - + + @Override + public int glGetProgramResourceIndex(final int program, final int programInterface, final String name) { + return GL43.glGetProgramResourceIndex(program, programInterface, name); + } + @Override - public void glDeleteVertexArrays(IntBuffer arrays) { + public void glShaderStorageBlockBinding(final int program, final int storageBlockIndex, final int storageBlockBinding) { + GL43.glShaderStorageBlockBinding(program, storageBlockIndex, storageBlockBinding); + } + + @Override + public void glDeleteVertexArrays(final IntBuffer arrays) { checkLimit(arrays); ARBVertexArrayObject.glDeleteVertexArrays(arrays); } + + @Override + public int glGetUniformBlockIndex(final int program, final String uniformBlockName) { + return GL31.glGetUniformBlockIndex(program, uniformBlockName); + } + + @Override + public void glBindBufferBase(final int target, final int index, final int buffer) { + GL30.glBindBufferBase(target, index, buffer); + } + + @Override + public void glUniformBlockBinding(final int program, final int uniformBlockIndex, final int uniformBlockBinding) { + GL31.glUniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding); + } } diff --git a/jme3-lwjgl3/src/main/java/com/jme3/renderer/lwjgl/LwjglGLExt.java b/jme3-lwjgl3/src/main/java/com/jme3/renderer/lwjgl/LwjglGLExt.java index 2ed2ec215..711833822 100644 --- a/jme3-lwjgl3/src/main/java/com/jme3/renderer/lwjgl/LwjglGLExt.java +++ b/jme3-lwjgl3/src/main/java/com/jme3/renderer/lwjgl/LwjglGLExt.java @@ -31,74 +31,65 @@ */ package com.jme3.renderer.lwjgl; -import com.jme3.renderer.RendererException; import com.jme3.renderer.opengl.GLExt; import org.lwjgl.opengl.*; -import java.nio.Buffer; import java.nio.FloatBuffer; import java.nio.IntBuffer; -public class LwjglGLExt implements GLExt { - - private static void checkLimit(Buffer buffer) { - if (buffer == null) { - return; - } - if (buffer.limit() == 0) { - throw new RendererException("Attempting to upload empty buffer (limit = 0), that's an error"); - } - if (buffer.remaining() == 0) { - throw new RendererException("Attempting to upload empty buffer (remaining = 0), that's an error"); - } - } +/** + * The LWJGL implementation og {@link GLExt}. + */ +public class LwjglGLExt extends LwjglRender implements GLExt { @Override - public void glBufferData(int target, IntBuffer data, int usage) { + public void glBufferData(final int target, final IntBuffer data, final int usage) { checkLimit(data); GL15.glBufferData(target, data, usage); } @Override - public void glBufferSubData(int target, long offset, IntBuffer data) { + public void glBufferSubData(final int target, final long offset, final IntBuffer data) { checkLimit(data); GL15.glBufferSubData(target, offset, data); } @Override - public void glDrawArraysInstancedARB(int mode, int first, int count, int primcount) { - ARBDrawInstanced.glDrawArraysInstancedARB(mode, first, count, primcount); + public void glDrawArraysInstancedARB(final int mode, final int first, final int count, final int primCount) { + ARBDrawInstanced.glDrawArraysInstancedARB(mode, first, count, primCount); } @Override - public void glDrawBuffers(IntBuffer bufs) { + public void glDrawBuffers(final IntBuffer bufs) { checkLimit(bufs); GL20.glDrawBuffers(bufs); } @Override - public void glDrawElementsInstancedARB(int mode, int indices_count, int type, long indices_buffer_offset, int primcount) { - ARBDrawInstanced.glDrawElementsInstancedARB(mode, indices_count, type, indices_buffer_offset, primcount); + public void glDrawElementsInstancedARB(final int mode, final int indicesCount, final int type, + final long indicesBufferOffset, final int primCount) { + ARBDrawInstanced.glDrawElementsInstancedARB(mode, indicesCount, type, indicesBufferOffset, primCount); } @Override - public void glGetMultisample(int pname, int index, FloatBuffer val) { + public void glGetMultisample(final int pname, final int index, final FloatBuffer val) { checkLimit(val); ARBTextureMultisample.glGetMultisamplefv(pname, index, val); } @Override - public void glTexImage2DMultisample(int target, int samples, int internalformat, int width, int height, boolean fixedsamplelocations) { - ARBTextureMultisample.glTexImage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations); + public void glTexImage2DMultisample(final int target, final int samples, final int internalFormat, final int width, + final int height, final boolean fixedSampleLocations) { + ARBTextureMultisample.glTexImage2DMultisample(target, samples, internalFormat, width, height, fixedSampleLocations); } @Override - public void glVertexAttribDivisorARB(int index, int divisor) { + public void glVertexAttribDivisorARB(final int index, final int divisor) { ARBInstancedArrays.glVertexAttribDivisorARB(index, divisor); } @Override - public Object glFenceSync(int condition, int flags) { + public Object glFenceSync(final int condition, final int flags) { return ARBSync.glFenceSync(condition, flags); } diff --git a/jme3-lwjgl3/src/main/java/com/jme3/renderer/lwjgl/LwjglGLFboEXT.java b/jme3-lwjgl3/src/main/java/com/jme3/renderer/lwjgl/LwjglGLFboEXT.java index ce2ebe806..52b268317 100644 --- a/jme3-lwjgl3/src/main/java/com/jme3/renderer/lwjgl/LwjglGLFboEXT.java +++ b/jme3-lwjgl3/src/main/java/com/jme3/renderer/lwjgl/LwjglGLFboEXT.java @@ -31,106 +31,99 @@ */ package com.jme3.renderer.lwjgl; -import com.jme3.renderer.RendererException; import com.jme3.renderer.opengl.GLFbo; import org.lwjgl.opengl.EXTFramebufferBlit; import org.lwjgl.opengl.EXTFramebufferMultisample; import org.lwjgl.opengl.EXTFramebufferObject; +import org.lwjgl.opengl.EXTTextureArray; -import java.nio.Buffer; import java.nio.IntBuffer; -import org.lwjgl.opengl.EXTTextureArray; /** * Implements GLFbo via GL_EXT_framebuffer_object. - * + * * @author Kirill Vainer */ -public class LwjglGLFboEXT implements GLFbo { - - private static void checkLimit(Buffer buffer) { - if (buffer == null) { - return; - } - if (buffer.limit() == 0) { - throw new RendererException("Attempting to upload empty buffer (limit = 0), that's an error"); - } - if (buffer.remaining() == 0) { - throw new RendererException("Attempting to upload empty buffer (remaining = 0), that's an error"); - } - } - +public class LwjglGLFboEXT extends LwjglRender implements GLFbo { + @Override - public void glBlitFramebufferEXT(int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1, int mask, int filter) { + public void glBlitFramebufferEXT(final int srcX0, final int srcY0, final int srcX1, final int srcY1, + final int dstX0, final int dstY0, final int dstX1, final int dstY1, final int mask, + final int filter) { EXTFramebufferBlit.glBlitFramebufferEXT(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); } - + @Override - public void glRenderbufferStorageMultisampleEXT(int target, int samples, int internalformat, int width, int height) { - EXTFramebufferMultisample.glRenderbufferStorageMultisampleEXT(target, samples, internalformat, width, height); + public void glRenderbufferStorageMultisampleEXT(final int target, final int samples, final int internalFormat, + final int width, final int height) { + EXTFramebufferMultisample.glRenderbufferStorageMultisampleEXT(target, samples, internalFormat, width, height); } - + @Override - public void glBindFramebufferEXT(int param1, int param2) { - EXTFramebufferObject.glBindFramebufferEXT(param1, param2); + public void glBindFramebufferEXT(final int target, final int frameBuffer) { + EXTFramebufferObject.glBindFramebufferEXT(target, frameBuffer); } - + @Override - public void glBindRenderbufferEXT(int param1, int param2) { - EXTFramebufferObject.glBindRenderbufferEXT(param1, param2); + public void glBindRenderbufferEXT(final int target, final int renderBuffer) { + EXTFramebufferObject.glBindRenderbufferEXT(target, renderBuffer); } - + @Override - public int glCheckFramebufferStatusEXT(int param1) { - return EXTFramebufferObject.glCheckFramebufferStatusEXT(param1); + public int glCheckFramebufferStatusEXT(final int target) { + return EXTFramebufferObject.glCheckFramebufferStatusEXT(target); } - + @Override - public void glDeleteFramebuffersEXT(IntBuffer param1) { - checkLimit(param1); - EXTFramebufferObject.glDeleteFramebuffersEXT(param1); + public void glDeleteFramebuffersEXT(final IntBuffer frameBuffers) { + checkLimit(frameBuffers); + EXTFramebufferObject.glDeleteFramebuffersEXT(frameBuffers); } - + @Override - public void glDeleteRenderbuffersEXT(IntBuffer param1) { - checkLimit(param1); - EXTFramebufferObject.glDeleteRenderbuffersEXT(param1); + public void glDeleteRenderbuffersEXT(final IntBuffer renderBuffers) { + checkLimit(renderBuffers); + EXTFramebufferObject.glDeleteRenderbuffersEXT(renderBuffers); } - + @Override - public void glFramebufferRenderbufferEXT(int param1, int param2, int param3, int param4) { - EXTFramebufferObject.glFramebufferRenderbufferEXT(param1, param2, param3, param4); + public void glFramebufferRenderbufferEXT(final int target, final int attachment, final int renderBufferTarget, + final int renderBuffer) { + EXTFramebufferObject.glFramebufferRenderbufferEXT(target, attachment, renderBufferTarget, renderBuffer); } - + @Override - public void glFramebufferTexture2DEXT(int param1, int param2, int param3, int param4, int param5) { - EXTFramebufferObject.glFramebufferTexture2DEXT(param1, param2, param3, param4, param5); + public void glFramebufferTexture2DEXT(final int target, final int attachment, final int texTarget, + final int texture, final int level) { + EXTFramebufferObject.glFramebufferTexture2DEXT(target, attachment, texTarget, texture, level); } - + @Override - public void glGenFramebuffersEXT(IntBuffer param1) { - checkLimit(param1); - EXTFramebufferObject.glGenFramebuffersEXT(param1); + public void glGenFramebuffersEXT(final IntBuffer frameBuffers) { + checkLimit(frameBuffers); + EXTFramebufferObject.glGenFramebuffersEXT(frameBuffers); } - + @Override - public void glGenRenderbuffersEXT(IntBuffer param1) { - checkLimit(param1); - EXTFramebufferObject.glGenRenderbuffersEXT(param1); + public void glGenRenderbuffersEXT(final IntBuffer renderBuffers) { + checkLimit(renderBuffers); + EXTFramebufferObject.glGenRenderbuffersEXT(renderBuffers); } - + @Override - public void glGenerateMipmapEXT(int param1) { - EXTFramebufferObject.glGenerateMipmapEXT(param1); + public void glGenerateMipmapEXT(final int target) { + EXTFramebufferObject.glGenerateMipmapEXT(target); } - + @Override - public void glRenderbufferStorageEXT(int param1, int param2, int param3, int param4) { - EXTFramebufferObject.glRenderbufferStorageEXT(param1, param2, param3, param4); + public void glRenderbufferStorageEXT(final int target, final int internalFormat, final int width, + final int height) { + EXTFramebufferObject.glRenderbufferStorageEXT(target, internalFormat, width, height); } - + @Override - public void glFramebufferTextureLayerEXT(int target, int attachment, int texture, int level, int layer) { + public void glFramebufferTextureLayerEXT(final int target, final int attachment, final int texture, final int level, + final int layer) { EXTTextureArray.glFramebufferTextureLayerEXT(target, attachment, texture, level, layer); } } diff --git a/jme3-lwjgl3/src/main/java/com/jme3/renderer/lwjgl/LwjglGLFboGL3.java b/jme3-lwjgl3/src/main/java/com/jme3/renderer/lwjgl/LwjglGLFboGL3.java index 39ed0a647..ba699b02a 100644 --- a/jme3-lwjgl3/src/main/java/com/jme3/renderer/lwjgl/LwjglGLFboGL3.java +++ b/jme3-lwjgl3/src/main/java/com/jme3/renderer/lwjgl/LwjglGLFboGL3.java @@ -31,103 +31,96 @@ */ package com.jme3.renderer.lwjgl; -import com.jme3.renderer.RendererException; import com.jme3.renderer.opengl.GLFbo; import org.lwjgl.opengl.GL30; -import java.nio.Buffer; import java.nio.IntBuffer; /** * Implements GLFbo via OpenGL3+. - * + * * @author Kirill Vainer */ -public class LwjglGLFboGL3 implements GLFbo { - - private static void checkLimit(Buffer buffer) { - if (buffer == null) { - return; - } - if (buffer.limit() == 0) { - throw new RendererException("Attempting to upload empty buffer (limit = 0), that's an error"); - } - if (buffer.remaining() == 0) { - throw new RendererException("Attempting to upload empty buffer (remaining = 0), that's an error"); - } - } - +public class LwjglGLFboGL3 extends LwjglRender implements GLFbo { + @Override - public void glBlitFramebufferEXT(int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1, int mask, int filter) { + public void glBlitFramebufferEXT(final int srcX0, final int srcY0, final int srcX1, final int srcY1, + final int dstX0, final int dstY0, final int dstX1, final int dstY1, final int mask, + final int filter) { GL30.glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); } - + @Override - public void glRenderbufferStorageMultisampleEXT(int target, int samples, int internalformat, int width, int height) { - GL30.glRenderbufferStorageMultisample(target, samples, internalformat, width, height); + public void glRenderbufferStorageMultisampleEXT(final int target, final int samples, final int internalFormat, + final int width, final int height) { + GL30.glRenderbufferStorageMultisample(target, samples, internalFormat, width, height); } - + @Override - public void glBindFramebufferEXT(int param1, int param2) { - GL30.glBindFramebuffer(param1, param2); + public void glBindFramebufferEXT(final int target, final int frameBuffer) { + GL30.glBindFramebuffer(target, frameBuffer); } - + @Override - public void glBindRenderbufferEXT(int param1, int param2) { - GL30.glBindRenderbuffer(param1, param2); + public void glBindRenderbufferEXT(final int target, final int renderBuffer) { + GL30.glBindRenderbuffer(target, renderBuffer); } - + @Override - public int glCheckFramebufferStatusEXT(int param1) { - return GL30.glCheckFramebufferStatus(param1); + public int glCheckFramebufferStatusEXT(final int target) { + return GL30.glCheckFramebufferStatus(target); } - + @Override - public void glDeleteFramebuffersEXT(IntBuffer param1) { - checkLimit(param1); - GL30.glDeleteFramebuffers(param1); + public void glDeleteFramebuffersEXT(final IntBuffer frameBuffers) { + checkLimit(frameBuffers); + GL30.glDeleteFramebuffers(frameBuffers); } - + @Override - public void glDeleteRenderbuffersEXT(IntBuffer param1) { - checkLimit(param1); - GL30.glDeleteRenderbuffers(param1); + public void glDeleteRenderbuffersEXT(final IntBuffer renderBuffers) { + checkLimit(renderBuffers); + GL30.glDeleteRenderbuffers(renderBuffers); } - + @Override - public void glFramebufferRenderbufferEXT(int param1, int param2, int param3, int param4) { - GL30.glFramebufferRenderbuffer(param1, param2, param3, param4); + public void glFramebufferRenderbufferEXT(final int target, final int attachment, final int renderBufferTarget, + final int renderBuffer) { + GL30.glFramebufferRenderbuffer(target, attachment, renderBufferTarget, renderBuffer); } - + @Override - public void glFramebufferTexture2DEXT(int param1, int param2, int param3, int param4, int param5) { - GL30.glFramebufferTexture2D(param1, param2, param3, param4, param5); + public void glFramebufferTexture2DEXT(final int target, final int attachment, final int texTarget, + final int texture, final int level) { + GL30.glFramebufferTexture2D(target, attachment, texTarget, texture, level); } - + @Override - public void glGenFramebuffersEXT(IntBuffer param1) { - checkLimit(param1); - GL30.glGenFramebuffers(param1); + public void glGenFramebuffersEXT(final IntBuffer frameBuffers) { + checkLimit(frameBuffers); + GL30.glGenFramebuffers(frameBuffers); } - + @Override - public void glGenRenderbuffersEXT(IntBuffer param1) { - checkLimit(param1); - GL30.glGenRenderbuffers(param1); + public void glGenRenderbuffersEXT(final IntBuffer renderBuffers) { + checkLimit(renderBuffers); + GL30.glGenRenderbuffers(renderBuffers); } - + @Override - public void glGenerateMipmapEXT(int param1) { - GL30.glGenerateMipmap(param1); + public void glGenerateMipmapEXT(final int target) { + GL30.glGenerateMipmap(target); } - + @Override - public void glRenderbufferStorageEXT(int param1, int param2, int param3, int param4) { - GL30.glRenderbufferStorage(param1, param2, param3, param4); + public void glRenderbufferStorageEXT(final int target, final int internalFormat, final int width, + final int height) { + GL30.glRenderbufferStorage(target, internalFormat, width, height); } - + @Override - public void glFramebufferTextureLayerEXT(int param1, int param2, int param3, int param4, int param5) { - GL30.glFramebufferTextureLayer(param1, param2, param3, param4, param5); + public void glFramebufferTextureLayerEXT(final int target, final int attachment, final int texture, final int level, + final int layer) { + GL30.glFramebufferTextureLayer(target, attachment, texture, level, layer); } } diff --git a/jme3-lwjgl3/src/main/java/com/jme3/renderer/lwjgl/LwjglRender.java b/jme3-lwjgl3/src/main/java/com/jme3/renderer/lwjgl/LwjglRender.java new file mode 100644 index 000000000..ebd8d94c3 --- /dev/null +++ b/jme3-lwjgl3/src/main/java/com/jme3/renderer/lwjgl/LwjglRender.java @@ -0,0 +1,25 @@ +package com.jme3.renderer.lwjgl; + +import com.jme3.renderer.RendererException; + +import java.nio.Buffer; + +/** + * The base class of LWJGL implementations. + * + * @author JavaSaBr + */ +public class LwjglRender { + + protected static void checkLimit(final Buffer buffer) { + if (buffer == null) { + return; + } + if (buffer.limit() == 0) { + throw new RendererException("Attempting to upload empty buffer (limit = 0), that's an error"); + } + if (buffer.remaining() == 0) { + throw new RendererException("Attempting to upload empty buffer (remaining = 0), that's an error"); + } + } +} diff --git a/jme3-lwjgl3/src/main/java/com/jme3/system/lwjgl/LwjglContext.java b/jme3-lwjgl3/src/main/java/com/jme3/system/lwjgl/LwjglContext.java index 3e9662668..845962cfe 100644 --- a/jme3-lwjgl3/src/main/java/com/jme3/system/lwjgl/LwjglContext.java +++ b/jme3-lwjgl3/src/main/java/com/jme3/system/lwjgl/LwjglContext.java @@ -33,12 +33,14 @@ package com.jme3.system.lwjgl; import static com.jme3.util.LWJGLBufferAllocator.PROPERTY_CONCURRENT_BUFFER_ALLOCATOR; +import static java.util.stream.Collectors.toSet; import static org.lwjgl.opencl.CL10.CL_CONTEXT_PLATFORM; import static org.lwjgl.opengl.GL.createCapabilities; import static org.lwjgl.opengl.GL11.glGetInteger; import com.jme3.input.lwjgl.GlfwJoystickInput; import com.jme3.input.lwjgl.GlfwKeyInput; import com.jme3.input.lwjgl.GlfwMouseInput; +import com.jme3.lwjgl3.utils.APIUtil; import com.jme3.opencl.Context; import com.jme3.opencl.DefaultPlatformChooser; import com.jme3.opencl.Device; @@ -61,6 +63,7 @@ import com.jme3.util.BufferAllocatorFactory; import com.jme3.util.LWJGLBufferAllocator; import com.jme3.util.LWJGLBufferAllocator.ConcurrentLWJGLBufferAllocator; import org.lwjgl.PointerBuffer; +import org.lwjgl.Version; import org.lwjgl.glfw.GLFW; import org.lwjgl.opencl.APPLEGLSharing; import org.lwjgl.opencl.CL10; @@ -69,11 +72,11 @@ import org.lwjgl.opengl.ARBDebugOutput; import org.lwjgl.opengl.ARBFramebufferObject; import org.lwjgl.opengl.EXTFramebufferMultisample; import org.lwjgl.opengl.GLCapabilities; +import org.lwjgl.system.MemoryStack; import org.lwjgl.system.Platform; import java.nio.IntBuffer; -import java.util.ArrayList; -import java.util.List; +import java.util.*; import java.util.concurrent.atomic.AtomicBoolean; import java.util.logging.Level; import java.util.logging.Logger; @@ -98,35 +101,48 @@ public abstract class LwjglContext implements JmeContext { } } + private static final Set SUPPORTED_RENDERS = new HashSet<>(Arrays.asList( + AppSettings.LWJGL_OPENGL2, + AppSettings.LWJGL_OPENGL3, + AppSettings.LWJGL_OPENGL33, + AppSettings.LWJGL_OPENGL4, + AppSettings.LWJGL_OPENGL41, + AppSettings.LWJGL_OPENGL42, + AppSettings.LWJGL_OPENGL43, + AppSettings.LWJGL_OPENGL44, + AppSettings.LWJGL_OPENGL45 + )); + public static final boolean CL_GL_SHARING_POSSIBLE = true; - - protected static final String THREAD_NAME = "jME3 Main"; - protected AtomicBoolean created = new AtomicBoolean(false); - protected AtomicBoolean renderable = new AtomicBoolean(false); protected final Object createdLock = new Object(); + protected final AtomicBoolean created = new AtomicBoolean(false); + protected final AtomicBoolean renderable = new AtomicBoolean(false); + protected final AppSettings settings = new AppSettings(true); - protected AppSettings settings = new AppSettings(true); - protected Renderer renderer; protected GlfwKeyInput keyInput; protected GlfwMouseInput mouseInput; protected GlfwJoystickInput joyInput; + protected Timer timer; + + protected Renderer renderer; protected SystemListener listener; protected com.jme3.opencl.lwjgl.LwjglContext clContext; - public void setSystemListener(SystemListener listener) { + @Override + public void setSystemListener(final SystemListener listener) { this.listener = listener; } protected void printContextInitInfo() { - logger.log(Level.INFO, "LWJGL {0} context running on thread {1}\n" - + " * Graphics Adapter: GLFW {2}", - new Object[]{org.lwjgl.Version.getVersion(), Thread.currentThread().getName(), GLFW.glfwGetVersionString()}); + logger.log(Level.INFO, "LWJGL {0} context running on thread {1}\n * Graphics Adapter: GLFW {2}", + APIUtil.toArray(Version.getVersion(), Thread.currentThread().getName(), GLFW.glfwGetVersionString())); } protected int determineMaxSamples() { + // If we already have a valid context, determine samples using current context. if (GLFW.glfwExtensionSupported("GL_ARB_framebuffer_object")) { return glGetInteger(ARBFramebufferObject.GL_MAX_SAMPLES); @@ -138,19 +154,19 @@ public abstract class LwjglContext implements JmeContext { } protected int getNumSamplesToUse() { + int samples = 0; + if (settings.getSamples() > 1) { samples = settings.getSamples(); final int supportedSamples = determineMaxSamples(); if (supportedSamples < samples) { - logger.log(Level.WARNING, - "Couldn't satisfy antialiasing samples requirement: x{0}. " - + "Video hardware only supports: x{1}", - new Object[]{samples, supportedSamples}); - + logger.log(Level.WARNING, "Couldn't satisfy antialiasing samples requirement: x{0}. " + + "Video hardware only supports: x{1}", APIUtil.toArray(samples, supportedSamples)); samples = supportedSamples; } } + return samples; } @@ -161,53 +177,42 @@ public abstract class LwjglContext implements JmeContext { if (!capabilities.OpenGL20) { throw new RendererException("OpenGL 2.0 or higher is required for jMonkeyEngine"); + } else if (!SUPPORTED_RENDERS.contains(renderer)) { + throw new UnsupportedOperationException("Unsupported renderer: " + renderer); } - if (renderer.equals(AppSettings.LWJGL_OPENGL2) - || renderer.equals(AppSettings.LWJGL_OPENGL3) - || renderer.equals(AppSettings.LWJGL_OPENGL33) - || renderer.equals(AppSettings.LWJGL_OPENGL4) - || renderer.equals(AppSettings.LWJGL_OPENGL41) - || renderer.equals(AppSettings.LWJGL_OPENGL42) - || renderer.equals(AppSettings.LWJGL_OPENGL43) - || renderer.equals(AppSettings.LWJGL_OPENGL44) - || renderer.equals(AppSettings.LWJGL_OPENGL45)) { - - GL gl = new LwjglGL(); - GLExt glext = new LwjglGLExt(); - GLFbo glfbo; - - if (capabilities.OpenGL30) { - glfbo = new LwjglGLFboGL3(); - } else { - glfbo = new LwjglGLFboEXT(); - } + GL gl = new LwjglGL(); + GLExt glext = new LwjglGLExt(); + GLFbo glfbo; - if (settings.getBoolean("GraphicsDebug")) { - gl = new GLDebugDesktop(gl, glext, glfbo); - glext = (GLExt) gl; - glfbo = (GLFbo) gl; - } + if (capabilities.OpenGL30) { + glfbo = new LwjglGLFboGL3(); + } else { + glfbo = new LwjglGLFboEXT(); + } - if (settings.getBoolean("GraphicsTiming")) { - GLTimingState timingState = new GLTimingState(); - gl = (GL) GLTiming.createGLTiming(gl, timingState, GL.class, GL2.class, GL3.class, GL4.class); - glext = (GLExt) GLTiming.createGLTiming(glext, timingState, GLExt.class); - glfbo = (GLFbo) GLTiming.createGLTiming(glfbo, timingState, GLFbo.class); - } + if (settings.getBoolean("GraphicsDebug")) { + gl = new GLDebugDesktop(gl, glext, glfbo); + glext = (GLExt) gl; + glfbo = (GLFbo) gl; + } - if (settings.getBoolean("GraphicsTrace")) { - gl = (GL) GLTracer.createDesktopGlTracer(gl, GL.class, GL2.class, GL3.class, GL4.class); - glext = (GLExt) GLTracer.createDesktopGlTracer(glext, GLExt.class); - glfbo = (GLFbo) GLTracer.createDesktopGlTracer(glfbo, GLFbo.class); - } + if (settings.getBoolean("GraphicsTiming")) { + GLTimingState timingState = new GLTimingState(); + gl = (GL) GLTiming.createGLTiming(gl, timingState, GL.class, GL2.class, GL3.class, GL4.class); + glext = (GLExt) GLTiming.createGLTiming(glext, timingState, GLExt.class); + glfbo = (GLFbo) GLTiming.createGLTiming(glfbo, timingState, GLFbo.class); + } - this.renderer = new GLRenderer(gl, glext, glfbo); - this.renderer.initialize(); - } else { - throw new UnsupportedOperationException("Unsupported renderer: " + renderer); + if (settings.getBoolean("GraphicsTrace")) { + gl = (GL) GLTracer.createDesktopGlTracer(gl, GL.class, GL2.class, GL3.class, GL4.class); + glext = (GLExt) GLTracer.createDesktopGlTracer(glext, GLExt.class); + glfbo = (GLFbo) GLTracer.createDesktopGlTracer(glfbo, GLFbo.class); } + this.renderer = new GLRenderer(gl, glext, glfbo); + this.renderer.initialize(); + if (capabilities.GL_ARB_debug_output && settings.getBoolean("GraphicsDebug")) { ARBDebugOutput.glDebugMessageCallbackARB(new LwjglGLDebugOutputHandler(), 0); } @@ -227,42 +232,41 @@ public abstract class LwjglContext implements JmeContext { if (joyInput != null) { joyInput.initialize(); } + renderable.set(true); - } /** * Returns a list of the available platforms, filtered by the specified * filter. - * + *

    * Copied from the old release * * @return the available platforms */ private static long[] getPlatforms() { - int[] count = new int[1]; - int errcode = CL10.clGetPlatformIDs(null, count); - Utils.checkError(errcode, "clGetDeviceIDs"); + try (MemoryStack stack = MemoryStack.stackPush()) { - int num_platforms = count[0]; - if (num_platforms == 0) { - return new long[0]; - } + final IntBuffer countBuffer = stack.callocInt(1); + int errcode = CL10.clGetPlatformIDs(null, countBuffer); + Utils.checkError(errcode, "clGetDeviceIDs"); - PointerBuffer platforms = PointerBuffer.allocateDirect(num_platforms); - errcode = CL10.clGetPlatformIDs(platforms, (IntBuffer) null); - Utils.checkError(errcode, "clGetDeviceIDs"); + final int count = countBuffer.get(); + final PointerBuffer pointer = stack.callocPointer(count); - platforms.rewind(); - long[] platformIDs = new long[num_platforms]; - for (int i = 0; i < num_platforms; i++) { - platformIDs[i] = platforms.get(); - } + errcode = CL10.clGetPlatformIDs(pointer, (IntBuffer) null); + Utils.checkError(errcode, "clGetDeviceIDs"); + + final long[] platformIDs = new long[count]; + for (int i = 0; i < count; i++) { + platformIDs[i] = pointer.get(); + } - return platformIDs; + return platformIDs; + } } - protected void initOpenCL(long window) { + protected void initOpenCL(final long window) { logger.info("Initialize OpenCL with LWJGL3"); // try { @@ -272,16 +276,18 @@ public abstract class LwjglContext implements JmeContext { // return; // } - //load platforms and devices + // load platforms and devices StringBuilder platformInfos = new StringBuilder(); - ArrayList platforms = new ArrayList<>(); - for (long p : getPlatforms()) { - platforms.add(new LwjglPlatform(p)); + List platforms = new ArrayList<>(); + for (long platformId : getPlatforms()) { + platforms.add(new LwjglPlatform(platformId)); } + platformInfos.append("Available OpenCL platforms:"); - for (int i=0; i choosenDevices = chooser.chooseDevices(platforms); - List devices = new ArrayList<>(choosenDevices.size()); - LwjglPlatform platform = null; - for (Device d : choosenDevices) { - if (!(d instanceof LwjglDevice)) { - logger.log(Level.SEVERE, "attempt to return a custom Device implementation from PlatformChooser: {0}", d); - return; - } - LwjglDevice ld = (LwjglDevice) d; - if (platform == null) { - platform = ld.getPlatform(); - } else if (platform != ld.getPlatform()) { - logger.severe("attempt to use devices from different platforms"); - return; - } - devices.add(ld.getDevice()); + + final List choosenDevices = chooser.chooseDevices(platforms); + final Optional unsupportedDevice = choosenDevices.stream() + .filter(dev -> !(dev instanceof LwjglDevice)) + .findAny(); + + if (unsupportedDevice.isPresent()) { + logger.log(Level.SEVERE, "attempt to return a custom Device implementation " + + "from PlatformChooser: {0}", unsupportedDevice.get()); + return; + } + + final Set lwjglPlatforms = choosenDevices.stream() + .map(LwjglDevice.class::cast) + .map(LwjglDevice::getPlatform) + .collect(toSet()); + + if (lwjglPlatforms.size() != 1) { + logger.severe("attempt to use devices from different platforms"); + return; } - if (devices.isEmpty()) { + + final long[] deviceIds = choosenDevices.stream() + .map(LwjglDevice.class::cast) + .mapToLong(LwjglDevice::getDevice) + .toArray(); + + if (deviceIds.length < 1) { logger.warning("no devices specified, no OpenCL context created"); return; } + + final LwjglPlatform platform = lwjglPlatforms.stream() + .findFirst() + .orElseThrow(() -> new RuntimeException("not found a platform")); + logger.log(Level.INFO, "chosen platform: {0}", platform.getName()); logger.log(Level.INFO, "chosen devices: {0}", choosenDevices); - //create context + // create context try { - long c = createContext(platform.getPlatform(), devices, window); - clContext = new com.jme3.opencl.lwjgl.LwjglContext(c, (List) choosenDevices); + long context = createContext(platform.getPlatform(), deviceIds, window); + clContext = new com.jme3.opencl.lwjgl.LwjglContext(context, (List) choosenDevices); } catch (final Exception ex) { logger.log(Level.SEVERE, "Unable to create OpenCL context", ex); return; @@ -358,50 +381,52 @@ public abstract class LwjglContext implements JmeContext { logger.info("OpenCL context created"); } - private long createContext(final long platform, final List devices, long window) throws Exception { - - final int propertyCount = 2 + 4 + 1; - final PointerBuffer properties = PointerBuffer.allocateDirect(propertyCount + devices.size()); - - //set sharing properties - //https://github.com/glfw/glfw/issues/104 - //https://github.com/LWJGL/lwjgl3/blob/master/modules/core/src/test/java/org/lwjgl/demo/opencl/Mandelbrot.java - //TODO: test on Linus and MacOSX - switch (Platform.get()) { - case WINDOWS: - properties - .put(KHRGLSharing.CL_GL_CONTEXT_KHR) - .put(org.lwjgl.glfw.GLFWNativeWGL.glfwGetWGLContext(window)) - .put(KHRGLSharing.CL_WGL_HDC_KHR) - .put(org.lwjgl.opengl.WGL.wglGetCurrentDC()); - break; - case LINUX: - properties - .put(KHRGLSharing.CL_GL_CONTEXT_KHR) - .put(org.lwjgl.glfw.GLFWNativeGLX.glfwGetGLXContext(window)) - .put(KHRGLSharing.CL_GLX_DISPLAY_KHR) - .put(org.lwjgl.glfw.GLFWNativeX11.glfwGetX11Display()); - break; - case MACOSX: - properties - .put(APPLEGLSharing.CL_CONTEXT_PROPERTY_USE_CGL_SHAREGROUP_APPLE) - .put(org.lwjgl.opengl.CGL.CGLGetShareGroup(org.lwjgl.opengl.CGL.CGLGetCurrentContext())); - } - properties.put(CL_CONTEXT_PLATFORM).put(platform); - properties.put(0); - properties.flip(); - - Utils.errorBuffer.rewind(); - PointerBuffer deviceBuffer = PointerBuffer.allocateDirect(devices.size()); - for (long d : devices) { - deviceBuffer.put(d); + private long createContext(final long platform, final long[] devices, long window) { + try (MemoryStack stack = MemoryStack.stackPush()) { + + final int propertyCount = 2 + 4 + 1; + final PointerBuffer properties = stack.callocPointer(propertyCount + devices.length); + + // set sharing properties + // https://github.com/glfw/glfw/issues/104 + // https://github.com/LWJGL/lwjgl3/blob/master/modules/core/src/test/java/org/lwjgl/demo/opencl/Mandelbrot.java + // TODO: test on Linux and MacOSX + switch (Platform.get()) { + case WINDOWS: + properties.put(KHRGLSharing.CL_GL_CONTEXT_KHR) + .put(org.lwjgl.glfw.GLFWNativeWGL.glfwGetWGLContext(window)) + .put(KHRGLSharing.CL_WGL_HDC_KHR) + .put(org.lwjgl.opengl.WGL.wglGetCurrentDC()); + break; + case LINUX: + properties.put(KHRGLSharing.CL_GL_CONTEXT_KHR) + .put(org.lwjgl.glfw.GLFWNativeGLX.glfwGetGLXContext(window)) + .put(KHRGLSharing.CL_GLX_DISPLAY_KHR) + .put(org.lwjgl.glfw.GLFWNativeX11.glfwGetX11Display()); + break; + case MACOSX: + properties.put(APPLEGLSharing.CL_CONTEXT_PROPERTY_USE_CGL_SHAREGROUP_APPLE) + .put(org.lwjgl.opengl.CGL.CGLGetShareGroup(org.lwjgl.opengl.CGL.CGLGetCurrentContext())); + } + + properties.put(CL_CONTEXT_PLATFORM).put(platform); + properties.put(0); + properties.flip(); + + final IntBuffer error = stack.callocInt(1); + final PointerBuffer deviceBuffer = stack.callocPointer(devices.length); + for (final long deviceId : devices) { + deviceBuffer.put(deviceId); + } + + deviceBuffer.flip(); + + long context = CL10.clCreateContext(properties, deviceBuffer, null, 0, error); + Utils.checkError(error, "clCreateContext"); + + return context; } - deviceBuffer.flip(); - long context = CL10.clCreateContext(properties, deviceBuffer, null, 0, Utils.errorBuffer); - Utils.checkError(Utils.errorBuffer, "clCreateContext"); - - return context; } public void internalDestroy() { @@ -419,7 +444,6 @@ public abstract class LwjglContext implements JmeContext { created.set(true); createdLock.notifyAll(); } - initContextFirstTime(); } diff --git a/jme3-lwjgl3/src/main/java/com/jme3/system/lwjgl/LwjglGLDebugOutputHandler.java b/jme3-lwjgl3/src/main/java/com/jme3/system/lwjgl/LwjglGLDebugOutputHandler.java index d03f54962..aa9c46511 100644 --- a/jme3-lwjgl3/src/main/java/com/jme3/system/lwjgl/LwjglGLDebugOutputHandler.java +++ b/jme3-lwjgl3/src/main/java/com/jme3/system/lwjgl/LwjglGLDebugOutputHandler.java @@ -75,14 +75,4 @@ class LwjglGLDebugOutputHandler extends GLDebugMessageARBCallback { System.err.println(String.format(MESSAGE_FORMAT, id, sourceStr, typeStr, severityStr, message)); } - - @Override - public void close() { - super.close(); - } - - @Override - public void callback(long args) { - super.callback(args); - } } diff --git a/jme3-lwjgl3/src/main/java/com/jme3/system/lwjgl/LwjglWindow.java b/jme3-lwjgl3/src/main/java/com/jme3/system/lwjgl/LwjglWindow.java index 24c6b3fd9..a5d8254db 100644 --- a/jme3-lwjgl3/src/main/java/com/jme3/system/lwjgl/LwjglWindow.java +++ b/jme3-lwjgl3/src/main/java/com/jme3/system/lwjgl/LwjglWindow.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -32,9 +32,6 @@ package com.jme3.system.lwjgl; -import static org.lwjgl.glfw.GLFW.*; -import static org.lwjgl.opengl.GL11.GL_FALSE; -import static org.lwjgl.system.MemoryUtil.NULL; import com.jme3.input.JoyInput; import com.jme3.input.KeyInput; import com.jme3.input.MouseInput; @@ -47,15 +44,20 @@ import com.jme3.system.JmeContext; import com.jme3.system.JmeSystem; import com.jme3.system.NanoTimer; import com.jme3.util.BufferUtils; -import org.lwjgl.Version; -import org.lwjgl.glfw.*; - import java.awt.*; import java.awt.image.BufferedImage; import java.nio.ByteBuffer; +import java.util.EnumSet; +import java.util.HashMap; +import java.util.Map; import java.util.concurrent.atomic.AtomicBoolean; import java.util.logging.Level; import java.util.logging.Logger; +import org.lwjgl.Version; +import org.lwjgl.glfw.*; +import static org.lwjgl.glfw.GLFW.*; +import static org.lwjgl.opengl.GL11.GL_FALSE; +import static org.lwjgl.system.MemoryUtil.NULL; /** * A wrapper class over the GLFW framework in LWJGL 3. @@ -66,6 +68,48 @@ public abstract class LwjglWindow extends LwjglContext implements Runnable { private static final Logger LOGGER = Logger.getLogger(LwjglWindow.class.getName()); + private static final EnumSet SUPPORTED_TYPES = EnumSet.of( + JmeContext.Type.Display, + JmeContext.Type.Canvas, + JmeContext.Type.OffscreenSurface); + + private static final Map RENDER_CONFIGS = new HashMap<>(); + + static { + RENDER_CONFIGS.put(AppSettings.LWJGL_OPENGL3, () -> { + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2); + }); + RENDER_CONFIGS.put(AppSettings.LWJGL_OPENGL33, () -> { + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); + }); + RENDER_CONFIGS.put(AppSettings.LWJGL_OPENGL4, () -> { + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0); + }); + RENDER_CONFIGS.put(AppSettings.LWJGL_OPENGL41, () -> { + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1); + }); + RENDER_CONFIGS.put(AppSettings.LWJGL_OPENGL42, () -> { + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2); + }); + RENDER_CONFIGS.put(AppSettings.LWJGL_OPENGL43, () -> { + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); + }); + RENDER_CONFIGS.put(AppSettings.LWJGL_OPENGL44, () -> { + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 4); + }); + RENDER_CONFIGS.put(AppSettings.LWJGL_OPENGL45, () -> { + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 5); + }); + } + protected final AtomicBoolean needClose = new AtomicBoolean(false); protected final AtomicBoolean needRestart = new AtomicBoolean(false); @@ -86,7 +130,8 @@ public abstract class LwjglWindow extends LwjglContext implements Runnable { protected boolean allowSwapBuffers = false; public LwjglWindow(final JmeContext.Type type) { - if (!JmeContext.Type.Display.equals(type) && !JmeContext.Type.OffscreenSurface.equals(type) && !JmeContext.Type.Canvas.equals(type)) { + + if (!SUPPORTED_TYPES.contains(type)) { throw new IllegalArgumentException("Unsupported type '" + type.name() + "' provided"); } @@ -101,7 +146,7 @@ public abstract class LwjglWindow extends LwjglContext implements Runnable { } /** - * Set the title if its a windowed display + * Set the title if it's a windowed display * * @param title the title to set */ @@ -112,7 +157,7 @@ public abstract class LwjglWindow extends LwjglContext implements Runnable { } /** - * Restart if its a windowed or full-screen display. + * Restart if it's a windowed or full-screen display. */ public void restart() { if (created.get()) { @@ -134,16 +179,6 @@ public abstract class LwjglWindow extends LwjglContext implements Runnable { final String message = GLFWErrorCallback.getDescription(description); listener.handleError(message, new Exception(message)); } - - @Override - public void close(){ - super.close(); - } - - @Override - public void callback(long args) { - super.callback(args); - } }); if (!glfwInit()) { @@ -157,36 +192,12 @@ public abstract class LwjglWindow extends LwjglContext implements Runnable { glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GLFW_TRUE); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); - if (renderer.equals(AppSettings.LWJGL_OPENGL3)) { - glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); - glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2); - } else if (renderer.equals(AppSettings.LWJGL_OPENGL33)) { - glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); - glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); - } else if (renderer.equals(AppSettings.LWJGL_OPENGL4)) { - glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); - glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0); - } else if (renderer.equals(AppSettings.LWJGL_OPENGL41)) { - glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); - glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1); - } else if (renderer.equals(AppSettings.LWJGL_OPENGL42)) { - glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); - glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2); - } else if (renderer.equals(AppSettings.LWJGL_OPENGL43)) { - glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); - glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); - } else if (renderer.equals(AppSettings.LWJGL_OPENGL44)) { - glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); - glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 4); - } else if (renderer.equals(AppSettings.LWJGL_OPENGL45)) { - glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); - glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 5); - } else { + RENDER_CONFIGS.computeIfAbsent(renderer, s -> () -> { glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GLFW_FALSE); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_ANY_PROFILE); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0); - } + }).run(); if (settings.getBoolean("RendererDebug")) { glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GLFW_TRUE); @@ -242,16 +253,6 @@ public abstract class LwjglWindow extends LwjglContext implements Runnable { settings.setResolution(width, height); listener.reshape(width, height); } - - @Override - public void close() { - super.close(); - } - - @Override - public void callback(long args) { - super.callback(args); - } }); glfwSetWindowFocusCallback(window, windowFocusCallback = new GLFWWindowFocusCallback() { @@ -264,20 +265,9 @@ public abstract class LwjglWindow extends LwjglContext implements Runnable { } else { listener.loseFocus(); } - wasActive = !wasActive; } } - - @Override - public void close() { - super.close(); - } - - @Override - public void callback(long args) { - super.callback(args); - } }); // Center the window @@ -392,6 +382,10 @@ public abstract class LwjglWindow extends LwjglContext implements Runnable { } if (errorCallback != null) { + + // We need to specifically set this to null as we might set a new callback before we reinit GLFW + glfwSetErrorCallback(null); + errorCallback.close(); errorCallback = null; } @@ -410,6 +404,8 @@ public abstract class LwjglWindow extends LwjglContext implements Runnable { glfwDestroyWindow(window); window = NULL; } + + glfwTerminate(); } catch (final Exception ex) { listener.handleError("Failed to destroy context", ex); } @@ -434,15 +430,12 @@ public abstract class LwjglWindow extends LwjglContext implements Runnable { try { if (!JmeSystem.isLowPermissions()) { // Enable uncaught exception handler only for current thread - Thread.currentThread().setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { - @Override - public void uncaughtException(Thread thread, Throwable thrown) { - listener.handleError("Uncaught exception thrown in " + thread.toString(), thrown); - if (needClose.get()) { - // listener.handleError() has requested the - // context to close. Satisfy request. - deinitInThread(); - } + Thread.currentThread().setUncaughtExceptionHandler((thread, thrown) -> { + listener.handleError("Uncaught exception thrown in " + thread.toString(), thrown); + if (needClose.get()) { + // listener.handleError() has requested the + // context to close. Satisfy request. + deinitInThread(); } }); } @@ -560,7 +553,6 @@ public abstract class LwjglWindow extends LwjglContext implements Runnable { /** * De-initialize in the OpenGL thread. */ - protected void deinitInThread() { listener.destroy(); @@ -600,6 +592,7 @@ public abstract class LwjglWindow extends LwjglContext implements Runnable { deinitInThread(); } + @Override public JoyInput getJoyInput() { if (joyInput == null) { joyInput = new GlfwJoystickInput(); @@ -607,6 +600,7 @@ public abstract class LwjglWindow extends LwjglContext implements Runnable { return joyInput; } + @Override public MouseInput getMouseInput() { if (mouseInput == null) { mouseInput = new GlfwMouseInput(this); @@ -614,22 +608,25 @@ public abstract class LwjglWindow extends LwjglContext implements Runnable { return mouseInput; } + @Override public KeyInput getKeyInput() { if (keyInput == null) { keyInput = new GlfwKeyInput(this); } - return keyInput; } + @Override public TouchInput getTouchInput() { return null; } + @Override public void setAutoFlushFrames(boolean enabled) { this.autoFlush = enabled; } + @Override public void destroy(boolean waitFor) { needClose.set(true); diff --git a/jme3-networking/src/main/java/com/jme3/network/base/KernelAdapter.java b/jme3-networking/src/main/java/com/jme3/network/base/KernelAdapter.java index 6d6fcef7b..0cddbdd24 100644 --- a/jme3-networking/src/main/java/com/jme3/network/base/KernelAdapter.java +++ b/jme3-networking/src/main/java/com/jme3/network/base/KernelAdapter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -152,7 +152,7 @@ public class KernelAdapter extends Thread * than for any user-code safety. 99% of the time the user code should * be writing for multithreaded access anyway. * - *

    The issue with the messages is that if a an implementation is + *

    The issue with the messages is that if an implementation is * using a general thread pool then it would be possible for a * naive implementation to have one thread grab an Envelope from * connection 1's and another grab the next Envelope. Since an Envelope diff --git a/jme3-networking/src/main/java/com/jme3/network/base/NioKernelFactory.java b/jme3-networking/src/main/java/com/jme3/network/base/NioKernelFactory.java index 1f44fed0a..024c4d009 100644 --- a/jme3-networking/src/main/java/com/jme3/network/base/NioKernelFactory.java +++ b/jme3-networking/src/main/java/com/jme3/network/base/NioKernelFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -37,7 +37,7 @@ import java.io.IOException; /** - * KernelFactory implemention for creating TCP kernels + * KernelFactory implementation for creating TCP kernels * using the NIO selector model. * * @version $Revision$ diff --git a/jme3-networking/src/main/java/com/jme3/network/service/rmi/RmiHostedService.java b/jme3-networking/src/main/java/com/jme3/network/service/rmi/RmiHostedService.java index ebd0e5908..766627464 100644 --- a/jme3-networking/src/main/java/com/jme3/network/service/rmi/RmiHostedService.java +++ b/jme3-networking/src/main/java/com/jme3/network/service/rmi/RmiHostedService.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015 jMonkeyEngine + * Copyright (c) 2015-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -150,7 +150,7 @@ public class RmiHostedService extends AbstractHostedService { * Set to true if all new connections should automatically have RMI hosting started. * Set to false if the game-specific connection setup will call startHostingOnConnection() * after some connection setup is done (for example, logging in). Note: generally - * is is safe to autohost RMI as long as callers are careful about what they've added + * is safe to autohost RMI as long as callers are careful about what they've added * using shareGlobal(). One reasonable use-case is to shareGlobal() some kind of login * service and nothing else. All other shared objects would then be added as connection * specific objects during successful login processing. @@ -167,7 +167,7 @@ public class RmiHostedService extends AbstractHostedService { } /** - * Returns the RMI registry for the specific HostedConection. Each connection + * Returns the RMI registry for the specific HostedConnection. Each connection * has its own registry with its own connection-specific shared objects. */ public RmiRegistry getRmiRegistry( HostedConnection hc ) { diff --git a/jme3-networking/src/main/java/com/jme3/network/util/AbstractMessageDelegator.java b/jme3-networking/src/main/java/com/jme3/network/util/AbstractMessageDelegator.java index a73496ea8..f8b1be2f5 100644 --- a/jme3-networking/src/main/java/com/jme3/network/util/AbstractMessageDelegator.java +++ b/jme3-networking/src/main/java/com/jme3/network/util/AbstractMessageDelegator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015 jMonkeyEngine + * Copyright (c) 2015-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -90,7 +90,7 @@ public abstract class AbstractMessageDelegator /** * Returns true if the specified method is valid for the specified * message type. This is used internally during automapping to - * provide implementation specific filting of methods. + * provide implementation specific filtering of methods. * This implementation checks for methods that take either the connection and message * type arguments (in that order) or just the message type. */ @@ -129,7 +129,7 @@ public abstract class AbstractMessageDelegator /** * Convenience method that returns the message type as - * reflecively determined for a particular method. This + * reflectively determined for a particular method. This * only works with methods that actually have arguments. * This implementation returns the last element of the method's * getParameterTypes() array, thus supporting both @@ -167,7 +167,7 @@ public abstract class AbstractMessageDelegator /** * Returns true if the specified method name is allowed. * This is used by automapping to determine if a method - * should be rejected purely on name. Default implemention + * should be rejected purely on name. Default implementation * always returns true. */ protected boolean allowName( String name ) { diff --git a/jme3-niftygui/build.gradle b/jme3-niftygui/build.gradle index 4945ea407..7db287711 100644 --- a/jme3-niftygui/build.gradle +++ b/jme3-niftygui/build.gradle @@ -2,17 +2,11 @@ if (!hasProperty('mainClass')) { ext.mainClass = '' } -repositories { - maven{ - url 'http://nifty-gui.sourceforge.net/nifty-maven-repo' - } -} - dependencies { compile project(':jme3-core') - compile 'lessvoid:nifty:1.4.1' - compile 'lessvoid:nifty-default-controls:1.4.1' - compile 'lessvoid:nifty-style-black:1.4.1' + compile 'com.github.nifty-gui:nifty:1.4.2' + compile 'com.github.nifty-gui:nifty-default-controls:1.4.2' + compile 'com.github.nifty-gui:nifty-style-black:1.4.2' } ext.pomConfig = { @@ -44,4 +38,4 @@ ext.pomConfig = { url "http://nifty-gui.sourceforge.net/nifty-maven-repo" } } -} \ No newline at end of file +} diff --git a/jme3-niftygui/src/main/java/com/jme3/niftygui/InputSystemJme.java b/jme3-niftygui/src/main/java/com/jme3/niftygui/InputSystemJme.java index d76fc0b20..38c7427f1 100644 --- a/jme3-niftygui/src/main/java/com/jme3/niftygui/InputSystemJme.java +++ b/jme3-niftygui/src/main/java/com/jme3/niftygui/InputSystemJme.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -95,7 +95,7 @@ public class InputSystemJme implements InputSystem, RawInputListener { /** * @param height The height of the viewport. Used to convert - * buttom-left origin to upper-left origin. + * bottom-left origin to upper-left origin. */ public void setHeight(int height) { this.height = height; @@ -179,7 +179,7 @@ public class InputSystemJme implements InputSystem, RawInputListener { } private void onTouchEventQueued(TouchEvent evt, NiftyInputConsumer nic) { - if (inputManager.getSimulateMouse()) { + if (inputManager.isSimulateMouse()) { return; } @@ -311,7 +311,7 @@ public class InputSystemJme implements InputSystem, RawInputListener { final TextField textField = element.getNiftyControl(TextField.class); if (textField != null) { Logger.getLogger(InputSystemJme.class.getName()).log(Level.FINE, "Current TextField: {0}", textField.getId()); - String initialValue = textField.getText(); + String initialValue = textField.getRealText(); if (initialValue == null) { initialValue = ""; } diff --git a/jme3-niftygui/src/main/java/com/jme3/niftygui/JmeBatchRenderBackend.java b/jme3-niftygui/src/main/java/com/jme3/niftygui/JmeBatchRenderBackend.java index 9dd831020..a8947fdea 100644 --- a/jme3-niftygui/src/main/java/com/jme3/niftygui/JmeBatchRenderBackend.java +++ b/jme3-niftygui/src/main/java/com/jme3/niftygui/JmeBatchRenderBackend.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -219,7 +219,7 @@ public class JmeBatchRenderBackend implements BatchRenderBackend { @Override public Image loadImage(final ByteBuffer imageData, final int imageWidth, final int imageHeight) { - return new ImageImpl(new com.jme3.texture.Image(Format.RGBA8, imageWidth, imageHeight, imageData)); + return new ImageImpl(new com.jme3.texture.Image(Format.RGBA8, imageWidth, imageHeight, imageData, ColorSpace.Linear)); } @Override diff --git a/jme3-niftygui/src/main/java/com/jme3/niftygui/NiftyJmeDisplay.java b/jme3-niftygui/src/main/java/com/jme3/niftygui/NiftyJmeDisplay.java index 4f6d6de7b..435890151 100644 --- a/jme3-niftygui/src/main/java/com/jme3/niftygui/NiftyJmeDisplay.java +++ b/jme3-niftygui/src/main/java/com/jme3/niftygui/NiftyJmeDisplay.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -52,7 +52,7 @@ import com.jme3.texture.FrameBuffer; import de.lessvoid.nifty.Nifty; import de.lessvoid.nifty.render.batch.BatchRenderConfiguration; import de.lessvoid.nifty.render.batch.BatchRenderDevice; -import de.lessvoid.nifty.tools.TimeProvider; +import de.lessvoid.nifty.spi.time.impl.AccurateTimeProvider; import de.lessvoid.nifty.tools.resourceloader.ResourceLocation; public class NiftyJmeDisplay implements SceneProcessor { @@ -167,7 +167,7 @@ public class NiftyJmeDisplay implements SceneProcessor { * * Currently you have to make sure to not use more image space than this single texture provides. However, Nifty * tries to be smart about this and internally will make sure that only the images are uploaded that your GUI - * really needs. So in general this shoudln't be an issue. + * really needs. So in general this shouldn't be an issue. * * A complete re-organisation of the texture atlas happens when a Nifty screen ends and another begins. Dynamically * adding images while a screen is running is supported as well. @@ -210,7 +210,7 @@ public class NiftyJmeDisplay implements SceneProcessor { new BatchRenderDevice(batchRendererBackend, batchRenderConfiguration), soundDev, inputSys, - new TimeProvider()); + new AccurateTimeProvider()); inputSys.setNifty(nifty); resourceLocation = new ResourceLocationJme(); @@ -233,7 +233,7 @@ public class NiftyJmeDisplay implements SceneProcessor { new BatchRenderDevice(batchRendererBackend, batchRenderConfiguration), soundDev, inputSys, - new TimeProvider()); + new AccurateTimeProvider()); inputSys.setNifty(nifty); resourceLocation = new ResourceLocationJme(); @@ -259,7 +259,7 @@ public class NiftyJmeDisplay implements SceneProcessor { this.renderDev = new RenderDeviceJme(this); this.batchRendererBackend = null; - nifty = new Nifty(renderDev, soundDev, inputSys, new TimeProvider()); + nifty = new Nifty(renderDev, soundDev, inputSys, new AccurateTimeProvider()); inputSys.setNifty(nifty); resourceLocation = new ResourceLocationJme(); diff --git a/jme3-niftygui/src/main/java/com/jme3/niftygui/SoundDeviceJme.java b/jme3-niftygui/src/main/java/com/jme3/niftygui/SoundDeviceJme.java index d7eeea71d..7868468e9 100644 --- a/jme3-niftygui/src/main/java/com/jme3/niftygui/SoundDeviceJme.java +++ b/jme3-niftygui/src/main/java/com/jme3/niftygui/SoundDeviceJme.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -32,6 +32,7 @@ package com.jme3.niftygui; import com.jme3.asset.AssetManager; +import com.jme3.audio.AudioData; import com.jme3.audio.AudioNode; import com.jme3.audio.AudioRenderer; import de.lessvoid.nifty.sound.SoundSystem; @@ -53,7 +54,7 @@ public class SoundDeviceJme implements SoundDevice { } public SoundHandle loadSound(SoundSystem soundSystem, String filename) { - AudioNode an = new AudioNode(assetManager, filename, false); + AudioNode an = new AudioNode(assetManager, filename, AudioData.DataType.Buffer); an.setPositional(false); return new SoundHandleJme(ar, an); } diff --git a/jme3-niftygui/src/main/java/com/jme3/niftygui/SoundHandleJme.java b/jme3-niftygui/src/main/java/com/jme3/niftygui/SoundHandleJme.java index 97f84bc56..545f3d201 100644 --- a/jme3-niftygui/src/main/java/com/jme3/niftygui/SoundHandleJme.java +++ b/jme3-niftygui/src/main/java/com/jme3/niftygui/SoundHandleJme.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -32,6 +32,7 @@ package com.jme3.niftygui; import com.jme3.asset.AssetManager; +import com.jme3.audio.AudioData; import com.jme3.audio.AudioNode; import com.jme3.audio.AudioSource.Status; import com.jme3.audio.AudioRenderer; @@ -77,7 +78,7 @@ public class SoundHandleJme implements SoundHandle { node.stop(); } - node = new AudioNode(am, fileName, true); + node = new AudioNode(am, fileName,AudioData.DataType.Stream); node.setPositional(false); node.setVolume(volume); node.play(); diff --git a/jme3-plugins/src/fbx/java/com/jme3/scene/plugins/fbx/SceneLoader.java b/jme3-plugins/src/fbx/java/com/jme3/scene/plugins/fbx/SceneLoader.java index accbdbbf4..43565837a 100644 --- a/jme3-plugins/src/fbx/java/com/jme3/scene/plugins/fbx/SceneLoader.java +++ b/jme3-plugins/src/fbx/java/com/jme3/scene/plugins/fbx/SceneLoader.java @@ -72,7 +72,7 @@ public class SceneLoader implements AssetLoader { // Scene objects private Map allObjects = new HashMap<>(); // All supported FBX objects private Map skinMap = new HashMap<>(); // Skin for bone clusters - private Map alayerMap = new HashMap<>(); // Amination layers + private Map alayerMap = new HashMap<>(); // Animation layers public Map modelMap = new HashMap<>(); // Nodes private Map limbMap = new HashMap<>(); // Nodes that are actually bones private Map bindMap = new HashMap<>(); // Node bind poses @@ -309,7 +309,7 @@ public class SceneLoader implements AssetLoader { animList.add(layer.name, layer.name, 0, -1); } } - // Extract aminations + // Extract animations HashMap anims = new HashMap(); for(AnimInverval animInfo : animList.list) { float realLength = 0; diff --git a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GlbLoader.java b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GlbLoader.java index 7ca499c9d..c3fe31103 100644 --- a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GlbLoader.java +++ b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GlbLoader.java @@ -22,9 +22,6 @@ public class GlbLoader extends GltfLoader { int magic = stream.readInt(); int version = stream.readInt(); int length = stream.readInt(); - System.err.println(magic == GLTF_MAGIC ? "gltf" : "no no no"); - System.err.println(version); - System.err.println(length); byte[] json = null; @@ -37,7 +34,6 @@ public class GlbLoader extends GltfLoader { if (chunkType == JSON_TYPE) { json = new byte[chunkLength]; stream.read(json); - System.err.println(new String(json)); } else { byte[] bin = new byte[chunkLength]; stream.read(bin); diff --git a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfLoader.java b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfLoader.java index a3a59f3a7..260e018e6 100644 --- a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfLoader.java +++ b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfLoader.java @@ -2,7 +2,7 @@ package com.jme3.scene.plugins.gltf; import com.google.gson.*; import com.google.gson.stream.JsonReader; -import com.jme3.animation.*; +import com.jme3.anim.*; import com.jme3.asset.*; import com.jme3.material.Material; import com.jme3.material.RenderState; @@ -11,6 +11,7 @@ import com.jme3.renderer.Camera; import com.jme3.renderer.queue.RenderQueue; import com.jme3.scene.*; import com.jme3.scene.control.CameraControl; +import com.jme3.scene.mesh.MorphTarget; import com.jme3.texture.Texture; import com.jme3.texture.Texture2D; import com.jme3.util.IntMap; @@ -19,6 +20,8 @@ import com.jme3.util.mikktspace.MikktspaceTangentGenerator; import javax.xml.bind.DatatypeConverter; import java.io.*; import java.nio.Buffer; +import java.nio.FloatBuffer; +import java.rmi.ServerError; import java.util.*; import java.util.logging.Level; import java.util.logging.Logger; @@ -83,6 +86,7 @@ public class GltfLoader implements AssetLoader { try { dataCache.clear(); info = assetInfo; + skinnedSpatials.clear(); rootNode = new Node(); if (defaultMat == null) { @@ -127,6 +131,13 @@ public class GltfLoader implements AssetLoader { rootNode = customContentManager.readExtensionAndExtras("root", docRoot, rootNode); + //Loading animations + if (animations != null) { + for (int i = 0; i < animations.size(); i++) { + readAnimation(i); + } + } + setupControls(); //only one scene let's not return the root. @@ -177,13 +188,6 @@ public class GltfLoader implements AssetLoader { } - //Loading animations - if (animations != null) { - for (int i = 0; i < animations.size(); i++) { - readAnimation(i); - } - } - //Setting the default scene cul hint to inherit. int activeChild = 0; if (defaultScene != null) { @@ -195,7 +199,7 @@ public class GltfLoader implements AssetLoader { public Object readNode(int nodeIndex) throws IOException { Object obj = fetchFromCache("nodes", nodeIndex, Object.class); if (obj != null) { - if (obj instanceof BoneWrapper) { + if (obj instanceof JointWrapper) { //the node can be a previously loaded bone let's return it return obj; } else { @@ -244,8 +248,11 @@ public class GltfLoader implements AssetLoader { Integer skinIndex = getAsInteger(nodeData, "skin"); if (skinIndex != null) { SkinData skinData = fetchFromCache("skins", skinIndex, SkinData.class); - List spatials = skinnedSpatials.get(skinData); - spatials.add(spatial); + if (skinData != null) { + List spatials = skinnedSpatials.get(skinData); + spatials.add(spatial); + skinData.used = true; + } } spatial.setLocalTransform(readTransforms(nodeData)); @@ -272,12 +279,15 @@ public class GltfLoader implements AssetLoader { readChild(spatial, child); } } - } else if (loaded instanceof BoneWrapper) { + } else if (loaded instanceof JointWrapper) { //parent is the Armature Node, we have to apply its transforms to the root bone's animation data - BoneWrapper bw = (BoneWrapper) loaded; + JointWrapper bw = (JointWrapper) loaded; bw.isRoot = true; SkinData skinData = fetchFromCache("skins", bw.skinIndex, SkinData.class); - skinData.armatureTransforms = parent.getLocalTransform(); + if (skinData == null) { + return; + } + skinData.parent = parent; } } @@ -382,7 +392,7 @@ public class GltfLoader implements AssetLoader { //the buffers will be setup if ever used. VertexBuffer weightsHW = new VertexBuffer(VertexBuffer.Type.HWBoneWeight); VertexBuffer indicesHW = new VertexBuffer(VertexBuffer.Type.HWBoneIndex); - //setting usage to cpuOnly so that the buffer is not send empty to the GPU + //setting usage to cpuOnly so that the buffer is not sent empty to the GPU indicesHW.setUsage(VertexBuffer.Usage.CpuOnly); weightsHW.setUsage(VertexBuffer.Usage.CpuOnly); mesh.setBuffer(weightsHW); @@ -390,6 +400,22 @@ public class GltfLoader implements AssetLoader { mesh.generateBindPose(); } + JsonArray targets = meshObject.getAsJsonArray("targets"); + if(targets != null){ + for (JsonElement target : targets) { + MorphTarget morphTarget = new MorphTarget(); + for (Map.Entry entry : target.getAsJsonObject().entrySet()) { + String bufferType = entry.getKey(); + VertexBuffer.Type type = getVertexBufferType(bufferType); + VertexBuffer vb = readAccessorData(entry.getValue().getAsInt(), new VertexBufferPopulator(type)); + if (vb != null) { + morphTarget.setBuffer(type, (FloatBuffer)vb.getData()); + } + } + mesh.addMorphTarget(morphTarget); + } + } + mesh = customContentManager.readExtensionAndExtras("primitive", meshObject, mesh); Geometry geom = new Geometry(null, mesh); @@ -418,7 +444,6 @@ public class GltfLoader implements AssetLoader { geomArray[index] = geom; index++; - //TODO targets(morph anim...) } geomArray = customContentManager.readExtensionAndExtras("mesh", meshData, geomArray); @@ -713,7 +738,8 @@ public class GltfLoader implements AssetLoader { assertNotNull(samplers, "No samplers for animation " + name); //temp data storage of track data - TrackData[] animatedNodes = new TrackData[nodes.size()]; + TrackData[] tracks = new TrackData[nodes.size()]; + boolean hasMorphTrack = false; for (JsonElement channel : channels) { @@ -726,16 +752,17 @@ public class GltfLoader implements AssetLoader { continue; } assertNotNull(targetPath, "No target path for channel"); - - if (targetPath.equals("weight")) { - //Morph animation, not implemented in JME, let's warn the user and skip the channel - logger.log(Level.WARNING, "Morph animation is not supported by JME yet, skipping animation"); - continue; - } - TrackData trackData = animatedNodes[targetNode]; +// +// if (targetPath.equals("weights")) { +// //Morph animation, not implemented in JME, let's warn the user and skip the channel +// logger.log(Level.WARNING, "Morph animation is not supported by JME yet, skipping animation track"); +// continue; +// } + + TrackData trackData = tracks[targetNode]; if (trackData == null) { trackData = new TrackData(); - animatedNodes[targetNode] = trackData; + tracks[targetNode] = trackData; } Integer samplerIndex = getAsInteger(channel.getAsJsonObject(), "sampler"); @@ -774,13 +801,12 @@ public class GltfLoader implements AssetLoader { Quaternion[] rotations = readAccessorData(dataIndex, quaternionArrayPopulator); trackData.rotations = rotations; } else { - //TODO support weights - logger.log(Level.WARNING, "Morph animation is not supported"); - animatedNodes[targetNode] = null; - continue; - + trackData.timeArrays.add(new TrackData.TimeData(times, TrackData.Type.Morph)); + float[] weights = readAccessorData(dataIndex, floatArrayPopulator); + trackData.weights = weights; + hasMorphTrack = true; } - animatedNodes[targetNode] = customContentManager.readExtensionAndExtras("channel", channel, trackData); + tracks[targetNode] = customContentManager.readExtensionAndExtras("channel", channel, trackData); } if (name == null) { @@ -788,66 +814,97 @@ public class GltfLoader implements AssetLoader { } List spatials = new ArrayList<>(); - Animation anim = new Animation(); - anim.setName(name); + AnimClip anim = new AnimClip(name); + List aTracks = new ArrayList<>(); int skinIndex = -1; - for (int i = 0; i < animatedNodes.length; i++) { - TrackData trackData = animatedNodes[i]; - if (trackData == null) { + List usedJoints = new ArrayList<>(); + for (int i = 0; i < tracks.length; i++) { + TrackData trackData = tracks[i]; + if (trackData == null || trackData.timeArrays.isEmpty()) { continue; } trackData.update(); - if (trackData.length > anim.getLength()) { - anim.setLength(trackData.length); - } Object node = fetchFromCache("nodes", i, Object.class); if (node instanceof Spatial) { Spatial s = (Spatial) node; spatials.add(s); - SpatialTrack track = new SpatialTrack(trackData.times, trackData.translations, trackData.rotations, trackData.scales); - track.setTrackSpatial(s); - anim.addTrack(track); - } else if (node instanceof BoneWrapper) { - BoneWrapper b = (BoneWrapper) node; - //apply the inverseBindMatrix to animation data. - b.update(trackData); - BoneTrack track = new BoneTrack(b.boneIndex, trackData.times, trackData.translations, trackData.rotations, trackData.scales); - anim.addTrack(track); + if (trackData.rotations != null || trackData.translations != null || trackData.scales != null) { + TransformTrack track = new TransformTrack(s, trackData.times, trackData.translations, trackData.rotations, trackData.scales); + aTracks.add(track); + } + if( trackData.weights != null && s instanceof Geometry){ + Geometry g = (Geometry)s; + int nbMorph = g.getMesh().getMorphTargets().length; +// for (int k = 0; k < trackData.weights.length; k++) { +// System.err.print(trackData.weights[k] + ","); +// if(k % nbMorph == 0 && k!=0){ +// System.err.println(" "); +// } +// } + MorphTrack track = new MorphTrack(g, trackData.times, trackData.weights, nbMorph); + aTracks.add(track); + } + } else if (node instanceof JointWrapper) { + JointWrapper jw = (JointWrapper) node; + usedJoints.add(jw.joint); + if (skinIndex == -1) { - skinIndex = b.skinIndex; + skinIndex = jw.skinIndex; } else { - //Check if all bones affected by this animation are from the same skin, otherwise raise an error. - if (skinIndex != b.skinIndex) { - throw new AssetLoadException("Animation " + animationIndex + " (" + name + ") applies to bones that are not from the same skin: skin " + skinIndex + ", bone " + b.bone.getName() + " from skin " + b.skinIndex); + //Check if all joints affected by this animation are from the same skin, the track will be skipped. + if (skinIndex != jw.skinIndex) { + logger.log(Level.WARNING, "Animation " + animationIndex + " (" + name + ") applies to joints that are not from the same skin: skin " + skinIndex + ", joint " + jw.joint.getName() + " from skin " + jw.skinIndex); + continue; } - //else everything is fine. } + + TransformTrack track = new TransformTrack(jw.joint, trackData.times, trackData.translations, trackData.rotations, trackData.scales); + aTracks.add(track); } } - anim = customContentManager.readExtensionAndExtras("animations", animation, anim); - + // Check each bone to see if their local pose is different from their bind pose. + // If it is, we ensure that the bone has an animation track, else JME way of applying anim transforms will apply the bind pose to those bones, + // instead of the local pose that is supposed to be the default if (skinIndex != -1) { - //we have a bone animation. SkinData skin = fetchFromCache("skins", skinIndex, SkinData.class); - if (skin.animControl == null) { - skin.animControl = new AnimControl(skin.skeletonControl.getSkeleton()); + for (Joint joint : skin.joints) { + if (!usedJoints.contains(joint)) { + //create a track + float[] times = new float[]{0}; + + Vector3f[] translations = new Vector3f[]{joint.getLocalTranslation()}; + Quaternion[] rotations = new Quaternion[]{joint.getLocalRotation()}; + Vector3f[] scales = new Vector3f[]{joint.getLocalScale()}; + TransformTrack track = new TransformTrack(joint, times, translations, rotations, scales); + aTracks.add(track); + } } - skin.animControl.addAnim(anim); - //the controls will be added to the right spatial in setupControls() } + anim.setTracks(aTracks.toArray(new AnimTrack[aTracks.size()])); + + anim = customContentManager.readExtensionAndExtras("animations", animation, anim); + + if (skinIndex != -1) { + //we have a armature animation. + SkinData skin = fetchFromCache("skins", skinIndex, SkinData.class); + skin.animComposer.addAnimClip(anim); + } if (!spatials.isEmpty()) { - //Note that it's pretty unlikely to have an animation that is both a spatial animation and a bone animation...But you never know. The specs doesn't forbids it if (skinIndex != -1) { - //there are some spatial tracks in this bone animation... or the other way around. Let's add the spatials in the skinnedSpatials. + //there are some spatial or moph tracks in this bone animation... or the other way around. Let's add the spatials in the skinnedSpatials. SkinData skin = fetchFromCache("skins", skinIndex, SkinData.class); List spat = skinnedSpatials.get(skin); spat.addAll(spatials); //the animControl will be added in the setupControls(); + if (hasMorphTrack && skin.morphControl == null) { + skin.morphControl = new MorphControl(); + } } else { + //Spatial animation Spatial spatial = null; if (spatials.size() == 1) { spatial = spatials.get(0); @@ -855,12 +912,15 @@ public class GltfLoader implements AssetLoader { spatial = findCommonAncestor(spatials); } - AnimControl control = spatial.getControl(AnimControl.class); - if (control == null) { - control = new AnimControl(); - spatial.addControl(control); + AnimComposer composer = spatial.getControl(AnimComposer.class); + if (composer == null) { + composer = new AnimComposer(); + spatial.addControl(composer); + } + composer.addAnimClip(anim); + if (hasMorphTrack && spatial.getControl(MorphControl.class) == null) { + spatial.addControl(new MorphControl()); } - control.addAnim(anim); } } } @@ -894,6 +954,7 @@ public class GltfLoader implements AssetLoader { //no skins, no bone animation. return; } + List allJoints = new ArrayList<>(); for (int index = 0; index < skins.size(); index++) { JsonObject skin = skins.get(index).getAsJsonObject(); @@ -901,8 +962,17 @@ public class GltfLoader implements AssetLoader { //It's not mandatory and exporters tends to mix up how it should be used because the specs are not clear. //Anyway we have other means to detect both armature structures and root bones. - JsonArray joints = skin.getAsJsonArray("joints"); - assertNotNull(joints, "No joints defined for skin"); + JsonArray jsonJoints = skin.getAsJsonArray("joints"); + assertNotNull(jsonJoints, "No joints defined for skin"); + int idx = allJoints.indexOf(jsonJoints); + if (idx >= 0) { + //skin already exists let's just set it in the cache + SkinData sd = fetchFromCache("skins", idx, SkinData.class); + addToCache("skins", index, sd, nodes.size()); + continue; + } else { + allJoints.add(jsonJoints); + } //These inverse bind matrices, once inverted again, will give us the real bind pose of the bones (in model space), //since the skeleton in not guaranteed to be exported in bind pose. @@ -911,134 +981,85 @@ public class GltfLoader implements AssetLoader { if (matricesIndex != null) { inverseBindMatrices = readAccessorData(matricesIndex, matrix4fArrayPopulator); } else { - inverseBindMatrices = new Matrix4f[joints.size()]; + inverseBindMatrices = new Matrix4f[jsonJoints.size()]; for (int i = 0; i < inverseBindMatrices.length; i++) { inverseBindMatrices[i] = new Matrix4f(); } } - Bone[] bones = new Bone[joints.size()]; - for (int i = 0; i < joints.size(); i++) { - int boneIndex = joints.get(i).getAsInt(); - //we don't need the inverse bind matrix, we need the bind matrix so let's invert it. - Matrix4f modelBindMatrix = inverseBindMatrices[i].invertLocal(); - bones[i] = readNodeAsBone(boneIndex, i, index, modelBindMatrix); + Joint[] joints = new Joint[jsonJoints.size()]; + for (int i = 0; i < jsonJoints.size(); i++) { + int boneIndex = jsonJoints.get(i).getAsInt(); + Matrix4f inverseModelBindMatrix = inverseBindMatrices[i]; + joints[i] = readNodeAsBone(boneIndex, i, index, inverseModelBindMatrix); } - for (int i = 0; i < joints.size(); i++) { - findChildren(joints.get(i).getAsInt()); + for (int i = 0; i < jsonJoints.size(); i++) { + findChildren(jsonJoints.get(i).getAsInt()); } - Skeleton skeleton = new Skeleton(bones); - - //Compute bind transforms. We need to do it from root bone to leaves bone. - for (Bone bone : skeleton.getRoots()) { - BoneWrapper bw = findBoneWrapper(bone); - computeBindTransforms(bw, skeleton); - } - - if (isKeepSkeletonPose(info)) { - //Set local transforms. The skeleton may come in a given pose, that is not the rest pose, so let's apply it. - for (int i = 0; i < joints.size(); i++) { - applyPose(joints.get(i).getAsInt()); - } - skeleton.updateWorldVectors(); - } - - skeleton = customContentManager.readExtensionAndExtras("skin", skin, skeleton); + Armature armature = new Armature(joints); + armature = customContentManager.readExtensionAndExtras("skin", skin, armature); SkinData skinData = new SkinData(); - skinData.skeletonControl = new SkeletonControl(skeleton); + skinData.joints = joints; + skinData.skinningControl = new SkinningControl(armature); + skinData.animComposer = new AnimComposer(); addToCache("skins", index, skinData, nodes.size()); skinnedSpatials.put(skinData, new ArrayList()); - } - } - private void applyPose(int index) { - BoneWrapper bw = fetchFromCache("nodes", index, BoneWrapper.class); - bw.bone.setUserControl(true); - bw.bone.setLocalTranslation(bw.localTransform.getTranslation()); - bw.bone.setLocalRotation(bw.localTransform.getRotation()); - bw.bone.setLocalScale(bw.localTransform.getScale()); - bw.bone.setUserControl(false); - } - - private void computeBindTransforms(BoneWrapper boneWrapper, Skeleton skeleton) { - Bone bone = boneWrapper.bone; - tmpTransforms.fromTransformMatrix(boneWrapper.modelBindMatrix); - if (bone.getParent() != null) { - //root bone, model transforms are the same as the local transforms - //but for child bones we need to combine it with the parents inverse model transforms. - tmpMat.setTranslation(bone.getParent().getModelSpacePosition()); - tmpMat.setRotationQuaternion(bone.getParent().getModelSpaceRotation()); - tmpMat.setScale(bone.getParent().getModelSpaceScale()); - tmpMat.invertLocal(); - tmpTransforms2.fromTransformMatrix(tmpMat); - tmpTransforms.combineWithParent(tmpTransforms2); - } - bone.setBindTransforms(tmpTransforms.getTranslation(), tmpTransforms.getRotation(), tmpTransforms.getScale()); - - //resets the local transforms to bind transforms for all bones. - //then computes the model transforms from local transforms for each bone. - skeleton.resetAndUpdate(); - skeleton.setBindingPose(); - for (Integer childIndex : boneWrapper.children) { - BoneWrapper child = fetchFromCache("nodes", childIndex, BoneWrapper.class); - computeBindTransforms(child, skeleton); - } - - } - - private BoneWrapper findBoneWrapper(Bone bone) { - for (int i = 0; i < nodes.size(); i++) { - BoneWrapper bw = fetchFromCache("nodes", i, BoneWrapper.class); - if (bw != null && bw.bone == bone) { - return bw; - } + armature.update(); + armature.saveInitialPose(); } - return null; } - public Bone readNodeAsBone(int nodeIndex, int boneIndex, int skinIndex, Matrix4f modelBindMatrix) throws IOException { + public Joint readNodeAsBone(int nodeIndex, int jointIndex, int skinIndex, Matrix4f inverseModelBindMatrix) throws IOException { - BoneWrapper boneWrapper = fetchFromCache("nodes", nodeIndex, BoneWrapper.class); - if (boneWrapper != null) { - return boneWrapper.bone; + JointWrapper jointWrapper = fetchFromCache("nodes", nodeIndex, JointWrapper.class); + if (jointWrapper != null) { + return jointWrapper.joint; } JsonObject nodeData = nodes.get(nodeIndex).getAsJsonObject(); String name = getAsString(nodeData, "name"); if (name == null) { - name = "Bone_" + nodeIndex; + name = "Joint_" + nodeIndex; } - Bone bone = new Bone(name); + Joint joint = new Joint(name); Transform boneTransforms = null; - if (isKeepSkeletonPose(info)) { - boneTransforms = readTransforms(nodeData); - } - addToCache("nodes", nodeIndex, new BoneWrapper(bone, boneIndex, skinIndex, modelBindMatrix, boneTransforms), nodes.size()); + boneTransforms = readTransforms(nodeData); + joint.setLocalTransform(boneTransforms); + joint.setInverseModelBindMatrix(inverseModelBindMatrix); + + addToCache("nodes", nodeIndex, new JointWrapper(joint, jointIndex, skinIndex), nodes.size()); - return bone; + return joint; } private void findChildren(int nodeIndex) throws IOException { - BoneWrapper bw = fetchFromCache("nodes", nodeIndex, BoneWrapper.class); + JointWrapper jw = fetchFromCache("nodes", nodeIndex, JointWrapper.class); JsonObject nodeData = nodes.get(nodeIndex).getAsJsonObject(); JsonArray children = nodeData.getAsJsonArray("children"); if (children != null) { for (JsonElement child : children) { int childIndex = child.getAsInt(); - BoneWrapper cbw = fetchFromCache("nodes", childIndex, BoneWrapper.class); - if (cbw != null) { - bw.bone.addChild(cbw.bone); - bw.children.add(childIndex); + if (jw.children.contains(childIndex)) { + //bone already has the child in its children + continue; + } + JointWrapper cjw = fetchFromCache("nodes", childIndex, JointWrapper.class); + if (cjw != null) { + jw.joint.addChild(cjw.joint); + jw.children.add(childIndex); } else { - JsonObject childNode = nodes.get(childIndex).getAsJsonObject(); - //The child might be a Geom - if (getAsInteger(childNode, "mesh") != null) { - //this is a geometry, let's load it as a spatial - bw.attachedSpatial = (Spatial) readNode(childIndex); - } + //The child might be a Node + //Creating a dummy node to read the subgraph + Node n = new Node(); + readChild(n, child); + Spatial s = n.getChild(0); + //removing the spatial from the dummy node, it will be attached to the attachment node of the bone + s.removeFromParent(); + jw.attachedSpatial = s; } } @@ -1048,40 +1069,38 @@ public class GltfLoader implements AssetLoader { private void setupControls() { for (SkinData skinData : skinnedSpatials.keySet()) { List spatials = skinnedSpatials.get(skinData); - Spatial spatial; if (spatials.isEmpty()) { - //can happen when a file contains a skin that is not used by any mesh... continue; } + Spatial spatial = skinData.parent; + if (spatials.size() >= 1) { spatial = findCommonAncestor(spatials); - } else { - spatial = spatials.get(0); } - AnimControl animControl = spatial.getControl(AnimControl.class); - if (animControl != null) { - //The spatial already has an anim control, we need to merge it with the one in skinData. Then remove it. - for (String name : animControl.getAnimationNames()) { - Animation anim = animControl.getAnim(name); - skinData.animControl.addAnim(anim); - } - spatial.removeControl(animControl); +// if (spatial != skinData.parent) { +// skinData.rootBoneTransformOffset = spatial.getWorldTransform().invert(); +// if (skinData.parent != null) { +// skinData.rootBoneTransformOffset.combineWithParent(skinData.parent.getWorldTransform()); +// } +// } + + if (skinData.animComposer != null && skinData.animComposer.getSpatial() == null) { + spatial.addControl(skinData.animComposer); } - - if (skinData.animControl != null) { - spatial.addControl(skinData.animControl); + spatial.addControl(skinData.skinningControl); + if (skinData.morphControl != null) { + spatial.addControl(skinData.morphControl); } - spatial.addControl(skinData.skeletonControl); } for (int i = 0; i < nodes.size(); i++) { - BoneWrapper bw = fetchFromCache("nodes", i, BoneWrapper.class); + JointWrapper bw = fetchFromCache("nodes", i, JointWrapper.class); if (bw == null || bw.attachedSpatial == null) { continue; } SkinData skinData = fetchFromCache("skins", bw.skinIndex, SkinData.class); - skinData.skeletonControl.getAttachmentsNode(bw.bone.getName()).attachChild(bw.attachedSpatial); + skinData.skinningControl.getAttachmentsNode(bw.joint.getName()).attachChild(bw.attachedSpatial); } } @@ -1138,102 +1157,30 @@ public class GltfLoader implements AssetLoader { } - private class BoneWrapper { - Bone bone; - int boneIndex; + private class JointWrapper { + Joint joint; + int jointIndex; int skinIndex; - Transform localTransform; - Matrix4f modelBindMatrix; boolean isRoot = false; Spatial attachedSpatial; List children = new ArrayList<>(); - public BoneWrapper(Bone bone, int boneIndex, int skinIndex, Matrix4f modelBindMatrix, Transform localTransform) { - this.bone = bone; - this.boneIndex = boneIndex; + public JointWrapper(Joint joint, int jointIndex, int skinIndex) { + this.joint = joint; + this.jointIndex = jointIndex; this.skinIndex = skinIndex; - this.modelBindMatrix = modelBindMatrix; - this.localTransform = localTransform; - } - - /** - * Applies the inverse Bind transforms to anim data. and the armature transforms if relevant. - */ - public void update(TrackData data) { - Transform bindTransforms = new Transform(bone.getBindPosition(), bone.getBindRotation(), bone.getBindScale()); - SkinData skinData = fetchFromCache("skins", skinIndex, SkinData.class); - - for (int i = 0; i < data.getNbKeyFrames(); i++) { - - Vector3f translation = getTranslation(data, bindTransforms, i); - Quaternion rotation = getRotation(data, bindTransforms, i); - Vector3f scale = getScale(data, bindTransforms, i); - - Transform t = new Transform(translation, rotation, scale); - if (isRoot) { - //Apply the armature transforms to the root bone anim track. - t.combineWithParent(skinData.armatureTransforms); - } - - //This is wrong - //You'd normally combine those transforms with transform.combineWithParent() - //Here we actually do in reverse what JME does to combine anim transforms with bind transfoms (add trans/mult rot/ mult scale) - //The code to fix is in Bone.blendAnimTransforms - //TODO fix blendAnimTransforms - t.getTranslation().subtractLocal(bindTransforms.getTranslation()); - t.getScale().divideLocal(bindTransforms.getScale()); - tmpQuat.set(bindTransforms.getRotation()).inverseLocal().multLocal(t.getRotation()); - t.setRotation(tmpQuat); - - if(data.translations != null) { - data.translations[i] = t.getTranslation(); - } - if(data.rotations != null) { - data.rotations[i] = t.getRotation(); - } - if(data.scales != null) { - data.scales[i] = t.getScale(); - } - } - - data.ensureTranslationRotations(); - } - - private Vector3f getTranslation(TrackData data, Transform bindTransforms, int i) { - Vector3f translation; - if(data.translations == null){ - translation = bindTransforms.getTranslation(); - } else { - translation = data.translations[i]; - } - return translation; - } - - private Quaternion getRotation(TrackData data, Transform bindTransforms, int i) { - Quaternion rotation; - if(data.rotations == null){ - rotation = bindTransforms.getRotation(); - } else { - rotation = data.rotations[i]; - } - return rotation; - } - - private Vector3f getScale(TrackData data, Transform bindTransforms, int i) { - Vector3f scale; - if(data.scales == null){ - scale = bindTransforms.getScale(); - } else { - scale = data.scales[i]; - } - return scale; } } private class SkinData { - SkeletonControl skeletonControl; - AnimControl animControl; - Transform armatureTransforms; + SkinningControl skinningControl; + MorphControl morphControl; + AnimComposer animComposer; + Spatial spatial; + Spatial parent; + Transform rootBoneTransformOffset; + Joint[] joints; + boolean used = false; } public static class SkinBuffers { @@ -1250,10 +1197,6 @@ public class GltfLoader implements AssetLoader { } } - private class TextureData { - byte[] data; - } - private interface Populator { T populate(Integer bufferViewIndex, int componentType, String type, int count, int byteOffset, boolean normalized) throws IOException; } @@ -1323,6 +1266,27 @@ public class GltfLoader implements AssetLoader { } } +// +// private class FloaGridPopulator implements Populator { +// +// @Override +// public float[][] populate(Integer bufferViewIndex, int componentType, String type, int count, int byteOffset, boolean normalized) throws IOException { +// +// int numComponents = getNumberOfComponents(type); +// int dataSize = numComponents * count; +// float[] data = new float[dataSize]; +// +// if (bufferViewIndex == null) { +// //no referenced buffer, specs says to pad the data with zeros. +// padBuffer(data, dataSize); +// } else { +// readBuffer(bufferViewIndex, byteOffset, count, data, numComponents, getVertexBufferFormat(componentType)); +// } +// +// return data; +// } +// +// } private class Vector3fArrayPopulator implements Populator { diff --git a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfUtils.java b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfUtils.java index b5fd0614a..1e6ebfcd6 100644 --- a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfUtils.java +++ b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfUtils.java @@ -486,6 +486,8 @@ public class GltfUtils { mesh.setBuffer(VertexBuffer.Type.BoneIndex, 4, BufferUtils.createShortBuffer(jointsArray)); } mesh.setBuffer(VertexBuffer.Type.BoneWeight, 4, BufferUtils.createFloatBuffer(weightsArray)); + mesh.getBuffer(VertexBuffer.Type.BoneIndex).setUsage(VertexBuffer.Usage.CpuOnly); + mesh.getBuffer(VertexBuffer.Type.BoneWeight).setUsage(VertexBuffer.Usage.CpuOnly); } private static void populateFloatArray(float[] array, LittleEndien stream, int count, int byteOffset, int byteStride, int numComponents, VertexBuffer.Format format) throws IOException { @@ -685,6 +687,74 @@ public class GltfUtils { } } +// public static boolean equalBindAndLocalTransforms(Joint b) { +// return equalsEpsilon(b.getBindPosition(), b.getLocalPosition()) +// && equalsEpsilon(b.getBindRotation(), b.getLocalRotation()) +// && equalsEpsilon(b.getBindScale(), b.getLocalScale()); +// } + + private static float epsilon = 0.0001f; + + public static boolean equalsEpsilon(Vector3f v1, Vector3f v2) { + return FastMath.abs(v1.x - v2.x) < epsilon + && FastMath.abs(v1.y - v2.y) < epsilon + && FastMath.abs(v1.z - v2.z) < epsilon; + } + + public static boolean equalsEpsilon(Quaternion q1, Quaternion q2) { + return (FastMath.abs(q1.getX() - q2.getX()) < epsilon + && FastMath.abs(q1.getY() - q2.getY()) < epsilon + && FastMath.abs(q1.getZ() - q2.getZ()) < epsilon + && FastMath.abs(q1.getW() - q2.getW()) < epsilon) + || + (FastMath.abs(q1.getX() + q2.getX()) < epsilon + && FastMath.abs(q1.getY() + q2.getY()) < epsilon + && FastMath.abs(q1.getZ() + q2.getZ()) < epsilon + && FastMath.abs(q1.getW() + q2.getW()) < epsilon); + } + + + public static void dumpArray(Object[] array) { + if (array == null) { + System.err.println("null"); + return; + } + for (int i = 0; i < array.length; i++) { + Object o = array[i]; + System.err.print(i + ": "); + if (o instanceof Quaternion) { + Quaternion q = (Quaternion) o; + System.err.print("("); + if (q.getX() > 0.00001) System.err.print(q.getX() + ", "); + else System.err.print("0.0, "); + if (q.getY() > 0.00001) System.err.print(q.getY() + ", "); + else System.err.print("0.0, "); + if (q.getZ() > 0.00001) System.err.print(q.getZ() + ", "); + else System.err.print("0.0, "); + if (q.getW() > 0.00001) System.err.print(q.getW() + ", "); + else System.err.print("0.0, "); + System.err.println(")"); + } else { + System.err.println(o.toString() + ", "); + } + } + System.err.println(""); + } + + public static void dumpArray(float[] array) { + if (array == null) { + System.err.println("null"); + return; + } + + for (int i = 0; i < array.length; i++) { + float o = array[i]; + System.err.println(i + ": " + o); + } + + System.err.println(""); + } + public static Spatial findCommonAncestor(List spatials) { Map> flatParents = new HashMap<>(); @@ -704,6 +774,9 @@ public class GltfUtils { while (true) { for (Spatial spatial : flatParents.keySet()) { List parents = flatParents.get(spatial); + if (parents.isEmpty()) { + continue; + } if (index == parents.size()) { //we reached the end of a spatial hierarchy let's return; return lastCommonParent; diff --git a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/MaterialAdapter.java b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/MaterialAdapter.java index 6662a4200..602ad961f 100644 --- a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/MaterialAdapter.java +++ b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/MaterialAdapter.java @@ -13,7 +13,7 @@ import java.util.Map; /** * A MaterialAdapter allows to map a GLTF material to a JME material. - * It maps each gltf parameter to it's matching parameter in the JME material, + * It maps each gltf parameter to its matching parameter in the JME material, * and allows for some conversion if the JME material model doesn't exactly match the gltf material model * Created by Nehon on 08/08/2017. */ diff --git a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/TrackData.java b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/TrackData.java index fdbf892fa..f5e0154f3 100644 --- a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/TrackData.java +++ b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/TrackData.java @@ -1,5 +1,6 @@ package com.jme3.scene.plugins.gltf; +import com.jme3.asset.AssetLoadException; import com.jme3.math.*; import java.util.*; @@ -9,7 +10,8 @@ public class TrackData { public enum Type { Translation, Rotation, - Scale + Scale, + Morph } Float length; @@ -20,7 +22,6 @@ public class TrackData { Vector3f[] translations; Quaternion[] rotations; Vector3f[] scales; - //not used for now float[] weights; public void update() { @@ -35,8 +36,15 @@ public class TrackData { List keyFrames = new ArrayList<>(); TimeData timeData = timeArrays.get(0); Type type = timeData.type; + float lastTime = -1f; for (int i = 0; i < timeData.times.length; i++) { float time = timeData.times[i]; + //avoid some double keyframes that can have bad effects on interpolation + if (Float.floatToIntBits(time) == Float.floatToIntBits(lastTime)) { + lastTime = time; + continue; + } + lastTime = time; KeyFrame keyFrame = new KeyFrame(); keyFrame.time = time; setKeyFrameTransforms(type, keyFrame, timeData.times); @@ -78,13 +86,13 @@ public class TrackData { KeyFrame kf = keyFrames.get(i); //we need Interpolate between keyframes when transforms are sparse. times[i] = kf.time; - if(translations != null) { + if (translations != null) { populateTransform(Type.Translation, i, keyFrames, kf, translationIndices); } - if(rotations != null) { + if (rotations != null) { populateTransform(Type.Rotation, i, keyFrames, kf, rotationIndices); } - if(scales != null) { + if (scales != null) { populateTransform(Type.Scale, i, keyFrames, kf, scaleIndices); } } @@ -117,11 +125,28 @@ public class TrackData { System.arraycopy(scales, 0, newScales, 1, scales.length); scales = newScales; } + if (weights != null) { + int nbMorph = weights.length / (times.length - 1); + float[] newWeights = new float[weights.length + nbMorph]; + System.arraycopy(weights, 0, newWeights, 0, nbMorph); + System.arraycopy(weights, 0, newWeights, nbMorph, weights.length); + weights = newWeights; + } } + checkTimesConsistantcy(); + length = times[times.length - 1]; } + public void checkTimesConsistantcy() { + if ((translations != null && times.length != translations.length) + || (rotations != null && times.length != rotations.length) + || (scales != null && times.length != scales.length)) { + throw new AssetLoadException("Inconsistent animation sampling "); + } + } + private void populateTransform(Type type, int index, List keyFrames, KeyFrame currentKeyFrame, TransformIndices transformIndices) { Object transform = getTransform(type, currentKeyFrame); if (transform != null) { @@ -177,15 +202,9 @@ public class TrackData { return -1; } - public int getNbKeyFrames(){ - if(translations != null){ - return translations.length; - } - if(rotations != null){ - return rotations.length; - } - if(scales != null){ - return scales.length; + public int getNbKeyFrames() { + if (times != null) { + return times.length; } return 0; } @@ -234,13 +253,13 @@ public class TrackData { } private void ensureArraysLength() { - if (translations != null && translations.length < times.length) { + if (translations != null && translations.length != times.length) { translations = new Vector3f[times.length]; } - if (rotations != null && rotations.length < times.length) { + if (rotations != null && rotations.length != times.length) { rotations = new Quaternion[times.length]; } - if (scales != null && scales.length < times.length) { + if (scales != null && scales.length != times.length) { scales = new Vector3f[times.length]; } } @@ -248,17 +267,23 @@ public class TrackData { //JME assumes there are translation and rotation track every time, so we create them with identity transforms if they don't exist //TODO change this behavior in BoneTrack. - public void ensureTranslationRotations() { + public void ensureTranslationRotations(Transform localTransforms) { if (translations == null) { translations = new Vector3f[times.length]; for (int i = 0; i < translations.length; i++) { - translations[i] = new Vector3f(); + translations[i] = localTransforms.getTranslation(); } } if (rotations == null) { rotations = new Quaternion[times.length]; for (int i = 0; i < rotations.length; i++) { - rotations[i] = new Quaternion(); + rotations[i] = localTransforms.getRotation(); + } + } + if (scales == null) { + scales = new Vector3f[times.length]; + for (int i = 0; i < scales.length; i++) { + scales[i] = localTransforms.getScale(); } } } @@ -318,4 +343,4 @@ public class TrackData { Vector3f scale; } -} \ No newline at end of file +} diff --git a/jme3-plugins/src/main/java/com/jme3/material/plugin/export/materialdef/J3mdTechniqueDefWriter.java b/jme3-plugins/src/main/java/com/jme3/material/plugin/export/materialdef/J3mdTechniqueDefWriter.java index 23e30953a..eabfda1c0 100644 --- a/jme3-plugins/src/main/java/com/jme3/material/plugin/export/materialdef/J3mdTechniqueDefWriter.java +++ b/jme3-plugins/src/main/java/com/jme3/material/plugin/export/materialdef/J3mdTechniqueDefWriter.java @@ -5,14 +5,17 @@ */ package com.jme3.material.plugin.export.materialdef; -import com.jme3.material.*; +import com.jme3.material.MatParam; +import com.jme3.material.RenderState; +import com.jme3.material.TechniqueDef; import com.jme3.shader.*; -import java.io.*; +import java.io.IOException; +import java.io.OutputStreamWriter; import java.util.Collection; -import java.util.regex.*; - -import static java.util.regex.Pattern.compile; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; /** * @author nehon @@ -168,47 +171,79 @@ public class J3mdTechniqueDefWriter { out.write(shaderNode.getDefinition().getPath()); out.write("\n"); - out.write(" InputMappings{\n"); - for (VariableMapping mapping : shaderNode.getInputMapping()) { - writeVariableMapping(out, shaderNode, mapping, matParams); - } - out.write(" }\n"); + final List inputMapping = shaderNode.getInputMapping(); + final List outputMapping = shaderNode.getOutputMapping(); - out.write(" OutputMappings{\n"); - for (VariableMapping mapping : shaderNode.getOutputMapping()) { - writeVariableMapping(out, shaderNode, mapping, matParams); + if (!inputMapping.isEmpty()) { + out.write(" InputMappings {\n"); + for (VariableMapping mapping : inputMapping) { + writeVariableMapping(out, shaderNode, mapping, matParams); + } + out.write(" }\n"); } - out.write(" }\n"); + if (!outputMapping.isEmpty()) { + out.write(" OutputMappings {\n"); + for (VariableMapping mapping : outputMapping) { + writeVariableMapping(out, shaderNode, mapping, matParams); + } + out.write(" }\n"); + } out.write(" }\n"); } - private void writeVariableMapping(OutputStreamWriter out, ShaderNode shaderNode, VariableMapping mapping, Collection matParams) throws IOException { + private void writeVariableMapping(final OutputStreamWriter out, final ShaderNode shaderNode, + final VariableMapping mapping, final Collection matParams) + throws IOException { + + final ShaderNodeVariable leftVar = mapping.getLeftVariable(); + final ShaderNodeVariable rightVar = mapping.getRightVariable(); + final String rightExpression = mapping.getRightExpression(); + out.write(" "); - if(!mapping.getLeftVariable().getNameSpace().equals(shaderNode.getName())) { - out.write(mapping.getLeftVariable().getNameSpace()); + + if (!leftVar.getNameSpace().equals(shaderNode.getName())) { + out.write(leftVar.getNameSpace()); out.write("."); } - out.write(mapping.getLeftVariable().getName()); - if(!mapping.getLeftSwizzling().equals("")){ + + out.write(leftVar.getName()); + + if (!mapping.getLeftSwizzling().equals("")) { out.write("."); out.write(mapping.getLeftSwizzling()); } + out.write(" = "); - if(!mapping.getRightVariable().getNameSpace().equals(shaderNode.getName())) { - out.write(mapping.getRightVariable().getNameSpace()); - out.write("."); - } - out.write(mapping.getRightVariable().getName().replaceFirst("g_","").replaceFirst("m_","")); - if(!mapping.getRightSwizzling().equals("")){ - out.write("."); - out.write(mapping.getRightSwizzling()); + + if (rightVar != null) { + + if (!rightVar.getNameSpace().equals(shaderNode.getName())) { + out.write(rightVar.getNameSpace()); + out.write("."); + } + + String rightVarName = rightVar.getName(); + if (rightVarName.startsWith("g_") || rightVarName.startsWith("m_")) { + rightVarName = rightVarName.substring(2, rightVarName.length()); + } + + out.write(rightVarName); + + if (!mapping.getRightSwizzling().equals("")) { + out.write("."); + out.write(mapping.getRightSwizzling()); + } + } else { + out.write("%%"); + out.write(rightExpression); + out.write("%%"); } - if (mapping.getCondition() != null){ + if (mapping.getCondition() != null) { out.write(" : "); - out.write(formatCondition(mapping.getCondition(),matParams)); + out.write(formatCondition(mapping.getCondition(), matParams)); } out.write("\n"); @@ -288,7 +323,4 @@ public class J3mdTechniqueDefWriter { } return null; } - -} - - +} \ No newline at end of file diff --git a/jme3-plugins/src/ogre/java/com/jme3/scene/plugins/ogre/AnimData.java b/jme3-plugins/src/ogre/java/com/jme3/scene/plugins/ogre/AnimData.java index 1b1eb2a9b..281926a46 100644 --- a/jme3-plugins/src/ogre/java/com/jme3/scene/plugins/ogre/AnimData.java +++ b/jme3-plugins/src/ogre/java/com/jme3/scene/plugins/ogre/AnimData.java @@ -31,17 +31,18 @@ */ package com.jme3.scene.plugins.ogre; -import com.jme3.animation.Animation; -import com.jme3.animation.Skeleton; +import com.jme3.anim.AnimClip; +import com.jme3.anim.Armature; + import java.util.ArrayList; public class AnimData { - public final Skeleton skeleton; - public final ArrayList anims; + public final Armature armature; + public final ArrayList anims; - public AnimData(Skeleton skeleton, ArrayList anims) { - this.skeleton = skeleton; + public AnimData(Armature armature, ArrayList anims) { + this.armature = armature; this.anims = anims; } } diff --git a/jme3-plugins/src/ogre/java/com/jme3/scene/plugins/ogre/MaterialLoader.java b/jme3-plugins/src/ogre/java/com/jme3/scene/plugins/ogre/MaterialLoader.java index cd2ecb8fa..ed11ddd25 100644 --- a/jme3-plugins/src/ogre/java/com/jme3/scene/plugins/ogre/MaterialLoader.java +++ b/jme3-plugins/src/ogre/java/com/jme3/scene/plugins/ogre/MaterialLoader.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -69,6 +69,7 @@ public class MaterialLoader implements AssetLoader { private boolean twoSide = false; private boolean noLight = false; private boolean separateTexCoord = false; + private boolean receiveShadow = false; private int texUnit = 0; private ColorRGBA readColor(String content){ @@ -143,7 +144,7 @@ public class MaterialLoader implements AssetLoader { textures[texUnit].setAnisotropicFilter(loadedTexture.getAnisotropicFilter()); textures[texUnit].setKey(loadedTexture.getKey()); - // XXX: Is this really neccessary? + // XXX: Is this really necessary? textures[texUnit].setWrap(WrapMode.Repeat); if (texName != null){ textures[texUnit].setName(texName); @@ -314,7 +315,8 @@ public class MaterialLoader implements AssetLoader { readTechnique(statement); }else if (statement.getLine().startsWith("receive_shadows")){ String isOn = statement.getLine().split("\\s")[1]; - if (isOn != null && isOn.equals("true")){ + if (isOn != null && isOn.equals("on")){ + receiveShadow = true; } } } @@ -334,6 +336,11 @@ public class MaterialLoader implements AssetLoader { mat = new Material(assetManager, "Common/MatDefs/Light/Lighting.j3md"); } mat.setName(matName); + + if(receiveShadow){ + mat.setReceivesShadows(true); + } + if (blend){ RenderState rs = mat.getAdditionalRenderState(); mat.setFloat("AlphaDiscardThreshold", 0.01f); @@ -433,13 +440,14 @@ public class MaterialLoader implements AssetLoader { twoSide = false; matName = null; texName = null; + receiveShadow = false; return mat; } private MaterialList load(AssetManager assetManager, AssetKey key, InputStream in) throws IOException{ folderName = key.getFolder(); this.assetManager = assetManager; - + MaterialList list = null; List statements = BlockLanguageParser.parse(in); @@ -471,8 +479,8 @@ public class MaterialLoader implements AssetLoader { list.put(mat.getName(), mat); } } - - return list; + + return list; } public Object load(AssetInfo info) throws IOException { diff --git a/jme3-plugins/src/ogre/java/com/jme3/scene/plugins/ogre/MeshLoader.java b/jme3-plugins/src/ogre/java/com/jme3/scene/plugins/ogre/MeshLoader.java index 42780f411..01474b5c4 100644 --- a/jme3-plugins/src/ogre/java/com/jme3/scene/plugins/ogre/MeshLoader.java +++ b/jme3-plugins/src/ogre/java/com/jme3/scene/plugins/ogre/MeshLoader.java @@ -31,39 +31,31 @@ */ package com.jme3.scene.plugins.ogre; -import com.jme3.animation.AnimControl; -import com.jme3.animation.Animation; -import com.jme3.animation.SkeletonControl; +import com.jme3.anim.*; import com.jme3.asset.*; import com.jme3.material.Material; import com.jme3.material.MaterialList; import com.jme3.math.ColorRGBA; +import com.jme3.renderer.queue.RenderQueue; import com.jme3.renderer.queue.RenderQueue.Bucket; import com.jme3.scene.*; -import com.jme3.scene.VertexBuffer.Format; -import com.jme3.scene.VertexBuffer.Type; -import com.jme3.scene.VertexBuffer.Usage; +import com.jme3.scene.VertexBuffer.*; import com.jme3.scene.plugins.ogre.matext.OgreMaterialKey; -import com.jme3.util.BufferUtils; -import com.jme3.util.IntMap; +import com.jme3.util.*; import com.jme3.util.IntMap.Entry; -import com.jme3.util.PlaceholderAssets; -import static com.jme3.util.xml.SAXUtil.*; +import org.xml.sax.*; +import org.xml.sax.helpers.DefaultHandler; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; import java.io.IOException; import java.io.InputStreamReader; import java.nio.*; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; +import java.util.*; import java.util.logging.Level; import java.util.logging.Logger; -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.parsers.SAXParserFactory; -import org.xml.sax.Attributes; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; -import org.xml.sax.XMLReader; -import org.xml.sax.helpers.DefaultHandler; + +import static com.jme3.util.xml.SAXUtil.*; /** * Loads Ogre3D mesh.xml files. @@ -241,6 +233,10 @@ public class MeshLoader extends DefaultHandler implements AssetLoader { geom.setQueueBucket(Bucket.Transparent); } + if(mat.isReceivesShadows()){ + geom.setShadowMode(RenderQueue.ShadowMode.Receive); + } + geom.setMaterial(mat); } @@ -794,35 +790,28 @@ public class MeshLoader extends DefaultHandler implements AssetLoader { for (int i = 0; i < geoms.size(); i++) { Geometry g = geoms.get(i); Mesh m = geoms.get(i).getMesh(); - - //FIXME the parameter is now useless. - //It was !HADWARE_SKINNING before, but since toggleing - //HW skinning does not happen at load time it was always true. - //We should use something similar as for the HWBoneIndex and - //HWBoneWeight : create the vertex buffers empty so that they - //are put in the cache, and really populate them the first time - //software skinning is used on the mesh. - m.generateBindPose(true); - + m.generateBindPose(); } // Put the animations in the AnimControl - HashMap anims = new HashMap(); - ArrayList animList = animData.anims; + HashMap anims = new HashMap<>(); + ArrayList animList = animData.anims; for (int i = 0; i < animList.size(); i++) { - Animation anim = animList.get(i); + AnimClip anim = animList.get(i); anims.put(anim.getName(), anim); } - AnimControl ctrl = new AnimControl(animData.skeleton); - ctrl.setAnimations(anims); - model.addControl(ctrl); + AnimComposer composer = new AnimComposer(); + for (AnimClip clip : anims.values()) { + composer.addAnimClip(clip); + } + model.addControl(composer); // Put the skeleton in the skeleton control - SkeletonControl skeletonControl = new SkeletonControl(animData.skeleton); + SkinningControl skinningControl = new SkinningControl(animData.armature); // This will acquire the targets from the node - model.addControl(skeletonControl); + model.addControl(skinningControl); } return model; diff --git a/jme3-plugins/src/ogre/java/com/jme3/scene/plugins/ogre/SkeletonLoader.java b/jme3-plugins/src/ogre/java/com/jme3/scene/plugins/ogre/SkeletonLoader.java index 56dc95bb6..d9977d3a9 100644 --- a/jme3-plugins/src/ogre/java/com/jme3/scene/plugins/ogre/SkeletonLoader.java +++ b/jme3-plugins/src/ogre/java/com/jme3/scene/plugins/ogre/SkeletonLoader.java @@ -31,55 +31,46 @@ */ package com.jme3.scene.plugins.ogre; -import com.jme3.animation.Animation; -import com.jme3.animation.Bone; -import com.jme3.animation.BoneTrack; -import com.jme3.animation.Skeleton; +import com.jme3.anim.*; +import com.jme3.anim.util.AnimMigrationUtils; import com.jme3.asset.AssetInfo; import com.jme3.asset.AssetLoader; -import com.jme3.asset.AssetManager; import com.jme3.math.Quaternion; import com.jme3.math.Vector3f; import com.jme3.util.xml.SAXUtil; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; -import java.util.Stack; -import java.util.logging.Logger; +import org.xml.sax.*; +import org.xml.sax.helpers.DefaultHandler; + import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParserFactory; -import org.xml.sax.Attributes; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; -import org.xml.sax.XMLReader; -import org.xml.sax.helpers.DefaultHandler; +import java.io.*; +import java.util.*; +import java.util.logging.Logger; public class SkeletonLoader extends DefaultHandler implements AssetLoader { private static final Logger logger = Logger.getLogger(SceneLoader.class.getName()); - private AssetManager assetManager; + //private AssetManager assetManager; private Stack elementStack = new Stack(); - private HashMap indexToBone = new HashMap(); - private HashMap nameToBone = new HashMap(); - private BoneTrack track; - private ArrayList tracks = new ArrayList(); - private Animation animation; - private ArrayList animations; - private Bone bone; - private Skeleton skeleton; - private ArrayList times = new ArrayList(); - private ArrayList translations = new ArrayList(); - private ArrayList rotations = new ArrayList(); - private ArrayList scales = new ArrayList(); + private HashMap indexToJoint = new HashMap<>(); + private HashMap nameToJoint = new HashMap<>(); + private TransformTrack track; + private ArrayList tracks = new ArrayList<>(); + private AnimClip animClip; + private ArrayList animClips; + private Joint joint; + private Armature armature; + private ArrayList times = new ArrayList<>(); + private ArrayList translations = new ArrayList<>(); + private ArrayList rotations = new ArrayList<>(); + private ArrayList scales = new ArrayList<>(); private float time = -1; private Vector3f position; private Quaternion rotation; private Vector3f scale; private float angle; private Vector3f axis; + private List unusedJoints = new ArrayList<>(); public void startElement(String uri, String localName, String qName, Attributes attribs) throws SAXException { if (qName.equals("position") || qName.equals("translate")) { @@ -99,38 +90,40 @@ public class SkeletonLoader extends DefaultHandler implements AssetLoader { assert elementStack.peek().equals("track"); } else if (qName.equals("track")) { assert elementStack.peek().equals("tracks"); - String boneName = SAXUtil.parseString(attribs.getValue("bone")); - Bone bone = nameToBone.get(boneName); - int index = skeleton.getBoneIndex(bone); - track = new BoneTrack(index); + String jointName = SAXUtil.parseString(attribs.getValue("bone")); + joint = nameToJoint.get(jointName); + track = new TransformTrack(); + track.setTarget(joint); } else if (qName.equals("boneparent")) { assert elementStack.peek().equals("bonehierarchy"); - String boneName = attribs.getValue("bone"); + String jointName = attribs.getValue("bone"); String parentName = attribs.getValue("parent"); - Bone bone = nameToBone.get(boneName); - Bone parent = nameToBone.get(parentName); - parent.addChild(bone); + Joint joint = nameToJoint.get(jointName); + Joint parent = nameToJoint.get(parentName); + parent.addChild(joint); } else if (qName.equals("bone")) { assert elementStack.peek().equals("bones"); // insert bone into indexed map - bone = new Bone(attribs.getValue("name")); + joint = new Joint(attribs.getValue("name")); int id = SAXUtil.parseInt(attribs.getValue("id")); - indexToBone.put(id, bone); - nameToBone.put(bone.getName(), bone); + indexToJoint.put(id, joint); + nameToJoint.put(joint.getName(), joint); } else if (qName.equals("tracks")) { assert elementStack.peek().equals("animation"); tracks.clear(); + unusedJoints.clear(); + unusedJoints.addAll(nameToJoint.values()); } else if (qName.equals("animation")) { assert elementStack.peek().equals("animations"); String name = SAXUtil.parseString(attribs.getValue("name")); - float length = SAXUtil.parseFloat(attribs.getValue("length")); - animation = new Animation(name, length); + //float length = SAXUtil.parseFloat(attribs.getValue("length")); + animClip = new AnimClip(name); } else if (qName.equals("bonehierarchy")) { assert elementStack.peek().equals("skeleton"); } else if (qName.equals("animations")) { assert elementStack.peek().equals("skeleton"); - animations = new ArrayList(); + animClips = new ArrayList<>(); } else if (qName.equals("bones")) { assert elementStack.peek().equals("skeleton"); } else if (qName.equals("skeleton")) { @@ -149,32 +142,42 @@ public class SkeletonLoader extends DefaultHandler implements AssetLoader { angle = 0; axis = null; } else if (qName.equals("bone")) { - bone.setBindTransforms(position, rotation, scale); - bone = null; + joint.getLocalTransform().setTranslation(position); + joint.getLocalTransform().setRotation(rotation); + if (scale != null) { + joint.getLocalTransform().setScale(scale); + } + joint = null; position = null; rotation = null; scale = null; } else if (qName.equals("bonehierarchy")) { - Bone[] bones = new Bone[indexToBone.size()]; - // find bones without a parent and attach them to the skeleton - // also assign the bones to the bonelist - for (Map.Entry entry : indexToBone.entrySet()) { - Bone bone = entry.getValue(); - bones[entry.getKey()] = bone; + Joint[] joints = new Joint[indexToJoint.size()]; + // find joints without a parent and attach them to the armature + // also assign the joints to the jointList + for (Map.Entry entry : indexToJoint.entrySet()) { + Joint joint = entry.getValue(); + joints[entry.getKey()] = joint; } - indexToBone.clear(); - skeleton = new Skeleton(bones); + indexToJoint.clear(); + armature = new Armature(joints); + armature.saveBindPose(); } else if (qName.equals("animation")) { - animations.add(animation); - animation = null; + animClips.add(animClip); + animClip = null; } else if (qName.equals("track")) { if (track != null) { // if track has keyframes tracks.add(track); + unusedJoints.remove(joint); track = null; } } else if (qName.equals("tracks")) { - BoneTrack[] trackList = tracks.toArray(new BoneTrack[tracks.size()]); - animation.setTracks(trackList); + //nameToJoint contains the joints with no track + for (Joint j : unusedJoints) { + AnimMigrationUtils.padJointTracks(tracks, j); + } + TransformTrack[] trackList = tracks.toArray(new TransformTrack[tracks.size()]); + animClip.setTracks(trackList); tracks.clear(); } else if (qName.equals("keyframe")) { assert time >= 0; @@ -182,14 +185,13 @@ public class SkeletonLoader extends DefaultHandler implements AssetLoader { assert rotation != null; times.add(time); - translations.add(position); - rotations.add(rotation); + translations.add(position.addLocal(joint.getLocalTranslation())); + rotations.add(joint.getLocalRotation().mult(rotation, rotation)); if (scale != null) { - scales.add(scale); + scales.add(scale.multLocal(joint.getLocalScale())); }else{ scales.add(new Vector3f(1,1,1)); } - time = -1; position = null; rotation = null; @@ -206,7 +208,6 @@ public class SkeletonLoader extends DefaultHandler implements AssetLoader { Vector3f[] scalesArray = scales.toArray(new Vector3f[scales.size()]); track.setKeyframes(timesArray, transArray, rotArray, scalesArray); - //track.setKeyframes(timesArray, transArray, rotArray); } else { track = null; } @@ -216,7 +217,7 @@ public class SkeletonLoader extends DefaultHandler implements AssetLoader { rotations.clear(); scales.clear(); } else if (qName.equals("skeleton")) { - nameToBone.clear(); + nameToJoint.clear(); } assert elementStack.peek().equals(qName); elementStack.pop(); @@ -228,17 +229,17 @@ public class SkeletonLoader extends DefaultHandler implements AssetLoader { */ private void fullReset() { elementStack.clear(); - indexToBone.clear(); - nameToBone.clear(); + indexToJoint.clear(); + nameToJoint.clear(); track = null; tracks.clear(); - animation = null; - if (animations != null) { - animations.clear(); + animClip = null; + if (animClips != null) { + animClips.clear(); } - bone = null; - skeleton = null; + joint = null; + armature = null; times.clear(); rotations.clear(); translations.clear(); @@ -266,12 +267,12 @@ public class SkeletonLoader extends DefaultHandler implements AssetLoader { xr.setErrorHandler(this); InputStreamReader r = new InputStreamReader(in); xr.parse(new InputSource(r)); - if (animations == null) { - animations = new ArrayList(); + if (animClips == null) { + animClips = new ArrayList(); } - AnimData data = new AnimData(skeleton, animations); - skeleton = null; - animations = null; + AnimData data = new AnimData(armature, animClips); + armature = null; + animClips = null; return data; } catch (SAXException ex) { IOException ioEx = new IOException("Error while parsing Ogre3D dotScene"); @@ -288,7 +289,7 @@ public class SkeletonLoader extends DefaultHandler implements AssetLoader { } public Object load(AssetInfo info) throws IOException { - assetManager = info.getManager(); + //AssetManager assetManager = info.getManager(); InputStream in = null; try { in = info.openStream(); diff --git a/jme3-plugins/src/xml/java/com/jme3/export/xml/DOMInputCapsule.java b/jme3-plugins/src/xml/java/com/jme3/export/xml/DOMInputCapsule.java index a8ba4f7aa..6b0eb39b7 100644 --- a/jme3-plugins/src/xml/java/com/jme3/export/xml/DOMInputCapsule.java +++ b/jme3-plugins/src/xml/java/com/jme3/export/xml/DOMInputCapsule.java @@ -974,14 +974,13 @@ public class DOMInputCapsule implements InputCapsule { ret = referencedSavables.get(reference); } else { String className = currentElem.getNodeName(); - if (defVal != null) { - className = defVal.getClass().getName(); - } else if (currentElem.hasAttribute("class")) { + if (currentElem.hasAttribute("class")) { className = currentElem.getAttribute("class"); + } else if (defVal != null) { + className = defVal.getClass().getName(); } tmp = SavableClassUtil.fromName(className, null); - String versionsStr = currentElem.getAttribute("savable_versions"); if (versionsStr != null && !versionsStr.equals("")){ String[] versionStr = versionsStr.split(","); @@ -1508,4 +1507,4 @@ public class DOMInputCapsule implements InputCapsule { ? zeroStrings : outStrings; } -} \ No newline at end of file +} diff --git a/jme3-terrain/src/main/java/com/jme3/terrain/GeoMap.java b/jme3-terrain/src/main/java/com/jme3/terrain/GeoMap.java index efa823c66..a6774400a 100644 --- a/jme3-terrain/src/main/java/com/jme3/terrain/GeoMap.java +++ b/jme3-terrain/src/main/java/com/jme3/terrain/GeoMap.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -127,7 +127,7 @@ public class GeoMap implements Savable { * If false, then the data is unavailable- must be loaded with load() * before the methods getHeight/getNormal can be used * - * @return wether the geomap data is loaded in system memory + * @return whether the geomap data is loaded in system memory */ public boolean isLoaded() { return true; diff --git a/jme3-terrain/src/main/java/com/jme3/terrain/Terrain.java b/jme3-terrain/src/main/java/com/jme3/terrain/Terrain.java index d96bb1340..fefba99bc 100644 --- a/jme3-terrain/src/main/java/com/jme3/terrain/Terrain.java +++ b/jme3-terrain/src/main/java/com/jme3/terrain/Terrain.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -87,7 +87,7 @@ public interface Terrain { * Each xz coordinate entry matches to a height entry, 1 for 1. So the * first coordinate matches to the first height value, the last to the * last etc. - * @param xz a list of coordinates where the hight will be set + * @param xz a list of coordinates where the height will be set * @param height the heights that match the xz coordinates */ public void setHeight(List xz, List height); @@ -104,7 +104,7 @@ public interface Terrain { * Each xz coordinate entry matches to a height entry, 1 for 1. So the * first coordinate matches to the first height value, the last to the * last etc. - * @param xz a list of coordinates where the hight will be adjusted + * @param xz a list of coordinates where the height will be adjusted * @param height +- value to adjust the height by, that matches the xz coordinates */ public void adjustHeight(List xz, List height); diff --git a/jme3-terrain/src/main/java/com/jme3/terrain/executor/TerrainExecutorService.java b/jme3-terrain/src/main/java/com/jme3/terrain/executor/TerrainExecutorService.java new file mode 100644 index 000000000..7d8dbe3ba --- /dev/null +++ b/jme3-terrain/src/main/java/com/jme3/terrain/executor/TerrainExecutorService.java @@ -0,0 +1,108 @@ +package com.jme3.terrain.executor; + +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * The class to provide single executor service to run background tasks of terrain stuff. + * + * @author JavaSaBr + */ +public class TerrainExecutorService { + + private static final Runtime RUNTIME = Runtime.getRuntime(); + + /** + * The constructor of the terrain executor service. + */ + private static volatile Callable constructor = new Callable() { + + @Override + public ExecutorService call() throws Exception { + return Executors.newFixedThreadPool(RUNTIME.availableProcessors(), new ThreadFactory() { + + private final AtomicInteger counter = new AtomicInteger(-1); + + @Override + public Thread newThread(final Runnable task) { + final Thread thread = new Thread(task); + thread.setName("jME3 Terrain Thread [" + counter.incrementAndGet() + "]"); + thread.setDaemon(true); + return thread; + } + }); + } + }; + + /** + * Set a new constructor of executor service to provide other implementation. + * + * @param constructor the constructor. + */ + public static void setConstructor(final Callable constructor) { + TerrainExecutorService.constructor = constructor; + } + + /** + * https://stackoverflow.com/questions/29883403/double-checked-locking-without-volatile + *

    + * This suggestion is of Aleksey Shipilev + */ + private static class LazyInitializer { + public final TerrainExecutorService instance; + public LazyInitializer(final TerrainExecutorService instance) { + this.instance = instance; + } + } + + /** + * The lazy singleton. + */ + private static LazyInitializer initializer; + + public static TerrainExecutorService getInstance() { + + LazyInitializer lazy = initializer; + + if (lazy == null) { // check 1 + synchronized (TerrainExecutorService.class) { + lazy = initializer; + if (lazy == null) { // check2 + lazy = new LazyInitializer(new TerrainExecutorService()); + initializer = lazy; + } + } + } + + return lazy.instance; + } + + /** + * The implementation of executor service. + */ + private final ExecutorService executorService; + + private TerrainExecutorService() { + try { + this.executorService = constructor.call(); + } catch (final Exception e) { + throw new RuntimeException(e); + } + } + + public Future submit(final Callable task) { + return executorService.submit(task); + } + + public Future submit(final Runnable task, final T result) { + return executorService.submit(task, result); + } + + public Future submit(final Runnable task) { + return executorService.submit(task); + } + + public void execute(final Runnable command) { + executorService.execute(command); + } +} diff --git a/jme3-terrain/src/main/java/com/jme3/terrain/geomipmap/MultiTerrainLodControl.java b/jme3-terrain/src/main/java/com/jme3/terrain/geomipmap/MultiTerrainLodControl.java index 995bc8f13..9e37fb6b2 100644 --- a/jme3-terrain/src/main/java/com/jme3/terrain/geomipmap/MultiTerrainLodControl.java +++ b/jme3-terrain/src/main/java/com/jme3/terrain/geomipmap/MultiTerrainLodControl.java @@ -33,8 +33,11 @@ package com.jme3.terrain.geomipmap; import com.jme3.math.Vector3f; import com.jme3.renderer.Camera; +import com.jme3.terrain.Terrain; import com.jme3.terrain.geomipmap.lodcalc.DistanceLodCalculator; import com.jme3.terrain.geomipmap.lodcalc.LodCalculator; +import com.jme3.util.SafeArrayList; + import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -48,21 +51,41 @@ import java.util.List; * @author Brent Owens */ public class MultiTerrainLodControl extends TerrainLodControl { - - List terrains = new ArrayList(); - private List addedTerrains = new ArrayList(); - private List removedTerrains = new ArrayList(); - public MultiTerrainLodControl(List cameras) { - this.cameras = cameras; - lodCalculator = new DistanceLodCalculator(65, 2.7f); + private SafeArrayList terrains; + + private List addedTerrains; + private List removedTerrains; + + public MultiTerrainLodControl() { + terrains = new SafeArrayList<>(TerrainQuad.class); + removedTerrains = new ArrayList<>(); + addedTerrains = new ArrayList<>(); + } + + public MultiTerrainLodControl(final Terrain terrain) { + this(); + setTerrain(terrain); + } + + public MultiTerrainLodControl(final Camera camera) { + this(); + setCamera(camera); + } + + public MultiTerrainLodControl(final Terrain terrain, final Camera camera) { + this(terrain); + setCamera(camera); } - public MultiTerrainLodControl(Camera camera) { - List cams = new ArrayList(); - cams.add(camera); - this.cameras = cams; - lodCalculator = new DistanceLodCalculator(65, 2.7f); + public MultiTerrainLodControl(final Terrain terrain, final List cameras) { + this(terrain); + setCameras(cameras); + } + + @Override + protected DistanceLodCalculator makeLodCalculator() { + return new DistanceLodCalculator(65, 2.7f); } /** @@ -84,7 +107,8 @@ public class MultiTerrainLodControl extends TerrainLodControl { } @Override - protected UpdateLOD getLodThread(List locations, LodCalculator lodCalculator) { + protected UpdateLOD createLodUpdateTask(final List locations, + final LodCalculator lodCalculator) { return new UpdateMultiLOD(locations, lodCalculator); } @@ -92,8 +116,9 @@ public class MultiTerrainLodControl extends TerrainLodControl { protected void prepareTerrain() { if (!addedTerrains.isEmpty()) { for (TerrainQuad t : addedTerrains) { - if (!terrains.contains(t)) + if (!terrains.contains(t)) { terrains.add(t); + } } addedTerrains.clear(); } @@ -103,8 +128,10 @@ public class MultiTerrainLodControl extends TerrainLodControl { removedTerrains.clear(); } - for (TerrainQuad terrain : terrains) - terrain.cacheTerrainTransforms();// cache the terrain's world transforms so they can be accessed on the separate thread safely + for (TerrainQuad terrain : terrains.getArray()) { + // cache the terrain's world transforms so they can be accessed on the separate thread safely + terrain.cacheTerrainTransforms(); + } } /** @@ -112,18 +139,15 @@ public class MultiTerrainLodControl extends TerrainLodControl { * multiple terrains. */ protected class UpdateMultiLOD extends UpdateLOD { - - - protected UpdateMultiLOD(List camLocations, LodCalculator lodCalculator) { + + protected UpdateMultiLOD(final List camLocations, final LodCalculator lodCalculator) { super(camLocations, lodCalculator); } @Override public HashMap call() throws Exception { - - setLodCalcRunning(true); - - HashMap updated = new HashMap(); + + HashMap updated = new HashMap<>(); for (TerrainQuad terrainQuad : terrains) { // go through each patch and calculate its LOD based on camera distance @@ -146,7 +170,7 @@ public class MultiTerrainLodControl extends TerrainLodControl { } //setUpdateQuadLODs(updated); // set back to main ogl thread - setLodCalcRunning(false); + lodCalcRunning.set(false); return updated; } diff --git a/jme3-terrain/src/main/java/com/jme3/terrain/geomipmap/NormalRecalcControl.java b/jme3-terrain/src/main/java/com/jme3/terrain/geomipmap/NormalRecalcControl.java index f6682dbe2..9f0eda562 100644 --- a/jme3-terrain/src/main/java/com/jme3/terrain/geomipmap/NormalRecalcControl.java +++ b/jme3-terrain/src/main/java/com/jme3/terrain/geomipmap/NormalRecalcControl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -39,9 +39,7 @@ import com.jme3.renderer.RenderManager; import com.jme3.renderer.ViewPort; import com.jme3.scene.Spatial; import com.jme3.scene.control.AbstractControl; -import com.jme3.scene.control.Control; import com.jme3.util.clone.Cloner; -import com.jme3.util.clone.JmeCloneable; import java.io.IOException; @@ -88,14 +86,6 @@ public class NormalRecalcControl extends AbstractControl { this.terrain = cloner.clone(terrain); } - @Override - public Control cloneForSpatial(Spatial spatial) { - NormalRecalcControl control = new NormalRecalcControl(terrain); - control.setSpatial(spatial); - control.setEnabled(true); - return control; - } - @Override public void setSpatial(Spatial spatial) { super.setSpatial(spatial); diff --git a/jme3-terrain/src/main/java/com/jme3/terrain/geomipmap/TerrainGridLodControl.java b/jme3-terrain/src/main/java/com/jme3/terrain/geomipmap/TerrainGridLodControl.java index 65a209be3..20a088901 100644 --- a/jme3-terrain/src/main/java/com/jme3/terrain/geomipmap/TerrainGridLodControl.java +++ b/jme3-terrain/src/main/java/com/jme3/terrain/geomipmap/TerrainGridLodControl.java @@ -35,7 +35,7 @@ import com.jme3.math.Vector3f; import com.jme3.renderer.Camera; import com.jme3.terrain.Terrain; import com.jme3.terrain.geomipmap.lodcalc.LodCalculator; -import java.util.List; +import com.jme3.util.SafeArrayList; /** * Updates grid offsets and cell positions. @@ -50,7 +50,7 @@ public class TerrainGridLodControl extends TerrainLodControl { } @Override - protected void updateLOD(List locations, LodCalculator lodCalculator) { + protected void updateLOD(SafeArrayList locations, LodCalculator lodCalculator) { TerrainGrid terrainGrid = (TerrainGrid)getSpatial(); // for now, only the first camera is handled. diff --git a/jme3-terrain/src/main/java/com/jme3/terrain/geomipmap/TerrainLodControl.java b/jme3-terrain/src/main/java/com/jme3/terrain/geomipmap/TerrainLodControl.java index d551ff4e5..7bab7f207 100644 --- a/jme3-terrain/src/main/java/com/jme3/terrain/geomipmap/TerrainLodControl.java +++ b/jme3-terrain/src/main/java/com/jme3/terrain/geomipmap/TerrainLodControl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -42,22 +42,20 @@ import com.jme3.renderer.ViewPort; import com.jme3.scene.Node; import com.jme3.scene.Spatial; import com.jme3.scene.control.AbstractControl; -import com.jme3.scene.control.Control; import com.jme3.terrain.Terrain; +import com.jme3.terrain.executor.TerrainExecutorService; import com.jme3.terrain.geomipmap.lodcalc.DistanceLodCalculator; import com.jme3.terrain.geomipmap.lodcalc.LodCalculator; +import com.jme3.util.SafeArrayList; import com.jme3.util.clone.Cloner; -import com.jme3.util.clone.JmeCloneable; import java.io.IOException; import java.util.ArrayList; +import static java.util.Collections.singletonList; import java.util.HashMap; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; import java.util.concurrent.Future; -import java.util.concurrent.ThreadFactory; import java.util.concurrent.atomic.AtomicBoolean; import java.util.logging.Level; import java.util.logging.Logger; @@ -84,32 +82,68 @@ import java.util.logging.Logger; */ public class TerrainLodControl extends AbstractControl { - private Terrain terrain; - protected List cameras; - private List cameraLocations = new ArrayList(); - protected LodCalculator lodCalculator; - private boolean hasResetLod = false; // used when enabled is set to false + /** + * The list of cameras for when terrain supports multiple cameras (ie split screen) + */ + protected SafeArrayList cameras; + protected SafeArrayList cameraLocations; + protected SafeArrayList lastCameraLocations; + + protected AtomicBoolean lodCalcRunning; - private HashMap updatedPatches; - private final Object updatePatchesLock = new Object(); + /** + * The previous location of {@link #camera}. + */ + protected Vector3f previousCameraLocation; - protected List lastCameraLocations; // used for LOD calc - private AtomicBoolean lodCalcRunning = new AtomicBoolean(false); - private int lodOffCount = 0; + /** + * The camera from render view port. + */ + protected Camera camera; - protected ExecutorService executor; + protected Terrain terrain; + protected LodCalculator lodCalculator; protected Future> indexer; - private boolean forceUpdate = true; + + private int lodOffCount; + + /** + * The flag of using a camera from render viewport instead cameras from {@link #cameras}. + */ + protected boolean useRenderCamera; + + protected boolean forceUpdate; + protected boolean hasResetLod; // used when enabled is set to false public TerrainLodControl() { + hasResetLod = false; + forceUpdate = true; + previousCameraLocation = new Vector3f(); + cameras = new SafeArrayList<>(Camera.class); + cameraLocations = new SafeArrayList<>(Vector3f.class); + lastCameraLocations = new SafeArrayList<>(Vector3f.class); + lodCalcRunning = new AtomicBoolean(false); + lodOffCount = 0; + lodCalculator = makeLodCalculator(); // a default calculator + } + + protected DistanceLodCalculator makeLodCalculator() { + return new DistanceLodCalculator(65, 2.7f); } - public TerrainLodControl(Terrain terrain, Camera camera) { - List cams = new ArrayList(); - cams.add(camera); + public TerrainLodControl(final Terrain terrain) { + this(); this.terrain = terrain; - this.cameras = cams; - lodCalculator = new DistanceLodCalculator(65, 2.7f); // a default calculator + } + + public TerrainLodControl(final Camera camera) { + this(); + setCamera(camera); + } + + public TerrainLodControl(final Terrain terrain, final Camera camera) { + this(terrain); + setCamera(camera); } /** @@ -117,41 +151,44 @@ public class TerrainLodControl extends AbstractControl { * @param terrain to act upon (must be a Spatial) * @param cameras one or more cameras to reference for LOD calc */ - public TerrainLodControl(Terrain terrain, List cameras) { - this.terrain = terrain; - this.cameras = cameras; - lodCalculator = new DistanceLodCalculator(65, 2.7f); // a default calculator + public TerrainLodControl(final Terrain terrain, final List cameras) { + this(terrain); + setCameras(cameras); } - @Override - protected void controlRender(RenderManager rm, ViewPort vp) { + /** + * @param useRenderCamera true if need to use a camera from render view port. + */ + public void setUseRenderCamera(final boolean useRenderCamera) { + this.useRenderCamera = useRenderCamera; } /** - * Set your own custom executor to be used. The control will use - * this instead of creating its own. + * @return true if need to use a camera from render view port. */ - public void setExecutor(ExecutorService executor) { - this.executor = executor; + public boolean isUseRenderCamera() { + return useRenderCamera; } - protected ExecutorService createExecutorService() { - return Executors.newSingleThreadExecutor(new ThreadFactory() { - public Thread newThread(Runnable r) { - Thread th = new Thread(r); - th.setName("jME3 Terrain Thread"); - th.setDaemon(true); - return th; - } - }); + @Override + protected void controlRender(final RenderManager rm, final ViewPort vp) { + + if (!isUseRenderCamera()) { + return; + } else if (camera == vp.getCamera()) { + return; + } + + camera = vp.getCamera(); + previousCameraLocation.set(camera.getLocation()); } @Override protected void controlUpdate(float tpf) { - //list of cameras for when terrain supports multiple cameras (ie split screen) - if (lodCalculator == null) + if (lodCalculator == null) { return; + } if (!enabled) { if (!hasResetLod) { @@ -161,12 +198,26 @@ public class TerrainLodControl extends AbstractControl { } } - if (cameras != null) { - cameraLocations.clear(); - for (Camera c : cameras) // populate them - { - cameraLocations.add(c.getLocation()); + // if we use a camera from render + if (isUseRenderCamera()) { + updateLOD(lodCalculator); + } + // if we use set cameras + else if (!cameras.isEmpty()) { + + // need to have count of positions the same with count of cameras + if (cameraLocations.size() != cameras.size()) { + cameraLocations.clear(); + for (int i = 0; i < cameras.size(); i++) { + cameraLocations.add(new Vector3f()); + } + } + + // we need to update current camera positions + for (int i = 0; i < cameras.size(); i++) { + cameraLocations.get(i).set(cameras.get(i).getLocation()); } + updateLOD(cameraLocations, lodCalculator); } } @@ -176,53 +227,107 @@ public class TerrainLodControl extends AbstractControl { * It will clear up any threads it had. */ public void detachAndCleanUpControl() { - if (executor != null) - executor.shutdownNow(); + + if (indexer != null) { + indexer.cancel(true); + indexer = null; + } + getSpatial().removeControl(this); } // do all of the LOD calculations - protected void updateLOD(List locations, LodCalculator lodCalculator) { - if(getSpatial() == null){ + protected void updateLOD(final LodCalculator lodCalculator) { + + if (getSpatial() == null || camera == null) { return; } // update any existing ones that need updating updateQuadLODs(); - if (lodCalculator.isLodOff()) { - // we want to calculate the base lod at least once - if (lodOffCount == 1) - return; - else - lodOffCount++; - } else - lodOffCount = 0; + if (updateLodOffCount(lodCalculator)) { + return; + } + + final Vector3f currentLocation = camera.getLocation(); + + if (!forceUpdate && previousCameraLocation.equals(currentLocation) && !lodCalculator.isLodOff()) { + return; // don't update if in same spot + } else { + previousCameraLocation.set(currentLocation); + } - if (lastCameraLocations != null) { - if (!forceUpdate && lastCameraLocationsTheSame(locations) && !lodCalculator.isLodOff()) - return; // don't update if in same spot - else - lastCameraLocations = cloneVectorList(locations); - forceUpdate = false; + forceUpdate = false; + + if (!lodCalcRunning.compareAndSet(false, true)) { + return; } - else { - lastCameraLocations = cloneVectorList(locations); + + prepareTerrain(); + + final TerrainExecutorService executorService = TerrainExecutorService.getInstance(); + indexer = executorService.submit(createLodUpdateTask(singletonList(currentLocation), lodCalculator)); + } + + // do all of the LOD calculations + protected void updateLOD(final SafeArrayList locations, final LodCalculator lodCalculator) { + + if (getSpatial() == null || locations.isEmpty()) { return; } - if (isLodCalcRunning()) { + // update any existing ones that need updating + updateQuadLODs(); + + if (updateLodOffCount(lodCalculator)) { return; } - setLodCalcRunning(true); - if (executor == null) - executor = createExecutorService(); + if (!forceUpdate && locations.equals(lastCameraLocations) && !lodCalculator.isLodOff()) { + return; // don't update if in same spot + } else { + + // need to have count of last camera locations the same with count of locations + if (lastCameraLocations.size() != locations.size()) { + lastCameraLocations.clear(); + for (int i = 0; i < locations.size(); i++) { + lastCameraLocations.add(new Vector3f()); + } + } + + // we need to update last camera locations to current + for (int i = 0; i < locations.size(); i++) { + lastCameraLocations.get(i).set(locations.get(i)); + } + } + + forceUpdate = false; + + if (!lodCalcRunning.compareAndSet(false, true)) { + return; + } prepareTerrain(); - UpdateLOD updateLodThread = getLodThread(locations, lodCalculator); - indexer = executor.submit(updateLodThread); + final TerrainExecutorService executorService = TerrainExecutorService.getInstance(); + indexer = executorService.submit(createLodUpdateTask(cloneVectorList(locations), lodCalculator)); + } + + protected boolean updateLodOffCount(final LodCalculator lodCalculator) { + + if (lodCalculator.isLodOff()) { + // we want to calculate the base lod at least once + if (lodOffCount == 1) { + return true; + } else { + lodOffCount++; + } + } else { + lodOffCount = 0; + } + + return false; } /** @@ -234,11 +339,12 @@ public class TerrainLodControl extends AbstractControl { } protected void prepareTerrain() { - TerrainQuad terrain = (TerrainQuad)getSpatial(); - terrain.cacheTerrainTransforms();// cache the terrain's world transforms so they can be accessed on the separate thread safely + TerrainQuad terrain = (TerrainQuad) getSpatial(); + // cache the terrain's world transforms so they can be accessed on the separate thread safely + terrain.cacheTerrainTransforms(); } - protected UpdateLOD getLodThread(List locations, LodCalculator lodCalculator) { + protected UpdateLOD createLodUpdateTask(final List locations, final LodCalculator lodCalculator) { return new UpdateLOD(locations, lodCalculator); } @@ -246,115 +352,68 @@ public class TerrainLodControl extends AbstractControl { * Back on the ogl thread: update the terrain patch geometries */ private void updateQuadLODs() { - if (indexer != null) { - if (indexer.isDone()) { - try { - - HashMap updated = indexer.get(); - if (updated != null) { - // do the actual geometry update here - for (UpdatedTerrainPatch utp : updated.values()) { - utp.updateAll(); - } - } - - } catch (InterruptedException ex) { - Logger.getLogger(TerrainLodControl.class.getName()).log(Level.SEVERE, null, ex); - } catch (ExecutionException ex) { - Logger.getLogger(TerrainLodControl.class.getName()).log(Level.SEVERE, null, ex); - } finally { - indexer = null; - } - } + + if (indexer == null || !indexer.isDone()) { + return; } - } - private boolean lastCameraLocationsTheSame(List locations) { - boolean theSame = true; - for (Vector3f l : locations) { - for (Vector3f v : lastCameraLocations) { - if (!v.equals(l) ) { - theSame = false; - return false; + try { + + final HashMap updated = indexer.get(); + if (updated != null) { + // do the actual geometry update here + for (final UpdatedTerrainPatch utp : updated.values()) { + utp.updateAll(); } } + + } catch (final InterruptedException | ExecutionException ex) { + Logger.getLogger(TerrainLodControl.class.getName()).log(Level.SEVERE, null, ex); + } finally { + indexer = null; } - return theSame; } - protected synchronized boolean isLodCalcRunning() { - return lodCalcRunning.get(); - } + private List cloneVectorList(SafeArrayList locations) { - protected synchronized void setLodCalcRunning(boolean running) { - lodCalcRunning.set(running); - } + final List cloned = new ArrayList<>(locations.size()); + + for (final Vector3f location : locations.getArray()) { + cloned.add(location.clone()); + } - private List cloneVectorList(List locations) { - List cloned = new ArrayList(); - for(Vector3f l : locations) - cloned.add(l.clone()); return cloned; } - - - - @Override public Object jmeClone() { - if (spatial instanceof Terrain) { - TerrainLodControl cloned = new TerrainLodControl((Terrain) spatial, cameras); - cloned.setLodCalculator(lodCalculator.clone()); - cloned.spatial = spatial; - return cloned; + try { + return super.clone(); + } catch (final CloneNotSupportedException e) { + throw new RuntimeException(e); } - return null; } @Override - public void cloneFields( Cloner cloner, Object original ) { + public void cloneFields(final Cloner cloner, final Object original) { super.cloneFields(cloner, original); this.lodCalculator = cloner.clone(lodCalculator); - - try { - // Not deep clone of the cameras themselves - this.cameras = cloner.javaClone(cameras); - } catch( CloneNotSupportedException e ) { - throw new RuntimeException("Error cloning", e); - } + this.cameras = new SafeArrayList<>(Camera.class, cameras); + this.cameraLocations = new SafeArrayList<>(Vector3f.class); + this.lastCameraLocations = new SafeArrayList<>(Vector3f.class); + this.lodCalcRunning = new AtomicBoolean(); + this.previousCameraLocation = new Vector3f(); } - - @Override - public Control cloneForSpatial(Spatial spatial) { - if (spatial instanceof Terrain) { - List cameraClone = new ArrayList(); - if (cameras != null) { - for (Camera c : cameras) { - cameraClone.add(c); - } - } - TerrainLodControl cloned = new TerrainLodControl((Terrain) spatial, cameraClone); - cloned.setLodCalculator(lodCalculator.clone()); - return cloned; - } - return null; + public void setCamera(final Camera camera) { + this.cameras.clear(); + this.cameras.add(camera); } - public void setCamera(Camera camera) { - List cams = new ArrayList(); - cams.add(camera); - setCameras(cams); - } - - public void setCameras(List cameras) { - this.cameras = cameras; - cameraLocations.clear(); - for (Camera c : cameras) { - cameraLocations.add(c.getLocation()); - } + public void setCameras(final List cameras) { + this.cameras.clear(); + this.cameras.addAll(cameras); } @Override @@ -373,7 +432,7 @@ public class TerrainLodControl extends AbstractControl { return lodCalculator; } - public void setLodCalculator(LodCalculator lodCalculator) { + public void setLodCalculator(final LodCalculator lodCalculator) { this.lodCalculator = lodCalculator; } @@ -393,64 +452,60 @@ public class TerrainLodControl extends AbstractControl { /** * Calculates the LOD of all child terrain patches. */ - protected class UpdateLOD implements Callable> { - protected List camLocations; - protected LodCalculator lodCalculator; + protected class UpdateLOD implements Callable> { - protected UpdateLOD(List camLocations, LodCalculator lodCalculator) { + protected final List camLocations; + protected final LodCalculator lodCalculator; + + protected UpdateLOD(final List camLocations, final LodCalculator lodCalculator) { this.camLocations = camLocations; this.lodCalculator = lodCalculator; } public HashMap call() throws Exception { - //long start = System.currentTimeMillis(); - //if (isLodCalcRunning()) { - // return null; - //} - setLodCalcRunning(true); - TerrainQuad terrainQuad = (TerrainQuad)getSpatial(); + TerrainQuad terrainQuad = (TerrainQuad) getSpatial(); // go through each patch and calculate its LOD based on camera distance - HashMap updated = new HashMap(); - boolean lodChanged = terrainQuad.calculateLod(camLocations, updated, lodCalculator); // 'updated' gets populated here + HashMap updated = new HashMap<>(); + // 'updated' gets populated here + boolean lodChanged = terrainQuad.calculateLod(camLocations, updated, lodCalculator); if (!lodChanged) { // not worth updating anything else since no one's LOD changed - setLodCalcRunning(false); + lodCalcRunning.set(false); return null; } - // then calculate its neighbour LOD values for seaming in the shader terrainQuad.findNeighboursLod(updated); - - terrainQuad.fixEdges(updated); // 'updated' can get added to here - + // 'updated' can get added to here + terrainQuad.fixEdges(updated); terrainQuad.reIndexPages(updated, lodCalculator.usesVariableLod()); //setUpdateQuadLODs(updated); // set back to main ogl thread - setLodCalcRunning(false); + lodCalcRunning.set(false); return updated; } } @Override - public void write(JmeExporter ex) throws IOException { + public void write(final JmeExporter ex) throws IOException { super.write(ex); OutputCapsule oc = ex.getCapsule(this); oc.write((Node)terrain, "terrain", null); oc.write(lodCalculator, "lodCalculator", null); + oc.write(useRenderCamera, "useRenderCamera", false); } @Override - public void read(JmeImporter im) throws IOException { + public void read(final JmeImporter im) throws IOException { super.read(im); InputCapsule ic = im.getCapsule(this); terrain = (Terrain) ic.readSavable("terrain", null); lodCalculator = (LodCalculator) ic.readSavable("lodCalculator", new DistanceLodCalculator()); + useRenderCamera = ic.readBoolean("useRenderCamera", false); } - } diff --git a/jme3-terrain/src/main/java/com/jme3/terrain/geomipmap/TerrainPatch.java b/jme3-terrain/src/main/java/com/jme3/terrain/geomipmap/TerrainPatch.java index 626eb4fd5..eb3263960 100644 --- a/jme3-terrain/src/main/java/com/jme3/terrain/geomipmap/TerrainPatch.java +++ b/jme3-terrain/src/main/java/com/jme3/terrain/geomipmap/TerrainPatch.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -74,7 +74,7 @@ import java.util.List; * is a mathematical limit on the number of times the 'size' of the patch can be divided by two. However there is a -1 to that * for now until I add in a custom index buffer calculation for that max level, the current algorithm does not go that far. * - * You can supply a LodThresholdCalculator for use in determining when the LOD should change. It's API will no doubt change + * You can supply a LodThresholdCalculator for use in determining when the LOD should change. Its API will no doubt change * in the near future. Right now it defaults to just changing LOD every two patch sizes. So if a patch has a size of 65, * then the LOD changes every 130 units away. * @@ -86,7 +86,7 @@ public class TerrainPatch extends Geometry { protected int lod = 0; // this terrain patch's LOD private int maxLod = -1; protected int previousLod = -1; - protected int lodLeft, lodTop, lodRight, lodBottom; // it's neighbour's LODs + protected int lodLeft, lodTop, lodRight, lodBottom; // its neighbour's LODs protected int size; diff --git a/jme3-terrain/src/main/java/com/jme3/terrain/geomipmap/grid/ImageTileLoader.java b/jme3-terrain/src/main/java/com/jme3/terrain/geomipmap/grid/ImageTileLoader.java index 4e2d14dd8..ffd77c0c7 100644 --- a/jme3-terrain/src/main/java/com/jme3/terrain/geomipmap/grid/ImageTileLoader.java +++ b/jme3-terrain/src/main/java/com/jme3/terrain/geomipmap/grid/ImageTileLoader.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -74,7 +74,7 @@ public class ImageTileLoader implements TerrainGridTileLoader{ } /** - * Effects vertical scale of the height of the terrain when loaded. + * Affects the vertical scale of the terrain when loaded. */ public void setHeightScale(float heightScale) { this.heightScale = heightScale; diff --git a/jme3-terrain/src/main/java/com/jme3/terrain/heightmap/CombinerHeightMap.java b/jme3-terrain/src/main/java/com/jme3/terrain/heightmap/CombinerHeightMap.java index 283f14974..e36dd03a6 100644 --- a/jme3-terrain/src/main/java/com/jme3/terrain/heightmap/CombinerHeightMap.java +++ b/jme3-terrain/src/main/java/com/jme3/terrain/heightmap/CombinerHeightMap.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -36,7 +36,7 @@ import java.util.logging.Logger; /** * CombinerHeightMap generates a new height map based on * two provided height maps. These had maps can either be added together - * or substracted from each other. Each heightmap has a weight to + * or subtracted from each other. Each heightmap has a weight to * determine how much one will affect the other. By default it is set to * 0.5, 0.5 and meaning the two heightmaps are averaged evenly. This * value can be adjusted at will, as long as the two factors are equal diff --git a/jme3-terrain/src/main/java/com/jme3/terrain/heightmap/FaultHeightMap.java b/jme3-terrain/src/main/java/com/jme3/terrain/heightmap/FaultHeightMap.java index 2518eb897..d5594b19a 100644 --- a/jme3-terrain/src/main/java/com/jme3/terrain/heightmap/FaultHeightMap.java +++ b/jme3-terrain/src/main/java/com/jme3/terrain/heightmap/FaultHeightMap.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -37,7 +37,7 @@ import java.util.logging.Level; import java.util.logging.Logger; /** - * Creates an heightmap based on the fault algorithm. Each iteration, a random line + * Creates a heightmap based on the fault algorithm. Each iteration, a random line * crossing the map is generated. On one side height values are raised, on the other side * lowered. * @author cghislai @@ -118,7 +118,7 @@ public class FaultHeightMap extends AbstractHeightMap { } /** - * Create an heightmap with linear step faults. + * Create a heightmap with linear step faults. * @param size size of heightmap * @param iterations number of iterations * @param minFaultHeight Height modified on each side @@ -240,7 +240,7 @@ public class FaultHeightMap extends AbstractHeightMap { return val; } } - //shoudn't go here + //shouldn't go here throw new RuntimeException("Code needs update to switch allcases"); } diff --git a/jme3-terrain/src/main/java/com/jme3/terrain/heightmap/MidpointDisplacementHeightMap.java b/jme3-terrain/src/main/java/com/jme3/terrain/heightmap/MidpointDisplacementHeightMap.java index 34b20a398..7a53c9711 100644 --- a/jme3-terrain/src/main/java/com/jme3/terrain/heightmap/MidpointDisplacementHeightMap.java +++ b/jme3-terrain/src/main/java/com/jme3/terrain/heightmap/MidpointDisplacementHeightMap.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -37,7 +37,7 @@ import java.util.logging.Level; import java.util.logging.Logger; /** - * MidpointDisplacementHeightMap generates an heightmap based on + * MidpointDisplacementHeightMap generates a heightmap based on * the midpoint displacement algorithm. See Constructor javadoc for more info. * @author cghislai */ @@ -50,7 +50,7 @@ public class MidpointDisplacementHeightMap extends AbstractHeightMap { /** * The constructor generates the heightmap. After the first 4 corners are - * randomly given an height, the center will be heighted to the average of + * randomly given a height, the center will be heighted to the average of * the 4 corners to which a random value is added. Then other passes fill * the heightmap by the same principle. * The random value is generated between the values -range @@ -87,7 +87,7 @@ public class MidpointDisplacementHeightMap extends AbstractHeightMap { /** * The constructor generates the heightmap. After the first 4 corners are - * randomly given an height, the center will be heighted to the average of + * randomly given a height, the center will be heighted to the average of * the 4 corners to which a random value is added. Then other passes fill * the heightmap by the same principle. * The random value is generated between the values -range @@ -156,10 +156,10 @@ public class MidpointDisplacementHeightMap extends AbstractHeightMap { /** * Will fill the value at (coords[0]+stepSize/2, coords[1]+stepSize/2) with - * the average from the corners of the square with topleft corner at (coords[0],coords[1]) + * the average from the corners of the square with top, left corner at (coords[0],coords[1]) * and width of stepSize. - * @param tempBuffer the temprary heightmap - * @param coords an int array of lenght 2 with the x coord in position 0 + * @param tempBuffer the temporary heightmap + * @param coords an int array of length 2 with the x coord in position 0 * @param stepSize the size of the square * @param offsetRange the offset range within a random value is picked and added to the average * @param random the random generator diff --git a/jme3-terrain/src/main/java/com/jme3/terrain/heightmap/Namer.java b/jme3-terrain/src/main/java/com/jme3/terrain/heightmap/Namer.java index cfd9d6755..a260d7b65 100644 --- a/jme3-terrain/src/main/java/com/jme3/terrain/heightmap/Namer.java +++ b/jme3-terrain/src/main/java/com/jme3/terrain/heightmap/Namer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -38,7 +38,7 @@ package com.jme3.terrain.heightmap; public interface Namer { /** - * Gets a name for a heightmap tile given it's cell id + * Gets a name for a heightmap tile given its cell id * @param x * @param y * @return diff --git a/jme3-terrain/src/main/java/com/jme3/terrain/noise/filter/HydraulicErodeFilter.java b/jme3-terrain/src/main/java/com/jme3/terrain/noise/filter/HydraulicErodeFilter.java index db0580f63..ec23d21eb 100644 --- a/jme3-terrain/src/main/java/com/jme3/terrain/noise/filter/HydraulicErodeFilter.java +++ b/jme3-terrain/src/main/java/com/jme3/terrain/noise/filter/HydraulicErodeFilter.java @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011, Novyon Events + * Copyright (c) 2011-2018, Novyon Events * * All rights reserved. * @@ -100,7 +100,7 @@ public class HydraulicErodeFilter extends AbstractFilter { } } - // step 3. water is transported to it's neighbours + // step 3. water is transported to its neighbours float a = ga[idx] + wt[idx]; // float[] aj = new float[idxrel.length]; float amax = 0; diff --git a/jme3-testdata/src/main/resources/Models/Oto/OtoOldAnim.j3o b/jme3-testdata/src/main/resources/Models/Oto/OtoOldAnim.j3o new file mode 100644 index 000000000..101dd8405 Binary files /dev/null and b/jme3-testdata/src/main/resources/Models/Oto/OtoOldAnim.j3o differ diff --git a/jme3-testdata/src/main/resources/Models/Sinbad/SinbadOldAnim.j3o b/jme3-testdata/src/main/resources/Models/Sinbad/SinbadOldAnim.j3o new file mode 100644 index 000000000..4df92c80a Binary files /dev/null and b/jme3-testdata/src/main/resources/Models/Sinbad/SinbadOldAnim.j3o differ diff --git a/jme3-testdata/src/main/resources/Models/Tank/Tank_Metallic.png b/jme3-testdata/src/main/resources/Models/Tank/Tank_Metallic.png deleted file mode 100644 index afe233143..000000000 Binary files a/jme3-testdata/src/main/resources/Models/Tank/Tank_Metallic.png and /dev/null differ diff --git a/jme3-testdata/src/main/resources/Models/Tank/Tank_Occ_Rough_Metal.png b/jme3-testdata/src/main/resources/Models/Tank/Tank_Occ_Rough_Metal.png new file mode 100644 index 000000000..9a6cf378f Binary files /dev/null and b/jme3-testdata/src/main/resources/Models/Tank/Tank_Occ_Rough_Metal.png differ diff --git a/jme3-testdata/src/main/resources/Models/Tank/Tank_Roughness.png b/jme3-testdata/src/main/resources/Models/Tank/Tank_Roughness.png deleted file mode 100644 index 41f6c0a73..000000000 Binary files a/jme3-testdata/src/main/resources/Models/Tank/Tank_Roughness.png and /dev/null differ diff --git a/jme3-testdata/src/main/resources/Models/Tank/tank.j3m b/jme3-testdata/src/main/resources/Models/Tank/tank.j3m index 0bd16814e..3cd8ac428 100644 --- a/jme3-testdata/src/main/resources/Models/Tank/tank.j3m +++ b/jme3-testdata/src/main/resources/Models/Tank/tank.j3m @@ -1,11 +1,12 @@ Material Tank : Common/MatDefs/Light/PBRLighting.j3md { MaterialParameters { - MetallicMap : Flip Models/Tank/Tank_Metallic.png - RoughnessMap : Flip Models/Tank/Tank_Roughness.png + MetallicRoughnessMap : Flip Models/Tank/Tank_Occ_Rough_Metal.png NormalMap : Flip Models/Tank/Tank_Normal.png BaseColorMap : Flip Models/Tank/Tank_Base_Color.png EmissiveMap : Flip Models/Tank/Tank_Emissive.png + LightMap: Flip Models/Tank/Tank_Occ_Rough_Metal.png + LightMapAsAOMap: true; EmissiveIntensity : 2.0 } diff --git a/jme3-vr/build.gradle b/jme3-vr/build.gradle index d2c299eb0..7a9ea7d34 100644 --- a/jme3-vr/build.gradle +++ b/jme3-vr/build.gradle @@ -2,7 +2,7 @@ if (!hasProperty('mainClass')) { ext.mainClass = '' } -def lwjglVersion = '3.1.3' +def lwjglVersion = '3.2.0' sourceCompatibility = '1.8' @@ -18,4 +18,12 @@ dependencies { // Native LibOVR/Oculus support compile "org.lwjgl:lwjgl-ovr:${lwjglVersion}" runtime "org.lwjgl:lwjgl-ovr:${lwjglVersion}:natives-windows" + + // Native OpenVR/LWJGL support + compile "org.lwjgl:lwjgl-openvr:${lwjglVersion}" + compile "org.lwjgl:lwjgl-openvr:${lwjglVersion}:natives-linux" + compile "org.lwjgl:lwjgl-openvr:${lwjglVersion}:natives-macos" + runtime "org.lwjgl:lwjgl-openvr:${lwjglVersion}:natives-windows" + runtime "org.lwjgl:lwjgl-openvr:${lwjglVersion}:natives-linux" + runtime "org.lwjgl:lwjgl-openvr:${lwjglVersion}:natives-macos" } \ No newline at end of file diff --git a/jme3-vr/src/main/java/com/jme3/app/VRAppState.java b/jme3-vr/src/main/java/com/jme3/app/VRAppState.java index 54e7643ce..2ff8c50d5 100644 --- a/jme3-vr/src/main/java/com/jme3/app/VRAppState.java +++ b/jme3-vr/src/main/java/com/jme3/app/VRAppState.java @@ -1,7 +1,7 @@ package com.jme3.app; /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -34,10 +34,10 @@ package com.jme3.app; import com.jme3.app.Application; import com.jme3.app.state.AbstractAppState; import com.jme3.app.state.AppStateManager; -import com.jme3.input.vr.OculusVR; -import com.jme3.input.vr.OpenVR; import com.jme3.input.vr.VRAPI; import com.jme3.input.vr.VRInputAPI; +import com.jme3.input.vr.VRMouseManager; +import com.jme3.input.vr.VRViewManager; import com.jme3.math.ColorRGBA; import com.jme3.math.Quaternion; import com.jme3.math.Vector3f; @@ -48,8 +48,6 @@ import com.jme3.scene.Spatial; import com.jme3.system.AppSettings; import com.jme3.util.VRGUIPositioningMode; import com.jme3.util.VRGuiManager; -import com.jme3.util.VRMouseManager; -import com.jme3.util.VRViewManager; import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; @@ -74,7 +72,7 @@ import java.util.logging.Logger; *

  • To start the main {@link Application application}. * * Attaching an instance of this app state to an already started application may cause crashes. - * @author Julien Seinturier - JOrigin project - http:/www.jorigin.org + * @author Julien Seinturier - COMEX SA - http://www.seinturier.fr */ public class VRAppState extends AbstractAppState { @@ -119,7 +117,7 @@ public class VRAppState extends AbstractAppState { } /** - * Create a new VR app state with given settings. The app state relies on the the given {@link VREnvironment VR environment}. + * Create a new VR app state with given settings. The app state relies on the given {@link VREnvironment VR environment}. * @param settings the settings to use. * @param environment the {@link VREnvironment VR environment} that this app state is using. */ @@ -148,9 +146,9 @@ public class VRAppState extends AbstractAppState { } /** - * Set the frustrum values for the application. - * @param near the frustrum near value. - * @param far the frustrum far value. + * Set the frustum values for the application. + * @param near the frustum near value. + * @param far the frustum far value. */ public void setFrustrumNearFar(float near, float far) { fNear = near; @@ -303,7 +301,7 @@ public class VRAppState extends AbstractAppState { } /** - * Set the scene observer. The VR headset will be linked to it. If no observer is set, the VR headset is linked to the the application {@link #getCamera() camera}. + * Set the scene observer. The VR headset will be linked to it. If no observer is set, the VR headset is linked to the application {@link #getCamera() camera}. * @param observer the scene observer. */ public void setObserver(Spatial observer) { @@ -404,17 +402,25 @@ public class VRAppState extends AbstractAppState { // it will get updated automatically in the viewmanager update otherwise // TODO isn't this done by SimpleApplication? for (Spatial spatial : application.getGuiViewPort().getScenes()) { + //spatial.updateLogicalState(tpf); spatial.updateGeometricState(); } } - + // use the analog control on the first tracked controller to push around the mouse - // FIXME crashes on Rift/Touch (and probably OSVR), as it assumes the presence of the Vive touchpads - if(getVRHardware() instanceof OpenVR) { - environment.getVRMouseManager().updateAnalogAsMouse(0, null, null, null, tpf); - } + environment.getVRMouseManager().updateAnalogAsMouse(0, null, null, null, tpf); } + @Override + public void render(RenderManager rm) { + super.render(rm); + + // update compositor + if( environment.getVRViewManager() != null ) { + environment.getVRViewManager().render(); + } + } + @Override public void postRender() { super.postRender(); @@ -425,16 +431,6 @@ public class VRAppState extends AbstractAppState { } } - @Override - public void render(RenderManager rm) { - super.render(rm); - - // update compositor - if( environment.getVRViewManager() != null ) { - environment.getVRViewManager().render(); - } - } - @Override public void initialize(AppStateManager stateManager, Application app) { super.initialize(stateManager, app); @@ -601,11 +597,7 @@ public class VRAppState extends AbstractAppState { settings.setFrequency(environment.getVRHardware().getDisplayFrequency()); settings.setFullscreen(false); settings.setVSync(false); // stop vsyncing on primary monitor! - - // TODO: Is this preventing desktop display on _ALL_ HMDs? - if(!(getVRHardware() instanceof OculusVR)) { - settings.setSwapBuffers(environment.isSwapBuffers()); - } + settings.setSwapBuffers(environment.isSwapBuffers()); } // Updating application settings diff --git a/jme3-vr/src/main/java/com/jme3/app/VRApplication.java b/jme3-vr/src/main/java/com/jme3/app/VRApplication.java index 9d502431d..0ea29d645 100644 --- a/jme3-vr/src/main/java/com/jme3/app/VRApplication.java +++ b/jme3-vr/src/main/java/com/jme3/app/VRApplication.java @@ -18,10 +18,12 @@ import com.jme3.input.KeyInput; import com.jme3.input.MouseInput; import com.jme3.input.TouchInput; import com.jme3.input.controls.KeyTrigger; -import com.jme3.input.vr.OSVR; -import com.jme3.input.vr.OpenVR; import com.jme3.input.vr.VRAPI; import com.jme3.input.vr.VRInputAPI; +import com.jme3.input.vr.openvr.OpenVR; +import com.jme3.input.vr.openvr.OpenVRMouseManager; +import com.jme3.input.vr.openvr.OpenVRViewManager; +import com.jme3.input.vr.osvr.OSVR; import com.jme3.math.ColorRGBA; import com.jme3.math.Quaternion; import com.jme3.math.Vector3f; @@ -47,8 +49,6 @@ import com.jme3.system.lwjgl.LwjglDisplayVR; import com.jme3.system.lwjgl.LwjglOffscreenBufferVR; import com.jme3.util.VRGUIPositioningMode; import com.jme3.util.VRGuiManager; -import com.jme3.util.VRMouseManager; -import com.jme3.util.VRViewManagerOpenVR; import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; @@ -72,7 +72,7 @@ import org.lwjgl.system.Platform; *

    * This class is no more functional and is deprecated. Please use {@link VRAppState VRAppState} instead. * @author reden - phr00t - https://github.com/phr00t - * @author Julien Seinturier - (c) 2016 - JOrigin project - http:/www.jorigin.org + * @author Julien Seinturier - COMEX SA - http://www.seinturier.fr * @deprecated use {@link VRAppState VRAppState} instead. */ public abstract class VRApplication implements Application, SystemListener { @@ -171,8 +171,8 @@ public abstract class VRApplication implements Application, SystemListener { private VRAPI VRhardware = null; private VRGuiManager guiManager = null; - private VRMouseManager mouseManager = null; - private VRViewManagerOpenVR viewmanager = null; + private OpenVRMouseManager mouseManager = null; + private OpenVRViewManager viewmanager = null; private String OS; @@ -259,10 +259,10 @@ public abstract class VRApplication implements Application, SystemListener { guiManager = new VRGuiManager(null); // Create a new view manager. - viewmanager = new VRViewManagerOpenVR(null); + viewmanager = new OpenVRViewManager(null); // Create a new mouse manager. - mouseManager = new VRMouseManager(null); + mouseManager = new OpenVRMouseManager(null); // we are going to use OpenVR now, not the Oculus Rift // OpenVR does support the Rift @@ -311,7 +311,7 @@ public abstract class VRApplication implements Application, SystemListener { * Get the VR view manager. * @return the VR view manager. */ - public VRViewManagerOpenVR getVRViewManager() { + public OpenVRViewManager getVRViewManager() { return viewmanager; } @@ -327,14 +327,14 @@ public abstract class VRApplication implements Application, SystemListener { * Get the VR mouse manager attached to this application. * @return the VR mouse manager attached to this application. */ - public VRMouseManager getVRMouseManager(){ + public OpenVRMouseManager getVRMouseManager(){ return mouseManager; } /** - * Set the frustrum values for the application. - * @param near the frustrum near value. - * @param far the frustrum far value. + * Set the frustum values for the application. + * @param near the frustum near value. + * @param far the frustum far value. */ public void setFrustrumNearFar(float near, float far) { fNear = near; @@ -1006,7 +1006,7 @@ public abstract class VRApplication implements Application, SystemListener { } /** - * Set the scene observer. The VR headset will be linked to it. If no observer is set, the VR headset is linked to the the application {@link #getCamera() camera}. + * Set the scene observer. The VR headset will be linked to it. If no observer is set, the VR headset is linked to the application {@link #getCamera() camera}. * @param observer the scene observer. */ public void setObserver(Spatial observer) { @@ -1359,7 +1359,7 @@ public abstract class VRApplication implements Application, SystemListener { } //FIXME: WARNING !! - viewmanager = new VRViewManagerOpenVR(null); + viewmanager = new OpenVRViewManager(null); viewmanager.setResolutionMultiplier(resMult); inputManager.addMapping(RESET_HMD, new KeyTrigger(KeyInput.KEY_F9)); setLostFocusBehavior(LostFocusBehavior.Disabled); diff --git a/jme3-vr/src/main/java/com/jme3/app/VRConstants.java b/jme3-vr/src/main/java/com/jme3/app/VRConstants.java index d8ec7fea7..969f6cb80 100644 --- a/jme3-vr/src/main/java/com/jme3/app/VRConstants.java +++ b/jme3-vr/src/main/java/com/jme3/app/VRConstants.java @@ -6,7 +6,7 @@ import com.jme3.system.AppSettings; /** * Some constants dedicated to the VR module. - * @author Julien Seinturier - JOrigin project - http:/www.jorigin.org + * @author Julien Seinturier - COMEX SA - http://www.seinturier.fr * @since 3.1.0 */ public class VRConstants { @@ -117,6 +117,7 @@ public class VRConstants { *

  • {@link VRConstants#SETTING_VRAPI_OPENVR_VALUE SETTING_VRAPI_OPENVR_VALUE}: Use OpenVR binding. *
  • {@link VRConstants#SETTING_VRAPI_OSVR_VALUE SETTING_VRAPI_OSVR_VALUE}: Use OSVR binding. *
  • {@link VRConstants#SETTING_VRAPI_OPENVR_LWJGL_VALUE SETTING_VRAPI_OPENVR_LWJGL_VALUE}: Use OpenVR binding from LWJGL. + *
  • {@link VRConstants#SETTING_VRAPI_OCULUSVR_VALUE SETTING_VRAPI_OCULUSVR_VALUE}: Use Occulus Rift binding binding. * * Type: int
    * Usage: {@link AppSettings appSettings}.{@link HashMap#put(Object, Object) put}(VRConstants.SETTING_VRAPI, value) @@ -126,29 +127,34 @@ public class VRConstants { /** * The identifier of the OpenVR system. - * @see #SETTING_VRAPI + * @see #SETTING_VRAPI_OSVR_VALUE + * @see #SETTING_VRAPI_OPENVR_LWJGL_VALUE + * @see #SETTING_VRAPI_OCULUSVR_VALUE */ public static final int SETTING_VRAPI_OPENVR_VALUE = 1; /** * The identifier of the OSVR system. - * @see #SETTING_VRAPI + * @see #SETTING_VRAPI_OPENVR_VALUE + * @see #SETTING_VRAPI_OPENVR_LWJGL_VALUE + * @see #SETTING_VRAPI_OCULUSVR_VALUE */ public static final int SETTING_VRAPI_OSVR_VALUE = 2; /** * The identifier of the OpenVR from LWJGL system. - * @see #SETTING_VRAPI + * @see #SETTING_VRAPI_OPENVR_VALUE + * @see #SETTING_VRAPI_OSVR_VALUE + * @see #SETTING_VRAPI_OCULUSVR_VALUE */ public static final int SETTING_VRAPI_OPENVR_LWJGL_VALUE = 3; - + /** - * The identifier of the LibOVR (Oculus) system. - * - * @see #SETTING_VRAPI + * The identifier of the Oculus Rift system. + * @see #SETTING_VRAPI_OPENVR_VALUE + * @see #SETTING_VRAPI_OSVR_VALUE + * @see #SETTING_VRAPI_OPENVR_LWJGL_VALUE */ - public static final int SETTING_VRAPI_OCULUSVR_VALUE = 4; - - + public static final int SETTING_VRAPI_OCULUSVR_VALUE = 4; } diff --git a/jme3-vr/src/main/java/com/jme3/app/VREnvironment.java b/jme3-vr/src/main/java/com/jme3/app/VREnvironment.java index 7ab9e29ff..747d3f4a7 100644 --- a/jme3-vr/src/main/java/com/jme3/app/VREnvironment.java +++ b/jme3-vr/src/main/java/com/jme3/app/VREnvironment.java @@ -5,23 +5,33 @@ import java.util.logging.Level; import java.util.logging.Logger; import com.jme3.app.state.AppState; -import com.jme3.input.vr.OSVR; -import com.jme3.input.vr.OpenVR; -import com.jme3.input.vr.OculusVR; import com.jme3.input.vr.VRAPI; import com.jme3.input.vr.VRBounds; import com.jme3.input.vr.VRInputAPI; +import com.jme3.input.vr.VRMouseManager; +import com.jme3.input.vr.VRViewManager; +import com.jme3.input.vr.lwjgl_openvr.LWJGLOpenVR; +import com.jme3.input.vr.lwjgl_openvr.LWJGLOpenVRMouseManager; +import com.jme3.input.vr.lwjgl_openvr.LWJGLOpenVRViewManager; +import com.jme3.input.vr.oculus.OculusMouseManager; +import com.jme3.input.vr.oculus.OculusVR; +import com.jme3.input.vr.oculus.OculusViewManager; +import com.jme3.input.vr.openvr.OpenVR; +import com.jme3.input.vr.openvr.OpenVRMouseManager; +import com.jme3.input.vr.openvr.OpenVRViewManager; +import com.jme3.input.vr.osvr.OSVR; +import com.jme3.input.vr.osvr.OSVRViewManager; import com.jme3.renderer.Camera; import com.jme3.scene.Spatial; import com.jme3.system.AppSettings; import com.jme3.system.jopenvr.JOpenVRLibrary; import com.jme3.util.VRGuiManager; -import com.jme3.util.VRMouseManager; -import com.jme3.util.VRViewManager; -import com.jme3.util.VRViewManagerOSVR; -import com.jme3.util.VRViewManagerOculus; -import com.jme3.util.VRViewManagerOpenVR; +/** + * + * @author Julien Seinturier - COMEX SA - http://www.seinturier.fr + * + */ public class VREnvironment { private static final Logger logger = Logger.getLogger(VREnvironment.class.getName()); @@ -74,11 +84,8 @@ public class VREnvironment { public VREnvironment(AppSettings settings){ this.settings = settings; - - guiManager = new VRGuiManager(this); - mouseManager = new VRMouseManager(this); - - bounds = new VRBounds(); + + bounds = null; processSettings(); } @@ -91,9 +98,19 @@ public class VREnvironment { return hardware; } + /** + * Set the VR bounds. + * @return the VR bounds. + * @see #getVRBounds() + */ + public void setVRBounds(VRBounds bounds){ + this.bounds = bounds; + } + /** * Get the VR bounds. * @return the VR bounds. + * @see #setVRBounds(VRBounds) */ public VRBounds getVRBounds(){ return bounds; @@ -152,6 +169,10 @@ public class VREnvironment { } else { ((OpenVR)hardware).getCompositor().SetTrackingSpace.apply(JOpenVRLibrary.ETrackingUniverseOrigin.ETrackingUniverseOrigin_TrackingUniverseStanding); } + } else if (hardware instanceof LWJGLOpenVR) { + if( ((LWJGLOpenVR)hardware).isInitialized() ) { + ((LWJGLOpenVR)hardware).setTrackingSpace(seated); + } } } @@ -205,7 +226,7 @@ public class VREnvironment { } /** - * Set the scene observer. The VR headset will be linked to it. If no observer is set, the VR headset is linked to the the application {@link #getCamera() camera}. + * Set the scene observer. The VR headset will be linked to it. If no observer is set, the VR headset is linked to the application {@link #getCamera() camera}. * @param observer the scene observer. */ public void setObserver(Spatial observer) { @@ -387,11 +408,13 @@ public class VREnvironment { // Instanciate view manager if (vrBinding == VRConstants.SETTING_VRAPI_OPENVR_VALUE){ - viewmanager = new VRViewManagerOpenVR(this); + viewmanager = new OpenVRViewManager(this); } else if (vrBinding == VRConstants.SETTING_VRAPI_OSVR_VALUE){ - viewmanager = new VRViewManagerOSVR(this); - } else if (vrBinding == VRConstants.SETTING_VRAPI_OCULUSVR_VALUE) { - viewmanager = new VRViewManagerOculus(this); + viewmanager = new OSVRViewManager(this); + } else if (vrBinding == VRConstants.SETTING_VRAPI_OCULUSVR_VALUE) { + viewmanager = new OculusViewManager(this); + } else if (vrBinding == VRConstants.SETTING_VRAPI_OPENVR_LWJGL_VALUE) { + viewmanager = new LWJGLOpenVRViewManager(this); } else { logger.severe("Cannot instanciate view manager, unknown VRAPI type: "+vrBinding); } @@ -416,17 +439,37 @@ public class VREnvironment { if( vrSupportedOS) { if( vrBinding == VRConstants.SETTING_VRAPI_OSVR_VALUE ) { + + guiManager = new VRGuiManager(this); + mouseManager = new OpenVRMouseManager(this); + hardware = new OSVR(this); initialized = true; logger.config("Creating OSVR wrapper [SUCCESS]"); } else if( vrBinding == VRConstants.SETTING_VRAPI_OPENVR_VALUE ) { + + guiManager = new VRGuiManager(this); + mouseManager = new OpenVRMouseManager(this); + hardware = new OpenVR(this); initialized = true; logger.config("Creating OpenVR wrapper [SUCCESS]"); } else if (vrBinding == VRConstants.SETTING_VRAPI_OCULUSVR_VALUE) { + + guiManager = new VRGuiManager(this); + mouseManager = new OculusMouseManager(this); + hardware = new OculusVR(this); - initialized = true; - logger.config("Creating LibOVR wrapper [SUCCESS]"); + initialized = true; + logger.config("Creating Occulus Rift wrapper [SUCCESS]"); + } else if (vrBinding == VRConstants.SETTING_VRAPI_OPENVR_LWJGL_VALUE) { + + guiManager = new VRGuiManager(this); + mouseManager = new LWJGLOpenVRMouseManager(this); + + hardware = new LWJGLOpenVR(this); + initialized = true; + logger.config("Creating OpenVR/LWJGL wrapper [SUCCESS]"); } else { logger.config("Cannot create VR binding: "+vrBinding+" [FAILED]"); logger.log(Level.SEVERE, "Cannot initialize VR environment [FAILED]"); diff --git a/jme3-vr/src/main/java/com/jme3/input/lwjgl/GlfwKeyInputVR.java b/jme3-vr/src/main/java/com/jme3/input/lwjgl/GlfwKeyInputVR.java index c670ccd3e..e551f0fdc 100644 --- a/jme3-vr/src/main/java/com/jme3/input/lwjgl/GlfwKeyInputVR.java +++ b/jme3-vr/src/main/java/com/jme3/input/lwjgl/GlfwKeyInputVR.java @@ -48,7 +48,7 @@ import static org.lwjgl.glfw.GLFW.*; /** * A key input that wraps GLFW underlying components. * @author reden - phr00t - https://github.com/phr00t - * @author Julien Seinturier - (c) 2016 - JOrigin project - http:/www.jorigin.org + * @author Julien Seinturier - COMEX SA - http://www.seinturier.fr * */ public class GlfwKeyInputVR implements KeyInput { diff --git a/jme3-vr/src/main/java/com/jme3/input/lwjgl/GlfwMouseInputVR.java b/jme3-vr/src/main/java/com/jme3/input/lwjgl/GlfwMouseInputVR.java index e1060666a..5dbb958fb 100644 --- a/jme3-vr/src/main/java/com/jme3/input/lwjgl/GlfwMouseInputVR.java +++ b/jme3-vr/src/main/java/com/jme3/input/lwjgl/GlfwMouseInputVR.java @@ -63,7 +63,7 @@ import org.lwjgl.system.MemoryUtil; * This class support modifications dedicated to VR rendering. * @author Daniel Johansson (dannyjo) * @author reden - phr00t - https://github.com/phr00t - * @author Julien Seinturier - (c) 2016 - JOrigin project - http:/www.jorigin.org + * @author Julien Seinturier - COMEX SA - http://www.seinturier.fr * @author Julien Seinturier - (c) 2016 - JOrigin project - http:/www.jorigin.org */ public class GlfwMouseInputVR implements MouseInput { diff --git a/jme3-vr/src/main/java/com/jme3/util/VRMouseManager.java b/jme3-vr/src/main/java/com/jme3/input/vr/AbstractVRMouseManager.java similarity index 56% rename from jme3-vr/src/main/java/com/jme3/util/VRMouseManager.java rename to jme3-vr/src/main/java/com/jme3/input/vr/AbstractVRMouseManager.java index 164ea12e6..8d73e7c04 100644 --- a/jme3-vr/src/main/java/com/jme3/util/VRMouseManager.java +++ b/jme3-vr/src/main/java/com/jme3/input/vr/AbstractVRMouseManager.java @@ -1,335 +1,228 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package com.jme3.util; - -import java.util.logging.Logger; - -import org.lwjgl.glfw.GLFW; - -import com.jme3.app.VREnvironment; -import com.jme3.input.MouseInput; -import com.jme3.input.controls.AnalogListener; -import com.jme3.input.lwjgl.GlfwMouseInputVR; -import com.jme3.input.vr.VRInputType; -import com.jme3.material.RenderState.BlendMode; -import com.jme3.math.Vector2f; -import com.jme3.scene.Node; -import com.jme3.system.AppSettings; -import com.jme3.system.lwjgl.LwjglWindow; -import com.jme3.texture.Texture; -import com.jme3.texture.Texture2D; -import com.jme3.ui.Picture; - -/** - * A class dedicated to the handling of the mouse within VR environment. - * @author Julien Seinturier - (c) 2016 - JOrigin project - http:/www.jorigin.org - * - */ -public class VRMouseManager { - - private static final Logger logger = Logger.getLogger(VRMouseManager.class.getName()); - - - private VREnvironment environment = null; - - private final int AVERAGE_AMNT = 4; - private int avgCounter; - - private Picture mouseImage; - private int recentCenterCount = 0; - private final Vector2f cursorPos = new Vector2f(); - private float ySize, sensitivity = 8f, acceleration = 2f; - private final float[] lastXmv = new float[AVERAGE_AMNT], lastYmv = new float[AVERAGE_AMNT]; - private boolean thumbstickMode; - private float moveScale = 1f; - - private float avg(float[] arr) { - float amt = 0f; - for(float f : arr) amt += f; - return amt / arr.length; - } - - /** - * Create a new VR mouse manager within the given {@link VREnvironment VR environment}. - * @param environment the VR environment of the mouse manager. - */ - public VRMouseManager(VREnvironment environment){ - this.environment = environment; - } - - /** - * Initialize the VR mouse manager. - */ - protected void initialize() { - - logger.config("Initializing VR mouse manager."); - - // load default mouseimage - mouseImage = new Picture("mouse"); - setImage("Common/Util/mouse.png"); - // hide default cursor by making it invisible - - MouseInput mi = environment.getApplication().getContext().getMouseInput(); - if( mi instanceof GlfwMouseInputVR ){ - ((GlfwMouseInputVR)mi).hideActiveCursor(); - } - centerMouse(); - - logger.config("Initialized VR mouse manager [SUCCESS]"); - } - - public void setThumbstickMode(boolean set) { - thumbstickMode = set; - } - - public boolean isThumbstickMode() { - return thumbstickMode; - } - - /** - * Set the speed of the mouse. - * @param sensitivity the sensitivity of the mouse. - * @param acceleration the acceleration of the mouse. - * @see #getSpeedAcceleration() - * @see #getSpeedSensitivity() - */ - public void setSpeed(float sensitivity, float acceleration) { - this.sensitivity = sensitivity; - this.acceleration = acceleration; - } - - /** - * Get the sensitivity of the mouse. - * @return the sensitivity of the mouse. - * @see #setSpeed(float, float) - */ - public float getSpeedSensitivity() { - return sensitivity; - } - - /** - * Get the acceleration of the mouse. - * @return the acceleration of the mouse. - * @see #setSpeed(float, float) - */ - public float getSpeedAcceleration() { - return acceleration; - } - - /** - * Set the mouse move scale. - * @param set the mouse move scale. - */ - public void setMouseMoveScale(float set) { - moveScale = set; - } - - /** - * Set the image to use as mouse cursor. The given string describe an asset that the underlying application asset manager has to load. - * @param texture the image to use as mouse cursor. - */ - public void setImage(String texture) { - - if (environment != null){ - - if (environment.getApplication() != null){ - if( environment.isInVR() == false ){ - Texture tex = environment.getApplication().getAssetManager().loadTexture(texture); - mouseImage.setTexture(environment.getApplication().getAssetManager(), (Texture2D)tex, true); - ySize = tex.getImage().getHeight(); - mouseImage.setHeight(ySize); - mouseImage.setWidth(tex.getImage().getWidth()); - mouseImage.getMaterial().getAdditionalRenderState().setBlendMode(BlendMode.Alpha); - mouseImage.getMaterial().getAdditionalRenderState().setDepthWrite(false); - } else { - Texture tex = environment.getApplication().getAssetManager().loadTexture(texture); - mouseImage.setTexture(environment.getApplication().getAssetManager(), (Texture2D)tex, true); - ySize = tex.getImage().getHeight(); - mouseImage.setHeight(ySize); - mouseImage.setWidth(tex.getImage().getWidth()); - mouseImage.getMaterial().getAdditionalRenderState().setBlendMode(BlendMode.Alpha); - mouseImage.getMaterial().getAdditionalRenderState().setDepthWrite(false); - } - } else { - throw new IllegalStateException("This VR environment is not attached to any application."); - } - - } else { - throw new IllegalStateException("This VR view manager is not attached to any VR environment."); - } - } - - /** - * Update analog controller as it was a mouse controller. - * @param inputIndex the index of the controller attached to the VR system. - * @param mouseListener the JMonkey mouse listener to trigger. - * @param mouseXName the mouseX identifier. - * @param mouseYName the mouseY identifier - * @param tpf the time per frame. - */ - public void updateAnalogAsMouse(int inputIndex, AnalogListener mouseListener, String mouseXName, String mouseYName, float tpf) { - - if (environment != null){ - if (environment.getApplication() != null){ - // got a tracked controller to use as the "mouse" - if( environment.isInVR() == false || - environment.getVRinput() == null || - environment.getVRinput().isInputDeviceTracking(inputIndex) == false ){ - return; - } - - Vector2f tpDelta; - // TODO option to use Touch joysticks - if( thumbstickMode ) { - tpDelta = environment.getVRinput().getAxis(inputIndex, VRInputType.ViveTrackpadAxis); - } else { - tpDelta = environment.getVRinput().getAxisDeltaSinceLastCall(inputIndex, VRInputType.ViveTrackpadAxis); - } - - float Xamount = (float)Math.pow(Math.abs(tpDelta.x) * sensitivity, acceleration); - float Yamount = (float)Math.pow(Math.abs(tpDelta.y) * sensitivity, acceleration); - - if( tpDelta.x < 0f ){ - Xamount = -Xamount; - } - - if( tpDelta.y < 0f ){ - Yamount = -Yamount; - } - - Xamount *= moveScale; Yamount *= moveScale; - if( mouseListener != null ) { - if( tpDelta.x != 0f && mouseXName != null ) mouseListener.onAnalog(mouseXName, Xamount * 0.2f, tpf); - if( tpDelta.y != 0f && mouseYName != null ) mouseListener.onAnalog(mouseYName, Yamount * 0.2f, tpf); - } - - if( environment.getApplication().getInputManager().isCursorVisible() ) { - int index = (avgCounter+1) % AVERAGE_AMNT; - lastXmv[index] = Xamount * 133f; - lastYmv[index] = Yamount * 133f; - cursorPos.x -= avg(lastXmv); - cursorPos.y -= avg(lastYmv); - Vector2f maxsize = environment.getVRGUIManager().getCanvasSize(); - - if( cursorPos.x > maxsize.x ){ - cursorPos.x = maxsize.x; - } - - if( cursorPos.x < 0f ){ - cursorPos.x = 0f; - } - - if( cursorPos.y > maxsize.y ){ - cursorPos.y = maxsize.y; - } - - if( cursorPos.y < 0f ){ - cursorPos.y = 0f; - } - } - } else { - throw new IllegalStateException("This VR environment is not attached to any application."); - } - } else { - throw new IllegalStateException("This VR view manager is not attached to any VR environment."); - } - } - - /** - * Get the actual cursor position. - * @return the actual cursor position. - */ - public Vector2f getCursorPosition() { - - if (environment != null){ - if (environment.getApplication() != null){ - if( environment.isInVR() ) { - return cursorPos; - } - - return environment.getApplication().getInputManager().getCursorPosition(); - } else { - throw new IllegalStateException("This VR environment is not attached to any application."); - } - } else { - throw new IllegalStateException("This VR view manager is not attached to any VR environment."); - } - } - - /** - * Center the mouse on the display. - */ - public void centerMouse() { - - if (environment != null){ - if (environment.getApplication() != null){ - // set mouse in center of the screen if newly added - Vector2f size = environment.getVRGUIManager().getCanvasSize(); - MouseInput mi = environment.getApplication().getContext().getMouseInput(); - AppSettings as = environment.getApplication().getContext().getSettings(); - if( mi instanceof GlfwMouseInputVR ) ((GlfwMouseInputVR)mi).setCursorPosition((int)(as.getWidth() / 2f), (int)(as.getHeight() / 2f)); - if( environment.isInVR() ) { - cursorPos.x = size.x / 2f; - cursorPos.y = size.y / 2f; - recentCenterCount = 2; - } - } else { - throw new IllegalStateException("This VR environment is not attached to any application."); - } - } else { - throw new IllegalStateException("This VR view manager is not attached to any VR environment."); - } - - } - - /** - * Update the mouse manager. This method should not be called manually. - * The standard behavior for this method is to be called from the {@link VRViewManager#update(float) update method} of the attached {@link VRViewManager VR view manager}. - * @param tpf the time per frame. - */ - protected void update(float tpf) { - // if we are showing the cursor, add our picture as it - - if( environment.getApplication().getInputManager().isCursorVisible() ) { - if( mouseImage.getParent() == null ) { - - environment.getApplication().getGuiViewPort().attachScene(mouseImage); - centerMouse(); - // the "real" mouse pointer should stay hidden - if (environment.getApplication().getContext() instanceof LwjglWindow){ - GLFW.glfwSetInputMode(((LwjglWindow)environment.getApplication().getContext()).getWindowHandle(), GLFW.GLFW_CURSOR, GLFW.GLFW_CURSOR_DISABLED); - } - } - // handle mouse movements, which may be in addition to (or exclusive from) tracked movement - MouseInput mi = environment.getApplication().getContext().getMouseInput(); - if( mi instanceof GlfwMouseInputVR ) { - if( recentCenterCount <= 0 ) { - //Vector2f winratio = VRGuiManager.getCanvasToWindowRatio(); - cursorPos.x += ((GlfwMouseInputVR)mi).getLastDeltaX();// * winratio.x; - cursorPos.y += ((GlfwMouseInputVR)mi).getLastDeltaY();// * winratio.y; - if( cursorPos.x < 0f ) cursorPos.x = 0f; - if( cursorPos.y < 0f ) cursorPos.y = 0f; - if( cursorPos.x > environment.getVRGUIManager().getCanvasSize().x ) cursorPos.x = environment.getVRGUIManager().getCanvasSize().x; - if( cursorPos.y > environment.getVRGUIManager().getCanvasSize().y ) cursorPos.y = environment.getVRGUIManager().getCanvasSize().y; - } else recentCenterCount--; - ((GlfwMouseInputVR)mi).clearDeltas(); - } - // ok, update the cursor graphic position - Vector2f currentPos = getCursorPosition(); - mouseImage.setLocalTranslation(currentPos.x, currentPos.y - ySize, environment.getVRGUIManager().getGuiDistance() + 1f); - - mouseImage.updateGeometricState(); - - } else if( mouseImage.getParent() != null ) { - Node n = mouseImage.getParent(); - mouseImage.removeFromParent(); - - if (n != null){ - n.updateGeometricState(); - } - } - } -} +package com.jme3.input.vr; + +import java.util.logging.Logger; + +import org.lwjgl.glfw.GLFW; + +import com.jme3.app.VREnvironment; +import com.jme3.input.MouseInput; +import com.jme3.input.lwjgl.GlfwMouseInputVR; +import com.jme3.material.RenderState.BlendMode; +import com.jme3.math.Vector2f; +import com.jme3.scene.Node; +import com.jme3.system.AppSettings; +import com.jme3.system.lwjgl.LwjglWindow; +import com.jme3.texture.Texture; +import com.jme3.texture.Texture2D; +import com.jme3.ui.Picture; + +/** + * An abstract implementation of a {@link VRMouseManager}. This class should be overrided by specific hardware implementation of VR devices. + * @author Julien Seinturier - COMEX SA - http://www.seinturier.fr + * + */ +public abstract class AbstractVRMouseManager implements VRMouseManager { + + private static final Logger logger = Logger.getLogger(AbstractVRMouseManager.class.getName()); + + private VREnvironment environment = null; + + + + private Picture mouseImage; + private int recentCenterCount = 0; + + protected final Vector2f cursorPos = new Vector2f(); + + private float ySize, sensitivity = 8f, acceleration = 2f; + + private boolean thumbstickMode; + private float moveScale = 1f; + + /** + * Create a new AbstractVRMouseManager attached to the given {@link VREnvironment VR environment}. + * @param environment the {@link VREnvironment VR environment} that this manager is attached to. + */ + public AbstractVRMouseManager(VREnvironment environment) { + this.environment = environment; + } + + @Override + public void initialize() { + + logger.config("Initializing VR mouse manager."); + + // load default mouseimage + mouseImage = new Picture("mouse"); + setImage("Common/Util/mouse.png"); + // hide default cursor by making it invisible + + MouseInput mi = environment.getApplication().getContext().getMouseInput(); + if( mi instanceof GlfwMouseInputVR ){ + ((GlfwMouseInputVR)mi).hideActiveCursor(); + } + centerMouse(); + + logger.config("Initialized VR mouse manager [SUCCESS]"); + } + + @Override + public VREnvironment getVREnvironment() { + return environment; + } + + @Override + public void setThumbstickMode(boolean set) { + thumbstickMode = set; + } + + @Override + public boolean isThumbstickMode() { + return thumbstickMode; + } + + @Override + public void setSpeed(float sensitivity, float acceleration) { + this.sensitivity = sensitivity; + this.acceleration = acceleration; + } + + @Override + public float getSpeedSensitivity() { + return sensitivity; + } + + @Override + public float getSpeedAcceleration() { + return acceleration; + } + + @Override + public float getMouseMoveScale() { + return moveScale; + } + + @Override + public void setMouseMoveScale(float set) { + moveScale = set; + } + + @Override + public void setImage(String texture) { + + if (environment != null){ + + if (environment.getApplication() != null){ + if( environment.isInVR() == false ){ + Texture tex = environment.getApplication().getAssetManager().loadTexture(texture); + mouseImage.setTexture(environment.getApplication().getAssetManager(), (Texture2D)tex, true); + ySize = tex.getImage().getHeight(); + mouseImage.setHeight(ySize); + mouseImage.setWidth(tex.getImage().getWidth()); + mouseImage.getMaterial().getAdditionalRenderState().setBlendMode(BlendMode.Alpha); + mouseImage.getMaterial().getAdditionalRenderState().setDepthWrite(false); + } else { + Texture tex = environment.getApplication().getAssetManager().loadTexture(texture); + mouseImage.setTexture(environment.getApplication().getAssetManager(), (Texture2D)tex, true); + ySize = tex.getImage().getHeight(); + mouseImage.setHeight(ySize); + mouseImage.setWidth(tex.getImage().getWidth()); + mouseImage.getMaterial().getAdditionalRenderState().setBlendMode(BlendMode.Alpha); + mouseImage.getMaterial().getAdditionalRenderState().setDepthWrite(false); + } + } else { + throw new IllegalStateException("This VR environment is not attached to any application."); + } + + } else { + throw new IllegalStateException("This VR view manager is not attached to any VR environment."); + } + } + + + @Override + public Vector2f getCursorPosition() { + + if (environment != null){ + if (environment.getApplication() != null){ + if( environment.isInVR() ) { + return cursorPos; + } + + return environment.getApplication().getInputManager().getCursorPosition(); + } else { + throw new IllegalStateException("This VR environment is not attached to any application."); + } + } else { + throw new IllegalStateException("This VR view manager is not attached to any VR environment."); + } + } + + @Override + public void centerMouse() { + + if (environment != null){ + if (environment.getApplication() != null){ + // set mouse in center of the screen if newly added + Vector2f size = environment.getVRGUIManager().getCanvasSize(); + MouseInput mi = environment.getApplication().getContext().getMouseInput(); + AppSettings as = environment.getApplication().getContext().getSettings(); + if( mi instanceof GlfwMouseInputVR ) ((GlfwMouseInputVR)mi).setCursorPosition((int)(as.getWidth() / 2f), (int)(as.getHeight() / 2f)); + if( environment.isInVR() ) { + cursorPos.x = size.x / 2f; + cursorPos.y = size.y / 2f; + recentCenterCount = 2; + } + } else { + throw new IllegalStateException("This VR environment is not attached to any application."); + } + } else { + throw new IllegalStateException("This VR view manager is not attached to any VR environment."); + } + + } + + @Override + public void update(float tpf) { + // if we are showing the cursor, add our picture as it + + if( environment.getApplication().getInputManager().isCursorVisible() ) { + if( mouseImage.getParent() == null ) { + + environment.getApplication().getGuiViewPort().attachScene(mouseImage); + centerMouse(); + // the "real" mouse pointer should stay hidden + if (environment.getApplication().getContext() instanceof LwjglWindow){ + GLFW.glfwSetInputMode(((LwjglWindow)environment.getApplication().getContext()).getWindowHandle(), GLFW.GLFW_CURSOR, GLFW.GLFW_CURSOR_DISABLED); + } + } + // handle mouse movements, which may be in addition to (or exclusive from) tracked movement + MouseInput mi = environment.getApplication().getContext().getMouseInput(); + if( mi instanceof GlfwMouseInputVR ) { + if( recentCenterCount <= 0 ) { + //Vector2f winratio = VRGuiManager.getCanvasToWindowRatio(); + cursorPos.x += ((GlfwMouseInputVR)mi).getLastDeltaX();// * winratio.x; + cursorPos.y += ((GlfwMouseInputVR)mi).getLastDeltaY();// * winratio.y; + if( cursorPos.x < 0f ) cursorPos.x = 0f; + if( cursorPos.y < 0f ) cursorPos.y = 0f; + if( cursorPos.x > environment.getVRGUIManager().getCanvasSize().x ) cursorPos.x = environment.getVRGUIManager().getCanvasSize().x; + if( cursorPos.y > environment.getVRGUIManager().getCanvasSize().y ) cursorPos.y = environment.getVRGUIManager().getCanvasSize().y; + } else recentCenterCount--; + ((GlfwMouseInputVR)mi).clearDeltas(); + } + // ok, update the cursor graphic position + Vector2f currentPos = getCursorPosition(); + mouseImage.setLocalTranslation(currentPos.x, currentPos.y - ySize, environment.getVRGUIManager().getGuiDistance() + 1f); + + mouseImage.updateGeometricState(); + + } else if( mouseImage.getParent() != null ) { + Node n = mouseImage.getParent(); + mouseImage.removeFromParent(); + + if (n != null){ + n.updateGeometricState(); + } + } + } +} diff --git a/jme3-vr/src/main/java/com/jme3/util/AbstractVRViewManager.java b/jme3-vr/src/main/java/com/jme3/input/vr/AbstractVRViewManager.java similarity index 95% rename from jme3-vr/src/main/java/com/jme3/util/AbstractVRViewManager.java rename to jme3-vr/src/main/java/com/jme3/input/vr/AbstractVRViewManager.java index 6c664dd59..54251fadf 100644 --- a/jme3-vr/src/main/java/com/jme3/util/AbstractVRViewManager.java +++ b/jme3-vr/src/main/java/com/jme3/input/vr/AbstractVRViewManager.java @@ -1,4 +1,4 @@ -package com.jme3.util; +package com.jme3.input.vr; import com.jme3.app.VREnvironment; import com.jme3.post.CartoonSSAO; @@ -18,7 +18,7 @@ import com.jme3.texture.Texture2D; /** * A VR view manager. This class holds methods that enable to submit 3D views to the VR compositor. * System dependent classes should extends from this one. - * @author Julien Seinturier - (c) 2016 - JOrigin project - http:/www.jorigin.org + * @author Julien Seinturier - COMEX SA - http://www.seinturier.fr */ public abstract class AbstractVRViewManager implements VRViewManager { @@ -128,10 +128,6 @@ public abstract class AbstractVRViewManager implements VRViewManager { public VREnvironment getVREnvironment(){ return environment; } - - @Override - public void render() { - } /** * Handles moving filters from the main view to each eye diff --git a/jme3-vr/src/main/java/com/jme3/input/vr/HmdType.java b/jme3-vr/src/main/java/com/jme3/input/vr/HmdType.java index 044a032ef..5ad535d72 100644 --- a/jme3-vr/src/main/java/com/jme3/input/vr/HmdType.java +++ b/jme3-vr/src/main/java/com/jme3/input/vr/HmdType.java @@ -3,7 +3,7 @@ package com.jme3.input.vr; /** * The type of VR Head Mounted Device (HMD) * @author reden - phr00t - https://github.com/phr00t - * @author Julien Seinturier - (c) 2016 - JOrigin project - http:/www.jorigin.org + * @author Julien Seinturier - COMEX SA - http://www.seinturier.fr */ public enum HmdType { diff --git a/jme3-vr/src/main/java/com/jme3/input/vr/VRAPI.java b/jme3-vr/src/main/java/com/jme3/input/vr/VRAPI.java index 308611d57..b1d0fc46a 100644 --- a/jme3-vr/src/main/java/com/jme3/input/vr/VRAPI.java +++ b/jme3-vr/src/main/java/com/jme3/input/vr/VRAPI.java @@ -14,7 +14,7 @@ import com.jme3.renderer.Camera; /** * An interface that represents a VR system. This interface has to be implemented in order to wrap underlying VR system (OpenVR, OSVR, ...) * @author reden - phr00t - https://github.com/phr00t - * @author Julien Seinturier - (c) 2016 - JOrigin project - http:/www.jorigin.org + * @author Julien Seinturier - COMEX SA - http://www.seinturier.fr */ public interface VRAPI { @@ -86,14 +86,14 @@ public interface VRAPI { public boolean isInitialized(); /** - * Reset (recenter) the VR system. The current position of the HMD is - * now considered the origin (observer+[0,0,0]). + * Reset the VR system. After a call to this method, the current position of the HMD should be + * the origin (i-e the observer without any combined transformation). */ public void reset(); /** - * Get the size of an Head Mounted Device (HMD) rendering area in pixels. - * @param store the size of an Head Mounted Device (HMD) rendering area in pixels (modified). + * Get the size of a Head Mounted Device (HMD) rendering area in pixels. + * @param store the size of a Head Mounted Device (HMD) rendering area in pixels (modified). */ public void getRenderSize(Vector2f store); diff --git a/jme3-vr/src/main/java/com/jme3/input/vr/VRBounds.java b/jme3-vr/src/main/java/com/jme3/input/vr/VRBounds.java index 0f81b4105..288812c68 100644 --- a/jme3-vr/src/main/java/com/jme3/input/vr/VRBounds.java +++ b/jme3-vr/src/main/java/com/jme3/input/vr/VRBounds.java @@ -1,61 +1,17 @@ -package com.jme3.input.vr; - -import com.jme3.math.Vector2f; -import com.jme3.system.jopenvr.JOpenVRLibrary; -import com.jme3.system.jopenvr.VR_IVRChaperone_FnTable; -import com.sun.jna.ptr.FloatByReference; - -import java.util.logging.Logger; - -/** - * A class that represents VR world bounds. - * @author reden - phr00t - https://github.com/phr00t - * @author Julien Seinturier - (c) 2016 - JOrigin project - http:/www.jorigin.org - */ -public class VRBounds { - - private static Logger logger = Logger.getLogger(VRBounds.class.getName()); - - private VR_IVRChaperone_FnTable vrChaperone; - private Vector2f playSize; - - /** - * Initialize the VR bounds. - * @return true if the initialization is a success and false otherwise. - */ - public boolean init(OpenVR api) { - - logger.config("Initialize VR bounds..."); - - if( vrChaperone == null ) { - vrChaperone = new VR_IVRChaperone_FnTable(JOpenVRLibrary.VR_GetGenericInterface(JOpenVRLibrary.IVRChaperone_Version, api.hmdErrorStore).getPointer()); - if( vrChaperone != null ) { - vrChaperone.setAutoSynch(false); - vrChaperone.read(); - FloatByReference fbX = new FloatByReference(); - FloatByReference fbZ = new FloatByReference(); - vrChaperone.GetPlayAreaSize.apply(fbX, fbZ); - playSize = new Vector2f(fbX.getValue(), fbZ.getValue()); - - logger.config("Initialize VR bounds [SUCCESS]"); - return true; // init success - } - - logger.warning("Initialize VR bounds [FAILED]."); - return false; // failed to init - } - - logger.config("Initialize VR bounds already done."); - return true; // already initialized - } - - /** - * Get the size of the VR world. - * @return the size of the VR world. - */ - public Vector2f getPlaySize() { - return playSize; - } - -} - +package com.jme3.input.vr; + +import com.jme3.math.Vector2f; + +/** + * This interface describe the VR playground bounds. + * @author Julien Seinturier - COMEX SA - http://www.seinturier.fr + * + */ +public interface VRBounds { + + /** + * Get the size of the VR playground. + * @return the size of the VR playground. + */ + public Vector2f getPlaySize(); +} diff --git a/jme3-vr/src/main/java/com/jme3/input/vr/VRInputAPI.java b/jme3-vr/src/main/java/com/jme3/input/vr/VRInputAPI.java index 50733e04b..6cb9afb41 100644 --- a/jme3-vr/src/main/java/com/jme3/input/vr/VRInputAPI.java +++ b/jme3-vr/src/main/java/com/jme3/input/vr/VRInputAPI.java @@ -12,7 +12,7 @@ import com.jme3.math.Vector3f; /** * An interface that represents a VR input (typically a VR device such as a controller). * @author reden - phr00t - https://github.com/phr00t - * @author Julien Seinturier - (c) 2016 - JOrigin project - http:/www.jorigin.org + * @author Julien Seinturier - COMEX SA - http://www.seinturier.fr */ public interface VRInputAPI { @@ -89,16 +89,16 @@ public interface VRInputAPI { public boolean init(); /** - * Get the number of tracked controller (for example an hand controllers) attached to the VR system. - * @return the number of controller attached to the VR system. + * Get the number of tracked controllers (for example, hand controllers) attached to the VR system. + * @return the number of controllers attached to the VR system. * @see #getTrackedController(int) */ public int getTrackedControllerCount(); /** - * Get the tracked controller (for example an hand controllers) that is attached to the VR system. + * Get a tracked controller (for example, a hand controller) that is attached to the VR system. * @param index the index of the controller. - * @return the tracked controller (for example an hand controllers) that is attached to the VR system. + * @return the tracked controller (for example, a hand controller) that is attached to the VR system. * @see #getTrackedControllerCount() */ public VRTrackedController getTrackedController(int index); @@ -189,7 +189,7 @@ public interface VRInputAPI { public Vector3f getFinalObserverPosition(int index); /** - * Trigger an haptic pulse on the selected controller for the duration given in parameters (in seconds). + * Trigger a haptic pulse on the selected controller for the duration given in parameters (in seconds). * @param controllerIndex the index of the controller. * @param seconds the duration of the pulse in seconds. */ diff --git a/jme3-vr/src/main/java/com/jme3/input/vr/VRInputType.java b/jme3-vr/src/main/java/com/jme3/input/vr/VRInputType.java index 2d529cf77..c82e2b518 100644 --- a/jme3-vr/src/main/java/com/jme3/input/vr/VRInputType.java +++ b/jme3-vr/src/main/java/com/jme3/input/vr/VRInputType.java @@ -1,11 +1,9 @@ package com.jme3.input.vr; -import static org.lwjgl.ovr.OVR.*; // For the button constants - /** * The type of a VR input. This enumeration enables to determine which part of the VR device is involved within input callback. * @author reden - phr00t - https://github.com/phr00t - * @author Julien Seinturier - (c) 2016 - JOrigin project - http:/www.jorigin.org + * @author Julien Seinturier - COMEX SA - http://www.seinturier.fr * */ public enum VRInputType { @@ -59,18 +57,18 @@ public enum VRInputType { /** * The upper buttons on the Oculus Touch controllers - B on the right controller, and Y on the left. */ - OculusTopButton(ovrButton_B | ovrButton_Y), + OculusTopButton(org.lwjgl.ovr.OVR.ovrButton_B | org.lwjgl.ovr.OVR.ovrButton_Y), /** * The lower (not counting menu) buttons on the Oculus Touch * controllers - A on the right controller, and X on the left. */ - OculusBottomButton(ovrButton_A | ovrButton_X), + OculusBottomButton(org.lwjgl.ovr.OVR.ovrButton_A | org.lwjgl.ovr.OVR.ovrButton_X), /** * The 'click' button on the Oculus Touch thumbsticks. */ - OculusThumbstickButton(ovrButton_LThumb | ovrButton_RThumb), + OculusThumbstickButton(org.lwjgl.ovr.OVR.ovrButton_LThumb | org.lwjgl.ovr.OVR.ovrButton_RThumb), /** * The game-usable menu button, under and to the left of the 'X' button on the left controller. @@ -78,22 +76,22 @@ public enum VRInputType { * Most games use this to pause - it preferably should be used for at least that purpose, and is * uncomfortable to rest your thumb on (in games where you suddenly have to pause/open a menu). */ - OculusMenuButton(ovrButton_Enter), + OculusMenuButton(org.lwjgl.ovr.OVR.ovrButton_Enter), /** * The capacitive touch sensors on the top buttons (Y and B) of the Oculus Touch. */ - OculusTopTouch(ovrTouch_B | ovrTouch_Y), + OculusTopTouch(org.lwjgl.ovr.OVR.ovrTouch_B | org.lwjgl.ovr.OVR.ovrTouch_Y), /** * The capacitive touch sensors on the lower buttons (X and A) of the Oculus Touch. */ - OculusBottomTouch(ovrTouch_A | ovrTouch_X), + OculusBottomTouch(org.lwjgl.ovr.OVR.ovrTouch_A | org.lwjgl.ovr.OVR.ovrTouch_X), /** * The capacitive touch sensors on the thumbsticks of the Oculus Touch. */ - OculusThumbstickTouch(ovrTouch_LThumb | ovrTouch_RThumb), + OculusThumbstickTouch(org.lwjgl.ovr.OVR.ovrTouch_LThumb | org.lwjgl.ovr.OVR.ovrTouch_RThumb), /** * The capacitive touch sensors on the thumbrests of the Oculus Touch - this is a textured pad @@ -102,7 +100,7 @@ public enum VRInputType { * While it probably goes without saying, only use this for gesture support and do not bind game * elements to it. */ - OculusThumbrestTouch(ovrTouch_LThumbRest | ovrTouch_RThumbRest), + OculusThumbrestTouch(org.lwjgl.ovr.OVR.ovrTouch_LThumbRest | org.lwjgl.ovr.OVR.ovrTouch_RThumbRest), /** * The state of a software calculation based on the capacitive touch sensor values that determine if @@ -111,12 +109,12 @@ public enum VRInputType { * This should be used instead of calculating this yourself based on the touch results of all the other * parts of the controller. */ - OculusThumbUp(ovrTouch_LThumbUp | ovrTouch_RThumbUp), + OculusThumbUp(org.lwjgl.ovr.OVR.ovrTouch_LThumbUp | org.lwjgl.ovr.OVR.ovrTouch_RThumbUp), /** * Is the user resting their finger on the trigger of an Oculus Touch controller? */ - OculusIndexTouch(ovrTouch_LIndexPointing | ovrTouch_RIndexPointing), + OculusIndexTouch(org.lwjgl.ovr.OVR.ovrTouch_LIndexPointing | org.lwjgl.ovr.OVR.ovrTouch_RIndexPointing), /** * Is the user pointing their finger forwards, as if to press a button? @@ -124,7 +122,7 @@ public enum VRInputType { * This is internally calculated from proximity and filtering is applied - it should be used rather * than !OculusIndexTouch, as it will probably lead to better results. */ - OculusIndexPointing(ovrTouch_LIndexPointing | ovrTouch_RIndexPointing); + OculusIndexPointing(org.lwjgl.ovr.OVR.ovrTouch_LIndexPointing | org.lwjgl.ovr.OVR.ovrTouch_RIndexPointing); /** * The value that codes the input type. diff --git a/jme3-vr/src/main/java/com/jme3/input/vr/VRMouseManager.java b/jme3-vr/src/main/java/com/jme3/input/vr/VRMouseManager.java new file mode 100644 index 000000000..5257cd05c --- /dev/null +++ b/jme3-vr/src/main/java/com/jme3/input/vr/VRMouseManager.java @@ -0,0 +1,107 @@ +package com.jme3.input.vr; + +import com.jme3.app.VREnvironment; +import com.jme3.input.controls.AnalogListener; +import com.jme3.math.Vector2f; + +/** + * A class dedicated to the handling of the mouse within VR environment. + * @author Julien Seinturier - COMEX SA - http://www.seinturier.fr + */ +public interface VRMouseManager { + + + /** + * Initialize the VR mouse manager. + */ + public void initialize(); + + /** + * Get the {@link VREnvironment VR Environment} to which this manager is attached. + * @return the {@link VREnvironment VR Environment} to which this manager is attached. + */ + public VREnvironment getVREnvironment(); + + /** + * Set if the VR device controller is used within thumb stick mode. + * @param set true if the VR device controller is used within thumb stick mode and false otherwise. + */ + public void setThumbstickMode(boolean set); + + /** + * Get if the VR device controller is used within thumb stick mode. + * @return true if the VR device controller is used within thumb stick mode and false otherwise. + */ + public boolean isThumbstickMode(); + + /** + * Set the speed of the mouse. + * @param sensitivity the sensitivity of the mouse. + * @param acceleration the acceleration of the mouse. + * @see #getSpeedAcceleration() + * @see #getSpeedSensitivity() + */ + public void setSpeed(float sensitivity, float acceleration); + + /** + * Get the sensitivity of the mouse. + * @return the sensitivity of the mouse. + * @see #setSpeed(float, float) + */ + public float getSpeedSensitivity(); + + /** + * Get the acceleration of the mouse. + * @return the acceleration of the mouse. + * @see #setSpeed(float, float) + */ + public float getSpeedAcceleration(); + + /** + * Get the move scale. + * return the move scale. + * @see #setMouseMoveScale(float) + */ + public float getMouseMoveScale(); + + /** + * Set the mouse move scale. + * @param set the mouse move scale. + * @see #getMouseMoveScale() + */ + public void setMouseMoveScale(float set); + + /** + * Set the image to use as mouse cursor. The given string describe an asset that the underlying application asset manager has to load. + * @param texture the image to use as mouse cursor. + */ + public void setImage(String texture); + + /** + * Update analog controller as it was a mouse controller. + * @param inputIndex the index of the controller attached to the VR system. + * @param mouseListener the JMonkey mouse listener to trigger. + * @param mouseXName the mouseX identifier. + * @param mouseYName the mouseY identifier + * @param tpf the time per frame. + */ + public void updateAnalogAsMouse(int inputIndex, AnalogListener mouseListener, String mouseXName, String mouseYName, float tpf); + + /** + * Get the actual cursor position. + * @return the actual cursor position. + */ + public Vector2f getCursorPosition(); + + /** + * Center the mouse on the display. + */ + public void centerMouse(); + + /** + * Update the mouse manager. This method should not be called manually. + * The standard behavior for this method is to be called from the {@link VRViewManager#update(float) update method} of the attached {@link VRViewManager VR view manager}. + * @param tpf the time per frame. + */ + public void update(float tpf); +} diff --git a/jme3-vr/src/main/java/com/jme3/input/vr/VRTrackedController.java b/jme3-vr/src/main/java/com/jme3/input/vr/VRTrackedController.java index 3ce20e5c0..f47e36aa8 100644 --- a/jme3-vr/src/main/java/com/jme3/input/vr/VRTrackedController.java +++ b/jme3-vr/src/main/java/com/jme3/input/vr/VRTrackedController.java @@ -6,8 +6,7 @@ import com.jme3.math.Vector3f; /** * TODO - * @author Julien Seinturier - (c) 2016 - JOrigin project - http:/www.jorigin.org - * + * @author Julien Seinturier - COMEX SA - http://www.seinturier.fr */ public interface VRTrackedController { diff --git a/jme3-vr/src/main/java/com/jme3/util/VRViewManager.java b/jme3-vr/src/main/java/com/jme3/input/vr/VRViewManager.java similarity index 89% rename from jme3-vr/src/main/java/com/jme3/util/VRViewManager.java rename to jme3-vr/src/main/java/com/jme3/input/vr/VRViewManager.java index 1a5eaeb75..96b3eda95 100644 --- a/jme3-vr/src/main/java/com/jme3/util/VRViewManager.java +++ b/jme3-vr/src/main/java/com/jme3/input/vr/VRViewManager.java @@ -1,4 +1,4 @@ -package com.jme3.util; +package com.jme3.input.vr; import com.jme3.app.VRAppState; import com.jme3.app.VREnvironment; @@ -11,7 +11,7 @@ import com.jme3.texture.Texture2D; /** * A VR view manager. This interface describes methods that enable to submit 3D views to the VR compositor. * @author reden - phr00t - https://github.com/phr00t - * @author Julien Seinturier - (c) 2016 - JOrigin project - http:/www.jorigin.org + * @author Julien Seinturier - COMEX SA - http://www.seinturier.fr */ public interface VRViewManager { @@ -151,15 +151,17 @@ public interface VRViewManager { public void update(float tpf); /** - * Set up the scene for rendering. - * This method should be called before any rendering takes place. + * This method contains action to be done during the rendering phase. + * This method should be called for example from the {@link com.jme3.app.state.AppState#render(com.jme3.renderer.RenderManager) render} method of an {@link com.jme3.app.state.AppState app state}. + * @see #postRender() */ public void render(); - + /** * Send the rendering result as textures to the two eyes. * This method should be called after all the rendering operations * (for example at the end of the {@link AppState#postRender() postRender()} method of the attached app state.) + * @see #preRender() */ public void postRender(); diff --git a/jme3-vr/src/main/java/com/jme3/input/vr/lwjgl_openvr/LWJGLOpenVR.java b/jme3-vr/src/main/java/com/jme3/input/vr/lwjgl_openvr/LWJGLOpenVR.java new file mode 100644 index 000000000..3e7c22cd3 --- /dev/null +++ b/jme3-vr/src/main/java/com/jme3/input/vr/lwjgl_openvr/LWJGLOpenVR.java @@ -0,0 +1,459 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.jme3.input.vr.lwjgl_openvr; + +import com.jme3.app.VREnvironment; +import com.jme3.input.vr.HmdType; +import com.jme3.input.vr.VRAPI; +import com.jme3.math.Matrix4f; +import com.jme3.math.Quaternion; +import com.jme3.math.Vector2f; +import com.jme3.math.Vector3f; +import com.jme3.renderer.Camera; +import com.jme3.util.VRUtil; + +import java.nio.IntBuffer; +import java.util.Locale; +import java.util.logging.Level; +import java.util.logging.Logger; +import org.lwjgl.BufferUtils; +import org.lwjgl.openvr.HmdMatrix34; +import org.lwjgl.openvr.HmdMatrix44; +import org.lwjgl.openvr.TrackedDevicePose; +import org.lwjgl.openvr.VR; +import org.lwjgl.openvr.VRCompositor; +import org.lwjgl.openvr.VRSystem; + +/** + * A class that wraps an OpenVR system. + * @author reden - phr00t + * @author Julien Seinturier - COMEX SA - http://www.seinturier.fr + * @author Rickard Edén + */ +public class LWJGLOpenVR implements VRAPI { + + private static final Logger logger = Logger.getLogger(LWJGLOpenVR.class.getName()); + + private static boolean initSuccess = false; + private static boolean flipEyes = false; + + private IntBuffer hmdDisplayFrequency; + private TrackedDevicePose.Buffer trackedDevicePose; + protected TrackedDevicePose[] hmdTrackedDevicePoses; + + protected IntBuffer hmdErrorStore = BufferUtils.createIntBuffer(1); + + private final Quaternion rotStore = new Quaternion(); + private final Vector3f posStore = new Vector3f(); + + // for debugging latency + private int frames = 0; + + protected Matrix4f[] poseMatrices; + + private final Matrix4f hmdPose = Matrix4f.IDENTITY.clone(); + private Matrix4f hmdProjectionLeftEye; + private Matrix4f hmdProjectionRightEye; + private Matrix4f hmdPoseLeftEye; + private Matrix4f hmdPoseRightEye; + + private Vector3f hmdPoseLeftEyeVec, hmdPoseRightEyeVec, hmdSeatToStand; + + private float vsyncToPhotons; + private double timePerFrame, frameCountRun; + private long frameCount; + private LWJGLOpenVRInput VRinput; + + + private VREnvironment environment = null; + + + /** + * Convert specific OpenVR {@link org.lwjgl.openvr.HmdMatrix34 HmdMatrix34} into JME {@link Matrix4f Matrix4f} + * @param hmdMatrix the input matrix + * @param mat the converted matrix + * @return the converted matrix + */ + public static Matrix4f convertSteamVRMatrix3ToMatrix4f(org.lwjgl.openvr.HmdMatrix34 hmdMatrix, Matrix4f mat){ + mat.set(hmdMatrix.m(0), hmdMatrix.m(1), hmdMatrix.m(2), hmdMatrix.m(3), + hmdMatrix.m(4), hmdMatrix.m(5), hmdMatrix.m(6), hmdMatrix.m(7), + hmdMatrix.m(8), hmdMatrix.m(9), hmdMatrix.m(10), hmdMatrix.m(11), + 0f, 0f, 0f, 1f); + return mat; + } + + /** + * Convert specific OpenVR {@link org.lwjgl.openvr.HmdMatrix34 HmdMatrix34_t} into JME {@link Matrix4f Matrix4f} + * @param hmdMatrix the input matrix + * @param mat the converted matrix + * @return the converted matrix + */ + public static Matrix4f convertSteamVRMatrix4ToMatrix4f(org.lwjgl.openvr.HmdMatrix44 hmdMatrix, Matrix4f mat){ + mat.set(hmdMatrix.m(0), hmdMatrix.m(1), hmdMatrix.m(2), hmdMatrix.m(3), + hmdMatrix.m(4), hmdMatrix.m(5), hmdMatrix.m(6), hmdMatrix.m(7), + hmdMatrix.m(8), hmdMatrix.m(9), hmdMatrix.m(10), hmdMatrix.m(11), + hmdMatrix.m(12), hmdMatrix.m(13), hmdMatrix.m(14), hmdMatrix.m(15)); + return mat; + } + + /** + * Create a new OpenVR system + * attached to the given {@link VREnvironment VR environment}. + * @param environment the VR environment to which this API is attached. + */ + public LWJGLOpenVR(VREnvironment environment){ + this.environment = environment; + } + + @Override + public LWJGLOpenVRInput getVRinput() { + return VRinput; + } + + @Override + public Object getVRSystem() { + throw new UnsupportedOperationException("Not yet implemented!"); + } + + @Override + public Object getCompositor() { + throw new UnsupportedOperationException("Not yet implemented!"); + } + + @Override + public String getName() { + return "OpenVR/LWJGL"; + } + + private static long latencyWaitTime = 0; + + @Override + public void setFlipEyes(boolean set) { + flipEyes = set; + } + + private boolean enableDebugLatency = false; + + @Override + public void printLatencyInfoToConsole(boolean set) { + enableDebugLatency = set; + } + + @Override + public int getDisplayFrequency() { + if( hmdDisplayFrequency == null ) return 0; + return hmdDisplayFrequency.get(0); + } + + @Override + public boolean initialize() { + + logger.config("Initializing OpenVR system..."); + + // Init the native linking to the OpenVR library. + + int result = VR.VR_InitInternal(hmdErrorStore, VR.EVRApplicationType_VRApplication_Scene); + + if(hmdErrorStore.get(0) != VR.EVRInitError_VRInitError_None) { + logger.severe("OpenVR Initialize Result: " + VR.VR_GetVRInitErrorAsEnglishDescription(hmdErrorStore.get(0))); + logger.severe("Initializing OpenVR system [FAILED]"); + return false; + } else { + logger.config("OpenVR initialized & VR connected."); + org.lwjgl.openvr.OpenVR.create(result); + logger.info("Model Number : " + VRSystem.VRSystem_GetStringTrackedDeviceProperty( + VR.k_unTrackedDeviceIndex_Hmd, VR.ETrackedDeviceProperty_Prop_ModelNumber_String, hmdErrorStore)); + logger.info("Serial Number: " + VRSystem.VRSystem_GetStringTrackedDeviceProperty( + VR.k_unTrackedDeviceIndex_Hmd, VR.ETrackedDeviceProperty_Prop_SerialNumber_String, hmdErrorStore)); + + hmdDisplayFrequency = BufferUtils.createIntBuffer(1); + hmdDisplayFrequency.put( (int) VR.ETrackedDeviceProperty_Prop_DisplayFrequency_Float); + + trackedDevicePose = TrackedDevicePose.create(VR.k_unMaxTrackedDeviceCount); + hmdTrackedDevicePoses = new TrackedDevicePose[VR.k_unMaxTrackedDeviceCount]; + poseMatrices = new Matrix4f[VR.k_unMaxTrackedDeviceCount]; + for(int i=0;i 0){ + if(hmdErrorStore.get(0) == VR.EVRInitError_VRInitError_None){ + setTrackingSpace(environment.isSeatedExperience() ); + logger.config("OpenVR Compositor initialized"); + } else { + logger.severe("OpenVR Compositor error: " + hmdErrorStore.get(0)); + } + } else { + logger.log(Level.SEVERE, "Cannot get generic interface for \""+VR.IVRCompositor_Version+"\", "+VR.VR_GetVRInitErrorAsEnglishDescription(hmdErrorStore.get(0))+" ("+hmdErrorStore.get(0)+")"); + } + } + return true; + } + + /** + * Initialize the headset camera. + * @param allowed true is the use of the headset camera is allowed and false otherwise. + * @return token for camera + */ + public long initCamera(boolean allowed) { + hmdErrorStore.put(0, VR.EVRInitError_VRInitError_None); // clear the error store + if( allowed) { + + long result = VR.VR_GetGenericInterface(VR.IVRTrackedCamera_Version, hmdErrorStore); + if (result > 0){ + if(hmdErrorStore.get(0) == VR.EVRInitError_VRInitError_None ){ + logger.config("OpenVR Camera initialized"); + } + return result; + } else { + logger.severe("Failed to initialize camera"); + } + } + return 0; + } + + @Override + public void destroy() { + VR.VR_ShutdownInternal(); + } + + @Override + public boolean isInitialized() { + return initSuccess; + } + + @Override + public void reset() { + VRSystem.VRSystem_ResetSeatedZeroPose(); + hmdSeatToStand = null; + } + + @Override + public void getRenderSize(Vector2f store) { + IntBuffer w = BufferUtils.createIntBuffer(1); + IntBuffer h = BufferUtils.createIntBuffer(1); + VRSystem.VRSystem_GetRecommendedRenderTargetSize(w, h); + logger.config("Recommended render width : " + w.get(0)); + logger.config("Recommended render height: " + h.get(0)); + store.x = w.get(0); + store.y = h.get(0); + } + + @Override + public float getInterpupillaryDistance() { + throw new UnsupportedOperationException("Not yet implemented!"); + } + + @Override + public Quaternion getOrientation() { + VRUtil.convertMatrix4toQuat(hmdPose, rotStore); + return rotStore; + } + + @Override + public Vector3f getPosition() { + // the hmdPose comes in rotated funny, fix that here + hmdPose.toTranslationVector(posStore); + posStore.x = -posStore.x; + posStore.z = -posStore.z; + return posStore; + } + + @Override + public void getPositionAndOrientation(Vector3f storePos, Quaternion storeRot) { + hmdPose.toTranslationVector(storePos); + storePos.x = -storePos.x; + storePos.z = -storePos.z; + storeRot.set(getOrientation()); + } + + @Override + public void updatePose(){ + int result = VRCompositor.nVRCompositor_WaitGetPoses(trackedDevicePose.address(), trackedDevicePose.remaining(), 0, 0); + // NPE when calling without a gamePoseArray. Issue filed with lwjgl #418 +// int result = VRCompositor.VRCompositor_WaitGetPoses(trackedDevicePose, null); + environment.getVRinput().updateControllerStates(); + + // read pose data from native + for (int nDevice = 0; nDevice < VR.k_unMaxTrackedDeviceCount; ++nDevice ){ + if( hmdTrackedDevicePoses[nDevice].bPoseIsValid() ){ + convertSteamVRMatrix3ToMatrix4f(hmdTrackedDevicePoses[nDevice].mDeviceToAbsoluteTracking(), poseMatrices[nDevice]); + } + } + + if ( hmdTrackedDevicePoses[VR.k_unTrackedDeviceIndex_Hmd].bPoseIsValid()){ + hmdPose.set(poseMatrices[VR.k_unTrackedDeviceIndex_Hmd]); + } else { + hmdPose.set(Matrix4f.IDENTITY); + } + } + + @Override + public Matrix4f getHMDMatrixProjectionLeftEye(Camera cam){ + if( hmdProjectionLeftEye != null ) { + return hmdProjectionLeftEye; + } else { + HmdMatrix44 mat = HmdMatrix44.create(); + mat = VRSystem.VRSystem_GetProjectionMatrix(VR.EVREye_Eye_Left, cam.getFrustumNear(), cam.getFrustumFar(), mat); + hmdProjectionLeftEye = new Matrix4f(); + convertSteamVRMatrix4ToMatrix4f(mat, hmdProjectionLeftEye); + return hmdProjectionLeftEye; + } + } + + @Override + public Matrix4f getHMDMatrixProjectionRightEye(Camera cam){ + if( hmdProjectionRightEye != null ) { + return hmdProjectionRightEye; + } else { + HmdMatrix44 mat = HmdMatrix44.create(); + mat = VRSystem.VRSystem_GetProjectionMatrix(VR.EVREye_Eye_Right, cam.getFrustumNear(), cam.getFrustumFar(), mat); + hmdProjectionRightEye = new Matrix4f(); + convertSteamVRMatrix4ToMatrix4f(mat, hmdProjectionRightEye); + return hmdProjectionRightEye; + } + } + + @Override + public Vector3f getHMDVectorPoseLeftEye() { + if( hmdPoseLeftEyeVec == null ) { + hmdPoseLeftEyeVec = getHMDMatrixPoseLeftEye().toTranslationVector(); + // set default IPD if none or broken + if( hmdPoseLeftEyeVec.x <= 0.080f * -0.5f || hmdPoseLeftEyeVec.x >= 0.040f * -0.5f ) { + hmdPoseLeftEyeVec.x = 0.065f * -0.5f; + } + if( flipEyes == false ) hmdPoseLeftEyeVec.x *= -1f; // it seems these need flipping + } + return hmdPoseLeftEyeVec; + } + + @Override + public Vector3f getHMDVectorPoseRightEye() { + if( hmdPoseRightEyeVec == null ) { + hmdPoseRightEyeVec = getHMDMatrixPoseRightEye().toTranslationVector(); + // set default IPD if none or broken + if( hmdPoseRightEyeVec.x >= 0.080f * 0.5f || hmdPoseRightEyeVec.x <= 0.040f * 0.5f ) { + hmdPoseRightEyeVec.x = 0.065f * 0.5f; + } + if( flipEyes == false ) hmdPoseRightEyeVec.x *= -1f; // it seems these need flipping + } + return hmdPoseRightEyeVec; + } + + @Override + public Vector3f getSeatedToAbsolutePosition() { + if( environment.isSeatedExperience() == false ) return Vector3f.ZERO; + if( hmdSeatToStand == null ) { + hmdSeatToStand = new Vector3f(); + + HmdMatrix34 mat = HmdMatrix34.create(); + VRSystem.VRSystem_GetSeatedZeroPoseToStandingAbsoluteTrackingPose(mat); + Matrix4f tempmat = new Matrix4f(); + convertSteamVRMatrix3ToMatrix4f(mat, tempmat); + tempmat.toTranslationVector(hmdSeatToStand); + } + return hmdSeatToStand; + } + + @Override + public Matrix4f getHMDMatrixPoseLeftEye(){ + if( hmdPoseLeftEye != null ) { + return hmdPoseLeftEye; + } else { + HmdMatrix34 mat = HmdMatrix34.create(); + VRSystem.VRSystem_GetEyeToHeadTransform(VR.EVREye_Eye_Left, mat); + hmdPoseLeftEye = new Matrix4f(); + return convertSteamVRMatrix3ToMatrix4f(mat, hmdPoseLeftEye); + } + } + + + @Override + public Matrix4f getHMDMatrixPoseRightEye(){ + if( hmdPoseRightEye != null ) { + return hmdPoseRightEye; + } else { + HmdMatrix34 mat = HmdMatrix34.create(); + VRSystem.VRSystem_GetEyeToHeadTransform(VR.EVREye_Eye_Right, mat); + hmdPoseRightEye = new Matrix4f(); + return convertSteamVRMatrix3ToMatrix4f(mat, hmdPoseRightEye); + } + } + + @Override + public HmdType getType() { + String completeName = ""; + String name = VRSystem.VRSystem_GetStringTrackedDeviceProperty(VR.k_unTrackedDeviceIndex_Hmd, + VR.ETrackedDeviceProperty_Prop_ManufacturerName_String, + 128, hmdErrorStore); + if( hmdErrorStore.get(0) == 0 ) completeName += name; + String number = VRSystem.VRSystem_GetStringTrackedDeviceProperty(VR.k_unTrackedDeviceIndex_Hmd, + VR.ETrackedDeviceProperty_Prop_ModelNumber_String, + 128, hmdErrorStore); + if( hmdErrorStore.get(0) == 0 ) completeName += " " + number; + if( completeName.length() > 0 ) { + completeName = completeName.toLowerCase(Locale.ENGLISH).trim(); + if( completeName.contains("htc") || completeName.contains("vive") ) { + return HmdType.HTC_VIVE; + } else if( completeName.contains("osvr") ) { + return HmdType.OSVR; + } else if( completeName.contains("oculus") || completeName.contains("rift") || + completeName.contains("dk1") || completeName.contains("dk2") || completeName.contains("cv1") ) { + return HmdType.OCULUS_RIFT; + } else if( completeName.contains("fove") ) { + return HmdType.FOVE; + } else if( completeName.contains("game") && completeName.contains("face") ) { + return HmdType.GAMEFACE; + } else if( completeName.contains("morpheus") ) { + return HmdType.MORPHEUS; + } else if( completeName.contains("gear") ) { + return HmdType.GEARVR; + } else if( completeName.contains("star") ) { + return HmdType.STARVR; + } else if( completeName.contains("null") ) { + return HmdType.NULL; + } + } + return HmdType.OTHER; + } + + public void setTrackingSpace(boolean isSeated){ + if( isSeated) { + VRCompositor.VRCompositor_SetTrackingSpace(VR.ETrackingUniverseOrigin_TrackingUniverseSeated); + } else { + VRCompositor.VRCompositor_SetTrackingSpace(VR.ETrackingUniverseOrigin_TrackingUniverseStanding); + } + } + + + public Matrix4f[] getPoseMatrices() { + return poseMatrices; + } + +} \ No newline at end of file diff --git a/jme3-vr/src/main/java/com/jme3/input/vr/lwjgl_openvr/LWJGLOpenVRBounds.java b/jme3-vr/src/main/java/com/jme3/input/vr/lwjgl_openvr/LWJGLOpenVRBounds.java new file mode 100644 index 000000000..2d10f8888 --- /dev/null +++ b/jme3-vr/src/main/java/com/jme3/input/vr/lwjgl_openvr/LWJGLOpenVRBounds.java @@ -0,0 +1,53 @@ +package com.jme3.input.vr.lwjgl_openvr; + +import com.jme3.input.vr.VRAPI; +import com.jme3.input.vr.VRBounds; +import com.jme3.math.Vector2f; +import com.jme3.util.BufferUtils; +import java.nio.FloatBuffer; + +import java.util.logging.Logger; + +/** + * A class that represents VR world bounds. + * @author reden - phr00t - https://github.com/phr00t + * @author Julien Seinturier - COMEX SA - http://www.seinturier.fr + * @author Rickard Edén + */ +public class LWJGLOpenVRBounds implements VRBounds { + + private static Logger logger = Logger.getLogger(LWJGLOpenVRBounds.class.getName()); + + private Vector2f playSize; + private boolean setup = false; + + /** + * Initialize the VR bounds. + * @return true if the initialization is a success and false otherwise. + */ + public boolean init(VRAPI api) { + + logger.config("Initialize VR bounds..."); + + if( !setup ) { +// vrChaperone = new VR_IVRChaperone_FnTable(JOpenVRLibrary.VR_GetGenericInterface(JOpenVRLibrary.IVRChaperone_Version, api.hmdErrorStore).getPointer()); + FloatBuffer fbX = BufferUtils.createFloatBuffer(1); + FloatBuffer fbZ = BufferUtils.createFloatBuffer(1); + org.lwjgl.openvr.VRChaperone.VRChaperone_GetPlayAreaSize(fbX, fbZ); + + playSize = new Vector2f(fbX.get(0), fbZ.get(0)); + setup = true; + logger.config("Initialize VR bounds [SUCCESS]"); + return true; // init success + } + + logger.config("Initialize VR bounds already done."); + return true; // already initialized + } + + @Override + public Vector2f getPlaySize() { + return playSize; + } + +} \ No newline at end of file diff --git a/jme3-vr/src/main/java/com/jme3/input/vr/lwjgl_openvr/LWJGLOpenVRInput.java b/jme3-vr/src/main/java/com/jme3/input/vr/lwjgl_openvr/LWJGLOpenVRInput.java new file mode 100644 index 000000000..d0f49594d --- /dev/null +++ b/jme3-vr/src/main/java/com/jme3/input/vr/lwjgl_openvr/LWJGLOpenVRInput.java @@ -0,0 +1,498 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.jme3.input.vr.lwjgl_openvr; + +import java.util.ArrayList; +import java.util.List; +import java.util.logging.Logger; + +import com.jme3.app.VREnvironment; +import com.jme3.input.vr.VRInputAPI; +import com.jme3.input.vr.VRInputType; +import com.jme3.input.vr.VRTrackedController; +import com.jme3.input.vr.VRViewManager; +import com.jme3.math.Quaternion; +import com.jme3.math.Vector2f; +import com.jme3.math.Vector3f; +import com.jme3.renderer.Camera; +import com.jme3.scene.Spatial; +import com.jme3.util.VRUtil; +import java.nio.IntBuffer; +import org.lwjgl.BufferUtils; +import org.lwjgl.openvr.HmdVector3; +import org.lwjgl.openvr.VR; +import org.lwjgl.openvr.VRControllerState; +import org.lwjgl.openvr.VRSystem; + +/* +make helper functions to pull the following easily from raw data (DONE) +trigger: +Controller#1, Axis#0 X: 0.0, Y: 0.0 +Controller#1, Axis#1 X: 1.0, Y: 0.0 +Controller#1, Axis#2 X: 0.0, Y: 0.0 +Controller#1, Axis#3 X: 0.0, Y: 0.0 +Controller#1, Axis#4 X: 0.0, Y: 0.0 +Button press: 8589934592 (when full), touch: 8589934592 +touchpad (upper left): +Controller#1, Axis#0 X: -0.6059755, Y: 0.2301706 +Controller#1, Axis#1 X: 0.0, Y: 0.0 +Controller#1, Axis#2 X: 0.0, Y: 0.0 +Controller#1, Axis#3 X: 0.0, Y: 0.0 +Controller#1, Axis#4 X: 0.0, Y: 0.0 +Button press: 4294967296 (when pressed in), touch: 4294967296 +grip: +Controller#1, Axis#0 X: 0.0, Y: 0.0 +Controller#1, Axis#1 X: 0.0, Y: 0.0 +Controller#1, Axis#2 X: 0.0, Y: 0.0 +Controller#1, Axis#3 X: 0.0, Y: 0.0 +Controller#1, Axis#4 X: 0.0, Y: 0.0 +Button press: 4, touch: 4 +thumb: +Controller#1, Axis#0 X: 0.0, Y: 0.0 +Controller#1, Axis#1 X: 0.0, Y: 0.0 +Controller#1, Axis#2 X: 0.0, Y: 0.0 +Controller#1, Axis#3 X: 0.0, Y: 0.0 +Controller#1, Axis#4 X: 0.0, Y: 0.0 +Button press: 2, touch: 2 + */ +/** + * A class that wraps an + * OpenVR + * input.
    + * null values will be returned if no valid pose exists, or that + * input device isn't available user code should check for null + * values. + * + * @author reden - phr00t + * @author Julien Seinturier - COMEX SA - http://www.seinturier.fr + * @author Rickard Edén + */ +public class LWJGLOpenVRInput implements VRInputAPI { + + private static final Logger logger = Logger.getLogger(LWJGLOpenVRInput.class.getName()); + + private final VRControllerState[] cStates = new VRControllerState[VR.k_unMaxTrackedDeviceCount]; + + private final Quaternion[] rotStore = new Quaternion[VR.k_unMaxTrackedDeviceCount]; + + private final Vector3f[] posStore = new Vector3f[VR.k_unMaxTrackedDeviceCount]; + + private static final int[] controllerIndex = new int[VR.k_unMaxTrackedDeviceCount]; + + private int controllerCount = 0; + + private final Vector2f tempAxis = new Vector2f(), temp2Axis = new Vector2f(); + + private final Vector2f lastCallAxis[] = new Vector2f[VR.k_unMaxTrackedDeviceCount]; + + private final boolean buttonDown[][] = new boolean[VR.k_unMaxTrackedDeviceCount][16]; + + private float axisMultiplier = 1f; + + private final Vector3f tempVel = new Vector3f(); + + private final Quaternion tempq = new Quaternion(); + + private final VREnvironment environment; + + private List trackedControllers = null; + + /** + * Create a new + * OpenVR + * input attached to the given VR environment. + * + * @param environment the VR environment to which the input is attached. + */ + public LWJGLOpenVRInput(VREnvironment environment) { + this.environment = environment; + } + + @Override + public float getAxisMultiplier() { + return axisMultiplier; + } + + @Override + public void setAxisMultiplier(float set) { + axisMultiplier = set; + } + + @Override + public void swapHands() { + if (controllerCount != 2) { + return; + } + int temp = controllerIndex[0]; + controllerIndex[0] = controllerIndex[1]; + controllerIndex[1] = temp; + } + + @Override + public boolean isButtonDown(int controllerIndex, VRInputType checkButton) { + VRControllerState cs = cStates[LWJGLOpenVRInput.controllerIndex[controllerIndex]]; + switch (checkButton) { + default: + return false; + case ViveGripButton: + return (cs.ulButtonPressed() & 4) != 0; + case ViveMenuButton: + return (cs.ulButtonPressed() & 2) != 0; + case ViveTrackpadAxis: + return (cs.ulButtonPressed() & 4294967296l) != 0; + case ViveTriggerAxis: + return (cs.ulButtonPressed() & 8589934592l) != 0; + } + } + + @Override + public boolean wasButtonPressedSinceLastCall(int controllerIndex, VRInputType checkButton) { + boolean buttonDownNow = isButtonDown(controllerIndex, checkButton); + int checkButtonValue = checkButton.getValue(); + int cIndex = LWJGLOpenVRInput.controllerIndex[controllerIndex]; + boolean retval = buttonDownNow == true && buttonDown[cIndex][checkButtonValue] == false; + buttonDown[cIndex][checkButtonValue] = buttonDownNow; + return retval; + } + + @Override + public void resetInputSinceLastCall() { + for (int i = 0; i < lastCallAxis.length; i++) { + lastCallAxis[i].x = 0f; + lastCallAxis[i].y = 0f; + } + for (int i = 0; i < VR.k_unMaxTrackedDeviceCount; i++) { + for (int j = 0; j < 16; j++) { + buttonDown[i][j] = false; + } + } + } + + @Override + public Vector2f getAxisDeltaSinceLastCall(int controllerIndex, VRInputType forAxis) { + int axisIndex = forAxis.getValue(); + temp2Axis.set(lastCallAxis[axisIndex]); + lastCallAxis[axisIndex].set(getAxis(controllerIndex, forAxis)); + if ((temp2Axis.x != 0f || temp2Axis.y != 0f) && (lastCallAxis[axisIndex].x != 0f || lastCallAxis[axisIndex].y != 0f)) { + temp2Axis.subtractLocal(lastCallAxis[axisIndex]); + } else { + // move made from rest, don't count as a delta move + temp2Axis.x = 0f; + temp2Axis.y = 0f; + } + return temp2Axis; + } + + @Override + public Vector3f getVelocity(int controllerIndex) { + + if (environment != null) { + + if (environment.getVRHardware() instanceof LWJGLOpenVR) { + int index = LWJGLOpenVRInput.controllerIndex[controllerIndex]; +// if( needsNewVelocity[index] ) { + HmdVector3 tempVec = ((LWJGLOpenVR) environment.getVRHardware()).hmdTrackedDevicePoses[index].vVelocity(); +// needsNewVelocity[index] = false; +// } + tempVel.x = tempVec.v(0); + tempVel.y = tempVec.v(1); + tempVel.z = tempVec.v(2); + return tempVel; + } else { + throw new IllegalStateException("VR hardware " + environment.getVRHardware().getClass().getSimpleName() + " is not a subclass of " + LWJGLOpenVR.class.getSimpleName()); + } + } else { + throw new IllegalStateException("VR input is not attached to a VR environment."); + } + } + + @Override + public Vector3f getAngularVelocity(int controllerIndex) { + + if (environment != null) { + + if (environment.getVRHardware() instanceof LWJGLOpenVR) { + + int index = LWJGLOpenVRInput.controllerIndex[controllerIndex]; + HmdVector3 tempVec = ((LWJGLOpenVR) environment.getVRHardware()).hmdTrackedDevicePoses[index].vAngularVelocity(); +// needsNewVelocity[index] = false; +// } + tempVel.x = tempVec.v(0); + tempVel.y = tempVec.v(1); + tempVel.z = tempVec.v(2); + return tempVel; + } else { + throw new IllegalStateException("VR hardware " + environment.getVRHardware().getClass().getSimpleName() + " is not a subclass of " + LWJGLOpenVR.class.getSimpleName()); + } + } else { + throw new IllegalStateException("VR input is not attached to a VR environment."); + } + + } + + @Override + public Vector2f getAxisRaw(int controllerIndex, VRInputType forAxis) { + VRControllerState cs = cStates[LWJGLOpenVRInput.controllerIndex[controllerIndex]]; + switch (forAxis) { + default: + return null; + case ViveTriggerAxis: + tempAxis.x = cs.rAxis(1).x(); + tempAxis.y = tempAxis.x; + break; + case ViveTrackpadAxis: + tempAxis.x = cs.rAxis(0).x(); + tempAxis.y = cs.rAxis(0).y(); + break; + } + return tempAxis; + } + + @Override + public Vector2f getAxis(int controllerIndex, VRInputType forAxis) { + getAxisRaw(controllerIndex, forAxis); + tempAxis.x *= axisMultiplier; + tempAxis.y *= axisMultiplier; + return tempAxis; + } + + @Override + public boolean init() { + + logger.config("Initialize OpenVR input."); + + for (int i = 0; i < VR.k_unMaxTrackedDeviceCount; i++) { + rotStore[i] = new Quaternion(); + posStore[i] = new Vector3f(); + cStates[i] = VRControllerState.create(); + lastCallAxis[i] = new Vector2f(); + logger.config(" Input " + (i + 1) + "/" + VR.k_unMaxTrackedDeviceCount + " binded."); + } + + return true; + } + + @Override + public VRTrackedController getTrackedController(int index) { + if (trackedControllers != null) { + if ((trackedControllers.size() > 0) && (index < trackedControllers.size())) { + return trackedControllers.get(index); + } + } + + return null; + } + + @Override + public int getTrackedControllerCount() { + return controllerCount; + } + + @Override + public VRControllerState getRawControllerState(int index) { + if (isInputDeviceTracking(index) == false) { + return null; + } + return cStates[controllerIndex[index]]; + } + + @Override + public boolean isInputFocused() { + if (environment != null){ + // not a 100% match, but the closest i can find in lwjgl. Doc seems to confirm this too. + return VRSystem.VRSystem_IsInputAvailable(); + //return ((VR_IVRSystem_FnTable)environment.getVRHardware().getVRSystem()).IsInputFocusCapturedByAnotherProcess.apply() == 0; + } else { + throw new IllegalStateException("VR input is not attached to a VR environment."); + } + } + + @Override + public boolean isInputDeviceTracking(int index) { + if (index < 0 || index >= controllerCount) { + return false; + } + + if (environment != null) { + + if (environment.getVRHardware() instanceof LWJGLOpenVR) { + return ((LWJGLOpenVR) environment.getVRHardware()).hmdTrackedDevicePoses[controllerIndex[index]].bPoseIsValid(); + } else { + throw new IllegalStateException("VR hardware " + environment.getVRHardware().getClass().getSimpleName() + " is not a subclass of " + LWJGLOpenVR.class.getSimpleName()); + } + } else { + throw new IllegalStateException("VR input is not attached to a VR environment."); + } + } + + @Override + public Quaternion getOrientation(int index) { + if (isInputDeviceTracking(index) == false) { + return null; + } + + if (environment != null) { + + if (environment.getVRHardware() instanceof LWJGLOpenVR) { + index = controllerIndex[index]; + VRUtil.convertMatrix4toQuat(((LWJGLOpenVR) environment.getVRHardware()).poseMatrices[index], rotStore[index]); + return rotStore[index]; + } else { + throw new IllegalStateException("VR hardware " + environment.getVRHardware().getClass().getSimpleName() + " is not a subclass of " + LWJGLOpenVR.class.getSimpleName()); + } + } else { + throw new IllegalStateException("VR input is not attached to a VR environment."); + } + } + + @Override + public Vector3f getPosition(int index) { + if (isInputDeviceTracking(index) == false) { + return null; + } + + if (environment != null) { + + if (environment.getVRHardware() instanceof LWJGLOpenVR) { + // the hmdPose comes in rotated funny, fix that here + index = controllerIndex[index]; + ((LWJGLOpenVR) environment.getVRHardware()).poseMatrices[index].toTranslationVector(posStore[index]); + posStore[index].x = -posStore[index].x; + posStore[index].z = -posStore[index].z; + return posStore[index]; + } else { + throw new IllegalStateException("VR hardware " + environment.getVRHardware().getClass().getSimpleName() + " is not a subclass of " + LWJGLOpenVR.class.getSimpleName()); + } + } else { + throw new IllegalStateException("VR input is not attached to a VR environment."); + } + + } + + @Override + public Quaternion getFinalObserverRotation(int index) { + + if (environment != null) { + VRViewManager vrvm = environment.getVRViewManager(); + + if (vrvm != null) { + if (isInputDeviceTracking(index) == false) { + return null; + } + + Object obs = environment.getObserver(); + if (obs instanceof Camera) { + tempq.set(((Camera) obs).getRotation()); + } else { + tempq.set(((Spatial) obs).getWorldRotation()); + } + + return tempq.multLocal(getOrientation(index)); + } else { + throw new IllegalStateException("VR environment has no valid view manager."); + } + + } else { + throw new IllegalStateException("VR input is not attached to a VR environment."); + } + } + + @Override + public Vector3f getFinalObserverPosition(int index) { + + if (environment != null) { + VRViewManager vrvm = (VRViewManager) environment.getVRViewManager(); + + if (vrvm != null) { + if (isInputDeviceTracking(index) == false) { + return null; + } + Object obs = environment.getObserver(); + Vector3f pos = getPosition(index); + if (obs instanceof Camera) { + ((Camera) obs).getRotation().mult(pos, pos); + return pos.addLocal(((Camera) obs).getLocation()); + } else { + ((Spatial) obs).getWorldRotation().mult(pos, pos); + return pos.addLocal(((Spatial) obs).getWorldTranslation()); + } + } else { + throw new IllegalStateException("VR environment has no valid view manager."); + } + + } else { + throw new IllegalStateException("VR input is not attached to a VR environment."); + } + } + + @Override + public void triggerHapticPulse(int controllerIndex, float seconds) { + if (environment.isInVR() == false || isInputDeviceTracking(controllerIndex) == false) { + return; + } + + // apparently only axis ID of 0 works + VRSystem.VRSystem_TriggerHapticPulse(LWJGLOpenVRInput.controllerIndex[controllerIndex], + 0, (short) Math.round(3f * seconds / 1e-3f)); + } + + @Override + public void updateConnectedControllers() { + logger.config("Updating connected controllers."); + + if (environment != null) { + controllerCount = 0; + for (int i = 0; i < VR.k_unMaxTrackedDeviceCount; i++) { + int classCallback = VRSystem.VRSystem_GetTrackedDeviceClass(i); + if (classCallback == VR.ETrackedDeviceClass_TrackedDeviceClass_Controller || classCallback == VR.ETrackedDeviceClass_TrackedDeviceClass_GenericTracker) { + IntBuffer error = BufferUtils.createIntBuffer(1); + String controllerName = "Unknown"; + String manufacturerName = "Unknown"; + controllerName = VRSystem.VRSystem_GetStringTrackedDeviceProperty(i, VR.ETrackedDeviceProperty_Prop_TrackingSystemName_String, error); + manufacturerName = VRSystem.VRSystem_GetStringTrackedDeviceProperty(i, VR.ETrackedDeviceProperty_Prop_ManufacturerName_String, error); + + if (error.get(0) != 0) { + logger.warning("Error getting controller information " + controllerName + " " + manufacturerName + "Code (" + error.get(0) + ")"); + } + controllerIndex[controllerCount] = i; + + // Adding tracked controller to control. + if (trackedControllers == null) { + trackedControllers = new ArrayList(VR.k_unMaxTrackedDeviceCount); + } + trackedControllers.add(new LWJGLOpenVRTrackedController(i, this, controllerName, manufacturerName, environment)); + + // Send a Haptic pulse to the controller + triggerHapticPulse(controllerCount, 1.0f); + + controllerCount++; + logger.config(" Tracked controller " + (i + 1) + "/" + VR.k_unMaxTrackedDeviceCount + " " + controllerName + " (" + manufacturerName + ") attached."); + } else { + logger.config(" Controller " + (i + 1) + "/" + VR.k_unMaxTrackedDeviceCount + " ignored."); + } + } + } else { + throw new IllegalStateException("VR input is not attached to a VR environment."); + } + } + + @Override + public void updateControllerStates() { + + if (environment != null) { + for (int i = 0; i < controllerCount; i++) { + int index = controllerIndex[i]; + VRSystem.VRSystem_GetControllerState(index, cStates[index], 64); + cStates[index].ulButtonPressed(); + cStates[index].rAxis(); + } + } else { + throw new IllegalStateException("VR input is not attached to a VR environment."); + } + + } + +} \ No newline at end of file diff --git a/jme3-vr/src/main/java/com/jme3/input/vr/lwjgl_openvr/LWJGLOpenVRMouseManager.java b/jme3-vr/src/main/java/com/jme3/input/vr/lwjgl_openvr/LWJGLOpenVRMouseManager.java new file mode 100644 index 000000000..6ae3b85ce --- /dev/null +++ b/jme3-vr/src/main/java/com/jme3/input/vr/lwjgl_openvr/LWJGLOpenVRMouseManager.java @@ -0,0 +1,114 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.jme3.input.vr.lwjgl_openvr; + +import com.jme3.app.VREnvironment; +import com.jme3.input.controls.AnalogListener; +import com.jme3.input.vr.AbstractVRMouseManager; +import com.jme3.input.vr.VRInputType; +import com.jme3.math.Vector2f; + + +/** + * A class dedicated to the handling of the mouse within VR environment. + * @author Julien Seinturier - COMEX SA - http://www.seinturier.fr + */ +public class LWJGLOpenVRMouseManager extends AbstractVRMouseManager { + + private final int AVERAGE_AMNT = 4; + + private int avgCounter; + + private final float[] lastXmv = new float[AVERAGE_AMNT]; + + private final float[] lastYmv = new float[AVERAGE_AMNT]; + + /** + * Create a new VR mouse manager within the given {@link VREnvironment VR environment}. + * @param environment the VR environment of the mouse manager. + */ + public LWJGLOpenVRMouseManager(VREnvironment environment){ + super(environment); + } + + + @Override + public void updateAnalogAsMouse(int inputIndex, AnalogListener mouseListener, String mouseXName, String mouseYName, float tpf) { + + if (getVREnvironment() != null){ + if (getVREnvironment().getApplication() != null){ + // got a tracked controller to use as the "mouse" + if( getVREnvironment().isInVR() == false || + getVREnvironment().getVRinput() == null || + getVREnvironment().getVRinput().isInputDeviceTracking(inputIndex) == false ){ + return; + } + + Vector2f tpDelta; + // TODO option to use Touch joysticks + if( isThumbstickMode() ) { + tpDelta = getVREnvironment().getVRinput().getAxis(inputIndex, VRInputType.ViveTrackpadAxis); + } else { + tpDelta = getVREnvironment().getVRinput().getAxisDeltaSinceLastCall(inputIndex, VRInputType.ViveTrackpadAxis); + } + + float Xamount = (float)Math.pow(Math.abs(tpDelta.x) * getSpeedSensitivity(), getSpeedAcceleration()); + float Yamount = (float)Math.pow(Math.abs(tpDelta.y) * getSpeedSensitivity(), getSpeedAcceleration()); + + if( tpDelta.x < 0f ){ + Xamount = -Xamount; + } + + if( tpDelta.y < 0f ){ + Yamount = -Yamount; + } + + Xamount *= getMouseMoveScale(); + Yamount *= getMouseMoveScale(); + + if( mouseListener != null ) { + if( tpDelta.x != 0f && mouseXName != null ) mouseListener.onAnalog(mouseXName, Xamount * 0.2f, tpf); + if( tpDelta.y != 0f && mouseYName != null ) mouseListener.onAnalog(mouseYName, Yamount * 0.2f, tpf); + } + + if( getVREnvironment().getApplication().getInputManager().isCursorVisible() ) { + int index = (avgCounter+1) % AVERAGE_AMNT; + lastXmv[index] = Xamount * 133f; + lastYmv[index] = Yamount * 133f; + cursorPos.x -= avg(lastXmv); + cursorPos.y -= avg(lastYmv); + Vector2f maxsize = getVREnvironment().getVRGUIManager().getCanvasSize(); + + if( cursorPos.x > maxsize.x ){ + cursorPos.x = maxsize.x; + } + + if( cursorPos.x < 0f ){ + cursorPos.x = 0f; + } + + if( cursorPos.y > maxsize.y ){ + cursorPos.y = maxsize.y; + } + + if( cursorPos.y < 0f ){ + cursorPos.y = 0f; + } + } + } else { + throw new IllegalStateException("This VR environment is not attached to any application."); + } + } else { + throw new IllegalStateException("This VR view manager is not attached to any VR environment."); + } + } + + private float avg(float[] arr) { + float amt = 0f; + for(float f : arr) amt += f; + return amt / arr.length; + } +} diff --git a/jme3-vr/src/main/java/com/jme3/input/vr/lwjgl_openvr/LWJGLOpenVRTrackedController.java b/jme3-vr/src/main/java/com/jme3/input/vr/lwjgl_openvr/LWJGLOpenVRTrackedController.java new file mode 100644 index 000000000..c87cea253 --- /dev/null +++ b/jme3-vr/src/main/java/com/jme3/input/vr/lwjgl_openvr/LWJGLOpenVRTrackedController.java @@ -0,0 +1,100 @@ +package com.jme3.input.vr.lwjgl_openvr; + +import com.jme3.app.VREnvironment; +import com.jme3.input.vr.VRInputAPI; +import com.jme3.input.vr.VRTrackedController; +import com.jme3.math.Matrix4f; +import com.jme3.math.Quaternion; +import com.jme3.math.Vector3f; + +/** + * A controller that is tracked within the VR environment. Such a controller can provide its position within the VR space. + * @author Julien Seinturier - COMEX SA - http://www.seinturier.fr + * @author Rickard Edén + */ +public class LWJGLOpenVRTrackedController implements VRTrackedController{ + + /** + * The index of the controller within the unserlying VR API. + */ + private int controllerIndex = -1; + + /** + * The underlying VRAPI. + */ + private VRInputAPI hardware = null; + + /** + * The name of the controller. + */ + private String name; + + private VREnvironment environment; + + /** + * Wrap a new VR tracked controller on an OpenVR system. + * @param controllerIndex the index of the controller within the underlying VR system. + * @param hardware the underlying VR system. + * @param name the name of the controller. + * @param manufacturer the manufacturer of the controller. + * @param environment the VR environment. + */ + public LWJGLOpenVRTrackedController(int controllerIndex, VRInputAPI hardware, String name, String manufacturer, VREnvironment environment){ + this.controllerIndex = controllerIndex; + this.hardware = hardware; + + this.name = name; + this.manufacturer = manufacturer; + + this.environment = environment; + } + + /** + * The manufacturer of the controller. + */ + private String manufacturer; + + @Override + public Vector3f getPosition() { + if (hardware != null){ + return hardware.getPosition(controllerIndex); + } else { + throw new IllegalStateException("No underlying VR API."); + } + } + + @Override + public Quaternion getOrientation() { + if (hardware != null){ + return hardware.getOrientation(controllerIndex); + } else { + throw new IllegalStateException("No underlying VR API."); + } + } + + @Override + public Matrix4f getPose(){ + + if (environment != null){ + if (hardware != null){ + return ((LWJGLOpenVR)environment.getVRHardware()).getPoseMatrices()[controllerIndex]; + } else { + throw new IllegalStateException("No underlying VR API."); + } + } else { + throw new IllegalStateException("VR tracked device is not attached to any environment."); + } + + + } + + @Override + public String getControllerName() { + return name; + } + + @Override + public String getControllerManufacturer() { + return manufacturer; + } +} \ No newline at end of file diff --git a/jme3-vr/src/main/java/com/jme3/input/vr/lwjgl_openvr/LWJGLOpenVRViewManager.java b/jme3-vr/src/main/java/com/jme3/input/vr/lwjgl_openvr/LWJGLOpenVRViewManager.java new file mode 100644 index 000000000..78be2565f --- /dev/null +++ b/jme3-vr/src/main/java/com/jme3/input/vr/lwjgl_openvr/LWJGLOpenVRViewManager.java @@ -0,0 +1,573 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package com.jme3.input.vr.lwjgl_openvr; + +import com.jme3.app.VREnvironment; +import com.jme3.input.vr.AbstractVRViewManager; +import com.jme3.input.vr.VRAPI; +import com.jme3.math.ColorRGBA; +import com.jme3.math.Quaternion; +import com.jme3.math.Vector2f; +import com.jme3.math.Vector3f; +import com.jme3.renderer.Camera; +import com.jme3.renderer.ViewPort; +import com.jme3.renderer.queue.RenderQueue.Bucket; +import com.jme3.scene.Spatial; +import com.jme3.texture.FrameBuffer; +import com.jme3.texture.Image; +import com.jme3.texture.Texture2D; +import com.jme3.ui.Picture; +import com.jme3.util.VRGUIPositioningMode; + +import java.util.Iterator; +import java.util.logging.Logger; +import org.lwjgl.openvr.VRTextureBounds; +import org.lwjgl.openvr.Texture; +import org.lwjgl.openvr.VR; +import org.lwjgl.openvr.VRCompositor; + +/** + * A VR view manager based on OpenVR. This class enable to submit 3D views to + * the VR compositor. + * + * @author reden - phr00t + * @author Julien Seinturier - COMEX SA - http://www.seinturier.fr + * @author Rickard Edén + */ +public class LWJGLOpenVRViewManager extends AbstractVRViewManager { + + private static final Logger logger = Logger.getLogger(LWJGLOpenVRViewManager.class.getName()); + + // OpenVR values + private VRTextureBounds leftTextureBounds; + private Texture leftTextureType; + + private VRTextureBounds rightTextureBounds; + private Texture rightTextureType; + + private Texture2D dualEyeTex; + + //final & temp values for camera calculations + private final Vector3f finalPosition = new Vector3f(); + private final Quaternion finalRotation = new Quaternion(); + private final Vector3f hmdPos = new Vector3f(); + private final Quaternion hmdRot = new Quaternion(); + + /** + * Create a new VR view manager attached to the given + * {@link VREnvironment VR environment}. + * + * @param environment the {@link VREnvironment VR environment} to which this + * view manager is attached. + */ + public LWJGLOpenVRViewManager(VREnvironment environment) { + this.environment = environment; + } + + /** + * Get the identifier of the left eye texture. + * + * @return the identifier of the left eye texture. + * @see #getRightTexId() + * @see #getFullTexId() + */ + protected int getLeftTexId() { + return (int) getLeftTexture().getImage().getId(); + } + + /** + * Get the identifier of the right eye texture. + * + * @return the identifier of the right eye texture. + * @see #getLeftTexId() + * @see #getFullTexId() + */ + protected int getRightTexId() { + return (int) getRightTexture().getImage().getId(); + } + + /** + * Get the identifier of the full (dual eye) texture. + * + * @return the identifier of the full (dual eye) texture. + * @see #getLeftTexId() + * @see #getRightTexId() + */ + private int getFullTexId() { + return (int) dualEyeTex.getImage().getId(); + } + + /** + * Initialize the system binds of the textures. + */ + private void initTextureSubmitStructs() { + leftTextureType = Texture.create(); + rightTextureType = Texture.create(); + + if (environment != null) { + if (environment.getVRHardware() instanceof LWJGLOpenVR) { + leftTextureBounds = VRTextureBounds.create(); + rightTextureBounds = VRTextureBounds.create(); + // left eye + leftTextureBounds.set(0f, 0f, 0.5f, 1f); + // right eye + rightTextureBounds.set(0.5f, 0f, 1f, 1f); + // texture type + leftTextureType.set(-1, VR.ETextureType_TextureType_OpenGL, VR.EColorSpace_ColorSpace_Gamma); + rightTextureType.set(-1, VR.ETextureType_TextureType_OpenGL, VR.EColorSpace_ColorSpace_Gamma); + + } + } else { + throw new IllegalStateException("This VR view manager is not attached to any VR environment."); + } + } + + @Override + /** + * updatePose can be called here because appstates are always called before the main renderer. This way we get the latest pose close to when it's supposed to render + */ + public void render() { + if (environment != null) { + // grab the observer + Object obs = environment.getObserver(); + Quaternion objRot; + Vector3f objPos; + if (obs instanceof Camera) { + objRot = ((Camera) obs).getRotation(); + objPos = ((Camera) obs).getLocation(); + } else { + objRot = ((Spatial) obs).getWorldRotation(); + objPos = ((Spatial) obs).getWorldTranslation(); + } + // grab the hardware handle + VRAPI dev = environment.getVRHardware(); + if (dev != null) { + + // update the HMD's position & orientation + dev.updatePose(); + dev.getPositionAndOrientation(hmdPos, hmdRot); + + if (obs != null) { + // update hmdPos based on obs rotation + finalRotation.set(objRot); + finalRotation.mult(hmdPos, hmdPos); + finalRotation.multLocal(hmdRot); + } + + finalizeCamera(dev.getHMDVectorPoseLeftEye(), objPos, getLeftCamera()); + finalizeCamera(dev.getHMDVectorPoseRightEye(), objPos, getRightCamera()); + } else { + getLeftCamera().setFrame(objPos, objRot); + getRightCamera().setFrame(objPos, objRot); + } + } + } + + @Override + public void postRender() { + + if (environment != null) { + if (environment.isInVR()) { + VRAPI api = environment.getVRHardware(); + // using the compositor... + int errl = 0, errr = 0; + if (environment.isInstanceRendering()) { + if (leftTextureType.handle() == -1 || leftTextureType.handle() != getFullTexId()) { + leftTextureType.set(getFullTexId(), leftTextureType.eType(), leftTextureType.eColorSpace()); + } else { + if (api instanceof LWJGLOpenVR) { + int submitFlag = VR.EVRSubmitFlags_Submit_Default; + errr = VRCompositor.VRCompositor_Submit(VR.EVREye_Eye_Right, rightTextureType, rightTextureBounds, submitFlag); + errl = VRCompositor.VRCompositor_Submit(VR.EVREye_Eye_Left, leftTextureType, leftTextureBounds, submitFlag); + } + } + } else if (leftTextureType.handle() == -1 || rightTextureType.handle() == -1 + || leftTextureType.handle() != getLeftTexId() || rightTextureType.handle() != getRightTexId()) { + leftTextureType.set(getLeftTexId(), leftTextureType.eType(), leftTextureType.eColorSpace()); + rightTextureType.set(getRightTexId(), leftTextureType.eType(), leftTextureType.eColorSpace()); + } else { + if (api instanceof LWJGLOpenVR) { + int submitFlag = VR.EVRSubmitFlags_Submit_Default; + errr = VRCompositor.VRCompositor_Submit(VR.EVREye_Eye_Right, rightTextureType, null, submitFlag); + errl = VRCompositor.VRCompositor_Submit(VR.EVREye_Eye_Left, leftTextureType, null, submitFlag); + } else { + + } + } + + if (errl != 0) { + logger.severe("Submit to left compositor error: " + " (" + Integer.toString(errl) + ")"); + logger.severe(" Texture handle: " + leftTextureType.handle()); + + logger.severe(" Left eye texture " + leftEyeTexture.getName() + " (" + leftEyeTexture.getImage().getId() + ")"); + logger.severe(" Type: " + leftEyeTexture.getType()); + logger.severe(" Size: " + leftEyeTexture.getImage().getWidth() + "x" + leftEyeTexture.getImage().getHeight()); + logger.severe(" Image depth: " + leftEyeTexture.getImage().getDepth()); + logger.severe(" Image format: " + leftEyeTexture.getImage().getFormat()); + logger.severe(" Image color space: " + leftEyeTexture.getImage().getColorSpace()); + + } + + if (errr != 0) { + logger.severe("Submit to right compositor error: " + " (" + Integer.toString(errl) + ")"); +// logger.severe(" Texture color space: "+OpenVRUtil.getEColorSpaceString(rightTextureType.eColorSpace)); +// logger.severe(" Texture type: "+OpenVRUtil.getETextureTypeString(rightTextureType.eType)); + logger.severe(" Texture handle: " + rightTextureType.handle()); + + logger.severe(" Right eye texture " + rightEyeTexture.getName() + " (" + rightEyeTexture.getImage().getId() + ")"); + logger.severe(" Type: " + rightEyeTexture.getType()); + logger.severe(" Size: " + rightEyeTexture.getImage().getWidth() + "x" + rightEyeTexture.getImage().getHeight()); + logger.severe(" Image depth: " + rightEyeTexture.getImage().getDepth()); + logger.severe(" Image format: " + rightEyeTexture.getImage().getFormat()); + logger.severe(" Image color space: " + rightEyeTexture.getImage().getColorSpace()); + } + } + } else { + throw new IllegalStateException("This VR view manager is not attached to any VR environment."); + } + + VRCompositor.VRCompositor_PostPresentHandoff(); + + } + + @Override + public void initialize() { + + logger.config("Initializing VR view manager."); + + if (environment != null) { + + initTextureSubmitStructs(); + setupCamerasAndViews(); + setupVRScene(); + moveScreenProcessingToEyes(); + + if (environment.hasTraditionalGUIOverlay()) { + + environment.getVRMouseManager().initialize(); + + // update the pose to position the gui correctly on start + update(0f); + environment.getVRGUIManager().positionGui(); + } + + logger.config("Initialized VR view manager [SUCCESS]"); + + } else { + throw new IllegalStateException("This VR view manager is not attached to any VR environment."); + } + } + + /** + * Prepare the size of the given {@link Camera camera} to adapt it to the + * underlying rendering context. + * + * @param cam the {@link Camera camera} to prepare. + * @param xMult the camera width multiplier. + */ + private void prepareCameraSize(Camera cam, float xMult) { + + if (environment != null) { + + if (environment.getApplication() != null) { + Vector2f size = new Vector2f(); + VRAPI vrhmd = environment.getVRHardware(); + + if (vrhmd == null) { + size.x = 1280f; + size.y = 720f; + } else { + vrhmd.getRenderSize(size); + } + + if (size.x < environment.getApplication().getContext().getSettings().getWidth()) { + size.x = environment.getApplication().getContext().getSettings().getWidth(); + } + if (size.y < environment.getApplication().getContext().getSettings().getHeight()) { + size.y = environment.getApplication().getContext().getSettings().getHeight(); + } + + if (environment.isInstanceRendering()) { + size.x *= 2f; + } + + // other adjustments + size.x *= xMult; + size.x *= getResolutionMuliplier(); + size.y *= getResolutionMuliplier(); + + if (cam.getWidth() != size.x || cam.getHeight() != size.y) { + cam.resize((int) size.x, (int) size.y, false); + } + } else { + throw new IllegalStateException("This VR environment is not attached to any application."); + } + + } else { + throw new IllegalStateException("This VR view manager is not attached to any VR environment."); + } + + } + + /** + * Replaces rootNode as the main cameras scene with the distortion mesh + */ + private void setupVRScene() { + + if (environment != null) { + if (environment.getApplication() != null) { + // no special scene to setup if we are doing instancing + if (environment.isInstanceRendering()) { + // distortion has to be done with compositor here... we want only one pass on our end! + if (environment.getApplication().getContext().getSettings().isSwapBuffers()) { + setupMirrorBuffers(environment.getCamera(), dualEyeTex, true); + } + return; + } + + leftEyeTexture = (Texture2D) getLeftViewPort().getOutputFrameBuffer().getColorBuffer().getTexture(); + rightEyeTexture = (Texture2D) getRightViewPort().getOutputFrameBuffer().getColorBuffer().getTexture(); + leftEyeDepth = (Texture2D) getLeftViewPort().getOutputFrameBuffer().getDepthBuffer().getTexture(); + rightEyeDepth = (Texture2D) getRightViewPort().getOutputFrameBuffer().getDepthBuffer().getTexture(); + + // main viewport is either going to be a distortion scene or nothing + // mirroring is handled by copying framebuffers + Iterator spatialIter = environment.getApplication().getViewPort().getScenes().iterator(); + while (spatialIter.hasNext()) { + environment.getApplication().getViewPort().detachScene(spatialIter.next()); + } + + spatialIter = environment.getApplication().getGuiViewPort().getScenes().iterator(); + while (spatialIter.hasNext()) { + environment.getApplication().getGuiViewPort().detachScene(spatialIter.next()); + } + + // only setup distortion scene if compositor isn't running (or using custom mesh distortion option) + if (environment.getApplication().getContext().getSettings().isSwapBuffers()) { + setupMirrorBuffers(environment.getCamera(), leftEyeTexture, false); + + } + } else { + throw new IllegalStateException("This VR environment is not attached to any application."); + } + } else { + throw new IllegalStateException("This VR view manager is not attached to any VR environment."); + } + } + + @Override + public void update(float tpf) { + + if (environment != null) { + + if (environment.hasTraditionalGUIOverlay()) { + // update the mouse? + environment.getVRMouseManager().update(tpf); + + // update GUI position? + if (environment.getVRGUIManager().isWantsReposition() || environment.getVRGUIManager().getPositioningMode() != VRGUIPositioningMode.MANUAL) { + environment.getVRGUIManager().positionGuiNow(tpf); + environment.getVRGUIManager().updateGuiQuadGeometricState(); + } + } + } else { + throw new IllegalStateException("This VR view manager is not attached to any VR environment."); + } + } + + /** + * Place the camera within the scene. + * + * @param eyePos the eye position. + * @param obsPosition the observer position. + * @param cam the camera to place. + */ + private void finalizeCamera(Vector3f eyePos, Vector3f obsPosition, Camera cam) { + finalRotation.mult(eyePos, finalPosition); + finalPosition.addLocal(hmdPos); + if (obsPosition != null) { + finalPosition.addLocal(obsPosition); + } + finalPosition.y += getHeightAdjustment(); + cam.setFrame(finalPosition, finalRotation); + } + + private void setupCamerasAndViews() { + + if (environment != null) { + // get desired frustum from original camera + Camera origCam = environment.getCamera(); + float fFar = origCam.getFrustumFar(); + float fNear = origCam.getFrustumNear(); + + // restore frustum on distortion scene cam, if needed + if (environment.isInstanceRendering()) { + leftCamera = origCam; + } else if (environment.compositorAllowed() == false) { + origCam.setFrustumFar(100f); + origCam.setFrustumNear(1f); + leftCamera = origCam.clone(); + prepareCameraSize(origCam, 2f); + } else { + leftCamera = origCam.clone(); + } + + getLeftCamera().setFrustumPerspective(environment.getDefaultFOV(), environment.getDefaultAspect(), fNear, fFar); + + prepareCameraSize(getLeftCamera(), 1f); + if (environment.getVRHardware() != null) { + getLeftCamera().setProjectionMatrix(environment.getVRHardware().getHMDMatrixProjectionLeftEye(getLeftCamera())); + } + //org.lwjgl.opengl.GL11.glEnable(org.lwjgl.opengl.GL30.GL_FRAMEBUFFER_SRGB); + + if (!environment.isInstanceRendering()) { + leftViewPort = setupViewBuffers(getLeftCamera(), LEFT_VIEW_NAME); + rightCamera = getLeftCamera().clone(); + if (environment.getVRHardware() != null) { + getRightCamera().setProjectionMatrix(environment.getVRHardware().getHMDMatrixProjectionRightEye(getRightCamera())); + } + rightViewPort = setupViewBuffers(getRightCamera(), RIGHT_VIEW_NAME); + } else { + + if (environment.getApplication() != null) { + + logger.severe("THIS CODE NEED CHANGES !!!"); + leftViewPort = environment.getApplication().getViewPort(); + //leftViewport.attachScene(app.getRootNode()); + rightCamera = getLeftCamera().clone(); + if (environment.getVRHardware() != null) { + getRightCamera().setProjectionMatrix(environment.getVRHardware().getHMDMatrixProjectionRightEye(getRightCamera())); + } + + org.lwjgl.opengl.GL11.glEnable(org.lwjgl.opengl.GL30.GL_CLIP_DISTANCE0); + + //FIXME: [jme-vr] Fix with JMonkey next release + //RenderManager._VRInstancing_RightCamProjection = camRight.getViewProjectionMatrix(); + setupFinalFullTexture(environment.getApplication().getViewPort().getCamera()); + } else { + throw new IllegalStateException("This VR environment is not attached to any application."); + } + + } + + // setup gui + environment.getVRGUIManager().setupGui(getLeftCamera(), getRightCamera(), getLeftViewPort(), getRightViewPort()); + + if (environment.getVRHardware() != null) { + // call these to cache the results internally + environment.getVRHardware().getHMDMatrixPoseLeftEye(); + environment.getVRHardware().getHMDMatrixPoseRightEye(); + } + } else { + throw new IllegalStateException("This VR view manager is not attached to any VR environment."); + } + } + + private ViewPort setupMirrorBuffers(Camera cam, Texture2D tex, boolean expand) { + + if (environment != null) { + if (environment.getApplication() != null) { + Camera clonecam = cam.clone(); + ViewPort viewPort = environment.getApplication().getRenderManager().createPostView("MirrorView", clonecam); + clonecam.setParallelProjection(true); + viewPort.setClearFlags(true, true, true); + viewPort.setBackgroundColor(ColorRGBA.Black); + Picture pic = new Picture("fullscene"); + pic.setLocalTranslation(-0.75f, -0.5f, 0f); + if (expand) { + pic.setLocalScale(3f, 1f, 1f); + } else { + pic.setLocalScale(1.5f, 1f, 1f); + } + pic.setQueueBucket(Bucket.Opaque); + pic.setTexture(environment.getApplication().getAssetManager(), (Texture2D) tex, false); + viewPort.attachScene(pic); + viewPort.setOutputFrameBuffer(null); + + pic.updateGeometricState(); + + return viewPort; + } else { + throw new IllegalStateException("This VR environment is not attached to any application."); + } + } else { + throw new IllegalStateException("This VR view manager is not attached to any VR environment."); + } + } + + private void setupFinalFullTexture(Camera cam) { + + if (environment != null) { + if (environment.getApplication() != null) { + // create offscreen framebuffer + FrameBuffer out = new FrameBuffer(cam.getWidth(), cam.getHeight(), 1); + //offBuffer.setSrgb(true); + + //setup framebuffer's texture + dualEyeTex = new Texture2D(cam.getWidth(), cam.getHeight(), Image.Format.RGBA8); + dualEyeTex.setMinFilter(Texture2D.MinFilter.BilinearNoMipMaps); + dualEyeTex.setMagFilter(Texture2D.MagFilter.Bilinear); + + logger.config("Dual eye texture " + dualEyeTex.getName() + " (" + dualEyeTex.getImage().getId() + ")"); + logger.config(" Type: " + dualEyeTex.getType()); + logger.config(" Size: " + dualEyeTex.getImage().getWidth() + "x" + dualEyeTex.getImage().getHeight()); + logger.config(" Image depth: " + dualEyeTex.getImage().getDepth()); + logger.config(" Image format: " + dualEyeTex.getImage().getFormat()); + logger.config(" Image color space: " + dualEyeTex.getImage().getColorSpace()); + + //setup framebuffer to use texture + out.setDepthBuffer(Image.Format.Depth); + out.setColorTexture(dualEyeTex); + + ViewPort viewPort = environment.getApplication().getViewPort(); + viewPort.setClearFlags(true, true, true); + viewPort.setBackgroundColor(ColorRGBA.Black); + viewPort.setOutputFrameBuffer(out); + } else { + throw new IllegalStateException("This VR environment is not attached to any application."); + } + } else { + throw new IllegalStateException("This VR view manager is not attached to any VR environment."); + } + } + + private ViewPort setupViewBuffers(Camera cam, String viewName) { + + if (environment != null) { + if (environment.getApplication() != null) { + // create offscreen framebuffer + FrameBuffer offBufferLeft = new FrameBuffer(cam.getWidth(), cam.getHeight(), 1); + //offBufferLeft.setSrgb(true); + + //setup framebuffer's texture + Texture2D offTex = new Texture2D(cam.getWidth(), cam.getHeight(), Image.Format.RGBA8); + offTex.setMinFilter(Texture2D.MinFilter.BilinearNoMipMaps); + offTex.setMagFilter(Texture2D.MagFilter.Bilinear); + + //setup framebuffer to use texture + offBufferLeft.setDepthBuffer(Image.Format.Depth); + offBufferLeft.setColorTexture(offTex); + + ViewPort viewPort = environment.getApplication().getRenderManager().createPreView(viewName, cam); + viewPort.setClearFlags(true, true, true); + viewPort.setBackgroundColor(ColorRGBA.Black); + + Iterator spatialIter = environment.getApplication().getViewPort().getScenes().iterator(); + while (spatialIter.hasNext()) { + viewPort.attachScene(spatialIter.next()); + } + + //set viewport to render to offscreen framebuffer + viewPort.setOutputFrameBuffer(offBufferLeft); + return viewPort; + } else { + throw new IllegalStateException("This VR environment is not attached to any application."); + } + } else { + throw new IllegalStateException("This VR view manager is not attached to any VR environment."); + } + } + +} \ No newline at end of file diff --git a/jme3-vr/src/main/java/com/jme3/input/vr/oculus/OculusMouseManager.java b/jme3-vr/src/main/java/com/jme3/input/vr/oculus/OculusMouseManager.java new file mode 100644 index 000000000..52fbaf7b0 --- /dev/null +++ b/jme3-vr/src/main/java/com/jme3/input/vr/oculus/OculusMouseManager.java @@ -0,0 +1,108 @@ +package com.jme3.input.vr.oculus; + +import com.jme3.app.VREnvironment; +import com.jme3.input.controls.AnalogListener; +import com.jme3.input.vr.AbstractVRMouseManager; +import com.jme3.input.vr.VRInputType; +import com.jme3.math.Vector2f; + +/** + * A class dedicated to the mouse handling within Oculus Rift based VR experience. + * @author Julien Seinturier - COMEX SA - http://www.seinturier.fr + * + */ +public class OculusMouseManager extends AbstractVRMouseManager { + + private final int AVERAGE_AMNT = 4; + + private int avgCounter; + + private final float[] lastXmv = new float[AVERAGE_AMNT]; + + private final float[] lastYmv = new float[AVERAGE_AMNT]; + + /** + * Create a new VR mouse manager within the given {@link VREnvironment VR environment}. + * @param environment the VR environment of the mouse manager. + */ + public OculusMouseManager(VREnvironment environment){ + super(environment); + } + + @Override + public void updateAnalogAsMouse(int inputIndex, AnalogListener mouseListener, String mouseXName, String mouseYName, float tpf) { + + if (getVREnvironment() != null){ + if (getVREnvironment().getApplication() != null){ + // got a tracked controller to use as the "mouse" + if( getVREnvironment().isInVR() == false || + getVREnvironment().getVRinput() == null || + getVREnvironment().getVRinput().isInputDeviceTracking(inputIndex) == false ){ + return; + } + + Vector2f tpDelta; + // TODO option to use Touch joysticks + if( isThumbstickMode() ) { + tpDelta = getVREnvironment().getVRinput().getAxis(inputIndex, VRInputType.OculusThumbstickAxis); + } else { + tpDelta = getVREnvironment().getVRinput().getAxisDeltaSinceLastCall(inputIndex, VRInputType.OculusThumbstickAxis); + } + + float Xamount = (float)Math.pow(Math.abs(tpDelta.x) * getSpeedSensitivity(), getSpeedAcceleration()); + float Yamount = (float)Math.pow(Math.abs(tpDelta.y) * getSpeedSensitivity(), getSpeedAcceleration()); + + if( tpDelta.x < 0f ){ + Xamount = -Xamount; + } + + if( tpDelta.y < 0f ){ + Yamount = -Yamount; + } + + Xamount *= getMouseMoveScale(); + Yamount *= getMouseMoveScale(); + + if( mouseListener != null ) { + if( tpDelta.x != 0f && mouseXName != null ) mouseListener.onAnalog(mouseXName, Xamount * 0.2f, tpf); + if( tpDelta.y != 0f && mouseYName != null ) mouseListener.onAnalog(mouseYName, Yamount * 0.2f, tpf); + } + + if( getVREnvironment().getApplication().getInputManager().isCursorVisible() ) { + int index = (avgCounter+1) % AVERAGE_AMNT; + lastXmv[index] = Xamount * 133f; + lastYmv[index] = Yamount * 133f; + cursorPos.x -= avg(lastXmv); + cursorPos.y -= avg(lastYmv); + Vector2f maxsize = getVREnvironment().getVRGUIManager().getCanvasSize(); + + if( cursorPos.x > maxsize.x ){ + cursorPos.x = maxsize.x; + } + + if( cursorPos.x < 0f ){ + cursorPos.x = 0f; + } + + if( cursorPos.y > maxsize.y ){ + cursorPos.y = maxsize.y; + } + + if( cursorPos.y < 0f ){ + cursorPos.y = 0f; + } + } + } else { + throw new IllegalStateException("This VR environment is not attached to any application."); + } + } else { + throw new IllegalStateException("This VR view manager is not attached to any VR environment."); + } + } + + private float avg(float[] arr) { + float amt = 0f; + for(float f : arr) amt += f; + return amt / arr.length; + } +} diff --git a/jme3-vr/src/main/java/com/jme3/input/vr/OculusVR.java b/jme3-vr/src/main/java/com/jme3/input/vr/oculus/OculusVR.java similarity index 98% rename from jme3-vr/src/main/java/com/jme3/input/vr/OculusVR.java rename to jme3-vr/src/main/java/com/jme3/input/vr/oculus/OculusVR.java index 5ce192864..0c12b98d2 100644 --- a/jme3-vr/src/main/java/com/jme3/input/vr/OculusVR.java +++ b/jme3-vr/src/main/java/com/jme3/input/vr/oculus/OculusVR.java @@ -3,9 +3,11 @@ * To change this template file, choose Tools | Templates * and open the template in the editor. */ -package com.jme3.input.vr; +package com.jme3.input.vr.oculus; import com.jme3.app.VREnvironment; +import com.jme3.input.vr.HmdType; +import com.jme3.input.vr.VRAPI; import com.jme3.math.*; import com.jme3.renderer.Camera; import com.jme3.texture.*; @@ -235,7 +237,7 @@ public class OculusVR implements VRAPI { hmdRelativeEyePositions[eye] = new Vector3f(); // Find the eye render information - we use this in the - // view manager for giving LibOVR it's timewarp information. + // view manager for giving LibOVR its timewarp information. eyeRenderDesc[eye] = OVREyeRenderDesc.malloc(); ovr_GetRenderDesc(session, eye, fovPorts[eye], eyeRenderDesc[eye]); @@ -608,7 +610,7 @@ public class OculusVR implements VRAPI { * @return The {@code to} argument. */ public static Vector3f vecO2J(OVRVector3f from, Vector3f to) { - // jME and LibOVR disagree on which way X and Z is, too. + // jME and LibOVR disagree on which way X and Z are, too. to.set( -from.x(), from.y(), diff --git a/jme3-vr/src/main/java/com/jme3/input/vr/OculusVRInput.java b/jme3-vr/src/main/java/com/jme3/input/vr/oculus/OculusVRInput.java similarity index 96% rename from jme3-vr/src/main/java/com/jme3/input/vr/OculusVRInput.java rename to jme3-vr/src/main/java/com/jme3/input/vr/oculus/OculusVRInput.java index 9016850bc..e3631e72a 100644 --- a/jme3-vr/src/main/java/com/jme3/input/vr/OculusVRInput.java +++ b/jme3-vr/src/main/java/com/jme3/input/vr/oculus/OculusVRInput.java @@ -1,10 +1,13 @@ -package com.jme3.input.vr; +package com.jme3.input.vr.oculus; import com.jme3.app.VREnvironment; +import com.jme3.input.vr.VRInputAPI; +import com.jme3.input.vr.VRInputType; +import com.jme3.input.vr.VRTrackedController; import com.jme3.math.*; import com.jme3.renderer.Camera; import com.jme3.scene.Spatial; -import com.jme3.util.VRViewManagerOculus; + import org.lwjgl.ovr.*; import static org.lwjgl.ovr.OVR.*; @@ -129,7 +132,7 @@ public class OculusVRInput implements VRInputAPI { // Copied from OpenVRInput VREnvironment env = hardware.getEnvironment(); - VRViewManagerOculus vrvm = (VRViewManagerOculus) hardware.getEnvironment().getVRViewManager(); + OculusViewManager vrvm = (OculusViewManager) hardware.getEnvironment().getVRViewManager(); Object obs = env.getObserver(); Quaternion tempq = new Quaternion(); // TODO move to class scope? @@ -147,7 +150,7 @@ public class OculusVRInput implements VRInputAPI { // Copied from OpenVRInput VREnvironment env = hardware.getEnvironment(); - VRViewManagerOculus vrvm = (VRViewManagerOculus) hardware.getEnvironment().getVRViewManager(); + OculusViewManager vrvm = (OculusViewManager) hardware.getEnvironment().getVRViewManager(); Object obs = env.getObserver(); Vector3f pos = getPosition(index); diff --git a/jme3-vr/src/main/java/com/jme3/util/VRViewManagerOculus.java b/jme3-vr/src/main/java/com/jme3/input/vr/oculus/OculusViewManager.java similarity index 95% rename from jme3-vr/src/main/java/com/jme3/util/VRViewManagerOculus.java rename to jme3-vr/src/main/java/com/jme3/input/vr/oculus/OculusViewManager.java index 53a00aabd..0a008af41 100644 --- a/jme3-vr/src/main/java/com/jme3/util/VRViewManagerOculus.java +++ b/jme3-vr/src/main/java/com/jme3/input/vr/oculus/OculusViewManager.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2017 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -29,23 +29,25 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package com.jme3.util; +package com.jme3.input.vr.oculus; import com.jme3.app.VREnvironment; -import com.jme3.input.vr.OculusVR; +import com.jme3.input.vr.AbstractVRViewManager; import com.jme3.input.vr.VRAPI; import com.jme3.math.*; import com.jme3.renderer.Camera; import com.jme3.renderer.ViewPort; import com.jme3.scene.Spatial; -import com.jme3.texture.*; +import com.jme3.util.BufferUtils; +import com.jme3.util.VRGUIPositioningMode; import java.nio.IntBuffer; import java.util.Iterator; import java.util.Objects; -import java.util.logging.Logger; -import org.lwjgl.ovr.*; +import org.lwjgl.ovr.OVRFovPort; +import org.lwjgl.ovr.OVRPosef; +import org.lwjgl.ovr.OVRUtil; import static org.lwjgl.ovr.OVR.*; import static org.lwjgl.ovr.OVRErrorCode.*; @@ -55,9 +57,7 @@ import static org.lwjgl.ovr.OVRErrorCode.*; * * @author Campbell Suter */ -public class VRViewManagerOculus extends AbstractVRViewManager { - - private static final Logger LOG = Logger.getLogger(VRViewManagerOculus.class.getName()); +public class OculusViewManager extends AbstractVRViewManager { private final VREnvironment environment; private final OculusVR hardware; @@ -69,7 +69,7 @@ public class VRViewManagerOculus extends AbstractVRViewManager { private final Vector3f hmdPos = new Vector3f(); private final Quaternion hmdRot = new Quaternion(); - public VRViewManagerOculus(VREnvironment environment) { + public OculusViewManager(VREnvironment environment) { this.environment = environment; VRAPI hardware = environment.getVRHardware(); @@ -153,7 +153,7 @@ public class VRViewManagerOculus extends AbstractVRViewManager { environment.getVRMouseManager().update(tpf); // update GUI position? - if (environment.getVRGUIManager().wantsReposition || environment.getVRGUIManager().getPositioningMode() != VRGUIPositioningMode.MANUAL) { + if (environment.getVRGUIManager().isWantsReposition() || environment.getVRGUIManager().getPositioningMode() != VRGUIPositioningMode.MANUAL) { environment.getVRGUIManager().positionGuiNow(tpf); environment.getVRGUIManager().updateGuiQuadGeometricState(); } @@ -231,12 +231,12 @@ public class VRViewManagerOculus extends AbstractVRViewManager { private void setupCamerasAndViews() { // TODO: Use LobOVR IPD etc if (environment != null) { - // get desired frustrum from original camera + // get desired frustum from original camera Camera origCam = environment.getCamera(); float fFar = origCam.getFrustumFar(); float fNear = origCam.getFrustumNear(); - // restore frustrum on distortion scene cam, if needed + // restore frustum on distortion scene cam, if needed if (environment.isInstanceRendering()) { leftCamera = origCam; } else { diff --git a/jme3-vr/src/main/java/com/jme3/input/vr/OpenVR.java b/jme3-vr/src/main/java/com/jme3/input/vr/openvr/OpenVR.java similarity index 84% rename from jme3-vr/src/main/java/com/jme3/input/vr/OpenVR.java rename to jme3-vr/src/main/java/com/jme3/input/vr/openvr/OpenVR.java index a3cd4028d..ef70bccbc 100644 --- a/jme3-vr/src/main/java/com/jme3/input/vr/OpenVR.java +++ b/jme3-vr/src/main/java/com/jme3/input/vr/openvr/OpenVR.java @@ -3,9 +3,11 @@ * To change this template file, choose Tools | Templates * and open the template in the editor. */ -package com.jme3.input.vr; +package com.jme3.input.vr.openvr; import com.jme3.app.VREnvironment; +import com.jme3.input.vr.HmdType; +import com.jme3.input.vr.VRAPI; import com.jme3.math.Matrix4f; import com.jme3.math.Quaternion; import com.jme3.math.Vector2f; @@ -35,15 +37,15 @@ import java.util.logging.Logger; /** * A class that wraps an OpenVR system. * @author reden - phr00t - https://github.com/phr00t - * @author Julien Seinturier - (c) 2016 - JOrigin project - http:/www.jorigin.org + * @author Julien Seinturier - COMEX SA - http://www.seinturier.fr */ public class OpenVR implements VRAPI { private static final Logger logger = Logger.getLogger(OpenVR.class.getName()); private static VR_IVRCompositor_FnTable compositorFunctions; - private static VR_IVRTrackedCamera_FnTable cameraFunctions; private static VR_IVRSystem_FnTable vrsystemFunctions; + private static VR_IVRTrackedCamera_FnTable cameraFunctions; private static boolean initSuccess = false; private static boolean flipEyes = false; @@ -85,6 +87,35 @@ public class OpenVR implements VRAPI { private VREnvironment environment = null; + /** + * Convert specific OpenVR {@link com.jme3.system.jopenvr.HmdMatrix34_t HmdMatrix34_t} into JME {@link Matrix4f Matrix4f} + * @param hmdMatrix the input matrix + * @param mat the converted matrix + * @return the converted matrix + */ + public static Matrix4f convertSteamVRMatrix3ToMatrix4f(com.jme3.system.jopenvr.HmdMatrix34_t hmdMatrix, Matrix4f mat){ + mat.set(hmdMatrix.m[0], hmdMatrix.m[1], hmdMatrix.m[2], hmdMatrix.m[3], + hmdMatrix.m[4], hmdMatrix.m[5], hmdMatrix.m[6], hmdMatrix.m[7], + hmdMatrix.m[8], hmdMatrix.m[9], hmdMatrix.m[10], hmdMatrix.m[11], + 0f, 0f, 0f, 1f); + return mat; + } + + /** + * Convert specific OpenVR {@link com.jme3.system.jopenvr.HmdMatrix44_t HmdMatrix34_t} into JME {@link Matrix4f Matrix4f} + * @param hmdMatrix the input matrix + * @param mat the converted matrix + * @return the converted matrix + */ + public static Matrix4f convertSteamVRMatrix4ToMatrix4f(com.jme3.system.jopenvr.HmdMatrix44_t hmdMatrix, Matrix4f mat){ + mat.set(hmdMatrix.m[0], hmdMatrix.m[1], hmdMatrix.m[2], hmdMatrix.m[3], + hmdMatrix.m[4], hmdMatrix.m[5], hmdMatrix.m[6], hmdMatrix.m[7], + hmdMatrix.m[8], hmdMatrix.m[9], hmdMatrix.m[10], hmdMatrix.m[11], + hmdMatrix.m[12], hmdMatrix.m[13], hmdMatrix.m[14], hmdMatrix.m[15]); + return mat; + } + + /** * Create a new OpenVR system * attached to the given {@link VREnvironment VR environment}. @@ -110,7 +141,7 @@ public class OpenVR implements VRAPI { } public VR_IVRTrackedCamera_FnTable getTrackedCamera(){ - return cameraFunctions; + return cameraFunctions; } @Override @@ -145,7 +176,17 @@ public class OpenVR implements VRAPI { hmdErrorStore = new IntByReference(); vrsystemFunctions = null; + + // Init the native linking to the OpenVR library. + try{ + JOpenVRLibrary.init(); + } catch(Throwable t){ + logger.log(Level.SEVERE, "Cannot link to OpenVR system library: "+t.getMessage(), t); + return false; + } + JOpenVRLibrary.VR_InitInternal(hmdErrorStore, JOpenVRLibrary.EVRApplicationType.EVRApplicationType_VRApplication_Scene); + if( hmdErrorStore.getValue() == 0 ) { vrsystemFunctions = new VR_IVRSystem_FnTable(JOpenVRLibrary.VR_GetGenericInterface(JOpenVRLibrary.IVRSystem_Version, hmdErrorStore).getPointer()); } @@ -160,6 +201,7 @@ public class OpenVR implements VRAPI { vrsystemFunctions.setAutoSynch(false); vrsystemFunctions.read(); + tlastVsync = new FloatByReference(); _tframeCount = new LongByReference(); @@ -188,7 +230,9 @@ public class OpenVR implements VRAPI { VRinput.updateConnectedControllers(); // init bounds & chaperone info - environment.getVRBounds().init(this); + OpenVRBounds bounds = new OpenVRBounds(); + bounds.init(this); + environment.setVRBounds(bounds); logger.config("Initializing OpenVR system [SUCCESS]"); initSuccess = true; @@ -241,22 +285,27 @@ public class OpenVR implements VRAPI { } return compositorFunctions != null; } - + + /** + * Initialize the headset camera. + * @param allowed true is the use of the headset camera is allowed and false otherwise. + */ public void initCamera(boolean allowed) { - hmdErrorStore.setValue(0); // clear the error store - if( allowed && vrsystemFunctions != null ) { - IntByReference intptr = JOpenVRLibrary.VR_GetGenericInterface(JOpenVRLibrary.IVRTrackedCamera_Version, hmdErrorStore); - if (intptr != null){ - cameraFunctions = new VR_IVRTrackedCamera_FnTable(intptr.getPointer()); - if(cameraFunctions != null && hmdErrorStore.getValue() == 0 ){ - cameraFunctions.setAutoSynch(false); - cameraFunctions.read(); - logger.config("OpenVR Camera initialized"); - } - } - } + hmdErrorStore.setValue(0); // clear the error store + + if( allowed && vrsystemFunctions != null ) { + IntByReference intptr = JOpenVRLibrary.VR_GetGenericInterface(JOpenVRLibrary.IVRTrackedCamera_Version, hmdErrorStore); + if (intptr != null){ + cameraFunctions = new VR_IVRTrackedCamera_FnTable(intptr.getPointer()); + if(cameraFunctions != null && hmdErrorStore.getValue() == 0 ){ + cameraFunctions.setAutoSynch(false); + cameraFunctions.read(); + logger.config("OpenVR Camera initialized"); + } + } + } } - + @Override public void destroy() { JOpenVRLibrary.VR_ShutdownInternal(); @@ -398,7 +447,7 @@ public class OpenVR implements VRAPI { hmdTrackedDevicePoses[nDevice].readField("bPoseIsValid"); if( hmdTrackedDevicePoses[nDevice].bPoseIsValid != 0 ){ hmdTrackedDevicePoses[nDevice].readField("mDeviceToAbsoluteTracking"); - VRUtil.convertSteamVRMatrix3ToMatrix4f(hmdTrackedDevicePoses[nDevice].mDeviceToAbsoluteTracking, poseMatrices[nDevice]); + convertSteamVRMatrix3ToMatrix4f(hmdTrackedDevicePoses[nDevice].mDeviceToAbsoluteTracking, poseMatrices[nDevice]); } } @@ -418,7 +467,7 @@ public class OpenVR implements VRAPI { } else { HmdMatrix44_t mat = vrsystemFunctions.GetProjectionMatrix.apply(JOpenVRLibrary.EVREye.EVREye_Eye_Left, cam.getFrustumNear(), cam.getFrustumFar()); hmdProjectionLeftEye = new Matrix4f(); - VRUtil.convertSteamVRMatrix4ToMatrix4f(mat, hmdProjectionLeftEye); + convertSteamVRMatrix4ToMatrix4f(mat, hmdProjectionLeftEye); return hmdProjectionLeftEye; } } @@ -432,7 +481,7 @@ public class OpenVR implements VRAPI { } else { HmdMatrix44_t mat = vrsystemFunctions.GetProjectionMatrix.apply(JOpenVRLibrary.EVREye.EVREye_Eye_Right, cam.getFrustumNear(), cam.getFrustumFar()); hmdProjectionRightEye = new Matrix4f(); - VRUtil.convertSteamVRMatrix4ToMatrix4f(mat, hmdProjectionRightEye); + convertSteamVRMatrix4ToMatrix4f(mat, hmdProjectionRightEye); return hmdProjectionRightEye; } } @@ -470,7 +519,7 @@ public class OpenVR implements VRAPI { hmdSeatToStand = new Vector3f(); HmdMatrix34_t mat = vrsystemFunctions.GetSeatedZeroPoseToStandingAbsoluteTrackingPose.apply(); Matrix4f tempmat = new Matrix4f(); - VRUtil.convertSteamVRMatrix3ToMatrix4f(mat, tempmat); + convertSteamVRMatrix3ToMatrix4f(mat, tempmat); tempmat.toTranslationVector(hmdSeatToStand); } return hmdSeatToStand; @@ -485,7 +534,7 @@ public class OpenVR implements VRAPI { } else { HmdMatrix34_t mat = vrsystemFunctions.GetEyeToHeadTransform.apply(JOpenVRLibrary.EVREye.EVREye_Eye_Left); hmdPoseLeftEye = new Matrix4f(); - return VRUtil.convertSteamVRMatrix3ToMatrix4f(mat, hmdPoseLeftEye); + return convertSteamVRMatrix3ToMatrix4f(mat, hmdPoseLeftEye); } } @@ -539,7 +588,7 @@ public class OpenVR implements VRAPI { } else { HmdMatrix34_t mat = vrsystemFunctions.GetEyeToHeadTransform.apply(JOpenVRLibrary.EVREye.EVREye_Eye_Right); hmdPoseRightEye = new Matrix4f(); - return VRUtil.convertSteamVRMatrix3ToMatrix4f(mat, hmdPoseRightEye); + return convertSteamVRMatrix3ToMatrix4f(mat, hmdPoseRightEye); } } diff --git a/jme3-vr/src/main/java/com/jme3/input/vr/openvr/OpenVRBounds.java b/jme3-vr/src/main/java/com/jme3/input/vr/openvr/OpenVRBounds.java new file mode 100644 index 000000000..b487a5f22 --- /dev/null +++ b/jme3-vr/src/main/java/com/jme3/input/vr/openvr/OpenVRBounds.java @@ -0,0 +1,59 @@ +package com.jme3.input.vr.openvr; + +import com.jme3.input.vr.VRBounds; +import com.jme3.math.Vector2f; +import com.jme3.system.jopenvr.JOpenVRLibrary; +import com.jme3.system.jopenvr.VR_IVRChaperone_FnTable; +import com.sun.jna.ptr.FloatByReference; + +import java.util.logging.Logger; + +/** + * A class that represents VR world bounds. + * @author reden - phr00t - https://github.com/phr00t + * @author Julien Seinturier - COMEX SA - http://www.seinturier.fr + */ +public class OpenVRBounds implements VRBounds { + + private static Logger logger = Logger.getLogger(OpenVRBounds.class.getName()); + + private VR_IVRChaperone_FnTable vrChaperone; + private Vector2f playSize; + + /** + * Initialize the VR bounds. + * @return true if the initialization is a success and false otherwise. + */ + public boolean init(OpenVR api) { + + logger.config("Initialize VR bounds..."); + + if( vrChaperone == null ) { + vrChaperone = new VR_IVRChaperone_FnTable(JOpenVRLibrary.VR_GetGenericInterface(JOpenVRLibrary.IVRChaperone_Version, api.hmdErrorStore).getPointer()); + if( vrChaperone != null ) { + vrChaperone.setAutoSynch(false); + vrChaperone.read(); + FloatByReference fbX = new FloatByReference(); + FloatByReference fbZ = new FloatByReference(); + vrChaperone.GetPlayAreaSize.apply(fbX, fbZ); + playSize = new Vector2f(fbX.getValue(), fbZ.getValue()); + + logger.config("Initialize VR bounds [SUCCESS]"); + return true; // init success + } + + logger.warning("Initialize VR bounds [FAILED]."); + return false; // failed to init + } + + logger.config("Initialize VR bounds already done."); + return true; // already initialized + } + + @Override + public Vector2f getPlaySize() { + return playSize; + } + +} + diff --git a/jme3-vr/src/main/java/com/jme3/input/vr/OpenVRInput.java b/jme3-vr/src/main/java/com/jme3/input/vr/openvr/OpenVRInput.java similarity index 94% rename from jme3-vr/src/main/java/com/jme3/input/vr/OpenVRInput.java rename to jme3-vr/src/main/java/com/jme3/input/vr/openvr/OpenVRInput.java index 2f9b81e95..b1e2f2793 100644 --- a/jme3-vr/src/main/java/com/jme3/input/vr/OpenVRInput.java +++ b/jme3-vr/src/main/java/com/jme3/input/vr/openvr/OpenVRInput.java @@ -3,7 +3,7 @@ * To change this template file, choose Tools | Templates * and open the template in the editor. */ -package com.jme3.input.vr; +package com.jme3.input.vr.openvr; import java.util.ArrayList; import java.util.List; @@ -11,6 +11,9 @@ import java.util.logging.Level; import java.util.logging.Logger; import com.jme3.app.VREnvironment; +import com.jme3.input.vr.VRInputAPI; +import com.jme3.input.vr.VRInputType; +import com.jme3.input.vr.VRTrackedController; import com.jme3.math.Quaternion; import com.jme3.math.Vector2f; import com.jme3.math.Vector3f; @@ -21,7 +24,6 @@ import com.jme3.system.jopenvr.OpenVRUtil; import com.jme3.system.jopenvr.VRControllerState_t; import com.jme3.system.jopenvr.VR_IVRSystem_FnTable; import com.jme3.util.VRUtil; -import com.jme3.util.VRViewManagerOpenVR; /* make helper functions to pull the following easily from raw data (DONE) @@ -65,7 +67,7 @@ Button press: 2, touch: 2 * null values will be returned if no valid pose exists, or that input device isn't available * user code should check for null values. * @author reden - phr00t - https://github.com/phr00t - * @author Julien Seinturier - (c) 2016 - JOrigin project - http:/www.jorigin.org + * @author Julien Seinturier - COMEX SA - http://www.seinturier.fr */ public class OpenVRInput implements VRInputAPI { @@ -320,7 +322,7 @@ public class OpenVRInput implements VRInputAPI { public boolean isInputFocused() { if (environment != null){ - return ((VR_IVRSystem_FnTable)environment.getVRHardware().getVRSystem()).IsInputFocusCapturedByAnotherProcess.apply() == 0; + return ((VR_IVRSystem_FnTable)environment.getVRHardware().getVRSystem()).IsInputAvailable.apply() == 0; } else { throw new IllegalStateException("VR input is not attached to a VR environment."); } @@ -393,7 +395,7 @@ public class OpenVRInput implements VRInputAPI { public Quaternion getFinalObserverRotation(int index) { if (environment != null){ - VRViewManagerOpenVR vrvm = (VRViewManagerOpenVR)environment.getVRViewManager(); + OpenVRViewManager vrvm = (OpenVRViewManager)environment.getVRViewManager(); if (vrvm != null){ if(isInputDeviceTracking(index) == false ){ @@ -422,7 +424,7 @@ public class OpenVRInput implements VRInputAPI { public Vector3f getFinalObserverPosition(int index) { if (environment != null){ - VRViewManagerOpenVR vrvm = (VRViewManagerOpenVR)environment.getVRViewManager(); + OpenVRViewManager vrvm = (OpenVRViewManager)environment.getVRViewManager(); if (vrvm != null){ if(isInputDeviceTracking(index) == false ){ @@ -484,7 +486,7 @@ public class OpenVRInput implements VRInputAPI { } trackedControllers.add(new OpenVRTrackedController(i, this, controllerName, manufacturerName, environment)); - // Send an Haptic pulse to the controller + // Send a Haptic pulse to the controller triggerHapticPulse(controllerCount, 1.0f); controllerCount++; diff --git a/jme3-vr/src/main/java/com/jme3/input/vr/openvr/OpenVRMouseManager.java b/jme3-vr/src/main/java/com/jme3/input/vr/openvr/OpenVRMouseManager.java new file mode 100644 index 000000000..72de95cc0 --- /dev/null +++ b/jme3-vr/src/main/java/com/jme3/input/vr/openvr/OpenVRMouseManager.java @@ -0,0 +1,114 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.jme3.input.vr.openvr; + +import com.jme3.app.VREnvironment; +import com.jme3.input.controls.AnalogListener; +import com.jme3.input.vr.AbstractVRMouseManager; +import com.jme3.input.vr.VRInputType; +import com.jme3.math.Vector2f; + + +/** + * A class dedicated to the handling of the mouse within VR environment. + * @author Julien Seinturier - COMEX SA - http://www.seinturier.fr + */ +public class OpenVRMouseManager extends AbstractVRMouseManager { + + private final int AVERAGE_AMNT = 4; + + private int avgCounter; + + private final float[] lastXmv = new float[AVERAGE_AMNT]; + + private final float[] lastYmv = new float[AVERAGE_AMNT]; + + /** + * Create a new VR mouse manager within the given {@link VREnvironment VR environment}. + * @param environment the VR environment of the mouse manager. + */ + public OpenVRMouseManager(VREnvironment environment){ + super(environment); + } + + + @Override + public void updateAnalogAsMouse(int inputIndex, AnalogListener mouseListener, String mouseXName, String mouseYName, float tpf) { + + if (getVREnvironment() != null){ + if (getVREnvironment().getApplication() != null){ + // got a tracked controller to use as the "mouse" + if( getVREnvironment().isInVR() == false || + getVREnvironment().getVRinput() == null || + getVREnvironment().getVRinput().isInputDeviceTracking(inputIndex) == false ){ + return; + } + + Vector2f tpDelta; + // TODO option to use Touch joysticks + if( isThumbstickMode() ) { + tpDelta = getVREnvironment().getVRinput().getAxis(inputIndex, VRInputType.ViveTrackpadAxis); + } else { + tpDelta = getVREnvironment().getVRinput().getAxisDeltaSinceLastCall(inputIndex, VRInputType.ViveTrackpadAxis); + } + + float Xamount = (float)Math.pow(Math.abs(tpDelta.x) * getSpeedSensitivity(), getSpeedAcceleration()); + float Yamount = (float)Math.pow(Math.abs(tpDelta.y) * getSpeedSensitivity(), getSpeedAcceleration()); + + if( tpDelta.x < 0f ){ + Xamount = -Xamount; + } + + if( tpDelta.y < 0f ){ + Yamount = -Yamount; + } + + Xamount *= getMouseMoveScale(); + Yamount *= getMouseMoveScale(); + + if( mouseListener != null ) { + if( tpDelta.x != 0f && mouseXName != null ) mouseListener.onAnalog(mouseXName, Xamount * 0.2f, tpf); + if( tpDelta.y != 0f && mouseYName != null ) mouseListener.onAnalog(mouseYName, Yamount * 0.2f, tpf); + } + + if( getVREnvironment().getApplication().getInputManager().isCursorVisible() ) { + int index = (avgCounter+1) % AVERAGE_AMNT; + lastXmv[index] = Xamount * 133f; + lastYmv[index] = Yamount * 133f; + cursorPos.x -= avg(lastXmv); + cursorPos.y -= avg(lastYmv); + Vector2f maxsize = getVREnvironment().getVRGUIManager().getCanvasSize(); + + if( cursorPos.x > maxsize.x ){ + cursorPos.x = maxsize.x; + } + + if( cursorPos.x < 0f ){ + cursorPos.x = 0f; + } + + if( cursorPos.y > maxsize.y ){ + cursorPos.y = maxsize.y; + } + + if( cursorPos.y < 0f ){ + cursorPos.y = 0f; + } + } + } else { + throw new IllegalStateException("This VR environment is not attached to any application."); + } + } else { + throw new IllegalStateException("This VR view manager is not attached to any VR environment."); + } + } + + private float avg(float[] arr) { + float amt = 0f; + for(float f : arr) amt += f; + return amt / arr.length; + } +} diff --git a/jme3-vr/src/main/java/com/jme3/input/vr/OpenVRTrackedController.java b/jme3-vr/src/main/java/com/jme3/input/vr/openvr/OpenVRTrackedController.java similarity index 84% rename from jme3-vr/src/main/java/com/jme3/input/vr/OpenVRTrackedController.java rename to jme3-vr/src/main/java/com/jme3/input/vr/openvr/OpenVRTrackedController.java index 026830604..ba9d06546 100644 --- a/jme3-vr/src/main/java/com/jme3/input/vr/OpenVRTrackedController.java +++ b/jme3-vr/src/main/java/com/jme3/input/vr/openvr/OpenVRTrackedController.java @@ -1,10 +1,16 @@ -package com.jme3.input.vr; +package com.jme3.input.vr.openvr; import com.jme3.app.VREnvironment; +import com.jme3.input.vr.VRTrackedController; import com.jme3.math.Matrix4f; import com.jme3.math.Quaternion; import com.jme3.math.Vector3f; +/** + * A controller that is tracked within the VR environment. Such a controller can provide its position within the VR space. + * @author Julien Seinturier - COMEX SA - http://www.seinturier.fr + * + */ public class OpenVRTrackedController implements VRTrackedController{ /** diff --git a/jme3-vr/src/main/java/com/jme3/util/VRViewManagerOpenVR.java b/jme3-vr/src/main/java/com/jme3/input/vr/openvr/OpenVRViewManager.java similarity index 95% rename from jme3-vr/src/main/java/com/jme3/util/VRViewManagerOpenVR.java rename to jme3-vr/src/main/java/com/jme3/input/vr/openvr/OpenVRViewManager.java index 545754a59..f4bdc920b 100644 --- a/jme3-vr/src/main/java/com/jme3/util/VRViewManagerOpenVR.java +++ b/jme3-vr/src/main/java/com/jme3/input/vr/openvr/OpenVRViewManager.java @@ -2,12 +2,11 @@ * To change this template, choose Tools | Templates * and open the template in the editor. */ -package com.jme3.util; +package com.jme3.input.vr.openvr; import com.jme3.app.VREnvironment; -import com.jme3.input.vr.OpenVR; +import com.jme3.input.vr.AbstractVRViewManager; import com.jme3.input.vr.VRAPI; -import com.jme3.input.vr.VRTrackedController; import com.jme3.material.Material; import com.jme3.math.ColorRGBA; import com.jme3.math.Quaternion; @@ -32,6 +31,7 @@ import com.jme3.texture.Image; import com.jme3.texture.Texture; import com.jme3.texture.Texture2D; import com.jme3.ui.Picture; +import com.jme3.util.VRGUIPositioningMode; import java.util.Iterator; import java.util.logging.Logger; @@ -39,11 +39,11 @@ import java.util.logging.Logger; /** * A VR view manager based on OpenVR. This class enable to submit 3D views to the VR compositor. * @author reden - phr00t - https://github.com/phr00t - * @author Julien Seinturier - (c) 2016 - JOrigin project - http:/www.jorigin.org + * @author Julien Seinturier - COMEX SA - http://www.seinturier.fr */ -public class VRViewManagerOpenVR extends AbstractVRViewManager { +public class OpenVRViewManager extends AbstractVRViewManager { - private static final Logger logger = Logger.getLogger(VRViewManagerOpenVR.class.getName()); + private static final Logger logger = Logger.getLogger(OpenVRViewManager.class.getName()); // OpenVR values private VRTextureBounds_t leftTextureBounds; @@ -64,7 +64,7 @@ public class VRViewManagerOpenVR extends AbstractVRViewManager { * Create a new VR view manager attached to the given {@link VREnvironment VR environment}. * @param environment the {@link VREnvironment VR environment} to which this view manager is attached. */ - public VRViewManagerOpenVR(VREnvironment environment){ + public OpenVRViewManager(VREnvironment environment){ this.environment = environment; } @@ -168,6 +168,11 @@ public class VRViewManagerOpenVR extends AbstractVRViewManager { } } + @Override + public void render() { + + } + @Override public void postRender() { @@ -464,7 +469,7 @@ public class VRViewManagerOpenVR extends AbstractVRViewManager { environment.getVRMouseManager().update(tpf); // update GUI position? - if( environment.getVRGUIManager().wantsReposition || environment.getVRGUIManager().getPositioningMode() != VRGUIPositioningMode.MANUAL ) { + if( environment.getVRGUIManager().isWantsReposition() || environment.getVRGUIManager().getPositioningMode() != VRGUIPositioningMode.MANUAL ) { environment.getVRGUIManager().positionGuiNow(tpf); environment.getVRGUIManager().updateGuiQuadGeometricState(); } @@ -492,12 +497,12 @@ public class VRViewManagerOpenVR extends AbstractVRViewManager { private void setupCamerasAndViews() { if (environment != null){ - // get desired frustrum from original camera + // get desired frustum from original camera Camera origCam = environment.getCamera(); float fFar = origCam.getFrustumFar(); float fNear = origCam.getFrustumNear(); - // restore frustrum on distortion scene cam, if needed + // restore frustum on distortion scene cam, if needed if( environment.isInstanceRendering() ) { leftCamera = origCam; } else if( environment.compositorAllowed() == false ) { diff --git a/jme3-vr/src/main/java/com/jme3/input/vr/OSVR.java b/jme3-vr/src/main/java/com/jme3/input/vr/osvr/OSVR.java similarity index 96% rename from jme3-vr/src/main/java/com/jme3/input/vr/OSVR.java rename to jme3-vr/src/main/java/com/jme3/input/vr/osvr/OSVR.java index ec56c1837..28d7aac06 100644 --- a/jme3-vr/src/main/java/com/jme3/input/vr/OSVR.java +++ b/jme3-vr/src/main/java/com/jme3/input/vr/osvr/OSVR.java @@ -7,9 +7,12 @@ https://github.com/sensics/OSVR-RenderManager/blob/master/examples/RenderManager - render manager looks good, but left eye seems stretched */ -package com.jme3.input.vr; +package com.jme3.input.vr.osvr; import com.jme3.app.VREnvironment; +import com.jme3.input.vr.HmdType; +import com.jme3.input.vr.VRAPI; +import com.jme3.input.vr.VRInputAPI; import com.jme3.math.Matrix4f; import com.jme3.math.Quaternion; import com.jme3.math.Vector2f; @@ -35,7 +38,7 @@ import java.util.logging.Logger; /** * A class that wraps an OSVR system. * @author reden - phr00t - https://github.com/phr00t - * @author Julien Seinturier - (c) 2016 - JOrigin project - http:/www.jorigin.org + * @author Julien Seinturier - COMEX SA - http://www.seinturier.fr */ public class OSVR implements VRAPI { diff --git a/jme3-vr/src/main/java/com/jme3/input/vr/OSVRInput.java b/jme3-vr/src/main/java/com/jme3/input/vr/osvr/OSVRInput.java similarity index 97% rename from jme3-vr/src/main/java/com/jme3/input/vr/OSVRInput.java rename to jme3-vr/src/main/java/com/jme3/input/vr/osvr/OSVRInput.java index 8d11f3a2e..ab18f6288 100644 --- a/jme3-vr/src/main/java/com/jme3/input/vr/OSVRInput.java +++ b/jme3-vr/src/main/java/com/jme3/input/vr/osvr/OSVRInput.java @@ -3,11 +3,14 @@ * To change this template file, choose Tools | Templates * and open the template in the editor. */ -package com.jme3.input.vr; +package com.jme3.input.vr.osvr; import java.util.logging.Logger; import com.jme3.app.VREnvironment; +import com.jme3.input.vr.VRInputAPI; +import com.jme3.input.vr.VRInputType; +import com.jme3.input.vr.VRTrackedController; import com.jme3.math.Quaternion; import com.jme3.math.Vector2f; import com.jme3.math.Vector3f; @@ -20,7 +23,6 @@ import com.jme3.system.osvr.osvrclientreporttypes.OSVR_ButtonReport; import com.jme3.system.osvr.osvrclientreporttypes.OSVR_Pose3; import com.jme3.system.osvr.osvrinterface.OsvrInterfaceLibrary; import com.jme3.system.osvr.osvrtimevalue.OSVR_TimeValue; -import com.jme3.util.VRViewManagerOSVR; import com.sun.jna.Callback; import com.sun.jna.Pointer; import com.sun.jna.ptr.PointerByReference; @@ -29,7 +31,7 @@ import com.sun.jna.ptr.PointerByReference; /** * A class that wraps an OSVR input. * @author reden - phr00t - https://github.com/phr00t - * @author Julien Seinturier - (c) 2016 - JOrigin project - http:/www.jorigin.org + * @author Julien Seinturier - COMEX SA - http://www.seinturier.fr */ public class OSVRInput implements VRInputAPI { @@ -301,7 +303,7 @@ public class OSVRInput implements VRInputAPI { @Override public Quaternion getFinalObserverRotation(int index) { - VRViewManagerOSVR vrvm = (VRViewManagerOSVR)environment.getVRViewManager(); + OSVRViewManager vrvm = (OSVRViewManager)environment.getVRViewManager(); if( vrvm == null || isInputDeviceTracking(index) == false ) return null; Object obs = environment.getObserver(); if( obs instanceof Camera ) { @@ -314,7 +316,7 @@ public class OSVRInput implements VRInputAPI { @Override public Vector3f getFinalObserverPosition(int index) { - VRViewManagerOSVR vrvm = (VRViewManagerOSVR) environment.getVRViewManager(); + OSVRViewManager vrvm = (OSVRViewManager) environment.getVRViewManager(); if( vrvm == null || isInputDeviceTracking(index) == false ) return null; Object obs = environment.getObserver(); Vector3f pos = getPosition(index); diff --git a/jme3-vr/src/main/java/com/jme3/input/vr/osvr/OSVRMouseManager.java b/jme3-vr/src/main/java/com/jme3/input/vr/osvr/OSVRMouseManager.java new file mode 100644 index 000000000..5b1c8635b --- /dev/null +++ b/jme3-vr/src/main/java/com/jme3/input/vr/osvr/OSVRMouseManager.java @@ -0,0 +1,108 @@ +package com.jme3.input.vr.osvr; + +import com.jme3.app.VREnvironment; +import com.jme3.input.controls.AnalogListener; +import com.jme3.input.vr.AbstractVRMouseManager; +import com.jme3.input.vr.VRInputType; +import com.jme3.math.Vector2f; + +/** + * A class dedicated to the mouse handling within OSVR based VR experience. + * @author Julien Seinturier - COMEX SA - http://www.seinturier.fr + */ +public class OSVRMouseManager extends AbstractVRMouseManager { + + private final int AVERAGE_AMNT = 4; + + private int avgCounter; + + private final float[] lastXmv = new float[AVERAGE_AMNT]; + + private final float[] lastYmv = new float[AVERAGE_AMNT]; + + /** + * Create a new VR mouse manager within the given {@link VREnvironment VR environment}. + * @param environment the VR environment of the mouse manager. + */ + public OSVRMouseManager(VREnvironment environment){ + super(environment); + } + + + @Override + public void updateAnalogAsMouse(int inputIndex, AnalogListener mouseListener, String mouseXName, String mouseYName, float tpf) { + + if (getVREnvironment() != null){ + if (getVREnvironment().getApplication() != null){ + // got a tracked controller to use as the "mouse" + if( getVREnvironment().isInVR() == false || + getVREnvironment().getVRinput() == null || + getVREnvironment().getVRinput().isInputDeviceTracking(inputIndex) == false ){ + return; + } + + Vector2f tpDelta; + // TODO option to use Touch joysticks + if( isThumbstickMode() ) { + tpDelta = getVREnvironment().getVRinput().getAxis(inputIndex, VRInputType.ViveTrackpadAxis); + } else { + tpDelta = getVREnvironment().getVRinput().getAxisDeltaSinceLastCall(inputIndex, VRInputType.ViveTrackpadAxis); + } + + float Xamount = (float)Math.pow(Math.abs(tpDelta.x) * getSpeedSensitivity(), getSpeedAcceleration()); + float Yamount = (float)Math.pow(Math.abs(tpDelta.y) * getSpeedSensitivity(), getSpeedAcceleration()); + + if( tpDelta.x < 0f ){ + Xamount = -Xamount; + } + + if( tpDelta.y < 0f ){ + Yamount = -Yamount; + } + + Xamount *= getMouseMoveScale(); + Yamount *= getMouseMoveScale(); + + if( mouseListener != null ) { + if( tpDelta.x != 0f && mouseXName != null ) mouseListener.onAnalog(mouseXName, Xamount * 0.2f, tpf); + if( tpDelta.y != 0f && mouseYName != null ) mouseListener.onAnalog(mouseYName, Yamount * 0.2f, tpf); + } + + if( getVREnvironment().getApplication().getInputManager().isCursorVisible() ) { + int index = (avgCounter+1) % AVERAGE_AMNT; + lastXmv[index] = Xamount * 133f; + lastYmv[index] = Yamount * 133f; + cursorPos.x -= avg(lastXmv); + cursorPos.y -= avg(lastYmv); + Vector2f maxsize = getVREnvironment().getVRGUIManager().getCanvasSize(); + + if( cursorPos.x > maxsize.x ){ + cursorPos.x = maxsize.x; + } + + if( cursorPos.x < 0f ){ + cursorPos.x = 0f; + } + + if( cursorPos.y > maxsize.y ){ + cursorPos.y = maxsize.y; + } + + if( cursorPos.y < 0f ){ + cursorPos.y = 0f; + } + } + } else { + throw new IllegalStateException("This VR environment is not attached to any application."); + } + } else { + throw new IllegalStateException("This VR view manager is not attached to any VR environment."); + } + } + + private float avg(float[] arr) { + float amt = 0f; + for(float f : arr) amt += f; + return amt / arr.length; + } +} diff --git a/jme3-vr/src/main/java/com/jme3/util/VRViewManagerOSVR.java b/jme3-vr/src/main/java/com/jme3/input/vr/osvr/OSVRViewManager.java similarity index 95% rename from jme3-vr/src/main/java/com/jme3/util/VRViewManagerOSVR.java rename to jme3-vr/src/main/java/com/jme3/input/vr/osvr/OSVRViewManager.java index 2019e6210..e3f1df53a 100644 --- a/jme3-vr/src/main/java/com/jme3/util/VRViewManagerOSVR.java +++ b/jme3-vr/src/main/java/com/jme3/input/vr/osvr/OSVRViewManager.java @@ -1,12 +1,13 @@ -package com.jme3.util; +package com.jme3.input.vr.osvr; import java.awt.GraphicsEnvironment; import java.util.Iterator; import java.util.logging.Logger; import com.jme3.app.VREnvironment; -import com.jme3.input.vr.OSVR; +import com.jme3.input.vr.AbstractVRViewManager; import com.jme3.input.vr.VRAPI; +import com.jme3.input.vr.openvr.OpenVRViewManager; import com.jme3.material.Material; import com.jme3.math.ColorRGBA; import com.jme3.math.Quaternion; @@ -44,11 +45,17 @@ import com.jme3.texture.Image; import com.jme3.texture.Texture; import com.jme3.texture.Texture2D; import com.jme3.ui.Picture; +import com.jme3.util.VRGUIPositioningMode; import com.sun.jna.Pointer; import com.sun.jna.ptr.PointerByReference; -public class VRViewManagerOSVR extends AbstractVRViewManager{ - private static final Logger logger = Logger.getLogger(VRViewManagerOpenVR.class.getName()); +/** + * + * @author Julien Seinturier - COMEX SA - http://www.seinturier.fr + * + */ +public class OSVRViewManager extends AbstractVRViewManager{ + private static final Logger logger = Logger.getLogger(OpenVRViewManager.class.getName()); // OpenVR values private Texture_t leftTextureType; @@ -75,7 +82,7 @@ public class VRViewManagerOSVR extends AbstractVRViewManager{ * Create a new VR view manager attached to the given {@link VREnvironment VR environment}. * @param environment the {@link VREnvironment VR environment} to which this view manager is attached. */ - public VRViewManagerOSVR(VREnvironment environment){ + public OSVRViewManager(VREnvironment environment){ this.environment = environment; } @@ -476,7 +483,7 @@ public class VRViewManagerOSVR extends AbstractVRViewManager{ environment.getVRMouseManager().update(tpf); // update GUI position? - if( environment.getVRGUIManager().wantsReposition || environment.getVRGUIManager().getPositioningMode() != VRGUIPositioningMode.MANUAL ) { + if( environment.getVRGUIManager().isWantsReposition() || environment.getVRGUIManager().getPositioningMode() != VRGUIPositioningMode.MANUAL ) { environment.getVRGUIManager().positionGuiNow(tpf); environment.getVRGUIManager().updateGuiQuadGeometricState(); } @@ -600,7 +607,7 @@ public class VRViewManagerOSVR extends AbstractVRViewManager{ if (environment != null){ if (environment.getApplication() != null){ - // get desired frustrum from original camera + // get desired frustum from original camera Camera origCam = environment.getCamera(); float fFar = origCam.getFrustumFar(); float fNear = origCam.getFrustumNear(); @@ -610,7 +617,7 @@ public class VRViewManagerOSVR extends AbstractVRViewManager{ ((OSVR)environment.getVRHardware()).getEyeInfo(); } - // restore frustrum on distortion scene cam, if needed + // restore frustum on distortion scene cam, if needed if( environment.isInstanceRendering() ) { leftCamera = origCam; } else if( environment.compositorAllowed() == false ) { @@ -864,5 +871,11 @@ public class VRViewManagerOSVR extends AbstractVRViewManager{ distortionMesh.setBuffer(VertexBuffer.Type.TexCoord3, 2, texcoordB); distortionMesh.setStatic(); return distortionMesh; - } + } + + @Override + public void render() { + // TODO Auto-generated method stub + + } } diff --git a/jme3-vr/src/main/java/com/jme3/post/CartoonSSAO.java b/jme3-vr/src/main/java/com/jme3/post/CartoonSSAO.java index cc3c36b09..e578e6e76 100644 --- a/jme3-vr/src/main/java/com/jme3/post/CartoonSSAO.java +++ b/jme3-vr/src/main/java/com/jme3/post/CartoonSSAO.java @@ -17,7 +17,7 @@ import com.jme3.texture.Image.Format; /** * A Cartoon Screen Space Ambient Occlusion filter with instance rendering capabilities. * @author reden - phr00t - https://github.com/phr00t - * @author Julien Seinturier - (c) 2016 - JOrigin project - http:/www.jorigin.org + * @author Julien Seinturier - COMEX SA - http://www.seinturier.fr * */ public class CartoonSSAO extends Filter{ diff --git a/jme3-vr/src/main/java/com/jme3/post/OpenVRFilter.java b/jme3-vr/src/main/java/com/jme3/post/OpenVRFilter.java deleted file mode 100644 index 61cf840ed..000000000 --- a/jme3-vr/src/main/java/com/jme3/post/OpenVRFilter.java +++ /dev/null @@ -1,210 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package com.jme3.post; - -import com.jme3.app.VRApplication; -import com.jme3.asset.AssetManager; -import com.jme3.material.Material; -import com.jme3.post.Filter; -import com.jme3.renderer.RenderManager; -import com.jme3.renderer.Renderer; -import com.jme3.renderer.ViewPort; -import com.jme3.scene.Mesh; -import com.jme3.scene.VertexBuffer; -import com.jme3.system.jopenvr.DistortionCoordinates_t; -import com.jme3.system.jopenvr.JOpenVRLibrary; -import com.jme3.system.jopenvr.VR_IVRSystem_FnTable; -import com.jme3.texture.FrameBuffer; - -/** - * DO NOT USE - * @author phr00t - * @deprecated DO NOT USE - */ -@Deprecated -public class OpenVRFilter extends Filter { - - private Mesh distortionMesh; - - private VRApplication application = null; - - /** - * DO NOT USE - * @param application the VR application. - */ - public OpenVRFilter(VRApplication application) { - this.application = application; - } - - /** - * DO NOT USE - * @return the distortion mesh. - */ - public Mesh getDistortionMesh() { - return distortionMesh; - } - - @Override - protected void initFilter(AssetManager manager, RenderManager renderManager, ViewPort vp, int w, int h) { - material = new Material(manager, "Common/MatDefs/VR/OpenVR.j3md"); - configureDistortionMesh(); - } - - @Override - protected Material getMaterial() { - return material; - - } - - @Override - protected void preFrame(float tpf) { - super.preFrame(tpf); - } - - @Override - protected void postFrame(RenderManager renderManager, ViewPort viewPort, FrameBuffer prevFilterBuffer, FrameBuffer sceneBuffer) { - super.postFrame(renderManager, viewPort, prevFilterBuffer, sceneBuffer); - } - - @Override - protected void postFilter(Renderer r, FrameBuffer buffer) { - super.postFilter(r, buffer); - } - - /* - function converted from: - https://github.com/ValveSoftware/openvr/blob/master/samples/hellovr_opengl/hellovr_opengl_main.cpp#L1335 - */ - private void configureDistortionMesh() { - float m_iLensGridSegmentCountH = 43, m_iLensGridSegmentCountV = 43; - - float w = 1f / m_iLensGridSegmentCountH - 1f; - float h = 1f / m_iLensGridSegmentCountV - 1f; - - float u, v; - - distortionMesh = new Mesh(); - float verts[] = new float[(int)(m_iLensGridSegmentCountV * m_iLensGridSegmentCountH) * 3]; - - float texcoordR[] = new float[(int)(m_iLensGridSegmentCountV * m_iLensGridSegmentCountH) * 2]; - float texcoordG[] = new float[(int)(m_iLensGridSegmentCountV * m_iLensGridSegmentCountH) * 2]; - float texcoordB[] = new float[(int)(m_iLensGridSegmentCountV * m_iLensGridSegmentCountH) * 2]; - - int vertPos = 0, coordPos = 0; - - //left eye distortion verts - float Xoffset = -1f; - for( int y=0; y vIndices; - int[] indices = new int[(int)((m_iLensGridSegmentCountV - 1) * (m_iLensGridSegmentCountH - 1)) * 6]; - int indexPos = 0; - int a,b,c,d; - - int offset = 0; - for( int y=0; yhttp:/www.jorigin.org + * @author Julien Seinturier - COMEX SA - http://www.seinturier.fr */ public class PreNormalCaching { diff --git a/jme3-vr/src/main/java/com/jme3/shadow/AbstractShadowFilterVR.java b/jme3-vr/src/main/java/com/jme3/shadow/AbstractShadowFilterVR.java index 00ab55319..9c6d355c9 100644 --- a/jme3-vr/src/main/java/com/jme3/shadow/AbstractShadowFilterVR.java +++ b/jme3-vr/src/main/java/com/jme3/shadow/AbstractShadowFilterVR.java @@ -1,7 +1,7 @@ package com.jme3.shadow; /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -55,7 +55,7 @@ import java.io.IOException; * * @author Rémy Bouquet aka Nehon * @author reden - phr00t - https://github.com/phr00t - * @author Julien Seinturier - (c) 2016 - JOrigin project - http:/www.jorigin.org + * @author Julien Seinturier - COMEX SA - http://www.seinturier.fr * @param the type of the underlying renderer (subclass of {@link AbstractShadowRendererVR}). */ public abstract class AbstractShadowFilterVR extends Filter { @@ -186,7 +186,7 @@ public abstract class AbstractShadowFilterVR } /** - * returns the shdaow intensity + * returns the shadow intensity * * @see #setShadowIntensity(float shadowIntensity) * @return shadowIntensity @@ -309,7 +309,7 @@ public abstract class AbstractShadowFilterVR /** - * Get the the edge filtering mode. + * Get the edge filtering mode. * @return the edge filtering mode. */ public EdgeFilteringMode getEdgeFilteringMode() { diff --git a/jme3-vr/src/main/java/com/jme3/shadow/AbstractShadowRendererVR.java b/jme3-vr/src/main/java/com/jme3/shadow/AbstractShadowRendererVR.java index 8c9fae742..296855e5a 100644 --- a/jme3-vr/src/main/java/com/jme3/shadow/AbstractShadowRendererVR.java +++ b/jme3-vr/src/main/java/com/jme3/shadow/AbstractShadowRendererVR.java @@ -1,7 +1,7 @@ package com.jme3.shadow; /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -71,7 +71,7 @@ import java.util.List; * * @author Rémy Bouquet aka Nehon * @author reden - phr00t - https://github.com/phr00t - * @author Julien Seinturier - (c) 2016 - JOrigin project - http:/www.jorigin.org + * @author Julien Seinturier - COMEX SA - http://www.seinturier.fr */ public abstract class AbstractShadowRendererVR implements SceneProcessor, Savable { @@ -487,7 +487,7 @@ public abstract class AbstractShadowRendererVR implements SceneProcessor, Savabl getReceivers(lightReceivers); if (lightReceivers.size() != 0) { - //setting params to recieving geometry list + //setting params to receiving geometry list setMatParams(lightReceivers); Camera cam = viewPort.getCamera(); diff --git a/jme3-vr/src/main/java/com/jme3/shadow/DirectionalLightShadowFilterVR.java b/jme3-vr/src/main/java/com/jme3/shadow/DirectionalLightShadowFilterVR.java index 30399999f..5cc149ea3 100644 --- a/jme3-vr/src/main/java/com/jme3/shadow/DirectionalLightShadowFilterVR.java +++ b/jme3-vr/src/main/java/com/jme3/shadow/DirectionalLightShadowFilterVR.java @@ -1,7 +1,7 @@ package com.jme3.shadow; /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -43,10 +43,10 @@ import java.io.IOException; /** * * This Filter does basically the same as a DirectionalLightShadowRenderer - * except it renders the post shadow pass as a fulscreen quad pass instead of a + * except it renders the post shadow pass as a fullscreen quad pass instead of a * geometry pass. It's mostly faster than PssmShadowRenderer as long as you have - * more than a about ten shadow recieving objects. The expense is the draw back - * that the shadow Recieve mode set on spatial is ignored. So basically all and + * more than a about ten shadow receiving objects. The expense is the draw back + * that the shadow Receive mode set on spatial is ignored. So basically all and * only objects that render depth in the scene receive shadows. See this post * for more details * http://jmonkeyengine.org/groups/general-2/forum/topic/silly-question-about-shadow-rendering/#post-191599 @@ -55,7 +55,7 @@ import java.io.IOException; * * @author Rémy Bouquet aka Nehon * @author reden - phr00t - https://github.com/phr00t - * @author Julien Seinturier - (c) 2016 - JOrigin project - http:/www.jorigin.org + * @author Julien Seinturier - COMEX SA - http://www.seinturier.fr */ public class DirectionalLightShadowFilterVR extends AbstractShadowFilterVR { @@ -106,7 +106,7 @@ public class DirectionalLightShadowFilterVR extends AbstractShadowFilterVRtrue
    ) - * This prevents shadows' edges to flicker when the camera moves + * Enables the stabilization of the shadow's edges. (default is true) + * This prevents shadow edges from flickering when the camera moves. * However it can lead to some shadow quality loss in some particular scenes. * @param stabilize true if the stabilization has to be enabled and false otherwise. * @see #isEnabledStabilization() diff --git a/jme3-vr/src/main/java/com/jme3/shadow/DirectionalLightShadowRendererVR.java b/jme3-vr/src/main/java/com/jme3/shadow/DirectionalLightShadowRendererVR.java index f9bdd1f59..6002b2e3a 100644 --- a/jme3-vr/src/main/java/com/jme3/shadow/DirectionalLightShadowRendererVR.java +++ b/jme3-vr/src/main/java/com/jme3/shadow/DirectionalLightShadowRendererVR.java @@ -1,7 +1,7 @@ package com.jme3.shadow; /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -47,23 +47,21 @@ import com.jme3.renderer.queue.GeometryList; import com.jme3.renderer.queue.RenderQueue; import com.jme3.scene.Node; import com.jme3.scene.Spatial; -import com.jme3.shadow.PssmShadowUtil; -import com.jme3.shadow.ShadowUtil; import java.io.IOException; /** - * DirectionalLightShadowRenderer renderer use Parrallel Split Shadow Mapping + * DirectionalLightShadowRenderer renderer use Parallel Split Shadow Mapping * technique (pssm)
    It splits the view frustum in several parts and compute * a shadow map for each one.
    splits are distributed so that the closer they * are from the camera, the smaller they are to maximize the resolution used of - * the shadow map.
    This result in a better quality shadow than standard + * the shadow map.
    This results in a better quality shadow than standard * shadow mapping.
    for more informations on this read this http://http.developer.nvidia.com/GPUGems3/gpugems3_ch10.html
    *

    * @author Rémy Bouquet aka Nehon * @author reden - phr00t - https://github.com/phr00t - * @author Julien Seinturier - (c) 2016 - JOrigin project - http:/www.jorigin.org + * @author Julien Seinturier - COMEX SA - http://www.seinturier.fr */ public class DirectionalLightShadowRendererVR extends AbstractShadowRendererVR { @@ -77,7 +75,7 @@ public class DirectionalLightShadowRendererVR extends AbstractShadowRendererVR { private boolean stabilize = true; /** - * Used for serialzation use + * Used for serialization use * DirectionalLightShadowRenderer#DirectionalLightShadowRenderer(AssetManager * assetManager, int shadowMapSize, int nbSplits) */ @@ -182,7 +180,7 @@ public class DirectionalLightShadowRendererVR extends AbstractShadowRendererVR { // update frustum points based on current camera and split ShadowUtil.updateFrustumPoints(viewPort.getCamera(), splitsArray[shadowMapIndex], splitsArray[shadowMapIndex + 1], 1.0f, points); - //Updating shadow cam with curent split frustra + //Updating shadow cam with current split frusta if (lightReceivers.size()==0) { for (Spatial scene : viewPort.getScenes()) { ShadowUtil.getGeometriesInCamFrustum(scene, viewPort.getCamera(), RenderQueue.ShadowMode.Receive, lightReceivers); @@ -231,7 +229,7 @@ public class DirectionalLightShadowRendererVR extends AbstractShadowRendererVR { } /** - * returns the labda parameter see #setLambda(float lambda) + * returns the lambda parameter see #setLambda(float lambda) * * @return lambda */ @@ -241,10 +239,10 @@ public class DirectionalLightShadowRendererVR extends AbstractShadowRendererVR { /** * Adjust the repartition of the different shadow maps in the shadow extend - * usualy goes from 0.0 to 1.0 + * usually goes from 0.0 to 1.0 * a low value give a more linear repartition resulting in a constant quality in the shadow over the extends, but near shadows could look very jagged * a high value give a more logarithmic repartition resulting in a high quality for near shadows, but the quality quickly decrease over the extend. - * the default value is set to 0.65f (theoric optimal value). + * the default value is set to 0.65f (theoretic optimal value). * @param lambda the lambda value. */ public void setLambda(float lambda) { @@ -260,8 +258,8 @@ public class DirectionalLightShadowRendererVR extends AbstractShadowRendererVR { } /** - * Enables the stabilization of the shadows's edges. (default is true) - * This prevents shadows' edges to flicker when the camera moves + * Enables the stabilization of the shadow's edges. (default is true) + * This prevents shadow edges from flickering when the camera moves. * However it can lead to some shadow quality loss in some particular scenes. * @param stabilize true if stabilization has to be enabled and false otherwise. */ diff --git a/jme3-vr/src/main/java/com/jme3/shadow/InstancedDirectionalShadowFilter.java b/jme3-vr/src/main/java/com/jme3/shadow/InstancedDirectionalShadowFilter.java index 1ad3cf85d..d3f079812 100644 --- a/jme3-vr/src/main/java/com/jme3/shadow/InstancedDirectionalShadowFilter.java +++ b/jme3-vr/src/main/java/com/jme3/shadow/InstancedDirectionalShadowFilter.java @@ -13,7 +13,7 @@ import com.jme3.renderer.Camera; /** * An instanced version of the {@link DirectionalLightShadowFilterVR directional light shadow filter} dedi. * @author reden - phr00t - https://github.com/phr00t - * @author Julien Seinturier - (c) 2016 - JOrigin project - http:/www.jorigin.org + * @author Julien Seinturier - COMEX SA - http://www.seinturier.fr */ public class InstancedDirectionalShadowFilter extends DirectionalLightShadowFilterVR { diff --git a/jme3-vr/src/main/java/com/jme3/shadow/VRDirectionalLightShadowRenderer.java b/jme3-vr/src/main/java/com/jme3/shadow/VRDirectionalLightShadowRenderer.java index d73d6d08a..759fdc42b 100644 --- a/jme3-vr/src/main/java/com/jme3/shadow/VRDirectionalLightShadowRenderer.java +++ b/jme3-vr/src/main/java/com/jme3/shadow/VRDirectionalLightShadowRenderer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -35,11 +35,11 @@ import com.jme3.asset.AssetManager; import com.jme3.shadow.DirectionalLightShadowRenderer; /** - * DirectionalLightShadowRenderer renderer use Parrallel Split Shadow Mapping + * DirectionalLightShadowRenderer renderer use Parallel Split Shadow Mapping * technique (pssm)
    It splits the view frustum in several parts and compute * a shadow map for each one.
    splits are distributed so that the closer they * are from the camera, the smaller they are to maximize the resolution used of - * the shadow map.
    This result in a better quality shadow than standard + * the shadow map.
    This results in a better quality shadow than standard * shadow mapping.
    for more informations on this read this http://http.developer.nvidia.com/GPUGems3/gpugems3_ch10.html
    *

    diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/AppOverrideKeys_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/AppOverrideKeys_t.java index 0c085466d..add3d5d9a 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/AppOverrideKeys_t.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/AppOverrideKeys_t.java @@ -4,7 +4,7 @@ import com.sun.jna.Structure; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:1133
    + * native declaration : headers\openvr_capi.h:1485
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/COpenVRContext.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/COpenVRContext.java index 0fd88b1ab..b57646031 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/COpenVRContext.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/COpenVRContext.java @@ -5,7 +5,7 @@ import com.sun.jna.ptr.IntByReference; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:1262
    + * native declaration : headers\openvr_capi.h:1670
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. @@ -71,11 +71,31 @@ public class COpenVRContext extends Structure { * C type : intptr_t */ public IntByReference m_pVRScreenshots; + /** + * class vr::IVRDriverManager *
    + * C type : intptr_t + */ + public IntByReference m_pVRDriverManager; + /** + * class vr::IVRInput *
    + * C type : intptr_t + */ + public IntByReference m_pVRInput; + /** + * class vr::IVRIOBuffer *
    + * C type : intptr_t + */ + public IntByReference m_pVRIOBuffer; + /** + * class vr::IVRSpatialAnchors *
    + * C type : intptr_t + */ + public IntByReference m_pVRSpatialAnchors; public COpenVRContext() { super(); } protected List getFieldOrder() { - return Arrays.asList("m_pVRSystem", "m_pVRChaperone", "m_pVRChaperoneSetup", "m_pVRCompositor", "m_pVROverlay", "m_pVRResources", "m_pVRRenderModels", "m_pVRExtendedDisplay", "m_pVRSettings", "m_pVRApplications", "m_pVRTrackedCamera", "m_pVRScreenshots"); + return Arrays.asList("m_pVRSystem", "m_pVRChaperone", "m_pVRChaperoneSetup", "m_pVRCompositor", "m_pVROverlay", "m_pVRResources", "m_pVRRenderModels", "m_pVRExtendedDisplay", "m_pVRSettings", "m_pVRApplications", "m_pVRTrackedCamera", "m_pVRScreenshots", "m_pVRDriverManager", "m_pVRInput", "m_pVRIOBuffer", "m_pVRSpatialAnchors"); } public COpenVRContext(Pointer peer) { super(peer); diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/CVRSettingHelper.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/CVRSettingHelper.java new file mode 100644 index 000000000..d2c37f9df --- /dev/null +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/CVRSettingHelper.java @@ -0,0 +1,42 @@ +package com.jme3.system.jopenvr; +import com.sun.jna.Pointer; +import com.sun.jna.Structure; +import com.sun.jna.ptr.IntByReference; +import java.util.Arrays; +import java.util.List; +/** + * native declaration : headers\openvr_capi.h:1592
    + * This file was autogenerated by JNAerator,
    + * a tool written by Olivier Chafik that uses a few opensource projects..
    + * For help, please visit NativeLibs4Java , Rococoa, or JNA. + */ +public class CVRSettingHelper extends Structure { + /** + * class vr::IVRSettings *
    + * C type : intptr_t + */ + public IntByReference m_pSettings; + public CVRSettingHelper() { + super(); + } + protected List getFieldOrder() { + return Arrays.asList("m_pSettings"); + } + /** + * @param m_pSettings class vr::IVRSettings *
    + * C type : intptr_t + */ + public CVRSettingHelper(IntByReference m_pSettings) { + super(); + this.m_pSettings = m_pSettings; + } + public CVRSettingHelper(Pointer peer) { + super(peer); + } + public static class ByReference extends CVRSettingHelper implements Structure.ByReference { + + }; + public static class ByValue extends CVRSettingHelper implements Structure.ByValue { + + }; +} diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/CameraVideoStreamFrameHeader_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/CameraVideoStreamFrameHeader_t.java index d519ad028..dd7f346f7 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/CameraVideoStreamFrameHeader_t.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/CameraVideoStreamFrameHeader_t.java @@ -4,7 +4,7 @@ import com.sun.jna.Structure; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:1127
    + * native declaration : headers\openvr_capi.h:1466
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/Compositor_CumulativeStats.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/Compositor_CumulativeStats.java index 285ac08e7..c2e741fa4 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/Compositor_CumulativeStats.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/Compositor_CumulativeStats.java @@ -4,7 +4,7 @@ import com.sun.jna.Structure; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:1176
    + * native declaration : headers\openvr_capi.h:1528
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/Compositor_FrameTiming.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/Compositor_FrameTiming.java index 3e4598d21..8157254c5 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/Compositor_FrameTiming.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/Compositor_FrameTiming.java @@ -4,7 +4,7 @@ import com.sun.jna.Structure; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:1159
    + * native declaration : headers\openvr_capi.h:1511
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/Compositor_OverlaySettings.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/Compositor_OverlaySettings.java index d9f72ea4b..ebc1e88b7 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/Compositor_OverlaySettings.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/Compositor_OverlaySettings.java @@ -4,7 +4,7 @@ import com.sun.jna.Structure; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:1117
    + * native declaration : headers\openvr_capi.h:1452
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/D3D12TextureData_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/D3D12TextureData_t.java index 60d2437e5..f6769e3e1 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/D3D12TextureData_t.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/D3D12TextureData_t.java @@ -6,7 +6,7 @@ import com.sun.jna.Structure; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:1003
    + * native declaration : headers\openvr_capi.h:1301
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/DistortionCoordinates_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/DistortionCoordinates_t.java index d57170895..e2f61e38d 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/DistortionCoordinates_t.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/DistortionCoordinates_t.java @@ -4,7 +4,7 @@ import com.sun.jna.Structure; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:954
    + * native declaration : headers\openvr_capi.h:1237
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/DriverDirectMode_FrameTiming.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/DriverDirectMode_FrameTiming.java new file mode 100644 index 000000000..ca52264ab --- /dev/null +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/DriverDirectMode_FrameTiming.java @@ -0,0 +1,41 @@ +package com.jme3.system.jopenvr; +import com.sun.jna.Pointer; +import com.sun.jna.Structure; +import java.util.Arrays; +import java.util.List; +/** + * native declaration : headers\openvr_capi.h:1473
    + * This file was autogenerated by JNAerator,
    + * a tool written by Olivier Chafik that uses a few opensource projects..
    + * For help, please visit NativeLibs4Java , Rococoa, or JNA. + */ +public class DriverDirectMode_FrameTiming extends Structure { + public int m_nSize; + public int m_nNumFramePresents; + public int m_nNumMisPresented; + public int m_nNumDroppedFrames; + public int m_nReprojectionFlags; + public DriverDirectMode_FrameTiming() { + super(); + } + protected List getFieldOrder() { + return Arrays.asList("m_nSize", "m_nNumFramePresents", "m_nNumMisPresented", "m_nNumDroppedFrames", "m_nReprojectionFlags"); + } + public DriverDirectMode_FrameTiming(int m_nSize, int m_nNumFramePresents, int m_nNumMisPresented, int m_nNumDroppedFrames, int m_nReprojectionFlags) { + super(); + this.m_nSize = m_nSize; + this.m_nNumFramePresents = m_nNumFramePresents; + this.m_nNumMisPresented = m_nNumMisPresented; + this.m_nNumDroppedFrames = m_nNumDroppedFrames; + this.m_nReprojectionFlags = m_nReprojectionFlags; + } + public DriverDirectMode_FrameTiming(Pointer peer) { + super(peer); + } + public static class ByReference extends DriverDirectMode_FrameTiming implements Structure.ByReference { + + }; + public static class ByValue extends DriverDirectMode_FrameTiming implements Structure.ByValue { + + }; +} diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/HiddenAreaMesh_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/HiddenAreaMesh_t.java index d8beaeb74..a1850de73 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/HiddenAreaMesh_t.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/HiddenAreaMesh_t.java @@ -4,7 +4,7 @@ import com.sun.jna.Structure; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:1090
    + * native declaration : headers\openvr_capi.h:1425
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/HmdColor_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/HmdColor_t.java index c0771cfce..78bedfbcf 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/HmdColor_t.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/HmdColor_t.java @@ -4,7 +4,7 @@ import com.sun.jna.Structure; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:938
    + * native declaration : headers\openvr_capi.h:1221
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/HmdMatrix33_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/HmdMatrix33_t.java new file mode 100644 index 000000000..df334358b --- /dev/null +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/HmdMatrix33_t.java @@ -0,0 +1,43 @@ +package com.jme3.system.jopenvr; +import com.sun.jna.Pointer; +import com.sun.jna.Structure; +import java.util.Arrays; +import java.util.List; +/** + * native declaration : headers\openvr_capi.h:1183
    + * This file was autogenerated by JNAerator,
    + * a tool written by Olivier Chafik that uses a few opensource projects..
    + * For help, please visit NativeLibs4Java , Rococoa, or JNA. + */ +public class HmdMatrix33_t extends Structure { + /** + * float[3][3]
    + * C type : float[3][3] + */ + public float[] m = new float[((3) * (3))]; + public HmdMatrix33_t() { + super(); + } + protected List getFieldOrder() { + return Arrays.asList("m"); + } + /** + * @param m float[3][3]
    + * C type : float[3][3] + */ + public HmdMatrix33_t(float m[]) { + super(); + if ((m.length != this.m.length)) + throw new IllegalArgumentException("Wrong array size !"); + this.m = m; + } + public HmdMatrix33_t(Pointer peer) { + super(peer); + } + public static class ByReference extends HmdMatrix33_t implements Structure.ByReference { + + }; + public static class ByValue extends HmdMatrix33_t implements Structure.ByValue { + + }; +} diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/HmdMatrix34_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/HmdMatrix34_t.java index f649a5f13..659393805 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/HmdMatrix34_t.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/HmdMatrix34_t.java @@ -4,7 +4,7 @@ import com.sun.jna.Structure; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:906
    + * native declaration : headers\openvr_capi.h:1179
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/HmdMatrix44_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/HmdMatrix44_t.java index 3422b1bf7..216aa7341 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/HmdMatrix44_t.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/HmdMatrix44_t.java @@ -4,7 +4,7 @@ import com.sun.jna.Structure; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:910
    + * native declaration : headers\openvr_capi.h:1187
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/HmdQuad_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/HmdQuad_t.java index 51565b92c..0142d8ef1 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/HmdQuad_t.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/HmdQuad_t.java @@ -4,7 +4,7 @@ import com.sun.jna.Structure; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:942
    + * native declaration : headers\openvr_capi.h:1225
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/HmdQuaternion_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/HmdQuaternion_t.java index f96ea2d8a..fb0073ee7 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/HmdQuaternion_t.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/HmdQuaternion_t.java @@ -4,7 +4,7 @@ import com.sun.jna.Structure; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:932
    + * native declaration : headers\openvr_capi.h:1209
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/HmdQuaternionf_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/HmdQuaternionf_t.java new file mode 100644 index 000000000..6a7b963d6 --- /dev/null +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/HmdQuaternionf_t.java @@ -0,0 +1,39 @@ +package com.jme3.system.jopenvr; +import com.sun.jna.Pointer; +import com.sun.jna.Structure; +import java.util.Arrays; +import java.util.List; +/** + * native declaration : headers\openvr_capi.h:1215
    + * This file was autogenerated by JNAerator,
    + * a tool written by Olivier Chafik that uses a few opensource projects..
    + * For help, please visit NativeLibs4Java , Rococoa, or JNA. + */ +public class HmdQuaternionf_t extends Structure { + public float w; + public float x; + public float y; + public float z; + public HmdQuaternionf_t() { + super(); + } + protected List getFieldOrder() { + return Arrays.asList("w", "x", "y", "z"); + } + public HmdQuaternionf_t(float w, float x, float y, float z) { + super(); + this.w = w; + this.x = x; + this.y = y; + this.z = z; + } + public HmdQuaternionf_t(Pointer peer) { + super(peer); + } + public static class ByReference extends HmdQuaternionf_t implements Structure.ByReference { + + }; + public static class ByValue extends HmdQuaternionf_t implements Structure.ByValue { + + }; +} diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/HmdRect2_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/HmdRect2_t.java index 24d144c10..210843deb 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/HmdRect2_t.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/HmdRect2_t.java @@ -4,7 +4,7 @@ import com.sun.jna.Structure; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:946
    + * native declaration : headers\openvr_capi.h:1229
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/HmdVector2_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/HmdVector2_t.java index 07980d03e..7a885d4c7 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/HmdVector2_t.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/HmdVector2_t.java @@ -4,7 +4,7 @@ import com.sun.jna.Structure; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:926
    + * native declaration : headers\openvr_capi.h:1203
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/HmdVector3_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/HmdVector3_t.java index 79b1aa023..ed87e6991 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/HmdVector3_t.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/HmdVector3_t.java @@ -4,7 +4,7 @@ import com.sun.jna.Structure; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:914
    + * native declaration : headers\openvr_capi.h:1191
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/HmdVector3d_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/HmdVector3d_t.java index 83f7cca24..1b1bfe2b9 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/HmdVector3d_t.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/HmdVector3d_t.java @@ -4,7 +4,7 @@ import com.sun.jna.Structure; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:922
    + * native declaration : headers\openvr_capi.h:1199
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/HmdVector4_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/HmdVector4_t.java index 7c13cb220..b022e05d6 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/HmdVector4_t.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/HmdVector4_t.java @@ -4,7 +4,7 @@ import com.sun.jna.Structure; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:918
    + * native declaration : headers\openvr_capi.h:1195
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/ImuSample_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/ImuSample_t.java new file mode 100644 index 000000000..799893d2e --- /dev/null +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/ImuSample_t.java @@ -0,0 +1,45 @@ +package com.jme3.system.jopenvr; +import com.sun.jna.Pointer; +import com.sun.jna.Structure; +import java.util.Arrays; +import java.util.List; +/** + * native declaration : headers\openvr_capi.h:1479
    + * This file was autogenerated by JNAerator,
    + * a tool written by Olivier Chafik that uses a few opensource projects..
    + * For help, please visit NativeLibs4Java , Rococoa, or JNA. + */ +public class ImuSample_t extends Structure { + public double fSampleTime; + /** C type : HmdVector3d_t */ + public HmdVector3d_t vAccel; + /** C type : HmdVector3d_t */ + public HmdVector3d_t vGyro; + public int unOffScaleFlags; + public ImuSample_t() { + super(); + } + protected List getFieldOrder() { + return Arrays.asList("fSampleTime", "vAccel", "vGyro", "unOffScaleFlags"); + } + /** + * @param vAccel C type : HmdVector3d_t
    + * @param vGyro C type : HmdVector3d_t + */ + public ImuSample_t(double fSampleTime, HmdVector3d_t vAccel, HmdVector3d_t vGyro, int unOffScaleFlags) { + super(); + this.fSampleTime = fSampleTime; + this.vAccel = vAccel; + this.vGyro = vGyro; + this.unOffScaleFlags = unOffScaleFlags; + } + public ImuSample_t(Pointer peer) { + super(peer); + } + public static class ByReference extends ImuSample_t implements Structure.ByReference { + + }; + public static class ByValue extends ImuSample_t implements Structure.ByValue { + + }; +} diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/InputAnalogActionData_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/InputAnalogActionData_t.java new file mode 100644 index 000000000..61fee6243 --- /dev/null +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/InputAnalogActionData_t.java @@ -0,0 +1,51 @@ +package com.jme3.system.jopenvr; +import com.sun.jna.Pointer; +import com.sun.jna.Structure; +import java.util.Arrays; +import java.util.List; +/** + * native declaration : headers\openvr_capi.h:1603
    + * This file was autogenerated by JNAerator,
    + * a tool written by Olivier Chafik that uses a few opensource projects..
    + * For help, please visit NativeLibs4Java , Rococoa, or JNA. + */ +public class InputAnalogActionData_t extends Structure { + public byte bActive; + /** C type : VRInputValueHandle_t */ + public long activeOrigin; + public float x; + public float y; + public float z; + public float deltaX; + public float deltaY; + public float deltaZ; + public float fUpdateTime; + public InputAnalogActionData_t() { + super(); + } + protected List getFieldOrder() { + return Arrays.asList("bActive", "activeOrigin", "x", "y", "z", "deltaX", "deltaY", "deltaZ", "fUpdateTime"); + } + /** @param activeOrigin C type : VRInputValueHandle_t */ + public InputAnalogActionData_t(byte bActive, long activeOrigin, float x, float y, float z, float deltaX, float deltaY, float deltaZ, float fUpdateTime) { + super(); + this.bActive = bActive; + this.activeOrigin = activeOrigin; + this.x = x; + this.y = y; + this.z = z; + this.deltaX = deltaX; + this.deltaY = deltaY; + this.deltaZ = deltaZ; + this.fUpdateTime = fUpdateTime; + } + public InputAnalogActionData_t(Pointer peer) { + super(peer); + } + public static class ByReference extends InputAnalogActionData_t implements Structure.ByReference { + + }; + public static class ByValue extends InputAnalogActionData_t implements Structure.ByValue { + + }; +} diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/InputDigitalActionData_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/InputDigitalActionData_t.java new file mode 100644 index 000000000..7325022ee --- /dev/null +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/InputDigitalActionData_t.java @@ -0,0 +1,43 @@ +package com.jme3.system.jopenvr; +import com.sun.jna.Pointer; +import com.sun.jna.Structure; +import java.util.Arrays; +import java.util.List; +/** + * native declaration : headers\openvr_capi.h:1610
    + * This file was autogenerated by JNAerator,
    + * a tool written by Olivier Chafik that uses a few opensource projects..
    + * For help, please visit NativeLibs4Java , Rococoa, or JNA. + */ +public class InputDigitalActionData_t extends Structure { + public byte bActive; + /** C type : VRInputValueHandle_t */ + public long activeOrigin; + public byte bState; + public byte bChanged; + public float fUpdateTime; + public InputDigitalActionData_t() { + super(); + } + protected List getFieldOrder() { + return Arrays.asList("bActive", "activeOrigin", "bState", "bChanged", "fUpdateTime"); + } + /** @param activeOrigin C type : VRInputValueHandle_t */ + public InputDigitalActionData_t(byte bActive, long activeOrigin, byte bState, byte bChanged, float fUpdateTime) { + super(); + this.bActive = bActive; + this.activeOrigin = activeOrigin; + this.bState = bState; + this.bChanged = bChanged; + this.fUpdateTime = fUpdateTime; + } + public InputDigitalActionData_t(Pointer peer) { + super(peer); + } + public static class ByReference extends InputDigitalActionData_t implements Structure.ByReference { + + }; + public static class ByValue extends InputDigitalActionData_t implements Structure.ByValue { + + }; +} diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/InputOriginInfo_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/InputOriginInfo_t.java new file mode 100644 index 000000000..f63555b8c --- /dev/null +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/InputOriginInfo_t.java @@ -0,0 +1,51 @@ +package com.jme3.system.jopenvr; +import com.sun.jna.Pointer; +import com.sun.jna.Structure; +import java.util.Arrays; +import java.util.List; +/** + * native declaration : headers\openvr_capi.h:1626
    + * This file was autogenerated by JNAerator,
    + * a tool written by Olivier Chafik that uses a few opensource projects..
    + * For help, please visit NativeLibs4Java , Rococoa, or JNA. + */ +public class InputOriginInfo_t extends Structure { + /** C type : VRInputValueHandle_t */ + public long devicePath; + /** C type : TrackedDeviceIndex_t */ + public int trackedDeviceIndex; + /** + * char[128]
    + * C type : char*[128] + */ + public Pointer[] rchRenderModelComponentName = new Pointer[128]; + public InputOriginInfo_t() { + super(); + } + protected List getFieldOrder() { + return Arrays.asList("devicePath", "trackedDeviceIndex", "rchRenderModelComponentName"); + } + /** + * @param devicePath C type : VRInputValueHandle_t
    + * @param trackedDeviceIndex C type : TrackedDeviceIndex_t
    + * @param rchRenderModelComponentName char[128]
    + * C type : char*[128] + */ + public InputOriginInfo_t(long devicePath, int trackedDeviceIndex, Pointer rchRenderModelComponentName[]) { + super(); + this.devicePath = devicePath; + this.trackedDeviceIndex = trackedDeviceIndex; + if ((rchRenderModelComponentName.length != this.rchRenderModelComponentName.length)) + throw new IllegalArgumentException("Wrong array size !"); + this.rchRenderModelComponentName = rchRenderModelComponentName; + } + public InputOriginInfo_t(Pointer peer) { + super(peer); + } + public static class ByReference extends InputOriginInfo_t implements Structure.ByReference { + + }; + public static class ByValue extends InputOriginInfo_t implements Structure.ByValue { + + }; +} diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/InputPoseActionData_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/InputPoseActionData_t.java new file mode 100644 index 000000000..747493078 --- /dev/null +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/InputPoseActionData_t.java @@ -0,0 +1,43 @@ +package com.jme3.system.jopenvr; +import com.sun.jna.Pointer; +import com.sun.jna.Structure; +import java.util.Arrays; +import java.util.List; +/** + * native declaration : headers\openvr_capi.h:1615
    + * This file was autogenerated by JNAerator,
    + * a tool written by Olivier Chafik that uses a few opensource projects..
    + * For help, please visit NativeLibs4Java , Rococoa, or JNA. + */ +public class InputPoseActionData_t extends Structure { + public byte bActive; + /** C type : VRInputValueHandle_t */ + public long activeOrigin; + /** C type : TrackedDevicePose_t */ + public TrackedDevicePose_t pose; + public InputPoseActionData_t() { + super(); + } + protected List getFieldOrder() { + return Arrays.asList("bActive", "activeOrigin", "pose"); + } + /** + * @param activeOrigin C type : VRInputValueHandle_t
    + * @param pose C type : TrackedDevicePose_t + */ + public InputPoseActionData_t(byte bActive, long activeOrigin, TrackedDevicePose_t pose) { + super(); + this.bActive = bActive; + this.activeOrigin = activeOrigin; + this.pose = pose; + } + public InputPoseActionData_t(Pointer peer) { + super(peer); + } + public static class ByReference extends InputPoseActionData_t implements Structure.ByReference { + + }; + public static class ByValue extends InputPoseActionData_t implements Structure.ByValue { + + }; +} diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/InputSkeletalActionData_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/InputSkeletalActionData_t.java new file mode 100644 index 000000000..d9d32b951 --- /dev/null +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/InputSkeletalActionData_t.java @@ -0,0 +1,39 @@ +package com.jme3.system.jopenvr; +import com.sun.jna.Pointer; +import com.sun.jna.Structure; +import java.util.Arrays; +import java.util.List; +/** + * native declaration : headers\openvr_capi.h:1620
    + * This file was autogenerated by JNAerator,
    + * a tool written by Olivier Chafik that uses a few opensource projects..
    + * For help, please visit NativeLibs4Java , Rococoa, or JNA. + */ +public class InputSkeletalActionData_t extends Structure { + public byte bActive; + /** C type : VRInputValueHandle_t */ + public long activeOrigin; + public int boneCount; + public InputSkeletalActionData_t() { + super(); + } + protected List getFieldOrder() { + return Arrays.asList("bActive", "activeOrigin", "boneCount"); + } + /** @param activeOrigin C type : VRInputValueHandle_t */ + public InputSkeletalActionData_t(byte bActive, long activeOrigin, int boneCount) { + super(); + this.bActive = bActive; + this.activeOrigin = activeOrigin; + this.boneCount = boneCount; + } + public InputSkeletalActionData_t(Pointer peer) { + super(peer); + } + public static class ByReference extends InputSkeletalActionData_t implements Structure.ByReference { + + }; + public static class ByValue extends InputSkeletalActionData_t implements Structure.ByValue { + + }; +} diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/IntersectionMaskCircle_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/IntersectionMaskCircle_t.java index ae463d988..631a127a9 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/IntersectionMaskCircle_t.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/IntersectionMaskCircle_t.java @@ -4,7 +4,7 @@ import com.sun.jna.Structure; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:1200
    + * native declaration : headers\openvr_capi.h:1552
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/IntersectionMaskRectangle_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/IntersectionMaskRectangle_t.java index bbbd2f5a1..bbb4c0f57 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/IntersectionMaskRectangle_t.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/IntersectionMaskRectangle_t.java @@ -4,7 +4,7 @@ import com.sun.jna.Structure; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:1195
    + * native declaration : headers\openvr_capi.h:1547
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/JOpenVRLibrary.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/JOpenVRLibrary.java index 6d1b7abfc..1cf9c869c 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/JOpenVRLibrary.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/JOpenVRLibrary.java @@ -5,1789 +5,2279 @@ import com.sun.jna.NativeLibrary; import com.sun.jna.Pointer; import com.sun.jna.PointerType; import com.sun.jna.ptr.IntByReference; + import java.nio.IntBuffer; +import java.util.logging.Logger; /** * JNA Wrapper for library JOpenVR
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. */ -public class JOpenVRLibrary implements Library { +public class JOpenVRLibrary implements Library { + private static final Logger logger = Logger.getLogger(JOpenVRLibrary.class.getName()); + + private static String JNA_LIBRARY_NAME; + private static NativeLibrary JNA_NATIVE_LIB; /** - * Get the version of the underlying OpenVR API.
    - * see https://github.com/ValveSoftware/openvr/tree/v1.0.6. + * The system property that specifies an implementation of OpenVR (openvr_api file) to use. + * This property has to be set at the program launch using -D connector. + * If this property is not set, the embedded library is loaded. */ - public static final String OPENVR_VERSION = "1.0.6"; + public static final String JNA_OPENVR_LIBRARY_PATH = "openvr.library.path"; /** - * Get the commit number of the underlying OpenVR API. - * see https://github.com/ValveSoftware/openvr/commit/7fa6470f2972970859f2395f1390f6d87d4b0fc3 + * Init the native binding to the underlying system library. + * @return true if the link is effective and false otherwise. */ - public static final String OPENVR_COMMIT = "7fa6470"; - - public static final String JNA_LIBRARY_NAME = "openvr_api"; - public static final NativeLibrary JNA_NATIVE_LIB = NativeLibrary.getInstance(JOpenVRLibrary.JNA_LIBRARY_NAME); - static { - Native.register(JOpenVRLibrary.class, JOpenVRLibrary.JNA_NATIVE_LIB); + public static void init() throws UnsatisfiedLinkError { + Native.unregister(JOpenVRLibrary.class); + + String path = System.getProperty(JNA_OPENVR_LIBRARY_PATH); + if (path != null){ + + JNA_LIBRARY_NAME = path; + + logger.config("Using OpenVR implementation located at "+JNA_LIBRARY_NAME); + + JNA_NATIVE_LIB = NativeLibrary.getInstance(JOpenVRLibrary.JNA_LIBRARY_NAME); + Native.register(JOpenVRLibrary.class, JOpenVRLibrary.JNA_NATIVE_LIB); + } else { + + JNA_LIBRARY_NAME = "openvr_api"; + + logger.config("Using embedded OpenVR implementation "+JOpenVRLibrary.JNA_LIBRARY_NAME); + + JNA_NATIVE_LIB = NativeLibrary.getInstance(JOpenVRLibrary.JNA_LIBRARY_NAME); + Native.register(JOpenVRLibrary.class, JOpenVRLibrary.JNA_NATIVE_LIB); + } } - - // OpenVR Constants - public static final int k_unMaxDriverDebugResponseSize = 32768; - public static final int k_unTrackedDeviceIndex_Hmd = 0; - public static final int k_unMaxTrackedDeviceCount = 16; - public static final long k_unTrackedDeviceIndexOther = 4294967294L; - public static final long k_unTrackedDeviceIndexInvalid = 4294967295L; - public static final long k_ulInvalidPropertyContainer = 0; - public static final int k_unInvalidPropertyTag = 0; - public static final int k_unFloatPropertyTag = 1; - public static final int k_unInt32PropertyTag = 2; - public static final int k_unUint64PropertyTag = 3; - public static final int k_unBoolPropertyTag = 4; - public static final int k_unStringPropertyTag = 5; - public static final int k_unHmdMatrix34PropertyTag = 20; - public static final int k_unHmdMatrix44PropertyTag = 21; - public static final int k_unHmdVector3PropertyTag = 22; - public static final int k_unHmdVector4PropertyTag = 23; - public static final int k_unHiddenAreaPropertyTag = 30; - public static final int k_unOpenVRInternalReserved_Start = 1000; - public static final int k_unOpenVRInternalReserved_End = 10000; - public static final int k_unMaxPropertyStringSize = 32768; - public static final int k_unControllerStateAxisCount = 5; - public static final long k_ulOverlayHandleInvalid = 0; - public static final int k_unScreenshotHandleInvalid = 0; - public static final int k_unMaxApplicationKeyLength = 128; - public static final String k_pch_MimeType_HomeApp = "vr/home"; - public static final String k_pch_MimeType_GameTheater = "vr/game_theater"; - public static final String IVRApplications_Version = "FnTable:IVRApplications_006"; - public static final int k_unVROverlayMaxKeyLength = 128; - public static final int k_unVROverlayMaxNameLength = 128; - public static final int k_unMaxOverlayCount = 64; - public static final int k_unMaxOverlayIntersectionMaskPrimitivesCount = 32; - public static final String IVROverlay_Version = "FnTable:IVROverlay_014"; - public static final String k_pch_Controller_Component_GDC2015 = "gdc2015"; - public static final String k_pch_Controller_Component_Base = "base"; - public static final String k_pch_Controller_Component_Tip = "tip"; - public static final String k_pch_Controller_Component_HandGrip = "handgrip"; - public static final String k_pch_Controller_Component_Status = "status"; - public static final String IVRRenderModels_Version = "FnTable:IVRRenderModels_005"; - public static final int k_unNotificationTextMaxSize = 256; - public static final String IVRNotifications_Version = "FnTable:IVRNotifications_002"; - public static final int k_unMaxSettingsKeyLength = 128; - public static final String IVRSettings_Version = "FnTable:IVRSettings_002"; - public static final String k_pch_SteamVR_Section = "steamvr"; - public static final String k_pch_SteamVR_RequireHmd_String = "requireHmd"; - public static final String k_pch_SteamVR_ForcedDriverKey_String = "forcedDriver"; - public static final String k_pch_SteamVR_ForcedHmdKey_String = "forcedHmd"; - public static final String k_pch_SteamVR_DisplayDebug_Bool = "displayDebug"; - public static final String k_pch_SteamVR_DebugProcessPipe_String = "debugProcessPipe"; - public static final String k_pch_SteamVR_EnableDistortion_Bool = "enableDistortion"; - public static final String k_pch_SteamVR_DisplayDebugX_Int32 = "displayDebugX"; - public static final String k_pch_SteamVR_DisplayDebugY_Int32 = "displayDebugY"; - public static final String k_pch_SteamVR_SendSystemButtonToAllApps_Bool = "sendSystemButtonToAllApps"; - public static final String k_pch_SteamVR_LogLevel_Int32 = "loglevel"; - public static final String k_pch_SteamVR_IPD_Float = "ipd"; - public static final String k_pch_SteamVR_Background_String = "background"; - public static final String k_pch_SteamVR_BackgroundUseDomeProjection_Bool = "backgroundUseDomeProjection"; - public static final String k_pch_SteamVR_BackgroundCameraHeight_Float = "backgroundCameraHeight"; - public static final String k_pch_SteamVR_BackgroundDomeRadius_Float = "backgroundDomeRadius"; - public static final String k_pch_SteamVR_GridColor_String = "gridColor"; - public static final String k_pch_SteamVR_PlayAreaColor_String = "playAreaColor"; - public static final String k_pch_SteamVR_ShowStage_Bool = "showStage"; - public static final String k_pch_SteamVR_ActivateMultipleDrivers_Bool = "activateMultipleDrivers"; - public static final String k_pch_SteamVR_DirectMode_Bool = "directMode"; - public static final String k_pch_SteamVR_DirectModeEdidVid_Int32 = "directModeEdidVid"; - public static final String k_pch_SteamVR_DirectModeEdidPid_Int32 = "directModeEdidPid"; - public static final String k_pch_SteamVR_UsingSpeakers_Bool = "usingSpeakers"; - public static final String k_pch_SteamVR_SpeakersForwardYawOffsetDegrees_Float = "speakersForwardYawOffsetDegrees"; - public static final String k_pch_SteamVR_BaseStationPowerManagement_Bool = "basestationPowerManagement"; - public static final String k_pch_SteamVR_NeverKillProcesses_Bool = "neverKillProcesses"; - public static final String k_pch_SteamVR_RenderTargetMultiplier_Float = "renderTargetMultiplier"; - public static final String k_pch_SteamVR_AllowAsyncReprojection_Bool = "allowAsyncReprojection"; - public static final String k_pch_SteamVR_AllowReprojection_Bool = "allowInterleavedReprojection"; - public static final String k_pch_SteamVR_ForceReprojection_Bool = "forceReprojection"; - public static final String k_pch_SteamVR_ForceFadeOnBadTracking_Bool = "forceFadeOnBadTracking"; - public static final String k_pch_SteamVR_DefaultMirrorView_Int32 = "defaultMirrorView"; - public static final String k_pch_SteamVR_ShowMirrorView_Bool = "showMirrorView"; - public static final String k_pch_SteamVR_MirrorViewGeometry_String = "mirrorViewGeometry"; - public static final String k_pch_SteamVR_StartMonitorFromAppLaunch = "startMonitorFromAppLaunch"; - public static final String k_pch_SteamVR_StartCompositorFromAppLaunch_Bool = "startCompositorFromAppLaunch"; - public static final String k_pch_SteamVR_StartDashboardFromAppLaunch_Bool = "startDashboardFromAppLaunch"; - public static final String k_pch_SteamVR_StartOverlayAppsFromDashboard_Bool = "startOverlayAppsFromDashboard"; - public static final String k_pch_SteamVR_EnableHomeApp = "enableHomeApp"; - public static final String k_pch_SteamVR_SetInitialDefaultHomeApp = "setInitialDefaultHomeApp"; - public static final String k_pch_SteamVR_CycleBackgroundImageTimeSec_Int32 = "CycleBackgroundImageTimeSec"; - public static final String k_pch_SteamVR_RetailDemo_Bool = "retailDemo"; - public static final String k_pch_SteamVR_IpdOffset_Float = "ipdOffset"; - public static final String k_pch_Lighthouse_Section = "driver_lighthouse"; - public static final String k_pch_Lighthouse_DisableIMU_Bool = "disableimu"; - public static final String k_pch_Lighthouse_UseDisambiguation_String = "usedisambiguation"; - public static final String k_pch_Lighthouse_DisambiguationDebug_Int32 = "disambiguationdebug"; - public static final String k_pch_Lighthouse_PrimaryBasestation_Int32 = "primarybasestation"; - public static final String k_pch_Lighthouse_DBHistory_Bool = "dbhistory"; - public static final String k_pch_Null_Section = "driver_null"; - public static final String k_pch_Null_SerialNumber_String = "serialNumber"; - public static final String k_pch_Null_ModelNumber_String = "modelNumber"; - public static final String k_pch_Null_WindowX_Int32 = "windowX"; - public static final String k_pch_Null_WindowY_Int32 = "windowY"; - public static final String k_pch_Null_WindowWidth_Int32 = "windowWidth"; - public static final String k_pch_Null_WindowHeight_Int32 = "windowHeight"; - public static final String k_pch_Null_RenderWidth_Int32 = "renderWidth"; - public static final String k_pch_Null_RenderHeight_Int32 = "renderHeight"; - public static final String k_pch_Null_SecondsFromVsyncToPhotons_Float = "secondsFromVsyncToPhotons"; - public static final String k_pch_Null_DisplayFrequency_Float = "displayFrequency"; - public static final String k_pch_UserInterface_Section = "userinterface"; - public static final String k_pch_UserInterface_StatusAlwaysOnTop_Bool = "StatusAlwaysOnTop"; - public static final String k_pch_UserInterface_MinimizeToTray_Bool = "MinimizeToTray"; - public static final String k_pch_UserInterface_Screenshots_Bool = "screenshots"; - public static final String k_pch_UserInterface_ScreenshotType_Int = "screenshotType"; - public static final String k_pch_Notifications_Section = "notifications"; - public static final String k_pch_Notifications_DoNotDisturb_Bool = "DoNotDisturb"; - public static final String k_pch_Keyboard_Section = "keyboard"; - public static final String k_pch_Keyboard_TutorialCompletions = "TutorialCompletions"; - public static final String k_pch_Keyboard_ScaleX = "ScaleX"; - public static final String k_pch_Keyboard_ScaleY = "ScaleY"; - public static final String k_pch_Keyboard_OffsetLeftX = "OffsetLeftX"; - public static final String k_pch_Keyboard_OffsetRightX = "OffsetRightX"; - public static final String k_pch_Keyboard_OffsetY = "OffsetY"; - public static final String k_pch_Keyboard_Smoothing = "Smoothing"; - public static final String k_pch_Perf_Section = "perfcheck"; - public static final String k_pch_Perf_HeuristicActive_Bool = "heuristicActive"; - public static final String k_pch_Perf_NotifyInHMD_Bool = "warnInHMD"; - public static final String k_pch_Perf_NotifyOnlyOnce_Bool = "warnOnlyOnce"; - public static final String k_pch_Perf_AllowTimingStore_Bool = "allowTimingStore"; - public static final String k_pch_Perf_SaveTimingsOnExit_Bool = "saveTimingsOnExit"; - public static final String k_pch_Perf_TestData_Float = "perfTestData"; - public static final String k_pch_CollisionBounds_Section = "collisionBounds"; - public static final String k_pch_CollisionBounds_Style_Int32 = "CollisionBoundsStyle"; - public static final String k_pch_CollisionBounds_GroundPerimeterOn_Bool = "CollisionBoundsGroundPerimeterOn"; - public static final String k_pch_CollisionBounds_CenterMarkerOn_Bool = "CollisionBoundsCenterMarkerOn"; - public static final String k_pch_CollisionBounds_PlaySpaceOn_Bool = "CollisionBoundsPlaySpaceOn"; - public static final String k_pch_CollisionBounds_FadeDistance_Float = "CollisionBoundsFadeDistance"; - public static final String k_pch_CollisionBounds_ColorGammaR_Int32 = "CollisionBoundsColorGammaR"; - public static final String k_pch_CollisionBounds_ColorGammaG_Int32 = "CollisionBoundsColorGammaG"; - public static final String k_pch_CollisionBounds_ColorGammaB_Int32 = "CollisionBoundsColorGammaB"; - public static final String k_pch_CollisionBounds_ColorGammaA_Int32 = "CollisionBoundsColorGammaA"; - public static final String k_pch_Camera_Section = "camera"; - public static final String k_pch_Camera_EnableCamera_Bool = "enableCamera"; - public static final String k_pch_Camera_EnableCameraInDashboard_Bool = "enableCameraInDashboard"; - public static final String k_pch_Camera_EnableCameraForCollisionBounds_Bool = "enableCameraForCollisionBounds"; - public static final String k_pch_Camera_EnableCameraForRoomView_Bool = "enableCameraForRoomView"; - public static final String k_pch_Camera_BoundsColorGammaR_Int32 = "cameraBoundsColorGammaR"; - public static final String k_pch_Camera_BoundsColorGammaG_Int32 = "cameraBoundsColorGammaG"; - public static final String k_pch_Camera_BoundsColorGammaB_Int32 = "cameraBoundsColorGammaB"; - public static final String k_pch_Camera_BoundsColorGammaA_Int32 = "cameraBoundsColorGammaA"; - public static final String k_pch_Camera_BoundsStrength_Int32 = "cameraBoundsStrength"; - public static final String k_pch_audio_Section = "audio"; - public static final String k_pch_audio_OnPlaybackDevice_String = "onPlaybackDevice"; - public static final String k_pch_audio_OnRecordDevice_String = "onRecordDevice"; - public static final String k_pch_audio_OnPlaybackMirrorDevice_String = "onPlaybackMirrorDevice"; - public static final String k_pch_audio_OffPlaybackDevice_String = "offPlaybackDevice"; - public static final String k_pch_audio_OffRecordDevice_String = "offRecordDevice"; - public static final String k_pch_audio_VIVEHDMIGain = "viveHDMIGain"; - public static final String k_pch_Power_Section = "power"; - public static final String k_pch_Power_PowerOffOnExit_Bool = "powerOffOnExit"; - public static final String k_pch_Power_TurnOffScreensTimeout_Float = "turnOffScreensTimeout"; - public static final String k_pch_Power_TurnOffControllersTimeout_Float = "turnOffControllersTimeout"; - public static final String k_pch_Power_ReturnToWatchdogTimeout_Float = "returnToWatchdogTimeout"; - public static final String k_pch_Power_AutoLaunchSteamVROnButtonPress = "autoLaunchSteamVROnButtonPress"; - public static final String k_pch_Dashboard_Section = "dashboard"; - public static final String k_pch_Dashboard_EnableDashboard_Bool = "enableDashboard"; - public static final String k_pch_Dashboard_ArcadeMode_Bool = "arcadeMode"; - public static final String k_pch_modelskin_Section = "modelskins"; - public static final String k_pch_Driver_Enable_Bool = "enable"; - - public static final String IVRSystem_Version = "FnTable:IVRSystem_015"; - public static final String IVRExtendedDisplay_Version = "FnTable:IVRExtendedDisplay_001"; - public static final String IVRTrackedCamera_Version = "FnTable:IVRTrackedCamera_003"; - public static final String IVRChaperone_Version = "FnTable:IVRChaperone_003"; - public static final String IVRChaperoneSetup_Version = "FnTable:IVRChaperoneSetup_005"; - //public static final String IVRCompositor_Version = "FnTable:IVRCompositor_020"; - public static final String IVRCompositor_Version = "FnTable:IVRCompositor_019"; - public static final String IVRScreenshots_Version = "FnTable:IVRScreenshots_001"; - public static final String IVRResources_Version = "FnTable:IVRResources_001"; - + /** + * Get the name of the underlying system library. + * @return the name of the underlying system library. + */ + public static String getSystemLibraryName(){ + return ""+JNA_LIBRARY_NAME; + } + /** - * native declaration : headers\openvr_capi.h:178
    + * native declaration : headers\openvr_capi.h:229
    * enum values */ public static interface EVREye { - /** native declaration : headers\openvr_capi.h:176 */ + /** native declaration : headers\openvr_capi.h:227 */ public static final int EVREye_Eye_Left = 0; - /** native declaration : headers\openvr_capi.h:177 */ + /** native declaration : headers\openvr_capi.h:228 */ public static final int EVREye_Eye_Right = 1; }; /** - * native declaration : headers\openvr_capi.h:185
    + * native declaration : headers\openvr_capi.h:239
    * enum values */ public static interface ETextureType { - /** native declaration : headers\openvr_capi.h:180 */ + /** native declaration : headers\openvr_capi.h:231 */ + public static final int ETextureType_TextureType_Invalid = -1; + /** native declaration : headers\openvr_capi.h:232 */ public static final int ETextureType_TextureType_DirectX = 0; - /** native declaration : headers\openvr_capi.h:181 */ + /** native declaration : headers\openvr_capi.h:233 */ public static final int ETextureType_TextureType_OpenGL = 1; - /** native declaration : headers\openvr_capi.h:182 */ + /** native declaration : headers\openvr_capi.h:234 */ public static final int ETextureType_TextureType_Vulkan = 2; - /** native declaration : headers\openvr_capi.h:183 */ + /** native declaration : headers\openvr_capi.h:235 */ public static final int ETextureType_TextureType_IOSurface = 3; - /** native declaration : headers\openvr_capi.h:184 */ + /** native declaration : headers\openvr_capi.h:236 */ public static final int ETextureType_TextureType_DirectX12 = 4; - }; - - - - + /** native declaration : headers\openvr_capi.h:237 */ + public static final int ETextureType_TextureType_DXGISharedHandle = 5; + /** native declaration : headers\openvr_capi.h:238 */ + public static final int ETextureType_TextureType_Metal = 6; + }; /** - * native declaration : headers\openvr_capi.h:190
    + * native declaration : headers\openvr_capi.h:244
    * enum values */ public static interface EColorSpace { - /** native declaration : headers\openvr_capi.h:187 */ + /** native declaration : headers\openvr_capi.h:241 */ public static final int EColorSpace_ColorSpace_Auto = 0; - /** native declaration : headers\openvr_capi.h:188 */ + /** native declaration : headers\openvr_capi.h:242 */ public static final int EColorSpace_ColorSpace_Gamma = 1; - /** native declaration : headers\openvr_capi.h:189 */ + /** native declaration : headers\openvr_capi.h:243 */ public static final int EColorSpace_ColorSpace_Linear = 2; - }; - - - + }; /** - * native declaration : headers\openvr_capi.h:197
    + * native declaration : headers\openvr_capi.h:251
    * enum values */ public static interface ETrackingResult { - /** native declaration : headers\openvr_capi.h:192 */ + /** native declaration : headers\openvr_capi.h:246 */ public static final int ETrackingResult_TrackingResult_Uninitialized = 1; - /** native declaration : headers\openvr_capi.h:193 */ + /** native declaration : headers\openvr_capi.h:247 */ public static final int ETrackingResult_TrackingResult_Calibrating_InProgress = 100; - /** native declaration : headers\openvr_capi.h:194 */ + /** native declaration : headers\openvr_capi.h:248 */ public static final int ETrackingResult_TrackingResult_Calibrating_OutOfRange = 101; - /** native declaration : headers\openvr_capi.h:195 */ + /** native declaration : headers\openvr_capi.h:249 */ public static final int ETrackingResult_TrackingResult_Running_OK = 200; - /** native declaration : headers\openvr_capi.h:196 */ + /** native declaration : headers\openvr_capi.h:250 */ public static final int ETrackingResult_TrackingResult_Running_OutOfRange = 201; }; /** - * native declaration : headers\openvr_capi.h:204
    + * native declaration : headers\openvr_capi.h:260
    * enum values */ public static interface ETrackedDeviceClass { - /** native declaration : headers\openvr_capi.h:199 */ + /** native declaration : headers\openvr_capi.h:253 */ public static final int ETrackedDeviceClass_TrackedDeviceClass_Invalid = 0; - /** native declaration : headers\openvr_capi.h:200 */ + /** native declaration : headers\openvr_capi.h:254 */ public static final int ETrackedDeviceClass_TrackedDeviceClass_HMD = 1; - /** native declaration : headers\openvr_capi.h:201 */ + /** native declaration : headers\openvr_capi.h:255 */ public static final int ETrackedDeviceClass_TrackedDeviceClass_Controller = 2; - /** native declaration : headers\openvr_capi.h:202 */ + /** native declaration : headers\openvr_capi.h:256 */ public static final int ETrackedDeviceClass_TrackedDeviceClass_GenericTracker = 3; - /** native declaration : headers\openvr_capi.h:203 */ + /** native declaration : headers\openvr_capi.h:257 */ public static final int ETrackedDeviceClass_TrackedDeviceClass_TrackingReference = 4; + /** native declaration : headers\openvr_capi.h:258 */ + public static final int ETrackedDeviceClass_TrackedDeviceClass_DisplayRedirect = 5; + /** native declaration : headers\openvr_capi.h:259 */ + public static final int ETrackedDeviceClass_TrackedDeviceClass_Max = 6; }; /** - * native declaration : headers\openvr_capi.h:209
    + * native declaration : headers\openvr_capi.h:267
    * enum values */ public static interface ETrackedControllerRole { - /** native declaration : headers\openvr_capi.h:206 */ + /** native declaration : headers\openvr_capi.h:262 */ public static final int ETrackedControllerRole_TrackedControllerRole_Invalid = 0; - /** native declaration : headers\openvr_capi.h:207 */ + /** native declaration : headers\openvr_capi.h:263 */ public static final int ETrackedControllerRole_TrackedControllerRole_LeftHand = 1; - /** native declaration : headers\openvr_capi.h:208 */ + /** native declaration : headers\openvr_capi.h:264 */ public static final int ETrackedControllerRole_TrackedControllerRole_RightHand = 2; + /** native declaration : headers\openvr_capi.h:265 */ + public static final int ETrackedControllerRole_TrackedControllerRole_OptOut = 3; + /** native declaration : headers\openvr_capi.h:266 */ + public static final int ETrackedControllerRole_TrackedControllerRole_Max = 4; }; /** - * native declaration : headers\openvr_capi.h:214
    + * native declaration : headers\openvr_capi.h:272
    * enum values */ public static interface ETrackingUniverseOrigin { - /** native declaration : headers\openvr_capi.h:211 */ + /** native declaration : headers\openvr_capi.h:269 */ public static final int ETrackingUniverseOrigin_TrackingUniverseSeated = 0; - /** native declaration : headers\openvr_capi.h:212 */ + /** native declaration : headers\openvr_capi.h:270 */ public static final int ETrackingUniverseOrigin_TrackingUniverseStanding = 1; - /** native declaration : headers\openvr_capi.h:213 */ + /** native declaration : headers\openvr_capi.h:271 */ public static final int ETrackingUniverseOrigin_TrackingUniverseRawAndUncalibrated = 2; }; /** - * The enumeration of tracked devices properties. + * native declaration : headers\openvr_capi.h:432
    + * enum values */ public static interface ETrackedDeviceProperty { - - /** - * An invalid property. - */ - public static final int ETrackedDeviceProperty_Prop_Invalid = 0; - - /** - * The tracking system name property (String). - */ - public static final int ETrackedDeviceProperty_Prop_TrackingSystemName_String = 1000; - - /** - * The tracking system model number property (String). - */ - public static final int ETrackedDeviceProperty_Prop_ModelNumber_String = 1001; - - /** - * The tracking system serial number property (String). - */ - public static final int ETrackedDeviceProperty_Prop_SerialNumber_String = 1002; - - /** - * The tracking system render model name property (String). - */ - public static final int ETrackedDeviceProperty_Prop_RenderModelName_String = 1003; - - /** - * The tracking system will drift in yaw property (bool). - */ - public static final int ETrackedDeviceProperty_Prop_WillDriftInYaw_Bool = 1004; - - /** - * The tracking system manufacturer name property (String). - */ - public static final int ETrackedDeviceProperty_Prop_ManufacturerName_String = 1005; - - /** - * The tracking system tracking firmware version property (String). - */ - public static final int ETrackedDeviceProperty_Prop_TrackingFirmwareVersion_String = 1006; - - /** - * The tracking system hardware revision property (String). - */ - public static final int ETrackedDeviceProperty_Prop_HardwareRevision_String = 1007; - - /** - * The tracking system all wireless dongle descriptions property (String). - */ + /** native declaration : headers\openvr_capi.h:274 */ + public static final int ETrackedDeviceProperty_Prop_Invalid = 0; + /** native declaration : headers\openvr_capi.h:275 */ + public static final int ETrackedDeviceProperty_Prop_TrackingSystemName_String = 1000; + /** native declaration : headers\openvr_capi.h:276 */ + public static final int ETrackedDeviceProperty_Prop_ModelNumber_String = 1001; + /** native declaration : headers\openvr_capi.h:277 */ + public static final int ETrackedDeviceProperty_Prop_SerialNumber_String = 1002; + /** native declaration : headers\openvr_capi.h:278 */ + public static final int ETrackedDeviceProperty_Prop_RenderModelName_String = 1003; + /** native declaration : headers\openvr_capi.h:279 */ + public static final int ETrackedDeviceProperty_Prop_WillDriftInYaw_Bool = 1004; + /** native declaration : headers\openvr_capi.h:280 */ + public static final int ETrackedDeviceProperty_Prop_ManufacturerName_String = 1005; + /** native declaration : headers\openvr_capi.h:281 */ + public static final int ETrackedDeviceProperty_Prop_TrackingFirmwareVersion_String = 1006; + /** native declaration : headers\openvr_capi.h:282 */ + public static final int ETrackedDeviceProperty_Prop_HardwareRevision_String = 1007; + /** native declaration : headers\openvr_capi.h:283 */ public static final int ETrackedDeviceProperty_Prop_AllWirelessDongleDescriptions_String = 1008; - /** native declaration : headers\openvr_capi.h:226 */ + /** native declaration : headers\openvr_capi.h:284 */ public static final int ETrackedDeviceProperty_Prop_ConnectedWirelessDongle_String = 1009; - /** native declaration : headers\openvr_capi.h:227 */ + /** native declaration : headers\openvr_capi.h:285 */ public static final int ETrackedDeviceProperty_Prop_DeviceIsWireless_Bool = 1010; - /** native declaration : headers\openvr_capi.h:228 */ + /** native declaration : headers\openvr_capi.h:286 */ public static final int ETrackedDeviceProperty_Prop_DeviceIsCharging_Bool = 1011; - /** native declaration : headers\openvr_capi.h:229 */ + /** native declaration : headers\openvr_capi.h:287 */ public static final int ETrackedDeviceProperty_Prop_DeviceBatteryPercentage_Float = 1012; - /** native declaration : headers\openvr_capi.h:230 */ + /** native declaration : headers\openvr_capi.h:288 */ public static final int ETrackedDeviceProperty_Prop_StatusDisplayTransform_Matrix34 = 1013; - /** native declaration : headers\openvr_capi.h:231 */ + /** native declaration : headers\openvr_capi.h:289 */ public static final int ETrackedDeviceProperty_Prop_Firmware_UpdateAvailable_Bool = 1014; - /** native declaration : headers\openvr_capi.h:232 */ + /** native declaration : headers\openvr_capi.h:290 */ public static final int ETrackedDeviceProperty_Prop_Firmware_ManualUpdate_Bool = 1015; - /** native declaration : headers\openvr_capi.h:233 */ + /** native declaration : headers\openvr_capi.h:291 */ public static final int ETrackedDeviceProperty_Prop_Firmware_ManualUpdateURL_String = 1016; - /** native declaration : headers\openvr_capi.h:234 */ + /** native declaration : headers\openvr_capi.h:292 */ public static final int ETrackedDeviceProperty_Prop_HardwareRevision_Uint64 = 1017; - /** native declaration : headers\openvr_capi.h:235 */ + /** native declaration : headers\openvr_capi.h:293 */ public static final int ETrackedDeviceProperty_Prop_FirmwareVersion_Uint64 = 1018; - /** native declaration : headers\openvr_capi.h:236 */ + /** native declaration : headers\openvr_capi.h:294 */ public static final int ETrackedDeviceProperty_Prop_FPGAVersion_Uint64 = 1019; - /** native declaration : headers\openvr_capi.h:237 */ + /** native declaration : headers\openvr_capi.h:295 */ public static final int ETrackedDeviceProperty_Prop_VRCVersion_Uint64 = 1020; - /** native declaration : headers\openvr_capi.h:238 */ + /** native declaration : headers\openvr_capi.h:296 */ public static final int ETrackedDeviceProperty_Prop_RadioVersion_Uint64 = 1021; - /** native declaration : headers\openvr_capi.h:239 */ + /** native declaration : headers\openvr_capi.h:297 */ public static final int ETrackedDeviceProperty_Prop_DongleVersion_Uint64 = 1022; - /** native declaration : headers\openvr_capi.h:240 */ + /** native declaration : headers\openvr_capi.h:298 */ public static final int ETrackedDeviceProperty_Prop_BlockServerShutdown_Bool = 1023; - /** native declaration : headers\openvr_capi.h:241 */ + /** native declaration : headers\openvr_capi.h:299 */ public static final int ETrackedDeviceProperty_Prop_CanUnifyCoordinateSystemWithHmd_Bool = 1024; - /** native declaration : headers\openvr_capi.h:242 */ + /** native declaration : headers\openvr_capi.h:300 */ public static final int ETrackedDeviceProperty_Prop_ContainsProximitySensor_Bool = 1025; - /** native declaration : headers\openvr_capi.h:243 */ + /** native declaration : headers\openvr_capi.h:301 */ public static final int ETrackedDeviceProperty_Prop_DeviceProvidesBatteryStatus_Bool = 1026; - /** native declaration : headers\openvr_capi.h:244 */ + /** native declaration : headers\openvr_capi.h:302 */ public static final int ETrackedDeviceProperty_Prop_DeviceCanPowerOff_Bool = 1027; - /** native declaration : headers\openvr_capi.h:245 */ + /** native declaration : headers\openvr_capi.h:303 */ public static final int ETrackedDeviceProperty_Prop_Firmware_ProgrammingTarget_String = 1028; - /** native declaration : headers\openvr_capi.h:246 */ + /** native declaration : headers\openvr_capi.h:304 */ public static final int ETrackedDeviceProperty_Prop_DeviceClass_Int32 = 1029; - /** native declaration : headers\openvr_capi.h:247 */ + /** native declaration : headers\openvr_capi.h:305 */ public static final int ETrackedDeviceProperty_Prop_HasCamera_Bool = 1030; - /** native declaration : headers\openvr_capi.h:248 */ + /** native declaration : headers\openvr_capi.h:306 */ public static final int ETrackedDeviceProperty_Prop_DriverVersion_String = 1031; - /** native declaration : headers\openvr_capi.h:249 */ + /** native declaration : headers\openvr_capi.h:307 */ public static final int ETrackedDeviceProperty_Prop_Firmware_ForceUpdateRequired_Bool = 1032; - /** native declaration : headers\openvr_capi.h:250 */ + /** native declaration : headers\openvr_capi.h:308 */ public static final int ETrackedDeviceProperty_Prop_ViveSystemButtonFixRequired_Bool = 1033; - /** native declaration : headers\openvr_capi.h:251 */ + /** native declaration : headers\openvr_capi.h:309 */ public static final int ETrackedDeviceProperty_Prop_ParentDriver_Uint64 = 1034; - /** native declaration : headers\openvr_capi.h:252 */ + /** native declaration : headers\openvr_capi.h:310 */ + public static final int ETrackedDeviceProperty_Prop_ResourceRoot_String = 1035; + /** native declaration : headers\openvr_capi.h:311 */ + public static final int ETrackedDeviceProperty_Prop_RegisteredDeviceType_String = 1036; + /** native declaration : headers\openvr_capi.h:312 */ + public static final int ETrackedDeviceProperty_Prop_InputProfilePath_String = 1037; + /** native declaration : headers\openvr_capi.h:313 */ + public static final int ETrackedDeviceProperty_Prop_NeverTracked_Bool = 1038; + /** native declaration : headers\openvr_capi.h:314 */ + public static final int ETrackedDeviceProperty_Prop_NumCameras_Int32 = 1039; + /** native declaration : headers\openvr_capi.h:315 */ + public static final int ETrackedDeviceProperty_Prop_CameraFrameLayout_Int32 = 1040; + /** native declaration : headers\openvr_capi.h:316 */ public static final int ETrackedDeviceProperty_Prop_ReportsTimeSinceVSync_Bool = 2000; - /** native declaration : headers\openvr_capi.h:253 */ + /** native declaration : headers\openvr_capi.h:317 */ public static final int ETrackedDeviceProperty_Prop_SecondsFromVsyncToPhotons_Float = 2001; - /** native declaration : headers\openvr_capi.h:254 */ + /** native declaration : headers\openvr_capi.h:318 */ public static final int ETrackedDeviceProperty_Prop_DisplayFrequency_Float = 2002; - /** native declaration : headers\openvr_capi.h:255 */ + /** native declaration : headers\openvr_capi.h:319 */ public static final int ETrackedDeviceProperty_Prop_UserIpdMeters_Float = 2003; - /** native declaration : headers\openvr_capi.h:256 */ + /** native declaration : headers\openvr_capi.h:320 */ public static final int ETrackedDeviceProperty_Prop_CurrentUniverseId_Uint64 = 2004; - /** native declaration : headers\openvr_capi.h:257 */ + /** native declaration : headers\openvr_capi.h:321 */ public static final int ETrackedDeviceProperty_Prop_PreviousUniverseId_Uint64 = 2005; - /** native declaration : headers\openvr_capi.h:258 */ + /** native declaration : headers\openvr_capi.h:322 */ public static final int ETrackedDeviceProperty_Prop_DisplayFirmwareVersion_Uint64 = 2006; - /** native declaration : headers\openvr_capi.h:259 */ + /** native declaration : headers\openvr_capi.h:323 */ public static final int ETrackedDeviceProperty_Prop_IsOnDesktop_Bool = 2007; - /** native declaration : headers\openvr_capi.h:260 */ + /** native declaration : headers\openvr_capi.h:324 */ public static final int ETrackedDeviceProperty_Prop_DisplayMCType_Int32 = 2008; - /** native declaration : headers\openvr_capi.h:261 */ + /** native declaration : headers\openvr_capi.h:325 */ public static final int ETrackedDeviceProperty_Prop_DisplayMCOffset_Float = 2009; - /** native declaration : headers\openvr_capi.h:262 */ + /** native declaration : headers\openvr_capi.h:326 */ public static final int ETrackedDeviceProperty_Prop_DisplayMCScale_Float = 2010; - /** native declaration : headers\openvr_capi.h:263 */ + /** native declaration : headers\openvr_capi.h:327 */ public static final int ETrackedDeviceProperty_Prop_EdidVendorID_Int32 = 2011; - /** native declaration : headers\openvr_capi.h:264 */ + /** native declaration : headers\openvr_capi.h:328 */ public static final int ETrackedDeviceProperty_Prop_DisplayMCImageLeft_String = 2012; - /** native declaration : headers\openvr_capi.h:265 */ + /** native declaration : headers\openvr_capi.h:329 */ public static final int ETrackedDeviceProperty_Prop_DisplayMCImageRight_String = 2013; - /** native declaration : headers\openvr_capi.h:266 */ + /** native declaration : headers\openvr_capi.h:330 */ public static final int ETrackedDeviceProperty_Prop_DisplayGCBlackClamp_Float = 2014; - /** native declaration : headers\openvr_capi.h:267 */ + /** native declaration : headers\openvr_capi.h:331 */ public static final int ETrackedDeviceProperty_Prop_EdidProductID_Int32 = 2015; - /** native declaration : headers\openvr_capi.h:268 */ + /** native declaration : headers\openvr_capi.h:332 */ public static final int ETrackedDeviceProperty_Prop_CameraToHeadTransform_Matrix34 = 2016; - /** native declaration : headers\openvr_capi.h:269 */ + /** native declaration : headers\openvr_capi.h:333 */ public static final int ETrackedDeviceProperty_Prop_DisplayGCType_Int32 = 2017; - /** native declaration : headers\openvr_capi.h:270 */ + /** native declaration : headers\openvr_capi.h:334 */ public static final int ETrackedDeviceProperty_Prop_DisplayGCOffset_Float = 2018; - /** native declaration : headers\openvr_capi.h:271 */ + /** native declaration : headers\openvr_capi.h:335 */ public static final int ETrackedDeviceProperty_Prop_DisplayGCScale_Float = 2019; - /** native declaration : headers\openvr_capi.h:272 */ + /** native declaration : headers\openvr_capi.h:336 */ public static final int ETrackedDeviceProperty_Prop_DisplayGCPrescale_Float = 2020; - /** native declaration : headers\openvr_capi.h:273 */ + /** native declaration : headers\openvr_capi.h:337 */ public static final int ETrackedDeviceProperty_Prop_DisplayGCImage_String = 2021; - /** native declaration : headers\openvr_capi.h:274 */ + /** native declaration : headers\openvr_capi.h:338 */ public static final int ETrackedDeviceProperty_Prop_LensCenterLeftU_Float = 2022; - /** native declaration : headers\openvr_capi.h:275 */ + /** native declaration : headers\openvr_capi.h:339 */ public static final int ETrackedDeviceProperty_Prop_LensCenterLeftV_Float = 2023; - /** native declaration : headers\openvr_capi.h:276 */ + /** native declaration : headers\openvr_capi.h:340 */ public static final int ETrackedDeviceProperty_Prop_LensCenterRightU_Float = 2024; - /** native declaration : headers\openvr_capi.h:277 */ + /** native declaration : headers\openvr_capi.h:341 */ public static final int ETrackedDeviceProperty_Prop_LensCenterRightV_Float = 2025; - /** native declaration : headers\openvr_capi.h:278 */ + /** native declaration : headers\openvr_capi.h:342 */ public static final int ETrackedDeviceProperty_Prop_UserHeadToEyeDepthMeters_Float = 2026; - /** native declaration : headers\openvr_capi.h:279 */ + /** native declaration : headers\openvr_capi.h:343 */ public static final int ETrackedDeviceProperty_Prop_CameraFirmwareVersion_Uint64 = 2027; - /** native declaration : headers\openvr_capi.h:280 */ + /** native declaration : headers\openvr_capi.h:344 */ public static final int ETrackedDeviceProperty_Prop_CameraFirmwareDescription_String = 2028; - /** native declaration : headers\openvr_capi.h:281 */ + /** native declaration : headers\openvr_capi.h:345 */ public static final int ETrackedDeviceProperty_Prop_DisplayFPGAVersion_Uint64 = 2029; - /** native declaration : headers\openvr_capi.h:282 */ + /** native declaration : headers\openvr_capi.h:346 */ public static final int ETrackedDeviceProperty_Prop_DisplayBootloaderVersion_Uint64 = 2030; - /** native declaration : headers\openvr_capi.h:283 */ + /** native declaration : headers\openvr_capi.h:347 */ public static final int ETrackedDeviceProperty_Prop_DisplayHardwareVersion_Uint64 = 2031; - /** native declaration : headers\openvr_capi.h:284 */ + /** native declaration : headers\openvr_capi.h:348 */ public static final int ETrackedDeviceProperty_Prop_AudioFirmwareVersion_Uint64 = 2032; - /** native declaration : headers\openvr_capi.h:285 */ + /** native declaration : headers\openvr_capi.h:349 */ public static final int ETrackedDeviceProperty_Prop_CameraCompatibilityMode_Int32 = 2033; - /** native declaration : headers\openvr_capi.h:286 */ + /** native declaration : headers\openvr_capi.h:350 */ public static final int ETrackedDeviceProperty_Prop_ScreenshotHorizontalFieldOfViewDegrees_Float = 2034; - /** native declaration : headers\openvr_capi.h:287 */ + /** native declaration : headers\openvr_capi.h:351 */ public static final int ETrackedDeviceProperty_Prop_ScreenshotVerticalFieldOfViewDegrees_Float = 2035; - /** native declaration : headers\openvr_capi.h:288 */ + /** native declaration : headers\openvr_capi.h:352 */ public static final int ETrackedDeviceProperty_Prop_DisplaySuppressed_Bool = 2036; - /** native declaration : headers\openvr_capi.h:289 */ + /** native declaration : headers\openvr_capi.h:353 */ public static final int ETrackedDeviceProperty_Prop_DisplayAllowNightMode_Bool = 2037; - /** native declaration : headers\openvr_capi.h:290 */ + /** native declaration : headers\openvr_capi.h:354 */ public static final int ETrackedDeviceProperty_Prop_DisplayMCImageWidth_Int32 = 2038; - /** native declaration : headers\openvr_capi.h:291 */ + /** native declaration : headers\openvr_capi.h:355 */ public static final int ETrackedDeviceProperty_Prop_DisplayMCImageHeight_Int32 = 2039; - /** native declaration : headers\openvr_capi.h:292 */ + /** native declaration : headers\openvr_capi.h:356 */ public static final int ETrackedDeviceProperty_Prop_DisplayMCImageNumChannels_Int32 = 2040; - /** native declaration : headers\openvr_capi.h:293 */ + /** native declaration : headers\openvr_capi.h:357 */ public static final int ETrackedDeviceProperty_Prop_DisplayMCImageData_Binary = 2041; - /** native declaration : headers\openvr_capi.h:294 */ - public static final int ETrackedDeviceProperty_Prop_UsesDriverDirectMode_Bool = 2042; - /** native declaration : headers\openvr_capi.h:295 */ + /** native declaration : headers\openvr_capi.h:358 */ + public static final int ETrackedDeviceProperty_Prop_SecondsFromPhotonsToVblank_Float = 2042; + /** native declaration : headers\openvr_capi.h:359 */ + public static final int ETrackedDeviceProperty_Prop_DriverDirectModeSendsVsyncEvents_Bool = 2043; + /** native declaration : headers\openvr_capi.h:360 */ + public static final int ETrackedDeviceProperty_Prop_DisplayDebugMode_Bool = 2044; + /** native declaration : headers\openvr_capi.h:361 */ + public static final int ETrackedDeviceProperty_Prop_GraphicsAdapterLuid_Uint64 = 2045; + /** native declaration : headers\openvr_capi.h:362 */ + public static final int ETrackedDeviceProperty_Prop_DriverProvidedChaperonePath_String = 2048; + /** native declaration : headers\openvr_capi.h:363 */ + public static final int ETrackedDeviceProperty_Prop_ExpectedTrackingReferenceCount_Int32 = 2049; + /** native declaration : headers\openvr_capi.h:364 */ + public static final int ETrackedDeviceProperty_Prop_ExpectedControllerCount_Int32 = 2050; + /** native declaration : headers\openvr_capi.h:365 */ + public static final int ETrackedDeviceProperty_Prop_NamedIconPathControllerLeftDeviceOff_String = 2051; + /** native declaration : headers\openvr_capi.h:366 */ + public static final int ETrackedDeviceProperty_Prop_NamedIconPathControllerRightDeviceOff_String = 2052; + /** native declaration : headers\openvr_capi.h:367 */ + public static final int ETrackedDeviceProperty_Prop_NamedIconPathTrackingReferenceDeviceOff_String = 2053; + /** native declaration : headers\openvr_capi.h:368 */ + public static final int ETrackedDeviceProperty_Prop_DoNotApplyPrediction_Bool = 2054; + /** native declaration : headers\openvr_capi.h:369 */ + public static final int ETrackedDeviceProperty_Prop_CameraToHeadTransforms_Matrix34_Array = 2055; + /** native declaration : headers\openvr_capi.h:370 */ + public static final int ETrackedDeviceProperty_Prop_DistortionMeshResolution_Int32 = 2056; + /** native declaration : headers\openvr_capi.h:371 */ + public static final int ETrackedDeviceProperty_Prop_DriverIsDrawingControllers_Bool = 2057; + /** native declaration : headers\openvr_capi.h:372 */ + public static final int ETrackedDeviceProperty_Prop_DriverRequestsApplicationPause_Bool = 2058; + /** native declaration : headers\openvr_capi.h:373 */ + public static final int ETrackedDeviceProperty_Prop_DriverRequestsReducedRendering_Bool = 2059; + /** native declaration : headers\openvr_capi.h:374 */ + public static final int ETrackedDeviceProperty_Prop_MinimumIpdStepMeters_Float = 2060; + /** native declaration : headers\openvr_capi.h:375 */ + public static final int ETrackedDeviceProperty_Prop_AudioBridgeFirmwareVersion_Uint64 = 2061; + /** native declaration : headers\openvr_capi.h:376 */ + public static final int ETrackedDeviceProperty_Prop_ImageBridgeFirmwareVersion_Uint64 = 2062; + /** native declaration : headers\openvr_capi.h:377 */ + public static final int ETrackedDeviceProperty_Prop_ImuToHeadTransform_Matrix34 = 2063; + /** native declaration : headers\openvr_capi.h:378 */ + public static final int ETrackedDeviceProperty_Prop_ImuFactoryGyroBias_Vector3 = 2064; + /** native declaration : headers\openvr_capi.h:379 */ + public static final int ETrackedDeviceProperty_Prop_ImuFactoryGyroScale_Vector3 = 2065; + /** native declaration : headers\openvr_capi.h:380 */ + public static final int ETrackedDeviceProperty_Prop_ImuFactoryAccelerometerBias_Vector3 = 2066; + /** native declaration : headers\openvr_capi.h:381 */ + public static final int ETrackedDeviceProperty_Prop_ImuFactoryAccelerometerScale_Vector3 = 2067; + /** native declaration : headers\openvr_capi.h:382 */ + public static final int ETrackedDeviceProperty_Prop_ConfigurationIncludesLighthouse20Features_Bool = 2069; + /** native declaration : headers\openvr_capi.h:383 */ + public static final int ETrackedDeviceProperty_Prop_DriverRequestedMuraCorrectionMode_Int32 = 2200; + /** native declaration : headers\openvr_capi.h:384 */ + public static final int ETrackedDeviceProperty_Prop_DriverRequestedMuraFeather_InnerLeft_Int32 = 2201; + /** native declaration : headers\openvr_capi.h:385 */ + public static final int ETrackedDeviceProperty_Prop_DriverRequestedMuraFeather_InnerRight_Int32 = 2202; + /** native declaration : headers\openvr_capi.h:386 */ + public static final int ETrackedDeviceProperty_Prop_DriverRequestedMuraFeather_InnerTop_Int32 = 2203; + /** native declaration : headers\openvr_capi.h:387 */ + public static final int ETrackedDeviceProperty_Prop_DriverRequestedMuraFeather_InnerBottom_Int32 = 2204; + /** native declaration : headers\openvr_capi.h:388 */ + public static final int ETrackedDeviceProperty_Prop_DriverRequestedMuraFeather_OuterLeft_Int32 = 2205; + /** native declaration : headers\openvr_capi.h:389 */ + public static final int ETrackedDeviceProperty_Prop_DriverRequestedMuraFeather_OuterRight_Int32 = 2206; + /** native declaration : headers\openvr_capi.h:390 */ + public static final int ETrackedDeviceProperty_Prop_DriverRequestedMuraFeather_OuterTop_Int32 = 2207; + /** native declaration : headers\openvr_capi.h:391 */ + public static final int ETrackedDeviceProperty_Prop_DriverRequestedMuraFeather_OuterBottom_Int32 = 2208; + /** native declaration : headers\openvr_capi.h:392 */ public static final int ETrackedDeviceProperty_Prop_AttachedDeviceId_String = 3000; - /** native declaration : headers\openvr_capi.h:296 */ + /** native declaration : headers\openvr_capi.h:393 */ public static final int ETrackedDeviceProperty_Prop_SupportedButtons_Uint64 = 3001; - /** native declaration : headers\openvr_capi.h:297 */ + /** native declaration : headers\openvr_capi.h:394 */ public static final int ETrackedDeviceProperty_Prop_Axis0Type_Int32 = 3002; - /** native declaration : headers\openvr_capi.h:298 */ + /** native declaration : headers\openvr_capi.h:395 */ public static final int ETrackedDeviceProperty_Prop_Axis1Type_Int32 = 3003; - /** native declaration : headers\openvr_capi.h:299 */ + /** native declaration : headers\openvr_capi.h:396 */ public static final int ETrackedDeviceProperty_Prop_Axis2Type_Int32 = 3004; - /** native declaration : headers\openvr_capi.h:300 */ + /** native declaration : headers\openvr_capi.h:397 */ public static final int ETrackedDeviceProperty_Prop_Axis3Type_Int32 = 3005; - /** native declaration : headers\openvr_capi.h:301 */ + /** native declaration : headers\openvr_capi.h:398 */ public static final int ETrackedDeviceProperty_Prop_Axis4Type_Int32 = 3006; - /** native declaration : headers\openvr_capi.h:302 */ + /** native declaration : headers\openvr_capi.h:399 */ public static final int ETrackedDeviceProperty_Prop_ControllerRoleHint_Int32 = 3007; - /** native declaration : headers\openvr_capi.h:303 */ + /** native declaration : headers\openvr_capi.h:400 */ public static final int ETrackedDeviceProperty_Prop_FieldOfViewLeftDegrees_Float = 4000; - /** native declaration : headers\openvr_capi.h:304 */ + /** native declaration : headers\openvr_capi.h:401 */ public static final int ETrackedDeviceProperty_Prop_FieldOfViewRightDegrees_Float = 4001; - /** native declaration : headers\openvr_capi.h:305 */ + /** native declaration : headers\openvr_capi.h:402 */ public static final int ETrackedDeviceProperty_Prop_FieldOfViewTopDegrees_Float = 4002; - /** native declaration : headers\openvr_capi.h:306 */ + /** native declaration : headers\openvr_capi.h:403 */ public static final int ETrackedDeviceProperty_Prop_FieldOfViewBottomDegrees_Float = 4003; - /** native declaration : headers\openvr_capi.h:307 */ + /** native declaration : headers\openvr_capi.h:404 */ public static final int ETrackedDeviceProperty_Prop_TrackingRangeMinimumMeters_Float = 4004; - /** native declaration : headers\openvr_capi.h:308 */ + /** native declaration : headers\openvr_capi.h:405 */ public static final int ETrackedDeviceProperty_Prop_TrackingRangeMaximumMeters_Float = 4005; - /** native declaration : headers\openvr_capi.h:309 */ + /** native declaration : headers\openvr_capi.h:406 */ public static final int ETrackedDeviceProperty_Prop_ModeLabel_String = 4006; - /** native declaration : headers\openvr_capi.h:310 */ + /** native declaration : headers\openvr_capi.h:407 */ public static final int ETrackedDeviceProperty_Prop_IconPathName_String = 5000; - /** native declaration : headers\openvr_capi.h:311 */ + /** native declaration : headers\openvr_capi.h:408 */ public static final int ETrackedDeviceProperty_Prop_NamedIconPathDeviceOff_String = 5001; - /** native declaration : headers\openvr_capi.h:312 */ + /** native declaration : headers\openvr_capi.h:409 */ public static final int ETrackedDeviceProperty_Prop_NamedIconPathDeviceSearching_String = 5002; - /** native declaration : headers\openvr_capi.h:313 */ + /** native declaration : headers\openvr_capi.h:410 */ public static final int ETrackedDeviceProperty_Prop_NamedIconPathDeviceSearchingAlert_String = 5003; - /** native declaration : headers\openvr_capi.h:314 */ + /** native declaration : headers\openvr_capi.h:411 */ public static final int ETrackedDeviceProperty_Prop_NamedIconPathDeviceReady_String = 5004; - /** native declaration : headers\openvr_capi.h:315 */ + /** native declaration : headers\openvr_capi.h:412 */ public static final int ETrackedDeviceProperty_Prop_NamedIconPathDeviceReadyAlert_String = 5005; - /** native declaration : headers\openvr_capi.h:316 */ + /** native declaration : headers\openvr_capi.h:413 */ public static final int ETrackedDeviceProperty_Prop_NamedIconPathDeviceNotReady_String = 5006; - /** native declaration : headers\openvr_capi.h:317 */ + /** native declaration : headers\openvr_capi.h:414 */ public static final int ETrackedDeviceProperty_Prop_NamedIconPathDeviceStandby_String = 5007; - /** native declaration : headers\openvr_capi.h:318 */ + /** native declaration : headers\openvr_capi.h:415 */ public static final int ETrackedDeviceProperty_Prop_NamedIconPathDeviceAlertLow_String = 5008; - /** native declaration : headers\openvr_capi.h:319 */ + /** native declaration : headers\openvr_capi.h:416 */ public static final int ETrackedDeviceProperty_Prop_DisplayHiddenArea_Binary_Start = 5100; - /** native declaration : headers\openvr_capi.h:320 */ + /** native declaration : headers\openvr_capi.h:417 */ public static final int ETrackedDeviceProperty_Prop_DisplayHiddenArea_Binary_End = 5150; - /** native declaration : headers\openvr_capi.h:321 */ + /** native declaration : headers\openvr_capi.h:418 */ + public static final int ETrackedDeviceProperty_Prop_ParentContainer = 5151; + /** native declaration : headers\openvr_capi.h:419 */ public static final int ETrackedDeviceProperty_Prop_UserConfigPath_String = 6000; - /** native declaration : headers\openvr_capi.h:322 */ + /** native declaration : headers\openvr_capi.h:420 */ public static final int ETrackedDeviceProperty_Prop_InstallPath_String = 6001; - /** native declaration : headers\openvr_capi.h:323 */ + /** native declaration : headers\openvr_capi.h:421 */ + public static final int ETrackedDeviceProperty_Prop_HasDisplayComponent_Bool = 6002; + /** native declaration : headers\openvr_capi.h:422 */ + public static final int ETrackedDeviceProperty_Prop_HasControllerComponent_Bool = 6003; + /** native declaration : headers\openvr_capi.h:423 */ + public static final int ETrackedDeviceProperty_Prop_HasCameraComponent_Bool = 6004; + /** native declaration : headers\openvr_capi.h:424 */ + public static final int ETrackedDeviceProperty_Prop_HasDriverDirectModeComponent_Bool = 6005; + /** native declaration : headers\openvr_capi.h:425 */ + public static final int ETrackedDeviceProperty_Prop_HasVirtualDisplayComponent_Bool = 6006; + /** native declaration : headers\openvr_capi.h:426 */ + public static final int ETrackedDeviceProperty_Prop_HasSpatialAnchorsSupport_Bool = 6007; + /** native declaration : headers\openvr_capi.h:427 */ + public static final int ETrackedDeviceProperty_Prop_ControllerType_String = 7000; + /** native declaration : headers\openvr_capi.h:428 */ + public static final int ETrackedDeviceProperty_Prop_LegacyInputProfile_String = 7001; + /** native declaration : headers\openvr_capi.h:429 */ public static final int ETrackedDeviceProperty_Prop_VendorSpecific_Reserved_Start = 10000; - /** native declaration : headers\openvr_capi.h:324 */ + /** native declaration : headers\openvr_capi.h:430 */ public static final int ETrackedDeviceProperty_Prop_VendorSpecific_Reserved_End = 10999; + /** native declaration : headers\openvr_capi.h:431 */ + public static final int ETrackedDeviceProperty_Prop_TrackedDeviceProperty_Max = 1000000; }; /** - * native declaration : headers\openvr_capi.h:339
    + * native declaration : headers\openvr_capi.h:447
    * enum values */ public static interface ETrackedPropertyError { - /** native declaration : headers\openvr_capi.h:327 */ + /** native declaration : headers\openvr_capi.h:434 */ public static final int ETrackedPropertyError_TrackedProp_Success = 0; - /** native declaration : headers\openvr_capi.h:328 */ + /** native declaration : headers\openvr_capi.h:435 */ public static final int ETrackedPropertyError_TrackedProp_WrongDataType = 1; - /** native declaration : headers\openvr_capi.h:329 */ + /** native declaration : headers\openvr_capi.h:436 */ public static final int ETrackedPropertyError_TrackedProp_WrongDeviceClass = 2; - /** native declaration : headers\openvr_capi.h:330 */ + /** native declaration : headers\openvr_capi.h:437 */ public static final int ETrackedPropertyError_TrackedProp_BufferTooSmall = 3; - /** native declaration : headers\openvr_capi.h:331 */ + /** native declaration : headers\openvr_capi.h:438 */ public static final int ETrackedPropertyError_TrackedProp_UnknownProperty = 4; - /** native declaration : headers\openvr_capi.h:332 */ + /** native declaration : headers\openvr_capi.h:439 */ public static final int ETrackedPropertyError_TrackedProp_InvalidDevice = 5; - /** native declaration : headers\openvr_capi.h:333 */ + /** native declaration : headers\openvr_capi.h:440 */ public static final int ETrackedPropertyError_TrackedProp_CouldNotContactServer = 6; - /** native declaration : headers\openvr_capi.h:334 */ + /** native declaration : headers\openvr_capi.h:441 */ public static final int ETrackedPropertyError_TrackedProp_ValueNotProvidedByDevice = 7; - /** native declaration : headers\openvr_capi.h:335 */ + /** native declaration : headers\openvr_capi.h:442 */ public static final int ETrackedPropertyError_TrackedProp_StringExceedsMaximumLength = 8; - /** native declaration : headers\openvr_capi.h:336 */ + /** native declaration : headers\openvr_capi.h:443 */ public static final int ETrackedPropertyError_TrackedProp_NotYetAvailable = 9; - /** native declaration : headers\openvr_capi.h:337 */ + /** native declaration : headers\openvr_capi.h:444 */ public static final int ETrackedPropertyError_TrackedProp_PermissionDenied = 10; - /** native declaration : headers\openvr_capi.h:338 */ + /** native declaration : headers\openvr_capi.h:445 */ public static final int ETrackedPropertyError_TrackedProp_InvalidOperation = 11; + /** native declaration : headers\openvr_capi.h:446 */ + public static final int ETrackedPropertyError_TrackedProp_CannotWriteToWildcards = 12; }; /** - * native declaration : headers\openvr_capi.h:345
    + * native declaration : headers\openvr_capi.h:455
    * enum values */ public static interface EVRSubmitFlags { - /** native declaration : headers\openvr_capi.h:341 */ + /** native declaration : headers\openvr_capi.h:449 */ public static final int EVRSubmitFlags_Submit_Default = 0; - /** native declaration : headers\openvr_capi.h:342 */ + /** native declaration : headers\openvr_capi.h:450 */ public static final int EVRSubmitFlags_Submit_LensDistortionAlreadyApplied = 1; - /** native declaration : headers\openvr_capi.h:343 */ + /** native declaration : headers\openvr_capi.h:451 */ public static final int EVRSubmitFlags_Submit_GlRenderBuffer = 2; - /** native declaration : headers\openvr_capi.h:344 */ + /** native declaration : headers\openvr_capi.h:452 */ public static final int EVRSubmitFlags_Submit_Reserved = 4; + /** native declaration : headers\openvr_capi.h:453 */ + public static final int EVRSubmitFlags_Submit_TextureWithPose = 8; + /** native declaration : headers\openvr_capi.h:454 */ + public static final int EVRSubmitFlags_Submit_TextureWithDepth = 16; }; /** - * native declaration : headers\openvr_capi.h:356
    + * native declaration : headers\openvr_capi.h:466
    * enum values */ public static interface EVRState { - /** native declaration : headers\openvr_capi.h:347 */ + /** native declaration : headers\openvr_capi.h:457 */ public static final int EVRState_VRState_Undefined = -1; - /** native declaration : headers\openvr_capi.h:348 */ + /** native declaration : headers\openvr_capi.h:458 */ public static final int EVRState_VRState_Off = 0; - /** native declaration : headers\openvr_capi.h:349 */ + /** native declaration : headers\openvr_capi.h:459 */ public static final int EVRState_VRState_Searching = 1; - /** native declaration : headers\openvr_capi.h:350 */ + /** native declaration : headers\openvr_capi.h:460 */ public static final int EVRState_VRState_Searching_Alert = 2; - /** native declaration : headers\openvr_capi.h:351 */ + /** native declaration : headers\openvr_capi.h:461 */ public static final int EVRState_VRState_Ready = 3; - /** native declaration : headers\openvr_capi.h:352 */ + /** native declaration : headers\openvr_capi.h:462 */ public static final int EVRState_VRState_Ready_Alert = 4; - /** native declaration : headers\openvr_capi.h:353 */ + /** native declaration : headers\openvr_capi.h:463 */ public static final int EVRState_VRState_NotReady = 5; - /** native declaration : headers\openvr_capi.h:354 */ + /** native declaration : headers\openvr_capi.h:464 */ public static final int EVRState_VRState_Standby = 6; - /** native declaration : headers\openvr_capi.h:355 */ + /** native declaration : headers\openvr_capi.h:465 */ public static final int EVRState_VRState_Ready_Alert_Low = 7; }; /** - * native declaration : headers\openvr_capi.h:467
    + * native declaration : headers\openvr_capi.h:616
    * enum values */ public static interface EVREventType { - /** native declaration : headers\openvr_capi.h:358 */ + /** native declaration : headers\openvr_capi.h:468 */ public static final int EVREventType_VREvent_None = 0; - /** native declaration : headers\openvr_capi.h:359 */ + /** native declaration : headers\openvr_capi.h:469 */ public static final int EVREventType_VREvent_TrackedDeviceActivated = 100; - /** native declaration : headers\openvr_capi.h:360 */ + /** native declaration : headers\openvr_capi.h:470 */ public static final int EVREventType_VREvent_TrackedDeviceDeactivated = 101; - /** native declaration : headers\openvr_capi.h:361 */ + /** native declaration : headers\openvr_capi.h:471 */ public static final int EVREventType_VREvent_TrackedDeviceUpdated = 102; - /** native declaration : headers\openvr_capi.h:362 */ + /** native declaration : headers\openvr_capi.h:472 */ public static final int EVREventType_VREvent_TrackedDeviceUserInteractionStarted = 103; - /** native declaration : headers\openvr_capi.h:363 */ + /** native declaration : headers\openvr_capi.h:473 */ public static final int EVREventType_VREvent_TrackedDeviceUserInteractionEnded = 104; - /** native declaration : headers\openvr_capi.h:364 */ + /** native declaration : headers\openvr_capi.h:474 */ public static final int EVREventType_VREvent_IpdChanged = 105; - /** native declaration : headers\openvr_capi.h:365 */ + /** native declaration : headers\openvr_capi.h:475 */ public static final int EVREventType_VREvent_EnterStandbyMode = 106; - /** native declaration : headers\openvr_capi.h:366 */ + /** native declaration : headers\openvr_capi.h:476 */ public static final int EVREventType_VREvent_LeaveStandbyMode = 107; - /** native declaration : headers\openvr_capi.h:367 */ + /** native declaration : headers\openvr_capi.h:477 */ public static final int EVREventType_VREvent_TrackedDeviceRoleChanged = 108; - /** native declaration : headers\openvr_capi.h:368 */ + /** native declaration : headers\openvr_capi.h:478 */ public static final int EVREventType_VREvent_WatchdogWakeUpRequested = 109; - /** native declaration : headers\openvr_capi.h:369 */ + /** native declaration : headers\openvr_capi.h:479 */ public static final int EVREventType_VREvent_LensDistortionChanged = 110; - /** native declaration : headers\openvr_capi.h:370 */ + /** native declaration : headers\openvr_capi.h:480 */ public static final int EVREventType_VREvent_PropertyChanged = 111; - /** native declaration : headers\openvr_capi.h:371 */ + /** native declaration : headers\openvr_capi.h:481 */ + public static final int EVREventType_VREvent_WirelessDisconnect = 112; + /** native declaration : headers\openvr_capi.h:482 */ + public static final int EVREventType_VREvent_WirelessReconnect = 113; + /** native declaration : headers\openvr_capi.h:483 */ public static final int EVREventType_VREvent_ButtonPress = 200; - /** native declaration : headers\openvr_capi.h:372 */ + /** native declaration : headers\openvr_capi.h:484 */ public static final int EVREventType_VREvent_ButtonUnpress = 201; - /** native declaration : headers\openvr_capi.h:373 */ + /** native declaration : headers\openvr_capi.h:485 */ public static final int EVREventType_VREvent_ButtonTouch = 202; - /** native declaration : headers\openvr_capi.h:374 */ + /** native declaration : headers\openvr_capi.h:486 */ public static final int EVREventType_VREvent_ButtonUntouch = 203; - /** native declaration : headers\openvr_capi.h:375 */ + /** native declaration : headers\openvr_capi.h:487 */ + public static final int EVREventType_VREvent_DualAnalog_Press = 250; + /** native declaration : headers\openvr_capi.h:488 */ + public static final int EVREventType_VREvent_DualAnalog_Unpress = 251; + /** native declaration : headers\openvr_capi.h:489 */ + public static final int EVREventType_VREvent_DualAnalog_Touch = 252; + /** native declaration : headers\openvr_capi.h:490 */ + public static final int EVREventType_VREvent_DualAnalog_Untouch = 253; + /** native declaration : headers\openvr_capi.h:491 */ + public static final int EVREventType_VREvent_DualAnalog_Move = 254; + /** native declaration : headers\openvr_capi.h:492 */ + public static final int EVREventType_VREvent_DualAnalog_ModeSwitch1 = 255; + /** native declaration : headers\openvr_capi.h:493 */ + public static final int EVREventType_VREvent_DualAnalog_ModeSwitch2 = 256; + /** native declaration : headers\openvr_capi.h:494 */ + public static final int EVREventType_VREvent_DualAnalog_Cancel = 257; + /** native declaration : headers\openvr_capi.h:495 */ public static final int EVREventType_VREvent_MouseMove = 300; - /** native declaration : headers\openvr_capi.h:376 */ + /** native declaration : headers\openvr_capi.h:496 */ public static final int EVREventType_VREvent_MouseButtonDown = 301; - /** native declaration : headers\openvr_capi.h:377 */ + /** native declaration : headers\openvr_capi.h:497 */ public static final int EVREventType_VREvent_MouseButtonUp = 302; - /** native declaration : headers\openvr_capi.h:378 */ + /** native declaration : headers\openvr_capi.h:498 */ public static final int EVREventType_VREvent_FocusEnter = 303; - /** native declaration : headers\openvr_capi.h:379 */ + /** native declaration : headers\openvr_capi.h:499 */ public static final int EVREventType_VREvent_FocusLeave = 304; - /** native declaration : headers\openvr_capi.h:380 */ + /** native declaration : headers\openvr_capi.h:500 */ public static final int EVREventType_VREvent_Scroll = 305; - /** native declaration : headers\openvr_capi.h:381 */ + /** native declaration : headers\openvr_capi.h:501 */ public static final int EVREventType_VREvent_TouchPadMove = 306; - /** native declaration : headers\openvr_capi.h:382 */ + /** native declaration : headers\openvr_capi.h:502 */ public static final int EVREventType_VREvent_OverlayFocusChanged = 307; - /** native declaration : headers\openvr_capi.h:383 */ + /** native declaration : headers\openvr_capi.h:503 */ public static final int EVREventType_VREvent_InputFocusCaptured = 400; - /** native declaration : headers\openvr_capi.h:384 */ + /** native declaration : headers\openvr_capi.h:504 */ public static final int EVREventType_VREvent_InputFocusReleased = 401; - /** native declaration : headers\openvr_capi.h:385 */ + /** native declaration : headers\openvr_capi.h:505 */ public static final int EVREventType_VREvent_SceneFocusLost = 402; - /** native declaration : headers\openvr_capi.h:386 */ + /** native declaration : headers\openvr_capi.h:506 */ public static final int EVREventType_VREvent_SceneFocusGained = 403; - /** native declaration : headers\openvr_capi.h:387 */ + /** native declaration : headers\openvr_capi.h:507 */ public static final int EVREventType_VREvent_SceneApplicationChanged = 404; - /** native declaration : headers\openvr_capi.h:388 */ + /** native declaration : headers\openvr_capi.h:508 */ public static final int EVREventType_VREvent_SceneFocusChanged = 405; - /** native declaration : headers\openvr_capi.h:389 */ + /** native declaration : headers\openvr_capi.h:509 */ public static final int EVREventType_VREvent_InputFocusChanged = 406; - /** native declaration : headers\openvr_capi.h:390 */ + /** native declaration : headers\openvr_capi.h:510 */ public static final int EVREventType_VREvent_SceneApplicationSecondaryRenderingStarted = 407; - /** native declaration : headers\openvr_capi.h:391 */ + /** native declaration : headers\openvr_capi.h:511 */ + public static final int EVREventType_VREvent_SceneApplicationUsingWrongGraphicsAdapter = 408; + /** native declaration : headers\openvr_capi.h:512 */ + public static final int EVREventType_VREvent_ActionBindingReloaded = 409; + /** native declaration : headers\openvr_capi.h:513 */ public static final int EVREventType_VREvent_HideRenderModels = 410; - /** native declaration : headers\openvr_capi.h:392 */ + /** native declaration : headers\openvr_capi.h:514 */ public static final int EVREventType_VREvent_ShowRenderModels = 411; - /** native declaration : headers\openvr_capi.h:393 */ + /** native declaration : headers\openvr_capi.h:515 */ + public static final int EVREventType_VREvent_ConsoleOpened = 420; + /** native declaration : headers\openvr_capi.h:516 */ + public static final int EVREventType_VREvent_ConsoleClosed = 421; + /** native declaration : headers\openvr_capi.h:517 */ public static final int EVREventType_VREvent_OverlayShown = 500; - /** native declaration : headers\openvr_capi.h:394 */ + /** native declaration : headers\openvr_capi.h:518 */ public static final int EVREventType_VREvent_OverlayHidden = 501; - /** native declaration : headers\openvr_capi.h:395 */ + /** native declaration : headers\openvr_capi.h:519 */ public static final int EVREventType_VREvent_DashboardActivated = 502; - /** native declaration : headers\openvr_capi.h:396 */ + /** native declaration : headers\openvr_capi.h:520 */ public static final int EVREventType_VREvent_DashboardDeactivated = 503; - /** native declaration : headers\openvr_capi.h:397 */ + /** native declaration : headers\openvr_capi.h:521 */ public static final int EVREventType_VREvent_DashboardThumbSelected = 504; - /** native declaration : headers\openvr_capi.h:398 */ + /** native declaration : headers\openvr_capi.h:522 */ public static final int EVREventType_VREvent_DashboardRequested = 505; - /** native declaration : headers\openvr_capi.h:399 */ + /** native declaration : headers\openvr_capi.h:523 */ public static final int EVREventType_VREvent_ResetDashboard = 506; - /** native declaration : headers\openvr_capi.h:400 */ + /** native declaration : headers\openvr_capi.h:524 */ public static final int EVREventType_VREvent_RenderToast = 507; - /** native declaration : headers\openvr_capi.h:401 */ + /** native declaration : headers\openvr_capi.h:525 */ public static final int EVREventType_VREvent_ImageLoaded = 508; - /** native declaration : headers\openvr_capi.h:402 */ + /** native declaration : headers\openvr_capi.h:526 */ public static final int EVREventType_VREvent_ShowKeyboard = 509; - /** native declaration : headers\openvr_capi.h:403 */ + /** native declaration : headers\openvr_capi.h:527 */ public static final int EVREventType_VREvent_HideKeyboard = 510; - /** native declaration : headers\openvr_capi.h:404 */ + /** native declaration : headers\openvr_capi.h:528 */ public static final int EVREventType_VREvent_OverlayGamepadFocusGained = 511; - /** native declaration : headers\openvr_capi.h:405 */ + /** native declaration : headers\openvr_capi.h:529 */ public static final int EVREventType_VREvent_OverlayGamepadFocusLost = 512; - /** native declaration : headers\openvr_capi.h:406 */ + /** native declaration : headers\openvr_capi.h:530 */ public static final int EVREventType_VREvent_OverlaySharedTextureChanged = 513; - /** native declaration : headers\openvr_capi.h:407 */ - public static final int EVREventType_VREvent_DashboardGuideButtonDown = 514; - /** native declaration : headers\openvr_capi.h:408 */ - public static final int EVREventType_VREvent_DashboardGuideButtonUp = 515; - /** native declaration : headers\openvr_capi.h:409 */ + /** native declaration : headers\openvr_capi.h:531 */ public static final int EVREventType_VREvent_ScreenshotTriggered = 516; - /** native declaration : headers\openvr_capi.h:410 */ + /** native declaration : headers\openvr_capi.h:532 */ public static final int EVREventType_VREvent_ImageFailed = 517; - /** native declaration : headers\openvr_capi.h:411 */ + /** native declaration : headers\openvr_capi.h:533 */ public static final int EVREventType_VREvent_DashboardOverlayCreated = 518; - /** native declaration : headers\openvr_capi.h:412 */ + /** native declaration : headers\openvr_capi.h:534 */ + public static final int EVREventType_VREvent_SwitchGamepadFocus = 519; + /** native declaration : headers\openvr_capi.h:535 */ public static final int EVREventType_VREvent_RequestScreenshot = 520; - /** native declaration : headers\openvr_capi.h:413 */ + /** native declaration : headers\openvr_capi.h:536 */ public static final int EVREventType_VREvent_ScreenshotTaken = 521; - /** native declaration : headers\openvr_capi.h:414 */ + /** native declaration : headers\openvr_capi.h:537 */ public static final int EVREventType_VREvent_ScreenshotFailed = 522; - /** native declaration : headers\openvr_capi.h:415 */ + /** native declaration : headers\openvr_capi.h:538 */ public static final int EVREventType_VREvent_SubmitScreenshotToDashboard = 523; - /** native declaration : headers\openvr_capi.h:416 */ + /** native declaration : headers\openvr_capi.h:539 */ public static final int EVREventType_VREvent_ScreenshotProgressToDashboard = 524; - /** native declaration : headers\openvr_capi.h:417 */ + /** native declaration : headers\openvr_capi.h:540 */ public static final int EVREventType_VREvent_PrimaryDashboardDeviceChanged = 525; - /** native declaration : headers\openvr_capi.h:418 */ + /** native declaration : headers\openvr_capi.h:541 */ + public static final int EVREventType_VREvent_RoomViewShown = 526; + /** native declaration : headers\openvr_capi.h:542 */ + public static final int EVREventType_VREvent_RoomViewHidden = 527; + /** native declaration : headers\openvr_capi.h:543 */ public static final int EVREventType_VREvent_Notification_Shown = 600; - /** native declaration : headers\openvr_capi.h:419 */ + /** native declaration : headers\openvr_capi.h:544 */ public static final int EVREventType_VREvent_Notification_Hidden = 601; - /** native declaration : headers\openvr_capi.h:420 */ + /** native declaration : headers\openvr_capi.h:545 */ public static final int EVREventType_VREvent_Notification_BeginInteraction = 602; - /** native declaration : headers\openvr_capi.h:421 */ + /** native declaration : headers\openvr_capi.h:546 */ public static final int EVREventType_VREvent_Notification_Destroyed = 603; - /** native declaration : headers\openvr_capi.h:422 */ + /** native declaration : headers\openvr_capi.h:547 */ public static final int EVREventType_VREvent_Quit = 700; - /** native declaration : headers\openvr_capi.h:423 */ + /** native declaration : headers\openvr_capi.h:548 */ public static final int EVREventType_VREvent_ProcessQuit = 701; - /** native declaration : headers\openvr_capi.h:424 */ + /** native declaration : headers\openvr_capi.h:549 */ public static final int EVREventType_VREvent_QuitAborted_UserPrompt = 702; - /** native declaration : headers\openvr_capi.h:425 */ + /** native declaration : headers\openvr_capi.h:550 */ public static final int EVREventType_VREvent_QuitAcknowledged = 703; - /** native declaration : headers\openvr_capi.h:426 */ + /** native declaration : headers\openvr_capi.h:551 */ public static final int EVREventType_VREvent_DriverRequestedQuit = 704; - /** native declaration : headers\openvr_capi.h:427 */ + /** native declaration : headers\openvr_capi.h:552 */ public static final int EVREventType_VREvent_ChaperoneDataHasChanged = 800; - /** native declaration : headers\openvr_capi.h:428 */ + /** native declaration : headers\openvr_capi.h:553 */ public static final int EVREventType_VREvent_ChaperoneUniverseHasChanged = 801; - /** native declaration : headers\openvr_capi.h:429 */ + /** native declaration : headers\openvr_capi.h:554 */ public static final int EVREventType_VREvent_ChaperoneTempDataHasChanged = 802; - /** native declaration : headers\openvr_capi.h:430 */ + /** native declaration : headers\openvr_capi.h:555 */ public static final int EVREventType_VREvent_ChaperoneSettingsHaveChanged = 803; - /** native declaration : headers\openvr_capi.h:431 */ + /** native declaration : headers\openvr_capi.h:556 */ public static final int EVREventType_VREvent_SeatedZeroPoseReset = 804; - /** native declaration : headers\openvr_capi.h:432 */ + /** native declaration : headers\openvr_capi.h:557 */ public static final int EVREventType_VREvent_AudioSettingsHaveChanged = 820; - /** native declaration : headers\openvr_capi.h:433 */ + /** native declaration : headers\openvr_capi.h:558 */ public static final int EVREventType_VREvent_BackgroundSettingHasChanged = 850; - /** native declaration : headers\openvr_capi.h:434 */ + /** native declaration : headers\openvr_capi.h:559 */ public static final int EVREventType_VREvent_CameraSettingsHaveChanged = 851; - /** native declaration : headers\openvr_capi.h:435 */ + /** native declaration : headers\openvr_capi.h:560 */ public static final int EVREventType_VREvent_ReprojectionSettingHasChanged = 852; - /** native declaration : headers\openvr_capi.h:436 */ + /** native declaration : headers\openvr_capi.h:561 */ public static final int EVREventType_VREvent_ModelSkinSettingsHaveChanged = 853; - /** native declaration : headers\openvr_capi.h:437 */ + /** native declaration : headers\openvr_capi.h:562 */ public static final int EVREventType_VREvent_EnvironmentSettingsHaveChanged = 854; - /** native declaration : headers\openvr_capi.h:438 */ + /** native declaration : headers\openvr_capi.h:563 */ public static final int EVREventType_VREvent_PowerSettingsHaveChanged = 855; - /** native declaration : headers\openvr_capi.h:439 */ + /** native declaration : headers\openvr_capi.h:564 */ + public static final int EVREventType_VREvent_EnableHomeAppSettingsHaveChanged = 856; + /** native declaration : headers\openvr_capi.h:565 */ + public static final int EVREventType_VREvent_SteamVRSectionSettingChanged = 857; + /** native declaration : headers\openvr_capi.h:566 */ + public static final int EVREventType_VREvent_LighthouseSectionSettingChanged = 858; + /** native declaration : headers\openvr_capi.h:567 */ + public static final int EVREventType_VREvent_NullSectionSettingChanged = 859; + /** native declaration : headers\openvr_capi.h:568 */ + public static final int EVREventType_VREvent_UserInterfaceSectionSettingChanged = 860; + /** native declaration : headers\openvr_capi.h:569 */ + public static final int EVREventType_VREvent_NotificationsSectionSettingChanged = 861; + /** native declaration : headers\openvr_capi.h:570 */ + public static final int EVREventType_VREvent_KeyboardSectionSettingChanged = 862; + /** native declaration : headers\openvr_capi.h:571 */ + public static final int EVREventType_VREvent_PerfSectionSettingChanged = 863; + /** native declaration : headers\openvr_capi.h:572 */ + public static final int EVREventType_VREvent_DashboardSectionSettingChanged = 864; + /** native declaration : headers\openvr_capi.h:573 */ + public static final int EVREventType_VREvent_WebInterfaceSectionSettingChanged = 865; + /** native declaration : headers\openvr_capi.h:574 */ + public static final int EVREventType_VREvent_TrackersSectionSettingChanged = 866; + /** native declaration : headers\openvr_capi.h:575 */ public static final int EVREventType_VREvent_StatusUpdate = 900; - /** native declaration : headers\openvr_capi.h:440 */ + /** native declaration : headers\openvr_capi.h:576 */ + public static final int EVREventType_VREvent_WebInterface_InstallDriverCompleted = 950; + /** native declaration : headers\openvr_capi.h:577 */ public static final int EVREventType_VREvent_MCImageUpdated = 1000; - /** native declaration : headers\openvr_capi.h:441 */ + /** native declaration : headers\openvr_capi.h:578 */ public static final int EVREventType_VREvent_FirmwareUpdateStarted = 1100; - /** native declaration : headers\openvr_capi.h:442 */ + /** native declaration : headers\openvr_capi.h:579 */ public static final int EVREventType_VREvent_FirmwareUpdateFinished = 1101; - /** native declaration : headers\openvr_capi.h:443 */ + /** native declaration : headers\openvr_capi.h:580 */ public static final int EVREventType_VREvent_KeyboardClosed = 1200; - /** native declaration : headers\openvr_capi.h:444 */ + /** native declaration : headers\openvr_capi.h:581 */ public static final int EVREventType_VREvent_KeyboardCharInput = 1201; - /** native declaration : headers\openvr_capi.h:445 */ + /** native declaration : headers\openvr_capi.h:582 */ public static final int EVREventType_VREvent_KeyboardDone = 1202; - /** native declaration : headers\openvr_capi.h:446 */ + /** native declaration : headers\openvr_capi.h:583 */ public static final int EVREventType_VREvent_ApplicationTransitionStarted = 1300; - /** native declaration : headers\openvr_capi.h:447 */ + /** native declaration : headers\openvr_capi.h:584 */ public static final int EVREventType_VREvent_ApplicationTransitionAborted = 1301; - /** native declaration : headers\openvr_capi.h:448 */ + /** native declaration : headers\openvr_capi.h:585 */ public static final int EVREventType_VREvent_ApplicationTransitionNewAppStarted = 1302; - /** native declaration : headers\openvr_capi.h:449 */ + /** native declaration : headers\openvr_capi.h:586 */ public static final int EVREventType_VREvent_ApplicationListUpdated = 1303; - /** native declaration : headers\openvr_capi.h:450 */ + /** native declaration : headers\openvr_capi.h:587 */ public static final int EVREventType_VREvent_ApplicationMimeTypeLoad = 1304; - /** native declaration : headers\openvr_capi.h:451 */ + /** native declaration : headers\openvr_capi.h:588 */ public static final int EVREventType_VREvent_ApplicationTransitionNewAppLaunchComplete = 1305; - /** native declaration : headers\openvr_capi.h:452 */ + /** native declaration : headers\openvr_capi.h:589 */ + public static final int EVREventType_VREvent_ProcessConnected = 1306; + /** native declaration : headers\openvr_capi.h:590 */ + public static final int EVREventType_VREvent_ProcessDisconnected = 1307; + /** native declaration : headers\openvr_capi.h:591 */ public static final int EVREventType_VREvent_Compositor_MirrorWindowShown = 1400; - /** native declaration : headers\openvr_capi.h:453 */ + /** native declaration : headers\openvr_capi.h:592 */ public static final int EVREventType_VREvent_Compositor_MirrorWindowHidden = 1401; - /** native declaration : headers\openvr_capi.h:454 */ + /** native declaration : headers\openvr_capi.h:593 */ public static final int EVREventType_VREvent_Compositor_ChaperoneBoundsShown = 1410; - /** native declaration : headers\openvr_capi.h:455 */ + /** native declaration : headers\openvr_capi.h:594 */ public static final int EVREventType_VREvent_Compositor_ChaperoneBoundsHidden = 1411; - /** native declaration : headers\openvr_capi.h:456 */ + /** native declaration : headers\openvr_capi.h:595 */ public static final int EVREventType_VREvent_TrackedCamera_StartVideoStream = 1500; - /** native declaration : headers\openvr_capi.h:457 */ + /** native declaration : headers\openvr_capi.h:596 */ public static final int EVREventType_VREvent_TrackedCamera_StopVideoStream = 1501; - /** native declaration : headers\openvr_capi.h:458 */ + /** native declaration : headers\openvr_capi.h:597 */ public static final int EVREventType_VREvent_TrackedCamera_PauseVideoStream = 1502; - /** native declaration : headers\openvr_capi.h:459 */ + /** native declaration : headers\openvr_capi.h:598 */ public static final int EVREventType_VREvent_TrackedCamera_ResumeVideoStream = 1503; - /** native declaration : headers\openvr_capi.h:460 */ + /** native declaration : headers\openvr_capi.h:599 */ public static final int EVREventType_VREvent_TrackedCamera_EditingSurface = 1550; - /** native declaration : headers\openvr_capi.h:461 */ + /** native declaration : headers\openvr_capi.h:600 */ public static final int EVREventType_VREvent_PerformanceTest_EnableCapture = 1600; - /** native declaration : headers\openvr_capi.h:462 */ + /** native declaration : headers\openvr_capi.h:601 */ public static final int EVREventType_VREvent_PerformanceTest_DisableCapture = 1601; - /** native declaration : headers\openvr_capi.h:463 */ + /** native declaration : headers\openvr_capi.h:602 */ public static final int EVREventType_VREvent_PerformanceTest_FidelityLevel = 1602; - /** native declaration : headers\openvr_capi.h:464 */ + /** native declaration : headers\openvr_capi.h:603 */ public static final int EVREventType_VREvent_MessageOverlay_Closed = 1650; - /** native declaration : headers\openvr_capi.h:465 */ + /** native declaration : headers\openvr_capi.h:604 */ + public static final int EVREventType_VREvent_MessageOverlayCloseRequested = 1651; + /** native declaration : headers\openvr_capi.h:605 */ + public static final int EVREventType_VREvent_Input_HapticVibration = 1700; + /** native declaration : headers\openvr_capi.h:606 */ + public static final int EVREventType_VREvent_Input_BindingLoadFailed = 1701; + /** native declaration : headers\openvr_capi.h:607 */ + public static final int EVREventType_VREvent_Input_BindingLoadSuccessful = 1702; + /** native declaration : headers\openvr_capi.h:608 */ + public static final int EVREventType_VREvent_Input_ActionManifestReloaded = 1703; + /** native declaration : headers\openvr_capi.h:609 */ + public static final int EVREventType_VREvent_Input_ActionManifestLoadFailed = 1704; + /** native declaration : headers\openvr_capi.h:610 */ + public static final int EVREventType_VREvent_SpatialAnchors_PoseUpdated = 1800; + /** native declaration : headers\openvr_capi.h:611 */ + public static final int EVREventType_VREvent_SpatialAnchors_DescriptorUpdated = 1801; + /** native declaration : headers\openvr_capi.h:612 */ + public static final int EVREventType_VREvent_SpatialAnchors_RequestPoseUpdate = 1802; + /** native declaration : headers\openvr_capi.h:613 */ + public static final int EVREventType_VREvent_SpatialAnchors_RequestDescriptorUpdate = 1803; + /** native declaration : headers\openvr_capi.h:614 */ public static final int EVREventType_VREvent_VendorSpecific_Reserved_Start = 10000; - /** native declaration : headers\openvr_capi.h:466 */ + /** native declaration : headers\openvr_capi.h:615 */ public static final int EVREventType_VREvent_VendorSpecific_Reserved_End = 19999; }; /** - * native declaration : headers\openvr_capi.h:474
    + * native declaration : headers\openvr_capi.h:623
    * enum values */ public static interface EDeviceActivityLevel { - /** native declaration : headers\openvr_capi.h:469 */ + /** native declaration : headers\openvr_capi.h:618 */ public static final int EDeviceActivityLevel_k_EDeviceActivityLevel_Unknown = -1; - /** native declaration : headers\openvr_capi.h:470 */ + /** native declaration : headers\openvr_capi.h:619 */ public static final int EDeviceActivityLevel_k_EDeviceActivityLevel_Idle = 0; - /** native declaration : headers\openvr_capi.h:471 */ + /** native declaration : headers\openvr_capi.h:620 */ public static final int EDeviceActivityLevel_k_EDeviceActivityLevel_UserInteraction = 1; - /** native declaration : headers\openvr_capi.h:472 */ + /** native declaration : headers\openvr_capi.h:621 */ public static final int EDeviceActivityLevel_k_EDeviceActivityLevel_UserInteraction_Timeout = 2; - /** native declaration : headers\openvr_capi.h:473 */ + /** native declaration : headers\openvr_capi.h:622 */ public static final int EDeviceActivityLevel_k_EDeviceActivityLevel_Standby = 3; }; /** - * native declaration : headers\openvr_capi.h:494
    + * native declaration : headers\openvr_capi.h:646
    * enum values */ public static interface EVRButtonId { - /** native declaration : headers\openvr_capi.h:476 */ + /** native declaration : headers\openvr_capi.h:625 */ public static final int EVRButtonId_k_EButton_System = 0; - /** native declaration : headers\openvr_capi.h:477 */ + /** native declaration : headers\openvr_capi.h:626 */ public static final int EVRButtonId_k_EButton_ApplicationMenu = 1; - /** native declaration : headers\openvr_capi.h:478 */ + /** native declaration : headers\openvr_capi.h:627 */ public static final int EVRButtonId_k_EButton_Grip = 2; - /** native declaration : headers\openvr_capi.h:479 */ + /** native declaration : headers\openvr_capi.h:628 */ public static final int EVRButtonId_k_EButton_DPad_Left = 3; - /** native declaration : headers\openvr_capi.h:480 */ + /** native declaration : headers\openvr_capi.h:629 */ public static final int EVRButtonId_k_EButton_DPad_Up = 4; - /** native declaration : headers\openvr_capi.h:481 */ + /** native declaration : headers\openvr_capi.h:630 */ public static final int EVRButtonId_k_EButton_DPad_Right = 5; - /** native declaration : headers\openvr_capi.h:482 */ + /** native declaration : headers\openvr_capi.h:631 */ public static final int EVRButtonId_k_EButton_DPad_Down = 6; - /** native declaration : headers\openvr_capi.h:483 */ + /** native declaration : headers\openvr_capi.h:632 */ public static final int EVRButtonId_k_EButton_A = 7; - /** native declaration : headers\openvr_capi.h:484 */ + /** native declaration : headers\openvr_capi.h:633 */ public static final int EVRButtonId_k_EButton_ProximitySensor = 31; - /** native declaration : headers\openvr_capi.h:485 */ + /** native declaration : headers\openvr_capi.h:634 */ public static final int EVRButtonId_k_EButton_Axis0 = 32; - /** native declaration : headers\openvr_capi.h:486 */ + /** native declaration : headers\openvr_capi.h:635 */ public static final int EVRButtonId_k_EButton_Axis1 = 33; - /** native declaration : headers\openvr_capi.h:487 */ + /** native declaration : headers\openvr_capi.h:636 */ public static final int EVRButtonId_k_EButton_Axis2 = 34; - /** native declaration : headers\openvr_capi.h:488 */ + /** native declaration : headers\openvr_capi.h:637 */ public static final int EVRButtonId_k_EButton_Axis3 = 35; - /** native declaration : headers\openvr_capi.h:489 */ + /** native declaration : headers\openvr_capi.h:638 */ public static final int EVRButtonId_k_EButton_Axis4 = 36; - /** native declaration : headers\openvr_capi.h:490 */ + /** native declaration : headers\openvr_capi.h:639 */ public static final int EVRButtonId_k_EButton_SteamVR_Touchpad = 32; - /** native declaration : headers\openvr_capi.h:491 */ + /** native declaration : headers\openvr_capi.h:640 */ public static final int EVRButtonId_k_EButton_SteamVR_Trigger = 33; - /** native declaration : headers\openvr_capi.h:492 */ + /** native declaration : headers\openvr_capi.h:641 */ public static final int EVRButtonId_k_EButton_Dashboard_Back = 2; - /** native declaration : headers\openvr_capi.h:493 */ + /** native declaration : headers\openvr_capi.h:642 */ + public static final int EVRButtonId_k_EButton_Knuckles_A = 2; + /** native declaration : headers\openvr_capi.h:643 */ + public static final int EVRButtonId_k_EButton_Knuckles_B = 1; + /** native declaration : headers\openvr_capi.h:644 */ + public static final int EVRButtonId_k_EButton_Knuckles_JoyStick = 35; + /** native declaration : headers\openvr_capi.h:645 */ public static final int EVRButtonId_k_EButton_Max = 64; }; /** - * native declaration : headers\openvr_capi.h:499
    + * native declaration : headers\openvr_capi.h:651
    * enum values */ public static interface EVRMouseButton { - /** native declaration : headers\openvr_capi.h:496 */ + /** native declaration : headers\openvr_capi.h:648 */ public static final int EVRMouseButton_VRMouseButton_Left = 1; - /** native declaration : headers\openvr_capi.h:497 */ + /** native declaration : headers\openvr_capi.h:649 */ public static final int EVRMouseButton_VRMouseButton_Right = 2; - /** native declaration : headers\openvr_capi.h:498 */ + /** native declaration : headers\openvr_capi.h:650 */ public static final int EVRMouseButton_VRMouseButton_Middle = 4; }; /** - * native declaration : headers\openvr_capi.h:505
    + * native declaration : headers\openvr_capi.h:655
    + * enum values + */ + public static interface EDualAnalogWhich { + /** native declaration : headers\openvr_capi.h:653 */ + public static final int EDualAnalogWhich_k_EDualAnalog_Left = 0; + /** native declaration : headers\openvr_capi.h:654 */ + public static final int EDualAnalogWhich_k_EDualAnalog_Right = 1; + }; + /** + * native declaration : headers\openvr_capi.h:674
    + * enum values + */ + public static interface EVRInputError { + /** native declaration : headers\openvr_capi.h:657 */ + public static final int EVRInputError_VRInputError_None = 0; + /** native declaration : headers\openvr_capi.h:658 */ + public static final int EVRInputError_VRInputError_NameNotFound = 1; + /** native declaration : headers\openvr_capi.h:659 */ + public static final int EVRInputError_VRInputError_WrongType = 2; + /** native declaration : headers\openvr_capi.h:660 */ + public static final int EVRInputError_VRInputError_InvalidHandle = 3; + /** native declaration : headers\openvr_capi.h:661 */ + public static final int EVRInputError_VRInputError_InvalidParam = 4; + /** native declaration : headers\openvr_capi.h:662 */ + public static final int EVRInputError_VRInputError_NoSteam = 5; + /** native declaration : headers\openvr_capi.h:663 */ + public static final int EVRInputError_VRInputError_MaxCapacityReached = 6; + /** native declaration : headers\openvr_capi.h:664 */ + public static final int EVRInputError_VRInputError_IPCError = 7; + /** native declaration : headers\openvr_capi.h:665 */ + public static final int EVRInputError_VRInputError_NoActiveActionSet = 8; + /** native declaration : headers\openvr_capi.h:666 */ + public static final int EVRInputError_VRInputError_InvalidDevice = 9; + /** native declaration : headers\openvr_capi.h:667 */ + public static final int EVRInputError_VRInputError_InvalidSkeleton = 10; + /** native declaration : headers\openvr_capi.h:668 */ + public static final int EVRInputError_VRInputError_InvalidBoneCount = 11; + /** native declaration : headers\openvr_capi.h:669 */ + public static final int EVRInputError_VRInputError_InvalidCompressedData = 12; + /** native declaration : headers\openvr_capi.h:670 */ + public static final int EVRInputError_VRInputError_NoData = 13; + /** native declaration : headers\openvr_capi.h:671 */ + public static final int EVRInputError_VRInputError_BufferTooSmall = 14; + /** native declaration : headers\openvr_capi.h:672 */ + public static final int EVRInputError_VRInputError_MismatchedActionManifest = 15; + /** native declaration : headers\openvr_capi.h:673 */ + public static final int EVRInputError_VRInputError_MissingSkeletonData = 16; + }; + /** + * native declaration : headers\openvr_capi.h:690
    + * enum values + */ + public static interface EVRSpatialAnchorError { + /** native declaration : headers\openvr_capi.h:676 */ + public static final int EVRSpatialAnchorError_VRSpatialAnchorError_Success = 0; + /** native declaration : headers\openvr_capi.h:677 */ + public static final int EVRSpatialAnchorError_VRSpatialAnchorError_Internal = 1; + /** native declaration : headers\openvr_capi.h:678 */ + public static final int EVRSpatialAnchorError_VRSpatialAnchorError_UnknownHandle = 2; + /** native declaration : headers\openvr_capi.h:679 */ + public static final int EVRSpatialAnchorError_VRSpatialAnchorError_ArrayTooSmall = 3; + /** native declaration : headers\openvr_capi.h:680 */ + public static final int EVRSpatialAnchorError_VRSpatialAnchorError_InvalidDescriptorChar = 4; + /** native declaration : headers\openvr_capi.h:681 */ + public static final int EVRSpatialAnchorError_VRSpatialAnchorError_NotYetAvailable = 5; + /** native declaration : headers\openvr_capi.h:682 */ + public static final int EVRSpatialAnchorError_VRSpatialAnchorError_NotAvailableInThisUniverse = 6; + /** native declaration : headers\openvr_capi.h:683 */ + public static final int EVRSpatialAnchorError_VRSpatialAnchorError_PermanentlyUnavailable = 7; + /** native declaration : headers\openvr_capi.h:684 */ + public static final int EVRSpatialAnchorError_VRSpatialAnchorError_WrongDriver = 8; + /** native declaration : headers\openvr_capi.h:685 */ + public static final int EVRSpatialAnchorError_VRSpatialAnchorError_DescriptorTooLong = 9; + /** native declaration : headers\openvr_capi.h:686 */ + public static final int EVRSpatialAnchorError_VRSpatialAnchorError_Unknown = 10; + /** native declaration : headers\openvr_capi.h:687 */ + public static final int EVRSpatialAnchorError_VRSpatialAnchorError_NoRoomCalibration = 11; + /** native declaration : headers\openvr_capi.h:688 */ + public static final int EVRSpatialAnchorError_VRSpatialAnchorError_InvalidArgument = 12; + /** native declaration : headers\openvr_capi.h:689 */ + public static final int EVRSpatialAnchorError_VRSpatialAnchorError_UnknownDriver = 13; + }; + /** + * native declaration : headers\openvr_capi.h:696
    * enum values */ public static interface EHiddenAreaMeshType { - /** native declaration : headers\openvr_capi.h:501 */ + /** native declaration : headers\openvr_capi.h:692 */ public static final int EHiddenAreaMeshType_k_eHiddenAreaMesh_Standard = 0; - /** native declaration : headers\openvr_capi.h:502 */ + /** native declaration : headers\openvr_capi.h:693 */ public static final int EHiddenAreaMeshType_k_eHiddenAreaMesh_Inverse = 1; - /** native declaration : headers\openvr_capi.h:503 */ + /** native declaration : headers\openvr_capi.h:694 */ public static final int EHiddenAreaMeshType_k_eHiddenAreaMesh_LineLoop = 2; - /** native declaration : headers\openvr_capi.h:504 */ + /** native declaration : headers\openvr_capi.h:695 */ public static final int EHiddenAreaMeshType_k_eHiddenAreaMesh_Max = 3; }; /** - * native declaration : headers\openvr_capi.h:511
    + * native declaration : headers\openvr_capi.h:702
    * enum values */ public static interface EVRControllerAxisType { - /** native declaration : headers\openvr_capi.h:507 */ + /** native declaration : headers\openvr_capi.h:698 */ public static final int EVRControllerAxisType_k_eControllerAxis_None = 0; - /** native declaration : headers\openvr_capi.h:508 */ + /** native declaration : headers\openvr_capi.h:699 */ public static final int EVRControllerAxisType_k_eControllerAxis_TrackPad = 1; - /** native declaration : headers\openvr_capi.h:509 */ + /** native declaration : headers\openvr_capi.h:700 */ public static final int EVRControllerAxisType_k_eControllerAxis_Joystick = 2; - /** native declaration : headers\openvr_capi.h:510 */ + /** native declaration : headers\openvr_capi.h:701 */ public static final int EVRControllerAxisType_k_eControllerAxis_Trigger = 3; }; /** - * native declaration : headers\openvr_capi.h:515
    + * native declaration : headers\openvr_capi.h:706
    * enum values */ public static interface EVRControllerEventOutputType { - /** native declaration : headers\openvr_capi.h:513 */ + /** native declaration : headers\openvr_capi.h:704 */ public static final int EVRControllerEventOutputType_ControllerEventOutput_OSEvents = 0; - /** native declaration : headers\openvr_capi.h:514 */ + /** native declaration : headers\openvr_capi.h:705 */ public static final int EVRControllerEventOutputType_ControllerEventOutput_VREvents = 1; }; /** - * native declaration : headers\openvr_capi.h:523
    + * native declaration : headers\openvr_capi.h:714
    * enum values */ public static interface ECollisionBoundsStyle { - /** native declaration : headers\openvr_capi.h:517 */ + /** native declaration : headers\openvr_capi.h:708 */ public static final int ECollisionBoundsStyle_COLLISION_BOUNDS_STYLE_BEGINNER = 0; - /** native declaration : headers\openvr_capi.h:518 */ + /** native declaration : headers\openvr_capi.h:709 */ public static final int ECollisionBoundsStyle_COLLISION_BOUNDS_STYLE_INTERMEDIATE = 1; - /** native declaration : headers\openvr_capi.h:519 */ + /** native declaration : headers\openvr_capi.h:710 */ public static final int ECollisionBoundsStyle_COLLISION_BOUNDS_STYLE_SQUARES = 2; - /** native declaration : headers\openvr_capi.h:520 */ + /** native declaration : headers\openvr_capi.h:711 */ public static final int ECollisionBoundsStyle_COLLISION_BOUNDS_STYLE_ADVANCED = 3; - /** native declaration : headers\openvr_capi.h:521 */ + /** native declaration : headers\openvr_capi.h:712 */ public static final int ECollisionBoundsStyle_COLLISION_BOUNDS_STYLE_NONE = 4; - /** native declaration : headers\openvr_capi.h:522 */ + /** native declaration : headers\openvr_capi.h:713 */ public static final int ECollisionBoundsStyle_COLLISION_BOUNDS_STYLE_COUNT = 5; }; /** - * native declaration : headers\openvr_capi.h:546
    + * native declaration : headers\openvr_capi.h:740
    * enum values */ public static interface EVROverlayError { - /** native declaration : headers\openvr_capi.h:525 */ + /** native declaration : headers\openvr_capi.h:716 */ public static final int EVROverlayError_VROverlayError_None = 0; - /** native declaration : headers\openvr_capi.h:526 */ + /** native declaration : headers\openvr_capi.h:717 */ public static final int EVROverlayError_VROverlayError_UnknownOverlay = 10; - /** native declaration : headers\openvr_capi.h:527 */ + /** native declaration : headers\openvr_capi.h:718 */ public static final int EVROverlayError_VROverlayError_InvalidHandle = 11; - /** native declaration : headers\openvr_capi.h:528 */ + /** native declaration : headers\openvr_capi.h:719 */ public static final int EVROverlayError_VROverlayError_PermissionDenied = 12; - /** native declaration : headers\openvr_capi.h:529 */ + /** native declaration : headers\openvr_capi.h:720 */ public static final int EVROverlayError_VROverlayError_OverlayLimitExceeded = 13; - /** native declaration : headers\openvr_capi.h:530 */ + /** native declaration : headers\openvr_capi.h:721 */ public static final int EVROverlayError_VROverlayError_WrongVisibilityType = 14; - /** native declaration : headers\openvr_capi.h:531 */ + /** native declaration : headers\openvr_capi.h:722 */ public static final int EVROverlayError_VROverlayError_KeyTooLong = 15; - /** native declaration : headers\openvr_capi.h:532 */ + /** native declaration : headers\openvr_capi.h:723 */ public static final int EVROverlayError_VROverlayError_NameTooLong = 16; - /** native declaration : headers\openvr_capi.h:533 */ + /** native declaration : headers\openvr_capi.h:724 */ public static final int EVROverlayError_VROverlayError_KeyInUse = 17; - /** native declaration : headers\openvr_capi.h:534 */ + /** native declaration : headers\openvr_capi.h:725 */ public static final int EVROverlayError_VROverlayError_WrongTransformType = 18; - /** native declaration : headers\openvr_capi.h:535 */ + /** native declaration : headers\openvr_capi.h:726 */ public static final int EVROverlayError_VROverlayError_InvalidTrackedDevice = 19; - /** native declaration : headers\openvr_capi.h:536 */ + /** native declaration : headers\openvr_capi.h:727 */ public static final int EVROverlayError_VROverlayError_InvalidParameter = 20; - /** native declaration : headers\openvr_capi.h:537 */ + /** native declaration : headers\openvr_capi.h:728 */ public static final int EVROverlayError_VROverlayError_ThumbnailCantBeDestroyed = 21; - /** native declaration : headers\openvr_capi.h:538 */ + /** native declaration : headers\openvr_capi.h:729 */ public static final int EVROverlayError_VROverlayError_ArrayTooSmall = 22; - /** native declaration : headers\openvr_capi.h:539 */ + /** native declaration : headers\openvr_capi.h:730 */ public static final int EVROverlayError_VROverlayError_RequestFailed = 23; - /** native declaration : headers\openvr_capi.h:540 */ + /** native declaration : headers\openvr_capi.h:731 */ public static final int EVROverlayError_VROverlayError_InvalidTexture = 24; - /** native declaration : headers\openvr_capi.h:541 */ + /** native declaration : headers\openvr_capi.h:732 */ public static final int EVROverlayError_VROverlayError_UnableToLoadFile = 25; - /** native declaration : headers\openvr_capi.h:542 */ + /** native declaration : headers\openvr_capi.h:733 */ public static final int EVROverlayError_VROverlayError_KeyboardAlreadyInUse = 26; - /** native declaration : headers\openvr_capi.h:543 */ + /** native declaration : headers\openvr_capi.h:734 */ public static final int EVROverlayError_VROverlayError_NoNeighbor = 27; - /** native declaration : headers\openvr_capi.h:544 */ + /** native declaration : headers\openvr_capi.h:735 */ public static final int EVROverlayError_VROverlayError_TooManyMaskPrimitives = 29; - /** native declaration : headers\openvr_capi.h:545 */ + /** native declaration : headers\openvr_capi.h:736 */ public static final int EVROverlayError_VROverlayError_BadMaskPrimitive = 30; + /** native declaration : headers\openvr_capi.h:737 */ + public static final int EVROverlayError_VROverlayError_TextureAlreadyLocked = 31; + /** native declaration : headers\openvr_capi.h:738 */ + public static final int EVROverlayError_VROverlayError_TextureLockCapacityReached = 32; + /** native declaration : headers\openvr_capi.h:739 */ + public static final int EVROverlayError_VROverlayError_TextureNotLocked = 33; }; /** - * native declaration : headers\openvr_capi.h:556
    + * native declaration : headers\openvr_capi.h:751
    * enum values */ public static interface EVRApplicationType { - /** native declaration : headers\openvr_capi.h:548 */ + /** native declaration : headers\openvr_capi.h:742 */ public static final int EVRApplicationType_VRApplication_Other = 0; - /** native declaration : headers\openvr_capi.h:549 */ + /** native declaration : headers\openvr_capi.h:743 */ public static final int EVRApplicationType_VRApplication_Scene = 1; - /** native declaration : headers\openvr_capi.h:550 */ + /** native declaration : headers\openvr_capi.h:744 */ public static final int EVRApplicationType_VRApplication_Overlay = 2; - /** native declaration : headers\openvr_capi.h:551 */ + /** native declaration : headers\openvr_capi.h:745 */ public static final int EVRApplicationType_VRApplication_Background = 3; - /** native declaration : headers\openvr_capi.h:552 */ + /** native declaration : headers\openvr_capi.h:746 */ public static final int EVRApplicationType_VRApplication_Utility = 4; - /** native declaration : headers\openvr_capi.h:553 */ + /** native declaration : headers\openvr_capi.h:747 */ public static final int EVRApplicationType_VRApplication_VRMonitor = 5; - /** native declaration : headers\openvr_capi.h:554 */ + /** native declaration : headers\openvr_capi.h:748 */ public static final int EVRApplicationType_VRApplication_SteamWatchdog = 6; - /** native declaration : headers\openvr_capi.h:555 */ - public static final int EVRApplicationType_VRApplication_Max = 7; + /** native declaration : headers\openvr_capi.h:749 */ + public static final int EVRApplicationType_VRApplication_Bootstrapper = 7; + /** native declaration : headers\openvr_capi.h:750 */ + public static final int EVRApplicationType_VRApplication_Max = 8; }; /** - * native declaration : headers\openvr_capi.h:561
    + * native declaration : headers\openvr_capi.h:756
    * enum values */ public static interface EVRFirmwareError { - /** native declaration : headers\openvr_capi.h:558 */ + /** native declaration : headers\openvr_capi.h:753 */ public static final int EVRFirmwareError_VRFirmwareError_None = 0; - /** native declaration : headers\openvr_capi.h:559 */ + /** native declaration : headers\openvr_capi.h:754 */ public static final int EVRFirmwareError_VRFirmwareError_Success = 1; - /** native declaration : headers\openvr_capi.h:560 */ + /** native declaration : headers\openvr_capi.h:755 */ public static final int EVRFirmwareError_VRFirmwareError_Fail = 2; }; /** - * native declaration : headers\openvr_capi.h:568
    + * native declaration : headers\openvr_capi.h:763
    * enum values */ public static interface EVRNotificationError { - /** native declaration : headers\openvr_capi.h:563 */ + /** native declaration : headers\openvr_capi.h:758 */ public static final int EVRNotificationError_VRNotificationError_OK = 0; - /** native declaration : headers\openvr_capi.h:564 */ + /** native declaration : headers\openvr_capi.h:759 */ public static final int EVRNotificationError_VRNotificationError_InvalidNotificationId = 100; - /** native declaration : headers\openvr_capi.h:565 */ + /** native declaration : headers\openvr_capi.h:760 */ public static final int EVRNotificationError_VRNotificationError_NotificationQueueFull = 101; - /** native declaration : headers\openvr_capi.h:566 */ + /** native declaration : headers\openvr_capi.h:761 */ public static final int EVRNotificationError_VRNotificationError_InvalidOverlayHandle = 102; - /** native declaration : headers\openvr_capi.h:567 */ + /** native declaration : headers\openvr_capi.h:762 */ public static final int EVRNotificationError_VRNotificationError_SystemWithUserValueAlreadyExists = 103; - }; - + }; + /** + * native declaration : headers\openvr_capi.h:767
    + * enum values + */ + public static interface EVRSkeletalMotionRange { + /** native declaration : headers\openvr_capi.h:765 */ + public static final int EVRSkeletalMotionRange_VRSkeletalMotionRange_WithController = 0; + /** native declaration : headers\openvr_capi.h:766 */ + public static final int EVRSkeletalMotionRange_VRSkeletalMotionRange_WithoutController = 1; + }; /** - * native declaration : headers\openvr_capi.h:648
    + * native declaration : headers\openvr_capi.h:857
    * enum values */ public static interface EVRInitError { - /** native declaration : headers\openvr_capi.h:570 */ + /** native declaration : headers\openvr_capi.h:769 */ public static final int EVRInitError_VRInitError_None = 0; - /** native declaration : headers\openvr_capi.h:571 */ + /** native declaration : headers\openvr_capi.h:770 */ public static final int EVRInitError_VRInitError_Unknown = 1; - /** native declaration : headers\openvr_capi.h:572 */ + /** native declaration : headers\openvr_capi.h:771 */ public static final int EVRInitError_VRInitError_Init_InstallationNotFound = 100; - /** native declaration : headers\openvr_capi.h:573 */ + /** native declaration : headers\openvr_capi.h:772 */ public static final int EVRInitError_VRInitError_Init_InstallationCorrupt = 101; - /** native declaration : headers\openvr_capi.h:574 */ + /** native declaration : headers\openvr_capi.h:773 */ public static final int EVRInitError_VRInitError_Init_VRClientDLLNotFound = 102; - /** native declaration : headers\openvr_capi.h:575 */ + /** native declaration : headers\openvr_capi.h:774 */ public static final int EVRInitError_VRInitError_Init_FileNotFound = 103; - /** native declaration : headers\openvr_capi.h:576 */ + /** native declaration : headers\openvr_capi.h:775 */ public static final int EVRInitError_VRInitError_Init_FactoryNotFound = 104; - /** native declaration : headers\openvr_capi.h:577 */ + /** native declaration : headers\openvr_capi.h:776 */ public static final int EVRInitError_VRInitError_Init_InterfaceNotFound = 105; - /** native declaration : headers\openvr_capi.h:578 */ + /** native declaration : headers\openvr_capi.h:777 */ public static final int EVRInitError_VRInitError_Init_InvalidInterface = 106; - /** native declaration : headers\openvr_capi.h:579 */ + /** native declaration : headers\openvr_capi.h:778 */ public static final int EVRInitError_VRInitError_Init_UserConfigDirectoryInvalid = 107; - /** native declaration : headers\openvr_capi.h:580 */ + /** native declaration : headers\openvr_capi.h:779 */ public static final int EVRInitError_VRInitError_Init_HmdNotFound = 108; - /** native declaration : headers\openvr_capi.h:581 */ + /** native declaration : headers\openvr_capi.h:780 */ public static final int EVRInitError_VRInitError_Init_NotInitialized = 109; - /** native declaration : headers\openvr_capi.h:582 */ + /** native declaration : headers\openvr_capi.h:781 */ public static final int EVRInitError_VRInitError_Init_PathRegistryNotFound = 110; - /** native declaration : headers\openvr_capi.h:583 */ + /** native declaration : headers\openvr_capi.h:782 */ public static final int EVRInitError_VRInitError_Init_NoConfigPath = 111; - /** native declaration : headers\openvr_capi.h:584 */ + /** native declaration : headers\openvr_capi.h:783 */ public static final int EVRInitError_VRInitError_Init_NoLogPath = 112; - /** native declaration : headers\openvr_capi.h:585 */ + /** native declaration : headers\openvr_capi.h:784 */ public static final int EVRInitError_VRInitError_Init_PathRegistryNotWritable = 113; - /** native declaration : headers\openvr_capi.h:586 */ + /** native declaration : headers\openvr_capi.h:785 */ public static final int EVRInitError_VRInitError_Init_AppInfoInitFailed = 114; - /** native declaration : headers\openvr_capi.h:587 */ + /** native declaration : headers\openvr_capi.h:786 */ public static final int EVRInitError_VRInitError_Init_Retry = 115; - /** native declaration : headers\openvr_capi.h:588 */ + /** native declaration : headers\openvr_capi.h:787 */ public static final int EVRInitError_VRInitError_Init_InitCanceledByUser = 116; - /** native declaration : headers\openvr_capi.h:589 */ + /** native declaration : headers\openvr_capi.h:788 */ public static final int EVRInitError_VRInitError_Init_AnotherAppLaunching = 117; - /** native declaration : headers\openvr_capi.h:590 */ + /** native declaration : headers\openvr_capi.h:789 */ public static final int EVRInitError_VRInitError_Init_SettingsInitFailed = 118; - /** native declaration : headers\openvr_capi.h:591 */ + /** native declaration : headers\openvr_capi.h:790 */ public static final int EVRInitError_VRInitError_Init_ShuttingDown = 119; - /** native declaration : headers\openvr_capi.h:592 */ + /** native declaration : headers\openvr_capi.h:791 */ public static final int EVRInitError_VRInitError_Init_TooManyObjects = 120; - /** native declaration : headers\openvr_capi.h:593 */ + /** native declaration : headers\openvr_capi.h:792 */ public static final int EVRInitError_VRInitError_Init_NoServerForBackgroundApp = 121; - /** native declaration : headers\openvr_capi.h:594 */ + /** native declaration : headers\openvr_capi.h:793 */ public static final int EVRInitError_VRInitError_Init_NotSupportedWithCompositor = 122; - /** native declaration : headers\openvr_capi.h:595 */ + /** native declaration : headers\openvr_capi.h:794 */ public static final int EVRInitError_VRInitError_Init_NotAvailableToUtilityApps = 123; - /** native declaration : headers\openvr_capi.h:596 */ + /** native declaration : headers\openvr_capi.h:795 */ public static final int EVRInitError_VRInitError_Init_Internal = 124; - /** native declaration : headers\openvr_capi.h:597 */ + /** native declaration : headers\openvr_capi.h:796 */ public static final int EVRInitError_VRInitError_Init_HmdDriverIdIsNone = 125; - /** native declaration : headers\openvr_capi.h:598 */ + /** native declaration : headers\openvr_capi.h:797 */ public static final int EVRInitError_VRInitError_Init_HmdNotFoundPresenceFailed = 126; - /** native declaration : headers\openvr_capi.h:599 */ + /** native declaration : headers\openvr_capi.h:798 */ public static final int EVRInitError_VRInitError_Init_VRMonitorNotFound = 127; - /** native declaration : headers\openvr_capi.h:600 */ + /** native declaration : headers\openvr_capi.h:799 */ public static final int EVRInitError_VRInitError_Init_VRMonitorStartupFailed = 128; - /** native declaration : headers\openvr_capi.h:601 */ + /** native declaration : headers\openvr_capi.h:800 */ public static final int EVRInitError_VRInitError_Init_LowPowerWatchdogNotSupported = 129; - /** native declaration : headers\openvr_capi.h:602 */ + /** native declaration : headers\openvr_capi.h:801 */ public static final int EVRInitError_VRInitError_Init_InvalidApplicationType = 130; - /** native declaration : headers\openvr_capi.h:603 */ + /** native declaration : headers\openvr_capi.h:802 */ public static final int EVRInitError_VRInitError_Init_NotAvailableToWatchdogApps = 131; - /** native declaration : headers\openvr_capi.h:604 */ + /** native declaration : headers\openvr_capi.h:803 */ public static final int EVRInitError_VRInitError_Init_WatchdogDisabledInSettings = 132; - /** native declaration : headers\openvr_capi.h:605 */ + /** native declaration : headers\openvr_capi.h:804 */ public static final int EVRInitError_VRInitError_Init_VRDashboardNotFound = 133; - /** native declaration : headers\openvr_capi.h:606 */ + /** native declaration : headers\openvr_capi.h:805 */ public static final int EVRInitError_VRInitError_Init_VRDashboardStartupFailed = 134; - /** native declaration : headers\openvr_capi.h:607 */ + /** native declaration : headers\openvr_capi.h:806 */ + public static final int EVRInitError_VRInitError_Init_VRHomeNotFound = 135; + /** native declaration : headers\openvr_capi.h:807 */ + public static final int EVRInitError_VRInitError_Init_VRHomeStartupFailed = 136; + /** native declaration : headers\openvr_capi.h:808 */ + public static final int EVRInitError_VRInitError_Init_RebootingBusy = 137; + /** native declaration : headers\openvr_capi.h:809 */ + public static final int EVRInitError_VRInitError_Init_FirmwareUpdateBusy = 138; + /** native declaration : headers\openvr_capi.h:810 */ + public static final int EVRInitError_VRInitError_Init_FirmwareRecoveryBusy = 139; + /** native declaration : headers\openvr_capi.h:811 */ + public static final int EVRInitError_VRInitError_Init_USBServiceBusy = 140; + /** native declaration : headers\openvr_capi.h:812 */ + public static final int EVRInitError_VRInitError_Init_VRWebHelperStartupFailed = 141; + /** native declaration : headers\openvr_capi.h:813 */ + public static final int EVRInitError_VRInitError_Init_TrackerManagerInitFailed = 142; + /** native declaration : headers\openvr_capi.h:814 */ public static final int EVRInitError_VRInitError_Driver_Failed = 200; - /** native declaration : headers\openvr_capi.h:608 */ + /** native declaration : headers\openvr_capi.h:815 */ public static final int EVRInitError_VRInitError_Driver_Unknown = 201; - /** native declaration : headers\openvr_capi.h:609 */ + /** native declaration : headers\openvr_capi.h:816 */ public static final int EVRInitError_VRInitError_Driver_HmdUnknown = 202; - /** native declaration : headers\openvr_capi.h:610 */ + /** native declaration : headers\openvr_capi.h:817 */ public static final int EVRInitError_VRInitError_Driver_NotLoaded = 203; - /** native declaration : headers\openvr_capi.h:611 */ + /** native declaration : headers\openvr_capi.h:818 */ public static final int EVRInitError_VRInitError_Driver_RuntimeOutOfDate = 204; - /** native declaration : headers\openvr_capi.h:612 */ + /** native declaration : headers\openvr_capi.h:819 */ public static final int EVRInitError_VRInitError_Driver_HmdInUse = 205; - /** native declaration : headers\openvr_capi.h:613 */ + /** native declaration : headers\openvr_capi.h:820 */ public static final int EVRInitError_VRInitError_Driver_NotCalibrated = 206; - /** native declaration : headers\openvr_capi.h:614 */ + /** native declaration : headers\openvr_capi.h:821 */ public static final int EVRInitError_VRInitError_Driver_CalibrationInvalid = 207; - /** native declaration : headers\openvr_capi.h:615 */ + /** native declaration : headers\openvr_capi.h:822 */ public static final int EVRInitError_VRInitError_Driver_HmdDisplayNotFound = 208; - /** native declaration : headers\openvr_capi.h:616 */ + /** native declaration : headers\openvr_capi.h:823 */ public static final int EVRInitError_VRInitError_Driver_TrackedDeviceInterfaceUnknown = 209; - /** native declaration : headers\openvr_capi.h:617 */ + /** native declaration : headers\openvr_capi.h:824 */ public static final int EVRInitError_VRInitError_Driver_HmdDriverIdOutOfBounds = 211; - /** native declaration : headers\openvr_capi.h:618 */ + /** native declaration : headers\openvr_capi.h:825 */ public static final int EVRInitError_VRInitError_Driver_HmdDisplayMirrored = 212; - /** native declaration : headers\openvr_capi.h:619 */ + /** native declaration : headers\openvr_capi.h:826 */ public static final int EVRInitError_VRInitError_IPC_ServerInitFailed = 300; - /** native declaration : headers\openvr_capi.h:620 */ + /** native declaration : headers\openvr_capi.h:827 */ public static final int EVRInitError_VRInitError_IPC_ConnectFailed = 301; - /** native declaration : headers\openvr_capi.h:621 */ + /** native declaration : headers\openvr_capi.h:828 */ public static final int EVRInitError_VRInitError_IPC_SharedStateInitFailed = 302; - /** native declaration : headers\openvr_capi.h:622 */ + /** native declaration : headers\openvr_capi.h:829 */ public static final int EVRInitError_VRInitError_IPC_CompositorInitFailed = 303; - /** native declaration : headers\openvr_capi.h:623 */ + /** native declaration : headers\openvr_capi.h:830 */ public static final int EVRInitError_VRInitError_IPC_MutexInitFailed = 304; - /** native declaration : headers\openvr_capi.h:624 */ + /** native declaration : headers\openvr_capi.h:831 */ public static final int EVRInitError_VRInitError_IPC_Failed = 305; - /** native declaration : headers\openvr_capi.h:625 */ + /** native declaration : headers\openvr_capi.h:832 */ public static final int EVRInitError_VRInitError_IPC_CompositorConnectFailed = 306; - /** native declaration : headers\openvr_capi.h:626 */ + /** native declaration : headers\openvr_capi.h:833 */ public static final int EVRInitError_VRInitError_IPC_CompositorInvalidConnectResponse = 307; - /** native declaration : headers\openvr_capi.h:627 */ + /** native declaration : headers\openvr_capi.h:834 */ public static final int EVRInitError_VRInitError_IPC_ConnectFailedAfterMultipleAttempts = 308; - /** native declaration : headers\openvr_capi.h:628 */ + /** native declaration : headers\openvr_capi.h:835 */ public static final int EVRInitError_VRInitError_Compositor_Failed = 400; - /** native declaration : headers\openvr_capi.h:629 */ + /** native declaration : headers\openvr_capi.h:836 */ public static final int EVRInitError_VRInitError_Compositor_D3D11HardwareRequired = 401; - /** native declaration : headers\openvr_capi.h:630 */ + /** native declaration : headers\openvr_capi.h:837 */ public static final int EVRInitError_VRInitError_Compositor_FirmwareRequiresUpdate = 402; - /** native declaration : headers\openvr_capi.h:631 */ + /** native declaration : headers\openvr_capi.h:838 */ public static final int EVRInitError_VRInitError_Compositor_OverlayInitFailed = 403; - /** native declaration : headers\openvr_capi.h:632 */ + /** native declaration : headers\openvr_capi.h:839 */ public static final int EVRInitError_VRInitError_Compositor_ScreenshotsInitFailed = 404; - /** native declaration : headers\openvr_capi.h:633 */ + /** native declaration : headers\openvr_capi.h:840 */ + public static final int EVRInitError_VRInitError_Compositor_UnableToCreateDevice = 405; + /** native declaration : headers\openvr_capi.h:841 */ public static final int EVRInitError_VRInitError_VendorSpecific_UnableToConnectToOculusRuntime = 1000; - /** native declaration : headers\openvr_capi.h:634 */ + /** native declaration : headers\openvr_capi.h:842 */ + public static final int EVRInitError_VRInitError_VendorSpecific_WindowsNotInDevMode = 1001; + /** native declaration : headers\openvr_capi.h:843 */ public static final int EVRInitError_VRInitError_VendorSpecific_HmdFound_CantOpenDevice = 1101; - /** native declaration : headers\openvr_capi.h:635 */ + /** native declaration : headers\openvr_capi.h:844 */ public static final int EVRInitError_VRInitError_VendorSpecific_HmdFound_UnableToRequestConfigStart = 1102; - /** native declaration : headers\openvr_capi.h:636 */ + /** native declaration : headers\openvr_capi.h:845 */ public static final int EVRInitError_VRInitError_VendorSpecific_HmdFound_NoStoredConfig = 1103; - /** native declaration : headers\openvr_capi.h:637 */ + /** native declaration : headers\openvr_capi.h:846 */ public static final int EVRInitError_VRInitError_VendorSpecific_HmdFound_ConfigTooBig = 1104; - /** native declaration : headers\openvr_capi.h:638 */ + /** native declaration : headers\openvr_capi.h:847 */ public static final int EVRInitError_VRInitError_VendorSpecific_HmdFound_ConfigTooSmall = 1105; - /** native declaration : headers\openvr_capi.h:639 */ + /** native declaration : headers\openvr_capi.h:848 */ public static final int EVRInitError_VRInitError_VendorSpecific_HmdFound_UnableToInitZLib = 1106; - /** native declaration : headers\openvr_capi.h:640 */ + /** native declaration : headers\openvr_capi.h:849 */ public static final int EVRInitError_VRInitError_VendorSpecific_HmdFound_CantReadFirmwareVersion = 1107; - /** native declaration : headers\openvr_capi.h:641 */ + /** native declaration : headers\openvr_capi.h:850 */ public static final int EVRInitError_VRInitError_VendorSpecific_HmdFound_UnableToSendUserDataStart = 1108; - /** native declaration : headers\openvr_capi.h:642 */ + /** native declaration : headers\openvr_capi.h:851 */ public static final int EVRInitError_VRInitError_VendorSpecific_HmdFound_UnableToGetUserDataStart = 1109; - /** native declaration : headers\openvr_capi.h:643 */ + /** native declaration : headers\openvr_capi.h:852 */ public static final int EVRInitError_VRInitError_VendorSpecific_HmdFound_UnableToGetUserDataNext = 1110; - /** native declaration : headers\openvr_capi.h:644 */ + /** native declaration : headers\openvr_capi.h:853 */ public static final int EVRInitError_VRInitError_VendorSpecific_HmdFound_UserDataAddressRange = 1111; - /** native declaration : headers\openvr_capi.h:645 */ + /** native declaration : headers\openvr_capi.h:854 */ public static final int EVRInitError_VRInitError_VendorSpecific_HmdFound_UserDataError = 1112; - /** native declaration : headers\openvr_capi.h:646 */ + /** native declaration : headers\openvr_capi.h:855 */ public static final int EVRInitError_VRInitError_VendorSpecific_HmdFound_ConfigFailedSanityCheck = 1113; - /** native declaration : headers\openvr_capi.h:647 */ + /** native declaration : headers\openvr_capi.h:856 */ public static final int EVRInitError_VRInitError_Steam_SteamInstallationNotFound = 2000; - }; - - - + }; /** - * native declaration : headers\openvr_capi.h:656
    + * native declaration : headers\openvr_capi.h:865
    * enum values */ public static interface EVRScreenshotType { - /** native declaration : headers\openvr_capi.h:650 */ + /** native declaration : headers\openvr_capi.h:859 */ public static final int EVRScreenshotType_VRScreenshotType_None = 0; - /** native declaration : headers\openvr_capi.h:651 */ + /** native declaration : headers\openvr_capi.h:860 */ public static final int EVRScreenshotType_VRScreenshotType_Mono = 1; - /** native declaration : headers\openvr_capi.h:652 */ + /** native declaration : headers\openvr_capi.h:861 */ public static final int EVRScreenshotType_VRScreenshotType_Stereo = 2; - /** native declaration : headers\openvr_capi.h:653 */ + /** native declaration : headers\openvr_capi.h:862 */ public static final int EVRScreenshotType_VRScreenshotType_Cubemap = 3; - /** native declaration : headers\openvr_capi.h:654 */ + /** native declaration : headers\openvr_capi.h:863 */ public static final int EVRScreenshotType_VRScreenshotType_MonoPanorama = 4; - /** native declaration : headers\openvr_capi.h:655 */ + /** native declaration : headers\openvr_capi.h:864 */ public static final int EVRScreenshotType_VRScreenshotType_StereoPanorama = 5; }; /** - * native declaration : headers\openvr_capi.h:660
    + * native declaration : headers\openvr_capi.h:869
    * enum values */ public static interface EVRScreenshotPropertyFilenames { - /** native declaration : headers\openvr_capi.h:658 */ + /** native declaration : headers\openvr_capi.h:867 */ public static final int EVRScreenshotPropertyFilenames_VRScreenshotPropertyFilenames_Preview = 0; - /** native declaration : headers\openvr_capi.h:659 */ + /** native declaration : headers\openvr_capi.h:868 */ public static final int EVRScreenshotPropertyFilenames_VRScreenshotPropertyFilenames_VR = 1; }; /** - * native declaration : headers\openvr_capi.h:679
    + * native declaration : headers\openvr_capi.h:888
    * enum values */ public static interface EVRTrackedCameraError { - /** native declaration : headers\openvr_capi.h:662 */ + /** native declaration : headers\openvr_capi.h:871 */ public static final int EVRTrackedCameraError_VRTrackedCameraError_None = 0; - /** native declaration : headers\openvr_capi.h:663 */ + /** native declaration : headers\openvr_capi.h:872 */ public static final int EVRTrackedCameraError_VRTrackedCameraError_OperationFailed = 100; - /** native declaration : headers\openvr_capi.h:664 */ + /** native declaration : headers\openvr_capi.h:873 */ public static final int EVRTrackedCameraError_VRTrackedCameraError_InvalidHandle = 101; - /** native declaration : headers\openvr_capi.h:665 */ + /** native declaration : headers\openvr_capi.h:874 */ public static final int EVRTrackedCameraError_VRTrackedCameraError_InvalidFrameHeaderVersion = 102; - /** native declaration : headers\openvr_capi.h:666 */ + /** native declaration : headers\openvr_capi.h:875 */ public static final int EVRTrackedCameraError_VRTrackedCameraError_OutOfHandles = 103; - /** native declaration : headers\openvr_capi.h:667 */ + /** native declaration : headers\openvr_capi.h:876 */ public static final int EVRTrackedCameraError_VRTrackedCameraError_IPCFailure = 104; - /** native declaration : headers\openvr_capi.h:668 */ + /** native declaration : headers\openvr_capi.h:877 */ public static final int EVRTrackedCameraError_VRTrackedCameraError_NotSupportedForThisDevice = 105; - /** native declaration : headers\openvr_capi.h:669 */ + /** native declaration : headers\openvr_capi.h:878 */ public static final int EVRTrackedCameraError_VRTrackedCameraError_SharedMemoryFailure = 106; - /** native declaration : headers\openvr_capi.h:670 */ + /** native declaration : headers\openvr_capi.h:879 */ public static final int EVRTrackedCameraError_VRTrackedCameraError_FrameBufferingFailure = 107; - /** native declaration : headers\openvr_capi.h:671 */ + /** native declaration : headers\openvr_capi.h:880 */ public static final int EVRTrackedCameraError_VRTrackedCameraError_StreamSetupFailure = 108; - /** native declaration : headers\openvr_capi.h:672 */ + /** native declaration : headers\openvr_capi.h:881 */ public static final int EVRTrackedCameraError_VRTrackedCameraError_InvalidGLTextureId = 109; - /** native declaration : headers\openvr_capi.h:673 */ + /** native declaration : headers\openvr_capi.h:882 */ public static final int EVRTrackedCameraError_VRTrackedCameraError_InvalidSharedTextureHandle = 110; - /** native declaration : headers\openvr_capi.h:674 */ + /** native declaration : headers\openvr_capi.h:883 */ public static final int EVRTrackedCameraError_VRTrackedCameraError_FailedToGetGLTextureId = 111; - /** native declaration : headers\openvr_capi.h:675 */ + /** native declaration : headers\openvr_capi.h:884 */ public static final int EVRTrackedCameraError_VRTrackedCameraError_SharedTextureFailure = 112; - /** native declaration : headers\openvr_capi.h:676 */ + /** native declaration : headers\openvr_capi.h:885 */ public static final int EVRTrackedCameraError_VRTrackedCameraError_NoFrameAvailable = 113; - /** native declaration : headers\openvr_capi.h:677 */ + /** native declaration : headers\openvr_capi.h:886 */ public static final int EVRTrackedCameraError_VRTrackedCameraError_InvalidArgument = 114; - /** native declaration : headers\openvr_capi.h:678 */ + /** native declaration : headers\openvr_capi.h:887 */ public static final int EVRTrackedCameraError_VRTrackedCameraError_InvalidFrameBufferSize = 115; }; /** - * native declaration : headers\openvr_capi.h:685
    + * native declaration : headers\openvr_capi.h:894
    + * enum values + */ + public static interface EVRTrackedCameraFrameLayout { + /** native declaration : headers\openvr_capi.h:890 */ + public static final int EVRTrackedCameraFrameLayout_Mono = 1; + /** native declaration : headers\openvr_capi.h:891 */ + public static final int EVRTrackedCameraFrameLayout_Stereo = 2; + /** native declaration : headers\openvr_capi.h:892 */ + public static final int EVRTrackedCameraFrameLayout_VerticalLayout = 16; + /** native declaration : headers\openvr_capi.h:893 */ + public static final int EVRTrackedCameraFrameLayout_HorizontalLayout = 32; + }; + /** + * native declaration : headers\openvr_capi.h:900
    * enum values */ public static interface EVRTrackedCameraFrameType { - /** native declaration : headers\openvr_capi.h:681 */ + /** native declaration : headers\openvr_capi.h:896 */ public static final int EVRTrackedCameraFrameType_VRTrackedCameraFrameType_Distorted = 0; - /** native declaration : headers\openvr_capi.h:682 */ + /** native declaration : headers\openvr_capi.h:897 */ public static final int EVRTrackedCameraFrameType_VRTrackedCameraFrameType_Undistorted = 1; - /** native declaration : headers\openvr_capi.h:683 */ + /** native declaration : headers\openvr_capi.h:898 */ public static final int EVRTrackedCameraFrameType_VRTrackedCameraFrameType_MaximumUndistorted = 2; - /** native declaration : headers\openvr_capi.h:684 */ + /** native declaration : headers\openvr_capi.h:899 */ public static final int EVRTrackedCameraFrameType_MAX_CAMERA_FRAME_TYPES = 3; }; /** - * native declaration : headers\openvr_capi.h:707
    + * native declaration : headers\openvr_capi.h:905
    + * enum values + */ + public static interface EVSync { + /** native declaration : headers\openvr_capi.h:902 */ + public static final int EVSync_VSync_None = 0; + /** native declaration : headers\openvr_capi.h:903 */ + public static final int EVSync_VSync_WaitRender = 1; + /** native declaration : headers\openvr_capi.h:904 */ + public static final int EVSync_VSync_NoWaitRender = 2; + }; + /** + * native declaration : headers\openvr_capi.h:909
    + * enum values + */ + public static interface EVRMuraCorrectionMode { + /** native declaration : headers\openvr_capi.h:907 */ + public static final int EVRMuraCorrectionMode_Default = 0; + /** native declaration : headers\openvr_capi.h:908 */ + public static final int EVRMuraCorrectionMode_NoCorrection = 1; + }; + /** + * native declaration : headers\openvr_capi.h:917
    + * enum values + */ + public static interface Imu_OffScaleFlags { + /** native declaration : headers\openvr_capi.h:911 */ + public static final int Imu_OffScaleFlags_OffScale_AccelX = 1; + /** native declaration : headers\openvr_capi.h:912 */ + public static final int Imu_OffScaleFlags_OffScale_AccelY = 2; + /** native declaration : headers\openvr_capi.h:913 */ + public static final int Imu_OffScaleFlags_OffScale_AccelZ = 4; + /** native declaration : headers\openvr_capi.h:914 */ + public static final int Imu_OffScaleFlags_OffScale_GyroX = 8; + /** native declaration : headers\openvr_capi.h:915 */ + public static final int Imu_OffScaleFlags_OffScale_GyroY = 16; + /** native declaration : headers\openvr_capi.h:916 */ + public static final int Imu_OffScaleFlags_OffScale_GyroZ = 32; + }; + /** + * native declaration : headers\openvr_capi.h:940
    * enum values */ public static interface EVRApplicationError { - /** native declaration : headers\openvr_capi.h:687 */ + /** native declaration : headers\openvr_capi.h:919 */ public static final int EVRApplicationError_VRApplicationError_None = 0; - /** native declaration : headers\openvr_capi.h:688 */ + /** native declaration : headers\openvr_capi.h:920 */ public static final int EVRApplicationError_VRApplicationError_AppKeyAlreadyExists = 100; - /** native declaration : headers\openvr_capi.h:689 */ + /** native declaration : headers\openvr_capi.h:921 */ public static final int EVRApplicationError_VRApplicationError_NoManifest = 101; - /** native declaration : headers\openvr_capi.h:690 */ + /** native declaration : headers\openvr_capi.h:922 */ public static final int EVRApplicationError_VRApplicationError_NoApplication = 102; - /** native declaration : headers\openvr_capi.h:691 */ + /** native declaration : headers\openvr_capi.h:923 */ public static final int EVRApplicationError_VRApplicationError_InvalidIndex = 103; - /** native declaration : headers\openvr_capi.h:692 */ + /** native declaration : headers\openvr_capi.h:924 */ public static final int EVRApplicationError_VRApplicationError_UnknownApplication = 104; - /** native declaration : headers\openvr_capi.h:693 */ + /** native declaration : headers\openvr_capi.h:925 */ public static final int EVRApplicationError_VRApplicationError_IPCFailed = 105; - /** native declaration : headers\openvr_capi.h:694 */ + /** native declaration : headers\openvr_capi.h:926 */ public static final int EVRApplicationError_VRApplicationError_ApplicationAlreadyRunning = 106; - /** native declaration : headers\openvr_capi.h:695 */ + /** native declaration : headers\openvr_capi.h:927 */ public static final int EVRApplicationError_VRApplicationError_InvalidManifest = 107; - /** native declaration : headers\openvr_capi.h:696 */ + /** native declaration : headers\openvr_capi.h:928 */ public static final int EVRApplicationError_VRApplicationError_InvalidApplication = 108; - /** native declaration : headers\openvr_capi.h:697 */ + /** native declaration : headers\openvr_capi.h:929 */ public static final int EVRApplicationError_VRApplicationError_LaunchFailed = 109; - /** native declaration : headers\openvr_capi.h:698 */ + /** native declaration : headers\openvr_capi.h:930 */ public static final int EVRApplicationError_VRApplicationError_ApplicationAlreadyStarting = 110; - /** native declaration : headers\openvr_capi.h:699 */ + /** native declaration : headers\openvr_capi.h:931 */ public static final int EVRApplicationError_VRApplicationError_LaunchInProgress = 111; - /** native declaration : headers\openvr_capi.h:700 */ + /** native declaration : headers\openvr_capi.h:932 */ public static final int EVRApplicationError_VRApplicationError_OldApplicationQuitting = 112; - /** native declaration : headers\openvr_capi.h:701 */ + /** native declaration : headers\openvr_capi.h:933 */ public static final int EVRApplicationError_VRApplicationError_TransitionAborted = 113; - /** native declaration : headers\openvr_capi.h:702 */ + /** native declaration : headers\openvr_capi.h:934 */ public static final int EVRApplicationError_VRApplicationError_IsTemplate = 114; - /** native declaration : headers\openvr_capi.h:703 */ + /** native declaration : headers\openvr_capi.h:935 */ + public static final int EVRApplicationError_VRApplicationError_SteamVRIsExiting = 115; + /** native declaration : headers\openvr_capi.h:936 */ public static final int EVRApplicationError_VRApplicationError_BufferTooSmall = 200; - /** native declaration : headers\openvr_capi.h:704 */ + /** native declaration : headers\openvr_capi.h:937 */ public static final int EVRApplicationError_VRApplicationError_PropertyNotSet = 201; - /** native declaration : headers\openvr_capi.h:705 */ + /** native declaration : headers\openvr_capi.h:938 */ public static final int EVRApplicationError_VRApplicationError_UnknownProperty = 202; - /** native declaration : headers\openvr_capi.h:706 */ + /** native declaration : headers\openvr_capi.h:939 */ public static final int EVRApplicationError_VRApplicationError_InvalidParameter = 203; }; /** - * native declaration : headers\openvr_capi.h:724
    + * native declaration : headers\openvr_capi.h:959
    * enum values */ public static interface EVRApplicationProperty { - /** native declaration : headers\openvr_capi.h:709 */ + /** native declaration : headers\openvr_capi.h:942 */ public static final int EVRApplicationProperty_VRApplicationProperty_Name_String = 0; - /** native declaration : headers\openvr_capi.h:710 */ + /** native declaration : headers\openvr_capi.h:943 */ public static final int EVRApplicationProperty_VRApplicationProperty_LaunchType_String = 11; - /** native declaration : headers\openvr_capi.h:711 */ + /** native declaration : headers\openvr_capi.h:944 */ public static final int EVRApplicationProperty_VRApplicationProperty_WorkingDirectory_String = 12; - /** native declaration : headers\openvr_capi.h:712 */ + /** native declaration : headers\openvr_capi.h:945 */ public static final int EVRApplicationProperty_VRApplicationProperty_BinaryPath_String = 13; - /** native declaration : headers\openvr_capi.h:713 */ + /** native declaration : headers\openvr_capi.h:946 */ public static final int EVRApplicationProperty_VRApplicationProperty_Arguments_String = 14; - /** native declaration : headers\openvr_capi.h:714 */ + /** native declaration : headers\openvr_capi.h:947 */ public static final int EVRApplicationProperty_VRApplicationProperty_URL_String = 15; - /** native declaration : headers\openvr_capi.h:715 */ + /** native declaration : headers\openvr_capi.h:948 */ public static final int EVRApplicationProperty_VRApplicationProperty_Description_String = 50; - /** native declaration : headers\openvr_capi.h:716 */ + /** native declaration : headers\openvr_capi.h:949 */ public static final int EVRApplicationProperty_VRApplicationProperty_NewsURL_String = 51; - /** native declaration : headers\openvr_capi.h:717 */ + /** native declaration : headers\openvr_capi.h:950 */ public static final int EVRApplicationProperty_VRApplicationProperty_ImagePath_String = 52; - /** native declaration : headers\openvr_capi.h:718 */ + /** native declaration : headers\openvr_capi.h:951 */ public static final int EVRApplicationProperty_VRApplicationProperty_Source_String = 53; - /** native declaration : headers\openvr_capi.h:719 */ + /** native declaration : headers\openvr_capi.h:952 */ + public static final int EVRApplicationProperty_VRApplicationProperty_ActionManifestURL_String = 54; + /** native declaration : headers\openvr_capi.h:953 */ public static final int EVRApplicationProperty_VRApplicationProperty_IsDashboardOverlay_Bool = 60; - /** native declaration : headers\openvr_capi.h:720 */ + /** native declaration : headers\openvr_capi.h:954 */ public static final int EVRApplicationProperty_VRApplicationProperty_IsTemplate_Bool = 61; - /** native declaration : headers\openvr_capi.h:721 */ + /** native declaration : headers\openvr_capi.h:955 */ public static final int EVRApplicationProperty_VRApplicationProperty_IsInstanced_Bool = 62; - /** native declaration : headers\openvr_capi.h:722 */ + /** native declaration : headers\openvr_capi.h:956 */ public static final int EVRApplicationProperty_VRApplicationProperty_IsInternal_Bool = 63; - /** native declaration : headers\openvr_capi.h:723 */ + /** native declaration : headers\openvr_capi.h:957 */ + public static final int EVRApplicationProperty_VRApplicationProperty_WantsCompositorPauseInStandby_Bool = 64; + /** native declaration : headers\openvr_capi.h:958 */ public static final int EVRApplicationProperty_VRApplicationProperty_LastLaunchTime_Uint64 = 70; }; /** - * native declaration : headers\openvr_capi.h:730
    + * native declaration : headers\openvr_capi.h:965
    * enum values */ public static interface EVRApplicationTransitionState { - /** native declaration : headers\openvr_capi.h:726 */ + /** native declaration : headers\openvr_capi.h:961 */ public static final int EVRApplicationTransitionState_VRApplicationTransition_None = 0; - /** native declaration : headers\openvr_capi.h:727 */ + /** native declaration : headers\openvr_capi.h:962 */ public static final int EVRApplicationTransitionState_VRApplicationTransition_OldAppQuitSent = 10; - /** native declaration : headers\openvr_capi.h:728 */ + /** native declaration : headers\openvr_capi.h:963 */ public static final int EVRApplicationTransitionState_VRApplicationTransition_WaitingForExternalLaunch = 11; - /** native declaration : headers\openvr_capi.h:729 */ + /** native declaration : headers\openvr_capi.h:964 */ public static final int EVRApplicationTransitionState_VRApplicationTransition_NewAppLaunched = 20; }; /** - * native declaration : headers\openvr_capi.h:742
    + * native declaration : headers\openvr_capi.h:977
    * enum values */ public static interface ChaperoneCalibrationState { - /** native declaration : headers\openvr_capi.h:732 */ + /** native declaration : headers\openvr_capi.h:967 */ public static final int ChaperoneCalibrationState_OK = 1; - /** native declaration : headers\openvr_capi.h:733 */ + /** native declaration : headers\openvr_capi.h:968 */ public static final int ChaperoneCalibrationState_Warning = 100; - /** native declaration : headers\openvr_capi.h:734 */ + /** native declaration : headers\openvr_capi.h:969 */ public static final int ChaperoneCalibrationState_Warning_BaseStationMayHaveMoved = 101; - /** native declaration : headers\openvr_capi.h:735 */ + /** native declaration : headers\openvr_capi.h:970 */ public static final int ChaperoneCalibrationState_Warning_BaseStationRemoved = 102; - /** native declaration : headers\openvr_capi.h:736 */ + /** native declaration : headers\openvr_capi.h:971 */ public static final int ChaperoneCalibrationState_Warning_SeatedBoundsInvalid = 103; - /** native declaration : headers\openvr_capi.h:737 */ + /** native declaration : headers\openvr_capi.h:972 */ public static final int ChaperoneCalibrationState_Error = 200; - /** native declaration : headers\openvr_capi.h:738 */ + /** native declaration : headers\openvr_capi.h:973 */ public static final int ChaperoneCalibrationState_Error_BaseStationUninitialized = 201; - /** native declaration : headers\openvr_capi.h:739 */ + /** native declaration : headers\openvr_capi.h:974 */ public static final int ChaperoneCalibrationState_Error_BaseStationConflict = 202; - /** native declaration : headers\openvr_capi.h:740 */ + /** native declaration : headers\openvr_capi.h:975 */ public static final int ChaperoneCalibrationState_Error_PlayAreaInvalid = 203; - /** native declaration : headers\openvr_capi.h:741 */ + /** native declaration : headers\openvr_capi.h:976 */ public static final int ChaperoneCalibrationState_Error_CollisionBoundsInvalid = 204; }; /** - * native declaration : headers\openvr_capi.h:746
    + * native declaration : headers\openvr_capi.h:981
    * enum values */ public static interface EChaperoneConfigFile { - /** native declaration : headers\openvr_capi.h:744 */ + /** native declaration : headers\openvr_capi.h:979 */ public static final int EChaperoneConfigFile_Live = 1; - /** native declaration : headers\openvr_capi.h:745 */ + /** native declaration : headers\openvr_capi.h:980 */ public static final int EChaperoneConfigFile_Temp = 2; }; /** - * native declaration : headers\openvr_capi.h:749
    + * native declaration : headers\openvr_capi.h:984
    * enum values */ public static interface EChaperoneImportFlags { - /** native declaration : headers\openvr_capi.h:748 */ + /** native declaration : headers\openvr_capi.h:983 */ public static final int EChaperoneImportFlags_EChaperoneImport_BoundsOnly = 1; }; /** - * native declaration : headers\openvr_capi.h:762
    + * native declaration : headers\openvr_capi.h:998
    * enum values */ public static interface EVRCompositorError { - /** native declaration : headers\openvr_capi.h:751 */ + /** native declaration : headers\openvr_capi.h:986 */ public static final int EVRCompositorError_VRCompositorError_None = 0; - /** native declaration : headers\openvr_capi.h:752 */ + /** native declaration : headers\openvr_capi.h:987 */ public static final int EVRCompositorError_VRCompositorError_RequestFailed = 1; - /** native declaration : headers\openvr_capi.h:753 */ + /** native declaration : headers\openvr_capi.h:988 */ public static final int EVRCompositorError_VRCompositorError_IncompatibleVersion = 100; - /** native declaration : headers\openvr_capi.h:754 */ + /** native declaration : headers\openvr_capi.h:989 */ public static final int EVRCompositorError_VRCompositorError_DoNotHaveFocus = 101; - /** native declaration : headers\openvr_capi.h:755 */ + /** native declaration : headers\openvr_capi.h:990 */ public static final int EVRCompositorError_VRCompositorError_InvalidTexture = 102; - /** native declaration : headers\openvr_capi.h:756 */ + /** native declaration : headers\openvr_capi.h:991 */ public static final int EVRCompositorError_VRCompositorError_IsNotSceneApplication = 103; - /** native declaration : headers\openvr_capi.h:757 */ + /** native declaration : headers\openvr_capi.h:992 */ public static final int EVRCompositorError_VRCompositorError_TextureIsOnWrongDevice = 104; - /** native declaration : headers\openvr_capi.h:758 */ + /** native declaration : headers\openvr_capi.h:993 */ public static final int EVRCompositorError_VRCompositorError_TextureUsesUnsupportedFormat = 105; - /** native declaration : headers\openvr_capi.h:759 */ + /** native declaration : headers\openvr_capi.h:994 */ public static final int EVRCompositorError_VRCompositorError_SharedTexturesNotSupported = 106; - /** native declaration : headers\openvr_capi.h:760 */ + /** native declaration : headers\openvr_capi.h:995 */ public static final int EVRCompositorError_VRCompositorError_IndexOutOfRange = 107; - /** native declaration : headers\openvr_capi.h:761 */ + /** native declaration : headers\openvr_capi.h:996 */ public static final int EVRCompositorError_VRCompositorError_AlreadySubmitted = 108; - }; - - - + /** native declaration : headers\openvr_capi.h:997 */ + public static final int EVRCompositorError_VRCompositorError_InvalidBounds = 109; + }; + /** + * native declaration : headers\openvr_capi.h:1003
    + * enum values + */ + public static interface EVRCompositorTimingMode { + /** native declaration : headers\openvr_capi.h:1000 */ + public static final int EVRCompositorTimingMode_VRCompositorTimingMode_Implicit = 0; + /** native declaration : headers\openvr_capi.h:1001 */ + public static final int EVRCompositorTimingMode_VRCompositorTimingMode_Explicit_RuntimePerformsPostPresentHandoff = 1; + /** native declaration : headers\openvr_capi.h:1002 */ + public static final int EVRCompositorTimingMode_VRCompositorTimingMode_Explicit_ApplicationPerformsPostPresentHandoff = 2; + }; /** - * native declaration : headers\openvr_capi.h:766
    + * native declaration : headers\openvr_capi.h:1008
    * enum values */ public static interface VROverlayInputMethod { - /** native declaration : headers\openvr_capi.h:764 */ + /** native declaration : headers\openvr_capi.h:1005 */ public static final int VROverlayInputMethod_None = 0; - /** native declaration : headers\openvr_capi.h:765 */ + /** native declaration : headers\openvr_capi.h:1006 */ public static final int VROverlayInputMethod_Mouse = 1; + /** native declaration : headers\openvr_capi.h:1007 */ + public static final int VROverlayInputMethod_DualAnalog = 2; }; /** - * native declaration : headers\openvr_capi.h:772
    + * native declaration : headers\openvr_capi.h:1014
    * enum values */ public static interface VROverlayTransformType { - /** native declaration : headers\openvr_capi.h:768 */ + /** native declaration : headers\openvr_capi.h:1010 */ public static final int VROverlayTransformType_VROverlayTransform_Absolute = 0; - /** native declaration : headers\openvr_capi.h:769 */ + /** native declaration : headers\openvr_capi.h:1011 */ public static final int VROverlayTransformType_VROverlayTransform_TrackedDeviceRelative = 1; - /** native declaration : headers\openvr_capi.h:770 */ + /** native declaration : headers\openvr_capi.h:1012 */ public static final int VROverlayTransformType_VROverlayTransform_SystemOverlay = 2; - /** native declaration : headers\openvr_capi.h:771 */ + /** native declaration : headers\openvr_capi.h:1013 */ public static final int VROverlayTransformType_VROverlayTransform_TrackedComponent = 3; }; /** - * native declaration : headers\openvr_capi.h:790
    + * native declaration : headers\openvr_capi.h:1032
    * enum values */ public static interface VROverlayFlags { - /** native declaration : headers\openvr_capi.h:774 */ + /** native declaration : headers\openvr_capi.h:1016 */ public static final int VROverlayFlags_None = 0; - /** native declaration : headers\openvr_capi.h:775 */ + /** native declaration : headers\openvr_capi.h:1017 */ public static final int VROverlayFlags_Curved = 1; - /** native declaration : headers\openvr_capi.h:776 */ + /** native declaration : headers\openvr_capi.h:1018 */ public static final int VROverlayFlags_RGSS4X = 2; - /** native declaration : headers\openvr_capi.h:777 */ + /** native declaration : headers\openvr_capi.h:1019 */ public static final int VROverlayFlags_NoDashboardTab = 3; - /** native declaration : headers\openvr_capi.h:778 */ + /** native declaration : headers\openvr_capi.h:1020 */ public static final int VROverlayFlags_AcceptsGamepadEvents = 4; - /** native declaration : headers\openvr_capi.h:779 */ + /** native declaration : headers\openvr_capi.h:1021 */ public static final int VROverlayFlags_ShowGamepadFocus = 5; - /** native declaration : headers\openvr_capi.h:780 */ + /** native declaration : headers\openvr_capi.h:1022 */ public static final int VROverlayFlags_SendVRScrollEvents = 6; - /** native declaration : headers\openvr_capi.h:781 */ + /** native declaration : headers\openvr_capi.h:1023 */ public static final int VROverlayFlags_SendVRTouchpadEvents = 7; - /** native declaration : headers\openvr_capi.h:782 */ + /** native declaration : headers\openvr_capi.h:1024 */ public static final int VROverlayFlags_ShowTouchPadScrollWheel = 8; - /** native declaration : headers\openvr_capi.h:783 */ + /** native declaration : headers\openvr_capi.h:1025 */ public static final int VROverlayFlags_TransferOwnershipToInternalProcess = 9; - /** native declaration : headers\openvr_capi.h:784 */ + /** native declaration : headers\openvr_capi.h:1026 */ public static final int VROverlayFlags_SideBySide_Parallel = 10; - /** native declaration : headers\openvr_capi.h:785 */ + /** native declaration : headers\openvr_capi.h:1027 */ public static final int VROverlayFlags_SideBySide_Crossed = 11; - /** native declaration : headers\openvr_capi.h:786 */ + /** native declaration : headers\openvr_capi.h:1028 */ public static final int VROverlayFlags_Panorama = 12; - /** native declaration : headers\openvr_capi.h:787 */ + /** native declaration : headers\openvr_capi.h:1029 */ public static final int VROverlayFlags_StereoPanorama = 13; - /** native declaration : headers\openvr_capi.h:788 */ + /** native declaration : headers\openvr_capi.h:1030 */ public static final int VROverlayFlags_SortWithNonSceneOverlays = 14; - /** native declaration : headers\openvr_capi.h:789 */ + /** native declaration : headers\openvr_capi.h:1031 */ public static final int VROverlayFlags_VisibleInDashboard = 15; }; /** - * native declaration : headers\openvr_capi.h:799
    + * native declaration : headers\openvr_capi.h:1041
    * enum values */ public static interface VRMessageOverlayResponse { - /** native declaration : headers\openvr_capi.h:792 */ + /** native declaration : headers\openvr_capi.h:1034 */ public static final int VRMessageOverlayResponse_ButtonPress_0 = 0; - /** native declaration : headers\openvr_capi.h:793 */ + /** native declaration : headers\openvr_capi.h:1035 */ public static final int VRMessageOverlayResponse_ButtonPress_1 = 1; - /** native declaration : headers\openvr_capi.h:794 */ + /** native declaration : headers\openvr_capi.h:1036 */ public static final int VRMessageOverlayResponse_ButtonPress_2 = 2; - /** native declaration : headers\openvr_capi.h:795 */ + /** native declaration : headers\openvr_capi.h:1037 */ public static final int VRMessageOverlayResponse_ButtonPress_3 = 3; - /** native declaration : headers\openvr_capi.h:796 */ + /** native declaration : headers\openvr_capi.h:1038 */ public static final int VRMessageOverlayResponse_CouldntFindSystemOverlay = 4; - /** native declaration : headers\openvr_capi.h:797 */ + /** native declaration : headers\openvr_capi.h:1039 */ public static final int VRMessageOverlayResponse_CouldntFindOrCreateClientOverlay = 5; - /** native declaration : headers\openvr_capi.h:798 */ + /** native declaration : headers\openvr_capi.h:1040 */ public static final int VRMessageOverlayResponse_ApplicationQuit = 6; }; /** - * native declaration : headers\openvr_capi.h:804
    + * native declaration : headers\openvr_capi.h:1046
    * enum values */ public static interface EGamepadTextInputMode { - /** native declaration : headers\openvr_capi.h:801 */ + /** native declaration : headers\openvr_capi.h:1043 */ public static final int EGamepadTextInputMode_k_EGamepadTextInputModeNormal = 0; - /** native declaration : headers\openvr_capi.h:802 */ + /** native declaration : headers\openvr_capi.h:1044 */ public static final int EGamepadTextInputMode_k_EGamepadTextInputModePassword = 1; - /** native declaration : headers\openvr_capi.h:803 */ + /** native declaration : headers\openvr_capi.h:1045 */ public static final int EGamepadTextInputMode_k_EGamepadTextInputModeSubmit = 2; }; /** - * native declaration : headers\openvr_capi.h:808
    + * native declaration : headers\openvr_capi.h:1050
    * enum values */ public static interface EGamepadTextInputLineMode { - /** native declaration : headers\openvr_capi.h:806 */ + /** native declaration : headers\openvr_capi.h:1048 */ public static final int EGamepadTextInputLineMode_k_EGamepadTextInputLineModeSingleLine = 0; - /** native declaration : headers\openvr_capi.h:807 */ + /** native declaration : headers\openvr_capi.h:1049 */ public static final int EGamepadTextInputLineMode_k_EGamepadTextInputLineModeMultipleLines = 1; }; /** - * native declaration : headers\openvr_capi.h:815
    + * native declaration : headers\openvr_capi.h:1057
    * enum values */ public static interface EOverlayDirection { - /** native declaration : headers\openvr_capi.h:810 */ + /** native declaration : headers\openvr_capi.h:1052 */ public static final int EOverlayDirection_OverlayDirection_Up = 0; - /** native declaration : headers\openvr_capi.h:811 */ + /** native declaration : headers\openvr_capi.h:1053 */ public static final int EOverlayDirection_OverlayDirection_Down = 1; - /** native declaration : headers\openvr_capi.h:812 */ + /** native declaration : headers\openvr_capi.h:1054 */ public static final int EOverlayDirection_OverlayDirection_Left = 2; - /** native declaration : headers\openvr_capi.h:813 */ + /** native declaration : headers\openvr_capi.h:1055 */ public static final int EOverlayDirection_OverlayDirection_Right = 3; - /** native declaration : headers\openvr_capi.h:814 */ + /** native declaration : headers\openvr_capi.h:1056 */ public static final int EOverlayDirection_OverlayDirection_Count = 4; }; /** - * native declaration : headers\openvr_capi.h:819
    + * native declaration : headers\openvr_capi.h:1061
    * enum values */ public static interface EVROverlayIntersectionMaskPrimitiveType { - /** native declaration : headers\openvr_capi.h:817 */ + /** native declaration : headers\openvr_capi.h:1059 */ public static final int EVROverlayIntersectionMaskPrimitiveType_OverlayIntersectionPrimitiveType_Rectangle = 0; - /** native declaration : headers\openvr_capi.h:818 */ + /** native declaration : headers\openvr_capi.h:1060 */ public static final int EVROverlayIntersectionMaskPrimitiveType_OverlayIntersectionPrimitiveType_Circle = 1; }; /** - * native declaration : headers\openvr_capi.h:834
    + * native declaration : headers\openvr_capi.h:1076
    * enum values */ public static interface EVRRenderModelError { - /** native declaration : headers\openvr_capi.h:821 */ + /** native declaration : headers\openvr_capi.h:1063 */ public static final int EVRRenderModelError_VRRenderModelError_None = 0; - /** native declaration : headers\openvr_capi.h:822 */ + /** native declaration : headers\openvr_capi.h:1064 */ public static final int EVRRenderModelError_VRRenderModelError_Loading = 100; - /** native declaration : headers\openvr_capi.h:823 */ + /** native declaration : headers\openvr_capi.h:1065 */ public static final int EVRRenderModelError_VRRenderModelError_NotSupported = 200; - /** native declaration : headers\openvr_capi.h:824 */ + /** native declaration : headers\openvr_capi.h:1066 */ public static final int EVRRenderModelError_VRRenderModelError_InvalidArg = 300; - /** native declaration : headers\openvr_capi.h:825 */ + /** native declaration : headers\openvr_capi.h:1067 */ public static final int EVRRenderModelError_VRRenderModelError_InvalidModel = 301; - /** native declaration : headers\openvr_capi.h:826 */ + /** native declaration : headers\openvr_capi.h:1068 */ public static final int EVRRenderModelError_VRRenderModelError_NoShapes = 302; - /** native declaration : headers\openvr_capi.h:827 */ + /** native declaration : headers\openvr_capi.h:1069 */ public static final int EVRRenderModelError_VRRenderModelError_MultipleShapes = 303; - /** native declaration : headers\openvr_capi.h:828 */ + /** native declaration : headers\openvr_capi.h:1070 */ public static final int EVRRenderModelError_VRRenderModelError_TooManyVertices = 304; - /** native declaration : headers\openvr_capi.h:829 */ + /** native declaration : headers\openvr_capi.h:1071 */ public static final int EVRRenderModelError_VRRenderModelError_MultipleTextures = 305; - /** native declaration : headers\openvr_capi.h:830 */ + /** native declaration : headers\openvr_capi.h:1072 */ public static final int EVRRenderModelError_VRRenderModelError_BufferTooSmall = 306; - /** native declaration : headers\openvr_capi.h:831 */ + /** native declaration : headers\openvr_capi.h:1073 */ public static final int EVRRenderModelError_VRRenderModelError_NotEnoughNormals = 307; - /** native declaration : headers\openvr_capi.h:832 */ + /** native declaration : headers\openvr_capi.h:1074 */ public static final int EVRRenderModelError_VRRenderModelError_NotEnoughTexCoords = 308; - /** native declaration : headers\openvr_capi.h:833 */ + /** native declaration : headers\openvr_capi.h:1075 */ public static final int EVRRenderModelError_VRRenderModelError_InvalidTexture = 400; }; /** - * native declaration : headers\openvr_capi.h:841
    + * native declaration : headers\openvr_capi.h:1083
    * enum values */ public static interface EVRComponentProperty { - /** native declaration : headers\openvr_capi.h:836 */ + /** native declaration : headers\openvr_capi.h:1078 */ public static final int EVRComponentProperty_VRComponentProperty_IsStatic = 1; - /** native declaration : headers\openvr_capi.h:837 */ + /** native declaration : headers\openvr_capi.h:1079 */ public static final int EVRComponentProperty_VRComponentProperty_IsVisible = 2; - /** native declaration : headers\openvr_capi.h:838 */ + /** native declaration : headers\openvr_capi.h:1080 */ public static final int EVRComponentProperty_VRComponentProperty_IsTouched = 4; - /** native declaration : headers\openvr_capi.h:839 */ + /** native declaration : headers\openvr_capi.h:1081 */ public static final int EVRComponentProperty_VRComponentProperty_IsPressed = 8; - /** native declaration : headers\openvr_capi.h:840 */ + /** native declaration : headers\openvr_capi.h:1082 */ public static final int EVRComponentProperty_VRComponentProperty_IsScrolled = 16; }; /** - * native declaration : headers\openvr_capi.h:846
    + * native declaration : headers\openvr_capi.h:1088
    * enum values */ public static interface EVRNotificationType { - /** native declaration : headers\openvr_capi.h:843 */ + /** native declaration : headers\openvr_capi.h:1085 */ public static final int EVRNotificationType_Transient = 0; - /** native declaration : headers\openvr_capi.h:844 */ + /** native declaration : headers\openvr_capi.h:1086 */ public static final int EVRNotificationType_Persistent = 1; - /** native declaration : headers\openvr_capi.h:845 */ + /** native declaration : headers\openvr_capi.h:1087 */ public static final int EVRNotificationType_Transient_SystemWithUserValue = 2; }; /** - * native declaration : headers\openvr_capi.h:853
    + * native declaration : headers\openvr_capi.h:1095
    * enum values */ public static interface EVRNotificationStyle { - /** native declaration : headers\openvr_capi.h:848 */ + /** native declaration : headers\openvr_capi.h:1090 */ public static final int EVRNotificationStyle_None = 0; - /** native declaration : headers\openvr_capi.h:849 */ + /** native declaration : headers\openvr_capi.h:1091 */ public static final int EVRNotificationStyle_Application = 100; - /** native declaration : headers\openvr_capi.h:850 */ + /** native declaration : headers\openvr_capi.h:1092 */ public static final int EVRNotificationStyle_Contact_Disabled = 200; - /** native declaration : headers\openvr_capi.h:851 */ + /** native declaration : headers\openvr_capi.h:1093 */ public static final int EVRNotificationStyle_Contact_Enabled = 201; - /** native declaration : headers\openvr_capi.h:852 */ + /** native declaration : headers\openvr_capi.h:1094 */ public static final int EVRNotificationStyle_Contact_Active = 202; }; /** - * native declaration : headers\openvr_capi.h:861
    + * native declaration : headers\openvr_capi.h:1103
    * enum values */ public static interface EVRSettingsError { - /** native declaration : headers\openvr_capi.h:855 */ + /** native declaration : headers\openvr_capi.h:1097 */ public static final int EVRSettingsError_VRSettingsError_None = 0; - /** native declaration : headers\openvr_capi.h:856 */ + /** native declaration : headers\openvr_capi.h:1098 */ public static final int EVRSettingsError_VRSettingsError_IPCFailed = 1; - /** native declaration : headers\openvr_capi.h:857 */ + /** native declaration : headers\openvr_capi.h:1099 */ public static final int EVRSettingsError_VRSettingsError_WriteFailed = 2; - /** native declaration : headers\openvr_capi.h:858 */ + /** native declaration : headers\openvr_capi.h:1100 */ public static final int EVRSettingsError_VRSettingsError_ReadFailed = 3; - /** native declaration : headers\openvr_capi.h:859 */ + /** native declaration : headers\openvr_capi.h:1101 */ public static final int EVRSettingsError_VRSettingsError_JsonParseFailed = 4; - /** native declaration : headers\openvr_capi.h:860 */ + /** native declaration : headers\openvr_capi.h:1102 */ public static final int EVRSettingsError_VRSettingsError_UnsetSettingHasNoDefault = 5; }; /** - * native declaration : headers\openvr_capi.h:869
    + * native declaration : headers\openvr_capi.h:1111
    * enum values */ public static interface EVRScreenshotError { - /** native declaration : headers\openvr_capi.h:863 */ + /** native declaration : headers\openvr_capi.h:1105 */ public static final int EVRScreenshotError_VRScreenshotError_None = 0; - /** native declaration : headers\openvr_capi.h:864 */ + /** native declaration : headers\openvr_capi.h:1106 */ public static final int EVRScreenshotError_VRScreenshotError_RequestFailed = 1; - /** native declaration : headers\openvr_capi.h:865 */ + /** native declaration : headers\openvr_capi.h:1107 */ public static final int EVRScreenshotError_VRScreenshotError_IncompatibleVersion = 100; - /** native declaration : headers\openvr_capi.h:866 */ + /** native declaration : headers\openvr_capi.h:1108 */ public static final int EVRScreenshotError_VRScreenshotError_NotFound = 101; - /** native declaration : headers\openvr_capi.h:867 */ + /** native declaration : headers\openvr_capi.h:1109 */ public static final int EVRScreenshotError_VRScreenshotError_BufferTooSmall = 102; - /** native declaration : headers\openvr_capi.h:868 */ + /** native declaration : headers\openvr_capi.h:1110 */ public static final int EVRScreenshotError_VRScreenshotError_ScreenshotAlreadyInProgress = 108; }; - + /** + * native declaration : headers\openvr_capi.h:1116
    + * enum values + */ + public static interface EVRSkeletalTransformSpace { + /** native declaration : headers\openvr_capi.h:1113 */ + public static final int EVRSkeletalTransformSpace_VRSkeletalTransformSpace_Model = 0; + /** native declaration : headers\openvr_capi.h:1114 */ + public static final int EVRSkeletalTransformSpace_VRSkeletalTransformSpace_Parent = 1; + /** native declaration : headers\openvr_capi.h:1115 */ + public static final int EVRSkeletalTransformSpace_VRSkeletalTransformSpace_Additive = 2; + }; + /** + * native declaration : headers\openvr_capi.h:1120
    + * enum values + */ + public static interface EVRInputFilterCancelType { + /** native declaration : headers\openvr_capi.h:1118 */ + public static final int EVRInputFilterCancelType_VRInputFilterCancel_Timers = 0; + /** native declaration : headers\openvr_capi.h:1119 */ + public static final int EVRInputFilterCancelType_VRInputFilterCancel_Momentum = 1; + }; + /** + * native declaration : headers\openvr_capi.h:1129
    + * enum values + */ + public static interface EIOBufferError { + /** native declaration : headers\openvr_capi.h:1122 */ + public static final int EIOBufferError_IOBuffer_Success = 0; + /** native declaration : headers\openvr_capi.h:1123 */ + public static final int EIOBufferError_IOBuffer_OperationFailed = 100; + /** native declaration : headers\openvr_capi.h:1124 */ + public static final int EIOBufferError_IOBuffer_InvalidHandle = 101; + /** native declaration : headers\openvr_capi.h:1125 */ + public static final int EIOBufferError_IOBuffer_InvalidArgument = 102; + /** native declaration : headers\openvr_capi.h:1126 */ + public static final int EIOBufferError_IOBuffer_PathExists = 103; + /** native declaration : headers\openvr_capi.h:1127 */ + public static final int EIOBufferError_IOBuffer_PathDoesNotExist = 104; + /** native declaration : headers\openvr_capi.h:1128 */ + public static final int EIOBufferError_IOBuffer_Permission = 105; + }; + /** + * native declaration : headers\openvr_capi.h:1134
    + * enum values + */ + public static interface EIOBufferMode { + /** native declaration : headers\openvr_capi.h:1131 */ + public static final int EIOBufferMode_IOBufferMode_Read = 1; + /** native declaration : headers\openvr_capi.h:1132 */ + public static final int EIOBufferMode_IOBufferMode_Write = 2; + /** native declaration : headers\openvr_capi.h:1133 */ + public static final int EIOBufferMode_IOBufferMode_Create = 512; + }; + /** OpenVR Constants */ + public static final long k_nDriverNone = 4294967295L; + public static final int k_unMaxDriverDebugResponseSize = 32768; + public static final int k_unTrackedDeviceIndex_Hmd = 0; + public static final int k_unMaxTrackedDeviceCount = 64; + public static final int k_unTrackedDeviceIndexOther = -2; + public static final long k_unTrackedDeviceIndexInvalid = 4294967295L; + public static final long k_ulInvalidPropertyContainer = 0; + public static final int k_unInvalidPropertyTag = 0; + public static final long k_ulInvalidDriverHandle = 0; + public static final int k_unFloatPropertyTag = 1; + public static final int k_unInt32PropertyTag = 2; + public static final int k_unUint64PropertyTag = 3; + public static final int k_unBoolPropertyTag = 4; + public static final int k_unStringPropertyTag = 5; + public static final int k_unHmdMatrix34PropertyTag = 20; + public static final int k_unHmdMatrix44PropertyTag = 21; + public static final int k_unHmdVector3PropertyTag = 22; + public static final int k_unHmdVector4PropertyTag = 23; + public static final int k_unHiddenAreaPropertyTag = 30; + public static final int k_unPathHandleInfoTag = 31; + public static final int k_unActionPropertyTag = 32; + public static final int k_unInputValuePropertyTag = 33; + public static final int k_unWildcardPropertyTag = 34; + public static final int k_unHapticVibrationPropertyTag = 35; + public static final int k_unSkeletonPropertyTag = 36; + public static final int k_unSpatialAnchorPosePropertyTag = 40; + public static final int k_unOpenVRInternalReserved_Start = 1000; + public static final int k_unOpenVRInternalReserved_End = 10000; + public static final int k_unMaxPropertyStringSize = 32768; + public static final long k_ulInvalidActionHandle = 0; + public static final long k_ulInvalidActionSetHandle = 0; + public static final long k_ulInvalidInputValueHandle = 0; + public static final int k_unControllerStateAxisCount = 5; + public static final long k_ulOverlayHandleInvalid = 0; + public static final int k_unScreenshotHandleInvalid = 0; + public static final int k_unMaxApplicationKeyLength = 128; + public static final int k_unVROverlayMaxKeyLength = 128; + public static final int k_unVROverlayMaxNameLength = 128; + public static final int k_unMaxOverlayCount = 64; + public static final int k_unMaxOverlayIntersectionMaskPrimitivesCount = 32; + public static final int k_unNotificationTextMaxSize = 256; + public static final int k_unMaxSettingsKeyLength = 128; + public static final int k_unMaxActionNameLength = 64; + public static final int k_unMaxActionSetNameLength = 64; + public static final int k_unMaxActionOriginCount = 16; + public static final long k_ulInvalidIOBufferHandle = 0; + public static final int k_ulInvalidSpatialAnchorHandle = 0; + + + public static final String IVRSystem_Version = "IVRSystem_019"; + public static final String IVRExtendedDisplay_Version = "IVRExtendedDisplay_001"; + public static final String IVRTrackedCamera_Version = "IVRTrackedCamera_003"; + public static final String k_pch_MimeType_HomeApp = "vr/home"; + public static final String k_pch_MimeType_GameTheater = "vr/game_theater"; + public static final String IVRApplications_Version = "IVRApplications_006"; + public static final String IVRChaperone_Version = "IVRChaperone_003"; + public static final String IVRChaperoneSetup_Version = "IVRChaperoneSetup_005"; + public static final String IVRCompositor_Version = "IVRCompositor_022"; + public static final String IVROverlay_Version = "IVROverlay_018"; + public static final String k_pch_Controller_Component_GDC2015 = "gdc2015"; + public static final String k_pch_Controller_Component_Base = "base"; + public static final String k_pch_Controller_Component_Tip = "tip"; + public static final String k_pch_Controller_Component_HandGrip = "handgrip"; + public static final String k_pch_Controller_Component_Status = "status"; + public static final String IVRRenderModels_Version = "IVRRenderModels_006"; + public static final String IVRNotifications_Version = "IVRNotifications_002"; + public static final String IVRSettings_Version = "IVRSettings_002"; + public static final String k_pch_SteamVR_Section = "steamvr"; + public static final String k_pch_SteamVR_RequireHmd_String = "requireHmd"; + public static final String k_pch_SteamVR_ForcedDriverKey_String = "forcedDriver"; + public static final String k_pch_SteamVR_ForcedHmdKey_String = "forcedHmd"; + public static final String k_pch_SteamVR_DisplayDebug_Bool = "displayDebug"; + public static final String k_pch_SteamVR_DebugProcessPipe_String = "debugProcessPipe"; + public static final String k_pch_SteamVR_DisplayDebugX_Int32 = "displayDebugX"; + public static final String k_pch_SteamVR_DisplayDebugY_Int32 = "displayDebugY"; + public static final String k_pch_SteamVR_SendSystemButtonToAllApps_Bool = "sendSystemButtonToAllApps"; + public static final String k_pch_SteamVR_LogLevel_Int32 = "loglevel"; + public static final String k_pch_SteamVR_IPD_Float = "ipd"; + public static final String k_pch_SteamVR_Background_String = "background"; + public static final String k_pch_SteamVR_BackgroundUseDomeProjection_Bool = "backgroundUseDomeProjection"; + public static final String k_pch_SteamVR_BackgroundCameraHeight_Float = "backgroundCameraHeight"; + public static final String k_pch_SteamVR_BackgroundDomeRadius_Float = "backgroundDomeRadius"; + public static final String k_pch_SteamVR_GridColor_String = "gridColor"; + public static final String k_pch_SteamVR_PlayAreaColor_String = "playAreaColor"; + public static final String k_pch_SteamVR_ShowStage_Bool = "showStage"; + public static final String k_pch_SteamVR_ActivateMultipleDrivers_Bool = "activateMultipleDrivers"; + public static final String k_pch_SteamVR_DirectMode_Bool = "directMode"; + public static final String k_pch_SteamVR_DirectModeEdidVid_Int32 = "directModeEdidVid"; + public static final String k_pch_SteamVR_DirectModeEdidPid_Int32 = "directModeEdidPid"; + public static final String k_pch_SteamVR_UsingSpeakers_Bool = "usingSpeakers"; + public static final String k_pch_SteamVR_SpeakersForwardYawOffsetDegrees_Float = "speakersForwardYawOffsetDegrees"; + public static final String k_pch_SteamVR_BaseStationPowerManagement_Bool = "basestationPowerManagement"; + public static final String k_pch_SteamVR_NeverKillProcesses_Bool = "neverKillProcesses"; + public static final String k_pch_SteamVR_SupersampleScale_Float = "supersampleScale"; + public static final String k_pch_SteamVR_AllowAsyncReprojection_Bool = "allowAsyncReprojection"; + public static final String k_pch_SteamVR_AllowReprojection_Bool = "allowInterleavedReprojection"; + public static final String k_pch_SteamVR_ForceReprojection_Bool = "forceReprojection"; + public static final String k_pch_SteamVR_ForceFadeOnBadTracking_Bool = "forceFadeOnBadTracking"; + public static final String k_pch_SteamVR_DefaultMirrorView_Int32 = "defaultMirrorView"; + public static final String k_pch_SteamVR_ShowMirrorView_Bool = "showMirrorView"; + public static final String k_pch_SteamVR_MirrorViewGeometry_String = "mirrorViewGeometry"; + public static final String k_pch_SteamVR_StartMonitorFromAppLaunch = "startMonitorFromAppLaunch"; + public static final String k_pch_SteamVR_StartCompositorFromAppLaunch_Bool = "startCompositorFromAppLaunch"; + public static final String k_pch_SteamVR_StartDashboardFromAppLaunch_Bool = "startDashboardFromAppLaunch"; + public static final String k_pch_SteamVR_StartOverlayAppsFromDashboard_Bool = "startOverlayAppsFromDashboard"; + public static final String k_pch_SteamVR_EnableHomeApp = "enableHomeApp"; + public static final String k_pch_SteamVR_CycleBackgroundImageTimeSec_Int32 = "CycleBackgroundImageTimeSec"; + public static final String k_pch_SteamVR_RetailDemo_Bool = "retailDemo"; + public static final String k_pch_SteamVR_IpdOffset_Float = "ipdOffset"; + public static final String k_pch_SteamVR_AllowSupersampleFiltering_Bool = "allowSupersampleFiltering"; + public static final String k_pch_SteamVR_SupersampleManualOverride_Bool = "supersampleManualOverride"; + public static final String k_pch_SteamVR_EnableLinuxVulkanAsync_Bool = "enableLinuxVulkanAsync"; + public static final String k_pch_SteamVR_AllowDisplayLockedMode_Bool = "allowDisplayLockedMode"; + public static final String k_pch_SteamVR_HaveStartedTutorialForNativeChaperoneDriver_Bool = "haveStartedTutorialForNativeChaperoneDriver"; + public static final String k_pch_SteamVR_ForceWindows32bitVRMonitor = "forceWindows32BitVRMonitor"; + public static final String k_pch_SteamVR_DebugInput = "debugInput"; + public static final String k_pch_SteamVR_LegacyInputRebinding = "legacyInputRebinding"; + public static final String k_pch_SteamVR_DebugInputBinding = "debugInputBinding"; + public static final String k_pch_SteamVR_InputBindingUIBlock = "inputBindingUI"; + public static final String k_pch_SteamVR_RenderCameraMode = "renderCameraMode"; + public static final String k_pch_Lighthouse_Section = "driver_lighthouse"; + public static final String k_pch_Lighthouse_DisableIMU_Bool = "disableimu"; + public static final String k_pch_Lighthouse_DisableIMUExceptHMD_Bool = "disableimuexcepthmd"; + public static final String k_pch_Lighthouse_UseDisambiguation_String = "usedisambiguation"; + public static final String k_pch_Lighthouse_DisambiguationDebug_Int32 = "disambiguationdebug"; + public static final String k_pch_Lighthouse_PrimaryBasestation_Int32 = "primarybasestation"; + public static final String k_pch_Lighthouse_DBHistory_Bool = "dbhistory"; + public static final String k_pch_Lighthouse_EnableBluetooth_Bool = "enableBluetooth"; + public static final String k_pch_Lighthouse_PowerManagedBaseStations_String = "PowerManagedBaseStations"; + public static final String k_pch_Null_Section = "driver_null"; + public static final String k_pch_Null_SerialNumber_String = "serialNumber"; + public static final String k_pch_Null_ModelNumber_String = "modelNumber"; + public static final String k_pch_Null_WindowX_Int32 = "windowX"; + public static final String k_pch_Null_WindowY_Int32 = "windowY"; + public static final String k_pch_Null_WindowWidth_Int32 = "windowWidth"; + public static final String k_pch_Null_WindowHeight_Int32 = "windowHeight"; + public static final String k_pch_Null_RenderWidth_Int32 = "renderWidth"; + public static final String k_pch_Null_RenderHeight_Int32 = "renderHeight"; + public static final String k_pch_Null_SecondsFromVsyncToPhotons_Float = "secondsFromVsyncToPhotons"; + public static final String k_pch_Null_DisplayFrequency_Float = "displayFrequency"; + public static final String k_pch_UserInterface_Section = "userinterface"; + public static final String k_pch_UserInterface_StatusAlwaysOnTop_Bool = "StatusAlwaysOnTop"; + public static final String k_pch_UserInterface_MinimizeToTray_Bool = "MinimizeToTray"; + public static final String k_pch_UserInterface_Screenshots_Bool = "screenshots"; + public static final String k_pch_UserInterface_ScreenshotType_Int = "screenshotType"; + public static final String k_pch_Notifications_Section = "notifications"; + public static final String k_pch_Notifications_DoNotDisturb_Bool = "DoNotDisturb"; + public static final String k_pch_Keyboard_Section = "keyboard"; + public static final String k_pch_Keyboard_TutorialCompletions = "TutorialCompletions"; + public static final String k_pch_Keyboard_ScaleX = "ScaleX"; + public static final String k_pch_Keyboard_ScaleY = "ScaleY"; + public static final String k_pch_Keyboard_OffsetLeftX = "OffsetLeftX"; + public static final String k_pch_Keyboard_OffsetRightX = "OffsetRightX"; + public static final String k_pch_Keyboard_OffsetY = "OffsetY"; + public static final String k_pch_Keyboard_Smoothing = "Smoothing"; + public static final String k_pch_Perf_Section = "perfcheck"; + public static final String k_pch_Perf_HeuristicActive_Bool = "heuristicActive"; + public static final String k_pch_Perf_NotifyInHMD_Bool = "warnInHMD"; + public static final String k_pch_Perf_NotifyOnlyOnce_Bool = "warnOnlyOnce"; + public static final String k_pch_Perf_AllowTimingStore_Bool = "allowTimingStore"; + public static final String k_pch_Perf_SaveTimingsOnExit_Bool = "saveTimingsOnExit"; + public static final String k_pch_Perf_TestData_Float = "perfTestData"; + public static final String k_pch_Perf_LinuxGPUProfiling_Bool = "linuxGPUProfiling"; + public static final String k_pch_CollisionBounds_Section = "collisionBounds"; + public static final String k_pch_CollisionBounds_Style_Int32 = "CollisionBoundsStyle"; + public static final String k_pch_CollisionBounds_GroundPerimeterOn_Bool = "CollisionBoundsGroundPerimeterOn"; + public static final String k_pch_CollisionBounds_CenterMarkerOn_Bool = "CollisionBoundsCenterMarkerOn"; + public static final String k_pch_CollisionBounds_PlaySpaceOn_Bool = "CollisionBoundsPlaySpaceOn"; + public static final String k_pch_CollisionBounds_FadeDistance_Float = "CollisionBoundsFadeDistance"; + public static final String k_pch_CollisionBounds_ColorGammaR_Int32 = "CollisionBoundsColorGammaR"; + public static final String k_pch_CollisionBounds_ColorGammaG_Int32 = "CollisionBoundsColorGammaG"; + public static final String k_pch_CollisionBounds_ColorGammaB_Int32 = "CollisionBoundsColorGammaB"; + public static final String k_pch_CollisionBounds_ColorGammaA_Int32 = "CollisionBoundsColorGammaA"; + public static final String k_pch_Camera_Section = "camera"; + public static final String k_pch_Camera_EnableCamera_Bool = "enableCamera"; + public static final String k_pch_Camera_EnableCameraInDashboard_Bool = "enableCameraInDashboard"; + public static final String k_pch_Camera_EnableCameraForCollisionBounds_Bool = "enableCameraForCollisionBounds"; + public static final String k_pch_Camera_EnableCameraForRoomView_Bool = "enableCameraForRoomView"; + public static final String k_pch_Camera_BoundsColorGammaR_Int32 = "cameraBoundsColorGammaR"; + public static final String k_pch_Camera_BoundsColorGammaG_Int32 = "cameraBoundsColorGammaG"; + public static final String k_pch_Camera_BoundsColorGammaB_Int32 = "cameraBoundsColorGammaB"; + public static final String k_pch_Camera_BoundsColorGammaA_Int32 = "cameraBoundsColorGammaA"; + public static final String k_pch_Camera_BoundsStrength_Int32 = "cameraBoundsStrength"; + public static final String k_pch_Camera_RoomViewMode_Int32 = "cameraRoomViewMode"; + public static final String k_pch_audio_Section = "audio"; + public static final String k_pch_audio_OnPlaybackDevice_String = "onPlaybackDevice"; + public static final String k_pch_audio_OnRecordDevice_String = "onRecordDevice"; + public static final String k_pch_audio_OnPlaybackMirrorDevice_String = "onPlaybackMirrorDevice"; + public static final String k_pch_audio_OffPlaybackDevice_String = "offPlaybackDevice"; + public static final String k_pch_audio_OffRecordDevice_String = "offRecordDevice"; + public static final String k_pch_audio_VIVEHDMIGain = "viveHDMIGain"; + public static final String k_pch_Power_Section = "power"; + public static final String k_pch_Power_PowerOffOnExit_Bool = "powerOffOnExit"; + public static final String k_pch_Power_TurnOffScreensTimeout_Float = "turnOffScreensTimeout"; + public static final String k_pch_Power_TurnOffControllersTimeout_Float = "turnOffControllersTimeout"; + public static final String k_pch_Power_ReturnToWatchdogTimeout_Float = "returnToWatchdogTimeout"; + public static final String k_pch_Power_AutoLaunchSteamVROnButtonPress = "autoLaunchSteamVROnButtonPress"; + public static final String k_pch_Power_PauseCompositorOnStandby_Bool = "pauseCompositorOnStandby"; + public static final String k_pch_Dashboard_Section = "dashboard"; + public static final String k_pch_Dashboard_EnableDashboard_Bool = "enableDashboard"; + public static final String k_pch_Dashboard_ArcadeMode_Bool = "arcadeMode"; + public static final String k_pch_Dashboard_EnableWebUI = "webUI"; + public static final String k_pch_Dashboard_EnableWebUIDevTools = "webUIDevTools"; + public static final String k_pch_Dashboard_EnableWebUIDashboardReplacement = "webUIDashboard"; + public static final String k_pch_modelskin_Section = "modelskins"; + public static final String k_pch_Driver_Enable_Bool = "enable"; + public static final String k_pch_WebInterface_Section = "WebInterface"; + public static final String k_pch_WebInterface_WebEnable_Bool = "WebEnable"; + public static final String k_pch_WebInterface_WebPort_String = "WebPort"; + public static final String k_pch_TrackingOverride_Section = "TrackingOverrides"; + public static final String k_pch_App_BindingAutosaveURLSuffix_String = "AutosaveURL"; + public static final String k_pch_App_BindingCurrentURLSuffix_String = "CurrentURL"; + public static final String k_pch_App_NeedToUpdateAutosaveSuffix_Bool = "NeedToUpdateAutosave"; + public static final String k_pch_App_ActionManifestURL_String = "ActionManifestURL"; + public static final String k_pch_Trackers_Section = "trackers"; + public static final String IVRScreenshots_Version = "IVRScreenshots_001"; + public static final String IVRResources_Version = "IVRResources_001"; + public static final String IVRDriverManager_Version = "IVRDriverManager_001"; + public static final String IVRInput_Version = "IVRInput_004"; + public static final String IVRIOBuffer_Version = "IVRIOBuffer_001"; + public static final String IVRSpatialAnchors_Version = "IVRSpatialAnchors_001"; + + /** * Global entry points
    * Original signature : intptr_t VR_InitInternal(EVRInitError*, EVRApplicationType)
    - * native declaration : headers\openvr_capi.h:1876
    + * native declaration : headers\openvr_capi.h:2378
    + * @deprecated use the safer methods {@link #VR_InitInternal(java.nio.IntBuffer, int)} and {@link #VR_InitInternal(com.sun.jna.ptr.IntByReference, int)} instead */ + @Deprecated public static native IntByReference VR_InitInternal(IntByReference peError, int eType); /** * Global entry points
    * Original signature : intptr_t VR_InitInternal(EVRInitError*, EVRApplicationType)
    - * native declaration : headers\openvr_capi.h:1876 + * native declaration : headers\openvr_capi.h:2378 */ public static native IntByReference VR_InitInternal(IntBuffer peError, int eType); /** * Original signature : void VR_ShutdownInternal()
    - * native declaration : headers\openvr_capi.h:1878 + * native declaration : headers\openvr_capi.h:2380 */ public static native void VR_ShutdownInternal(); /** * Original signature : bool VR_IsHmdPresent()
    - * native declaration : headers\openvr_capi.h:1880 + * native declaration : headers\openvr_capi.h:2382 */ public static native byte VR_IsHmdPresent(); /** * Original signature : intptr_t VR_GetGenericInterface(const char*, EVRInitError*)
    - * native declaration : headers\openvr_capi.h:1882
    + * native declaration : headers\openvr_capi.h:2384
    * @deprecated use the safer methods {@link #VR_GetGenericInterface(java.lang.String, java.nio.IntBuffer)} and {@link #VR_GetGenericInterface(com.sun.jna.Pointer, com.sun.jna.ptr.IntByReference)} instead */ @Deprecated public static native IntByReference VR_GetGenericInterface(Pointer pchInterfaceVersion, IntByReference peError); /** * Original signature : intptr_t VR_GetGenericInterface(const char*, EVRInitError*)
    - * native declaration : headers\openvr_capi.h:1882 + * native declaration : headers\openvr_capi.h:2384 */ public static native IntByReference VR_GetGenericInterface(String pchInterfaceVersion, IntByReference peError); /** * Original signature : bool VR_IsRuntimeInstalled()
    - * native declaration : headers\openvr_capi.h:1884 + * native declaration : headers\openvr_capi.h:2386 */ public static native byte VR_IsRuntimeInstalled(); /** * Original signature : char* VR_GetVRInitErrorAsSymbol(EVRInitError)
    - * native declaration : headers\openvr_capi.h:1886 + * native declaration : headers\openvr_capi.h:2388 */ public static native Pointer VR_GetVRInitErrorAsSymbol(int error); /** * Original signature : char* VR_GetVRInitErrorAsEnglishDescription(EVRInitError)
    - * native declaration : headers\openvr_capi.h:1888 + * native declaration : headers\openvr_capi.h:2390 */ public static native Pointer VR_GetVRInitErrorAsEnglishDescription(int error); public static class VkQueue_T extends PointerType { diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/NotificationBitmap_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/NotificationBitmap_t.java index d8dcbf67d..217eedb2c 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/NotificationBitmap_t.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/NotificationBitmap_t.java @@ -4,7 +4,7 @@ import com.sun.jna.Structure; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:1236
    + * native declaration : headers\openvr_capi.h:1588
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/OpenVRUtil.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/OpenVRUtil.java index fd7731f1c..78b96e962 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/OpenVRUtil.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/OpenVRUtil.java @@ -1,6 +1,6 @@ package com.jme3.system.jopenvr; -import com.jme3.input.vr.OpenVRInput; +import com.jme3.input.vr.openvr.OpenVRInput; import com.jme3.system.jopenvr.JOpenVRLibrary.EColorSpace; import com.jme3.system.jopenvr.JOpenVRLibrary.ETextureType; import com.jme3.system.jopenvr.JOpenVRLibrary.ETrackedDeviceProperty; @@ -13,8 +13,7 @@ import com.sun.jna.ptr.IntByReference; /** * A utility class that provide helper methods for OpenVR system. - * @author Julien Seinturier - (c) 2016 - JOrigin project - http:/www.jorigin.org - * + * @author Julien Seinturier - 2017 - http://www.seinturier.fr */ public class OpenVRUtil { @@ -677,9 +676,6 @@ public class OpenVRUtil { case ETrackedDeviceProperty.ETrackedDeviceProperty_Prop_DisplayMCImageData_Binary: str = ""; break; - case ETrackedDeviceProperty.ETrackedDeviceProperty_Prop_UsesDriverDirectMode_Bool: - str = ""; - break; case ETrackedDeviceProperty.ETrackedDeviceProperty_Prop_AttachedDeviceId_String: str = ""; break; diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/RenderModel_ComponentState_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/RenderModel_ComponentState_t.java index ca123da43..a55f51b93 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/RenderModel_ComponentState_t.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/RenderModel_ComponentState_t.java @@ -4,7 +4,7 @@ import com.sun.jna.Structure; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:1205
    + * native declaration : headers\openvr_capi.h:1557
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/RenderModel_ControllerMode_State_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/RenderModel_ControllerMode_State_t.java index 768e3c17d..5d5e45d57 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/RenderModel_ControllerMode_State_t.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/RenderModel_ControllerMode_State_t.java @@ -4,7 +4,7 @@ import com.sun.jna.Structure; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:1229
    + * native declaration : headers\openvr_capi.h:1581
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/RenderModel_TextureMap_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/RenderModel_TextureMap_t.java index 243b29983..c6baff6fe 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/RenderModel_TextureMap_t.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/RenderModel_TextureMap_t.java @@ -4,7 +4,7 @@ import com.sun.jna.Structure; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:1217
    + * native declaration : headers\openvr_capi.h:1569
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/RenderModel_Vertex_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/RenderModel_Vertex_t.java index d4087fbed..12e9217d8 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/RenderModel_Vertex_t.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/RenderModel_Vertex_t.java @@ -4,7 +4,7 @@ import com.sun.jna.Structure; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:1211
    + * native declaration : headers\openvr_capi.h:1563
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/RenderModel_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/RenderModel_t.java index 4687a593a..697c79cdf 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/RenderModel_t.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/RenderModel_t.java @@ -5,7 +5,7 @@ import com.sun.jna.ptr.ShortByReference; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:1226
    + * native declaration : headers\openvr_capi.h:1578
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/SpatialAnchorPose_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/SpatialAnchorPose_t.java new file mode 100644 index 000000000..3bc24a3ad --- /dev/null +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/SpatialAnchorPose_t.java @@ -0,0 +1,35 @@ +package com.jme3.system.jopenvr; +import com.sun.jna.Pointer; +import com.sun.jna.Structure; +import java.util.Arrays; +import java.util.List; +/** + * native declaration : headers\openvr_capi.h:1636
    + * This file was autogenerated by JNAerator,
    + * a tool written by Olivier Chafik that uses a few opensource projects..
    + * For help, please visit NativeLibs4Java , Rococoa, or JNA. + */ +public class SpatialAnchorPose_t extends Structure { + /** C type : HmdMatrix34_t */ + public HmdMatrix34_t mAnchorToAbsoluteTracking; + public SpatialAnchorPose_t() { + super(); + } + protected List getFieldOrder() { + return Arrays.asList("mAnchorToAbsoluteTracking"); + } + /** @param mAnchorToAbsoluteTracking C type : HmdMatrix34_t */ + public SpatialAnchorPose_t(HmdMatrix34_t mAnchorToAbsoluteTracking) { + super(); + this.mAnchorToAbsoluteTracking = mAnchorToAbsoluteTracking; + } + public SpatialAnchorPose_t(Pointer peer) { + super(peer); + } + public static class ByReference extends SpatialAnchorPose_t implements Structure.ByReference { + + }; + public static class ByValue extends SpatialAnchorPose_t implements Structure.ByValue { + + }; +} diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/Texture_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/Texture_t.java index fc12dea2c..a81f3a6fc 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/Texture_t.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/Texture_t.java @@ -4,7 +4,7 @@ import com.sun.jna.Structure; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:964
    + * native declaration : headers\openvr_capi.h:1247
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/TrackedDevicePose_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/TrackedDevicePose_t.java index 7d7823b95..97bbe2431 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/TrackedDevicePose_t.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/TrackedDevicePose_t.java @@ -4,7 +4,7 @@ import com.sun.jna.Structure; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:974
    + * native declaration : headers\openvr_capi.h:1257
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VRActiveActionSet_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VRActiveActionSet_t.java new file mode 100644 index 000000000..3a643b893 --- /dev/null +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VRActiveActionSet_t.java @@ -0,0 +1,49 @@ +package com.jme3.system.jopenvr; +import com.sun.jna.Pointer; +import com.sun.jna.Structure; +import java.util.Arrays; +import java.util.List; +/** + * native declaration : headers\openvr_capi.h:1633
    + * This file was autogenerated by JNAerator,
    + * a tool written by Olivier Chafik that uses a few opensource projects..
    + * For help, please visit NativeLibs4Java , Rococoa, or JNA. + */ +public class VRActiveActionSet_t extends Structure { + /** C type : VRActionSetHandle_t */ + public long ulActionSet; + /** C type : VRInputValueHandle_t */ + public long ulRestrictedToDevice; + /** C type : VRActionSetHandle_t */ + public long ulSecondaryActionSet; + public int unPadding; + public int nPriority; + public VRActiveActionSet_t() { + super(); + } + protected List getFieldOrder() { + return Arrays.asList("ulActionSet", "ulRestrictedToDevice", "ulSecondaryActionSet", "unPadding", "nPriority"); + } + /** + * @param ulActionSet C type : VRActionSetHandle_t
    + * @param ulRestrictedToDevice C type : VRInputValueHandle_t
    + * @param ulSecondaryActionSet C type : VRActionSetHandle_t + */ + public VRActiveActionSet_t(long ulActionSet, long ulRestrictedToDevice, long ulSecondaryActionSet, int unPadding, int nPriority) { + super(); + this.ulActionSet = ulActionSet; + this.ulRestrictedToDevice = ulRestrictedToDevice; + this.ulSecondaryActionSet = ulSecondaryActionSet; + this.unPadding = unPadding; + this.nPriority = nPriority; + } + public VRActiveActionSet_t(Pointer peer) { + super(peer); + } + public static class ByReference extends VRActiveActionSet_t implements Structure.ByReference { + + }; + public static class ByValue extends VRActiveActionSet_t implements Structure.ByValue { + + }; +} diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VRBoneTransform_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VRBoneTransform_t.java new file mode 100644 index 000000000..671e95d9b --- /dev/null +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VRBoneTransform_t.java @@ -0,0 +1,41 @@ +package com.jme3.system.jopenvr; +import com.sun.jna.Pointer; +import com.sun.jna.Structure; +import java.util.Arrays; +import java.util.List; +/** + * native declaration : headers\openvr_capi.h:1456
    + * This file was autogenerated by JNAerator,
    + * a tool written by Olivier Chafik that uses a few opensource projects..
    + * For help, please visit NativeLibs4Java , Rococoa, or JNA. + */ +public class VRBoneTransform_t extends Structure { + /** C type : HmdVector4_t */ + public HmdVector4_t position; + /** C type : HmdQuaternionf_t */ + public HmdQuaternionf_t orientation; + public VRBoneTransform_t() { + super(); + } + protected List getFieldOrder() { + return Arrays.asList("position", "orientation"); + } + /** + * @param position C type : HmdVector4_t
    + * @param orientation C type : HmdQuaternionf_t + */ + public VRBoneTransform_t(HmdVector4_t position, HmdQuaternionf_t orientation) { + super(); + this.position = position; + this.orientation = orientation; + } + public VRBoneTransform_t(Pointer peer) { + super(peer); + } + public static class ByReference extends VRBoneTransform_t implements Structure.ByReference { + + }; + public static class ByValue extends VRBoneTransform_t implements Structure.ByValue { + + }; +} diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VRControllerAxis_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VRControllerAxis_t.java index 4a5d4d652..8114fdf94 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VRControllerAxis_t.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VRControllerAxis_t.java @@ -4,7 +4,7 @@ import com.sun.jna.Structure; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:1094
    + * native declaration : headers\openvr_capi.h:1429
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VRControllerState_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VRControllerState_t.java index 04643f804..f1becb6fd 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VRControllerState_t.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VRControllerState_t.java @@ -4,7 +4,7 @@ import com.sun.jna.Structure; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:1101
    + * native declaration : headers\openvr_capi.h:1436
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_ApplicationLaunch_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_ApplicationLaunch_t.java index 44b822885..675e0ac07 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_ApplicationLaunch_t.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_ApplicationLaunch_t.java @@ -4,7 +4,7 @@ import com.sun.jna.Structure; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:1072
    + * native declaration : headers\openvr_capi.h:1373
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Chaperone_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Chaperone_t.java index e9c62bf42..65287c0d7 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Chaperone_t.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Chaperone_t.java @@ -4,7 +4,7 @@ import com.sun.jna.Structure; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:1051
    + * native declaration : headers\openvr_capi.h:1350
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Controller_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Controller_t.java index 22f2c6e11..c2a632c69 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Controller_t.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Controller_t.java @@ -4,7 +4,7 @@ import com.sun.jna.Structure; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:1006
    + * native declaration : headers\openvr_capi.h:1304
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Data_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Data_t.java index 40b0a3db6..983a7da82 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Data_t.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Data_t.java @@ -2,7 +2,7 @@ package com.jme3.system.jopenvr; import com.sun.jna.Pointer; import com.sun.jna.Union; /** - * native declaration : headers\openvr_capi.h:1278
    + * native declaration : headers\openvr_capi.h:1686
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_DualAnalog_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_DualAnalog_t.java new file mode 100644 index 000000000..b6a528d3b --- /dev/null +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_DualAnalog_t.java @@ -0,0 +1,49 @@ +package com.jme3.system.jopenvr; +import com.sun.jna.Pointer; +import com.sun.jna.Structure; +import java.util.Arrays; +import java.util.List; +/** + * native declaration : headers\openvr_capi.h:1395
    + * This file was autogenerated by JNAerator,
    + * a tool written by Olivier Chafik that uses a few opensource projects..
    + * For help, please visit NativeLibs4Java , Rococoa, or JNA. + */ +public class VREvent_DualAnalog_t extends Structure { + public float x; + public float y; + public float transformedX; + public float transformedY; + /** + * @see EDualAnalogWhich
    + * C type : EDualAnalogWhich + */ + public int which; + public VREvent_DualAnalog_t() { + super(); + } + protected List getFieldOrder() { + return Arrays.asList("x", "y", "transformedX", "transformedY", "which"); + } + /** + * @param which @see EDualAnalogWhich
    + * C type : EDualAnalogWhich + */ + public VREvent_DualAnalog_t(float x, float y, float transformedX, float transformedY, int which) { + super(); + this.x = x; + this.y = y; + this.transformedX = transformedX; + this.transformedY = transformedY; + this.which = which; + } + public VREvent_DualAnalog_t(Pointer peer) { + super(peer); + } + public static class ByReference extends VREvent_DualAnalog_t implements Structure.ByReference { + + }; + public static class ByValue extends VREvent_DualAnalog_t implements Structure.ByValue { + + }; +} diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_EditingCameraSurface_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_EditingCameraSurface_t.java index ee33f365d..6a8f5c8c3 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_EditingCameraSurface_t.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_EditingCameraSurface_t.java @@ -4,7 +4,7 @@ import com.sun.jna.Structure; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:1076
    + * native declaration : headers\openvr_capi.h:1377
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_HapticVibration_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_HapticVibration_t.java new file mode 100644 index 000000000..1501bcbf4 --- /dev/null +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_HapticVibration_t.java @@ -0,0 +1,41 @@ +package com.jme3.system.jopenvr; +import com.sun.jna.Pointer; +import com.sun.jna.Structure; +import java.util.Arrays; +import java.util.List; +/** + * native declaration : headers\openvr_capi.h:1402
    + * This file was autogenerated by JNAerator,
    + * a tool written by Olivier Chafik that uses a few opensource projects..
    + * For help, please visit NativeLibs4Java , Rococoa, or JNA. + */ +public class VREvent_HapticVibration_t extends Structure { + public long containerHandle; + public long componentHandle; + public float fDurationSeconds; + public float fFrequency; + public float fAmplitude; + public VREvent_HapticVibration_t() { + super(); + } + protected List getFieldOrder() { + return Arrays.asList("containerHandle", "componentHandle", "fDurationSeconds", "fFrequency", "fAmplitude"); + } + public VREvent_HapticVibration_t(long containerHandle, long componentHandle, float fDurationSeconds, float fFrequency, float fAmplitude) { + super(); + this.containerHandle = containerHandle; + this.componentHandle = componentHandle; + this.fDurationSeconds = fDurationSeconds; + this.fFrequency = fFrequency; + this.fAmplitude = fAmplitude; + } + public VREvent_HapticVibration_t(Pointer peer) { + super(peer); + } + public static class ByReference extends VREvent_HapticVibration_t implements Structure.ByReference { + + }; + public static class ByValue extends VREvent_HapticVibration_t implements Structure.ByValue { + + }; +} diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_InputActionManifestLoad_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_InputActionManifestLoad_t.java new file mode 100644 index 000000000..955ad7abd --- /dev/null +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_InputActionManifestLoad_t.java @@ -0,0 +1,39 @@ +package com.jme3.system.jopenvr; +import com.sun.jna.Pointer; +import com.sun.jna.Structure; +import java.util.Arrays; +import java.util.List; +/** + * native declaration : headers\openvr_capi.h:1417
    + * This file was autogenerated by JNAerator,
    + * a tool written by Olivier Chafik that uses a few opensource projects..
    + * For help, please visit NativeLibs4Java , Rococoa, or JNA. + */ +public class VREvent_InputActionManifestLoad_t extends Structure { + public long pathAppKey; + public long pathMessage; + public long pathMessageParam; + public long pathManifestPath; + public VREvent_InputActionManifestLoad_t() { + super(); + } + protected List getFieldOrder() { + return Arrays.asList("pathAppKey", "pathMessage", "pathMessageParam", "pathManifestPath"); + } + public VREvent_InputActionManifestLoad_t(long pathAppKey, long pathMessage, long pathMessageParam, long pathManifestPath) { + super(); + this.pathAppKey = pathAppKey; + this.pathMessage = pathMessage; + this.pathMessageParam = pathMessageParam; + this.pathManifestPath = pathManifestPath; + } + public VREvent_InputActionManifestLoad_t(Pointer peer) { + super(peer); + } + public static class ByReference extends VREvent_InputActionManifestLoad_t implements Structure.ByReference { + + }; + public static class ByValue extends VREvent_InputActionManifestLoad_t implements Structure.ByValue { + + }; +} diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_InputBindingLoad_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_InputBindingLoad_t.java new file mode 100644 index 000000000..f7a02b4bf --- /dev/null +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_InputBindingLoad_t.java @@ -0,0 +1,41 @@ +package com.jme3.system.jopenvr; +import com.sun.jna.Pointer; +import com.sun.jna.Structure; +import java.util.Arrays; +import java.util.List; +/** + * native declaration : headers\openvr_capi.h:1411
    + * This file was autogenerated by JNAerator,
    + * a tool written by Olivier Chafik that uses a few opensource projects..
    + * For help, please visit NativeLibs4Java , Rococoa, or JNA. + */ +public class VREvent_InputBindingLoad_t extends Structure { + /** C type : PropertyContainerHandle_t */ + public long ulAppContainer; + public long pathMessage; + public long pathUrl; + public long pathControllerType; + public VREvent_InputBindingLoad_t() { + super(); + } + protected List getFieldOrder() { + return Arrays.asList("ulAppContainer", "pathMessage", "pathUrl", "pathControllerType"); + } + /** @param ulAppContainer C type : PropertyContainerHandle_t */ + public VREvent_InputBindingLoad_t(long ulAppContainer, long pathMessage, long pathUrl, long pathControllerType) { + super(); + this.ulAppContainer = ulAppContainer; + this.pathMessage = pathMessage; + this.pathUrl = pathUrl; + this.pathControllerType = pathControllerType; + } + public VREvent_InputBindingLoad_t(Pointer peer) { + super(peer); + } + public static class ByReference extends VREvent_InputBindingLoad_t implements Structure.ByReference { + + }; + public static class ByValue extends VREvent_InputBindingLoad_t implements Structure.ByValue { + + }; +} diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Ipd_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Ipd_t.java index 509b2cfd1..02b100e35 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Ipd_t.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Ipd_t.java @@ -4,7 +4,7 @@ import com.sun.jna.Structure; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:1047
    + * native declaration : headers\openvr_capi.h:1346
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Keyboard_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Keyboard_t.java index e3a5d1261..a6fb1e6e9 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Keyboard_t.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Keyboard_t.java @@ -4,7 +4,7 @@ import com.sun.jna.Structure; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:1044
    + * native declaration : headers\openvr_capi.h:1343
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_MessageOverlay_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_MessageOverlay_t.java index bf0e25b28..fc9e82c9b 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_MessageOverlay_t.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_MessageOverlay_t.java @@ -4,7 +4,7 @@ import com.sun.jna.Structure; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:1079
    + * native declaration : headers\openvr_capi.h:1380
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Mouse_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Mouse_t.java index 832534db6..b55c523c7 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Mouse_t.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Mouse_t.java @@ -4,7 +4,7 @@ import com.sun.jna.Structure; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:1011
    + * native declaration : headers\openvr_capi.h:1309
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Notification_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Notification_t.java index ed7bbe420..0f65ecfc3 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Notification_t.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Notification_t.java @@ -4,7 +4,7 @@ import com.sun.jna.Structure; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:1028
    + * native declaration : headers\openvr_capi.h:1326
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Overlay_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Overlay_t.java index f693d2a42..d112d92e2 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Overlay_t.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Overlay_t.java @@ -4,22 +4,24 @@ import com.sun.jna.Structure; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:1036
    + * native declaration : headers\openvr_capi.h:1335
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. */ public class VREvent_Overlay_t extends Structure { public long overlayHandle; + public long devicePath; public VREvent_Overlay_t() { super(); } protected List getFieldOrder() { - return Arrays.asList("overlayHandle"); + return Arrays.asList("overlayHandle", "devicePath"); } - public VREvent_Overlay_t(long overlayHandle) { + public VREvent_Overlay_t(long overlayHandle, long devicePath) { super(); this.overlayHandle = overlayHandle; + this.devicePath = devicePath; } public VREvent_Overlay_t(Pointer peer) { super(peer); diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_PerformanceTest_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_PerformanceTest_t.java index 9d0baeb59..37e357bef 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_PerformanceTest_t.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_PerformanceTest_t.java @@ -4,7 +4,7 @@ import com.sun.jna.Structure; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:1058
    + * native declaration : headers\openvr_capi.h:1359
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Process_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Process_t.java index 5374287c2..ad89d03c9 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Process_t.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Process_t.java @@ -4,7 +4,7 @@ import com.sun.jna.Structure; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:1033
    + * native declaration : headers\openvr_capi.h:1331
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Property_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Property_t.java index 7b9dcb8e6..fe51252f7 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Property_t.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Property_t.java @@ -4,7 +4,7 @@ import com.sun.jna.Structure; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:1085
    + * native declaration : headers\openvr_capi.h:1386
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Reserved_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Reserved_t.java index 638428c62..11dd3f849 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Reserved_t.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Reserved_t.java @@ -4,7 +4,7 @@ import com.sun.jna.Structure; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:1055
    + * native declaration : headers\openvr_capi.h:1356
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. @@ -12,16 +12,20 @@ import java.util.List; public class VREvent_Reserved_t extends Structure { public long reserved0; public long reserved1; + public long reserved2; + public long reserved3; public VREvent_Reserved_t() { super(); } protected List getFieldOrder() { - return Arrays.asList("reserved0", "reserved1"); + return Arrays.asList("reserved0", "reserved1", "reserved2", "reserved3"); } - public VREvent_Reserved_t(long reserved0, long reserved1) { + public VREvent_Reserved_t(long reserved0, long reserved1, long reserved2, long reserved3) { super(); this.reserved0 = reserved0; this.reserved1 = reserved1; + this.reserved2 = reserved2; + this.reserved3 = reserved3; } public VREvent_Reserved_t(Pointer peer) { super(peer); diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_ScreenshotProgress_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_ScreenshotProgress_t.java index c1cb365e1..7d616dec6 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_ScreenshotProgress_t.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_ScreenshotProgress_t.java @@ -4,7 +4,7 @@ import com.sun.jna.Structure; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:1068
    + * native declaration : headers\openvr_capi.h:1369
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Screenshot_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Screenshot_t.java index 2860f082b..d34f6e089 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Screenshot_t.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Screenshot_t.java @@ -4,7 +4,7 @@ import com.sun.jna.Structure; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:1065
    + * native declaration : headers\openvr_capi.h:1366
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Scroll_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Scroll_t.java index 7cf75de8d..8a428e8bb 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Scroll_t.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Scroll_t.java @@ -4,7 +4,7 @@ import com.sun.jna.Structure; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:1016
    + * native declaration : headers\openvr_capi.h:1314
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_SeatedZeroPoseReset_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_SeatedZeroPoseReset_t.java index 4c1227b9d..fb8edda62 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_SeatedZeroPoseReset_t.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_SeatedZeroPoseReset_t.java @@ -4,7 +4,7 @@ import com.sun.jna.Structure; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:1061
    + * native declaration : headers\openvr_capi.h:1362
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_SpatialAnchor_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_SpatialAnchor_t.java new file mode 100644 index 000000000..5e26d5b4c --- /dev/null +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_SpatialAnchor_t.java @@ -0,0 +1,35 @@ +package com.jme3.system.jopenvr; +import com.sun.jna.Pointer; +import com.sun.jna.Structure; +import java.util.Arrays; +import java.util.List; +/** + * native declaration : headers\openvr_capi.h:1420
    + * This file was autogenerated by JNAerator,
    + * a tool written by Olivier Chafik that uses a few opensource projects..
    + * For help, please visit NativeLibs4Java , Rococoa, or JNA. + */ +public class VREvent_SpatialAnchor_t extends Structure { + /** C type : SpatialAnchorHandle_t */ + public int unHandle; + public VREvent_SpatialAnchor_t() { + super(); + } + protected List getFieldOrder() { + return Arrays.asList("unHandle"); + } + /** @param unHandle C type : SpatialAnchorHandle_t */ + public VREvent_SpatialAnchor_t(int unHandle) { + super(); + this.unHandle = unHandle; + } + public VREvent_SpatialAnchor_t(Pointer peer) { + super(peer); + } + public static class ByReference extends VREvent_SpatialAnchor_t implements Structure.ByReference { + + }; + public static class ByValue extends VREvent_SpatialAnchor_t implements Structure.ByValue { + + }; +} diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Status_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Status_t.java index 1249d47a0..054b72f68 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Status_t.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_Status_t.java @@ -4,7 +4,7 @@ import com.sun.jna.Structure; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:1039
    + * native declaration : headers\openvr_capi.h:1338
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_TouchPadMove_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_TouchPadMove_t.java index f46b0a499..58f4af112 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_TouchPadMove_t.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_TouchPadMove_t.java @@ -4,7 +4,7 @@ import com.sun.jna.Structure; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:1024
    + * native declaration : headers\openvr_capi.h:1322
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_WebConsole_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_WebConsole_t.java new file mode 100644 index 000000000..bcde8c67c --- /dev/null +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_WebConsole_t.java @@ -0,0 +1,35 @@ +package com.jme3.system.jopenvr; +import com.sun.jna.Pointer; +import com.sun.jna.Structure; +import java.util.Arrays; +import java.util.List; +/** + * native declaration : headers\openvr_capi.h:1405
    + * This file was autogenerated by JNAerator,
    + * a tool written by Olivier Chafik that uses a few opensource projects..
    + * For help, please visit NativeLibs4Java , Rococoa, or JNA. + */ +public class VREvent_WebConsole_t extends Structure { + /** C type : WebConsoleHandle_t */ + public long webConsoleHandle; + public VREvent_WebConsole_t() { + super(); + } + protected List getFieldOrder() { + return Arrays.asList("webConsoleHandle"); + } + /** @param webConsoleHandle C type : WebConsoleHandle_t */ + public VREvent_WebConsole_t(long webConsoleHandle) { + super(); + this.webConsoleHandle = webConsoleHandle; + } + public VREvent_WebConsole_t(Pointer peer) { + super(peer); + } + public static class ByReference extends VREvent_WebConsole_t implements Structure.ByReference { + + }; + public static class ByValue extends VREvent_WebConsole_t implements Structure.ByValue { + + }; +} diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_t.java index 716a4d69d..e22ad5687 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_t.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VREvent_t.java @@ -5,7 +5,7 @@ import java.util.Arrays; import java.util.List; /** * An event posted by the server to all running applications
    - * native declaration : headers\openvr_capi.h:1286
    + * native declaration : headers\openvr_capi.h:1694
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VROverlayIntersectionMaskPrimitive_Data_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VROverlayIntersectionMaskPrimitive_Data_t.java index 964dcf280..9020bf285 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VROverlayIntersectionMaskPrimitive_Data_t.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VROverlayIntersectionMaskPrimitive_Data_t.java @@ -2,7 +2,7 @@ package com.jme3.system.jopenvr; import com.sun.jna.Pointer; import com.sun.jna.Union; /** - * native declaration : headers\openvr_capi.h:1290
    + * native declaration : headers\openvr_capi.h:1698
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VROverlayIntersectionMaskPrimitive_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VROverlayIntersectionMaskPrimitive_t.java index 46ac5b9f9..e9c7e5934 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VROverlayIntersectionMaskPrimitive_t.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VROverlayIntersectionMaskPrimitive_t.java @@ -4,7 +4,7 @@ import com.sun.jna.Structure; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:1294
    + * native declaration : headers\openvr_capi.h:1702
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VROverlayIntersectionParams_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VROverlayIntersectionParams_t.java index 80d8df4e2..e430f2235 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VROverlayIntersectionParams_t.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VROverlayIntersectionParams_t.java @@ -4,7 +4,7 @@ import com.sun.jna.Structure; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:1183
    + * native declaration : headers\openvr_capi.h:1535
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VROverlayIntersectionResults_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VROverlayIntersectionResults_t.java index 6ea1fd749..22374bacc 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VROverlayIntersectionResults_t.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VROverlayIntersectionResults_t.java @@ -4,7 +4,7 @@ import com.sun.jna.Structure; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:1189
    + * native declaration : headers\openvr_capi.h:1541
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VRTextureBounds_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VRTextureBounds_t.java index 0d03b1448..3a0ce15df 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VRTextureBounds_t.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VRTextureBounds_t.java @@ -4,7 +4,7 @@ import com.sun.jna.Structure; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:980
    + * native declaration : headers\openvr_capi.h:1263
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VRTextureDepthInfo_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VRTextureDepthInfo_t.java new file mode 100644 index 000000000..6dc69f3fb --- /dev/null +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VRTextureDepthInfo_t.java @@ -0,0 +1,49 @@ +package com.jme3.system.jopenvr; +import com.sun.jna.Pointer; +import com.sun.jna.Structure; +import java.util.Arrays; +import java.util.List; +/** + * native declaration : headers\openvr_capi.h:1272
    + * This file was autogenerated by JNAerator,
    + * a tool written by Olivier Chafik that uses a few opensource projects..
    + * For help, please visit NativeLibs4Java , Rococoa, or JNA. + */ +public class VRTextureDepthInfo_t extends Structure { + /** + * void *
    + * C type : void* + */ + public Pointer handle; + /** C type : HmdMatrix44_t */ + public HmdMatrix44_t mProjection; + /** C type : HmdVector2_t */ + public HmdVector2_t vRange; + public VRTextureDepthInfo_t() { + super(); + } + protected List getFieldOrder() { + return Arrays.asList("handle", "mProjection", "vRange"); + } + /** + * @param handle void *
    + * C type : void*
    + * @param mProjection C type : HmdMatrix44_t
    + * @param vRange C type : HmdVector2_t + */ + public VRTextureDepthInfo_t(Pointer handle, HmdMatrix44_t mProjection, HmdVector2_t vRange) { + super(); + this.handle = handle; + this.mProjection = mProjection; + this.vRange = vRange; + } + public VRTextureDepthInfo_t(Pointer peer) { + super(peer); + } + public static class ByReference extends VRTextureDepthInfo_t implements Structure.ByReference { + + }; + public static class ByValue extends VRTextureDepthInfo_t implements Structure.ByValue { + + }; +} diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VRTextureWithDepth_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VRTextureWithDepth_t.java new file mode 100644 index 000000000..2b58cfa60 --- /dev/null +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VRTextureWithDepth_t.java @@ -0,0 +1,35 @@ +package com.jme3.system.jopenvr; +import com.sun.jna.Pointer; +import com.sun.jna.Structure; +import java.util.Arrays; +import java.util.List; +/** + * native declaration : headers\openvr_capi.h:1275
    + * This file was autogenerated by JNAerator,
    + * a tool written by Olivier Chafik that uses a few opensource projects..
    + * For help, please visit NativeLibs4Java , Rococoa, or JNA. + */ +public class VRTextureWithDepth_t extends Structure { + /** C type : VRTextureDepthInfo_t */ + public VRTextureDepthInfo_t depth; + public VRTextureWithDepth_t() { + super(); + } + protected List getFieldOrder() { + return Arrays.asList("depth"); + } + /** @param depth C type : VRTextureDepthInfo_t */ + public VRTextureWithDepth_t(VRTextureDepthInfo_t depth) { + super(); + this.depth = depth; + } + public VRTextureWithDepth_t(Pointer peer) { + super(peer); + } + public static class ByReference extends VRTextureWithDepth_t implements Structure.ByReference { + + }; + public static class ByValue extends VRTextureWithDepth_t implements Structure.ByValue { + + }; +} diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VRTextureWithPoseAndDepth_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VRTextureWithPoseAndDepth_t.java new file mode 100644 index 000000000..1ae24aa8b --- /dev/null +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VRTextureWithPoseAndDepth_t.java @@ -0,0 +1,35 @@ +package com.jme3.system.jopenvr; +import com.sun.jna.Pointer; +import com.sun.jna.Structure; +import java.util.Arrays; +import java.util.List; +/** + * native declaration : headers\openvr_capi.h:1278
    + * This file was autogenerated by JNAerator,
    + * a tool written by Olivier Chafik that uses a few opensource projects..
    + * For help, please visit NativeLibs4Java , Rococoa, or JNA. + */ +public class VRTextureWithPoseAndDepth_t extends Structure { + /** C type : VRTextureDepthInfo_t */ + public VRTextureDepthInfo_t depth; + public VRTextureWithPoseAndDepth_t() { + super(); + } + protected List getFieldOrder() { + return Arrays.asList("depth"); + } + /** @param depth C type : VRTextureDepthInfo_t */ + public VRTextureWithPoseAndDepth_t(VRTextureDepthInfo_t depth) { + super(); + this.depth = depth; + } + public VRTextureWithPoseAndDepth_t(Pointer peer) { + super(peer); + } + public static class ByReference extends VRTextureWithPoseAndDepth_t implements Structure.ByReference { + + }; + public static class ByValue extends VRTextureWithPoseAndDepth_t implements Structure.ByValue { + + }; +} diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VRTextureWithPose_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VRTextureWithPose_t.java new file mode 100644 index 000000000..694562e44 --- /dev/null +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VRTextureWithPose_t.java @@ -0,0 +1,35 @@ +package com.jme3.system.jopenvr; +import com.sun.jna.Pointer; +import com.sun.jna.Structure; +import java.util.Arrays; +import java.util.List; +/** + * native declaration : headers\openvr_capi.h:1266
    + * This file was autogenerated by JNAerator,
    + * a tool written by Olivier Chafik that uses a few opensource projects..
    + * For help, please visit NativeLibs4Java , Rococoa, or JNA. + */ +public class VRTextureWithPose_t extends Structure { + /** C type : HmdMatrix34_t */ + public HmdMatrix34_t mDeviceToAbsoluteTracking; + public VRTextureWithPose_t() { + super(); + } + protected List getFieldOrder() { + return Arrays.asList("mDeviceToAbsoluteTracking"); + } + /** @param mDeviceToAbsoluteTracking C type : HmdMatrix34_t */ + public VRTextureWithPose_t(HmdMatrix34_t mDeviceToAbsoluteTracking) { + super(); + this.mDeviceToAbsoluteTracking = mDeviceToAbsoluteTracking; + } + public VRTextureWithPose_t(Pointer peer) { + super(peer); + } + public static class ByReference extends VRTextureWithPose_t implements Structure.ByReference { + + }; + public static class ByValue extends VRTextureWithPose_t implements Structure.ByValue { + + }; +} diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VRVulkanTextureData_t.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VRVulkanTextureData_t.java index 413797414..cf26144bc 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VRVulkanTextureData_t.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VRVulkanTextureData_t.java @@ -8,7 +8,7 @@ import com.sun.jna.Structure; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:996
    + * native declaration : headers\openvr_capi.h:1294
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRApplications_FnTable.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRApplications_FnTable.java index c1f456c73..8c4269894 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRApplications_FnTable.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRApplications_FnTable.java @@ -6,7 +6,7 @@ import com.sun.jna.ptr.IntByReference; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:1483
    + * native declaration : headers\openvr_capi.h:1897
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. @@ -74,127 +74,127 @@ public class VR_IVRApplications_FnTable extends Structure { public VR_IVRApplications_FnTable.LaunchInternalProcess_callback LaunchInternalProcess; /** C type : GetCurrentSceneProcessId_callback* */ public VR_IVRApplications_FnTable.GetCurrentSceneProcessId_callback GetCurrentSceneProcessId; - /** native declaration : headers\openvr_capi.h:1452 */ + /** native declaration : headers\openvr_capi.h:1866 */ public interface AddApplicationManifest_callback extends Callback { int apply(Pointer pchApplicationManifestFullPath, byte bTemporary); }; - /** native declaration : headers\openvr_capi.h:1453 */ + /** native declaration : headers\openvr_capi.h:1867 */ public interface RemoveApplicationManifest_callback extends Callback { int apply(Pointer pchApplicationManifestFullPath); }; - /** native declaration : headers\openvr_capi.h:1454 */ + /** native declaration : headers\openvr_capi.h:1868 */ public interface IsApplicationInstalled_callback extends Callback { byte apply(Pointer pchAppKey); }; - /** native declaration : headers\openvr_capi.h:1455 */ + /** native declaration : headers\openvr_capi.h:1869 */ public interface GetApplicationCount_callback extends Callback { int apply(); }; - /** native declaration : headers\openvr_capi.h:1456 */ + /** native declaration : headers\openvr_capi.h:1870 */ public interface GetApplicationKeyByIndex_callback extends Callback { int apply(int unApplicationIndex, Pointer pchAppKeyBuffer, int unAppKeyBufferLen); }; - /** native declaration : headers\openvr_capi.h:1457 */ + /** native declaration : headers\openvr_capi.h:1871 */ public interface GetApplicationKeyByProcessId_callback extends Callback { int apply(int unProcessId, Pointer pchAppKeyBuffer, int unAppKeyBufferLen); }; - /** native declaration : headers\openvr_capi.h:1458 */ + /** native declaration : headers\openvr_capi.h:1872 */ public interface LaunchApplication_callback extends Callback { int apply(Pointer pchAppKey); }; - /** native declaration : headers\openvr_capi.h:1459 */ + /** native declaration : headers\openvr_capi.h:1873 */ public interface LaunchTemplateApplication_callback extends Callback { int apply(Pointer pchTemplateAppKey, Pointer pchNewAppKey, AppOverrideKeys_t pKeys, int unKeys); }; - /** native declaration : headers\openvr_capi.h:1460 */ + /** native declaration : headers\openvr_capi.h:1874 */ public interface LaunchApplicationFromMimeType_callback extends Callback { int apply(Pointer pchMimeType, Pointer pchArgs); }; - /** native declaration : headers\openvr_capi.h:1461 */ + /** native declaration : headers\openvr_capi.h:1875 */ public interface LaunchDashboardOverlay_callback extends Callback { int apply(Pointer pchAppKey); }; - /** native declaration : headers\openvr_capi.h:1462 */ + /** native declaration : headers\openvr_capi.h:1876 */ public interface CancelApplicationLaunch_callback extends Callback { byte apply(Pointer pchAppKey); }; - /** native declaration : headers\openvr_capi.h:1463 */ + /** native declaration : headers\openvr_capi.h:1877 */ public interface IdentifyApplication_callback extends Callback { int apply(int unProcessId, Pointer pchAppKey); }; - /** native declaration : headers\openvr_capi.h:1464 */ + /** native declaration : headers\openvr_capi.h:1878 */ public interface GetApplicationProcessId_callback extends Callback { int apply(Pointer pchAppKey); }; - /** native declaration : headers\openvr_capi.h:1465 */ + /** native declaration : headers\openvr_capi.h:1879 */ public interface GetApplicationsErrorNameFromEnum_callback extends Callback { Pointer apply(int error); }; - /** native declaration : headers\openvr_capi.h:1466 */ + /** native declaration : headers\openvr_capi.h:1880 */ public interface GetApplicationPropertyString_callback extends Callback { int apply(Pointer pchAppKey, int eProperty, Pointer pchPropertyValueBuffer, int unPropertyValueBufferLen, IntByReference peError); }; - /** native declaration : headers\openvr_capi.h:1467 */ + /** native declaration : headers\openvr_capi.h:1881 */ public interface GetApplicationPropertyBool_callback extends Callback { byte apply(Pointer pchAppKey, int eProperty, IntByReference peError); }; - /** native declaration : headers\openvr_capi.h:1468 */ + /** native declaration : headers\openvr_capi.h:1882 */ public interface GetApplicationPropertyUint64_callback extends Callback { long apply(Pointer pchAppKey, int eProperty, IntByReference peError); }; - /** native declaration : headers\openvr_capi.h:1469 */ + /** native declaration : headers\openvr_capi.h:1883 */ public interface SetApplicationAutoLaunch_callback extends Callback { int apply(Pointer pchAppKey, byte bAutoLaunch); }; - /** native declaration : headers\openvr_capi.h:1470 */ + /** native declaration : headers\openvr_capi.h:1884 */ public interface GetApplicationAutoLaunch_callback extends Callback { byte apply(Pointer pchAppKey); }; - /** native declaration : headers\openvr_capi.h:1471 */ + /** native declaration : headers\openvr_capi.h:1885 */ public interface SetDefaultApplicationForMimeType_callback extends Callback { int apply(Pointer pchAppKey, Pointer pchMimeType); }; - /** native declaration : headers\openvr_capi.h:1472 */ + /** native declaration : headers\openvr_capi.h:1886 */ public interface GetDefaultApplicationForMimeType_callback extends Callback { byte apply(Pointer pchMimeType, Pointer pchAppKeyBuffer, int unAppKeyBufferLen); }; - /** native declaration : headers\openvr_capi.h:1473 */ + /** native declaration : headers\openvr_capi.h:1887 */ public interface GetApplicationSupportedMimeTypes_callback extends Callback { byte apply(Pointer pchAppKey, Pointer pchMimeTypesBuffer, int unMimeTypesBuffer); }; - /** native declaration : headers\openvr_capi.h:1474 */ + /** native declaration : headers\openvr_capi.h:1888 */ public interface GetApplicationsThatSupportMimeType_callback extends Callback { int apply(Pointer pchMimeType, Pointer pchAppKeysThatSupportBuffer, int unAppKeysThatSupportBuffer); }; - /** native declaration : headers\openvr_capi.h:1475 */ + /** native declaration : headers\openvr_capi.h:1889 */ public interface GetApplicationLaunchArguments_callback extends Callback { int apply(int unHandle, Pointer pchArgs, int unArgs); }; - /** native declaration : headers\openvr_capi.h:1476 */ + /** native declaration : headers\openvr_capi.h:1890 */ public interface GetStartingApplication_callback extends Callback { int apply(Pointer pchAppKeyBuffer, int unAppKeyBufferLen); }; - /** native declaration : headers\openvr_capi.h:1477 */ + /** native declaration : headers\openvr_capi.h:1891 */ public interface GetTransitionState_callback extends Callback { int apply(); }; - /** native declaration : headers\openvr_capi.h:1478 */ + /** native declaration : headers\openvr_capi.h:1892 */ public interface PerformApplicationPrelaunchCheck_callback extends Callback { int apply(Pointer pchAppKey); }; - /** native declaration : headers\openvr_capi.h:1479 */ + /** native declaration : headers\openvr_capi.h:1893 */ public interface GetApplicationsTransitionStateNameFromEnum_callback extends Callback { Pointer apply(int state); }; - /** native declaration : headers\openvr_capi.h:1480 */ + /** native declaration : headers\openvr_capi.h:1894 */ public interface IsQuitUserPromptRequested_callback extends Callback { byte apply(); }; - /** native declaration : headers\openvr_capi.h:1481 */ + /** native declaration : headers\openvr_capi.h:1895 */ public interface LaunchInternalProcess_callback extends Callback { int apply(Pointer pchBinaryPath, Pointer pchArguments, Pointer pchWorkingDirectory); }; - /** native declaration : headers\openvr_capi.h:1482 */ + /** native declaration : headers\openvr_capi.h:1896 */ public interface GetCurrentSceneProcessId_callback extends Callback { int apply(); }; diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRChaperoneSetup_FnTable.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRChaperoneSetup_FnTable.java index cfbba6893..36be54ea5 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRChaperoneSetup_FnTable.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRChaperoneSetup_FnTable.java @@ -7,7 +7,7 @@ import com.sun.jna.ptr.IntByReference; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:1543
    + * native declaration : headers\openvr_capi.h:1957
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. @@ -53,83 +53,83 @@ public class VR_IVRChaperoneSetup_FnTable extends Structure { public VR_IVRChaperoneSetup_FnTable.ExportLiveToBuffer_callback ExportLiveToBuffer; /** C type : ImportFromBufferToWorking_callback* */ public VR_IVRChaperoneSetup_FnTable.ImportFromBufferToWorking_callback ImportFromBufferToWorking; - /** native declaration : headers\openvr_capi.h:1523 */ + /** native declaration : headers\openvr_capi.h:1937 */ public interface CommitWorkingCopy_callback extends Callback { byte apply(int configFile); }; - /** native declaration : headers\openvr_capi.h:1524 */ + /** native declaration : headers\openvr_capi.h:1938 */ public interface RevertWorkingCopy_callback extends Callback { void apply(); }; - /** native declaration : headers\openvr_capi.h:1525 */ + /** native declaration : headers\openvr_capi.h:1939 */ public interface GetWorkingPlayAreaSize_callback extends Callback { byte apply(FloatByReference pSizeX, FloatByReference pSizeZ); }; - /** native declaration : headers\openvr_capi.h:1526 */ + /** native declaration : headers\openvr_capi.h:1940 */ public interface GetWorkingPlayAreaRect_callback extends Callback { byte apply(HmdQuad_t rect); }; - /** native declaration : headers\openvr_capi.h:1527 */ + /** native declaration : headers\openvr_capi.h:1941 */ public interface GetWorkingCollisionBoundsInfo_callback extends Callback { byte apply(HmdQuad_t pQuadsBuffer, IntByReference punQuadsCount); }; - /** native declaration : headers\openvr_capi.h:1528 */ + /** native declaration : headers\openvr_capi.h:1942 */ public interface GetLiveCollisionBoundsInfo_callback extends Callback { byte apply(HmdQuad_t pQuadsBuffer, IntByReference punQuadsCount); }; - /** native declaration : headers\openvr_capi.h:1529 */ + /** native declaration : headers\openvr_capi.h:1943 */ public interface GetWorkingSeatedZeroPoseToRawTrackingPose_callback extends Callback { byte apply(HmdMatrix34_t pmatSeatedZeroPoseToRawTrackingPose); }; - /** native declaration : headers\openvr_capi.h:1530 */ + /** native declaration : headers\openvr_capi.h:1944 */ public interface GetWorkingStandingZeroPoseToRawTrackingPose_callback extends Callback { byte apply(HmdMatrix34_t pmatStandingZeroPoseToRawTrackingPose); }; - /** native declaration : headers\openvr_capi.h:1531 */ + /** native declaration : headers\openvr_capi.h:1945 */ public interface SetWorkingPlayAreaSize_callback extends Callback { void apply(float sizeX, float sizeZ); }; - /** native declaration : headers\openvr_capi.h:1532 */ + /** native declaration : headers\openvr_capi.h:1946 */ public interface SetWorkingCollisionBoundsInfo_callback extends Callback { void apply(HmdQuad_t pQuadsBuffer, int unQuadsCount); }; - /** native declaration : headers\openvr_capi.h:1533 */ + /** native declaration : headers\openvr_capi.h:1947 */ public interface SetWorkingSeatedZeroPoseToRawTrackingPose_callback extends Callback { void apply(HmdMatrix34_t pMatSeatedZeroPoseToRawTrackingPose); }; - /** native declaration : headers\openvr_capi.h:1534 */ + /** native declaration : headers\openvr_capi.h:1948 */ public interface SetWorkingStandingZeroPoseToRawTrackingPose_callback extends Callback { void apply(HmdMatrix34_t pMatStandingZeroPoseToRawTrackingPose); }; - /** native declaration : headers\openvr_capi.h:1535 */ + /** native declaration : headers\openvr_capi.h:1949 */ public interface ReloadFromDisk_callback extends Callback { void apply(int configFile); }; - /** native declaration : headers\openvr_capi.h:1536 */ + /** native declaration : headers\openvr_capi.h:1950 */ public interface GetLiveSeatedZeroPoseToRawTrackingPose_callback extends Callback { byte apply(HmdMatrix34_t pmatSeatedZeroPoseToRawTrackingPose); }; - /** native declaration : headers\openvr_capi.h:1537 */ + /** native declaration : headers\openvr_capi.h:1951 */ public interface SetWorkingCollisionBoundsTagsInfo_callback extends Callback { void apply(Pointer pTagsBuffer, int unTagCount); }; - /** native declaration : headers\openvr_capi.h:1538 */ + /** native declaration : headers\openvr_capi.h:1952 */ public interface GetLiveCollisionBoundsTagsInfo_callback extends Callback { byte apply(Pointer pTagsBuffer, IntByReference punTagCount); }; - /** native declaration : headers\openvr_capi.h:1539 */ + /** native declaration : headers\openvr_capi.h:1953 */ public interface SetWorkingPhysicalBoundsInfo_callback extends Callback { byte apply(HmdQuad_t pQuadsBuffer, int unQuadsCount); }; - /** native declaration : headers\openvr_capi.h:1540 */ + /** native declaration : headers\openvr_capi.h:1954 */ public interface GetLivePhysicalBoundsInfo_callback extends Callback { byte apply(HmdQuad_t pQuadsBuffer, IntByReference punQuadsCount); }; - /** native declaration : headers\openvr_capi.h:1541 */ + /** native declaration : headers\openvr_capi.h:1955 */ public interface ExportLiveToBuffer_callback extends Callback { byte apply(Pointer pBuffer, IntByReference pnBufferLength); }; - /** native declaration : headers\openvr_capi.h:1542 */ + /** native declaration : headers\openvr_capi.h:1956 */ public interface ImportFromBufferToWorking_callback extends Callback { byte apply(Pointer pBuffer, int nImportFlags); }; diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRChaperone_FnTable.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRChaperone_FnTable.java index 0d827d2cf..6d71c06af 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRChaperone_FnTable.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRChaperone_FnTable.java @@ -6,7 +6,7 @@ import com.sun.jna.ptr.FloatByReference; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:1501
    + * native declaration : headers\openvr_capi.h:1915
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. @@ -28,35 +28,35 @@ public class VR_IVRChaperone_FnTable extends Structure { public VR_IVRChaperone_FnTable.AreBoundsVisible_callback AreBoundsVisible; /** C type : ForceBoundsVisible_callback* */ public VR_IVRChaperone_FnTable.ForceBoundsVisible_callback ForceBoundsVisible; - /** native declaration : headers\openvr_capi.h:1493 */ + /** native declaration : headers\openvr_capi.h:1907 */ public interface GetCalibrationState_callback extends Callback { int apply(); }; - /** native declaration : headers\openvr_capi.h:1494 */ + /** native declaration : headers\openvr_capi.h:1908 */ public interface GetPlayAreaSize_callback extends Callback { byte apply(FloatByReference pSizeX, FloatByReference pSizeZ); }; - /** native declaration : headers\openvr_capi.h:1495 */ + /** native declaration : headers\openvr_capi.h:1909 */ public interface GetPlayAreaRect_callback extends Callback { byte apply(HmdQuad_t rect); }; - /** native declaration : headers\openvr_capi.h:1496 */ + /** native declaration : headers\openvr_capi.h:1910 */ public interface ReloadInfo_callback extends Callback { void apply(); }; - /** native declaration : headers\openvr_capi.h:1497 */ + /** native declaration : headers\openvr_capi.h:1911 */ public interface SetSceneColor_callback extends Callback { void apply(HmdColor_t.ByValue color); }; - /** native declaration : headers\openvr_capi.h:1498 */ + /** native declaration : headers\openvr_capi.h:1912 */ public interface GetBoundsColor_callback extends Callback { void apply(HmdColor_t pOutputColorArray, int nNumOutputColors, float flCollisionBoundsFadeDistance, HmdColor_t pOutputCameraColor); }; - /** native declaration : headers\openvr_capi.h:1499 */ + /** native declaration : headers\openvr_capi.h:1913 */ public interface AreBoundsVisible_callback extends Callback { byte apply(); }; - /** native declaration : headers\openvr_capi.h:1500 */ + /** native declaration : headers\openvr_capi.h:1914 */ public interface ForceBoundsVisible_callback extends Callback { void apply(byte bForce); }; diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRCompositor_FnTable.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRCompositor_FnTable.java index 0d1b143f6..f4154dfda 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRCompositor_FnTable.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRCompositor_FnTable.java @@ -8,7 +8,7 @@ import com.sun.jna.ptr.PointerByReference; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:1627
    + * native declaration : headers\openvr_capi.h:2045
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. @@ -96,175 +96,187 @@ public class VR_IVRCompositor_FnTable extends Structure { public VR_IVRCompositor_FnTable.GetVulkanInstanceExtensionsRequired_callback GetVulkanInstanceExtensionsRequired; /** C type : GetVulkanDeviceExtensionsRequired_callback* */ public VR_IVRCompositor_FnTable.GetVulkanDeviceExtensionsRequired_callback GetVulkanDeviceExtensionsRequired; - /** native declaration : headers\openvr_capi.h:1586 */ + /** C type : SetExplicitTimingMode_callback* */ + public VR_IVRCompositor_FnTable.SetExplicitTimingMode_callback SetExplicitTimingMode; + /** C type : SubmitExplicitTimingData_callback* */ + public VR_IVRCompositor_FnTable.SubmitExplicitTimingData_callback SubmitExplicitTimingData; + /** native declaration : headers\openvr_capi.h:2002 */ public interface SetTrackingSpace_callback extends Callback { void apply(int eOrigin); }; - /** native declaration : headers\openvr_capi.h:1587 */ + /** native declaration : headers\openvr_capi.h:2003 */ public interface GetTrackingSpace_callback extends Callback { int apply(); }; - /** native declaration : headers\openvr_capi.h:1588 */ + /** native declaration : headers\openvr_capi.h:2004 */ public interface WaitGetPoses_callback extends Callback { int apply(TrackedDevicePose_t pRenderPoseArray, int unRenderPoseArrayCount, TrackedDevicePose_t pGamePoseArray, int unGamePoseArrayCount); }; - /** native declaration : headers\openvr_capi.h:1589 */ + /** native declaration : headers\openvr_capi.h:2005 */ public interface GetLastPoses_callback extends Callback { int apply(TrackedDevicePose_t pRenderPoseArray, int unRenderPoseArrayCount, TrackedDevicePose_t pGamePoseArray, int unGamePoseArrayCount); }; - /** native declaration : headers\openvr_capi.h:1590 */ + /** native declaration : headers\openvr_capi.h:2006 */ public interface GetLastPoseForTrackedDeviceIndex_callback extends Callback { int apply(int unDeviceIndex, TrackedDevicePose_t pOutputPose, TrackedDevicePose_t pOutputGamePose); }; - /** native declaration : headers\openvr_capi.h:1591 */ + /** native declaration : headers\openvr_capi.h:2007 */ public interface Submit_callback extends Callback { int apply(int eEye, Texture_t pTexture, VRTextureBounds_t pBounds, int nSubmitFlags); }; - /** native declaration : headers\openvr_capi.h:1592 */ + /** native declaration : headers\openvr_capi.h:2008 */ public interface ClearLastSubmittedFrame_callback extends Callback { void apply(); }; - /** native declaration : headers\openvr_capi.h:1593 */ + /** native declaration : headers\openvr_capi.h:2009 */ public interface PostPresentHandoff_callback extends Callback { void apply(); }; - /** native declaration : headers\openvr_capi.h:1594 */ + /** native declaration : headers\openvr_capi.h:2010 */ public interface GetFrameTiming_callback extends Callback { byte apply(Compositor_FrameTiming pTiming, int unFramesAgo); }; - /** native declaration : headers\openvr_capi.h:1595 */ + /** native declaration : headers\openvr_capi.h:2011 */ public interface GetFrameTimings_callback extends Callback { int apply(Compositor_FrameTiming pTiming, int nFrames); }; - /** native declaration : headers\openvr_capi.h:1596 */ + /** native declaration : headers\openvr_capi.h:2012 */ public interface GetFrameTimeRemaining_callback extends Callback { float apply(); }; - /** native declaration : headers\openvr_capi.h:1597 */ + /** native declaration : headers\openvr_capi.h:2013 */ public interface GetCumulativeStats_callback extends Callback { void apply(Compositor_CumulativeStats pStats, int nStatsSizeInBytes); }; - /** native declaration : headers\openvr_capi.h:1598 */ + /** native declaration : headers\openvr_capi.h:2014 */ public interface FadeToColor_callback extends Callback { void apply(float fSeconds, float fRed, float fGreen, float fBlue, float fAlpha, byte bBackground); }; - /** native declaration : headers\openvr_capi.h:1599 */ + /** native declaration : headers\openvr_capi.h:2015 */ public interface GetCurrentFadeColor_callback extends Callback { com.jme3.system.jopenvr.HmdColor_t.ByValue apply(byte bBackground); }; - /** native declaration : headers\openvr_capi.h:1600 */ + /** native declaration : headers\openvr_capi.h:2016 */ public interface FadeGrid_callback extends Callback { void apply(float fSeconds, byte bFadeIn); }; - /** native declaration : headers\openvr_capi.h:1601 */ + /** native declaration : headers\openvr_capi.h:2017 */ public interface GetCurrentGridAlpha_callback extends Callback { float apply(); }; - /** native declaration : headers\openvr_capi.h:1602 */ + /** native declaration : headers\openvr_capi.h:2018 */ public interface SetSkyboxOverride_callback extends Callback { int apply(Texture_t pTextures, int unTextureCount); }; - /** native declaration : headers\openvr_capi.h:1603 */ + /** native declaration : headers\openvr_capi.h:2019 */ public interface ClearSkyboxOverride_callback extends Callback { void apply(); }; - /** native declaration : headers\openvr_capi.h:1604 */ + /** native declaration : headers\openvr_capi.h:2020 */ public interface CompositorBringToFront_callback extends Callback { void apply(); }; - /** native declaration : headers\openvr_capi.h:1605 */ + /** native declaration : headers\openvr_capi.h:2021 */ public interface CompositorGoToBack_callback extends Callback { void apply(); }; - /** native declaration : headers\openvr_capi.h:1606 */ + /** native declaration : headers\openvr_capi.h:2022 */ public interface CompositorQuit_callback extends Callback { void apply(); }; - /** native declaration : headers\openvr_capi.h:1607 */ + /** native declaration : headers\openvr_capi.h:2023 */ public interface IsFullscreen_callback extends Callback { byte apply(); }; - /** native declaration : headers\openvr_capi.h:1608 */ + /** native declaration : headers\openvr_capi.h:2024 */ public interface GetCurrentSceneFocusProcess_callback extends Callback { int apply(); }; - /** native declaration : headers\openvr_capi.h:1609 */ + /** native declaration : headers\openvr_capi.h:2025 */ public interface GetLastFrameRenderer_callback extends Callback { int apply(); }; - /** native declaration : headers\openvr_capi.h:1610 */ + /** native declaration : headers\openvr_capi.h:2026 */ public interface CanRenderScene_callback extends Callback { byte apply(); }; - /** native declaration : headers\openvr_capi.h:1611 */ + /** native declaration : headers\openvr_capi.h:2027 */ public interface ShowMirrorWindow_callback extends Callback { void apply(); }; - /** native declaration : headers\openvr_capi.h:1612 */ + /** native declaration : headers\openvr_capi.h:2028 */ public interface HideMirrorWindow_callback extends Callback { void apply(); }; - /** native declaration : headers\openvr_capi.h:1613 */ + /** native declaration : headers\openvr_capi.h:2029 */ public interface IsMirrorWindowVisible_callback extends Callback { byte apply(); }; - /** native declaration : headers\openvr_capi.h:1614 */ + /** native declaration : headers\openvr_capi.h:2030 */ public interface CompositorDumpImages_callback extends Callback { void apply(); }; - /** native declaration : headers\openvr_capi.h:1615 */ + /** native declaration : headers\openvr_capi.h:2031 */ public interface ShouldAppRenderWithLowResources_callback extends Callback { byte apply(); }; - /** native declaration : headers\openvr_capi.h:1616 */ + /** native declaration : headers\openvr_capi.h:2032 */ public interface ForceInterleavedReprojectionOn_callback extends Callback { void apply(byte bOverride); }; - /** native declaration : headers\openvr_capi.h:1617 */ + /** native declaration : headers\openvr_capi.h:2033 */ public interface ForceReconnectProcess_callback extends Callback { void apply(); }; - /** native declaration : headers\openvr_capi.h:1618 */ + /** native declaration : headers\openvr_capi.h:2034 */ public interface SuspendRendering_callback extends Callback { void apply(byte bSuspend); }; - /** native declaration : headers\openvr_capi.h:1619 */ + /** native declaration : headers\openvr_capi.h:2035 */ public interface GetMirrorTextureD3D11_callback extends Callback { int apply(int eEye, Pointer pD3D11DeviceOrResource, PointerByReference ppD3D11ShaderResourceView); }; - /** native declaration : headers\openvr_capi.h:1620 */ + /** native declaration : headers\openvr_capi.h:2036 */ public interface ReleaseMirrorTextureD3D11_callback extends Callback { void apply(Pointer pD3D11ShaderResourceView); }; - /** native declaration : headers\openvr_capi.h:1621 */ + /** native declaration : headers\openvr_capi.h:2037 */ public interface GetMirrorTextureGL_callback extends Callback { int apply(int eEye, IntByReference pglTextureId, PointerByReference pglSharedTextureHandle); }; - /** native declaration : headers\openvr_capi.h:1622 */ + /** native declaration : headers\openvr_capi.h:2038 */ public interface ReleaseSharedGLTexture_callback extends Callback { byte apply(int glTextureId, Pointer glSharedTextureHandle); }; - /** native declaration : headers\openvr_capi.h:1623 */ + /** native declaration : headers\openvr_capi.h:2039 */ public interface LockGLSharedTextureForAccess_callback extends Callback { void apply(Pointer glSharedTextureHandle); }; - /** native declaration : headers\openvr_capi.h:1624 */ + /** native declaration : headers\openvr_capi.h:2040 */ public interface UnlockGLSharedTextureForAccess_callback extends Callback { void apply(Pointer glSharedTextureHandle); }; - /** native declaration : headers\openvr_capi.h:1625 */ + /** native declaration : headers\openvr_capi.h:2041 */ public interface GetVulkanInstanceExtensionsRequired_callback extends Callback { int apply(Pointer pchValue, int unBufferSize); }; - /** native declaration : headers\openvr_capi.h:1626 */ + /** native declaration : headers\openvr_capi.h:2042 */ public interface GetVulkanDeviceExtensionsRequired_callback extends Callback { int apply(VkPhysicalDevice_T pPhysicalDevice, Pointer pchValue, int unBufferSize); }; + /** native declaration : headers\openvr_capi.h:2043 */ + public interface SetExplicitTimingMode_callback extends Callback { + void apply(int eTimingMode); + }; + /** native declaration : headers\openvr_capi.h:2044 */ + public interface SubmitExplicitTimingData_callback extends Callback { + int apply(); + }; public VR_IVRCompositor_FnTable() { super(); } protected List getFieldOrder() { - return Arrays.asList("SetTrackingSpace", "GetTrackingSpace", "WaitGetPoses", "GetLastPoses", "GetLastPoseForTrackedDeviceIndex", "Submit", "ClearLastSubmittedFrame", "PostPresentHandoff", "GetFrameTiming", "GetFrameTimings", "GetFrameTimeRemaining", "GetCumulativeStats", "FadeToColor", "GetCurrentFadeColor", "FadeGrid", "GetCurrentGridAlpha", "SetSkyboxOverride", "ClearSkyboxOverride", "CompositorBringToFront", "CompositorGoToBack", "CompositorQuit", "IsFullscreen", "GetCurrentSceneFocusProcess", "GetLastFrameRenderer", "CanRenderScene", "ShowMirrorWindow", "HideMirrorWindow", "IsMirrorWindowVisible", "CompositorDumpImages", "ShouldAppRenderWithLowResources", "ForceInterleavedReprojectionOn", "ForceReconnectProcess", "SuspendRendering", "GetMirrorTextureD3D11", "ReleaseMirrorTextureD3D11", "GetMirrorTextureGL", "ReleaseSharedGLTexture", "LockGLSharedTextureForAccess", "UnlockGLSharedTextureForAccess", "GetVulkanInstanceExtensionsRequired", "GetVulkanDeviceExtensionsRequired"); + return Arrays.asList("SetTrackingSpace", "GetTrackingSpace", "WaitGetPoses", "GetLastPoses", "GetLastPoseForTrackedDeviceIndex", "Submit", "ClearLastSubmittedFrame", "PostPresentHandoff", "GetFrameTiming", "GetFrameTimings", "GetFrameTimeRemaining", "GetCumulativeStats", "FadeToColor", "GetCurrentFadeColor", "FadeGrid", "GetCurrentGridAlpha", "SetSkyboxOverride", "ClearSkyboxOverride", "CompositorBringToFront", "CompositorGoToBack", "CompositorQuit", "IsFullscreen", "GetCurrentSceneFocusProcess", "GetLastFrameRenderer", "CanRenderScene", "ShowMirrorWindow", "HideMirrorWindow", "IsMirrorWindowVisible", "CompositorDumpImages", "ShouldAppRenderWithLowResources", "ForceInterleavedReprojectionOn", "ForceReconnectProcess", "SuspendRendering", "GetMirrorTextureD3D11", "ReleaseMirrorTextureD3D11", "GetMirrorTextureGL", "ReleaseSharedGLTexture", "LockGLSharedTextureForAccess", "UnlockGLSharedTextureForAccess", "GetVulkanInstanceExtensionsRequired", "GetVulkanDeviceExtensionsRequired", "SetExplicitTimingMode", "SubmitExplicitTimingData"); } public VR_IVRCompositor_FnTable(Pointer peer) { super(peer); diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRDriverManager_FnTable.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRDriverManager_FnTable.java new file mode 100644 index 000000000..f8e926a1c --- /dev/null +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRDriverManager_FnTable.java @@ -0,0 +1,58 @@ +package com.jme3.system.jopenvr; +import com.sun.jna.Callback; +import com.sun.jna.Pointer; +import com.sun.jna.Structure; +import java.util.Arrays; +import java.util.List; +/** + * native declaration : headers\openvr_capi.h:2313
    + * This file was autogenerated by JNAerator,
    + * a tool written by Olivier Chafik that uses a few opensource projects..
    + * For help, please visit NativeLibs4Java , Rococoa, or JNA. + */ +public class VR_IVRDriverManager_FnTable extends Structure { + /** C type : GetDriverCount_callback* */ + public VR_IVRDriverManager_FnTable.GetDriverCount_callback GetDriverCount; + /** C type : GetDriverName_callback* */ + public VR_IVRDriverManager_FnTable.GetDriverName_callback GetDriverName; + /** C type : GetDriverHandle_callback* */ + public VR_IVRDriverManager_FnTable.GetDriverHandle_callback GetDriverHandle; + /** native declaration : headers\openvr_capi.h:2310 */ + public interface GetDriverCount_callback extends Callback { + int apply(); + }; + /** native declaration : headers\openvr_capi.h:2311 */ + public interface GetDriverName_callback extends Callback { + int apply(int nDriver, Pointer pchValue, int unBufferSize); + }; + /** native declaration : headers\openvr_capi.h:2312 */ + public interface GetDriverHandle_callback extends Callback { + long apply(Pointer pchDriverName); + }; + public VR_IVRDriverManager_FnTable() { + super(); + } + protected List getFieldOrder() { + return Arrays.asList("GetDriverCount", "GetDriverName", "GetDriverHandle"); + } + /** + * @param GetDriverCount C type : GetDriverCount_callback*
    + * @param GetDriverName C type : GetDriverName_callback*
    + * @param GetDriverHandle C type : GetDriverHandle_callback* + */ + public VR_IVRDriverManager_FnTable(VR_IVRDriverManager_FnTable.GetDriverCount_callback GetDriverCount, VR_IVRDriverManager_FnTable.GetDriverName_callback GetDriverName, VR_IVRDriverManager_FnTable.GetDriverHandle_callback GetDriverHandle) { + super(); + this.GetDriverCount = GetDriverCount; + this.GetDriverName = GetDriverName; + this.GetDriverHandle = GetDriverHandle; + } + public VR_IVRDriverManager_FnTable(Pointer peer) { + super(peer); + } + public static class ByReference extends VR_IVRDriverManager_FnTable implements Structure.ByReference { + + }; + public static class ByValue extends VR_IVRDriverManager_FnTable implements Structure.ByValue { + + }; +} diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRExtendedDisplay_FnTable.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRExtendedDisplay_FnTable.java index 027c6dc81..de9b54af2 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRExtendedDisplay_FnTable.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRExtendedDisplay_FnTable.java @@ -6,7 +6,7 @@ import com.sun.jna.ptr.IntByReference; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:1393
    + * native declaration : headers\openvr_capi.h:1807
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. @@ -18,15 +18,15 @@ public class VR_IVRExtendedDisplay_FnTable extends Structure { public VR_IVRExtendedDisplay_FnTable.GetEyeOutputViewport_callback GetEyeOutputViewport; /** C type : GetDXGIOutputInfo_callback* */ public VR_IVRExtendedDisplay_FnTable.GetDXGIOutputInfo_callback GetDXGIOutputInfo; - /** native declaration : headers\openvr_capi.h:1390 */ + /** native declaration : headers\openvr_capi.h:1804 */ public interface GetWindowBounds_callback extends Callback { void apply(IntByReference pnX, IntByReference pnY, IntByReference pnWidth, IntByReference pnHeight); }; - /** native declaration : headers\openvr_capi.h:1391 */ + /** native declaration : headers\openvr_capi.h:1805 */ public interface GetEyeOutputViewport_callback extends Callback { void apply(int eEye, IntByReference pnX, IntByReference pnY, IntByReference pnWidth, IntByReference pnHeight); }; - /** native declaration : headers\openvr_capi.h:1392 */ + /** native declaration : headers\openvr_capi.h:1806 */ public interface GetDXGIOutputInfo_callback extends Callback { void apply(IntByReference pnAdapterIndex, IntByReference pnAdapterOutputIndex); }; diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRIOBuffer_FnTable.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRIOBuffer_FnTable.java new file mode 100644 index 000000000..723738729 --- /dev/null +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRIOBuffer_FnTable.java @@ -0,0 +1,76 @@ +package com.jme3.system.jopenvr; +import com.sun.jna.Callback; +import com.sun.jna.Pointer; +import com.sun.jna.Structure; +import com.sun.jna.ptr.IntByReference; +import com.sun.jna.ptr.LongByReference; +import java.util.Arrays; +import java.util.List; +/** + * native declaration : headers\openvr_capi.h:2363
    + * This file was autogenerated by JNAerator,
    + * a tool written by Olivier Chafik that uses a few opensource projects..
    + * For help, please visit NativeLibs4Java , Rococoa, or JNA. + */ +public class VR_IVRIOBuffer_FnTable extends Structure { + /** C type : Open_callback* */ + public VR_IVRIOBuffer_FnTable.Open_callback Open; + /** C type : Close_callback* */ + public VR_IVRIOBuffer_FnTable.Close_callback Close; + /** C type : Read_callback* */ + public VR_IVRIOBuffer_FnTable.Read_callback Read; + /** C type : Write_callback* */ + public VR_IVRIOBuffer_FnTable.Write_callback Write; + /** C type : PropertyContainer_callback* */ + public VR_IVRIOBuffer_FnTable.PropertyContainer_callback PropertyContainer; + /** native declaration : headers\openvr_capi.h:2358 */ + public interface Open_callback extends Callback { + int apply(Pointer pchPath, int mode, int unElementSize, int unElements, LongByReference pulBuffer); + }; + /** native declaration : headers\openvr_capi.h:2359 */ + public interface Close_callback extends Callback { + int apply(long ulBuffer); + }; + /** native declaration : headers\openvr_capi.h:2360 */ + public interface Read_callback extends Callback { + int apply(long ulBuffer, Pointer pDst, int unBytes, IntByReference punRead); + }; + /** native declaration : headers\openvr_capi.h:2361 */ + public interface Write_callback extends Callback { + int apply(long ulBuffer, Pointer pSrc, int unBytes); + }; + /** native declaration : headers\openvr_capi.h:2362 */ + public interface PropertyContainer_callback extends Callback { + long apply(long ulBuffer); + }; + public VR_IVRIOBuffer_FnTable() { + super(); + } + protected List getFieldOrder() { + return Arrays.asList("Open", "Close", "Read", "Write", "PropertyContainer"); + } + /** + * @param Open C type : Open_callback*
    + * @param Close C type : Close_callback*
    + * @param Read C type : Read_callback*
    + * @param Write C type : Write_callback*
    + * @param PropertyContainer C type : PropertyContainer_callback* + */ + public VR_IVRIOBuffer_FnTable(VR_IVRIOBuffer_FnTable.Open_callback Open, VR_IVRIOBuffer_FnTable.Close_callback Close, VR_IVRIOBuffer_FnTable.Read_callback Read, VR_IVRIOBuffer_FnTable.Write_callback Write, VR_IVRIOBuffer_FnTable.PropertyContainer_callback PropertyContainer) { + super(); + this.Open = Open; + this.Close = Close; + this.Read = Read; + this.Write = Write; + this.PropertyContainer = PropertyContainer; + } + public VR_IVRIOBuffer_FnTable(Pointer peer) { + super(peer); + } + public static class ByReference extends VR_IVRIOBuffer_FnTable implements Structure.ByReference { + + }; + public static class ByValue extends VR_IVRIOBuffer_FnTable implements Structure.ByValue { + + }; +} diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRInput_FnTable.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRInput_FnTable.java new file mode 100644 index 000000000..c7fcb0aab --- /dev/null +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRInput_FnTable.java @@ -0,0 +1,139 @@ +package com.jme3.system.jopenvr; +import com.sun.jna.Callback; +import com.sun.jna.Pointer; +import com.sun.jna.Structure; +import com.sun.jna.ptr.IntByReference; +import com.sun.jna.ptr.LongByReference; +import java.util.Arrays; +import java.util.List; +/** + * native declaration : headers\openvr_capi.h:2351
    + * This file was autogenerated by JNAerator,
    + * a tool written by Olivier Chafik that uses a few opensource projects..
    + * For help, please visit NativeLibs4Java , Rococoa, or JNA. + */ +public class VR_IVRInput_FnTable extends Structure { + /** C type : SetActionManifestPath_callback* */ + public VR_IVRInput_FnTable.SetActionManifestPath_callback SetActionManifestPath; + /** C type : GetActionSetHandle_callback* */ + public VR_IVRInput_FnTable.GetActionSetHandle_callback GetActionSetHandle; + /** C type : GetActionHandle_callback* */ + public VR_IVRInput_FnTable.GetActionHandle_callback GetActionHandle; + /** C type : GetInputSourceHandle_callback* */ + public VR_IVRInput_FnTable.GetInputSourceHandle_callback GetInputSourceHandle; + /** C type : UpdateActionState_callback* */ + public VR_IVRInput_FnTable.UpdateActionState_callback UpdateActionState; + /** C type : GetDigitalActionData_callback* */ + public VR_IVRInput_FnTable.GetDigitalActionData_callback GetDigitalActionData; + /** C type : GetAnalogActionData_callback* */ + public VR_IVRInput_FnTable.GetAnalogActionData_callback GetAnalogActionData; + /** C type : GetPoseActionData_callback* */ + public VR_IVRInput_FnTable.GetPoseActionData_callback GetPoseActionData; + /** C type : GetSkeletalActionData_callback* */ + public VR_IVRInput_FnTable.GetSkeletalActionData_callback GetSkeletalActionData; + /** C type : GetSkeletalBoneData_callback* */ + public VR_IVRInput_FnTable.GetSkeletalBoneData_callback GetSkeletalBoneData; + /** C type : GetSkeletalBoneDataCompressed_callback* */ + public VR_IVRInput_FnTable.GetSkeletalBoneDataCompressed_callback GetSkeletalBoneDataCompressed; + /** C type : DecompressSkeletalBoneData_callback* */ + public VR_IVRInput_FnTable.DecompressSkeletalBoneData_callback DecompressSkeletalBoneData; + /** C type : TriggerHapticVibrationAction_callback* */ + public VR_IVRInput_FnTable.TriggerHapticVibrationAction_callback TriggerHapticVibrationAction; + /** C type : GetActionOrigins_callback* */ + public VR_IVRInput_FnTable.GetActionOrigins_callback GetActionOrigins; + /** C type : GetOriginLocalizedName_callback* */ + public VR_IVRInput_FnTable.GetOriginLocalizedName_callback GetOriginLocalizedName; + /** C type : GetOriginTrackedDeviceInfo_callback* */ + public VR_IVRInput_FnTable.GetOriginTrackedDeviceInfo_callback GetOriginTrackedDeviceInfo; + /** C type : ShowActionOrigins_callback* */ + public VR_IVRInput_FnTable.ShowActionOrigins_callback ShowActionOrigins; + /** C type : ShowBindingsForActionSet_callback* */ + public VR_IVRInput_FnTable.ShowBindingsForActionSet_callback ShowBindingsForActionSet; + /** native declaration : headers\openvr_capi.h:2333 */ + public interface SetActionManifestPath_callback extends Callback { + int apply(Pointer pchActionManifestPath); + }; + /** native declaration : headers\openvr_capi.h:2334 */ + public interface GetActionSetHandle_callback extends Callback { + int apply(Pointer pchActionSetName, LongByReference pHandle); + }; + /** native declaration : headers\openvr_capi.h:2335 */ + public interface GetActionHandle_callback extends Callback { + int apply(Pointer pchActionName, LongByReference pHandle); + }; + /** native declaration : headers\openvr_capi.h:2336 */ + public interface GetInputSourceHandle_callback extends Callback { + int apply(Pointer pchInputSourcePath, LongByReference pHandle); + }; + /** native declaration : headers\openvr_capi.h:2337 */ + public interface UpdateActionState_callback extends Callback { + int apply(VRActiveActionSet_t pSets, int unSizeOfVRSelectedActionSet_t, int unSetCount); + }; + /** native declaration : headers\openvr_capi.h:2338 */ + public interface GetDigitalActionData_callback extends Callback { + int apply(long action, InputDigitalActionData_t pActionData, int unActionDataSize, long ulRestrictToDevice); + }; + /** native declaration : headers\openvr_capi.h:2339 */ + public interface GetAnalogActionData_callback extends Callback { + int apply(long action, InputAnalogActionData_t pActionData, int unActionDataSize, long ulRestrictToDevice); + }; + /** native declaration : headers\openvr_capi.h:2340 */ + public interface GetPoseActionData_callback extends Callback { + int apply(long action, int eOrigin, float fPredictedSecondsFromNow, InputPoseActionData_t pActionData, int unActionDataSize, long ulRestrictToDevice); + }; + /** native declaration : headers\openvr_capi.h:2341 */ + public interface GetSkeletalActionData_callback extends Callback { + int apply(long action, InputSkeletalActionData_t pActionData, int unActionDataSize, long ulRestrictToDevice); + }; + /** native declaration : headers\openvr_capi.h:2342 */ + public interface GetSkeletalBoneData_callback extends Callback { + int apply(long action, int eTransformSpace, int eMotionRange, VRBoneTransform_t pTransformArray, int unTransformArrayCount, long ulRestrictToDevice); + }; + /** native declaration : headers\openvr_capi.h:2343 */ + public interface GetSkeletalBoneDataCompressed_callback extends Callback { + int apply(long action, int eTransformSpace, int eMotionRange, Pointer pvCompressedData, int unCompressedSize, IntByReference punRequiredCompressedSize, long ulRestrictToDevice); + }; + /** native declaration : headers\openvr_capi.h:2344 */ + public interface DecompressSkeletalBoneData_callback extends Callback { + int apply(Pointer pvCompressedBuffer, int unCompressedBufferSize, IntByReference peTransformSpace, VRBoneTransform_t pTransformArray, int unTransformArrayCount); + }; + /** native declaration : headers\openvr_capi.h:2345 */ + public interface TriggerHapticVibrationAction_callback extends Callback { + int apply(long action, float fStartSecondsFromNow, float fDurationSeconds, float fFrequency, float fAmplitude, long ulRestrictToDevice); + }; + /** native declaration : headers\openvr_capi.h:2346 */ + public interface GetActionOrigins_callback extends Callback { + int apply(long actionSetHandle, long digitalActionHandle, LongByReference originsOut, int originOutCount); + }; + /** native declaration : headers\openvr_capi.h:2347 */ + public interface GetOriginLocalizedName_callback extends Callback { + int apply(long origin, Pointer pchNameArray, int unNameArraySize); + }; + /** native declaration : headers\openvr_capi.h:2348 */ + public interface GetOriginTrackedDeviceInfo_callback extends Callback { + int apply(long origin, InputOriginInfo_t pOriginInfo, int unOriginInfoSize); + }; + /** native declaration : headers\openvr_capi.h:2349 */ + public interface ShowActionOrigins_callback extends Callback { + int apply(long actionSetHandle, long ulActionHandle); + }; + /** native declaration : headers\openvr_capi.h:2350 */ + public interface ShowBindingsForActionSet_callback extends Callback { + int apply(VRActiveActionSet_t pSets, int unSizeOfVRSelectedActionSet_t, int unSetCount, long originToHighlight); + }; + public VR_IVRInput_FnTable() { + super(); + } + protected List getFieldOrder() { + return Arrays.asList("SetActionManifestPath", "GetActionSetHandle", "GetActionHandle", "GetInputSourceHandle", "UpdateActionState", "GetDigitalActionData", "GetAnalogActionData", "GetPoseActionData", "GetSkeletalActionData", "GetSkeletalBoneData", "GetSkeletalBoneDataCompressed", "DecompressSkeletalBoneData", "TriggerHapticVibrationAction", "GetActionOrigins", "GetOriginLocalizedName", "GetOriginTrackedDeviceInfo", "ShowActionOrigins", "ShowBindingsForActionSet"); + } + public VR_IVRInput_FnTable(Pointer peer) { + super(peer); + } + public static class ByReference extends VR_IVRInput_FnTable implements Structure.ByReference { + + }; + public static class ByValue extends VR_IVRInput_FnTable implements Structure.ByValue { + + }; +} diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRNotifications_FnTable.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRNotifications_FnTable.java index d04b40327..5456f6f08 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRNotifications_FnTable.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRNotifications_FnTable.java @@ -6,7 +6,7 @@ import com.sun.jna.ptr.IntByReference; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:1823
    + * native declaration : headers\openvr_capi.h:2257
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. @@ -16,11 +16,11 @@ public class VR_IVRNotifications_FnTable extends Structure { public VR_IVRNotifications_FnTable.CreateNotification_callback CreateNotification; /** C type : RemoveNotification_callback* */ public VR_IVRNotifications_FnTable.RemoveNotification_callback RemoveNotification; - /** native declaration : headers\openvr_capi.h:1821 */ + /** native declaration : headers\openvr_capi.h:2255 */ public interface CreateNotification_callback extends Callback { int apply(long ulOverlayHandle, long ulUserValue, int type, Pointer pchText, int style, NotificationBitmap_t pImage, IntByReference pNotificationId); }; - /** native declaration : headers\openvr_capi.h:1822 */ + /** native declaration : headers\openvr_capi.h:2256 */ public interface RemoveNotification_callback extends Callback { int apply(int notificationId); }; diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVROverlay_FnTable.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVROverlay_FnTable.java index f7fe2d13d..7dc6a2d40 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVROverlay_FnTable.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVROverlay_FnTable.java @@ -9,7 +9,7 @@ import com.sun.jna.ptr.PointerByReference; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:1779
    + * native declaration : headers\openvr_capi.h:2211
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. @@ -29,6 +29,8 @@ public class VR_IVROverlay_FnTable extends Structure { public VR_IVROverlay_FnTable.GetOverlayKey_callback GetOverlayKey; /** C type : GetOverlayName_callback* */ public VR_IVROverlay_FnTable.GetOverlayName_callback GetOverlayName; + /** C type : SetOverlayName_callback* */ + public VR_IVROverlay_FnTable.SetOverlayName_callback SetOverlayName; /** C type : GetOverlayImageData_callback* */ public VR_IVROverlay_FnTable.GetOverlayImageData_callback GetOverlayImageData; /** C type : GetOverlayErrorNameFromEnum_callback* */ @@ -73,6 +75,10 @@ public class VR_IVROverlay_FnTable extends Structure { public VR_IVROverlay_FnTable.SetOverlayTextureBounds_callback SetOverlayTextureBounds; /** C type : GetOverlayTextureBounds_callback* */ public VR_IVROverlay_FnTable.GetOverlayTextureBounds_callback GetOverlayTextureBounds; + /** C type : GetOverlayRenderModel_callback* */ + public VR_IVROverlay_FnTable.GetOverlayRenderModel_callback GetOverlayRenderModel; + /** C type : SetOverlayRenderModel_callback* */ + public VR_IVROverlay_FnTable.SetOverlayRenderModel_callback SetOverlayRenderModel; /** C type : GetOverlayTransformType_callback* */ public VR_IVROverlay_FnTable.GetOverlayTransformType_callback GetOverlayTransformType; /** C type : SetOverlayTransformAbsolute_callback* */ @@ -87,6 +93,10 @@ public class VR_IVROverlay_FnTable extends Structure { public VR_IVROverlay_FnTable.SetOverlayTransformTrackedDeviceComponent_callback SetOverlayTransformTrackedDeviceComponent; /** C type : GetOverlayTransformTrackedDeviceComponent_callback* */ public VR_IVROverlay_FnTable.GetOverlayTransformTrackedDeviceComponent_callback GetOverlayTransformTrackedDeviceComponent; + /** C type : GetOverlayTransformOverlayRelative_callback* */ + public VR_IVROverlay_FnTable.GetOverlayTransformOverlayRelative_callback GetOverlayTransformOverlayRelative; + /** C type : SetOverlayTransformOverlayRelative_callback* */ + public VR_IVROverlay_FnTable.SetOverlayTransformOverlayRelative_callback SetOverlayTransformOverlayRelative; /** C type : ShowOverlay_callback* */ public VR_IVROverlay_FnTable.ShowOverlay_callback ShowOverlay; /** C type : HideOverlay_callback* */ @@ -107,8 +117,6 @@ public class VR_IVROverlay_FnTable extends Structure { public VR_IVROverlay_FnTable.SetOverlayMouseScale_callback SetOverlayMouseScale; /** C type : ComputeOverlayIntersection_callback* */ public VR_IVROverlay_FnTable.ComputeOverlayIntersection_callback ComputeOverlayIntersection; - /** C type : HandleControllerOverlayInteractionAsMouse_callback* */ - public VR_IVROverlay_FnTable.HandleControllerOverlayInteractionAsMouse_callback HandleControllerOverlayInteractionAsMouse; /** C type : IsHoverTargetOverlay_callback* */ public VR_IVROverlay_FnTable.IsHoverTargetOverlay_callback IsHoverTargetOverlay; /** C type : GetGamepadFocusOverlay_callback* */ @@ -119,6 +127,10 @@ public class VR_IVROverlay_FnTable extends Structure { public VR_IVROverlay_FnTable.SetOverlayNeighbor_callback SetOverlayNeighbor; /** C type : MoveGamepadFocusToNeighbor_callback* */ public VR_IVROverlay_FnTable.MoveGamepadFocusToNeighbor_callback MoveGamepadFocusToNeighbor; + /** C type : SetOverlayDualAnalogTransform_callback* */ + public VR_IVROverlay_FnTable.SetOverlayDualAnalogTransform_callback SetOverlayDualAnalogTransform; + /** C type : GetOverlayDualAnalogTransform_callback* */ + public VR_IVROverlay_FnTable.GetOverlayDualAnalogTransform_callback GetOverlayDualAnalogTransform; /** C type : SetOverlayTexture_callback* */ public VR_IVROverlay_FnTable.SetOverlayTexture_callback SetOverlayTexture; /** C type : ClearOverlayTexture_callback* */ @@ -165,311 +177,341 @@ public class VR_IVROverlay_FnTable extends Structure { public VR_IVROverlay_FnTable.GetOverlayFlags_callback GetOverlayFlags; /** C type : ShowMessageOverlay_callback* */ public VR_IVROverlay_FnTable.ShowMessageOverlay_callback ShowMessageOverlay; - /** native declaration : headers\openvr_capi.h:1704 */ + /** C type : CloseMessageOverlay_callback* */ + public VR_IVROverlay_FnTable.CloseMessageOverlay_callback CloseMessageOverlay; + /** native declaration : headers\openvr_capi.h:2129 */ public interface FindOverlay_callback extends Callback { int apply(Pointer pchOverlayKey, LongByReference pOverlayHandle); }; - /** native declaration : headers\openvr_capi.h:1705 */ + /** native declaration : headers\openvr_capi.h:2130 */ public interface CreateOverlay_callback extends Callback { - int apply(Pointer pchOverlayKey, Pointer pchOverlayFriendlyName, LongByReference pOverlayHandle); + int apply(Pointer pchOverlayKey, Pointer pchOverlayName, LongByReference pOverlayHandle); }; - /** native declaration : headers\openvr_capi.h:1706 */ + /** native declaration : headers\openvr_capi.h:2131 */ public interface DestroyOverlay_callback extends Callback { int apply(long ulOverlayHandle); }; - /** native declaration : headers\openvr_capi.h:1707 */ + /** native declaration : headers\openvr_capi.h:2132 */ public interface SetHighQualityOverlay_callback extends Callback { int apply(long ulOverlayHandle); }; - /** native declaration : headers\openvr_capi.h:1708 */ + /** native declaration : headers\openvr_capi.h:2133 */ public interface GetHighQualityOverlay_callback extends Callback { long apply(); }; - /** native declaration : headers\openvr_capi.h:1709 */ + /** native declaration : headers\openvr_capi.h:2134 */ public interface GetOverlayKey_callback extends Callback { int apply(long ulOverlayHandle, Pointer pchValue, int unBufferSize, IntByReference pError); }; - /** native declaration : headers\openvr_capi.h:1710 */ + /** native declaration : headers\openvr_capi.h:2135 */ public interface GetOverlayName_callback extends Callback { int apply(long ulOverlayHandle, Pointer pchValue, int unBufferSize, IntByReference pError); }; - /** native declaration : headers\openvr_capi.h:1711 */ + /** native declaration : headers\openvr_capi.h:2136 */ + public interface SetOverlayName_callback extends Callback { + int apply(long ulOverlayHandle, Pointer pchName); + }; + /** native declaration : headers\openvr_capi.h:2137 */ public interface GetOverlayImageData_callback extends Callback { int apply(long ulOverlayHandle, Pointer pvBuffer, int unBufferSize, IntByReference punWidth, IntByReference punHeight); }; - /** native declaration : headers\openvr_capi.h:1712 */ + /** native declaration : headers\openvr_capi.h:2138 */ public interface GetOverlayErrorNameFromEnum_callback extends Callback { Pointer apply(int error); }; - /** native declaration : headers\openvr_capi.h:1713 */ + /** native declaration : headers\openvr_capi.h:2139 */ public interface SetOverlayRenderingPid_callback extends Callback { int apply(long ulOverlayHandle, int unPID); }; - /** native declaration : headers\openvr_capi.h:1714 */ + /** native declaration : headers\openvr_capi.h:2140 */ public interface GetOverlayRenderingPid_callback extends Callback { int apply(long ulOverlayHandle); }; - /** native declaration : headers\openvr_capi.h:1715 */ + /** native declaration : headers\openvr_capi.h:2141 */ public interface SetOverlayFlag_callback extends Callback { int apply(long ulOverlayHandle, int eOverlayFlag, byte bEnabled); }; - /** native declaration : headers\openvr_capi.h:1716 */ + /** native declaration : headers\openvr_capi.h:2142 */ public interface GetOverlayFlag_callback extends Callback { int apply(long ulOverlayHandle, int eOverlayFlag, Pointer pbEnabled); }; - /** native declaration : headers\openvr_capi.h:1717 */ + /** native declaration : headers\openvr_capi.h:2143 */ public interface SetOverlayColor_callback extends Callback { int apply(long ulOverlayHandle, float fRed, float fGreen, float fBlue); }; - /** native declaration : headers\openvr_capi.h:1718 */ + /** native declaration : headers\openvr_capi.h:2144 */ public interface GetOverlayColor_callback extends Callback { int apply(long ulOverlayHandle, FloatByReference pfRed, FloatByReference pfGreen, FloatByReference pfBlue); }; - /** native declaration : headers\openvr_capi.h:1719 */ + /** native declaration : headers\openvr_capi.h:2145 */ public interface SetOverlayAlpha_callback extends Callback { int apply(long ulOverlayHandle, float fAlpha); }; - /** native declaration : headers\openvr_capi.h:1720 */ + /** native declaration : headers\openvr_capi.h:2146 */ public interface GetOverlayAlpha_callback extends Callback { int apply(long ulOverlayHandle, FloatByReference pfAlpha); }; - /** native declaration : headers\openvr_capi.h:1721 */ + /** native declaration : headers\openvr_capi.h:2147 */ public interface SetOverlayTexelAspect_callback extends Callback { int apply(long ulOverlayHandle, float fTexelAspect); }; - /** native declaration : headers\openvr_capi.h:1722 */ + /** native declaration : headers\openvr_capi.h:2148 */ public interface GetOverlayTexelAspect_callback extends Callback { int apply(long ulOverlayHandle, FloatByReference pfTexelAspect); }; - /** native declaration : headers\openvr_capi.h:1723 */ + /** native declaration : headers\openvr_capi.h:2149 */ public interface SetOverlaySortOrder_callback extends Callback { int apply(long ulOverlayHandle, int unSortOrder); }; - /** native declaration : headers\openvr_capi.h:1724 */ + /** native declaration : headers\openvr_capi.h:2150 */ public interface GetOverlaySortOrder_callback extends Callback { int apply(long ulOverlayHandle, IntByReference punSortOrder); }; - /** native declaration : headers\openvr_capi.h:1725 */ + /** native declaration : headers\openvr_capi.h:2151 */ public interface SetOverlayWidthInMeters_callback extends Callback { int apply(long ulOverlayHandle, float fWidthInMeters); }; - /** native declaration : headers\openvr_capi.h:1726 */ + /** native declaration : headers\openvr_capi.h:2152 */ public interface GetOverlayWidthInMeters_callback extends Callback { int apply(long ulOverlayHandle, FloatByReference pfWidthInMeters); }; - /** native declaration : headers\openvr_capi.h:1727 */ + /** native declaration : headers\openvr_capi.h:2153 */ public interface SetOverlayAutoCurveDistanceRangeInMeters_callback extends Callback { int apply(long ulOverlayHandle, float fMinDistanceInMeters, float fMaxDistanceInMeters); }; - /** native declaration : headers\openvr_capi.h:1728 */ + /** native declaration : headers\openvr_capi.h:2154 */ public interface GetOverlayAutoCurveDistanceRangeInMeters_callback extends Callback { int apply(long ulOverlayHandle, FloatByReference pfMinDistanceInMeters, FloatByReference pfMaxDistanceInMeters); }; - /** native declaration : headers\openvr_capi.h:1729 */ + /** native declaration : headers\openvr_capi.h:2155 */ public interface SetOverlayTextureColorSpace_callback extends Callback { int apply(long ulOverlayHandle, int eTextureColorSpace); }; - /** native declaration : headers\openvr_capi.h:1730 */ + /** native declaration : headers\openvr_capi.h:2156 */ public interface GetOverlayTextureColorSpace_callback extends Callback { int apply(long ulOverlayHandle, IntByReference peTextureColorSpace); }; - /** native declaration : headers\openvr_capi.h:1731 */ + /** native declaration : headers\openvr_capi.h:2157 */ public interface SetOverlayTextureBounds_callback extends Callback { int apply(long ulOverlayHandle, VRTextureBounds_t pOverlayTextureBounds); }; - /** native declaration : headers\openvr_capi.h:1732 */ + /** native declaration : headers\openvr_capi.h:2158 */ public interface GetOverlayTextureBounds_callback extends Callback { int apply(long ulOverlayHandle, VRTextureBounds_t pOverlayTextureBounds); }; - /** native declaration : headers\openvr_capi.h:1733 */ + /** native declaration : headers\openvr_capi.h:2159 */ + public interface GetOverlayRenderModel_callback extends Callback { + int apply(long ulOverlayHandle, Pointer pchValue, int unBufferSize, HmdColor_t pColor, IntByReference pError); + }; + /** native declaration : headers\openvr_capi.h:2160 */ + public interface SetOverlayRenderModel_callback extends Callback { + int apply(long ulOverlayHandle, Pointer pchRenderModel, HmdColor_t pColor); + }; + /** native declaration : headers\openvr_capi.h:2161 */ public interface GetOverlayTransformType_callback extends Callback { int apply(long ulOverlayHandle, IntByReference peTransformType); }; - /** native declaration : headers\openvr_capi.h:1734 */ + /** native declaration : headers\openvr_capi.h:2162 */ public interface SetOverlayTransformAbsolute_callback extends Callback { int apply(long ulOverlayHandle, int eTrackingOrigin, HmdMatrix34_t pmatTrackingOriginToOverlayTransform); }; - /** native declaration : headers\openvr_capi.h:1735 */ + /** native declaration : headers\openvr_capi.h:2163 */ public interface GetOverlayTransformAbsolute_callback extends Callback { int apply(long ulOverlayHandle, IntByReference peTrackingOrigin, HmdMatrix34_t pmatTrackingOriginToOverlayTransform); }; - /** native declaration : headers\openvr_capi.h:1736 */ + /** native declaration : headers\openvr_capi.h:2164 */ public interface SetOverlayTransformTrackedDeviceRelative_callback extends Callback { int apply(long ulOverlayHandle, int unTrackedDevice, HmdMatrix34_t pmatTrackedDeviceToOverlayTransform); }; - /** native declaration : headers\openvr_capi.h:1737 */ + /** native declaration : headers\openvr_capi.h:2165 */ public interface GetOverlayTransformTrackedDeviceRelative_callback extends Callback { int apply(long ulOverlayHandle, IntByReference punTrackedDevice, HmdMatrix34_t pmatTrackedDeviceToOverlayTransform); }; - /** native declaration : headers\openvr_capi.h:1738 */ + /** native declaration : headers\openvr_capi.h:2166 */ public interface SetOverlayTransformTrackedDeviceComponent_callback extends Callback { int apply(long ulOverlayHandle, int unDeviceIndex, Pointer pchComponentName); }; - /** native declaration : headers\openvr_capi.h:1739 */ + /** native declaration : headers\openvr_capi.h:2167 */ public interface GetOverlayTransformTrackedDeviceComponent_callback extends Callback { int apply(long ulOverlayHandle, IntByReference punDeviceIndex, Pointer pchComponentName, int unComponentNameSize); }; - /** native declaration : headers\openvr_capi.h:1740 */ + /** native declaration : headers\openvr_capi.h:2168 */ + public interface GetOverlayTransformOverlayRelative_callback extends Callback { + int apply(long ulOverlayHandle, LongByReference ulOverlayHandleParent, HmdMatrix34_t pmatParentOverlayToOverlayTransform); + }; + /** native declaration : headers\openvr_capi.h:2169 */ + public interface SetOverlayTransformOverlayRelative_callback extends Callback { + int apply(long ulOverlayHandle, long ulOverlayHandleParent, HmdMatrix34_t pmatParentOverlayToOverlayTransform); + }; + /** native declaration : headers\openvr_capi.h:2170 */ public interface ShowOverlay_callback extends Callback { int apply(long ulOverlayHandle); }; - /** native declaration : headers\openvr_capi.h:1741 */ + /** native declaration : headers\openvr_capi.h:2171 */ public interface HideOverlay_callback extends Callback { int apply(long ulOverlayHandle); }; - /** native declaration : headers\openvr_capi.h:1742 */ + /** native declaration : headers\openvr_capi.h:2172 */ public interface IsOverlayVisible_callback extends Callback { byte apply(long ulOverlayHandle); }; - /** native declaration : headers\openvr_capi.h:1743 */ + /** native declaration : headers\openvr_capi.h:2173 */ public interface GetTransformForOverlayCoordinates_callback extends Callback { int apply(long ulOverlayHandle, int eTrackingOrigin, HmdVector2_t.ByValue coordinatesInOverlay, HmdMatrix34_t pmatTransform); }; - /** native declaration : headers\openvr_capi.h:1744 */ + /** native declaration : headers\openvr_capi.h:2174 */ public interface PollNextOverlayEvent_callback extends Callback { byte apply(long ulOverlayHandle, VREvent_t pEvent, int uncbVREvent); }; - /** native declaration : headers\openvr_capi.h:1745 */ + /** native declaration : headers\openvr_capi.h:2175 */ public interface GetOverlayInputMethod_callback extends Callback { int apply(long ulOverlayHandle, IntByReference peInputMethod); }; - /** native declaration : headers\openvr_capi.h:1746 */ + /** native declaration : headers\openvr_capi.h:2176 */ public interface SetOverlayInputMethod_callback extends Callback { int apply(long ulOverlayHandle, int eInputMethod); }; - /** native declaration : headers\openvr_capi.h:1747 */ + /** native declaration : headers\openvr_capi.h:2177 */ public interface GetOverlayMouseScale_callback extends Callback { int apply(long ulOverlayHandle, HmdVector2_t pvecMouseScale); }; - /** native declaration : headers\openvr_capi.h:1748 */ + /** native declaration : headers\openvr_capi.h:2178 */ public interface SetOverlayMouseScale_callback extends Callback { int apply(long ulOverlayHandle, HmdVector2_t pvecMouseScale); }; - /** native declaration : headers\openvr_capi.h:1749 */ + /** native declaration : headers\openvr_capi.h:2179 */ public interface ComputeOverlayIntersection_callback extends Callback { byte apply(long ulOverlayHandle, VROverlayIntersectionParams_t pParams, VROverlayIntersectionResults_t pResults); }; - /** native declaration : headers\openvr_capi.h:1750 */ - public interface HandleControllerOverlayInteractionAsMouse_callback extends Callback { - byte apply(long ulOverlayHandle, int unControllerDeviceIndex); - }; - /** native declaration : headers\openvr_capi.h:1751 */ + /** native declaration : headers\openvr_capi.h:2180 */ public interface IsHoverTargetOverlay_callback extends Callback { byte apply(long ulOverlayHandle); }; - /** native declaration : headers\openvr_capi.h:1752 */ + /** native declaration : headers\openvr_capi.h:2181 */ public interface GetGamepadFocusOverlay_callback extends Callback { long apply(); }; - /** native declaration : headers\openvr_capi.h:1753 */ + /** native declaration : headers\openvr_capi.h:2182 */ public interface SetGamepadFocusOverlay_callback extends Callback { int apply(long ulNewFocusOverlay); }; - /** native declaration : headers\openvr_capi.h:1754 */ + /** native declaration : headers\openvr_capi.h:2183 */ public interface SetOverlayNeighbor_callback extends Callback { int apply(int eDirection, long ulFrom, long ulTo); }; - /** native declaration : headers\openvr_capi.h:1755 */ + /** native declaration : headers\openvr_capi.h:2184 */ public interface MoveGamepadFocusToNeighbor_callback extends Callback { int apply(int eDirection, long ulFrom); }; - /** native declaration : headers\openvr_capi.h:1756 */ + /** native declaration : headers\openvr_capi.h:2185 */ + public interface SetOverlayDualAnalogTransform_callback extends Callback { + int apply(long ulOverlay, int eWhich, HmdVector2_t vCenter, float fRadius); + }; + /** native declaration : headers\openvr_capi.h:2186 */ + public interface GetOverlayDualAnalogTransform_callback extends Callback { + int apply(long ulOverlay, int eWhich, HmdVector2_t pvCenter, FloatByReference pfRadius); + }; + /** native declaration : headers\openvr_capi.h:2187 */ public interface SetOverlayTexture_callback extends Callback { int apply(long ulOverlayHandle, Texture_t pTexture); }; - /** native declaration : headers\openvr_capi.h:1757 */ + /** native declaration : headers\openvr_capi.h:2188 */ public interface ClearOverlayTexture_callback extends Callback { int apply(long ulOverlayHandle); }; - /** native declaration : headers\openvr_capi.h:1758 */ + /** native declaration : headers\openvr_capi.h:2189 */ public interface SetOverlayRaw_callback extends Callback { int apply(long ulOverlayHandle, Pointer pvBuffer, int unWidth, int unHeight, int unDepth); }; - /** native declaration : headers\openvr_capi.h:1759 */ + /** native declaration : headers\openvr_capi.h:2190 */ public interface SetOverlayFromFile_callback extends Callback { int apply(long ulOverlayHandle, Pointer pchFilePath); }; - /** native declaration : headers\openvr_capi.h:1760 */ + /** native declaration : headers\openvr_capi.h:2191 */ public interface GetOverlayTexture_callback extends Callback { int apply(long ulOverlayHandle, PointerByReference pNativeTextureHandle, Pointer pNativeTextureRef, IntByReference pWidth, IntByReference pHeight, IntByReference pNativeFormat, IntByReference pAPIType, IntByReference pColorSpace, VRTextureBounds_t pTextureBounds); }; - /** native declaration : headers\openvr_capi.h:1761 */ + /** native declaration : headers\openvr_capi.h:2192 */ public interface ReleaseNativeOverlayHandle_callback extends Callback { int apply(long ulOverlayHandle, Pointer pNativeTextureHandle); }; - /** native declaration : headers\openvr_capi.h:1762 */ + /** native declaration : headers\openvr_capi.h:2193 */ public interface GetOverlayTextureSize_callback extends Callback { int apply(long ulOverlayHandle, IntByReference pWidth, IntByReference pHeight); }; - /** native declaration : headers\openvr_capi.h:1763 */ + /** native declaration : headers\openvr_capi.h:2194 */ public interface CreateDashboardOverlay_callback extends Callback { int apply(Pointer pchOverlayKey, Pointer pchOverlayFriendlyName, LongByReference pMainHandle, LongByReference pThumbnailHandle); }; - /** native declaration : headers\openvr_capi.h:1764 */ + /** native declaration : headers\openvr_capi.h:2195 */ public interface IsDashboardVisible_callback extends Callback { byte apply(); }; - /** native declaration : headers\openvr_capi.h:1765 */ + /** native declaration : headers\openvr_capi.h:2196 */ public interface IsActiveDashboardOverlay_callback extends Callback { byte apply(long ulOverlayHandle); }; - /** native declaration : headers\openvr_capi.h:1766 */ + /** native declaration : headers\openvr_capi.h:2197 */ public interface SetDashboardOverlaySceneProcess_callback extends Callback { int apply(long ulOverlayHandle, int unProcessId); }; - /** native declaration : headers\openvr_capi.h:1767 */ + /** native declaration : headers\openvr_capi.h:2198 */ public interface GetDashboardOverlaySceneProcess_callback extends Callback { int apply(long ulOverlayHandle, IntByReference punProcessId); }; - /** native declaration : headers\openvr_capi.h:1768 */ + /** native declaration : headers\openvr_capi.h:2199 */ public interface ShowDashboard_callback extends Callback { void apply(Pointer pchOverlayToShow); }; - /** native declaration : headers\openvr_capi.h:1769 */ + /** native declaration : headers\openvr_capi.h:2200 */ public interface GetPrimaryDashboardDevice_callback extends Callback { int apply(); }; - /** native declaration : headers\openvr_capi.h:1770 */ + /** native declaration : headers\openvr_capi.h:2201 */ public interface ShowKeyboard_callback extends Callback { int apply(int eInputMode, int eLineInputMode, Pointer pchDescription, int unCharMax, Pointer pchExistingText, byte bUseMinimalMode, long uUserValue); }; - /** native declaration : headers\openvr_capi.h:1771 */ + /** native declaration : headers\openvr_capi.h:2202 */ public interface ShowKeyboardForOverlay_callback extends Callback { int apply(long ulOverlayHandle, int eInputMode, int eLineInputMode, Pointer pchDescription, int unCharMax, Pointer pchExistingText, byte bUseMinimalMode, long uUserValue); }; - /** native declaration : headers\openvr_capi.h:1772 */ + /** native declaration : headers\openvr_capi.h:2203 */ public interface GetKeyboardText_callback extends Callback { int apply(Pointer pchText, int cchText); }; - /** native declaration : headers\openvr_capi.h:1773 */ + /** native declaration : headers\openvr_capi.h:2204 */ public interface HideKeyboard_callback extends Callback { void apply(); }; - /** native declaration : headers\openvr_capi.h:1774 */ + /** native declaration : headers\openvr_capi.h:2205 */ public interface SetKeyboardTransformAbsolute_callback extends Callback { void apply(int eTrackingOrigin, HmdMatrix34_t pmatTrackingOriginToKeyboardTransform); }; - /** native declaration : headers\openvr_capi.h:1775 */ + /** native declaration : headers\openvr_capi.h:2206 */ public interface SetKeyboardPositionForOverlay_callback extends Callback { void apply(long ulOverlayHandle, com.jme3.system.jopenvr.HmdRect2_t.ByValue avoidRect); }; - /** native declaration : headers\openvr_capi.h:1776 */ + /** native declaration : headers\openvr_capi.h:2207 */ public interface SetOverlayIntersectionMask_callback extends Callback { int apply(long ulOverlayHandle, VROverlayIntersectionMaskPrimitive_t pMaskPrimitives, int unNumMaskPrimitives, int unPrimitiveSize); }; - /** native declaration : headers\openvr_capi.h:1777 */ + /** native declaration : headers\openvr_capi.h:2208 */ public interface GetOverlayFlags_callback extends Callback { int apply(long ulOverlayHandle, IntByReference pFlags); }; - /** native declaration : headers\openvr_capi.h:1778 */ + /** native declaration : headers\openvr_capi.h:2209 */ public interface ShowMessageOverlay_callback extends Callback { int apply(Pointer pchText, Pointer pchCaption, Pointer pchButton0Text, Pointer pchButton1Text, Pointer pchButton2Text, Pointer pchButton3Text); }; + /** native declaration : headers\openvr_capi.h:2210 */ + public interface CloseMessageOverlay_callback extends Callback { + void apply(); + }; public VR_IVROverlay_FnTable() { super(); } protected List getFieldOrder() { - return Arrays.asList("FindOverlay", "CreateOverlay", "DestroyOverlay", "SetHighQualityOverlay", "GetHighQualityOverlay", "GetOverlayKey", "GetOverlayName", "GetOverlayImageData", "GetOverlayErrorNameFromEnum", "SetOverlayRenderingPid", "GetOverlayRenderingPid", "SetOverlayFlag", "GetOverlayFlag", "SetOverlayColor", "GetOverlayColor", "SetOverlayAlpha", "GetOverlayAlpha", "SetOverlayTexelAspect", "GetOverlayTexelAspect", "SetOverlaySortOrder", "GetOverlaySortOrder", "SetOverlayWidthInMeters", "GetOverlayWidthInMeters", "SetOverlayAutoCurveDistanceRangeInMeters", "GetOverlayAutoCurveDistanceRangeInMeters", "SetOverlayTextureColorSpace", "GetOverlayTextureColorSpace", "SetOverlayTextureBounds", "GetOverlayTextureBounds", "GetOverlayTransformType", "SetOverlayTransformAbsolute", "GetOverlayTransformAbsolute", "SetOverlayTransformTrackedDeviceRelative", "GetOverlayTransformTrackedDeviceRelative", "SetOverlayTransformTrackedDeviceComponent", "GetOverlayTransformTrackedDeviceComponent", "ShowOverlay", "HideOverlay", "IsOverlayVisible", "GetTransformForOverlayCoordinates", "PollNextOverlayEvent", "GetOverlayInputMethod", "SetOverlayInputMethod", "GetOverlayMouseScale", "SetOverlayMouseScale", "ComputeOverlayIntersection", "HandleControllerOverlayInteractionAsMouse", "IsHoverTargetOverlay", "GetGamepadFocusOverlay", "SetGamepadFocusOverlay", "SetOverlayNeighbor", "MoveGamepadFocusToNeighbor", "SetOverlayTexture", "ClearOverlayTexture", "SetOverlayRaw", "SetOverlayFromFile", "GetOverlayTexture", "ReleaseNativeOverlayHandle", "GetOverlayTextureSize", "CreateDashboardOverlay", "IsDashboardVisible", "IsActiveDashboardOverlay", "SetDashboardOverlaySceneProcess", "GetDashboardOverlaySceneProcess", "ShowDashboard", "GetPrimaryDashboardDevice", "ShowKeyboard", "ShowKeyboardForOverlay", "GetKeyboardText", "HideKeyboard", "SetKeyboardTransformAbsolute", "SetKeyboardPositionForOverlay", "SetOverlayIntersectionMask", "GetOverlayFlags", "ShowMessageOverlay"); + return Arrays.asList("FindOverlay", "CreateOverlay", "DestroyOverlay", "SetHighQualityOverlay", "GetHighQualityOverlay", "GetOverlayKey", "GetOverlayName", "SetOverlayName", "GetOverlayImageData", "GetOverlayErrorNameFromEnum", "SetOverlayRenderingPid", "GetOverlayRenderingPid", "SetOverlayFlag", "GetOverlayFlag", "SetOverlayColor", "GetOverlayColor", "SetOverlayAlpha", "GetOverlayAlpha", "SetOverlayTexelAspect", "GetOverlayTexelAspect", "SetOverlaySortOrder", "GetOverlaySortOrder", "SetOverlayWidthInMeters", "GetOverlayWidthInMeters", "SetOverlayAutoCurveDistanceRangeInMeters", "GetOverlayAutoCurveDistanceRangeInMeters", "SetOverlayTextureColorSpace", "GetOverlayTextureColorSpace", "SetOverlayTextureBounds", "GetOverlayTextureBounds", "GetOverlayRenderModel", "SetOverlayRenderModel", "GetOverlayTransformType", "SetOverlayTransformAbsolute", "GetOverlayTransformAbsolute", "SetOverlayTransformTrackedDeviceRelative", "GetOverlayTransformTrackedDeviceRelative", "SetOverlayTransformTrackedDeviceComponent", "GetOverlayTransformTrackedDeviceComponent", "GetOverlayTransformOverlayRelative", "SetOverlayTransformOverlayRelative", "ShowOverlay", "HideOverlay", "IsOverlayVisible", "GetTransformForOverlayCoordinates", "PollNextOverlayEvent", "GetOverlayInputMethod", "SetOverlayInputMethod", "GetOverlayMouseScale", "SetOverlayMouseScale", "ComputeOverlayIntersection", "IsHoverTargetOverlay", "GetGamepadFocusOverlay", "SetGamepadFocusOverlay", "SetOverlayNeighbor", "MoveGamepadFocusToNeighbor", "SetOverlayDualAnalogTransform", "GetOverlayDualAnalogTransform", "SetOverlayTexture", "ClearOverlayTexture", "SetOverlayRaw", "SetOverlayFromFile", "GetOverlayTexture", "ReleaseNativeOverlayHandle", "GetOverlayTextureSize", "CreateDashboardOverlay", "IsDashboardVisible", "IsActiveDashboardOverlay", "SetDashboardOverlaySceneProcess", "GetDashboardOverlaySceneProcess", "ShowDashboard", "GetPrimaryDashboardDevice", "ShowKeyboard", "ShowKeyboardForOverlay", "GetKeyboardText", "HideKeyboard", "SetKeyboardTransformAbsolute", "SetKeyboardPositionForOverlay", "SetOverlayIntersectionMask", "GetOverlayFlags", "ShowMessageOverlay", "CloseMessageOverlay"); } public VR_IVROverlay_FnTable(Pointer peer) { super(peer); diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRRenderModels_FnTable.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRRenderModels_FnTable.java index 808fc0d55..a025a415e 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRRenderModels_FnTable.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRRenderModels_FnTable.java @@ -7,7 +7,7 @@ import com.sun.jna.ptr.PointerByReference; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:1817
    + * native declaration : headers\openvr_capi.h:2251
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. @@ -39,6 +39,8 @@ public class VR_IVRRenderModels_FnTable extends Structure { public VR_IVRRenderModels_FnTable.GetComponentButtonMask_callback GetComponentButtonMask; /** C type : GetComponentRenderModelName_callback* */ public VR_IVRRenderModels_FnTable.GetComponentRenderModelName_callback GetComponentRenderModelName; + /** C type : GetComponentStateForDevicePath_callback* */ + public VR_IVRRenderModels_FnTable.GetComponentStateForDevicePath_callback GetComponentStateForDevicePath; /** C type : GetComponentState_callback* */ public VR_IVRRenderModels_FnTable.GetComponentState_callback GetComponentState; /** C type : RenderModelHasComponent_callback* */ @@ -49,75 +51,79 @@ public class VR_IVRRenderModels_FnTable extends Structure { public VR_IVRRenderModels_FnTable.GetRenderModelOriginalPath_callback GetRenderModelOriginalPath; /** C type : GetRenderModelErrorNameFromEnum_callback* */ public VR_IVRRenderModels_FnTable.GetRenderModelErrorNameFromEnum_callback GetRenderModelErrorNameFromEnum; - /** native declaration : headers\openvr_capi.h:1799 */ + /** native declaration : headers\openvr_capi.h:2232 */ public interface LoadRenderModel_Async_callback extends Callback { int apply(Pointer pchRenderModelName, PointerByReference ppRenderModel); }; - /** native declaration : headers\openvr_capi.h:1800 */ + /** native declaration : headers\openvr_capi.h:2233 */ public interface FreeRenderModel_callback extends Callback { void apply(RenderModel_t pRenderModel); }; - /** native declaration : headers\openvr_capi.h:1801 */ + /** native declaration : headers\openvr_capi.h:2234 */ public interface LoadTexture_Async_callback extends Callback { int apply(int textureId, PointerByReference ppTexture); }; - /** native declaration : headers\openvr_capi.h:1802 */ + /** native declaration : headers\openvr_capi.h:2235 */ public interface FreeTexture_callback extends Callback { void apply(RenderModel_TextureMap_t pTexture); }; - /** native declaration : headers\openvr_capi.h:1803 */ + /** native declaration : headers\openvr_capi.h:2236 */ public interface LoadTextureD3D11_Async_callback extends Callback { int apply(int textureId, Pointer pD3D11Device, PointerByReference ppD3D11Texture2D); }; - /** native declaration : headers\openvr_capi.h:1804 */ + /** native declaration : headers\openvr_capi.h:2237 */ public interface LoadIntoTextureD3D11_Async_callback extends Callback { int apply(int textureId, Pointer pDstTexture); }; - /** native declaration : headers\openvr_capi.h:1805 */ + /** native declaration : headers\openvr_capi.h:2238 */ public interface FreeTextureD3D11_callback extends Callback { void apply(Pointer pD3D11Texture2D); }; - /** native declaration : headers\openvr_capi.h:1806 */ + /** native declaration : headers\openvr_capi.h:2239 */ public interface GetRenderModelName_callback extends Callback { int apply(int unRenderModelIndex, Pointer pchRenderModelName, int unRenderModelNameLen); }; - /** native declaration : headers\openvr_capi.h:1807 */ + /** native declaration : headers\openvr_capi.h:2240 */ public interface GetRenderModelCount_callback extends Callback { int apply(); }; - /** native declaration : headers\openvr_capi.h:1808 */ + /** native declaration : headers\openvr_capi.h:2241 */ public interface GetComponentCount_callback extends Callback { int apply(Pointer pchRenderModelName); }; - /** native declaration : headers\openvr_capi.h:1809 */ + /** native declaration : headers\openvr_capi.h:2242 */ public interface GetComponentName_callback extends Callback { int apply(Pointer pchRenderModelName, int unComponentIndex, Pointer pchComponentName, int unComponentNameLen); }; - /** native declaration : headers\openvr_capi.h:1810 */ + /** native declaration : headers\openvr_capi.h:2243 */ public interface GetComponentButtonMask_callback extends Callback { long apply(Pointer pchRenderModelName, Pointer pchComponentName); }; - /** native declaration : headers\openvr_capi.h:1811 */ + /** native declaration : headers\openvr_capi.h:2244 */ public interface GetComponentRenderModelName_callback extends Callback { int apply(Pointer pchRenderModelName, Pointer pchComponentName, Pointer pchComponentRenderModelName, int unComponentRenderModelNameLen); }; - /** native declaration : headers\openvr_capi.h:1812 */ + /** native declaration : headers\openvr_capi.h:2245 */ + public interface GetComponentStateForDevicePath_callback extends Callback { + byte apply(Pointer pchRenderModelName, Pointer pchComponentName, long devicePath, RenderModel_ControllerMode_State_t pState, RenderModel_ComponentState_t pComponentState); + }; + /** native declaration : headers\openvr_capi.h:2246 */ public interface GetComponentState_callback extends Callback { byte apply(Pointer pchRenderModelName, Pointer pchComponentName, VRControllerState_t pControllerState, RenderModel_ControllerMode_State_t pState, RenderModel_ComponentState_t pComponentState); }; - /** native declaration : headers\openvr_capi.h:1813 */ + /** native declaration : headers\openvr_capi.h:2247 */ public interface RenderModelHasComponent_callback extends Callback { byte apply(Pointer pchRenderModelName, Pointer pchComponentName); }; - /** native declaration : headers\openvr_capi.h:1814 */ + /** native declaration : headers\openvr_capi.h:2248 */ public interface GetRenderModelThumbnailURL_callback extends Callback { int apply(Pointer pchRenderModelName, Pointer pchThumbnailURL, int unThumbnailURLLen, IntByReference peError); }; - /** native declaration : headers\openvr_capi.h:1815 */ + /** native declaration : headers\openvr_capi.h:2249 */ public interface GetRenderModelOriginalPath_callback extends Callback { int apply(Pointer pchRenderModelName, Pointer pchOriginalPath, int unOriginalPathLen, IntByReference peError); }; - /** native declaration : headers\openvr_capi.h:1816 */ + /** native declaration : headers\openvr_capi.h:2250 */ public interface GetRenderModelErrorNameFromEnum_callback extends Callback { Pointer apply(int error); }; @@ -125,7 +131,7 @@ public class VR_IVRRenderModels_FnTable extends Structure { super(); } protected List getFieldOrder() { - return Arrays.asList("LoadRenderModel_Async", "FreeRenderModel", "LoadTexture_Async", "FreeTexture", "LoadTextureD3D11_Async", "LoadIntoTextureD3D11_Async", "FreeTextureD3D11", "GetRenderModelName", "GetRenderModelCount", "GetComponentCount", "GetComponentName", "GetComponentButtonMask", "GetComponentRenderModelName", "GetComponentState", "RenderModelHasComponent", "GetRenderModelThumbnailURL", "GetRenderModelOriginalPath", "GetRenderModelErrorNameFromEnum"); + return Arrays.asList("LoadRenderModel_Async", "FreeRenderModel", "LoadTexture_Async", "FreeTexture", "LoadTextureD3D11_Async", "LoadIntoTextureD3D11_Async", "FreeTextureD3D11", "GetRenderModelName", "GetRenderModelCount", "GetComponentCount", "GetComponentName", "GetComponentButtonMask", "GetComponentRenderModelName", "GetComponentStateForDevicePath", "GetComponentState", "RenderModelHasComponent", "GetRenderModelThumbnailURL", "GetRenderModelOriginalPath", "GetRenderModelErrorNameFromEnum"); } public VR_IVRRenderModels_FnTable(Pointer peer) { super(peer); diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRResources_FnTable.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRResources_FnTable.java index 468123388..889feb982 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRResources_FnTable.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRResources_FnTable.java @@ -5,7 +5,7 @@ import com.sun.jna.Structure; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:1871
    + * native declaration : headers\openvr_capi.h:2305
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. @@ -15,11 +15,11 @@ public class VR_IVRResources_FnTable extends Structure { public VR_IVRResources_FnTable.LoadSharedResource_callback LoadSharedResource; /** C type : GetResourceFullPath_callback* */ public VR_IVRResources_FnTable.GetResourceFullPath_callback GetResourceFullPath; - /** native declaration : headers\openvr_capi.h:1869 */ + /** native declaration : headers\openvr_capi.h:2303 */ public interface LoadSharedResource_callback extends Callback { int apply(Pointer pchResourceName, Pointer pchBuffer, int unBufferLen); }; - /** native declaration : headers\openvr_capi.h:1870 */ + /** native declaration : headers\openvr_capi.h:2304 */ public interface GetResourceFullPath_callback extends Callback { int apply(Pointer pchResourceName, Pointer pchResourceTypeDirectory, Pointer pchPathBuffer, int unBufferLen); }; diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRScreenshots_FnTable.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRScreenshots_FnTable.java index c568a74c6..888c3ce2d 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRScreenshots_FnTable.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRScreenshots_FnTable.java @@ -6,7 +6,7 @@ import com.sun.jna.ptr.IntByReference; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:1865
    + * native declaration : headers\openvr_capi.h:2299
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. @@ -26,31 +26,31 @@ public class VR_IVRScreenshots_FnTable extends Structure { public VR_IVRScreenshots_FnTable.TakeStereoScreenshot_callback TakeStereoScreenshot; /** C type : SubmitScreenshot_callback* */ public VR_IVRScreenshots_FnTable.SubmitScreenshot_callback SubmitScreenshot; - /** native declaration : headers\openvr_capi.h:1858 */ + /** native declaration : headers\openvr_capi.h:2292 */ public interface RequestScreenshot_callback extends Callback { int apply(IntByReference pOutScreenshotHandle, int type, Pointer pchPreviewFilename, Pointer pchVRFilename); }; - /** native declaration : headers\openvr_capi.h:1859 */ + /** native declaration : headers\openvr_capi.h:2293 */ public interface HookScreenshot_callback extends Callback { int apply(IntByReference pSupportedTypes, int numTypes); }; - /** native declaration : headers\openvr_capi.h:1860 */ + /** native declaration : headers\openvr_capi.h:2294 */ public interface GetScreenshotPropertyType_callback extends Callback { int apply(int screenshotHandle, IntByReference pError); }; - /** native declaration : headers\openvr_capi.h:1861 */ + /** native declaration : headers\openvr_capi.h:2295 */ public interface GetScreenshotPropertyFilename_callback extends Callback { int apply(int screenshotHandle, int filenameType, Pointer pchFilename, int cchFilename, IntByReference pError); }; - /** native declaration : headers\openvr_capi.h:1862 */ + /** native declaration : headers\openvr_capi.h:2296 */ public interface UpdateScreenshotProgress_callback extends Callback { int apply(int screenshotHandle, float flProgress); }; - /** native declaration : headers\openvr_capi.h:1863 */ + /** native declaration : headers\openvr_capi.h:2297 */ public interface TakeStereoScreenshot_callback extends Callback { int apply(IntByReference pOutScreenshotHandle, Pointer pchPreviewFilename, Pointer pchVRFilename); }; - /** native declaration : headers\openvr_capi.h:1864 */ + /** native declaration : headers\openvr_capi.h:2298 */ public interface SubmitScreenshot_callback extends Callback { int apply(int screenshotHandle, int type, Pointer pchSourcePreviewFilename, Pointer pchSourceVRFilename); }; diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRSettings_FnTable.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRSettings_FnTable.java index 3f27c11c2..a3704ec53 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRSettings_FnTable.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRSettings_FnTable.java @@ -6,7 +6,7 @@ import com.sun.jna.ptr.IntByReference; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:1849
    + * native declaration : headers\openvr_capi.h:2283
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. @@ -36,51 +36,51 @@ public class VR_IVRSettings_FnTable extends Structure { public VR_IVRSettings_FnTable.RemoveSection_callback RemoveSection; /** C type : RemoveKeyInSection_callback* */ public VR_IVRSettings_FnTable.RemoveKeyInSection_callback RemoveKeyInSection; - /** native declaration : headers\openvr_capi.h:1837 */ + /** native declaration : headers\openvr_capi.h:2271 */ public interface GetSettingsErrorNameFromEnum_callback extends Callback { Pointer apply(int eError); }; - /** native declaration : headers\openvr_capi.h:1838 */ + /** native declaration : headers\openvr_capi.h:2272 */ public interface Sync_callback extends Callback { byte apply(byte bForce, IntByReference peError); }; - /** native declaration : headers\openvr_capi.h:1839 */ + /** native declaration : headers\openvr_capi.h:2273 */ public interface SetBool_callback extends Callback { void apply(Pointer pchSection, Pointer pchSettingsKey, byte bValue, IntByReference peError); }; - /** native declaration : headers\openvr_capi.h:1840 */ + /** native declaration : headers\openvr_capi.h:2274 */ public interface SetInt32_callback extends Callback { void apply(Pointer pchSection, Pointer pchSettingsKey, int nValue, IntByReference peError); }; - /** native declaration : headers\openvr_capi.h:1841 */ + /** native declaration : headers\openvr_capi.h:2275 */ public interface SetFloat_callback extends Callback { void apply(Pointer pchSection, Pointer pchSettingsKey, float flValue, IntByReference peError); }; - /** native declaration : headers\openvr_capi.h:1842 */ + /** native declaration : headers\openvr_capi.h:2276 */ public interface SetString_callback extends Callback { void apply(Pointer pchSection, Pointer pchSettingsKey, Pointer pchValue, IntByReference peError); }; - /** native declaration : headers\openvr_capi.h:1843 */ + /** native declaration : headers\openvr_capi.h:2277 */ public interface GetBool_callback extends Callback { byte apply(Pointer pchSection, Pointer pchSettingsKey, IntByReference peError); }; - /** native declaration : headers\openvr_capi.h:1844 */ + /** native declaration : headers\openvr_capi.h:2278 */ public interface GetInt32_callback extends Callback { int apply(Pointer pchSection, Pointer pchSettingsKey, IntByReference peError); }; - /** native declaration : headers\openvr_capi.h:1845 */ + /** native declaration : headers\openvr_capi.h:2279 */ public interface GetFloat_callback extends Callback { float apply(Pointer pchSection, Pointer pchSettingsKey, IntByReference peError); }; - /** native declaration : headers\openvr_capi.h:1846 */ + /** native declaration : headers\openvr_capi.h:2280 */ public interface GetString_callback extends Callback { void apply(Pointer pchSection, Pointer pchSettingsKey, Pointer pchValue, int unValueLen, IntByReference peError); }; - /** native declaration : headers\openvr_capi.h:1847 */ + /** native declaration : headers\openvr_capi.h:2281 */ public interface RemoveSection_callback extends Callback { void apply(Pointer pchSection, IntByReference peError); }; - /** native declaration : headers\openvr_capi.h:1848 */ + /** native declaration : headers\openvr_capi.h:2282 */ public interface RemoveKeyInSection_callback extends Callback { void apply(Pointer pchSection, Pointer pchSettingsKey, IntByReference peError); }; diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRSpatialAnchors_FnTable.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRSpatialAnchors_FnTable.java new file mode 100644 index 000000000..17d789269 --- /dev/null +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRSpatialAnchors_FnTable.java @@ -0,0 +1,67 @@ +package com.jme3.system.jopenvr; +import com.sun.jna.Callback; +import com.sun.jna.Pointer; +import com.sun.jna.Structure; +import com.sun.jna.ptr.IntByReference; +import java.util.Arrays; +import java.util.List; +/** + * native declaration : headers\openvr_capi.h:2373
    + * This file was autogenerated by JNAerator,
    + * a tool written by Olivier Chafik that uses a few opensource projects..
    + * For help, please visit NativeLibs4Java , Rococoa, or JNA. + */ +public class VR_IVRSpatialAnchors_FnTable extends Structure { + /** C type : CreateSpatialAnchorFromDescriptor_callback* */ + public VR_IVRSpatialAnchors_FnTable.CreateSpatialAnchorFromDescriptor_callback CreateSpatialAnchorFromDescriptor; + /** C type : CreateSpatialAnchorFromPose_callback* */ + public VR_IVRSpatialAnchors_FnTable.CreateSpatialAnchorFromPose_callback CreateSpatialAnchorFromPose; + /** C type : GetSpatialAnchorPose_callback* */ + public VR_IVRSpatialAnchors_FnTable.GetSpatialAnchorPose_callback GetSpatialAnchorPose; + /** C type : GetSpatialAnchorDescriptor_callback* */ + public VR_IVRSpatialAnchors_FnTable.GetSpatialAnchorDescriptor_callback GetSpatialAnchorDescriptor; + /** native declaration : headers\openvr_capi.h:2369 */ + public interface CreateSpatialAnchorFromDescriptor_callback extends Callback { + int apply(Pointer pchDescriptor, IntByReference pHandleOut); + }; + /** native declaration : headers\openvr_capi.h:2370 */ + public interface CreateSpatialAnchorFromPose_callback extends Callback { + int apply(int unDeviceIndex, int eOrigin, SpatialAnchorPose_t pPose, IntByReference pHandleOut); + }; + /** native declaration : headers\openvr_capi.h:2371 */ + public interface GetSpatialAnchorPose_callback extends Callback { + int apply(int unHandle, int eOrigin, SpatialAnchorPose_t pPoseOut); + }; + /** native declaration : headers\openvr_capi.h:2372 */ + public interface GetSpatialAnchorDescriptor_callback extends Callback { + int apply(int unHandle, Pointer pchDescriptorOut, IntByReference punDescriptorBufferLenInOut); + }; + public VR_IVRSpatialAnchors_FnTable() { + super(); + } + protected List getFieldOrder() { + return Arrays.asList("CreateSpatialAnchorFromDescriptor", "CreateSpatialAnchorFromPose", "GetSpatialAnchorPose", "GetSpatialAnchorDescriptor"); + } + /** + * @param CreateSpatialAnchorFromDescriptor C type : CreateSpatialAnchorFromDescriptor_callback*
    + * @param CreateSpatialAnchorFromPose C type : CreateSpatialAnchorFromPose_callback*
    + * @param GetSpatialAnchorPose C type : GetSpatialAnchorPose_callback*
    + * @param GetSpatialAnchorDescriptor C type : GetSpatialAnchorDescriptor_callback* + */ + public VR_IVRSpatialAnchors_FnTable(VR_IVRSpatialAnchors_FnTable.CreateSpatialAnchorFromDescriptor_callback CreateSpatialAnchorFromDescriptor, VR_IVRSpatialAnchors_FnTable.CreateSpatialAnchorFromPose_callback CreateSpatialAnchorFromPose, VR_IVRSpatialAnchors_FnTable.GetSpatialAnchorPose_callback GetSpatialAnchorPose, VR_IVRSpatialAnchors_FnTable.GetSpatialAnchorDescriptor_callback GetSpatialAnchorDescriptor) { + super(); + this.CreateSpatialAnchorFromDescriptor = CreateSpatialAnchorFromDescriptor; + this.CreateSpatialAnchorFromPose = CreateSpatialAnchorFromPose; + this.GetSpatialAnchorPose = GetSpatialAnchorPose; + this.GetSpatialAnchorDescriptor = GetSpatialAnchorDescriptor; + } + public VR_IVRSpatialAnchors_FnTable(Pointer peer) { + super(peer); + } + public static class ByReference extends VR_IVRSpatialAnchors_FnTable implements Structure.ByReference { + + }; + public static class ByValue extends VR_IVRSpatialAnchors_FnTable implements Structure.ByValue { + + }; +} diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRSystem_FnTable.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRSystem_FnTable.java index 4ca9f60e5..315ca22cd 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRSystem_FnTable.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRSystem_FnTable.java @@ -1,4 +1,5 @@ package com.jme3.system.jopenvr; +import com.jme3.system.jopenvr.JOpenVRLibrary.VkInstance_T; import com.sun.jna.Callback; import com.sun.jna.Pointer; import com.sun.jna.Structure; @@ -9,7 +10,7 @@ import java.util.Arrays; import java.util.List; /** * OpenVR Function Pointer Tables
    - * native declaration : headers\openvr_capi.h:1385
    + * native declaration : headers\openvr_capi.h:1799
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. @@ -31,6 +32,8 @@ public class VR_IVRSystem_FnTable extends Structure { public VR_IVRSystem_FnTable.GetD3D9AdapterIndex_callback GetD3D9AdapterIndex; /** C type : GetDXGIOutputInfo_callback* */ public com.jme3.system.jopenvr.VR_IVRExtendedDisplay_FnTable.GetDXGIOutputInfo_callback GetDXGIOutputInfo; + /** C type : GetOutputDevice_callback* */ + public VR_IVRSystem_FnTable.GetOutputDevice_callback GetOutputDevice; /** C type : IsDisplayOnDesktop_callback* */ public VR_IVRSystem_FnTable.IsDisplayOnDesktop_callback IsDisplayOnDesktop; /** C type : SetDisplayVisibility_callback* */ @@ -67,6 +70,8 @@ public class VR_IVRSystem_FnTable extends Structure { public VR_IVRSystem_FnTable.GetUint64TrackedDeviceProperty_callback GetUint64TrackedDeviceProperty; /** C type : GetMatrix34TrackedDeviceProperty_callback* */ public VR_IVRSystem_FnTable.GetMatrix34TrackedDeviceProperty_callback GetMatrix34TrackedDeviceProperty; + /** C type : GetArrayTrackedDeviceProperty_callback* */ + public VR_IVRSystem_FnTable.GetArrayTrackedDeviceProperty_callback GetArrayTrackedDeviceProperty; /** C type : GetStringTrackedDeviceProperty_callback* */ public VR_IVRSystem_FnTable.GetStringTrackedDeviceProperty_callback GetStringTrackedDeviceProperty; /** C type : GetPropErrorNameFromEnum_callback* */ @@ -89,12 +94,14 @@ public class VR_IVRSystem_FnTable extends Structure { public VR_IVRSystem_FnTable.GetButtonIdNameFromEnum_callback GetButtonIdNameFromEnum; /** C type : GetControllerAxisTypeNameFromEnum_callback* */ public VR_IVRSystem_FnTable.GetControllerAxisTypeNameFromEnum_callback GetControllerAxisTypeNameFromEnum; - /** C type : CaptureInputFocus_callback* */ - public VR_IVRSystem_FnTable.CaptureInputFocus_callback CaptureInputFocus; - /** C type : ReleaseInputFocus_callback* */ - public VR_IVRSystem_FnTable.ReleaseInputFocus_callback ReleaseInputFocus; - /** C type : IsInputFocusCapturedByAnotherProcess_callback* */ - public VR_IVRSystem_FnTable.IsInputFocusCapturedByAnotherProcess_callback IsInputFocusCapturedByAnotherProcess; + /** C type : IsInputAvailable_callback* */ + public VR_IVRSystem_FnTable.IsInputAvailable_callback IsInputAvailable; + /** C type : IsSteamVRDrawingControllers_callback* */ + public VR_IVRSystem_FnTable.IsSteamVRDrawingControllers_callback IsSteamVRDrawingControllers; + /** C type : ShouldApplicationPause_callback* */ + public VR_IVRSystem_FnTable.ShouldApplicationPause_callback ShouldApplicationPause; + /** C type : ShouldApplicationReduceRenderingWork_callback* */ + public VR_IVRSystem_FnTable.ShouldApplicationReduceRenderingWork_callback ShouldApplicationReduceRenderingWork; /** C type : DriverDebugRequest_callback* */ public VR_IVRSystem_FnTable.DriverDebugRequest_callback DriverDebugRequest; /** C type : PerformFirmwareUpdate_callback* */ @@ -103,179 +110,191 @@ public class VR_IVRSystem_FnTable extends Structure { public VR_IVRSystem_FnTable.AcknowledgeQuit_Exiting_callback AcknowledgeQuit_Exiting; /** C type : AcknowledgeQuit_UserPrompt_callback* */ public VR_IVRSystem_FnTable.AcknowledgeQuit_UserPrompt_callback AcknowledgeQuit_UserPrompt; - /** native declaration : headers\openvr_capi.h:1341 */ + /** native declaration : headers\openvr_capi.h:1752 */ public interface GetRecommendedRenderTargetSize_callback extends Callback { void apply(IntByReference pnWidth, IntByReference pnHeight); }; - /** native declaration : headers\openvr_capi.h:1342 */ + /** native declaration : headers\openvr_capi.h:1753 */ public interface GetProjectionMatrix_callback extends Callback { com.jme3.system.jopenvr.HmdMatrix44_t.ByValue apply(int eEye, float fNearZ, float fFarZ); }; - /** native declaration : headers\openvr_capi.h:1343 */ + /** native declaration : headers\openvr_capi.h:1754 */ public interface GetProjectionRaw_callback extends Callback { void apply(int eEye, FloatByReference pfLeft, FloatByReference pfRight, FloatByReference pfTop, FloatByReference pfBottom); }; - /** native declaration : headers\openvr_capi.h:1344 */ + /** native declaration : headers\openvr_capi.h:1755 */ public interface ComputeDistortion_callback extends Callback { byte apply(int eEye, float fU, float fV, DistortionCoordinates_t pDistortionCoordinates); }; - /** native declaration : headers\openvr_capi.h:1345 */ + /** native declaration : headers\openvr_capi.h:1756 */ public interface GetEyeToHeadTransform_callback extends Callback { HmdMatrix34_t.ByValue apply(int eEye); }; - /** native declaration : headers\openvr_capi.h:1346 */ + /** native declaration : headers\openvr_capi.h:1757 */ public interface GetTimeSinceLastVsync_callback extends Callback { byte apply(FloatByReference pfSecondsSinceLastVsync, LongByReference pulFrameCounter); }; - /** native declaration : headers\openvr_capi.h:1347 */ + /** native declaration : headers\openvr_capi.h:1758 */ public interface GetD3D9AdapterIndex_callback extends Callback { int apply(); }; - /** native declaration : headers\openvr_capi.h:1348 */ + /** native declaration : headers\openvr_capi.h:1759 */ public interface GetDXGIOutputInfo_callback extends Callback { void apply(IntByReference pnAdapterIndex); }; - /** native declaration : headers\openvr_capi.h:1349 */ + /** native declaration : headers\openvr_capi.h:1760 */ + public interface GetOutputDevice_callback extends Callback { + void apply(LongByReference pnDevice, int textureType, VkInstance_T pInstance); + }; + /** native declaration : headers\openvr_capi.h:1761 */ public interface IsDisplayOnDesktop_callback extends Callback { byte apply(); }; - /** native declaration : headers\openvr_capi.h:1350 */ + /** native declaration : headers\openvr_capi.h:1762 */ public interface SetDisplayVisibility_callback extends Callback { byte apply(byte bIsVisibleOnDesktop); }; - /** native declaration : headers\openvr_capi.h:1351 */ + /** native declaration : headers\openvr_capi.h:1763 */ public interface GetDeviceToAbsoluteTrackingPose_callback extends Callback { void apply(int eOrigin, float fPredictedSecondsToPhotonsFromNow, TrackedDevicePose_t pTrackedDevicePoseArray, int unTrackedDevicePoseArrayCount); }; - /** native declaration : headers\openvr_capi.h:1352 */ + /** native declaration : headers\openvr_capi.h:1764 */ public interface ResetSeatedZeroPose_callback extends Callback { void apply(); }; - /** native declaration : headers\openvr_capi.h:1353 */ + /** native declaration : headers\openvr_capi.h:1765 */ public interface GetSeatedZeroPoseToStandingAbsoluteTrackingPose_callback extends Callback { HmdMatrix34_t.ByValue apply(); }; - /** native declaration : headers\openvr_capi.h:1354 */ + /** native declaration : headers\openvr_capi.h:1766 */ public interface GetRawZeroPoseToStandingAbsoluteTrackingPose_callback extends Callback { HmdMatrix34_t.ByValue apply(); }; - /** native declaration : headers\openvr_capi.h:1355 */ + /** native declaration : headers\openvr_capi.h:1767 */ public interface GetSortedTrackedDeviceIndicesOfClass_callback extends Callback { int apply(int eTrackedDeviceClass, IntByReference punTrackedDeviceIndexArray, int unTrackedDeviceIndexArrayCount, int unRelativeToTrackedDeviceIndex); }; - /** native declaration : headers\openvr_capi.h:1356 */ + /** native declaration : headers\openvr_capi.h:1768 */ public interface GetTrackedDeviceActivityLevel_callback extends Callback { int apply(int unDeviceId); }; - /** native declaration : headers\openvr_capi.h:1357 */ + /** native declaration : headers\openvr_capi.h:1769 */ public interface ApplyTransform_callback extends Callback { void apply(TrackedDevicePose_t pOutputPose, TrackedDevicePose_t pTrackedDevicePose, HmdMatrix34_t pTransform); }; - /** native declaration : headers\openvr_capi.h:1358 */ + /** native declaration : headers\openvr_capi.h:1770 */ public interface GetTrackedDeviceIndexForControllerRole_callback extends Callback { int apply(int unDeviceType); }; - /** native declaration : headers\openvr_capi.h:1359 */ + /** native declaration : headers\openvr_capi.h:1771 */ public interface GetControllerRoleForTrackedDeviceIndex_callback extends Callback { int apply(int unDeviceIndex); }; - /** native declaration : headers\openvr_capi.h:1360 */ + /** native declaration : headers\openvr_capi.h:1772 */ public interface GetTrackedDeviceClass_callback extends Callback { int apply(int unDeviceIndex); }; - /** native declaration : headers\openvr_capi.h:1361 */ + /** native declaration : headers\openvr_capi.h:1773 */ public interface IsTrackedDeviceConnected_callback extends Callback { byte apply(int unDeviceIndex); }; - /** native declaration : headers\openvr_capi.h:1362 */ + /** native declaration : headers\openvr_capi.h:1774 */ public interface GetBoolTrackedDeviceProperty_callback extends Callback { byte apply(int unDeviceIndex, int prop, IntByReference pError); }; - /** native declaration : headers\openvr_capi.h:1363 */ + /** native declaration : headers\openvr_capi.h:1775 */ public interface GetFloatTrackedDeviceProperty_callback extends Callback { float apply(int unDeviceIndex, int prop, IntByReference pError); }; - /** native declaration : headers\openvr_capi.h:1364 */ + /** native declaration : headers\openvr_capi.h:1776 */ public interface GetInt32TrackedDeviceProperty_callback extends Callback { int apply(int unDeviceIndex, int prop, IntByReference pError); }; - /** native declaration : headers\openvr_capi.h:1365 */ + /** native declaration : headers\openvr_capi.h:1777 */ public interface GetUint64TrackedDeviceProperty_callback extends Callback { long apply(int unDeviceIndex, int prop, IntByReference pError); }; - /** native declaration : headers\openvr_capi.h:1366 */ + /** native declaration : headers\openvr_capi.h:1778 */ public interface GetMatrix34TrackedDeviceProperty_callback extends Callback { HmdMatrix34_t.ByValue apply(int unDeviceIndex, int prop, IntByReference pError); }; - /** native declaration : headers\openvr_capi.h:1367 */ + /** native declaration : headers\openvr_capi.h:1779 */ + public interface GetArrayTrackedDeviceProperty_callback extends Callback { + int apply(int unDeviceIndex, int prop, int propType, Pointer pBuffer, int unBufferSize, IntByReference pError); + }; + /** native declaration : headers\openvr_capi.h:1780 */ public interface GetStringTrackedDeviceProperty_callback extends Callback { int apply(int unDeviceIndex, int prop, Pointer pchValue, int unBufferSize, IntByReference pError); }; - /** native declaration : headers\openvr_capi.h:1368 */ + /** native declaration : headers\openvr_capi.h:1781 */ public interface GetPropErrorNameFromEnum_callback extends Callback { Pointer apply(int error); }; - /** native declaration : headers\openvr_capi.h:1369 */ + /** native declaration : headers\openvr_capi.h:1782 */ public interface PollNextEvent_callback extends Callback { byte apply(VREvent_t pEvent, int uncbVREvent); }; - /** native declaration : headers\openvr_capi.h:1370 */ + /** native declaration : headers\openvr_capi.h:1783 */ public interface PollNextEventWithPose_callback extends Callback { byte apply(int eOrigin, VREvent_t pEvent, int uncbVREvent, TrackedDevicePose_t pTrackedDevicePose); }; - /** native declaration : headers\openvr_capi.h:1371 */ + /** native declaration : headers\openvr_capi.h:1784 */ public interface GetEventTypeNameFromEnum_callback extends Callback { Pointer apply(int eType); }; - /** native declaration : headers\openvr_capi.h:1372 */ + /** native declaration : headers\openvr_capi.h:1785 */ public interface GetHiddenAreaMesh_callback extends Callback { com.jme3.system.jopenvr.HiddenAreaMesh_t.ByValue apply(int eEye, int type); }; - /** native declaration : headers\openvr_capi.h:1373 */ + /** native declaration : headers\openvr_capi.h:1786 */ public interface GetControllerState_callback extends Callback { byte apply(int unControllerDeviceIndex, VRControllerState_t pControllerState, int unControllerStateSize); }; - /** native declaration : headers\openvr_capi.h:1374 */ + /** native declaration : headers\openvr_capi.h:1787 */ public interface GetControllerStateWithPose_callback extends Callback { byte apply(int eOrigin, int unControllerDeviceIndex, VRControllerState_t pControllerState, int unControllerStateSize, TrackedDevicePose_t pTrackedDevicePose); }; - /** native declaration : headers\openvr_capi.h:1375 */ + /** native declaration : headers\openvr_capi.h:1788 */ public interface TriggerHapticPulse_callback extends Callback { void apply(int unControllerDeviceIndex, int unAxisId, short usDurationMicroSec); }; - /** native declaration : headers\openvr_capi.h:1376 */ + /** native declaration : headers\openvr_capi.h:1789 */ public interface GetButtonIdNameFromEnum_callback extends Callback { Pointer apply(int eButtonId); }; - /** native declaration : headers\openvr_capi.h:1377 */ + /** native declaration : headers\openvr_capi.h:1790 */ public interface GetControllerAxisTypeNameFromEnum_callback extends Callback { Pointer apply(int eAxisType); }; - /** native declaration : headers\openvr_capi.h:1378 */ - public interface CaptureInputFocus_callback extends Callback { + /** native declaration : headers\openvr_capi.h:1791 */ + public interface IsInputAvailable_callback extends Callback { byte apply(); }; - /** native declaration : headers\openvr_capi.h:1379 */ - public interface ReleaseInputFocus_callback extends Callback { - void apply(); + /** native declaration : headers\openvr_capi.h:1792 */ + public interface IsSteamVRDrawingControllers_callback extends Callback { + byte apply(); + }; + /** native declaration : headers\openvr_capi.h:1793 */ + public interface ShouldApplicationPause_callback extends Callback { + byte apply(); }; - /** native declaration : headers\openvr_capi.h:1380 */ - public interface IsInputFocusCapturedByAnotherProcess_callback extends Callback { + /** native declaration : headers\openvr_capi.h:1794 */ + public interface ShouldApplicationReduceRenderingWork_callback extends Callback { byte apply(); }; - /** native declaration : headers\openvr_capi.h:1381 */ + /** native declaration : headers\openvr_capi.h:1795 */ public interface DriverDebugRequest_callback extends Callback { int apply(int unDeviceIndex, Pointer pchRequest, Pointer pchResponseBuffer, int unResponseBufferSize); }; - /** native declaration : headers\openvr_capi.h:1382 */ + /** native declaration : headers\openvr_capi.h:1796 */ public interface PerformFirmwareUpdate_callback extends Callback { int apply(int unDeviceIndex); }; - /** native declaration : headers\openvr_capi.h:1383 */ + /** native declaration : headers\openvr_capi.h:1797 */ public interface AcknowledgeQuit_Exiting_callback extends Callback { void apply(); }; - /** native declaration : headers\openvr_capi.h:1384 */ + /** native declaration : headers\openvr_capi.h:1798 */ public interface AcknowledgeQuit_UserPrompt_callback extends Callback { void apply(); }; @@ -283,7 +302,7 @@ public class VR_IVRSystem_FnTable extends Structure { super(); } protected List getFieldOrder() { - return Arrays.asList("GetRecommendedRenderTargetSize", "GetProjectionMatrix", "GetProjectionRaw", "ComputeDistortion", "GetEyeToHeadTransform", "GetTimeSinceLastVsync", "GetD3D9AdapterIndex", "GetDXGIOutputInfo", "IsDisplayOnDesktop", "SetDisplayVisibility", "GetDeviceToAbsoluteTrackingPose", "ResetSeatedZeroPose", "GetSeatedZeroPoseToStandingAbsoluteTrackingPose", "GetRawZeroPoseToStandingAbsoluteTrackingPose", "GetSortedTrackedDeviceIndicesOfClass", "GetTrackedDeviceActivityLevel", "ApplyTransform", "GetTrackedDeviceIndexForControllerRole", "GetControllerRoleForTrackedDeviceIndex", "GetTrackedDeviceClass", "IsTrackedDeviceConnected", "GetBoolTrackedDeviceProperty", "GetFloatTrackedDeviceProperty", "GetInt32TrackedDeviceProperty", "GetUint64TrackedDeviceProperty", "GetMatrix34TrackedDeviceProperty", "GetStringTrackedDeviceProperty", "GetPropErrorNameFromEnum", "PollNextEvent", "PollNextEventWithPose", "GetEventTypeNameFromEnum", "GetHiddenAreaMesh", "GetControllerState", "GetControllerStateWithPose", "TriggerHapticPulse", "GetButtonIdNameFromEnum", "GetControllerAxisTypeNameFromEnum", "CaptureInputFocus", "ReleaseInputFocus", "IsInputFocusCapturedByAnotherProcess", "DriverDebugRequest", "PerformFirmwareUpdate", "AcknowledgeQuit_Exiting", "AcknowledgeQuit_UserPrompt"); + return Arrays.asList("GetRecommendedRenderTargetSize", "GetProjectionMatrix", "GetProjectionRaw", "ComputeDistortion", "GetEyeToHeadTransform", "GetTimeSinceLastVsync", "GetD3D9AdapterIndex", "GetDXGIOutputInfo", "GetOutputDevice", "IsDisplayOnDesktop", "SetDisplayVisibility", "GetDeviceToAbsoluteTrackingPose", "ResetSeatedZeroPose", "GetSeatedZeroPoseToStandingAbsoluteTrackingPose", "GetRawZeroPoseToStandingAbsoluteTrackingPose", "GetSortedTrackedDeviceIndicesOfClass", "GetTrackedDeviceActivityLevel", "ApplyTransform", "GetTrackedDeviceIndexForControllerRole", "GetControllerRoleForTrackedDeviceIndex", "GetTrackedDeviceClass", "IsTrackedDeviceConnected", "GetBoolTrackedDeviceProperty", "GetFloatTrackedDeviceProperty", "GetInt32TrackedDeviceProperty", "GetUint64TrackedDeviceProperty", "GetMatrix34TrackedDeviceProperty", "GetArrayTrackedDeviceProperty", "GetStringTrackedDeviceProperty", "GetPropErrorNameFromEnum", "PollNextEvent", "PollNextEventWithPose", "GetEventTypeNameFromEnum", "GetHiddenAreaMesh", "GetControllerState", "GetControllerStateWithPose", "TriggerHapticPulse", "GetButtonIdNameFromEnum", "GetControllerAxisTypeNameFromEnum", "IsInputAvailable", "IsSteamVRDrawingControllers", "ShouldApplicationPause", "ShouldApplicationReduceRenderingWork", "DriverDebugRequest", "PerformFirmwareUpdate", "AcknowledgeQuit_Exiting", "AcknowledgeQuit_UserPrompt"); } public VR_IVRSystem_FnTable(Pointer peer) { super(peer); diff --git a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRTrackedCamera_FnTable.java b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRTrackedCamera_FnTable.java index ddb701b94..1fc5d469a 100644 --- a/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRTrackedCamera_FnTable.java +++ b/jme3-vr/src/main/java/com/jme3/system/jopenvr/VR_IVRTrackedCamera_FnTable.java @@ -8,7 +8,7 @@ import com.sun.jna.ptr.PointerByReference; import java.util.Arrays; import java.util.List; /** - * native declaration : headers\openvr_capi.h:1419
    + * native declaration : headers\openvr_capi.h:1833
    * This file was autogenerated by JNAerator,
    * a tool written by Olivier Chafik that uses a few opensource projects..
    * For help, please visit NativeLibs4Java , Rococoa, or JNA. @@ -38,51 +38,51 @@ public class VR_IVRTrackedCamera_FnTable extends Structure { public VR_IVRTrackedCamera_FnTable.GetVideoStreamTextureGL_callback GetVideoStreamTextureGL; /** C type : ReleaseVideoStreamTextureGL_callback* */ public VR_IVRTrackedCamera_FnTable.ReleaseVideoStreamTextureGL_callback ReleaseVideoStreamTextureGL; - /** native declaration : headers\openvr_capi.h:1407 */ + /** native declaration : headers\openvr_capi.h:1821 */ public interface GetCameraErrorNameFromEnum_callback extends Callback { Pointer apply(int eCameraError); }; - /** native declaration : headers\openvr_capi.h:1408 */ + /** native declaration : headers\openvr_capi.h:1822 */ public interface HasCamera_callback extends Callback { int apply(int nDeviceIndex, Pointer pHasCamera); }; - /** native declaration : headers\openvr_capi.h:1409 */ + /** native declaration : headers\openvr_capi.h:1823 */ public interface GetCameraFrameSize_callback extends Callback { int apply(int nDeviceIndex, int eFrameType, IntByReference pnWidth, IntByReference pnHeight, IntByReference pnFrameBufferSize); }; - /** native declaration : headers\openvr_capi.h:1410 */ + /** native declaration : headers\openvr_capi.h:1824 */ public interface GetCameraIntrinsics_callback extends Callback { int apply(int nDeviceIndex, int eFrameType, HmdVector2_t pFocalLength, HmdVector2_t pCenter); }; - /** native declaration : headers\openvr_capi.h:1411 */ + /** native declaration : headers\openvr_capi.h:1825 */ public interface GetCameraProjection_callback extends Callback { int apply(int nDeviceIndex, int eFrameType, float flZNear, float flZFar, HmdMatrix44_t pProjection); }; - /** native declaration : headers\openvr_capi.h:1412 */ + /** native declaration : headers\openvr_capi.h:1826 */ public interface AcquireVideoStreamingService_callback extends Callback { int apply(int nDeviceIndex, LongByReference pHandle); }; - /** native declaration : headers\openvr_capi.h:1413 */ + /** native declaration : headers\openvr_capi.h:1827 */ public interface ReleaseVideoStreamingService_callback extends Callback { int apply(long hTrackedCamera); }; - /** native declaration : headers\openvr_capi.h:1414 */ + /** native declaration : headers\openvr_capi.h:1828 */ public interface GetVideoStreamFrameBuffer_callback extends Callback { int apply(long hTrackedCamera, int eFrameType, Pointer pFrameBuffer, int nFrameBufferSize, CameraVideoStreamFrameHeader_t pFrameHeader, int nFrameHeaderSize); }; - /** native declaration : headers\openvr_capi.h:1415 */ + /** native declaration : headers\openvr_capi.h:1829 */ public interface GetVideoStreamTextureSize_callback extends Callback { int apply(int nDeviceIndex, int eFrameType, VRTextureBounds_t pTextureBounds, IntByReference pnWidth, IntByReference pnHeight); }; - /** native declaration : headers\openvr_capi.h:1416 */ + /** native declaration : headers\openvr_capi.h:1830 */ public interface GetVideoStreamTextureD3D11_callback extends Callback { int apply(long hTrackedCamera, int eFrameType, Pointer pD3D11DeviceOrResource, PointerByReference ppD3D11ShaderResourceView, CameraVideoStreamFrameHeader_t pFrameHeader, int nFrameHeaderSize); }; - /** native declaration : headers\openvr_capi.h:1417 */ + /** native declaration : headers\openvr_capi.h:1831 */ public interface GetVideoStreamTextureGL_callback extends Callback { int apply(long hTrackedCamera, int eFrameType, IntByReference pglTextureId, CameraVideoStreamFrameHeader_t pFrameHeader, int nFrameHeaderSize); }; - /** native declaration : headers\openvr_capi.h:1418 */ + /** native declaration : headers\openvr_capi.h:1832 */ public interface ReleaseVideoStreamTextureGL_callback extends Callback { int apply(long hTrackedCamera, int glTextureId); }; diff --git a/jme3-vr/src/main/java/com/jme3/system/lwjgl/LwjglWindowVR.java b/jme3-vr/src/main/java/com/jme3/system/lwjgl/LwjglWindowVR.java index 95a1f8420..4bcad1876 100644 --- a/jme3-vr/src/main/java/com/jme3/system/lwjgl/LwjglWindowVR.java +++ b/jme3-vr/src/main/java/com/jme3/system/lwjgl/LwjglWindowVR.java @@ -1,7 +1,7 @@ package com.jme3.system.lwjgl; /* - * Copyright (c) 2009-2012 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -101,7 +101,7 @@ public abstract class LwjglWindowVR extends LwjglContextVR implements Runnable { } /** - * Set the title if its a windowed display + * Set the title if it's a windowed display * * @param title the title to set */ @@ -112,7 +112,7 @@ public abstract class LwjglWindowVR extends LwjglContextVR implements Runnable { } /** - * Restart if its a windowed or full-screen display. + * Restart if it's a windowed or full-screen display. */ public void restart() { if (created.get()) { diff --git a/jme3-vr/src/main/java/com/jme3/util/VRGUIPositioningMode.java b/jme3-vr/src/main/java/com/jme3/util/VRGUIPositioningMode.java index a7b8642f0..570a9be68 100644 --- a/jme3-vr/src/main/java/com/jme3/util/VRGUIPositioningMode.java +++ b/jme3-vr/src/main/java/com/jme3/util/VRGUIPositioningMode.java @@ -2,7 +2,7 @@ package com.jme3.util; /** * A enumeration that describes the GUI display positioning modes. - * @author Julien Seinturier - (c) 2016 - JOrigin project - http:/www.jorigin.org + * @author Julien Seinturier - COMEX SA - http://www.seinturier.fr * */ public enum VRGUIPositioningMode { diff --git a/jme3-vr/src/main/java/com/jme3/util/VRGuiManager.java b/jme3-vr/src/main/java/com/jme3/util/VRGuiManager.java index 46b3dbbb6..a5a4d89e8 100644 --- a/jme3-vr/src/main/java/com/jme3/util/VRGuiManager.java +++ b/jme3-vr/src/main/java/com/jme3/util/VRGuiManager.java @@ -30,7 +30,7 @@ import java.util.Iterator; /** * A class dedicated to the management and the display of a Graphical User Interface (GUI) within a VR environment. * @author reden - phr00t - https://github.com/phr00t - * @author Julien Seinturier - (c) 2016 - JOrigin project - http:/www.jorigin.org + * @author Julien Seinturier - COMEX SA - http://www.seinturier.fr * */ public class VRGuiManager { @@ -76,6 +76,14 @@ public class VRGuiManager { this.environment = environment; } + public boolean isWantsReposition() { + return wantsReposition; + } + + public void setWantsReposition(boolean wantsReposition) { + this.wantsReposition = wantsReposition; + } + /** * * Makes auto GUI positioning happen not immediately, but like an @@ -204,7 +212,7 @@ public class VRGuiManager { /** * Update the GUI geometric state. This method should be called after GUI modification. */ - protected void updateGuiQuadGeometricState() { + public void updateGuiQuadGeometricState() { guiQuadNode.updateGeometricState(); } @@ -212,7 +220,7 @@ public class VRGuiManager { * Position the GUI without delay. * @param tpf the time per frame. */ - protected void positionGuiNow(float tpf) { + public void positionGuiNow(float tpf) { if (environment != null){ wantsReposition = false; @@ -347,7 +355,7 @@ public class VRGuiManager { * @param left the left eye viewport. * @param right the right eye viewport. */ - protected void setupGui(Camera leftcam, Camera rightcam, ViewPort left, ViewPort right) { + public void setupGui(Camera leftcam, Camera rightcam, ViewPort left, ViewPort right) { if (environment != null){ if( environment.hasTraditionalGUIOverlay() ) { diff --git a/jme3-vr/src/main/java/com/jme3/util/VRUtil.java b/jme3-vr/src/main/java/com/jme3/util/VRUtil.java index 37de4a2b8..abc8d3ca9 100644 --- a/jme3-vr/src/main/java/com/jme3/util/VRUtil.java +++ b/jme3-vr/src/main/java/com/jme3/util/VRUtil.java @@ -7,12 +7,15 @@ package com.jme3.util; import com.jme3.math.FastMath; import com.jme3.math.Matrix4f; import com.jme3.math.Quaternion; -import com.jme3.system.jopenvr.HmdMatrix34_t; -import com.jme3.system.jopenvr.HmdMatrix44_t; -import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeUnit; +/** + * + * @author Julien Seinturier - COMEX SA - http://www.seinturier.fr + * + */ public class VRUtil { private static final long SLEEP_PRECISION = TimeUnit.MILLISECONDS.toNanos(4); @@ -33,21 +36,8 @@ public class VRUtil { } while (timeLeft > 0); } - public static Matrix4f convertSteamVRMatrix3ToMatrix4f(HmdMatrix34_t hmdMatrix, Matrix4f mat){ - mat.set(hmdMatrix.m[0], hmdMatrix.m[1], hmdMatrix.m[2], hmdMatrix.m[3], - hmdMatrix.m[4], hmdMatrix.m[5], hmdMatrix.m[6], hmdMatrix.m[7], - hmdMatrix.m[8], hmdMatrix.m[9], hmdMatrix.m[10], hmdMatrix.m[11], - 0f, 0f, 0f, 1f); - return mat; - } + - public static Matrix4f convertSteamVRMatrix4ToMatrix4f(HmdMatrix44_t hmdMatrix, Matrix4f mat){ - mat.set(hmdMatrix.m[0], hmdMatrix.m[1], hmdMatrix.m[2], hmdMatrix.m[3], - hmdMatrix.m[4], hmdMatrix.m[5], hmdMatrix.m[6], hmdMatrix.m[7], - hmdMatrix.m[8], hmdMatrix.m[9], hmdMatrix.m[10], hmdMatrix.m[11], - hmdMatrix.m[12], hmdMatrix.m[13], hmdMatrix.m[14], hmdMatrix.m[15]); - return mat; - } public static void convertMatrix4toQuat(Matrix4f in, Quaternion out) { // convert rotation matrix to quat diff --git a/jme3-vr/src/main/java/test/TestInitHmd.java b/jme3-vr/src/main/java/test/TestInitHmd.java new file mode 100644 index 000000000..4869d4c11 --- /dev/null +++ b/jme3-vr/src/main/java/test/TestInitHmd.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2009-2018 jMonkeyEngine + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'jMonkeyEngine' nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package test; + +import com.jme3.app.VREnvironment; +import com.jme3.input.vr.openvr.OpenVR; +import com.jme3.system.AppSettings; + +/** + * Testing OpenVR environment. + * @author Rickard + */ +public class TestInitHmd { + + public static void main(String... args){ + testInitHmd(); + } + + public static void testInitHmd(){ + VREnvironment environment = new VREnvironment(new AppSettings(true)); + environment.initialize(); + OpenVR openVr = (OpenVR) environment.getVRHardware(); + System.out.println(openVr.getName()); + + openVr.updatePose(); + + openVr.destroy(); + + } +} \ No newline at end of file diff --git a/jme3-vr/src/main/resources/Common/ShaderLib/InstanceVR.glsllib b/jme3-vr/src/main/resources/Common/ShaderLib/InstanceVR.glsllib index 9294488af..99629173f 100644 --- a/jme3-vr/src/main/resources/Common/ShaderLib/InstanceVR.glsllib +++ b/jme3-vr/src/main/resources/Common/ShaderLib/InstanceVR.glsllib @@ -93,6 +93,7 @@ uniform mat4 g_WorldMatrix; uniform mat4 g_WorldViewMatrix; uniform mat4 g_WorldViewProjectionMatrix; uniform mat3 g_NormalMatrix; +uniform mat3 g_WorldNormalMatrix; vec4 TransformWorld(vec4 position) { @@ -118,4 +119,8 @@ vec3 TransformNormal(vec3 normal) { return g_NormalMatrix * normal; } -#endif +vec3 TransformWorldNormal(vec3 normal) { + return normalize(g_WorldNormalMatrix * normal); +} + +#endif \ No newline at end of file