Remove custom SkVertices data and runtime effect `varying` support

This was an experimental feature. It worked (but only the GPU backend).
It was never adopted or used by anyone, to my knowledge. It's a large
amount of code, and a strange corner of SkSL for users to stumble into.

Bug: skia:10680
Change-Id: I0dda0364bce7dbffa58c32de4c7801ec2a6bc42e
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/398222
Reviewed-by: Mike Reed <reed@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
diff --git a/RELEASE_NOTES.txt b/RELEASE_NOTES.txt
index bfeef83..448d7e4 100644
--- a/RELEASE_NOTES.txt
+++ b/RELEASE_NOTES.txt
@@ -6,7 +6,9 @@
 
 Milestone 92
 ------------
-  *
+  * Removed custom attributes from SkVertices and the corresponding `varying` feature from
+    SkRuntimeEffect.
+    https://review.skia.org/398222
 
 * * *
 
diff --git a/gm/vertices.cpp b/gm/vertices.cpp
index d8d3a80..a1ac94a 100644
--- a/gm/vertices.cpp
+++ b/gm/vertices.cpp
@@ -272,49 +272,6 @@
     draw_batching(canvas);
 }
 
-using AttrType = SkVertices::Attribute::Type;
-
-DEF_SIMPLE_GM(vertices_data, canvas, 512, 256) {
-    for (auto attrType : {AttrType::kFloat4, AttrType::kByte4_unorm}) {
-        SkRect r = SkRect::MakeWH(256, 256);
-        int vcount = 4;  // just a quad
-        int icount = 0;
-        SkVertices::Attribute attrs[] = { attrType };
-        SkVertices::Builder builder(SkVertices::kTriangleFan_VertexMode, vcount, icount, attrs, 1);
-
-        r.toQuad(builder.positions());
-
-        if (attrType == AttrType::kFloat4) {
-            SkV4* col = (SkV4*)builder.customData();
-            col[0] = {1, 0, 0, 1};        // red
-            col[1] = {0, 1, 0, 1};        // green
-            col[2] = {0, 0, 1, 1};        // blue
-            col[3] = {0.5, 0.5, 0.5, 1};  // gray
-        } else {
-            uint32_t* col = (uint32_t*)builder.customData();
-            col[0] = 0xFF0000FF;
-            col[1] = 0xFF00FF00;
-            col[2] = 0xFFFF0000;
-            col[3] = 0xFF7F7F7F;
-        }
-
-        SkPaint paint;
-        const char* gProg = R"(
-            varying float4 vtx_color;
-            half4 main(float2 p) {
-                return vtx_color;
-            }
-        )";
-        auto [effect, errorText] = SkRuntimeEffect::Make(SkString(gProg));
-        if (!effect) {
-            SK_ABORT("RuntimeEffect error: %s\n", errorText.c_str());
-        }
-        paint.setShader(effect->makeShader(nullptr, nullptr, 0, nullptr, true));
-        canvas->drawVertices(builder.detach(), paint);
-        canvas->translate(r.width(), 0);
-    }
-}
-
 // Test case for skbug.com/10069. We need to draw the vertices twice (with different matrices) to
 // trigger the bug.
 DEF_SIMPLE_GM(vertices_perspective, canvas, 256, 256) {
@@ -353,279 +310,3 @@
     canvas->drawVertices(verts, paint);
     canvas->restore();
 }
-
-DEF_SIMPLE_GM(vertices_data_lerp, canvas, 256, 256) {
-    SkPoint pts[12] = {{0, 0},     {85, 0},    {171, 0},  {256, 0}, {256, 85}, {256, 171},
-                       {256, 256}, {171, 256}, {85, 256}, {0, 256}, {0, 171},  {0, 85}};
-
-    auto patchVerts = SkPatchUtils::MakeVertices(pts, nullptr, nullptr, 12, 12);
-    SkVerticesPriv pv(patchVerts->priv());
-
-    SkVertices::Attribute attrs[1] = { AttrType::kFloat };
-    SkVertices::Builder builder(pv.mode(), pv.vertexCount(), pv.indexCount(), attrs, 1);
-
-    memcpy(builder.positions(), pv.positions(), pv.vertexCount() * sizeof(SkPoint));
-    memcpy(builder.indices(), pv.indices(), pv.indexCount() * sizeof(uint16_t));
-
-    SkRandom rnd;
-    float* lerpData = (float*)builder.customData();
-    for (int i = 0; i < pv.vertexCount(); ++i) {
-        lerpData[i] = rnd.nextBool() ? 1.0f : 0.0f;
-    }
-
-    auto verts = builder.detach();
-
-    SkPaint paint;
-    const char* gProg = R"(
-        uniform shader c0;
-        uniform shader c1;
-        varying float vtx_lerp;
-        half4 main(float2 p) {
-            half4 col0 = sample(c0, p);
-            half4 col1 = sample(c1, p);
-            return mix(col0, col1, vtx_lerp);
-        }
-    )";
-    auto [effect, errorText] = SkRuntimeEffect::Make(SkString(gProg));
-    SkMatrix scale = SkMatrix::Scale(2, 2);
-    sk_sp<SkShader> children[] = {
-        GetResourceAsImage("images/mandrill_256.png")->makeShader(SkSamplingOptions()),
-        GetResourceAsImage("images/color_wheel.png")->makeShader(SkSamplingOptions(), scale),
-    };
-    paint.setShader(effect->makeShader(nullptr, children, 2, nullptr, false));
-
-    canvas->drawVertices(verts, paint);
-}
-
-static constexpr SkScalar kSin60 = 0.8660254f; // sqrt(3) / 2
-static constexpr SkPoint kHexVerts[] = {
-    { 0, 0 },
-    { 0, -1 },
-    { kSin60, -0.5f },
-    { kSin60, 0.5f },
-    { 0, 1 },
-    { -kSin60, 0.5f },
-    { -kSin60, -0.5f },
-    { 0, -1 },
-};
-
-static constexpr SkColor4f kColors[] = {
-    SkColors::kWhite,
-    SkColors::kRed,
-    SkColors::kYellow,
-    SkColors::kGreen,
-    SkColors::kCyan,
-    SkColors::kBlue,
-    SkColors::kMagenta,
-    SkColors::kRed,
-};
-
-using Attr = SkVertices::Attribute;
-
-DEF_SIMPLE_GM(vertices_custom_colors, canvas, 400, 200) {
-    ToolUtils::draw_checkerboard(canvas);
-
-    auto draw = [=](SkScalar cx, SkScalar cy, SkVertices::Builder& builder, const SkPaint& paint) {
-        memcpy(builder.positions(), kHexVerts, sizeof(kHexVerts));
-
-        canvas->save();
-        canvas->translate(cx, cy);
-        canvas->scale(45, 45);
-        canvas->drawVertices(builder.detach(), paint);
-        canvas->restore();
-    };
-
-    auto transColor = [](int i) {
-        return SkColor4f { kColors[i].fR, kColors[i].fG, kColors[i].fB, i % 2 ? 0.5f : 1.0f };
-    };
-
-    // Fixed function SkVertices, opaque
-    {
-        SkVertices::Builder builder(SkVertices::kTriangleFan_VertexMode, 8, 0,
-                                    SkVertices::kHasColors_BuilderFlag);
-        for (int i = 0; i < 8; ++i) {
-            builder.colors()[i] = kColors[i].toSkColor();
-        }
-        draw(50, 50, builder, SkPaint());
-    }
-
-    // Fixed function SkVertices, w/transparency
-    {
-        SkVertices::Builder builder(SkVertices::kTriangleFan_VertexMode, 8, 0,
-                                    SkVertices::kHasColors_BuilderFlag);
-        for (int i = 0; i < 8; ++i) {
-            builder.colors()[i] = transColor(i).toSkColor();
-        }
-        draw(50, 150, builder, SkPaint());
-    }
-
-    const char* gProg = R"(
-        varying half4 vtx_color;
-        half4 main(float2 p) {
-            return vtx_color;
-        }
-    )";
-    SkPaint skslPaint;
-    auto [effect, errorText] = SkRuntimeEffect::Make(SkString(gProg));
-    skslPaint.setShader(effect->makeShader(nullptr, nullptr, 0, nullptr, false));
-
-    Attr byteColorAttr(Attr::Type::kByte4_unorm, Attr::Usage::kColor);
-    Attr float4ColorAttr(Attr::Type::kFloat4, Attr::Usage::kColor);
-    Attr float3ColorAttr(Attr::Type::kFloat3, Attr::Usage::kColor);
-
-    // Custom vertices, byte colors, opaque
-    {
-        SkVertices::Builder builder(SkVertices::kTriangleFan_VertexMode, 8, 0, &byteColorAttr, 1);
-        for (int i = 0; i < 8; ++i) {
-            ((uint32_t*)builder.customData())[i] = kColors[i].toBytes_RGBA();
-        }
-        draw(150, 50, builder, skslPaint);
-    }
-
-    // Custom vertices, byte colors, w/transparency
-    {
-        SkVertices::Builder builder(SkVertices::kTriangleFan_VertexMode, 8, 0, &byteColorAttr, 1);
-        for (int i = 0; i < 8; ++i) {
-            ((uint32_t*)builder.customData())[i] = transColor(i).toBytes_RGBA();
-        }
-        draw(150, 150, builder, skslPaint);
-    }
-
-    // Custom vertices, float4 colors, opaque
-    {
-        SkVertices::Builder builder(SkVertices::kTriangleFan_VertexMode, 8, 0, &float4ColorAttr, 1);
-        for (int i = 0; i < 8; ++i) {
-            ((SkColor4f*)builder.customData())[i] = kColors[i];
-        }
-        draw(250, 50, builder, skslPaint);
-    }
-
-    // Custom vertices, float4 colors, w/transparency
-    {
-        SkVertices::Builder builder(SkVertices::kTriangleFan_VertexMode, 8, 0, &float4ColorAttr, 1);
-        SkColor4f* clr = (SkColor4f*)builder.customData();
-        for (int i = 0; i < 8; ++i) {
-            clr[i] = transColor(i);
-        }
-        draw(250, 150, builder, skslPaint);
-    }
-
-    // Custom vertices, float3 colors, opaque
-    {
-        SkVertices::Builder builder(SkVertices::kTriangleFan_VertexMode, 8, 0, &float3ColorAttr, 1);
-        for (int i = 0; i < 8; ++i) {
-            ((SkV3*)builder.customData())[i] = { kColors[i].fR, kColors[i].fG, kColors[i].fB };
-        }
-        draw(350, 50, builder, skslPaint);
-    }
-}
-
-static sk_sp<SkVertices> make_cone(Attr::Usage u, const char* markerName) {
-    Attr attr(Attr::Type::kFloat3, u, markerName);
-
-    constexpr int kPerimeterVerts = 64;
-    // +1 for the center, +1 to repeat the first perimeter point (so we draw a complete circle)
-    constexpr int kNumVerts = kPerimeterVerts + 2;
-
-    SkVertices::Builder builder(SkVertices::kTriangleFan_VertexMode, kNumVerts, /*indexCount=*/0,
-                                &attr, /*attrCount=*/1);
-
-    SkPoint* pos = builder.positions();
-    SkPoint3* vec = static_cast<SkPoint3*>(builder.customData());
-
-    pos[0] = { 0, 0 };
-    vec[0] = { 0, 0, 1 };
-
-    for (int i = 0; i < kPerimeterVerts + 1; ++i) {
-        SkScalar t = (i / SkIntToScalar(kPerimeterVerts)) * 2 * SK_ScalarPI;
-        SkScalar s = SkScalarSin(t),
-                 c = SkScalarCos(t);
-        pos[i + 1] = { c, s };
-        vec[i + 1] = { c, s, 0 };
-    }
-
-    return builder.detach();
-}
-
-DEF_SIMPLE_GM(vertices_custom_matrices, canvas, 400, 400) {
-    ToolUtils::draw_checkerboard(canvas);
-
-    const char* kViewSpace = "local_to_view";
-    const char* kWorldSpace = "local_to_world";
-    const char* kLocalSpace = "local_to_local";
-
-    auto draw = [=](SkScalar cx, SkScalar cy, sk_sp<SkVertices> vertices, const char* prog,
-                    SkScalar squish = 1.0f) {
-        SkPaint paint;
-        auto [effect, errorText] = SkRuntimeEffect::Make(SkString(prog));
-        paint.setShader(effect->makeShader(nullptr, nullptr, 0, nullptr, false));
-
-        canvas->save();
-
-        // Device space: mesh is upright, translated to its "cell"
-        canvas->translate(cx, cy);
-
-        // View (camera) space: Mesh is upright, centered on origin, device scale
-        canvas->markCTM(kViewSpace);
-        canvas->rotate(90);
-
-        // World space: Mesh is sideways, centered on origin, device scale (possibly squished)
-        canvas->markCTM(kWorldSpace);
-        canvas->rotate(-90);
-        canvas->scale(45, 45 * squish);
-
-        // Local space: Mesh is upright, centered on origin, unit scale
-        canvas->markCTM(kLocalSpace);
-        canvas->drawVertices(vertices, paint);
-
-        canvas->restore();
-    };
-
-    const char* vectorProg = R"(
-        varying float3 vtx_vec;
-        half4 main(float2 p) {
-            return (vtx_vec * 0.5 + 0.5).rgb1;
-        })";
-
-    // raw, local vectors, normals, and positions should all look the same (no real transform)
-    draw(50,  50, make_cone(Attr::Usage::kRaw, nullptr), vectorProg);
-    draw(150, 50, make_cone(Attr::Usage::kVector, kLocalSpace), vectorProg);
-    draw(250, 50, make_cone(Attr::Usage::kNormalVector, kLocalSpace), vectorProg);
-    draw(350, 50, make_cone(Attr::Usage::kPosition, kLocalSpace), vectorProg);
-
-    // world-space vectors and normals are rotated 90 degrees, positions are centered but scaled up
-    draw(150, 150, make_cone(Attr::Usage::kVector, kWorldSpace), vectorProg);
-    draw(250, 150, make_cone(Attr::Usage::kNormalVector, kWorldSpace), vectorProg);
-    draw(350, 150, make_cone(Attr::Usage::kPosition, kWorldSpace), vectorProg);
-
-    // Squished vectors are "wrong", but normals are correct (because we use the inverse transpose)
-    // Positions remain scaled up (saturated), but otherwise correct
-    draw(150, 250, make_cone(Attr::Usage::kVector, kWorldSpace), vectorProg, 0.5f);
-    draw(250, 250, make_cone(Attr::Usage::kNormalVector, kWorldSpace), vectorProg, 0.5f);
-    draw(350, 250, make_cone(Attr::Usage::kPosition, kWorldSpace), vectorProg, 0.5f);
-
-    draw( 50, 350, make_cone(Attr::Usage::kVector, nullptr), vectorProg, 0.5f);
-    draw(150, 350, make_cone(Attr::Usage::kNormalVector, nullptr), vectorProg, 0.5f);
-
-    // For canvas-space positions, color them according to their position relative to the center.
-    // We do this test twice, with and without saveLayer. That ensures that we get the canvas CTM,
-    // not just a local-to-device matrix, which exposes effect authors to an implementation detail.
-
-    const char* ctmPositionProg250 = R"(
-        varying float3 vtx_pos;
-        half4 main(float2 p) {
-            return ((vtx_pos - float3(250, 350, 0)) / 50 + 0.5).rgb1;
-        }
-    )";
-    draw(250, 350, make_cone(Attr::Usage::kPosition, nullptr), ctmPositionProg250, 0.5f);
-
-    const char* ctmPositionProg350 = R"(
-        varying float3 vtx_pos;
-        half4 main(float2 p) {
-            return ((vtx_pos - float3(350, 350, 0)) / 50 + 0.5).rgb1;
-        }
-    )";
-    canvas->saveLayer({ 300, 300, 400, 400 }, nullptr);
-    draw(350, 350, make_cone(Attr::Usage::kPosition, nullptr), ctmPositionProg350, 0.5f);
-    canvas->restore();
-}
diff --git a/include/core/SkVertices.h b/include/core/SkVertices.h
index 7184dd2..fc53e9d 100644
--- a/include/core/SkVertices.h
+++ b/include/core/SkVertices.h
@@ -55,70 +55,6 @@
                         nullptr);
     }
 
-    static constexpr int kMaxCustomAttributes = 8;
-
-    /**
-     *  EXPERIMENTAL - An SkVertices object can be constructed with a custom collection of vertex
-     *  attributes. Each attribute is described by a single Attribute struct. Type defines the CPU
-     *  type of the data. Usage determines what transformation (if any) is applied to that data in
-     *  the vertex shader. For positions or vectors, markerName identifies what matrix is used in
-     *  the vertex shader to transform the data. Those names should match a named transform on the
-     *  CTM stack, created by calling SkCanvas::markCTM().
-     *
-     *  For attributes with a usage of kVector, kNormalVector, or kPosition, a null markerName
-     *  will transform the attribute by the canvas CTM matrix.
-     */
-    struct Attribute {
-        enum class Type : uint8_t {
-            kFloat,
-            kFloat2,
-            kFloat3,
-            kFloat4,
-            kByte4_unorm,
-        };
-
-        enum class Usage : uint8_t {
-            // Raw values passed directly to effect
-            kRaw,
-
-            // sRGB unpremul colors, transformed to destination color space (3 or 4 channels)
-            // Colors are always assumed to be in RGBA order, and are automatically premultiplied.
-            kColor,
-
-            // Local vector, transformed via marker (2 or 3 channels)
-            kVector,
-
-            // Normal vector (or any other bivector), transformed via marker (2 or 3 channels)
-            kNormalVector,
-
-            // Local position, transformed via marker (2 or 3 channels)
-            kPosition,
-        };
-
-        /**
-         *  markerName is not copied by the Attribute, so it must outlive this struct.
-         *  It is copied when this Attribute is passed to the Builder constructor.
-         */
-        Attribute(Type t = Type::kFloat, Usage u = Usage::kRaw, const char* markerName = nullptr);
-
-        bool operator==(const Attribute& that) const {
-            return fType == that.fType && fUsage == that.fUsage && fMarkerID == that.fMarkerID;
-        }
-        bool operator!=(const Attribute& that) const { return !(*this == that); }
-
-        // Number of channels that will be produced for the SkRuntimeEffect to consume.
-        // May not match the number of channels in fType. For example, kVector Attributes always
-        // produce three channels, even if the input is kFloat2.
-        int channelCount() const;
-        size_t bytesPerVertex() const;
-        bool isValid() const;
-
-        Type        fType;
-        Usage       fUsage;
-        uint32_t    fMarkerID;
-        const char* fMarkerName;  // Preserved for serialization and debugging
-    };
-
     enum BuilderFlags {
         kHasTexCoords_BuilderFlag   = 1 << 0,
         kHasColors_BuilderFlag      = 1 << 1,
@@ -127,21 +63,11 @@
     public:
         Builder(VertexMode mode, int vertexCount, int indexCount, uint32_t flags);
 
-        // EXPERIMENTAL -- do not call if you care what happens
-        Builder(VertexMode mode,
-                int vertexCount,
-                int indexCount,
-                const Attribute* attrs,
-                int attrCount);
-
         bool isValid() const { return fVertices != nullptr; }
 
         SkPoint* positions();
         uint16_t* indices();        // returns null if there are no indices
 
-        // if we have texCoords or colors, this will always be null
-        void* customData();         // returns null if there are no custom attributes
-
         // If we have custom attributes, these will always be null
         SkPoint* texCoords();       // returns null if there are no texCoords
         SkColor* colors();          // returns null if there are no colors
@@ -190,17 +116,14 @@
     uint32_t fUniqueID;
 
     // these point inside our allocation, so none of these can be "freed"
-    Attribute*   fAttributes;       // [attributeCount] or null
     SkPoint*     fPositions;        // [vertexCount]
     uint16_t*    fIndices;          // [indexCount] or null
-    void*        fCustomData;       // [customDataSize * vertexCount] or null
     SkPoint*     fTexs;             // [vertexCount] or null
     SkColor*     fColors;           // [vertexCount] or null
 
     SkRect  fBounds;    // computed to be the union of the fPositions[]
     int     fVertexCount;
     int     fIndexCount;
-    int     fAttributeCount;
 
     VertexMode fMode;
     // below here is where the actual array data is stored.
diff --git a/include/effects/SkRuntimeEffect.h b/include/effects/SkRuntimeEffect.h
index 90b6303..6e99faf 100644
--- a/include/effects/SkRuntimeEffect.h
+++ b/include/effects/SkRuntimeEffect.h
@@ -75,11 +75,6 @@
         size_t sizeInBytes() const;
     };
 
-    struct Varying {
-        SkString name;
-        int      width;  // 1 - 4 (floats)
-    };
-
     struct Options {
         // For testing purposes, completely disable the inliner. (Normally, Runtime Effects don't
         // run the inliner directly, but they still get an inlining pass once they are painted.)
@@ -172,7 +167,6 @@
 
     ConstIterable<Uniform> uniforms() const { return ConstIterable<Uniform>(fUniforms); }
     ConstIterable<SkString> children() const { return ConstIterable<SkString>(fChildren); }
-    ConstIterable<Varying> varyings() const { return ConstIterable<Varying>(fVaryings); }
 
     // Returns pointer to the named uniform variable's description, or nullptr if not found
     const Uniform* findUniform(const char* name) const;
@@ -204,7 +198,6 @@
                     std::vector<Uniform>&& uniforms,
                     std::vector<SkString>&& children,
                     std::vector<SkSL::SampleUsage>&& sampleUsages,
-                    std::vector<Varying>&& varyings,
                     uint32_t flags);
 
     static Result Make(std::unique_ptr<SkSL::Program> program, SkSL::ProgramKind kind);
