This is an automated email from the ASF dual-hosted git repository.

benweidig pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tapestry-5.git

commit e873e175d62d4aa00c34e966792123ca3b158642
Author: Ben Weidig <[email protected]>
AuthorDate: Tue May 26 07:33:15 2026 +0200

    TAP5-2830: Automate ASM vendoring, update to 9.9.1
---
 justfile                                           |   4 +
 .../{LICENSE-ASM-9_2.txt => LICENSE-ASM_9_9_1.txt} |   0
 plastic/NOTICE.txt                                 |   4 +-
 .../tapestry5/internal/plastic/asm/Attribute.java  |   3 +-
 .../internal/plastic/asm/ClassReader.java          |   5 +-
 .../internal/plastic/asm/ClassWriter.java          |   2 +-
 .../tapestry5/internal/plastic/asm/Constants.java  |   6 +-
 .../tapestry5/internal/plastic/asm/Handle.java     |   2 +-
 .../internal/plastic/asm/MethodVisitor.java        |   2 +-
 .../tapestry5/internal/plastic/asm/Opcodes.java    |   3 +-
 .../plastic/asm/commons/AnnotationRemapper.java    |   6 +-
 .../plastic/asm/commons/ClassRemapper.java         |   2 +-
 .../plastic/asm/commons/FieldRemapper.java         |   2 +-
 .../plastic/asm/commons/InstructionAdapter.java    |   6 +-
 .../plastic/asm/commons/MethodRemapper.java        |   2 +-
 .../asm/commons/RecordComponentRemapper.java       |   2 +-
 .../internal/plastic/asm/commons/Remapper.java     | 128 ++++++++++++++++++--
 .../plastic/asm/commons/SimpleRemapper.java        |  15 ++-
 .../internal/plastic/asm/commons/package.html      |   2 +-
 .../tapestry5/internal/plastic/asm/package.html    |  28 ++---
 .../internal/plastic/asm/signature/package.html    |   2 +-
 .../plastic/asm/tree/analysis/package.html         |   2 +-
 .../internal/plastic/asm/tree/package.html         |   2 +-
 .../plastic/asm/util/CheckMethodAdapter.java       |   7 +-
 .../internal/plastic/asm/util/Printer.java         |   2 +-
 .../internal/plastic/asm/util/Textifier.java       |   8 +-
 .../internal/plastic/asm/util/package.html         |   2 +-
 .../apache/tapestry5/plastic/PlasticConstants.java |   2 +-
 plastic/vendor-asm.sh                              | 130 +++++++++++++++++++++
 29 files changed, 321 insertions(+), 60 deletions(-)

diff --git a/justfile b/justfile
index bee48c574..5eec21126 100644
--- a/justfile
+++ b/justfile
@@ -55,3 +55,7 @@ clean-build:
 # Compiles and generates all JavaScript files from CoffeeScript
 generate-javascript:
        ./gradlew tapestry-core:compileCoffeeScript 