@@ -241,7 +234,6 @@
     std::vector<Uniform> fUniforms;
     std::vector<SkString> fChildren;
     std::vector<SkSL::SampleUsage> fSampleUsages;
-    std::vector<Varying>  fVaryings;
 
     SkOnce fColorFilterProgramOnce;
     std::unique_ptr<skvm::Program> fColorFilterProgram;
diff --git a/include/private/SkSLModifiers.h b/include/private/SkSLModifiers.h
index 7582409..a5497b7 100644
--- a/include/private/SkSLModifiers.h
+++ b/include/private/SkSLModifiers.h
@@ -27,7 +27,7 @@
         kFlat_Flag           = 1 <<  4,
         kNoPerspective_Flag  = 1 <<  5,
         kHasSideEffects_Flag = 1 <<  6,
-        kVarying_Flag        = 1 <<  7,
+
         kInline_Flag         = 1 <<  8,
         kNoInline_Flag       = 1 <<  9,
     };
@@ -57,9 +57,6 @@
         if (fFlags & kHasSideEffects_Flag) {
             result += "sk_has_side_effects ";
         }
-        if (fFlags & kVarying_Flag) {
-            result += "varying ";
-        }
         if (fFlags & kNoInline_Flag) {
             result += "noinline ";
         }
diff --git a/resources/sksl/errors/BadModifiers.sksl b/resources/sksl/errors/BadModifiers.sksl
index 8f056e7..17065e2 100644
--- a/resources/sksl/errors/BadModifiers.sksl
+++ b/resources/sksl/errors/BadModifiers.sksl
@@ -1,6 +1,6 @@
-const in out uniform flat noperspective sk_has_side_effects varying inline noinline void func1() {}
+const in out uniform flat noperspective sk_has_side_effects inline noinline void func1() {}
 
-void func2(const in out uniform flat noperspective sk_has_side_effects varying
+void func2(const in out uniform flat noperspective sk_has_side_effects
            inline noinline float test) {}
 
-const in out uniform flat noperspective sk_has_side_effects varying inline noinline float var;
+const in out uniform flat noperspective sk_has_side_effects inline noinline float var;
diff --git a/resources/sksl/errors/ModifiersInStruct.sksl b/resources/sksl/errors/ModifiersInStruct.sksl
index cda500b..ba68d15 100644
--- a/resources/sksl/errors/ModifiersInStruct.sksl
+++ b/resources/sksl/errors/ModifiersInStruct.sksl
@@ -3,5 +3,5 @@
     uniform int b;
     flat half4 c;
     noperspective float4 d;
-    inout varying bool e;
+    inout bool e;
 };
diff --git a/samplecode/Sample3D.cpp b/samplecode/Sample3D.cpp
index 575110a..89cd578 100644
--- a/samplecode/Sample3D.cpp
+++ b/samplecode/Sample3D.cpp
@@ -423,87 +423,6 @@
 };
 DEF_SAMPLE( return new SampleBump3D; )
 
-class SampleVerts3D : public SampleCubeBase {
-    sk_sp<SkRuntimeEffect> fEffect;
-    sk_sp<SkVertices>      fVertices;
-
-public:
-    SampleVerts3D() : SampleCubeBase(kShowLightDome) {}
-
-    SkString name() override { return SkString("verts3d"); }
-
-    void onOnceBeforeDraw() override {
-        using Attr = SkVertices::Attribute;
-        Attr attrs[] = {
-            Attr(Attr::Type::kFloat3, Attr::Usage::kNormalVector),
-        };
-
-        SkVertices::Builder builder(SkVertices::kTriangleFan_VertexMode, 66, 0, attrs, 1);
-
-        SkPoint* pos = builder.positions();
-        SkV3* nrm = (SkV3*)builder.customData();
-
-        SkPoint center = { 200, 200 };
-        SkScalar radius = 200;
-
-        pos[0] = center;
-        nrm[0] = { 0, 0, 1 };
-
-        for (int i = 0; i < 65; ++i) {
-            SkScalar t = (i / 64.0f) * 2 * SK_ScalarPI;
-            SkScalar s = SkScalarSin(t),
-                     c = SkScalarCos(t);
-            pos[i + 1] = center + SkPoint { c * radius, s * radius };
-            nrm[i + 1] = { c, s, 0 };
-        }
-
-        fVertices = builder.detach();
-
-        const char code[] = R"(
-            varying float3 vtx_normal;
-
-            layout (marker=local_to_world)          uniform float4x4 localToWorld;
-            layout (marker=normals(local_to_world)) uniform float4x4 localToWorldAdjInv;
-            uniform float3   lightPos;
-
-            half4 main(float2 p) {
-                float3 norm = normalize(vtx_normal);
-                float3 plane_norm = normalize(localToWorldAdjInv * norm.xyz0).xyz;
-
-                float3 plane_pos = (localToWorld * p.xy01).xyz;
-                float3 light_dir = normalize(lightPos - plane_pos);
-
-                float ambient = 0.2;
-                float dp = dot(plane_norm, light_dir);
-                float scale = min(ambient + max(dp, 0), 1);
-
-                return half4(0.7, 0.9, 0.3, 1) * scale.xxx1;
-            }
-        )";
-        auto [effect, error] = SkRuntimeEffect::Make(SkString(code));
-        if (!effect) {
-            SkDebugf("runtime error %s\n", error.c_str());
-        }
-        fEffect = effect;
-    }
-
-    void drawContent(SkCanvas* canvas, SkColor color, int index, bool drawFront) override {
-        if (!drawFront || !front(canvas->getLocalToDevice())) {
-            return;
-        }
-
-        SkRuntimeShaderBuilder builder(fEffect);
-        builder.uniform("lightPos") = fLight.computeWorldPos(fSphere);
-
-        SkPaint paint;
-        paint.setColor(color);
-        paint.setShader(builder.makeShader(nullptr, true));
-
-        canvas->drawVertices(fVertices, paint);
-    }
-};
-DEF_SAMPLE( return new SampleVerts3D; )
-
 #include "modules/skottie/include/Skottie.h"
 
 class SampleSkottieCube : public SampleCubeBase {
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp
index a3e9dad..d21c503 100644
--- a/src/core/SkCanvas.cpp
+++ b/src/core/SkCanvas.cpp
@@ -1799,27 +1799,6 @@
     // We expect fans to be converted to triangles when building or deserializing SkVertices.
     SkASSERT(vertices->priv().mode() != SkVertices::kTriangleFan_VertexMode);
 
-    // If the vertices contain custom attributes, ensure they line up with the paint's shader.
-    const SkRuntimeEffect* effect =
-            paint.getShader() ? as_SB(paint.getShader())->asRuntimeEffect() : nullptr;
-    if ((size_t)vertices->priv().attributeCount() != (effect ? effect->varyings().count() : 0)) {
-        return;
-    }
-    if (effect) {
-        int attrIndex = 0;
-        for (const auto& v : effect->varyings()) {
-            const SkVertices::Attribute& attr(vertices->priv().attributes()[attrIndex++]);
-            // Mismatch between the SkSL varying and the vertex shader output for this attribute
-            if (attr.channelCount() != v.width) {
-                return;
-            }
-            // If we can't provide any of the asked-for matrices, we can't draw this
-            if (attr.fMarkerID && !fMarkerStack->findMarker(attr.fMarkerID, nullptr)) {
-                return;
-            }
-        }
-    }
-
 #ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK
     // Preserve legacy behavior for Android: ignore the SkShader if there are no texCoords present
     if (paint.getShader() &&
diff --git a/src/core/SkDraw.h b/src/core/SkDraw.h
index f190f4c..8e7aaa3 100644
--- a/src/core/SkDraw.h
+++ b/src/core/SkDraw.h
@@ -128,8 +128,6 @@
     void drawBitmapAsMask(const SkBitmap&, const SkSamplingOptions&, const SkPaint&) const;
     void draw_fixed_vertices(const SkVertices*, SkBlendMode, const SkPaint&, const SkMatrix&,
                              const SkPoint dev2[], const SkPoint3 dev3[], SkArenaAlloc*) const;
-    void draw_vdata_vertices(const SkVertices*, const SkPaint&, const SkMatrix&,
-                             const SkPoint[], const SkPoint3[], SkArenaAlloc*) const;
 
     void drawPath(const SkPath&,
                   const SkPaint&,
diff --git a/src/core/SkDraw_vertices.cpp b/src/core/SkDraw_vertices.cpp
index fca9aad..f7ff3e4 100644
--- a/src/core/SkDraw_vertices.cpp
+++ b/src/core/SkDraw_vertices.cpp
@@ -268,7 +268,6 @@
                                  const SkPoint dev2[], const SkPoint3 dev3[],
                                  SkArenaAlloc* outerAlloc) const {
     SkVerticesPriv info(vertices->priv());
-    SkASSERT(!info.hasCustomData());
 
     const int vertexCount = info.vertexCount();
     const int indexCount = info.indexCount();
@@ -416,13 +415,6 @@
     }
 }
 
-void SkDraw::draw_vdata_vertices(const SkVertices* vt, const SkPaint& paint,
-                                 const SkMatrix& ctmInv,
-                                 const SkPoint dev2[], const SkPoint3 dev3[],
-                                 SkArenaAlloc* outerAlloc) const {
-    // TODO: Handle custom attributes
-}
-
 void SkDraw::drawVertices(const SkVertices* vertices, SkBlendMode bmode,
                           const SkPaint& paint) const {
     SkVerticesPriv info(vertices->priv());
@@ -467,9 +459,5 @@
         }
     }
 
-    if (!info.hasCustomData()) {
-        this->draw_fixed_vertices(vertices, bmode, paint, ctmInv, dev2, dev3, &outerAlloc);
-    } else {
-        this->draw_vdata_vertices(vertices, paint, ctmInv, dev2, dev3, &outerAlloc);
-    }
+    this->draw_fixed_vertices(vertices, bmode, paint, ctmInv, dev2, dev3, &outerAlloc);
 }
diff --git a/src/core/SkPicturePriv.h b/src/core/SkPicturePriv.h
index 4dc5bce..3f87424 100644
--- a/src/core/SkPicturePriv.h
+++ b/src/core/SkPicturePriv.h
@@ -106,10 +106,11 @@
         kMatrixImageFilterSampling_Version  = 83,
         kImageFilterImageSampling_Version   = 84,
         kNoFilterQualityShaders_Version     = 85,
+        kVerticesRemoveCustomData_Version   = 86,
 
         // Only SKPs within the min/current picture version range (inclusive) can be read.
         kMin_Version     = kEdgeAAQuadColor4f_Version,
-        kCurrent_Version = kNoFilterQualityShaders_Version
+        kCurrent_Version = kVerticesRemoveCustomData_Version
     };
 
     static_assert(SkPicturePriv::kMin_Version <= SkPicturePriv::kCubicResamplerImageShader_Version,
diff --git a/src/core/SkRuntimeEffect.cpp b/src/core/SkRuntimeEffect.cpp
index fb8a614..b6055fc 100644
--- a/src/core/SkRuntimeEffect.cpp
+++ b/src/core/SkRuntimeEffect.cpp
@@ -209,7 +209,7 @@
     // can sample children with matrices or explicit coords. Because the children are color filters,
     // we know (by induction) that they don't use those coords, so we keep the overall invariant.
     //
-    // Further down, we also ensure that color filters can't use varyings or layout(marker), which
+    // Further down, we also ensure that color filters can't use layout(marker), which
     // would allow them to change behavior based on the CTM.
     // TODO(skbug.com/11813): When ProgramKind is always kRuntimeColorFilter or kRuntimeShader,
     // this can be simpler. There is no way for color filters to refer to sk_FragCoord or sample
@@ -223,12 +223,11 @@
     std::vector<Uniform> uniforms;
     std::vector<SkString> children;
     std::vector<SkSL::SampleUsage> sampleUsages;
-    std::vector<Varying> varyings;
     const SkSL::Context& ctx(compiler->context());
 
     // Go through program elements, pulling out information that we need
     for (const SkSL::ProgramElement* elem : program->elements()) {
-        // Variables (uniform, varying, etc.)
+        // Variables (uniform, etc.)
         if (elem->is<SkSL::GlobalVarDeclaration>()) {
             const SkSL::GlobalVarDeclaration& global = elem->as<SkSL::GlobalVarDeclaration>();
             const SkSL::VarDeclaration& varDecl = global.declaration()->as<SkSL::VarDeclaration>();
@@ -236,16 +235,8 @@
             const SkSL::Variable& var = varDecl.var();
             const SkSL::Type& varType = var.type();
 
-            // Varyings (only used in conjunction with drawVertices)
-            if (var.modifiers().fFlags & SkSL::Modifiers::kVarying_Flag) {
-                flags &= ~kAllowColorFilter_Flag;
-                varyings.push_back({var.name(),
-                                    varType.typeKind() == SkSL::Type::TypeKind::kVector
-                                            ? varType.columns()
-                                            : 1});
-            }
             // Child effects that can be sampled ('shader' or 'colorFilter')
-            else if (varType.isEffectChild()) {
+            if (varType.isEffectChild()) {
                 children.push_back(var.name());
                 sampleUsages.push_back(SkSL::Analysis::GetSampleUsage(
                         *program, var, sampleCoordsUsage.fWrite != 0));
@@ -300,7 +291,6 @@
                                                       std::move(uniforms),
                                                       std::move(children),
                                                       std::move(sampleUsages),
-                                                      std::move(varyings),
                                                       flags));
     return Result{std::move(effect), SkString()};
 }
@@ -404,7 +394,6 @@
                                  std::vector<Uniform>&& uniforms,
                                  std::vector<SkString>&& children,
                                  std::vector<SkSL::SampleUsage>&& sampleUsages,
-                                 std::vector<Varying>&& varyings,
                                  uint32_t flags)
         : fHash(SkGoodHash()(sksl))
         , fSkSL(std::move(sksl))
@@ -413,7 +402,6 @@
         , fUniforms(std::move(uniforms))
         , fChildren(std::move(children))
         , fSampleUsages(std::move(sampleUsages))
-        , fVaryings(std::move(varyings))
         , fFlags(flags) {
     SkASSERT(fBaseProgram);
     SkASSERT(fChildren.size() == fSampleUsages.size());
diff --git a/src/core/SkVertices.cpp b/src/core/SkVertices.cpp
index 8933c6a..972ccd8 100644
--- a/src/core/SkVertices.cpp
+++ b/src/core/SkVertices.cpp
@@ -29,107 +29,19 @@
     return id;
 }
 
-SkVertices::Attribute::Attribute(Type t, Usage u, const char* markerName)
-        : fType(t)
-        , fUsage(u)
-        , fMarkerName(markerName) {
-    fMarkerID = fMarkerName ? SkOpts::hash_fn(fMarkerName, strlen(fMarkerName), 0) : 0;
-    SkASSERT(!fMarkerName || fMarkerID != 0);
-}
-
-int SkVertices::Attribute::channelCount() const {
-    SkASSERT(this->isValid());
-    switch (fUsage) {
-        case Usage::kRaw:          break;
-        case Usage::kColor:        return 4;
-        case Usage::kVector:       return 3;
-        case Usage::kNormalVector: return 3;
-        case Usage::kPosition:     return 3;
-    }
-    switch (fType) {
-        case Type::kFloat:       return 1;
-        case Type::kFloat2:      return 2;
-        case Type::kFloat3:      return 3;
-        case Type::kFloat4:      return 4;
-        case Type::kByte4_unorm: return 4;
-    }
-    SkUNREACHABLE;
-}
-
-size_t SkVertices::Attribute::bytesPerVertex() const {
-    switch (fType) {
-        case Type::kFloat:       return 1 * sizeof(float);
-        case Type::kFloat2:      return 2 * sizeof(float);
-        case Type::kFloat3:      return 3 * sizeof(float);
-        case Type::kFloat4:      return 4 * sizeof(float);
-        case Type::kByte4_unorm: return 4 * sizeof(uint8_t);
-    }
-    SkUNREACHABLE;
-}
-
-bool SkVertices::Attribute::isValid() const {
-    if (fMarkerName && !SkCanvasPriv::ValidateMarker(fMarkerName)) {
-        return false;
-    }
-    switch (fUsage) {
-        case Usage::kRaw:
-            return fMarkerID == 0;
-        case Usage::kColor:
-            return fMarkerID == 0 && (fType == Type::kFloat3 || fType == Type::kFloat4 ||
-                                      fType == Type::kByte4_unorm);
-        case Usage::kVector:
-        case Usage::kNormalVector:
-        case Usage::kPosition:
-            return fType == Type::kFloat2 || fType == Type::kFloat3;
-    }
-    SkUNREACHABLE;
-}
-
-static size_t custom_data_size(const SkVertices::Attribute* attrs, int attrCount) {
-    size_t size = 0;
-    for (int i = 0; i < attrCount; ++i) {
-        size += attrs[i].bytesPerVertex();
-    }
-    return size;
-}
-
 struct SkVertices::Desc {
     VertexMode  fMode;
     int         fVertexCount,
                 fIndexCount;
     bool        fHasTexs,
                 fHasColors;
-
-    const Attribute* fAttributes;
-    int              fAttributeCount;
-
-    void validate() const {
-        SkASSERT(fAttributeCount == 0 || (!fHasTexs && !fHasColors));
-    }
 };
 
 struct SkVertices::Sizes {
     Sizes(const Desc& desc) {
-        desc.validate();
-
         SkSafeMath safe;
 
-        fNameSize = 0;
-        for (int i = 0; i < desc.fAttributeCount; ++i) {
-            const Attribute& attr(desc.fAttributes[i]);
-            if (!attr.isValid()) {
-                return;
-            }
-            if (attr.fMarkerName) {
-                fNameSize = safe.add(fNameSize, strlen(attr.fMarkerName) + 1 /*null terminator*/);
-            }
-        }
-        fNameSize = SkAlign4(fNameSize);
-
-        fAttrSize = safe.mul(desc.fAttributeCount, sizeof(Attribute));
         fVSize = safe.mul(desc.fVertexCount, sizeof(SkPoint));
-        fDSize = safe.mul(custom_data_size(desc.fAttributes, desc.fAttributeCount),
-                          desc.fVertexCount);
         fTSize = desc.fHasTexs ? safe.mul(desc.fVertexCount, sizeof(SkPoint)) : 0;
         fCSize = desc.fHasColors ? safe.mul(desc.fVertexCount, sizeof(SkColor)) : 0;
 
@@ -157,16 +69,13 @@
         }
 
         fTotal = safe.add(sizeof(SkVertices),
-                 safe.add(fAttrSize,
-                 safe.add(fNameSize,
                  safe.add(fVSize,
-                 safe.add(fDSize,
                  safe.add(fTSize,
                  safe.add(fCSize,
-                          fISize)))))));
+                          fISize))));
 
         if (safe.ok()) {
-            fArrays = fVSize + fDSize + fTSize + fCSize + fISize;  // just the sum of the arrays
+            fArrays = fVSize + fTSize + fCSize + fISize;  // just the sum of the arrays
         } else {
             sk_bzero(this, sizeof(*this));
         }
@@ -175,11 +84,8 @@
     bool isValid() const { return fTotal != 0; }
 
     size_t fTotal = 0;  // size of entire SkVertices allocation (obj + arrays)
-    size_t fAttrSize;  // size of attributes
-    size_t fNameSize;  // size of attribute marker names
     size_t fArrays; // size of all the data arrays (V + D + T + C + I)
     size_t fVSize;
-    size_t fDSize;  // size of all customData = [customDataSize * fVertexCount]
     size_t fTSize;
     size_t fCSize;
     size_t fISize;
@@ -193,18 +99,7 @@
                              uint32_t builderFlags) {
     bool hasTexs = SkToBool(builderFlags & SkVertices::kHasTexCoords_BuilderFlag);
     bool hasColors = SkToBool(builderFlags & SkVertices::kHasColors_BuilderFlag);
-    this->init({mode, vertexCount, indexCount, hasTexs, hasColors, nullptr, 0});
-}
-
-SkVertices::Builder::Builder(VertexMode mode,
-                             int vertexCount,
-                             int indexCount,
-                             const SkVertices::Attribute* attrs,
-                             int attrCount) {
-    if (attrCount <= 0 || attrCount > kMaxCustomAttributes || !attrs) {
-        return;
-    }
-    this->init({mode, vertexCount, indexCount, false, false, attrs, attrCount});
+    this->init({mode, vertexCount, indexCount, hasTexs, hasColors});
 }
 
 SkVertices::Builder::Builder(const Desc& desc) {
@@ -235,31 +130,13 @@
         return new_ptr;
     };
 
-    fVertices->fAttributes = (Attribute*)advance(sizes.fAttrSize);
-    char* markerNames      =             advance(sizes.fNameSize);
-
-    // Copy the attributes into our block of memory (immediately after the SkVertices)
-    sk_careful_memcpy(fVertices->fAttributes, desc.fAttributes,
-                      desc.fAttributeCount * sizeof(Attribute));
-
-    // Now copy the marker names, and fix up the pointers in our attributes
-    for (int i = 0; i < desc.fAttributeCount; ++i) {
-        Attribute& attr(fVertices->fAttributes[i]);
-        if (attr.fMarkerName) {
-            attr.fMarkerName = strcpy(markerNames, attr.fMarkerName);
-            markerNames += (strlen(markerNames) + 1 /*null terminator*/);
-        }
-    }
-
     fVertices->fPositions      = (SkPoint*) advance(sizes.fVSize);
-    fVertices->fCustomData     = (void*)    advance(sizes.fDSize);
     fVertices->fTexs           = (SkPoint*) advance(sizes.fTSize);
     fVertices->fColors         = (SkColor*) advance(sizes.fCSize);
     fVertices->fIndices        = (uint16_t*)advance(sizes.fISize);
 
     fVertices->fVertexCount    = desc.fVertexCount;
     fVertices->fIndexCount     = desc.fIndexCount;
-    fVertices->fAttributeCount = desc.fAttributeCount;
     fVertices->fMode           = desc.fMode;
 
     // We defer assigning fBounds and fUniqueID until detach() is called
@@ -299,10 +176,6 @@
     return fVertices ? const_cast<SkPoint*>(fVertices->fPositions) : nullptr;
 }
 
-void* SkVertices::Builder::customData() {
-    return fVertices ? const_cast<void*>(fVertices->fCustomData) : nullptr;
-}
-
 SkPoint* SkVertices::Builder::texCoords() {
     return fVertices ? const_cast<SkPoint*>(fVertices->fTexs) : nullptr;
 }
@@ -327,7 +200,7 @@
                                        const SkPoint pos[], const SkPoint texs[],
                                        const SkColor colors[],
                                        int indexCount, const uint16_t indices[]) {
-    auto desc = Desc{mode, vertexCount, indexCount, !!texs, !!colors, nullptr, 0};
+    auto desc = Desc{mode, vertexCount, indexCount, !!texs, !!colors};
     Builder builder(desc);
     if (!builder.isValid()) {
         return nullptr;
@@ -349,25 +222,11 @@
 }
 
 SkVertices::Sizes SkVertices::getSizes() const {
-    Sizes sizes(
-            {fMode, fVertexCount, fIndexCount, !!fTexs, !!fColors, fAttributes, fAttributeCount});
+    Sizes sizes({fMode, fVertexCount, fIndexCount, !!fTexs, !!fColors});
     SkASSERT(sizes.isValid());
     return sizes;
 }
 
-size_t SkVerticesPriv::customDataSize() const {
-    return custom_data_size(fVertices->fAttributes, fVertices->fAttributeCount);
-}
-
-bool SkVerticesPriv::hasUsage(SkVertices::Attribute::Usage u) const {
-    for (int i = 0; i < fVertices->fAttributeCount; ++i) {
-        if (fVertices->fAttributes[i].fUsage == u) {
-            return true;
-        }
-    }
-    return false;
-}
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
 // storage = packed | vertex_count | index_count | attr_count
@@ -395,18 +254,9 @@
     buffer.writeUInt(packed);
     buffer.writeInt(fVertices->fVertexCount);
     buffer.writeInt(fVertices->fIndexCount);
-    buffer.writeInt(fVertices->fAttributeCount);
-
-    // Attribute metadata
-    for (int i = 0; i < fVertices->fAttributeCount; ++i) {
-        buffer.writeInt(static_cast<int>(fVertices->fAttributes[i].fType));
-        buffer.writeInt(static_cast<int>(fVertices->fAttributes[i].fUsage));
-        buffer.writeString(fVertices->fAttributes[i].fMarkerName);
-    }
 
     // Data arrays
     buffer.writeByteArray(fVertices->fPositions, sizes.fVSize);
-    buffer.writeByteArray(fVertices->fCustomData, sizes.fDSize);
     buffer.writeByteArray(fVertices->fTexs, sizes.fTSize);
     buffer.writeByteArray(fVertices->fColors, sizes.fCSize);
     // if index-count is odd, we won't be 4-bytes aligned, so we call the pad version
@@ -424,44 +274,24 @@
 
     auto decode = [](SkReadBuffer& buffer) -> sk_sp<SkVertices> {
         SkSafeRange safe;
+        bool hasCustomData = buffer.isVersionLT(SkPicturePriv::kVerticesRemoveCustomData_Version);
 
         const uint32_t packed = buffer.readUInt();
         const int vertexCount = safe.checkGE(buffer.readInt(), 0);
         const int indexCount = safe.checkGE(buffer.readInt(), 0);
-        const int attrCount = safe.checkGE(buffer.readInt(), 0);
+        const int attrCount = hasCustomData ? safe.checkGE(buffer.readInt(), 0) : 0;
         const SkVertices::VertexMode mode = safe.checkLE<SkVertices::VertexMode>(
                 packed & kMode_Mask, SkVertices::kLast_VertexMode);
         const bool hasTexs = SkToBool(packed & kHasTexs_Mask);
         const bool hasColors = SkToBool(packed & kHasColors_Mask);
 
-        if (!safe                                           // Invalid header fields
-            || attrCount > SkVertices::kMaxCustomAttributes // Too many custom attributes?
-            || (attrCount > 0 && (hasTexs || hasColors))) { // Overspecified (incompatible features)
+        // Check that the header fields and buffer are valid. If this is data with the experimental
+        // custom attributes feature - we don't support that any more.
+        if (!safe || !buffer.isValid() || attrCount) {
             return nullptr;
         }
 
-        SkVertices::Attribute attrs[SkVertices::kMaxCustomAttributes];
-        SkString attrNames[SkVertices::kMaxCustomAttributes];
-        for (int i = 0; i < attrCount; ++i) {
-            auto type = buffer.checkRange(SkVertices::Attribute::Type::kFloat,
-                                          SkVertices::Attribute::Type::kByte4_unorm);
-            auto usage = buffer.checkRange(SkVertices::Attribute::Usage::kRaw,
-                                           SkVertices::Attribute::Usage::kPosition);
-            buffer.readString(&attrNames[i]);
-            const char* markerName = attrNames[i].isEmpty() ? nullptr : attrNames[i].c_str();
-            if (markerName && !SkCanvasPriv::ValidateMarker(markerName)) {
-                return nullptr;
-            }
-            attrs[i] = SkVertices::Attribute(type, usage, markerName);
-        }
-
-        // Ensure that all of the attribute metadata was valid before proceeding
-        if (!buffer.isValid()) {
-            return nullptr;
-        }
-
-        const SkVertices::Desc desc{mode, vertexCount, indexCount, hasTexs, hasColors,
-                                    attrCount ? attrs : nullptr, attrCount};
+        const SkVertices::Desc desc{mode, vertexCount, indexCount, hasTexs, hasColors};
         SkVertices::Sizes sizes(desc);
         if (!sizes.isValid()) {
             return nullptr;
@@ -473,7 +303,13 @@
         }
 
         buffer.readByteArray(builder.positions(), sizes.fVSize);
-        buffer.readByteArray(builder.customData(), sizes.fDSize);
+        if (hasCustomData) {
+            size_t customDataSize = 0;
+            buffer.skipByteArray(&customDataSize);
+            if (customDataSize != 0) {
+                return nullptr;
+            }
+        }
         buffer.readByteArray(builder.texCoords(), sizes.fTSize);
         buffer.readByteArray(builder.colors(), sizes.fCSize);
         size_t isize = (mode == SkVertices::kTriangleFan_VertexMode) ? sizes.fBuilderTriFanISize
diff --git a/src/core/SkVerticesPriv.h b/src/core/SkVerticesPriv.h
index 73b1a31..3aa0411 100644
--- a/src/core/SkVerticesPriv.h
+++ b/src/core/SkVerticesPriv.h
@@ -22,24 +22,17 @@
 public:
     SkVertices::VertexMode mode() const { return fVertices->fMode; }
 
-    bool hasCustomData() const { return SkToBool(fVertices->fCustomData); }
     bool hasColors() const { return SkToBool(fVertices->fColors); }
     bool hasTexCoords() const { return SkToBool(fVertices->fTexs); }
     bool hasIndices() const { return SkToBool(fVertices->fIndices); }
 
-    bool hasUsage(SkVertices::Attribute::Usage) const;
-
     int vertexCount() const { return fVertices->fVertexCount; }
     int indexCount() const { return fVertices->fIndexCount; }
-    int attributeCount() const { return fVertices->fAttributeCount; }
-    size_t customDataSize() const;
 
     const SkPoint* positions() const { return fVertices->fPositions; }
-    const void* customData() const { return fVertices->fCustomData; }
     const SkPoint* texCoords() const { return fVertices->fTexs; }
     const SkColor* colors() const { return fVertices->fColors; }
     const uint16_t* indices() const { return fVertices->fIndices; }
-    const SkVertices::Attribute* attributes() const { return fVertices->fAttributes; }
 
     // Never called due to RVO in priv(), but must exist for MSVC 2017.
     SkVerticesPriv(const SkVerticesPriv&) = default;
diff --git a/src/gpu/ops/GrDrawVerticesOp.cpp b/src/gpu/ops/GrDrawVerticesOp.cpp
index 4000a67..29ce6ed 100644
--- a/src/gpu/ops/GrDrawVerticesOp.cpp
+++ b/src/gpu/ops/GrDrawVerticesOp.cpp
@@ -37,76 +37,6 @@
     kExplicit,
 };
 
-static GrVertexAttribType SkVerticesAttributeToGrVertexAttribType(const SkVertices::Attribute& a) {
-    switch (a.fType) {
-        case SkVertices::Attribute::Type::kFloat:       return kFloat_GrVertexAttribType;
-        case SkVertices::Attribute::Type::kFloat2:      return kFloat2_GrVertexAttribType;
-        case SkVertices::Attribute::Type::kFloat3:      return kFloat3_GrVertexAttribType;
-        case SkVertices::Attribute::Type::kFloat4:      return kFloat4_GrVertexAttribType;
-        case SkVertices::Attribute::Type::kByte4_unorm: return kUByte4_norm_GrVertexAttribType;
-    }
-    SkUNREACHABLE;
-}
-
-static GrSLType SkVerticesAttributeToGrSLType(const SkVertices::Attribute& a) {
-    switch (a.fType) {
-        case SkVertices::Attribute::Type::kFloat:       return kFloat_GrSLType;
-        case SkVertices::Attribute::Type::kFloat2:      return kFloat2_GrSLType;
-        case SkVertices::Attribute::Type::kFloat3:      return kFloat3_GrSLType;
-        case SkVertices::Attribute::Type::kFloat4:      return kFloat4_GrSLType;
-        case SkVertices::Attribute::Type::kByte4_unorm: return kHalf4_GrSLType;
-    }
-    SkUNREACHABLE;
-}
-
-static bool AttributeUsesViewMatrix(const SkVertices::Attribute& attr) {
-    return (attr.fMarkerID == 0) && (attr.fUsage == SkVertices::Attribute::Usage::kVector ||
-                                     attr.fUsage == SkVertices::Attribute::Usage::kNormalVector ||
-                                     attr.fUsage == SkVertices::Attribute::Usage::kPosition);
-}
-
-// Container for a collection of [uint32_t, Matrix] pairs. For a GrDrawVerticesOp whose custom
-// attributes reference some set of IDs, this stores the actual values of those matrices,
-// at the time the Op is created.
-class MarkedMatrices {
-public:
-    // For each ID required by 'info', fetch the value of that matrix from 'matrixProvider'.
-    // For vectors/normals/positions, we let ID 0 refer to the canvas CTM matrix.
-    void gather(const SkVerticesPriv& info, const SkMatrixProvider& matrixProvider) {
-        for (int i = 0; i < info.attributeCount(); ++i) {
-            uint32_t id = info.attributes()[i].fMarkerID;
-            if (id != 0 || AttributeUsesViewMatrix(info.attributes()[i])) {
-                if (std::none_of(fMatrices.begin(), fMatrices.end(),
-                                 [id](const auto& m) { return m.first == id; })) {
-                    SkM44 matrix;
-                    // SkCanvas should guarantee that this succeeds.
-                    SkAssertResult(matrixProvider.getLocalToMarker(id, &matrix));
-                    fMatrices.emplace_back(id, matrix);
-                }
-            }
-        }
-    }
-
-    SkM44 get(uint32_t id) const {
-        for (const auto& m : fMatrices) {
-            if (m.first == id) {
-                return m.second;
-            }
-        }
-        SkASSERT(false);
-        return SkM44{};
-    }
-
-    bool operator==(const MarkedMatrices& that) const { return fMatrices == that.fMatrices; }
-    bool operator!=(const MarkedMatrices& that) const { return !(*this == that); }
-
-private:
-    // If we expected many MarkerIDs, this should be a hash table. As it is, we're bounded by
-    // SkVertices::kMaxCustomAttributes (which is 8). Realistically, we're never going to see
-    // more than 1 or 2 unique MarkerIDs, so rely on linear search when inserting and fetching.
-    std::vector<std::pair<uint32_t, SkM44>> fMatrices;
-};
-
 class VerticesGP : public GrGeometryProcessor {
 public:
     static GrGeometryProcessor* Make(SkArenaAlloc* arena,
@@ -114,14 +44,10 @@
                                      ColorArrayType colorArrayType,
                                      const SkPMColor4f& color,
                                      sk_sp<GrColorSpaceXform> colorSpaceXform,
-                                     const SkMatrix& viewMatrix,
-                                     const SkVertices::Attribute* attrs,
-                                     int attrCount,
-                                     const MarkedMatrices* customMatrices) {
+                                     const SkMatrix& viewMatrix) {
         return arena->make([&](void* ptr) {
             return new (ptr) VerticesGP(localCoordsType, colorArrayType, color,
-                                        std::move(colorSpaceXform), viewMatrix, attrs, attrCount,
-                                        customMatrices);
+                                        std::move(colorSpaceXform), viewMatrix);
         });
     }
 
@@ -192,111 +118,6 @@
                                                                           : gp.positionAttr();
             gpArgs->fLocalCoordVar = coordsAttr.asShaderVar();
 
-            // Add varyings and globals for all custom attributes
-            using Usage = SkVertices::Attribute::Usage;
-            for (size_t i = kFirstCustomIndex; i < gp.fAttributes.size(); ++i) {
-                const auto& attr(gp.fAttributes[i]);
-                const int customIdx = i - kFirstCustomIndex;
-                const auto& customAttr(gp.fCustomAttributes[customIdx]);
-
-                GrSLType varyingType = attr.gpuType();
-                SkString varyingIn(attr.name());
-
-                UniformHandle matrixHandle;
-                if (customAttr.fMarkerID || AttributeUsesViewMatrix(customAttr)) {
-                    bool normal = customAttr.fUsage == Usage::kNormalVector;
-                    for (const MarkedUniform& matrixUni : fCustomMatrixUniforms) {
-                        if (matrixUni.fID == customAttr.fMarkerID && matrixUni.fNormal == normal) {
-                            matrixHandle = matrixUni.fUniform;
-                            break;
-                        }
-                    }
-                    if (!matrixHandle.isValid()) {
-                        SkString uniName = SkStringPrintf("customMatrix_%x%s", customAttr.fMarkerID,
-                                                          normal ? "_IT" : "");
-                        matrixHandle = uniformHandler->addUniform(
-                                nullptr, kVertex_GrShaderFlag,
-                                normal ? kFloat3x3_GrSLType : kFloat4x4_GrSLType, uniName.c_str());
-                        fCustomMatrixUniforms.push_back(
-                                {customAttr.fMarkerID, normal, matrixHandle});
-                    }
-                }
-
-                switch (customAttr.fUsage) {
-                    case Usage::kRaw:
-                        break;
-                    case Usage::kColor: {
-                        // For RGB colors, expand to RGBA with A = 1
-                        if (attr.gpuType() == kFloat3_GrSLType) {
-                            varyingIn = SkStringPrintf("%s.rgb1", attr.name());
-                        }
-                        // Convert to half (as expected by the color space transform functions)
-                        varyingIn = SkStringPrintf("half4(%s)", varyingIn.c_str());
-                        // Transform to destination color space (possible no-op)
-                        SkString xformedColor;
-                        vertBuilder->appendColorGamutXform(&xformedColor, varyingIn.c_str(),
-                                                           &fColorSpaceHelper);
-                        // Store the result of the transform in a temporary
-                        vertBuilder->codeAppendf(
-                                "half4 _tmp_clr_%d = %s;", customIdx, xformedColor.c_str());
-                        // Finally, premultiply
-                        varyingIn = SkStringPrintf(
-                                "half4(_tmp_clr_%d.rgb * _tmp_clr_%d.a, _tmp_clr_%d.a)",
-                                customIdx, customIdx, customIdx);
-                        varyingType = kHalf4_GrSLType;
-                        break;
-                    }
-                    case Usage::kVector: {
-                        if (attr.gpuType() == kFloat2_GrSLType) {
-                            varyingIn = SkStringPrintf("%s.xy0", attr.name());
-                        }
-                        if (matrixHandle.isValid()) {
-                            varyingIn = SkStringPrintf("(%s * %s.xyz0).xyz",
-                                                       uniformHandler->getUniformCStr(matrixHandle),
-                                                       varyingIn.c_str());
-                        }
-                        varyingIn = SkStringPrintf("normalize(%s)", varyingIn.c_str());
-                        varyingType = kFloat3_GrSLType;
-                        break;
-                    }
-                    case Usage::kNormalVector: {
-                        if (attr.gpuType() == kFloat2_GrSLType) {
-                            varyingIn = SkStringPrintf("%s.xy0", attr.name());
-                        }
-                        if (matrixHandle.isValid()) {
-                            varyingIn = SkStringPrintf("(%s * %s)",
-                                                       uniformHandler->getUniformCStr(matrixHandle),
-                                                       varyingIn.c_str());
-                        }
-                        varyingIn = SkStringPrintf("normalize(%s)", varyingIn.c_str());
-                        varyingType = kFloat3_GrSLType;
-                        break;
-                    }
-                    case Usage::kPosition: {
-                        if (attr.gpuType() == kFloat2_GrSLType) {
-                            varyingIn = SkStringPrintf("%s.xy0", attr.name());
-                        }
-                        if (matrixHandle.isValid()) {
-                            vertBuilder->codeAppendf("float4 _tmp_pos_%d = %s * %s.xyz1;",
-                                                     customIdx,
-                                                     uniformHandler->getUniformCStr(matrixHandle),
-                                                     varyingIn.c_str());
-                            varyingIn = SkStringPrintf("_tmp_pos_%d.xyz / _tmp_pos_%d.w",
-                                                       customIdx, customIdx);
-                        }
-                        varyingType = kFloat3_GrSLType;
-                    }
-                }
-
-                GrGLSLVarying varying(varyingType);
-                varyingHandler->addVarying(attr.name(), &varying);
-                vertBuilder->codeAppendf("%s = %s;", varying.vsOut(), varyingIn.c_str());
-
-                GrShaderVar var(SkStringPrintf("_vtx_attr_%d", customIdx), varyingType);
-                fragBuilder->declareGlobal(var);
-                fragBuilder->codeAppendf("%s = %s;", var.c_str(), varying.fsIn());
-            }
-
             fragBuilder->codeAppendf("const half4 %s = half4(1);", args.fOutputCoverage);
         }
 
@@ -309,13 +130,6 @@
             key |= ComputeMatrixKey(shaderCaps, vgp.viewMatrix()) << 20;
             b->add32(key);
             b->add32(GrColorSpaceXform::XformKey(vgp.fColorSpaceXform.get()));
-
-            uint32_t usageBits = 0;
-            for (int i = 0; i < vgp.fCustomAttributeCount; ++i) {
-                b->add32(vgp.fCustomAttributes[i].fMarkerID);
-                usageBits = (usageBits << 8) | (uint32_t)vgp.fCustomAttributes[i].fUsage;
-            }
-            b->add32(usageBits);
         }
 
         void setData(const GrGLSLProgramDataManager& pdman,
@@ -331,27 +145,6 @@
             }
 
             fColorSpaceHelper.setData(pdman, vgp.fColorSpaceXform.get());
-
-            for (const auto& matrixUni : fCustomMatrixUniforms) {
-                SkASSERT(matrixUni.fUniform.isValid());
-                SkM44 mtx = vgp.fCustomMatrices->get(matrixUni.fID);
-                if (matrixUni.fNormal) {
-                    // Get the upper-left 3x3 (rotation + scale):
-                    mtx.setCol(3, {0, 0, 0, 1});
-                    mtx.setRow(3, {0, 0, 0, 1});
-                    // Invert it...
-                    SkAssertResult(mtx.invert(&mtx));
-                    // We want the inverse transpose, but we're going to feed it as a 3x3 column
-                    // major matrix to the uniform. So copy the (not-yet-transposed) values out in
-                    // row order.
-                    float mtxIT[9] = {mtx.rc(0, 0), mtx.rc(0, 1), mtx.rc(0, 2),
-                                      mtx.rc(1, 0), mtx.rc(1, 1), mtx.rc(1, 2),
-                                      mtx.rc(2, 0), mtx.rc(2, 1), mtx.rc(2, 2)};
-                    pdman.setMatrix3f(matrixUni.fUniform, mtxIT);
-                } else {
-                    pdman.setSkM44(matrixUni.fUniform, mtx);
-                }
-            }
         }
 
     private:
@@ -361,13 +154,6 @@
         UniformHandle fColorUniform;
         GrGLSLColorSpaceXformHelper fColorSpaceHelper;
 
-        struct MarkedUniform {
-            uint32_t      fID;
-            bool          fNormal;
-            UniformHandle fUniform;
-        };
-        std::vector<MarkedUniform> fCustomMatrixUniforms;
-
         using INHERITED = GrGLSLGeometryProcessor;
     };
 
@@ -384,18 +170,12 @@
                ColorArrayType colorArrayType,
                const SkPMColor4f& color,
                sk_sp<GrColorSpaceXform> colorSpaceXform,
-               const SkMatrix& viewMatrix,
-               const SkVertices::Attribute* attrs,
-               int attrCount,
-               const MarkedMatrices* customMatrices)
+               const SkMatrix& viewMatrix)
             : INHERITED(kVerticesGP_ClassID)
             , fColorArrayType(colorArrayType)
             , fColor(color)
             , fViewMatrix(viewMatrix)