tapestry-core:compileProcessedCoffeeScript tapestry-core:compileTestCoffeeScript
+
+# Vendors ASM based on Git tag, no tag lists the available ones
+vendor-asm tag="":
+       ./plastic/vendor-asm.sh {{tag}}
diff --git a/plastic/LICENSE-ASM-9_2.txt b/plastic/LICENSE-ASM_9_9_1.txt
old mode 100755
new mode 100644
similarity index 100%
rename from plastic/LICENSE-ASM-9_2.txt
rename to plastic/LICENSE-ASM_9_9_1.txt
diff --git a/plastic/NOTICE.txt b/plastic/NOTICE.txt
index beec8e08f..9718bb6e2 100644
--- a/plastic/NOTICE.txt
+++ b/plastic/NOTICE.txt
@@ -1,6 +1,6 @@
 This product includes software developed by
 The Apache Software Foundation (http://www.apache.org/).
 
-This product imports and repackages ASM 5.0.1 code which is
+This product imports and repackages ASM 9.9.1 code which is
 released under a BSD style License
-http://asm.ow2.org/license.html
+https://asm.ow2.io/license.html
diff --git 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/Attribute.java
 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/Attribute.java
index f43940e23..85dcfd0e2 100644
--- 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/Attribute.java
+++ 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/Attribute.java
@@ -95,7 +95,7 @@ public class Attribute {
    *     a Code attribute that contains labels.
    * @deprecated no longer used by ASM.
    */
-  @Deprecated
+  @Deprecated(forRemoval = false)
   protected Label[] getLabels() {
     return new Label[0];
   }
@@ -174,6 +174,7 @@ public class Attribute {
    * ClassReader overrides {@link ClassReader#readLabel}. Hence {@link 
#read(ClassReader, int, int,
    * char[], int, Label[])} must not manually create {@link Label} instances.
    *
+   * @param classReader the class that contains the attribute to be read.
    * @param bytecodeOffset a bytecode offset in a method.
    * @param labels the already created labels, indexed by their offset. If a 
label already exists
    *     for bytecodeOffset this method does not create a new one. Otherwise 
it stores the new label
diff --git 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/ClassReader.java
 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/ClassReader.java
index c6da5be30..12b1113c4 100644
--- 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/ClassReader.java
+++ 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/ClassReader.java
@@ -100,7 +100,7 @@ public class ClassReader {
    * @deprecated Use {@link #readByte(int)} and the other read methods 
instead. This field will
    *     eventually be deleted.
    */
-  @Deprecated
+  @Deprecated(forRemoval = false)
   // DontCheck(MemberName): can't be renamed (for backward binary 
compatibility).
   public final byte[] b;
 
@@ -3539,6 +3539,9 @@ public class ClassReader {
       final char[] charBuffer,
       final int codeAttributeOffset,
       final Label[] labels) {
+    if (length > classFileBuffer.length - offset) {
+      throw new IllegalArgumentException();
+    }
     for (Attribute attributePrototype : attributePrototypes) {
       if (attributePrototype.type.equals(type)) {
         return attributePrototype.read(
diff --git 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/ClassWriter.java
 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/ClassWriter.java
index 7b9d94928..7af51d386 100644
--- 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/ClassWriter.java
+++ 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/ClassWriter.java
@@ -897,7 +897,7 @@ public class ClassWriter extends ClassVisitor {
    * @deprecated this method is superseded by {@link #newHandle(int, String, 
String, String,
    *     boolean)}.
    */
-  @Deprecated
+  @Deprecated(forRemoval = false)
   public int newHandle(
       final int tag, final String owner, final String name, final String 
descriptor) {
     return newHandle(tag, owner, name, descriptor, tag == 
Opcodes.H_INVOKEINTERFACE);
diff --git 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/Constants.java
 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/Constants.java
index ee9ed838d..bf9361d5b 100644
--- 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/Constants.java
+++ 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/Constants.java
@@ -191,15 +191,15 @@ final class Constants {
   }
 
   static boolean isWhitelisted(final String internalName) {
-    if (!internalName.startsWith("org/objectweb/asm/")) {
+    if 
(!internalName.startsWith("org/apache/tapestry5/internal/plastic/asm/")) {
       return false;
     }
     String member = 
"(Annotation|Class|Field|Method|Module|RecordComponent|Signature)";
     return internalName.contains("Test$")
         || Pattern.matches(
-            "org/objectweb/asm/util/Trace" + member + "Visitor(\\$.*)?", 
internalName)
+            "org/apache/tapestry5/internal/plastic/asm/util/Trace" + member + 
"Visitor(\\$.*)?", internalName)
         || Pattern.matches(
-            "org/objectweb/asm/util/Check" + member + "Adapter(\\$.*)?", 
internalName);
+            "org/apache/tapestry5/internal/plastic/asm/util/Check" + member + 
"Adapter(\\$.*)?", internalName);
   }
 
   static void checkIsPreview(final InputStream classInputStream) {
diff --git 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/Handle.java
 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/Handle.java
index 9536e2848..ef17aa3d5 100644
--- 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/Handle.java
+++ 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/Handle.java
@@ -71,7 +71,7 @@ public final class Handle {
    * @deprecated this constructor has been superseded by {@link #Handle(int, 
String, String, String,
    *     boolean)}.
    */
-  @Deprecated
+  @Deprecated(forRemoval = false)
   public Handle(final int tag, final String owner, final String name, final 
String descriptor) {
     this(tag, owner, name, descriptor, tag == Opcodes.H_INVOKEINTERFACE);
   }
diff --git 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/MethodVisitor.java
 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/MethodVisitor.java
index ae2bb34ee..393fa6c3f 100644
--- 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/MethodVisitor.java
+++ 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/MethodVisitor.java
@@ -416,7 +416,7 @@ public abstract class MethodVisitor {
    * @param descriptor the method's descriptor (see {@link Type}).
    * @deprecated use {@link #visitMethodInsn(int, String, String, String, 
boolean)} instead.
    */
-  @Deprecated
+  @Deprecated(forRemoval = false)
   public void visitMethodInsn(
       final int opcode, final String owner, final String name, final String 
descriptor) {
     int opcodeAndSource = opcode | (api < Opcodes.ASM5 ? 
Opcodes.SOURCE_DEPRECATED : 0);
diff --git 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/Opcodes.java
 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/Opcodes.java
index 42cf12956..f60dac661 100644
--- 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/Opcodes.java
+++ 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/Opcodes.java
@@ -56,7 +56,8 @@ public interface Opcodes {
    *
    * @deprecated This API is experimental.
    */
-  @Deprecated int ASM10_EXPERIMENTAL = 1 << 24 | 10 << 16 | 0 << 8;
+  @Deprecated(forRemoval = false)
+  int ASM10_EXPERIMENTAL = 1 << 24 | 10 << 16 | 0 << 8;
 
   /*
    * Internal flags used to redirect calls to deprecated methods. For 
instance, if a visitOldStuff
diff --git 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/AnnotationRemapper.java
 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/AnnotationRemapper.java
index b8eabc06f..0a40d3a0e 100644
--- 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/AnnotationRemapper.java
+++ 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/AnnotationRemapper.java
@@ -55,7 +55,7 @@ public class AnnotationRemapper extends AnnotationVisitor {
    * @param remapper the remapper to use to remap the types in the visited 
annotation.
    * @deprecated use {@link #AnnotationRemapper(String, AnnotationVisitor, 
Remapper)} instead.
    */
-  @Deprecated
+  @Deprecated(forRemoval = false)
   public AnnotationRemapper(final AnnotationVisitor annotationVisitor, final 
Remapper remapper) {
     this(/* descriptor= */ null, annotationVisitor, remapper);
   }
@@ -83,7 +83,7 @@ public class AnnotationRemapper extends AnnotationVisitor {
    * @param remapper the remapper to use to remap the types in the visited 
annotation.
    * @deprecated use {@link #AnnotationRemapper(int, String, 
AnnotationVisitor, Remapper)} instead.
    */
-  @Deprecated
+  @Deprecated(forRemoval = false)
   protected AnnotationRemapper(
       final int api, final AnnotationVisitor annotationVisitor, final Remapper 
remapper) {
     this(api, /* descriptor= */ null, annotationVisitor, remapper);
@@ -151,7 +151,7 @@ public class AnnotationRemapper extends AnnotationVisitor {
    * @return the newly created remapper.
    * @deprecated use {@link #createAnnotationRemapper(String, 
AnnotationVisitor)} instead.
    */
-  @Deprecated
+  @Deprecated(forRemoval = false)
   protected AnnotationVisitor createAnnotationRemapper(final AnnotationVisitor 
annotationVisitor) {
     return new AnnotationRemapper(api, /* descriptor= */ null, 
annotationVisitor, remapper);
   }
diff --git 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/ClassRemapper.java
 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/ClassRemapper.java
index ed3555736..0f601f99e 100644
--- 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/ClassRemapper.java
+++ 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/ClassRemapper.java
@@ -256,7 +256,7 @@ public class ClassRemapper extends ClassVisitor {
    * @return the newly created remapper.
    * @deprecated use {@link #createAnnotationRemapper(String, 
AnnotationVisitor)} instead.
    */
-  @Deprecated
+  @Deprecated(forRemoval = false)
   protected AnnotationVisitor createAnnotationRemapper(final AnnotationVisitor 
annotationVisitor) {
     return new AnnotationRemapper(api, /* descriptor= */ null, 
annotationVisitor, remapper);
   }
diff --git 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/FieldRemapper.java
 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/FieldRemapper.java
index 37065d76a..03fd95200 100644
--- 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/FieldRemapper.java
+++ 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/FieldRemapper.java
@@ -94,7 +94,7 @@ public class FieldRemapper extends FieldVisitor {
    * @return the newly created remapper.
    * @deprecated use {@link #createAnnotationRemapper(String, 
AnnotationVisitor)} instead.
    */
-  @Deprecated
+  @Deprecated(forRemoval = false)
   protected AnnotationVisitor createAnnotationRemapper(final AnnotationVisitor 
annotationVisitor) {
     return new AnnotationRemapper(api, /* descriptor= */ null, 
annotationVisitor, remapper);
   }
diff --git 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/InstructionAdapter.java
 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/InstructionAdapter.java
index 88b0177ea..3bded9115 100644
--- 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/InstructionAdapter.java
+++ 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/InstructionAdapter.java
@@ -1072,7 +1072,7 @@ public class InstructionAdapter extends MethodVisitor {
    * @param descriptor the method's descriptor (see {@link Type}).
    * @deprecated use {@link #invokevirtual(String, String, String, boolean)} 
instead.
    */
-  @Deprecated
+  @Deprecated(forRemoval = false)
   public void invokevirtual(final String owner, final String name, final 
String descriptor) {
     if (api >= Opcodes.ASM5) {
       invokevirtual(owner, name, descriptor, false);
@@ -1111,7 +1111,7 @@ public class InstructionAdapter extends MethodVisitor {
    * @param descriptor the method's descriptor (see {@link Type}).
    * @deprecated use {@link #invokespecial(String, String, String, boolean)} 
instead.
    */
-  @Deprecated
+  @Deprecated(forRemoval = false)
   public void invokespecial(final String owner, final String name, final 
String descriptor) {
     if (api >= Opcodes.ASM5) {
       invokespecial(owner, name, descriptor, false);
@@ -1150,7 +1150,7 @@ public class InstructionAdapter extends MethodVisitor {
    * @param descriptor the method's descriptor (see {@link Type}).
    * @deprecated use {@link #invokestatic(String, String, String, boolean)} 
instead.
    */
-  @Deprecated
+  @Deprecated(forRemoval = false)
   public void invokestatic(final String owner, final String name, final String 
descriptor) {
     if (api >= Opcodes.ASM5) {
       invokestatic(owner, name, descriptor, false);
diff --git 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/MethodRemapper.java
 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/MethodRemapper.java
index 3a4d20f23..0668d0046 100644
--- 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/MethodRemapper.java
+++ 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/MethodRemapper.java
@@ -278,7 +278,7 @@ public class MethodRemapper extends MethodVisitor {
    * @return the newly created remapper.
    * @deprecated use {@link #createAnnotationRemapper(String, 
AnnotationVisitor)} instead.
    */
-  @Deprecated
+  @Deprecated(forRemoval = false)
   protected AnnotationVisitor createAnnotationRemapper(final AnnotationVisitor 
annotationVisitor) {
     return new AnnotationRemapper(api, /* descriptor= */ null, 
annotationVisitor, remapper);
   }
diff --git 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/RecordComponentRemapper.java
 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/RecordComponentRemapper.java
index d45b48103..423f9e195 100644
--- 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/RecordComponentRemapper.java
+++ 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/RecordComponentRemapper.java
@@ -97,7 +97,7 @@ public class RecordComponentRemapper extends 
RecordComponentVisitor {
    * @return the newly created remapper.
    * @deprecated use {@link #createAnnotationRemapper(String, 
AnnotationVisitor)} instead.
    */
-  @Deprecated
+  @Deprecated(forRemoval = false)
   protected AnnotationVisitor createAnnotationRemapper(final AnnotationVisitor 
annotationVisitor) {
     return new AnnotationRemapper(api, /* descriptor= */ null, 
annotationVisitor, remapper);
   }
diff --git 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/Remapper.java
 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/Remapper.java
index 27c3fa880..3189076a2 100644
--- 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/Remapper.java
+++ 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/Remapper.java
@@ -43,6 +43,20 @@ import 
org.apache.tapestry5.internal.plastic.asm.signature.SignatureWriter;
  */
 public abstract class Remapper {
 
+  // The class name of LambdaMetafactory.
+  private static final String LAMBDA_FACTORY_CLASSNAME = 
"java/lang/invoke/LambdaMetafactory";
+
+  // The method signature of LambdaMetafactory.metafactory(...).
+  private static final String LAMBDA_FACTORY_METAFACTORY =
+      
"(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;"
+          + "Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;"
+          + "Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;";
+
+  // The method signature of LambdaMetafactory.altMetafactory(...).
+  private static final String LAMBDA_FACTORY_ALTMETAFACTORY =
+      
"(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;"
+          + "[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;";
+
   /**
    * The ASM API version supported by this remapper, or 0 for instances 
created with the deprecated
    * constructor.
@@ -54,8 +68,8 @@ public abstract class Remapper {
    *
    * @deprecated use {@link #Remapper(int)} instead.
    */
-  @Deprecated
-  public Remapper() {
+  @Deprecated(forRemoval = false)
+  protected Remapper() {
     this.api = 0;
   }
 
@@ -65,7 +79,7 @@ public abstract class Remapper {
    * @param api the ASM API version supported by this remapper. Must be one of 
the {@code
    *     ASM}<i>x</i> values in {@link Opcodes}.
    */
-  public Remapper(final int api) {
+  protected Remapper(final int api) {
     if (api != Opcodes.ASM9
         && api != Opcodes.ASM8
         && api != Opcodes.ASM7
@@ -269,7 +283,7 @@ public abstract class Remapper {
    * @return the newly created remapper.
    * @deprecated use {@link #createSignatureRemapper} instead.
    */
-  @Deprecated
+  @Deprecated(forRemoval = false)
   protected SignatureVisitor createRemappingSignatureAdapter(
       final SignatureVisitor signatureVisitor) {
     return createSignatureRemapper(signatureVisitor);
@@ -319,11 +333,11 @@ public abstract class Remapper {
     } else {
       int originSplit = name.lastIndexOf('/');
       int remappedSplit = remappedInnerName.lastIndexOf('/');
-      if (originSplit != -1 && remappedSplit != -1) {
-        if 
(name.substring(originSplit).equals(remappedInnerName.substring(remappedSplit)))
 {
-          // class name not changed
-          return innerName;
-        }
+      if (originSplit != -1
+          && remappedSplit != -1
+          && 
name.substring(originSplit).equals(remappedInnerName.substring(remappedSplit))) 
{
+        // class name not changed
+        return innerName;
       }
     }
 
@@ -362,11 +376,103 @@ public abstract class Remapper {
    * @return the new name of the method.
    * @deprecated use {@link #mapInvokeDynamicMethodName(String, String, 
Handle, Object...)} instead.
    */
-  @Deprecated
+  @Deprecated(forRemoval = false)
   public String mapInvokeDynamicMethodName(final String name, final String 
descriptor) {
     return name;
   }
 
+  /**
+   * Maps an invokedynamic or a constant dynamic method name to its new name. 
Subclasses can
+   * override.
+   *
+   * <p>The default implementation of this method first performs well-known 
rule checks (calling
+   * {@link #mapWellKnownInvokeDynamicMethodName(String, String, Handle, 
Object...)}) and then
+   * performs basic remapping (calling {@link 
#mapBasicInvokeDynamicMethodName(String, String,
+   * Handle, Object...)}).
+   *
+   * <p>For most users, only {@link #mapBasicInvokeDynamicMethodName(String, 
String, Handle,
+   * Object...)} needs to be overridden.
+   *
+   * @param name the name of the method.
+   * @param descriptor the descriptor of the method.
+   * @param bootstrapMethodHandle the bootstrap method.
+   * @param bootstrapMethodArguments the bootstrap method constant arguments. 
Each argument must be
+   *     an {@link Integer}, {@link Float}, {@link Long}, {@link Double}, 
{@link String}, {@link
+   *     Type}, {@link Handle} or {@link ConstantDynamic} value. This method 
is allowed to modify
+   *     the content of the array so a caller should expect that this array 
may change.
+   * @return the new name of the method.
+   */
+  public String mapInvokeDynamicMethodName(
+      final String name,
+      final String descriptor,
+      final Handle bootstrapMethodHandle,
+      final Object... bootstrapMethodArguments) {
+    String mappedWellKnownName =
+        mapWellKnownInvokeDynamicMethodName(
+            name, descriptor, bootstrapMethodHandle, bootstrapMethodArguments);
+    if (mappedWellKnownName != null) {
+      return mappedWellKnownName;
+    }
+    return mapBasicInvokeDynamicMethodName(
+        name, descriptor, bootstrapMethodHandle, bootstrapMethodArguments);
+  }
+
+  /**
+   * Maps well-known invokedynamic (e.g. lambda creation) or const dynamic 
method names to their new
+   * names. This method detects specific invokedynamic method rules and remaps 
using the
+   * corresponding rules. When no rule is matched, returns {@literal null}. 
When non-null is
+   * returned, it means that this invokedynamic method name matches a rule and 
has been remapped
+   * with the relevant rule. Subclasses can override.
+   *
+   * @param name the name of the method.
+   * @param descriptor the descriptor of the method.
+   * @param bootstrapMethodHandle the bootstrap method.
+   * @param bootstrapMethodArguments the bootstrap method constant arguments. 
Each argument must be
+   *     an {@link Integer}, {@link Float}, {@link Long}, {@link Double}, 
{@link String}, {@link
+   *     Type}, {@link Handle} or {@link ConstantDynamic} value. This method 
is allowed to modify
+   *     the content of the array so a caller should expect that this array 
may change.
+   * @return the new name of the method, or null if no special rule is matched.
+   */
+  public String mapWellKnownInvokeDynamicMethodName(
+      final String name,
+      final String descriptor,
+      final Handle bootstrapMethodHandle,
+      final Object... bootstrapMethodArguments) {
+
+    if (LAMBDA_FACTORY_CLASSNAME.equals(bootstrapMethodHandle.getOwner())
+        && bootstrapMethodHandle.getTag() == Opcodes.H_INVOKESTATIC) {
+      // This is a lambda creation.
+      // Note: **if** is reserved for future JDK changes.
+      boolean isMetafactory = false;
+      isMetafactory |=
+          "metafactory".equals(bootstrapMethodHandle.getName())
+              && 
LAMBDA_FACTORY_METAFACTORY.equals(bootstrapMethodHandle.getDesc());
+      isMetafactory |=
+          "altMetafactory".equals(bootstrapMethodHandle.getName())
+              && 
LAMBDA_FACTORY_ALTMETAFACTORY.equals(bootstrapMethodHandle.getDesc());
+
+      if (isMetafactory) {
+        // Note:
+        // Java lambda instances are created by 
LambdaMetafactory.metafactory() and
+        // LambdaMetafactory.altMetafactory().
+        // The specification can be found in the LambdaMetafactory javadoc:
+        // 
https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/invoke/LambdaMetafactory.html
+        //
+        // In short, all the necessary parameters can be obtained from this 
invokedynamic, including
+        // the following three:
+        // - Class name: From return type of method descriptor.
+        // - Method name: Same as the name of invokedynamic.
+        // - Method descriptor: From the first bootstrap argument.
+        return mapMethodName(
+            Type.getReturnType(descriptor).getInternalName(),
+            name,
+            bootstrapMethodArguments[0].toString());
+      }
+    }
+
+    return null;
+  }
+
   /**
    * Maps an invokedynamic or a constant dynamic method name to its new name. 
The default
    * implementation of this method returns the given name, unchanged. 
Subclasses can override.
@@ -380,7 +486,7 @@ public abstract class Remapper {
    *     the content of the array so a caller should expect that this array 
may change.
    * @return the new name of the method.
    */
-  public String mapInvokeDynamicMethodName(
+  public String mapBasicInvokeDynamicMethodName(
       final String name,
       final String descriptor,
       final Handle bootstrapMethodHandle,
diff --git 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/SimpleRemapper.java
 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/SimpleRemapper.java
index a3fc44570..bdebaeee4 100644
--- 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/SimpleRemapper.java
+++ 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/SimpleRemapper.java
@@ -63,7 +63,7 @@ public class SimpleRemapper extends Remapper {
    *
    * @deprecated use {@link #SimpleRemapper(int, Map)} instead.
    */
-  @Deprecated
+  @Deprecated(forRemoval = false)
   public SimpleRemapper(final Map<String, String> mapping) {
     this.mapping = mapping;
   }
@@ -103,7 +103,7 @@ public class SimpleRemapper extends Remapper {
    *     org.apache.tapestry5.internal.plastic.asm.Type#getInternalName()}).
    * @deprecated use {@link #SimpleRemapper(int, String, String)} instead.
    */
-  @Deprecated
+  @Deprecated(forRemoval = false)
   public SimpleRemapper(final String oldName, final String newName) {
     this.mapping = Collections.singletonMap(oldName, newName);
   }
@@ -129,14 +129,23 @@ public class SimpleRemapper extends Remapper {
     return remappedName == null ? name : remappedName;
   }
 
+  /**
+   * Maps an invokedynamic or a constant dynamic method name to its new name.
+   *
+   * @param name the name of the method.
+   * @param descriptor the descriptor of the method.
+   * @return the new name of the method.
+   * @deprecated use {@link #mapInvokeDynamicMethodName(String, String, 
Handle, Object...)} instead.
+   */
   @Override
+  @Deprecated(forRemoval = false)
   public String mapInvokeDynamicMethodName(final String name, final String 
descriptor) {
     String remappedName = map('.' + name + descriptor);
     return remappedName == null ? name : remappedName;
   }
 
   @Override
-  public String mapInvokeDynamicMethodName(
+  public String mapBasicInvokeDynamicMethodName(
       final String name,
       final String descriptor,
       final Handle bootstrapMethodHandle,
diff --git 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/package.html
 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/package.html
index f24ae4faa..de52b68f4 100644
--- 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/package.html
+++ 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/package.html
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
 -->
 <head>
-  <title>Package org.objectweb.asm.commons</title>
+  <title>Package org.apache.tapestry5.internal.plastic.asm.commons</title>
 </head>
 <body>
 Provides some useful class and method adapters. <em>The preferred way of using
diff --git 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/package.html
 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/package.html
index db0d8a2e4..ba396bf78 100644
--- 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/package.html
+++ 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/package.html
@@ -30,46 +30,46 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
 -->
 <head>
-  <title>Package org.objectweb.asm</title>
+  <title>Package org.apache.tapestry5.internal.plastic.asm</title>
 </head>
 <body>
 Provides a small and fast bytecode manipulation framework.
 
 <p>
 The <a href="http://asm.ow2.org/";>ASM</a> framework is organized
-around the {@link org.objectweb.asm.ClassVisitor ClassVisitor},
-{@link org.objectweb.asm.FieldVisitor FieldVisitor},
-{@link org.objectweb.asm.MethodVisitor MethodVisitor} and
-{@link org.objectweb.asm.AnnotationVisitor AnnotationVisitor} abstract classes,
+around the {@link org.apache.tapestry5.internal.plastic.asm.ClassVisitor 
ClassVisitor},
+{@link org.apache.tapestry5.internal.plastic.asm.FieldVisitor FieldVisitor},
+{@link org.apache.tapestry5.internal.plastic.asm.MethodVisitor MethodVisitor} 
and
+{@link org.apache.tapestry5.internal.plastic.asm.AnnotationVisitor 
AnnotationVisitor} abstract classes,
 which allow one to visit the fields, methods and annotations of a class,
 including the bytecode instructions of each method.
 
 <p>
 In addition to these main abstract classes, ASM provides a {@link
-org.objectweb.asm.ClassReader ClassReader} class, that can parse an
+org.apache.tapestry5.internal.plastic.asm.ClassReader ClassReader} class, that 
can parse an
 existing class and make a given visitor visit it. ASM also provides
-a {@link org.objectweb.asm.ClassWriter ClassWriter} class, which is
+a {@link org.apache.tapestry5.internal.plastic.asm.ClassWriter ClassWriter} 
class, which is
 a visitor that generates Java class files.
 
 <p>
 In order to generate a class from scratch, only the {@link
-org.objectweb.asm.ClassWriter ClassWriter} class is necessary. Indeed,
+org.apache.tapestry5.internal.plastic.asm.ClassWriter ClassWriter} class is 
necessary. Indeed,
 in order to generate a class, one must just call its visit<em>Xxx</em>
 methods with the appropriate arguments to generate the desired fields
 and methods.
 
 <p>
 In order to modify existing classes, one must use a {@link
-org.objectweb.asm.ClassReader ClassReader} class to analyze
-the original class, a class modifier, and a {@link 
org.objectweb.asm.ClassWriter
+org.apache.tapestry5.internal.plastic.asm.ClassReader ClassReader} class to 
analyze
+the original class, a class modifier, and a {@link 
org.apache.tapestry5.internal.plastic.asm.ClassWriter
 ClassWriter} to construct the modified class. The class modifier
-is just a {@link org.objectweb.asm.ClassVisitor ClassVisitor}
-that delegates most of the work to another {@link 
org.objectweb.asm.ClassVisitor
+is just a {@link org.apache.tapestry5.internal.plastic.asm.ClassVisitor 
ClassVisitor}
+that delegates most of the work to another {@link 
org.apache.tapestry5.internal.plastic.asm.ClassVisitor
 ClassVisitor}, but that sometimes changes some parameter values,
 or call additional methods, in order to implement the desired
 modification process. In order to make it easier to implement such
-class modifiers, the {@link org.objectweb.asm.ClassVisitor
-ClassVisitor} and {@link org.objectweb.asm.MethodVisitor MethodVisitor}
+class modifiers, the {@link 
org.apache.tapestry5.internal.plastic.asm.ClassVisitor
+ClassVisitor} and {@link 
org.apache.tapestry5.internal.plastic.asm.MethodVisitor MethodVisitor}
 classes delegate by default all the method calls they receive to an
 optional visitor.
 
diff --git 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/signature/package.html
 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/signature/package.html
index d1657d41a..4cd88ef7a 100644
--- 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/signature/package.html
+++ 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/signature/package.html
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
 -->
 <head>
-  <title>Package org.objectweb.asm.signature</title>
+  <title>Package org.apache.tapestry5.internal.plastic.asm.signature</title>
 </head>
 <body>
 Provides support for type signatures.
diff --git 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/tree/analysis/package.html
 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/tree/analysis/package.html
index 05624f6a1..621f8c0b6 100644
--- 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/tree/analysis/package.html
+++ 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/tree/analysis/package.html
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
 -->
 <head>
-  <title>Package org.objectweb.asm.tree.analysis</title>
+  <title>Package 
org.apache.tapestry5.internal.plastic.asm.tree.analysis</title>
 </head>
 <body>
 
diff --git 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/tree/package.html
 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/tree/package.html
index 9e7cd7a9a..1221b6398 100644
--- 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/tree/package.html
+++ 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/tree/package.html
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
 -->
 <head>
-  <title>Package org.objectweb.asm.tree</title>
+  <title>Package org.apache.tapestry5.internal.plastic.asm.tree</title>
 </head>
 <body>
 
diff --git 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/util/CheckMethodAdapter.java
 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/util/CheckMethodAdapter.java
index 5fa02108b..ed4a1180b 100644
--- 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/util/CheckMethodAdapter.java
+++ 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/util/CheckMethodAdapter.java
@@ -290,6 +290,7 @@ public class CheckMethodAdapter extends MethodVisitor {
   private static final String MUST_NOT_BE_NULL_OR_EMPTY = " (must not be null 
or empty)";
   private static final String START_LABEL = "start label";
   private static final String END_LABEL = "end label";
+  private static final String LABEL = "label";
 
   /** The class version number. */
   public int version;
@@ -787,7 +788,7 @@ public class CheckMethodAdapter extends MethodVisitor {
     checkVisitCodeCalled();
     checkVisitMaxsNotCalled();
     checkOpcodeMethod(opcode, Method.VISIT_JUMP_INSN);
-    checkLabel(label, /* checkVisited= */ false, "label");
+    checkLabel(label, /* checkVisited= */ false, LABEL);
     super.visitJumpInsn(opcode, label);
     ++insnCount;
   }
@@ -796,7 +797,7 @@ public class CheckMethodAdapter extends MethodVisitor {
   public void visitLabel(final Label label) {
     checkVisitCodeCalled();
     checkVisitMaxsNotCalled();
-    checkLabel(label, /* checkVisited= */ false, "label");
+    checkLabel(label, /* checkVisited= */ false, LABEL);
     if (labelInsnIndices.get(label) != null) {
       throw new IllegalStateException("Already visited label");
     }
@@ -1093,7 +1094,7 @@ public class CheckMethodAdapter extends MethodVisitor {
     if (value instanceof String) {
       checkInternalName(version, (String) value, "Invalid stack frame value");
     } else if (value instanceof Label) {
-      checkLabel((Label) value, /* checkVisited= */ false, "label");
+      checkLabel((Label) value, /* checkVisited= */ false, LABEL);
     } else {
       throw new IllegalArgumentException("Invalid stack frame value: " + 
value);
     }
diff --git 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/util/Printer.java
 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/util/Printer.java
index e6fe7f0ab..b171d706d 100644
--- 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/util/Printer.java
+++ 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/util/Printer.java
@@ -953,7 +953,7 @@ public abstract class Printer {
    * @param descriptor the method's descriptor (see {@link Type}).
    * @deprecated use {@link #visitMethodInsn(int, String, String, String, 
boolean)} instead.
    */
-  @Deprecated
+  @Deprecated(forRemoval = false)
   public void visitMethodInsn(
       final int opcode, final String owner, final String name, final String 
descriptor) {
     // This method was abstract before ASM5, and was therefore always 
overridden (without any
diff --git 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/util/Textifier.java
 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/util/Textifier.java
index b592901cd..0edc09d2e 100644
--- 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/util/Textifier.java
+++ 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/util/Textifier.java
@@ -1443,7 +1443,13 @@ public class Textifier extends Printer {
     stringBuilder.append(name);
   }
 
-  @Deprecated
+  /**
+   * Appends a string representation of the given handle to {@link 
#stringBuilder}.
+   *
+   * @param handle a handle.
+   * @deprecated use {@link #appendHandle(Handle, String)} instead.
+   */
+  @Deprecated(forRemoval = false)
   protected void appendHandle(final Handle handle) {
     appendHandle(handle, tab3);
   }
diff --git 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/util/package.html
 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/util/package.html
index d2fed34c1..9c9f48cb7 100644
--- 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/util/package.html
+++ 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/util/package.html
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
 -->
 <head>
-  <title>Package org.objectweb.asm.util</title>
+  <title>Package org.apache.tapestry5.internal.plastic.asm.util</title>
 </head>
 <body>
 Provides ASM visitors that can be useful for programming and
diff --git 
a/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticConstants.java 
b/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticConstants.java
index 192c0a522..d71346b30 100644
--- a/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticConstants.java
+++ b/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticConstants.java
@@ -20,7 +20,7 @@ public final class PlasticConstants
     /**
      * The minimum Java version we support
      */
-    public static final int DEFAULT_VERSION_OPCODE = Opcodes.V1_6;
+    public static final int DEFAULT_VERSION_OPCODE = Opcodes.V11;
 
     private PlasticConstants()
     {
diff --git a/plastic/vendor-asm.sh b/plastic/vendor-asm.sh
new file mode 100755
index 000000000..401ed0142
--- /dev/null
+++ b/plastic/vendor-asm.sh
@@ -0,0 +1,130 @@
+#!/usr/bin/env bash
+
+# 
##############################################################################
+#
+# Vendors ASM source from gitlab.ow2.org into Apache Tapestry's internal 
plastic package.
+# Combines asm, asm-commons, asm-tree, and asm-util into a single source tree
+# and rewrites the package from: org.objectweb.asm -> 
org.apache.tapestry5.internal.plastic.asm
+#
+# Usage: ./vendor-asm.sh <TAG>
+#   TAG : ASM git tag, e.g. ASM_9_10
+#
+# Run without arguments to list available tags.
+#
+# 
##############################################################################
+
+set -euo pipefail
+
+ASM_REPO="https://gitlab.ow2.org/asm/asm.git";
+SRC_PKG="org.objectweb.asm"
+DST_PKG="org.apache.tapestry5.internal.plastic.asm"
+SRC_PATH="org/objectweb/asm"
+
+DST_PATH="./src/external/java/org/apache/tapestry5/internal/plastic/asm"
+
+MODULES=(
+    asm
+    asm-analysis
+    asm-commons
+    asm-tree
+    asm-util
+)
+
+TAG="${1:-}"
+
+if [[ -z "$TAG" ]]; then
+    echo "Usage: $0 <TAG>"
+    echo "  Example: $0 ASM_9_10"
+    echo ""
+    echo "Available tags (fetched from remote):"
+    git ls-remote --tags "$ASM_REPO" | grep -o 'ASM_[0-9_]*$' | sort -V
+    exit 0
+fi
+
+# 
##############################################################################
+
+echo "=> Cleaning '${DST_PATH}' and preparing clone desitnation"
+
+# Make sure we are in the correct directory
+cd "$(dirname "${BASH_SOURCE[0]}")"
+
+# Wipe the destination so removed or renamed files from a previous run don't 
linger and break things
+rm -rf -- "${DST_PATH}"
+mkdir -p -- "${DST_PATH}"
+
+# Using temp directory so we never touch the working tree
+# and trap a cleanup step if the script fails partway through.
+WORK_DIR="$(mktemp -d)"
+trap 'rm -rf -- "${WORK_DIR}"' EXIT
+
+# 
##############################################################################
+
+echo "=> Cloning ASM '${TAG}' ..."
+
+git clone --depth 1 --branch "${TAG}" "${ASM_REPO}" "${WORK_DIR}/asm-src" 
--quiet
+
+# 
##############################################################################
+
+echo "=> Copying sources from modules: ${MODULES[*]} ..."
+
+for MODULE in "${MODULES[@]}"; do
+    SRC_ROOT="${WORK_DIR}/asm-src/${MODULE}/src/main/java/${SRC_PATH}"
+
+    if [[ ! -d "${SRC_ROOT}" ]]; then
+        echo "    WARNING: ${MODULE} has no sources at expected path, 
skipping."
+        continue
+    fi
+
+    # SRC_ROOT ends at org/objectweb/asm, so the path stripped from each file
+    # naturally includes any subpackage directory (commons/, tree/, util/).
+    # This means all modules land under the same $DST_PATH without extra 
nesting.
+    # Both .java and .html (package.html Javadoc) files are included.
+    find "${SRC_ROOT}" \( -name "*.java" -o -name "*.html" \) | while read -r 
FILE; do
+        REL="${FILE#"${SRC_ROOT}"/}"
+        DEST_FILE="${DST_PATH}/${REL}"
+        mkdir -p "$(dirname "${DEST_FILE}")"
+        cp "${FILE}" "${DEST_FILE}"
+    done
+
+    COUNT=$(find "${SRC_ROOT}" -name "*.java" | wc -l | tr -d ' ')
+    echo "    ${MODULE}: ${COUNT} files -> ${DST_PATH}"
+done
+
+# 
##############################################################################
+
+echo "=> Rewriting package references ..."
+
+# Rewrite all occurrences of the old package to the new one
+#
+# Two forms must be handled:
+#
+#   Dot                     Used in package/import declarations and Javadoc. 
The
+#   (org.objectweb.asm)     dots in the sed pattern are escaped so they match
+#                           literally, not as regex wildcards, which would
+#                           otherwise also match org/objectweb/asm.
+#
+#   Slash                   Used in runtime class-name strings, like ASM's
+#   (org/objectweb/asm)     Constants#checkAsmExperimental converts class names
+#                           via getName().replace('.','/') and then checks them
+#                           against the original location. Since the vendored
+#                           classes live in the new package at runtime, the
+#                           slash-form strings must match it too.
+
+SRC_PKG_ESCAPED="${SRC_PKG//./\\.}"   # org\.objectweb\.asm         (literal 
dots for sed)
+SRC_PATH_SLASHED="${SRC_PKG//./\/}"   # org/objectweb/asm           
(slash-form to find)
+DST_PATH_SLASHED="${DST_PKG//./\/}"   # org/apache/tapestry5/...    
(slash-form replacement)
+
+find "${DST_PATH}" \( -name "*.java" -o -name "*.html" \) | while read -r 
FILE; do
+    sed -i '' "s|${SRC_PKG_ESCAPED}|${DST_PKG}|g" "${FILE}"
+    sed -i '' "s|${SRC_PATH_SLASHED}|${DST_PATH_SLASHED}|g" "${FILE}"
+done
+
+# 
##############################################################################
+
+echo "=> Copying LICENSE.txt as LICENSE-${TAG}.txt ..."
+
+cp -- "${WORK_DIR}/asm-src/LICENSE.txt" "./LICENSE-${TAG}.txt"
+
+# 
##############################################################################
+
+echo "=> DONE! Please update the NOTICE.txt to mention '${TAG}'"


Reply via email to