-            , fColorSpaceXform(std::move(colorSpaceXform))
-            , fCustomAttributes(attrs)
-            , fCustomAttributeCount(attrCount)
-            , fCustomMatrices(customMatrices) {
+            , fColorSpaceXform(std::move(colorSpaceXform)) {
         constexpr Attribute missingAttr;
         fAttributes.push_back({"position", kFloat2_GrVertexAttribType, kFloat2_GrSLType});
         fAttributes.push_back(fColorArrayType != ColorArrayType::kUnused
@@ -405,14 +185,6 @@
                         ? Attribute{"inLocalCoord", kFloat2_GrVertexAttribType, kFloat2_GrSLType}
                         : missingAttr);
 
-        for (int i = 0; i < attrCount; ++i) {
-            // Attributes store char*, so allocate long-lived storage for the (dynamic) names
-            fAttrNames.push_back(SkStringPrintf("_vtx_attr%d", i));
-            fAttributes.push_back({fAttrNames.back().c_str(),
-                                   SkVerticesAttributeToGrVertexAttribType(attrs[i]),
-                                   SkVerticesAttributeToGrSLType(attrs[i])});
-        }
-
         this->setVertexAttributes(fAttributes.data(), fAttributes.size());
     }
 
@@ -420,20 +192,14 @@
         kPositionIndex    = 0,
         kColorIndex       = 1,
         kLocalCoordsIndex = 2,
-        kFirstCustomIndex = 3,
     };
 
-    std::vector<SkString> fAttrNames;
     std::vector<Attribute> fAttributes;
     ColorArrayType fColorArrayType;
     SkPMColor4f fColor;
     SkMatrix fViewMatrix;
     sk_sp<GrColorSpaceXform> fColorSpaceXform;
 
-    const SkVertices::Attribute* fCustomAttributes;
-    int                          fCustomAttributeCount;
-    const MarkedMatrices*        fCustomMatrices;
-
     using INHERITED = GrGeometryProcessor;
 };
 
@@ -518,8 +284,7 @@
     size_t vertexStride() const {
         return sizeof(SkPoint) +
                (this->requiresPerVertexColors() ? sizeof(uint32_t) : 0) +
-               (this->requiresPerVertexLocalCoords() ? sizeof(SkPoint) : 0) +
-               fMeshes[0].fVertices->priv().customDataSize();
+               (this->requiresPerVertexLocalCoords() ? sizeof(SkPoint) : 0);
     }
 
     Helper fHelper;
@@ -533,7 +298,6 @@
     LocalCoordsType fLocalCoordsType;
     ColorArrayType fColorArrayType;
     sk_sp<GrColorSpaceXform> fColorSpaceXform;
-    MarkedMatrices fCustomMatrices;
 
     GrSimpleMesh*  fMesh = nullptr;
     GrProgramInfo* fProgramInfo = nullptr;
@@ -564,7 +328,6 @@
                                        : ColorArrayType::kUnused;
     fLocalCoordsType = info.hasTexCoords() ? LocalCoordsType::kExplicit
                                            : LocalCoordsType::kUsePosition;
-    fCustomMatrices.gather(info, matrixProvider);
 
     Mesh& mesh = fMeshes.push_back();
     mesh.fColor = color;
@@ -621,16 +384,11 @@
 GrGeometryProcessor* DrawVerticesOp::makeGP(SkArenaAlloc* arena) {
     const SkMatrix& vm = fMultipleViewMatrices ? SkMatrix::I() : fMeshes[0].fViewMatrix;
 
-    SkVerticesPriv info(fMeshes[0].fVertices->priv());
-
-    sk_sp<GrColorSpaceXform> csxform = (fColorArrayType == ColorArrayType::kSkColor ||
-                                        info.hasUsage(SkVertices::Attribute::Usage::kColor))
-                                               ? fColorSpaceXform
-                                               : nullptr;
+    sk_sp<GrColorSpaceXform> csxform =
+            (fColorArrayType == ColorArrayType::kSkColor) ? fColorSpaceXform : nullptr;
 
     auto gp = VerticesGP::Make(arena, fLocalCoordsType, fColorArrayType, fMeshes[0].fColor,
-                               std::move(csxform), vm, info.attributes(), info.attributeCount(),
-                               &fCustomMatrices);
+                               std::move(csxform), vm);
     SkASSERT(this->vertexStride() == gp->vertexStride());
     return gp;
 }
@@ -692,8 +450,6 @@
         const SkPoint* positions = info.positions();
         const SkColor* colors = info.colors();
         const SkPoint* localCoords = info.texCoords() ? info.texCoords() : positions;
-        const void* custom = info.customData();
-        size_t customDataSize = info.customDataSize();
 
         // TODO4F: Preserve float colors
         GrColor meshColor = mesh.fColor.toBytes_RGBA();
@@ -708,10 +464,6 @@
             if (hasLocalCoordsAttribute) {
                 verts.write(localCoords[i]);
             }
-            if (customDataSize) {
-                verts.writeRaw(custom, customDataSize);
-                custom = SkTAddOffset<const void>(custom, customDataSize);
-            }
         }
 
         if (fMultipleViewMatrices) {
@@ -767,19 +519,6 @@
         return CombineResult::kCannotCombine;
     }
 
-    SkVerticesPriv vThis(this->fMeshes[0].fVertices->priv()),
-                   vThat(that->fMeshes[0].fVertices->priv());
-    if (vThis.attributeCount() != vThat.attributeCount() ||
-        !std::equal(vThis.attributes(), vThis.attributes() + vThis.attributeCount(),
-                    vThat.attributes())) {
-        return CombineResult::kCannotCombine;
-    }
-
-    // We can't batch draws if any of the custom matrices have changed.
-    if (this->fCustomMatrices != that->fCustomMatrices) {
-        return CombineResult::kCannotCombine;
-    }
-
     // We can't mix draws that use SkColor vertex colors with those that don't. We can mix uniform
     // color draws with GrColor draws (by expanding the uniform color into vertex color).
     if ((fColorArrayType == ColorArrayType::kSkColor) !=
diff --git a/src/sksl/SkSLAnalysis.cpp b/src/sksl/SkSLAnalysis.cpp
index 23384a0..2a079f3 100644
--- a/src/sksl/SkSLAnalysis.cpp
+++ b/src/sksl/SkSLAnalysis.cpp
@@ -326,8 +326,7 @@
             case Expression::Kind::kVariableReference: {
                 VariableReference& varRef = expr.as<VariableReference>();
                 const Variable* var = varRef.variable();
-                if (var->modifiers().fFlags & (Modifiers::kConst_Flag | Modifiers::kUniform_Flag |
-                                               Modifiers::kVarying_Flag)) {
+                if (var->modifiers().fFlags & (Modifiers::kConst_Flag | Modifiers::kUniform_Flag)) {
                     fErrors->error(expr.fOffset,
                                    "cannot modify immutable variable '" + var->name() + "'");
                 } else {
@@ -641,8 +640,8 @@
     const Modifiers& modifiers = v.modifiers();
     VariableCounts counts = this->get(v);
     if ((v.storage() != Variable::Storage::kLocal && counts.fRead) ||
-        (modifiers.fFlags & (Modifiers::kIn_Flag | Modifiers::kOut_Flag | Modifiers::kUniform_Flag |
-                             Modifiers::kVarying_Flag))) {
+        (modifiers.fFlags &
+         (Modifiers::kIn_Flag | Modifiers::kOut_Flag | Modifiers::kUniform_Flag))) {
         return false;
     }
     // Consider the variable dead if it's never read and never written (besides the initial-value).
diff --git a/src/sksl/SkSLIRGenerator.cpp b/src/sksl/SkSLIRGenerator.cpp
index d4f7845..33f480d 100644
--- a/src/sksl/SkSLIRGenerator.cpp
+++ b/src/sksl/SkSLIRGenerator.cpp
@@ -344,21 +344,10 @@
                                         "float3, or float4 variables");
         }
     }
-    if (modifiers.fFlags & Modifiers::kVarying_Flag) {
-        if (this->programKind() != ProgramKind::kRuntimeEffect &&
-            this->programKind() != ProgramKind::kRuntimeShader) {
-            this->errorReporter().error(offset, "'varying' is only permitted in runtime shaders");
-        }
-        if (!baseType->isFloat() &&
-            !(baseType->isVector() && baseType->componentType().isFloat())) {
-            this->errorReporter().error(offset, "'varying' must be float scalar or vector");
-        }
-    }
     int permitted = Modifiers::kConst_Flag;
     if (storage == Variable::Storage::kGlobal) {
         permitted |= Modifiers::kIn_Flag | Modifiers::kOut_Flag | Modifiers::kUniform_Flag |
-                     Modifiers::kFlat_Flag | Modifiers::kVarying_Flag |
-                     Modifiers::kNoPerspective_Flag;
+                     Modifiers::kFlat_Flag | Modifiers::kNoPerspective_Flag;
     }
     // TODO(skbug.com/11301): Migrate above checks into building a mask of permitted layout flags
     this->checkModifiers(offset, modifiers, permitted, /*permittedLayoutFlags=*/~0);
@@ -845,7 +834,6 @@
     checkModifier(Modifiers::kFlat_Flag,           "flat");
     checkModifier(Modifiers::kNoPerspective_Flag,  "noperspective");
     checkModifier(Modifiers::kHasSideEffects_Flag, "sk_has_side_effects");
-    checkModifier(Modifiers::kVarying_Flag,        "varying");
     checkModifier(Modifiers::kInline_Flag,         "inline");
     checkModifier(Modifiers::kNoInline_Flag,       "noinline");
     SkASSERT(flags == 0);
diff --git a/src/sksl/SkSLLexer.cpp b/src/sksl/SkSLLexer.cpp
index 60d2dca..8bb7bcd 100644
--- a/src/sksl/SkSLLexer.cpp
+++ b/src/sksl/SkSLLexer.cpp
@@ -18,74 +18,74 @@
         3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  1,  4,  3,  5,  6,  7,  8,  3,  9,  10, 11, 12,
         13, 14, 15, 16, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 20, 21, 22, 23, 24, 25, 26,
         26, 26, 26, 27, 26, 6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-        6,  6,  6,  28, 3,  29, 30, 31, 3,  32, 33, 34, 35, 36, 37, 38, 39, 40, 6,  41, 42, 43,
-        44, 45, 46, 6,  47, 48, 49, 50, 51, 52, 53, 54, 6,  55, 56, 57, 58};
-static State transitions[59][239] = {
+        6,  6,  6,  28, 3,  29, 30, 31, 3,  32, 33, 34, 35, 36, 37, 6,  38, 39, 6,  40, 41, 42,
+        43, 44, 45, 6,  46, 47, 48, 49, 50, 51, 52, 53, 6,  54, 55, 56, 57};
+static State transitions[58][232] = {
         {
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         },
         {
-                0, 2, 3, 3, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 2, 3, 3, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         },
         {
-                0, 3, 3, 3, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 3, 3, 3, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         },
         {
-                0, 4, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 4, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         },
         {
-                0, 5, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 5, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         },
         {
-                0, 7, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 7, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         },
         {
                 0,  9,  0,  0,  0,  0,  0,  8,  8,  10, 10, 0,  0,  0,  0,  0,  0,  0,  0,  0,
@@ -99,64 +99,62 @@
                 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
                 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
                 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0,  0,  0,  0,  0,  0,
+                10, 10, 10, 10, 10, 10, 0,  0,  0,  0,  0,  0,
         },
         {
-                0, 11, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 11, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         },
         {
-                0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 13, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         },
         {
-                0, 16, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 16, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         },
         {
-                0, 17, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 17, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         },
         {
-                0, 18, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 34, 35, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 18, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 34, 35, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         },
         {
                 0, 20, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0,  0, 21, 0,  0, 0,
@@ -168,18 +166,18 @@
                 0, 0,  0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0,  0, 0,  0,  0, 0,
                 0, 0,  0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0,  0, 0,  0,  0, 0,
                 0, 0,  0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0,  0, 0,  0,  0, 0,
-                0, 0,  0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0,  0, 0,  0,  0,
+                0, 0,  0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,  0, 0,
         },
         {
-                0, 23, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 23, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         },
         {
                 0,  24, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0,  0, 0, 0,  0, 0,
@@ -191,31 +189,29 @@
                 0,  0,  0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0,  0, 0, 0,  0, 0,
                 0,  0,  0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0,  0, 0, 0,  0, 0,
                 0,  0,  0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0,  0, 0, 0,  0, 0,
-                0,  0,  0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0,  0, 0, 0,  0,
+                0,  0,  0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,  0, 0,
         },
         {
-                0,  28, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0,
-                0,  0,  0, 0, 0, 0, 0,  0, 0, 0, 34, 34, 0, 37, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0,
-                40, 0,  0, 0, 0, 0, 40, 0, 0, 0, 0,  0,  0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0,
-                0,  0,  0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0,
-                0,  0,  0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0,
-                0,  0,  0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0,
-                0,  0,  0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0,
-                0,  0,  0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0,
-                0,  0,  0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0,
-                0,  0,  0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0,
+                0, 28, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0,
+                0, 0,  0,  0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0,
+                0, 0,  40, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0,
+                0, 0,  0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0,
+                0, 0,  0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0,
+                0, 0,  0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0,
+                0, 0,  0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0,
+                0, 0,  0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0,
+                0, 0,  0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,
         },
         {
-                0, 33, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 37, 34, 36, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 33, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 37, 34, 36, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         },
         {
                 0,  39, 0,  0,  0,  0,  0,  0,  8,  10, 10, 0,  0,  0,  0,  0,  0,  0,  0,  0,
@@ -229,7 +225,7 @@
                 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
                 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
                 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0,  0,  0,  0,  0,  0,
+                10, 10, 10, 10, 10, 10, 0,  0,  0,  0,  0,  0,
         },
         {
                 0,  54, 0,  0,  0,  0,  0,  0,  8,  10, 10, 0,  0,  0,  0,  0,  0,  0,  0,  0,
@@ -243,87 +239,85 @@
                 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
                 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
                 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0,  0,  0,  0,  0,  0,
+                10, 10, 10, 10, 10, 10, 0,  0,  0,  0,  0,  0,
         },
         {
-                0, 55, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 56, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 55, 0, 0,  0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0,  0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 56, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0,  0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0,  0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0,  0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0,  0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0,  0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0,  0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         },
         {
-                0, 57, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 57, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         },
         {
-                0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 59, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 58, 0, 0, 0, 0, 0,  0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0,  0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 59, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0,  0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0,  0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0,  0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0,  0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0,  0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0,  0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         },
         {
-                0,  62, 0, 0, 0, 6, 0, 0, 0, 0,  0,  12, 0, 15, 0,  0, 0,  0, 19,  0, 22, 0, 0, 0,
-                26, 0,  0, 0, 0, 0, 0, 0, 0, 38, 34, 34, 0, 37, 0,  0, 0,  0, 0,   0, 0,  0, 0, 0,
-                0,  0,  0, 0, 0, 0, 0, 0, 0, 0,  61, 60, 0, 0,  63, 0, 65, 0, 67,  0, 0,  0, 0, 0,
-                0,  0,  0, 0, 0, 0, 0, 0, 0, 82, 0,  0,  0, 0,  0,  0, 0,  0, 0,   0, 0,  0, 0, 0,
-                0,  0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0,  0, 0,  0, 0,   0, 0,  0, 0, 0,
-                0,  0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0,  0, 0,  0, 0,   0, 0,  0, 0, 0,
-                0,  0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0,  0, 0,  0, 0,   0, 0,  0, 0, 0,
-                0,  0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0,  0, 0,  0, 0,   0, 0,  0, 0, 0,
-                0,  0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0,  0, 0,  0, 0,   0, 0,  0, 0, 0,
-                0,  0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0,  0, 0,  0, 235, 0, 0,  0, 0,
+                0,  62, 0, 0, 0, 6, 0, 0, 0, 0,  0,  12,  0, 15, 0,  0, 0,  0, 19, 0, 22, 0, 0, 0,
+                26, 0,  0, 0, 0, 0, 0, 0, 0, 38, 34, 34,  0, 37, 0,  0, 0,  0, 0,  0, 0,  0, 0, 0,
+                0,  0,  0, 0, 0, 0, 0, 0, 0, 0,  61, 60,  0, 0,  63, 0, 65, 0, 67, 0, 0,  0, 0, 0,
+                0,  0,  0, 0, 0, 0, 0, 0, 0, 82, 0,  0,   0, 0,  0,  0, 0,  0, 0,  0, 0,  0, 0, 0,
+                0,  0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0,   0, 0,  0,  0, 0,  0, 0,  0, 0,  0, 0, 0,
+                0,  0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0,   0, 0,  0,  0, 0,  0, 0,  0, 0,  0, 0, 0,
+                0,  0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0,   0, 0,  0,  0, 0,  0, 0,  0, 0,  0, 0, 0,
+                0,  0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0,   0, 0,  0,  0, 0,  0, 0,  0, 0,  0, 0, 0,
+                0,  0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0,   0, 0,  0,  0, 0,  0, 0,  0, 0,  0, 0, 0,
+                0,  0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  228, 0, 0,  0,  0,
         },
         {
-                0,  64, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0,  0, 0, 0, 0, 0, 0, 0,
-                27, 0,  0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0,
-                0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 66, 0, 0, 0, 0, 0, 0, 0,
-                0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0,  0, 0, 0, 0, 0, 0, 0,
-                0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0,  0, 0, 0, 0, 0, 0, 0,
-                0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0,  0, 0, 0, 0, 0, 0, 0,
-                0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0,  0, 0, 0, 0, 0, 0, 0,
-                0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0,  0, 0, 0, 0, 0, 0, 0,
-                0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0,  0, 0, 0, 0, 0, 0, 0,
-                0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0,  0, 0, 0, 0, 0, 0,
+                0, 64, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         },
         {
-                0, 68, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 68, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         },
         {
-                0, 69, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 69, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         },
         {
                 0,  9,  0,  0,  0,  0,  0,  8,  8,  10, 10, 0,  0,  0,  0,  0,  0,  0,  0,  0,
@@ -337,7 +331,7 @@
                 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
                 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
                 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0,  0,  0,  0,  0,  0,
+                10, 10, 10, 10, 10, 10, 0,  0,  0,  0,  0,  0,
         },
         {
                 0,  9,  0,  0,  0,  0,  0,  8,  8,  10, 10, 0,  0,  0,  0,  0,  0,  0,  0,  0,
@@ -351,41 +345,40 @@
                 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
                 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
                 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0,  0,  0,  0,  0,  0,
+                10, 10, 10, 10, 10, 10, 0,  0,  0,  0,  0,  0,
         },
         {
-                0, 79, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 79, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         },
         {
-                0, 80, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 80, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         },
         {
-                0, 81, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 83, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 81, 0, 0,  0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0,  0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0,  0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 83, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0,  0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0,  0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0,  0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0,  0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0,  0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         },
         {
                 0,  9,  0,   0,  0,  0,  0,   8,  8,  10, 10, 0,   0,  0,  0,  0,  0,  0,  0,  0,
@@ -399,22 +392,21 @@
                 10, 10, 10,  10, 10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10,
                 10, 10, 183, 10, 10, 10, 187, 10, 10, 10, 10, 192, 10, 10, 10, 10, 10, 10, 10, 10,
                 10, 10, 10,  10, 10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10, 10,  10, 10, 10, 10,  10, 10, 10, 10, 10,  10, 0,  0,  0,  0,  0,  0,
+                10, 10, 10,  10, 10, 10, 0,   0,  0,  0,  0,  0,
         },
         {
-                0,  9,   0,  0,  0,  0,  0,  8,  8,  10, 10, 0,  0,   0,   0,   0,  0,  0,  0,
-                0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,   0,   0,   34, 34, 0,  37,
-                0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,   0,   53,  53, 0,  0,  0,
-                0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  70,  70,  70,  70, 70, 70, 70,
-                70, 70,  70, 0,  0,  0,  0,  0,  10, 10, 87, 10, 10,  90,  10,  10, 10, 94, 10,
-                10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  109, 10,  10, 10, 10, 10,
-                10, 116, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  128, 10,  10, 10, 10, 133,
-                10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10,  148, 10, 10, 10, 10,
-                10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10,  10,  10, 10, 10, 10,
-                10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  185, 10,  10, 10, 10, 10,
-                10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10,  10,  10, 10, 10, 10,
-                10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 222, 10,  10,  10, 10, 10, 10,
-                10, 10,  10, 10, 10, 0,  0,  0,  0,  0,  0,
+                0,  9,  0,  0,  0,   0,  0,  8,   8,   10, 10, 0,  0,   0,  0,  0,   0,  0,  0,  0,
+                0,  0,  0,  0,  0,   0,  0,  0,   0,   0,  0,  0,  0,   0,  34, 34,  0,  37, 0,  0,
+                0,  0,  0,  0,  0,   0,  0,  0,   0,   0,  0,  0,  53,  53, 0,  0,   0,  0,  0,  0,
+                0,  0,  0,  0,  0,   0,  0,  0,   0,   70, 70, 70, 70,  70, 70, 70,  70, 70, 70, 0,
+                0,  0,  0,  0,  10,  10, 87, 10,  10,  90, 10, 10, 10,  94, 10, 10,  10, 10, 10, 10,
+                10, 10, 10, 10, 10,  10, 10, 10,  109, 10, 10, 10, 10,  10, 10, 116, 10, 10, 10, 10,
+                10, 10, 10, 10, 10,  10, 10, 128, 10,  10, 10, 10, 133, 10, 10, 10,  10, 10, 10, 10,
+                10, 10, 10, 10, 10,  10, 10, 148, 10,  10, 10, 10, 10,  10, 10, 10,  10, 10, 10, 10,
+                10, 10, 10, 10, 10,  10, 10, 10,  10,  10, 10, 10, 10,  10, 10, 10,  10, 10, 10, 10,
+                10, 10, 10, 10, 185, 10, 10, 10,  10,  10, 10, 10, 10,  10, 10, 10,  10, 10, 10, 10,
+                10, 10, 10, 10, 10,  10, 10, 10,  10,  10, 10, 10, 10,  10, 10, 10,  10, 10, 10, 10,
+                10, 10, 10, 10, 10,  10, 0,  0,   0,   0,  0,  0,
         },
         {
                 0,  84, 0,  0,  0,  0,  0,  8,  8,  10, 10, 0,  0,  0,  0,  0,  0,  0,  0,  0,
@@ -428,7 +420,7 @@
                 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
                 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
                 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0,  0,  0,  0,  0,  0,
+                10, 10, 10, 10, 10, 10, 0,  0,  0,  0,  0,  0,
         },
         {
                 0,  89, 0,   0,  0,  0,  0,   8,   8,  10, 10, 0,  0,  0,  0,   0,  0,   0,  0,  0,
@@ -442,7 +434,7 @@
                 10, 10, 10,  10, 10, 10, 167, 10,  10, 10, 10, 10, 10, 10, 10,  10, 10,  10, 10, 10,
                 10, 10, 10,  10, 10, 10, 10,  10,  10, 10, 10, 10, 10, 10, 10,  10, 197, 10, 10, 10,
                 10, 10, 203, 10, 10, 10, 10,  208, 10, 10, 10, 10, 10, 10, 10,  10, 10,  10, 10, 10,
-                10, 10, 10,  10, 10, 10, 10,  10,  10, 10, 10, 10, 10, 0,  0,   0,  0,   0,  0,
+                10, 10, 10,  10, 10, 10, 0,   0,   0,  0,  0,  0,
         },
         {
                 0,  106, 0,  0,  0,  0,  0,  8,  8,  10,  10, 0,  0,  0,  0,  0,  0,  0,   0,  0,
@@ -456,7 +448,7 @@
                 10, 10,  10, 10, 10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10,  10, 10,
                 10, 10,  10, 10, 10, 10, 10, 10, 10, 190, 10, 10, 10, 10, 10, 10, 10, 10,  10, 10,
                 10, 10,  10, 10, 10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10,  10, 10,
-                10, 10,  10, 10, 10, 10, 10, 10, 10, 10,  10, 10, 10, 0,  0,  0,  0,  0,   0,
+                10, 10,  10, 10, 10, 10, 0,  0,  0,  0,   0,  0,
         },
         {
                 0,  120, 0,  0,   0,   0,  0,  8,  8,   10, 10,  0,  0,   0,   0,   0,   0,   0,
@@ -471,66 +463,51 @@
                 10, 10,  10, 166, 10,  10, 10, 10, 171, 10, 10,  10, 10,  176, 10,  10,  10,  10,
                 10, 10,  10, 10,  10,  10, 10, 10, 10,  10, 191, 10, 193, 10,  10,  196, 10,  10,
                 10, 10,  10, 10,  10,  10, 10, 10, 10,  10, 10,  10, 10,  10,  213, 10,  10,  10,
-                10, 10,  10, 10,  10,  10, 10, 10, 10,  10, 10,  10, 10,  10,  10,  232, 10,  0,
-                0,  0,   0,  0,   0,
+                10, 10,  10, 10,  10,  10, 10, 10, 225, 10, 0,   0,  0,   0,   0,   0,
         },
         {
-                0,  127, 0,  0,   0,   0,  0,  8,   8,  10, 10, 0,  0,   0,  0,  0,  0,  0,  0,
-                0,  0,   0,  0,   0,   0,  0,  0,   0,  0,  0,  0,  0,   0,  0,  34, 34, 0,  37,
-                0,  0,   0,  0,   0,   0,  0,  0,   0,  0,  0,  0,  0,   0,  53, 53, 0,  0,  0,
-                0,  0,   0,  0,   0,   0,  0,  0,   0,  0,  0,  0,  70,  70, 72, 70, 70, 70, 70,
-                70, 70,  70, 0,   0,   0,  0,  0,   10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10,
-                10, 10,  10, 10,  10,  10, 10, 10,  10, 10, 10, 10, 108, 10, 10, 10, 10, 10, 10,
-                10, 10,  10, 10,  10,  10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10,
-                10, 10,  10, 10,  138, 10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10,
-                10, 10,  10, 10,  10,  10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10,
-                10, 10,  10, 10,  10,  10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10,
-                10, 10,  10, 194, 195, 10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10,
-                10, 10,  10, 10,  10,  10, 10, 217, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10,
-                10, 10,  10, 10,  10,  0,  0,  0,   0,  0,  0,
+                0,   127, 0,  0,  0,  0,  0,  8,  8,  10, 10, 0,   0,  0,   0,   0,  0,  0,
+                0,   0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,   0,   0,  34, 34,
+                0,   37,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,   0,   0,  53, 53,
+                0,   0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,   0,   70, 70, 72,
+                70,  70,  70, 70, 70, 70, 70, 0,  0,  0,  0,  0,   10, 10,  10,  10, 10, 10,
+                10,  10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10, 10,  10,  10, 10, 108,
+                10,  10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10, 10,  10,  10, 10, 10,
+                10,  10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 138, 10, 10,  10,  10, 10, 10,
+                10,  10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10, 10,  10,  10, 10, 10,
+                10,  10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10, 10,  10,  10, 10, 10,
+                10,  10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10, 194, 195, 10, 10, 10,
+                10,  10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10, 10,  10,  10, 10, 10,
+                217, 10,  10, 10, 10, 10, 10, 10, 10, 10, 0,  0,   0,  0,   0,   0,
         },
         {
-                0,  9,  0,  0,  0,  0,  0,   8,  8,  10, 10, 0,  0,  0,  0,  0,  0,  0,  0,  0,
-                0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  34, 34, 0,  37, 0,  0,
-                0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-                0,  0,  0,  0,  0,  0,  0,   0,  0,  70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 0,
-                0,  0,  0,  0,  10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10, 10, 10, 10, 10, 227, 10, 10, 10, 10, 10, 10, 0,  0,  0,  0,  0,  0,
+                0,  9,   0,  0,   0,  0,  0,  8,  8,   10, 10, 0,  0,  0,  0,  0,  0,  0,  0,  0,
+                0,  0,   0,  0,   0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  34, 34, 0,  37, 0,  0,
+                0,  0,   0,  0,   0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+                0,  0,   0,  0,   0,  0,  0,  0,  0,   70, 70, 70, 70, 70, 70, 70, 70, 78, 70, 0,
+                0,  0,   0,  0,   10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10,  10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10,  10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10,  10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10,  10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10,  10, 184, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10,  10, 10,  10, 10, 10, 10, 209, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 222, 10, 10,  10, 10, 0,  0,  0,   0,  0,  0,
         },
         {
-                0,  9,  0,  0,   0,  0,  0,  8,  8,   10, 10, 0,  0,  0,  0,  0,  0,  0,  0,  0,
-                0,  0,  0,  0,   0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  34, 34, 0,  37, 0,  0,
-                0,  0,  0,  0,   0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-                0,  0,  0,  0,   0,  0,  0,  0,  0,   70, 70, 70, 70, 70, 70, 70, 70, 78, 70, 0,
-                0,  0,  0,  0,   10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10, 10, 184, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10, 10, 10,  10, 10, 10, 10, 209, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10, 10, 10,  10, 10, 10, 10, 229, 10, 10, 10, 10, 0,  0,  0,  0,  0,  0,
-        },
-        {
-                0,  137, 0,   0,  0,  0,   0,   8,   8,  10, 10, 0,   0,  0,  0,  0,   0,   0,   0,
-                0,  0,   0,   0,  0,  0,   0,   0,   0,  0,  0,  0,   0,  0,  0,  34,  34,  0,   37,
-                0,  0,   0,   0,  0,  0,   0,   0,   0,  0,  0,  0,   0,  0,  0,  0,   0,   0,   0,
-                0,  0,   0,   0,  0,  0,   0,   0,   0,  0,  0,  0,   71, 70, 70, 70,  70,  75,  70,
-                70, 70,  70,  0,  0,  0,   0,   0,   10, 10, 10, 10,  10, 10, 10, 10,  10,  10,  10,
-                10, 10,  10,  10, 10, 10,  102, 10,  10, 10, 10, 113, 10, 10, 10, 10,  10,  10,  10,
-                10, 10,  10,  10, 10, 10,  10,  10,  10, 10, 10, 10,  10, 10, 10, 10,  10,  10,  10,
-                10, 10,  10,  10, 10, 10,  10,  141, 10, 10, 10, 10,  10, 10, 10, 10,  10,  10,  10,
-                10, 10,  155, 10, 10, 158, 10,  10,  10, 10, 10, 10,  10, 10, 10, 10,  169, 10,  10,
-                10, 10,  10,  10, 10, 10,  10,  10,  10, 10, 10, 10,  10, 10, 10, 10,  10,  189, 10,
-                10, 10,  10,  10, 10, 10,  10,  10,  10, 10, 10, 10,  10, 10, 10, 206, 10,  10,  10,
-                10, 10,  10,  10, 10, 10,  216, 10,  10, 10, 10, 10,  10, 10, 10, 225, 10,  10,  10,
-                10, 230, 10,  10, 10, 0,   0,   0,   0,  0,  0,
+                0,  137, 0,  0,  0,  0,  0,   8,   8,   10, 10,  0,   0,  0,   0,   0,  0,   0,
+                0,  0,   0,  0,  0,  0,  0,   0,   0,   0,  0,   0,   0,  0,   0,   0,  34,  34,
+                0,  37,  0,  0,  0,  0,  0,   0,   0,   0,  0,   0,   0,  0,   0,   0,  0,   0,
+                0,  0,   0,  0,  0,  0,  0,   0,   0,   0,  0,   0,   0,  0,   0,   71, 70,  70,
+                70, 70,  75, 70, 70, 70, 70,  0,   0,   0,  0,   0,   10, 10,  10,  10, 10,  10,
+                10, 10,  10, 10, 10, 10, 10,  10,  10,  10, 10,  102, 10, 10,  10,  10, 113, 10,
+                10, 10,  10, 10, 10, 10, 10,  10,  10,  10, 10,  10,  10, 10,  10,  10, 10,  10,
+                10, 10,  10, 10, 10, 10, 10,  10,  10,  10, 10,  10,  10, 10,  141, 10, 10,  10,
+                10, 10,  10, 10, 10, 10, 10,  10,  10,  10, 155, 10,  10, 158, 10,  10, 10,  10,
+                10, 10,  10, 10, 10, 10, 169, 10,  10,  10, 10,  10,  10, 10,  10,  10, 10,  10,
+                10, 10,  10, 10, 10, 10, 10,  10,  189, 10, 10,  10,  10, 10,  10,  10, 10,  10,
+                10, 10,  10, 10, 10, 10, 10,  206, 10,  10, 10,  10,  10, 10,  10,  10, 10,  216,
+                10, 10,  10, 10, 10, 10, 223, 10,  10,  10, 0,   0,   0,  0,   0,   0,
         },
         {
                 0,  9,   0,  0,  0,  0,  0,  8,  8,  10, 10, 0,  0,  0,  0,  0,  0,  0,  0,  0,
@@ -544,22 +521,22 @@
                 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
                 10, 182, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
                 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0,  0,  0,  0,  0,  0,
+                10, 10,  10, 10, 10, 10, 0,  0,  0,  0,  0,  0,
         },
         {
-                0,  147, 0,   0,  0,   0,  0,   8,  8,  10, 10, 0,  0,  0,   0,   0,   0,  0,  0,
-                0,  0,   0,   0,  0,   0,  0,   0,  0,  0,  0,  0,  0,  0,   0,   34,  34, 0,  37,
-                0,  0,   0,   0,  0,   0,  0,   0,  0,  0,  0,  0,  0,  0,   0,   0,   0,  0,  0,
-                0,  0,   0,   0,  0,   0,  0,   0,  0,  0,  0,  0,  70, 70,  70,  70,  70, 70, 70,
-                70, 70,  70,  0,  0,   0,  0,   0,  10, 10, 10, 10, 10, 93,  10,  10,  10, 10, 10,
-                10, 10,  10,  10, 10,  10, 10,  10, 10, 10, 10, 10, 10, 10,  10,  111, 10, 10, 10,
-                10, 10,  10,  10, 10,  10, 121, 10, 10, 10, 10, 10, 10, 132, 129, 10,  10, 10, 10,
-                10, 10,  10,  10, 10,  10, 140, 10, 10, 10, 10, 10, 10, 10,  10,  10,  10, 10, 10,
-                10, 10,  10,  10, 157, 10, 10,  10, 10, 10, 10, 10, 10, 10,  10,  10,  10, 10, 10,
-                10, 10,  10,  10, 10,  10, 10,  10, 10, 10, 10, 10, 10, 10,  10,  10,  10, 10, 10,
-                10, 10,  10,  10, 10,  10, 10,  10, 10, 10, 10, 10, 10, 10,  10,  10,  10, 10, 10,
-                10, 10,  10,  10, 10,  10, 10,  10, 10, 10, 10, 10, 10, 10,  10,  10,  10, 10, 10,
-                10, 10,  231, 10, 10,  0,  0,   0,  0,  0,  0,
+                0,  147, 0,   0,  0,  0,  0,  8,   8,  10, 10, 0,  0,   0,   0,  0,  0,  0,
+                0,  0,   0,   0,  0,  0,  0,  0,   0,  0,  0,  0,  0,   0,   0,  0,  34, 34,
+                0,  37,  0,   0,  0,  0,  0,  0,   0,  0,  0,  0,  0,   0,   0,  0,  0,  0,
+                0,  0,   0,   0,  0,  0,  0,  0,   0,  0,  0,  0,  0,   0,   0,  70, 70, 70,
+                70, 70,  70,  70, 70, 70, 70, 0,   0,  0,  0,  0,  10,  10,  10, 10, 10, 93,
+                10, 10,  10,  10, 10, 10, 10, 10,  10, 10, 10, 10, 10,  10,  10, 10, 10, 10,
+                10, 10,  111, 10, 10, 10, 10, 10,  10, 10, 10, 10, 121, 10,  10, 10, 10, 10,
+                10, 132, 129, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10,  140, 10, 10, 10, 10,
+                10, 10,  10,  10, 10, 10, 10, 10,  10, 10, 10, 10, 157, 10,  10, 10, 10, 10,
+                10, 10,  10,  10, 10, 10, 10, 10,  10, 10, 10, 10, 10,  10,  10, 10, 10, 10,
+                10, 10,  10,  10, 10, 10, 10, 10,  10, 10, 10, 10, 10,  10,  10, 10, 10, 10,
+                10, 10,  10,  10, 10, 10, 10, 10,  10, 10, 10, 10, 10,  10,  10, 10, 10, 10,
+                10, 10,  10,  10, 10, 10, 10, 224, 10, 10, 0,  0,  0,   0,   0,  0,
         },
         {
                 0,  9,  0,  0,  0,  0,   0,  8,  8,  10, 10, 0,  0,  0,  0,  0,  0,  0,  0,  0,
@@ -573,37 +550,37 @@
                 10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
                 10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
                 10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 220,
-                10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 0,  0,  0,  0,  0,  0,
+                10, 10, 10, 10, 10, 10,  0,  0,  0,  0,  0,  0,
         },
         {
-                0,  153, 0,  0,   0,   0,   0,   8,   8,   10, 10, 0,  0,  0,  0,  0,  0,   0,  0,
-                0,  0,   0,  0,   0,   0,   0,   0,   0,   0,  0,  0,  0,  0,  0,  34, 34,  0,  37,
-                0,  0,   0,  0,   0,   0,   0,   0,   0,   0,  0,  0,  0,  0,  0,  0,  0,   0,  0,
-                0,  0,   0,  0,   0,   0,   0,   0,   0,   0,  0,  0,  70, 70, 70, 70, 70,  70, 70,
-                70, 70,  70, 0,   0,   0,   0,   0,   10,  10, 10, 10, 10, 10, 10, 10, 10,  10, 10,
-                10, 10,  98, 10,  10,  10,  10,  103, 10,  10, 10, 10, 10, 10, 10, 10, 10,  10, 10,
-                10, 10,  10, 10,  10,  10,  124, 10,  10,  10, 10, 10, 10, 10, 10, 10, 10,  10, 10,
-                10, 10,  10, 10,  139, 10,  10,  10,  142, 10, 10, 10, 10, 10, 10, 10, 10,  10, 10,
-                10, 10,  10, 156, 10,  10,  159, 10,  10,  10, 10, 10, 10, 10, 10, 10, 10,  10, 10,
-                10, 10,  10, 10,  10,  10,  10,  10,  180, 10, 10, 10, 10, 10, 10, 10, 10,  10, 10,
-                10, 10,  10, 10,  10,  10,  10,  10,  10,  10, 10, 10, 10, 10, 10, 10, 10,  10, 10,
-                10, 10,  10, 10,  10,  215, 10,  10,  10,  10, 10, 10, 10, 10, 10, 10, 226, 10, 10,
-                10, 10,  10, 10,  10,  0,   0,   0,   0,   0,  0,
+                0,  153, 0,  0,  0,  0,  0,  8,  8,  10, 10, 0,   0,   0,  0,   0,   0,   0,
+                0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,   0,   0,  0,   0,   34,  34,
+                0,  37,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,   0,   0,  0,   0,   0,   0,
+                0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,   0,   0,  0,   70,  70,  70,
+                70, 70,  70, 70, 70, 70, 70, 0,  0,  0,  0,  0,   10,  10, 10,  10,  10,  10,
+                10, 10,  10, 10, 10, 10, 10, 98, 10, 10, 10, 10,  103, 10, 10,  10,  10,  10,
+                10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  124, 10, 10,  10,  10,  10,
+                10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 139, 10,  10, 10,  142, 10,  10,
+                10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 156, 10,  10, 159, 10,  10,  10,
+                10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10,  10, 10,  10,  10,  180,
+                10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10,  10, 10,  10,  10,  10,
+                10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10,  10, 10,  10,  215, 10,
+                10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 0,  0,   0,   0,  0,   0,
         },
         {
-                0,  172, 0,  0,  0,  0,  0,   8,  8,   10, 10, 0,   0,  0,   0,  0,  0,   0,  0,
-                0,  0,   0,  0,  0,  0,  0,   0,  0,   0,  0,  0,   0,  0,   0,  34, 34,  0,  37,
-                0,  0,   0,  0,  0,  0,  0,   0,  0,   0,  0,  0,   0,  0,   0,  0,  0,   0,  0,
-                0,  0,   0,  0,  0,  0,  0,   0,  0,   0,  0,  0,   70, 70,  70, 70, 70,  70, 70,
-                70, 70,  70, 0,  0,  0,  0,   0,  10,  10, 10, 10,  10, 97,  10, 10, 10,  10, 10,
-                10, 10,  10, 10, 10, 10, 10,  10, 10,  10, 10, 119, 10, 10,  10, 10, 10,  10, 10,
-                10, 10,  10, 10, 10, 10, 10,  10, 10,  10, 10, 10,  10, 135, 10, 10, 10,  10, 10,
-                10, 10,  10, 10, 10, 10, 144, 10, 10,  10, 10, 10,  10, 10,  10, 10, 150, 10, 10,
-                10, 154, 10, 10, 10, 10, 10,  10, 10,  10, 10, 10,  10, 10,  10, 10, 10,  10, 10,
-                10, 10,  10, 10, 10, 10, 10,  10, 10,  10, 10, 10,  10, 10,  10, 10, 10,  10, 10,
-                10, 10,  10, 10, 10, 10, 10,  10, 10,  10, 10, 10,  10, 10,  10, 10, 10,  10, 10,
-                10, 10,  10, 10, 10, 10, 10,  10, 218, 10, 10, 10,  10, 10,  10, 10, 10,  10, 10,
-                10, 10,  10, 10, 10, 0,  0,   0,  0,   0,  0,
+                0,  172, 0,  0,  0,  0,   0,  8,  8,  10,  10, 0,  0,  0,   0,  0,  0,   0,
+                0,  0,   0,  0,  0,  0,   0,  0,  0,  0,   0,  0,  0,  0,   0,  0,  34,  34,
+                0,  37,  0,  0,  0,  0,   0,  0,  0,  0,   0,  0,  0,  0,   0,  0,  0,   0,
+                0,  0,   0,  0,  0,  0,   0,  0,  0,  0,   0,  0,  0,  0,   0,  70, 70,  70,
+                70, 70,  70, 70, 70, 70,  70, 0,  0,  0,   0,  0,  10, 10,  10, 10, 10,  97,
+                10, 10,  10, 10, 10, 10,  10, 10, 10, 10,  10, 10, 10, 10,  10, 10, 119, 10,
+                10, 10,  10, 10, 10, 10,  10, 10, 10, 10,  10, 10, 10, 10,  10, 10, 10,  10,
+                10, 135, 10, 10, 10, 10,  10, 10, 10, 10,  10, 10, 10, 144, 10, 10, 10,  10,
+                10, 10,  10, 10, 10, 150, 10, 10, 10, 154, 10, 10, 10, 10,  10, 10, 10,  10,
+                10, 10,  10, 10, 10, 10,  10, 10, 10, 10,  10, 10, 10, 10,  10, 10, 10,  10,
+                10, 10,  10, 10, 10, 10,  10, 10, 10, 10,  10, 10, 10, 10,  10, 10, 10,  10,
+                10, 10,  10, 10, 10, 10,  10, 10, 10, 10,  10, 10, 10, 10,  10, 10, 10,  10,
+                10, 218, 10, 10, 10, 10,  10, 10, 10, 10,  0,  0,  0,  0,   0,  0,
         },
         {
                 0,  9,  0,  0,  0,   0,  0,  8,  8,  10, 10, 0,  0,  0,  0,   0,  0,  0,  0,  0,
@@ -617,37 +594,37 @@
                 10, 10, 10, 10, 165, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10,
                 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10,
                 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10,
-                10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 0,  0,   0,  0,  0,  0,
+                10, 10, 10, 10, 10,  10, 0,  0,  0,  0,  0,  0,
         },
         {
-                0,  175, 0,   0,  0,  0,  0,  8,   8,  10,  10,  0,  0,  0,   0,  0,  0,  0,  0,
-                0,  0,   0,   0,  0,  0,  0,  0,   0,  0,   0,   0,  0,  0,   0,  34, 34, 0,  37,
-                0,  0,   0,   0,  0,  0,  0,  0,   0,  0,   0,   0,  0,  0,   0,  0,  0,  0,  0,
-                0,  0,   0,   0,  0,  0,  0,  0,   0,  0,   0,   0,  70, 70,  70, 70, 70, 70, 70,
-                70, 70,  70,  0,  0,  0,  0,  0,   85, 10,  10,  10, 10, 10,  10, 10, 10, 10, 10,
-                10, 10,  10,  10, 10, 10, 10, 10,  10, 10,  10,  10, 10, 10,  10, 10, 10, 10, 10,
-                10, 10,  117, 10, 10, 10, 10, 10,  10, 10,  10,  10, 10, 10,  10, 10, 10, 10, 10,
-                10, 10,  136, 10, 10, 10, 10, 10,  10, 10,  10,  10, 10, 10,  10, 10, 10, 10, 10,
-                10, 10,  10,  10, 10, 10, 10, 10,  10, 10,  163, 10, 10, 10,  10, 10, 10, 10, 10,
-                10, 10,  10,  10, 10, 10, 10, 179, 10, 10,  10,  10, 10, 10,  10, 10, 10, 10, 10,
-                10, 10,  10,  10, 10, 10, 10, 10,  10, 10,  201, 10, 10, 10,  10, 10, 10, 10, 10,
-                10, 211, 10,  10, 10, 10, 10, 10,  10, 219, 10,  10, 10, 223, 10, 10, 10, 10, 10,
-                10, 10,  10,  10, 10, 0,  0,  0,   0,  0,   0,
+                0,   175, 0,   0,  0,  0,  0,  8,  8,   10,  10, 0,  0,   0,  0,  0,  0,   0,
+                0,   0,   0,   0,  0,  0,  0,  0,  0,   0,   0,  0,  0,   0,  0,  0,  34,  34,
+                0,   37,  0,   0,  0,  0,  0,  0,  0,   0,   0,  0,  0,   0,  0,  0,  0,   0,
+                0,   0,   0,   0,  0,  0,  0,  0,  0,   0,   0,  0,  0,   0,  0,  70, 70,  70,
+                70,  70,  70,  70, 70, 70, 70, 0,  0,   0,   0,  0,  85,  10, 10, 10, 10,  10,
+                10,  10,  10,  10, 10, 10, 10, 10, 10,  10,  10, 10, 10,  10, 10, 10, 10,  10,
+                10,  10,  10,  10, 10, 10, 10, 10, 117, 10,  10, 10, 10,  10, 10, 10, 10,  10,
+                10,  10,  10,  10, 10, 10, 10, 10, 10,  136, 10, 10, 10,  10, 10, 10, 10,  10,
+                10,  10,  10,  10, 10, 10, 10, 10, 10,  10,  10, 10, 10,  10, 10, 10, 10,  10,
+                163, 10,  10,  10, 10, 10, 10, 10, 10,  10,  10, 10, 10,  10, 10, 10, 179, 10,
+                10,  10,  10,  10, 10, 10, 10, 10, 10,  10,  10, 10, 10,  10, 10, 10, 10,  10,
+                10,  10,  201, 10, 10, 10, 10, 10, 10,  10,  10, 10, 211, 10, 10, 10, 10,  10,
+                10,  10,  219, 10, 10, 10, 10, 10, 10,  10,  0,  0,  0,   0,  0,  0,
         },
         {
-                0,  181, 0,  0,  0,  0,  0,  8,   8,   10, 10, 0,   0,  0,  0,   0,   0,   0,  0,
-                0,  0,   0,  0,  0,  0,  0,  0,   0,   0,  0,  0,   0,  0,  0,   34,  34,  0,  37,
-                0,  0,   0,  0,  0,  0,  0,  0,   0,   0,  0,  0,   0,  0,  0,   0,   0,   0,  0,
-                0,  0,   0,  0,  0,  0,  0,  0,   0,   0,  0,  0,   73, 70, 70,  70,  70,  70, 70,
-                70, 70,  70, 0,  0,  0,  0,  0,   10,  10, 10, 10,  10, 10, 91,  10,  10,  10, 95,
-                96, 10,  10, 99, 10, 10, 10, 10,  10,  10, 10, 10,  10, 10, 10,  10,  10,  10, 114,
-                10, 10,  10, 10, 10, 10, 10, 122, 10,  10, 10, 10,  10, 10, 10,  130, 10,  10, 10,
-                10, 10,  10, 10, 10, 10, 10, 10,  10,  10, 10, 10,  10, 10, 10,  10,  10,  10, 10,
-                10, 10,  10, 10, 10, 10, 10, 10,  10,  10, 10, 164, 10, 10, 10,  10,  10,  10, 10,
-                10, 10,  10, 10, 10, 10, 10, 10,  10,  10, 10, 10,  10, 10, 186, 10,  188, 10, 10,
-                10, 10,  10, 10, 10, 10, 10, 10,  199, 10, 10, 10,  10, 10, 10,  10,  10,  10, 10,
-                10, 10,  10, 10, 10, 10, 10, 10,  10,  10, 10, 10,  10, 10, 10,  10,  10,  10, 10,
-                10, 10,  10, 10, 10, 0,  0,  0,   0,   0,  0,
+                0,   181, 0,  0,   0,  0,   0,  8,   8,  10, 10, 0,  0,  0,   0,  0,  0,  0,
+                0,   0,   0,  0,   0,  0,   0,  0,   0,  0,  0,  0,  0,  0,   0,  0,  34, 34,
+                0,   37,  0,  0,   0,  0,   0,  0,   0,  0,  0,  0,  0,  0,   0,  0,  0,  0,
+                0,   0,   0,  0,   0,  0,   0,  0,   0,  0,  0,  0,  0,  0,   0,  73, 70, 70,
+                70,  70,  70, 70,  70, 70,  70, 0,   0,  0,  0,  0,  10, 10,  10, 10, 10, 10,
+                91,  10,  10, 10,  95, 96,  10, 10,  99, 10, 10, 10, 10, 10,  10, 10, 10, 10,
+                10,  10,  10, 10,  10, 114, 10, 10,  10, 10, 10, 10, 10, 122, 10, 10, 10, 10,
+                10,  10,  10, 130, 10, 10,  10, 10,  10, 10, 10, 10, 10, 10,  10, 10, 10, 10,
+                10,  10,  10, 10,  10, 10,  10, 10,  10, 10, 10, 10, 10, 10,  10, 10, 10, 10,
+                10,  164, 10, 10,  10, 10,  10, 10,  10, 10, 10, 10, 10, 10,  10, 10, 10, 10,
+                10,  10,  10, 10,  10, 186, 10, 188, 10, 10, 10, 10, 10, 10,  10, 10, 10, 10,
+                199, 10,  10, 10,  10, 10,  10, 10,  10, 10, 10, 10, 10, 10,  10, 10, 10, 10,
+                10,  10,  10, 10,  10, 10,  10, 10,  10, 10, 0,  0,  0,  0,   0,  0,
         },
         {
                 0,  210, 0,  0,   0,  0,   0,  8,   8,   10,  10, 0,   0,  0,  0,   0,  0,  0,
@@ -662,40 +639,39 @@
                 10, 10,  10, 10,  10, 168, 10, 10,  10,  10,  10, 174, 10, 10, 177, 10, 10, 10,
                 10, 200, 10, 10,  10, 10,  10, 10,  10,  10,  10, 10,  10, 10, 10,  10, 10, 198,
                 10, 10,  10, 10,  10, 204, 10, 10,  207, 10,  10, 10,  10, 10, 10,  10, 10, 10,
-                10, 10,  10, 10,  10, 10,  10, 10,  10,  10,  10, 10,  10, 10, 10,  10, 10, 0,
-                0,  0,   0,  0,   0,
+                10, 10,  10, 10,  10, 10,  10, 10,  10,  10,  0,  0,   0,  0,  0,   0,
         },
         {
-                0,  214, 0,   0,  0,  0,  0,   8,  8,   10, 10,  0,   0,  0,  0,   0,  0,  0,   0,
-                0,  0,   0,   0,  0,  0,  0,   0,  0,   0,  0,   0,   0,  0,  0,   34, 34, 0,   37,
-                0,  0,   0,   0,  0,  0,  0,   0,  0,   0,  0,   0,   0,  0,  0,   0,  0,  0,   0,
-                0,  0,   0,   0,  0,  0,  0,   0,  0,   0,  0,   0,   70, 70, 70,  70, 70, 70,  70,
-                70, 70,  70,  0,  0,  0,  0,   0,  10,  10, 10,  10,  10, 10, 10,  10, 10, 10,  10,
-                10, 10,  10,  10, 10, 10, 10,  10, 104, 10, 10,  10,  10, 10, 110, 10, 10, 10,  10,
-                10, 10,  10,  10, 10, 10, 10,  10, 10,  10, 125, 10,  10, 10, 10,  10, 10, 10,  10,
-                10, 10,  10,  10, 10, 10, 10,  10, 10,  10, 10,  145, 10, 10, 10,  10, 10, 151, 10,
-                10, 10,  10,  10, 10, 10, 10,  10, 10,  10, 10,  10,  10, 10, 10,  10, 10, 10,  10,
-                10, 173, 10,  10, 10, 10, 178, 10, 10,  10, 10,  10,  10, 10, 10,  10, 10, 10,  10,
-                10, 10,  10,  10, 10, 10, 10,  10, 10,  10, 10,  202, 10, 10, 10,  10, 10, 10,  10,
-                10, 10,  212, 10, 10, 10, 10,  10, 10,  10, 10,  10,  10, 10, 10,  10, 10, 10,  10,
-                10, 10,  10,  10, 10, 0,  0,   0,  0,   0,  0,
+                0,   214, 0,  0,   0,  0,  0,   8,  8,  10, 10,  0,  0,  0,   0,  0,   0,   0,
+                0,   0,   0,  0,   0,  0,  0,   0,  0,  0,  0,   0,  0,  0,   0,  0,   34,  34,
+                0,   37,  0,  0,   0,  0,  0,   0,  0,  0,  0,   0,  0,  0,   0,  0,   0,   0,
+                0,   0,   0,  0,   0,  0,  0,   0,  0,  0,  0,   0,  0,  0,   0,  70,  70,  70,
+                70,  70,  70, 70,  70, 70, 70,  0,  0,  0,  0,   0,  10, 10,  10, 10,  10,  10,
+                10,  10,  10, 10,  10, 10, 10,  10, 10, 10, 10,  10, 10, 104, 10, 10,  10,  10,
+                10,  110, 10, 10,  10, 10, 10,  10, 10, 10, 10,  10, 10, 10,  10, 10,  125, 10,
+                10,  10,  10, 10,  10, 10, 10,  10, 10, 10, 10,  10, 10, 10,  10, 10,  10,  10,
+                145, 10,  10, 10,  10, 10, 151, 10, 10, 10, 10,  10, 10, 10,  10, 10,  10,  10,
+                10,  10,  10, 10,  10, 10, 10,  10, 10, 10, 173, 10, 10, 10,  10, 178, 10,  10,
+                10,  10,  10, 10,  10, 10, 10,  10, 10, 10, 10,  10, 10, 10,  10, 10,  10,  10,
+                10,  10,  10, 202, 10, 10, 10,  10, 10, 10, 10,  10, 10, 212, 10, 10,  10,  10,
+                10,  10,  10, 10,  10, 10, 10,  10, 10, 10, 0,   0,  0,  0,   0,  0,
         },
         {
-                0,  221, 0,  0,  0,  0,  0,  8,  8,  10,  10, 0,  0,  0,  0,  0,  0,  0,  0,  0,
-                0,  0,   0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  34, 34, 0,  37, 0,  0,
-                0,  0,   0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-                0,  0,   0,  0,  0,  0,  0,  0,  0,  70,  70, 70, 70, 70, 70, 70, 70, 70, 70, 0,
-                0,  0,   0,  0,  10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10,  10, 10, 10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10,  10, 10, 10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10,  10, 10, 10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10,  10, 10, 10, 10, 10, 10, 10, 170, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10,  10, 10, 10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10,  10, 10, 10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10,  10, 10, 10, 10, 10, 10, 10, 10,  10, 10, 10, 0,  0,  0,  0,  0,  0,
+                0,  9,  0,  0,  0,  0,  0,  8,  8,  10,  10, 0,  0,  0,  0,  0,  0,  0,  0,  0,
+                0,  0,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  34, 34, 0,  37, 0,  0,
+                0,  0,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+                0,  0,  0,  0,  0,  0,  0,  0,  0,  70,  70, 70, 70, 70, 70, 70, 70, 70, 70, 0,
+                0,  0,  0,  0,  10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10, 10, 10, 10, 10, 10, 10, 10, 170, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10, 10, 10, 10, 10, 0,  0,  0,  0,   0,  0,
         },
         {
-                0,  228, 0,  0,  0,  0,  0,  8,  8,  10, 10, 0,  0,  0,  0,  0,  0,  0,  0,  0,
+                0,  221, 0,  0,  0,  0,  0,  8,  8,  10, 10, 0,  0,  0,  0,  0,  0,  0,  0,  0,
                 0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  34, 34, 0,  37, 0,  0,
                 0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
                 0,  0,   0,  0,  0,  0,  0,  0,  0,  70, 70, 70, 70, 74, 70, 70, 70, 70, 70, 0,
@@ -706,7 +682,7 @@
                 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
                 10, 205, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
                 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0,  0,  0,  0,  0,  0,
+                10, 10,  10, 10, 10, 10, 0,  0,  0,  0,  0,  0,
         },
         {
                 0,  9,  0,  0,  0,  0,  0,  8,  8,  10, 10, 0,  0,  0,  0,  0,  0,  0,  0,  0,
@@ -720,84 +696,80 @@
                 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
                 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
                 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0,  0,  0,  0,  0,  0,
+                10, 10, 10, 10, 10, 10, 0,  0,  0,  0,  0,  0,
         },
         {
-                0,  9,  0,  0,   0,  0,  0,  8,  8,   10, 10, 0,  0,  0,  0,  0,  0,  0,  0,  0,
-                0,  0,  0,  0,   0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  34, 34, 0,  37, 0,  0,
-                0,  0,  0,  0,   0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-                0,  0,  0,  0,   0,  0,  0,  0,  0,   70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 0,
-                0,  0,  0,  0,   10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10, 10, 10,  10, 10, 10, 10, 149, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10, 10, 224, 10, 10, 10, 10, 10,  10, 10, 10, 10, 0,  0,  0,  0,  0,  0,
+                0,  9,  0,  0,  0,  0,  0,  8,  8,   10, 10, 0,  0,  0,  0,  0,  0,  0,  0,  0,
+                0,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  34, 34, 0,  37, 0,  0,
+                0,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+                0,  0,  0,  0,  0,  0,  0,  0,  0,   70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 0,
+                0,  0,  0,  0,  10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10, 10, 10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10, 10, 10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10, 10, 10, 10, 10, 10, 10, 149, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10, 10, 10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10, 10, 10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10, 10, 10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10, 10, 10, 10, 10, 0,  0,  0,   0,  0,  0,
         },
         {
-                0, 233, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 226, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         },
         {
-                0, 234, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0,   0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0,   0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0,   0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0,   0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0,   0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0,   0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0,   0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0,   0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 236, 0, 0, 0, 0,
+                0, 227, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 229, 0, 0, 0, 0,
         },
         {
-                0, 237, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 230, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         },
         {
-                0, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 231, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         },
 };
 
-static int8_t accepts[239] = {
-        -1, -1, 84, 84, 87, 61, 67, 87, 35, 34, 34, 51, 76, 56, 60, 81, 37, 38, 49, 74, 47, 45,
-        72, 44, 48, 46, 73, 83, 43, 1,  -1, -1, 1,  50, -1, -1, 86, 85, 75, 2,  1,  1,  -1, -1,
-        1,  -1, -1, 1,  2,  -1, -1, 1,  -1, 2,  2,  64, 63, 82, 69, 52, 77, 71, 65, 66, 68, 70,
-        53, 78, 62, 87, 36, 36, 6,  36, 36, 36, 36, 36, 12, 41, 42, 55, 80, 59, 34, 34, 34, 34,
-        15, 34, 34, 34, 13, 34, 34, 34, 33, 34, 34, 34, 23, 34, 34, 34, 34, 16, 34, 34, 34, 34,
-        34, 34, 14, 34, 34, 34, 34, 34, 17, 10, 34, 34, 34, 7,  34, 34, 32, 34, 34, 34, 34, 4,
-        34, 34, 24, 34, 8,  34, 5,  19, 34, 34, 34, 26, 34, 34, 21, 34, 34, 34, 34, 34, 31, 34,
-        34, 34, 34, 34, 34, 34, 27, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 25, 34, 34, 20, 34,
-        34, 34, 34, 34, 18, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
-        34, 28, 34, 34, 34, 34, 30, 34, 34, 34, 34, 11, 34, 34, 34, 3,  34, 34, 34, 34, 34, 34,
-        22, 34, 34, 34, 34, 34, 34, 29, 34, 34, 34, 34, 9,  39, 54, 79, 58, 40, 57,
+static int8_t accepts[232] = {
+        -1, -1, 83, 83, 86, 60, 66, 86, 34, 33, 33, 50, 75, 55, 59, 80, 36, 37, 48, 73, 46, 44,
+        71, 43, 47, 45, 72, 82, 42, 1,  -1, -1, 1,  49, -1, -1, 85, 84, 74, 2,  1,  1,  -1, -1,
+        1,  -1, -1, 1,  2,  -1, -1, 1,  -1, 2,  2,  63, 62, 81, 68, 51, 76, 70, 64, 65, 67, 69,
+        52, 77, 61, 86, 35, 35, 6,  35, 35, 35, 35, 35, 12, 40, 41, 54, 79, 58, 33, 33, 33, 33,
+        15, 33, 33, 33, 13, 33, 33, 33, 32, 33, 33, 33, 23, 33, 33, 33, 33, 16, 33, 33, 33, 33,
+        33, 33, 14, 33, 33, 33, 33, 33, 17, 10, 33, 33, 33, 7,  33, 33, 31, 33, 33, 33, 33, 4,
+        33, 33, 24, 33, 8,  33, 5,  19, 33, 33, 33, 26, 33, 33, 21, 33, 33, 33, 33, 33, 30, 33,
+        33, 33, 33, 33, 33, 33, 27, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 25, 33, 33, 20, 33,
+        33, 33, 33, 33, 18, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+        33, 28, 33, 33, 33, 33, 29, 33, 33, 33, 33, 11, 33, 33, 33, 3,  33, 33, 33, 33, 33, 33,
+        22, 33, 33, 33, 33, 9,  38, 53, 78, 57, 39, 56,
 };
 
 Token Lexer::next() {
diff --git a/src/sksl/SkSLLexer.h b/src/sksl/SkSLLexer.h
index 43b0a7d..e7a1168 100644
--- a/src/sksl/SkSLLexer.h
+++ b/src/sksl/SkSLLexer.h
@@ -44,7 +44,6 @@
         TK_INLINE,
         TK_NOINLINE,
         TK_HASSIDEEFFECTS,
-        TK_VARYING,
         TK_STRUCT,
         TK_LAYOUT,
         TK_ENUM,
diff --git a/src/sksl/SkSLParser.cpp b/src/sksl/SkSLParser.cpp
index f148cf6..5b74a1d 100644
--- a/src/sksl/SkSLParser.cpp
+++ b/src/sksl/SkSLParser.cpp
@@ -50,7 +50,6 @@
         case Token::Kind::TK_FLAT:           return Modifiers::kFlat_Flag;
         case Token::Kind::TK_NOPERSPECTIVE:  return Modifiers::kNoPerspective_Flag;
         case Token::Kind::TK_HASSIDEEFFECTS: return Modifiers::kHasSideEffects_Flag;
-        case Token::Kind::TK_VARYING:        return Modifiers::kVarying_Flag;
         case Token::Kind::TK_INLINE:         return Modifiers::kInline_Flag;
         case Token::Kind::TK_NOINLINE:       return Modifiers::kNoInline_Flag;
         default:                             return 0;
@@ -1023,8 +1022,7 @@
                   primitive, maxVertices, invocations, marker, when, ctype);
 }
 
-/* layout? (UNIFORM | CONST | IN | OUT | INOUT | LOWP | MEDIUMP | HIGHP | FLAT | NOPERSPECTIVE |
-            VARYING | INLINE)* */
+/* layout? (UNIFORM | CONST | IN | OUT | INOUT | FLAT | NOPERSPECTIVE | INLINE)* */
 Modifiers Parser::modifiers() {
     Layout layout = this->layout();
     int flags = 0;
diff --git a/src/sksl/codegen/SkSLPipelineStageCodeGenerator.cpp b/src/sksl/codegen/SkSLPipelineStageCodeGenerator.cpp
index b346b12..8308cb6 100644
--- a/src/sksl/codegen/SkSLPipelineStageCodeGenerator.cpp
+++ b/src/sksl/codegen/SkSLPipelineStageCodeGenerator.cpp
@@ -211,41 +211,11 @@
         return;
     }
 
-    auto varIndexByFlag = [this, &ref](uint32_t flag) {
-        int index = 0;
-        bool found = false;
-        for (const ProgramElement* e : fProgram.elements()) {
-            if (found) {
-                break;
-            }
-            if (e->is<GlobalVarDeclaration>()) {
-                const GlobalVarDeclaration& global = e->as<GlobalVarDeclaration>();
-                const Variable& var = global.declaration()->as<VarDeclaration>().var();
-                if (&var == ref.variable()) {
-                    found = true;
-                    break;
-                }
-                // Skip over children (shaders/colorFilters). These are indexed separately from
-                // other globals.
-                if ((var.modifiers().fFlags & flag) && !var.type().isEffectChild()) {
-                    ++index;
-                }
-            }
-        }
-        SkASSERT(found);
-        return index;
-    };
-
-    if (modifiers.fFlags & Modifiers::kVarying_Flag) {
-        this->write("_vtx_attr_");
-        this->write(to_string(varIndexByFlag(Modifiers::kVarying_Flag)));
+    auto it = fVariableNames.find(var);
+    if (it != fVariableNames.end()) {
+        this->write(it->second);
     } else {
-        auto it = fVariableNames.find(var);
-        if (it != fVariableNames.end()) {
-            this->write(it->second);
-        } else {
-            this->write(var->name());
-        }
+        this->write(var->name());
     }
 }
 
diff --git a/src/sksl/generated/sksl_gpu.dehydrated.sksl b/src/sksl/generated/sksl_gpu.dehydrated.sksl
index 2f0ccb4..27a15ee 100644
--- a/src/sksl/generated/sksl_gpu.dehydrated.sksl
+++ b/src/sksl/generated/sksl_gpu.dehydrated.sksl
@@ -3918,13 +3918,13 @@
 49,0,0,0,0,1,
 41,
 1,
-56,161,3,0,47,
+56,161,3,0,46,
 1,
 1,
 26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
 46,
-56,161,3,0,1,3,49,
+56,161,3,0,1,3,48,
 56,162,3,0,1,0,
 29,166,3,
 2,
@@ -3934,10 +3934,10 @@
 1,
 1,
 26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
 46,
-56,165,3,0,1,3,49,
-56,164,3,0,47,
+56,165,3,0,1,3,48,
+56,164,3,0,46,
 56,165,3,0,1,0,
 29,169,3,
 2,
@@ -3947,7 +3947,7 @@
 42,99,8,
 51,
 1,
-56,167,3,0,66,
+56,167,3,0,65,
 12,
 47,15,2,1,
 26,
@@ -3957,11 +3957,11 @@
 26,
 47,176,0,0,0,0,0,
 1,
-56,167,3,0,49,
+56,167,3,0,48,
 46,
 56,168,3,0,1,3,
 1,
-56,167,3,0,49,
+56,167,3,0,48,
 46,
 56,168,3,0,1,3,1,0,
 29,172,3,
@@ -3979,9 +3979,9 @@
 1,
 1,
 26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
 46,
-56,174,3,0,1,3,49,
+56,174,3,0,1,3,48,
 56,173,3,0,1,0,
 29,178,3,
 2,
@@ -3990,9 +3990,9 @@
 1,
 1,
 26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
 46,
-56,176,3,0,1,3,49,
+56,176,3,0,1,3,48,
 56,177,3,0,1,0,
 29,181,3,
 2,
@@ -4001,14 +4001,14 @@
 1,
 1,
 46,
-56,180,3,0,1,3,49,
-56,179,3,0,47,
+56,180,3,0,1,3,48,
+56,179,3,0,46,
 1,
 1,
 26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
 46,
-56,179,3,0,1,3,49,
+56,179,3,0,1,3,48,
 56,180,3,0,1,0,
 29,184,3,
 2,
@@ -4018,13 +4018,13 @@
 1,
 1,
 26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
 46,
-56,183,3,0,1,3,49,
-56,182,3,0,47,
+56,183,3,0,1,3,48,
+56,182,3,0,46,
 1,
 46,
-56,182,3,0,1,3,49,
+56,182,3,0,1,3,48,
 56,183,3,0,1,0,
 29,187,3,
 2,
@@ -4034,16 +4034,16 @@
 1,
 1,
 26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
 46,
-56,186,3,0,1,3,49,
-56,185,3,0,47,
+56,186,3,0,1,3,48,
+56,185,3,0,46,
 1,
 1,
 26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
 46,
-56,185,3,0,1,3,49,
+56,185,3,0,1,3,48,
 56,186,3,0,1,0,
 29,190,3,
 2,
@@ -4052,7 +4052,7 @@
 28,
 47,15,2,204,0,2,
 1,
-56,188,3,0,47,
+56,188,3,0,46,
 56,189,3,0,
 26,
 47,176,0,0,0,128,63,1,0,
@@ -4061,19 +4061,19 @@
 49,0,0,0,0,1,
 41,
 1,
-56,191,3,0,49,
+56,191,3,0,48,
 56,192,3,0,1,0,
 29,196,3,
 2,
 49,0,0,0,0,1,
 41,
 1,
-56,194,3,0,47,
+56,194,3,0,46,
 1,
 1,
 26,
-47,176,0,0,0,128,63,48,
-56,194,3,0,49,
+47,176,0,0,0,128,63,47,
+56,194,3,0,48,
 56,195,3,0,1,0,
 29,199,3,
 2,
@@ -4083,37 +4083,37 @@
 1,
 1,
 26,
-47,176,0,0,0,0,64,49,
+47,176,0,0,0,0,64,48,
 46,
-56,198,3,0,1,0,71,
+56,198,3,0,1,0,70,
 46,
 56,198,3,0,1,1,
 1,
 1,
 26,
-47,176,0,0,0,0,64,49,
+47,176,0,0,0,0,64,48,
 46,
-56,197,3,0,1,0,49,
+56,197,3,0,1,0,48,
 46,
 56,198,3,0,1,0,
 1,
 1,
 46,
-56,197,3,0,1,1,49,
+56,197,3,0,1,1,48,
 46,
-56,198,3,0,1,1,48,
+56,198,3,0,1,1,47,
 1,
 1,
 26,
-47,176,0,0,0,0,64,49,
+47,176,0,0,0,0,64,48,
 1,
 46,
-56,198,3,0,1,1,48,
+56,198,3,0,1,1,47,
 46,
-56,198,3,0,1,0,49,
+56,198,3,0,1,0,48,
 1,
 46,
-56,197,3,0,1,1,48,
+56,197,3,0,1,1,47,
 46,
 56,197,3,0,1,0,1,0,
 29,202,3,
@@ -4147,34 +4147,34 @@
 56,201,3,0,2,2,3,
 1,
 46,
-56,200,3,0,1,3,47,
+56,200,3,0,1,3,46,
 1,
 1,
 26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
 46,
-56,200,3,0,1,3,49,
+56,200,3,0,1,3,48,
 46,
 56,201,3,0,1,3,
 23,
 1,
 46,
-56,35,4,2,3,0,1,2,72,
+56,35,4,2,3,0,1,2,71,
 1,
 1,
 46,
-56,201,3,0,3,0,1,2,49,
+56,201,3,0,3,0,1,2,48,
 1,
 26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
 46,
-56,200,3,0,1,3,47,
+56,200,3,0,1,3,46,
 1,
 46,
-56,200,3,0,3,0,1,2,49,
+56,200,3,0,3,0,1,2,48,
 1,
 26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
 46,
 56,201,3,0,1,3,
 41,
@@ -4195,7 +4195,7 @@
 23,
 1,
 46,
-56,36,4,1,3,0,1,2,65,
+56,36,4,1,3,0,1,2,64,
 28,
 47,172,1,200,0,2,
 46,
@@ -4204,11 +4204,11 @@
 1,
 1,
 26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
 46,
-56,204,3,0,1,3,49,
+56,204,3,0,1,3,48,
 46,
-56,203,3,0,3,0,1,2,47,
+56,203,3,0,3,0,1,2,46,
 46,
 56,204,3,0,3,0,1,2,
 41,
@@ -4229,7 +4229,7 @@
 23,
 1,
 46,
-56,37,4,1,3,0,1,2,65,
+56,37,4,1,3,0,1,2,64,
 28,
 47,172,1,224,0,2,
 46,
@@ -4238,11 +4238,11 @@
 1,
 1,
 26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
 46,
-56,207,3,0,1,3,49,
+56,207,3,0,1,3,48,
 46,
-56,206,3,0,3,0,1,2,47,
+56,206,3,0,3,0,1,2,46,
 46,
 56,207,3,0,3,0,1,2,
 41,
@@ -4254,13 +4254,13 @@
 51,
 42,144,8,
 1,
-56,209,3,0,50,
+56,209,3,0,49,
 1,
-56,210,3,0,47,
+56,210,3,0,46,
 26,
 47,176,0,119,204,43,50,
 1,
-56,209,3,0,50,
+56,209,3,0,49,
 56,210,3,0,1,0,
 29,215,3,
 2,
@@ -4269,13 +4269,13 @@
 51,
 42,144,8,
 1,
-56,212,3,0,50,
+56,212,3,0,49,
 1,
-56,213,3,0,47,
+56,213,3,0,46,
 26,
 47,176,0,119,204,43,50,
 1,
-56,212,3,0,50,
+56,212,3,0,49,
 56,213,3,0,1,0,
 29,218,3,
 2,
@@ -4283,7 +4283,7 @@
 31,0,
 1,
 46,
-56,217,3,0,1,0,66,
+56,217,3,0,1,0,65,
 26,
 47,176,0,0,0,0,0,
 2,
@@ -4291,10 +4291,10 @@
 41,
 1,
 46,
-56,216,3,0,1,0,49,
+56,216,3,0,1,0,48,
 1,
 26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
 46,
 56,217,3,0,1,1,1,
 2,
@@ -4307,12 +4307,12 @@
 47,176,0,0,
 1,
 46,
-56,216,3,0,1,1,48,
+56,216,3,0,1,1,47,
 46,
 56,216,3,0,1,0,
 31,0,
 1,
-56,38,4,0,66,
+56,38,4,0,65,
 26,
 47,176,0,0,0,0,0,
 2,
@@ -4322,30 +4322,30 @@
 1,
 1,
 46,
-56,216,3,0,1,1,49,
+56,216,3,0,1,1,48,
 46,
-56,217,3,0,1,1,47,
+56,217,3,0,1,1,46,
 1,
 46,
-56,216,3,0,1,0,49,
+56,216,3,0,1,0,48,
 1,
 26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
 46,
-56,217,3,0,1,1,47,
+56,217,3,0,1,1,46,
 1,
 46,
-56,217,3,0,1,0,49,
+56,217,3,0,1,0,48,
 1,
 26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
 46,
 56,216,3,0,1,1,1,
 2,
 49,0,0,0,0,2,
 23,
 1,
-56,38,4,1,65,
+56,38,4,1,64,
 28,
 47,176,0,200,0,2,
 46,
@@ -4354,7 +4354,7 @@
 47,176,0,211,3,2,
 1,
 46,
-56,217,3,0,1,0,49,
+56,217,3,0,1,0,48,
 46,
 56,216,3,0,1,1,
 56,38,4,0,
@@ -4362,23 +4362,23 @@
 1,
 1,
 1,
-56,38,4,0,49,
+56,38,4,0,48,
 46,
-56,216,3,0,1,1,47,
+56,216,3,0,1,1,46,
 1,
 46,
-56,216,3,0,1,0,49,
+56,216,3,0,1,0,48,
 1,
 26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
 46,
-56,217,3,0,1,1,47,
+56,217,3,0,1,1,46,
 1,
 46,
-56,217,3,0,1,0,49,
+56,217,3,0,1,0,48,
 1,
 26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
 46,
 56,216,3,0,1,1,1,1,1,1,211,3,
 29,221,3,
@@ -4407,13 +4407,13 @@
 56,220,3,0,2,2,3,
 1,
 46,
-56,219,3,0,1,3,47,
+56,219,3,0,1,3,46,
 1,
 1,
 26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
 46,
-56,219,3,0,1,3,49,
+56,219,3,0,1,3,48,
 46,
 56,220,3,0,1,3,1,1,218,3,
 29,224,3,
@@ -4422,7 +4422,7 @@
 31,0,
 1,
 46,
-56,223,3,0,1,1,66,
+56,223,3,0,1,1,65,
 46,
 56,223,3,0,1,0,
 2,
@@ -4432,29 +4432,29 @@
 1,
 1,
 46,
-56,222,3,0,1,1,49,
+56,222,3,0,1,1,48,
 46,
-56,223,3,0,1,1,47,
+56,223,3,0,1,1,46,
 1,
 46,
-56,222,3,0,1,0,49,
+56,222,3,0,1,0,48,
 1,
 26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
 46,
-56,223,3,0,1,1,47,
+56,223,3,0,1,1,46,
 1,
 46,
-56,223,3,0,1,0,49,
+56,223,3,0,1,0,48,
 1,
 26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
 46,
 56,222,3,0,1,1,1,
 31,0,
 1,
 46,
-56,222,3,0,1,0,66,
+56,222,3,0,1,0,65,
 26,
 47,176,0,0,0,0,0,
 2,
@@ -4462,10 +4462,10 @@
 41,
 1,
 46,
-56,223,3,0,1,0,49,
+56,223,3,0,1,0,48,
 1,
 26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
 46,
 56,222,3,0,1,1,1,
 2,
@@ -4482,15 +4482,15 @@
 47,176,0,0,0,0,0,
 1,
 46,
-56,223,3,0,1,1,48,
+56,223,3,0,1,1,47,
 28,
 47,176,0,211,3,2,
 1,
 1,
 46,
-56,223,3,0,1,1,48,
+56,223,3,0,1,1,47,
 46,
-56,223,3,0,1,0,49,
+56,223,3,0,1,0,48,
 46,
 56,222,3,0,1,1,
 46,
@@ -4499,23 +4499,23 @@
 1,
 1,
 1,
-56,39,4,0,49,
+56,39,4,0,48,
 46,
-56,222,3,0,1,1,47,
+56,222,3,0,1,1,46,
 1,
 46,
-56,222,3,0,1,0,49,
+56,222,3,0,1,0,48,
 1,
 26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
 46,
-56,223,3,0,1,1,47,
+56,223,3,0,1,1,46,
 1,
 46,
-56,223,3,0,1,0,49,
+56,223,3,0,1,0,48,
 1,
 26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
 46,
 56,222,3,0,1,1,1,1,1,211,3,
 29,227,3,
@@ -4544,13 +4544,13 @@
 56,226,3,0,2,2,3,
 1,
 46,
-56,225,3,0,1,3,47,
+56,225,3,0,1,3,46,
 1,
 1,
 26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
 46,
-56,225,3,0,1,3,49,
+56,225,3,0,1,3,48,
 46,
 56,226,3,0,1,3,1,1,224,3,
 29,230,3,
@@ -4568,9 +4568,9 @@
 1,
 1,
 26,
-47,176,0,0,0,0,64,49,
+47,176,0,0,0,0,64,48,
 46,
-56,231,3,0,1,0,71,
+56,231,3,0,1,0,70,
 46,
 56,231,3,0,1,1,
 2,
@@ -4583,49 +4583,49 @@
 1,
 1,
 46,
-56,232,3,0,1,0,49,
+56,232,3,0,1,0,48,
 46,
-56,232,3,0,1,0,49,
+56,232,3,0,1,0,48,
 1,
 46,
-56,231,3,0,1,1,48,
-1,
-26,
-47,176,0,0,0,0,64,49,
-46,
-56,231,3,0,1,0,
-46,
-56,232,3,0,1,1,47,
-1,
-1,
-26,
-47,176,0,0,0,128,63,48,
-46,
-56,232,3,0,1,1,49,
-46,
-56,231,3,0,1,0,47,
-1,
-46,
-56,232,3,0,1,0,49,
-1,
-1,
-40,48,
-46,
 56,231,3,0,1,1,47,
 1,
 26,
-47,176,0,0,0,0,64,49,
+47,176,0,0,0,0,64,48,
 46,
-56,231,3,0,1,0,47,
+56,231,3,0,1,0,
+46,
+56,232,3,0,1,1,46,
+1,
+1,
+26,
+47,176,0,0,0,128,63,47,
+46,
+56,232,3,0,1,1,48,
+46,
+56,231,3,0,1,0,46,
+1,
+46,
+56,232,3,0,1,0,48,
+1,
+1,
+40,47,
+46,
+56,231,3,0,1,1,46,
+1,
+26,
+47,176,0,0,0,0,64,48,
+46,
+56,231,3,0,1,0,46,
 26,
 47,176,0,0,0,128,63,1,
 31,0,
 1,
 1,
 26,
-47,176,0,0,0,128,64,49,
+47,176,0,0,0,128,64,48,
 46,
-56,232,3,0,1,0,71,
+56,232,3,0,1,0,70,
 46,
 56,232,3,0,1,1,
 2,
@@ -4650,26 +4650,26 @@
 47,176,0,0,
 1,
 46,
-56,232,3,0,1,0,49,
+56,232,3,0,1,0,48,
 46,
 56,232,3,0,1,0,
 54,41,4,
 47,176,0,0,
 1,
-56,40,4,0,49,
+56,40,4,0,48,
 46,
 56,232,3,0,1,0,
 54,42,4,
 47,176,0,0,
 1,
 46,
-56,232,3,0,1,1,49,
+56,232,3,0,1,1,48,
 46,
 56,232,3,0,1,1,
 54,43,4,
 47,176,0,0,
 1,
-56,42,4,0,49,
+56,42,4,0,48,
 46,
 56,232,3,0,1,1,
 41,
@@ -4679,58 +4679,58 @@
 1,
 1,
 1,
-56,42,4,0,49,
+56,42,4,0,48,
 1,
 46,
-56,231,3,0,1,0,48,
+56,231,3,0,1,0,47,
 1,
 46,
-56,232,3,0,1,0,49,
+56,232,3,0,1,0,48,
 1,
 1,
 1,
 26,
-47,176,0,0,0,64,64,49,
+47,176,0,0,0,64,64,48,
 46,
-56,231,3,0,1,1,48,
+56,231,3,0,1,1,47,
 1,
 26,
-47,176,0,0,0,192,64,49,
+47,176,0,0,0,192,64,48,
 46,
-56,231,3,0,1,0,48,
+56,231,3,0,1,0,47,
 26,
-47,176,0,0,0,128,63,47,
+47,176,0,0,0,128,63,46,
 1,
 1,
 1,
 26,
-47,176,0,0,0,64,65,49,
+47,176,0,0,0,64,65,48,
 46,
-56,232,3,0,1,1,49,
-56,40,4,0,49,
+56,232,3,0,1,1,48,
+56,40,4,0,48,
 1,
 46,
-56,231,3,0,1,1,48,
+56,231,3,0,1,1,47,
 1,
 26,
-47,176,0,0,0,0,64,49,
+47,176,0,0,0,0,64,48,
 46,
-56,231,3,0,1,0,48,
+56,231,3,0,1,0,47,
 1,
 1,
 26,
-47,176,0,0,0,128,65,49,
-56,41,4,0,49,
+47,176,0,0,0,128,65,48,
+56,41,4,0,48,
 1,
 46,
-56,231,3,0,1,1,48,
+56,231,3,0,1,1,47,
 1,
 26,
-47,176,0,0,0,0,64,49,
+47,176,0,0,0,0,64,48,
 46,
-56,231,3,0,1,0,48,
+56,231,3,0,1,0,47,
 1,
-56,43,4,0,49,
+56,43,4,0,48,
 46,
 56,231,3,0,1,0,
 56,42,4,0,1,
@@ -4742,39 +4742,39 @@
 1,
 1,
 46,
-56,232,3,0,1,0,49,
+56,232,3,0,1,0,48,
 1,
 1,
 46,
-56,231,3,0,1,1,48,
+56,231,3,0,1,1,47,
 1,
 26,
-47,176,0,0,0,0,64,49,
+47,176,0,0,0,0,64,48,
+46,
+56,231,3,0,1,0,46,
+26,
+47,176,0,0,0,128,63,46,
 46,
 56,231,3,0,1,0,47,
-26,
-47,176,0,0,0,128,63,47,
-46,
-56,231,3,0,1,0,48,
 1,
 28,
 47,176,0,113,0,1,
 1,
 46,
-56,232,3,0,1,1,49,
+56,232,3,0,1,1,48,
 46,
-56,232,3,0,1,0,49,
+56,232,3,0,1,0,48,
 1,
 46,
-56,231,3,0,1,1,48,
+56,231,3,0,1,1,47,
 1,
 26,
-47,176,0,0,0,0,64,49,
+47,176,0,0,0,0,64,48,
 46,
-56,231,3,0,1,0,48,
+56,231,3,0,1,0,47,
 1,
 46,
-56,232,3,0,1,1,49,
+56,232,3,0,1,1,48,
 46,
 56,231,3,0,1,0,1,1,1,211,3,
 29,236,3,
@@ -4784,7 +4784,7 @@
 51,
 1,
 46,
-56,235,3,0,1,3,66,
+56,235,3,0,1,3,65,
 26,
 47,176,0,0,0,0,0,
 56,234,3,0,
@@ -4810,13 +4810,13 @@
 56,235,3,0,2,2,3,
 1,
 46,
-56,234,3,0,1,3,47,
+56,234,3,0,1,3,46,
 1,
 1,
 26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
 46,
-56,234,3,0,1,3,49,
+56,234,3,0,1,3,48,
 46,
 56,235,3,0,1,3,1,1,233,3,
 29,239,3,
@@ -4828,33 +4828,33 @@
 1,
 1,
 46,
-56,237,3,0,3,0,1,2,47,
+56,237,3,0,3,0,1,2,46,
 46,
-56,238,3,0,3,0,1,2,48,
+56,238,3,0,3,0,1,2,47,
 1,
 26,
-47,176,0,0,0,0,64,49,
+47,176,0,0,0,0,64,48,
 28,
 47,172,1,200,0,2,
 1,
 46,
-56,237,3,0,3,0,1,2,49,
+56,237,3,0,3,0,1,2,48,
 46,
 56,238,3,0,1,3,
 1,
 46,
-56,238,3,0,3,0,1,2,49,
+56,238,3,0,3,0,1,2,48,
 46,
 56,237,3,0,1,3,
 1,
 46,
-56,237,3,0,1,3,47,
+56,237,3,0,1,3,46,
 1,
 1,
 26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
 46,
-56,237,3,0,1,3,49,
+56,237,3,0,1,3,48,
 46,
 56,238,3,0,1,3,1,0,
 29,242,3,
@@ -4866,26 +4866,26 @@
 1,
 1,
 46,
-56,241,3,0,3,0,1,2,47,
+56,241,3,0,3,0,1,2,46,
 46,
-56,240,3,0,3,0,1,2,48,
+56,240,3,0,3,0,1,2,47,
 1,
 1,
 26,
-47,176,0,0,0,0,64,49,
+47,176,0,0,0,0,64,48,
 46,
-56,241,3,0,3,0,1,2,49,
+56,241,3,0,3,0,1,2,48,
 46,
 56,240,3,0,3,0,1,2,
 1,
 46,
-56,240,3,0,1,3,47,
+56,240,3,0,1,3,46,
 1,
 1,
 26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
 46,
-56,240,3,0,1,3,49,
+56,240,3,0,1,3,48,
 46,
 56,241,3,0,1,3,1,0,
 29,245,3,
@@ -4899,33 +4899,33 @@
 1,
 1,
 26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
 46,
-56,243,3,0,1,3,49,
+56,243,3,0,1,3,48,
 46,
-56,244,3,0,3,0,1,2,47,
+56,244,3,0,3,0,1,2,46,
 1,
 1,
 26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
 46,
-56,244,3,0,1,3,49,
+56,244,3,0,1,3,48,
 46,
-56,243,3,0,3,0,1,2,47,
+56,243,3,0,3,0,1,2,46,
 1,
 46,
-56,243,3,0,3,0,1,2,49,
+56,243,3,0,3,0,1,2,48,
 46,
 56,244,3,0,3,0,1,2,
 1,
 46,
-56,243,3,0,1,3,47,
+56,243,3,0,1,3,46,
 1,
 1,
 26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
 46,
-56,243,3,0,1,3,49,
+56,243,3,0,1,3,48,
 46,
 56,244,3,0,1,3,1,0,
 29,247,3,
@@ -4971,10 +4971,10 @@
 47,172,1,0,
 1,
 1,
-56,44,4,0,48,
+56,44,4,0,47,
 28,
 47,176,0,247,3,1,
-56,248,3,0,47,
+56,248,3,0,46,
 56,248,3,0,
 54,46,4,
 47,176,0,0,
@@ -5003,54 +5003,54 @@
 31,0,
 1,
 1,
-56,46,4,0,69,
+56,46,4,0,68,
 26,
-47,176,0,0,0,0,0,60,
+47,176,0,0,0,0,0,59,
 1,
-56,44,4,0,67,
+56,44,4,0,66,
 56,46,4,0,
 2,
 49,0,0,0,0,1,
 23,
 1,
-56,45,4,1,65,
+56,45,4,1,64,
 1,
-56,44,4,0,47,
+56,44,4,0,46,
 1,
 1,
-56,45,4,0,48,
-56,44,4,0,49,
+56,45,4,0,47,
+56,44,4,0,48,
 28,
 47,176,0,211,3,2,
 56,44,4,0,
 1,
-56,44,4,0,48,
+56,44,4,0,47,
 56,46,4,0,1,
 57,
 31,0,
 1,
 1,
-56,47,4,0,68,
-56,249,3,0,60,
-1,
 56,47,4,0,67,
+56,249,3,0,59,
+1,
+56,47,4,0,66,
 56,44,4,0,
 2,
 49,0,0,0,0,1,
 41,
 1,
-56,44,4,0,47,
+56,44,4,0,46,
 28,
 47,172,1,215,3,2,
 1,
 1,
-56,45,4,0,48,
-56,44,4,0,49,
+56,45,4,0,47,
+56,44,4,0,48,
 1,
-56,249,3,0,48,
+56,249,3,0,47,
 56,44,4,0,
 1,
-56,47,4,0,48,
+56,47,4,0,47,
 56,44,4,0,1,
 2,
 49,0,0,0,0,1,
@@ -5070,7 +5070,7 @@
 46,
 56,252,3,0,1,1,
 46,
-56,252,3,0,1,2,48,
+56,252,3,0,1,2,47,
 28,
 47,176,0,200,0,2,
 28,
@@ -5087,7 +5087,7 @@
 31,0,
 1,
 46,
-56,254,3,0,1,0,69,
+56,254,3,0,1,0,68,
 46,
 56,254,3,0,1,2,
 2,
@@ -5100,15 +5100,15 @@
 28,
 47,176,0,211,3,2,
 1,
-56,255,3,0,49,
+56,255,3,0,48,
 1,
 46,
-56,254,3,0,1,1,48,
+56,254,3,0,1,1,47,
 46,
 56,254,3,0,1,0,
 1,
 46,
-56,254,3,0,1,2,48,
+56,254,3,0,1,2,47,
 46,
 56,254,3,0,1,0,
 56,255,3,0,1,
@@ -5134,7 +5134,7 @@
 31,0,
 1,
 46,
-56,1,4,0,1,0,71,
+56,1,4,0,1,0,70,
 46,
 56,1,4,0,1,1,
 2,
@@ -5142,7 +5142,7 @@
 31,0,
 1,
 46,
-56,1,4,0,1,1,71,
+56,1,4,0,1,1,70,
 46,
 56,1,4,0,1,2,
 2,
@@ -5155,7 +5155,7 @@
 31,0,
 1,
 46,
-56,1,4,0,1,0,71,
+56,1,4,0,1,0,70,
 46,
 56,1,4,0,1,2,
 2,
@@ -5179,7 +5179,7 @@
 31,0,
 1,
 46,
-56,1,4,0,1,0,71,
+56,1,4,0,1,0,70,
 46,
 56,1,4,0,1,2,
 2,
@@ -5194,7 +5194,7 @@
 31,0,
 1,
 46,
-56,1,4,0,1,1,71,
+56,1,4,0,1,1,70,
 46,
 56,1,4,0,1,2,
 2,
@@ -5234,21 +5234,21 @@
 47,176,0,0,
 1,
 46,
-56,5,4,0,1,3,49,
+56,5,4,0,1,3,48,
 46,
 56,4,4,0,1,3,
 54,50,4,
 47,172,1,0,
 1,
 46,
-56,4,4,0,3,0,1,2,49,
+56,4,4,0,3,0,1,2,48,
 46,
 56,5,4,0,1,3,
 54,51,4,
 47,172,1,0,
 1,
 46,
-56,5,4,0,3,0,1,2,49,
+56,5,4,0,3,0,1,2,48,
 46,
 56,4,4,0,1,3,
 41,
@@ -5265,19 +5265,19 @@
 56,50,4,0,
 56,51,4,0,
 56,49,4,0,
-56,51,4,0,47,
+56,51,4,0,46,
 46,
-56,5,4,0,3,0,1,2,48,
-56,51,4,0,47,
+56,5,4,0,3,0,1,2,47,
+56,51,4,0,46,
 46,
-56,4,4,0,3,0,1,2,48,
+56,4,4,0,3,0,1,2,47,
 56,50,4,0,
 1,
 1,
 46,
-56,4,4,0,1,3,47,
+56,4,4,0,1,3,46,
 46,
-56,5,4,0,1,3,48,
+56,5,4,0,1,3,47,
 56,49,4,0,1,2,251,3,3,4,
 29,9,4,
 2,
@@ -5298,21 +5298,21 @@
 47,176,0,0,
 1,
 46,
-56,8,4,0,1,3,49,
+56,8,4,0,1,3,48,
 46,
 56,7,4,0,1,3,
 54,53,4,
 47,172,1,0,
 1,
 46,
-56,7,4,0,3,0,1,2,49,
+56,7,4,0,3,0,1,2,48,
 46,
 56,8,4,0,1,3,
 54,54,4,
 47,172,1,0,
 1,
 46,
-56,8,4,0,3,0,1,2,49,
+56,8,4,0,3,0,1,2,48,
 46,
 56,7,4,0,1,3,
 41,
@@ -5329,19 +5329,19 @@
 56,54,4,0,
 56,53,4,0,
 56,52,4,0,
-56,54,4,0,47,
+56,54,4,0,46,
 46,
-56,8,4,0,3,0,1,2,48,
-56,54,4,0,47,
+56,8,4,0,3,0,1,2,47,
+56,54,4,0,46,
 46,
-56,7,4,0,3,0,1,2,48,
+56,7,4,0,3,0,1,2,47,
 56,53,4,0,
 1,
 1,
 46,
-56,7,4,0,1,3,47,
+56,7,4,0,1,3,46,
 46,
-56,8,4,0,1,3,48,
+56,8,4,0,1,3,47,
 56,52,4,0,1,2,251,3,3,4,
 29,12,4,
 2,
@@ -5362,21 +5362,21 @@
 47,176,0,0,
 1,
 46,
-56,11,4,0,1,3,49,
+56,11,4,0,1,3,48,
 46,
 56,10,4,0,1,3,
 54,56,4,
 47,172,1,0,
 1,
 46,
-56,10,4,0,3,0,1,2,49,
+56,10,4,0,3,0,1,2,48,
 46,
 56,11,4,0,1,3,
 54,57,4,
 47,172,1,0,
 1,
 46,
-56,11,4,0,3,0,1,2,49,
+56,11,4,0,3,0,1,2,48,
 46,
 56,10,4,0,1,3,
 41,
@@ -5390,19 +5390,19 @@
 47,172,1,251,3,3,
 56,56,4,0,
 56,55,4,0,
-56,57,4,0,47,
+56,57,4,0,46,
 46,
-56,11,4,0,3,0,1,2,48,
-56,57,4,0,47,
+56,11,4,0,3,0,1,2,47,
+56,57,4,0,46,
 46,
-56,10,4,0,3,0,1,2,48,
+56,10,4,0,3,0,1,2,47,
 56,56,4,0,
 1,
 1,
 46,
-56,10,4,0,1,3,47,
+56,10,4,0,1,3,46,
 46,
-56,11,4,0,1,3,48,
+56,11,4,0,1,3,47,
 56,55,4,0,1,1,251,3,
 29,15,4,
 2,
@@ -5423,21 +5423,21 @@
 47,176,0,0,
 1,
 46,
-56,14,4,0,1,3,49,
+56,14,4,0,1,3,48,
 46,
 56,13,4,0,1,3,
 54,59,4,
 47,172,1,0,
 1,
 46,
-56,13,4,0,3,0,1,2,49,
+56,13,4,0,3,0,1,2,48,
 46,
 56,14,4,0,1,3,
 54,60,4,
 47,172,1,0,
 1,
 46,
-56,14,4,0,3,0,1,2,49,
+56,14,4,0,3,0,1,2,48,
 46,
 56,13,4,0,1,3,
 41,
@@ -5451,19 +5451,19 @@
 47,172,1,251,3,3,
 56,60,4,0,
 56,58,4,0,
-56,59,4,0,47,
+56,59,4,0,46,
 46,
-56,14,4,0,3,0,1,2,48,
-56,60,4,0,47,
+56,14,4,0,3,0,1,2,47,
+56,60,4,0,46,
 46,
-56,13,4,0,3,0,1,2,48,
+56,13,4,0,3,0,1,2,47,
 56,59,4,0,
 1,
 1,
 46,
-56,13,4,0,1,3,47,
+56,13,4,0,1,3,46,
 46,
-56,14,4,0,1,3,48,
+56,14,4,0,1,3,47,
 56,58,4,0,1,1,251,3,
 21,2,0,
 49,29,0,
@@ -5835,7 +5835,7 @@
 47,15,2,2,
 1,
 46,
-56,20,4,0,3,0,1,2,50,
+56,20,4,0,3,0,1,2,49,
 28,
 47,176,0,224,0,2,
 46,
@@ -5852,7 +5852,7 @@
 47,132,1,2,
 1,
 46,
-56,22,4,0,3,0,1,2,50,
+56,22,4,0,3,0,1,2,49,
 28,
 47,168,0,216,0,2,
 46,
@@ -5867,7 +5867,7 @@
 41,
 1,
 46,
-56,25,4,0,2,0,1,50,
+56,25,4,0,2,0,1,49,
 46,
 56,25,4,0,1,2,1,0,
 29,30,4,
@@ -5885,12 +5885,12 @@
 1,
 1,
 46,
-56,27,4,0,1,0,49,
+56,27,4,0,1,0,48,
 46,
-56,28,4,0,1,1,48,
+56,28,4,0,1,1,47,
 1,
 46,
-56,27,4,0,1,1,49,
+56,27,4,0,1,1,48,
 46,
 56,28,4,0,1,0,1,0,
 29,34,4,
@@ -5908,12 +5908,12 @@
 1,
 1,
 46,
-56,31,4,0,1,0,49,
+56,31,4,0,1,0,48,
 46,
-56,32,4,0,1,1,48,
+56,32,4,0,1,1,47,
 1,
 46,
-56,31,4,0,1,1,49,
+56,31,4,0,1,1,48,
 46,
 56,32,4,0,1,0,1,0,
 20,};
diff --git a/src/sksl/generated/sksl_public.dehydrated.sksl b/src/sksl/generated/sksl_public.dehydrated.sksl
index b6ffce3..8abfa6d 100644
--- a/src/sksl/generated/sksl_public.dehydrated.sksl
+++ b/src/sksl/generated/sksl_public.dehydrated.sksl
@@ -1327,7 +1327,7 @@
 47,139,1,2,
 1,
 46,
-56,138,1,0,3,0,1,2,50,
+56,138,1,0,3,0,1,2,49,
 28,
 47,123,0,155,0,2,
 46,
@@ -1344,7 +1344,7 @@
 47,142,1,2,
 1,
 46,
-56,141,1,0,3,0,1,2,50,
+56,141,1,0,3,0,1,2,49,
 28,
 47,115,0,147,0,2,
 46,
diff --git a/src/sksl/lex/sksl.lex b/src/sksl/lex/sksl.lex
index 93fdf95..23ec9ce 100644
--- a/src/sksl/lex/sksl.lex
+++ b/src/sksl/lex/sksl.lex
@@ -37,7 +37,6 @@
 INLINE         = "inline"
 NOINLINE       = "noinline"
 HASSIDEEFFECTS = "sk_has_side_effects"
-VARYING        = "varying"
 STRUCT         = "struct"
 LAYOUT         = "layout"
 ENUM           = "enum"
diff --git a/tests/VerticesTest.cpp b/tests/VerticesTest.cpp
index d187d1c..cabee01 100644
--- a/tests/VerticesTest.cpp
+++ b/tests/VerticesTest.cpp
@@ -27,18 +27,7 @@
     if (v0.indexCount() != v1.indexCount()) {
         return false;
     }
-    if (v0.attributeCount() != v1.attributeCount()) {
-        return false;
-    }
-    for (int i = 0; i < v0.attributeCount(); ++i) {
-        if (v0.attributes()[i] != v1.attributes()[i]) {
-            return false;
-        }
-    }
 
-    if (!!v0.customData() != !!v1.customData()) {
-        return false;
-    }
     if (!!v0.texCoords() != !!v1.texCoords()) {
         return false;
     }
@@ -61,12 +50,6 @@
             }
         }
     }
-    size_t totalCustomDataSize = v0.vertexCount() * v0.customDataSize();
-    if (totalCustomDataSize) {
-        if (0 != memcmp(v0.customData(), v1.customData(), totalCustomDataSize)) {
-            return false;
-        }
-    }
     for (int i = 0; i < v0.indexCount(); ++i) {
         if (v0.indices()[i] != v1.indices()[i]) {
             return false;
@@ -122,41 +105,6 @@
         }
     }
 
-    // custom data tests
-    using AttrType = SkVertices::Attribute::Type;
-    struct {
-        int count;
-        size_t expected_size;
-        SkVertices::Attribute attrs[4];
-    } attrTests[] = {
-        { 1,  4, { AttrType::kFloat } },
-        { 1,  8, { AttrType::kFloat2 } },
-        { 1, 12, { AttrType::kFloat3 } },
-        { 1, 16, { AttrType::kFloat4 } },
-        { 1,  4, { AttrType::kByte4_unorm } },
-        { 4, 16, { AttrType::kFloat, AttrType::kFloat, AttrType::kFloat, AttrType::kFloat } },
-        { 2, 12, { AttrType::kFloat2, AttrType::kByte4_unorm } },
-        { 2, 12, { AttrType::kByte4_unorm, AttrType::kFloat2 } },
-    };
-
-    for (const auto& test : attrTests) {
-        SkVertices::Builder builder(SkVertices::kTriangles_VertexMode, vCount, iCount,
-                                    test.attrs, test.count);
-
-        float* customData = (float*)builder.customData();
-        int customDataCount = test.expected_size / sizeof(float);
-        for (int i = 0; i < vCount; ++i) {
-            builder.positions()[i].set((float)i, 1);
-            for (int j = 0; j < customDataCount; ++j) {
-                customData[i * customDataCount + j] = (float)j;
-            }
-        }
-        for (int i = 0; i < iCount; ++i) {
-            builder.indices()[i] = i % vCount;
-        }
-        self_test(builder.detach(), reporter);
-    }
-
     {
         // This has the maximum number of vertices to be rewritten as indexed triangles without
         // overflowing a 16bit index.
@@ -188,31 +136,6 @@
                                     SkVertices::kHasColors_BuilderFlag);
         REPORTER_ASSERT(reporter, !builder.isValid());
     }
-
-    // validity tests for per-vertex-data
-
-    // Check that invalid counts fail to initialize the builder
-    for (int attrCount : {-1, 0, SkVertices::kMaxCustomAttributes + 1}) {
-        SkVertices::Attribute attrs[] = { AttrType::kFloat };
-        SkVertices::Builder builder(SkVertices::kTriangleFan_VertexMode, 10, 0, attrs, attrCount);
-        REPORTER_ASSERT(reporter, !builder.isValid());
-    }
-    {   // nullptr is definitely bad
-        SkVertices::Builder builder(SkVertices::kTriangleFan_VertexMode, 10, 0, nullptr, 4);
-        REPORTER_ASSERT(reporter, !builder.isValid());
-    }
-    {   // "normal" number of per-vertex-data (all floats)
-        SkVertices::Attribute attrs[] = {AttrType::kFloat2, AttrType::kFloat2};
-        SkVertices::Builder builder(SkVertices::kTriangleFan_VertexMode, 10, 0, attrs, 2);
-        REPORTER_ASSERT(reporter, builder.isValid());
-        REPORTER_ASSERT(reporter, builder.customData() != nullptr);
-    }
-    {   // "normal" number of per-vertex-data (with packed bytes)
-        SkVertices::Attribute attrs[] = {AttrType::kFloat2, AttrType::kByte4_unorm};
-        SkVertices::Builder builder(SkVertices::kTriangleFan_VertexMode, 10, 0, attrs, 2);
-        REPORTER_ASSERT(reporter, builder.isValid());
-        REPORTER_ASSERT(reporter, builder.customData() != nullptr);
-    }
 }
 
 static void fill_triangle(SkCanvas* canvas, const SkPoint pts[], SkColor c) {
diff --git a/tests/sksl/errors/BadModifiers.glsl b/tests/sksl/errors/BadModifiers.glsl
index 39a06ec..ebdd703 100644
--- a/tests/sksl/errors/BadModifiers.glsl
+++ b/tests/sksl/errors/BadModifiers.glsl
@@ -6,19 +6,16 @@
 error: 1: 'uniform' is not permitted here
 error: 1: 'flat' is not permitted here
 error: 1: 'noperspective' is not permitted here
-error: 1: 'varying' is not permitted here
 error: 1: functions cannot be both 'inline' and 'noinline'
 error: 4: 'uniform' is not permitted here
 error: 4: 'flat' is not permitted here
 error: 4: 'noperspective' is not permitted here
 error: 4: 'sk_has_side_effects' is not permitted here
-error: 4: 'varying' is not permitted here
 error: 4: 'inline' is not permitted here
 error: 4: 'noinline' is not permitted here
 error: 6: 'in uniform' variables only permitted within fragment processors
-error: 6: 'varying' is only permitted in runtime shaders
 error: 6: 'sk_has_side_effects' is not permitted here
 error: 6: 'inline' is not permitted here
 error: 6: 'noinline' is not permitted here
 error: 6: 'const' variables must be initialized
-21 errors
+18 errors
diff --git a/tests/sksl/errors/ModifiersInStruct.glsl b/tests/sksl/errors/ModifiersInStruct.glsl
index c98590f..c22d25c 100644
--- a/tests/sksl/errors/ModifiersInStruct.glsl
+++ b/tests/sksl/errors/ModifiersInStruct.glsl
@@ -4,5 +4,5 @@
 error: 3: modifier 'uniform' is not permitted on a struct field
 error: 4: modifier 'flat' is not permitted on a struct field
 error: 5: modifier 'noperspective' is not permitted on a struct field
-error: 6: modifier 'varying inout' is not permitted on a struct field
+error: 6: modifier 'inout' is not permitted on a struct field
 5 errors